pax_global_header00006660000000000000000000000064143503565050014520gustar00rootroot0000000000000052 comment=ee000392f3159ea33b42e88102515a387abb926f wavbreaker-0.16/000077500000000000000000000000001435035650500135775ustar00rootroot00000000000000wavbreaker-0.16/.github/000077500000000000000000000000001435035650500151375ustar00rootroot00000000000000wavbreaker-0.16/.github/FUNDING.yml000066400000000000000000000000141435035650500167470ustar00rootroot00000000000000github: thp wavbreaker-0.16/.github/workflows/000077500000000000000000000000001435035650500171745ustar00rootroot00000000000000wavbreaker-0.16/.github/workflows/build.yml000066400000000000000000000037551435035650500210300ustar00rootroot00000000000000name: Build from source on: push: branches: - master tags: - '**' pull_request: branches: - master jobs: build: runs-on: ${{ matrix.build_host }} strategy: fail-fast: false matrix: build_host: - ubuntu-latest build_type: - linux - windows - flatpak - snap include: - build_host: macos-latest build_type: macos steps: - uses: actions/checkout@v2 - name: Install APT dependencies if: matrix.build_type == 'linux' run: | sudo apt update sudo apt-get install --yes \ libgtk-3-dev libao-dev libmpg123-dev libvorbis-dev \ meson ninja-build \ gettext flatpak-builder - name: Install Snap dependencies if: matrix.build_type == 'snap' run: | sudo snap install --classic snapcraft sudo snap install --classic multipass - name: Install Homebrew dependencies if: matrix.build_type == 'macos' run: | brew install \ gtk+3 libao mpg123 libvorbis \ meson ninja gettext - name: Build for ${{ matrix.build_type }} if: matrix.build_type != 'snap' run: scripts/build.sh ${{ matrix.build_type }} - name: Snapcraft Build if: matrix.build_type == 'snap' uses: snapcore/action-build@v1 - name: Snapcraft Dist if: matrix.build_type == 'snap' run: | mkdir -p dist/ mv -v wavbreaker_*.snap dist/ - uses: actions/upload-artifact@v2 with: name: build-result path: dist/* if-no-files-found: ignore - name: Upload release if: startsWith(github.ref, 'refs/tags/') run: | gh release create "${GITHUB_REF#refs/tags/}" || true gh release upload "${GITHUB_REF#refs/tags/}" dist/* || true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} wavbreaker-0.16/.gitignore000066400000000000000000000004741435035650500155740ustar00rootroot00000000000000*~ /build /linux_build /wavbreaker-*linux /wavbreaker-*linux.zip /macos_build /Applications /wavbreaker-*macos.zip /win32_build /wavbreaker-*win32 /wavbreaker-*win32.zip /.flatpak-builder/ /flatpak_build/ /flatpak_repo/ /wavbreaker-*.flatpak /snap /wavbreaker_*.snap /dist po/POTFILES po/*.gmo po/stamp-po .DS_Store wavbreaker-0.16/AUTHORS000066400000000000000000000000471435035650500146500ustar00rootroot00000000000000Timothy Robinson wavbreaker-0.16/CHANGELOG.md000066400000000000000000000064371435035650500154220ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format mostly follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [0.16] -- 2022-12-20 ### Added * Support for reading Ogg Vorbis audio files using `libvorbisfile` (writing is not implemented yet; save track breaks to a .txt file and use `track-break-to-ffmpeg.py` to break up Ogg files until Ogg file writing is implemented) * `wavcli`: New command-line interface to some features of wavbreaker * `wavcli list` to list wavbreaker's parsing of track break files (TXT/CUE/TOC) * `wavcli version` to show version and compiled-in file format support * `wavcli analyze` to open an audio file, run analysis, and preview audio * `wavcli split` to split an audio file to a folder using a track break list ### Changed * Format modules: WAV, CDDA RAW, MP2/MP3 and Ogg Vorbis are now handled as separate modules for opening, reading, decoding (for playback) and lossless cutting * File detection: CDDA RAW and MP2/MP3 files must have `cdda.raw`, `.mp2` and `.mp3` file extensions to be detected properly (avoids file misdetection) * `wavinfo` uses the new format modules for MP2/MP3 and Ogg Vorbis support; the output format is slightly changed to show duration, number of samples and the uncompressed audio format * The command-line utilities `wavinfo`, `wavmerge` and `wavgen` have been merged into the `wavcli` command-line utility. Instead of `wavinfo`, use `wavcli info`, instead of `wavmerge`, use `wavcli merge`, instead of `wavgen` use `wavcli gen`. * The split progress dialog now has a "Cancel" button that cancels the operation * The two waveforms in the main window now have a minimum height set, and resizing the views should be more intuitive due to changed expand rules * Activating the "add track break" button during playback will insert the break at the playback cursor position (contributes to #12) ### Removed * Removed support for little-endian RAW audio (CDDA); use e.g. `sox` to convert the raw audio to a file with WAV header and load that instead * Removed interactive query for opening as RAW CDDA audio (use `.cdda.raw` instead) ### Fixed * Duration of initial break point is shown properly when the file is first loaded * Toggling of etree.org file naming scheme in preferences window works properly now ## [0.15] -- 2022-04-04 ### Added * Support for lossless cutting of MPEG-1 Audio Layer II (MP2) files, this is a special case of the MP3 support, and also needs `mpg123` as library dependency * Add [AppStream metadata](https://freedesktop.org/software/appstream/docs/) ## [0.14] -- 2022-03-17 ### Added * `contrib/track-break-to-ffmpeg.py`: Script to convert an exported track break file to a shell script using ffmpeg * `CHANGELOG.md`: Added ### Changed * Migrated CI from Travis to Github Actions * Improved .desktop file for Linux * Add `%F` to `Exec=` line (patch by Sebastian Ramacher, from Debian) * Add French translation (PR #11, by Olivier Humbert) * Add MP3 mime type, fix categories * Snapcraft: Reduce snap size by not shipping system libraries * Flatpak: Upgrade to Freedesktop SDK 20.08 [0.14]: https://github.com/thp/wavbreaker/compare/0.13..0.14 [0.15]: https://github.com/thp/wavbreaker/compare/0.14..0.15 [0.16]: https://github.com/thp/wavbreaker/compare/0.15..0.16 wavbreaker-0.16/CONTRIBUTORS000066400000000000000000000006441435035650500154630ustar00rootroot00000000000000Dave Maley Justin Ruggles Thomas Perl Avuton Olrich pigiron Tomek José Jorge Carl Hetherington Jan Beich Olivier Humbert Sebastian Ramacher Timothy D. Robinson wavbreaker-0.16/COPYING000066400000000000000000000431031435035650500146330ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. wavbreaker-0.16/README.md000066400000000000000000000040331435035650500150560ustar00rootroot00000000000000wavbreaker ========== [![Build Status](https://github.com/thp/wavbreaker/actions/workflows/build.yml/badge.svg)](https://github.com/thp/wavbreaker/actions) [![Packaging status](https://repology.org/badge/tiny-repos/wavbreaker.svg)](https://repology.org/project/wavbreaker/versions) This application's purpose in life is to take a WAV file and break it up into multiple WAV files. It makes a clean break at the correct position to burn the files to an Audio CD without any dead air between the tracks. wavbreaker also supports breaking up MP2 and MP3 files without re-encoding meaning it's fast and there is no generational loss. Decoding (using mpg123) is only done for playback and waveform display. The GUI displays a waveform summary of the entire file at the top. The middle portion displays a zoomed-in view that allows you to select where to start playing and where it will make the break. The bottom portion contains a list of track breaks. You may change file names and uncheck parts that you do not want to have written out to disk when saving. There is also a command line tool `wavmerge` to merge WAV files together. If you download a show and don't like how it was tracked, you can merge them together with `wavmerge` and then break them back up with wavbreaker. The wavmerge tool will only work on files that have the same format (for example, 44.100 Hz sample rate, 16-bit sample size, etc.). Screenshot ---------- ![Main Window](data/screenshot.png) How to Build ------------ wavbreaker now uses the [Meson Build system](https://mesonbuild.com/). To build wavbreaker in the `build` directory, run: meson build ninja -C build macOS Packaging --------------- scripts/build.sh macos Note that the macOS package doesn't include the runtime dependencies by default, those are expected to be installed via Homebrew: brew install gtk+3 libao mpg123 Windows Packaging ----------------- scripts/build.sh windows Snap Packaging -------------- snapcraft Flatpack Packaging ------------------ scripts/build.sh flatpak wavbreaker-0.16/contrib/000077500000000000000000000000001435035650500152375ustar00rootroot00000000000000wavbreaker-0.16/contrib/track-break-to-ffmpeg.py000066400000000000000000000053571435035650500216730ustar00rootroot00000000000000#!/usr/bin/env python3 # track-break-to-ffmpeg.py # 2022-03-16 Thomas Perl """ Convert track breaks to ffmpeg cut commands This script takes a wavbreaker TrackBreak .txt file and the name of a media file, and prints out commands for the ffmpeg(1) command line utility to split the tracks. Useful in situations where one wants to transmit an uncut file with a simple shell script to "split" it, and/or in situations where wavbreaker isn't available, or cannot write the file (e.g. MP2-format files can be decoded using mpg123, but are not yet understood by wavbreaker). TrackBreak .txt file format documentation: https://thp.io/2006/wavbreaker/tb-file-format.txt """ import argparse import shlex import os parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('track_break_txt', type=str, help='Path to a wavbreaker TrackBreak .txt file') parser.add_argument('media_file_xyz', type=str, help='Input file name (uncut file) to be used') args = parser.parse_args() # http://www.herongyang.com/CD-DVD/Audio-CD-Data-Structure.html # The play back speed is 75 sectors per second seconds_per_sector = 1/75 breaks = [] with open(args.track_break_txt) as fp: for line in fp: line = line.rstrip('\n') if not line or line.startswith(';'): continue if '=' in line: timestamp, filename = line.split('=', 1) timestamp = int(timestamp) else: timestamp, filename = int(line), None if breaks: # # Update end timestamp in previous entry: # # ((previous_timestamp, None), previous_filename) # | | \___ # | v \ # ((previous_timestamp, timestamp), previous_filename) # breaks[-1] = ((breaks[-1][0][0], timestamp), breaks[-1][1]) breaks.append(((timestamp, None), filename)) def format_time(seconds): # ffmpeg accepts "sec.msec" format timestamps return f'{seconds:.03f}' for ((from_timestamp, to_timestamp), filename) in breaks: if filename is None: continue # Put "-ss" after "-i" for potentially more accurate seeking at # the expense of slower seek operations (see ffmpeg(1) manpage) cmd = [ 'ffmpeg', '-i', args.media_file_xyz, '-ss', format_time(from_timestamp * seconds_per_sector), '-c', 'copy', ] if to_timestamp is not None: cmd.extend([ '-to', format_time(to_timestamp * seconds_per_sector), ]) output_filename = filename + os.path.splitext(args.media_file_xyz)[1] cmd.append(output_filename) print(' '.join(shlex.quote(part) for part in cmd)) wavbreaker-0.16/data/000077500000000000000000000000001435035650500145105ustar00rootroot00000000000000wavbreaker-0.16/data/Info.plist.in000066400000000000000000000017651435035650500170760ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable wavbreaker CFBundleIconFile wavbreaker CFBundleGetInfoString Copyright 2019 Thomas Perl CFBundleIdentifier net.sourceforge.wavbreaker CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString @VERSION@ CFBundleVersion @VERSION@ NSHumanReadableCopyright Copyright 2019 Thomas Perl NSPrincipalClass NSApplication NSHighResolutionCapable LSMinimumSystemVersion 10.7 wavbreaker-0.16/data/net.sourceforge.wavbreaker.appdata.xml000066400000000000000000000054701435035650500241110ustar00rootroot00000000000000 net.sourceforge.wavbreaker FSFAP none GPL-2.0+ wavbreaker GUI tool to split WAV, MP2 and MP3 files

wavbreaker's purpose in life is to take a WAV file and break it up into multiple WAV files. It makes a clean break at the correct position to burn the files to an Audio CD without any dead air between the tracks.

wavbreaker also supports breaking up MP2 and MP3 files without re-encoding meaning it's fast and there is no generational loss. Decoding (using mpg123) is only done for playback and waveform display.

The GUI displays a waveform summary of the entire file at the top. The middle portion displays a zoomed-in view that allows you to select where to start playing and where it will make the break. The bottom portion contains a list of track breaks. You may change file names and uncheck parts that you do not want to have written out to disk when saving.

There is also a command line tool wavmerge to merge WAV files together. If you download a show and don't like how it was tracked, you can merge them together with wavmerge and then break them back up with wavbreaker. The wavmerge tool will only work on files that have the same format (for example, 44.100 Hz sample rate, 16-bit sample size, etc.).

net.sourceforge.wavbreaker.desktop Splitting an audio file into multiple parts https://github.com/thp/wavbreaker/raw/master/data/screenshot.png https://wavbreaker.sourceforge.io/ wavbreaker wavcli

Support for reading Ogg Vorbis files (writing not yet implemented)

New "wavcli" command-line tool exposing wavbreaker's features to CLI users

Support for lossless cutting of MPEG-1 Audio Layer II (MP2) files

Continous integration migrated from Travis to Github, plus various small patches from distributions merged.

wavbreaker-0.16/data/net.sourceforge.wavbreaker.desktop000066400000000000000000000004771435035650500233530ustar00rootroot00000000000000[Desktop Entry] Name=wavbreaker Comment=Split .wav files into multiple chunks Comment[de]=Teilen Sie .wav-Dateien in mehrere Teile Comment[fr]=Diviser les fichiers .wav en plusieurs parties Exec=wavbreaker %F Icon=net.sourceforge.wavbreaker Type=Application Categories=AudioVideo;Audio; MimeType=audio/x-wav;audio/mpeg wavbreaker-0.16/data/net.sourceforge.wavbreaker.svg000066400000000000000000001731471435035650500225060ustar00rootroot00000000000000 image/svg+xml wavbreaker-0.16/data/screenshot.png000066400000000000000000006565621435035650500174170ustar00rootroot00000000000000‰PNG  IHDRÿ·è<¢zTXtRaw profile type exifxÚ­½i–ä¸ÒdùŸ«¨% Æå` Ïéôòû^xDN/_õ×§+#3ÂÓÝŒFª¢": ®÷ÿþ¿¾ëý¯ÿÒÓ•rm¥—róOê©ÇÁíþùgœßÃÎïçŸï»ã¯ïþíûWÛ¿~ùÖßÏÏZùù3üþþ¯7üþ3 ¾Ê½Ðúõƒù÷ôôóglÿ¸Ð¯z¼#oaÿºPÿu¡'þü üºÀøy¬»ôVÿúóýùó×û–ÿ.+ë>~ýôŸÿŸ*«·3ŸóÄø>á¹ù=>éçÿ‹×3ø"ýüÏ·ø:ñâÁWå×° ÿ¶N÷_îêúç®üñÕ?ve÷_?ýǦðaçßøûb–?þü×ï‡üï‹%þË'?ë×WñïßoåÉÿ|œßÿ}ßn×÷½?O7RaI˯‡úýˆáÇ÷dÉŸó¶Â¯Ê™¯ëùÕùÕ.¬w±åû^÷ä× =D¶å )ì0ÂÞóç ‹[Lñ•?c\ñ9ßkO=®ç¾ØŸä¯ðÅúôg?ÝZlïÃwã÷Îçöóq+4>x^ ?ÛÿÏüú¯ú>M>“­gBÔ)¸ wÎßy¾ßv”ÏÿþõÏÜׇÌg™8îùs‰™Ã/ÛÒŽž³Ñ/Ìüùãk¡î_`‰øìÌÍ„‡¸Kxr(á®1ÖXÇÆþ .Ôpš8Ù‚sÜÜeLÏSØœýlÞSÃymÌñçÛ`‘ŸòT¶¦?ƒ½ذŸš64ò“Sιäš[îy”§¤’K)µ~£>5Õ\K­µÕ^G{Zj¹•V[»Zo£Çþ޹—^{ë½Á‡®+­¼Êª«]«¯±ã~68±Ë®»í¾Ç^LéMo~Ë[ßööw|˜Ú÷|éË_ùê×¾þ?v-\?Ûú¿þç»~ïZ<;å ë»Æ[ký}‰ œd÷Œ‹)°ãÕÀ £{v·R¼Ü:÷ìî¯È‘»ÌnÎî;˜ÞóþØ»?wîoûv¥ôÿkßâï»Üºÿ;w¹uÿeçþsßþe×¶ÑfÝÏuvH7tQï÷ûòÎu(_z[š,èè5Ü !HôUïñÌû½Ã;WNCéXÒõîFšÄGÖpõH â¡ùÞ5eoÜñËiǵ[ùîý½ãžmŒÕøÄò°R÷wÕ'u–ô¹°úùޮ¬·4[oH¼|‚xµÇÔÙž?ôוÒúzSè}Å+¾ì-—JÜl#j;ÌKwsºÃ`à7ŸŸæËb+ž»îúæGîã}Ÿ~eLÈÀZžóß\;ôÔþa ~dÿ6ë»Þöa1ß|ç×w ýÞß;ZYØZv¹ÞQ÷ËÒ­Øg»W±Ÿ­^;?]èûyV™,,.x è›­}ðÂA‡2=RË'´÷ÃQ¾ÖÞÎ… ™œ|Éf¬•Ÿ0+|…½g]¯8vú/vß»àÝó‹%¤¡Að]Ð`=w/`‚¹Öþbìóx¡Ä¦UØ”õAY`g©jñÏân‹Fšö_ÝáïÞ°onÌÆWïþ¤5gÛ¹³’ ÌÓVYú»6 Åb!bc¿p„öàç™—Âñ^=§…qíû¿:D/7¶ ÊÆºˆ;³ÝcŒYxô(^ÕØï8¯Ð#7;ô1¡Böxý{†©LLGÿÈĪ7ã­Cð-ø)|îÄö\%>àTÍnãûÁ¡°zÅCz„Þ€VXLÜ!‰P…ã÷0^QR†åïò]·8b+ œxtbãv>„Xþb7¼»MâV˜àB{ùÒÊuê.°ÚXúû2+Æ—°ª• ™8IÅâXŠÈúa°‰¯f Ûý‚% iÏÿ«ój`Ô„w °úY³fÐYz‚xÆ[É'tEÄ“¯Ê+ež÷³÷jû𩳠+Q2x%×m'~—åü “üÈ À¢¨<ùЯ¨*ïk€õëÙøüGœg«Þ]^Èž±‡X¡ðjØÝú {‚@&VµU6j7‹Ç=>è­ó]¬üjãùýÅ¿ñr âÜómU60Àã'€<¼ã#ÞÄ“À‹wó÷øzKZlæ¸76hoV»±p¼£¦|=^¶pÙgŸk6HTyüqç6V0õ_Æ´:0APË3h[ 0NLwº_ðí¶a{îûÉâ…l™àã!€((㆗hÚ®oX8œ „bF®!^âw‹HÓ(Y,¢G¸{þú‘È,x(ø× ˆå&2ºÑ,H k„á#0 ˆ €YnxdWsáßø¹LüØ}'äó‡8µ E@(¶6Œr<ÒÆ€Ö‡W…g=¬wíY÷Љí2ªóÀH Dß‹Y‹Z €¥ˆhÊÖóѯð„b[hAÖ‰-ß/w‹v½^žþ-²"H¬’ ŸY£‹:PÁÜÀ0w Â@îph-¼ ò«`¥rî Á{†Æ2ÂRßlß•7.ƒõc`2ÚÙ‚4tÜ4<íÏÅray3;øÞ>nø¹¹)"4aàðHa'Ks>¿Ê24VЇÆ|šÞ_žJ t̾²j¬\`á§NÄ¢ÒHõ\„/V«×:XUnŸ„¨o ¬NX*lZ*ã&D÷”=ÆÑqí?®ø\þº0 L Z uÀÐÀ¾ÿ4V4ðÂkÔü\õÞït~"ðÀ“˜JøãBˆ›9Ú@5­Ìny'³n)Vä}ÿ sK7˸>$Ó Àý­ÒXF/-]¡uc<ìà¢)HDÀ?LLwbqç@Àâ¡ FPš&ßXe£Îz½*°½ÅƃWõf.CºŠÈ°"x!„0ë„x|ÎÏϲy?ÛØ% QÛÀ²x¸ —çy!×мA¦™ üÏoƒÛþ‘ž‘ß‘ iW¼£œêdýðÄC;¼MÊyÒ…¸š‰"@ïŒiÌÒ¨S~Íâ 0øB7°¯¨¦Ÿ[.+ÓàÊ íUC@•aÞØ1äëc0].áúeÇéç™[b©±q8ÏÔxLféá÷“ß { C}z90õµx]úƱ[žÝŽÂ9©' 0·‰§¾@ÇÏtÄç?h”˜ƒ”AÒ6<»1¿b«Þ\|Ý4|êï0YÁ~ÌñvE÷à¦Å“ö®“ôõJ,gßHv°ÜX DóúæÅSÖ“WBXøõ[q$Ê™MBò¼^¡¸Æ¦±µð̃Æý…˜¿2³äû~®ô×ë°÷Qkí×yïüã½ÿ|gýÏ{P;ý·/F|Ò øÿ@xËþ„ ½Ïc/`˜|9S¡Gáí‘mm¸÷’õbqí÷C_ÿüD~òëc¸U3~NËDɦžÿ¸çò¡Òß*ÃMsúè‡cv CÇA#*ªEV´«ö ô8μU›ßºþcÛߟýÏG¯¸Û 謮Uåÿ<÷™¿ëßoô_ïÙ¿×ù?ÿú~Vùþu½?¯vŸu~"1d¸¸w‰DQØï{ÿp’úÙ‘ÿɆ\¿w¢F4Pþërþ¹š}ÿçj^Tÿ7“ÿX<°ÏÇÌ”}íUÎ%ˆ}/Èö辬üùD÷´%Þª×ü§‡k(×_ÝtunAW€î´`ê)g¶{¢ÙK8Àe¹v¼‘çãORáp^o$tWè¿zžWºˆAˆATð~8<:Y/šÖ3·¢ãœøy¹y>äJP>0áJ·VqÍaëìÄôìÊCtÍXÈ(ŒêÊı¯÷ »/ˆ¼Ð9Êe®FÈÕÀ YÜ+ΓÁr0¹»¨i%PÍ IÁæÃe5Ô Ïfß·¹pì³oÖaD°ÖÇzoà›Ô:üªÏú¡+ab¢Ÿ¹T¬o¶Z=LÕ/y'rZ=1•À†ÌÂç­±rß*y\ÀìM"¢0ªìþNY­°%x• 8Æ#¬Æ"_„Ø_ª7®é}³K“÷ó6¨7÷¦pçÃJºnâÒ¸£9El&*2–;¾=Ü! mÉAîÎ*@‰îzÿ$:›3»"èWçÏíµr£BÚ>¹C“&ÆHsˆ@Ÿð´ÍàErÅ AuõÖ)ÔÃ|V´jùùY¥BQøg¡SÅœÑ÷ÕpÇ–}=в{"­ÕZ6¨ôxñ™f$„m8Pa£¹ äªâׂH2€"ø„÷'ÖÉxó(s~T’t!¹3tqîÑÊۇ̺ÀÌZ~ä„çYß÷N·HCG5qßì!hm0àà úÃÒ ìÍÿâ h'¥(Ê•pˆVBœLågõÝÌ(¬H»:éxXn@ÛOèÑsâ3/qòGmWœv'[njSÅDí|È ªZt ·ñ›Õ‹˜GnÀA-HT—+·þÞ½zuÜ"¿¿®k2iÏ¥¾‚Ôð!ëØKkøÿVTS V‹…ëô3ká¾2_°…‹ÝC‡'€ÙtúÀOâæL>o¤;Š×v\5ÿŠ"pª¶O%•ØFˆZJ„ÔfÚ[oÜÀzȃ?‰1Ž‹=¢¡_K`}HkjQ“*û3÷ý¼×$qMx?Úïí%m|dÂñsT6¦MHèV(qÙàsḵÀêüê›rW—ØBp°“ð$Þßcò2äÄùÈôtǸˆÛ8A袼œ¸`ÜÙ{iTaaç 0M“ª°[(kî­ò1À^fl0[`n˜œ1\-;~‰O@o²e¸$Á±‰­‡Oà@I+û;ØP¾ÁY_ K½«8Ò~X‡Š€%jE KxLìüª1¢QßmëA¿ßÔ8)*&Š•ejHˆ ·Ÿ YÑT1ÞÌg¨Û4fÛlTªéI8†BªsZljwD@ø‰åg‰Ùõb=»¢9ÍNï§46.‚V†âôËÂÇì¤ÉçR/(\ÂdŸEœ W4!\ñw«g7þÒç 7,ìà0IˆÃÁJ…šbõ˜¯É¶$qgÄhv2ž¹#ÌpC >¬™å{0Ç`­:,!é=½xÆÚsðÐÉòrfñ ØLœ#FÚ¥Õ&¾@¨/¢¦Ã:…-šш_ Š põv'ØlKDÊ(ϱ _ºnÓJl|[–¶+\p|FÂbZœ"‘ä† ˜¹ÑMоà€Ó!÷k®OcµÞ´ò$æ G€S°3“–:¹”ø D7vÙw«óVz©àjî»`*7o/@Ý,¶ÛÅK?\ŽÞÙæþ tPJÐïÙóW?mVþ—Ë$¦…A,¥"3Oz7âÇbøæ,ÙÒE„@™(n(ÈcV¥|ðS0“ÅÜ,h!!° ÄC¼ìuPx8Ûº6·Á È¥+xæÞxKޏxæ]×Dœ–CÇbØ ¾ HÝNiŸO» L‡½¾1°VãÙ™`¤A\ÆS7¦8DËum å`¿H!Á§lU!.,<CCˆw¶ ÂïÄÖ:P€¤ÖñyfÖ>íy\°#üuóùó½k‚¬ƒKuÊÁº‰J˜|5}øXx©€ícÒûƒpñê=ÔT±Ùžð,pPÁ–¡éPéM ÈÖKЂÃî¶å yø0ÐiF‹`ègå93|˜U…çJ0üŽ>3Igv¶zn}ƒXvI/{â#QÝÍ‚¤õL ^5A³±_a fÃfãD>昗XÓ¬•Áwš×É:89N÷Âö»‰GÈè—Ÿ¨b€Úµi^¿ü ôüG• L" u´|eÈÙ#¦XYˆr×Õ:>Cx^3h®ÃKá¥Á8@QØÔäQ¸ÉW6Âÿ#îØéäfc$qËWJ€. y×x§ë&ÚÌ­44AgÔ4W‚⫯UQ Éï Yi›âÞ£‹ÖKߨ·`»Â&6{ZŽõ'¯n#F4οÄÿzñr«³­Afkî¨|Ðè;~ 8J;ˆ*ßFhFn~™ò/÷¸$‹GŒW´yã$Q RÏSˆÂVšyˆM¨·¥á"¶ïÞ¡eðÂW7¾bThã²(l#ƒÌ[à·Wº¢Dû¦äù冻À®Î§òphIìűí#*Ák=ÇKà·|Û¡-aîð 9•ÒmŽwä˦n#ž–â zuý²#à%A.?Ö)‡ö€êF˜'Ü=\×{ÞxYÅü̶BsË­aIÖFXyìå…C*ºe©fÃc33ñ.Wt;îÄ>}OTø=F‹j”j9 Ø’›uôÖW2Ÿ¼qÁ.%ƒ®û܇f@¡ÇÐÛC‘æDª†€DDtH`L(å… q×ï!@úØÑöþUt¿ýzŒ¢À$'^F|^þ]6òñ¥Áê'@74 :m’;±þ”QDÈuS=žN°m«H»¤›wX3&Å-Êí­fìöK¯Ì }¥6§â7N sB*í^&€‡E`"{3¾º~µä­'í–€ÎÆÙT@ Åí€YÏÚ Š-Xë$éLF7¸ÔÔÖEsÖ  ùx£æ#yÔ›_¬UܬHˆM{ˉ Gó‡¶D}ö§žZP¤âp';ÔŠ+VsTfÿþøÎõû[7jü€¢ A^øÒÔÌØJºlá5;Rù¾¬ÌÝBÔË—ÅJtÄ`ó%ÅøÉk.1@â¾ Ú*÷üæ8ß±iAèê긓m³þ&¸~ÄÀÍ+l¾kõEw!cßhkЖ Þøò‘‘ñq‡uvánØáÄš_¤ÐkqèåÝ€ÀŸ;šGa\ø;<¥©p¸v@ë7èrªm’Âê¥j*qŸÂ¤J9&`$K—–L«ê塦‹q[ñ‚ßüyšmÿ¼7§@FaÏMº»yJ³šã²ê†‘°ðÇ[;C nI‹ âhJû#d³VW'·úok…;u óª§_fAÜÀòÖú0d6á§u°>Íü9HoN6€«`so'€äGÁŽBT±¨€%ox½Aõ¤ü>ÅÞúBfJ}gûæùÐÓûdñ{ZkšË®ív'€:ËÌ#GKö»P—ø¹ÆgÄ µeB`ž€Û޳nÿ«]8¶Ovm»\†n—èìhäÖUM16èTTÄ©~¤ƒ´ƒ¥l«ŸŸmP ÖòuÚfÓÃàœ@¿qÚˆÙ±ÄMbÖ7+3‰'vÚž—“·ýǽþú- ŽÉ•²ÄânëÙº ¯¬7"ºÔfÛEJSòS2èØjoÍ&ž˜GµŸ„´mYÓ°Ç2ø¡ÍÏ&Sàtõ¤þÿù.sÈR+Ö˜"|ê4/˜Ý†5üÍ€<|ÿtü±£F!ÈCÙf°*àL¼L7°­xu¶W¯„=™0Vä06„±&9ÇY<á§ðöÏï Z/è†ih³ ¤ÿ'ÄOp4Îñ~¯Þ5¿}'à¿m¯ï þNÛÐ)O±(†óc ;üï õÏáA!,„Îú]¯ÕÎÓ+ˆ6Xf.G|‹=˧çüW™¥™SËÿåc®~Ž­xæã¬Ä i‚iEBr{ "Nä zÏ´€«ûÿ jǃ/åš êØ,Áýž²¢Þil^nqÚmLÀ¾l`úÇ}bÙ°ÿy¸»w°¶hw8ã ¡:}†àˆ™ÂùR><×e<,õ3LX €Œâ†PG\´ëAw¶B­Gz>ÜôÙySÐúó\DN‚¥B8Œ¾azÇÑý/7æbÖ¶˜ðQÉ(©öš 4ë®Tlö~b}(Ñ›í¸m%Œ­ò¾a:t¬ÈVR‰ ,e†ŸÊ¶8<ðû‰ÝQü¦Pï»sÍєӟ›å *œò fÀà³á‹­mØAzí.âß-Jakðøž"@õjêŽØÏ…r}!Q–-Ÿ)ÙýdÀ4tØì_bªÙ¥h¿ËGp>v†®ý¾ŸARö'îÅS›\ix÷‚j`BàôZé½pø&<Í.3 ;îîäŒ~ŒÑøè&JÍÞ™$#È@íˆT e¶~·«Iëmý¾ 1Ä™6 ‡Û"j2"ÀF{Òg J¾3bbóãC¾hÂâ9mÝ)]¿®i¿9&´¬ä‚˜3o>E´]¬YsÁé¥pÑ6žlnÏzÅ={Ø›Ò'ÝæI MÒüç-ß§=güÚ–ý˜­7ÝnÎ2æ—€‰Gùßs™Ü¿˜ѯúPÓžÅH¹Ùqþ˜í´mä9Yýiaã¸íéÙÉpù?û–‚沸ˆ+ ‚l|…ïeI,8#Éë¶ßÃexóBµ˜6AM[²µˆpgD{ˆØv5ÜPìZm§UqyõØçþÀyûOYŠçFeÿ÷þùÙõÏâHk"0Ê×^8¡™pÔ^´óCPZ 7~bÉ´{2Ǫ^‚TÑŠ(ök~œ d÷Lùe“6á~áëžhuÇóHÿ?Ð2"`¹!P‹ÌFØ'³D¯“OY)×kT%L˜È‚R3ʆ ˜ï‹ý€éÏI‘Œ2®Ó™³K7™6Ž "¶ð¦þœTïi_ZïiÍ"¼p³ÈTèPÃ+ %H^¹„쇃|ÐÌþHñ=P·Qvc_®Ð*ü¾Q'À"MÞ|6"àžvJ! ΦøA ÍgvƒÕ÷¥ˆÐ©–ÞÖ°¤Û®ÏïÆJúE¼}Ὶ®!êËÊȱë‘b!:j_®KâÑâç`æ]#ZÊîÛ»w¥.¤:K´[µø±ìvŠ‹ÂK°Óí¤ B4)_^|g€$-´ã@ÌÆÉ{0Ùûb­ì-¦V3¨„÷&Çn@çz²Š§Â “â‘ÑAQ:鯠Sгq–#à íºú²Q ðvâ€"„´YKmfœýà–ßR 8œr³—ˆ‰ô€×ø’-²&CFï$2²f\s@Pƒºsõgš»ŽÛÖÁ6–ÒD÷‘¼ŸšD è³ÔáìÑšsÞ§µçW[D¤Nëk7ÝN6c†c—Žt9Vœ;èXòv ²Úmf^zƒ¦#Z:ìWìF”ógO¾­äIïPϕǸ‘€x <û'™¹+w}Œß©C|ƒ­²»XýJ<,¢Nð'Úbæ–]ºÖ@ÈÖ›®mà ’«#8‰÷õ4/±:@x{0+hÂçÞwD®Åc¥C6Òÿ\Òâ•÷.l3Ïœs0¥PÆmâü'j?æÒPc·ÕËþ#€nä¥(náž—ið”ºÑÄè„DTÜÐë©q>¨yǰ«…‡û%„c|xR¼ú `Ÿù`õçÄ‚@Ù§Y¶æ¾Š òµ}¡5˜ù„F}NWC¢Ôó5=×ÂÃÇhªßbÉŒ8jŸSƒšÂ^`^¡?1 d–ñÉ‘ äæ˜šðýSkE¯ÕfÝý±ƒxaìéDÒõ3}¾áŽÈ-µ|ˆûé½©Þ &8BÓy¡"þ~™C V9Lµab¦ÁcÞ–hÆV9Ìs?N¶TçÊÞæØe#¨aؘ¿)ºkV§—Ó0°\¼´(.2P~{ÄGz.–îdÄ.³ÐíxæJ®ü—E(ÜúOÂññ>à|ã*8Ôü21W‚½ðp5êØl ©¶ÉÖÁG[»ufÙd.´”€ýõŒ-º4…M°ˆ'ïAe°¿íÌ î¤ˆM¢ôüCl·“Vä–á¢Â6vŨ35#]Øí0ãw÷3…ÑågU¹L@ ¢ÅsqJåaEñ0b’ýÉ„ÌÙú½a÷‘Ë]i[ú÷TÇZ·bþZ®|雿  ž1 o†ÂÖºËÏÅM|æB'ýiw>Ý4˜¶ ÁÀáñðr†È…px «VpNEP‘±·köY<£Áƒ2¦¨·xötðŒc+ˆÞyE$Ü«WØÎh›Œž´&˦›vKêŸãϼåAB«ŠâÀ‚Uc‹ýÅzì¢ÂñÙ'fèàr–Ã]ƒm¸†VÙ¹ÒÍA 1uör†z8úZྗì$KüVä>¸P •ØxŸRè"þž!&îÏ7Ã=‘ç6XuíL%r2Ì*~›œçÃ3$­<×Nö‡ÔÇ.ßn°¾{˜›v”õEDºa´ý¶ïÓ¯ÁVËXÁ H·Ûc[k%Ä!¦q ¢+ô§Ó增3€±ÃÂndI¶jqºÛN ¸ˆ¨ÉÊ¥0Uœ¨èiõ²Ãþ0H$jŠëF³PläAh‰ÐL‡c ïræØÐ§&‘¬Êõû ¤"k@w+“å<"iΚ5¨  Lì¡*pƒ‚•|—³SŸAÕ伊rfÙ Õë3¡Ê®XÃB,˜`‹&ca4ïÙ•£§ ± ©3Cò¬Œâ€¶óh÷Hêpщ4(Ìá©¶£°~xëû 7´íù®zÊÂ@„é¯ +Ó-;“„\ì½§¤3bmIš;ÊpŒÏêásgÉ?[ªMÄX†å ¶ž J¤þžeìËmÆú–Ú8-’íX¸¦M:HïXµÊÔï6>ÂI{TZ…~‚'ëÕÉn_ÛLMôà„ÌG/®‰ðw¼¾ÃÛ™}—ˆ–gˆ%˜òÜŠ£F°ûÐ'öiÚžúœt"€,t¥5ƒêˆ§Ë£ ,Dò¸,N# À1`Mp‚ pÇD«EÈ HÒ@ÃÕ°a®–leØÝ8ó§É÷ÐyágÞø ÛMÙ-fg%É‘ƧÆÕî~Z#E{KÁ3DïÄ—>ŒØÑÜψó.gìç–åXa0`¼mõ >¼íå„C„´-\ÉʰÿÇc\ ÷Gd`ÉlpVžÞ¾Y‚(jä‹Ð²O˸¹kç¯Ñ…{D×^ðØiê+`ü„%n£µug;’²§“þöÍS÷eýžGúܱØþåÏÑY¤êÄ·Eu#‹brÐüÙ Ò€ó½Ò ? ÒaZàvÐÌgHÃw‡û;–èò~€È—=Ü­ž@Y§78ÆÆEo/8ªðø±ð>îdz[†ím{ØËæã'®I¬bîAc=̰~°ZhZ­ºAëSÁ–·b('cš¨jи:äõÝ.ñHöèIeÀCl¤}ÙŒ‡ß·Í4gªa)=qMÌá&¾Î~eE˜9Ø54ZgjÏzq( OÑh§!þŽ?½lÕÀ ×&hPö4…ÎŒÓÚ¼ñý N3‘ Nä[7éÞÛ"<àÛNñûdܪۑ“£0íܵ!ŽP‘²Y¨ŒN™9N¤iŸ‘0u¬„uzÙßÕ4”}=š]Ùöë¯ëŒ1óR«›8é:ƚ̿¨õ1 Ðp¾Z”ÓÐv'•¶‹‘ï×ÏôÓ¢ùŸü†›MöŒŠ…Øòô´ÞÖO¥Öto'<:5ºsw˜ ÏæO[ã–çòôûËI^þœXâ¹k„¬l¿FÂAîÈ“¢Ýðž¿kЦUÞa% ƒL­¿6)žCáLÞ}æE’C”¶zÊŠï-wã f' ‹3À $hˆ™~AŒ­l2¼xÙë6ž0Aаÿ™mXÆ D±éfúGnL=¬‰­TKø<fÍÚãÝb!ËÓ䀳àEÝæ‰~XÑa/Û{UD<¦”Ÿo¾¾ÓKçA?ö€X£ gf‘#ÄÊS tê(ÿû „ýöog#Só‹xQÍ™'3É[ô±¥ä±GžÿÊròðÌËîm­”;õä‘ìØa'çE¸ÅÍ›}¥­'jš§Ià>¼QL€~"×lT ³lç¤Ðr8Õ³P®“Y ©.OGé³=½ÚÿÕŒV;­†ýD£·‘ÖðF7ºP˜¶]c0ûæAªeyˆlÍ3ÆLÔL•«Þ[°çxær”ŸcýÜÆ‰ÏØŽ7k@ЩÁ®t–Úç˜ôè?%ÿ7ÛP†À%®U¾àYQÏ>2Ñã,t®Ös¾ Q©¡˜¡u`Ç‘°_<‡íLOÁçiE±ŒþS<¤—-ñ„8S Û :’Û£_°d‘süÁÑ¿i/‚gmÁCœëÆv‡G%FpÑã¿P‹x×ÓÅÅí,}ÇËU´žÊ†káµ§¾ÆæhJ·õ6¸³Ž ^‰/'Ã…³ ü$Á4æ« Ó!àÅ$ÌrC×`Sé#.ô“8}ƒ‡ýim€ Ð<¥äÊP#¶4˜qi8ð=øšéJ9Âs{˜§ ͇ÂĈñ!Š1bÏ‘qToÞNÛ&„_¶jÕÎi'hšŽB|žã.‚ƒ¸~:"H ³æ°Ñ€]Bz eÛLJ4,÷ ÉÁ“ýENšäè¯Á>ªÐ Qyš¥g)²'êdõAÆr˜’Õ–ç‘yXlÕV= 1x£¾œ8&c²Í+®h7ëó3¥ø¼~NÓßs9`Á§ãz~:$$œ³cg®c9çÔÿvh¶Ÿ‘|èd7ÂtÖ¸¸¿ÌZÖõ\=îñ©2Pá°ò8>Fðî&‹Bó,q'îX;Tâ*<(Íœõ —nc¾ïň­÷c lòìs$HÞ>§×´#Õïô.´ˆ…‹ç© ˜Ù+áRÄô¸Â€Vƒ~œ2% õx±™5›œ&ŒDô÷æì¼''lY­f’â=7iøÝóêΩ\Âg´Y ñÔ»<ŽÅ·âÉ:I-çø TQ÷8²·ðì£d=Øê·§_TG8xy˜ñòZkìÀäô,˲“m=Ñ3à ŽVaW¿^ü*ZvÕ&¯0•÷íî7¾fn‰ÅY Ý’ì›ÎA½g·Þã2Y<ý7áÕ¡íg™|^‹í$@_~{#Òby0¶=h#±‰Å!ÿ^ †1´>Ïýûš-&eïê©ñ³žc³ànÛŠ/Ì'ô 9´{Œ]Sµzœ¬9vp”3‘ç `¶™£ƒ´@i<"Šuºa¿¢'\N©Ž]Ú[c›l¶CÒáåíc<§ZÙm"Á–î ‚ÛØ––#Øz¤æšÖ2mŽGU„«Ÿ1à÷=øÿžr+Ö¿Ú qèOçäƒÂ ,çf>>ßÎ$€ígÚÅöKNÏIQз£ñÈŒïÜ©½ò2ÁÍ/?5ûÚw;¬Ðq+Ûa±!Ht6·,öŸaüvœîÂGò_Í*°Y0­xNÞC•=çôKTúw퓪’% s|»¹öG•†Ÿcq "°ô'}æt9¦æ˜\µÎ¶ýÛ jó0N=½Ã§y4xúÚtíeð(Ã_ÃúÀ*']1›Ðœ„;›§¹l¿<, a'ó±ÐË»=žåûÛÃp§þÚ&„¬Çã«6–ô,|úå8µ3ç\ äfÊÍp6´o„Õ™žì0†&¸3DÙDÁÛÞ– .ox¦sGó ”‚Ç7t{tú|ØÓÆÛ¶“P÷9¸>Ûê€:hÿ­§/5ÕXí=&ì/°R‰äجa3—òÚôk¯ÐöXIÖ•;?O€ýpqÜìäÀâ‡4îÎÔÀ ̘TPÊ뼇éýƧd«û²”ƒ´™Ec¬)Åðx6øwŽ‚ ¬÷v\›³·ÉÑÒ¬Ë}| }‘Á8—ÀÊ-òü<’8ìR5ašèg€œQðaNõ÷¥÷µf?œºã÷Î=¶þñ06Â6êû9,9Co0EÏê?‡á«øÜµä°WËÞNþ9XHk…ʳmþùƒŸï÷縿}Î9|ögž?êú~mŠåë_paÔžXÁBÁA'ï_UüÓž‹Eo¼ÖD1Záõo™¥"³Ì‡:Gì ¬]ΈW«‰öUøW*X,¿NBToyª¦1~fØ’ï sÊ’§9Y}Á#Û‰éð Û±Wˆªœj—Ó1ÏvºIÆ!2p,êâ‹;ó’óωcã¶©Xæ …‰pa[/!ŸË¾µoŠ0(Òæ†?oìÝsn»Í¦Í’/r},¡éžHµ=zýñÄÖ´Q *´&÷ŠõAÃôì7íïúõTž&Ì?¸¶g¶ƒ¶2ù—?ín†O_øÅ%òáyžü„”à:œ çߤ  [yÔJá¾^Ú~eXÂÀŒÂ9/áKÊñ®ÔÌ 9¸øYëð(&ĆÍ÷”Ó=€!{ð‰uÁw'ïñC> ŸÂwy/lNÅäïs¨+äÛàiMÔ¾X69µXwy¾{‚C± ê¸]1…ŽW]¥dmH(+Sñm®ü[JJ°ûGæj‹{<ãQÉU³L:›uŒi–î¥kby-:,5ùÏ_W¹%x[³In|p'Wà4ý>GS¹›nñÞdœHfÍV¢÷ªKåAPÄNý"Ë?s`eÕŸ3á ·U¶bKGDùC» pHYs%%IR$ðtIMEæ)Ô • IDATxÚìwœ\G•ï¿uoÇéž™žîž<£r޶%9çlÀÄÅ`Òbâ[`Y`y,»°,Ѱ»¼Ç»˜dlccl°qÄr,+ç4ÊMÎÓùÞzÜÛùöYrÀ÷úã¤î¾õ;UuªêœS' P€ò¹sçÎøô§?uÑšÕ«×ÔÖÖÌPÕ) ‚q9á'"ïC‘÷KY¢UQ²u‘÷©˜ëö„ÙŽoãÛø6¾oãÛø6¾oãŸm|‘û–0iÖíe?˜@ · C×µdwWwû ëÖ½ðƒüûÚ={÷¶#€.€i@Õ{Þs˪Ïîs·Nkn^™ÒR®d<Ž®kHÉÙÄ£VzÜ_þïl|߯·ñm|߯·ñm|ÿµŒ?±ZUÅåt¡:‰cÇoüÎí·ÿò׿¾s=0àÊo¹å–U_ýÊWþ®²¢|þÈ𠚦YR'ÌISw)¡ld€³¿¬Ž”Å‘RÚø6¾oãÛø6¾oãÛø6¾?Uüd‚x,Šªª®†úº5_ýÊWRÂwÞùœ:wîœ5ßûîíƒË£‘1t]/Ò„(­–óc¢ ‘¹è–߈ªÒÙÇŸœõ×Û߯·ñm|߯·ñÏ6¾(!ð¶u×øRJ’ÉeeeÕ‹- >óÌ3{Ô¯~å+·»rå›ã±¨*OÓÇGJ™£ä{T¥É–ÿƪ_ÁG¦‘Kh\úØ+M¢ýØýØýØý¼1Yàë-K /‚¡ýØÏT-•"Ô–—Wt9V®\±:•JºJ þRJ¤”Æ€- ®"äxŠmQÈC!W£¡ˆI3xšN©ëH9Ñò)E\Z;y_I:íÇ~ìÇ~ìÇ~ìç ØOQ.±?¬€Òò“a-¶åû±æÇd2éZ¹rÅjG0h+öñ7™V—Äã1R©Äx¢úY#Òátáv{ÆeâôâŠÇ^e:=sÑÙ‹Í~ìÇ~ìÇ~ìç.ôÇc1RÉÄ+.LV~²Ÿ7Þ£¥R6‡.ug¡Fš¶ôÇcQE¡®¡Ÿ¿UU_â4±ÑúzºˆÅ"¸=^EÉ2°LÿQ@g}eþrTÕÁYפAgdt„¾Þ.bQ :Ï"¶©ü¿J;›oãÛø6¾oãÛøV‚w¾üô*Ê%±³ —ØóÿºÇ×uÝ)vïØÖ_Væ­J»ôH“yã±(BšZÚp{¼HYúÚêôk/·ôµU<åÄÑCèºÄãõŸgÂ&LÍ:jÒÙ:—Ëcf*’¯Ø<(ªJ2çÄÑÃH)q{½("Ú‘·à2Î}¢p·Èí|Á, ókiq«!‹y!£ I߯·ñm|߯·ñ_)|@­É%HCH÷Ížÿ7<~$pH©ç5%¥DÓ4RÉ$µõ¸Ün4-u–U˜bÍt\n7ÁP5]§N¢i.TUÍŽ”èšF*•¤¦®Õá$™L¼âJ˜®ë¨N'U¡0Ý85¨ª©¨}–ý+VÞd!#Œ‘Dÿ¾P”ùÉ¥l|߯·ñm|߯?ûøòµ*—8]UMç‘´çÿ Œo|®ã°Ã¥™îÓSæC×%¯Ö£ëO™/K“ªfè”&ƒ¸=^t‹¸…WŒNMÃíõ é:ŠªNÆ"BÁ*‚@æ°L$“ôôö2‰© Tf2!©TŠcGŽâ++£¦:l|BÇéèì"‰P[SM(,Ùçd2IwO/c‘áPˆªª@f÷@JÓ8\€aÕŽAk~?,é©®& Nj>N«ÿVïUòÚLŸ …x<Ž".—‹þþ~öl§¾v|>Ôu¾Á!R©¬ ©Ã¡Rd…t)éîé% VQî÷—>ð¤dphˆx¼Ø¥¢¢¼œ”–bϾýï¥4ÞÞ>zûVUR[Sƒª(gm^b±Ý=$ BÁ Áª©TŠ7nÆãq³|ñ¢¬sÚÒ™|ÍÊ%iåÊÎùc?iEÀ…u@æ© rÊ›g¡Mèž®®Shç’y´N½í#@ÞmB®Ukòk^æÌÕè% Æ©+`õù”5ô‚vŠÌ¯|‘?ÎéIÈX÷s-$…ÀÜ÷ó,ÔŠÂÎÝ{ùñ¿àoÞv3Óš›Œ«<+J®GžE®È iö¿ð;!öìßÏÿýÉÏxÛ[nâío¾É¸ÖM[¶Èö3ŸöœþgÆ6—g ¬}í‡øñ¿äŠK.fÁÜ9üô¿fýK›2ô:T•«¯¸”÷¼óí´9Êü×O¹öªË¹µ¥)-ú’à“®˜kQÏrcT…ƒ‡í_y9­ÓšÇµÊgÆ1÷»œ6K¿'3{ÅèØ÷Ü÷Ï®[O<ž  ò¶7ßÈ…kVO$øíïäéµÏ’H$ ‡C¼÷]ogå²¥é¼ÅlÛ¹‹ÿúŸŸsþªóx߻߉ª( sç=÷±nÃFR©5ÕaÞû®·³bÙÒ"üh,Îo#•*ÂP LmÁh$bÙ‹Ö¬fhddz¬×ß„´Yõ_X÷éVoÜ>•XÿBúøÅoî¡©±·Þtí‡ò?ÊçÃÂõ/ÁÐð0ßùÁpª³Û´~ë454ðÅÏ~Š@e%8ÞqŠü¿ÓÝÓËûÞýN®¼ôb´‚Šói¾'Üñë»Ø´e›™Éİ@+Bðžw¾æ¦F~ôß?gll EUºÁ׳ڦóþ÷¼‹™mm™}HXì…{MÑ~eÁ×B?ÙÁÿûï;aåòe|æÁírñÈãOòÈãOâõxøø‡?@Mu5Ò¼ÝKoMzîº)\—&_Œ·N"Ñ(w[~· !”)ã»ßñ6®ºôbâ‰D>ŸÜòNTQz}­\¶4‡÷ž#‘Hdxoå²¥¤R)þôø“<ôÈŸÃïóqóM×sõå—Š`ÿ ‹ý)ýùøûkV®áWwý–7n&¥¥¨ ‡ù›·ß̹+–søèQž}~=Ÿûô'™=£-o¦vþ‰¼ãïtå’3a!.)—äŒÕOþ°ñ q–jãËH%4::ÊX$RD›ªª•8ŽÓ³Êʬ.’鬂#ŠÊóʼõ™Þ­GÆ" ¬¬ŒÑ±±ìßGG|¾²ñÇ GæâäþHŒ7I"­žO¬Æj,–—$ÒÚñëUÇhšÆÀà RB(XE"‘`hx„2¯¿ßÇððÑXœªÊJt) ‹Q$B ²’êp!ƒƒhšNU §ÓI$axd”Šòr4M#O$èêêfxd„êpˆòr?ÑhŒá‘ÊÊʈFcÔT‡I$tvuÅ2VÑôUt,£»·H$BUe%ápUQÐRÑXŒT2R242B<ž0ûQF"‘̶ ReZ¯c±bªÃ¡ÌPÅ }üIt]ç‚Õç±kï>^xñ%–,\À ×\ÅØØ÷<ð =õÎ[¹Â¨Á‘HJ¥É]=DcÑ\C '“tuwæÓ‰Å1æ`dd”h¥¥~ 'ZÛR–ÖͦàdöŠã ˆÆbüè~NOO/_üì§Ø³ï¿¼ëÖœw.ï~Ç[¹ãλ9Ð~ˆ¼çoxö…õlÞº]ê”y½\wÕ\yé%üúžûع{ýÐû9gù2yüIzô1ný›w˜V+…Öoà©gžedd”™3¦ó··ÞBGg?ûÕoh¨¯£««‡ Ï_Å×\ÅoîýÏ¿¸d2I¨*È;n~¬>ÁÁ!î¸ó.¶nß™GÛ®¿6c•SÁÁÃGøÑßA,çoo½…¶Ö£ÍõH¦²m^tþ*¶îØÉ¿¾‹†º:ºº{¸`ÍyÜòŽ·Ö?EáTg[¶ï`Þœ9ÔÕÖ°sÏR©~Ÿ†ºZU*++8rì8•ŒŽŽeÖÝÐÈw¥q“IBA÷ÂÕç1<:Â]÷=PÔϋ֬bÓ–müò®{¨‡ h,Âì™3øà{߉µ™¨ýþþ~~çÝlßµ]×p»ÝÜxíÕÜpÍ•  óó_wýUW :²v]Jú¨…¸ù¦X²h]Ý=lÙ¾®înöí?@2‘àš+/ç‚Õçqüd;vîæTW.§¿ÏGKsƒCC†EH¦RÈÒE yøÑÇyäñ'yÿ-ïbÉ¢üì—¿)â믹*C_0XE,ãDGÕ¡ý„‚UCS<–àwÿ‘??ñ4ÑXUQYºx!ï{÷;9zì?ùù/ ‡BŒŒŒÐ×?@C}·}àV‡òø«Ó\']Ýô[ñÞÖítõôÐØPGZöÏÝÿ³ãh øO›ãxÕå,]´ã'; xßxŒõu8»¾寯}òyöĉ¶ï6xoçî=D£Q.½ð|æÍì™møÊÊðû}÷UlÙ¶;p(ÄàÐ#££,]´`Ëö¸\NÞö¦¹öª+Ø´e¿¸ëjÂaºsö²¼çoðz<\|þùÜ|Óõx½6lÜÌÈÈ(ÉD’†ºZfÎhcÓVc ›ÐOóü“–RÔ$å’ì¯'% MîÜÎîr¨“o0ùÃÆ/b$)%J)–¬`|)(ŠÂX$–­Ûèîé1Í›R]rüø ~ôÓÿæ·÷ÿŽDb²ï¤Û[Ù2‡ŸeÞŽL™¿+ŠŠ¢)9ªÃ@ ªÆçùË·x4òP¤5å²àïrœ9Ê „*ñžUO&úîµ€”x=ªC!NtœâБ£>zŒ®îöl§§·—½ûàõxèîîaëö,Z07]w-‘H”G’x"Îô–itu÷°{ï>FGGÙº}'š¦1£µ•tPSÿÀ Ë—,fF[+›·nçáGgttŒÞ¾~vìÚC PÉ´ÆFÖ>¿ŽGŸxж–n¼öj"Ñ¿¾û^:»ºÙ³?Ûvì*¢aphÈäiAGg'wüê7=~‚«.»„óæòLºÍÖü6;Nu‘H& vï!¨`ZScf1 !8Ð~ˆÁ¡aZšq»\Ìœ>†ú:žyþ¾ø¯_ç[ßûwvíÙǼ9³ijlÈSJŸÍŽÎĽç^::;yvÝ‹Åý¼ç^::»H$ ßácÇOpÎòeÌl›ÎÆ-[yèÑÇH&’™5jÙþÝ÷rª«›[·ñÌó/0³­•·½ù&ÊËËy~ý†GFÙ¸ykÁw~ž_¿Ááa‰‘H„H$B,ãš+.ç›_ù'–,ZÀ‘£Ç8~ò$eÞ2|ee át:© TâPUBUÉ$ƒƒ´Nkæ#¸•믾§Ó™çÛêPU’É$ÇOœ¤«§—‘‘QR)ã½x?%‰004>ÆG 0Ò[x<ÏéG¼¸'NRæõ¨¬DU zNœ8Iwo/#£Yz°X©TŠ¡¡©õ?ý^aŸ‚¹ïµ4óÑÞÊõ×ä÷‰Rë_J<7ç³·ËEC}ç,_†Óá(:”ŠÖ¿ô÷066Æý>Ì¿}ç{üó7¾Ã#=®k óàeÎÌW¦\ët©}FêPéìêæ|”úºZ®»ê \NgŽßµ‘ºZKi*+h¬¯#‹Ñ?8Èž}9ëüúk‰D"<òø“$IZ››éèìd×Þ}ŒŽ±}ç.t]gÆô^Ú´…gž|mdCSCªêàÈÑã9v)%-͆[”P¶ìØÁ}¿ˆr¿wÞüfæÏÍÚç×ñÈcO‰FèëïçÄÉÎ[¹‚¹sf±gß~^xqW_yßüê?±dÑüœu⥼¼Üš÷ʼTVTdBù¬ö%wÿdŽã•Wàp:hinÊçýÅ!½¾º3ë+EOo/ƒCÃy¼WUÈÄ#tu÷ÒR<øÇGøò×¾ÁOîø%‡ÍXÝÓüKÄééíc``s–/£Ìãå/Ͻ@ÿ࿊á‘þüäÓŒŽŽ7ã ŽìexäÏœ»bŸüȇèêîæ‡?þzûû9gÅ2ü~·›–¦&i?t8/øyªç_‘H6¹$7x^ɸi ËÏ,ר¤äYRÊúk–?l|ëß8Jº×ä1siE`dd”H$‚Ãá@× ÓB8âß¿{;ÕÕÕôôôðéø<]ÝÝüôg?ào½y7"_W’i:²„šœõ{’|>_úÂçªÂG>ôAB¡ ÿûóŸ$®œƒtb•¬P›;ý;9å_‹qß­à;æÎžÅãO?þ9q²ƒºÚZFFFÙ½w?CCì\¶”%‹0:6F,§»§‡d*I,'‘H²tÑB‚UUì?ÐÎá#G9züóçÌ¡¡¡Ž‡¡KÉ…«Ïã¶ÜJû‘£>rŒ}Ûij¨`ÙâE|ò¶âv»ùáOþMÓ(+ó¢…²²2ÓbuysfqÃ5WZÐÈϽð"Ñxœ‹Ö¬âªË.A×uöìÛoÙæƒí†ß±”,_²˜OÜöAÊýþK¯¤§¯]ש(/G—:mÓ[ù»|˜µ/¬c߃ì?ØÎ–­Ûy♵|ê#FQ Í:‘H°gÿKÜ»÷²/ï;‘¥©½E4]¸f·½ÿ½8tˆöÃG8Ø~ˆ™Ó[ ,ÕþööŒïóá£Çðù|,Y8Ÿ…óç™ýß-`Ñüy¸].î¾ÿ¶`Ñ‚y¼åÆëñûËØ¼u;¿¼û·tw÷pó›n ¡¾ŽD2™‰í@EEê:©d*#*ª’·þT‡ƒeKóü‹¸ó·÷óÇÇž ··E(D£1îùÝïÙ €ysf‹ÅJÃ(’3.Fðîoxƒí‡‘Àât?|elÚ¶_Ý}o¦­ÓšY¶dϯ1!”Lj@«­F7}ó§ÔŒÛTÁ{jnŸ¨ŠZ”g<#’ÛíbÅÒ%ÜûÀƒÔÖÔ°lÉ"6oÝV‰Ú¢-)q»]Ìš1ƒ™mÓ VøýÃpÿþÈ¢óÙ¾k7ÇNœäSû0ÇNœDJI"™Èô{ÜH—<·þENuusÛûßKMuØÈ¦SÂ:ݦÚZ[²ë¼;g'“,]¼Ê‡+سï‹ÌçØ‰“,˜7‡ºÚZvíÙ‡‚#Gá7ù:Íó'dHIeE9R×9tøýø}>jªÃÈÝ]ר¹k‰D‚®¹Šk¯ºœC‡±wÿA¶íÜMu8 V._Ê{Þù6ÖoÜÌÖí;1]|^/›·å¯“¦†z\N'e^åwÒ"v"už/G]š|£dù˼r8T–/YT´¾Œàs­€÷ ·_)%‰D’d2I*¥QWgD?ñôZ~ûÀƒÌ™5“¶é-®Ìªç¬XÊûoyc‘1zúú¸öŠËY¼hÛwíadt”d*i†cäìeíÙ½,™LRî÷3<2jî³]ÝD¢QÜn†Ûho¿é*sºçŸœØ…£„\¢k:}ƒƒ™—R©UE!P@U”ÓK¬Ïì7‚ü‘¬s3aÏÞ]ÒÏ|ÿ³ñ€V?Â"fîtðeŽðŸ¶dI+çYÒâ?2:Ê7¾s;[¶m§®¶†Ïýý§3 >XUEuÈðiÖr6ñ‘‘~ú³Ÿ£ªÞ~ó[PUe’¬ ó&Gæ0¶”»Ébw¨Ü¶ÜN'BQèééá_¾öu¾ñÕ¦º:ŒÔ‹SŠRî{…÷&R戊’“4>‹Ne™Xùô‰ ™ô•Æ×¥dfÛt*+ÊÙ¹Û°ÜŸ¿ê\6mÝÆ³/¬ÏaGŽçO?‰Óá`zË4Êý~’ÉRêÔ×Õ2îlvíÙÇ3/¬'³bÙb¼Ofƒõû}¨ªŠßW†Óé$™L¢ëFàUsSUUÆ"Qb±8Š¢ÐÛ×O$¥&¦®¦†r¿öCGŠiHåºÓt—ÃÁ‘cÇéê:L,³h³¿ßÇX$š¥!ÈøÒ%Ù…8NÀ˜{ûú¸þš+¹åo¥³»‡ÿøO­}ŽM[·1oîlƒM·Ä­¯­1|š-iªÁïó3dZ*CUU8Êýå¸\Ƙ¥­¯š¦•èW eÞ2ΟǛo¸–-ÛvðâK›H$ìÛÆúzÎY¾”ή‚ï´óá÷¿‡ÁÁ!:»º‘Hš›I¥R<ýìsÜyÏý!xÿ-ïâÊË.ÁírQæõ¾åñ8R׉Æb¨•²2¯±HQœ´@×Y±t ŸøÛš..=Fû¡ÃÆmÂÀ ‰M x=ÞL܈®Ë óŒ–ÅÂdÿÀ ]]H`ZSƒÑµÏqçoïG(Ù~8T•åKóñz:Œßç˱æ[öTUrÿ‘Òx¯Ìx/£½gí¥('Xòº®gö[)õ|ŠK¼¬i æÍezK‹‘QسïÛwíâÄɶíØÉÈè(÷=øƒhšÆO¯eZSË—,*‘žÕØ_{ûúy~ýªÃ!–-^dákZNU…þA:NuâõxƒÂÚç×ÇY¶d1.—“Ë–Xò|sCÂtàðš·=6mÆïóÑ:­_YYfÍFc1ÕT$>Ÿ·ÛE,G3ÓN**PT—Óª™pR)gž{Ö௜uâr:I¥RžKã›ÏÕ IDAT’Eé+-øD—,·X_¦²¢¯7—÷Ìõ¤ª”ûý¸=nÃUêš«Y±t1}ý<·n=§ºº™Ù6¡ÈLæ)Áív£* n—ñ§Çã6nör\Ó–óÌ^Vnìeñx‚½ûâp¨œ»b æÍáßôS¶íÜÅ‘£Ç·WB˜Ux9ó/+°çÿÔä!ýƒƒ|þK_Î(P”P^Ãáßùúר‡ ãÊdå’ŒüBX(-åòGú,Î?{s~¢¨ ÊJKƒÈÙï¿@×u††‡q»Üøröh! ‰‹Ç©¬¨0é{ø2mùÏ»°JõYÊ&/ˆD"lÛ¾ƒÎ®.TUÉXþ ?^M×2óYm¦‘“R7‚Í~÷;®¼ìRÂáд­œ]HÊülD²T±mJZ]GÓ4::;3‡”!øë•5ƒJ+åÂ*Ýgá ™_“Ùz—ãØJ©®E‡ßkI(XÅô–^Ú¼…ª@%Ë—,bÿÁƒìÞ»†º:¦55qÿƒ188ÄG?ø>fÍhã»?ü‘)üƒÇífùÒÅlܲ•µÏ½@ PÉÂyóòøg÷Þý;q’=ûö14fIC®UõÒ ÏÇívóð£ñ§Çžàý·¼‹p(”isùÒÅlÞ¶žÞ>ªÃaÆŽ3-7f¡•GÐÊŠ #7EQ»÷ìåg¿¾‹ ׬âÝo¿™PU¡`Š8]ÎLö"—Ëiâ .Xu.+–.Éô¥©¡žP0§ŸË³ikš¦ƒÃCƘí7Ælçî= Ð:m.—ˆ™×þj³}³P¨Š-ÛvÐß?À[ßt.—‹»ï{€ýí‡8vü£ccùßÝÿ{ÓÍ«ÝzK&½ Çã¦ýðî¼ç>‰$o}Ó Ì=‹ŽSÔÕÖÐP_G*•bïƒÔÖÔpøè1Êý~ªÃ¡’‰ÒA¼;vífùÒÅ476ò?þ)ååLomaÉ¢$É þYK2™bï~ãH#lð—(VòÝn7zï»3Š¡Çmöã·Åý¨­©fßƒìØµ'žÊòr3“âìj¦Åtªý—¦ËSCñÞ¾©+zOædÀ*a©,ZÿY xzŒ“§¸hÍ*‚Ut)³Y˜ŒŒŽ²ï`;‰D’'ŸYË©Î.VŸ{¡`¿ÿã#%öIY™‡åK±}×nžy~••,œ7MÓÙº}g1_·âxGWz¯QhÖÌcO>M__?—\x>‘¨ap:Ô×Õ’H$Ùºc³fÌ`ÛŽ] ²tñBŸ¯äþ/„¡Üq Š‚ƒ‹üÒëk÷î"~nnj¤³»Ûà½ý¹¼g57Ö×£ëGŽ£¥¹‰¡¡aœ'å~NtœbëöLo™†”ùwÿ…Ùk°0¨ïÞ·Ÿc'N°s÷^††GX0¯‘7nbýÆM|ìC`zK3©dÒpuÊ$%ˆ¡AEyyþÙ=éó¯ ÉéÈ%’C°*³ç¿2ýB044Ì¿Ýþ=ª•¼ïÝ拉ÙH|¢£ƒ_Üy½ýýüÓç>C0XEÑòœ¾a,rÈI•Þ‘øü‹qµÕ`U?¸ý;HÓèSŸý‘htš¶(©hIKѼÀõFX(?2Ë é7¥è*ÈŒ’—“»œ’™Ctœ±,Šú±Xˆ“½›øbæ5‡/¥¤Ìëeά¼°á%*++™ÖÜDC}=[wì¢mz áP`Uº®óèOñøÓÏÐÝÓƒÃád,2†D²`î\ªŽ;Îù«Î¥&ÊÜÔH)Ùwà _ýæí Žàt8¸hÍj„0,fºÔÍÌSŽÌ­Ã]÷ýŽGŸxŠÎî.fϜɵW]N0hEƒƒ±±HƇ¸®¶†óWËæmÛyjí³¬\¶” V¯²hs7]{µ¡ kZ¦€^þM±¤¥¹ ÛMgW7IÓí`fÛtÖ>¿Ží;w£ª ƒC´47±jå úH¥4¡pþªlܲ•»î{€GŸx:ƒ{õWqþªsÍï hºîêŒ@±c×þùëßbdt§ÃÁ«ÏÃëõL¥òÛ¿÷}<§ýk®BJɺ Ù³ï õµôôöÑP_GSc=»÷îÏÿ®§—†ú:êëðû|†%ÔŒ¡Øºc'Ý=½8NîÿÃÃÜÿàøÝ.>qÛ‡X¾d17?Ãþô(kŸ_GOo×^y™)˜ëÓ}IÓ4Óª#Ívá¹õX»n=ååt÷ôró×SSÆ¡ªàËîË/bZsxäQ־ƸÆÿýÉϨ(/§³»›Ë/¾¶ÖfÏœÁÕú¥¨ªÊÃ>ÆÁC‡¹põ*Ì›“cõGƒàdÇ)bñ8Óš›p¹\Æ™’.:¦KvïÝÇ×oÿ>š¦‘L¥hkmáM×_ƒßç3”«u3ÝÑæSYQNgW7«ÎYAu8œ)h–æëú¾®¯­¥¯¯ßˆ1Ð4ƒ&·‹D"AKs»÷îËì«ÎYÁóë7ðèO±uûú‡ðz=\~ñEhºá6“žËÌi:[¶ï »§Çrh?”Ç{÷=ø0·‹ÿí9oår³=‘I´•¹Aã˜sÇ^Ä'¦û㺠¬}!}U‡‚,Y¸Àb=]Fu8ÈŠeKXûü:îðaþòÜóœìèäÜËh›Þʆ›ù¯Ÿý‚®¹ŠÓ[HizS—:)MˤÖu“™Î\$ر{ÿüõogö²K.XƒÏWÆú›øñÏ~×ë¡«»‡Õ箤¥¹ÉÌbÖ…×ëaZs“Å-ÓË9ÿ&'—H$Áªÿþn7ú3Žð¯A™Çmm½.)—äw-­ÀýòH4]£o`€AB¡ Ó¨i}ýýæ¾V ò¾rýw»ÝÖ¿´‘X<ÎG?ø>‚ŸÜñ+6oÝÆ9Ë—ãr»_6~š Ô}ô¶/º\.OÖb/«]]#̦쳺*ãÁ‡ÿÈèè(~¿Ÿ+.»”ÇŸ| ]ê¼åÆÍ"-ÆÁYVV†ßçCÓ4øÃC€ä-7ÝH¹ß7.ýº®1Øß‹¢¨†Õ4'Ý‘®ëèºFEeÕ¸W5…LJ¦ë > ‰$ýénºþ:„€á‘\.·±Ñ3Μå|®k:ÃC(ªUU³Õ yõ k¼ŒŒ­g_€ßç' rîŠå̞цßïËÒM ÔÕÕPæõàvþÅ«Ï=‡æÆ¦55¨¬ÀãvSUYÉôé-\´f•á¦e2v8äÂóWSS¦¶ºš®¾’Õç®4Ε,š?ší«:bÖŒ6œN'ee^VŸ³’·¿å&êëj©¯­µ ¡‘æ¦Fª*+© T²`Þ\ÚZ[¨ ‡‡CÔ„C,š?ϲͺÚ¤$Kƒéú;Ne^/Ûwí¦§·óV® ¦&Ì‚ysVðz¼„BAÎY¾Œw¼åMÌ˜Þ H*+*X0o.‹ÌcVÛtœ.¾2/«LÜÚšjªC%úY[Kûá#lØ´…‹Ï_Íâ… ¨®qÃ5W±æ¼sPUÕl‹ÌÏ´‘Û~]a•ol¨3²-) æÍ忝£uÚ4êil¨/þ®eZž•LÓubñ8M ,œ?Ù3Ú˜5ssfÍdîìY45Ô3½ešáŸë/çâ ÖpÝUWÊC“UVT°pÞ<ê먅ÌÀjCH¿ò’‹¹úÊËðºÝE…w*ÊËik†Û•ƒqåø}e9Ù¹µÙ¬?2ë‹•îÇŒ¶Vš@ïr¿Ÿ+/½˜«¯¸ ·ËE,7}¡SyÿëºN PIÛTû/bWVïùËÊòƒŠœ>IiXõKÑRæ5÷+++ij¬gFk UUU,˜;‡ªÊÊ’ï575ÒÜÔ`ðUe—^x7\s~¿E1üÊUEE( Õ¡ ‹Ì'”)%ŠbļÔ×Ö²béb••yëÊï÷1wö,æÌšÉü¹s¸`Õ¹¼åÆë˜ÑÚŠ‚úºZʼ^c/[ÂêsΡ¹©‘i TUðx<ìÚ³—ž¾þÌ{ºÔ3|-#ÑE_cðÚ‚ys˜1½ŸÏÇ‚ysY±l n·›ºÚZΟKsc#sfͤ¬Ì‹Ëåbά™¼åÆëY±l1B(T*Y8µÕÕÿ–—3ÎlBÁ ÍM ,š?Ù3f0kfsfÍdö¬¸].šêÍïژὙ¸\.É$IËqTŒq¬«eÅ’âq,⯺Zã6?l¬/™^_—^Ì5W\†Ûí¦¢ÜoͳÞ2Êý~f¶MÇérâr¹XsîJÞrãuæƒ4ntçÏ£¡®Ž`U€Eæ8!hl¨gáܹ”—ûq8ÌšÑÆÜÙ³8~âdþ^6ö²Õ箤±¾ŽiM8N*+*¸hÍ*Þ|Ãu« ñ»‡þHmq^8Ž—wæ¦\"¥$#•J¢¥R9ÿkæŸÆçº®árge“Ó‘K„o8ùCÁX$ÂãO=ƒÏWÆí_ÿïzû[¹éúë8Í*ž{~W^v >oÙ«Ò·ÇÅüyó9zìÛwî¢ýðQ6lÚÂÎÝ{X¸`>Ÿüèm„ªÆïLˆoÄ ÆÅö-ý~eZ›ÖtT2–JÒ:k.N§«¤Å¿«»›Þö1º{z˜7w_úÇÏó­ï|]J¾÷íofüçÓ°¢(ôôôò÷_ø"ßûö7 …‚ãºý$“ ŽØ‹êpá4s§]/’É$©dœÆiÓq:]EZvÆ‚Ÿ§9+ôöõñ¥¯ü+U*ÞrÓ |óÿ|€/~îïyà300À׿òÏ„CA K@ñ5@L&9y짇Óiä1 O/kåm²éŸ¦X>âUÇOÇ„¤7I¡Ù¢ÒJ§0-kº®e|1…é—öq4Òz tiZM‹ˆ¢(Æõ°nð±CU3m*J#wCÐM×/ÃמLª”†Å©L|]êH]æÑb2ÛLeÛL[Žsi(Ìê,„àO=Á¯ï¹ýí¸pÍy9kÀ8¤Ng&{Vn{ét¡º®á¦-Û…4 !xüégøáOþ‡÷¾ëí¼ã-o"‘Lšy:‘×ÏñÛW !OÓp8Æ<èYìTJ3¿sšßéÅXfa¡båߘwEH]’Ò4ã€Î©Z™7ÿiãE¦]A2i .—+;ü/2ã$M~0ê‘ä.ÿB +>OóƒU?ÒÔŒ8ƒôòÇ??N$ÍÏæ!u¦·´pÉ…çãv¹Œ ÞÓèvÜÌlH¹ý5ÍGR20-—^x>.—+óû´ûD_ÿ=úgË÷Z[Z¸Ì|/™J!uÝÌc],.ݾIKz纅AÆÍ/ÏiÔäçô¯.%º¦cjÖÅÐ¥ÎØX„ÇŸ~†‡ù3~Ÿ/᳄ƒÁ<ïÌð'æx¦çAQM×Âàñ /˜\2™Ä¡ª™ óìÚ6ö7‘ÓfÆõ¿¬;!0çæ±’ssiÁ8êé­EA¿rÝ)ò×—Ì·‹×yÎÒØN§3Ü®äôݸ™ÌŽƒ¢äŸ„lœ±=ý~øãô^v“¹—92‚’¢(hº†¦™{ºùüå¹çùñ¿â·¼ËHÜ åi¹É©Ê%ŠPèéíå ÿô/ôôõ¢k…A—:Õ¡0ßþ·¯RÜ"O,—dä§œÂqoùCAwo/Ÿÿò¿¢ª ßýú¿…@@OoÿÅ/’ï|í_ŒêÛÌ^‰þ»Ýn:»{ùö÷ÿÝ{ö0gö,¾ð÷Ÿ¦©¾–x,öòñŒŽŽ 9r“ɉC¾,5ÝP0È—¾ðy•üãç> @"™à”éK_¸IýïÏÿ)-…¦iãhÇ¢è -ÿ"­ ÏDQ¡3iáªeøêú|>þò쳜èè`tt€þè'hogͪóp»]–·dV×7Vã&'t˜*ö¤•°šÌ»€'³ñÉqÐk _JiTÅMÿ[—H´,Rf2‘èº,RÞ¤yTˆ¯´›9$,0³‚€Ì¤zÍÔÊÒ és«¥2øz k½¹m–èwŸH.Xuû¶³ÿÀAÎ]±ÌÈ8eúog3'´q Ÿãk^é;޼,œ' ¾S„Àãq…ðx<† "DÎØš10™~é™6 +E꺎ª(†p…L˜ØéïÒ¿µäC]'Upp厓®ËLúN©çTõ,1ÿä¼çPU0³”ÿ,m"#[¹˜ÆáÿÜŠ´–üo*¥¹ô”û}\sùeùcc¾ìv»PUÍT­úŸK[¡+­4݉œGžÒ%)ì“ñ”ûLZL0·xaš–¼4ÎR’J¥ð•y¹æŠË2sÅ{šÉ'˜ÊFñA/3¸@Pî÷›mêE›ÛíÊ(÷¥¿åއµ0eð”ª*f;2#ŒñÌs/ ( ×_}%Áªªœ4²†ÂÏ×Y¿ï”9ž#¸7WØÖ öBaºE‘³¯I)‘ZþÍT*gŽ ï£%Ö¾¾éqõù¬ùˈ£ÊÇq2Æçõ+ç$o}¬YYÐ^Ú%,›÷>þ AË7äà§c EÁãÎÙˤ42™åð†–Þ¿T53ïñD‚ýÚY}Î VŸ»2/ÝíTÏ?JHO“‘K¤ÈJ¡”´Ì+(™ú+ÅÅ»&–K²»†Ìz:Óç:“–gͽòGakš–B3ÏqãωåÞWBþJ&ÄãÑ̾†#‹‘0 8ò2ñ…éjäÈãŠÓ¸¤Ig¤Ðuü§¦§·7c -EQ:Å`(ä»ßúáp¸„õ_NZTÈM,wÓñû}üÝÇ?F,góÖ­צíí,[º„ÿõ±â÷û3À„JU[(òãµ¾E%ãôåÝ_g– Ôë¢D©“Á—ãFäbùþO?÷0(/÷ó‘ÜJ2™ÂáPKòùxø²Äø)Ëf6œ9³fRæõšB«·ÿrR#qöøONj¡ãË)ágG!•JÑÙÝÃÀà ªªRWSCUUå”ñ / øOU„ÃA„å'ó”­„éãõz2Ÿ¥R)#ݲÓI™ÇbfuæÌ!!Àír™ÅÕòL›‡ƒêêÉD’”f|–·N¤QàidtÁ³ªêÀápPQî'‰f\ÌÒÌlÎq‰œÂü;T•êPÐBÜÍŽ‹D¾¬ýÇjý§ãÔþésŸåþ¼帇ÌËÇ?Óû¯ªª„Íjâ¢IK…âìïÿg¢ÿzá^¦éXØÊ¼}Òépðη¾§Ó‰×ãAN°ÿM®ÿã|^êc='.r‚ä'ÂôùÏÈ&S’KÌÿ¥0%À3yþg³Õ”2ð(ŠBeE…i$:Óøãó_.7hšn4žþÃø•#p¿ò@pôøq~|Ç/ WŸùóAvíÞÍòS>ò÷ÑÚÒœW;âôð ÇGqe€Â£üš¦R)º{{8uª¡(^wH]7].Æó_”0jX4˜ÏD¢d¦\c±MoÆç?ûnÿÞؼu+Ë–.áóÿiÚZ[ÑRÉ ¦,»‰Yè/Ç·ýçN^ÑÜÈÉ G±.”ûaqù@ÿu€/Íbh^÷Œ³…Ÿ¾óxÜÙµcÏæ³dJcëöôôöI$’:|„åKÓP_oî“2°œ¾-Ên;"ãF’ëÞ"L²Œ@œ“8×"XdDO$سo?º®³lÉb!ˆÆblݾ“á‘óŠx&Í ìÞ»Ÿ“§2†˜”¦qÞŠe464d†Hê:ñd2¯M)uÑ${öîG—:Ë–,Êf1ëJlÙ¾ƒÁ¡!¤.©©³tñB†‡Gؼm©TŠd2É̶éÌž5ÃÚŠ9ÉùÏz‰ä«íù—iÿ‚Áª¬•ZÊ×5ÿç¹1È’‡ÙërýK$žÜ½¬0z‰ K‘ÎðÙÚÿd¾(;i¹Äp3MÄc%ç\Úãv¢ eJr‰õêjkp»Ý 0‰ÐÙÝM"™4«Ê’ÂOvœ¢²¢‚Ù3g°eû:»»q»]ôõõ‹ÅèëïG×tü>ýƒÙƒ]Ó¤ÜïÇ«˜ÂwnRUQ¨¬¨¤«»‡é-ÓèìêÂépd*'wv÷àv¹¨ª düÂ|  IDATòÛwåì™ù†•lâˆÅ㌎ެ ¨¬ ³«›±Ñ1†GG‘\.û¶SæõUyu™ d–6ÿÙøýø›¬e‰ŒŠéôÒä¥Ü’©~Rr‰(õË38þ“µ˜¿Ææ_ðã«l?ã¾JÉ€r¿qw¼E>¥ÖRž]ʪΩBÓkÁï+CˆIöT’—÷<Yb—rw²BšDݰñcDÉ!*nׯ·ñmü)á§ÓÏ=“ýÛ9züÉd’@e%³gÎ râdë_Ú„¦k”•yMk¾—Ë(¤ãv»Ù°Î®n"cfÏšßçcËö¼¸q3±xœmÓñûÊp:Œ÷‚x2ÁÎ=û˜?w65nwuJât9pi®Ì®?½µ™¾~Ömx MÓ™3k&]Ó# ™µd&­çÎ=û˜?g¶YiÚ(çriù8‡Q´ÉÌâ±÷ÀÎ[¹‚Ö–iô ðâ¦-¤R)Z§5 VÑ’hbçî½ ‰Æhin¦¢¼ÜÚòióŸÿWŠ:rÉxzÃDùB¦&—H{þmüì?·mÚ­ð‹á×™J&Ñ´ÓÇ©ðûJ=é ¿Šê0+çª:“É$Z2ICÓ4fA¤Ié-bŠ:Ná ªJ&é8q ‡Ó…Ãé(ª.i?öc?¯£ÇL‹ÅâafQ4‡ª"¥a O¥R™M.· -¥¡KilIh,ž)€æñxBO$H&“FÊ>Ŭ*¥nf’Äâq\.gqÀ,L_®œ}9‘L~¡ªŠÇtÂL ª( N‡3ÏX“×>F…Y©ËLd„ù™‰£iÆ^ëv»ÍŠ®IâñB¼™!ë”Y´ÑãvOœ9Ã~ìç¯ìÑtT2AêåÈ%ãiã}>®\âÌ“Ÿìç |´ Áèèècâ dÁ«·ƒ‹’JM!½²H¥ã¿0aŸD‰ß ‹ªÁ¹Áýò®—bbãÛø6¾uÓ×ëÉî€9éŸ=7àNgÜDJp89¬’¹ÈÝÀÜ.WÖÝÆÜ8œyï‰LŠO«}$íÏŸÝ“.§·«PȸÓ7’qÛÏUÒ¿ÏýLUUT‡š¥×ȩ́Cx¯ÇzS´ùÏÆCàççù?#rI©<ìVY„Æ•Kò÷ {þ߸øiGF`-ô1’“»_‰ÎåÔWÉ]²@5ã«0§‹=©Ïåx“{'&Ù¦˜`ƒ)e °Â²ñm|ÿ´ñea~ŽâzR–À—%ð'Ú«ä8ý—²Äyñ­Æ_޷צñlþ³ñ߸øÅ²ûkQ.±ç߯7‡µÿ™YàJÓÁùêZþÓ)DA™æÜëšn”+Ëó¹+ènqV*&ò¸%Î\Qà»%D66@Œ[žZN8Í…›(ÀÙªxyéÒÔ6¾oãÛø6¾oãŸiül!êùé5!—È’r‰=ÿo<|#qDN¶ŸÜ!£\½N42ŠÇëE¾J²¿Œ"¥n¤Ö+tf†x,ŠË]X/ `äxCW*)“ü\F‘é ãT´/T¥d©åL—0o9¤•r<%ÑÆ·ñm|߯·ñmü³Ÿ'—È×\B±üdÏÿ?kù/¨N!L¡[…Þ<Þ2¼e¾TPR‘ÖMi6.ø½È§2c ·ÇÈ¿_°Òt*ŠÂÈð.··Ç;1y¥'¦JiÞ‹EÊTçã43)=ª xÇr£é‚D%Þ-fãÛø6¾oãÛø6þ™Ç-Ë%“{þÿªñ…0S~nÝøb^¶)¥Q,F×H&âèZŠpM=þŠJ3;ÄdÅú‰~Wú{MÓ¢·ûŠêÀét£ªjtjhšN"#•J†)óù_±ˆvM׈ŒŽ28ЋÃáÂåöÑyö;èÅÆ·ñm|߯·ñ_mü×®\¢ (êYKìù½á ££cCŽÂ˜pa^[)Bàp8‰%“œKk!J³»¡€ˆŒÕߺ„°@Q0èĤSqP:ÞYZJûbœ®`A£‡Î\á_NqAOõ‘’q++Ûø6¾oãÛø6¾ÿ â EA ‘B ¢–pJãŠREÖÔܧ㠿F–¡SøgÅ Ùžÿ×)¾iñw¤ ×ä¦‡Ê åEH¹e¡¥5ˆEÊ)«ï&'øgÿ"ÅíåõÌø¢f;Qj‘åÒ’†—v™«k/™eÒP8!é7rÛ±r’ã%.v¬1™ß†oãÛø6¾oãÛø¯0¾)H)Bfê_P"gî€UOQ¢®—VrIV^2ä“âéöüÛø@:Õ§Ì|SlÄÏZÝóµŒâ°â"Þ–9†sQšÈñt£ÂܵÖ?JçCµ¢³´Pô[‹›‰ÒJJNÿ Ôo9^¦YºhŸåøO¦ÿã0“oãÛøÿŸ½7{’$9ïî™U•U•YÕs‘¹ H“ÔÚ.,EšŒ¤$€¢L&ñA“^V&ýzÚwJ¯$f€5[ ú\- Ì ¶»€9ˆƒ 1¦{ƒîêªî¬®ÌŒ#ˆðc<<Â#2"3«ºªOÿ••ef„Ÿ{D|ßïûÜÃÝÕïêwõ»úï~ý†?•iD%Úß°ùž=áA©ù½ÊÜdÅ?Ýõäë7Á|ož©×“cÕ(qñÔ®%ës7ëI¦ÊWe/(û!¬ñ«h³°°ýjÅúëõUòŸVû]ý®~W¿«ßÕïêwõß“úõòŒ ÓˆisýËfíä« ºþwõ/«?ƒ'‡éÏB-ñ0*5°{r̺ú]ý®~W¿«ßÕïêwõ»ú]ý®þ“ÔOÁáÞÂlÒ9ž·áàààààààààpÀì¤Lîéºû0Oà­­o Õ^¿ëëÐ:888888888ÜŸ%ívJJ¤)χú¾ZJÏù†S!]¯888888888< PX[_Ç?üû?‡À÷qåêUð”»nicëà)H)!¤#ÿõW -©ÐjµA™)¸”nòOô64¿ÜÁÁÁÁÁÁÁÁÁátr‚ëºc)ùwppppppppppäßÁÁÁÁÁÁÁÁÁÁÁ‘Gþùwpppppppppppäß!qï©;888888888òÿðCJˆ Üž gáU¹.p8Á]ãîGþ΄eð0DÿÒ%ð0t#§ %!’PΩrXà+HLEwßÜ-×Üi=‡‡SŸ:8òïÐ)!ƒàl"ÿÇq&*ǃ€'!úo_OBG/V"ø3áþ ˜ñè¾3hM¨9~?=ÂËD‘B! ”B(dM÷Ô:82ýàêSGþïU|@êQ')wY¥ §I©Ó*uÄÕ§$DèÈ?9«zÈýÙv‡…FuÁ—˜Šò Ùi?FRÁXÌ=ÎRáX€ …°æü½p ±— îúHp\î÷qu2Áå~çˆ,'`Y÷ñ>-¾ ™¾_œƒû=`rf:î¦}zäÿ´H+!Åÿ ¬â©Î™o’Á®çN-èæ_Öf¥Ü¸þùó˧Qª§¿ˆäú„¿Ê(Äi=à " ¨ÖCêÓb#5S€NAþ;VT+9F4Mš8;åÛ¤ØÍqûüý`HöW•GæÆUÕö]쫴ǧÙI}šEdØþm¯Ë#%¸ïƒ‡à¾¿‰·¬ÕÂ9óËÆÉµ©r>¯Ç÷!¨^ÎU¬§U9É´JÁ£ha›E¡á’7t4KA%’ý=ìÿñáæsÏ‚GÑ‚¶T ;Y@J×8ÚÇ­·Î#Žn”Ë#¤¨gް“œ<óÄOüršŒTçÄŽð$²¦Õ9d ¡ž—ÿøÓŠH9Z–iQ[ÊFv< ¡”(÷ÑR‡ä¸r.6Š$?.ÇT˜~-§;q VM?o %&ÜÇ„JdŸcª0A.£‚ÄLd£_ƒ«,g¡Ñ¡È6DÓy¢ž;ªL¶í©tJUÕR@ñ¹ÇYJ ˆ8¸P"^Kì9Fn!›G**¼äØH¾àr_pÈìj¢ö@”ûÏöûqŽ@(øBç÷3'`Ä9B! ÓEFøn`#Cš¦§î$,JWÚ—é™f]9‘£aë£ÓrV!ÞMÅûx­)ËGK:¢® ›À믜¨#ú£x¯÷/aÆÇy.²t¬©K­¬×›‚(‹ÒœUàf•sJ©»JÆ…¥rÍ÷eŽÁ²ç])uÇò.ÊO›¢ÅÜ÷ÁG~AÎÍÔcq²4ÂÀ}ýK—Áƒ  ÃUmM=!6i5Z)ð(­gŸÃ?üCÜzö¹2ñ¬ŽTÊ'¹ŒAñ{‘·§¸XÎGÑ&‹TÛV/k‹ùóÄ{‰ãÐäDð0‚Z4No·%Ô$]ø>Ä`áÊN”MèG>øh”Oã!v[Lû\i~†:ß‚›§ ìûõä3#¥ódÖ&´âpý+ç1|ý«—À“¨ Á³Qvþb~¼Dv¡ÀÓo>‡ƒ7ŸOMš<пrItC§OB@ =J;W.ZGV¶ä¥ÏE}bœ3­èØQ~ Àã‘VIC[’ ì`(iµñ&ƒ«è_¹¤ÏÚàÕƒ†4tÎ(*(ÌD„)ñÆág1Jðzÿ âÄ7rCÀ2d²ÑÝI®jÜ´㕃Oã+7?Ë6Œ÷0I}L¹ âõþ ˜‰„èö½Ö¿Œaº©D樜¼Þ¿¤óÏ92'Øç_êãú­Ã@À ¢N)e‘û âˆ&: ïGÃ@ÿ‘Îsþ¥>n&9RÁ9F‘þ^Qж6…Õ`B‰àG\—™9„\î /õqåGS\x©?7r`“ýê%zúΧ÷oâ?_ßç÷o"bn$Àˆs\ê÷±Çq‘÷9Ç¥Œð‚c$8dv5GI‚AfLq´ o¡k2ÀBˆüÿ4ÉAš¦K€:™û¦6H)‘¦)†Ã!Ò4# Ç# ‚3$ P\¹ˆ8Ú/%—u–ƒl‡ÂÖ7ÇIµIú„˜‰¨ôìŸ4x õ ÷¡²;°N_• Ãx¯Þ:Q¼—GÁµŽ˜ð /¯È«2Sb*BŒùd΀.yÊ} â=¼Þ¿Œ@^× ¾†©ðsÙ´óqÓ«YúBOâ}¼zë"Fñ~©-sΡsm.‚(~)PÒÜ©Žž®4bÚ¸ñçœ;#Ÿ=Ê ”ç¼ñ™7Ïæ¢ç¢N/,"ÕRJŒF#H)ó:l ª£êžKû¼y¦ã8žkÇ*²UuQSzZ7Öïàæÿ±Žü†!D"¹¾‡[ÏÉ}@©R„¡äúuô/\ÔNÀx Ú)CÄûèŸ×çx@ †_&и?B:8÷5a%áµG”QT”oÊù JÎËpXD>Š´õ5Qó0Dÿüy ÆcÜ|öÙ¢MQæØs楄 B¥ ”„°_Е"´äŠ"JËΓ}Ñ3ò-F>/]† £y_mK á¦W¯âà“ŸÄÁ³Ÿ„ˆÆÚ§ sh4¡¿˜ÿ¾ÔŒªÚ;ñý,ŸÕBsÈÜT,…8ºQ"ìIt€Ã«/€§Zqhcq “ÁÛ8xóÙ‚ÌZ×$ÄÁ÷žÃþ›Œ8Ú A‡‚H"Ü|óSØû«ÿŒý7?™tMØ ²+M*E<„ˆ‡9>¼z< Œo õ’è:úW/!ß°n}…8Ê‹8Dí£å’ñßþ,âñ>úY›êœ}ðØÏœ+j½SP7gƒ–¢ü„0ˆ$Bÿê É"´“RiKÿÊEÄáDV!T÷ÃÕËà‰¯ÛøÖóˆÇ{…UÆ!Éž!cP3g©~¤‚Ô;„æÊv&ÂŒѨQ¼Wû1Hö0IG˜pÃø¾¼ÿ,¾¼ÿIøñ HÈÜðøñAF¢/cï/5ÔuG]Ô§jÜÊŽÃãôQÈöç{ÿ _¹ùiLøS®åVJ`* âãõ[1L®ã5KNmàoàËûÏâå½ÿ„¯Üü?0JðFÿ³…‘UÀ~Œ?úÜ <û…}øcŽp"5É¡À(HqýVŒ /bÿ0Ás_¸‰?|~øüžû‚±À~Œ‹/ÞÂþaŠ‹/âê;S|òóxö û¸ÑOpùå‚ b®¤ÒjY…䣙*B‰Lµ)„ãb”`¯ã¿|ñöúqiÔR’“ýhÂAiuBÿ ŽCžjÒn^àUºßì—z€qŒ ý>QLç|!0Êœ€P0BàR¿?I …6¶œs 5Ó:BŸ¦)ƒnß¾Á`õã’ò¦ÈŸ1ºMßóÛ¤o"-Ur`òáèèqçßÍù¹òY0«êƒ&€#9D ¯£å<ÆV AdŠbz%Ê£—ù9XÑÁ ‘ZÇdE¬H#ˆtœŸ›¶Yã\Èl¤nÊGx­)#¶eRºjTÛdè€@ ÏŠ^1iíQÀXèÀÀ ¹?9À—÷ŸÅ+ÏáÖìm¼rð^9ø4b1ÌD„ ðZÿñ5 “øòþs¹^š‰±Ö}"À+ŸÂ—÷ŸÅ ¾†™2ù.a˜è Äý0åFÉ^í_ÄþøûxíÖg0Š÷òQN-ßeìO¾‡×û—‹È-(œ¡8¦<À0Þ+µ9:ˆòÊÁ§³‘†²^ÖmÒ(Ý&0bFƒÎÔ9&p£ëŒ2çNZNÓ¥¬RJL§Óü™®{fÓ4ÍŸóÜWuÅ`0(é…j9U‚oŽ©LaÚÝ”gžÓÑh4GêMyöslÒ!s²5é8ã@,stò „?Dr}ƒ/þD!¹qC—7€®­ëƇ äx’“(¥É>‚íìàÜÇ>ÿ+_-ÊßÛÃॗÀ‡¯…äàƒ_„ÀÎÃÿú·µ£1‚Úé@ŽÇzŠËè_¸€wÿ‡ÿ†àƒž.ãû€~F8úÒ‹xòM¨'Ó)&”"pxù2zÏ<1@ †ù¨‚ô½øžøý߃×ë•I¾Ràþ0sxdNäÙÆ⃛8¼pÂ÷uÛ?úQ${×ÐþyˆÉŠ ´2Špûó‚ÞG~ þW¿Š'?®eAª„¸ùì³!`Ý.žüýOR"¹þc^8'~÷wu¿W§ød· Þö¶&W/"Ž®éëûHã!ÒxûðZÛÚXD×Ñ¿ò‚¡ ÀÓ!Zì]úz%FêO"(‘àð‡ŸÇïûm-G\8×JA;^é<að΋è¾ç#º/3¹©·ŽQrß¼ˆ§{Ï@*mp ^ï_Æ ¾ŽÁìLjåoô/kÅP Û­'‹oô?‡Aü^~þ±b_ë·ÎãÃïú:^kl4›v3Áë ˆE¨ ’åQ˜fgÝÛË âe âãUáã™'?ݵ¿“;1Ä·.²ÙÎ…ðzÿ2~áñßÄ_Ýþ"&|Ša| _ï_À3ïú´i€Â„òü>ÂTø•à\ë \~¹ÿ³'ñÂË}ÜRL§ç_ìc­M!%0Š8†~Z¨„¬ŒaÄ1 S\»9Ãùâ“ií÷ó(©@8)æô÷¶<Ü8Lð§¯áŸÿ£Ç ”Â0â¸øç}´[û‡)¾ö×>~ï7ž@8‘ÇíV+w‚H·C=ò0@ߨÝöò'à 'ßHb|éh€PìÇ ¾øH¯‹¯ùžévÁŒ„˜~&™0‚Pp¥sQ\ýŒÛÔl)%‚ @·Û›`ˆq•ðïììÔî °¹¹‰Éd‚^¯—]OZ"õƒ¾LUÂ?Ðét0™L°½½×oêµ£†vÝv=¶ì¦.ÓÖêTƒjÏð$Ÿ‚z©Ž³Ö&’ñ?zO<ý»ðÖvr²‘&n¿ý9ìþ½’FàÉý+σÐâhÁþWqî§> ÖîjÛÒÚD2¾‰þ• ž|ÿÇÁÖº±Á;/ãÜOý3¾ýà‰§ñX‘Îýôoj}'%xÏ´-a­-­O•Õ:U< 2ÛÍB4‹zïáÕþEüÂc¿‰«þ×ð‹Oü:­LÓyø9üÏOü6:­,€au,3Æ„ð׃—ñþÞG0å#PÂ*ºËLJŸü86XSáã;G/áûvÖžÊ"ÔúúLy€×n]ÀTh9_½ySácƒõ0áCLø3øs|p÷׋>Âë·.b&HÅHÅ‹1¤â˜ˆ£Œ3¼Ö¿„Ÿìc˜ŠQN”g"ÀTøx£ÿ9 ãkÙ(«Mï1ÌDˆŽ×ÍåSŠc’;ÖÙ6&™³“È19Æ×o=(½™ˆðºñ+ïùw˜‰c~šÙa­§²è»&ûxíÖE$r‚Qz€·ý¯ãéÞ3øoþ«øà¹ßÀw‡ÿéñF<´Ygn è”GÅ5òz¹K0Cýœ%×ñ¶ÿ*~ñ‰ß!D( ݦµt“é8wªÍ³rîܹ¹QPû|·ÛEEèv»hµZ¥H½9?KϾý¬šgÔÔa—½½½]:6êv$IR’ÉŽöWIê¨u ÿ™ÏTÊ¿PÈè±R†ó ÐåížÓÎÃW¿Žsÿô72ç#„ôô_x¡óÒEÈÙ7Ÿ{J)J!ütkSê<¢¯§ÖÏÓd:s&d<ÃÍO=—4(!@(…ô`k b:Õž¢’àQáû8¼t ¤ÝFºÿ«_Cïý¯üÙŸ!¾~=‹äºm“¬¯Í4)!üÉõ£ÿüY[ƒ²œ)ÝH©§ñàƒ?þ#€ ïoä#Ù4ªŒÁ$ûû¹#åíìâÝÿþßëfXVeCÂ>¯^‚äcôß~O¾ÿãÚXÄÃÌŒgÓ„Æ7ì ݧ>’9ç!ø8,ëùó#ô¯\ĹŸþXé¡ÒNƨ˜ž•ÑbO Žö1øÑ—4&o>§›Ëô¯^‚à‘U¾„H}€xEº$€·~® çñ‡W/‚°¶&É[W.â]?ûXÛzJËÁ§P’k(|'ë†þÛ—ñäû?ŽÃ«—¡”À“?ó ‡0ð$ÀÍ7?…tvB[Úà¾ó"x<Ì¢n*›þãçryê2Y÷Š>|Ï3Öð¸Ê_<¾ààUìþÝ_ÏF]ÿ¯Øùɬ§XE{º¿²¡cSŸR7¿ÿi¤³da¼ÂÚHÆû^ÅæÿðOðúàsÌ®e$?ÄýÏâŸümm°b"†9ÉÖs])‘˜ˆS1‚„À0¾–ºŒðåýOb³õ~å=ÿ:ÞÆ–¡ž‰=xØýõlö¬v¶gi„W> øÕ§þ6¼^½2u„}ÃÄ7K²U§ ãkxõæyÌ„vªì4Ãø^½uzìcÖûSàõþ%xdm>’˜M§‘R“øaâ(äðJd,à1Q×±"õúX4¸øRã‰0*8'å•™ˆ&AÄqñå>¦S‰‹/õñ[¿úþôËG¸Ñ±w+ÖÓu"!Fó/Þ‚çìÝJðů!sPB •&÷á³-²p IDATDâ—nàc¿ü‚ dz²F ¤Æ‹/öñoþù»ÐÙ) ¡Ï9.Üê#̦þ\ì÷1–ïÌfùgTCü«ÃÒA6=(ÛVƒ«Ñ·ÑhT"âBˆü»1¼vÞº‘€jZCžÓ4Í#oab{{;7¸NBˆÌ‰VµÑzCôµ%jGL{Lš(ŠròPç4 m¯2yµ. 1øï_@÷© Øÿ*ºOý2ï|O¼ÿ÷´žLÂ\GòL§ðx„4 ‡Y B ¹í_¹ÉLjÃkaðÖvðÄû~ý·/#Ž~ €âàÍgB¡!,/3×=JAÖF<Öú<ïå¶äðíÀgC°µ.žü™O€y›8øÞ§%ñäÏ|œ HÅ1“$dö¬ž% S`ÃÛÆTøó!&|€`*4ù6ÎÁŒ‡xåàÓ§GˆåƒÙ16¼’îÅ×ñÊÁ³¹Ã0å!^A4˜ ?;Wèù÷™ˆðÊÁ§ ”£­|Ô ”žÐL·üåáç1á>X®©´þ¼ §)fr(¨\N]§ `˜r¿Ô˜ „0Ì„×û—ðá'?ݵ§2çÇÏd 0æG˜ˆRr,f"@ÇÛÉûu–973â/?a²†×o]D,Ǹ=ûñ´ã‘Ž0Höð¶ÿu|èÜG±»öTÞ?Ú‰0Ó{´r3£°Æ¹yíÖEx¤ „1å#LE€WžÃîæ{ðÁôy°Í~vÃlV‰yžìçÞnCôƒ (=·Ã¡§iŠÉd‚ÍÍMAPrÞM}¦.óœVGÌw¥c%‡¾ijŽ­ÇêF“aÿ®N94£ÆYðØšvüÿà_þ‹ÿ8øúkëÞSOaüÍoBŒFV´RAÅqe Šc&Í,Ö¡ªÌ*©8.>¥U†U!2M0½r|8Àä?@zt[¿é–—;ƒLßz be„ÍåÛõ›:xŠé•·ô”˜iVÞ÷…ØxßÓ˜|÷»€§ŸFôÍo@N§ERAÎfPq ™&ˆôÚO=¥ó(…÷ÿ ¢oá7þ“7¿‡ö{ÞƒÉw¿«ûPé¼r:…œN‹2ÞyÞãcðg_BëÜ9DßþÆýˆ(„šÍtŸ¼õÒ›û˜|?ëU„uÛËSµt?¾…ÓX§ƒ­|ýË—‘öçßPвÍf€R ëëØxúý…,cQ•i‚éÞBzûb2¡Ûþ% E¼ )&ùT%g€ÒJg£÷^DýoAŠq><+e‚éà ’ñ LoA¤”˜b~u=]e:¼‘Ùyrû{ˆúßO}H™b:x+ÐCRL ÅTßrVS>™KG[›ØzâÝþdAÉR$˜Ž´ "!¯a뉟‡ ¯^‚·¶ƒèÖ·t=`·= Ž®có±@IHŽÑWÀã#(™h¹§}(1ɇƥ,êd!c~>-úpx<ä}©‚.W¤c¬ï¼3ÿ‡èìþ,¢ÛßEçÜÏ"¼ù—ˆ¿tÖekXëþ4úo_BØÿ&Ú÷ ºõMˆø(¿žRèò$Ÿ`ýÉŸÇÛÑëˆe„TͲùíïê<½ñ›Hå4WäÕˆ—)nN®ê—hBRSëûP§ó÷LøïDßFoíÝøÆí/`’áïm}7&oáÝïE‡õÈÞòÿ?$r‚ŸÜü :¬ .cü0x ‰œè!cáãhvïî¼?Žþ*;¾x3-Wý°ôL8¨´PHÕmº÷v?Œ6[Ç,‘xõ¯Ìb™?r)—¸ò£)ÆQzÍñ(;^=¦'ªv uŠ_úù.Ö×(úCŽo|/Ä,–H=K7œ|ÿo'8¥P ˜Å³X–FâD!M%~ð£"!@šJüÍ'øÆ÷CܦÆ?øÑQ$0‹f±DœHýBïXàÇû1Þÿ¾ üUa"õñ™2s…õ÷ºÏåïzi× Á/´ÛØÙØÀt6+VC¼•R ¿+¥^skN«”¥ív“Éqcmm ãñ³LJ)6660›Íò¼qc:æQxsÌ&ÕߦœñxŒÉd‚ÙlÎy)m5_];L`½M1Úû0>ü6’ñ>&ƒ Þ@°Ñ{/Âþ7AÐ}ÏG dŠ›o~ £½/#ê<>Ätp‚W_ö-ô«S>!¶žø›o@ò1@é° ”˜Yú-Ò:pt%Ÿóoë›tv(QèÓ[ßD߆H|ÄáutvžFpðÒé&·¿ÿð[¸îÝÆÞÔ<› ©š‚ËGñ5l·Ç7ÿ/Œ’ëØ›|? ^Ã߆ßÀLø‰Í`ƒm!Hñ¶ÿÕŒðz Nw%r‚DNÊ©¥® Jûsóèç¿«<ïÝÄOmýÃݤ°F7ñw·>„ÿ¾ŽDŽç ¶þlÒ±e½5/ßTø8Нã'·~ðÃàuLø·&oc&¢\–ÝÀ»:Oãè[HäB&¸÷ëŸ`&‚ÒùB>sRÜœ^EÄpsrÃøŽâkø‰Í€«©œ!LñZÿ"f"ÄOtþ¡HeŒ¯ßzAz+׳kt?±ùðFÿ³ùñDNÐòÖðKOÿ ˆØÛÛ+='ÆÁ®{fÌ3nÎWI¸ý,qÎ1›Íò4„¬¯¯ç: š¿I×èYç›››PJa</L»Hw™z•Rh·Û¹þ©+Ã8CNmÆžYæðâEˆé¤˜_÷’jÓ±¦ßuëÆÙßE6gžúo_̦¾Ø¡I‘޲ÈÑ‹W’Vš"?OŽ*/®Šùt+¯a®¯ª9L²÷F¹¡ãYTžy›:*eF-¬9´å¶#›ú´—vä#%¹+}”ŒÐ¸ÒPM WúCGåŠÑ‹\¯z¤Ò| ”žo{>3¾ÈÚ•FaŒÂë·.b*|t¼]ÌäS>Äk·.â™wÿ´éFIe¬ßÏ"`²2‡t„É1–ž[Ü5׎ê‹mRÁXÖ®ÁD¢véÍêñê±e Ýè'¸ðâ-„c>7.)'_Y¨*C6mÉÎgÒÔÌ ÔÓ“"Qš6N^õ<îZ1Xñµð³CÝ‹|ËÞ-Xeå¡ã¬â³¨®¦üÌ<ÏÖôG£;r}•„ðÖv³h«O†z„2›o/ä‹—&Ù=¡ò÷ŠŠäÍúmN×Ùz‘”õ)ɦšóŽUþÎÕ¸(Å0³žM’½Óeæ)(Œ­éz¬ò{‘^¬»ë…fcFD§2lÔM‹W¹¡Kuì2ùôË´#L¹5¶Y[ŽÝ´õüü()³ö§]æD sÇcìáoŽ^ÆTŒ²©”>€W>…Ž·‹Ÿ{ìŸf#"+”F‘Íq3Z²Ê‹¹']ÇvÐï䙬êJï|µ}{ôs™ BÊ\™²?øWÿò?¾öõõd0¸7«ø®báN{-}3B`F,ìïKÂPyä}nÄÃ:·Rj>Šœ>YÐùHÀ8ZÍjVÛÒÐw´ÓAçü téäV3E³s}ÓO޹‚ÄÉA½,òøH>©¥*J$ˆÃkØØ}¢þ_eòm'õ£Ë—Ê#+öË¢µý­HÚðª5BPŽXëÈJQ¼ºê˜·‰w};ùNU/¢ÞÓ•WÐXö`”#jºl;ª5¡ŽVYÑüXŽ‹{“7ñNômLy¸rDìDª¤áÅï]ÇOn}É´ƒÿóOoâp˜®¬ÆV‰¯Ôa}â§ŸZÇçÿâ{·â;R‹¶\YEþ4•¸²7AônÕ:SQü/Š–ì‘€jqQ4þXºˆR¬­­åѼ;Öm”b}"ºõ†5RKæôeØ|üƒ ¬…ààõlTöxúº´[w½ÍÑùÓUHõõ,ÑvÑÁÊ~–mwX|_4|’_õõô`"péåÃlS¬åDýNˆÿΛ+×÷¼úó÷ÂA`„ ÇØB EÎy÷<œó<0BÐÍòG çy „@Ýcƒù`â8zÜEüOƒÈž^%quV0帓Ggó~Ï)hÂèù«ûM(Ñ;Æ4¤Y””Ì¥![™xVó6‘ܦòµiQÖíx,o÷Iƒjÿ§Í„Qvk!±'-^oÄk-—“éQâµÐÚ9ogwa;aù?@ç¬ù]¤YPmë耒Gÿîfºè4‚MßW#¯z:æi’NFZ%"»JÙ„Ð<ŸÑvþãè&;aôTUšºi-ÔOÕs‹F;—ý^”æ8“ãèýUå}Ðp/Þ"Â%ÁGÙΈŒmmC„TÊËilkr:ÝØÐi²]Ùv"ðJóüPJ—·¹1Žôg ×îõvv悃†ù˯„Ñb‰Îl{ʼü¬>0–O›±ÓÃ’Ã~™Öx…ºMŒêú¼M&OéE\S¥ð2Ù‹s´Ôîj}µõ›>GͽÒ9‚mn‚0O·d„%+a4#þ””ZîœÇÊRû¡”–ÙÈ@éüí¡,UKZÙÚÐT߉ÖÚ„H(%rB,ù¬¥wÖãñÊg¢eñÖÎåkË뇼‡4̃’àÙΦ\êmfkEgi³:tš.D:†×î™òðÚ=ˆ4,aå|„µ¶!ÒP·%—ÚTÓÎ…w bªûE$£¼ŸŒŒ¥>)µ¥ÜÞ¢Ëm4}d÷¿Ioên:W¹á@²zõ.ÍöRm ”½M½ðõN•¤…u¶…XN°F;ˆåël+'Ôc>Ã:ÛÂLDè°f"‚PéÊ%Sç"ƒmê0åB±ééçz&¢\6e« ¯‹) T FZØðº¹ÁµÏ™²ì¶My€uo1¡ Dûò纪~µ”ißÚd˜Ì$6×(‰@o«H/$àG½-ýüùÇv‡a<•ØÞd9ùïmy2›gdÕ@Ú¥T…£Á,Ç"[ëŸR’Ë-$JeÛŽÃ(R•~ ¡à‚]ÏkéòœÃÚ5 zX¦/ ÎyhFìó:²¨?É¢ýf5 `Ûóù?Cbߤ  mk=@¤a¡‹² H©/•iʲˆ=kïd;œ‹\'åÇ›ôSõÞ& ÞDذž}VšÊB]¨;J ¢°áuAÀ²gd^¯TËÌua:å±õŒùJI]6QèÔè&£3U&Ñ_"ÛWæzˆŠ B1æúáŽ×›Ó½JÉ’î²WuçTøP@I_Ûº¯Ô†Š^¶%¦ÿ«ŸËô¼-SµN(’—aä«á¾¤þhB[ʬ(t™0’Vls`¥ ½]ˆ0Ûîi˜âµàuÛšô{-° ÈéTçiµÁ¶¶Jõ¹¬<(Bó€l»cS‚WÕL&P 1ƒÚå{-xv™vYzSG¾ZDF˜‰×‚×Ûiù˜§8æy(Í H ¯»SlxDi.;±ˆy©¾ç)²Sªû û4Vœ0•¯¶Ýôuní¥,õ9ÝØÈ.“†P oç\žžûC]«­ÛŒ ìH]Ö¥ˆÕNom„z9ÙÐQ!/Wð „z91UJæ¤Òl½ dÅ«'V´Ý:§Œñ²rw²mÀ‹´°Ó/#æV%“GY—šÿ.–ç7m"–!ËI´1ˆvÝãf/3 A,¢KFãœÌµ¥Ò^’b”Ûh÷‘vв—“ ) m1!%#mä3׆ B=(B0(:^‰œæÑ(I€ ¯ FZ`´šæÆYŠš‘6ˆÞæž‘:^îCB”•¾1¤XÍÇD”T%êc_#ËÑ/²Im¼3#YŠäUœ† ¯›`;’fÎMy —²"â¯Ld®ìü‚nÐÛòŽE‰¼·=ªwue¤’¾8¦Õ3Ñ‘ú®;ÐÎhÑã PªÓg@¡p6¢±È÷¶4±öZõâ\!‡Êê'yŸ—G*#ªJf™~m‚mÆòh~‡1L¤D‡RL¤œ#þ¶`®D± 5!ıÿ;ˆ°ÏwžÑc¬µ] , ¢§Yk;×÷F‡Úó6sòn—gnÞ7¨”eœ£“ó  )FëôiIWåóògÐ~Ž×h''®vPÀèeéXvÈ0šVt—Ñ+Õ`Óº:`ëó])©Ë%E^P)ë&ªÌÒ…ÒN°&÷³LçéÁJ:ÖÖ½FOçòZ:nH¼ x˜öV }Žåõ ÈbD"³¹¯€‚’ÖX§2×CB”ôvÕù°V=oס,GÀñM’Eñ•5¨Ý%å©:VÝÕsÔÊ_Ò¯”k~ ø‚çrÑl®¿!òæ{‹j7©•MóYÕÕål#E‡“M›`kç¬ÀòÑÔ’¾Êœ„êh¬ÖtN‡]Eèn1:›øðÚ½ÂQ¨è9»¬\ך}/ëó9}Z©ÃÈ¡@ ÅÓdYÄÐ )Þ$­üÞ5º¡n´‘Öq·õ€­Oì2—Mq´õ–Z0…ÅDü7¼yV§§šæÚ›úªò™ãf ’ªcat»(!¶Ã@¼RŸUB›™cb×kêÈÉ<$ˆ5ú¢£¯§é[Ö/¦®Moo'“ͽ¬~¼È¿—Í góóìHÍöÃuä³ö·!‘–’oJ[·ÉiÚúxAù+×Q!ÒsNNìž×ìÈÔóÚ6y^N°I«]›~цkM}Rês)5™gÞJåÔ9yséÌ(Me—µŠ«J`›”€cÏã;n™ ûq…¨ìë¡JCà^9âo“i«ívt¬:ʱJWk/™?ŸN{DÆDþìü¶¬s×,} DbÆ}xì\‰Ü/"ËÇ»NÚ`W”1&2E21æ#ÀŠ:ÙQùj&2¿jÀø$/ÖéMidÞ/‹æÛcÅãUg ¾^‹ðo{%⎌˜¯ZÏ2Ê÷9©ù­À©àÛßi͹UÇûïÔ µóÜ›‘Y¥§õº QOZú.Ó?ÏÌRrLõiµŽ"O>6Xz&ët”­ ˜À¨FÌéáª>9îwb92Myí¹þ'µ…Ëä³GôŠõ’:‡ Ú¯uÎH]@ÈÙ`Öƒ}Î8%v`©(CÎõ‹ž>åÌ8ù_D´j}HqÜö/ʳrZ‘õ³jW™?®S1k̦LjØ?º¡–*l¯ÝÓÃØ+ÄbD¤×8ÊqæÆ¨ŒbÐc9•Äg~­çŒªe0 ãR {/‹Ê/Šˆ~t•¡ãuàQŠÎ6»++é˜èü"¢~·@ A7›väðÙ@{ÔÐÖo',«)ðs§òÝI'í»}ß¸ÒØ]Ó[ÍÁ“ã8'Y¼aQÛšG2êó¹ÀNLþ^Çæ”KÎ"/§\F¨ïĸÞ[ãNšëÓ4ì}/Qbœ•§³œ¦p¿À¼ƒà¢ô÷Õ“³ºÞZ°ªÊ©êÑ»¡«ï3™OR÷Ý’Ëž·?Ù܇u…Ÿû®œyÂ@;Ò_>(ðÚÛ«/SÙvk´?ŠºÔ­ÍïÈ¿ƒƒ#“Î8:œ€ø2=÷Þ-Iãpy¤Ç™ít›³Žü;888%ép…JÝr”Žü;88<àJBo|ãúb%¸ù/Žü;¬~EÜ%9 ¸¥Àî¤ïh±Þò#ØvGþy>“z£ ½žÞiù4e±vú]µ<ÂØ]wDΊ ÂÀÖzyùgQÏ–y¿;'åU´ ‚OÅÛYÍP‹§Óï¹E{²¸ÎEkûß)dM_,{‚–ýÏí€l“2g« çÿ,—;½ß.`ò “ÿ*ùË~×[ô{îsYÚEÄs…òI«¶ÓËÓ5Ö±ˆWä¬#ØÕzj‰x]}‹ŽQmæ4ñ'+^Z/KIVìÜ.ع]VK—¿ ½„QþñÇÁÎíÖÈlv¦ÙæQ^i;ø*¡KSx:V¦·˜_Û¡­¥ùËW¡TN]ù0çÓ›nUý–ËhhSiײ÷V&ðÕtZ¦¢íÕ¶Ôµw¾çÏ/ú½PÖm¯ÛÅ— JX㿽Üiõ÷i­×]•¥n}èyÙ(i£ÃvÁH»"'…§ÓÁ›[V´Ú6Jô2ŸÙ” ”€R‚–GÐÛfð¼‚p3ëß&âuǪçí2[^YOäu1ýY·Q¥úÜZ›¢·Í²2ËŽ-Ã2§ÃþMx%ïe;ô2BPÝœ<æyx<û?çyX§=ë³Eˆþ¤nÞÙ]¼Ìé˜Å:¿Q×èü¹t«ê§ºÁÖ)u;¯èFWÔåÕê¹&=Ø´¾~UW×ɼ¨J}Úh3Ž£ãIÃæ˜ä–¦}”áiòÁÆô‹j”öº ̃2Œ@··€l»nÈâX5Mé÷fr<)>··tö¦´¡Þ´§T·@ Âjdª)Ÿ0J)ÀóÀšêùjÔY[@úA^.§-×öVñ}gG¯ìy`Yš\Îí­B®¼¾¬_MÕcYz5™$Üì…×CéÝgM›í>ñ}€PÐÞ.HK_;vî”Ê®aS{Çæ§ŠŒÓ€1MpEkí\qO(‘D ­Då»Dzk;åmÙãí$ÉÚ[鬽e ²¶£ÓõùíãÕc@þ›µ·KåBà­ï– 12BÇ>¼µ‘„ ­d:)µI)Q6LÕ6’läÜyS:Ù8s@X{" KýD¨²¶‘`ín©-símêÚó"  @@ÀÖºº^èÍ¿r,yíri«™D DD‚¬‹XN°F;˜ }mx»™bWµ¦TA`&B¬³ílëvó[·sʇPhz©ÀÈ¿Áz˜‰Bñâ~‚ÊwÞôÎeuHLùRoŽwN¿·P‘‘dÆw“ìZrmë]#¡÷GÐ;NêòÊíEÖ¶k¬ƒ<#µ´¶ IDATÀnÏ£eB޶6E¾›¦@dGåP>oòÇ`èsH©ày½®j9º<ý¹µÉEá$tµ®ô<‚ÎFq®»­åB!‹µûír„¬üúízX  …@—1P-B°Á¦RbƒRL¥Äc`•‘  çy Ú”B)JÚY~ªÜ '·#Äkx¾”¥+|(£§2}6¯§³;°Nç:?m•õñœ¾ÚÖ÷¹¥ëŒÎ]¬Ÿ jv,(aèxÛ˜`é²g"ÌtT  ël3BçeÚºC¯Òëam!–“LPPk'Z[¯Øeê:(6¼]PÐ\§¨’¾!P–Yg]ÌD€ o§¢›´ÎóhV¿Þý\ÕêSB(6È.f"Èuò´¶¼…|v;lÝ J9(ɼ‘m¦8ß~I7RÒÂëä¶¢°8`õ»¾Ž¤ÒŸJI0âåušk:#¬-0áÍU\làxZáÿý¯Ÿ]ÿ“ÿ»½ˆ3¶Æqå|ô·z¬éwõsYÚjt\J(¥šeª+IÊ2¥r«õ×ɵ MIΚúìsuÇòÏ,z8—fÑõ¨‘Eú¾vˆZíú+¿¨½5רf½_þE †Â*‘f%³M|¦xª^ùܹ,Ïœ9R²6 Pw¼z¬ô»¡üj:¥ølo}G·Éä³Ûdko}·ä°Ì·s²ìˆ4÷“Qˆ‹ÛÛ܇öy@AÄAQÿZ77zeªD–ú &W¶|´Ú;`¤ Úxšú{Q;Uã¼’ì Ö›3D¶!(6½ÝR¹f›øU×±®Ê¹Ò} Ý£(Á•× *ÙĹù]~¥Tµõºãö±Eù†¾6¤;Û^>º ¥¡Jª’³ ¥š‹Ö›²›Î•©KQNµ\!ˆ ôþ¶AÈŒ¸Åw™|‰Õ§òÈL·nø°”Ø€{§zUÒ¯ÄòðEx­¶EÞçÓŸ êõ[“-é| õnâY`h‘¾*=k•²êõ±êØÎ‚- %¸¾C‘Pš;å…Ž2ÁS¦ªìy‡Ÿæù›tW]™¤Ææ-Ò# J“ÿݤ”ÄDøXgÛyT™žjÒ]Mòiý(³à‹Â¦÷8hÖže¶·®ªçí~,_Ìõ;*eÙ"Ó~ÍE¦™sbŽK%Ðí<†û+ÿ;&A‚7ÞxI’¸Ç¿Œ1¼û]ïÂÖºç{ „ê)$µ®Ó*ÓW–M}i˜>³Ê4Ò4UgQÞu4:‡«Èµj¹‹êk8Vú$du9êd;;‹çì¯z,yE4ÁáåÏÂûÕs [¬¢——ïd;wî˜;ø-Ûb|î÷ʲ|¶”ÏnS¡I˜øUÚç­õô m•äY¥«Ö±è¼žŽDAhkéum¹ùnÎt~÷¦ìÌ ß.ÌmoBC±é=V*ƒÕˇÅq¼ lN²ã¦õØ`=´=†õuVKÖWJS=¶(ßnÏkLOLÑ©»y)% è­{Z}˜AK;¢_3—UPBÙ¿€°•vïmÔoMùª:ŸP=}q‘k:×0­£®Îù:ÌSH*Ïä¼n™×5zZÍœ~]¨»—¹šŽ!@-ñ7ié­•lÃùŒ~Üðv1á±í,YA¿×Ù ² ßËz»rAAæww·l“Ã1ôªë‚‡õÊžÁ¥•< º°!4'É ÓQo¥t$úµí¸D½&Vu_\£’á©3F÷t;x1ô¶<´¹‹99“wOÐ|PêVƒ}PuÛ‰õÛ=xÖN»Ž{9oü$Á†Ó†ž§ßÓï-Ý'm_5@æàÈ¿Ã]º]ôÑÃwÛœFdø!¦Å ­ $ýÞ¾ë'‡O·9båîGþjî Öí¹½µËN(6X/ŸOëàààààààÈ¿Ã#@ÝfYä¥w‘!GþA¸¥öùwx4pì݇ùwx‰?eÙnÂÔ-´íààààààààÈ¿ÃÃÍþa–3q}áààààààààÈ¿ƒƒƒƒƒƒƒƒƒƒƒ#ÿŽü;88888888888òïàààààààààààÈ¿ƒƒƒƒƒƒƒƒƒƒƒ#ÿg@J¸u>ùwxع¿#JH·Ú§ƒƒƒƒƒƒƒƒ#ÿ¿ ]'888888888òïðð3dÓ~ùwx¸!%Dà;àQôû”»æŽü;¼>«¦9;â±»Oœ$)Õ±Ó7åBJ·ðƒúìÜÏÐé´é^´á,ê|íÌÃx¯=¼ä_)() ¤„JˆÑ*M „žâ¡„(ˆ¤ýY=¶Œ€Ö¥_Vn5mS]uçjÒª”C ƒTšdÖJ5×Y#S©?šÚµJ,“·®o–‘{)õu3×QÈåý¼¬ícŒf‘ ¥DÖ©2ëf}LeçEö/Kyëò7•U=^.ÿdÊDIûyþÚr2ùaÚ½@¡Ùm¬mwc>Yª¯î³©¼òñEççëX(£]ä)ïU,©d.‡¾®B¥˜??nÒÿ&ÍB¥5í>á}±²Ã¡  À…€q¤¢žDK© *ÿÕtMùšÎËåø¡@ÊÕ’²õ'ç CŸcès¤¼Ù ¨:&*üˆësÖ2À²ò™WJ¯°¢£äV>9³uÛÜ3a}*%æôà"ÝÕ¬sT£]¦ÃVÑ«J¦ñJ¦™Ü™N€þœB¥Ùñ¦¶Wu‰ª±e r‰¾š×OÕ¼u¶M5ØM“G(^”‰æ>ZÕ ZÅžÚòÎëØù~ªBË<‚P¼\^Miõuªë3yŒûÃáøð %ÄÑb8̵¹HSBŠe Û[ã èf2Œ´ç`Žmo0 PJ¾$‡ #Ðí-]lé¼Yú¹cÕrÍ÷^W§õƒâ7õ´\ ºëa”0uwAZ^Nü¥?„Jõ)CÆ@{]¨(étJuæå˜²3™”y¾ÚvUe«ëƒºz´×!J)Hß/÷ÕÏEûL}(úA (…ìú)Ýî0¨ïçºvîž3—±,?e€ÈF¡É2mmB¦ÐV" õ µ¶l@I ˆ$koƒÇ~Aœ koA¦°ö¶&ñ¨È@$X» B=]§’å4„Η•Ÿ#„jcCèœò „–ŒG:m¦lD‚­u Ê‘§a:y6lzb—EX{[÷KÞnjõšÏWjÚêäý[ôs4_žé?%-š¤êÏ[ÇLµeZý«Ö:Pà˜ð:Þ.ñ ÇL„Ø`]¨…1_™±Î¶AÀæúNAbʇ¹ò'ð°áõ0å>¤â „@*Ž™ˆ Àçè ÊÇX¥ ð°éíBfeÀ†· ŠÕbÓËäµÓDXgÛ˜‰!f¼ƒ„ L#ƀÝ~BAÈao‘¡´?§ˆÆ[›¬”ÏÊçí2írL¾”+øG¯ëÍåµËîlP„cž9 CŸ—ÊË´Y^ Ï™2;a$ Z€TQ P€ J1•[Œ¡8¾Å"!°Í¼ÌÞ§ Öñpöú„€ƒªèÖÞžÓ/&À¡l]6§»*z³¤s¼µžÖ¡í-€0­o%_¬or¿­ul~ÌëRÚ˜i=À0î(éamAªc>ÉÒPlx»ëƒuÖÃL„–.Q ð²gÙÏÒtË ÖÙ6ÑvHeOƒ­¯ô£Ÿ‚RÞ5ÚÉŽQt¼Ý<_!ƒŸë'˜‰0Ï£ !G,´ ú|€uÖµtp0§£Œ>žfçL¹¬ B(„â%ÝX®»^ÇškLà¡ãí‚€@ÛR£k…☪a©ýº·2‘÷Pc•‚dú~mY}A‚ƒZ×®®­¹îwÚáäzó&¡É»‰ —Ü4 1òsÇÀ„{ìc†Û4Oo9 UÊ5$Ý1‰ÁÐrLeEîÍ9sLÊ!h¯—9~Nüóò²rTÊ!+uÚåTeRR–ä²ÛP'[]{«õBžBdœÏõ¹)ß.×Ôg˪5;¤€ô¨4­ïçj;)xFõ×0I¡O|HCJ()Ó\™óÙ l @,ƒ"r§À8j–*ϯ«xÖîæZÍÕ1_>Ÿ *ÎÅVFØm£×-‘ò¢ÜaAì$/)e}êtõŠÑn£ˆGÅoÓîRÿÌç³Ûoúµú9_Êõ,:_9Ö\fade’æQ®)æFË§ÅÆbžœ“štª-$„gÑ<® ¬&b´Úèá*ÅLyjÌjë=©¼&6ú"‹^ @)©IìÐç¥'¡)ònÒ™4)WsùLß>o—i—c瓙Dzee€RÍ•WmC¹Ì, òHI‘^)$R¿*ž(e=µ€P ‰RrŽ]O;CÎ!kŸ`€dÌYíã³KgYº&ÓÁeý¢r=¸Xw©ZCŒî–\—“A(™.Õa†Ð7êÕªS£›¥„JJ:Ÿ˜•@Q7}3)Ÿð‘&ªŠÏ9 U}¥PÖO&¯ $(aP˜òB'ÙuÙò™<°Ê«$?¯ÉµÖÁ&%r^8AG¹C` ã\غ±®îÆÐá*µÊÒDÝ´E(>×þ±Jrí¾ÓUÖ÷•< *×®N+%á¥,ËãÆEþWÂ’i; ȧ Õ¦Y¡Œ…yì©- d´Ïéi>ÃúrÌm(ô0eµNµhúË’~À¢¼ õ¨Š3µRù‹ú"k›ba?W˳œRýJRdš6ë3‹PVrÉwŒýùãR]—?Þ]¦Z¾qÊÎEÙèÕ•Y-·Væm\5Z:mHÌõQ]?Ÿ¨¼Eu,È£¤€R *‹• ä „|n¨yÅtÓJÙ«Ö£”œ“kÕz+¯0£".M Ó´êüù;úsœã‹¦þ¬ZÞ|™™:ÀMä¿&b_âã ©´É>â¼6MÉñ(¹Ǹ‹¡T ©nÐ/M3±VÑ{ÅÔ¡† È}³ªn]ô¼®r|•tå)8ÕÕ¼‘Ö‹&Hðúô Ó+릢Vå™×Qɼþ³tu•à«S;—é×&g¡ÚþUôoÓ4¡ez\Û&îÖ£83ò¿‚s ýûp øò(!¡î'™WybU%xÒ¶-M|Ã{' }UƒSõ>)? #ôpQ‰)ÁX7æ=.!?MC~ÖyOTq–Ð+H(‚•fWÙD_:Ëýðè‹%Áš³Mw¦OdM0ã,åi~ÿ§2Eæ4Ër¸wºú®íûóÊ?n3.‡Ó¸(·”‹ƒƒƒÃ=r î_òïàààààààààààÈ¿ƒÃýqpppppppäßÁáQ þ’C$¾sXx® V þJ‚'þÒM¾âp7Áª ®Ù÷̓ë/ppp˜Ã\ä_=ä/‰*)ú6> ×ñ,ÈýòD¦e X÷z¥=,îÇës?ŒÈH©î?iÕ¥FíôÇÍcCH·×ýè´ó$<Ö2¹º¾¾m8‹:Äæã.ûìpŸÅ9„?‚J“‡’<*ÎÁ‡Gà£Á±Ú§²uîå9íþ:iyJJ¨4ü¼ŒjY§)ëIà•ÖX¾ËK5ÚÓyN»î»Õ–ÒvíÇØ~q:…u¯‹_|âãØ`]œå’?u[ÞëÄd¶Õ½œÛ’>'ž*ÅDø —¸;KŒB~W—­,6ùšß+`4ùæ`Ëœ)Ç à'r¤R¢ù¼n Ï{nõætÁªzð~Òu%`ËYY£¾¤+P¯Ï«vFfÿ'µ?‹tÏIûëNÊ©8Î’­£jMºÝ8¡õ–íÀ(%1åAQ&šûhUò¼,`¢rYx.“íÉ'©ôL›¾‡XêLØiëúÌÈVêç œ*<%%ÒÑ|tdÊ[e€õ¶Ê` ls r:ÝØ€ˆB}xkr:Ûîê)”–Is€mwõÅŒBÐ ~k "ðKÇx0ÒBuwŠï;瀌¸ƒý[ß @6 €Rðz»ZÁ!Æc°nÄÈ$eAò… Æàmw!ÆãR»¼Þ.ˆçåƒÇWñ7ì(s‹¡]ñ½-07u®"Ü1[cØ.ô­Ò¶]ÚeBHQ¶,foôqEÚrBñŇ>ø^K½Ç¼»"|x{v9…ÏD(h;℈ð=ßåà‡ö(F.‰$¥»j_»<²qIºÍÛ¡=¢„†ç€i§„Ûþ²4‡Ûþ(›m3Å ð…‡]¾¼[°ãw¥¹@ÂÞ¿ƒ“v\Û$FÜÐFM³2Ìuõô¿µm€Ûþ–ÜŽÔp–’d]žÓ´¯‰8(rNU‹@¨å½wùFx=úú§X!ü«Û¬ûØWç:æ+`/Ø ûÌvEë}œø½ °s׌AþÕ¨á=ˆð#Y‡ûÀx]9Jà9(kbY,IBn¨ì‚7Ãcé}…ÏÁ EIB7ºò¾Räø¿½.ü­Mƒ0*?ooÉß•S_¶Ÿ·›òüZM ‚ÄòN;ºÕ}½ºáuuÚ’Ü‹ €ªýòxæ5ÀÀQö·6k Â>@â:eôF†…@Dý1O§§{>ë>2˜eì˜æ±ô÷f_ ?a|ðímé  y¯÷àïìÀ)åríÝ ˆà6x—BÀïFË·kã¬É¯ü^„Æ[6A.?‡DS÷nÌ•çáÝN80ÄÉm'$ÖHŸïµâÀɔ䀖)…Ä-I°Íㆤ>b‰’D«AÒ\1˜w;q'ÇcËÚý"„/²á(éÁ—:ùh0 Õ1_öQàwÛÒÈŠ çÑ`èÇJy¨nŸßƒÐ!ÐŽ‚‰ðJ(ü=¤`J™’¤,ô@§÷^°瘱(¦Rø›ÞWª\)+2C@Sðú-/DÄÁA•œðcˆV ’ƒô´S íLèALÚú:#GQ>ÏB©à ‘¾¹í#?MSõ „ZØA àmˆ|’à·Ô»í-bžaËPò)Ñæ+RòCÇËø7ç›;²‹9F)ü ©îÇÛŨÜ^_ƒv‚@ÀÛ ¤Ù@›{ œ H6}žèp€g¨üD‘z®¢Tÿ–ŠHÃN G)v‚Ó”‚cvÔ;º)zDDÏnhKã69$”Úv X=fØ–ÈNêó³7æqEÐ…Aܶ«q$z¿ý¡­”Ža2Ê'í‰~ÿ#Å9-¨E“ ëÏLæ]ƒ¸›QÆ´}“b†i5‘"@@€@]—î#»Ã7"Âã†Î‚SÔseõ6Ú¾¹&ª/v¹´Ú6j'&ÜFÝû~öU;Iæ±´ý CÍ×Ñ‘]¾në7‘AsØ„q¬xßts¤#Ý‹¢-j›ü#¦Ž€ù0œ>øæFH&c„±¯ðT*½8æç~ÿ~û ?€ïwÒÏe’xå u}ª}:ê‘ÖŽ´k¿ë¬÷´ÃülîÃ×Û‘#ÂhŒÌ‡Ž†ÞGð ÃK~öS®OÝÁý}û9t´3¤¯_Ÿ‡ûàÒ CÆ~„é1ÎÂWƒ éyº„v „è!§"膤990D㘱 aFÂý´s‘P"²¾Û˜ªR¤äûª­ëƱDŒT§J}¾K+Tè¯ÇyB¨>2î]¬ýÏ»_R‚¾ûðîF¨¨íò äœrL™Ò*6Úúï¶ð"ÚL«B¤Ü #|´{ ‘ÓŒŒXpBa»Ìó˜޹m80d!®*êç›Ä‰m’ ûb`*Moj bûÇìèlú=)@š¬Ãp$Lµ^ë[Ñ~ë[~ÏwýÓÛ®'õGèTû;¾_½—~ý‰öa*2XçGéPj»Ðaä“Ö ”±‹L™æÃ÷:HH T”1²7"Õ>ôÚAì›n"‚näã ›hÚö4eØs'¿K¾Óý¶‹½çêß&qM÷ýöíg“’mI¶/¶½ˆÛ¤€ ¹Hž+ q/M¤×¤´c@»Óœ¤(})î°D} 6I:Ð^'Úf^»@o_mó¦xn`Š–Åò øà°p$þ¹²r¿ó9ö›ªc`…âèsˆó ûݰשɸðº}¶ GEô:d½#øPç×,>¬Kˆý¦ÓÁüQ; ¬¡íuzëoøm#Õù I„Œ–8±ç‰tRµ‡ÖTÜ"|¾5¶ÒªÐ'ÚnÜŽ‘ˆþXmR5Ô2›qÕ&¦Æ'Œ÷@õhb?JñXßÁ©ÏñÓÚ•6ö#ñë¤Q}Æ@òºÃn«Hi“²m£\ƒ¿O.¿é ø@¨ø÷8 ‰¿yçÉ@{ oY¿[7ñ÷{Èû¾drAcvoœ Òꆶ¬‡J;v2 ºŸíB*너}íò0mM’û¾`L˜ &rïz?û**m1 îúD©4…>ì‹¶ö‰`ŒùÆŒ|m=‘•$È8ÍM¹wÀIs<´ÊÍo¯ïµÂÐö0íéý"[¸õû/ÃÉT€w£©Â½ƒžI+–ãîw3eÄÎe5éÑ5#Ã6ùBìë0X¼“ÉØÿãsMÁ;ª=ý¢Á„lãAgš8µu@#ÙàÓx¬ˆt©™ì¾“Õ˜×v}q' ÿ0é8CN¦‚úýÁÜÞÍ–&E±ƒµ:±Ê“ÅqEp‡ßE·Ù/þÝìÈXÜ1—éÎ’Í;ðäÇ”»‘ø¿®íÈAX¦ÄæU°°H1/ïä¶óÆ”ÞÝë‰^¡`™2@†-”¶¶í°÷QE#ß9‘í‹ãEþ`ý=ÙdN¥§R‰M…yײ‹‘L‘ßÙÅL(ʆãÂMG1”å’ƒrÉ%‡¾qßPÊ(*• Ø]:ëcl‚×'à¸EÔÏ^€ã‘ªHX¦2‚£p<íõ°CÙ§‘',x®ð;d› r¬ ‚wïì]Œ±;jÇhìU¢¬T’#ÁÝF…+0ÿôÌ?}N¡8ü5îW u#߸Ç"ºÚÁé­=ZÒ<ô>âÎ0ížAoÒç>ªkƹĘm¸sï}8[‚Ø¿ÍÂü->˜¾ƒÉQ ¢B¥Ãâ#³(œ#3ŸýL¥@±À`ÎÞÜ¿(\ùy\ùyÆh?¥@)ÏÀÈá>Mô.ŸîsâÊ¿Õ?0C IDAT[êY—$ÕQÈTP¿ïâkšÄ¡Y‡ðئ½6£ø)¶"íý-š¥ìIÒ®Œb3ÙžqÉòAŽ9îùûõ×ðý0¡0í”ðàÜ"¦Rßówçç ä1†Z­†Z­×uïˆË¬W®!ÙS§1÷‰O {æ°J¹WÏé8‘f»Ã$׌Â)WÀjUÐJYιŸ>ÕLÏ~¬TqÈ1J96+—ö& ÛgæñFégFÁ*edÏ܃úåËpв½±¶©ë鹎QûWŒ©õ݇‚¹êû±¨ñ‘ø G{Ï-ÆiƒCM#þ•Ì œÌ u¢¾Ômp+êuä`Ñø~‡íঠ”8È;5äPâ`šUsÊxpny§‚«!ïÔÔ²ªÙ{pnî¦blÐ8ªAB(Ü_9ÆI­WßaE#â PÌ;øøcs8]Ï‚ùº—D%(*E†J‘ Tþûµ¹wpñÑ9”ó‘ãÀTKíùQË; L 3ÐCÚ'EìG;ŽØßNiG!SL8 b±Æøï°"„…¶ ·¬ìuU¦4 ˜fä œ[DÎ)cšU@‰{ÿM{@Àwj(8'PpN ïÌ€¨ÿ Kb‚jö<4wIYd›—<é9f0²ó0ªÓÙ_w_¡¥ßwIB?È™  ˜¦…ÐŽ'·Úv<ëë\×=0y§”ÂuÝ}#}ãÚó;ýoF£âh JÁ E°rõ‹—0}ö,æ¯\ÁüSWÀò…¨ˆ×$¤JY q?ÒŽ)d6I†“¤ÔL@íGXÍã Y…€S,¡¾x¬ W¼‹¥ÿèmSs§PD}ñ"²§N£~é2²§NÇÏêØ—$Ùî׎ýœ£/Âã•+`¥bz?§œ‡ ˜ê æ?ùIdäum>—Ÿ/ÙSg¢6 êß>­€'SŠHsŸéÍAFˆÀ0Ü£pÔ˜IÇ-Ç·é!«ýí}ˆëÀq1ÊçOU¿Ë{ÁKulÜ qB²^‹[Þ§P6Ù~cpŽ ªúY7·§ÈÎ`þ'¯àäO"“?Ù³‹pܲZå·‚úý—‘-Þ –©ö:Xê§Îf¤~# ˜rʱjÔgÂ3í”pnî"æs?Í?_<ù›¨fÎàÜÜEÔ²÷bš0åTð¡ù'ñáù+¨fÏĈÿÃs—PËœÆ4«„+ 2ˆŽ;°†j£3ƒi§¢Ì‘è«ÄëÅÉ“Ê<¥é½ŸÉ,æ\|¤ŽSõ,.>RGÑ Þ„§ê\úÕ9ò …‚ƒ‹Æ·I/þŸèël$£ ”Õ‚ƒJEëÞ(;ëu”'Ö“¦Sp4^÷~>9pêíô÷æ@¯¿KÛÇÄÓãI¥ô CÂkK›¥í 4Úy¿ÿD\PèÉÖ„<{NöX¦·©¶N¤; û8)Ž[ÆüOaþ'¯ [¸N¶'[A¶xs÷Ù½†ó_Á4- ¦Þû…Üûpnîb¸p_dŠ˜büâÉ'ñ‘Ó¿…œþ-üâÉßÄ´SA5{f_2OÀ”0QÁCõET2  „aÚ ¬i‘Ì賟ª~ËïËá1I¢Æ,.l VÚE2â¶±ˆi§ˆç. –=ƒësÊJh™@Âkèçéþȳ ¦YL9]¦3o›\ª{Š•AáÆ¶¥Ä‘6ýäeT³÷ôôç‚ùîW*¸®¾‹qê“$‘uÃfô;‡i(¥`ŒÁu]T«U¸®#ÜN_‡S*¡~é²g΀–KrÕÜrN­ ·Vƒ[«ÉÏ¥2ê‹áKÈ.œBýÒedN…ßõ,¢¥‰4h§T+%ÉÔdØa`Å"œrõË’\‡E䜹ÿåËa5G)FáT£mSÓ^ÔhHKE€8…N>ý´LÿÑmbTüË—£” FÁ*U°r‚1dN- þñO {útœÐ3]—9’¦ôAäDä;Ù^JÁаr³Ô>f?§9S„À)WàÔªpÊåpÁ.y¬"cpJe}— ‡ ­N›0* !pÜ*q)¦`ÙZ4HC r+ Ô“™;5 gª '[ÑäT:÷_D¶p*¼–°¸Vô*ÛÑ@DC²m:ÑÀ#ú(Uˆ=RíRFÖø,¯9PN΢j“èshåØÜ ¹ÚûP¿ÿœl,[’×ZG1ÇbŽ\©×A…±pß“NAÅqPNDÒ×ÄR^?qâNœ8Z­H“„\ý'N`ffÙl68M"|'ÉÁ G£ŸRÇ‹ þýˆL&“ªì%W)ëvDö[ÚšKÈäOI‘ […“)‡N³¾¹ZP¤ûL9Ô«ðž|àIœþÙ…Ó?û[Xx@nò¥˜mïq8ˆ'S '3£" ÔˆNFO‚Ú&—‘-œ2ŽyÔÏ^Àtí>Üû¾§ð §ŸFÕ—×ÇŠ8W¿€ùé³x¨~•Œ´iÓÌ$ÕÓNy·†œ[Aέ`Ú)#çTq®‡Ì³TâþМ´AÓjÅÙ)&¿«fï #f$S/x™wjȱ(aȱ’,˜²'Uµ¢x1ŒBL'Ôym“â΃K_ÒÛê“jþ”ÑÚBOÑ‚ºæ"ªÙ{ðá…§ñáù§1“½ygygµì{z#_FgëO ’]Àƒõ¡š¹¨Ÿ—ÎÄÜ…X4€€bŠ•s*8W¿€…üûðàÜ"ª™Óø@ý<ª™Ó8W?ùé³8W¿€i§œ ˆì±áé…J{Ä:ð½ÆáÖd:yóØýòaÕûJ¥Ú“̛޴!Éï÷³]r_ÙG{jõK—Áò¹ÐÚ³|sO= ³æ×¿§\AæÌÔÿ5°BNE:„1°R þîÀýHÏüú¯£ùÕ¯‚P §REæÌ=(ÿÂÑzåøÛÛ˜=o~ å>Œök¯!³ Iiã _Àì… ¸ùûŸ+–9sõKqó… ‚„1ß¡óO= PŠÆ^„ßé€U*¨=öV_z ¼ÝŽ”mƒ;å2„ïÃ)WPýÈGÐùæ7Qûõ_W¤»Þé€Ѝ/.‚ä¦Cç&sj³ÿðv¶1{þ<:ùW Œ‚Kð76Àòi°ÊeÌ<þxØ1'âÒ%ÜøìïÁït=%ûtõ¥/Àkµ 2¯ˆ¼ã„ž‹ ™ fŸx«_þ2D· wÙùÌ^º VPÑSš#€{ê ÊŸCû¯É.(AN¥ §ZUý{ 7?ÿ‚\ixs N±„Ùó°ú¥/Bt» T>Ø™üi”æ7ÿ ™ü)ÔÞó(@€Æ^‚ßÝ Wß=ñcC{ù5ÌþØÇàd+ „"<°L3÷ü ¬¾ñGŠdAÔ_ßÛI¸^m2[8ƒúý—×_ÄÞöA6µ÷>†ÖÒ×Q¿ï‚"Úø(ËÃç[ábcŽ+4÷:j-©˜ÏÝ”åÔvD‘Q '[SÏ‹:9Q»Ú‘ÑQƒ3UA¶põû/C²…{P{ïcÈäObþýOÂ»ÝÆ­¿ÿ7jb ßÛur Ô¦,SÂì}Ð^~ µ{ÁÆ­¿Ëá¸%œø±†ý(D'[•/r¶¬BâÌž=êL£~v×_”ƒ+¥p2eùî¨UiY¶„lá jïyN¶"¯«»©Vä`Ù2jïyí¥o€@:Õì=ø™™_Ål¼„ÞFŽU±ì KsáßÛþø `¨fïÁÏžx»ö*vx»~G.{†)eÔ ¦XQéB"tƦœ"|cZ ˆPÉÎãÃóOËA×)„X5»€sõEüùÍßÇ+aÚ)‡…vrp-á¶¿\ò»2ö‚íðÜ;|]*aõE|§ù ìð6ö¹”=Üö·¡98ÄÅ?Ÿý(¾Ûþ3L;eL9%¸ùOÿÆUÏàãÏáÿt„ÿâ þâÿí \`*ÌA 6ƒ%&ŠSÙ ~¾\«ÍÖ¹šë ä0T¿T­âË««hr@Éql>ò”b;¿%å@$]ð}?<777Êå2vvvze×u‘Ïç±±±jJiLÑÓßW«ÕR¿¹¹îã«…Ó;ý;¥qsc( a;…J»5“J¥‚V«þæ ,šmmµZ ”¢T*accžç…çÓ~xj"‰ÿÜ_uòp³U8™œL•3¿„õú³hüÏ”¥  ™úÙ‹¸ù½T{œLYîŸ-C@ÀÉJ'ð÷À2Eœ¸÷£hýã«ØÛZ ÅÚ?{?ú¿Q{Ïc`™Þ]Ç­ïý0·€™öëhþðìmÿ8n „àŠ¬rLÌ”CêÇhQ¥m–á‚oS¬FL±¢"¹µ"¬ìÇ)&…Jö4~¦ö²,!E¨¥=ÍJ˜b%¼½œì ÔÏ^D& ¼»–­†ê Ë1÷cEkéÕð™q2EÔï[Äï~.tLœLó<-Õv7¯Ri|EèóŠhËA2[8Ú{“Fbék(Ííå×ÔuÐP­w³U¸Ù*²ÅÓ¨—/Bø]°lÎTn¶¢ž_?¼&ææ»“«ÙÂæòJèH®Ó†|u//‚¹¹PÕsÜð$ µ:3Ë–AT$D ´,+€‚¢–½?=ó«øNóx öËønëßá§f>‚ï4_ÃoŠsõ ¨fðá…§°Ã×ñ7/b×ï`šUðÓ3âoõ„¸#Ò`Ê)àÁúydYBE r*”o.°¥ˆœSÅf?Š)VÀï¨vK¥ìÛ/bÛ[äÜ*>0ûþ®õ>0û1PÂð×—@@Q˜ƇžÂ–×Ä·W¿ŒgŸ|{õËx ö+øûöÿ…,˃jâ „œ5§(Éu%ÅÔñ­¿íÈÙ€Š,–j³p"ƒ+›GÈ×27ÅðÔ¿˜Çú–ÿãk+ؾíca6ƒO~l…œƒÅG^úz©£\pÀàûå¦$SPL³¢²"2RsdËocŠñ¡ù'üçÖ×AACÁ Š™2ãTPËœÆÃõ‹È²¼ _x˜r*xõ—ðÝֿÃõaŠå! ð¡ùß!<ð¤m%4tž„vV‘m¯…)VÆûOü¾×þ3¼¿ú_ã{í?C ž4¢úE;S¬ˆëOà?6þ˜ý î ²,öó+ €gŸ@†NáÁÙ'¤ã!tjP {þ¦Œ Ï]Â_­¼ö üåÊ‹ $Àôô4n{AøÞh’o¾·Bˆ˜ó¯E‚N§!I/‹èt:!‰7Óù’6´)¦ mi‹šÍ&‚ è±+f¤‚1Îy,š`Ú1J)ªUé°™À~éGú»dÚ²¾DƒªÏ‘i-Š”ê¤UV,¾úå‹öö"2ú—¦…„Þ­”ÁÊ©d ç¨/.‚òà’h«†²r´R Óuê—/JçƒR X”ŸiÏEøú:X±Þj”Ê”JS¯“èëS#-—‘9s/f,ttê‹‹Qd„ø5¨>¡å2XµV«Â­TBC§áˆv;¼6–ÏãäÓòÅtJ%ðõuy%•²C)œbžç‹`•rèddßóˆn¬X–нá¸$ëfÏŸ—ç§ð§âý¬  Y¹*>‚0ºÑúꟂ•Š‘ãP*ƒ0G’Kú5I„ËAL Ò0Ÿ§LN¦„ù÷?%•#· þSi†"ö¥l«g"[†3U“ª“®5@¨úΪÒú X¶¢aeRVpÜ<æx Aà…×âd˲=N.LÑq²e¸ÙZø29™j˜fÖ>$´ÏÓŽtÔž»ˆ×wþ½z‚Ø»V(°µµ{oMç]Gñú¥%„~ïï º!½=!$~ÔHk‡Î„Ys0°H®ßïr׆ãö)ÌCì¼Óʨ{õ߆Ä]ΪQÆ´SèQn(²,¯§œ1ˆ˜šdü¸ WRÑ`²ßÿÊE8ÉÁŸ ËrøÅ“ÿ½‘Û/Pm2”.¡ò›§œ|œ×é{©í"85›‘„yšõÌu0¨¦^÷Ÿba ‰þâ#³È„]+òaùœ|·žþ“äŒL«4Û!z¢«ý§¦Ç’ö½€i§Œs³ç‘aÓ!‘Õü˜3•ŒÊ¤ß»d$·’]­¤}€jæ*,JG ­žô¸~ïŒ د°wÛ¢ßõd}ép$mWZäñ°m˜3‘£SÑû[ÍÞ4£pÆøo}·ë÷Ù,X:µ€¹K—Ñøâ<‡^Ì©H;MO•êùnÐ>ÆvN±ˆú¥K ÓÓÈÞ{¯$Ý ÂÛ/íûQ˜EŸ¶’”hOÏùFy.‰Èy ¡4CP|Ð"©ûÇs¿³ æ¯;™ŠJ]Q¹£Ù²90—ôc&¸˜:>RYb‚õúA³_L`n”¾Ñ‚ýÛ¬ µô•‹)e$U¹ISÙÒßA*œ㺓Qsð…±SœäùÒHÌ Î ¾¡–õ:š03;e’pf¥”ïÓ¢I•þ°gk†J +&ˆòi*:‘ƒP‚ƒ§æ!‡äv¼ã²Êï0Óî‰è§&Cý£:&ýD‡^²ž´Åý÷þBƒi;…0„˜~ë ¤Š“·{b çÁ$ççiBûÙˆQlVZÄbó2È6öû]«ñýÄŠaÚ?¾@ê‘Гì»~vsd;˜Czû^9;„†Ê¹&ÚÉT¹´÷Ä÷ý(õX½w±èÙˆö`лÞov A©DÇ›ü3J KX2§³‘žÓo‚k2¬7ì6ÃF8û:Cž‹ŒÚJAKQmÃÁD¤‡8Ö AËT¤’ƒ¡¡ª®ó×åv…(R€>ë<ô0y"~(Ç:Üó™ªR¿o?¢?‰q@DN5 IDAT0ù5H;æ~çIÛ_ªrƒ”ƒNI?ê«еŽê Kú²J Çä ™”cp|²ÿAÖM\0‰}…”wÀÝÖ‰\Ç(ÇÆYHþ®óð‰Ã^C¿aíæ¤ûGŸß$ðfêÎ0ï`šâ>î»»ß>Ãó¡üK6|J¤çìGvA{'6ZzmÉT IÝË¡ˆôA‰jŸÁ«G¡v0z§ÒÃ&tWäC­»“m<ˆ“bŸ§»ÿm;.Š;vglÿí;ÇÇYˆ¾ &fljp•Ã].—{fÇÚoŸ;‘vs§19ò܈´Ñ®Ôt•Ã"»ÇÅéçÚÆIí™? Šq÷ Fw ï²{Ôm´ÄßÂâ¸ÚÿcBCR¢‘Ö~žÁÈû¼Û0±œÿcM¤‡ÍÁ¿«¬Í˜×&Þ †ÚFw;Ùµ„ÜÂÂâ¸Ø¢£ŒFZÛhqtäÿL¤ïf²+ìKnaaaaaq'aÓ-Ž&ƒ²dÓÂÂÂÂÂÂÂ"N,ñ·¸kÉ¿……………………………%ÿ–ü[XXXXXXXXXXXòoaaaaaaaaaaaÉ¿……………………………%ÿ–ü[XXXXXXXXÜE „„ÿ¶“ªî‡ ”‚ÙÞ²°°°°°°°°x‡@@€¯ÛEàsPBàP€ØÎI¥€C)ÅLaÂ.Ðeaaaaaaaañ!×ø@­8 )Û)újwgÀ ÖK²°°°°°8¤Q·÷;+ºYXL^·  Võl†Ôÿ9N&k{ÄÂÂÂÂÂâ0FÛ­Í ù9@Xm'Š% ³IÊGg’vvá8®‹ÿêìOÀu3°ÈÂÂÂÂÂb‚  ø›oÿË Àzbs¤X*eàw®ü,ø¶Ÿ,,,›öÃóºø»ÿïÿC›É(òoaaaaaa1QüôO÷Ý|ík@k¨Í?÷Ïå÷ŽÀ±}daaqü„|´‚¿……………Åá >úß•šn+5ù¹·}caaqtP|ßÎóoaaaaaqØxð瀟ðöäßÎö‰……Å%ÿ‡|øo xïYù7Ÿ³}baaaÉ¿……………Å]‹÷ýÈ}g÷ý„í Kþ-,,,,,îj0 LOË¿–ü[XXXXXÜå°ëYXXXòoaaaaañ.]ÏÂÂÂ’ Kþ-,,,,,,,,,,,ù·°°°°°°°°°°°äßÂÂÂÂÂÂÂÂÂÂÂ’ Kþ-,,,,,,,,,,,ù·°°°°°°°°°°°äßÂÂÂÂÂÂÂÂÂÂÂ’ Kþ-,,,,,,,,,,,ù·°°°°°°°°°°°äßÂÂÂÂÂÂÂÂÂÂÂ’ Kþ-,,,,,,,,Þ…ð}ßv‚%ÿw;8çh4àœÛΰäÿÎ">¶½6a½Q ‹Qà­ ~ lgXXXXXì?nXåòäßÙѱ͛xùúsØæMÛ– €æ:ǵ®£¹nU‹ ¿7B Í9|!ìu[XXXòo‰ìdˆ[^lgXLž w¼»– û°¶îÁ·¯Ž%ˆF‹s<·´ŒÖ»,=àÝzÝGjCaôá€Ê¿%²cÛ&Æë›žwwdbß;C——Ѿ‹ "Mî¿Ëðwëu[XÙ;vLëžóoc‹C‚€À6·ieà L‰éx Ô¾““C Ý.^w+E¤Þ}EpïÖë~'Ãæ°Û{v<È¿…Å!ÿ[»oà+K×°Í[¶Cö3.°ºîÁçäXµëøÕ ØÂáÑ@49ÇóË×Ñò<Û!“}mÝÁа³×XKòo €-&…-¯…?YºŠ›»¯CØ´²á^f'lÇDZH·Õñmá0¤¢¿æyXó<û/.žwäí¨‰!ë–ˆíûhëF{'¬ò?„¶Ï&Mþ HŒfØàÑúL§µئ÷…åØòV-ñ4([ˆ^²¯kî´ºV¤{'•w!€F»‹•¦-nqŽO½õ>õÖ[Cåó“;ÔÆ£"†$¬ox·Ñ;%h§N('ô¸ÖǨÄq&³œó#J¤õCò;ß÷Ñh4¬0)ò/ °Å[†Ê\ €ïDb˜sš}F@°í5ñ•¥k¸µû†uR&›•6ˆð‡3ût¼Xé !äXÍú“,Ò=h4à „¥ÙñpõsËhmx`ôøÝWîc[ž‡[ž‡½1ï£ Fâ(‰!QDÔ;>Dô }6UõAû·<Ï//c{‡HªûmÎá çèš<=ì8©íÉÙÆm›~çV=o¨ûÙOÑÖÄÖ÷ý0p5Ãy­úk¢íûþ¡µË÷}xž—zü´¶×Yâ&é$z¬ñ••–ÿH;v˜Ô"àA;¼ƒ@D0RÚŸä§G=ôö[^ AØgš ¨ô–;«ÐÆœÞÆ‹oÿK¼øö¿Ä6oOüþXà×ÄÙŒšH"ë"öFÕ¤?Zµ 2.útJÆ7Æ„(¢üÂx™€1é4]ýÜÒ¡’ì‘ìi@ðúòþÇÿu ¯/ï@‡wótjKÓóÂû°ŸâMpMÏ c”‡1MdŒ¸*rz«ÛEK}7 rÜÏI]õ<<³|«ÞÁÈð$Éë8}NÍêy#'¾ªã8¬(G‹s\]Z›»»XS÷òü¶r2)Hª8N5ÉÙÆm[›süöò2V=­}îg?õZjSÁ>Š aŠŒÍh!¾ïãÆŠôÛo˜cï×/G-IÞ³Aý:n»Æ)§£xE&A”“BÀÇÖÎÆ2(µ(¾"û>aØâ-¼¼ü<¶yÛ¼=R:0µ)¥õö’Ü“ÔT–ãÞ²Í×ñŠrRÝ[ØèÞÙ)±k?LžT›š¨÷•¨X¹$Ã\Ùu~GŽö†ŒF¬´8Ö79¸/ðƒå]|æ³2½†’( °Öñàû£ÏJ¤ãsµuž‡‘"2UŠÃ÷|_9L~ÿ¾>Jg‰Õ7mUÃA„À¡´‰+¢+ò%‘uЬ˜¿BÐÐÑ5ãÏaLi¦ƒÊÙ¸‘8¯.Tny^¨ O"¤XQçÄ5Lb]³õ}ÙÏ©ˆ¦fõà'î‘é\i{2¹±9îô!ðƒÝ]\[ZBÃóÐæ\•j$@ĜɃ8<“v>õ5 ´Mhxnt»XUÓåî÷ÎôSþïTêÊ~¤4阘Êÿ8mDf‡‰* Êó?ì“ÌsîWo`~ve¡ðCUz‚©Ø„PB±å­à+K껣*"4õ\Û¼‰——ŸÇ—m°Å×øüÉ‘Ru~™Ê3DÁî 9 [‹°é5Ðñª¯$ Û)y®ý0‰t§$¥ø(%="®"]m*ÿG9Å¿<¯‡›«]¬¶<¬¶»xöó×ñÆò.žùì¾ÿÃ4Z2Já-ŽFËõÏ-£¹îô˜„NƒŠn0š^×àkmŽ•¦‡µvÜ1ùþKX[÷@(‰ÿ(g%Òç2%í” ø¾@«ã˾:„6Qõ†÷˜PP´$UÊ •¤‰ÏÚ!Ïø£É•/Dèè‰ó¶u¡òÛo‡»¡œà€mÆâi‚hžK¡Câ †7ÙuÌû²Ÿê¬§f £;H¤j©¨Ž¥´$ƒóÕ½ ´ª@H;µæyxfi oìîBDûN®=tÜš‰šˆqÚÖò<üöò2þawW—¯cmˆ¾O*×Ieý‚ƒ´ÕLmJûžs:’ÎÑ çã°”“Àëö «ì›&5nA3ÝòÖðÊõç±å5û“•úW±õï[ÞŽ.Œ"Dz´!’웎Œ6¼5lxk*ª5£ BøØöÛØì6Bµ\ÏâCp¼^ÌaÒptýÆf·m¾>|ýÃë‡qIö¤jF­ù†ä÷# :ÅG­ Ÿùì2Þ\ÞÅ꺇OÿÞ~°´ƒ ÐÑIWÛRU?Š‘³Ýñqåw߯•ÿù-´79_ônW µÁÑhuqí©þ·6$‘m´»huFÏ××…ºÍu¦Biu íŽ+ÿú-|ô_ý®üë·ÐRþƒ´{rt+#ûlG£9K×^XÆÚº‡Ê”¤kŸ[Æêº×·½‡ónI%vO‘´†çáùåëŠ@|0EéNª®„ø68Çž*T^éJrÝäŸTÎÀQ¤Šh‚¸êyXWjö[»»øä[oáÊ[oᇻ»X›àº¾@x_†Uµ£–t†bQ!Æ2Iu\; Ïêç¡áu{ Áçxfù:Ö8Aàû»»øÌÒV<¯çÞåHªIêª{úÌÒÒk"åÞ«ú>¦D<’„nee{{{}Ið»Éš†´bçF£n·Ûó½&âýœ‡Ãj¯®{ÐíÖ6s²ßív±²²2Ö=N:CÛÚ¾*ìôûÇ–š‘æMIž ¨w7­ÜòVñ'KW±²ûfÏo¦É Øæ-¼øÖ¼øÖl{kc«Ù:ª°í¯cÛ[ÃW–žÃ_Ãoðe¯rJÁS§ð<(!N[ñv?R+„Ø7â!Ƕ×Ħ÷#YÌedgÒÎÙ$Ôƒqk &U‹°Í›xåúsØæë과ϣ¤;õS™“”*%V`µÍñýîàÓŸ]B£åáeùïæº\Ñ—¹ïµ´ª~ðwr¿T?h´<ÜlÊÊÔ½¢²íáÂc×ÖÑ)-ãUY¨Ûõ4 'éðÕ–‡©hD²íƒºå°í˜.TT„&ðEè,5;Ñ}÷=iW*\GdWWô¦w~05Ý7 =ÓRVúåÇûŠ0q#ý¢©œ‘–çÁ!D‘JyŒÎÀaƒÎÑï,/ãM•ÚòÝ|wgŸYZÂnÍ DI€5Ý—QⱄôFw(!QT€g'’yïÂH#3ïQòؾXIô‰ Á9nt»á5åð¬õ©ó˜$áF«Z¦¢,W—–ð=•Ó6õÜêô+–’>×Ýn7nÜÀ7Ðívßq¤}R;™“$ºIç(Y= •|~˜iHMGï ÷xœç“îGJ…Ð3Ò<¦Óìg®L•üP”¸µû=üÛ¥OÇ€äÔ£’slt„îÀEÛ~k¬@U>2Ú!ü0²°é­a£{ //?[»oâ•åßÁ¶×5R„¶xkìI¿oÍ™t’î÷èœbˆ‡‡B¦€,Bb:g¡Ãx {íÇ®aÜš‚IÕ""@Çk`Ã[ÁÍÝ×åýðÚ*b¸pʬ V»=.ðƒå|æ÷–ÐhIÕ<d>øªžµ¦-e’í‰(œû-†E$‘§T»í…ÄÖ$Ú%Ô62ßtcÅ”*þŒrpXZŽ“jS û<÷G7 ši\ÚX›ÎRÔgzÛeUÇqDÊ¿"ÜB#¢a>“ãE]èù|ÊlBi”D‘H©&›Eɦ3ÂÍ4E$›G°±N›òUþz7d»"{+œƒ²N Zó91º¤­U|¡ž×Muëyè:j|ç§iÜMÒ ‘ÏYk`:1ié2ú;®ú(PyËû˜+J›õ%ÚÑéfº·BYÝí†5 #Cý†ç…×®¯uÇÐ÷}ìííaeee º{\"„¾ŠûAœÝÃwP_Œ«’¦o¦ôü£ô9î :Ýgÿ£Ðvt•5R²ƒ}ô+;ßÃ/}·vßÀ­Ý7Ô”™«=Ä‚Jl{°>a|Æ$iñȦw Û¼ _xØðVÐñnaÃ[ƒ/<ÜÜ}SµoŒ8#Ÿ¹ßŠ·Q*V€-¯S·ãÓ±Ò¡ dj×xÎÙßI‡ñS˜š5%ÛfZÚ¸lh,Š€bÇ“÷üß| 7v¾-¾†ÁH£ú O]Ïhsí…eü`iÏ|v¯/íHÕÜØM§ˆ\}akm/ŒLÆõ_ +œÉG±JÖÚž}af­u™ªb¶„R‚¦ŠL¬˜ïŸ|ýš1§GÖÉ6 ¢#<¬™0„E¿ÀѤhç,PÌH?i>Œ¨”&_NãHºèãhs+jæ›ÏCû ¶..öúÌ&Ô¯€2«šDÇÚýmx®.-£Á9¥¨^[ZÂë;;Éÿö‘Ô„<™³®ßó¶ç©ÅÔÞF‹Nfµc8®ˆÈZ‰ç–—ÑàË÷óÞ AK‘ôU£¶ ÙÚIô ™õM.”ÆÖ—ôˆ $jSƒs|òí·ÃÅðFq…uÍO¹ÖqÕïAªóQ,°5 Áœñ×N„ÙÛÛ;ðy3ÂkÖ!ŒrfzÐAîË(Nå¢RBd¥â¼6–ʪÓ*6½væŸË¦¯ì|øæ“øÃ7ŸÄÊîßTšxJ±ŸÔ B¢È‚wžÊv'Øám¼øÖ|á­ObeçðòÒ3¸µó=P3³©ý6˜Œ XñV+L‚ÇÔm™Î³ª"2"0hþ~B¶ù ^^¾Š-¯q€Ô2'B’Žm¾.<ìò õ<Ü™º m¿.ºØèþ›Þ-ly·¢T©Û¥IkÚ*½ºˆ·ëÉ™mú~ T!J`ôàábX/FN…@8“O³©Òº½·š‘3¢I‘Ͷ$ìaŽþ t(A½–ëR¬†JÍÏd›(!h­s\ùÝ·påw߯êz­ŽÎ2DTš”žîS_ÇaLË}dª× ¿:rCzl«ªmð'¿Zs Z 2nꞇ&ç¸áy¸¦ò´5aÔ¹÷è Ô Uisõ- LêÔS«ìz†¿»‹§ÆÉÿ'‡S&CTÝò<ÜêvÇrHôLK×–—ñýÝÝ‘qBÔŒ3Ý.n¥8`Îá]‡À™ÇìÓví¤#HR„§7wwÕ¶2µë0Á<_ÄH"„ÀnWÎ5æý;ÿ=™Vu‡Ö:ìói2}œ QI¸é¤sOF°#Eèè¦ÌœŠn”0£~¨D{[¼ o//ÿö¾ÑÞME¾ýíè¼¾ÞÍaÊTÐT§À{Øâ+@‰õרªó¨ê6!¶½¼¼üVn¿…/¼ý? ˜¿Ÿªîð&nœÆ¡Ûúº·x /_~,’=)ê_C±åµT¢JU´æ…)`ãÁ¾«ô‚Ʀóæ–3JÀÁl-ƈœRŽŒkÀ¤Â.óõ%ùÔ« ëbc@$Š2 錙êsÕ(h=È«ÇQ)D‘2.畎RžˆáÝju±º.gþ¹ö¹xÔAÞúI¶®K˜è``öß:dzŸ—‘œçÿ:^_ÚÁµÏ_¥^qhmLv&"=§ýUV“B¨u*M Ö|Žו©TÐóï_GkDthëJ†ß–¦XŒÝ.VF$Ú ³™Œ$œbrm4•ðƒØC}_n1ãR ÞØÝÅ5­Ðœ‚nl”¨%dÂ3j±ÏHi:iºF#  ¹ÿŸ^ZÂ÷vv}úA«ûÊ1޵Oø >î>0òªÚ&Oº$÷8ï×¶£¬MM›yH;Gᤠsèð˱ÅeêV„‰rHH¬)¶¼U¼¼üLjúÍ0ʪÌÛÂi:‡‰ÐO§1§`‹Ov¾yYÈ*Õì¤ÊžÆÆ"§ R¿„ÑæI™zêU’2ÓŽž‘‰Ýpþ~_t±åµ°åµTÊJ¼?bº=“T”Ïo®#A@‰£"$BøØôÖ†š’ö T,T?Æ#z {éûñE»Æ…Ãfk.FÀB‚|2«ôf'ÊU•vÚmžªX'm,bÁ¤ •qB„š¦2…Ô©‚éFÓC£Ý S˜tt„(G‹QcF¡ /üÕìÈ™šÞXÚW3yz­.úöŽš¬4eñï$gý ”͇ ÔT©Ã.dZƪçaÅëŽNZˆLµè H[YK™BS„÷‰ ý\Œ:Ðk"¼ß^"¥¨‡XLß—Q=ËÎÿ¤HµîKMp!B§n´±PÎÔói5‡?IH*üú÷Ãt úÍ*”<'DÌvxEêxyé6¼•”glk¢M€mï‚1|÷xŽz<0h¶gÒ°å­áå¥«Øæ+!ÚºUsÛ|//÷˜ÂÒ@è5ü‘”çANɆ·Š o<Ø gÚ1Óv´S@%vø:^|ûSxñíOa›·ïÈ¥ÑLRo„Ÿõ:Œ8(gæPÎÌ«HÉáLšìï´û&ïMJ‘p  !rÁ¨ýÈ쾋[3ÿ\¶•%j 5ßaõ®CzYÔPßh®G¹þiÌšŠ<4×9¨ŠÔk.˜ê/?Çðm¨¹²qüúãN‚¬CY»Ž¥¯b݉ëØç2¬VÒ™"°úßI¸Œ¢®Ò€9~¬µÕ„f©H™5 ?M°A­â`}sÌ”$ƒ ›sâ*ž ë"”êï0FU‚.Â=¬™u4‰Ðaú^NgYÏ=¥#d¦­>«WÈÕÓERB”º- ? skŽ;T‘¥¶' '2™ði„'™"£Sê׸Ɔuñ¨/Xâ=qAà(5¶áyð‚ Ì9;¸#.Ÿv—ÈóéUYÛÉ…§ Ûh¦t’1”zóL‰=f-°¤˜D}B Á 7ý¾fT4‡Ò÷¸Ã¤$éíZ<¾.UD7I¢©êãY£]"… 6ô,JoîîâYUL}my·éH³‰þcãJÂ뮫>×ùM‚Dê¨ á(é0Iâ:ÌâcãÔ·š‚äu¦-(6êñÆurFuvö{þ£é9Å‹ˆœ>2‘7ÏHÛ| _Yz;¼ ªÔYE"á‡zÀ$ ,(¶½5|uù9Iì‰Û÷%Ûæp³¸–ÂB…ÑSgFyèfº‘&ði³õèïÒœý›$ÆÒ4R"ÛLjƒmß(h£ Ø,:&*G¾'?]Ï— [ž,@Þæ0RÁÂ6:(gPÎÌõù} *¡(ºz6#¡"Cý£„PìðµØBlÂH‹"ʹ¼¥RššCך5TÕ£H‡H¦Em{mÅòšálBñEÊdŠ/¼‰ÕDjóš®ò͹ü¼îQ“äöQˆ¯ IDATŸÙÇœáÇWyù²NuÙï} „· ùïF‹ÇfÒ³ùôS®MÕš¨ÔÖg”t‚õ Ž«Ÿ»ŽµQ‹X…<‡®op™¬IxîóQñìê€T$‡’°0º^“Êf[ãºl|{¨ô)ï“F5 ’q)æf\d\ÞËð¾é$™«Ï¶ÔkáT“oaM­J[S„†@*´Ï./£åÇIO?eÜœz“ °ñi)2Éé ‰šÓ]ç>#õƒ*¢Ä”“â‚[œãêÒu¬ù>²)$r\UvMÍž#UY}£ÛŪ1«Ž^°‰+å¼¥¦0ÕéH£’Wsa©~Ú²VîG9®v2ª/“÷(NdÉÀY•Ì”$¡œ?…DèûÒRsãëÙˆæ2d( ïS†RÔ]7t²ÒžMÙ!§¢ê™ˆt‘ñž é×_¡Þ~È‚9×E–Òø;$8—dð ó¼„0ÂÓ­œ;(²0ia’Ä~”H‡H®ä{÷,­ÿµsB r˜{D¥RËBe}Ók@ˆÛ~Þ ^^º†m~Ky®†ºÍ¥ºM‰ƒRf»| _Y¾&m¢ox‘§P‘WS,n+ÅõöÛª@W~·fÌÔÃŒÈ@ÃPwc9ØQqAÝu{”ïAjpÃóÂ…­|czQsŠO®r¬WUê©t‡j©jMŸcÎu1¯H˜c8#øI!ÚªðrÍó!²@öÚò2þawWÕŒ6Ú™yN93mµÍßïìàš*ÕΈ£õÌÀt‘º °¹ò,ŒÉ‡ÃÚ°¹„ æº=©KiŠ»…ðû¬Ã  ýsËËhªt­d?7}Ž®‹5ß f§(Åœë†÷ÇUÿé{« 1Isx&ÄýE/ôLDB=‹Õ&Ý?&Éç†S3R¤S9AyÆÂçXß[ß÷qóæ ܼyóÀdð° Zû¥³ ë¬ì·í$V¸UÅOF29.SK¶ V4À˜S,Êm`Ì“$Ú&a¥`*o¼ßö&Q|y9"RnAK7"¡Oªú$$út S #-+juصž+ë²>@@ÈuôΨîÁ³Þì[͈‹¢;‡º)ÎQ0”ºˆ@‘èè¼iÓ¢š}åЫYŠÔ¹å1W$2Fubwbpg“·±ÁåýÜåM mÞ–ÏoÄ"%B]Ç­ÝïáÿñÓ¸±ûØòVà‹ÝÿŸ½wëŽ$9¯ÅvDFd5€n\ª€Â…d£u4¤¸(-ÿ?XÒPÖZ^g-/?[ê<ùA¤¦¯õî#R⫽üd‹3ú~ñ“ß-‰<äŒÕ’ @áÞ@Wfd„â’_FeÖ—nŒˆœÕ .™‘YYûÛßþöçÞ¢6›ÄǼXš?_Pëm2?þñ8:S`q3*m÷„ûÝïK;¦¯®¶°¾œV€3«aÜ­e¨íšœ\ÁöÄ;ùüËÿ÷{‡Î¿Ÿto¶ë®BšñÁ‹š’Ä:% €dÊl„÷Õׯ ç,/1€ý,³N=µï+™`϶w¥¬È•<ðT„ñÖ0–… l½³Å¾®´€Õ÷ïå¹íèê¬G÷°W½!€[?7ä Þ£t —VJ³õ—ʼn+²îæB‹Ž÷0«Ý·™˜æhî\€Ê`f²¨žb¿ÉðÉëç¸PG˜O× \á7c±sS9×õl4wÚþšL O]“´É2¸TG˜$,±uù>ÎòÝÊ|”Á‹†í ýÏøé¿þoÔ¬¬ÊÎÑÁ¸l’Zß]Aíái£­KåÞ_þÈÚhz&^k½—ƒÌ>°zp‘° $ 'Þî3jòEñPS/,/ãöï„+í4Ô ØàeËÊjÜêbýñã`׳õˆ^;1¸ó§  ç˜p ”MÍH$,¼v’c]GX:ùØÌ skÊHpðñœË¨ŽQ°D7º¾WdM¬s €CÇÜzð²ßàÔÃ#°ïYZ­)B}¥p”«Zàèk VÒÒá'ÙW }öþÓ矻Þ'VÒ£aë^l}FXâºñ5h¨5ãá‹­-üÒ5Í:ˆ\i8JM¸¯•ð`݃ð–ÏŒ‰ô¯8Y‹?F_åH€Þ›ê.PãØöùpÌ1wkÑó@=b¡cYNT2:ˆ‚: ˜Ù—8ãX& šuñk”F*ßׯ®x6!Ù¿¶‚±‰ä5“Ô$4u‘N`3)![CXyŸ•H9/3N&4M›ÉÄ®ãe×7¸žwœz·åa? ßdÆá]IF9õÔǸy½ŽÅéu³×=6¯;YÆø³o y'¹L­Î›‚¢‰¤g‚ºxθâ^çÍÊ›&gÜ‚a¹ Á[î÷îPWZFüâ-p[áe¡sys6vÞþÿðúcœe;¸PûöÜã ›«Á…óD3 °@1 ØØ–~n^Z'¥t%jcÎÔ~…‰®ï@hÂæ›RË€ø×Nz{+k$ \b¨¨p½ŠZÞ«–­Ï‚Êž“ ´˜›óiåHöHö60a]ßäûáÃm3LÞv ‰ëo .Ú ÞùÙ°>í9ö]*wÚ‰cè­4çÙßyÛÌR²ÒN‘ʒ冥?±4„‚í:€[ºôì.+‚‘TÏ%Èj)Ô3$ðhÐúû eeJ‹÷¹ßs>÷”= *…ò“+ÁQ¡¾2•gMØyÑÚX6ÅÙ£žœÛÍ”ùkþñù„×°Qw]àÄÛ'²òühwUCYÏ£Fn!ˆ–>‰¤?2†=¥k}')2‘5¢×Çs’MðVƒí<Çv^2üžÝ.ó^÷eEí ©„ÅúcX˜/E^jtìô\ }庻Fû5ºzA:!ï;=ÿj+Åjš–Å¢ÄgŸG‰Ìwî‡DŽ$«Ñ|ÿââO]–‚×|Á{&ÛJ¼†(á$ûqè23¥4ª—å8RÖŠUÖ€ö¸F!ž_Ø[ç%—¸`fŸ&bõIav]00ª‹teµè{ˆ¬§)¾â‚Ø©V‹VynìÝØÝXžÔÍæ6Aú» þ­ma M-øg£›Wa²†[ ½Hu€ì#¹ÉS,¤+¸,NJך€%x2‚§ zìrt1p Ìuq 8æ×7ù~ú¯?ÀîÅ?¹ÎÁlhŸ& .ÊÇu%(HxŠG² Á'·@-5ùgjÆèˆYv,my»®°äÞ“¢dôW øƒ0WM@ÉþO‘teõ~•6 qˆŸ¾~6¤Ó÷ Ó,È×áŒÞ¨]|úú)·$>x¢n=oÔ “5 £ÎUå8m¿Šr]uy-0ÉŠªë"ôßœ\Â…ªw3â 8 Í£J¯vïáþü'[–±;+*`Ó‚ÃÒW$»4æy_O!Æ 8µrKËÌþqî@1ÐízT½¬&–ÔÄÁˆ ωHã>Ý—'px¢¬O?)䥄‰þ¦‡«$ÒúüŠ“%ѱöO>ž¦£®»ì m»kM;7Û‚n:TêãŠO€å¶„;~qqaå)ŽÕ÷ 5í®Joøœèèc¶Bb]A-ewCC¤,E¡¸îHÐ;±‰~Öuî­Ûâñ§œc£ÕÂj«5²`”»ÏcãÈIõËËË©û ÐâW Þ™ø9ž9ŸýCçˆdåN*I<d]$çXMSˆˆä:Ês<ÝÚ¿\\Ôvn9àï™l3æÛüP)|ïóÏñÝÏ>Þ«ÙËslç>~m‹ÃWÄiœEl| 5e‘Nq6)ùd°—eØË­^üHÕg¡š®¿Q =[]02*ó`j‚´á`ûî‚E*ky]i'aâßÃþoa£kXjøëµú¥ûKZÜ”=®cŒá˜pÏÀO7mÊzÇ™7ê0̹@£pÇçµ€µ:& 4ŒsÀ{M¶Ól×8÷ëkBÂCç> @Ó €ÕƒŽ×¥ÛLdÊœö½8Da2œ©¾Óý§D~R¿> ´d|ñØ&w–.›‡±™ƒ 0öÎ;Ÿ¼~ŠË¢„µ¢s–'±0®ò÷óüŸn½Âîå/ñÉÖ3ô.®jM•)²®ä˜¾FÂju’­Ø=ÊŸÿ…:Ä'[ÏpæäAMàÛÞHX…Õî+w>“é>QÖYç 8 åAkïÁé‘“Ó(× Ø ÛèÃb+WI­5&a¯Ç1Ö“(ã¾ãsŠk<òc§£:I‘×Ö Áj¶Ï"øÛ•NJ:¯c““g,4äêçÐpà š½³P¨‹ˆ‘ÆD­é#ùK×iõç——–Ý!zü& ÉQ̪áãÿör Âì+…í<«HQâ¯ñû'rúüOvOJ€Zpôìûè\6ðOøþë×8P rBßwÚLëÀÕ ª<»¯¶³ O·J7½,Ãn–A×A‚hç™k²uâ‡=WÔ½CäXœÌG×É’è|ÖpF榗eØqÙ™]퀗ic‚ÄiÔZÖ]C£šâ ‡/,nØ @ßÉļí^–Õ®)«|¦¬kOÝ’†À¸z_beæ¡¡ž O27¼Ø¸ŠsлþÔÏþ]±ãïÓý'@®ª§¿kÀ¿ZÉnèâëç¥ÎÆ•J‘¼Ô¨Ðœ«Façâçø?þõ/Ð{û Ûšhhhœå}h(ò…B³Œÿ¸õçy¯6¸wíYǤ½Æ®Ö –iß?²À‘³ÉÁï•o (]edhí mÊ ×ÏÑ?ÎÑYtu5ý zÜÉ+è¾Å5¨+ÛÛÀC×ëP,«McpI»õÖÕįµïýï™|íä?Þ‘¨dóóÆ ‹oÈÅ8 ƒÁiZ ¿íë"á E99’†®?¿¸À_üë¿âŸ# #lüî„]x›dMÁP°Ë0Ä,'^”Ý­ *â}ÇÏ%®Øuƒckç9jžè8¼d @íGùä{ÉÕAžãÅë-dy™™1J¡#%NŠÂfK”ûý©Ág—øËׯñÿœžâ™Ëxp®*ëPo÷I‹oÁ $G ™M:òòš€¤.“0@OZ˜Í ’# )…Üœ¸`ÄK¸ö2€öÝüùeLh ç%jûYV¡…Òƒ`œäÈ÷Í(ƒ8+‹‹ÞýëŠÄÙMÿ›ÍEQÔÿw Tß'Hö›/¢¦Ìÿ]ÉH\õºˆ³Ü‚2…7y?<äoÚ‰ó áR^eFËÇL…ù­•`D‚7ù>~ºõ—ê€Æe 2?ÙzŠsçPg°Wê]„¼«‘6Ê9ßt‡ìº6ƒ6ýSÒ°>ùŸl½Àîå?ã“­ç.[QÏ3Z Ðþ·ÏþÜúù«ý p&Ý¿2QqÔqgâ^k;$[g&_\»—ÿ/þáõÇ8/ŽÂz]ªC|ºõ4ÈÆê€}è ÁÊ,KÜŽºö|æÃKj|S3@ ypœãÙ·°×Ïpx¢¬“ŸŒ¿ÊF­#EÂÀxÕ«Ÿ% ‡§¶€÷øLA Ò€'aHËLõìkúÇy£Æþ*gÀ‘óú?<ÍqtR kZ,;êPTG/¦ÈFÄÙx|ì÷NÎòÜ6DËsàøÌöð(Ã3ú cËÕ§¾@š]}¾n] ú'®øù¤À±“eüÙgŸág——á³íÐs€–ÄŠ`ÓÄbÖ뺱Vš º(Ó7èò¹ê˜y:¦Q’$rc¹î¦ì:æ?ž“)â¥w„h¸yôsô´´>=)4ÌPd?ϰ›7tú­É(üåë-üß§§ø çSïí*ytŽ£$S”Ùw}U>ÄÚÇŽ8uÁTÌîß°õs¶—eABõbk ¿¸¸ÀKg;꨼“ržç^zv¤ú¹ÂüüsüûŸÿÿþç?Ç÷>ÿ.HhùÞc2†/¶ÊÕÞɪ©èý}1¼WyÿÎζ··ß ð§Âc·nY:j£Ç¦N:týFW7´¼‹ ˆ[ÛÉ>>ýºÙHþ ÞÀž×ËáÇ&ñ¦°±©cny“*ð&ß r†Ä:âäÜŽgó'ßv1Up5òŒ¯ˆTB3iÆaòIO†Ølji€ çgC6ž…+°Õeð  >ÈÏTh(\ªS:ÇIîú@¸ÿÎÔÎò]ËÀGÒž*{”àQºà4ßÅi¶íXÆâë#ãA:743à4ÛÅI¶W‘ïx‰˜ Å æÄ.U¾û4Ý/-÷=¾ Žqp}íi£ñ&?ÄY¶‡O¿xŽsÕ´÷ï?püÇÎW¾¢Yx~/„“.ÀÜJNdRÊŽUé2ä܇º[rtšc¥“bc¹Š’½»ÏµÜgjwgQâø,GQ Ø“R`]¨tAn*ŽuôÓd#FyéÊ7<ËB`"D5ÀØcHËÂç¢p™}3ºQmìéÂ^õ½,ö³òdœ-K‰°§œW~Ù«4Ê2M¸]x—šµ4ÅQQàéë­ ™©õ1Ðn­ÓŒ•OØ­XD,µ?Æ\’TtòôuTƒ?éxüíÚ_Ô·ÿ@)<{휘jl/ë@qÏ1à=Rk1 à (à€m®KÉo_PÝ”™Y‰ææº—9l¡u`ó] ÙwÍÕÈyûþe‹ÑÒÁHÃÖ5íd¾pÿ¶]ÐçÇÚâ<Ë£ÖOxË܈ÑÇzÏñ«úþ{WŸ<Ïoµˆ×h¥¶··±½½=d½ù¾² >éõzCÁϨqÝtÐrÓûk @-ó=yÐó€HGF³ÛU†¶Z0'—ð&ïã4ïUR$•æ,8ëÉBð$lþd“‘„Ia®Í6ù|Žc}¯üçë^u*åRÌC§ù>NCS3æ2$¶?€ÚªÉhúã@~ÓœÚÜCütë)vß~ŽóÐÿÀÚzÚÞ ûn,¸ •2¨8G"Wð–8+T]/^6VŸ!A8Þ¨}|ºõ1ÎIŸ vP²ãI¸Ê•NQ~ì<¬3sò¶2;2®‰—­—ÙÇ'_<Ç©ÚÇ™“AypXí|gQâèÔ²ïITëµÝíE‰ãÓÓÞ© Žˆ [Á|÷^Uê§$\p` ]]@ùy±S*8»1ðïÇÅ9˜ Ì8ÖŒ›àŠã_¿Úî'ÕÏO›`œA®B¹†lÊ‚zÛÁ`¥-Ñ’ÞÆÔ3ÿ,¸‰~}¦ºÐ6 c¨›+ƒD³èÄúRÔü^ÞÆ±ý1â¤;¬·w0øìòùú5öœK&S»Q%¿ß4Ñ£@ë$ ’Öx™ˆÿéí0©w~§Œ­úžÓªÓŒ‘¨±~­[qCŒwaJ6Ÿi{Ç(Ͼï{W«bæÛë¥S΃$Âk©WǰΣ\(ó> @7Gï±ï}ü½LÄØú.µ_y ñyÆn9Ó€ÅJ°…²naÅ>4ƒ’rOùcˆýR¤”Ô(È(XIƬss¥\³éë­Ö,i”õ뤠žú÷ÇuCs^ÉßZWï~ö¾ûùçøÙå%žnma;ËBq´Ï„´C'•øüò-žmmáŸÝk&,~w~í|“ºÿøùçè+…cŒüÅÖ~~ydH”á÷ç-Ìëéº_¨R°ø>|ôßçñ¿Ì[]ßIƒ’Qu H)’!V›BUcrœçP&ÇY~ÀàM~€xý1v.~ætäE¤³ï’FYÉÈlC<>΄{Íð{ ÞäûP:̵gø“ˆá絬zõøÕùX­ÑÙ——s–ÀkÐÓ ÌË5pœ9Ií»j]o†n²¦F‡žLÕÏ[y.‹éä8’hC:)Б“ÿì9gž2HXâ2<¬8>CFÕoøëqTC2¿Îsro‹Sdeü—©pŒ¿ Ò¡ddVÄÏɨÀƒýÅô+î:`á\|ÇgÎD˜«Ó|gÙ^ zyêä>öë6qçdç¢Tˆr$XH»Xh­MU¿ƒr/Û‘üAðØ¿P‡ü â,;wVÓå±Ò±i2%týCÐÃS—AªJÈxÔ”*xäSkM^‘¦½%ÖÚ–¡nInAÊJ†µNŠ4µÀ:Mm@$ ‰(OR^‚•l€ ªö“¦èûã6ìeX—%fXÉQ*86–%¾ê·n5ÏÎp¬vÒ¼t%ŽÎòðš?±zÿ_l]àãoYÿ}a%8ݶëB"©Ï*ÄcŠ›zùÀ)kwu†@Š[=oQœ¸Âãç?±uÜÕ«ËmæÝ‚î.ƒ³¼´Õ¾S«oèDw ²=˜–{,¦ëh·ÀêAn)ç0”ùñ·ø ¥Ý¨Ð4™ðY½~åþ×!¸Ä¼cäË À²ÏU^]D …7êÐjÅY50à°r$f8äÚ­¯aÞùâ{ÐZÍ,¬e#ü8Ê`¡ÎfTTÆíGÆ ·çÄZü83øÇ­¸P}̧Tå¿blFÃöØ@âžód›©œ“¿næå*ÒdäªùeS°Po öMì D’±AÐ$ׄ•#}íÖ×Ðn}-\ €ä-<”m¼-NñP."áÉËŸp†õËîz@]•ñTê™++3-‚ƒÔ±ç©äî§•K%X¬ë¾YWØ·žò4øp‡äCÛwüõ,{+u6e2jÆ!€VÊÂXé¾+!Ÿ‘àÌ ƒ°·8/ÉJPÞ~L‚U-»v¶ø¶z¯"’Ä¢3ô`Ö}¨½h¢08>us6ú‹›d;hÖ¦Õ²A[£Î´du®¨ekÏy•Ç€Û;ÀLª#Ž+޼ë΃¨‰é‚hð¹gZ¬¬àŽ)ýj«…µýzÌlÓ C×>Ë@K›J»ûÚƒç0úÃy}õRØËs<ÛúÂ:ëDs¢'˜·xŒôÆŒ¶?Çu)„Æ#«ªÞ›v;¶ÚËBYj¡1oÈBÔ±ð)cXMSÌDR*jŸê¥P«cšwÑó]ý* C¡ptAžKˆ“PêþöÀúÕ¿ ÅëôøÜ­oS^Kíný?ÊêÓë0ð Ï: R€ªýi%p޲'’ì‡f‡º.˜Mp{½^|qm–eCõ·]àûe“Õ4eMîB0âAÿ´k5î|D þøMUµ0ÕJ:¼V»´u4¨jS€± r:¸ôÀY¶ÜzŠ4™Å¥:Áœ\ÄiÖBa² ¼…‡¢ƒsuˆYÑvÀ®¨€2ÉmÓð»v¬¹gèYœ$„i·2 ] þ†m+KÜ0§7Þ¿g„… l°Â‰Ü§Û¶)–µZýéÖS…ªv>Ò5˜à@Tf²Ve&¤<¾tó *r£Ó|ó² €á4»è:ßižbžth¶î<Ò7f…7ª7“.rƒy¹2²Çƒß]cû»©¼Fð˜Ml×^â¾£HF‰^‹çù>æÓµHšÄF®·NÉuGÇ9Õ ”s»n¿‹­¯â0ÓÃåܬ‚4#°˜‡U°®6iøÕ²¤œÕ>æo3eJ•¸,©àŒ…ú‚°O$ÜÓ¥y½#;Æe+]蟨 ðóï  *–š‹ý\øL‰íãjºKÆ”¯, žºBoSfTaÐ?Uè,ˆ¡L@·#°½o3R0ä…Áó¿ß²ézQº†xÛÔý“ÿÝDÂBo„qR)ÏôŸ+¤ÒÎg Ý%æ~ÊÆ®Èª0Ö>tI‚3 ç=•áã­-Ì&b¼N‚#<‹¿âÀ õ•OÉãD­D²‘c˜¢¶«)wškß,*]”úıä£îZ÷€qíÇ¿.%r! \ZÃþêW¿c ³œcI(…õ„¹%Åû® ¤béSÓ¸MÄœ(¯uú¼Œš—ùæ`“$0è^>ÔۋҬǺ”•± ÈiàQ8iÔ8Y Ítø}Òkȯ'à+‘tf¥¦Ž#e iZÙçRX–rH‚Æk¤j¢f š:Cû@—“×wÕ/aÃ~| ÏòÏ' z.h‹³+ô½¡¾ä|ñ±~C`ïá¡*µòr+‹ÙÀ¼+rõsgŒÆ¹:„nhúå3!ÕìC«2>º>0±™“¡9Ï)îzËk¡ù‹4þêaÎâ3q…¹ñ\S¹ÍŽTëPìœ ž†´ITÊÇ0$¤WTYTø, Ò¯$d ª×ÞƒÆìX©+.ðFõ°4À‹Ÿ|æd+PȪLµà„…¾!KÍD”Ö˜©d(\·Ù¢ ÀÞÚ¸ø5!ZýÀ"XViÊÛÍqQ&}9ÅúrvüøR9ZŠ2á$P6g;BV¢f‚3´RVÑÿ‡Þ¾® )|ò\ãÀA+m;fáÖÔ¯_TÊgj¨äk{R/k¥¥äör5DÖx -#Ý9ý²÷æ·€×Û•H^¡ˆŦ­Hêa"fº©¸—21&È¡2ží9-¶—ß$5ïa•ìEµžÔn4Žqã©ϱ}æP×äcœÔý¨Ža¯›Oƿɪé÷¦k¨ˆ'c‚¶º}Ò`–ºCÉ(ãS€ÒׯNU4{ÖZˆ±ûe%[:t ßóÁK’žMe×õÝx_@öËÚ±ö·aW»q›(å±Â ±déPq«g‡«zût¨˜u^®â8ûM`ã½Dä\íaž¯Y­xºôý%;k@›TÒCÇ3ŽMf Ž?ꟾ~‘¤oú‡²‹ uœÓ¼x(–qQׂøie#uóUÉgð(]à8«=Ô2µ;óï"†{8ýá ¤®P¹ÛàŽTŸ“*¤F<ý«%vþÆÝœèàB‡ká¡\Å…:¬þZüŠNí\?’]rm”u!Õ~Úè`Õù¶8%r¬nXWhwý?m\'A¶¤Â¹êã¡XžøÚƒëcPD.=°ú>¾²$qxª‚þüàÄéBS†Î‚@ËéÀ÷Ž®~C®0í °¶,ñ›^†ôZ dbmH ¦‰Ý~­õ太”Ù7ÞQ âà„°î4\ 6¥4@!2£ºÍ"ãXô¦q¬ºcú+W:™çÓÀj'Åñ™ÂÇ?ÞB’0HÉ]6ÀZ§®, Ÿ),>8¾>RᑦX•‡E®°’þR踨Èÿ> ŽcÄù[œb< ì2¯É6Ža®c¦ý¾YÓ:ÍXÚ`« ØõÏÅ@Õ³ìëRZ9•kêD%þ5MãñSG|)À­cÁcFð¾úeg[(\'á¶és/òR‹ëûý3çõ¿‡¾™Ìpïe=pMžJ9‡àÝë5Ï—GIžbP€H«8K0+ÚØ¹ø´Ù Öžv^ì¸ë2!MY‰i‚í3‘ìŠa Þœ\Æy¶Üz‰å™'ûQT¾Õgødë„Ë<×< 5M½æG8•Ò.~–m2Ý2?’·ë¤âÝOebž­÷Áé<ï6:85¯?#¾ä2.‡´®¯X`Ó?QÖù&bƒ9+¨¤×ÝbÙ sÖ£_]M°Ú‘Ø;̃4†‘±ì©¶)ëOÇ{гÐo@ðê—vÂYLÆeCê$PÓΕ·<]_N±¼(°ä|Ï ç¶ÓñWVS¬¶­ WQôó å¼Ž¿”J¼–]ãÖe׋stSÛ‰ÓvRoYçâ3ŠYŸjÎjònžãéÖ–e>‰¼" iü£€äUÇê»®®>þ.±ž¦ÖF)tj2I¤Ñ^•Ò‚ôל¦qú÷bÀÕ!¤ÜéêIå&/GYKS¬Õ̃ßo€Y_ XÍ9»Âº&îšñ…ÐÞÖÀjàÛnžÒ ®¡›¶lS€ï‹z½ÔfEJôó™1H½3)è¦çVTL5Gd~êÆS¸Ÿ¡~cDð®üe¨dDqøï·üÇͽæåÍ]¯E·ËÞz­|H8½6ÑšàõÈéÎor,Ã쵨dÊžIMð’ÜÚ"T™{ã Š-C]zúË’!Q}Ýñ20œ}|²õ‚ H>ãj1 4†22L.ã7Ù?Õ‚bŸÝx«Ž±>÷Hykh®§»åçê³É"ÎU?H­´Q8Í÷0+:¸t™…ø8ÍR­«Í£?†Ï HH!°²” XYìÙvu1´Š¼Ü¬´'ÅîAnîj –$úu²¯W¯+N¾ö¸<û¿—ÌjøcƼÎÿV7'ÃñÒ§¥ùûG :<°.CãqcðÅð{.€Õ8oÚZ‘›î·{ð« ’òz¦ö¢8qò‹uÔÙ…ÞæÜY°wkY…«ÐÌIŽê26¥úz¾Û¹Š»/’¥R¬dóšbÜdäó7¸i­‰gáYƒ»ÏíΙçÖ•)• Y9$ù˜ÞàöÖ›£Üw’w ¶½#àšw9'œ '•º¹ÌÔ ß×MˆPG\…˜}Þ6åJ+ÎI·¼ù¹0̂ģÍÿûÙucHšr½`Ä[ ' é:Íÿû^a„ÄiäùSçnÄÞá˜îÊ5ÏABì6í=¶~Œu’2~Kç3t Ò{Á4PŸÕ;Ú`ê~û-ÿe{®ÛbøR—]àÆý}lu±ïs/µbïÈz›Ï¸È¸~¬ãÆx{çÐTÛð>‚;??Yž`µ- Þr¼;uç8ðøþ@þ8P;ôž¼ŸñÕF ³·ePP·Z¬Ö§ûVæ×]F-æ¤$¸¾vÿ6ÀÚ]¹²¼´Ç‚m1Ò¾ôÏÓ˜c¿O~€ÝL“‰xY‹Qõ“¬Ý]™çûí·ü¿`TÖîØ~?cºkã¦pxÜßÇ9¼¯õ ҭĦÑïÄý–Øè‹[ÝÕcúÜ&x´Œá›·;ÄÏ—x݃Ã/ïܯÝýv×7þ[{âwøßu {S¯ý²ÍùU·»šÄ½þ7?÷sz·AÏ=»ßî·ûí~»ÿ÷Ûýv¿Ýo÷Ûýv¿Ýo÷Ûývþï·ûí~»ßî·ûí~»ßî·ûí~»ÿ÷Ûýv¿Ýo·²úÞéâ~»ßî·ûí~»ß~kÀ¿6 Lè ûÛ¾ÝÏÃýöÛ¶Ua°w”Cæ~Î&Üšìų ,îí ¿ts÷eX³ûëê~»ßnü›[ŸuûÕ¦ÀY¾‡Bg8Ë÷Þ9ð½k@Û6BÛ»³À}`2å|áîÍ—Û…ÛïÔ¼˜‘6×ïkŒþ¸E4gwa U4a…1ØÏó;ŒîÚxîx4wpîîòšÝå1Þ#÷Û—üßø,A­‚6EøéƒÂ=þξ@u†Ó¬¥³;´Æ¸‹^1JgÑÚq^5ssÝk,~ÿuÇs[×W®ÔÝ[K(mî 뮵qr«@¿ c|×À›ÎÒ*w »0ï5(´Áî¡ÂÎ  £0vîÔºsÜ¥ñÆKþç]fÄñß×Üݵkè&Çx[ë탑Ö(Ü5fî‚ûíKþq;2 ³~…ãlÇ=¦Ý—Z†“wÆm0ÒC¦/pšßÀο7¶»Â´ûùRú-”Îpœmã8ÛFV¼Åi%s£ÇLƒ>¥× 2i0iŒ†6 §ù²â2OQyÏ» ´)p–íbgèæäúN°Æ…¯Y¦Ñë[@]¨apiÌ»aÛ: ÿ‡¯Ak`鸳ܠwhǨ”Þïj\4HÊrƒ^?Çå Àö~Ž_÷2lïçÈr7 ¼Ë9SÚƒY>”Ba t àð€ä]múï}¡Âìä9~eØÉsdÆÔ‚ÇÛcÝ<˜±÷ò=ãÆv“k¬I@yÙõQãjz<ÓúV¾»Æ~å®±·ZcÏ]k÷Ûýö¥ÿ€íèêå87””õ…@™Úä*¦ÀY¾AqiYR}Q o°™0 DmƒÅÛ;þP›í¢pc9Í÷ ô N1xd\75vÜí\ ܼíÚßÝøš®ôÙÀoJ¿½F¶ÀfH SàÄ­Òœä»(ôÀ}i–™$ŸµxWò2m (`d¹Æö~ã»ØøoäøÕn†ßì,x¿ÄrÞaŽ,×enbüIt¥µÊÀ½ÛÏe.X™r\71¶B[Pßëç¸|«±{ak¨Â”ó¤4¶ìÚ^ìcª0ë{SëÍ(ôòÇf´F/Ëi=|wò<0ß· Ì2c°í€ö¯³ »Y†\뜌k·5>e r7G{Rë³tî&ð“Îß÷~ž»»y¾àöÜÜùõxwòÛYvm°Yƒý,Ã¥;î¶°w!€ÛÏó0®è\ã5¤AS¦uøœÜÆyøÏUî~Üñ.üçñ>¸ß¾àßùÄMÈp<€ÍõN²œfÛŽégîù¹¾Äy¾bŒ%Ð&¯ð"1¾™A³ü ÇÙo(ÍXì‘ßo0Æûä,ÁƒdgyßGz€ãl‡ƒ/pœí pc©Ž«*¥ª›ÿ›’Øø€‰>®ÂyÞCa”äü–qA_QÉæ½ÆZ¦k)~®pÁ›6ŒÑ0.0ðÙ€r-߆ñÕe&Ç$Án³_õ0ö3\¼µ ‘‚Å: ~Ó™ãök °ôH„ÆTä…Á^_À=N­¤ ƒ½Ã ™’ÍÞs¿×·RQ8e!X)Ôh°ÏÜyös ²É3.¹‘ýƒ\CiΖæ«]|ÉH ü˜37G**Ea˜âÀeÚ`ÀK£Tဆq £Öè+…9Îqà€¶DŠH^nƒý¤ÀÌlçpòEãA’ǰ|â¦윴K7†Ì¼5½šù¡c½ ƒLe* ¨Ô¶¼uë§ŒAfLXK -„}[?3âüüû{×X_??—Æ`×­C¦ËëkLykFÿöë3к¼Ö¸ß£k¨Tš~•e•&s×XÝy\%¨£—Ž‚ ûÏĽ h"(¹Ÿ„÷þ= ÞG®³ž¦@u€J›ÜiúsØ:Û¼™d å2>Ü|‡b¹P œÔdçÙnãò=eðdÅeø]éÁHFb֞ίÁl²ˆŸ¼À¬X´ 6Ì¡³Æ]:.+áR*UaÈõ5£Î+H¤ŠKœåû©Vu œç=˜Æ€‘5f& X†Ï¥õ"*¬¥6Úoý+Çg†²*ªHUÇ¡&^wšÑFá,;€6E8óA^2É,Æ3ãú탛ѹSZƒå%W=AgIàm¦±}`e,ƒÜ”u‡ÊcÀ©*n€mg%JRE©«§‹RflVÃ}¤M.p˜`ã@Æfl öú9”2è,I¼úè1çEo…{O\8­ —Á(Ê:C‚…8Ë2ið¤HP±{˜a÷mV²›Æ`Q¼ØÜD[¼c?ÅMZé«ÿ+{èE2‡„1t…@ÂXrÖ¶ÝØ<›;û–d*n, Ò@H;}AZŸ ˆï”4s2pãQO;‡¬&ኂŒé7ye ~ðøkÐnnØçG«Ì¿£¯Q{^J‰Y|Œ› ,‹( CƒšÂpư*€mî/é:Y—"Ò3{o¶s< –éQp3‰Ìо>'¯WÆ@“kÄgÃÆeo~ÛC!ºÝ.DtýÝ·;F^ÚoqVOÓÚX…ÙåLà¡è‚3˜ö“l’y|øäÒỦvÁ1³\Êtò±cÅv—E¡Hω•¡]\ÌÀy¤eÚÀ¨:®²8ÕëÖߨ>fÅ– 0ñWµe´ —­='¡QDšcoƒf[ÀI³>(:sÇ)Ü<Ø: ãjì˜ 7¯“ÝÀþ7í2ò¥3œå»–í7EÈâøqP™ô¦èmãÄ”^Fäç®ÜWuÝG¯¹ ™m Ú‚CÓÆ=¸Í Ó€bqý/_´šåÚz I:KE€ t¢È*— EÙú»n( „y(æ£pì¿Öå8x°¼Xe݇Éörüª—aû ,Ô¥ó?j<>aäjµuö=‹ó‡ÇÕlB¬Çg/ö2¥±w˜‡lOÈhXøàoâõT¹Ë6xp¤œT:RÂäDlcƒ¹kÀR°ÇjÀ¯°ì‚‘E! ˆî~›^ÏÆRÀØI€Ø8vv 5v² ;YÀÍHø}Ô]aŠ¾Þ½6Ös×ß&f¹°¯Jàè÷ëÁ¢2pÌ¿ ÷ƒ¦óªá“È„ÐpžÀ³ÍÇX"~|&Ê2ì€nHPKk¦ B0©T…Õ§×ÕË'›X"HmLt]ïÕœ¿ÏD)hùsè)…·î¼¶'>ýùÒ ×!C”“`‚/šÑ IDATeu{ÌÌíÕ#$IÆ’$y/ úËÂßgÐ1ÉØüÚÝÖ¹¿¤ “Ã@WÌä±ÌRmðP,ãÃ'/1+–p’íà$ÛFa`,ÁCÑ7ìZ§Cðpœíà8Û®£2ññãç,hÍq”mCëÿÍãÃ\Fbô¹©TN“©‚Ù0d8É{È mŒe²Ï²½ ÃÞ$“)ÿf•LÉiÞsó0z\E¦ÌˆÀÀ^sbœq Z|î´ôçù a¹ë‚.Ïöû`BGÇl™ðþ,0÷EXs[CRŽç bòmbß»KÀ}å‚‚¢’ýÙY /£r°f~Ù@.ï£ÅÛèëFÐéY~ZDÐ!Ð=­TD• :‘{NS¯Í0˜÷+ d¹©Ô-$;å=ú½$Gq¢Aɾc³÷½^¾0¡V¢wañ‘À«ïn¢³$K½©Žs¯¯Â{©#Ùà òzàÎè»6àX^²l¿Ÿ!W¶ö`g€ý Y®‡tý!h3epã³=^¶¤\&ƒfMb‡£¦µÖÚ`ÿ0GQ+RV€ˆ!Ÿà8÷æe.L]ö2¥ã€k ~F1–‚1,C¥H««µŠ—#ä&±t¨äî)tþp¬ºŒD ~›Š€9k,±áø*æÏÇÍAÕV͈qÐâR<úÚ&öCﯟ¶Œ éLkì@~á@3=Gÿü> äF­OÓ´.0£×•c]S·o¿:zÞC»±úólºâñ(c°,žm>†Ö¿ 0pï³C¬)sC²J·jÓ4ÅÆÆÖ×׸¾—×Ü}æ?I¬¯¯ccc#·ÆükSà:Ĭh;†^W€d\ÛÄ‚z0’»°Ê8,È/ŒrŒýÊ*Ùýrÿy£”5ů¾¨³®_/06„ù(Ûõ6ð’‘Â9ÝP¶x”¤Æ g ÀØ8æ>+.p–í9¶ß³gê …Ïf(»°à"D³*œËv­T§º9±‚o?yYÑëT9’!?«ÁH@æ!ãs’mCéAåÖX öâúæË; Ù¢hs ”‘r©¤ÆÇ 0cð6ÓØ?Ì,£¯‰4hT†ÁÏá~Ž‹K=RwQC”A‚ÁîAŽÅy‰WßÙÄâ¼@®|pZjüÃß·?ýœéš±Ð~a=Ýc~Mc‡£ºc ƒo®ÌàÕï<<+=< ÃiˆŒÂƒœ˜Í޵÷u›aXrBQØ8Æu;_·ÑBÍXfK‡êöIµò^Ò3Ð0Ï6c…°Û1Xç çWÔ€ìœHE<ëî…@€ìÀì¸"hmû‘ccÙñ\kì9M¹ŽÀ= 4Q¡w¯&;Qg“YDR_g°—eaŸEC¦¤nžAŽQg¥b‚LISÆËh ¹®ê€?eÛ뮇º€‡~ƒÇÇŽç8#Åë~Ž #d˜[ÿùª»îã,™=ßÛ³V™ÿ{·ÛE«ÕºUPy¿]ocŒ ­Ïm¬•°¤Âl²ˆÿú+ÿ3þ¯a÷ÍÏð(]g"°¡œI,¦ëà,±¬¯êc^vÁYR³Úh'EÑÐ(p–÷+À–#Áœ{Ÿf%;{‘÷Ñi= ûlNõg¸(NÂñ- }‹SwÜÓ|ór5ìçt€kDzçx“ïa±µ€ƒ3Æâ§ÀÛ³éŠHH64^;?˜M-£l¨Ï# Ü;tMÀÑÇ#¹ Î&K÷T¥VI n®f“Eœ«>ÑÇÛcÓý{Кïc6Y`À 0Ÿ¶1':¸T§˜+¸T‡8Ë{`aF¹Í®¨}ÐÁP¦dT¶Å>·ïæ’‘sÑîz`x$Û0ú½þ[Hɱ¾œ"I˜ÞŒASÞ\Ú@$,hàísýc ˆYŽ˜p†n§,àõÌÙŽ“¾h]²ì;]ºÑ,/Iüù·¿û?wÑ?¶Àuÿ(Çâ¼A•ÅcôÀV$,ÈYz‡98Ôl2Ü>’„‘ $  ÷°¼(Á9ƒÒvì…ÓÐïdx[`|tV`eQ„àadö£2~°0ææ–UƒŸI¸—ú(Ú®SgAb÷À‚7¿O_ ÜYÕÀªf}ã±øà‰1çк h|@PŒuFzöc~™C €U)‡˜ìQ¬r“D¢—çè¬ YŒü1ŠTÓãíd™Õ©;}½v²¤nš±µÊ˜ZÑ1 ’iˆ5ç cCÌw/²>e6œ$*Ã’µÌ?¿ãœaŠhŽâ9e¨ºÐ£$B>Hî»`ÇÕ 1ÿ}™ÀÖLœ’ý<×= žòm)Á1^–{S›'„hµZØØØ°ø§(°½½¢(* “þ}¿½Ÿ’:B¬®®¢×ëa0Üó¯MSÕ =C%)ãNT(ÓkPm¶TÑÍ›’^ý}ü·Oþä²³·ì¦U™² •J6ê@™g)HóÇ-å;¡ÓT‚.ñP.‡ GéU¯ÂïMÇ÷l±g¢K |æÇ³ÄUVYc\!n©£¯²Ë&€KÔŽ‹Y;'»È‹ œä»n,»a͆³¬R/ ‚‹Ž²ÙŸcV,b&YÄ·Ÿü5Vg¿†9Ñõ¢±ôœfÛ[OZxëƒ9±:RZFk “Á˜ç®à˜3‡$xœm|¸ù³¢ŽaPD™=LP5?7ÌþWåoŽ­ò,½ÔûŽ5Þ¯)ø, GKö½tŸ1•lg¡½ÿü¯{vÊ÷0Z”úúPÔjÎ:‹žP Å¶ õr  “­Ëμ¹vÌt”9(È·÷­þ½ÔÅ畚‚Åy—Žmç h;½"çk l„ªÊšÆX ÜÜ}F ËMm¶D›2»ÒYøá÷žà[ÿnÝ% ø#ø €¯[hZߢ!+àƒ:_oá ží¸\²(À8ƒ1m_è›;ÞUYÆÑò /éP‘L‡‚Ä¡ßë¬  Ì#O]¡qS«&hEƒÎÝÛ‹Æ5À·ffð÷|€ýîï¢#Ey˜DTþQ“ÑÐ5ò¨&I’"úñAd!ê³ ûYØs*M ûÂdvž>SBÇç5ìuE±ÁÊÓÍ•ª¹&ü>c ;j2C!Ÿ¡ÖÎFÔ?·G\¢5’ºî4`(ŒÁA$ã¡k¨IÊ×xè†ÏÀ¨  #ŽGÝGû£kfõä ~v/77mÐ@ÏÇ}nÞèúzÖŸjÉ}v – Q}ùm0Î÷‡é·4MÑívot˨DT üà¦Íð-^íº‚†Æy~ˆîƒoâOç‡Xù:˜áA®ÁX‚‡rÙIƒòнäY8¤Ì±n`t•~KØ[erÌÉ>Ü|ŠÕßÀ‡›Ï1+–]·ß·•@‡‚ÇxÿTjâ›V)ã$Û N<ñë†í'óÚ1Ÿå®Uã$ÛÁÑà×8qþÿç5J]P®••»`¤[‘©MTÖb`-H­l‹ƒ1Žõ™¯ãOž¼ÂÚìà7Ÿ‚!ÁL²ä÷äÖO5¸ù(̉üÑæ3Wo¡ˆ]çð9 p’õùšhçõÅ ”àM~ˆY±Á[˜“+à,ÁLÒÁ›üHxŠ˜Úú=ML>¢NBÙñ$KB ³ ÛM±—áŒd¬õ„ųç…ráúÀ;;q².ØWZ œ4'Þþ0Ð¥;– Y{Ï2{±øHâäTáÑÃý£‹^|dm|®Œ¹àI¹óEsMÁáx—Ÿ¢0d^n¥+ïf( ›Õè,J|ýñüäãðãï€ö‚uþñØAFW-UUÄòïõ›Ý}ªµefZÄìÉ8c¬V wŒé£$Á‘Ê‘]aF©l‚jÖGÎɈBQUv=8ÊIà€6ŸEû¢ û$²tM26 `YJ¼|ò¿7;‹)-# s¸s65Às nš³<e—cmx]àfÆÈ§<(Õ#€lÑPˆÛôúw®tîõçÜTô›Er$úwÝúQ£³=b© ÆÝuG×0wÞ¿ °“eàºBÇŸIÖ¯NâEŸÕ:Ès|sfó;¿ƒff€¡í²(½,«Zî’Ì‚Ëm²ÿÜ{ÙÏX)‘›Üt±i’$hµZX]]½³EÈT.uä?±ô‡±›»b8Üë8Ö3fÜ=8ó’µL´]FcV,áOž¼Âꃪr <m|¸ùsreè_ºÍdC ŒúªcomçÕ=›áËàŒc.Yc,Ha”Î.|~NÒïÀ;5u u¯£™†ºñZ>¡Ú­´µ,YíÒ}gа¯IÆNÙwSï¾D;o “˜Kx(»øÃÍçÌë¬öZ²×Ç|ú,¤_żôNKfèZ‹¯£²@¸™›‡²ƒ„K<”Ýqz(—ñ‡ŸaNtñ‡›O1+:0Ð!ÓÀY‚¹à:¥«Ajm€§ÇÊ«†¿4fD¼ù›Ë«xùÝÇè,Èæ•¼Œ¥Wµù,ü÷ýŠh t$^}wË‹ÒIXüsv|ýãKób¤Ã¬£–*Xf°:úåEWßµVš~~V–R¬v¬L Ú¾Žs+ 25ÈygLMDE6á‚’8xÑÆÖ¼úî&: ö˼³ ±¾"±Ò–àÜÕ#0+gZŽê'Xôs’¦_Cçå;Uµ^MXYô[2ÙU 2ÐÌ/¹*Ó8ÊI¦xòÓùŠœb*îJ$ã0©Dctˆn·Ž›'Æ:R‚ƒ õ"è þÔ­EO9‡AžG¬OýšdùP‘*ŠNRÓ­)Pö¯íç9:I‚dŠ9U©fÜÿ| 4ôÞnA“^GuÓõ¢½šÎÌøûža Qu&¸¢Üç›aŒÁ%i6íø‹ÈšÖÿ¾$%^=y‚¯ÏÌ@2†¶öÞæöëëfh“¹QöMm¸O[èë37] œ$ 666°±±4Mï¤Ì†Jß š­¹×ݲ ‚ëï:04Ê‚Óß.­»O»Pê€:ŽyÙż\ƒ¨e€ãñÔ#c®»õy}7c æÄ28“î†ýùcš XáQ€‚Éòu*š[$A%À]«èýYÈœd;a\…Îp’mã$ÛZ¯IcÄ&öÝg"‚ Ìe†ìZ.ƒã¡hÛ`JvÁ¢ú‹ëÎ~ ÿÃ×ÿÿýÿ fÅ¢»=²álQíu§*Ü™6æD¼ùÊ ÌÉÖìx³Y¤‡.(ƒ‚%œev ‘XM2ŽÑŸE‚Ë68cè. ¬/§Xk§€AER44øÚ9Ȱs]=ˆ2,3fÁj*ÎBbƒgÂrÛëÀ`i^àÕG¥ÃÎíÞq‡3Ëp·çŒ6HО—èvR¼úÈ-4à €™ ÿÎþäóH›„Qª–1;6нÚóÏþÇÇh?’xùM|cÓJ^}´ºÓÅÁ¤5Ö4 ëÙÏ67±"eøTPýù@kä9¾93ƒ>y‚egGxΈ²Å,iÇàzf3µdäÌ^§·Ï [Ûsì©!ûÒÆà7Î’ó*^úßGƒƒ,ƒrF[<ßÜDGÊPÔz銀Ÿo>F[ˆ`êÏq'Ë𛨉›îò®0/ŸlbYÚëÃ0ÔÊevôÜñ”6X‘¯67+Ê4“Ðýä þ`v¶Rg0j GQËRàoÜ>yÍ{ã@oTÖfÚë«i_«B@ïMhe.÷|ó1ºDjØ‚Æ5™bE¦CÙ*ev&í‘gê)–Ü5Ö•÷XH¿Þu³¯i|Ï, !jeA× Fè>ï’ôÇŸ³×]ßmŽ£Vmøin´E-8· v9ª¿&·ƒ9±„Ÿ<ÇC¹Ü ÍP‚°q`½¼˜Ê6¾ýä9æd·j5Ii=¤·ŸÖIÿ:V²Mâ>”+NÚ²$+öË]“L€¶M«*™)%,å|òú‡1`LXpÍ8Ê6>Ü|†‡¢íVOcNvñá“—CëÇÁ±6ûûøÓ'?ÄúÌ71'–ÀÁ§5îøÚ9Ï0'­ Ü^g•âÛgY/d–8 ë:¥¡‚\K ÆSÍL;ŸepYúÃÿø¿‹ÿÀJEòÂ@k XëÈò›öùß?Ì‘eÇ9>øÚ ~ø½'è,Hd ¡­g—9gXY”H%G{QØî»W :¦Âw¢†+®µ™‡B›©XmK´êî…†œ6ÖºÆ<&XY”ˆ ŒÙ ãÀ76gñÃï=ÁÊ’ÄÒ‚…'…ñÒ)Ò=™{Ôyiº ®Ú!ÖlV¹­ij3Wðrsߘù>-h‹š¸œ1¬K‰ÿjv¯ž}p© ðUø%\×ÝTdv…À«ÍMl¤):ný4PqTòk”R  +%ž¹ÀγÙËÒÚ½šº¹Ò#Ö{Q¬¤iòkôª¸mIA.eü©Õdøô¯»j6Áÿmî@÷ãx|wu« JÆyÔó¼z!*üÑæs̉nÅ¥g<ˆ¬Ú+žf=ÌŠ6¾½ù"€Äa΃Ç2¦çœcFÈ.ôD {’˜‡a.iC°;Õ¸¯:GÆr>ÜL ²Gu¿-ë.¢³göÃ1žöv˜:ØYNr;žŒá¶Ç(Ûøðñs̉6fÅBÅåˆpMûœ\ÆŸ<ù+¬Í|}h}MÈðlT×ß7Š+³B¤NÚÊÆ?«\g6hæ\À‚JðÒ±×y^ÍÔÉj(.ÆhÚGÇá^ ðÓ˜Òý'• Å gµ>còëÞÀ:)›¸êìcþË£³(j>å¹wÛ«Z‡Ç ós ŽÏÍ žä¡Ø;ôTГÕ$Œ¦-œ|ƒ0¬yP+ò”^–yZÖÖÔ€]/»øÑïþ.~üÁø`f&d"¼þù-9–` kNÎâ3™)onÒ©›ÈÖÑLÀŽÑ‚`5óšR¹‚ì6 ìgyp´éJáîo,°Ûþ¾¹"%ž;P¯#pLÅC7Mƒ³Ï•:ü:™Qሠ ›¦èJ‰ÃÒ£8Bkn"àAøžk`·$%ºn>º.ÑZú@Š l݇»‰*Åñqu¬æ:ª{MGÊ‘nVþ\H¶é}‚ÞX޲õŽAhµZW­”qÿ20ìï;8ˆƒ¦qqÏóá[»ájÁÙø#`—cNØbQD`¹Ôú?Ü;ž¡ú|§e7ÄPk”V~ÈÖF×!MÆ¡1'—ñáæ+̉̉÷{ >àCÁÍÙ” 5°Ù¦bjo(Vg¯ÁÀ0Ÿ~Å*ÎóÃJC²:æÜ6)zëÆ¦86W JtÔlŒaN.ÕØ°šZv¾îI¸žª_ÀºáØUÐMÅÅY< žbḞ±Y9Wóò+•àÓü¾“üجN,»×Vú噦 øê¾8·î5«Ï¿óß|2‹ßy|ä¯*ñ™èš3®³ï‚¬½»]¢³7ºêO¿GŠbƒdŵ#¥—“f¬S;oc³Ë‹2åX^”`Ü”à{AbG»%{G oJÏsšÌ„6¾ytíƒ1Vôò£ÇhÏ ,\EÇÎ# Ü»iÀ¾6ÊèJР¬y—"!‚Î~UW›°7¡ CР÷² EÍ™%.(ˆõɦũEM}ƒªÑûlQ©ªÌIÃêêŸ?¶Zôv’àÕ“Í ‘òA'²qõR¤'y±÷*7ÑW˜¯½=&c KBà/Ûž?~옲ȸ®¨<„®Ä} ¬¥í²ûçÏ•ÁfG(¸÷ãñÀŸZÖš†ÞÓJàö¿"e5û}˜ Xÿ›¾õOˤO+í¡½Z­Vøý*ÀxÆý}n´L#ºí€16q÷托Vè4¦ó{-Á¬q–ŒNî$#Ô;ßú½'C 2bçù!f…³u€Û»òL²}£'e2þ N9æÓ.æÓ.Îy¨ Ƙ•²l¾ÄC¹B@'Ãäñ׫åJç®@yV,ẑgÜiÿyCaHC4ú¡²×FµÇ§*覙úà±Mn~ +çšǪׂn¿å¾JÉW`VíA' øJ™[uÎ; /¿»‰îRŠŽ¹‹óû‡%[]èÛu~húN0Æ6ûò:ûº@$#þþþYßwï0/ÇÙ}6¹ñØÚƒƒÃya‹~_|çkø½Í¼øÎׂξ=oÃÿý>‘Ôøsùh+¾ 9²57žAï,Š<ŒcÁCΰ¼`×wÅÍO¯Ÿ¹:ŠÇ•¦aMLãs…/ï’ÔÏ67ñÙY|LtÆÔzø¡óð§g©¼Mk™%WÈÚâËλ¼ n†ï3ÚI„…À¡sgY‚_QÌAd=ZdGe-ŠJ¿íÀãFšbÅGëÑžÔÞãJV~Õ}ÑRv˜E™”ض“Z°²è¾ë¥*IܹÖ4ƒG?7=Xa¦yÜ|27mwžTÚnÍ9ÞºâÕX7Ok t–þºœ¶”xº¹‰%?.—‘X‘/77±ì®íe!Ðb kN~öòÉ´¥,³#æhÔ8U«ÿüu¤¬]4ÈlØç^žCY­Õ•ÁsÛ{Ó®0£X|š˜öÆ5»i·¡ë'ãÎï]ŽwR©Ò¨úXd 3óÔŸüƃtº¯¬âÛO^`N.Y=ÿãçá‰FÈñgEÇùÊÿþXÀ]²c@\'Ÿ™7¶%ç]ßqN6–bNvÂ͘veݸ”c°u…/ãL`Vtð&ï;ï}UÊWžXOýÙdßÞ|…õ™oâ¡hc^®âÃÍ—˜Ë!;ñHnØ …“JU±¯h®¡Ð¦Ëúb愵M—+D²Eákª×­µxŠu=°¶2œzO~:ÿ4( Á£ x:Lb.±E¿†Ô–Ð~ ûµ({;(bª‰ÃR>²°ý¡ìºójG@`yÁzꛢÚ1V)]vßu ï¸;Ê-çFo$Î?>•Ž¡1KJï€å%‰—ßyŒfM$i§iW4[àÜ!ÛóR0´ç'—CdžSðžp ³dçºú…2Õã’s÷N=¹²àåùÿ´‰åE1Õç"f5éXœp`i^bÿ0ÃÎþÀe<ªkê3,MR«P8lJp±$d¤3ö –£”9xýWˆ!ÛHÊâNê¿ïLü~¿53ƒ§››õoZ+á4ðœ×ðË \{ć¾Nj3®¸µ)Ép[•åôàKô.æ¼ YŠ—››Á¿ÝÏaÐøbå¢)›bªç»,]!¹úäúñ¬?à*’§Ù7 ÁÒ$Ú|غʤ8§9S dêœ{êú9˜)v<že)Ñòõä\™ùÞõª-mü·ffð·N~öõ™™€¾93ƒ¿qÅïÓ$qVÀÏ£oLÖ´B!È”)Vâú:?Æ@Dü“ç:Oþ«ñëd¼þš€#v#j jÞ%óß4–IÎë] {ÉÔ4AB¼†œÁë¯Kæ}÷L)o1„[+M«·N0KC ­š ¨;AŽõ_ÇŸ>ù¬ÍþXƒ©™Ù&Ù„š¦ÛH+kéàÃÍçX{ðug=ºìœú(ÌÀ9íl7§ilCÀÜyÕÏŠ “;yMá$2´úqù÷0–`>íâ‘\w6›óéþxó%Éủ•Ê|Ö±åtL'Ù.9—é˜ìêÜ-â‘ìâÃͧ˜ªí¨}­›íɰçìRõ$G£pcî5ÊoB ';(Û²¸LƒXvó*ðP®;7 c€?|üÿ³÷åñQ•÷úÏ{–I&“Ù“™l&‘$€´µh‹u¯¨­½ Xµ­K«Uê‚·ÚÛÖ¢Ùi©÷öw-T«õ¢ÕzU¤[mQpc…* „E,d›™sÞßg™33çL&“Éïs?½Ä™äœ÷¼ç=ïy¾Ûó«Jƒ~_‹¬–”¨@£Åó@A k>qΣ„0&ç˜Dû€A¿ˆ _T;õFkŒ 1:!OÅ }G”NЪ ¨šjCi¬Ç_© Pˆ´ÒWìÛ IDATDK«JVUÍF#A%éÉähRÃ%/®~B1B¢5á Ed4SÿUçQëšU7¢j¤F@²ý^«ÝàûÑ3N64|Ó¬ ¿VAa^CÑW8?žÔæ‰ÑëÑÈ$-ˆÔþF6ѵ׾³òÞJjZ Tïk‘šNú AQ’§ªÓ‰©Ö”KóÎjÄ‘ÆE2¬TxâÇŸïï¹%òE%W>+.ÅÆ(IJˆ¢Û.ªÿrqi8FB(Y]­¿@£:Ï>^Àœ²RøÅÈ3t|õòÛý†{?~íwb .¢|g–·Ÿ›oœ«T¬l^%ÛfžsÙÄÐ(5}ÖûŠȆM¯Q%>ãìv,(/G¾(Â'D˜>Ãzô –—c¬Ý›ú}L C’ñ£7Úý£jºŽÜGm€O°Y+6YKáèç8žhjä3“4Õô’tÉv<±Öú 5éOűRÒÒŸ†:E)Õ/«º N}º£*é3ÊæÃ! ÉaÓFZFÕ¥—U)FÇÝ’¤™ä‚›Ö´Wàêò‡àP=Åf*,’ª{¯yjD7ÉNŽpp‹8ÅáàµT N÷ÌUuú~Ùk‘­ØÔPЋXb.#-\²h´¦)"]]¾…9ãU¾ÅÁeËGqN5f”?ŒÁjHÕ2 G»Çw–-Æ.[z²Íæ.Gð€C6óY´ÇyáK!ºÍçˆ#<¢7J¾©¡X¹l.¼Á‡éå á‚z …ñ^(ë_‹²ø CŠ‘fMœKu)àò¤Nã £hã”(€¡K,„#®\Ëî¯ÄïÕFRáHT±&"+mC!…Ìv÷J1žâ˜gAŠUœ1Ë™WòÚ¡+ëhxSϵól(¦–b „Ô@4Z¡úX2q¦Ä´¯€1Í'Ï+êWž#x‰UNU ¢z¤…ÆjžWÒ|@£‘¾öT¿G°,6ß ¢Ó"Có¼ÛK!ÉJ£1çéÿoÍÀé+)žÔòÆ4И‚H£g6Þ‹®5¨²ò®kj+Zªˆ1%Ãl §êßhJ2 5bk ^À¸œSšUE½³ÄàùONþ‚ÓJçÁ!xÔÿö`z鼨œeÌCKô—™ZCl.TA(Þj“ÁATë#ø¤d™€ À^…e á|ŠÞ=ïÁŒ²dÁñps‚t'¥2އšÔ~ujÇà£1ócE‘©¬Ü' O¶ÕkBŽK©é) î…1^x37‰Ög YäÈ]2ªµ™çD5Š"$£kÎp+䄿rP£Ê\ëý-½‡!SÓÊ´4”ü1yí¥ð«]b„½¥- ¿[@À§tÖ½†Zž|DFCK”ø‡ÂÑ—“1}ähS -!¸ZÛ#*¡5Dün¯Mibå‰Óô§™7!˜râí%HLù¡ GcT†úc r4Í{í<ø½xN (E¸Q‰U¿':ÏÚ<ÆL‘E]cGC)ESxÎ<=)&²£7'#1ÆÑŒ.¨ïnZtB’Ó )UÒ˜GHj˜˜‘Zju1z`ê'’êY×d#å„P±’ç/¨dˆClªHâsHE«$Žp©ùõ «ÔøTMû±ö¨4)‰‹œ˜‘íâ£W%i~‹h„O0¯\!Üf$[FT½è±ÊJxMw´ÆMñéHõ†Ü÷¤2jN O”ñäÛlXP^ޱqQt† Ûfž?Žm6© ”Œ*6‘•Û«!F§$YGÇhŸ*[Z Þ³/B½dYר—M<çñºøñm.C†ž AÐ 3練òFÔë6þì¬óúµµ˜¯>õ¡ü¼*%*Šªë˜ª†Q½¡v#ÞÊ7y¶L×YY¼ªä§dõÈD"'¥tPå*5’;’˜ÃQà›J.¿Y­ðv¨kR)&¿Wf‘ .Vc>ºcuÕ# þ1‘C …ãÉî¢ùÕño9£G\RåãÑ<óÑθRŒ|f_ˆ7Hô|rõÿ´Tãù$•ä'*Õ#"÷@¢dHȼ˜^6_É¿7¹.ÅÃ>¹¢/¥ñænœ ¹¢OWº! zq­2†F}$VÆbðTÃdûÑ¢’èßö¤hë7é‡5©PëE,'äðë^x‹zJ啨þF—€BûxÌ(_‡AAˆ” 4ÃÍg´AOE0zþC ªje(i„Qˆî]O5«ÞzÙ „¯dcLùѾӺÔjÆ@8Báq ˜{)*KíºjN¼ç:àás‰1J1º7ÜBSßò^ÊÑqÆì˜Ô›–hT—–ñzµMu(¤×!(i>Ê88ŽÀçð ã¼i ´÷Ó|ÇGvl6¢*<)ÅÞFKVs³õ†_5¥x¯¿n¬©r±´/²Gj“ÁèqÕ:‘»ÌÆçwËš×µ¬ ~A@C¤‘BQ¢y¬²¿¯ªÂ8±§PR†)+Ãx5Ã7fã¹Í"0|Ö«£·–&Ñc÷šäak]’u#ÇfƒWU!Ò‚‰ ?rœ‘¡GB½¦¤šZÆ·ašC.¢¾7„#jŸ+»Ù'x¬¢K+*à„TÃD/V‰¬gèA‹â¤ØåÖšÎñ„˜*;@G x}Y¿EmˆBM‡ê‡X[ÿ> 2æ<¨wMB•EJ4¨çj:ÌÖ›fq)x/4Ý@S¾¢1éaZ Ÿf¨4ž„6q¬sÄêÁ:oºÇHfô¤BÄ3}ŒÆHîUüüré¡ÆÎ­ªÆ½rQ²©WÛØ°*6ÅàÉ&ý³ˆd*£-T¶ÞZÈY˘ߑC8®×ÉY”èFÔ|î ‚¶P-ÚûÈiOÙ#-æ«©"hX0ôèêC².Q1‡Fp<\IîAg¸MI‹±H QrÒ}}3 rÕÝÞL¹bjÈ!éõ ÇÕαçåá”NÂÆº j¡ÁŸ "4„¶ÞZ%ÂÐ[k™ŸOˆ€Á‡ÎpK,É×7Þ°e½ ÎR%ª¯èU»Ï([€Âì*¬kµZôE7jÕ!š‚x¿6‹ä`’D’,#¡ITÌËXëÜBwó{6Oö5#½¶J&•mÌŠÔêÑÄÊ!êJ6†\w3Á¨ºs,Ö=ýjm,i^fAÓišúŠ˜•jS0cÚ5ÔÔ'ÉÄE)B†ü¶þ¾•”,ŠFCM5=JA¾Ac^‹¶ç0:¶hã,­ŸW=ÓœÁJ|Ã&Þ7‰R=]K†y®9§’Ò€ÍAMa9jˆ”ȆŠø(‚VX½‘‘˜œ©‘_ãïj†YC(¤Få£AOßht™x×9^ž‡`Ni©¥šN²õo…ŠoÂU¤*dDStò-†ñ×Ç54“Ò!{ )E’Z3Ï¡ë/9Í”'~°Èk*ã2¦ú$˹7+nîúSOÑWrüq‡²OÖ€­°°0­ûNX‹ú±æQÍ}z×Tb¬gWÕß7’nãŠ÷d÷whÚñb$.¸KÀÁ!µÖ[1Þv ¡@ÕèB¢!݃mÑHÝÚâU5Nߪb ÆøˆÈ½jAêQCz”!"Ae½ƒ¯ò/µ~Bí‰ÒñäV3Rf”/R‹£‰ê=$ÔAè¿/1àŸo¬› ÐrØûÒ’V !„-G뮜#øbú@—‰ êyþ™‚®¤EKôæ_J3²å‹Ì™hðÆq1÷]/ÎXüjhÛœ Æ§ôXY]!&Î@©vŽä¤5>]éb«D'¢Å­$êávG5ë{ÃT¦˜{{)ò½±Þm½ë®‰Ü¦$#-/{ü5ji>K~}–Í®„×ͧtEi)C›²!²ãs‰ÔÞ Jߢ5Ï#š§ZÅE'´ˆ@w¤4\KS ÖŒ¸j©;E¢¨KlÊ}x|X­þ>_¶qDWólkÄL»ý<w\ž·&‘¨‘%šäÚŒQ ýܰ.öíëŨuÙ5žTK§ ¨Š2ÆÎ·ƒL©l Ðòú•ùWU…5äi*ñ/GŠÔkÒ‘£Hl&ÇD.£†Ua­`Òk€"V(þØùqäʪ®Dkâ©’“?·¬ y‚â Z¥ã:ñzù†ŽÀrÜúÓÆ¯5CÀ–¯×ÔBô®Åf7UR;òÙŸ´•þÍd´É<ÿ};•æV™0FRQ^êÏ5fšç?•9M¸vjJþ£UMùF!ð˜"ÒøS5Õ“MÒxt)¥pˆÌ(_¤¶ª…9JªF®ÁÛ 6–$kµ Ч<|Ú„V7(5jšQ$&ÄÌ+¬È 6©Š1Mº´j¼ÄªÑOµ@š…ö*\]þP\oÎÒ;ž+F»òju À€3žK²=ÚaŒ2=î9bÚCu3¢óè3O¡½ ת뎋ëÿÉAD® ¤¥Ûñ7áœPà³!èW•cËJß“`‘¿NÕš1Œ“S;)ý¢Å }Ît¤±E©ŒéÖÒ{Œ7¯Ï±$þ´k-+@‰qÕ:ÏE^!5’l¥Þb…¾R0âýï MœŒç$qç¶ò¸'#³©E.iB:“žN¥Ê¨¨:óF™R-W\0ôˆ’Y…PøDšÆg_sÿ^ –VVâñÊʘª$öBŒR`á’ÖjºÿZ±«fÈĤ ¥'@‘͆…åe(PɳY„™Œ¬q§åuƒ#3ùðÉÞæ<¢õóÔBkŸ‰¢Q:MÀ¬"8ÚñZÂaø´‚L¤ŸÚ2д“T£éîÁ,Li;”—†KŠ4Ý{k¤PsòoFÎHL#¦xÅ¥ lÄ๕õœéô$BCa«BÜ|ªî}•nh‘­›pì[žS_Z8„ ®,{!W•þgš„69A·öÄH†¨†ªçæSUU¨ÀЄʜè[H#Á›¯Ü7¯¥êLâød=7?!ï{šœñUœlh$¥FDЉðä ~p–fz÷-Ù<*ã Ö5D‹rÅ€b~´‡êlŽblYž˜S…e÷WêòšE&{PPðÒˆnºÑ’T¯Ûª‰Úpxûûµ¥ïŸÜ5gUZu8Ð^¥G$pDH ³é>’F…¸iQ šl¥B”N´>5}'}BÓ ÒC(ñ¼š¦¼ n2D×’çô¢S£—>U¢ß×}K‰˜«jEJD"”°,º §Zû¡ü^nÔɸ²îš!CR_¶rFÅ`âbÔƒÌê ´.ÕIšÎ”*ünÏ*Åi§Ú‘çU¼‚14,IJ¥×Ò Ÿ)‹$Qø\jѪ[€,S¥ã®škŸ§¥¶ˆ½(½ÑV<±Ö„+ÏÁ‚;Ëb ‘SÛØ´æ]jçÜ»Ê-Áó€Ï- è·ér ñóãuäûo$½ÇZJ•[ÇŸ ŸMÍ÷—õ{l4Ѝ‰B©’†ÕyQ3â*SªKKú ­´ë7ó¦ ‚ë ê?Ýú2”¦LJ^¶çÑlðk]‚}I¢ý_¬$%±ü{Í81ÎèŠF¢J”Bb 3dXjóŸlîÌÒrú𝔠HQ„Ëà)× CS2͘ ¤˜RmºìéÔ ¤@帾B?ç2bb Šýô¨Ç{¤‡Bg8É}'ÙßIñ@æ-ݨC:×3˜à’m– á‰æý[y`µœvEõ'>ådð,öX©O)…¿H/矪 œ\bÜb‰ªþ0˜FŠ.Ó˪ Ó4Í}%§>—b¶<¢7ðâ”T¤4 |“ÍY*©C”ÊÑ4/ûx‹Yµ§A\¶‚4Ó¶ÌB§à…KÌW›”ù-ÇH©¬DUâê`Ò÷ +é6úËÄ#ê¤BÇCJIÙ+­«âdÄs­ŒK€Oˆ%®ˆMk¡”FfyÄh!mܨ)ט"÷çÙÈZºuC.¿[1Zò="¼¥Ž4¿¼ßI_÷˜ÀëRz8,»¿>—*+Q”|ÚèI;ã#<¯ªDqéïJ‘¯B^ym" ÞÖxoz¼1 iûójc*aBúšŽ{…=G!‘eŠÇZBl—`óni¹†bß¾jhœT£WñXe%–VVÂ/0‹(dOH[Ù¥?F•±f"þþ§“¶_H®@ãZÔIð)4‹'Æ#ÆS‘-ãMMóõÓãL,ÖQ*¹î}Þ¡,:gdâ5šù’$Ïd_ùúñ„ D[€Ñ–¬xx =ú{=œBòÍ;¹jE™¹js­¾7§èO9åd ÔÕH¸•Üõ‚8Rëá(At y¸±òpcÕR“N¶æ†‘qðë…ËÑ4% á`\à9¹¢¯ÏnÇ™=9quùB½A&¼Ù¦Æc ‘–hš×unåCÂ!xqcÅc¸±âwpÞŒŒOëíà–jLJgå8m¸Ä|Ì(›Ÿò󲇨m,% ”¨Zõ*YT ®–_O)R6Ò÷0>u\>—¯S!Ò>·F\¡¤¡DÏ{Еløä’”©"§þbI¶þ€€×† ß‘'ð¹•t#³ ÝØé£»ï@ |¯€|5Ê#«…Ê î,CžGTÒ¨¼Ê¿š! 5.3ø.ìÅô bL\V/&$Æ;,›š¾_/\ÅÅ£5eâU±áÕf5V]‚d<­¨*é¤Z3 «çÒÒwI¤)µüy¿8¸šàÆš 9á¹S V#qÝkÓ%trß›gVµ#ºê  Wc:góHÞÛ"S„9ÝÂÖ‘†tŠ’ã‹ZS-Äí+__;n&Tzú"ÛfFšY䯭[p:ÅÌša“êþÇ)ª/y˜nâ¡% pð>|‚gZt¡lôáˆêø;„ÝÃþhêIz‰‘ :/\B~JÇ2æúg(Þ»•ìôgbRú‹b€8Ä®.ÁìJƒ¢7h›X*o^»àRú˜tÊUz-øàŒ«µ¢)VœÅ¨(¼G7:œb‚×$ò ¬Æ…@'ÍÚ“ç‰êmW…ß-b¡¦Íï ðÖ$6™BJêdª¹þš$¨B¤EŽ*^u5¥Åèý¬|]ÙÀûCX|nóîP¤7çßQбevÌ»£4–X«ŽÒÌoh^ˆÊü*†‰&‘õªiSj㲌C-Ï^ï®KáS êgZþº&jæ½5eþF˜·ŠY—à˜—;ÒSúI0’ú¨à‹"‚6›Nø%¸qμ<¯üî ®1³´$£adìö«EQHú·&‘àSenò ë#FY(I­Æ’{Xˬr ÔÈUßZa77€uE çÍ´7w¤¦ý¤“#oõ7ÆFc©¨ÝX}>©ÌTÏi§ñ¨Ñƒ¦¿“ÎnB”¾ yÙ²žzÂÃ`¸\Ì""!ÓËÌ#ƒGš• h—`#›é Ì™€kN]¬J¨’ä†K𑳯pý5¶´ÎÊà 3E'£ñé²Ãm;.±…9§«òªé«H•abçSÉ»_pgªJ³±ðÎ2œó%Ý]†qe9 \´‰¬æ­/šUŽqåvzŠK:ãI”5ûL;·1`¦8Dê%ÊJGâ‡ÔT™þ*iÆ‹Ï%D# êØÝ]Žqå9 ÜÐ<¯<ÍáW";‚Þ;a(`Œy‚À£æ¯ÿ¾ª cí9I½Â{Òûç2å Ið´[ylâÍN•øD T%m<>CÓ¦H‰¬¤’‰T#ƼÎP#ƒ1ÀC)ÊŸãè—rqýE9`ç]¦†•CâÊÒÿÄÛuOö{Þ4EœŽð½|´B3¦â×±ÖìßJï‡[ (…ÀDP㥿5‚ëuЍkG_TM¿p+Þk¯Ky=Nõá°ú½B`[Úà 0®<ÝU‡Çü;N;wð=B\¶ Rä>@ÂfT†1êÒóAžWQª1u½…ì/š¥ÈfÊ2áã@ë6;…˜~8g#F­Mð»µQ…ß#`žAÞ3൩žîôÎ!©ÇÔš¥3X*R\ÒòPÍUŒÑçñðÝJ-á¢)HFãiÐ csr°Ðà&€^tk,ÞÔRJ|¢˜rƒªþ¨²B |qi5@¡(âôœÈл;•”&«TcWà¡„‘ħšb” éѾ¼þú\jF“–ÓLRH³ T†CPÈ­we\s]Ó¾¿¤x–e …Blç"$wA¦2rÅ f”σÃ`¼8D/®._ˆ—ÌFÔžaR¨<u’¬Üh­è“‡Cð(©I¥s–{”z2„ú­„GŽàLeL+›ƒl>ÓÊæ˜zûõ¿»ê½v^L/‡l>·Ÿ$‚ h¯ÄM•Ë@i„I•yy>º#­ßå¡#|#ƒ[Ø®EܹʚQ~̽ÆeŠ×ØçïÑÚÁP—JÄ+½ëZᲦ¸#(*FŸhyM©¾¡µé¼—yŽ à‘IÕá„Qò•Ê€ß#b¾Ú M6o)2h€™'TK!9ªFK´Ô«ßϨGÒ@(Í:BB0ÎnÇEE(Å{ü9(õM8Œ÷ŠDZ¼jÞºÍq ºeYMi±!(Šõ2j)O½²SëW‰}ž(¢%Qk" ¯©<½¹VôþZEV†Z-!^Qăee蔤¨¤i¬GI«ôbìyeeXðù¡~mÓÆ4YyuxJ­RŠúøfëY‹BhQ¡4ú2L!)ô5¿/‚çyÈê\pý±Œ8ÂÃi Â)æƒ'68„¼”ŠZS…CðaFùØÇ&‰,s©RlW¬L@P`¯R¤,ÅüŒ¦Ÿ8?¦•ÍA½ ÓJ„Sð«Þõ,¸lÅpÙ‚xµI™N10l¬š—Ÿ'¢…·?jÔilsÅü„ký5œ¢_÷ˆ'‹äŠ>Ì(›‡èO˜MfÖ!FuúÐ@¡æù·òHk^ãªR»®iï÷ˆJGG4J‘`A¦TiN¥jík’¥„dÆËžn1³×ÍcÙXv¥B²éȸïÆFc¢¨4ö„Ì6KÇk9O-~ÌT1m ¥OL÷NŸ `Ay9NËÉÑk2÷ùªœc¾(‚Žò=ÄÍ1i^APRl2h¼i)Où†ˆÖŶÊnǃeeð $JáDÌ/+Ã.—žÊd¼¿}EV}Í©ã'P$=•¤ñi6÷ÒÖ D4(Õ·šYÎøˆ{g©µ EEE°Ùl#fŒÃÑ­/9O³4«H¦[\Í¥¾x•BÛeó‘#xà½j€`ÆÈGxEJ±ŸÛ¸•ñ2n¾}‘WÓŒœ6…ÜípCåRÜXñXŒ·›#œn¬Ð uÇË]P#CÙo€À)àSŒˆ’¾e X éD74BŠÆ~¦¡w±5é<Ë‚|Ÿ ùÞ¨·¿¿j3EøãçÍïQ˜¯5QY÷U–Ãî¡Yå8÷Kn<4+sÇÒ!‘ZC'Aýy¨^ë¡´"[Fõ¢Ìì튦†3Ú¡EgâI´ Îë`kÎÐLûY“ ŠµÇæäàa5Mk$íîf†‡¶.i6÷2#]ýMk |yž×å+‡c¼Éä=‡ÚéO€áêÒܯ×!Q/»Ö€ s{ŽdA8­0YÏ;ÒM@+ø pYp y– »´bXžË°,äàJJÓP6sL³èsà½jS­üá—ýŒµ6Gäæ;l«È„VȺèîrÝ@¨·_—ü2càx]BF ’Ì.­èJWfÇ#?)ø2;†Ó‘F)…„¨Ôæ UªFpÇÔѯ!Šc4LF´h@¾(¦m4UŽR­—1JYŽ*§Ôp¤kâ†hÃuû]rg$a„ðpˆùÃæ™Uꬋƒò—$‰tãÀß´Ïg¹¢ÓËæ¡À^éeó$ 98/xE1izÙÜÌ4ëÇ=´,¬U +2‚<ÿÜ ®£Lµ‘-%)“ÄU2¸3“Ú”,¥jX^šq)TšÁ4Ü=ÂÌ‹ÍÀÀÀÀÀ †“bÍÒ=’ŒÅGÙ0000000000#„‘Fþùg```````````äŸ!}°v†‚•þ30000000ŒÒÆÔk2æùg```````%`ÄŸ‘FþF (J•ùg`````8Ás€Ç£üËÀÀÀÀÈ?à ¸{¦ò/#ÿ '0DðùV°ÉÀÀ0Œào½å‡¿,,>%ÛX=¾cǼð X½z5pÊ)§€‚Õ«W£¥¥ÅÅÅ „ èĽ½½X³fMÆŽööv|ôÑG8|ø0œN'²³³uuuغu+Z[[áõz!ŠÚi(ÂæÍ›Áó<œN'àСCغu+z{{áñxL+ìûs¼øëß¹s'vïÞ Qár¹R>g:çnooǶmÛðÅ_Àív#++K?ÎöíÛÑÖÖ†¼¼<Ësuww£££YYYhiiÁ?þñ‚¿ßoúû_|ñöíÛ‡ºº:ÔÕÕçy8@SS¶oßBˆ~Ýñ¨­­ÅÞ½{õ¿¯««¥ûöíÃÚµk±cÇüë_ÿBcc#ü~¿~G2ØsÅž+¶®Nòuµi3Zkká=¥‚ÍÆöëbÛ¶mX»v-š››qÊ)§@’$¬[·ï¿ÿ>8ŽC0ÌÈZ”eû÷ïÇöíÛ‰DàñxÀqÌwÊ0ú KŽ9Ü‹ï¼Õêí¥6mÚD«««iAA­¨¨ n·›Þu×]ôðáÃôì³Ï¦·ß~;D"t hjjÊèñŒhll¤ßÿþ÷iqq1-..¦×\s =zô(ݽ{7½è¢‹hII ---¥K–,¡¡PˆÖÕÕÑ'žx‚–——Óçž{ŽRJéÆéÙgŸMKJJè˜1cèÒ¥K©$I1çÙµkWÊÇ3" Ñ ÐÒÒRZ\\L§L™B·lÙB7oÞÜç9Ó9wkk+½ùæ›iII -))¡?üáikk+mmm¥o¼ñ8q"ýÙÏ~FeY¶œÓåË—ÓË/¿œ644Ð?üžrÊ)ô‰'ž0ýÝP(DgÍšE iUU­¬¬¤O=õ”þÝOúSêt:é’%K,Ï·xñbZRRBËËËiii)õù|tîܹôþûï§6›M¿¿ßOoºé&ÚÔÔDG2ØsÅž+¶®Øº*).¦¥ÅÅtɯÍöë à¿ø@Ï<óLZ__O9B«««)ºpá¯Åk¯½–ÖÖÖÒ•+WÒ±cÇÒ’’:vìXÓuÂÀ0êí¥ßy«5¡É×Úµk±ÿ~<ýôÓ¸øâ‹±dÉlÚ´ õõõ‡Ã‡Ã ”bË–-xýõ×AÁå—_޳Ï>¡P«W¯Æûï¿üü|L›6 Á`/¼ðœN'šššpüøqL›6 ~¿½½½I×ÕÕ…W_}Û¶mCII .¹äTWWãÓO?Å_þòtww㬳ÎÂ%—\‚ÜÜ\ý6mÚ„µk×â¿øB¡-Z„Õ«WãèÑ£øä“O°lÙ2¬Zµ O<ñ¦NŠßþö·xã7ÐÒÒ‚p8 xæ™gPWW‡eË–áå—_Æ£>ŠË.» úy^yå•> …L½$Ï<ó ¦NŠ©S§bÖ¬Yxúé§!Ë2êë듞3s¿ÿþûXµj~ö³Ÿ‚%K–àꫯÆîÝ»±téRúè#Ü|óÍe„¼üòËxöÙg±gÏÜsÏ=())ACCÖ­[‡Gy¿þõ¯ÑÔÔ„1cÆ ¦¦kÖ¬Áoû[pgz¼—^z Ï=÷>ùäÜsÏ=8묳ðÏþkÖ¬Áÿ÷ãßÿýßqøðaTUUá¹çžÃ¢E‹pýõ×ë×PVV†GyW_}5Ö®] BZ[[±{÷n”••áòË/G[[Þxã 477ãÀäÉ“1gÎ@8F}}=<¾úÕ¯âÀXµjöíÛ§oìáp»víJéxñ°Ûí˜={6Î?ÿ|PJa·ÛÑÞÞŽŽŽŽ„sÖÔÔ$¼LB¡P¿Î½{÷np‡+®¸”R<úè£Ø³g®¿þzTWWãG?ú(µÖžkiiÁ‘#G‰D°{÷nŒ;6iØ¿§§õõõhmmÅòåËñ•¯|“'OFKK –.]ŠË/¿+V¬Hº0'Nœˆ‰'bçÎøôÓOqË-·àŠ+®À;ï¼APQQòòrüøÇ?ÆŸÿüglÛ¶ ¢(â§?ý)ªªªpøða¬Zµ ³fͼyóÐÞÞŽ™3gbΜ98óÌ31fÌÌœ9~¿¢(⥗^ÂòåËñå/yP4ö\±çŠ­«“|]•—ãòK/CûÏñw6°ý:û5Çqðx<ðù|ؾ};z{{ ÑÑÑŽã°~ýzüà?€Ûí†(ŠxöÙgñøã£  ³gφÓéDqq1¶nÝŠÚÚZÜxãX¼x1f̘µk×ê)_ßûÞ÷ qÆg`Ù²e¨¯¯·4¦F%ù¿úê«Q__W^y‹/¥S§NÅìÙ³AÑsIkjjðãÿ°lÙ2¬X±ûöíC8ÆôéÓ±iÓ&¼ùæ›Ø¼y3àë_ÿ:üq,[¶ =ö¶oߎã,÷Æo@E´··Ãç󡺺•••$ ‡Çq˜0a&Mš„’’,]º{öìÛíÆ]wÝ…[n¹¯¿þ:|ðATWWã‚ .Àúõë‘““£oèÚÆWYY‰C‡çyPJ!Š"¾öµ¯aÍš5¸á†ðùçŸC’$¼óÎ;X·nº»»qöÙg£³³³Ïãi/ž'žx{÷î…ÛíÆwÞ‰ýèGøä“OðóŸÿ”R\ýõعs'æÏŸ¯Ÿ3£§§'á¦E"‘”Ï €ììlPJA)Egg' Áó¼þ÷É6öo}ë[8xð îºë.´µµ%}ù„Ãax<Øív„B!ÌŸ?<ÏÃf³¡­­ ×\s V®\iêe‹ÉMSI ¥·Ýv[LŽ¥,Ë€¬¬,p‡îîn̘1EEEX±bvíÚ…òòrœqÆx÷Ýw1iÒ$466â›ßü&z{{ÑØØˆ’’Lž<>ŸoP½8ì¹bÏ[W'ùº²ÛdgÙJÙ~ýZ–e¸ÝnŒ77nD$Ái§†††„B!¼òÊ+èééÁÊ•+‘““ƒË/¿/½ôn½õVȲŒï~÷»¸ë®»pÍ5×à“O>Áرcñ¥/}I_‹&LÀ·¿ýmTUU¡¡¡<ð6oÞŒûï¿>Ÿ1H†ƒüSJñÙgŸ¡¢¢ýë_ÑØØˆßýîwxñÅqÞyçã8PJÑÚÚ Y–ñÅ_Àápà²Ë.ƒßïÇÖ­[!>ýôSýA³ÛíeUUU(**BEE8ŽÃñãÇõsÆïÒK/E ÀYg…;v`Ó¦MhiiÁW¾ò\pÁ¸÷Þ{ñüóÏãù矇 ðz½Ø³g¶nÝŠüü||ÿûßÇk¯½† àŒ3ÎÀ¯~õ+Œ?‡Ô7Sz•¶9i¸á† I:QqìØ1ôôôà½÷ÞCgg'‚Á rssqèС¤Ç#„ ‰àã?ÆæÍ›pÓM7aýúõøÉO~Žãð‡?üßüæ7ñ¥/} ápX?gSSÜîDI8Qát:û<·íó®®.ý% …Ý%IJÉ;)Š"8ŽÓ½^Éàt:ñ_ÿõ_(++COOÎ=÷\lذíííøüóϱhÑ"477cÕªU¸âŠ+0eÊÓãìÝ»«V­Â´iÓPUU¥NÑÓsvìØÎÎNãàÁƒX½z5&MšQ^¯—]v~÷»ßá¹çžƒßïÇ9眃œœÜvÛmX»v-žyæà«_ý*ÊËË3þ±çŠ=Wƒ¶®FçºêêîaûuökB²²²púé§cåÊ• „àûßÿ>Þ{ï=„Ãa;v n·eee°ÙlÈËËñcÇ …`³ÙPYY‰üü|x½^„ÃaôööâùçŸÇÂ… qÆg`ñâŨªªÂ¾}ûpï½÷bûöíX°`fÎœÉ ~F5bV/!6lÀÌ™3±|ùr;v <Ï#++ N§Sߤ***`·Û1yòdœwÞyp:˜0aªªª .½ôRLœ8n·[WžX·n^zé%¼úê«ÈÎÎÆ©§žª‡Íâçr¹PRR‚5kÖ ­­ .Ä…^ˆ>øo½õÖ¬Yƒo|ã˜?>:::ðÑGañâÅX·n^yå;v sæÌÇq8çœs°yófìܹ“&MÂ矎+V`õêÕðù|(++Ó_j²,ëë[o½…?þXÏO ƒ¸ãŽ;ð÷¿ÿo¾ù&î½÷^Lœ8±Ïãɲ »ÝŽG}ë֭Ê+àt:1{ölìÙ³\pêêê°~ýz¬Y³&朅……1›¨qc¯®®NùZ&L˜J)V¬XW^y”RTWWLj¾^(„tuuaçÎzÞ¯víÚ…›o¾>ú(þùÏ¢µµUUU˜9s&n½õVLœ8‚  &õžlݺ---8ï¼óbÆÚÑÑ?ýéOX¼x1æÎ‹@ €óÏ?¯¿þ:"‘n¾ùfäççëëëÒK/…,ËøË_þ‚óÏ?¥¥¥xï½÷°cÇÜ~ûí˜9s&víÚ…-[¶à…^À¯~õ+=z<ò^xá|öÙg¸ÿþû±aÆ´2ö\ÜÏ!555¸ÿþûñî»ïbÆ ¸ÿþû±gÏ<÷ÜsX¼x±N®Ùº:Á×ÕÊ•øÇ{ïÂç÷³ýz€ûõG}B$IÂé§ŸŽºº:477cÒ¤IˆD"ÈÊÊÂĉQ[[‹?ÿùÏx饗PSSƒ‰'"''GŸsmþ !øðÃ1wî\}-nÙ²~ø!~ûÛßâµ×^Ô)S¿ýíoرcxà¼óÎ;Ø¿Âó½ÿ~Æ0FOÚÏu×]‡;vàÉ'ŸÄÿøGp‡;ï¼]t^xáx<\uÕUغu+ž|òIȲŒÉ“'£ººEEEسgæÏŸ¸öÚkQPP@‘Ïzøá‡ÑÚÚŠY³faÒ¤Iƒ–Ç›0a"‘–/_Ž9sæ@–e̘1S§NŶmÛðì³ÏÂn·£´´×]wòóóõk¨©©(Š „àü#"‘~ùË_âÚk¯ÅÛo¿¹sçÂf³áÞ{ïEqq±b-))Ñ=,cÆŒÁþýûñ“Ÿü999˜={6ÆŒ3WßùÎw°aÆ”Žgô}üñÇèèè@^^^{í5¬\¹W]uf̘ÄœS;^<®¹æš”Ï=eÊ\wÝuøÓŸþJ)®»î:Ý{Ãó<ŠŠŠúLy9ýôÓ ñ‡?ü³fÍBII‰©$TWWã /ÄóÏ?J)Î9çÌœ9ãÆ HǽýöÛøö·¿­fM¾Íø;>Ÿn·O>ù$!3f .\ˆsÏ=;vìÀ–-[°`Áäää °°MMM˜4iÎ<óL¬Y³—]v ªª ²,cÉ’%çŸ>.¾øb,_¾Ÿ~ú)®¼òJüýïÇäÉ“QXXˆ•+WâÔSOÅù矟փƞ«“û¹jhhÀÊ•+QUU…H$‚•+Wâ›ßü&6n܈;vàÖ[o)‚eëê\W#¹ ÀÆq¸÷g?cûõ÷ë©S§â¯ý+ 1~üxTWWÃét¢¼¼EEEðx<¸îºëðá‡âÑGœwÞy¸í¶Ûpüøq#77„PJ±wïÞ˜µ(In½õVÇ-ªšÃZ¸ñàÁƒ8vìÊËË!`³ÙàõzÑÕÕ…ššȲŒŠŠ }ciiiÁþýûáp8PYY‰ææfL™2W^y%î¹ç„Ãa”——CÅ>G)Å_|C‡éÇËÍÍEgg'öîÝ‹®®.””” ¤¤$&×ÑѶ¶¶ïƒÇãÓéıcÇpàÀ¸\.ýº¥¨§¹¹n·[×7>räöïß@ €ÊÊJS çþOCOOZZZtÏ¥999ðù|¨­­ÕÏYUU…ýë_عsgLÁVVV.¼ðBB°ÿþ”ÎÝÕÕ…ýû÷ƒRŠŠŠ =÷U’$466";;‡ï¾û.êêêôóQJ‘——‡sÎ9MMM$ ………úünÚ´ ÝÝÝ1s=vìXœvÚi¨©©Aoo/***bŸ---°Ùl°ÛíhiiËåJ‹ ±çêä~®<þ·ÚZmoo‡ßïGgg'Âá0òóóÓN#`ëjô¬«}Û·ÃÝÙ…²¯} ¢ÏËöëî×­­­èééA^^ZZZÀqÜn7šššàp8àr¹ÐÑÑ}ûöA–eŒ3¡PHsrrÐÜܬGi´ñjÈÍÍEOO®¤Õ™¸\.´¶¶ÂårAÅ„ç;//6¯b` ‡Bضùý6SòŸI444àŠ+®À¿ýÛ¿áÁd3ßOìÞ½û÷ïÙܳ²²pÖYgY6\I‘HÛ¶mCSSSÌù¼^/&Ož¬çeIÇÆÑÓÓóûeee1aêd8zô(vìØ“÷JAuu5N9å”_S(Â/ùK¼øâ‹˜={6fÍšuB¬ ö\žçŠ­+¶®ôuõÅ ¥ðx€’b`yãl¿f``±ä?‰ ¦¦n·………l憲,£¦¦===;vì¨èÌž+¶®N<Ðö/Žá Úòïr²‰9 ök†‘Fþ•ؼ ‚ 7 a`jp‡±cÇžp×Åž+¶®F«im$Õc.É@kë÷Ÿí× ý‚Ê÷J)¡@õÿ1000000dèmK;;A::*Gÿ×ÑÚÖâp°w/ÃìEáp”R‘Hû÷ìbsÂÀÀÀÀÀ0 ² ˜u„ÝßÂ<ÿ CˆH$B6ÂàÊ< áA43 ˜ÓŸa÷"Ù@á@ÙÄÀÀÀÀÀ0”ob6 £˜GެõK™;µ{FHb“/†dD»··ò!Ü!°Ùl#Î ©`äŸ!%ôöö¢fÿ~ÔÕ7  2+Š(P9f ²²²ØMbäŸa  ”¢fÿ~ì­Ù7²Òlº»õîÌÆg€>Àd’‚@éÂ\W_J)!#ê”RÔÕ×# ±jFþN°Òßä`i? }j›Í†‚`ÇGœº!Á l6»YŒü300000000d‚`WŽ#¶à—åû3òÏÀÀÀÀÀÀÀÀ!d™$5þ IDATeeaÂøñ¨3†I}2òÏÀÀÀÀÀÀÀÀp¢ƒ‚ììì5&Öä«?äŸRP*lÒR"ÛlFÝ=(… FØŒ0000000000œ¸ì"JO­„Óåd&É BÐÑÞA°Ù Š6–+ÅÀÀÀÀÀÀÀÀÀpÂrÁfÇ<þ '(¸ÚOº&ÇÄÀp²í7™q4¤³w fds¸ÇÃöR†‘¶o„}i4Œ}¸Æ(ô5(Y– I’õÓ}‡ë âydz—Ú„,Ë% ”5Ï>¡A@Àñ<8ŽKy´½¢½ƒ€(û† @’" 2M\ŸtP'kxÇÃöR†4‰çHåx²,'}ÿŒ~:’Ç(XXFG[+:;Ú•Ø¥)àpºàt{Àq{qˆMBFG[Ž··! Ÿ°5"”Ê „;éÇB ˆÈu¹át»-ÇaÜ+Žw´A’¤¤â´ý‹öós …lBÒÇ®—êç†5züx(¥(S›ÍÖ¿r¦p<’Açñkjd{)ÈطSÝ—dI•c-ó+˜Y í­èíéAIù©8ÞÙ…½{÷Áëõ";+ _ÔA ?¢(âHm-‚xžÇ‘£GQ,!µGkQTXJ)ŽÖÕ£¸¨’$¡¾¡ÅEE‡ÃhhlDIQ1zz{ÑÜÒŒâ¢btww¡µ­ åeå()ƒ/îGG{+Ü^?ØëjøÐÑÖ†žîn”œZ»=焽NY–!†CmY)§»œÈcɶç ÇéÄö¡£­ .×r¯(.-‡-+[ oÊ)¼2ô¹a¾dIÖ‰·Liÿä‹OÀñp·×‡œŽ:ÈöR†aß·²/†±–ù¬ªHípy¼8ÖÚžãP^^†,› „8ð¼FÈu8 Ê!œ¹¹úÏ.gôg·Ë¥xõxÜnýg¯ÇAà¢~ŸWùÙ™ ¯ÇY–ÑÖ¦Œ¡£½¹N7ˆ 0Õ0‘ÐãímðåNhâŸ"§;éÆb·çÀ—@kKr]nÝ1(" Û8£9•Tɱ—åaMM)ã‘e¼(Âãó£­µ…í¥ '3ñ!ûv:ûÒhûhšß—¢‰@ŠDÀ‹"¾8r<Ïë$ŸçydeÙ ?gçyð ýÝ—Ôh¨¢ZLGÀ¾4öÔ‘;FKòO)5èT›X†Sißp„Ä…:,ìÓ£QP¥yX$‚†ÆF8ssûœZBˆÒÁL=¦ÖYíDƒ–ŠmVŸ30 Ç Äzû"Ï}ú{…ñûØ—QŠã!;wíÆ“ÿ»[>ü’$ÃårAE4·Ãoá­õpÖWÎÄ­?¼ N;-qãÎäxi~@ ûg``Hwß!èêêBWW7rrìÈɱ«{\⾤•š™Û—²§&ŽqpöÔ‘½ï'Mû)+KûI¨&ŽX’d4·¶Â–•—Ó©¼$i’P……¹BA!©¥ý( ÅŽâ_ŸîDCC\.Θ4e¥¥'ñohhÄ‘ÚZTO8 ¢(ª]”…„ÏGÂá0jkkQPP€¬¬,u}Hhhh@oo/¼^/Ün·þû²,£¹¹Ç‡Ëå‚ßï׿‹D"hjjB(‚ÇãËå2¬9ëc&ûîd,Ëhmmx<žAkF  s7Eì^aüœ¨Š”Ò„=AÙ ‰ÒŪ¿¹‰c"•ñŽ`ç®]Xü›ÿÆžšLš8W\~NŸX —Ë…¶övüë“Oñ·7þ÷7nBcSfÿü?0aüxEÉ™}!%Ì…êÈ1K?²výÀìÔ ýÙ—>Û³O?ûöÖìÃØÊ Ü|ÓWUËñÔô•¶¶6„Âax=ðÚ;'ÃûRÚïÈ’Œc†÷"Ïs‰7iì©ñ|w ïEË2¸ïsÆ Âá>?|ápXy9C ÷Ä¥!Q€€ µµ÷ýç\Ìž3«×®CgWW´!âþž&¦Èê 0)@eŠÞPÈ`•Q}|FB¼õÃm˜3!ž{áEìøäS¬úûëøÏy ñîûŠöˆ©Å§ýlü=Š`ñwÚwñŸ›ý~üwVß[Ó8B>Û»/¼¼ÝÝÝhlj“ÿ»õ ØSSƒ^^ή.ÓëHu£ÌcŒ4ÛÀÇ£9OšššÑÑ~Deû ßut¨ÆIi/¥Æ“œ+”R–RÉÀp²‘ýtömtvváÏü {köáœ)_Þš}xúÙ?¡««+f/$„à_Ÿ~Š_<0³çÌE[[[”S p_ÊÈ; WmimÅϘƒŸ?0­­­ jÒM&öÔLŒ‘Z¼B25F Bêf–yˆG3:$IFcsêêê±ë³=øÚY“1ãª+qú¤‰°‰¢ÒÞ>á°æ¦KD’ÐÔÜ ·Ë™Ôþû§þˆ¼¼<̺}&òóòÐÖÞŽGÿßcxjù3¨>í4äæ:ÐÝÓgn.!…BèííEnn.‘B½½à8Ç;;‘ç÷# ¡¹¥ÇÃïóÆx­›[ZÐÝÝ¯Ç —ËJ)BápÌ1ü>xU¿7B$!Š%l϶Ããqëã·:&!ÝÝÝ1ãÈÎÎÆ„ÓÆÃï÷Áž“ƒ}`íº·qæ—¾„qc«ðCßõp8Q/ºÙXC!„Ba¶¶vˆ¢ {ƒ)¥èîî!ÙÙÙÚ`¶mۆŋ£±±Q1¼ûî»øýïûî»cÇŽÅ¢E‹°hÑ"Lž<|ð–,Y‚;î¸]tž~úi,X°gŸ}6>þøc<ÿüó¸ï¾ûPVV†%K–à7¿ù Î:ë,¼÷Þ{–Ç´úîË_þ2œ'Q³2I¨h?ª‰·9 Y¸’ã8ôôôàƒ›ñÊ__EwO7/\€ü<¥yOo¯òÝ«¯¢«»¿R¿“õöè$¹³¤ñBðަغí#Lš87~ï»xáå—qî”)¸à¼s•ù€HÁ@>îúñm¨=Z‹-nÃû7áŠË/ƒÓª}àã9vìî›39v;®¾êJ|í«gî>‹Ç޵â—s„ÝøÝ®"÷±—FwíLiH000œ0¾ÿ>ömNu¦í­Ù‡¯Ÿ3?¿÷'XB)Þ߸ÝÝÈÉÉÑ*nûÿõØïp¤ö(n¾ñ8Î8ÉãLîKý{çwFY’ÐÔÔ¬s;ë3 tOMoŒZaMp󓌎ђü Ò’‚=±ÚÍpªfÜs„ÏóèîîÆºõðñŽá’‹.Ä´û6ÊËKõ&æc‰N‘žöcÑXŠã8lÛ¾MøéݳP^Z I–a·Û1ó–›ñáGã9lÚ²kÞ\‡ÿøÉ¿Ãëõ`Ó–­xký;ø{îÆ®Ý»ñòÊ¿‚çy„B!̼å‡xqÅJìÝ·áP=á4̼åfØíÙxqÅ+X·~"‘¼nºþ{øêYgaû‡Û°â/Ê1z{{ñàìûTBMðÞñú?V#;ˆ/jkaEÜð½ïâüs¿Žžž¼ôÊÊ„cž=y2ŽÖÕቧžFÍþýú8~|ë-¨©Ù‡¾¹·ÜtVüåU465áÏ/¾„sÏ9ŸíÙƒ¿ëPY¶ë‡}Œ•¯®B®Ãƒ‡A–e|÷šïàò©S‡ñÔÿ>—Û…¿÷Ý´ÓCš››ñ«_ý ãÆ‹±0kkka³ÙpñÅcܸqøÇ?þ7B–eìÙ³§vfΜ ÇI’ðÆoàÀhkkÕW^‰üàày7nÄßÿþw„B¡¤Ç´úN]h‡! ê½äYñ%!s2~¯P_T¦Ø³w/^ùë*¬[¿mmm(õf~{÷íKøN’¥8º‰_Ä4äj6‚îžnlܼ’$á›—NÅøqcqþ¹çâ…—^†$K¸ø‚óu•‰ 0À·.½;wíÆÆÍ[pñçëÍ>eÿ”dÅ»_W_Ý{öâ‚ó¾ŽïLŸ†ñc« Sqß]3}ª*+ÁqÊœ"‰ùA™ÚCû6¥@NNÆVUá½>€,Iظy Ú;:°uÛ6\ú‹A@ðÁ¦ÍøíÒehjjÆm·ÜŒë®žž# µO™Ü—ú|çø¶M5Ëö „€ÓårR~Úß±§3Æ5 ýkCM†Æh­ö£¦ýTŒƒ,›-áø1)K„Æ\¤6¡ÇZ[ñò_þŠÍ[?Äߺ —O ¿×kiÇhŸQ™¢»§9v»…ç¨=zn— ÅE… ̪*+ðÿÙ{ïø¸Šsqÿ9g{ßUï¶%Ë’;6Æc0C(Á„$. ¹@B˜Ð!„’û»¾!¡‡ I(áB0¦Ø !ÛØ`ŒÁ¸É*–ÕWÚ¾çÌï•Ö’µ«fl˜'íÎÙ9ïÌ™yç9ï¼S1®€v¿Ÿêš4MK¸ø;Ø][ƒ®éA>Zû ÇÎ=šóÏý6kÖ~†›¸å†ëºÎŸŸ|Š/6m"òÊëKùñ/fÜØ±<ûüÿòØÿCYi)Áà¾<Î=û,ìGWcWimmcÍGqÁ÷¾Ë.ø‹—¼ÊOý•ñ|¾qcÊ<Ç––ñîûðŦMÜrÃõû䨏‰ÎÎN¶ïØÅbaÁ)'³qÓfÎ>ó  Ûvì@×u>Xµ*­¬@€µŸ¬ãÌ3pÃ/ñÂK‹yqñËÌ3»ÍFQQ!»}Ø®?š¦ñÐC¡iW\q×^{m2mÞ¼ydggóãÿ˜¢¢"Þÿ}®¹æœN' .äôÓOÇëõX¼x1‡ƒ¢¢"æÌ™À‡~ÈK/½Ä«¯¾Ê~ðÜn7ÇsLÚ<Ó¥y½ÞWžÝ~õš®÷}Ë ªÕï~YTE¡©¹]OLxšš[×1Ⲉý^1¦Ò ÐÔÒÂÒÿ{ƒW^_JMmƒUUhnnæåo³äµ×z¥í{mœÚŸRÙ·ÀÒ;1<Š;vìÄív3a|BèÌŸw Fƒ‘¿?û‘H”#˜Š“ÉDF† *q»\lß¹‹Î`0ùVð@åÙ§Dû @€×–¾ÁºO?ãìoÎŒéÓPS¤uÆN?õT23|é³îª;éå#‘H†ª·»ÝÆ¥?º˜??ùWVô1ÙÙÙtttðà#BAaTI1xøšš[øÉ¥ÿÉÂsÎBUt!Ro‰½4Ù»ï£i]㢦¡ª*MÍÉ)]ot¡cP ‰=ªšÖ>ŠìÕq_èÏÞkú1¢2¦wûQè峟4ìQúD¶P„’r&Ò=p类æÑÇÿÂÆM[¸ùºkpØû½°Pz¼ÄPˆk---x{lîLUf³9¹²ÙM<'c³Ù3:Eí]¦®ÏB²23¸äâ‹[VFm}=`€åoÿ‹Ó§ñ³Ë/¥ ?ŸGÿüã++9éøùX-Î>ó ~u×Q]½’yŒ=šx<ÞKÀÂÂÎ=ûL òó1ÜtÛílÛ±ƒÖ®M™gÕîjœN'`0)Ç—]ʨ’Þ_™ØÇ`4)ÈÏÇb±PTPHuM ª¢ÇYóÑÚ~dUÈÉÉæ»çÇè’bjëêÙ¼y+ÑhÛÍ·Ï:ó€ÉÒ¥Kyýõ×¹ÿþû±X,hš–\i÷ûýÄãq\.‡‡ÃÁ¶mÛäää°råJî¿ÿ~6lØÀÍ7ßLyyy²ý´µµ±sçNÂá0{öì!‰ÐÑÑ‘2ÏP(”6-$Ý£FŠn¿úææf5µù/tAff&ÿß·“‘‘qДyoYTt]£½ÝÀ/ï¸U5 t}DeiþÛSW((‚~ÿÀCüû½÷“J¸»A~ÿàÃlÜ´™x<Þ+­§á/z©;Ñk€‚ÞþéäI¬æk‚ALF#N‡¡ t瘣g£ª*{æY/y`ô¨®¾â'¸œNL&Á`­«Ÿ„<Ñ¥?E¯MЊµuuüé/OòþŠ•‚Á”i[¶nã¦ë~Ãaß/ú†è1ñê:ä@"‘ Roï[TŒ-+å®_ÝJ8Áh4òÆò·xìÏOðLJå‚ïžÏÜ9s(**äì3Nï2üõ>¹Ž”^ŠìŠ¢&\*y;ÍM¨ŠšX$koàÆ_þ UUÑ…Nvf÷ü×dge!„~@²¨Œ)÷FXFc:ÑE‰ˆ;½^Q§pÛQç·•Ô•4S¤}ËfF£‘Âî{§ò “¿ÃßïÇëñ „À`0°á‹üã…¹ô’î[5ìÚ@‡{̬¯³v±XŒãæC<gÕ‡«y쉿`6›ùñÅÿAGG'ÙÙÙ˜L&4]Çj±¢(*‘hľ<ú¸”ð¸=X-VtMÃåra6™ …ÃøýdgeõÉ3 1Þ1D£Ñ¤&“‰+ry/· !ô®‡ºÏ½ ãïè '¬]åµZ,hºŽÉhLÔè=QÎFÀP(Ä“O>Icc#O=õMMMÔ××sï½÷ò‹_ü‚Å‹c³ÙøûßÿN^^/¼ð×_=?üá™1c>ú(<ò3gÎäoûÓ¦MCÓ4Ö­[‡×ëåôÓOçä“OæÅ_äÖ[oå’K.áùçŸO›gºû]|ñÅÌž=[jþ¤ç´}·Æäw]+†4n|( Õ0(•OºÃ¶úMH#OׇÃASs3~;…y]ǘ3ë(&Mœ@,ïºVÅá°S½»†h,ŠÇ“…Á`èí y òŠ@oHÎAí®SAZy„ôõ—H$CÕÛ=д8&£‹+~ýŒÓNeã¦M¼´äþþÜ?¸ôG?ä¬Ó$ ÿîýeJ:ïÀôÒPd=ÞªªŠŠ¢*‰Å– ÔŠª êjrñ®\Ãý€dLã}¡2²2Ó‰'Ü~Æ––b6›ûµíEÚ׉”1£Gsö™ßâ´SNÂa·§70»ÇS]' vmxSRæ[Y9EQxåõ¥üè?.Âa·ãïèàŸK^¡zw n— ³ÉD8&‹‹Åؾc±x¬Ï ¬ë:ï¯X‰Ýfç®_ý’††½üúžß²jõ222¨ª®&àñxغ};¹99쬪J_ÉŠBcS­m­dff°cç.bñ8Å……def¦Ì3';‹÷ö—ãîßòÞ+˜8¾²W]Ñí–Ø©n2™Òæ››“‹ßßѯKOGGŠªâ°Û‡Ü ßÿþ÷™1ctÉb6›ÉÍÍÅf³%6<Ûl8»ÎmÈÌÌLºt¼÷Þ{<ðÀ,Z´ˆ‹.º»ÝަiÄãqzè!, >ø &“)鶉Dðûý)óŒÇãiÓF„¯×Ëÿwçíƒvû9˜ô”¥Ûíç—wÜÀÝqY™½Ü~FdI ¬„8ìv®[tÆWòÒ˯°»¦&™Þöñ'ëxqñ˽Òze™Î}tàp˽ú»Óá`lY);wíâó/62¾¢"yã´Û’ýª{áãó/6ÒÑÑÉœY³p:}÷. Sžtõ%²ðÛç0cú4®¿ùV:;;{¥{ÎYœqÚ©©uê ÂÀI$’oèÊÿ ôvo‹P! …0M¼õ¯óÞ+ ¯ºÎc~M‹sö·NÇd4¥ßÛ9zi(² ]àóùøýoïAµË.[týüþw÷t­¢'‚­ØmÖ{¨†.ûÈØ_Ö#)£±£ÎØkÐTRž)FŸÃºýï3328õä“8÷ì³()*BÓâId‘f¦‰H8­mmdxSÇf×u²1cøÎ¹çò×gžaWU5£Š‹Ù±k»kj¸ü?ŒÏ磤¤˜h4ÆCþ ·ÛÍ{¬$³ËÕA"¹Zo0èèèà…—Sß°€@ ÀزRÆŒÅoî½?<ô……¼ý¯3gÖLŠ Ù¾cgÚM¤Š¢ÐÔÔÄ<Æ„ÊJÞýà¦NžÄèQ%wÌ\î¾ïÿõÉsTI k×}Ú[Ž`€Ò1£¡+B@àp8Ðu—–¼JqQ!º®cPUæ;»SÊZÀ¦Í[’¿ï~FݲG¢Qzìq¼^—þè‡Cö7›Í,\¸0ùyÆ ¼ùæ›\rÉ%L™2…SN9…_üâ,Z´ˆ¢¢"–.]ÊÔ©S©¬¬ä¾ûîcïÞ½¼÷Þ{¬^½]×±Ûí\uÕUœp ÜvÛm\uÕUäççóòË/3cÆ &OžÌ)§œÂ5×\Ó'Ï)S¦ÐÔÔ”2müøñ#®DUU=¨®<*‹Úµ¢ž•™Ñëü„‘Hº£ôu±¡G{s;\xþw˜3kÿûâ?yóíÑÖÖ†®ë¸\N.øîw˜5ó¨^iÉðd=òOµ_ª—+b2ÒZ y„Àbµ0gæQ¼ýοYöÆræÌ<Š¢ÂBô®Åš¾¯OT»wײìÍåfÏ<*éÖ–JÇYž®W#ÝåÔ4 ÇÍ óçsþÂs7¶Œúúzt]ï‘vç/\ÈØÒ1èšÖKÞ¾ò((ÚS"‘ YowÛ2›·nåþö4;vî$3#ƒí;wa±X¸îš«±X¬Üÿàƒ<öÄÿÇ9÷¬31›ûFxI½4XÙ!ìÂít$ݾ#áPÒ“Âítàu;Ñ»ŒéÄ[ Ñ}:xÙ‡+ã@FýHÉh¸þºën²X,ÖîÁ'ÓéoÇåö`·Û±XÌ=Nq§ä&º ¯¼¾ŒŽŽóÇU?û)ß:}—‹X,–Z4g[Ì,f Á€‡ËƒÑhê³K»¼Ë8oim¡©¹™¢ÂB.ºàûÌ:jŠ¢àq»ÉÏË£aï^¬V+§Ÿz ã++7v,F£‘Œ •ãÆa4)))Æl2±eë6ZÛÚ8nÞ1œvòI2ª¸˜]»«ijjf挜¿ðÛ8N™‘Aå¸q½ØRU• _|ASS3GN;‚Úº:ÆWVòýóÏÃëñ““6Ï’âÔr˜M&233¨7—Ó‰Ýn'RYQÁ¨’bÆ+§¨  m¾‰ðÄïMÆÄ¤.#ÃÇøÊ ŒF#Á`‚¼\.n·ŸÏÇGÁìÙ³)**¢££]×™5k‹-"+++ežW_}5yyyiÓòóó”;‹b6[Fì̃QÌ*K äµ×—‚œ¾à´a½ÕÄfîÖæF\oÒu§[W:ü8ÝTƒš~uCٷ¡i^fÍ<Šò²2Úý~L&'V‹ŸÏËìýÒN:~>v»-ýJ9"ᶣŠ8Ýîþå‰7wÛwîäãOÖÑÒÒJyùXú˜£gÏæÂè?"îŽ< „BaV­YCé˜1ü'ºå IDATìòKùîÂsÉÊÌ@‹ÇƒûÒ.K¤egfÇ’ƒVZ]Úõ½®ëtv=«ýu©D"ùæüCÑÛ ÁP?<ôÛvìdÎìÙlÞº•H$Êu‹®â”O`̨bFͺO×óþŠ•˜Ì&*ÊÇb4ô¯'ûÓKBˆäÞÍž{À†:æìóÎLèdAâü %¯¿Ž@ð­§a³Ûл‚Æ Ê>íGvàÀeìþ×ó콟s†Q¿‘H$¢4ì©os»Ý]×Ñup8ÄÞº¼™9ûÜ~,æ®å+%ý*ws3·Üqv»sÏ:‹£çÌÂj±‹%ëR†ðŽ'Q¿§ìÌLZëÉ)(Æjµ¥<¸JUÕ¤›ˆÙlFéésÖ#]QöùwîNë.C÷*¸ÒµšÝý@T5±¡VÓt,sò!ìŸÇ¾7&þñ‹¼óÞûÜóë»°Z-I7—î‡×_ž©äèY–î¿u]OÖIÏï#ëþŸ»ÝbôýâÁÇbQêªwQZ1³ÙòµVŒº®tàp¸jTž/K–––n½ýN€ÚàFرù JFc2™“í$ÑP»›¼‚bŒÉÉoº£xûê £ÉH(!‰`³ZQ•ÄF(UQ1šL„Âá^iý hº®Ž„iml ¯°£±yTƒÊÖí;ùÍoïeÓ–-Œ¯¬à´“Ndâ„ñ¸]nü~6|±‘eo¾ÅÆÍ›©7Ž[o¼Ž±cÆôé##!.Î, 6«•x,†.t”ýÒ,Äcñ!¯˜Åã1öÔî&·0½.•H$_oèz[Qn2?½êæÎ™Ãu‹®âw÷ÿ‘•«>äñ‡þˆÏëA‰}šŸ¬ÿŒ{ÿjëêù ¾Ç÷Ï?“Ñ4,½¤i­­­ø|¾^¶ÉŒ9=mÕ›•s×ídefë Äþ²ï›´˜Œ"áÿÀõsªúUU¿ßßžvï¢$|·éáÑ#Hí¤ ÏçåÿÝó,f 6[bðŠvm4UÒL}ÒU‡®ë´··“éóXº®£( f“)ą̊;½ÛèïÙöÿ `1›ºÂt‹^ytWZÏÿzi8cN÷ŸÏËïw76«¥+€ ƒ²O‡"ûpeTzoîwp 2SÏ+Á¹99û6J*½Æ³ý¦SÝ”! ‰ôÎo€ƒÊöÏÎh0PXX4š×Fjv|àyhšÆñÇÍãè9³'à #Sé¢+9P¾Ìý©£ÐßæžD@Ìý&¯¢Ç+L½§RVÒ÷sA_ÈÁÈÅ)3šÛo½™•®fŪÙ¶};@ŸÏÇÜ9s˜3{GÏ: »Ý–å+ú–adäé1O¢×ä\IyèzÊ.q­$ÉÐõ¶Ømvþó‡óÄScÕš5TTŒãÇ_„ÝfK.0 ‹1¡b÷Ýób±v뾃†^Þ˜#’‹)pkî!yuêpeL¹­–‘•1iü'O>#áóÇ©®©¡<í§Ÿ9†H¼®ï»zœú€ž¾òô®yM×ñûýXÍæ„ÿ-Êaç£j·Û‡møK$‡2=uEJÓWЯ®H­”þg½"•®è1Sý, ô#O<Ãf±pêI'püqÇ …Ð4ƒÁ€ÍfÅl4‹E‰Çbiô×ÈÊÓÛ²Os1X]Ú­R•^«JÒß_"‘z{°zI×5ÊJGsçm· ‡±Y­˜†çí‹'ǰšØ,&4­§ý饑s‰Ð¥imÒÔ©_ʸ8z?íNzŸì›â®û«H?ëIQÜtWv_£ë:dedp¸Æ©“F¿ä›³|$Œmv°tEJm8$y«?‘pbÝjMº:êºF8@¦‘–ç ÔOÚûK$©·ÖKZ<ŽAQÞºHþ½€íºVד`š^ʈêÔž{:½ŸÖíG5ÈÉÎÂ`4¤>Økÿ¢¤YÄêõU:¦î×] Æ®ƌ҈–Hõ1$UÿRtž¯ÄÈ#„]K9"ˆ¯@ž‘ª¹È/‘HTo tЯ—ÄAÔK‡ƒN=ÔeLF¤ÛígwMM×݃ib_PkľÏûÏ@Äþ×÷Î^Ó5ZÛÛº¢òÈN*‘IϾÿ%éŠtn0,‡˜<îŸAÝQ"‘H½}Xé¥ÃAöCYÆ~Ý~¬+Š¢ö¸©‰¦6à÷º®è  ¤C‰$ÉHŽ ©Þ ~9º¢ûma#[Ê3r·’H$RoJzépý—±ñ¯¨  $Ü~r²Œiª¼p`¯tTE¡¨¨ƒA”.™$_ÝEt ô‹Þu.†’"ô¾s5ö?Íp¿HÅ ©äT‰ôÕ!©^gîï˜ÐCóIy’Ÿ“ÏPêR‰ä›=¦"z{8zépýp©ß>Æ¿ª0šLDÂ!ü ¡PˆQÅÅÉpHFƒ‘x<–<4+ï÷·ÚõwïkºcÏ÷ÿ·M‹SSW‡ÏëCE`4šPUƒì±_ªÁ€Ñh"ÐÑÕf—ò $ÐÑ‘è‡C_]aLè ³Å²_X±ýB¼‰ÔSËþ–(ÒþéV>”ýB‚Jyºó‰„CR—J$’CHo]/².õÛÇø7 Ø.üm-¸Ý^ŒF#ÑXŒêÝ»1 äç³»¦£ÑD^n»kj±XÌdgeQS[‹Õj%+3“ݵµØm62|>jjkq:x<jëêp9¸\.jëêð¸=8jëëðz¼¸\NÌ&3&£NnoFòd^ÉW¡(Tœn-M{±»\ؾæEÊÒ‹P(HKÓ^Ü^_Ÿ“† vgBW˜,¬V[•‹¤=®K}TÖàk¥÷ýº?‰ž'~ƒå ‡Ctvø¥.•H$‡ŒÞŽ^:d?\ê·—ñßÔár hj¨ÅãÍDŠ Q”Ä\ûþ6RRÔûoµkåTQª¢ TF%WøG'ÿ]RŒªPU¥ëïÄÑÎv‹‰¦†ZÜž .·ŒKýãòxˆFÂÔìÜNFV—«Ï*ðסëÄb1bÑŠª~£eÑ5@G-M{±Úl¸<úÓu»wáñf`w¸’îz}•Ú`”Ö`Ï4Ü÷{Ñc:j â±hÃÃÄ÷ùúÊ£i:Á@ím-R—J$’CBoW/²Nõ«4ì©os»Ýžîšº®£ë:±X”¶–füm-Ä¢ÑýލWú¬iíìÀþV“ٌۛ7#“Éœœ,H¾BcTèt´·Óéo'}mC° ¡'6¹ÃeQ£Ñ„ÓíÁåñ¤”#½®Ð¿ty #ùÅ£ij¨' «k_½Ÿü¼¼¯]ùƒ¡µµuèz†R«ÕJfF‡cÄï'„èe/ö´%¿Šúmii¥¦®–@ €Ñh$+3‹¢ÂL]!5ÛÚÛÙ³g&“‰Ñ£FÑÑÙÙë³Á`8à:øÒŒ!›·leWUÇ}4ÆW²eëVÖ}ºžœœlÎ8í4bñ8+V®"sÆé úÿÍÍͬúp5ÆWât8X±j^¯—Ó§«2†Kk[ï¯XA$íµÚf³1¶¬”/6nbBe%99Ù¼ûþL_9hã¿¥µ•÷W¬D×uæÎ™MeE±XŒ×~B0"/7Gÿ‰D"‘¦Dc1Ö~ò MÍÍ(Š’Œ£( &“‰¢Âv×ÔP1nÜ×Òøokkフ+‰F£¨ªšŒŸáó1gÖ,òóG¶Ì>XµŸ×ËQG™´%ÇWV—›û¥F橪ÞÍÊU«hkoÇ`0 ë:ƒŠòrfÏš‰‚÷?XAm]…dge'?äçSTX8,{·g¨Í<$ Ôh4’•ŶíÛinn&ÒÚÚ†¦éttt Ctäåæb2immÅb±ÅP·ÛÍøÊ rsrho÷SS[G(¦3Àãv‹Åhmk#‹ár:q¹\å¡ !ˆÇ5\N'Æï2ÆF£»ÝŽÐyy¹hš†®ëèz¢cF>!º®‰DØðÅFŠ 1™L]ùèÉë"‘íííD¢Q·ƒÁ@4%b¶˜‰E£D"Q¼^Š¢ÐÖÖ†¢ªdø|ÉÿeÕ™D"‘H$0ML<™p$ÌÞ½lÙ¶•ÌŒLÆ•—c2±X,8òrs‰D£¿fcºMÓðxÜL?]vﮡz÷nÖ~ºŽ“3O@ÎN¬6v›h4Jgg'V«ƒÑH ÀÚm'­]Ôîo§¶¶Žp8Lgg iKæçæ¡( š¦ÑÖÖFGg'‹… Ÿ/a{vÙS‹™X,N Àétàv»‡9 éäãµkiko§²b¥cÆÐÑÑɺõëÙ¸y3™™ø|>šššpØíTŒ+§££ƒ¦æfv;•˜L&"‘Í--Äb1œN'^gÀçß«ºlæ/ÅøÈÍÍÁb±ÐÜÒBg @»ßÍfMV|g @,#?/†½{Y±êCœ@€qååääd³sç.bÑM-ÍÄb1öîmdÍG3ãÈé|²n»ªªÑu›ÕÊS§2¾²â 5|»ÝÎØ²R, B$ŒÿªêÝlß¹“ɈÏçKÎæÁ ®^CUõàä3457³yËV&Œ¿/AQèì ðþŠÔï©GˆÄµã+*˜qätªwïf凫±Ù¬„âÑ(y¹¹ìihÀ`00eò$Ž˜2…P(Ī!È$‘H$‰äÀ0 ”••`±ì`ëömx<&Mœ€ªªTUU³}ÇNLF#ñ¸ÆªÕ_Ï1ÝåtQYY‰Ñ``Tq1¯-ó³wo#míí´·ûY±r%“&MäÈiÓ¨«¯ç½÷? ¢b>+?\´ËÇŽeÂøñ|°reo»¨²‚ñ¬^óÑ>{ñã)).bçÎ]F XûÉ:6oÝJ<GQòóò8zÎlZZZù`Å l6‘H„P8ŒËédîÑs(,(ry›šhnn&/7—YG…Ífëš é|°r›·l%‹‰F‰Åã¬[ÿYâs$BTQزm+^›?YÇž†„ÐQU'ŒgúG‡û<ÿiGL¥¤¤¤w|ôÇÍ›—t3*CÞðëózñ¸Ýøý~öìi ‰PTXˆªØÛØDsS3&£‘ÜÜ4M' ÒØÔ„Óå"33ƒx\£3@ (3£ÑˆÇ㦴t Ûwì`ó–­dee2yâDâšÆÇŸ¬¥¥¥å 4ZEQhnnæåoñÚÒe¼ºt)¾ØH<#‰D{NsÙ²e+[¶R>!ÈÏË%3#ƒM›7ÓÔÜ”ì¸ PW_Ïž† ˜2iñxœÍ[· ‰kÁ`h$JéèÑXÌfvUUE)[F4eó–­„Ãa¶lÝ6x™$‰D"‘Œ(Bt¿Ñè]î?±n;"%}Çtèòh°ÛíIŽ@ €¦Å †BÄ¢1âñ®Ï±ñ¸F(JÚ‡YY™ÔïIamÙJ,§¬¬4i/–•ŽA‘XlŽÆØUUÍgŸoÀf³2cút òóÙUUÅgŸN4! ÑÑÙIYY)ùy¹457³«ªjX¥õwt‹ÇÉÉÉNþ¹9¹˜Íf"‘cFÆd4ât8˜4a*+18N*ÊÇQSWÇÎ]»ÈÊÌ䈩S±ÛíTUï& ¦|þ­ý„ÎÎNÆö¨ƒÒÒÒrû²ñoµZÉÍÉ!²cçN ¤¸»ÍFCC{öîÅér‘‘‘A÷æ—¢ÂBN9ñÊJK»Œß„O\Iq F£—ËEA^MM͉u—•Ñh$²·±ñ 5[]âñ8±XŒX,ŽÖcó =&Ù±xœ†½{-ŸœN'“'M$wM*âÉ-A99ÙŒ¯¨Àf³ÓÖÞ†¦ihšN¬û!())fö¬™äççc0˜8~+jâYFJº‚º8ÊÇ–QVšXèv:ŒU‚ÉhJ.>74ì%7'›éGLÅl2¥±3´¶¶RRR’¬ƒ’¢¢®:CvûQ…ÜÜ6mÙBýž=Øm6r²³ñz½TUW£iãÊ˱Y­‘¨(Ÿ×Ûgã/¢{¶,@€®ëÉ×5¡P]oÁëqãõ¸±Z­­¡fefrÂüù˜-f“ÉÄÎ]U)¯ª|BÀ¨Q£¨ª®fç®*EIÌ… ¡¡›7c4ÈÊÊÂjµôÚ ŸÂÄ®nª¢b2™ztªÄÄ%ö%×™D"‘H$’¡óõÓ÷ô´··c2™p8„B¡¤½‰Ib¿Ós{Ú‡{ö¦µ‹„ûŽ¬í‘‡.tâq UU“ud±X0 ĵxò~6kb•¾{ÒÐm{—Ó‰Ñh¤¹%±ïÕl6‰`6‘h”\‡ƒj@нÿ³ûmHî5ª„v;5µuÔÖÕÇillÂn·×Ò?¡ëI™ÅžB<¬iCvv6V«5±ÁåÂåráóy‰umêÍËÍé5»SÔ~üÔDâõ˜¦iÉðP£G•0gÖLrssq8œ8΃ÖlUƒŠÕjÁj±$6¡t¿FÙ¯^CRŽÁË'°˜ÍLš8«Å’\ùk»kj‡ÃL2™#¦NÁ @ôzÙ€è!„@ ök«Fƒ§Ãù¥×™D"‘H$’Þ¶Ì@_ÇôP8LmmÛwìàÃÕ«éèìL,{<¨]†vk[­­­ÔÖu‡WW’•ÓmjýØE=ë±Û¾Ûö5n0š¦Q½{7TUU …p»Ý˜LÆî9Ê ž×@deeáñx¨««gÝúõ´´´PU]ÍúÏ7 „ ° `ß=ûΓÐuªªjüþ&OšÈücçáõxûh;:qõcgö¬ƒh4z@ÏmXñ&™´µµáõz1™Lx=^ ª³Ùœ ‰Ù=ëé=CèBGÉlÆl±P_¿‡?YÇèQ%ÔÔÖ²vݧlظ‰`0HNv6–®™ÕH£ë:B)»k·ŒÝ35UU3f45µ5Ë×õ&£û÷y¹¹Œ[Ƨë?Kæåt8BðùQ•Mt Âá‚}¿ï®GÑ5sì^è-5¶¬”Ý»wiu&‘H$‰d?{B¤³u€®1ûë6¦ !Ø»w/o¾ývrU?+3“©S&c4Éðùp¹œTUWÓ°w/z×5Ýeï¶³€.»È‘Ú.ŠDp:˜-fê÷ìaÍÇ“““¬ÓÒ1cØUUÅæ-[Ù½»†p$‚Ùdbü¸ 4]ïõÆAtÙgú0WÎ=n7Ó¦Na凫Yûɺ¤K·¦i”Ž͸ò±D"ÑÏ[t=Ъª¢ª*5µµìmlÄårÒÑÙ‰Çã&33«ÍJuuêç¯(ʾ:øècæ=gØ~ ×_wÝM‹ÅºÏ ÖèhoוÁzn`0°Z­x=^ÆŒ…ËéÄl6c³Ù().¢°°ƒª¢( ‡Â‚‚dX%EQ°Ûì•™‰ÓéÀëñ’•™ÁèQ£ÈÍÍIN.JŠ‹™vÄT<ϰ §iq FcÊò ‰) òÉÌÌìå;Õ-caA^»ÝžŒÍš“= |ŠV›•‚ü|^/ªªâõzqt哟—G†Ï‡ÓéÄãvSXXȘѣÉÈð‘‘áÃápôª7EQðz½`íz•›“Cnn>¯—ì¬ì«3‰D"‘H$Û=í »=1fû¼Þ¤o{ÂŽÈÇãñàp8»1}`ÊB~^y¹¹äSVZÊS¦““X¶Ùldx}¸Ýnrss³³)(ÈOØVûÛ9OJ»Èçó%Ò {13+“ÌÌ œNùùäåæ’››‹Óá #3ƒü¼<&MšÈ¨Q%(ª‚ÃÞó> ¹ òñù¼)Ë6Ð3÷ù|ädgãq»ÉÎÎ"//—ò²±L™2›Í†¢€Éd$?/¬.û²ççÌŒ |^/.—ËMAA>“'M"++ —Ó™ÚÎt»“›†½/YY™}l×¾åÐhmnÄåñ&½ZE!‰D”†=õmn·ÛÓ=+ŠÅ¢ÔUbf³å°í°B¢‘0f‹U†¼”H$‰D"íYöoL¹£Ñ;6AAÉhL&sÒø÷ûýíªìÞ‰D"‘H$É7iüK$‰D"‘H$Òø—H$‰D"‘H$Òø—H$‰D"‘H$Òø—H$‰D"‘H$Òø—H$‰D"‘H$_!iù}¬8¼èy˜†D"‘H$‰´#dÙ¿)åî¯ Æt?ˆE#Ýë‚'Ë!‘H$‰D"íYö¯{¹…X4’v`Lý“ÙrXò%‘H$‰D"‘|SIwP™±¿È“q%‰D"‘H$’¯‡á߯ñ?RÄâ-þ01Mƒ<ˆ0 d¸­˜Œùä$‰D"‘H$’ä ÿ‚†Ö zu#ï~Þ@ ¢ êW‹c'åpÙãÉÍp$f‰D"‘H$‰ä5þ… ×øÓ«yé£fÊË*(´¼@AÁïoåï¯,Ghnºp6f£¤û‘D"‘H$‰Drˆÿ@‹?Ä¿?ßCQÉ8t‹›¶hÿ>?* ñX„èž-|÷ØQ|²£fˆü çˆË …X±bŸ}öŠ¢0uêTfÍš…Íf£¾¾žmÛ¶1sæL,–‘ßð|°óë477ÓÙÙ‰Ûí&33³WZSS±X ŸÏ‡ÝnïóûÖÖV,K¯´x~±XŒºº:òòòlk„B¡^¿W—ËE$aåÊ•„Ãá佯ŒØ1cJnnnfõêÕäää0mÚ4TUMÖý§Ÿ~J}}=3gÎ$++ë õtiC­?§Ó‰ÕjvŸ¨½577ÓÞÞŽËå"+++­çH·[‰ä›Î`úÔ@×}™y|Y¶Å`ôÉ@cØPË´ÿX7X}|°žùaAÞú¶P0 ‚N tŠö¶±qýZ‰„ÅpÐu]èº&ªê[ÅÌ+‹SïÝ)Îøcý¾ìéý¹ë»SïÝ%޽ú9ñÈsoŠíµ-âô›_»ê[…®kB×u1RD"qûí·‹ÊÊJñ­o}Kœ|òÉ¢´´TÜ|óÍ"ŠÅ‹‹c=VìÙ³G vþ=ËùÐC‰£>ZL:UÌ;W<÷ÜsB×uÇÅŸþô'1sæLqä‘GŠ‹.ºHlÚ´©×ïëêêÄÂ… Å /¼ü®³³Süú׿3fÌS¦Lçwžøì³ÏRÞ?‹ ëC)ÇPä ÙFªL=Ù½{·¸ùæ›EuuµX²dÉ Ú†ßï—_~¹˜5k–8æ˜cÄœ9sÄ 7Ü ‚Á`¯ëž|òI1}út±~ýŽt0g IDATú~ó‹Çãâž{î3gÎsæÌsæÌ³gÏ3gί½öšøüóÏEii©˜}º7nœøùÏ.F¼í¾ûî»"//OÌ;WìÝ»7ù}ss³8á„Dnn®xûí·JßH—¦iÚ°êoÉ’%ÃîSµ·îö2eÊ1{ölñôÓO§”ó`´[‰ä›Ì`úÔ@×}™y|¶EOÝ3>éo Œ}²?ûuƒÑÇë™JD"a±qýZÑÞÖ’´ñCÁ€hØSßvpNøݳ;ˆi!@ FiÛ½‘h8€@I~‹„U¯ä‚£3ùñ¹ó±YÌûác¶nÝʳÏ>ËM7ÝÄóÏ?Ï /¼À•W^É3Ï<ÃÆÑu`0Øë ‡ÆÆFª««ñûý}f¯©ÒÂá0~¿ŸÎÎNvíÚESSS¯ê`óìØ±ƒªª*Âáð€ß÷äÝwßåw¿ûgŸ}6?þ8“'Oæ®»îbçÎ|ôÑGÜ}÷Ý,X°€ßþö·444p×]w ……B<òÈ#üèG?bÙ²e„B¡dž¯¼ò O>ù$—_~9<ðÜ}÷ݽ®éfÍš5úÇ`˱k×.^{íµAË3²T™z²cÇžþy6oÞL(êÕ6ÒÑÙÙÉÚµk9çœs¸öÚkùÅ/~ÁYg…ÉdJ^³víZî¾ûnªªªˆÅbý¿uSUŽ;î8~ö³ŸqÅWpå•WRVVFGGEEEÄãq„Üzë­¼ôÒK,Y²„_ýêW¼úê«<ðÀ躞lÛ555lÛ¶æææ^+DÁ`0y¿`0Hss3B‚Á`Ÿ¶Ç ‡Ã|ñÅ|üñÇÉß­_¿žÏ>ûŒP(D<@Ó4jkkÙ²e ­­­½ú`{{;Á`êêj’rö×7Þÿý”iÛ·oVý‡‡Ü§¢ÑhÚ~‡Ù¾};·ß~;Gy$ûÛߘ;w.üãÙ»wïA닉¤ÿ>Õ­ç:;;‰D"i¯‹D"iûwO]Ùß½†’ÇH’NîØ±£_]'„ ³³“P(”v ³Z­¬^½zHeJ5Öõ7ž¬g.Ý~’ö¿@ºHü‹GÃDk?¢ÒÑÂŽÚzô‚Y˜¬bá ÑêUüDZ¹üÇ9Çb2Ñô0ëh±î×A݆‰Ûíæ’K.!33“ŒŒ ¶mÛ– sªiO=õO=õÁ`ÂÂB®»î:Ž9æâñ8ýë_S¦½öÚk<õÔSØív¶oߎÅbáúë¯çì³ÏNæ=Pþ»wïæ—¿ü%Ÿ}öªª2{öìdC»õÖ[{}Çwôqزe ãÇç²Ë.Ãëõ¢iK—.e×®]¬ZµŠììl~þóŸ“™™IKK ·Þz+ÕÕÕ(**ÂårõÊóƒ>àˆ#Žàâ‹/Æd2QWWÇwÜA]]eee½®]¾|ù°î±?éʱmÛ6V¬X1hyFB¶‘*SÏ×¢>ø µµµÜ{ï½ÌŸ?ƒaà(WMMMèºÎ‰'žH~~>§×=›››¹çž{¨¨¨Ô)…Š¢0kÖ,fÍš@UUO>ù$7Þx#S¦Lá“O>AUU|>_òõî…^È_|ÁK/½Ä•W^‰Ëåâî»ïféÒ¥ÄãqÜn77ÜpóçÏçÆodܸqÜpà <ôÐClß¾E‹q÷Ýw³~ýúd[þõ¯¢(ø|>|>Ë—/çÔSOEQ–/_NIIIrbFùýïÏ‹/¾H,#;;››nº‰N8wÞy‡GyÇæM›ÐuE‹ñƒü m›ª®®fëÖ­)Óªªª(//rýqÄtvv¹OÕÖÖòÖ[o¥lo555¼÷Þ{¨ªÊe—]Fff&—]vÇ|Ê×Ð#Ýn%’o:éúÔîÝ»3f wÞy'ÙÙÙ„B!rrrRö½tý»ººšÊÊÊAõßÁæ1’ôg[¦Õ'‘H$Y/§žzjÚ1¬¿òî_¦tc]:}ú('N䮻¶6éƒÖ_þ­­­¼üòˬY³†|û￟͛7³fÍ–,YÒçû?ü°O9Ï;ï<yä¼^/@€Å‹ãp8ÈËËcÇŽŒ;·Û @YYBêêê°Ûí\wÝuü×ýÙÙÙ½:”Åb¡±±19Ómnn¦­­­×›îIÕÎ;‡uÁ–côèÑ˜ÍæAÉÓ“x<>,Ù†û»þðx<\tÑEäççóŸÿùŸ”””$W§û£¦¦†êêj®¸â ¾õ­oqöÙg³téÒäJøC=„¦i\qÅ½Þ †X,Æï~÷;< .ìó¦«'Gy$@€ÆÆF6nÜÈo¼Á/ùKžþy²³³ùóŸÿŒªª²xñbZZZ’m»¤¤„åË—³zõê>mYQìv;'žx"«V­¢±±‘––V¬XÁñÇÃá@UU^{í5þò—¿°hÑ"ž~úiFÅm·ÝFcc#ííí¼óÎ;dffòðÃ3yòd~øaZ[[ùÎw¾“²M²pá”i%%%î?§Ó9¤>ÕÞÞN]]]ÚöV[[˶mÛƒÜrË-œ~úéüô§?EÓ´>îHöE‰DÒÿXP__Á` ¼¼œüü|vîÜIYYY¯ëvíÚÅ®]»Òæ1н†’ÇH“nL.))Áf³¥Õ'ªª2vìXFMMM »wïî5†-[¶lÀºíÉ`ƺþƳ‘|ærå?º.ˆk:³¦Œå’32pÚL|ÑÅ ž|ímþcÁT.ùdN>ùdV®\Éý÷ßφ ¸å–[(--% ât:“«Ìf³9¹’šÎÐX°`K–,áÚk¯%//—_~MÓP…eË–ñöÛo'_¹E£QìvûïñÚk¯ñïÿ»ßrÜ|óÍ”——sê©§²xñâ”ò¤o:ápxÈåîïúy«*cÆŒÁn·3vìXvíÚ5¨ß™L&N8á¾óïP\\Ìý÷ßÏ­·ÞʤI“øì³Ïxýõ×¹ÿþû±X,hš†¦iƒ–iíÚµ¼óÎ;üápó´ÅbAQb±åååü÷ÿ7Á`·Þz‹½{÷b±XÐuÓO?gŸ}6¹Á¾©©‰ ðùçŸ÷iË|ôÑGèºÎ¼yóxûí·ù裰Ûíøý~Ž;î8^ýub±o½õGuçŸ>F£‘K/½”ïÿûlÞ¼EQ(**bÑ¢EŒ5Š °víZB¡)ÛTYYªª’••Õ'mìØ±\CéSB"‘HŸ>¤( ¡Pˆ@ @uu5^x!×\s ÿó?ÿÃÍ7ßÌ„ غu+ÿú׿¸/J$’¡!‘HƒÁÀe—]F$aéÒ¥)¯ ‡Ã„Ãáûe÷l#MNNNJýÙSG¦Ò'f³™Ë/¿<¹Š~üñÇ÷ÃÊÊÊ¥¯–.]:àX7”ñl¸Ïü`Öõalü t‘ðýÿ¢–oŠqæT#Fƒï-˜ÍÌIcSœ‹Éh$Þeø?µ²ƒÎˆ~ÐN^½z5ÕÕÕœwÞyœþùøý~>øà~úÓŸ²téR “3½ÖÖVÚÛÛyë­·0™LèºÎ©§žŠÍf£¥¥%ešËåBAff&6› ŸÏ‡ÕjíÕHúËßn·sÎ9ç‰DX¶l·Ýv‹…ÿþïÿfáÂ…Äb±>ß777³uëVf̘¦i<úè£<òÈ#Ìœ9“¿ýíoL›6 !‡¶¶6âñ8f³™ööö¤œý1oÞ<~ÿûß³lÙ2:::8餓ø¿ÿû?233Ù¼ysòþÓ§OÇëõÒÜÜ<ä{455 ªÉÓŸá<œò÷wƒQ*Bˆäÿ†£Ž:ŠéÓ§“‘‘ÀÕW_Í\Àúõëùë_ÿJcc#O=õMMMÔ××sï½÷rÍ5×0{öì~óÕ4§Ÿ~šÒÒÒ”×îß'?ÿüs, yyylÚ´‰{î¹!ååå˜Íf º®3qâDÊÊÊxã7P…òòrÆGYYYŸ6~Ï=÷ ª*BJJJ˜2e Ë–-Ãjµ2~üxF‚X,FKK  5f³ÙPU5éÖçv»“}°Ûpîî{=öXÊ6FyüñÇS¦ Ä@õ7Ø>õÆo››‹Ûí¦¥¥¥O{ËÊÊÂjµ2yòd~ö³Ÿáõzq8üë_ÿbË–-´´´ŒH_”H$à ,KÚë²³³Óöïžyôw¯Áæ1ÒˆŽh «®®”¾ …B<ùä“ýŽuÃÑÇ_öøÿU¢ÌÌJÒøo h<þžŸ%ëBhºÀl6QYV„Ål"® ^ú$È“+:èˆ$ö ˆƒäõÿùçŸsã7²nݺ¤0iÒ$\.Wra÷ÃÎÏÏÇëõrçwòøãs饗’››Kaa!yyy}Òòòò’³âÚÚÚäæ» 6‹Å())IxéòÏËË#++‹W^y§ÓÉ3Ï<Ã?ÿùO¬V+‹/æå—_Æårõú~É’%|ï{ßãÙgŸåÙgŸå;ßùï¼ó<ðW^y%<ðGqDrU|üøñlذššV­Z…Ûíеáµ×^cãÆüîw¿ãø6›ÒÒRrss¹à‚ ’÷ÿîw¿Ë¸qã†u /¼pPåHžt ·üRoö!’û@síßÿþwþøÇ?‰D’mMUU²³³ùÞ÷¾Ç¥—^ʨQ£ÈÏÏÇl6“››;¨U={öðî»ï²`ÁGŸôî¿Ñh”O?ý”üãÌŸ?ŸÜÜ\^zé%Z[[yâ‰'¸ÿþû™0aB²½9NN;í4^}õU^}õUN;í4GÊ6¾dÉ’äDÈjµrÊ)§°lÙ2–,YÂI'„ÝnGÙl¦  €M›6ÑÙÙ $6É~–ª> ï½÷^Ú6•.m0³êo°}j̘1QYYÙ§½¹\.FMiiirS3$6F¼^ïˆõE‰D2¼± ­­`0˜ò:—ËEYYY¿ytJˆÇãL˜0aXy,†«#…´··ã÷ûÓŽa999ƒª—X,Æ÷¿ÿý~Ǻáèã¯büÿz®ü ®ƒ&Š€¶ÎŸÞõ#œ=͆AUˆë‚Åkƒ<ñ¾ŸÎHbÀ:¬¿'žx"ÿûßùÉO~‚ 0›Í¼ûî»X­VN8á6oÞœ4rÎ:ë,þùÏrçw2eÊ/^ÌèÑ£q:œyæ™iÓE¡®®Žn¸™3gòòË/sÌ1ÇP^^ÎÆûÍ̘1x½^ZZZx衇¨ªªÀï÷3uêTÚÛÛyà’."~¿Ÿ‰'b2™zù¼ýûßÿfïÞ½¼÷Þ{¬^½]×±Ûí\uÕUœyæ™üãÿàç?ÿ9“'O楗^ââ‹/NN\z®döôAW%é7m0xùå—ùÕ¯~•ìl=7«žqÆú‡ÑhL®äöWŽ«¯¾ƒÁЯ<é®lÃý]¸Ýn4Mã±ÇcÒ¤Iºè(ŠBvv6÷Þ{/ð /pâ‰'2yòdfΜ™¼vÆ ¼ùæ›\rÉ%Lš4i@YÖ¯_ßïO¹JÒÑÑÁ}÷ÝÇ /¼@ à‹/¾ ++‹«®º*é×ßÐÐÀã?Ngg'Ë—/'³víZŽ=öXN:é$î»ï>ŒFcÒ•«¥¥…‡~¸WŸ8q"Š¢ÇÑu¹sç¢ë:‘H„yóæ¡ë:ñxUUùö·¿Í¥—^ʵ×^KYYÿû¿ÿË‚ ;v,üq¯É¼®ëÉêwÞIÛ7Þ}÷Ý”iW^y%&Lvý µOÙl6N?ýtž{î¹>í-++‹SO=•§Ÿ~𫝾šY³f±téRfÏžÍäÉ“QUµW,ëƒÑn%’o2=ûÔ¤I“X¼x1_|1¹¹¹„B!n¾ùfrrr¸ð S^—Í‚ xöÙgû¤åååQUUÅüc-ZÄ™gž™ÔƒÍcÿ¾=’¤“÷בûë“p8ÌM7ÝDnn.•••Ü{ï½ìÝ»—‚‚^|ñEN<ñDƇÝnç™gžé·^®ºêª^>ü©ÆºÁèã‘xæ³®&†ë¯»î&‹ÅbÝ7Hjt´·áËÊÆ`þÜ =áùw«Á‘ƒj0%mùPLðym‡Å@i¶‘W? ñ§÷üt„»C_B<ƒ@#ß=v§¹*:¼^/sçÎ%‰°iÓ&˜}:ÅÅÅL:•­[·²cÇæÏŸÏu×]‡×ë%///mÚš5k¨­­åøãgûöíuÔQ\sÍ5ddd ˜ÿµ×^‹Ï磢¢³Ù̺uëhlläœsÎá /dÊ”))¿ïyØ’®ë ñù|¸\.þöÞ<¾©*ÿÿݤIº%MÒ%¡--]hËÒ•ÒÂJ-"dQpAT„A)²Ü@GaÄ‘¿((: e© ›PT* £€ÐBÙJ÷Ò´I³/÷üþ€^[š¤ihçç|<Ïǣܓ{Îûœû~Ÿ÷ûž{‰D™L†ÄÄDDFF"99UUU(//ÇÃ?ŒiÓ¦qS$šƒ///¤¥¥q#éP*•øõ×_¡V«ñì³Ï⡇²»C\.w«Œ–´W~ýúA¡P´‘‡ÇãA¯×Ãl6·ùcY–;<ª£²¹S§æ­cÉ"‹áçç£ÑˆÔÔTÄÄÄp#)&“Éî=qqqˆˆˆ@II êëë1bÄÌ™3~~~mFZÄb1RSSáëëëT¨Õj„‡‡#;;››ÏØ\'___A,C¡P ''óçÏçŸEEEÏ磴´ááá˜9s&|}}¡T* |||––†ÄÄDÄÄÄ ¸¸•••6lfϞͽ€+•J¤¤¤pS~ ’““aµZÜF§âãã!‰ì¦%$$ÀÛÛÛá3qÖ~îÚ”#}óôô„T*EÿþýQQQk×®aàÀ˜7ožÝƒÏ:Ã)Jk›JJJâê9S¦Lá^º›ššŽŒŒ $''Ûý³|¼øP™Mð6¿q>ô,¾ý͆Áãï¼<€Ùl‚ÜËö<¿\u‚<Ïáoí¥‰Åb@»{ùwôzWµAK:ätu°q·ŸïÒù÷‚L&ëÒökϦœµQGì‘þ …Bé’‘BŒ&3Þþü ¶©ákyY-&hënàÉ~È{"ž"¡Ë‹!ÿ(èt: ÈårnkO åÏŠV«Ecc#är¹ÝC¨( …B¡t.ÿÕ‘ÿÛ£ø"&ß‹å¾/¹­Êµ½Æý¼øÕO†É÷G@$ðàòü_ÂÇÇçžW—S(ÿWðõõ½§=–) …B¡t]2í‡a€ÇCX79æ>Üë50™-íïàÃ"¡J dR ï.ð§P( …B¡Pþ|Á?üå2Ȥ’; ïßÏ€îÌÿçñøàÝ üiðO¡P( …B¡üƒÿæ€Û<]~0…B¡P( …Biº•B¡P( …B¡Á?…B¡P( …Bù¿D—ÏDZXmPiŒ°Øl.-øðùKé^¸—ÁYÜÔÔä’kjj"Ë–-#ýû÷'ñññdĈ¤°°°Ëú5guÓétdÅŠ$55•ôîÝ›<ðÀ䨱cnÅ0çÏŸ',ËvÊó3™ŒäâÙ3Dݨâb|ƒ^Gjª«»f·Òüf Xm X-f4Þ¼³QwûXÌÊŠ0i ?þúp¼DBB¸ƒÁ:“Ë—/ã‹/¾ÀâÅ‹ñÕW_aûöí˜5k>ÿüs\¼x,ËB¯×ß.ûÎ[h]]ÊÊÊ ÑhÚ¼¹ÛK3Ðh4Ðjµ¸~ý:nݺÕêíÜÕüu:®^½Š7nÀh4¶{½%………xçw0vìXlܸñññX¾|9®]»†Ó§OcÅŠÈÉÉÁßÿþwÔÔÔ`ùòå0 0 ذa¦L™‚ýû÷Ã`0pyîÙ³›6mÂôéÓ±víZhµZ¬X±¢Õoš9uê”[e¸Zëׯ£  Àey:C¶ÎªSK®^½Š¯¾ú %%%0 ­tÃZ­gΜÁ¸qã0oÞ<¼ôÒK3f ÷›3gÎ`ÅŠ¸qã,‹ó¯n<† ‚^x3gÎĬY³…¦¦&„††Âjµ‚‚¥K—bçÎØ½{7^}õUìÝ»k×®˲œn———£´´õõõ­F<ôz=Wž^¯G}}=!ÐëõmtÙjµÂh4âÂ… øù矹ûΞ=‹sçÎÁ`0Àjµr£-¸téZÙ Z­†^¯GYYjjj89ÙÆ÷ßo7íÊ•+nµ_÷îÝa4;lSf³Ù¡F\¹r¯½öúõë‡Ï>û X³f jkk]Öw“É„ãÇw¸¾ÊŸG}ÈÕ«WÚ;!Z­ƒÁa?îé鉓'OÚ/’ IDATµÙ–ýhKìõ÷Îúô{A¯×»#hµZ˜L&§í§ÓéÚõoðí·ßbëÖ­˜1cÞ{ï=B°jÕ*Æ.é×ÕÍb±à‡~À† 0uêT¬Y³V«o½õôz½CYÅ0o¿ý6 ²²²ºäùuù´rç,_–, X-F˜+N#ÎG…«U°§Cèé ‹AóÍ"<©ÀÓã2!xÀÆ;;æoóy¾90‘H$˜:u*üýý!—ËQZZÊPf³Ù°yóflÞ¼z½!!!˜?> «ÕŠO?ýÔnZAA6oÞ ooo\¹r"‘ ,Àرc¹¼ÛËÿæÍ›xùå—qîÜ9ðx< 0€3þ¥K—¶ºþú믷™qéÒ%ôêÕ Ï=÷¤R)l6öíÛ‡ëׯ£¨¨˜={6üýý¡R©°téR”••¡{÷îÐét …X,n•ç?ü€¤¤$Lž<•••xýõ×QYY‰¨¨¨V¿=tè[eÜ£z”––âÇtYžÎ­³êÔò“éûï¿ŠŠ ¬Zµ YYYàóÛßåêÖ­[`YC‡E·nÝàççתÌúúz¬\¹±±±í¾H4JLOOGzz:àÆØ´i-Z„„„üç?ÿǃL&ã>WNš4 .\ÀÎ;1kÖ,ˆÅb¬X±ûöíƒÕj…D"ÁÂ… ‘••…E‹!&& .¬[·W®\Ann.V¬X³gÏrºüÆo€aÈd2Èd2:tÇÃ08tè¸ ³ÙŒ÷Þ{;vì€ÅbA`` /^Œììl=z6l€ŸŸŠ‹‹Á²,rssñä“O:Ô©²²2\¾|ÙnÚ7гgÏ·_RR´Zm‡mª¢¢‡¶«oååå8~ü8x<ž{î9øûûã¹çžÃ}÷Ýgwj€#½½yó¦[õ¥Pþì8ó¯!!!íÝd2aÙ²e ÄðáÃöãÎ|M\\\›©öú{G}Rrrò=Owr'FèÞ½;–-[†   xyy9ìw”J¥SÿÖLcc#ÆŒƒÉ“'ƒÏ磨¨0›ÍŸÏ½ôkÎêVUU¡PˆììlÄÆÆbÿþý(**˲nÅ0ÍS[ÓÒÒ:ýùqƒV]f¤YQˆ¦ãSÅøÇ¢'05;–›EÐ6ÔÂt³Ïd)1y\&„XlÀÁ F¨ ¶.Ùç'..ƒ Â’%K0vìX,\¸GŽÁ˜1cÊÇÃ÷ßwß}“&MÂ'Ÿ|…BW^y*•ÊaZCCêêêpèÐ!ÄÄÄàƒ>@Ÿ>}°|ùrTTTpó·œåßÐЀ]»váÔ©Sxÿý÷±zõj”””àÔ©Sؽ{w›ë?ýôS›zN˜06l€T*…N§C~~>||| T*qõêUDGGsó㢢¢@Aee%¼½½1þ|¼ùæ› lÕ™ˆD"ÔÕÕq£õõõhlllõe£¹s¸víš[e¸Z=z@(º$ÏÝsöÜ‘ÍÝûœáç燧žz ݺuóÏ>‹°°0ntÚååå(++ÃÌ™3ñàƒbìØ±Ø·o7¾nÝ:Øl6Ìœ9³ÍhI{X,¼óÎ;ðóóÃøñãÛ|éjI¿~ý ÓéPWW‡‹/âÀxùå—ñÕW_!00ü1x<BBBŸŸ•JÅévXX:„“'O¶Ñe†aàíí¡C‡¢¨¨uuuP©TøñÇqß}÷ÁÇÇ<øä“O››‹­[·"<<¯¼ò êêê V«qôèQøûûcýúõˆÇúõëÑÐЀGyÄ®N…„„`üøñvÓÂÂÂÜn?__ßÙ”Z­Fee¥C}«¨¨@ii)ôz=–,Y‚‘#Gâù矇Ífkã$Ùbyy¹Ã¶pµ¾ÊŸG~),, ^^^íÇã!::=zô@yy9n޼٪߿¿S_SUUÕJWú{g}º;t´?köÉ|>ÑÑÑèÞ½»Ãö ÇÍ›7ú·–<þøãX¾|9~úé',X°[¶lÁ¨Q£ ‹>wqT·ššdff"00ýë_ñøãã‹/¾À¸qãàëëëЧ¸Ãtöóëò‘Îù«EzB4¦Ž’Ã×K€ÇGý,ù› ŽàéœDL‡,6‚¯ÏèñùI-Ì–®û—J¥X¿~=8€'NàÔ©Sضmz÷î 6p‹ !8xð ·ØäòåËP*•Ø»w/JJJpäÈ‘6i{öìÁ¥K—À0 ¢¢¢0cÆ cÖ¬Yxøá‡Q\\Ünþ{öìAII üüü Ñhðå—_";;o¿ý6âââP]]Ýæztt4¾ùæ=z0lØ0 6 pâÄ ¬^½¿ýö–,Y‚ÈÈHèõzøúúr£ÌB¡Iuè@NNvïÞyóæA©Tb×®]°Ùl`û÷ïÇ‘#G¸Ïf³ÞÞÞ.£  ÇŽsZ¼¼<ôìÙÇG~~¾]yœZÆ×ßÝûœ¾yóxˆˆˆ€··7¢££qýúu—îÈÎÎÆ#<‚îÝ»cõêÕXºt)úöí‹sçÎá›o¾ÁêÕ«!‰`³Ù`³Ù\–éÌ™38zô(þù϶»xZ$aX,ôìÙ“ûÌyøðaÔÖÖB$eYŒ9_|ñ·ÀþÖ­[ÈÉÉÁùóçÛèrll,NŸ> –e1xð`9r§OŸ†··74 † ‚o¾ù‹‡Fÿþýñè£ÂÃÃÓ¦MÃĉQRR†aŠÜÜ\„‡‡#''gΜÁ`@pp°]ŠŠŠÇC@@@›´èèè{n¿ŽØ!&“© 1 ƒÁN‡²²2Lš4 sçÎÅ¿þõ/äåå¡wïÞ¸|ù2¾ûî»vmÑd2Áßßþþþn×—Bù3d·ii7öì](búôéÜèþ}÷ÝצŠŠrÉÀ¾}ûÚíï;Ò§wh|·ƒ1ŸÏçêÞŒ½>øÚµkvý[Ÿ>}Zï>>>Ü€k×®Áh4¢ººƒí>ŸŽâ¨n<jµV«b±>>>ðññAii)t:C]q5†éªç×ÅÁ?KnÏý¿P*¶`t¢<ø|<ž3i}#Ñ]‡¬wÿÍ'š 5±N¸{áäÉ“(++Ä ðè£B£Ñà‡~ÀóÏ?}ûö!$$„émhh€Z­ÆáÇ!À²,†///¨T*»ib±„øûûÃËË “ÉàééÙÊpåïííqãÆÁd2aÿþýxå•W ‰ðÖ[oaüøñ°X,m®×××ãòåË€ÔÔTØl6|ðÁذaÒÒÒðÙgŸ!99„øùù¡±±V«B¡jµš“ÓƒÆ{gýû÷£©© ÷ß?¾ýö[øûû£¤¤„+?%%R©õõõ.ãÖ­[.Õ£=yœÎîÔßÝû\ù„Jáþu…þýû#%%r¹0gÎ<ñÄ8{ö,>ýôSÔÕÕaóæÍ¸u몪ª°jÕ*Ì; pš¯ÍfÃÖ­[i÷·wÛäùóç!‰ T*Q\\Œ•+W‚‚ž={B(‚ÏçƒeYôéÓQQQ8pà†AÏž=ƒ¨¨¨6:¾råJðx<B†„„ìß¿žžžèÕ«zôèB, T*‚ƒƒááq»óòòÇã¦õI$ΛçfÛûðÃíê”ÙlÆÆí¦µG{íçªM8p …‰*•ª¾ÀÓÓñññxá… •Jáããƒï¾û—.]‚J¥rÙÙ…B±Ï½ôíõãeee.ùOƒÁ€M›69íïÝé“îW}²³ö³×.'NDii)üÛl6üòË/J¥9r$† †;v`É’%˜:u*:½_sÔWËd2|üñÇðòò–-[ T*±}ûv,X°Ï<ó RSSÝŽaºòùuiðOÀpÁ¿JgÃÆãŒIò‚P(@\Ôí… V–`çôØôctw¶%]4ëÿüùóøÛßþ†ÈÈH¤¤¤@"‘ oß¾‹ÅÜ"Âæ`¯[·nJ¥X¶lÂÃÃQTT„={ö $$J¥ÒnZó[^EEjkk!“ÉðÛo¿Áb± ,, —.]j7ÿ€€ìÙ³¾¾¾øüóÏQVV†)S¦ ??µµµ‹Å­®ïÞ½ÿøÇ?ðÈ#p#²GŽÁÚµk‘››‹§žz ÞÞÞ°ÙlàóùèÕ«>þøc”——#22EEEH$í~+((À•+WðÎ;ïÀÓÓ“û’ P(ðÄO´*¿¶¶Ö­2&Mš„Ç{Ì¥z8“Ç øUwïsu¥yˆ+¿Ý²e êêê——‘H„ŠŠ ðx<âñÇç:@¡P…BáÒˆAuu5 1}útnT¥%Í - .^¼ˆ/¿üYYYP(X³f °cÇ(•JÌ›7/^ä¶&1b>ùä0 ƒiÓ¦ÁÇÇ[·nm£ã»wïÆ˜1c@§§'xà¼úê«àñxÈË˃··7! …Fqq1´Z-|}}qöìY@XXT*•Ýöäóù8~ü¸Cr”ÆãñÚ}>íµŸ«6ÐÐPÄÅÅaãÆ­ôM,£GˆŒŒÄ·ß~ µZ ©T ­V H¥RŒ1&Lh×#""PXXèv})”?+îö„h40 ã° B¯^½ðá‡Úõ5,Ë¢¡¡'NDjjªÃþÞ>é^hÏ'766B(âĉvÛÏQ»ðù|ÈårB R© °nÝ:ˆD"¼ÿþûJ¥Ü©÷Òw´nhll„——×îþþþàóù`Æ©¿i¯½ºòùuíÈ?!wæü0h4°ø¨ðö ÀØd/ðy ¬,Aþ=þß÷hMäÎújÅïСC±eË̘1999 …(,,„§§'²³³QRRÂ9cÆŒÁ×_eË–!!!ùùùèÑ£|}}1zôh‡i ಲ .DZZvíÚ…Aƒ¡gÏž¸xñ¢Óü#"" •J¡R©°nÝ:ܸq Ñh˜˜µZµk×rSD4 úôé@Ðj¾ß±cÇP[[‹ãÇãäÉ“`YÞÞÞxñÅ1zôh|ùå—˜={6âãã±sçNLž<™{qi9’Ùr:Ã0ܼi>Ÿ]»váÕW_å¾åbÕQ£F¹U†‡‡7’ë¬sæÌŸÏw*#Ü•ÍÝûœ!‘H`³Ùðᇢoß¾íNÑaXµjêêêŒíÛ·cèСˆçÀo¿ý†ƒbêÔ©èÛ·o»²œ={ÆîCSSÞ}÷]lß¾:.\@@@^|ñEn^MM 6nÜ­V‹C‡ÁjµâÌ™3ÈÌÌÄý÷ßwß}ÜT.•J…õë×·Òñ>}ú€aX­V°,‹ŒŒ °, “É„ÁƒƒeYX­Vðx<<ôÐC˜6mæÍ›‡¨¨(üûßÿFNN¢££ñóÏ?·z™gY–›NsôèQ‡¶QXXh7mÖ¬YèÝ»·Ûí×Q›òòòÂÈ‘#±mÛ¶6ú€áÇcëÖ­˜3gÒÓÓ±oß> 0ñññàñx­ö¶§·Ï<ó ñÝwß¹]_ åÏŠ#¿t·ÝÜmïF£‹/†B¡@\\V­Z…ÚÚZcÇŽ:t(bbbàííÏ?ÿ³gÏFß¾}‘ŸŸÉ“'C©TâÆøë_ÿŠ_|±Õp{ý½+}Ò½à¨?S©Tm|²Á`@^^‚‚‚`µZúu…Ba·]zõê…›7obêÔ©ÈÍÍÅý÷ߥK—âÅ_D·nݰk×.¤¦¦"66ï¼óN§÷kŽê&‘H0|øp¼ôÒKÈÍÍEhh(öíÛ‡ÄÄDÄÅÅáÝwßm7†±×^]ýüø æÏ_,‰<w’64©! Ÿïþ»ZgÂW…e€Ox|X ƒ…à|…>">"=°÷W>:®ÆØ¼?(`µZ]Ë ‡Ÿ¯'à⨨+H¥RdddÀd2¡¸¸555ˆÇâÅ‹‘†a P(’’‚îÝ»#11—/_ÆÕ«W‘••…ùóçC*•B©T:L;uê***pß}÷áÊ•+èß¿?æÎ ¹\ÞnþóæÍƒL&Cll,„B!~ùåÔÕÕaܸq˜4iì^oyØRójüÈd2ˆÅbH$Èd2$&&"22ÉÉɨªªByy9~øaL›6›"Ѭè^^^HKKãÞB#"" T*ñ믿B­VãÙgŸÅC=dw‡¹\îV-i¯ýúõƒB¡h#ǃ^¯‡ÙlnóDz,wxTGes§NÍ[Ç:’E,ÃÏÏF£©©©ˆ‰‰ARRl6L&“Ý{âââ’’Ô××cĈ˜3gN«CEšG™Äb1RSSáëëëT¨Õj„‡‡#;;››cÚ\'___A,C¡P ''óçÏçvUŠŠŠŸÏGii)ÂÃÃ1sæLøúúB©T"::>>>8xð ’’’ðôÓOƒÇã!..®.?ù䓉DËåHOOG`` ‚‚‚••…ŒŒ ðù|øøø -- ‰‰‰ˆ‰‰Aqq1*++1lØ0Ìž=›{W*•HIIá¦ü( $''Ãjµ"88¸NÅÇÇC$ÙMKHH€···Ãgâ¬ýܵ)Gúæéé ©TŠþýû£¢¢×®]ÃÀ1oÞ<»Ÿ9ÊG$9´¯¤¤$î³;…BqÍ/µ´Gþ­©© =zôÀ¨Q£ F›Í†ÌÌLÌš5 ~~~ËåHJJ₎9S¦L§§'l6 ’““¡T*íö÷Í ÿÛë“îGýYhh(ÁãñðØcaìØ±\ŒÐ¼ýqhh(ºwïnׯ§§§#22Òn»X­V $%%aÈ! ESSX–Ezz:æÎ hµÚNïלÕ-** ±±±hjj!ÉÉÉÈÍÍ…B¡p(Ks â°½îõùÙl64Ô×Aì'åòd&“ÉÄÔTW5J$¿æùÆ‹•e×ÛBaÇOï¼½7?AY­ãß( ì ¡È Í“yî|€Ô‹‡þ=D8}ÝŒƒ <æv*f“LÝ9ìxe‚ü:5øo‰Éd⦴gì‹Åîi¦öÒÖ­[‡;wâ믿†··w«‘ìŽæo2™¸Ï÷®\w§ :šGóÚW•Ñ2îEžšš¬]»jµº•Þ°,ËŸ-=º#›«÷uD–ŽÞÓüÉ•}Ü‘Ã,KyÔj5Nœ8E‹q{Ww¦.7/rëlçÖ’ÚÚZ¬Y³¦ËÚ¯=›r¦of³ùc‹ …Bùc`6›pµä‚Ãz@ rÁ¿F£QwÙ´Ÿ/>Ì&x›GFwš zßþfÃ܆åþ˜Í&Ƚ< paÏó{ÁU'ÈãñþÖ^šX,æV›·ø·—G¯wU´¤£ANWwË#—Ë1cÆŒ6Sh!ðññiœº+›«÷uD–ŽÞãŠnÝ‹nÙ½|>Œ7ß|YYYÈÌÌìtýàóù.p/Èd².m¿ölÊYuÄiàO¡P(”.ù'„Àh2ãíÏÏ`K‘¾á𸖗Õb‚¶îžà‡¼'Rà)º¼ò‚N§ƒÁ`€\.ç¶ö¤Pþ¬hµZ466B.—Û=„ŠB¡P(Jçò_ùgæöÞõL¾?Ë%|_r Z•k{ûyñ1ªŸ “ï€HàÁåù¿Dó>¯ åö¡0¹?1…B¡P(÷é’i? Ã<ºÉ1÷áÞ˜X¯Éli PúK “JÀÐíæ( …B¡P(”ÿà€‡‡þrdRÉ…ÀŽ÷ïgÀwæÿóx|n?VüS( …B¡P(àà¿ùàv ÏC—$L¡P( …B¡PÚ…®F¥P( …B¡PhðO¡P( …B¡Pþ/Ñåóq,VT#,6›K ~|>äO<øôéP( …B¡P(ÿÁ?AMƒí½ˆÂó5Й\ÛêÓGÄGfß <7ªr´<ŒB¡P( …B¡üÑ‚B`¶ÚðÑÞ‹Øyº=£bâÝþ!_ h4 زçˆÍ„Å“@èÁèŽ? …B¡P(Ê4ø Òpì|5BÃbÀŠ$h4;ŸóëÅsõ%<–Žÿ\U£^c@7yçd0ðã?âܹs`‰‰‰HOO‡——ªªªPZZŠ´´4ˆD¢N/»«óo ˲¨¯¯‡V«…D"¿¿«´[·nÁb±@&“Ù=yµ¡¡"‘¨UšÕjÅ­[·`6›!—ËÞän©GGäé Ù:«N¿¿'X­V—uƒ‚¦¦&ÆßÕ‰ ‘HZmk±XPYY ¥RÙ®®555Á`0´ºŸaˆÅb˜L&œ8qF£‘++""]¢Ãõõõ8yò$‚‚‚œœÌ’Ͳ,~ýõWTUU!-- ]fŽÒ:Ú~¾¾¾ðôôtÛ¦ÚÓ·úúz¨ÕjˆÅb8ÜÙY>-Ë—J¥H$Ô3R(.⬟uÕ8ú+öíŠOêˆ/èŽävVoGý««~ÍÙïšûâöòèŠzÛl6ÔÖÖÂd2A&“ÁÏϯ]yµZ­S¿Ñ¥Ï¶¦ºªÑ ×½NKô:-Q7ªÈųgˆÉd$îÀ²,aY¹QÕ@Òfå“V]#£ÖTýþ·¶ºõÿ×T‘QkªÉðU×IæœmdöƒäJ…ŠŒÌÛK®W5–µ–eIga2™Èk¯½Fâââȃ>H† F"##I^^1›Í$??Ÿdff’êêjÒtuþ-ë¹nÝ:ò—¿ü…$&&’ŒŒ ²mÛ6²,±Z­ä£>"iii¤_¿~ä©§ž"ÅÅŭ¬$ãÇ'Û·oç®iµZòÆoÔÔT’@&L˜@Î;g·|‹ÅâV©GGäé Ù:«N-¹yó&ÉËË#eeed÷îÝ.é†F£!Ó§O'ééédРAdàÀdáÂ…D¯×·úݦM›HJJ 9{ö¬Óü¬V+Y¹r%IKK#$$ iii¤  €œ?žDFF’øøx2xð`’’’BbbbÈìÙ³IMMM§ënaa!Q*•$##ƒÔÖÖr×ëëëIvv6Q(äÈ‘#]bŽÒl6›[í·{÷n·mª=}kÖ—„„2`À²uëV»r:˧©©‰,[¶ŒôïߟÄÇÇ“#FÂÂBB¡P\ÃQ?ëª/pô;WìÛŸÔ_ÐÉí¬ÞÎúÞ¦¦&—üš#ÿg0\Σ³ë­ÓéÈŠ+Hjj*éÝ»7yàȱcǸ>ön™-ZDšššú={öBÈ=?[“ÉH.ž=CÔ*.Æ7èu¤¦ºª±kvû!Íoh€ÕF@À€€ÕbFãÍ‹0u·¯€€Ål€¡¬“úã¯gÁK$!„;¬3¹|ù2¾øâ ,^¼_}õ¶oߎY³fáóÏ?ÇÅ‹Á²,ôzýí²ï¼µÕÕÕ¡¬¬ ¦Í¬½4£ÑF­V‹ëׯãÖ­[­ÞÒ\Í_§ÓáêÕ«¸qãŒFc»×[RXXˆwÞycÇŽÅÆåË—ãÚµk8}ú4V¬XœœüýïGMM –/_ƒÁƒÁ€ 6`Ê”)Ø¿? —çž={°iÓ&LŸ>k×®…V«ÅŠ+Zý¦™S§N¹U†«õ¸~ý: \–§3dë¬:µäêÕ«øê«¯PRRƒÁÐJ7¡ÕjqæÌŒ7óæÍÃK/½„1cÆ@ p¿9sæ V¬X7nÀb±8ÿêÆãaÈ!xá…0sæLÌš5 QQQhjjBhh(¬V+!Xºt)vî܉ݻwãÕW_ÅÞ½{±víZ°,Ëévyy9JKKQ__ßj”G¯×såéõzÔ×׃½^ßF—­V+ŒF#.\¸€Ÿþ™»ïìÙ³8wî ¬V+7ÚRQQK—.¡¡¡¡• ªÕjèõz”••¡¦¦†“Ó™m|ÿý÷vÓ®\¹âVûuïÞF£±Ã6e6›Ú©ÑhÄ•+WðÚk¯¡_¿~øì³Ï‘‘5kÖ ¶¶Öe}7›Í8pà¶nÝŠ3fà½÷Þ!«V­‚N§£CºJ;Øëgõz½C{'„p£½Î~WZZê’};²í–ýmG|+8’ÛÑõæ:›L&‡}ïÕ«W¡ÓéÚõkÎüŸP(DSS“Kytf½àûï¿Ç† 0uêT¬Y³V«o½õ´Z­]yG ‘HäÐo„……á§Ÿ~êÒgÛeÓ~ȳ|Y°,`µa®88®VTÁœ¡§/,Ì7‹ðt¦OË„@àkì옿ÍçùæÀD"‘`êÔ©ð÷÷‡\.Gii)w@™ÍfÃæÍ›±yófèõz„„„`þüù4h¬V+>ýôS»iؼy3¼½½qåʈD",X°cÇŽåòn/ÿ›7oâå—_ƹsçÀãñ0`ÀîÁ/]º´Õõ×_½ÍˆK—.¡W¯^xî¹ç •Ja³Ù°oß>\¿~EEE Äì¿tI| IDATÙ³áïï•J…¥K—¢¬¬ Ý»w‡N§Chh(Äbq«<øá$%%aòäɨ¬¬Ä믿ŽÊÊJDEEµúí¡C‡Ü*ãnÕ£´´?þø£Ëòt†lU§–Ÿßÿ}TTT`ÕªUÈÊÊŸßþ.W·nÝ˲:t(ºuë??¿VeÖ××cåÊ•ˆm÷E¢ù3czz:ÒÓÓ7nÜÀ¦M›°hÑ"$$$à?ÿùx<d2÷‰vÒ¤I¸pávî܉Y³fA,cÅŠØ·o¬V+$ .\ˆ¬¬,,Z´111X¸p!`ݺu¸rå rss±bÅ œ={–Óå7Þx Ã@&“A&“áСC>|8†Á¡C‡ƽX˜Íf¼÷Þ{رc, ±xñbdggãèѣذaüüüP\\ –e‘››‹'Ÿ|Ò¡N•••áòåËvÓnܸž={v¸ý’’’ Õj;lS8|ø°]}+//ÇñãÇÁãñðÜsÏÁßßÏ=÷î»ï>»Ÿ…éí7 V«1fÌLž<|>EEE(((€Éd‚î('Óíõ³,Ë:´w“É„eË–Áßß3gÎtø»cÇŽ¹dßÎ|R\\\‡}+8ªŸ£ëÍu ‚———ÃþU©T:õk®ø¿ö|cWÔ*++! ‘ØØXìß¿EEEÜ´G29ó»o¼ñF—>Û®ÛçŸ47`#Ñ”c|ªÿXô¦f‡Âr³Ú†Z˜ná™,%&Ë„Pà‹ 8xÁµÁÖ%ûüÄÅÅaРAX²d ÆŽ‹… âÈ‘#3f BCC¹Fäñxøþûïñî»ïbÒ¤Iøä“O P(ðÊ+¯@¥R9Lkhh@]]:„˜˜|ðÁèÓ§–/_ŽŠŠ nn—³ü°k×.œ:u ï¿ÿ>V¯^’’œ:u »wïnsý§Ÿ~jSÏ &`Æ J¥ÐétÈÏχ”J%®^½ŠèèhnŽ\TT!¨¬¬„··7æÏŸ7ß|­”J$¡®®Ž{󬯯Gccc«/ÍFríÚ5·Êpµ=zô€P(tIž–X­V·ds÷>gøùùá©§žB·nÝðì³Ï",,ŒvFyy9ÊÊÊ0sæL<øàƒ;v,öíÛÇ„¯[·6› 3gÎìðˆ‡ÅbÁ;ï¼???Œ?¾Í—®–ôë×:uuu¸xñ"8€—_~_}õññǃÇã!$$ùùùP©Tœn‡……áСC8yòd]fÞÞÞ:t(ŠŠŠPWW•J…ü÷Ýw|||ÀãñPPP€O>ù¹¹¹Øºu+ÂÃÃñÊ+¯ ®®jµG…¿¿?Ö¯_øøx¬_¿ xä‘GìêTHHÆo7-,,ÌíöóõõíM©ÕjTVV:Ô·ŠŠ ”––B¯×cÉ’%9r$žþyØl¶6NÉ™-–——câĉX¾|9~úé',X°[¶lÁ¨Q£ •JitG¡8ÀY?ëÌÞy<¢££îôw—/_n×¾ù¤êêjn Å]_àGr;ºÞ\çîÝ»;ôçááá¸yó¦C¿æªÿs–ÖUõ€Áƒ#00ýë_ñøãã‹/¾À¸qã ‘H\ª×Ý~Ãf³uù³íò}þYB`µ±HOˆÆÔQrøz ðø¨¿€%?bSÁ<“ˆI£3 ðð€ÅFðõ=>?©…ÙÒ5cÿR©ëׯÇpâÄ œ:u Û¶mCïÞ½±aÃnq!!äg\¾|J¥{÷îEII Ž9Ò&mÏž=¸té†ATTf̘àà`Ìš5 ?ü0Š‹‹ÛÍÏž=())ŸŸ4 ¾üòKdggãí·ßF\\ª««Û\ŽŽÆ7ß|ƒ£G† †aÆNœ8Õ«Wã·ß~Ã’%K ½^___n”Y(r#©Ž=ÈÉÉÁîÝ»1oÞ<(•JìÚµ 6› Ã`ÿþý8rä`È!0›Íðööîp8vì˜Ózäåå¡gÏž>|8òóóíÊãìíÝh4v¸þîÞçôÍ›ÇCDD¼½½ëׯ»tŸ@ @vv6yätïÞ«W¯ÆÒ¥KÑ·o_œ;wß|ó V¯^ ‘H›Í›Íæ²LgΜÁÑ£GñÏþ³ÝÅÓ"‘ ÃÀb± gÏžxë­· ×ëqøðaÔÖÖB$eYŒ9_|ñ·ÀþÖ­[ÈÉÉÁùóçÛèrll,NŸ> –e1xð`9r§OŸ†··74 † ‚o¾ù‹‡Fÿþýñè£ÂÃÃÓ¦MÃĉQRR†aŠÜÜ\„‡‡#''gΜÁ`@pp°]ŠŠŠÇC@@@›´èèè{n¿ŽØ!&“© 1 ƒÁN‡²²2Lš4 sçÎÅ¿þõ/äåå¡wïÞ¸|ù2¾ûî;—l±y1rcc#®]»£ÑˆêêjF—¬S(FöíÛ×n?kÏÞ…B!¦OŸîôw„‡öÝ«W/î ¤3Ÿd±X\’ñžÆwøº»¯Û«³½¾÷ÚµkvýZŸ>}Z ¾8ò ‰D.åÑÙõÖh4°Z­‹ÅðññJKKa0¸/ÎdºÛo˜Íæ.¶]ü°äöÜÿ 5À¡b F'zÀƒÏÇã9Ö7ÝxxÀz'ðß|¢ ZÛ©+³[ròäI”••a„ xôÑG¡ÑhðÃ?àùçŸÇ¾}û½U744@­VãðáÃ`YLJ——T*•Ý4±X BüýýáååÉdðôôl$:ËßÛÛãÆƒÉdÂþýûñÊ+¯@$á­·ÞÂøñãa±XÚ\¯¯¯ÇåË—©©©°Ùløàƒ°a䥥á³Ï>Crr2!ðóóCcc#¬V+„B!Ôj5'§3Œ÷Þ{û÷ïGSSî¿ÿ~|ûí·ð÷÷GII W~JJ ¤R)êëë;\Æ­[·\ªG{ò8 œÝ©¿»÷¹ò)‘Âýë ýû÷GJJ är9`Μ9xâ‰'pöìY|ú駨««ÃæÍ›qëÖ-TUUaÕªU˜;w. ÐîhÖÖ­[i÷·wÛäùóç!‰ T*Q\\Œ•+W‚‚ž={B(‚ÏçƒeYôéÓQQQ8pà†AÏž=ƒ¨¨¨6:¾råJðx<B†„„ìß¿žžžèÕ«zôèB, T*‚ƒƒááq»óòòÇã¦õI$ΛçfÛûðÃíê”ÙlÆÆí¦¹2è¬ý\µ©@¡P@"‘@¥RµÑ·€€xzz">>/¼ð¤R)|||ðÝwßáÒ¥KP©TíÚbóNN¿üò Äb1FމaÆaÇŽX²d ¦L™‚””åQ(wa0°iÓ&·ûÙö`^^^víûòåË\ðïÈ'1 ¡Pˆ?þ¸Ëdtgý«=¿6qâD”––¶ Üý®¤¤iiiHJJj“våÊ•N þí±mÛ6xyyaË–-P*•ؾ};,X€É“'#==ÉÉÉe²ç7<<<ºüÙviðOÀpÁ¿JgÃÆãŒIò‚P(@\TèmgÌìü›~l‚îΖ ¤‹fýŸ?ûÛ߉””H$ôíÛb±˜[DØlXݺuƒT*ŲeËŽ¢¢"ìÙ³!!!P*•vÓ‚‚‚¨­­…L&Ão¿ý‹Å‚°°0\ºt©Ýü°gÏøúúâóÏ?GYY¦L™‚üü|ÔÖÖB,·º¾{÷nüãÿÀ#<ÂÈ9rk×®Enn.žzê)x{{Ãf³Ïç£W¯^øøãQ^^ŽÈÈHA"‘´k¸rå Þyçxzzr_ žxâ‰Vå×ÖÖºUƤI“ðØc¹Tgò8ëXÝ©¿»÷¹:’мÄ•ßnÙ²uuuÈË˃H$BEEx<ñøãs©@ €P(„B¡pi Ôêêjbúôévç{7/üµX,¸xñ"¾üòKdeeA¡P`Íš5hhhÀŽ; T*1oÞ<\¼x‘Û¶lĈøä“OÀ0 ¦M›lݺµŽïÞ½cÆŒ!žžžxàðꫯ‚Çã!//ÞÞÞ „@("88ÅÅÅÐjµðõõÅÙ³gaaaP©TvÛ“ÏçãøñãuÊQÇk÷ù´×~®ÚTDDBCC‡7¶Ò7±XŒ=z 22ß~û-Ôj5¤R)´Z-<<< •J1bÄL˜0¡][ ŲeË  ñþûïC @*•‚a˜V}!…Bi݇Lœ8©©©îg !P«ÕàñxN·ÔŒŒÄÁƒíÚ7p{z D"AïÞ½Ûô‰xì±ÇÜöÞ©³P(ĉ'ìö¯ ÃØõk|>r¹„¨T*x{{;üL&ÃgŸ}†šš»i]˲P«ÕðòòâÚÖßߟüÚ²e ª««ÊdÏoðx<‡ñFg=[.~êwæü0h4°ø¨ðö ÀØd/ðy ¬,Aþ=þß÷hM·ƒ –ºjÅïСC±eË̘1999 …(,,„§§'²³³QRRÂ9cÆŒÁ×_eË–!!!ùùùèÑ£|}}1zôh‡i ಲ .DZZvíÚ…Aƒ¡gÏž¸xñ¢Óü#"" •J¡R©°nÝ:ܸqƒû¬”˜˜µZµk×rSD4 úôé@ÐjÞ×±cÇP[[‹ãÇãäÉ“`YÞÞÞxñÅ1zôh|ùå—˜={6âãã±sçNLž<™{qi9’Ùr:Ã0ܼi>Ÿ]»váÕW_å®åbÕQ£F¹U†‡‡7’ë¬sæÌŸÏw*#Ü•ÍÝûœ!‘H`³Ùðᇢoß¾í~ºcXµjêêêŒíÛ·cèСˆGZZ÷Ûß~û ÄÔ©SÑ·oßve9{ö,4Ý‘ƒ¦¦&¼ûî»Ø¾};t:.\¸€€€¼øâ‹Ü¼þššlܸZ­‡‚ÕjÅ™3g™™‰ûï¿ï¾û.<<<¸©\*• ëׯo¥ã}úôá‚O–e‘‘‘–ea2™0xð`°, «Õ ‡‡zÓ¦Müyó…ÿûßÈÉÉAtt4~þùçV,˲Ütš£G:´ÂÂB»i³fÍBïÞ½Ýn¿ŽÚ”——FމmÛ¶µÑ·€€ >[·nÅœ9sžžŽ}ûöaÀ€ˆÇku¶€=½}æ™g†¬¬,¼ú꫘3gºuë†üü|¤¦¦"..ŽFyŠ„Ba«õPÎúÙ»íÝh4"//xýõ×9Ÿy÷ïFŒ/¾ø/¾ø"ÒÓÓ±ÿ~ 0‰‰‰(++ÃÔ©S‘››‹Ñ£Gs}Dß¾}‘ŸŸÉ“'£{÷î­¥:ê \Å‘¯ky½¹ÎAAA°Z­ý¹B¡ÀªU«P[[‹àà`ìØ±C‡E¯^½póæML:sçÎ…R©´û»>}ú ´´ÿûßÛ¤ÅÆÆvª´¬ÇÈ#ðÒK/!77¡¡¡Ø·oŠŠ ¬\¹Ò¡LŽüFË~»+ž-Áüù‹E"‘çïNÒ†&u#dàóÝ7PëLøª° ð / €`°œ¯0ÃGÄGd öþjÀGÇ5Л÷¬V  «Ãc™áðóõ\u©TŠŒŒ ˜L&£¦¦ñññX¼x1À0  RRRн{w$&&âòå˸zõ*²²²0þ|H¥R(•J‡i§NBEEî»ï>\¹rýû÷Çܹs!—ËÛÍÞ¼yÉdˆ…P(Ä/¿ü‚ºº:Œ7“&MBBB‚Ýë-wh^•™L±X ‰D™L†ÄÄDDFF"99UUU(//ÇÃ?ŒiÓ¦qS$Z~zLKKãFÒ#"" T*ñ믿B­VãÙgŸÅC=dw‡¹\îVw¿Q;«G¿~ý P(ÚÈÃãñ ×ëa6›Ûü±,ËÕQÙÜ©SóÖ±Žd‹ÅðóóƒÑhDjj*bbb””›Í“Éd÷ž¸¸8DDD ¤¤õõõ1bæÌ™Ã*ÒrÄE,#55¾¾¾Nåððð€Z­Fxx8²³³¹ù…ÍuòõõEPPÄb1 rrr0þ|nW¥¨¨(ðù|”––"<<3g΄¯¯/”J%¢££áãッ")) O?ý4x<âââÚèò“O> ‘H¹\Žôôt"((YYYÈÈȟχÒÒÒ˜˜ˆ˜˜£²²Æ ÃìÙ³¹p¥R‰””nÊB¡@rr2¬V+‚ƒƒÛèT||’B¡P(”ÿÿÕ‘†anï]/ðÀäû#`±\Â÷%— U¹¶©Ÿ£úÉ0ùþˆ\žÿK4ïóJ¡PnŽòßÞa‚B¡P(Š}ºä[/Ã0‡°nrÌ}¸7&Ök`2[ÚßÁ‡DB”þȤ0.l¯G¡P( …B¡Pþÿþxxà/—A&•ÜYìxÿ~ pgþ?ÇçöÕ¦Á?…B¡P( …òþ›_nòÇbµA¥1Âb³¹´àWÀçC.ñ„ÀƒOŸ…B¡P( …ò¿üÔ4èñÑÞ‹(<_ɵ­>}D|dö Âs£zA!÷A˃Á( …B¡P(Ê-ø'f« í½ˆ§ëÑóÿcïÌã(¶¿ÿí™ÌL¶™Ìd!Cö°$!!$Á°Ä B@DåÅ+‚ÈzA$ "àT.¨øó‚‚‚„@Ù„ QBB !û2ÉLf_ºÞ?0}3;‰¯¿×þä‹…¢»Ÿ1é°tjø.\€Ýñ‡………………………å/ü)48{½A!1 "´è­¯ùဂѠƒ¾ö& Å/·åhRhÐÓ»ëÒh48þ<®]»Š¢€ÔÔT¸¹¹¡¦¦¥¥¥HII@ èò²»;ÿöÐ4¦¦&(•JˆD"øøøtHkll„Á`€D"1{òjss3A‡4£ÑˆÆÆFèõzx{{[=¼ÉÙ2©‡#òt…l]U§ÿŽ“ ŒF#x<žÝºAAkk+´ZíÕ ‰:lk0P]] ©TjS×Z[[¡Ñh:ÜOQ„B!t:.\¸­VË”ŽðððnÑᦦ&\¼x=zô@bb"sJ6MÓ¸zõ*jjj’’__ßn³ Ki޶Ÿ§§'\]]¶)[úÖÔÔ¹\¡P___‹[#Û£·Žè Ëß[>ØQbÍö¬õ'¶äp¶´…=ùÚÛOY«Ÿ-¿j_û³bªöm"‹!‰º´ohŸg—øíºÚšZEÔ*%Q«”DÞ"#7 ¯NKœ¦iBÓ&R^ÓLRæäG7Ü!c6Õü÷osmÇÿoª!c6Õ’‘î’¡ó÷’m{O²*}„Ü­i&4m"4M“®B§Ó‘•+W’ØØXòØc‘#Fˆˆ’Môz=ÉÉÉ!C‡%µµµ¤;èîüÛ×sË–-䡇" $==ìÝ»—Ð4MŒF#ùä“OHJJ 0`yî¹çHQQQ‡û«««É„ Èþýû™kJ¥’¬Y³†$''“øøx2qâDríÚ5³å §Êp¤ŽÈÓ²uUÚsïÞ=’M***Hnn®]º¡P(ÈÌ™3Ijj*‘J¥$==Ô××3×›ššHff&ñ÷÷'§OŸîÛ°”f2™œj¿ÜÜ\§mÊ–¾µéK||Ä’íÙêO,É¡ÑhˆJ¥rª´…½ý®=ý”µúYó«‡&„»üÚŸSµ¶¶’U«V‘’¸¸82jÔ(rîÜ9BÓ´Ó}ƒ¹<óóóòÛ:–Ü,¼Bä-2&Æ×¨U¤®¶¦¥{vû!m#?Àh"  @@ÁhУåÞM赪û×@@Á ×@SQ€©ƒ|ð'3à&àƒÂ Ö•”””àË/¿ÄÒ¥KñÕW_aÿþý˜3göìÙƒ›7o‚¦i¨Õêûeÿ>zmhh@EE E§‘­¹4­V …B¥R‰»w±±Ã(ÍÞüU*nß¾òòrhµZ›×Û“ŸŸõë×cܸqؾ};âââ°zõjܹs—/_ÆÚµk‘••…ýë_¨««ÃêÕ«¡Ñh Ñh°mÛ6LŸ>ÇŽƒF£aò<|ø0vìØ™3gbóæÍP*•X»vm‡ß´qéÒ%§Ê°·wïÞE^^žÝòt…l]U§öܾ}_}õŠ‹‹¡Ñh:è†%”J%®\¹‚ñãÇcÑ¢Eøç?ÿ‰±cÇ‚Çã1¿¹rå Ö®]‹òòr ëoÝ8 6 ¯¼ò fÏž9sæ 22­­­ ‚Ñh!Ë—/ÇÁƒ‘››‹7ÞxGŽÁæÍ›AÓ4£Û•••(--ESSS‡™µZÍ”§V«ÑÔÔBÔju']6Ðjµ¸qã~þùgæ¾ÂÂB\»v F£`2™PUU…[·n¡¹¹¹ƒ Êår¨ÕjTTT ®®Ž‘ÓšmüðÃfÓÊÊÊœj¿àà`hµZ‡mJ¯×[´S­V‹²²2¬\¹ À_|ôôtlÚ´ õõõvë{ûg∾°°üݱäƒ]]]qöìY«>D©TÚ´=µZmWbI@€ÜÜ\§úG[ØŠ”J%4EÙø|¾]õ³æWCBBðÓO?Ùôk]‰µXäĉؽ{7fÍš…>ø„¬_¿J¥Nõ ß}÷]§<7lØ•JÕ%~»Û–ýßÏò¥ @ӀѠ…¾ê2b=d¸]US@*ø®ž0hTÐß+ÀóCýñüø¡àñ\`¢µ]ówzÔ˜ˆD"¼ð ðññ··7JKK™ÊL&vî܉;wB­V#00‹/ÆàÁƒa4ñù矛MËËËÃÎ;áî²2¼úê«7n“·­üïÝ»‡×_×®]‡ÃAZZ£ØË—/ïpýÍ7ßì´âÖ­[èÝ»7^zé%ˆÅb˜L&=zwïÞEAAüüü0wî\øøø@&“aùò娨¨@pp0T*‚‚‚  ;äùã?¢ÿþ˜6mx<ª««ñæ›o¢ºº‘‘‘~{òäI§Êø#–êQZZŠóçÏÛ-OWÈÖUujÿšïÃ?DUU6lØ€ŒŒ p¹¶w¹jllMÓ>|8zöì //¯e655aݺuèÕ«—ÍDÛ+ÈÔÔT¤¦¦ÊË˱cǼöÚkˆÇ/¿ü‡‰D¼æœ:u*nܸƒbΜ9 …X»v-Ž= £Ñ‘H„%K– ##¯½öbbb°dÉÀ–-[PV‡—€ö IDATV† `íÚµ(,,dtyÍš5 ( ‰‰'OžÄÈ‘#AQNž<‰f`¡×ëñÁàÀ0 ðóóÃÒ¥K‘™™‰3gÎ`Û¶mðòòBQQh𯂠ðì³ÏZÔ©ŠŠ ”””˜M+//Gtt´Ãí׿(•J‡mªªª §N2«o•••8wî8^zé%øøøà¥—^ÂÃ?löµ·5½uX_XXþîXóÁ–üKyy9°jÕ*x{{céÒ¥Édfm¦i»úkr8Ò_;‚µ|ƒƒƒ±jÕ*øùùaäÈ‘e³§~¶ú¥5kÖXõk]¥çzçÎÈårŒ;Ó¦M—ËEAAòòò`0’’‚””‡û†––³yêt:xxx<°ßî¾}þI›&E%&$ ñþkÏà…Ì î@Ù\ݽüŸ )¦ >Ïpâ†r©[öù‰ÅàÁƒ±lÙ2Œ7K–,ÁéÓ§1vìX1ÈápðÃ?à½÷ÞÃÔ©SñÙgŸÁßß+V¬€L&³˜ÖÜÜŒ††œüðClܸÅÅŸtérss;]ÿé§Ÿ:ÕsâĉضmÄb1T*rrràáá©TŠÛ·o#**ŠY? Bª««áîîŽÅ‹ã­·Þ‚ŸŸ_¥hhh`FÖMMMhiiéðf£Í°ïܹãTöÖ#,, |>ß.yþ¸VÑÙœ½Ï^^^xî¹çгgO¼øâ‹ af§­QYY‰ŠŠ Ìž==öƇ£G23á[¶lÉdÂìÙ³;¼ °ƒÁ€õë×ÃËË &Lèô¦«= €J¥BCCnÞ¼‰ãÇãõ×_ÇW_}???|úé§àp8 DNNd2£Û!!!8yò$.^¼ØI—)Š‚»»;†Ž‚‚444@&“áüùóxøá‡ááᇃ¼¼<|öÙgX°`vïÞÐÐP¬X± Ëå8sæ |||°uëVÄÅÅaëÖ­hnnÆSO=eV§1a³i!!!N·Ÿ§§§C6%—ËQ]]mQߪªªPZZ µZeË–aôèÑxùå—a2™:u Öl±¶¶–Œ9«/,,G¬ù`K}Vhh((ŠBTTÂÂÂ`4-Úž5ŸaKŽcÇŽ9Ô_;е|¹\.S¿ÊÊJÜ»wÏlÙ[?K~Õd2Yôk555ÝòÌ-=×   Lš4 «W¯ÆO?ý„W_}»ví˜1c ‹î&Ožl1Ïíç»uæŸé|ÑD#5> /Œñ†§“Ç<šœÇ޼Óx>+SOÏÅÁ7WÔØsQ ½¡{f Äb1¶nÝŠãÇãÂ… ¸téöîÝ‹>}ú`Û¶mÌÇ…„œ8q‚ùH¥¤¤R©GŽAqq1NŸ>Ý)íðáøuë(ŠBdd$fÍš…€€Ì™3O>ù$ŠŠŠlæøðaÃËË …ûöíCff&Þ}÷]ÄÆÆ¢¶¶¶Óõ¨¨(|ûí·8sæ `Ĉ1bàÂ… ظq#~ûí7,[¶ P«Õðôôdf™ù|>3“j)Ѐ¬¬,äææbÑ¢EJ¥8tèL&(ŠÂ±cÇpúôiÀ°aà×ëáîîîpyyy8{ö¬Õzdgg#::#GŽDNNŽYy,ê#MC«Õ:\gï³:òæpwwwDEEáîÝ»vÝÇãñ™™‰§žz ÁÁÁظq#–/_Ž~ýúáÚµkøöÛo±qãF˜L&˜L&»eºrå Μ9ƒÿûß6? ( ƒÑÑÑxçw V«qêÔ)Ô××C €¦iŒ=_~ù%ó}cc#²²²pýúõNºÜ«W/\¾|4McÈ!8}ú4._¾ www( 6 ß~û- N:…âé§Ÿ†‹‹ f̘)S¦ ¸¸E!(( ,@hh(²²²påÊh4˜Õ©ÈÈHp8øúúvJ‹ŠŠzàösĦ!Ðétlˆ¢(h4¨T*TTT`êÔ©X¸p!þóŸÿ ;;}úôAII ¾ÿþ{›¶h0pôèÑÒ–¿#–|pß¾}™‰KþeæÌ™€#GŽØ´=[ý‰99–-[†¸¸8Œ3Æbý X‹¸\.S¿“'OâᇶÚFöö—ô«z½Þ®þ¸+éÑ£‡ÅX¤­M[ZZpçÎhµZÔÖÖB«Õ2ocí<<<Ìæ©×ëqêÔ©öÛÝüÐäþÚÿuÀÉ"Op —‹ÉYiHéŽð`ð\\`ü=ðßy¡JýÀ j‰‹/¢¢¢'NÄÓO? …Bü/¿ü2Ž=ŠÀÀ@f¦·¹¹r¹§NÇMÓ9r$ÜÜÜ “É̦ …BBàãã777€D"««k¥´–¿»»;ÆN‡cÇŽaÅŠxçw0a †N×›ššPRRHNN†ÉdÂG}„mÛ¶!%%_|ñA——ZZZ`4Áçó!—Ë9­1dÈ|ðÁ8vìZ[[ñÈ#à»ï¾ƒŠ‹‹™ò“’’ ‹ÑÔÔäpvÕÖ<Öœ¥3õwö>›ƒcš!„ù׈¤¤$x{{æÏŸgžy………øüóÏÑÐЀ;w¢±±555ذa.\ˆ´´4«ùšL&ìÞ½fûG›¼~ý:¤R)ŠŠŠ°nÝ:B >Ÿ.— š¦Ñ·o_DFFâøñã ( ÑÑш‰‰Addd'_·n8! A||<Ž;WWWôîÝaaa „À`0@&“! ..÷ݘ››8³¬O$16Ø8·ÙÞÇlV§ôz=¶oßn6ͶÚÏ^›:~ü8üýý!‰ “É:雯¯/\]]‡W^yb±øþûïqëÖ-Èd2›¶HQø|>>ýôS§õ……åïŠ9III÷ –ò\¾|9&Ožü@ýüŸüPLð/S™°ýœ„cû»Ïç!62è~gLüEç[¡ú}KPÒM«þ¯_¿Ž·ß~HJJ‚H$B¿~ý  ™Û‚½ž={B,cÕªU EAA>ŒÀÀ@H¥R³im£Ãªª*Ô××C"‘à·ß~ƒÁ`@HHnݺe3___>|žžžØ³g***0}útäää ¾¾B¡°ÃõÜÜ\¼ÿþûxê©§˜ÙÓ§OcóæÍX°`ž{î9¸»»Ãd2Ëå¢wïÞøôÓOQYY‰ˆˆ@$Ù4ȼ¼<”••aýúõpuueÞ$øûûã™gžéP~}}½SeL:“&M²«Öä±EQNÕßÙûì²B˜ï@ìùí®]»ÐÐЀììlTUUÃáÀÏÏ“'Of:>Ÿ»¶x«­­E~~>fΜÉÌ:´§íÃ_ƒÁ€›7obß¾}ÈÈÈ€¿¿?6mÚ„ææf8pR©‹-ÂÍ›7™-ÍF…Ï>û EaÆŒðððÀîÝ»;éxnn.ÆŽ B\]]ñè£â7Þ‡ÃAvv6ÜÝÝAŸÏG@@ŠŠŠ T*áéé‰ÂÂB@HHd2™Ùöär¹8wîœE²”Æápl>[íg¯M…‡‡#((±±±Ø¾}{} … CDD¾ûî;ÈårˆÅb(•J¸¸¸@,cÔ¨Q˜8q¢M[ ǤI“œÖ–¿#–|0—Ë…¯¯¯U …F£S¦LArr²Ã¶g2™ÐÒÒwww«r9r%%%õÎú¬öù¶M.X’ÍVpÞV?¸ººšõ«§ÛúcKXz®mË·>üðCðx<ˆÅbf«Ugú†¶e=̳Mÿ¤Ÿÿsfþ ù}Í?E€ OòïÆ%ºË¡`¤ r®¨ñ??( Ô‘ß÷Ⱥë‹ßáÇc×®]˜5k²²²Àçó‘ŸŸWWWdff¢¸¸˜ rÆŽ‹o¾ù«V­B||111xûí·Íú¹sç"""K—.…¯¯/Ö¬Yc—íýÑgTVVâÿø.\©TjVŽ^½záöíÛØºu+d2™Cý£=õ·”¯F£ÁÒ¥KáïïØØX‹²ÙS¿yóæaìØ±ýj{¿Ö¯_?äää˜í» k1Uff&V¬Xyóæ¡gÏž8tè’““™íø|>222°råÊNyÆÇÇwØïßY¿Í}uñâ¥Àõ¿¤ ­òH|ýÀå:?6«tø*¿ðè—@c ¸^¥‡‡€‹?¹ªÁ'çPhÛöŒF jÀ¤¡¡ðòt융±XŒôôtèt:¡®®qqqXºt)âããAQüýý‘””„àà`$$$ ¤¤·oßFFF/^ ±X ©Tj1íÒ¥K¨ªªÂÃ?Œ²²2 8 .„···Íü-Z‰D‚^½zÏçã×_ECCÆ©S§">>Þìõö‡;´}I‰D¡P‘H‰D‚„„DDD 11555¨¬¬Ä“O>‰3f0K$Ú ÜÍÍ )))̈><<R©W¯^…\.Ç‹/¾ˆ'žxÂì5ÞÞÞN•Ñ[õ0`üýý;ÉÃáp V«¡×ë;ýÑ4Íå¨lÎÔ©mëXK²…BxyyA«Õ"99111èß¿?L&t:Ù{bccŽââb455aÔ¨Q˜?>¼¼¼:ÍP …B$''ÃÓÓÓª...Ëå Eff&³~²­NžžžèÑ£„B!üýý‘••…Å‹3»FDFF‚Ë墴´¡¡¡˜={6<==!•Jœ8qýû÷ÇóÏ?‡ƒØØØNºüì³ÏB ÀÛÛ©©©ðóóC=‘‘ôôtp¹\xxx %% ˆ‰‰AQQª««1bÄÌ;—€K¥R$%%1K~üýý‘˜˜£Ñˆ€€€N:@`6->>îîµösÖ¦,雫«+Äb1ˆªª*ܹsƒ ¢E‹Ì|f-KúbïŽU,,G¢££ …B“É„¡C‡bîܹ …û¬þýûC"‘ µµaaaˆ‰‰aâK¶gÎg˜L&h4$$$`È!ˆˆˆè Çœ9s˜7{AAAhii‡ÃÁ¤I“0nÜ8»v”³†­|Ûê7fÌDEEu’­ýG°Öê—˜˜©Tjѯz{{£ÿþ̇ǣGÆôéÓ;ôÇ]…µX¤ÿþHKKCPPZ[[AÓ4RSS±`Áf âLßЫW/[ÌÓ¿m2™ÐÜÔ¡—˜y>EA§Ó騺ښ‘HäÕ¶ÞØ`Уºâ."zõŸïø)÷÷æ'¨¨—cš|¿~à Üж˜ç÷»q00L€ËwõhÖ˜À¡î§R  ×i@5\ÃÃÒëKƒÿöèt:fy­o0Ìžžf.mË–-8xð ¾ù渻»w˜Év4NÒ,]w¦ Í£íÛsJÜUe<ˆ"HÄ"Pvl¯ÇÂÂÂÂÂÂÂÂÂÂòÿ:øà⃷±è÷-ïßO~_ÿÏáp™}µÙàŸ………………………å/ü· îòtûAÂ,,,,,,,,,,,6a¿Feaaaaaaaaaaƒ–ÿŸèöõ8£ 2…“É®~y\.¼E®à¹pÙ§ÃÂÂÂÂÂÂÂÂÂò¿#ø'¨kVã“#7‘½*}[}z¸Ú¯^ÓþÞh0 Ë_-ø'z£ Ÿ¹‰ƒ—›Ù î¶ù¢@A¡hÆ®Ã'AL:,š¾ `wüaaaaaaaaaaù‹ÿd Î^¯EPH h-zëk~8 `4è ¯½…ICCñËm9šôôîúÃ4 Ο?k×®¢($$$ 55nnn¨©©Aii)RRR º¼ìîο=4M£©© J¥"‘>>>Òa0 ‘HÌž¼ÚÜÜ @Ð!Íh4¢±±z½ÞÞÞVor¶ Gêáˆ<]![WÕé¿ãd£Ñg·nBÐÚÚ ­VûßCõˆD¢[ã TWWC*•ÚÔµÖÖVh4š÷S¡PN‡ .@«Õ2e…‡‡#<<¼[t¸©© /^D=˜˜Èœ’MÓ4®^½Ššš¤¤¤À××·ÛlÃRš£íçéé WWW§mÊ–¾555A.—C(Â×××âÖÈ–ò±W—XXXÌû*sög¯ioûb±"‘È®´îì ìÁÙÚc®|{ÚÈ^¿ÚÕõs¦ß0™L¨¯¯‡N§ƒD"———ÍØÀÖóëŽØ‡¡®¶¦E£VµJIÔ*%‘·ÈÈÍÂ+D§Óg išÐ´‰”×4“”99äÑ wȘM5ÿýÛ\Ûñÿ›jȘMµd䆻dèü½dÛÞ¤¬JFFg!wkš M›MÓ¤«ÐétdåÊ•$66–<öØcdĈ$""‚dgg½^OrrrÈСCImm-éº;ÿöõܲe y衇HBBIOO'{÷î%4M£ÑH>ùä’’’B @ž{î9RTTÔáþêêj2a²ÿ~æšR©$kÖ¬!ÉÉÉ$>>žLœ8‘\»vÍlùƒÁ©2©‡#òt…l]U§öÜ»wdgg“ŠŠ ’››k—n( 2sæL’ššJL D–,YBÔju‡ßíØ±ƒ$%%‘ÂÂB«ùF²nÝ:’’’B D DÒÒÒHJJ ÉËË#ׯ_'$..Ž 2„$%%‘˜˜2wî\RWW×庛ŸŸO¤R)IOO'õõõÌõ¦¦&’™™IüýýÉéÓ§»Å6,¥™L&§Ú/77×i›²¥omúOÒÒÒÈîÝ»ÍÊi-{u‰……¥#æìÏÒÚÚJV­ZEHâââȨQ£H~~¾Í´îì ìÁ^Ù¬•oOÙëW»º~Îôjµš¬]»–$''“>}úG}”œ={Öfl`íùéõúŽ}t:-¹Yx…È[dLŒ¯Q«H]mMK÷ìöCÚF¥€ÑD@@€‚Ñ G˽›ÐkU÷¯€€‚A¯¦¢SùàOfÀMÀ!„9¬+)))Á—_~‰¥K—⫯¾Âþýû1gÎìÙ³7oÞMÓP«Õ÷Ëþ}dÖÐÐ€ŠŠ (ŠN£nsiZ­ …J¥wïÞEccc‡ª½ù«T*ܾ}åååÐjµ6¯·'??ëׯǸqã°}ûvÄÅÅaõêÕ¸sç._¾Œµk×"++ ÿú׿PWW‡Õ«WC£Ñ@£Ñ`Û¶m˜>}:Ž;FÃäyøðaìØ±3gÎÄæÍ›¡T*±víÚ¿iãÒ¥KN•ao=îÞ½‹¼¼<»åé ÙºªNí¹}û6¾úê+C£ÑtÐ K(•J\¹rãÇÇ¢E‹ðÏþcÇŽÇc~såʬ]»ååå0 Öߺq86l^yåÌž=sæÌAdd$Z[[£ÑB–/_Žƒ"77o¼ñŽ9‚Í›7ƒ¦iF·+++QZZЦ¦¦3%jµš)O­V£©© „¨ÕêNºl4¡ÕjqãÆ üüóÏÌ}………¸ví4 ŒF#3ÛRUU…[·n¡¹¹¹ƒ Êår¨ÕjTTT ®®Ž‘ÓšmüðÃfÓÊÊÊœj¿àà`hµZ‡mJ¯×[´S­V‹²²2¬\¹ À_|ôôtlÚ´ õõõvë»V«…J¥²©K,,,)--5k6}ˆR©„N§Ãwß}‡Ý»wcÖ¬Yøàƒ@Á†  Õjqüøq³i*•ª[û{°$w›lJ¥²ƒ¿7W¾%ÜÞÏÚê—º«~ŽÆ"wîÜÁ?þˆmÛ¶á…^À¦M›`4ñÎ;ï0o.,ùKÏÏÕÕgÏžíòØçOYöC~?Ë—&MFƒúªËˆõávU L©à»z QA¯ÏõÇó㇂Çs‰ÖvuÌßé5R[`"‰ð /ÀÇÇÞÞÞ(--e(3™Lعs'vîÜ µZÀÀ@,^¼ƒ†ÑhÄçŸn6-//;wî„»»;ÊÊÊ ðꫯbܸqLÞ¶ò¿wï^ýu\»v iiiX½z5Ôj5–/_Þáú›o¾Ùi Ä­[·Ð»wo¼ôÒK‹Å0™L8zô(îÞ½‹‚‚øùùaîܹðññL&ÃòåËQQQàà`¨T*A(vÈóÇDÿþý1mÚ4ðxÀ`0àç燥K—"33gΜÁ¶mÛàåå…¢¢"Ð4 àÙgŸµ¨S())1›V^^Žèèh‡Û¯ÿþP*•ÛTUUN:eVß*++qîÜ9p8¼ôÒKðññÁK/½„‡~ØìR3kzk0¬ê KgΞ=kÖþ<<233Ñ«W/;v  i4M[ôÿÖž_wÄ>&­º­¥HÛ)ÀD¢¨Ä„d!Þí¼ý(›ë¡»W€ÿ“!Å´ñCÁç¹À`NÜÐB®1uË>?±±±ûì3øûûcÅŠÉdÓš››ÑÐЀ“'O"&&}ôúöí‹Õ«W£ªªŠY»f-ÿææf:t—.]Ða–x IDAT‡~ˆ7¢¸¸—.]Bnnn§ë?ýôS§zNœ8Û¶mƒX,†J¥BNN<<< •JqûömDEE1ëô"##AAuu5ÜÝݱxñb¼õÖ[ðóóë`P ̨¾©© ---Þl´ ªîܹãTöÖ#,, |>ß.yþ¸VÑÙœ½Ï^^^xî¹çгgO¼øâ‹ af§­QYY‰ŠŠ Ìž==öƇ£G23á[¶lÉdÂìÙ³žÁ5 X¿~=¼¼¼0a„NoºÚ3`À¨T*444àæÍ›8~ü8^ýu|õÕWðóóçŸ~ ‡ƒÀÀ@äää@&“1º‚“'OââÅ‹t™¢(¸»»cøðá(((@CCd2Ο?Ït°yyyøì³Ï°`ÁìÞ½¡¡¡X±b —ËqæÌøøø`ëÖ­ˆ‹‹ÃÖ­[ÑÜÜŒ§žzʬNb„ fÓBBBœn?OOO‡lJ.—£ººÚ¢¾UUU¡´´jµË–-ÃèÑ£ñòË/Ãd2uê\¬Ùbmm-ªªª,ê ‹yJJJÌÚŸ»»»E Š¢…àà`L™2«V­ÂO?ý„W_}»ví˜1c  1iÒ$¬^½ºSšX,þÓúKLž<Ù¬l^^^LýÂÂÂ`4-–o©_·ägÍùÕ£±Hpp0 ???üãÿÀäÉ“ñå—_büøñðòò‚‡‡‡Eÿoíùuuìó§Íü3!0šh¤ÆGá…1Þðtãaò˜‡@“óØ‘wÏg%`êãé๸À`"øæŠ{.*¡7tÏ(N,cëÖ­8~ü8.\¸€K—.aïÞ½èÓ§¶mÛÆ|\HÁ‰'˜0JJJ •JqäÈãôéÓÒ>Œ[·n¢(DFFbÖ¬YÀœ9sðä“O¢¨¨Èfþ‡Fqq1¼¼¼ P(°oß>dffâÝwßEll,jkk;]ŠŠÂ·ß~‹3gÎFŒ#F.\¸€7â·ß~òe˵Z OOOf–™Ïç33©–=ÈÊÊBnn.-Z©TŠC‡Ád2¢(;v §OŸ 6 z½îîî—‘——‡³gÏZ­Gvv6¢££1räHää䘕Ǣ>Ò4´Z­Ãõwö>«#oááápwwGTTîÞ½k×}<™™™xê©§Œ7bùòåèׯ®]»†o¿ý7n„@ €Éd‚Éd²[¦+W®àÌ™3ø÷¿ÿmó"@Š¢`0wÞyjµ§NB}}=hšÆèÑ£ñå—_2Ø766"++ ׯ_ï¤Ë½zõÂåË—AÓ4† ‚Ó§OãòåËpww‡B¡À°aÃðí·ßÂ`0àÔ©S8p ž~úi¸¸¸`ÆŒ˜2e Š‹‹AQ‚‚‚°`Á„††"++ W®\F£A@@€YŠŒŒ‡Ã¯¯o§´¨¨¨n?GlŠN×Ɇ(Š‚F£J¥BEE¦NŠ… â?ÿù²³³Ñ§O”””àûï¿·Ë-éRß¾}íð°°ü „X´¿Þ½{33×–üËÌ™3;ͤ߹sZ­µµµÐjµÌì¾¹´öo÷º³/°„-ÙÚêwäÈ‹å÷èÑÃlYò³æüêÑ£G»¥~–°&ó/¿ü£Ñ¡Pxxx ´´*•Ši/sþßÿÛU±ÏŸüÐäþÚÿuÀÉ"Op —‹ÉYiHéŽð`ð\\`ü=ðßy¡JÝm;M\¼x˜8q"ž~úi( üøãxùå—qôèQ23½ÍÍÍËå8uêx<hšÆÈ‘#áææ™Lf6M(‚¸¹¹$ \]];‰ÖòwwwÇøñã¡ÓépìØ1¬X±ï¼ó&L˜ƒÁÐézSSJJJÉÉÉ0™Løè£°mÛ6¤¤¤à‹/¾@bb"!ðòòBKK ŒF#ø|>är9#§5† ‚>øÇŽCkk+yä|÷ÝwðññAqq1S~RRÄb1ššš.£±±Ñ®zØ’ÇZàìLý½Ïæà˜¦Aaþµ‡")) ÞÞÞ€ùóçã™gžAaa!>ÿüs444`çÎhllDMM 6lØ€… "--Íj¾&“ »wïFDD„ÙßþÑ&¯_¿@©TŠ¢¢"¬[·„DGGƒÏçƒË傦iôíÛ‘‘‘8~ü8(ŠBtt4bbbÙIÇ×­[‡BBBBcÇŽÁÕÕ½{÷FXX!0 Éd€‹Ë}7æææ‡Ã,ë‰DŒ ¶Îm¶÷ñÇ›Õ)½^íÛ·›M³…­ö³×¦Ž?ˆD"Èd²Núæëë WWWÄÅÅá•W^X,†‡‡¾ÿþ{ܺu 2™Ì.[‰DèÓ§:èÒ”)SPVVÆÿ,,f ( nnnfí¯´´û¬ö~ÿ—_~X,ÆèÑ£1bÄ8pË—/ÇóÏ?¡PØ!mÙ²e˜>}:’’’º½/°æã~ýõ×NrÿQ6­V‹;v˜-ÿŸÿü' `ÑÛãW5Åü¤~Ö°Ö7ìÝ»nnnصk¤R)öïßW_}Ó¦M³*‹¹ç׿»4öùSƒŠ þe*¶ŸS€`l7ðù<ÄFÞÿhÃHüEç[¡ú}KPÒM«þ¯_¿Ž·ß~HJJ‚H$B¿~ý  ™Û‚½ž={B,cÕªU EAA>ŒÀÀ@H¥R³im£Ãªª*Ô××C"‘à·ß~ƒÁ`@HHnݺe3___>|žžžØ³g***0}útäää ¾¾B¡°ÃõÜÜ\¼ÿþûxê©§˜ÙÓ§OcóæÍX°`ž{î9¸»»Ãd2Ëå¢wïÞøôÓOQYY‰ˆˆ@$ÙììóòòPVV†õë×ÃÕÕ•y“àïïgžy¦CùõõõN•1uêTLš4É®zX“Çšãv¦þÎÞgïLRÛw öüv×®]hhh@vv6ªªªÀápàçç‡É“'3‚ÇãÏçÃßßß®mÀjkk‘ŸŸ™3gvXWÚ~ÀÚxß¼yûöíCFFüýý±iÓ&477ãÀJ¥X´hnÞ¼ÉlË6jÔ(|öÙg ( 3fÌ€‡‡vïÞÝIÇsss1vìXBàêêŠG}o¼ñ8²³³áîîBø|>PTT¥R OOOBBB “É̶'—ËŹsç,ꔥ4‡cóùØj?{m*<<AAAˆÅöíÛ;è›P(DXX"""ðÝwßA.—C,C©TÂÅÅb±£FÂĉmÚbpp0>ÿüsÔ××wÐ%.—û@Z–ÿ߉ˆˆÀ‰':ÙŸ···U …ƒ~ø!\]]ñᇂÇã1Kz´Z->þøcðx¼iE11JSSÜÝÝ»­/°üoÙ²À¢lr¹F£S¦LArrr§òE"‘Õ6¢i---ððð€«««Y¿Êår-æÿ õ³†%™ÛêìææÆ”íãã.—kuBÏR_ÎåráëëkµŸr&öùsgþ ù}Í?E€ OòïÆ%ºË¡`¤ r®¨ñ??( Ô‘ß÷6ºë‹ßáÇc×®]˜5k²²²Àçó‘ŸŸWWWdff¢¸¸˜ rÆŽ‹o¾ù«V­B||X¹re'Ùz÷î ­V‹¥K—Â××kÖ¬1[~ïÞ½±gÏ‹>ØÃÃÓ§OǼyó0vìX³~•Ïçwø&­«êg k±ÈèÑ£±`Á,X°AAA8zô(лwo‹þ¿}_þÇ烷ß~Ûfì#“ÉŠ}:L„½ºxñR@àúßNÒ„Vy $¾~àrÈU:|•_xô‡Ë € 1\¯ÒÃCÀE„Ÿ Ž\Õà“s (´mûƒF£P5`ÒÐPxyºvΊڃX,Fzz:t:ŠŠŠPWW‡¸¸8,]ºñññ ( þþþHJJBpp0PRR‚Û·o###‹/†X,†T*µ˜véÒ%TUUáá‡FYYˆ… ÂÛÛÛfþ‹-‚D"A¯^½Àçóñ믿¢¡¡ãÇÇÔ©Soözûƒ-Ú¾. „D"P(„H$‚D"ABB"""˜˜ˆššTVVâÉ'ŸÄŒ3˜%í_m¦¤¤0£ÉððpH¥R\½zr¹/¾ø"žxâ ³;Ôx{{;UÆ_Z«Ç€àïïßI‡µZ ½^ßé¦iæð(Ges¦Nm[ÇZ’E(ÂËË Z­ÉÉɈ‰‰Aÿþýa2™ ÓéÌÞ‹ððp£©© £FÂüùó;*BP(Drr2<==­Êáââ¹\ŽÐÐPdff2ëÂÛêäéé‰=z@(ÂßßYYYX¼x1³³@dd$¸\.JKKŠÙ³gÃÓÓR©QQQðððÀ‰'п<ÿüóàp8ˆí¤ËÏ>û,¼½½‘šš ???ôèÑHOO—Ë…‡‡RRR€˜˜¡ºº#FŒÀܹs™¸T*ERR³äÇß߉‰‰0è¤SqqqfÓâããáîînñ™Xk?gmÊ’¾¹ººB,càÀ¨ªªÂ;w0hÐ ,Z´ÈìÁgÖò‰ŽŽ¶K—XXX:Æ„J¥‚V«Ebb"æÏŸooo‹}Vÿþý!‘HÐÚÚŠ°°0<þøã Akk+hšFjj*,X???ôêÕ ÁÁÁfÓŒF#4 0dÈDDD@¡PÀd2aèС˜3gN§ƒÛ÷º›—5ÙÚ­ CLL ·ý±/²ÖF^^^P«ÕHLL„T*µéW»º~æ°‹¤¤¤ &&­­­ „0úгgO«þ?::‘‘‘žßܹs! mÆ>hii‡ÃÁ¤I“0nܸN±˜ÉdBsS„^b&¢(èt:UW[Ó"‰¼Ú^O zTWÜED¯>àó?)íþÞüõrLX“â×|ÚóüþBb7† pù®Í8ÔýT ô: ¨†k8°bBzxuiðßNÇ,/°õà ƒÙ“ãÌ¥mÙ²Ä7ß|ww÷3ÙŽæ¯Óé˜×÷ö\w¦ Í£íÛK†Øe<ˆÛ~ë¬löÞçˆ,ŽÞÓöÉž]œ‘à C'yär9.\¸€×^{Ùo¾+u¹íC¯®ßõõõØ´iS·µŸ-›²¦oz½þmÑ]baaaaùë£×ëp»øBÂÀãñ™à_¡PÈ»mÙË…‡Íz\øm3£ÿí4›Õ4¾ûMŠº/ ÍLüSÐëuðvsÏŽ=Ï{ƒ ‡cñ·æÒ„B!üüüÀfào+G¯wW´ÇÑ §;sòx{{cÖ¬Y–ÐBàááÑ!ÀqV6{ïsDGï±G·D§ìÞL>§NÂ[o½…ŒŒ :´ËõƒËåÚu>ƒ ‘HºµýlÙ”µ6rÄ-åãˆ.±°°°°üï¦[fþ !ÐêôxwÏì*ÃÓ/.<ûò2tP6”ãÙ4/d?“Wßî!ÿ*¨T*h4x{{3ù°°ü]Q*•hii···ÙC¨XXXXXXXº–?u柢¨û{×ó\0í‘p ·ðCñ-(eöí¿êåÆÅ˜L{$ž “çÿ&Úöyeaa¹ÈUwíÀÀÂÂÂÂÂÂâÝò®—¢(€ÃAHOo,|²¦4) ÓlïàC>R$b(;¶×caaaaaaaaaaùüpqáÁÇ[‰Xôû‡À–÷ï§@¿¯ÿçp¸Ì¾ÚlðÏÂÂÂÂÂÂÂÂÂòþÛ÷yºý a›°_£²°°°°°°°°°üMøÓ§ä--ûg÷°°°°°°°°°°ü/þM& ¿Ÿ‚iÏ¿<>¿Û÷ífaaaaaaaaaaƒÿ.‚N‹ªòÛPÈ›AhbÏf? 8D^†F@ pe?øeaaaaaaaaaù+ÿ„Ð&ªÊoC«Õ ªW?ðí<ÅS¯Ó¡ân)ªÊo#,²8\.;`aaaaaaaaaù«ÿÀý“ÅòfDõê¡—Øîû®n ‹Biñuèõ:¸ºuý‰ çϟǵk×@Qšš 777ÔÔÔ ´´)))]^vwçßš¦ÑÔÔ¥R ‘HŸi0 H$fO^mnn†@ èf4ÑØØ½^ooo«‡79[†#õpDž®­«êÔ~ l4ÁãñìÖ BZ[[¡Õjÿ{¨ž@‘HÔa l0P]] ©TjS×Z[[¡Ñh:ÜOQ„B!t:.\¸­VË”ŽðððnÑᦦ&\¼x=zô@bb"sJ6MÓ¸zõ*jjj’’__ßn³ Ki޶Ÿ§§'\]]¶)[úÖÔÔ¹\¡P___‹%]• ‹}vãˆMYê3låa«/hï[Äb1D"Q—ÖßRiÿ쪾Ô\Ù뻲߰æÇM&êëë¡Óé ‘Hàååe3Ïn¶uµ5-µŠ¨UJ¢V)‰¼EFn^!:–8MÓÄd2‘V…œ\¾p–h5j‡óÐjÔäò…³¤U!'&“‰Ð4Mº NGV®\IbccÉc=FFŒA"""Hvv6Ñëõ$''‡ :”ÔÖÖ’î »óo_Ï-[¶‡zˆ$$$ôôt²wï^BÓ41ä“O>!)))dÀ€ä¹çž#EEE®&&L û÷ïg®)•J²fÍ’œœLâããÉĉɵk×Ì–o0œ*Ñz8"OWÈÖUujϽ{÷Hvv6©¨¨ ¹¹¹vé†B¡ 3gÎ$©©©dðàÁdРAdÉ’%D­îhk;vì III¤°°Ðj~F£‘¬[·Ž¤¤¤Aƒ‘Aƒ‘´´4’’’BòòòÈõë×IDD‰‹‹#C† !III$&&†Ì;—ÔÕÕu¹îæçç©TJÒÓÓI}}=s½©©‰dffrúôén± Ki&“É©öËÍÍuÚ¦lé[›¾ÄÇÇ“´´4²{÷n³rvU>,,,ĪݴÅ*ŽØ”¥>Þ<,õ†(•J²jÕ*2pà@GFEòóó»¬þæä¶×vU_úÇ6Ú³g1 vùã®ì7¬ùq•JEÖ®]K’““IŸ>}È£>JΞ=k3ÏÖÖÖ~¶:–Ü,¼Bä-2&Æ×¨U¤®¶¦¥Û‚ÅïÁ¿¦]@BÓt‡?BÓ„ö÷ѨUäò…³DÑ Áÿõë×ILL Ù±cQ«ÕD.—“÷ߟ„††’«W¯’o¾ù†$''“ššFæúúzR^^Näry§ºšKÓh4D.—“ÖÖVrçÎÒÐÐÀ¤}ýõ×vç¯T*IYY¹{÷.Ñh46¯·çĉ$,,Œ¬[·Ž\¼x‘Ìš5‹ôéÓ‡”••‘‚‚AV®\IN:E}ôQòÌ3ϵZMÔj5Ùºu+9r$ñðð _|ñ“ç—_~I"##ÉöíÛÉÙ³gɨQ£ÈÔ©S;„rþüy§Ê°··oß&ûöí³[ž®­«êÔž³gÏ’ÈÈHrâÄ ²oß¾ºaÍé8¼ûî»äàÁƒä믿&?üð1 Ìo~þùgK|||ÈÏ?ÿlÓf ÈÎ;É_|AvïÞM¦NJz÷îM®^½J~ýõWNöîÝKIee%Ùµk '¯¿þ:ãØõz=¹wï)))!„BL&ill$*•Š)O¥R‘ÆÆFBÓ4Q©TtùôéÓD,‰DBŽ=ÊÜ÷ý÷ß???"‰ÈñãÇ™À»²²’™LÖÁ[ZZˆJ¥"åå夶¶–‘Óšmœ:uÊlÚ­[·œj¿_~ù…h4‡mJ§Ó‘ .˜Õ7FCJKKIbb"Y¸p!¹zõ*Y´hIMM5«;–ôÖÑ|XXXîSRRbÖnêêêHYY™U›jmm%jµš¨T*‹~ÁRþ´KK}!„8p€ÄÄÄÿùŸÿ!'ÿ/{çe•?þ÷ÌÃm`¸É( xÄ èz‰0S¬ÔÍÚ,kýfiæjÒz׬´¶Õ;¹šÚn}[-Mk-ïbŠ®—RÒÖ65Å Èe¸Ì}æüþ0f%f`aw¿¿ïó~½xùò9ó|Îçœçó9çóœsžsrrÄðáÃŨQ£Dmmí=•½)½µ­õígMM0 ­Ò—:«£¢¢"qâÄ ‡íñ©S§Ü.·;±ˆÉdûöíÑÑÑbÍš5"''GdddˆáÇ‹ºº:‘““ãPf~~¾¸uëÖ=?Û¦‚ÿ6[óàΉ¾Â†âÎ5î|Ô[ÿá¯dw},öéÞ/Zu º~:¨~º% €‰'Bpp0ùùùöʬV+ëׯgýúõèt:"""˜5kƒ Âb±ðñÇ;LÛ½{7ëׯÇ××—Ë—/£T*™={6£G¶ËnNþ7xå•W8sæ r¹œþýû³dÉt: .lpýõ×_o´ââÅ‹tëÖÉ“'£V«±Z­dggsíÚ5rss cúôé„„„PQQÁÂ… )(( cÇŽÔÕÕ‰J¥j ó›o¾¡W¯^L˜0OOOŠŠŠxýõ×)**"66¶ÁosrrÜÊãç8+G~~>ÇŽsYŸÖЭµÊt÷”æ{ï½Gaa!Ë—/'==Ý¥]®nß¾ÍfcèС´oßžÀÀÀy–——³lÙ2âããí~×2™Œ´´4ÒÒÒ¸~ý:ëÖ­cîܹ$%%ñý÷ß#—Ë ²OIŽ?žsçαuëV¦M›†J¥béÒ¥dggc±X`Μ9¤§§3wî\âââ˜3g«W¯æòåËdee±téRNŸ>m·å7Þx™LFPPAAAäää0|øpd2999DEEQ^^þÓÒBï¾û._|ñf³™°°0æÍ›GFF‡bíÚµráÂl6YYY<ýôÓNmª  €K—.9L»~ý:]»vmqýõêÕ‹ÚÚÚûTaa!pho7oÞäèÑ£Èår&OžLHH“'Oæþûïw8=îÌn[*GBBâ‡vè7þþþìÚµËašŸŸF£‘Å‹ÂÔ©S¶ ÎäÿÜ/›ê *++5j&L@¡P››ËîÝ»1øùùÝÓÒgz;k[¯_¿N§NX¼x1aaaèõzÚµkwO}©³:òóó£_¿~ôëׯQ{œ’’âv¹ÝEŠ‹‹ñòò"##ƒøøxöîÝKnn.6›­ÉúÒh4múlÛð/aÂBÀO/wÿÙ]³Ý°ˆV×*!!Aƒ±`ÁFÍœ9s8xð £F"22Òž·\.ç믿æwÞaüøñ|ôÑG„‡‡³hÑ"***œ¦UVVRVVFNNqqq¼ÿþûôèу%K–PXXh‘iJ~ee%Û·oçäÉ“¼÷Þ{¬X±‚¼¼wc±XÜÒÍÝûš"00gžy†öíÛóüóÏõÓ–¸MsóæM ˜:u*?ü0£G&;;Û¾¶pÓÔm IDATõêÕX­V¦NЧ§g‹üÃl6óöÛoÈØ±c¿ÔßEŸ>}¨««£¬¬Œóçϳoß>^yå>ÿüsÂÂÂøðÑËåDDD°mÛ6***ì¶ENN'NœhdË2™ ___†Jnn.eeeTTTpìØ1{ã.—ËÙ½{7}ôYYYlܸ‘èèh-ZDYYZ­–C‡š5kHLLdÍš5TVVòøã;´©ˆˆÆŽë0-**Êíúó÷÷o‘OiµZŠŠŠœÚ[aa!ùùùèt:,XÀÈ‘#yñűZ­:˦|±%r$$$þÉ¥K—ú¯¯¯Ó4•J…L&£K—.DGG7Ù.4%ÃÕ¾`ܸq,Y²„o¿ý–Ù³g³aÃzè!Ôjõ=•½)½õ×ÑÑÑÈd2ºvíJûöí¹zõ*±±±÷Ô—ºRGMõg-ÅX¤¤¤„!C†ÆsÏ=ǸqãØ´icÆŒÁßßßiÍ7ÚôÙ¶ý!_õ£þÂÙëÁÿ;#h „ ÑA=jµš5kÖ°oß>Ž?ÎÉ“'Ù¼y3Ý»wgíÚµö …ìß¿ßþ‘Å¥K—Ðh4ìÚµ‹¼¼<<Ø(mçÎ\¼x™LFll,S¦L¡C‡L›6G}” .4+çÎäååHuu5Ÿ}öüþ÷¿'!![·n5ºÞ¥KöìÙáC‡6lÆ àøñã¬X±‚ü‘ ƒN§Ãßßß>ÊìååeIuèdff²cÇfΜ‰F£aûöíX­Vd2{÷îåàÁƒÜwß}˜L&|}}[œÇîÝ»9|øp“å˜?>]»veøðálÛ¶Í¡>MZ †—ßÝûš|ó–Ëéܹ3¾¾¾téÒ…k×®¹tŸ§§'<þøãtìØ‘+V°páBzöìÉ™3gسg+V¬@©TbµZ±Z­.ëtêÔ):ÄÿøÇf?žV*•Èd2Ìf3]»vå­·ÞB§ÓqàÀJKKQ*•Øl6FŽɦM›ìØß¾}›ÌÌLΞ=ÛÈ–ãããùî»ï°Ùl <˜ƒòÝwßáëëKuu5÷Ýw{öìÁl6sàÀúõëǯ~õ+<<<˜4iO>ù$yyyÈd2"##ÉÊÊ"::šÌÌLN:…^¯§C‡m*66¹\Nhhh£´.]ºÜsýµÄ§îl•lläC2™ ½^O]]Œ?ž—_~™¿üå/ÌŸ?ŸîÝ»séÒ%þö·¿5é‹ÍÉéÖ­›Ó™ ‰ÿË!úÍ‚ HHH@§Ó5éS/¼ðB“í‚3ùŽüÒY_УGû€EUUW¯^Å`0pëÖ- C«Ìì9jÏÚµk×dÛ:yòdŒF#ÙÙÙ÷Ô—ºZG-éÏšÃYÙšŠEär9Z­‹Å‚J¥ÂÏÏ???òóó©««k²¾®^½Ú¦Ï¶ÍƒóàŸÁÿ] ‚„h“Q€'NPPPÀc=Ư~õ+ª««ùæ›oxñÅÉÎÎ&""Â>Ò[YY‰V«åÀxzzb³Ù>|8>>>TTT8LS©T! ÁÇÇ€   ¼½½vSò}}}3f F£‘½{÷²hÑ"”J%o½õcÇŽÅl67º^^^Î¥K—èÛ·/V«•÷ߟµk×’ššÊ'Ÿ|BJJ B©ªªÂb±àåå…V«µëÙƒæÝwßeïÞ½ÔÔÔðÀðÕW_B^^ž=ÿÞ½{£V«)//oq·oßv©ÍéÓTàìNùݽϕ)T!„ý_Wèׯ½{÷&88€3fðÔSOqúôi>þøcÊÊÊX¿~=·oߦ¸¸˜åË—óòË/Ó¿ÿ&åZ­V6nÜHLLŒÃßþü¥êìÙ³(•J4 .\`Ù²e!èÚµ+^?Ôg³ÙèÑ£±±±ìÛ·Ï>úGlll#_¶lr¹!QQQ$%%±wï^¼½½éÖ­:uBÙl¦¢¢‚:àáq§óññA.—Û—õØ}°>à­÷½?ýéOmÊd2ñÁ8LkŽæêÏUŸÚ·oáááPQQÑÈÞBCCñöö&11‘ßüæ7¨ÕjüüüøÛßþÆÅ‹©¨¨pÉ›’séÒ%)ø—p€L&ÃÇǧ‘ߌ;–+W®àëë{O>åL¾#Žú‚úŠŠ T*#GŽdذa|ñÅ,X°€gŸ}–Þ½{·IݸÒ~*•Ê{îK]©#wÚcwËæ¬ âÃ?ÄÇLJ 6 Ñhزe ³gÏæ¿þë¿èÛ·¯Óø¦­Ÿ­¼mݤñ2áì¶ŸbþúkmÃÙ³g™;w.ÿøÇ?ìBÏž=Q©TX,–Á^ûöíQ«Õ,^¼˜>ø€I“&NDD¦QšF£±¿ÉRZZ À?þˆÙl&**Êà9“¯Ñh eçÎøûûóé§Ÿòå—_âííͶmÛØ¾};*•ªÁõ;vا“6mÚÄã?ΡC‡XµjÓ¦McÕªUôêÕË>*Þ­[7~üñGnÞ¼ @nn.Í.mؽ{7çÏŸçí·ßæü#>>>ÄÄÄÎSO=eÏÿ‰'ž ..έ<ÆïR9šÓ§©FÃòßK½¹2‚Rÿˆ+¿Ý°a+W®Äh4ÚmM.—Ƹqã˜4iÑÑÑ´oß///ÂÃÃ]õ¸uëGŽ!33ÓáºA‹Å‚“ÉÄ?üÀgŸ}Fzz:ááálݺ•ÊÊJþçþ‡+Vн{w»½ùûû3bÄvíÚÅ®]»1b~~~m|ÇŽö!ooo|ðAöîÝËŽ;xàðõõE——:tàÂ… ÔÖÖpúôi»Ÿ9ªO…BÁÑ£GÚ”³4W^Ìš«?W}ªsçÎDFF’ÐÈÞT*:u"&&ƒÁ`ï4kkkñðð@­V»ä‹®È‘pŒ3¿ nÖ§ªªª¨®®vK~½Œòòrôz½Ã¾@¡PÈ{ï½Çòå˱Z­xzz¢V«í[D¶MµŸBªªªÐétn÷¥V«Õ>Ñ\¹Ó»S¶¦b‘°°0ªªªðññ±÷Á!!!(~:¿Ê™L›ÍÖæÏ¶MGþEýÔýƒ_ÙÏôëGúeÿœµléDK:t(6l`Ê”)dffâååÅ‘#Gðöö&##ƒ¼¼<{3jÔ(¾üòK/^LRRÛ¶m£S§NøûûóÈ#8M“Éd1gÎRSSÙ¾};ƒ ¢k×®œ?¾Iù;wF­VSQQÁêÕ«¹~ý:ÕÕÕ$''£ÕjYµj•}‰Huu5=zôÀÓÓ³ÁúîÇSZZÊÑ£G9qâ6› ___^zé%yä>ûì3¦OŸNbb"[·ne„ ö—»íî5è2™Ì¾nZ¡P°}ûv^}õU»Qßý±êC=äVö‘ܦÊ1cÆ  E“ú8Ã]Ýܽ¯)°Z­üéO¢gÏžÍ.Ñ‘Éd„……±|ùrÊÊÊèС[¶laèС$&&’ššjÿí?þÈþýû™8q"={ölV—Ó§OS]]íp”¤¦¦†wÞy‡-[¶PWWǹsç 套^²¯ë/))áƒ> ¶¶–œœ, §NbÈ!<ðÀ¼óÎ;xxxØ—rUTT°fÍš6Þ£G{#f³Ù8p 6› £ÑÈàÁƒ±ÙlX,är9¿üå/™4i3gÎ$66–¿þõ¯dffÒ¥Kþþ÷¿7hm6›½:tèSß8räˆÃ´iӦѽ{w·ë¯¥>åããÃÈ‘#Ù¼ys#{ eøðálܸ‘3f––Fvv6ýû÷'11¹\Þ`/kgvÛœ ÇŒ1‚M›6ñÒK/‘––ÆÞ½{éß¿?=zô <<œ 64JKJJÂ`00þ|BCCyýõ×í}æÏÛgò“““)((`âĉ¼üòËh4–/_Nii):tà‹/¾`èС$''sß}÷ñꫯòÒK/Ѿ}{¶oßNß¾}IHHhµzø¹ÞÎúëéÓ§Ãüùói×®ãÇ··I={ödÛ¶m.õ¥7oÞä¹çžcÆŒ<üðÃ먾ír¥=n ®Ä" Úñ€€†Îoû[²²²ˆŒŒ$;;›äädxçwœÊ oÓg«˜=kÖ<¥RéýÏNÒJ¶Š Ð0 ÷Þ îLË›(/»EHXøOr„ƒ¿¯ ?Í€Ål¦üv ¡í4xþ4]ßZ;þ¨ÕjˆÑhäÂ… ”””˜˜È¼yóHJJB&“NïÞ½éØ±#ÉÉÉ\ºt‰+W®žžÎ¬Y³P«Õh4§i'Ož¤°°û￟˗/Ó¯_?^~ùe‚ƒƒ›•?sæL‚‚‚ˆÇËË‹ü㔕•1fÌÆORR’Ãëw¶Tÿ5~DDAAA¨T* "99™˜˜RRR(..ææÍ›<úè£Lš4ɾDâîiµÔÔTûHzçÎÑh4üðÃhµZžþy~ùË_:Ü¡&88Ø­<rôéÓ‡ðððFúÈårt:&“©ÑŸÍf³ÕRÝÜ)“ÍfkR•JE`` ƒ¾}ûgû7ïIHH sçÎäååQ^^Έ#˜1cFƒƒCêýP¥RÑ·o_üýý›ÔÃÃíVKtt4ö5˜õeò÷÷§]»v¨T*ÂÃÃÉÌÌdÖ¬Yö]•bccQ(äççÍÔ©Sñ÷÷G£ÑÐ¥KüüüØ¿?½zõâ׿þ5r¹œ„„„F¶üôÓO£T* &--°°0ÚµkGzz:D¡PàççGjj*ÉÉÉÄÅÅqáÂŠŠŠ6lÓ§O·¿€k4z÷îm_òNJJ ‹…:4²©ÄÄD”J¥Ã´¤¤$|}}>“¦êÏ]ŸrfoÞÞÞ¨ÕjúõëGaa!W¯^eÀ€Ìœ9ÓáÁg­%GBBâŸqD¿~ý¨««Ã`0’’ÂŒ3 qšj?¸©S§NÄÇÇÛc›Ÿ· MÉ·X,èõz’““ûl³}°ÕjE¯×Ó«W/âââœÖ3Ðl{Ü\‰E"""¨ªªB.—óÄO0zôh ±±±ÄÇÇSSSƒ‚””²²²§¶¶Ö©Ì´´´{~¶V«•Êò2Tj{œ&“É0FYɭ⪀€€ÀúÑv³ÙDQÁ5bâ»ãåÕòÓ;ë×/ëêêÈûñ{ºvKÂÛÛûÎ’WóÈd˜ z.ž?C||ÚÙ£-Nœ4öåÍ=x³Ùìð4SGi«W¯fëÖ­|ùå—øúú6Én©üú)ŸŸ§9»îN´TFý· ®:”;yÜ‹>%%%¬Zµ ­VÛÀnl6›=ø¬ÿ­»º¹z_Ktié=õ3H®ìèãŽî`6›é£Õj9~ü8sçÎeéÒ¥dff¶ª-×ÔÜú;£´´”•+W¶Yý5çSMÙ›Édj_l‰ ‰ÿlL&#WòÎÑ!ªžž^ö࿺ºZÛ&Ë~d2r¹¹LŽÙhø)¸vm) 0Èeò6 úëq5ØËåNë(M¥RÐlàßœü–^o«:¸›–mø;Ò'88˜)S¦4ZB#„ÀÏϯApê®n®Þ×]Zz+¶u/z¸ƒ#9àÍ7ß$==!C†´º}( —ÎG¸‚‚‚Ú´þšó©¦ê¨%þØZr$$$$$þ÷Ò&#ÿBÌ&W.Çb6Ñ>" O;“ÉÄ­›xxyÓµ[«/ûùWPWW‡^¯'88ؾµ§„ÄÿUjkk©ªª"88X:¸õÒëõ;vŒ3gÎ “ÉHNN&-- Š‹‹ÉÏÏ'55¥RÙêy·µü»±Ùl”——S[[K@@!!! Ònß¾Ùl&((ÈáÉ«•••(•Êi‹…Û·oc2™nòð&wóhI9Z¢OkèÖZeúç{²Àb±àééé²m!¨©©Á`0ØÕS*•4Ø×l6STT„F£iÖÖjjjÐëõ î—Éd¨T*ŒF#ÇÇ`0Øóêܹ3;wn.//çĉ´k׎””û)Ù6›~øââbRSS m3ßp–ÖÒúó÷÷ÇÛÛÛmŸjÎÞÊËËÑjµ¨T*BCCnìLŽ«zKHH¸îïV«•ÒÒRŒF#AAA6)ÏQ»ÐR?oï]í'Üá^us§ÝùW–Ïw·Õjµš€€—údWc˜»e6Õ7´JÙKnWéuuBWW+tuµB[U!Ο>%ŒFƒp›Í&l6«¸^\)R§m.¿*ZYüÏ¿U·þe±xhå-1|ù51dÆf±vó~q¹°BŒœ¿K\+®6›UØl6ÑZFñÚk¯‰„„ñðËaƉ˜˜1þ|a2™Ä¶mÛÄ!CÄ­[·D[ÐÖòï.çêÕ«Å/~ñ ‘œœ,(6oÞ,l6›°X,âÏþ³HMM}úôÏ<óŒ¸páBƒû‹ŠŠÄرcÅ–-[ì×jkkÅo¼!úöí+’’’Äc=&Μ9ã0³ÙìV-)GKôi ÝZ«LwsãÆ 1þ|QPP vìØá’mTWW‹^xA¤¥¥‰Aƒ‰ˆ9sæN×àwëÖ­½{÷§OŸnRžÅbË–-©©©bÀ€bÀ€¢ÿþ"55UìÞ½[œ={VÄÄĈÄÄD1xð`Ñ»wo'¦OŸ.JJJZÝv9"48p (--µ_///"<<\%´Uö_¯«%·Š«Úf·Q?B «@ C Ãb6Quã<&CÝk2Ì&=ú‚\Æá¹GÓñQz!„¸s ˜h]Õ.]ºÄ¦M›˜7oŸþ9[¶laÚ´i|úé§œ?›Í†N§kp(YYYTWW7u”f0¨®®¦¶¶–k×®qûöío¯®Ê¯««ãÊ•+\¿~ƒÁÐìõ»9räo¿ý6£Gæƒ> 11‘%K–põêU¾ûî;–.]Jff&øÃ())aÉ’%èõzôz=k×®åÙgŸeïÞ½èõz»Ì;w²nÝ:^xáV­ZEmm-K—.mð›zNž<éV®–ãÚµkìÞ½Ûe}ZC·Ö*ÓÝ\¹r…Ï?ÿœ¼¼<ôz}ÛpFmm-§Nb̘1Ìœ9“ßþö·Œ5 OOOûoN:ÅÒ¥K¹~ý:f³¹éY7¹œûî»ßüæ7L:•iÓ¦KMM ‘‘‘X,„,\¸­[·²cÇ^}õUvíÚŪU«°ÙlvÛ¾yó&ùùù”——7E×étöüt:ååå!ÐétlÙb±`08wîÿûßí÷>}š3gΠ×ë:1üÎTaa!/^¤²²²jµZt:”””ØõlÊ7¾þúk‡i—/_v«þ:vìˆÁ`h±O™L&§~j0¸|ù2¯½ö}úôá“O>aàÀ¬\¹’ÒÒR—í]§Ó‘žžîô¹KHH´Ìߣ¢¢8zô(k×®eâĉ¬\¹‹ÅÂ[o½EMM½ý®oëµ _ýu“2~Ž£öÞ•~šӭ¶¶¶A{ïH·¦ú›wùœñÕW_±qãF¦L™Â»ï¾‹‚åË—£ÓéœêâííÍáÇÆ0û÷ïw(Ó`0°k×.‡}ƒÑh¤®®îžËÞfË~ØØl`10~G‚_W ‹±vHÃËÛ³¾Ó\~=$œ_‚§§V›¡µcþFÓuõI@@'N$$$„àà`òóóí”Y­VÖ¯_ÏúõëÑétDDD0kÖ, „Åbáã?v˜¶{÷nÖ¯_¯¯/—/_F©T2{ölFm—Ýœü7nðÊ+¯pæÌär9ýû÷·wØ .lpýõ×_o´ââÅ‹tëÖÉ“'£V«±Z­dggsíÚ5rss cúôé„„„PQQÁÂ… )(( cÇŽÔÕÕ‰J¥j ó›o¾¡W¯^L˜0OOOŠŠŠxýõ×)**"66¶ÁosrrÜÊãç8+G~~>ÇŽsYŸÖЭµÊt÷Tï{ï½Gaa!Ë—/'==…¢ù]®nß¾ÍfcèС´oßžÀÀÀy–——³lÙ2âãã›}‘¨ŸnMKK#-- €ëׯ³nÝ:æÎKRRßÿ=r¹œ   ûtåøñã9wî[·neÚ´i¨T*–.]Jvv6‹…€€æÌ™Czz:sçÎ%..Ž9sæ°zõj._¾LVVK—.åôéÓv[~ã7ÉdDNNÇG&“‘““CTT”ýÅÂd2ñî»ïòÅ_`6› cÞ¼ydddpèÐ!Ö®]K`` .\Àf³‘••ÅÓO?íÔ¦ ¸té’ôëׯӵk××_¯^½¨­­m±OràÀ‡övóæMŽ=Š\.gòäÉ„„„0yòdî¿ÿ~‡KÍœÙí7HMM%55µ‘Þ)))R”'!áF{¹nÝ:¼¼¼ÈÈÈ >>ž½{÷’››‹ÍfÃh4²xñbBBB˜:uªÓv¡¨¨È¡ «Õêp™¤£ö¾¹~Â]œévwù‚ƒƒ™7ousVŽÚuùœQUUŨQ£˜0a …‚ÜÜ\vïÞÉdjRgýÍÕ«WÑjµdîÙ³N×d¼¥Óéî¹ìm·ÏÿOÏÈf«Q}“±}Uü÷ܧ˜˜‰ùF.µ•¥oäò_é&Œ‚—§f+ì?g@«·¶É>? 4ˆ 0zôhæÌ™ÃÁƒ5j‘‘‘vã’Ëå|ýõ×¼óÎ;Œ?ž>úˆððp-ZDEE…Ó´ÊÊJÊÊÊÈÉÉ!..Ž÷ߟ=z°dÉ í뱚’_YYÉöíÛ9yò$ï½÷+V¬ //“'O²cÇŽF׿ýöÛFå|ì±ÇX»v-jµšºº:¶mÛ†ŸŸ†+W®Ð¥KûÚ²ØØX„áëëˬY³xóÍ7 kàlJ¥’²²2û[}yy9UUU f6ê_ª®^½êV®–£S§Nxyy¹¤ÏÏ×ì¹£›»÷5E`` Ï<ó íÛ·çùçŸ'**Ê>:Ý7oÞ¤  €©S§òðÃ3zôh²³³í#á«W¯Æjµ2uêÔ‚˜ÍfÞ~ûm;vl£™®»éÓ§uuu”••qþüyöíÛÇ+¯¼ÂçŸNXX~ø!r¹œˆˆ¶mÛFEE…ݶ£¢¢ÈÉÉáĉlY&“áëëËСCÉÍÍ¥¬¬ŒŠŠ Ž;Æý÷ߟŸr¹œÝ»wóÑG‘••ÅÆ‰ŽŽfÑ¢E”••¡Õj9tè!!!¬Y³†ÄÄDÖ¬YCee%?þ¸C›Šˆˆ`ìØ±Ó¢¢¢Ü®?ÿù”V«¥¨¨È©½’ŸŸN§cÁ‚Œ9’_|«ÕÚ¨hÊ‹‹‹]zî®ûûàÁƒ ã¹çžcܸqlÚ´‰1cƈL&£K—.DGG7Ù.8“¡V«äßT{ßT?q/¸R¾N:a±Xší‹škwþåsƸqãX²d ß~û-³gÏfÆ <ôÐC¨ÕjnܸáTg1Ldd$O<ñD#™#GŽ$((Èi|S^^Þ*eoó}þmB`±ÚHKêÂć‚ñ÷ñdÜC¿À&ޱn÷A~™ÌøGâéáÙ*øò”ŽOOÔb2·ÍØ¿Z­fÍš5ìÛ·ãÇsòäI6oÞL÷îÝY»v­ýãB!û÷ï·HqéÒ%4 »ví"//ƒ6JÛ¹s'/^D&“Ë”)SèСÓ¦MãÑGåÂ… ÍÊß¹s'yyyR]]ÍgŸ}FFF¿ÿýïIHHàÖ­[®wéÒ…={öpèÐ!† ưaÃ8~ü8+V¬àÇzWp) IDATdÁ‚ÄÄÄ Óéð÷÷·2{yyÙGRz™™™ìرƒ™3g¢Ñhؾ};V«™LÆÞ½{9xð }JÏd2áëëÛâÒ”.Žb˜úXåç2M&#GŽtoµFÙÛ8øØÄµÿçJ ç‚™G’=ðP(—ÙŸÔžéÜ1O,?þë×Pk´µÙ×Ú'Nœ   €Ç{Œ_ýêWTWWóÍ7ßðâ‹/’MDD„}¤·²²­VËðôôÄf³1|øp|||¨¨¨p˜¦R©B‚AAAx{{7èl›’ïëë˘1c0ìÝ»—E‹¡T*yë­·;v,f³¹Ñõòòr.]º@ß¾}±Z­¼ÿþû¬]»–ÔÔT>ùäRRRBHUU‹///´Z­]ÏæÞøß}÷]öîÝKMM <ð_}õ!!!äååÙóïÝ»7jµšòòòçqûöm—ÊÑœ>MÎî”ßÝûš}9¶ÙBØÿu…~ýúÑ»wo‚ƒƒ˜1cO=õ§OŸæã?¦¬¬Œõë×sûömŠ‹‹Y¾|9/¿ü2ýû÷oR®ÕjeãÆÄÄÄ8üíÏ}òìÙ³(•J4 .\`Ù²e!èÚµ+^^^( l6=zô 66–}ûö!“ÉèÚµ+qqqÄÆÆ6²ñeË–!—ËBERR{÷îÅÛÛ›nݺѩS'„˜Íf***èСwš1är¹}Y_@@€ÝëçzßûÓŸþäЦL&|ðôæh®þ\õ©}ûöN@@ì-44oooùÍo~ƒZ­ÆÏÏ¿ýío\¼x‘ŠŠŠù¢;zKHü_Ç™ßlÞ¼6lØ€F£aË–-Ìž=› &¸ì_®ÈÐëõ¬[·Îi{Ÿ––Ö¨ŸxòÉ'¹|ùò=Ç®èf0šÔ­ÿþͶ;ÿ®ò9{ÖÿøÇ?P«ÕŒ9’aÆñÅ_°`Áž}öYÒÒÒHIIq¨KDD„æ)™'NdÈ!ã›ÀÀ@âââèÕ«×=•½MƒÌüWÔYùàh5BÀ¨^>xyy’{çã‹M°õ{ëŽÕP÷Ó– ¢VýŸ={–ßýîwÄÄÄлwoèÙ³'*•Êþa}°×¾}{Ôj5‹/&::šÜÜ\vîÜIDDÆaZ»ví(,,¤´´”   ~üñGÌf3QQQ\¼x±Yù¡¡¡ìܹ>ýôS xöÙgÙ¶m¥¥¥¨Tª×wìØÁÿ÷óøãÛGd<ȪU«ÈÊÊâ™gžÁ×׫ՊB¡ [·n|øá‡Ü¼y“˜˜rss hÖhvïÞÍåË—yûí·ñöö¶Ï$„‡‡óÔSO5È¿´´Ô­<ÆÏO<áR9šÒÇ2™Ì­ò»{ŸK~"„ý;W~»aÃÊÊʘ?>J¥’ÂÂBär9aaaŒ7άzzzâååExx¸K£¹·nÝâÈ‘#¼ð F—î~a­¼ÏŸ?ÏgŸ}Fzz:ááá¬\¹’ÊÊJ¾øâ 4 3gÎäüùóöíÛFŒÁG}„L&cÒ¤Iøùù±qãÆF6¾cÇF…ooo|ðA^}õUär9óçÏÇ××!^^^tèÐ .P[[‹¿¿?§OŸ **ŠŠŠ ‡õ©P(8zô¨S›r–&—Ë›}>ÍÕŸ«>Õ¹sg"##IHHàƒ>h`o*•ŠN:ÃW_}…V«E­VS[[‹‡‡jµš#FðØc¹ì‹îè-!ñG~c³ÙÐjµøøøØÛÜ …}p§ªª ¹\Þ`KÇŸ5'£¼¼OOOž|òIúöíÛ¨½÷óócÆ ”””4è' Å=V5§›V«Åb±8Õ­þ>gíŽÕj¥ªªêßR¾¦‚ÿÕ«W£T*yï½÷ðôôD­VÛg¾?ù䇺„††:íSê—E9’iµZÙ³g/^lÐ7ÄÆÆÎ'Ÿ|Biié=•½mGþ…øiÍ¿@& JoãÏGNñA!—a± ¶Òñ?_WSk?í‰ mõÅïСCÙ°aS¦L!33///Ž9‚··7äååÙƒœQ£Fñå—_²xñb’’’ضm:uÂßߟGyÄišL&£¨¨ˆ9sæššÊöíÛ4h]»våüùóMÊïܹ3jµšŠŠ V¯^Íõë×íSmÉÉÉhµZV­Ze_"R]]M=ðôôl°îðáÔ––rôèQNœ8ÍfÃ××——^z‰Gy„Ï>ûŒéÓ§“˜˜ÈÖ­[™0a‚ýÅånƒ¿{ ºL&³¯›V(lß¾W_}ÕîÌw¬úÐC¹•‡‡‡‡}$·©r̘1…BѤ>ÎpW7wïkŠ€€¬V+úÓŸèÙ³g³Ktd2aaa,_¾œ²²2:tèÀ–-[:t(‰‰‰ö7~üñGöïßÏĉéÙ³g³ºœ>}šêêj‡£0555¼óÎ;lÙ²…ºº:Î;Ghh(/½ô’}]II |ðµµµäää`±X8uêC† áàwÞÁÃÃþ”«¢¢‚5kÖ4°ñ=z “ɰX,Øl6hÿlðàÁØl6, r¹œ_þò—Lš4‰™3gË_ÿúW233éÒ¥ ÿûß¼ÌÛl6ûršC‡9õ#GŽ8L›6mÝ»ww»þZêS>>>Œ9’Í›77²·ÐÐP†ÎÆ™1ciiidggÓ¿‘Ëå öÊnÎn]Ñ[BB¢y—ËåŒ1‚ßþö·deeIvv6ÉÉÉtïÞƒÁÀüùó åõ×_·÷™w· MÉèÑ£Lœ8‘—^z©Á:ù»ÛûÄÄDΟ?ÏþðJKKéС_|ñC‡%>>Þí2»R¾yóæÊo¼Ñd_ä¬Ý¹yó&Ï=÷Ü¿¥|Îðòò"==×^{—^z‰öíÛ³}ûvúöíKÏž=)((p¨K\\¿ûÝïœö7,Z´¨‘ÌnݺQXXÈš5k¨¨¨hÐ7ÔŸéòöÛoßSÙ³gÍš§T*½ÿÙIZ©ÑV†Báþ»¶ÎÈçG À¯r…'6@èÍ‚³…&ü” bÂ<Øõƒž?­¦ÚP¿?(X,f¨+ã‰!Ñú{ƒ‹£¢® V«8p F£‘ .PRRBbb"óæÍ#)) ™LFxx8½{÷¦cÇŽ$''séÒ%®\¹Bzz:³fÍB­V£Ñhœ¦>///þñPVVƘ1c?~r¹N‡Édjôg³Ùì‡GµT7wÊT¿u¬3]T* úöíkŸÎ³Z­F‡÷$$$йsgòòò(//gĈ̘1£ÑA+BT*}ûöÅßß¿I=<<<ÐjµDGG“‘‘a_^_&Úµk‡J¥"<<œÌÌLfÍšeßU)66…BA~~>ÑÑÑL:4 ]ºtÁÏÏýû÷Ó«W/~ýë_#—ËIHHhdËO?ý4J¥’àà`ÒÒÒ £]»v¤§§3pà@ ~~~¤¦¦’œœL\\.\ ¨¨ˆaÆ1}útû ¸F£¡wïÞö%?ááᤤ¤`±XèСC#›JLLD©T:LKJJÂ×××é3iªþÜõ)göæííZ­¦_¿~rõêU ÀÌ™3|ÖœÝ6§·„„„ƒljßÄÆÆOMM BRRR˜1cíÛ··ÎÔ©S'âããí3¾?oœÉÐh4X,ôz=)))h4‡í½J¥¢k׮įÆR]]ÕjeÈ!L›6­ÑGÃ-ÅÕòÅÅÅÙã¶ŸëÖTýY­ÖkùœOÇŽ©©©Áf³‘––FVV¡¡¡u™>}:*•Êi Ó«W/ú÷ïOdd¤C™õ3Àõ3EO<ñ£GF¡P¸\v«ÕJeyª@µ=N“ÉdF£¬äVqU@@@`ý”Ùl¢¨à1ñÝñòjùéwöæ”jûÆDXO¼”>Ô/æùiBµœ~”|wÍD¥ÞŠ\v'U† “Q¬ì _,º¨v­üßÑh´//hnªËl6;<ÍÔQÚêÕ«Ùºu+_~ù%¾¾¾ F²[*ßh4Ú§ï]¹îN´TFý· ® îäq/ú”””°jÕ*´Zm»±Ùlöà³þ·îêæê}-Ñ¥¥÷ÔÏ ¹²£;z¸ƒÙln¤V«åøñãÌ;×¾ß|kÚrýG`m¸–––²råÊ6«¿æ|ª){3™Lÿ1¾(!!!!ñŸÉdäJÞ9:DuÂÓÓËüWWWkÛlÙ§BŸ‚J“¯ú‘Ñvš•:_ý¨G&»£ŒÍ>ð/Ãd2ìã§ {žß ®v‚r¹Üéo¥©T*š ü›“ßÒëmUwÓÒ §­ƒŸëÌ”)S-¡Bàçç× 8uW7Wïk‰.-½ÇÛº=Üò{r8À›o¾Izz:C† iuûP(.p/µiý5çSMÕQKüQ ü%$$$$Údä_Áhâ÷ŸžbC®ÿ°h<<]“e1©-»ÎÓý™ÿTo¼•^. ùŸB]]z½žàà`ûÖžÿW©­­¥ªªŠàà`‡‡PIHHHHHH´.ÿÒ‘™LvgïzO&<гù"_ç]¤¶Âµ½Æ}<Ô'ˆ tFééa—ù¿‰ú½o%$$îr%í/!!!!!ñŸA›,û‘Éd —Õ>˜—íΓåÕMææwð‘ÒËMHAêd.l¯'!!!!!!!!!!ñïþOB‚ƒRüô!°óýûeÈà§õÿr¹Â¾¯¶üKHHHHHHHHHüÿõ/wy9m~°„„„„„„„„„„D³H_£JHHHHHHHHHHÁ¿„„„„„„„„„„ÄÿO´ùz³ÅJEµ³ÕêÒ¿ž ÁÞxz(¤§#!!!!!!!!!ñ¿#ø”Têøó®ó9[Bѵ­>ý” †ôlÇ䇺ìÇ݃IHHHHHHHHHHü§ÿB`²Xùó®ólý®œ®±ñDø6È— ÕÕ•lØ™ƒ°™7¾?^ vü‘ø þŠj=‡ÏÞ"2*›2€*SÓk~äȰ˜˜n]ä‰!Ñ|EKyµžöÁ­8^¯çرcœ9s™LFrr2iiiøøøP\\L~~>©©©(•ÊVÏ»­åßÍf£¼¼œÚÚZ ivûömÌf3AAAO^­¬¬D©T6H³X,ܾ}“ÉDppp“‡7¹›GKÊÑ}ZC·Ö*Ó?ß“‹OOO—mCAMM ƒáŸ‡ê)•4Ø×l6STT„F£iÖÖjjjÐëõ î—Éd¨T*ŒF#ÇÇ`0Øóêܹ3;wn.//çĉ´k׎””û)Ù6›~øââbRSS m3ßp–ÖÒúó÷÷ÇÛÛÛmŸjÎÞÊËËÑjµ¨T*BCCnÜ”«ÕJii)F£‘   ¥žQB¢œù«mAkú·£¶ÅÕ~âß[4÷»–¶ÁÎúÜ–ôÅ®pw[­V« hQ,âNLåÈZåÙ–Ü*®Òëê„®®Vèêj…¶ªBœ?}Já6›MØlVq½¸R¤NÛ&\~U<´²øŸ«n5üÿÊbñÐÊ[bøòkbÈŒÍbíæýâra…9—¸V\)l6«°Ùl¢µ0âµ×^ âá‡Æ 111bþüùÂd2‰mÛ¶‰!C†ˆ[·n‰¶ ­åß]ÎÕ«W‹_üâ"99Y 8PlÞ¼YØl6a±XÄŸÿüg‘šš*úôé#žyæqáÂ…÷‰±cÇŠ-[¶Ø¯ÕÖÖŠ7ÞxCôíÛW$%%‰Ç{Lœ9sÆaþf³Ù­Ý¤<‹Å"–-[&RSSŀĀDÿþýEjjªØ½{·8{ö¬ˆ‰‰‰‰‰bðàÁ¢wïÞ"..NLŸ>]”””´ºí9rDh41pà@QZZj¿^^^.222Dxx¸8xð`›ø†³4«ÕêVýíØ±ÃmŸjÎÞêí%))Iôïß_lܸѡžMÉ©««K—.}ûöÝ»w>ø 8|ø°pŽ#¿9r䈰Z­.µ­éßÎÚWû‰ulÑ\Ù[Ú;ës[Ú7GMMX¼x±èׯŸHLL#FŒGŽq96r'¦rd6›MÔÔÔ¸ôlFƒ8ú”ÐVUØc|½®N”Ü*®j›Ý~Dý%X¬ ‹ÙDÕó˜ uw® È0›ôè r? „çMÇGé…Â~0XkréÒ%6mÚļyóøüóÏÙ²e Ó¦MãÓO?åüùóØl6t:ݼz{.++£  €êêêF#°ŽÒ ÕÕÕÔÖÖríÚ5nß¾Ý`4ÖUùuuu\¹r…ëׯc0š½~7GŽáí·ßfôèÑ|ðÁ$&&²dÉ®^½Êwß}ÇÒ¥KÉÌÌäø%%%,Y²½^^¯gíÚµ<ûì³ìÝ»½^o—¹sçNÖ­[Ç /¼ÀªU«¨­­eéÒ¥ ~SÏÉ“'ÝÊÃÕr\»vÝ»w»¬OkèÖZeº›+W®ðù矓——‡^¯o`Ψ­­åÔ©SŒ3†™3gòÛßþ–Q£FáééiÿÍ©S§Xºt)ׯ_Çl67=ë&—sß}÷ñ›ßü†©S§2mÚ4bcc©©©!22‹Å‚‚… ²uëVvìØÁ«¯¾Ê®]»Xµj6›ÍnÛ7oÞ$??Ÿòòò#8:ΞŸN§£¼¼!:®‘-[, çÎãïÿ»ý¾Ó§OsæÌôz=‹Å>úVXXÈÅ‹©¬¬làƒZ­NGAA%%%v=›ò¯¿þÚaÚå˗ݪ¿Ž;b0ZìS&“É©Ÿ ._¾Ìk¯½FŸ>}øä“O8p +W®¤´´Ôe{7|óÍ7¬]»–‰'²råJ, o½õ555ÒЮ„„¾þúëF~ó»ßýŽššÒÓÓ¶¥õí·Ñhtê—-ñoNç´mq¥Ÿpwb‹úö¿¹²FŽ=êRì¬ìMÕɽðÕW_±qãF¦L™Â»ï¾‹‚åË—c0صk—ÃvÜ`0¸SF§6PVVÖ*϶͖ýˆŸÎòµ °ÙÀb6`*üŽ¿ ®c톗·?f}¦¹üzH8¿3OO¬6CkÇü¦çë“€€&NœHHHÁÁÁäççÛ(³Z­¬_¿žõë×£Ó鈈ˆ`Ö¬Y 4‹ÅÂÇì0m÷îݬ_¿___._¾ŒR©döìÙŒ=Ú.»9ù7nÜà•W^áÌ™3Èårú÷ïow¢… 6¸þúë¯7ZqñâEºuëÆäÉ“Q«ÕX­V²³³¹ví¹¹¹„……1}útBBB¨¨¨`áÂ…бcGêêꈌŒD¥R5ùÍ7ßЫW/&L˜€§§'EEE¼þúëÛà·999nåñsœ•#??ŸcÇŽ¹¬OkèÖZeº{ ð½÷Þ£°°åË—“žžŽBÑü.W·o߯f³1tèPÚ·oO```ƒ<ËËËY¶lñññ;HÔOI§¥¥‘––Àõë×Y·nsçÎ%))‰ï¿ÿ¹\NPP}úuüøñœ;wŽ­[·2mÚ4T*K—.%;;‹ÅB@@sæÌ!==¹sçÇœ9sX½z5—/_&++‹¥K—rúôi»-¿ñÆÈd2‚‚‚ "''‡áÇ#“ÉÈÉÉ!**Êþba2™x÷Ýwùâ‹/0›Í„……1oÞ<2228tèk×®%00 .`³ÙÈÊÊâé§ŸvjS\ºtÉaÚõë×éÚµk‹ë¯W¯^ÔÖֶا 9pà€C{»yó&GE.—3yòdBBB˜?_³çŽnîÞ×<óÌ3´oߞ矞¨¨(ûètSܼy“‚‚¦NÊÃ?ÌèÑ£ÉÎζ„¯^½«ÕÊÔ©S[<Êc6›yûí· dìØ±fºî¦OŸ>ÔÕÕQVVÆùóçÙ·o¯¼ò Ÿþ9aaa|øá‡Èår"""ضmvÛŽŠŠ"''‡'N4²e™L†¯¯/C‡%77—²²2***8v옽ñ“ËåìÞ½›>úˆ¬¬,6nÜHtt4‹-¢¬¬ ­VË¡C‡ aÍš5$&&²fÍ*++yüñÇÚTDDcÇŽu˜åvýùûû·È§´Z-EEENí­°°üü|t: ,`äÈ‘¼øâ‹X­ÖF@S¾XXXÈ!C ã¹çžcܸqlÚ´‰1cÆ V«¥OB ƒnÖoµr¹œ®]»Ò¾}{®^½Jllì=ùwSmKSýĽàNlQ\\ŒB¡h¶ì7oÞtÚ>ÿ¼ vVö¦êä^7nK–,áÛo¿eöìÙlذ‘#Gä4)++s+¦*--uj~~~ܸq㞟m›ïóo‹ÕFZR&>Œ¿'ãú6qŒu»òëÌdÆ?2OÌVÁ—§t|z¢“¹mÆþÕj5kÖ¬aß¾}?~œ“'O²yófºwïÎÚµkí !Ø¿¿ýCŠK—.¡Ñhصkyyy¶ý¶ò­>EyÀªß¶ZäQÙ”Evp‘Uö-@d_f&³Ýóû#d$df2’ç×çé}¿^)öž¹g»Ÿíœ{ι©©©LŸ>;Ç·™ÿ'Ÿ|‘#GˆŽŽ¦®®Ž%K–0fÌþøÇ?’““Ã… Z]ïÕ««W¯fË–-Œ7ŽqãÆ°}ûvæÏŸÏÁƒyî¹çÈÈÈÀáp`±Xü³Ìz½Þ?“,Ð(..fåʕ̙3‡””V¬XÏçC’$Ö®]˦M›5jn·›¨¨¨ˆËXµj[·n ÙŽ¹sç’••ÅøñãY¾|yÀú•GE¡±±1âö·÷¾#oY&==¨¨(zõêÅéӧúO§Ó1fÌî¾ûnºwïÎüùóùå/IÿþýÙ¿?«W¯fþüù |>_D³¸»wïfË–-¼òÊ+mnž6 H’„Çã!++‹?üá86nÜÈ¥K—0 (ŠÂĉY¼x±ƒ}EEÅÅÅ8p •,÷îÝ›]»v¡( #FŒ`Ó¦MìÚµ‹¨¨(êêê5j¯´“, IDAT«W¯Æãñ°qãFÌ=÷܃V«eÚ´iÜÿý9rI’èÖ­³fÍ"--ââbvïÞÓé$555 Leff"Ë2 ­ÒzõêuÍý‰N !p¹\­tH’$œN'v»’’&OžÌìÙ³ùûßÿÎܹséÛ·/ÇŽcóæÍmê¢Çã¡®®¯×‹ÕjÅl6c6›9~ü8v»³Ù¬Fy**GoÙ½^Ï£>ŠËåbÍš5­üI[úݧOŸ€o Ù–`~¢_¿~aOf")))âØÂår¡ÑhB¶½ùwñññÄÇLJmƒƒùÜŽ ú›i~®555œ:uŠÆÆF.\¸€ÛífâĉAc£öØEQhhh(ýû÷Ç`0\ó³íäà_ ˆ¦µÿß_„ ‡=LÊ×¢Õh¸¯x…ýÓIN«Å{9ð{{= .åšw£cçΔ””p×]wqÏ=÷PWWÇ—_~ÉÏ~ö3Ö¬YC×®]ý3½ÕÕÕÔÖÖ²qãFt:Š¢0~üxL&UUUÓ¬V+Bâãã1™LÄÆÆb4[‰¡òŠŠâ¶ÛnÃår±víZžþy øÃ¸óÎ;ñx<­®WVVrìØ1 „Ïçã/ù ¯½ö………¼óÎ; „ ::ššš¼^/z½žÚÚZ=ÛšíøóŸÿÌÚµk©¯¯çÆoä³Ï>#>>ž#GŽøË8p 111TVVF\FEEEXíh«>¡çö´¿½÷µ98V„þÃaðàÁ 8¸¸8fΜÉ<À¾}ûøÇ?þAyy9o¿ý6”••ñÒK/1{öl† 2_ŸÏÇ{ï½GFFFÀß^­“À`0’’ÂáÇ™7oB²²²Ðëõh4E¡_¿~dff²nÝ:$I"++‹ììl233[Éø¼yóe!=zô //µk×b4éÓ§={öDÇ㡪ªŠÔÔT´Ú&3f2™eÙ¿¬Ïf³ùu°Ù±6ëÞ믿P¦Ün7o¾ùfÀ´¶h«ÿÂÕ©uëÖ‘œœŒÍf£ªªª•¼%$$`4ÉÍÍåç?ÿ9111˜Íf6oÞÌÑ£G©ªªjS%IÂf³±xñbL&ï¾û.)))|ôÑGüâ¿`Ê”)a·AEå_>ø ¤Þ´e CPJ¿;tùa8~âþûïçĉ×ü³‘áÆ¡ÚÒçÿÿ…ÏçcÏž=ÄÄÄ0qâDÆÇÇÌsÏ=ÇÔ©S9rdıH¨&)) “ÉP>ÌÈ‘#0`À5=[¹3;L ùƒÿ*»7?¯cå'>E ×ëÈÉì†A¯Ã«–}çà­¯êip]ÞÛI«þ8À3Ï<Þ={üBÿþý±Z­þM„ÍÁ^—.]ˆ‰‰á…^àÍ7ßdÚ´i$''ÓµkWRRRZ¥¥¤¤øGÅçÏŸ÷oÎ9xð ‡=zø¼`ù§¤¤À'Ÿ|‚Åbáý÷ßgéÒ¥F–/_Ί+°Z­-®¯\¹ÒÿêqñâÅÜ}÷ÝlÙ²… 0}út,XÀ€ü#Ñ>}úpðàAÎ;ÀŽ;°Ùlm ͪU«8tèúÓŸxå•W0™LdddœœÌ<à/ÿÞ{ï%;;»]eLž<9¬v´UŸ`´·ý×Òomê‰þ} áüöÝwßåÕW_ÅårùeM–e¹ï¾û˜6miiitéÒ½^OrrrXG 6¯3,..8ëÛ¼ñ×ív³wï^–,YÂèÑ£INNfÙ²eTWWó׿þ•ùóçÓ·o_¿¼Y,&L˜À§Ÿ~ʧŸ~Ê„ 0›Íe|åÊ•þÑh䦛nbíÚµ¬\¹’o¼‘¨¨(„èõzRSS9|ø0 @Ó†`À¯gúS£Ñðù矕©`iá ÌÚê¿pu*==nݺ‘““ÓJÞ¬V+={ö$##ÿ©š6ÒiµZbbbÂÖÅnݺQ[[‹ÉdòËG||<¦ÃgÍTTþ· (J›zÌ!¨©©Áápô'áè74- vØG(?¡Ñh®i²*” ÇG†j»Íf#==mÛ¶µÁ>Ÿ¯Í¶wVð¿páB^zé%|>:Ž˜˜ÿÞÍÕ«WG‹„ŠaºtéBzzz+hž„ìˆgÛ¹3ÿB\^ó/Ô8ÞØV‡pk ,áUËw;øëu4¸š¶¢@gíø;v,ï¾û.=öÅÅÅèõz¶mÛ†Ñhd̘19rÄäÜrË-,]º”^x¼¼<–/_NÏž=±X,Lš4)hš$I”––òôÓOSXXÈŠ+>|8YYY:t(dþéééÄÄÄPUUÅÂ… 9sæŒÿ5c~~>µµµ,X°À¿D¤®®Ž~ýú¡ÓéZ¬ïÞºu+—.]âóÏ?gçÎ(ŠBTT3fÌ`Ò¤I,Y²„'žx‚ÜÜ\–-[Æ”)Sü—+þÊ5è’$ù×Mk4V¬XÁ¯ýk¿¼r³êÍ7ßÜ®2´Z­&7T;fΜ‰F£ YŸ`´·ní½/6› ŸÏÇ믿NÿþýÛ\¢#I‰‰‰¼ôÒK”——“ššÊG}ÄØ±cÉÍÍõo4kt®_¿ž©S§Ò¿ÿ6ë²oß>êêêÎTÕ××óòË/óÑGa·ÛùþûïIHH`ÆŒþuý/^äÍ7ߤ¡¡ 6àõzÙ½{7#GŽäÆoäå—_F«Õú—rUUU±hÑ¢2Þ¯_?$IÂëõ¢( Æ CQ\.#FŒ@Q¼^/²,sûí·3mÚ4æÌ™Cff&~ø!ÅÅÅôêÕ‹o¿ý¶Å`^Q¿Ù²eKPÝØ¶m[À´éÓ§Ó·oßv÷_¤:e2™˜8q"|ðA+yKHH`üøñ¼÷Þ{Ìœ9“¢¢"Ö¬YÃ!CÈÍÍE–å牓ÛÔÔTnºé&ž|òIfÏžM·nÝX³f ùùùôéÓGòTT͘Ê2&LàÉ'ŸdÖ¬Yõ&˜-hlldîܹ$%%1yòd¿^öïߟåË—·Òï3fPTTÄÚµk2dùùù”””0uêTf̘Á-·Üж\é'.]ºDjj*ü1cÇŽ¥wïÞ×Ôþpc‹+Û”œœŒÓé Ùö‡zˆÄÄD6oÞ4³ÙÌÃ?²ííõÅ¡ÐëõŒ=šßüæ7̘1ƒ.]º°bÅ  DŸ>}8þ<‹-¢ªª*d,Ìþ_}ŸÑhd„ ¼ÿþû-d ¨¨ˆ‚‚JKK™7oÞ5=[Í/žzêYƒÁ`üÁIú¨¯­!6!¦ýcƒZ»‹ÿÚVæ$d§Gp༳ACF¢–O÷:yãó:ê›Ï¯×örî™F´ÅaΊ†CLL Æ Ãårqøða.^¼Hnn.Ï>û,yyyH’Drr2¤{÷îäççsìØ1Nž<ÉèÑ£yê©§ˆ‰‰!%%%hÚ7ß|Ãùóç¹á†8qâƒföìÙÄÅŵ™ÿœ9sˆ¥wïÞèõzöìÙCyy9·Ýv“'O&///àõ+?¶Ô¼Û½k׮įÆbµZ±ÙlÄÆÆ’ŸŸOFF”••qîÜ9î¸ã¦M›æ_"Ñ,”&“‰ÂÂBÿè5==””öîÝKmm-<ò·ß~{ÀjâââÚUÆÕ3,¡ÚqÝuבœœÜª>²,ãp8p»Ý­þEñ<*Òºµ§MÍGÇ«‹Õj%::šÆÆF Dvv¶¦Ãår¼'''‡ôôtŽ9Bee%&L`æÌ™­>Î$„Àjµ2hÐ ,KÈzhµZjkkIKKc̘1þ5˜Ím²X,$%%aµZINN¦¸¸˜§žzʪRff&†ãÇ“––Æã?ŽÅb!%%…^½za6›Y¿~= à'?ù ²,“““ÓJ–|ðA qqq‘˜˜HRR£Gfذah4Ìf3………äçç“ÍáÇ)--eܸq<ñÄþxJJ ô/ùINN¦  ¯×Kjjj+™ÊÍÍÅ`0LËËË#***è3 ÕíÕ©`òf4‰‰‰aðàÁœ?žS§N1tèPæÌ™ðÃg¡òÉÌÌ$++‹£GrîÜ9† ÂÓO?M—.]Ô(OE%™™™ôîÝ›úúz„0sæL¿Þ„²õõõ¤¥¥1lØ0 ü›='NœÈÃ?ÜB¿ív;þüãããñz½8N HII j[²²²ÈÌ̤®®ŸÏÇÈ‘#™>}ú5mæ'¶0`@À6µÕö‡zƒÁ4ÿÃáh³íáđһwoºwïN}}=Š¢PTTĬY³HHHð¿­­©©A–eî½÷^n½õÖ±Q0ûì¾P2î³õù|TW–cŽñ×E’$\.—Kºx¡¬Æf³E7¿®òxÜ”–œ&£w_ôúÈ¿ÞÙt6¿ äR-wþn"±?zƒ‰æÅ<—_c’ÜÓÀ®Ónª>d©)UBÂír"•ïçãçGÑ#)ºCƒÿ+q¹\þåm ¼Çã ø5Ó@i .dÙ²e,]º”¨¨¨3Ù‘æßüZçê´`×ÛÓ‘æÑ¼w!P€ÓQe\K}.^¼È‚ ük›¯ìçæàóÊ Fí©[¸÷ER—Hïi~ƒΉ>í©G{ðx<­êS[[ËöíÛyæ™güg;w¤,7ojîˆúãÒ¥K¼úê«ÖméT(ys»Ý׬‹^¯¯×Û¦-TQQQQùŸÛíâä‘ïIíÑNïþëêêj;mÙN£ÁlÒPív¡Õ7ÏŒþà4« Ÿt"IM•Qüÿn·‹8“]gž_ á²,ým 4«ÕJbb"@›[ùGz½³úàJ" r:3ðTŸ¸¸8{ì±VKh„˜ÍæÁi{ëî}‘Ô%Ò{‘­k©G»ô>@>7nä÷¿ÿ=£GfäÈ‘.&¬ï#\ ±±±ÚméT¨>ŠDƒåsõr;•ÿ½tÊÌ¿‚F—›?¾¿›wwÔbILC« //¯ÇECùÍÜb4èÃÞ ùÏ‚ÝnÇétç?ÚSEå_•††jjjˆ‹‹ ø*•Žå¿uæ_’¤¦³ëuZ¦Ü˜ŽÇs”/Ž¥¡*¼³Æ£Mn¾.–)7¦cÐiýyþO¢ùÜ_•¦®„sÚŠŠŠŠŠŠJçÓ)ïy%IY¦G—8fßÑ—û+ëp¹=mŸà#A¯#%ÞFlŒ I–ÿÇþ**********ÿzÁ? Õꈋ%6Ævy#pðóû%$¸¼þ_–5È—5øWQQQQQQQQQù'þ›M¼L§HXEEEEEEEEEE¥MÔݨ**********j㤜¢¢¢¢¢¢¢¢ò¿‰N_ãñú¨ªkÄãó…µáW§Ñg3¢ÓjÔ§£¢¢¢¢¢¢¢¢¢ò?#ø\¬vðÆ§‡Øvà"vWxG}š FöOâÑ›ûgæÊƒ©¨¨¨¨¨¨¨¨¨¨ü³ÿBàöúxãÓC,ÛUIVfoºFµý‘/ ‰ººjÞýdÂçâÙÉCÐk5 žø£¢¢¢¢¢¢¢¢¢òOüUuN¶¸@·Ù(5îÐk~d$¼î G¹wd߬¥²ÎI—¸Žÿ8Óé䫯¾bÿþýH’D~~>EEE˜L&ÊÊÊ8~ü8……… †/»³ó¿EQ¨¬¬¤¡¡›ÍF|||‹´ŠŠ <±±±¿¼Z]]Á`h‘æõz©¨¨ÀívòãMí-#’vDRŸŽ¨[Gµé‡q²Àëõ¢Óé– !õõõ466þðQ=ƒ›ÍÖâh\ÇCii))))mÊZ}}=N§³Åý’$aµZq¹\lß¾ÆÆFYéé餧§wŠ WVV²sçN’’’(((ð%[QöîÝKYY………$$$tšnK‹´ÿ, F£±Ý:Õ–¼UVVR[[‹Õj%!!!èÑÈ¡òi¯©¨¨Dæ'µmé¬ÏçãÒ¥K¸\.bcc‰ŽŽŽØÎEb?Úã?Ûú]¸v¶­<©GGÈ·†z&á´5˜uÆóàâ…²§Ã.öá°7ˆÚš*qhßnár5Šö (ŠPŸ8SV- §/7½tJÜüjÙ .´üÿ¯–‰›_½ Æ¿tZŒœùxíƒõâÄù*1qî§âtYµPŸPEt.—Küæ7¿999âG?ú‘7nœÈÈÈsçÎn·[,_¾\Œ9R\¸pAtÿ•í\¸p¡¸þúëE~~¾6l˜øàƒ„¢(ÂëõŠ7ÞxCŠë®»NüøÇ?‡nqii©¸óÎ;ÅG}ä¿ÖÐÐ ~÷»ß‰Aƒ‰¼¼Ÿ¯]ý·råÊvëT[òÖ,/yyybÈ!â½÷Þ XÏPù´W‡TTT"󊢄e'ÚÒY»Ý.^|ñE1hÐ Ñ·o_qÓM7‰­[·†mçšmD¸ö£=þ³­ß…kgCån=:ƒ«}k¨gN[ÉQGüððóohh'Nœ§OŸN§³ÍëW²~ýzѳgO1oÞ<±sçNñØc‰¾}ûŠ'Nˆ;vˆŒŒ ñ›ßüFlܸQÜtÓMâ‡C8±hÑ"1~üxa6›Å;ï¼ãÏsñâÅ"33S¼ùæ›bëÖ­b„ bòäÉ­‚N!„øê«¯ÚUF¸í8yò¤X²dIØõ鈺uT›®dëÖ­"33S¬_¿^,Y²¤…l„r8ƒüãŲeËć~(¾øâ áñxü¿ùöÛoENNŽˆß~ûm›:»cÇñöÛo‹wÞyG¼÷Þ{bòäÉ¢OŸ>bïÞ½bÏž="==]|ðÁ¢¢¢Bœ;wN¼ûî»"==]üêW¿ò·Û-Ξ=+Ž;&***„Bø|>QQQ!ìv»¿<»Ý.***„¢(Ân··’åM›6‰˜˜+Ö¬Yã¿oóæÍ"11QØl6±nÝ:à}îÜ9qäÈQUUÕBkjj„ÝngΜ.\ð×3”nlܸ1`ÚÑ£GÛÕß}÷p:ë”ËåÛ·o(oN§S?~\ˆÙ³g‹½{÷Š9s戢¢¢€²Ln].WD:­¢¢òƒ ‹ÔO444ˆ¯¿þ: Ø½{·BˆúúzÑØØ4ÆÆF±nÝ:‘––&-Z$6lØ ÆŒ#Æ/êêêÂòÇ'NœÛ~„kOšm|8mذaCXv6TÁì㕾¦3ä[?ûì³€ÏÄn·më±cÇBú†Žx~¡‚ÿN[ö#.ËW (àõ4â>¿‹s'Ï—áK-Bo´àqÚqŸÝÁOF&ó“ÛF¢Óiñ)m Ô^š_»5¿R±ÙlL:•øøxâââ8~ü¸ÿe>Ÿ·ß~›·ß~‡ÃA×®]yê©§>|8^¯—üãÓV­ZÅÛo¿MTT'NœÀ`0ð‹_ü‚[o½ÕŸw[ùŸ={–_ýêWìß¿Y–2d¿ýíoq8üò—¿lqýßÿýß[-8zô(}úôáÑG%&&ŸÏÇš5k8}ú4;vì 11‘'žx‚øøxªªªøå/III Ý»wÇn·Ó­[7¬Vk‹<¿üòK À”)SÐét”––òïÿþï”––’™™Ùâ·6lhWW¬Ç端¾ »>Q·ŽjÓ•¯ùþó?ÿ“óçÏóÒK/1zôh4š¶O¹ª¨¨@QÆŽK—.]ˆŽŽnQfee%óæÍ£wïÞM_ÖnI’(**¢¨¨€3gÎðÖ[oñÌ3Ï——Çwß}‡,ËÄÆÆú_;Nž<™ï¿ÿžeË–1}út¬V+/¾ø"kÖ¬Áëõb³Ùxúé§=z4Ï<ó ÙÙÙ<ýôÓ,\¸'N0kÖ,^|ñEöíÛç—åßýîwH’Dll,±±±lذñãÇ#I6l GTVVàv»ùóŸÿÌÇŒÇã!11‘gŸ}–1cưeË^{í5¢££9|ø0Š¢0kÖ,|ðÁ 2URR±cǦ9s†¬¬¬ˆûoÀ€444D¬SçÏŸgãÆåíܹs|þùçỴ̄>J||<>ú(7ÜpCÀ×ÞÁäöäÉ“lß¾½]:¤¢ò¯Œ¢(û‰³gÏRXXHaaa+;QPP@cc#/¼ð‰‰‰8N’’’æQVV†^¯g̘1ôîÝ›µkײcÇ|>_X¾³¤¤„3g΄m?µ'gÏž%===¬6„kgCùÜ`ö±¤¤„œœœNyîÁ|kiiiÀg¢(JÈX¬k×®A娳žßKí;/ú¿¬$à êÎqç +ÿñÌLÓ ÏÙ4T_ÂuvNaÊm#Ñë´x|°þûFj¾N9ç'''‡áÇóÜsÏqë­·òôÓO³iÓ&n¹åºuëæ ²,óÅ_ðòË/3yòdþö·¿‘œœÌóÏ?OUUUдêêjÊËËÙ°aÙÙÙüå/¡_¿~üö·¿åüùóþ5Y¡ò¯®®fÅŠ|óÍ7üçþ'óçÏçÈ‘#|óÍ7¬\¹²Õõ¯¿þºU;ïºë.^{í5bbb°Ûí,_¾³ÙLJJ 'Ož¤W¯^Øl6233BPZZJTTO=õ¿ÿýïILLl!àƒòòr‡_jjj¨¨¨heO:Õ®2ÂmGÏž=ÑëõaÕçJ¼^o»êÖÞûBÍücºtéÂ#Ÿ¯• ¥‹.\Àh4F¬C**ÿêÓéP~¢¬¬,¤e™¬¬,ºté©S§ÈÌÌ ¨û#GŽ$11‘Ÿþô§Üwß},^¼˜Ûn»˜˜˜°|g÷îÝ9zôhXö#ÿYVV†F£i³ çÎ jƒ¯´³ÁÊ8}ú4§OŸn³Ÿ;’P¾uĈŸ‰Åb éSL&SPßÐÏïJ:ýœE¼>…¢¼^L½9‹IÇ}7_"¾â­U›øIq>“' C§Õâñ –îvðþÎܞΙû‰‰aÑ¢E¬[·ŽíÛ·óÍ7ßðÁзo_^{í5ÿæB!ëׯ÷op¡fl#n{ï 9ò–eÒÓÓ‰ŠŠ¢W¯^œ>}:¬ût:cÆŒáî»ï¦{÷îÌŸ?Ÿ_þò—ôïߟýû÷³zõjæÏŸÁ`Àçóµš Åîݻٲe ¯¼òJ›? ’$áñxÈÊÊâø‡ƒ7réÒ% Š¢0qâD/^ìß`_QQAqq1h%˽{÷f×®](ŠÂˆ#Ø´i»ví"**Šºº:FÅêÕ«ñx}ú}ÃÙVû\.¦Í6¸\.âãã‰igC•ÕØØHccc›1FG²fÍš ¾5Ô3 ô®nk ßÐÏï¿1ø(„€ï/†Ã&åkÑj4ÜWi‡Ož IDAT<„Âþé¤wOF§Õâ½ø¿½½ž—ÒiÎgçΔ””p×]wqÏ=÷PWWÇ—_~ÉÏ~ö3Ö¬YC×®]ýޱººšÚÚZ6n܈N§CQÆÉd¢ªª*`šÕjEA||<&“ €ØØXŒFc ¡ •TT·Ýv.—‹µk×òüóÏc0øÃþÀwÞ‰Çãiu½²²’cÇŽ0hÐ |>ùË_xíµ×(,,äwÞ¡  !ÑÑÑÔÔÔàõzÑëõÔÖÖúëŠ#Fðç?ÿ™µk×R__Ï7ÞÈgŸ}F||ÿüó 2,-œY[ý®N¥§§Ó­[7rrrZÉ›Õj¥gÏždddÐØØèwx hµZbbbÂÖÅôôôv銊JûýD0;!„ ¦¦‡Ã4nݺQ[[‹ÉdòÛôøøx4ßFUVVâñxBÚ¹PöãZÛ×VÒÓÓÙ¶m[P;ëóùü“}ûö h333;ÍB£Ñpÿý÷ô­&“)è3‘$©Ý>¥3žßßÌ¿—×ü $5N…7¶Õ!ÜZ`B#KxÁòÝþúE ®&‡­(ÐY;~ÇŽË»ï¾Ëc=Fqq1z½žmÛ¶a43f GŽñ9·Ür K—.å…^ //åË—Ó³gO, “&M š&I¥¥¥<ýôÓ²bÅ †NVV‡ ™zz:111TUU±páBΜ9ã­”ŸŸOmm- ,ð/©««£_¿~ètºkжnÝÊ¥K—øüóÏÙ¹s'Š¢ÅŒ3˜4iK–,á‰'ž 77—eË–1eÊÿÀåÊ™Ì+× K’ä_7­ÑhX±b¿þõ¯ýåfÕ›o¾¹]ehµZÿLn¨vÌœ9F²>ÁhoÝÚ{_(l6>Ÿ×_þýû·¹DG’$y饗(//'55•>úˆ±cÇ’››ëßLÖ<è\¿~=S§N¥ÿþmÖeß¾}ÔÕÕœª¯¯çå—_æ£>Ân·óý÷ß“ÀŒ3üëú/^¼È›o¾ICC6lÀëõ²{÷nFŽÉ7ÞÈË/¿ŒV«õ/媪ªbÑ¢E-d¼_¿~H’„×ëEQ† †¢(¸\.FŒ¢(x½^dYæöÛogÚ´iÌ™3‡ÌÌL>üðCŠ‹‹éÕ«ß~ûm‹Á¼¢(~ƒ»eË– º±mÛ¶€iÓ§O§oß¾íî¿HuÊd21qâD>øàƒVò–Àøñãyï½÷˜9s&EEE¬Y³†!C†››‹,Ë-Î &·ÍkLÛ£C***mû‰þýû³|ùò~"˜hlldîܹ$%%1yòä€y¤¦¦rÓM7ñä“O2kÖ,ºuëÆš5kÈÏϧ_¿~”””0uêTf͚ŷß~ÔÎ5/Åœ1cEEE¬]»Öo?Ú"Xû’““q:!ÛðÐC‘˜˜ÈæÍ›ƒÖÍl6óðÃ3kÖ,&Mšä·W–•˜˜Hqq1‹/Úω^¯o±îJßš——ô™äääðòË/‡åS®–£P1ܵPVVƹsç¸ãŽ;˜6mš‰DsPb2™(,,ôϦ§§“’’ÂÞ½{©­­å‘GáöÛoxBM\\\»Ê¸’¶ÚqÝuבœœÜª>²,ãp8p»Ý­þEñ<*Òºµ§MŠ¢„¬‹Õj%::šÆÆF Dvv¶„ïr¹Þ“““Czz:GŽ¡²²’ &0sæÌVzB`µZ4h‹%d=´Z-µµµ¤¥¥1fÌÿúÉæ6Y,’’’°Z­$''S\\ÌSO=å߀•™™‰F£áøñ㤥¥ñøãc±XHII¡W¯^˜ÍfÖ¯_Ï€øÉO~‚,Ëäää´’å|ƒÁ@\\EEE$&&’””ÄèÑ£6l³ÙLaa!ùùùdggsøðaJKK7nO<ñ„ž’’ÂÀýK~’““)((Àëõ’ššÚJ¦rss1 ÓòòòˆŠŠ úLBõ_{u*˜¼FbbbÕ•åX£cü6]’$\.—Kºx¡¬Æf³E7¿‚ðxÜ”–œ&£w_ôzC»:!(¹T˿ۆHìÞ`¢y1ÏåĘd÷4°ë´›j§YjJ•p»œHåûùøùQôHŠîÐàÿJ\.—yA(EÁãñüši ´… ²lÙ2–.]JTTT‹™ìHóo^ÚquZ°ëíéƒHóhÞ»(Àé¨2®¥>/^dÁ‚þu’Wössðy忣öÔ-Üû"©K¤÷4¿A çDŸöÔ£=x<žVõ©­­eûöí<óÌ3¼øâ‹w¨,7o¼êˆúãÒ¥K¼úê«ÖméT(ys»Ý׬‹‘ê´ŠŠŠŠÊ?7n·‹“G¾'µGOt:½?ø¯«««í´e?:³ICµÛ…Vß<ûÁiV;>;èD’š*£ø'þ%Ünq&-ºNž} 7Øe9èo¥Y­VÚ üÛÊ?ÒëÕWi€Ð™ úÄÅÅñØcµZB#„Àl6·NÛ[·p.‘ÞŽl]K=Ú¥÷òÙ¸q#¿ÿýï=z4#GŽìpùÐh4>SÛ©ý×–N…ê£Hô1X>jЯ¢¢¢ò¯C§Ìü !ht¹ùãû»ywG-–Ä4´ºðòòz\4”ŸáÁ!ÑÌ}` Fƒ>ìÍÿ,ØívœN'qqqþ£=UTþUihh ¦¦†¸¸¸ˆ>B¢¢¢¢¢¢¢Ò>þ[gþ%Ij:»^§eÊéxò%„ÀçuÓPSð8‘$æ}’Έ%:N¯TTTTTTTTTT:ˆN þ…EÁ^SÍà#;»'FcÛ_À”¨o¨cÿ7[iðåÔAÇ÷)DÓ¦fÍå5M>åò[©uZÇ÷Mçæß¢¬ËåùG‚Rà4‰¦¶_"Z§…sßµ–ÑÑíèȺuT›®®‹¡l\ý"-PyÍu•ÂxƒìÅ\sžŠÒœc³¦^ÎWê<Ö}¡(Mµ¯±ìpeŠ6fOÂé?édª-yS"¬çµê´ŠŠJûu*\;ÑQ:Û–-‹Ô~\Kù×jwþ™lW ßn[Ãõ7áÈJ{Ÿ_§ÿŠÏƒÏã¤{z<² Gcè™ ¯§÷ùýÜw}2+Ž)x½ž°¿ I`o‘m"#Q‡Ž_róù±F*2tôMÕ±ùˆ»»cO2:1ÿ«Ë2é$ºÆh‰µh¨¬÷q¶Æ‹Ç×ô Z‰´X-:Ä…z/Uv¥…0j¤¦ºÖ:*ì>pj6HôˆÕa2H”V{¹Xï Z¾Ayµ#‚útDÝ:ªMW¢‘Á¤“q¸ÒâÓ Y‚D›£Vò‡[PÑðÃÎ~!Àf’镤ãÄ%µJÐü$ Þ¢Áj¸ú@Þ*»£NfD–£®)¯OPZëåûRUv¥C ®Ð-FËÐ^*||qÜå—Y­,1,Û@’UÃö.ÎV{ÛUv[2,­=ýWmW¨w)íÒ©Pò&­ ±:â-2Õ…’*/® õl¯L«¨¨#Ñ©pìDGêl[1@$ö#ÿÎï„‹A¢[¬Ž(ƒÄ…Zë¼O¦éˆx¤£c««}+€Y/‘§#Ê(q±ÆGimS{"ö7Õ^¼Š !„¬Ô5*h5í{~ü7­í¡ „B£¢AãQZ[Dësþ½n'γ;¸h<F²ú?öâR”¦¼è˜¯ü Àf”yòÆhg8~É‹^#11×ÄÐ #ÿgU ý»é˜:ÜÆ®3.ì.H?Œ®BͼµÝ_1I*®Ø¹Ýt<fþWŽü‚Í›ñµ™dicd¶±iÄ,ÁŠ=vþ±½ Ž´1¶¯Ÿ"QíðñÚæ:¾>íBº¬hÙI:ž»9–¥»í|¼ÛŽ,A’UÃŒ±6ôÐ#„D]£Â¢Íu|y¢±…À š”òÑ‘•qõ,o[íˆ6ÉÌ £>t@Ýd¹cÚtµìdÆé˜:ÜÂß¿l §‹ŽŸŽh)Á ϯ'ÅÒ#Nƒ×'!˰ÿœ‹×ÔRïjr2Z L.²017Šß¬¬æÛ3® ²V#ñð0+£zP„tY^ZYbÑ–:J*}üü· Ö©¥—°%Ž\ððÊú:Ž—{šÔ:È ÆÕ36Íò+K­eY•¢eÆØh*í '.UpºÊ‹$Z5LMJ´†*{gª¼þàl^k<ÒÑ\í[wv‘`‘ybL ƒÓuHȸ¼ ÿ²žO÷9"÷7ßÙY²ËTVþ²µŽ{íz~üKüpÂàUš?4 áó¸h¸x’¨„îèŒÿ{¯ÛIcÉ×L¾>ž‡ïE•Ý×4ˆ¸œSG=H! ;EÇ tÿ¢åßÙÑj$îlæÞB ½»è@ü°ÑYzD÷X-V£Ìꦑååñ zmë4EiRº(}S4Ô5NK­CáL¥¯"¤ðòH¶iè¯Ã£NWx¨r4vÁ®ûƒJFe™˜gbñ×vvœläÎëÌÜ=ÈÌŽ.’l2“D±bƒ]§]LnåÑQ6Ž\¬Ä§À£#­ Í4Ò#N‹^Û¬òúG14ÓÈÛê9Séå§#,<4ÌÊÁónjœJ‹%"C3Œ– 8ÑŽ']äuׇUŸ«ólOÝ:ªM-”O†ì-ƒzØqÊ…QÛtº–ÔÖÖ$“­åÓ½_p£‘¡Ú!hô=:ËÈ݃Ìhdдñ>ЧÖrð}™Ëÿ*sÒ3=bµœ©ð¢ÑHxÁß¿¬cÓ¡FŒ:‰¡™¿ÁÆ”a~¿ª—G`5Êd$4Íä\¬mšÁÒb´Ô7*T9šfÀãÍ2ƒÌùZ/ñæ–²\ÑðÃDAŠMf@=§*½ ¿›ŽÔÍå:JfLz‚«Q¦¬ÖËÙj/¾Ë:h3ʸ¼‚n1Zœ…3•^ÜJHÝè¯ ˜öÍ){ι¾Z Õ§*|ØŒÿ6Ê‘Ní;ç¦0]PÞ_¨$-^Ëä!>?êbÙn;·D1!×ĺƒNVz[¼:¶e¦E(ÓG/VRíPÔ%@**&`"Ô©i£l<óa%ë¶§+|ÈÄ™e|—Mà#í íÕ> å;¿>éË~Dâ?^¬¤Æ©g–ñø`H†!àï]¨dTo#…^ßZOi‡†Y¹§ÐÊÇ]Ô\nCð~Ž,éHùVŸ ëeä†ý¢ž“å^~:ÂʃC¬l;ÚÈð,Cdþf°™oϸùì@ŸR¾]ϯsgþ›ÿWü ,ŠÂå%=»È1Wqò|¾Ô"ôF §÷Ùüdd2?¹m$:¯Ï{ÅèO :êèOÑ´ÜE§‘ˆ3ËØLM¯K>þÎÎÅze5>R£5MÕ`ÑK<2ÂÆ }Ln¯àíõ¬>àÀ¬—øéðÖiŸîs0¡Ÿ‰û -8=‹AF–࿾i཯š¿]2ÿUûôé¢gÎøhâ£4Hœ­öò×Ô`6È<5¡åõ—ÖÖpª²åˆD‹†S^>úÖNi­—X³Ìõ½ŒtÓ›j Ê®°øëÎÕxI²jxl´•žq:Ž•»©s*ì?ç&Á"ûŸ©^+Ñ;E˱K>Ýk§Ú©Ð=VÃ##­t‹ÕRítûûX«ëÒ"+£µ …j‡îñ²“u!ë#µGZ7@§‘®©MH¬Yæ®A¢£4Ü;ØÂÁóî 丒$[ÓGóNUx¨k”×ù8WãõϼgÄk™r½•s5>Ìr›Çõ*¾+q³û ø„àºÌÞÙÞÀžsn÷4 Ô7 *>dIbÅ^YÉznÈ1’bÓÐàRxê¦húu5ø÷мÿu=ë¿wòtq g«¼¼ôY- ˜6ÒFj¬†Å_Ûùé+ ædyÞêàò \^AQº5œ(BP˜nÄîRe !ñf ³ÆFs]O^!xoG=Kw;™edÊõVìn…“ƒVîqðÆçuAu#%F&Ñ8-9Zƒ8xd²ÿκ°åˆuªg¼–=Œå--NËÀ4¬ûÞ@°þ“oN7ú'®£ˆe:^G•CýWQ 8ÃÙê§ãÛ’F¾;+µ²ßua1È̽9†êÁë[k©m¼6 fç’£eºÅè‚Û)ô¬w°òÓât¸.¹™;1†GÓDT ße$èÐH›¹ødŸ¯O0"ËHaºí•QkÐ~/éhÛ¥ñ­Í+J| *ópü¢‡Òj/YÉz$ ­ÚˆýM¢MfÕ~{ε”•\öÉ ·¶ëùujðߢ³hrÈ>!!êÎqç +Ý2•›wóÆú¸ò b?NáÇ·Œ@§ÓâñÁ†CNj̦ÖY Ž\ð°ç¬›{›×/Šc—Ü8çaÛÑFÎTy”¦÷?èQ½Üœgâ­¯Ø}ÆÅƒC,LneïY7¹ÝtÓv—¸0éeºÇiY¼³ Ü=ØÌ}Efvœtùƒ»¶ò•m¤G¬†ß~RË'ñÄ 6ò»éé«m}½»ž3U^tš¦§î“+ö:Xÿ½“*‡ô-Åý£hô(\ªUHî+s¶ÚKƒKA+Kœ­iZ›–`•Ø}Vðú¶zzÄj)Ì0\!ø‚FO“A‰3kp+‚.ÑZŒ:‰³„,á/_¯¤èÈË€¦5ð²ÔV;g*| è¼>þ]´W *LZ‰¤hMÄu3¶ó¾P²XíPøhW©c£YòMÓ+À¢ c›ƒ†d«†$›ÌŒ±6|Š„"`ñÎ>ÞÝ€A+ñðp+N·à“½ üÛ¨h”æå8!Œ‚|¹Ë¢M~:ÂÊ¥zkö;.¿û¡ÎMÏÚë¹àf\_#  ©ÑZ2“ô,Ü\ËÉK^fßÍMý¢øì “—¼ŒÌ6’h­G(Ê0²å°“ëzèI‹k-Ëõ.‡[pð¼›>©R£5¸}‚þ]õì:í¦_W=H0¡¿‰aYn®ãûó¦ ³0åz»Ï¸Ñk%ºÅiX½ÏÍÊ=µÜ_daBnï¶³|½•L¹< ç«|ì>ãfÓ¡ÆVig«|!j°þhp)é”A+‘l“I´µÖ!Ÿ)1ºØ4X ¿Q'£Xº»§Ç…FšË•U„ >Hù¡d:Þ"µ)3**ÿª±{t*Á"ùíg+;{ù â·§Ý8Ü µ o\ƒÎjd‚Æe5 ƒÓ´AíG¨%³¡üg¼UÂSßžqáS`X–1h?,ýÎŽV†ë3 LÌ‹¢ ‡ušâ¾f;ªŸÛŠGè`ÛÕ¼G!oÕÐÔæÛšyá–êÝã´|¼ËN}£Â'{íll‡¿ÑÊM“ÞWËŠF†”èÈŸßcð/ÄåYŸBQ^/¦Þ‡Å¤ã¾›¯G_ñÖªMü¤8ŸÉ“†¡ÓjñøKw;xÿë\^¹ƒ¿õ+IPa÷ñVUS˜n ªÞ]t°»¤]r·ù*5Pÿ]¹†7lºœ—N#áò´”·æÁµQ'cÒK|~´‘¯O»¸£ бp ÔCZœ†!—‘_s²j¿³Ý2­¢¢Ü—´G§‚Ù‰F¯`É7 ל3 ¾€1À© QzZÛ¡öu]ÞØVùZYÂå|ð³^bx–‘FOëßɲD}£‚VùòkiWÐ-N‹Õ Qe-&Z"GBùÿö"K0)ßзj5É6 Qz‰³Õ^ÊjlF‰¬qf ë|˜Úéoq•¬8Œ: £®}Ïï¿mæ¿y†[ðýEØpØÃ¤|-Z†ûЇPØ?ôîÉè´Z¼—ÿ··×ÓàÈÏ{9º IDATT—½ŒôJÖ±xgk8±d÷Ôó«År}/#¥5Þ¦Ž‘›‚£N&3Y‹Ë#ÐÈÛO¸¨u Ì©UÚŽ.ªì‚ÌDpxv—@#7ÍüyÑâËÇ Õv…¥ž¦W|= Ü5È‚V†7·Õ±ñ°L‹ëý¢Þ?kÞ¬-ÑF™ÇFÙ¸±¯‘oN»˜·ÆÎR7ZôÿµwæñQUgÿ;kf2Éd#!² K‰!²Ad±ëRêkµu­,Dq©bµ•Wm}«`[[+T*ÊbdP!²ÉNB ìÉ$³/w9ï“2;‰Öö|?Ÿ|Ä{æží>çyž³Ãâ§•Aι7hǪÝ=L“ƒúÝäˆÛ{m»£ª Qàз£Ön•#ƒŒƒw#’4< =”rPê??N+áED”·Hß j@¸Ë£¡D!ã€cyœ¬3¢É$‚—(¢U#è‘“"Ç”aQˆVs¸uŒ±jâ´2Ü;Q`w…ïR pŸV03OƒZƒ€Ã5®žËG¨»“F)Œ†¥(!ˆ@‹IDaº?Ÿ‹‹â\3v›Ô9‹œnpáR»ˆ‰CÜéÅv•M<.´ =düÏ{L0;%p„âb»ˆ³M.\›^¤8×Ê£¦s^&´j‚6³—D!#¢tùT À%…œ¼èžÜí‡'Çú”)¿ò†à{1|Õ_0ƒâO†›M, ÑWÈñìïPß.âýƒîébqë„zˆ· :(¡¯dšÁøo%X›B=á=*’D¿ç€ºŒÀ! ‡þ(ÊPa@¼ ß\ô¯ì‚êŒÎ2¸ÿ¿sð× ‹‚ÉN±óŒ{*œ˜=Jƒ'뛢ėUŽËGIG ;{û´2JšCi®Ú§m•Ë€ ƒ£Ðn“°lS;Œ"æŒÖà‘ÒXä¦ÈasIøeöÆ—¬pÄí_9øÈ¾ß·êü‹Q÷‘o}a¥ÀìÑQP*ÈÍÐ9J±þÞÙg†Õ%õ< ¨×>"EF¢÷NС¶ÇÞJ¬N Íf ‚H!uuŠ­ v—„¿iAe3)9jL¦F«Yôf´‹ â4²úÉa°‰È „œ#¨ï‘‘  ¿ÍEñÃü(È9‚ç6¶#U/Ãó7Æcl–I:D ÝžRâÅÍø×1[§ÓCqCž3ó¢ðÞ×l8jƒÍ)A«$°óZ\“®ÂÐ~Jœjp¡(] '\ìeŸtÆnù#}/œ$¥,4OKÎÌ-‰FJ,‡W·a°IHOt7ã&“„õG¬ø:Ö=Ã40NŽq2T7 h6JA\j¬Ãû+ñÏCVttŽFu=·X­$Щ8(d…ƒ”˜2LÃ5N´ZDÜ5N¥œà… h³ŠX:Kþ±î|uØ%”U;pÛ˜hÀ{eX]~:Vé.ËEé*|YípÏp8%”sbÞÔ€Úc†Õ! —@Ñl”Û_~Ñ24EŒHU‚¨ï‘›Âuû"žÎ•$“†ª}Ê”ÕEý†9êy§þuµ©ƒ€š6c2zÊÛ¹÷LÆ$Aj¬ mV Ñî½Jí6ûªøô¤­s´ú]ºŠL3Œõxm ð¯'8$Ǻí{‹#+ƒÆß&@¥ H‹•¡Õ"b¢]fsQÔµ ˜0DÕMP í„V>ŽúÇÊÀ‹@M›Øãwž¢¡CÄCStsÏnäÑaï~\¶Rî>î¹Ý&yÑ Gwú³ÿW3Ãã)>>bEJLwÛZÕ$ Õ,y7d{6çŠ{Ðx‘DloxÑ·¬ð"P×þ÷ûÖJ)Dê^Ôa—ð—½îÀœ‚(È8A¢ØpĆ¿}i‚ÅI;wy÷÷OÁ¾*'¦°xº¥¹Nð"7@ ³ƒbÿ9'²’äqv•Û19' §Åâ\ ±YjT6»Ðf•𹟰v›[Xuj¿š‹³.ŒÉTãèEªšyd%ÉÁ‰¿Å"BNî(‰FªÞý‰bÔ§xÈ9tEp¶I€¿|®!ÇùTˆVs7X 8âÞDùö|^îÀÔá,½AZ‚*lüƆF“àÝeï9ºÒ³þžJ€ÍI1%W ­Š@¢E*¼ù¹ gÈ;;B¤ØS~ž©A¡s=I rüm¯ù±KÝFQ®œý ?oî³v#-“?q¦0ÛÝÓŸ·kq®ùò¦m‰Âçì—K¤¨1ð˜S‹çæph3S”d+qè‚Ç/9arH³/@q†c³•øô¤ 'ëq$`^†§* ”œ¨sõW+ îþ³ò4ˆRrèË¡¾CÄ{eVX\F±Qjül|44*#S „`L¦ Ÿ²aµ?£u/:çnwrÜ~…,W4ñD÷,pä‚—ûˆ³ÃœPÈÜÓÛ‚|^aÇø!*<ó£8Ôµ‹øÁ`%öW;PÙÌcxª¢Û7 Ä-Or0ÊL­ÚgÁÈ4¥Ï°¿aÁáZ§ÿ™“ õç1ž!·)›„½\çCÞšÌ"¾<ëÀŒQxò=Êx¦»—@¬ã!I€“ö<)-™f0þ@mêb;Ñ.·)€úÔ”‡ÇfèÑn•°|KD†½IÀ$^¼)ïmÁà~ ¿>Àî ;®…§nУ¼Ñ…‚Aj¯þvᦿôŒ¢;ËÐfqD•æFõøÝù6eçœxèÚ<c Š1™Jœnàq¦Á…¬D~wSuYy#s­Êxˆà€£ݺӣ?ùPÒ÷ì ¸Ð*àà'Î6 à¯øÕEQÓ* Á(BÝ#à‡kœx¯Ì}ê¢ûøLàTÙ/ð£;"!09(¶œ´cÇéËþHoÃuv>®´­V'Em›€ZA,Nàh­ ï°¢É,@íÇ foÊÜKgýÉŠGÿû~Qr “Úп_<8™Ì;ît:¤©±¡#&&&Ö3Ú.ò.9U÷%Áà”‡]‰îK¾$. -uè—š ¹ByùÐNgBÅaL† ‡.¸Ðn½§e¼ Íõ矔¹R ®Wœÿ®£¿„¸KO¯N¢—/’èåuçu ³œ#pvÞÈÖutöÊ0‘R<01S‡GááÕ­0;%÷Fzù~³Pâ÷ìÚ÷,évÁç=.“ ¾.ûq¯öäAι—®åº< OAéqq’²³Þœ z-y¸iôˆ#@9<Ê·k~ #^Žû&é Us=.€ªhä±jŸ{Ö@. ?oᔉH’—¿ï3Ãî¢ÞÍ=‚D18Qðw¾2Ãê¢PÊ;§bE?—½Ñ˲JX]”º È•ëPÅ+¦ <§Vt½¸‹÷æ'¾³=yd¼¬“sÔ¸k\4^ÛnÄÖ“vp\`—:g~.otõì)‘:õȱBæVÊNá²rôܬèɃ§.<éJÔ·LQô “(¨ÀýÖßÕ´©@òæÑY ñ«‚¥ªL3ŒðÚ”ä}ë®+ݺɷž;WŽ‹,~·~¤^ÉŸžóèH©Ë !×ùÝ x®L¿kº–Yôù¬k$ग़½»¢å²þíZnÚÅWñÖs††ðüÉJ°ïGÄ«<õƒŽÈ†L¡ô:ÿ&“ÉØg—|‘ή,ÏóàäÊ+BÝÇ~vÊî­–ºÜÆÉó¼ûSv–¤·íGx<Î"éòÌs³^×ßJ—Gò‚„‘ΛæZ-îµÿ‚oÉßó{—èÛ¨û{î—ÍÛx::.åò à¹çwžä‚í($pËá+? &oì2AF¤+F-œ…CpoÄŽ$oá–)X^\í¶æS)#AßqŠîü{œâ@'3ȨŽø(By«à DÚ-]QJ2U¸mL4ʪØ_íìÖüÉr×6ÒU¡“+þŸë\_)¢û†zîÊ"ºä‰\±,ëJ÷Öxõw5m*¼y~Ë‹¡ÒG*Ó #¼6åOÇÒ¾œ×pâ'Wüž#$èHöÕŒ‚+Cà|úV6ÄO™}?ûnÖ•~\ ¼òaHß䈻ŠQš>ºä‹€ãdP*0µ7#ý “+BëE =aÃÎ3˜ÃX{Fzéy_ÖÁ¿s]áEŠF“ÔQ½š¼‘>ÈËÕ¼ÓùèÃl?mÇþjÌN VËI¾¾æwUÿÉí”Á`0ß ½?òOˆ{/6'ƒ&Z«É€Ž¦ZŸÓ>{3 +dÐèâA8™{4ý{6mqQXœ"›:ÿùwªûHòÒùÿ®êÄâ’`qº½KÂdŠÁ`0Œÿ,ç¿ÓL„ƒBhB :m$!4矓C¦Ò@®Òv‚þý³¸lêœÁ`íÁ`0Œï•ó/QÿÇ ƒzÖö9dªpJm—ói ¡ódй eŠÁ`0 ƒÁ†„Ë{iCrþ)ÜúEË Rɹç-cµÏ`0 ƒÁ`|«Ä*(d~ÆÏ}:ÿqZ^¹-r…ª×³dÜŸÁ`0 ƒÁ`\ïDû¥–МÀ}„PR´ r%½g0 ƒÁ`0¾WοK£Ÿ‘uÿkþ{)qQÁ»\$ Á—p…R ™Œu< ƒÁ`0Œp äÇËû*QJ)œNêjÎÁdl•h®?@8‚˜Ø8¤¥gA¥RïŽùd0 ƒÁ`0þ]éçŸR IQWs‡ƒsFB© mÿ€ËéDí…*ÔÕœCFv8™Œu ƒÁ`0ŒWç\.'LÆv Î ]¬>ä÷Tê( ÊŒªŠ“p¹œPGiz=ov»ûöíÉ'@Á¨Q£PRR‚¨¨(444 ªª ÅÅÅP©zÃs_ÇßI’ÐÖÖ‹Å‚˜˜$$$t kmmÏ󈋋ƒFÓ³žÛÛÛ¡R©º… ‚€ÖÖV¸\.ÄÇÇ#:::`ú‘¤N9ÂÉOoä­·ÊÔµ£, EȲA)…Ùl†Ãáp_ªG)T*bbbºu”yžG}}=RRR‚ÊšÙl†Ýnïö>!:N§û÷ï‡Ãá𦕙™‰ÌÌÌ>‘á¶¶68pýúõCAA8ŽóÖý±cÇÐÐЀââb$&&öYÛðnýEGGC­VGܦ‚É[[[ŒF#t:ƒ”ø“Ípd–Á`Df'BÕáØa½^˜˜˜€y¼Ò„jC"){0}Ò›öÜŸ W/†‹¯tEQDss3œN'âââ´ÌÁ¾ÃÕúpijlè°Û¬ÔfµP›ÕBzæøêt:h$H’DEQ¤f“‘Ú¿‡:ì¶°ãpØmôÐþ=Ôl2RQ©$I´·p:ôÙgŸ¥¹¹¹ô‡?ü!6mÍÊÊ¢K—.¥.—‹nذNš4‰666Ò¾ ¯ãïZÎ+VÐüàtÔ¨Qtüøñôƒ> ’$QAè_þòZ\\L¯¹æz×]wÑòòònï×××Ó›o¾™®[·ÎûÌb±Ðßüæ7´¨¨ˆæççÓ[n¹…ž8qÂgú<ÏG”F8å'?½‘·Þ*SW.^¼H—.]Jkkké¦M›B’ “ÉDxàZRRB'L˜@ÇG—,YBm¶îmíwÞ¡………ôøñãã._¾œÓqãÆÑqãÆÑ±cÇÒââbºyófzòäIš••Eóòòèĉiaa!:t(7omjjêuÙÝ»w/MII¡ãǧÍÍÍÞçmmm´´´”&''Ó]»võIÛð&ŠbDõ·iÓ¦ˆÛT0yóÈK~~>;v,]³fMÀ|ú“Ípe–Á`„o'$I IO‹ßl6ÓeË–Ñ1cÆÐ¼¼<:cÆ ºwïÞ€ù¼Ò„jCÂ-{0}ÒÛöÜ— W/F•éZ­VúÒK/Ñ¢¢":|øpzýõ×Ó={ö-³Ùlöû\.×Uùpî´ôÌñ#ÔØaðúøv›•656tô™óoêtþí]„I’¤nT’(¥]ÿÜØmVzhÿjêçÿäÉ“tèСôwÞ¡6›Fúûßÿž¦§§ÓcÇŽÑ?þ˜ц†ož›››iMM 5=Êê+Ìn·S£ÑHÍf3=þøàƒtøðá´ººš–••Ѭ¬,úì³ÏÒ;wÒ믿žÞyçÔf³Q›ÍFW®\I§OŸNµZ-}÷Ýw½q¾ÿþû4;;›¾õÖ[tÏž=tÆŒtîܹ>ƾ}û"J#Ôrœ;wŽ®]»6äüôFÞz«L]Ù³gÍÎΦ۷o§k×®í&”î˜1cèï~÷;º~ýzúá‡Ò/¿ü’ò<ïýÍáÇinn.MHH ‡ÚfËÊÊèªU«è»ï¾K׬YCçÎK‡ F;F=J333é|@[[[é¥K—èêÕ«iff&}úé§½ŠÕårÑ‹/ÒÊÊJÚÚÚJ)¥TEÚÚÚJ­V«7=«ÕJ[[[©$IÔjµöå]»vQ½^Oãââè–-[¼ï}þùç4))‰ÆÄÄÐmÛ¶yïK—.ÑŠŠ j0ºµÁŽŽjµZiMM mllôæ3PÛØ¹s§Ï°³gÏFTß|ó µÛía·)§ÓI÷ïßïSÞìv;­ªª¢ôÑG¥ÇŽ£‹-¢%%%>eÇjµúLßßsƒ˜@mÇŸ°X,ô믿ö©'Ž9âuìm6[Àø×­[G‡Jÿö·¿Ñ;vÐéÓ§ÓÙ³gS‹Åâ3¯¾lA(6$ܲû{îqrG¯Ús_媬¬ Y/FНt?ûì3šžžNW®\IwìØAKKKéôéÓ©Õj¥;vìðY檪*ÚØØèó;H’‘×ÕÎsþûlÍ?( P*Rê~xîþuÿé² ˜‚z§>.¿O{uÊÆ3íæ™6‰‰‰Á½÷Þ‹„„ÄÇÇ£ªª „B Š"V­Z…U«VÁf³!-- ‹/Æ„  þñø Û¼y3V­ZFƒêêj¨T*<öØc˜3gŽ7î`ñ_¼xO?ý4Nœ8Žã0vìX<ÿüó°Ùlxê©§º=î¹çz,8{ö,† †ûï¿z½¢(bË–-¸páÊÊÊ””„yóæ!!!ƒO=õjkk1pà@X­V 0:®[œ_}õF»ï¾ …õõõxî¹çP__ìììn¿Ý±cGDi\‰¿rTUUaß¾}!ç§7òÖ[eê:5úÆo ®®¯¼ò &OžÒ)W­­­$ S§NEÿþýÛ-Ͷ¶6,_¾999ÞvBJJJPRR¨©©Á;#Çùùùøæ›oÀqâââ¼ÓŽsçÎÅéÓ§±~ýz<òÈ#Ðétx饗°eË‚€˜˜,Y²“'OÆã?Ž¡C‡bÉ’%€+V ºº .ÄK/½„ãÇ{eù7¿ù !ˆ‹‹C\\vìØéÓ§ƒ‚;v`РAhkkë\ZèÂþð|ôÑGàyIIIxâ‰'PZZŠÝ»wãÍ7ßDll,ÊËË!I.\ˆŸþô§~eª¶¶•••>Ãjjj0dȰëoôèѰX,a·©ºº:ìܹӧ¼]ºt _|ñ8ŽÃý÷ß„„Üÿý˜2eŠßiv_éû{Î`0‚/ ×N\¼xÅÅÅ(..î¡' àp8°lÙ2$$$àá‡öGGfÏž»ï¾2™ eeeؼy3œN'´Zme¾lA0IÙý=w:X¶lúõ뇨¨¨^±çþʵgÏžõb¤KR}¥[__¥R‰ÒÒRäää`ëÖ­(++ƒ$I~íMMM RRRü~‡H}¸ÜÜÜÊÂõ]ó ÞŽ¥@)ÐÙ èú'õx&u©TÚë¹ÊÍÍÅ„ ðä“ObΜ9X²d víÚ…Ù³gcÀ€Þ´9ŽÃ—_~‰W_}sçÎÅÛo¿ääd<óÌ30 ~ÃÚÛÛÑÒÒ‚;v`èСøÓŸþ„#FàùçŸG]]·#(þöövlܸÄo¼×^{ 8xð 6mÚÔãù×_Ý£œ·Ür Þ|óMèõzX­VlذZ­)))8wîì]'˜ J)êëë¡Ñh°xñb¼ð HJJê&à*• ---°ÙlÞ†ÐÑÑÖÖÖÊáüùó¥j9222 T*CÊOWAˆ(o‘¾ˆØØXÜu×]èß¿?~ñ‹_`РAGâæÒ¥K¨­­ÅÃ?Œþð‡˜3g¶lÙâ]w¸bÅ ˆ¢ˆ‡~ …"쵌/¿ü2bccqóÍ7÷ìÔwášk®ÕjEKK Μ9ƒmÛ¶áé§ŸÆ?ÿùO$%%á¯ý+8ŽCZZ6l؃Áà•íAƒaÇŽ8pà@Y&„@£Ñ`êÔ©(++CKK öíÛ‡)S¦@«Õ‚ã8lÞ¼o¿ý6.\ˆ5kÖ ==Ï<ó ZZZ`4±{÷n$$$`åÊ•ÈËËÃÊ•+ÑÞÞŽ[o½Õ§L¥¥¥áæ›oö6hРˆë/:::¬6e4Q__ïWÞêêêPUU›Í†'Ÿ|³fÍÂC=Q}péʃÁð¿¶ÈN444ÔÇaðàÁHOOØ6o¿ýv<ÿüóøúë¯ñØcaõêոᆠ×wß[Ȳ!‘–ÝßsO¹Ø+öùgÏž!ÙÙÙxðÁ‘ššŠGy7ÝtÊË˃ÆÿÉ'Ÿ ¢¢±±±0™LX»v-JKKñ»ßý¹¹¹hllìñ|ðàÁøôÓO±{÷nÀ´iÓ0mÚ4ÀþýûñÚk¯áÔ©SxòÉ'‘••›Í†èèhï(³R©ôޤúsô`æÌ™Ø´i-Z„””lܸ¢(‚‚­[·b×®]€k¯½.— &ì46oÞŒ={ö,ÇÒ¥K1dÈLŸ>6lð™Ÿ@£‡#ìòGú^Àž7Ç!33ƒÆ… BzO¡P ´´·Þz+ˆ×^{ O=õFމ'NàÓO?Åk¯½•JQ!ŠbÈy:rävïÞÿû¿ÿ ºÙJ¥Ržç1dÈüö·¿…ÍfÃÎ;ÑÜÜ •JI’0kÖ,¼ÿþûÞ ö­­­˜9s&Nž<ÙC–srrpèÐ!H’„‰'b×®]8tè4 L&®½öZ|úé§ày;wîĘ1cð“Ÿür¹÷Ýwî¸ãTTT€‚`áÂ…HOOÇÌ™3qäÈØív¤¦¦ú”©ììlp‡ÄÄÄaƒ¾êú §M¹JvöhC„ØívX­VÔÖÖ¿˜ëåzIDATbîܹxôÑGñ÷¿ÿK—.ÅðáÃQYY‰Ï?ÿ¼Gò'›Ìég0"uo"³¾ô„R©Ä<´mzF÷;::pþüy8466ÂáptáÞ²e‹_[àφŒ1"äŽPõ‰¯r]=÷U.Ï ™?½8lØ0¿3·¡¨>M&A€N§ƒV«…V«EUU¬V+úõëç×Þœ?>èwˆÔ‡ûÎ ÿÎ?º9ÿ]QÚ'£þpàÀÔÖÖâ–[nÁO~ò˜L&|õÕWx衇°eˤ¥¥y{ðííí0عs' $IÂôéÓƒÁà3L§ÓRŠ„„DEEâââ V«»}˜@ñk4Üxãp:غu+žyæ¨T*üö·¿ÅÍ7ß žç{ûì3$$$ ¢¢Â›~aa!ôz=ÚÚÚÂN£µµ5¤rËO Ç9’òGú^(S¨”RïCa̘1(,,D||<`Á‚¸óÎ;qüøqüãÿ@KK V­Z…ÖÖV444à•W^Á£>бcÇÙX³f ²²²|þöJ%|òäI¨T*¤¤¤ ¼¼Ë—/¥C† ²ó¢>I’0bÄdggcÛ¶m „`È!:t(²³³{ÈøòåËÁq(¥4hòóó±uëV¨Õj 6  ”‚çy ¤¦¦B.w«±¨¨(pç]ÖãmƒÇÙÓöþüç?û”)—Ë…·ÞzËgX(#Cê/Ô6µmÛ6$''#&&ƒ¡‡¼%&&B­V#//¿üå/¡×ë¡ÕjñùçŸãìÙ³0 Þ6tÍ5×0Áø–ÅND¢'ºê˜£GB¯×cÖ¬Y˜6m>úè#<ù䓸çž{PXXÀ}¢á;ï¼ã×”””ô°!wÜqª««Cvþ#!~ Åžû+×Ë/¿ŒE‹A«ÕúÔ‹•••WåüªÏ_ýêWذa¢¢¢°zõj¤¤¤`ݺuxì±Çð³Ÿý EEE~}_¶ÜóÒÒÒz݇ûÿËËy¼¾<éé×SâYàO@<ïôQŽNž<‰_|YYY(,,DLL FŽ NAº5âþýûC¯×cÙ²eHOOGYY>ù䤥¥!%%Åg˜§—WWW‡ææfÄÅÅáÔ©Sàyƒ ÂÙ³gƒÆŸ˜˜ˆO>ùÑÑÑxï½÷P[[‹{î¹6l@ss3t:]·ç›6mÂïÿ{Üzë­ÞÙ]»váõ×_ÇÂ… q×]wA£Ñ@EÈd2 6 ýë_qéÒ%dee¡¬¬ 111AýæÍ›Q]]—_~jµÚÛ MNNÆwÞÙ-ýæææˆÒ˜;w.n»í¶Ê(?þ „DTþHß uų$”ß®^½---Xºt)T*êêêÀq’’’pûí·{‹B¡€R©DrrrHG 666bïÞ½xàz¬õ8ÍÇûÌ™3X»v-&OžŒäädüñD{{;>úè#¤¤¤`Ñ¢E8sæŒ÷»3fàí·ß!÷Ýw´Z-Ö¬YÓCÆ7mÚ„Ù³gƒR µZ믿¿þõ¯Áq–.] FJ)”J%RSSQ^^‹Å‚èèh?~0hÐ  Ÿõ)“ÉðÅ_ø•)aÇý>Áê/Ô6•™™‰ 77o½õV7yÓétÈÈÈ@VV>ûì3FèõzX,Èårèõz̘1·Ür‹[ÁËå`0ß¡Ø z‚R £ÑŽãüÝéYz¢R©ðÆo@¡P@¯×ƒâõ_ÚÚÚ P(pÇw ¨¨¨‡-ÐjµX½z5šššºÙ™LvUYl–Ñh„R©Äþýû#²ç’$¡½½=`¹bbbêÅ«A&“ùM7** F£QQQ^;›YçUþl !ħ-—ÉdHLL h§zÃéSË@=S@Þ ¿ä Çß3ÒO.Ͼ†ž:u*V¯^|3g΄R©ÄÞ½{¡V«QZZŠŠŠ ¯“3{öl|üñÇX¶lòóó±aÃddd ::?úÑü†BP__%K– ¸¸7nÄ„ 0dÈœ9s&`ü™™™Ðëõ0 X±bjjj¼ÓJ£F‚ÑhÄ믿î]"b2™0bÄ(ŠnkÐöìÙƒææf|ñÅ8pà$I‚F£Áüùóñ£ýk׮żyó——‡õë×ãî»ïöv\º*š®kÐ !ÞuÓ2™ 7nįýk¯Àwݬzà 7D”†\.ïæ°ø+Ç‚ “ÉæÇ‘æ-Ò÷Qñç?ÿ#GŽ ºD‡‚¤¤$¼òÊ+hiiAjj*Ö­[‡©S§"//Ï»™ N:…íÛ·ãÞ{ïÅÈ‘#ƒæåøñã0™L>G£Ìf3^}õU¬[·V«§OŸFbb"æÏŸï]×ßÔÔ„·Þz ‹;vì€ 8rä&Mš„ë®»¯¾ú*är¹wŠÁ`ÀÊ•+»Éøˆ#¼†L’$Œ?’$Áétbâĉ$ ‚ €ã8üøÇ?Æ}÷݇E‹!;;~ø!fΜ‰ÁƒãðáÃÝ:ó’$y—ÓìÞ½ÛoÛØ»w¯Ï°GyǸþÂmSQQQ˜5k>øàƒò–˜˜ˆéÓ§cÍš5X°`JJJ°eËŒ;yyyà8Îï™áþd3™e0¡Ù‰‘#GbÆ Ýì„?=áp8°téR$&&â¹çžóÚÓ®ñ+•JLž<Ï>û,æÏŸþýûcãÆ(**ÂðáÃQ[[‹{ï½óçÏï¶g««-ÈËËÙ3gð¿ÿû¿hnnFjj*>úè#L:999WUv_Ï=åêׯAjÏ C{^SSƒŸÿüçË•›› µZ5kÖ`þüù())ÁÖ­[½zñjP*•~ÓÍÏÏÇõ×__ýêWX¸p! €-[¶`Ô¨QÈÍÍÅ«¯¾ê·ÌÉÉÉxå•Wz|‡¡C‡âÅ_ ɇó%c!uh[¼ø •J¥¾l$E˜ˆKL‚LYßÀ=:èB[K#’’;ã¡>þºu:g çÑÖÚ„Ä~)PtN×÷Ö‰?z½ãLJÓéDyy9ššš——‡'žxùùù „ 99………8p F…ÊÊJœ;w“'OÆâÅ‹¡×ë‘’’â7ìàÁƒ¨««Ã”)SP]]1cÆàÑGE|||Ðø-Z„¸¸8äää@©TâèÑ£hiiÁ7Þˆ¹sç"??ßçó®\xvݧ¥¥!..:111ˆ‹‹Ã¨Q£••…‚‚444àÒ¥K¸é¦›pß}÷y—Hxœ’¨¨({GÒ333‘’’‚cÇŽÁh4â¿ø~üãû<¡&>>>¢4º¬×\s ’““{ä‡ã8Øl6¸\®’$y/ 7o‘”I’¤€yÑétˆ…Ãá@QQ†ŠÑ£GCE8NŸïäææ"33hkkÃŒ3°`Á‚n—ŠxÚ¡N§CQQ¢££æC.—Ãh4"==¥¥¥Þ5„ž2EGG£_¿~ÐétHNNÆÌ™3±xñbï) ÙÙÙÉd¨ªªBzz:~øaDGG#%%ƒ†V«ÅöíÛ1zôhüÏÿü8ŽCnnnYþéO •J…øøx””” )) ýúõÃäÉ“1~üxÈd2hµZcÔ¨Q:t(ÊËËQ__iÓ¦aÞ¼yÞxJJ ½K~’““QPPAššÚC¦òòò R©|†åççC£Ñøý&ê/Ò6åOÞÔj5ôz=ÆŒƒºº:œ?ãÆÃ¢E‹^|毽k‡ #ô6Ñ£G{7®Îš5 ÷Üs×NÒf³ÈÉÉñú=WÆŸ““ƒÂl6C’$”””`áÂ…HJJ‚ °Ûí(((@JJŠO[ Óé0dÈdggÃd2AELš4 <òHX#äáè³ÙŒbÀ€8p _{ž––†ŽŽp‡Ûn» sæÌL&ƒ(Š!•Ë£­V+ °`Á‚«ºÒŸÛ5ÝììläääÀl6ƒRŠ‚‚,\¸ÉÉɰX,~}˜’’deeuûóæÍƒN§ êÃ’±®°ö¶èbõ^?§Óé$M 111±žÑvžw¡¾ö²r†C©TET)’$Áfµ¢âÔ72,jµÚ½Œ?”Å<„Àå°ãì™ÈQMçɽ}Cà>‚ʳ¼ ’$çyŸ·™ú [±bÖ¯_?þ&èÔ{ øN'ôó÷<’:7ÏÞ_No¥q5ùijjÂ믿£ÑØMn$Iò:ŸžßFš·Pß '/á¾ã™A åDŸHò <Ï÷ÈÑhÄþýûñøã㥗^ÂÌ™3{U–=¯z#ÿþhnnÆÿøÇ>«¿`m*¼¹\®>-;ƒÁ`0¾¸\Nœ«8ÔAP(”^çßd2ûdÙ!Ç#x§£Ó¹m)àr:Á®Ïœ~¡:Çùý­¯0N‡¤¤$¡­¹ ¸Ïûªº®£Ñ—Ž¿¯üÄÇÇãÁ채†R ­VÛÍ94o¡¾N^Â}'œõÜ‘ä#|ųsçN¼ð ˜æz8ÿr¹Ò³@Ù˜?ƒÁ`0 ƒñ½„€@.—wþAä «1ƒÁ`0 ã? ŽvÃ/ƒÁ`0 ƒñŸ!„ÊÝw}­ïg0 ƒÁ`0þÃݹÕjéh·Á(íÖðõŒÁ`0 ƒÁ`|ç>}O'ýŠg„X­ÖŽÿ59`!h’üIEND®B`‚wavbreaker-0.16/data/wavbreaker.icns000066400000000000000000001077601435035650500175320ustar00rootroot00000000000000icnsðic08è‰PNG  IHDR\r¨fiCCPkCGColorSpaceGenericRGB8U]hU>»sg#$ÎSl4…t¨? % “V4¡´ºÝÝ6n–I6Ú"èdöîΘÉÎ83»ý¡OEP|1ê›Ä¿·€ (õÛ>´/• %ÚÔ (>´øƒP苦ë™;3™iº±Þeî|óïž{î¹gï蹪X–‘š®-2âs‡ˆ=+„‡ ¡WQ+]©L6O wµ[ßCÂ{_ÙÕÝþŸ­·F qb³æ¨ ˆð§UËvzú‘?êZöbè·1@Ä/z¸ác×Ãs>~ifä,âÓˆUSjˆ—ÌÅøF û1°Ö_ Mjëªèå¢b›uÝ ±pïaþŸmÁh…ómçϙŸ>„ïa\û+5%çáQÄKª’ŸFüâkm}¶àÛ–›‘?ÜÞš¯¦ïD\¬Ûª¾Ÿ¤­µŠ!~ç„6ó,â-ˆÏ7çÊSÁØ«ª“ÅœÁvÄ·5Zòò;À‰º[šñÇrûmSžòçåê5šË{yDüú¼yHö}rŸ9íé|èó„–-ü¥—”ƒăˆ¡FAöçâþ±ÜJjåI.’£[/ã]m¦èÏK 7ÔKëúR ÿD³‹r€¯Y«QŒOÚ-¹êëùQÅÎ|Ÿ|…6«¾ ³ (˜0‡½ MXd(@ߨh©ƒ2­Š_¡fçÀ<ò:´™ÍÁ¾Â”þÈÈ_ƒù¸Î´*d‡>‚²üެÓeñ«…\c?~,7?& ÙƒÏ^2Iö‘q2"yŠ@ÿ«g Ÿ|U\ ï8eXIfMM*‡i  D"8s@IDATxì]˜%Eµ>=9îl³ifÙÀ²Ë.–%)ˆ ¢ˆá‰è3>yÏœÅì3>*0 *HP@A JÉa6±‘Í;9Ü~ÿ_ÕçÞê¾}ïí™Yf—>÷«ÛÕU§NUW×9uêTh‘ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒHk ­´ÒòhÅùCN5%˜Ö@Z#¾šPÂ68îÍp{=”íõO˜>`ZÉk`PëôC’'Ûs1S{w-ð^¸š\pê{)ÔÀW|™Œçç<+ï÷z¨ØëŸ0ùÔËô[p]™×VЉ¢ª=² éïI…”•¹ µŒ¬·4¬¥Q  ¿W¸'Ä…=ZÀƒ”äï’nmÈ60Ê·2Q)B Ý|ÿ¯ÇýQNØÈ~0îóÊ\ p*œ—¶·{³ í; îöàpÌ¿ƒA“j­;µ[âèÇ"…§x+Ck*WûMòÎo °h‹`aFÞ«JSºÀC!X7EÕ'Ä¿T€õq"…9O̹Ð0kÙú{ŒÊÌgÒöêî Ø£žõíh¿ó”x` 5ÉX΋“ÿíGO‘M«õT•«d ‘Õ»ª‚‚rRX¥†@[âòÜõp‚»î~¸¯Ãíмû¾î¬X<Ø«Tû¥Õ>ãÀ@%zò«óÆJá†p½_'w]ýzRVþ ®—;#k À÷)œ\© ¾³ãàf¹…?óùÜpì ¯„; î8Âûá^m|»þ÷Nxn)gdv+P`†}Ùl—¾=V¨çeŸ¦ˆ'R^úš¼±Råš/!žc#™<ëGøW‰Ê‘5 È €<ÛÆÈÒTXsþ—Ûმ7,óñwAø½åžçÿ´¹¹Ïßo¿JÞ¼§ö 8Né>l/»ü6(Ì‚› wÖ.S8Z¨ÿ’*…m Úøö°?0v"ÞN„”÷ì~aÛÁÕ~•ÜzÅ»ÄNeÍVùÀ5Dú ‘¥”a¼ýè3TpzP—ìµ^æÔëygUT|¼@ N.Ÿ2Å{óèÑ´ŽŸï—•}?ÈäÁõ \§þA]ÖÌ›w*í$>×ñï/æµk{;BY©À¡àôPÌrƒ^6o'BÊ{æ öM‚;~¸PÖ>s†‰ž·äzi]ÈJÜ×$Y€@ÑýXNF–ø”_&×ú¬×}Bîïø‡Äû¦ÆÆ#Öö÷‰ÄÞ3v¬¼itn$äyÞëüùóg"ê^'³ÿ€¼Ð*öûG{ûǑȂ=÷»ÕþÂ!@O¼àóì‘]Z"ÞN„ÄZAOâWûåòÇï½½i”WtÈEß µ˜*Ê##Kpü×Û-tYà@™ãõ÷^„ºC(=Â:TðÁÞ€!«žî뻩 Ë£gUUÉ—&ºYªeâyì±×ÂéLЮ0ÈIvu”—DÛË™AØn¹À¹ðù4d؆Y¹ì†Ö÷j¬D—íÐb3œè+ þuK«¬~â<“ÓÌ…7ÉÌÅí8m§&ÈY‡y­*¶d¥©/€+¬”¦AÑT+ÝFˆb,ÁyËZöø»ö¼Ñ§teËÏîíì4]þw&O–º²Øæ±’P ï ’r±×àÀ÷O¾½½]‡^‘;B»u€‡©ëi=ïÖ!3C1{ÀÍÑ~ ó ±o؉÷–ÇHª¨¿ûÄÅÒßÛ$^YŸ¼áÒkMb/kDQ0UÄÇáh»Ñä3Ø¿²ì J!§ûFc^Œ{OšeË ½a¨ö ~³}ûù$~T]œÞ஋r²ô}à*¥…øÇW±5“9þάð½¹ü>Èé4\ÝaS€¡÷b»\mö÷–<ïV9Íú‡—âO*yº´&Éep "F4?9IV>ò“éäY·ÊÁ/߀*a(ˆ> ýÔ ¾Ú4={7ÂþT€aëý¯kkûñ=FmüÄøñ¶âþ=OÀŽ zpõ´aáwttŒ‚±ÑÀ¢ªª»àùlræë<|¯»ŒÔž2ßw·b3¹òY¼á1Id›œèŽ , úóÏ“Þî)xŽŒœõ_¿É>OÅk×úKMý‰YúÖszä>ñ­ç{QðBx\b"»½Ôd †Eøûî{Ðvî4cñ9û¿¬PïÏçô±ÂÓ³ÁunpØ¥¬ìä[Û­ÞÍ<ž=›Œ¶ÐîÄ ž ÊA ÀÆà~(.öp87äÆNœmP±æ_v'IA'¢C€¿àA*klO?¶ùrÚ»T}‚8ÀtàßÌ´¡jÚƒ$)_ÞÄë¥qÜ’HÄñ‘ûÜÂÐá⯠nvû‚·1þ)Ò¶%*¨qÑxö‰üÄA[|ÿ¿Ûa;ô·Àê_´µ{žªŽk´\%óö}ÿÄÛpr½E(Ãë0àL±mª$µ]Cðpˆ;xï#Æn¥€…kÙµòRÿ!ÀQË“» ߘ)¯íÞ!$%18mw,Ó'\ð«¼Ì_0ª ñæçá•  Á“¹ÒݵÌR m·I{°t¨6k°–¸#J€Ùm²ß¶-ú¾È l@d–A?{ö„?·µ½¼-“1xa“vðÈùþ¬ÌìÙÌ÷ƃùsê.1ø\÷|oï‘Ouw›4'A@ ¼‚³¸ŽÃ0äd¸a诵ÝÁ ¢§Ãìo$ýëpð°!,Ä,Ð:; 7W|ƒÍâP$|ÜÅž'_Û±Z~¿WY+[q- ÑU2Ap‡·øõh9V$4ŒyH.üÊyDzxÞ ÜÔÑ"aïS%=j¡º' ÉÞú‡>½ÇÀýŽå¹.|£Žínœ ÒI0FÚó€–ïxÕ“øUUoøs`‰_\S#Ó*+•füÕó*½êê#ùÜߤOâš¼-uuó׎2»QN€À–ÿD8j`ª]ì*s€Ti0€H•íš!5+m d²]†K}ÙgŸSä• ävVƒÞlŸ·Ãýî‡p—a=Û%;ê'É¥ïyFþ†°’ü¥EIÙ£´8œë):ãQ4s_cÖÙóÅ*ÌTϯ¥¯×“îvU9¯GúU •ª¼½î¸àæÃ}-ðãל@“´ ªIÌ¡¸ýˆ<÷ýó| }îhr†óY èyÏ»¥Ív-ÿQª™Ìë‚ ÷áŠE´B ŒãøBeDT˜þÓñÿAµµ2¶<›DžZá,¸ ãÎ?t`=m¶³¯B×{‹öød.Ÿo—¡\ÊÎlœà½"BˆÚSm$¬Ô­j`Çq%>hrþ¬£ä‚}_!¯÷?å°O¯—ï”" ñƒ¬§?aý|4ÂÁg¬—÷üô^%ºz5„5pýAxKpØÅñÍ;^¨€¾è —ãzuà;®, ™Ÿ FœoÑáÚ¸ìþûŽ(+''èP…=Ë=”Àž³îõp|éÞhɸecC@åûHw÷kû¸þF OýE©zÞ…þ‚û ø_pçÁQÝ|+Ü“p+áȸ!#rRdü¯¸gƒ ) T°s9^#‡ëŠž3k4·yò~P–[f_ü}Ú·úsƒ°N\)uØfO Â]'É{¸½}߉—ÿùl§£c3s‡u£ f÷,}zlš6â(U»H*—ötx£B‰íÇpd¦œð) 4­öX €ø½p„“í¥ô?ÖÛ–Éœvw°/ñø?Lz׃\œBþ6ß?ãÚ`õßù¥ÿ" 7sù55ïD0%Õ¯‚hŽom;óý¬Í¡ë æWÇwÚ¼ ÏÅ÷EAB˜·ÄøÂãVßé™ðO G—¾C#2éÛ6ZÜúP¿î}þó¾,Âüý¦ÿ^gêµ Xì¼n‡k†û#ÜL¸’€‡ilß”ÿKãd)‡,x[ð¿pý%#¯OÂñŽ…3ðe”sÅßdN.2Úô¤ý²³[Š2¨ëîm¦Ççƒ)C%Óç5cçàwÆ—Íq#{„ñEÿ€ÐˆÞ;Û±ÕM ÝÆ?î ~Ù›>…a|n.ÜáVÃñÝ_‡"š©ˆqXã?ž~ÂäEÙaª äÿîb õ£œ|(ÂyÒÝ}ø™Ñ88t î…ëb`±½äý7È–u¶Ûh𨓛@µÿY'x¶ãçñ–áw¼`‚½±Íõ0*2 {c{Ô÷*&eø¯!¢°¿¹&@¹ªÍbY¯2Ç„rÜI8œh„!p ÆÎœ>£ƒÚ} PБ™^‰è¼/ýý¯ýõަ1rÞÔ!Pÿ³zÞ,™?ÿ0Üß ×„çÏœYó\OÏ OË ªÿJ ”à…,ɪö¼Ï24âoŽŸ“w&"h@€9¹,Ý´<ôÌ…€Âà—_ôå PØ^ ž„+ËV wn̦‹|LûÅÚ€SqÎ藽¦D®„£ a‰Ž‚»ŽÐ´yinÑÝ>'ïy`’}cå¦wl\qæîý²3ÞùMÜ“)”ñæ!0 ¸¡Æ„™\Zxf MºëZÚÙÛ2Ž­U;•}2ó~$Àç¥0rPJzs@mNÒÇMXàÝãѲa…¹Áß&¸Û‚›V\' Ù‡ÀÏ››å/3gÊçí‰=ì)±ÓhŒšÜç]0ÿfí‰/ÊÞ?È *ü©ð¢‡3†<†( ÇÞÒÞ^ÇZþ)xŠ*é5pdøßxÓp=2›»ÞêÆçâæeãzÐNÞ¹>‡ ãZ1(ËøÞåŸóM§ð7 Þ ×¢iÆ/kjßè ¦äìà!ÇA ó_ÐlØé<÷íàÚ„±AÃŽµvHP^)m÷3Â"@ü¥h¡O66帠w½Cš&|Xj·bÎ~ƒœ÷±«å¢o)ƒÚ®Øö¼a"\u5J¶màÍÝæZäSo³‚è;ƒ+µŒ”a<·yMî~€o¶i>‡@HC#t ß0Ö“ë|j"l@«™ƒ×U‡úWЋå>µ¬‹ûßþ¡7å2`tS€r¸Q¹¥³ä#ýE‹ÈM·0Àú9Áøbþp²ï¼_íØq ­ÿõ˜19w”Žzb„2i=?8³ Ùñÿ±`~æ] @£E.<8‡ÕyS»94ÿ;WV]@ÈLÙá4QÍy(¡È®1`Ô/Ÿ ®óq}Y1rƒ~ntG @Ão˜’ºÍb¢,e¯ ¾†+5»Ñp8åK°†€ïYÊ«³m“·»ÅßÂ.‘ŽIŒõyhü“äçž—_o¿T®xáërÁgß`ë8–†oô4+káMœUR@&³î°c[¨ üܪÌC6²·2nš@háQßÙÞKiäðêó¤É߹Ŧ5Žy\ˆucüĂڛšqª?ƒÚÁ 8j.„ÃP?Ü`nšÀü¡—æyØÕs<"9† à"œn/ùÿ]ž÷†oo±eyzÿQ%1ŸBé K °Ø“æb¹ñËuúé?‹ùÏd8îç»Pcà¹ðg¿²>d`âypà¾G!ú•ÀÝŽë¿áN€ ˜yòÆÇmvÐqu]iðå Ÿõ¦xUÈ]T"aS[`¬%}eåæ¹b’ø-_öÍsl@¤ õ7ÂÏ3 ¬¨ÊžW“~`AÙÊX²Abgdšý+¡ö Qð²çî›Bñ¼¡j´â‘zéïóLÜŒd”âàûûË•vqwˆxÅ9#¬ÖÓ0 ±QЫdì*‹Ü¿×£‚k’ é/€ãÕ,VÚÆ÷ hšÈŽûùWð¾ry<(bË¢ –ÓÃçËÇÀøi‚¹d7¬ÊÍ`m0gäá €ÇpaìÿŽU½½†‹Þ7n\Ú.‡¡^Çföߟ*{ÀZRö±^˜£[ŽÏnlL–‡µ÷·AÒ\ø±r;[Ϫijr®ƒ{ìà΄£±îV¸OÃÙ6¤ËŒuPÆ`¥0À˜%=x9Åbûí¸½ÞÅþéØÌig¨hM9õ?Gn„_\^úG™Š£Ë¡!À*Xµ­у¿” >é¦Ì €ÂÇ]ËiÈæÚz &%Ç—7xl0OÀ= SšZðeª¿*h£Sa?¢ðýƒ„çˆÜ`Q)œø‹]Gäópìõ¨V¼ Žô ðy“³‚fHyÒŠfz bŸ’Šš‡-Û+¢f¬ÚÐý&@äPÐÈÚÆÄõؘÓpo®-¸RÆ ç}wË–ñ <LˆY„püÞy™Ìc¯K[€ü|›Õ`–`õ_K©-ÇL@€AËŒ©=·Žð{ ý/ÃÝMAˆ½YV}>cÞÇŸÎwó)8r:¯¿€3I°h½}2…º_RðåÂoeÌpëº …þ)…’#ãÑ/X@íè|õßM‡33döëáÚἇ-` °µ{ªà>¥ã÷3¨{jPA í~š¬xØv czdl³iX™X/^ðñˆà‹¿<@8WjQ0ƒ€ÚÉA¦·øî4“L\ñ¿ï!šÌË–>îgpŸA߆ó«qZ2nA¾‚†W;݃•Kn7úײxZ°„ùŸAÐ8 Æë4à˜8 Ó•X“?ø4ZNy­’ÔëoÛÚ>ƒc¸Íí%8óXÁ÷)v™çà ”í‘(è*à ¬›;÷ÄOlÜh¤-ðÇ—°ÂkºA_}ß<è¾55Vûbá¾2¤·I¯U‡›á?£m½xËï0á²ð\yá½OxŸ~Û߼ƮðäœzT“Þ¿L¼?¢GeÆ7ÀQóZwÂã¿‘»¯}›ï¡’†I88âl„¼³tj„3àò¤Èe¾™þk„À2`ܯÃ`ù˧=ƒ`(„Ǭ"4CKœZT2½MZúä€S9ÊØìéC Mº½¨m=­ª (ý„Ôï‰fHümà#R{ï<0f}–1÷?!K ŸÜü&¸2rZÁõüÁ?ÜëÜù…lдý(Q.…{/œ/ë—^ä&ÐЛç`‘瑊Ú%ôlž rÈ™6ŒЉ3!ÿÍG87#ð9FøÏ>X©FÀ+Kå2KÌ”7Û¤¿¼iÓ÷žî±ß¿þê$´öa4àãyôד­­Ó®š6M¾†<ÿŠ©ËèæŸ’ÅÈ ®é a¸üÐc¿Ç ¿ß¦>ãëÞ[á{³½‹ý?µZ¼{1Ͼ/b‚;î˜ûŸ²ì/ 4`\q¥'º(–BL ž1xq¢` д#Ȧ@Û™†J¬7`G$XÅ×–,ìiFëÁkô8wÇîa´IHõºâq’ÂȽæÔ ,…€…küqòìƒÓq(¦‘ëÞü£“ P€Ñ†½2áãpT«¦Ëßû¿þm?etÈ•9‡Y?ÿ}Lé\mN¿¥`oÁ÷e¸±p!€*úr|݆½o>øm g(éÿî,=y‡9r SŒÞ{~æÎvÊx»þ‘Y«wÑ·ÄûÚâ})Þnl~F¦yù²@`Œµ«í2 ÌÇõ¸{ fRþþ±cß{ÙÖ­¦Gùù}0Öþ7Ð(·`MÀ¼S—Àà8e° Ž<ïÍAyÄ+V0uÇWì¡03–@·žÄ¿ÌƒÅÿ>,ä¡ Ü+þ_òŒ×ñÖÛ<¡Ö0û”â‰ãbÁ3 T"îpëœ×GqñÆ[WÜeÇïŒk=6»6Šš½íjô*loF`D¦Ïj˜ýØ 5Ï#s«àóãtz±Ÿþ¾k'_EU§m3þ¤dèk|4Y÷>“lÙgˆ €“Ñ8Œ άFïü:àqÀLü>8¾XöÊwÀ g‡”n¢ŒŒFÏZQsº· Öøk2óñ-¿uØž\íýr«x?\3—ÌàûÞ)0!ã§ã F×Ðj‚!€ØCìËÖÖõ&`\&ò|ŸZáp½pC’^õÃmÛ¾]xÂÝw—N˜ÀøÝž‡Å-ñóï*O ‚64?ƒ{ši·?ÏÌ‘^Œ’Ã(tªW>ã­ÿßXIX·Ï‰˜_—œ@ æËF]ä×AÛMyà7— º—•·'gañRÏ„}³+^]´1 € ü‡o³zkë[¥¦u:Àáÿ¨Äï=ó¤ªæCR׈ÅW sÔkÄ»àÒƺ9&fÿÖÉØ©Ûî^€õ¿÷A#øañpåX´ÎÿîE²q¹ ö†NàráC Ñ}Éi<•>÷Ñ'¬7ÆìÇÞÎRà‘òxè©/øW¹Ú¶k •ðnÁý?òþóÉë¬úÈEÞzð( èÖ|[6f.+ÜS3¶(7hÐþ#`œ™<ÅÁõH¬§iò~ù©‹eëZÌ€Ïûȳƒ~Ò¡HèAª_çÓÐ÷iCòߢ‡WE˜¶¯½É¿8Wz§¾]5")ŸsxoÕž9†’©D  Vg<ï«AùÞ+;1~cíî?]⿦&Ø+Ú_ö¹ì©Ø±×üÜHÌŽ;æ“ò<Îlg8ö¬›vXÈXî¢Ø?‚ 3v5àx öòõ2¶îþ¿{’yªC_±Rž0 é¿×F‚è™?ìjü­Ô4¾MRׄտÇgowÙãyÍr=„À!gÎò>ð˜ò>*ÕïúÁö]¦›®8S‚oñN¸à¾XÏØÔŽ“Ì!É–‹ïðžÅò¾ §ˆ/¶Àö\Æ¡e`©œÐ8Nj|Ÿü[€ÿqÈÛä§ÙÈ!ðdKC@k×HÐ"¾É¬~z„¾÷aìÔ;ß6³÷ÞŸ< ¨rLÜîþó°ÃŽù¾à½óû·ù?ýÀù8ïO¼·Bã«á¤ÁÐ&/¾j³ÌLf+Êz;9ݔ­è¨?þ\ÆŸ ¾-;×4XjpÝh3™¢Ü$̵!¡1TÍýÀ¤Õ§E:ýËrV?t—¢3ê9¥.«ã2ŸòŸ”Ïx•£_çK_÷+½æ9írîGVI}Sê&Ñx 0\ìí~Ÿ½³ôûÇzÇ^0IÓИ”BL ÌðŽÃa G“Q2#4ï`ЂñɨÝ1E/÷<"c:Ãò #J@ºµ–-ÆQK×ø=Ø75u–ÅUJ¶ûeüñ&b(ð m_f1¼5P……¢S0Sº6k3Þüvu`P‚ê/†+ÿcЄØÌ0DaÊ]Z)é5¯ºq,ßtgAfÂP.ÕY^ŒÚ†óQ²™g&)í´†º:üM0³·B˜:Ô¤w;=ªþåRƒÕ üíÞ~/»ýu§E tš³S=L¾5ä^4Tû«ü¦Šò`û{ŠÝ»/§ÝõDi>/‰èÄZÚË'c´Xn÷Ù#ž» Ÿ`­@o_í7–×ȸŠz™XYŽd|UýÍl€ž®‡QFÀázÈ”îÞWdþ.̰Õàð¥)X4ù¼Ù‘;rŸý¼g™½––~,ñêÇ´`wXöiô~ªÿx²a1øÇVNªÄVK¸'Ô@†\£=CŽGq‡oì 5[:G ºJ8ÂoÂIˆ~½ÃoôÚ^>:ö§M`wMz9ôó¥ ÓxQj€ÃB>´Ë)Áá‚ÑÒ!s Ž\î?p¨•ñ˜ßã…E– +ã77Tû­@°Bû×ià E*PY)êȪ.³±ÎòÉlìÂÅØzX Xez~Eæ@,ÝoÀ6‡Ji7»¬ÆÊß¼ªŸÅ7ÃP¶ìn©†¥òR¢i W te@æ¹òc°wû¬ÄYq!Ñ+äç?†z}%@ª<Ö‹úûCóhÆ9_pRçø`ˆà2rŽ Zø)@'@â5.û1ØÞÛ!—£5Ô¾Ô8Ô5šÒÛm5@@Æ„ ÀAÃöV㣠÷”,ÃL9‡ù]hðVàðç'䪂i2fo”¹‘+ÀüS°[m¢1ØÑ É%ɽ8§c§¬ñÚ³urI2=KjiЇµndtžo˜a ®Tý­Ÿ‚ ƒßpÂî3Ãù)í§Åq/ò)CÝF° e+ÁÃn²Wa¤Žä%€½·Â(ôéÅ l•çÇ;Aš¤'yΩüý¶ïÏöþFŒh:guWKPŒá»¾$5€âx‘ÁméÁi·_ånjÁɈÇbŸÚ~øÈù58Êuç‹ò¨œ´`™Rû×¹øúÜxôï/à{•è§+¡¤ww'´ƒíæg?dÕ§_LÌ;/?0wƒ§ÛŽõš|¿|«÷¬ÁÏmX"fnÎe:2n/ ü»Áø’£±§p \Ë|ž\К†ï„kk±C[Ôû°±t¨`ñb´z´[~žüo´B`]è䲡ʩ(>¬èdž; ˜S­-“Ž‘YX*< t¿a*2ý\Aø¼Ü €3f(%pz¬Á$Ã2ŸÜ]ˆñƒ8Š"g¬‡!Ay;N ç¼?Ó¥ß\ÚoèP `Ú¤a¸] È•f@C vž ¼$@mÀø•¨ï:ø;XÛ{ P-Ÿ;njd°¡’ŒÊ‹–.¹ûn`½‹K¡²ò)ð C¯ÃIØú¾tø”†î¶+™š+-SZ1 ½±½S†µw5PÐ÷ÁÇ“'ÊÙ2ÒˆW h0dj dï0M7?‹gKÓ(Íe=²ìË{Ž÷™ÎÆ!éñuxÀ@ötqŠ Îpe ‡Ãkxi ÖuMè<ö@Æ?GðÃd|:ÑÞw_M•ù±ÇlØ`ÿIŸøÊ… …ÂY°ÀSàPÈèiY¤áóÐ G°ÌeŸ×õŠ«ÇÚ…óÕ0½‹^=ü&‡èÃÍÃõÛÔ,C=ãÏ®Ì`Õl7ŽÎž@<žøF¯ d|óÒe_—›€aúsXa˜rdU`ÑšöȆrL¾dI˜9µîÉt Xa áƒ¹ôœJSi°í}´Å_'’sႪ^‰8Nýq|Of#áÔ½W †ÜýuÐ  zÈÃ=é)—G4?ezÒÒ8¬óg^H”KG?{vÞßÑÆäâ†[”xSZÄ‘y… ïõbx>îÉÀÞýøãE¦Æl‹%“ÚveŸ‘OÄ!çwàÔÅÞ?õd4Ìq”®Kiþ|‡‰žÿ{|άÍÉù) hG àúÝïráôáã%ÆQËà—ŒIƒöj/Ì×NåÈlª†«ß^ ÇY»%Fm`6>ó·VîÇDž=„™Œ8ßg™ H¿M[:‹gúsЦôL/Oš çÏb™rƒñyO‘Àc @XnW b0ŒDC·WôPßË6 èÐ%[/†àBPš‚†<0Ÿù•Q\æ×ŒgÍ—§ãƒS«1öé@ûDâ]`Ñ5kŠÛ:H©¾2ï)SDÞòËÜqÆÁ`2|¨ÔØ^À¹ªwÝ…/Abœýò—ãói ,·–]¯4b2ݦM8h«[ŽÄy ØV-ì–9‘. ôÛû\œ¾®îÏI~j\àÓˆéÀ>˜ {q/Wÿs ¿5"ªÝIJ-©ähj†gcmÞ¹üÈàÖÂïâË<¡‰Ãè§£#Ê‘n ¸ZÜàºG VÚ˜JL·ôÚy¶‚·®àŒÀî€W ó¼ <Ö=”‚œÓqd…bŒ¯8¼òÛ4*s)ÃQ üýï"Ë–¹ØÖO3'?\C˜·Òc¾C(^ˆoðþQäqžóê…щ'âƒÝÇX;5‚((]–™ÚÓÆy[Ð+öÃÇwï¾e0bŽs5úËŒ!±+`üJ#XT¸– ÓÌáYLÉX)¶Ç§±ßƘ¬Ж“‚@óà}?’ƒ b4ÁCÌe….쪜TíÕ„Zç©w‡ €2½m{’c;`‘ãѵ·TÆÇÊ…¯.-ú§†O²Ä,¤aïÏáFŠÑ¤ªÿÊWŠœ|²U÷5-µ2·K»MM0%oÉœÊ|6Ú2l±8×@<µ%XZÅiZ†Íå—·K~ÀPŽ÷m=ÒÈ» †ë}n€¯‹é êþżÑ!¥?¬Ä:3^f\•”Wjm'ÌÍÕ8 0ÜÀ×GÉ?!C’g]ÈÌ™ÅÚ}°bŒ¯xÊxdv.òQàZwêካ8…®Ä;üp;$hmµªþ+^š6)Mų„_½{ïú™ÀÅ$ †_|eöëÝqé”ÿ®Wöbz¥aÊ’eü`ʈtH5´ ' ¸÷Π”65É^ØM&@¬€-À£Âí` EH„¯cÿñUýt€ÏµcjnÐ0o^¸×Œ#D†"hdïòÿãð8«Àñ6Çè'œ`‡ LIÜRôWÅ¥ñ‚ 콆1^! ]§œdÅàé@Á2¦½wý$îÞçü® €XŒMB“x¤—Ÿ¥ÁxÆZ<ë·%±éǾßqƒ;c#0Cëç=‡86.¡`m&hÈþ†\|sYôÜNé¼i“lYºs­AàûיɵR xTãÕÝ1à!(ÆBPhD­/‹¦ÿ3 åEß0Çã…Àa”B(&¼ÓQ-?÷\‘;ðÑSLÛ%¥IÂÅèºJJ3O™™LFÐ{×_8.^P…Óq4oAq£ù¡O7¬mÙ›XZ6{ú6NSÚ–`gÃñ>5 ‚¾@ A²?y·ELð?¤àû‹åÀwÌ’ÿc¾¯Ù"W}§ü.Av ¥ +=1¶.ã»Ý Ì’ô¸úOaHÔq%VäÊéJj´ÔàÊ>€š›ÇÓ‡’ßû+ÓéµHY33Çðc!©†’¦23˧ ¸åN¯e¦8¦´l—ϰ¬yâ¼!†9 œ¦M˜Kg~¶T6?„à–!¼'¦ýq¡2ûxèÁC‘5ºC›ËÐþ;}á®>wªù6š!ÆÂdððÛÉä¼Ó„@TH: [Ã.†*æU·`èî…À¾0˜'öüT§øð.SixÜ5)nR<æ‘7iÒ$ûX†Ê±“ŠÇƒ}k¸ï£  xºp~šw\~nœõ[Þ¶,ð9rüïM¹HÏ–›xšÐp-2pé|™#×Z|l´Ù=Àç·Wi`óˬéDKPøêF…ÛAÁD ±††Œš{}aT2öɬzޱw=ÁeZ®£É¢Nvè—‚éµ^¹Z‰W,qRæKÊÌšWº¡™xü¹ Ë"¹÷®?Wn˜?ü&+°k0н/F3WŒñ9|SktU!²¤eËr#¨r,Ê)ASÈ!üËQ!Š®Õé+cœ ·L÷/Äm¶€ueX§± ³ßjK¨ÑÉÕ¥Ë <á& …¤@7†³!ÇSU9é•U{'ŽÃpÙbh¼®XÄŒE°Ýqiìy±6`:ÇiÍøH´ÛV àš`e&^“@6€8PºqqnXR<¦‰æíÒqý14sŒg+6wï „p\tüÏ,ªŒãisŽ£iÃÜÍè!×u£ÄEHº3DKjàF?{^ÜnÏЬ”é©]…ýo›°×)ˆë×4­µD ƒéž-"Û‚•ºXÔFmVdljJ¡ÀÕT‰R-€Ã`­)Ûîì>n&âjA.çåê;. ºç»ri—þ8hÞ¤QŠ&qbéºÏH¿½'cåÆþLŽsÏñ¡=€ç”JWŒf4ŽL[ù—³è3ÆYCŸ½£6CàÀáæ!èÇ^@ø­a‹BB€é†bú2Ö5¾Î[Uš|qxÿl¹2«½ä†ÇÛäbW{^¬€/ •¡A7â3ª±yÏ)?¶'ãi3FžâM¨.N7Oá¼8†W  L>×ÃpˆF¡ržÞ6G›ÊMÏ;䔬¹NAmŸ‹Ãj^‰u2gbÃÚXüvh•Tþ ÑBTCYXfÊÖZǽœ¦ã®1X¾Ü îþã¼½»P'BÎÜ&ÍŸ‹€¸šÏµcÄÑcX"š–‰ˆN_¸Öãã\ =X”^fâÓÙè\œ+XJÅ‘ééòñ’£IÆç/&iJñ ÈÍÉä ægfd~(,F½®Ø¯ÆÔl®LŽïµÍÞ˜i5rƒÚ.W¿ÐcwST•KýØêˆ¥8èá*ÆWJÕ£döHååõÚ›U/µPµGÁbFÌNæ·"T›>Tåòb릢€ë\FͧnC¢8¼Ÿ6Cµ½~îÓŽ*jv…>j¸Ñrjx¡+Ž/þ›Ï9ׂˆIœÔÙšrÂØãŸ}¶eü•+E~ùK¬[¾Iäºëì^Nº ƒœ¤É˜ ´œÔ0Ž:Êî^ÜÕaF¶9¢Ïe(ׯq®Ð£Å©¸¸®_ÓÙ+3¥Ï¶ˆRqˆ'd›*Pw` Xg<)§~ŽÇÃ@ìù=ß¶j |Æì:ä1 H²Çg&¦­R \2Ʉſöù¹rAy™Ô ïxçÃrÝz眦Ûò øšy€:,ÞZ;j4¿” ãïS'µ‡Ž‘&0OM5, WW©,½ÔsìY¾3z­u¨±à.& Uìú@ `ÕêiUÅW²Ì‹äDÿÌCidpéúÓWA Ý*Måѳ¡ìƒvy®±¶ E Q‰Ü(ãÂåî¾SOE+C•=ý´]»Ï=„-‹<÷œõ»ë”¦)þïâ’áyf…»ƒQ˧W‹ÿopì+· H4¾÷-Xv³Âqî Ó-ÎF¯Òºp:ÒwóËùmþzá^w®,ìÑs÷ôåâÈø¸8Tp[ ãì½¥áÆÙ'ÛÕÿ fÇÊï•gVIÕ„éÆš°œ8QêfÖú¯gÅ`UÛ5m“Ž•m>ömÚçÙ¯ÁAÛÝD\½§µ¹ü€&iBPÄdr®ÀÇZõ$ت¶v_Pm3\°¹Ç÷â6 E5fÃÅ@œ 0V~„´aøËu°i˜ãÃtÐäœà™RÆA\4<‚¬˜¦Œ?mÄ£`‚fe€yÍ„Vþ6ÐeuÙ¢…ÿµRŠáqËí™g"3<üºu"·Ýf{|7 w Ξm— ÌmÄn|8×ðËàâN€¤t‡Üܳb…Mãâ…©äîbŸÉ2”©CƒéÞ»~FÚû8À!5ƒ>1¦x¡iq5?MéÞóù&óã¬"ì£Ýkûe:¬ÿ3}™µ w\„F9DÕÀühù*;óAcôΚÀ÷Êk*ʼÑ`àžO?cÏU~¢ÍC·aaFƒ×¤~½BSpD€©¿,lAQTsãUbJ±`N$<k6 ¬Æ9õ^9zíP8â{W®Ó×Wij!x@Ãàf€ùHS_é—Z‡ qÀŋңÁ•÷@Úþ£¸¡ûDHA núáªBnͽùæø­ÀÔ¬ž'P ˜¡2DÇý¼§ð)…èeÓYFË5½'‚úµ)xh书Ü|]ˆxÕ˜¸"¶…ütƒsÊ…Z„’ ‚̓mØjü' `[µß+7F@9„F€ùy-ø&`Áöœ"Uh”Z;2{ŒT̪óß²¬é”¯~ÞÖäí›ÌY͆W`Ђ)9 è?LÞ©%²ÆÆßñÝÏ%u4†cì „á‚)‰)Á `c ^6Î)3SÄ 2{Ü804•hB¦y—l«ÀOB3Vå/’¿aº$™“ñ¨úï¿¿¥x÷Ýñ‡wO‡Ät³)í?ñÔ¹áQ¿ ž;@|;š›£X¢™cJeu}‘9æ"A{gã¸õWßT°GƒN§Tßæ]8?ò0qݼõ^›3‣4苨ýÀ¦+Çh·[`è®AÇøêG‰Â o sç(é+[ $¸æ 9»²ÌãÛË\¾\®l®†þØØ#½=ýb·¢×ÊÄÉ W^‹‡ À¢dò>:§w%‡ž1Éê\ÊÑ8€wqÉÔóÅ;d´ç]„Si4ÜE :?Oz% É|é’ xIP‰“t’Éx3çIŠÇIq ßY”Ô’2‰!š­NKcqZþ ÿügX‚EéÆ €8š–Zþ¿âNÊÂiyþy‹Ës¨ (^>…üà:MÄć6ŸsB€ãhÛq Y—ß ðl@—Žëg¼{ïúKÅÙ¼³B ì²™›’˜í$,ÎÕ€^Á:Y"&‡Ê%3–‹¦ëý@¯¤î-ÙV1%Uÿ×c便1³l•«ÊYn@s•TcSNvè™Å[žÓš›ø. ã`Q¯Êræ ,€QëÑ‹×Ïoðk±†¾~q“WS[*¿¢škÜÃètãty.­õ—% )É$Å5x‘|©•ÄÂ%–†.'æN¿gžaÍ[‡LU Gpàúâ&(ž³ýxÖ‹Ä¡ À¥hGé|Û„sL½w™7wX¿Àö i µ@IDATèÀ'DüÔ!GÇõ§Y8e`Ò$ [àÕ†Øt†¹ƒ8etËìf?@v@c˜ýȲXþãÌ8Á ñ¥®,Qó1 (ùfi Áñåö»J°’?ð˵ø¬š-õRÝÑÏ™HÔ²|0¶2ÜcÓ"gÁ¼[x\›Ðò„Šm¼$VèiTpeÞV«ù%R·I¯`!hÞ‰p‹Ðä–af÷ŽžPV%\HS LA‹äN†Ó)=ÕåNË¢«†@Â+„§yÇU¾Žÿy+Ù¼Ùúã†6ƾH¥«a‘«Ë°Œrï]¿Æ© @¿ù§ÚÓó]Ó‘rÔoLx|Ü\ÿ¬ºãå “ð-‚F+¬@Ðt¶|ñj?C ÑޟÆà]š~6f'lsäâÚž‹¨F@®íç§ÁÅÆÛ†¦E+úoÚhQŒ\dšÜÞìígO«¨É;™G‘J0‰¢™)=~<„øO„dw%ëQšk×Ú 2ª;—E„‡¸…€³郺_£ö0°J°r°JSù}[üþžÐ Ìá²$ÊX¦È–"€)5þr¯&GÇõéÓeß ñ„¦Ú$"$ìØwº@f)YР¤:ö_¿Þö—N™YãøU!®àãÑ`--v™0óâ¹erýÚûSê«ññ´ðTc9 `™’fÁCï2ÓYOÊŒKBSñì•ÿÌÇ—foIv±+ÖxÓ䨆§åºÆY&çª[,ýÁÏÛ@6?Ô¼µ¾3Îó*ÊŽ’O6K^vdŒ›‚:Ê”yU£WÖ%ÛÔ¿rµÉ2xŠ\â4–N]AZË;ägX‚›‰›ÊÛÞ‹¯40=7jVWC?Wùa\[hdKd|[éfî<‹Ç]Ö£ÀÎ0¿Ñ«Õb¥\ÕÏ’é_YèMüÒ÷½ÅÞ˜¨©Dq™^«ÀÖ@Ðñ¶Á鹿…,„Gtzì`½hÏÃuó!=}x-§oü\GO5Þ-T'•‹G†æ9‚„+Ì%ûçâeÇíÏ>ko8{@‹¾4ŠëÞ+ŽŽÿy¼˜ûBžùOÚjŠoC ÿ¼è³+ã1N!§F@ð+Ã< œ0Jfh"\ÃéŠÑŒÆk½Qþô7U–4ÚѾ-™[{{fj€–%gãEÎËÏX$o~ ¾h<·[¶¯ïõ:6wø\&7}å 9ü=[¼eAK&•Z’”טpukN£CW¬÷_ýëÕ² qDÖêk à8ì©w•ùÛ°ðß0mˆsc†¢„Œ©ò¡«ÚâܶÉÛpÄh™+~Õ“dÜm²~6ì ßZ(3V±¹ÛïWí•cÍ@å|0曃æDŠÎé²_# À,² £9¥{µ€É0î8~çׇ w`šù{Ë­¿ÐÍ‚€s2±2dA¢ }•ì‰Ù‹–…R¦‹âZ¬Ü?µî h‚I†G…q.Õª|AÂ.MÒU €=|8  ]ƒàÁ£±¹{—f.4â³ «õÉÏŸ½Ïùs@Ѐï—ùì#Ë ¤³™åè„é3Vã˜#´ oZHL”Å>?hj,_NÉÈJ<K- ‡*ïY8]Ž; ^ÿqùåå•KþÚ#ÝâuuvûÝ]¨ÞA3?é“YÚ\1´ÐH÷³5òèö"ë±,ØšUAç`èT£"†?—<Þk¬õŸ8£u°ÿÚ¿ç–V 8m’?ñìÉþ0ÿ,2ÿ3;¥ûÿ’µ»0,hð+ =~Ø ‚ªÓÃ:™¶˜J*DÔID542˜» .F¼¶k⺠‚Ê Ëúy¦! ÁBD[[m*àhŒ+„¥M<.úÃrv~‡Ç}Ÿx"ZQÐÄåMÃ!mWhÞ:ÈEFœžŒBÍ(îÉz,Fï5 Ãu@Æ lÌVYj¾­âýâ/ ô(pB@öÞ†ü¿˜°5›€fG–¹¶€.ˆ»î~;€¥¸Y€e}´ÿkûÙÜ8CÐØ ¸`G¯× :ýÿùˆ<~åjõ-eÓŸñW¿ãß² 6Åæ>K*xlÅ0cíYÝ!‘9 P0mToJ\ã*‰g¸p4j Ž&÷Ä-øá‚¥¸xh[¿ÕYÙSòË;Qfr3ú9nWfTõ?ŠÃûLg’QýWc$?PRhI¯ŽÿÕÀ—§j*”A?JÎ2–Öž2©ÅÒ¸ð4 £`›¬07«V·1–so$ž¦ÅÍÅUH ˜Ù(X»®o©ÜI‡زc³- ‡kÇú9VÔûV9i_¦é‘öíOȯ—ÓÏmÁeÙ­Á…°3är ðƒõl×%B½¯ÀúŽŒ]d Kþ8 ˆb„i ÀË5ù7–{†-Ñ[Û†„Û{ý¾¬ðÖ}ú)Y}Ãzo›áü€ Ö%˜[Lëi 01¤¦mJ5€è¼6;£§ÉÐú˜©É8 Wìbp G{ïÅ6GçõyàÇWˆàu™,OÖüu¦"šÿ=›2½æAØA´¶F£ ßóá[ZÐzŽ~jQp+)½W\."Rµž³Q ½‚{:•hïÂÿ:H!•d­A8µs‡çµø¯àÞÓŸÓì,€â®5“Z8YfËYˆ(3 ØžÁ¥Aºî½ë·qLÕ-@§¿¹•ÜѶU–-à yûŒ ‘8Y4øt¡‚pó[éÛ*Ï<݈ͫèù!\r 9Hp@vÝ)Zj (†‡ÞÚØËýÐÀ {êßÓ*¾z jÙ×ú¯Á Á=»Qín„ËõŠŒ+ðL Ò™Ê1íÔ‰§W5 œ]ý`g3Ú^ˆ£Mçž9ÀïðUñàOî” V¨ÄQùêlÇ¡·æÊ3Ww Ö­³áqÃ7…2©†)>–ª¼BOÃã®Ä¿ÿmCÈèÊìJS—ù£˜àB£övKGµ{—ûçÌW0r¸¡{ r±Æç2"ýÑ{e¶œ Àö+¦±ûyÌö,hy²HÞ"‡É%rœ|V¦ÀG(F3——¥VíÌV÷xm¦]Þ/ßZ‡íÆ|ˆ´þùôyl‡÷ÃÊQÂã'Hs=ŽûÐlÿMèݲVÐ#ÇÊPsµÇ€ì Ï˜藙‚©¤­§† Tõ|G@q ´ðŠiš‡‰FÄÜ»¸*8Óp×f‹L5Ÿ³ ÄãÚXûgk%·V8"„ ÊžÐÃ}üj5w™Î¢‡ÿɘ´²«ÿJákê$xÄÑSƒt¦WfÖ1>q ѤMÀýDñܳ¯sù@4?›Øýg­Ú¦¥LÉXýý[#‡Ç°~(YÏË=7È“r5ô› ³à¹̃/Ÿ¦A0”rqî;ÑwÙ¸•þ;nó/yl½<¸‰ |¦ËQÓN”¯?çIsì¯B`Œ7;k:^'÷mä@c~ܘ‚a@,£Ø2m5h~AH‹a|¾`¤{ݶa/ô~ >9ON]éM„Ñûçò¢Bo8p ê5H Ó‡hµæ„\g´Ff;Q&YLb’‡é>[ã:{V ä€ð|  ëÑ] cÞÑöÇð8 ñ]Ð! lƒÆ+óåA¢üIàIÚ?UÐ!ŸK?'®šŠ™{×z­­É ªçù±—eo\ ÌEŸ¨@Ååš™W÷*p½ •·wñÿI†še Fè‘&Ä’Õô-ójýÊèî៺øGãâÒ-GSÝ"Ïš ñÝ»† L3.]• S7àCÐlëÌYþ7{Ow]#¯yèÿdêMkäî5˜¬8ÂÿБ øn”ëd *ªtwµÉÃGìù© p€q8Úd—myŤ°d àP€N—³@.lé–žÕò Ãj’ã0~2ý7o›/[!÷kóêsµdš”Y\œ¢cúåͽV0½‡¦»×\1E°µHk=Þ€¢Îµôo zÔguè‰^™S%œô€¤4™GTË À=÷lµÇb C™zY?7û(M5Trªò«ËD¾ÇcÆ PÚjo7 ÐÌ…¥aMñŠ­ý7Å”âôJ¿»¦@µíýY^ÝDÜB@z…†1iªrŠdL,Y2̤Šdÿ´w}ب†ĥó±Ûíj¼›ŒÙ-8]Ž hüm槃0í¯G:ý~ü,}qÑÑò.¬ èFþ™käµ÷öÈήj¯±öy÷"‹‡ÎÑŸZÊ "Íl†ìýuÀ®ÚL!ƒLYÈ  AH̽º¯»Cc¢CAW÷pØ€‚å¿dÊ,wîŽq0®•2ûÈiQ¶qópýqI“!ÒãïÄf×\hõÂÐt?0ÈšžGäŠÇH|ªÔÜZ™Xl¯Æ…–‚DڲƦã :âì ðIµkÚyzq’Ì`+ô3åâß¾QÖý×ãòÉ›Ö˯~¼B~øÖyW‚y žŒo*¶;Ï!Ì“a15 fíb[‰ ‰HcÑ|'„&à€ÑЗ" €t¸4Ÿƒ©@á ¼qÀ7  ³t˜ñ$^á Á+?Ã[]yHðœƒàQ¼Ê™FÜåf*x()!/5äqMtÜ-¨NÏ‘ù]ÉM¼(®Í.üŸO· s¹0Žºæ@Çÿ.ÕB4¹=Xg¸çA!¦œµÁé=õ2I°IFÈXÈûLÜ‹žzR’ü‘c>úí±_ìYÛðÞù^å¡0^4Ý*¹ÝЬÁbá‰0 –J‡S† á>ϾENðõKgf£÷h¶3 ‹Ãÿ.ËH–ÓT–Ï“³[(``«0z"ÒtRíX%Î ¦ÇB!zž•R.}UQV 3‘mÕÌõs…ŸKì±²õ‹ÏÈ]?_)£2qÄÁ= KàÌ€@!vSá@Î?k[ŠÕ~áØü»€‰}XÝyF5œWÆ›ˆ )²_íá©¿+5œÖxL;uŠø “ñ:節qw¢m`ø4ÒO¡€aRö`|Á€j˜Ö W¦¶;ê´ÇUË{ “dOóeºûï·© 1ŸÒÖk=s¯JO xJª™D@)ºªp‡„ñø®&™)-Yr;>GA•¾Q¦I«œ‚=}G6²EÍ1· =$Êè9ÆfÊ\ºÐ¶Ë CnªŠsñ Ò©è–Æ㢿Ö ŒnxÀâÙÿ²²k½ÿÐ*ÞM—£gõIW£_Ã=~‡`wӢ鷓€¶§Ù•™€‚ °äÖ-8ý<+€.ww!aß`W `ED—Ì<»Þ3$ !2ÏvÌØÍü¾­¾Ñh<`TN O÷%`>=v1µÄGi†qÃþ-3D>8óùà·ÚÃo2%±©ï€ Óê^jRÍ'PG‡±À*Ôa×ä‚ó1´¸ãôBø 'mûŠŠaÙ8O{ÿCµñ\úË=)Mâ©à¦% “(ˉÙKNGoÏ+Ôh¡±n™Ü(ëäô’}85f,49Óx!2`f]™n€ö9FgvVäÇ­—‡Li&@ßPc 7ð(X*6lÆÓ!Ùc£<ÜÝ뵫²©I²×§¼«—ò¦IfM56~ŸÓ6к½Ž.íý!U‘o®[£@ ‚Ä Ä €D ‚ ããcuI2íÇcG5ƒnß3’ óì‰)Á™õÖÊ&j§±1šYSc¬|b§×ûl›Ý‡€6ø¾aަö°ØÊ‚‡ƒ¹zŽÃukp!rCÆ?¯·AûÄzÁ—‘³LË×£Cõ`póLø[‡§]Ša” œÛ'è0[¦ ¸6ó¯=޹u¹­‹F\‡<÷¯ „I‰w©¯þA!‡Mëâè†#ŽEáG†Co ö¿Éf¾±Ø/—[ âïDÃ#säå0$¡Ž4ê@x Ð:¹ââ;òù¼Ü-_ÂÝ7äa¹<$÷ƒò“ŽÌk£W‘Ÿ®Ê ;`>s䌩e^µÑW{a ´Í1> ’èå:2Ýpø‚ Ë`(8Hp€i«¥èpAW–ÂcMàœfϯû®tÛ%‚ïF‡ÂÕ‡l`ÂHÏúu&€ˆÓîÀðƒd6ÿiÕW-`Ñ";æÖâJ¹–‹{ûíHImˆ",nSäÿ'Á#5 .3¦±‘»]££KUówÃÔÏáÊ=ìÑd|j7œQÀÄ—`ïÇä\¶K ÀY4÷œ\å§sødÈV §ÈÁ•ÄM`í$À¡Â ¹SW!§­Ùt&4$*0?®\-ÇgµñiÜ`ô¹Ü»-Ò 4Eþ'¡KýÔ; ¥Ì«0FllRê‚Üß%›z»üm}Ø›{È€Væ…åS‹”¿÷RX쬒Ú8ÏÅ1FT—ùè÷°xN秊€í¾Á,z'zÇü†öü߯µô/œî•ó“ÞÊØ<çäÁMlÏÞÓ¡:úä:‡O:d`öÞœÓç,N+6põ+$ìýgþG¼b.ÊÎë#ж~ŠŒÀ¼Uè,€‰ù¿ï>[@ªÜº<–cgîÓ'p¶€Çy¹} 7Îõ/ ®‹Çõþ¿ü¥Ý.̳ÿ£PŠ5n5þßÿyê)›š_'ÖÚTëÉÒ3~6úçr¿ LÎ1Z@oHkÈ¥*äcïOÃè„: ¦È!yèè±Ïæ%{%²^þeZa½Lž a]ꎫa²8ÂÁ‚ .ADoz40‚éí‹bÙ´P"¸ŸÁj0©˜ v¢”±rp2Ã`¡ï»o‹,'(ZÁe?^!ÝÇ“ª)µâ}i?)ãü;áïP²((¢Å½mÌL<ªó\Â{;´w6‰ñÇT}'!ñðaTó5ßià¿'vØÞÞ­9Óöû«çmÞŒÓ2PÐ0%8¡³»%{C2 çú©òSu~Õ«°±D¸öþO2eÍ2²[ “ÿ¯LZ —x¥p”zšdþßý½ÔGÂe—‰|㹕… ûÚ9f&l—•`ÎCíß„¦¿)`ÑfV€*úŒ±ÑX°t ?Ýh'üãáùƒÙ@û§)L¢0Å;ÌôÞØý× Õ^û¥(ZÞý*¹sÃùP(ZÇnl‹ Ú>õ>t5¶ ¹@áÀsÌÏ¡¸³×ǃaºU~XûZ rþA£ñöÏ´aÕ„å×P.±%óÅÁ¤þÇžö»¾½Ð«Uë>UýŸBÃŒ6»?)rÉ>ö³Þ¯›&r>Ü-ÉßYž›ªSŸká'=9þ\>¢:ezÆ;ÎÛ<àz €¹ "‡ ye¦o´=$™þ]ïBFȉjøUWY!ÀûRŒªÌ¬×¼L€hþNTž·®BAE[×)pX£ðç?Û/éçËhS Pš^/Xžcuô´š2t À|y-¬ë3ðØpì›ÈÍ„ÐKÞÐpHÛÁò6€×Ëíògb“·È‰¦ÃÂ2߼?S®–»¶¢Ïû ˆah»E(CÙÚa΀+Ñ.µ `f޼ª0êúnÏØÞñ‰Ÿr,€i€Zn”ŸÇ8x±ÿ¹ ïÕÊ’Ò¬dðÛîeÞmï˜ € Õ»ví¹Ý‡4Nª¤¥þƒÃZ mât”à?[DNÕLÿ‰'­¡P×D€S̬tróqã]¿æ¯šFÎÖkö@dQ‰gp³!‡Ól—_.rÜqØÈ &OÝåš –„ñI¦qôm–Â-…G&¿áûAÒ-ï~·È~dm4z2­“?y÷ÊWz_ˆÌ˜ ï–/à$žWK‹œ åJW(œ6‡{0cÀíÂ,”7BïøaZ‡‡…Œ>ºTnó¦Е‚[ ½ŒW‚0:ˆ†¦Kz­Tý’m›R’-BWŠKbÛª[¨åmFµ7A³d” €WNö[À­e˜=ð¯_ » fî¥p“ôÓ8GPìµ]â_¶‚;‰A6Ú¶gç>6ÎÜÑÃi»o,´ß|{‹=ÜK— èÊ>{gÿMÛ/@ÓÅ£?ŠKÀ¢kùˆCC¢yü}|ZƯ¿žI,bQdà”bRC(ø#n)zDMJ“ÆA$’8,à9„­­±eà˜\ç#DZø“òü÷ NÙ1uª+‹¥+‡uüÐ~‹‰À×áì ™™‰8Ȼن†™ÿ¹ æÚ/¸§A7>0’ªù@8ø˜³7í°Ãõ?h¯Åðhäb µÉ¦¾Lpˆg#fUxÙ$o½O¶ùëÖs °F¹G]45¼§!¸‡p%ÇŒË-âq5€Ä4X—«i TàpEwjXÁ+™O° "’àhú¤4‰Ÿ”.Ç÷Ñ‘j~…®ÔÜL<ŽåWÈm…Rņ?-×`îÞîìÓõ±ˆ o—Bÿè0Ó‹ÇÈ'M ®L\ä½ÅŒÿŸðë}_÷€vH= ønA&4;õ~8®…@¡všW2~’u†ñÔ°z÷mèñŒŠÃ×TF9I¦Âˆ6ùõï)^‹i£Åœ8ó@ ^G†@ì/0=ó°HAèHÒö“V¦®Hd%å¾f¬W-XÜÕTT‚‡gÚ¤¸Å#>ÇûyVü¸;a´üÿþ÷è5Ðs(€Öfÿ EÚ9úè­ÑÑ‹¥<0¸„ô-%žìJ£ãmò?ùù TΖ_y\wµÝ¿ËûÌ@ gh­‘{ OðG‰e…‰†¿¨HÚV!›Ì˜¸d«2F@šcëöaùÁºÿ:¿¥¥^êÞÞâ/áýÒ²á/ƒ ˆ@Ò¶Çdæbs54ÃAÙ»+WYouP[ì™uñN)Æ“4o&eþØ*mÖ$Ð zë 1‘ÈI iE%ÅKš?éñ»ƒƒ‚Œ>§3o½Õ†Ïþ‚<ÅJtÏé¼gåOX¬Ã´Áx.QÊ|¤‡äò7)PŽ“Ï¡[æßàÿV^‰CÔ7:+?m¡,<Âö­Æ>¶Æ»û±BxCn¬•ªOšî46cL`…7³9X´WŒäå+åáSÆËÑÕ8üó§Êùu^ ¦þz¾° +*bÀ4û´ýÒOc³*öà\$D-` ívb¬þ…Òh Å[*ößÅåÒáwa:‘+ ¡,‡ÊdxÔMõÓ@Æ B<ƒq†rÜ®y™×Yâ©ØSßÕœ€pä‘"KŒ\ÇJ¬`ÕÆ ìÿî»í™ƒÁ—_Àg2 +°Êoìø¹·?XJ#ä—=`†ÏåÇ>V ö`º°¿D-Ì[”û¿/s/›$ûU­”;×D¢ˆ‚óë.}ÌÙû8Ø ‚â{r7X ¤íÚ ùÑ–|lÊéüör¹þ?[ät,­ÇÝ_\*w>¾ÃGKö²e3†=PĞȢ`NÚ~#—Ü4K¼)âQ”ì ‘Sa©àt_¡Þy 4MIbò' ³,9(—¡‰°¢Åä‰;üªWÞq:ð˜crKgMF1I˜™8 %+*Àå_™Ÿiɸ »¿ÅÞôŸe¹î:ûŒ8”€ ´Ü'_G#¡˜Ýu؆…Àt§ÆM¸K6÷bM,PÃY&+7ˆ Æç|?¹¥pH€•.Y¼«×Ês¿_'?šT)˜†ã*J$§3ë{É:5ëJä«E2mDK=U+õ®îJ\¥Çñú]wåcQP3г ò1’…†.núpÉfQ”æP1ÑLö€ÈB@k×iæñOÓ‡~£¦aüý2ß+˜Ÿó–ñ±áÇ’4µñ% ‡*n ’YiS ÔÓ$"%MÃ¤Ü ð$(D†62"×Òóƒ\*ÌÞ— ÏÝt*Ðñ> >pÁ5ÜQ8c†MÅ‹ Žùn¾ÙÎÕGqyï½"z„x\|ö¢Ô@T$jÓ´` {ûÁ¨%Z5x;ÿð¾J\pUIš¦ Ô|C.!óšøÓά@MpR\ƒ‡%ªÈh:\zÌ•€cK “•ñ¨jëÉ@… KAÀ422çßét¾ž‚€cï––ÂÚ{y¦)(F+’ÈŽªi,E‘6€žêlÇWÌŒƒBJÓdïo\Qj6’xI–“Gø0%ˆ8n©ì ½¤¸Iñ‚üyÞ €º#1®,š¿‰ã»óÇl÷°w¿öZ;•¥C!ó0¬—)ìq5ÅJŽsŒ|XçÙKU}3PÓ0säø°BILãO0ó`ð $’€ÁM€˜¤’âF…Î:0?‹‹ô´bÞ+éfá1Ì iÏœ ÜMž*Ä•yüR°W!rŠŽ…Ma«R i›ÆJ@|5(Q•üIæOìí“ *£$¢ ¤$mÕ<8þˆËsûx2/­óq ¸qqn˜Ás?÷ (èúâòüÊ™˜<ÌC;¹†[ ð4` †Èø®üçVËè<ïï¤ —AFkAÓL§šeÀ4ü ÓÞÍ›«Azä@’}ŒœÒ¦%)PN_Tà ¦ö—ät &éÇø>“lH`Î 3õCå5ì€c»Å7W2t’áxÆÂdìO&亷Ÿ;îÜcÌï rÓ´ 㸟†< ¥É}wÂ8Î+‡|<,ñ`ÞúmBüé0€/‡³dþÒŽH$ðqc=ÛkQàb ´ïDÇ„gÊ8hiö‚6Nêí$#À, 4w„a^Ðè6¶ð?™®d!‘œ8¥pùéðBcþÂ%°´©ÆøE7žÈ£Ã\ ƒS P`¸;GÃYN=b\ãÒkZCY¡!@ á$ü„3LÀS ¦üH¼@¶ÏÎõ“7pJo–Øf?çIA€3÷zÇñ¼cW' Hã §$ñ %¶¥‡$¦WFš’åÜ%Ž1s±Å}ìéÕvÅæóñC!,G¡ ÆiHæb<‚ìÉ(ô>­!ªB@ÛeQ^1 ɪ ¶áP­ê&u(2 jvgGŸRctœ0@Ðþðlìξô­ò_*ÃzeÐ>2½8_ ‹—ÃõgÌ„Z~¸¢hÅߎ¢ÛΕf:VïøŒ«‘4ÝÆú â°ó(¾´"·ý£Æ¥0\[•XõßQ—.—N9Ã,¢ÁIžRÓ.pý,`oEÂ7YéÇgH9¯fc|‘£Œ…KO¢¤ô‘Uc½üŠâb6~ú±òäTy<Ã=†ñ±(…,n¨ø×ïØÁÆÏë¶£h ŸÿlshÂÝ Û—˜Ùt:ß=ÎrRî¤ùÏ‹ Kåí°·4 ^‡ç‰¨),~AžèýñÍi1¸PÎüêèîâ—‰²Ç-U_:“†œ,j»BØajÑó’ϲFÙëªãÒVÒi½µ®FÈ®òæ—¼.íùüÀr¶>};…-+„|o 3^æx0¦M ÷––Š|ð/–•çÏV’GØÍÏû¤LÆ7 ¿kldyÑĵ(á•À¾À‹íåå«97T©ávþTÏ9$¨ž8î÷b.¿|δͼ¯DÚ˜³eÎ+'Èúi÷˧àO-6,Ô‹NÛæªû¿¢pe#£lÿ 1•XH ЄÞÁøsÔ£J n xLSÔïíà—«|óÌË¢3hj 6rŽx馳^Æ}Bþë*L=½"ÄøA÷ gÃwÑæ13æSøÑOÔ³»`L*^Ž©©9 ç S Fó‹Â€^ `¬WŽý±A.[—¾"ŸªÜ&/Ãó³Á†mU5nß®f5;î?@%PpÅÓ¹¢iXnŒZ¾u/3 Ö§Wm'}ÿ†x~SíðPsñ‹â”1ÝHWïå­ÐpËýµežºkµ>ÍÅçàÃÇúŠúšîØSj»gàÓ˜ÀQ—\° CÂoÙžìVÿ µç¢ãJl£Zõú³Q íîbåLóù­Œ›38[Þßêä¡zÎ=nF‚èZ¤¼w+Ïi.~2üw@SYÞŸPévsÒ7!@UâûwÐÚ{IçØ dŸÙŰWûˆ©OÒµg§¼áûͨC@¨¼³Pî–x>„w£V¾A¾¬"⯢º*#œÿáUr»Ï`q5ˆ´&I[­Aû•É"_b™³‰#’Hˆ5ù ao†\ôg\ d±ò3_†«1[¹Âý`žÑ¶—çÊO,m/3›ÿu«Çà6äâpEŠ×Oþd |3¹e¹Y3#$ø ¾Ò³;æPûx£Ùä3,ûQ—•Í ðOºõ+|h‚—íæ!æ%ª@óŸ’bÚ?%n’6ŽfŸyépñdÝnùäÄWôú º^C0C}ÿaƒ~!º8M ³Œ!Û(vY]U«iß\æØ#0á#ñªíÆd{P¥ÃÒä¯Ñ`ƒÊ†>&¯ä €÷œ±7ôþ8:$ÿ¦ô¦p6åì¶vn®ìÒ ò–î]å¬×}Ýó~t­õ(Íb­U?]O#¹|+É\Q»[½èÖfá‹¿5Dã/þ)â;bOúœõinÔŽ%·øÒâØ‹è~±ºúBèS–YgËÌÈ(G‰¢Iý4 Ïûžï^ظ¥ö!àµ@6Ú+_8Tœó# ªLkVNT‡Îøþ?` \lwgÃñ1í…ß`qs°àPa4í€?mœ&¿2­Ö¿Þ–ÇÒ…É¿™0Ø©´‹èi¹›×ZŠßlXÄÊÕlÌD”åg‹%“þ ’’’’:#LÕÈëî”ei^'ùÒ 'ˆâŸºà Ð©bÜÀ ¾)ˆ&QŽ%ñ¦ñÖ:åÔ#ÉÉ@_“o?É a@†§E!Ãà²ÂìH1ŸéªÇ͉é†Á¡I¨Eçê›I¿­÷–-“!h¿Œ”f{„¯³>*Ú;##T닜½±ÿx؉·3ëAˆ@öÓƒuÊ.ç=i9ø ŸœJ—X_iÚ2s„9‰b4oŽ´‚œþOYÇMDÅËMŒë9ìb=aÝ͘x£8=}…*ÄSDÏší"—n¯+hãMj~nyœyÈ€ÄArÀÈ».Å„Z¼­=x¤§›y,óÕHÙá¾^B¾Óÿhá¨O‡Z&@zúÉ`êܘ+ ÿeÖÊ?iý³s)­ù6M!ðí'×I—û¸g‹†½+Eþš±rOÙí¨\Ï@Y£Àˆ Ö@ÌûÞ¯) ÷Uõh)oЋÚøBóÐÖ…¡?6úôrgB¼¼Ç جj›” 8dà ÛL8°Y:½ÞȃchÛ,›–¶Õö‹`2BÔæµ¦Õÿ¿æ},• ñ§ñä° /Bªö:`Ú–˜Ì“j’TÑø4€.ÖªShÌýÝìå7Ò{óLqìÎU8$g½í½%ªWçdãx†£¬w:j¤=ËFȣ蟖©†–Ø O³@áå󇨒f c HžX1ý±añÙªÀR>Ó_ƒŸÂö?mÝ”ÎëæŠ5szYdÍöS_-¯3VÉ'/¹C~;—ÚÇבÂþËïT˜¿r¼= ˜ |RÜ’{ T?ôKÑÜf €£°2ŸÛãêjÇvéA„=?×Ð Ã0[€òÙï•è"à³@ ®'=žÏt8^(óxúÃý(ð%ÔÞ9§äç/†08æ¼¼+á÷М‡%VXŽò=€½ ¢ %t­ôzG6x½3+®‘ÆêÄö(ÓåûSϸîÙgô Ö$ópÓöÿ øæ3dáPщAg€ÚcéMYa5(’„»¡µy¶9þïÚ[i‡lô„m@ #±w§¸§©NŽŸõ<ŽO€! Ÿe*â„,ºËçüŸzQFk™,9`ü ¾bw^U4)‚éj¡˜¶À«Úæ5¥™bí—+zó5˜¬Ì¬ ¼Þ²Ó=ȱ×ÍⓦË1÷Ý æ—Á=¬›gÒö<ü;XØ3·p\dƒ'^ dƒùp—÷_t0” ¦ÎxµFŽøÛM˜â ´'³»1Nò—Þnèbœ8'!œE¸ZÑœæ²ß8,CÀKœ c‰r´üG^= <x ðàÕÀß^ | H©ò÷2—k±qãÑ+›šÎ…ÀÝ¿˜zØ ¡ì²"üdEE 5 ¯Ûöf5ÂUãÅìzN íÆéà ÀꆅØIøžåw3–òæÐîª7}ŒŒ˜„]•N¶óæÒŽ =00² ïÐ\qOÙE+¢ÀLƒvöDl 鈫•«Ä ŠPwûjÒÑ Ì5òæ’-Ù”#f¿q£̉¥F5G¿(Ë—bÖÈC…«‰_tâ“!ï†Äc™¤6@|x•÷x1÷Í7dC5htÀI¹¼U&­£nzt‘Ÿkƒ²ÍužÚ‘—O²ÿÉØé7à±püD9a…úX4æòBeŪÈlX,¥TôãvË;òÁ“¨óz“è l )0—ýð•61ˆ~1+Ï µVØ@6¬¯€) †©Î8+?ÒÅEEˆô®@îÎòs©à1gãwÒþ66%a{²Ùbá.òz·Ó?JP/¤®e”j·£Š¶u®»û‘ªgm©C!ág&µè±èYYäjD E é± _]Gƒ6¿v‡øœf¬}„å>×2Ÿ…À¶È•áÀ¿Yߥ¸kñ0Ÿ@ ¤‰Ùž°qYޏ)g²økϯÅUÆÝx1¬8ááÕ[oÀÄ—ýª@ð`x¢ ßç•K&²÷Âbk—Yøg‘€=µ*y¿·õdo·6/Ã& rJ,Àò±í_€‰I³¢ìÚ*äˆ;ì‰>6€ 1ãå¾$¶úO{ùv6D[tŽ}f!\MÆëÕÕ%5è=‡ù—ýÆ‚*EBa/R <HÁpò††¹=·m!°î¨`Æþ„œ´´BäŸKÔKy^‰Ó¹ƒv¶šïêí9xúDK"‹S1ª`ã<ë´LðFìPHG~ñ¹Ä²7Dog•r°,góÝöjÉäÔ™ÙJµKâó‡eðÏ@vJ—ŸÆÔÎXçž?X Ä•9Åñ$'1`ÌßoÇ–Õ_¢¶3½ÿU»­V˜쓆œ$¶¯;[ùJùÌŠŠpN>0U(ñø‰¢¢ÈTýûÞ GÜŒ_ø VØ@¹jÎ[ÍÐyËŸ–˜îœ °äFvPë  WÍ9 9êP®÷qXÿ1 ÄéÇsPý*¥=Ø¥›¾…@EÜ[eõO˜`¨ªêò<?ý@­f¹†Û ¨œ$#zU»Ý³nÞµ +-² R†åãfmKÆøÿUг‘)ó„% eL+|·¾ç£_øÞ ïš·À¼ tçj$`Ëé­Â¼Að<’8÷‰3µþ‹FÓÒüZEä$Ô䜩â€8+WÍê‡{>ãÇÀÇ€óñÛÂãVä{â2ÐÍ{¶‰ZdZ‰^·d0=]e·(WsZ/ÜNC”\ðDÄÌ—{¸MkÑú1㵿ZþT“&íGÞà ï"Tšw‘23²Ø£.Töèÿ^)%vŽvÕi0ó#FÝøIrðÑ["ÒîO *8¼ Q[ ]xm•$¼þª÷‚y –þò}@C¶YIù@·œ›€e¼?ލ6Ýxéjv>6I¢MV:¾ß½¦ÔÖ~8¯±ñV<êt*Ê &IDATCx!oåþ.Îòsž"Ó0H÷åMÀg1¾¬¯ïM¿®ii|¿±ÀZ³A‰µ˜û/JVšÑÓ³” a9£Ñi•y~ wTG9€Æ~_Wzðo+ë;Hø Ûî˜Ç ±òå>b“h…C á@m“0½ ј!M>µTÖ €wöš|xP&ÛVäöz ñB¿»…£î@ø³ÞÙ±Õ"A§p«É?U ,ÿh ö–o›„òYW99b¤B«.ew³kÄ(þœ·Ê+Ç?b±ç_,°<²Dñ¥b›Õ±eu²‡'þøu5ô>8 ËÀöY6üW}¾mkÚ"þdž'^^XøÌ×€a/f¬¥þg˜‚Þ^E àÞÀH{½Þ#iB´(HH,ËfúåÍ]iî\mÊÇÜCÕ¸8Zòã:m˜‚•z &cb‚‰5;©)1ÅŒ˜{?ðFà< Ën 3XýPmDÖ¬Z/~\t¦?KËVYrpßó×\ -¡/üXØ[¬±€ý²‡ Ãjȱ$¡hõóñüõõ-Æ®œ²å8ê-U Å¡v¥rlÿE=Šm¤íÕ@B¾iàþ¸L_^» gZþ暎†½¦à³hà=!…Z{A12ºÝÊìì`O¬&õB ÀS‰Û±=™Ð(åÈðîN†Á+¬b„ú Á³ôå%Ê%Dç\µÉ'Ú´¶‚Ú2îøõÁ,´F3,µÉiþxðà^`{Á§Èèrீ…Ëô´·¡¦Æ.XùE/—¿¯SK$ΠԪw®Üæ‹4{µú¥Þ)ÿ?E¬›s³gÌÅ–=cˆÙ0Ø;Þô78b€Ð.Sô¿9Êèöfãr «ãþ2Ö–uWIIï=0íJ²(^ÊÓŽWá†!1(]®ìsŽºLËÏ6ÖÃò¾íhGs>òšÊüʼÞç+ÎçÂå£ÇÊãûŸ`Á=‚ŒB1V°çúî+ßÛGy 1¯Ù“RˆÚ"u G•ÁÑ׊π!xjöpm‚ÏÙ,D'pD]\™†D­ éuõ¿V©gd~ 3OÙë¡Ì©/öÓ_yãEö`¬8/*ÿØÿ(•¯þTbOJ-2Úå¢aËlÙ™Cax¢}©.³‘Û0 1<°Pm„8+í£Ì܃¨QÃ!4ÍJÅkÒ‚ã ÆO @¦,Û±GpHWXˆ"ôü³q—?aŸ×ûJ`˜eÿ¦©À’ïvÏ CÉË9sÊ&{ãwu~Ìuc 3Â>þCí ×NŽY°£vH3:pa@e»ÛpÁeJ•¾Ìñÿ4ö¦ =ÇŠÏžï&&==\áÏ^÷/@6¦d×V²åìÑlpaAÚà #X›ã-÷}ˆ»8x/0L~Ù¾n§ê]m'LSxÜ~,¿ý Þíf-DN“™vôÝÝ$eP™ßBïOÉ”eT¯i€üœn»k=Ö›XZ…b­ÿ³°DZ¿š ;J¢Ï`M NQ¦Ñ¡É¢TM!Ó’à_Œý¼ ät°7]b‘õ<õ„C7¸×9Ä^#€º}µ*ÈüwB{VùªvšöÜž¶Êî‹Þ6¤ûa¢«Ç µBhlmÀôîÑ›m‹½²a¼U€#þ¯¬¬Ø.Œòw,õ[ÝÆÂ¿¹w~ÂÞ\ŒØØ3öÓB³sµí6VA½qmÀQàXãÛQ;¬}¼4K#(ÝL0X1~¤Ú‹KR­bÏ)Ðlp°¤P˜-Uå(ßþè2»Ã–i_•éÝ9;¸†%ŽÛsbÚ•ª±=þ· æ[W|ÙÐĦI†É9‘|fünMÍñx–KJäG®z|4ù:SddþÀ¬rØ?²‚¨ž! ,U¬¶È‘_O* [(¿hkÆÞô}`¸¡†¥†„-a²=WX8®ÜåÚÁS‰ß['±Õ—Kcm œþ#pðZ`Pow4@žs²Vµç²ªmRÍøw\¹å§JŸž±>©O{æ{›/{ÎèÀB€Óʸ\Af'_ ¡jgªj|v»Á«Ž=#­Þ¿³aÐQ{0yPq~ev+òóiRR[mÅ£EŽŸÈ…˜ö"ާy»ª,¤wCä¬RŠ‚ªÕo(¯kŽÆ(¼^Ùí?nÚ±‡ef%S¤²Ph³ëµêêž“jMmÏßC„Ž›ì‚Öä«ûlçÏÂŒO`¶týb³÷'›ë~ì€Ü¢êª*ÏAkŸT~ ¤íöYÛß’Ê€C#¥Eͯ¯?ŸÓçP¥¶Àø°ýÙÔª}Ú Žl-iUJ0r|à&Ì8öuSÏk\Þ*ì€ÏþµUæ^òË·V•¿.@†µDÑ^ŽTäÍC£xY ÷:¤ê¼Ë¦Âó)à` í?+ˆOE^7…>o6ä €iWæ•×l`ïê ¥Õ¿N_oÿù(MÅI|¢]IÌ;š¬ÿ"‘È0ŽÅ}½)ì8|8 ØÜ¾…Žò,1—3~ -‘Aµ¯#7“LWo¬ûLÿ0 p°tr¡¢IÎ_2…O4OÌ%TnÄ98*šš&µ8¿ðP㤥oL­GŠ©4ŸZÔÇ˹cÌ9zØ»³²©Ùì³h’aP  Juèˆ`ªó´]Ê¿p[@Ç[dì8Ì¥¶±÷÷ÆŒ`!åNK©éÞ‹kͦ c@ûªÚŸ+:Ç„q ~àu™RßQßWlº`§Òs§,/á8ÐhFÖåNîŸLQ”\èÜÛˆñ 5ÀÉ@ûp°’åN2Nþ(î9ú0\þ9{ÌlË &µCþ‘²ð !³)±×häöºw(nnŸ|Û&—g,û×F\Ø9MÙ ƒ›ƒº“ ·¢,›]º$»0:Í“snYïý—°#ÏñÐlh¦9 Ežíè€rý·Üa­.FzÜ,p»~í²<øãWQãN,é9Ÿ1ÈM?%ÀW€oS¸+)x0eô¯VÀ¡As Y¸÷JVæ:_ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ6åÀÿƒqtŠ>ŽÕfIEND®B`‚wavbreaker-0.16/data/wavbreaker.ico000066400000000000000000000715061435035650500173460ustar00rootroot00000000000000 0s‰PNG  IHDR\r¨fr÷IDATxÚíwœ$EÙÇ¿Õ=3›ÓííÝ^Ή;âŽ#KP‚"*AñU1¢ï‹˜@TÌ1   ä$眎Ëùnosž<]ïÕ=Ý“{fg÷ö¤÷Ù›™îêêêð<õä|üJV¸nÿûÏœ æØ2þ€¥û ÍiöÀ;Â|âÑ ‰¸¹„îÆ¤DÔÿ¡/@+•@¤`»›dŸùqk<¨ÁŒ¿ +?U€Ðœ@yoâ¥uú_‡à](f>ܼ¸»U.¨’@"‚nn²Þ×=6%øSà[ì¢]ñFÀ8~9 7ãxº¶YUUþa~V2ÞfWiJ2Å,ð Î6w_~¼ülw¬\HX€ÍÚÌÏ=V¨pIÛÅ3‚›2t¥TÜ)«yâ¦OÍ·ø£cïøR’ ÀH·7îî¡å€…*_5Úçù%ðWÔLx=p0p‘¹ÿÿPE4ÊÏ€u(̘"©„’›Ö›Ÿ{¬à5PU@u¸åG+hßx­s®Áæ¨0ÞÔ›¤Û6Æ—¤bãKÀ£À›ÀÌÑ:‰¿¾  !ÿ4mZ\.]ê—‹­~Žré|­L§; ÅÐæ§ŽÖ5å‚€ªDŒDrÓó³poóGÐG•èyÀM2ÀƒýRúðWõòå[îÚ-Æ— Q‰”`$Ò¯i¼2€“ÌÏ*à„Ñ8Á<Ÿï+ ø4À§Lç74ø‘òCèúïÍ&3?¦ä\;/>8ܱéý£vçrÀ€ªX0e“%`ÆX§hU`$u¥L<ö‡eì\{2‹WÜÁœeèÁµ_ @RE4™ÓñÅ.‘·É“§mgïrŸæüúú;‰\8amltîþ°\²dð¬cÛþ¥žK.]º×“ÃÃß"5ãxÆØþ" *šÀÊä¨2€hŽãn’:÷üJt_Oüâ>j”·ìÆÎK$¾/)Ž”GxzüUŠÐ'L}Š?»-¹/G¤2Ù48›úæCÓ6]r‡’*")&`kE 1HÉ;LɆzÒÀ¹(ãÙ·GÒw¯a|û_jBÿXccþ·]Kx-MøâTb3€Ô²qåÄÍÀë()£¬ G?›ÍÜSĵ—€t­¯ßAÔÇœ{CFûN*±@¥Z¯/‘šÔXH$”n™=”R¹´FÁç–uæç¸’€V9Ü—þ¼*P/PÉVs9~ËCCï2 p^CÛ§”såüùض—&”ëÎý9—/¯Þ¯\QŽ„ckj@Ê÷Ê¥KÀ-(5¬8n,n¬¬Š˜ ÀW “—1x[<¸Œ§›‹ |U‰j¤’ÎAÀ' 4+¶òg@ªèusðÈU€ûe ši°©mz…\±*£}œJ`»cKi®£}˜ˆ$@$hɨ–¸8Ø/­õÀ€UØá«™ÔìwnYçès<¡‰áÞ\Ïë@JI**νߴÄï[YÉt¿¿Ð~**V¢f°'Ímß¡˜w)>â?ÃÃP¢Ã1JhB%mÁ–.ÆD Ð*@@MMû $+ë]8¨çùdÞüã9ÔɪTæ=ú<ðàjÃà"!¨må®á—×^"¤™uÌ”ËOù[Ö¶T’ºØf©®•I$â‚Ȱ%rÞl5¿ŸæhwÊ¥t °¸ÒüžyPïBØŒj4âîA%Öü¾„c›êË%jë¹®¯¤aœyÿšþNʯûÛ0Œ›ß¾DQØP³ÂꀔIýÿ€ª*&èÉC,‚¿Åü<•1¨[)¡::¤&û@-4kÆÞü<´¤ŽÓ £R;I¼7móñ@±ÞK; بâCsçœÅïåìÏ?ÏÁßmã7n;II0Á=²aŠóËOÞÅçÿôlŽ–Õ(¿ªeô]â9ëèïô%™ln2¿ ¥Z\€"0ü Epk6‘ éCتJåwE­Dy/Φø‡ÞH¦ àDQb8€\ºtÂë‘ÈŠq•õìšqž\¶lð2p&Ð |¥7o¡@<¿„cÓô §IÅ@,ÐÌHì;î‘´j@"-ð°ùy0åÑÕç{¤e4 ©[A pl1ÔµòàP!ˆû-.þ^µ<Ák½ƒ&/'ZL_¥3€ï¡1ä¸)  ¢û²× 4¨AEyí4·Ì.éœ:µ t8eÔ.‘­ñˆ«•ï5CYÁ%{eíSP/C&ðB¤æ-Œ(Î=‰Ûå>\ý¢»ìt=ð×Çß/k€Áþ|Ï«x}Ù0N¸ohHhÔu­rÍ“*1Œ›äâÅÍÀ(OÀG€™÷ìVÈnˆ’ N\‰ìÛf2 e K—‰2޽in}£º4`ñ%’ ¨eâ%J )šÁ¦C g ìL¾o›ßÏvÛÇ7Ú™àËMs¸ÿذ×¢t°~*p7ehI£Ÿ¥”¦$¨£ßÁθ¸°ñ>»r âs×ô‹¯þË:g·ù™K§·%€@uØåØW ™§*»¶Ô&ípVðŠù9Ü8ðî{Mñÿøš|¢¨÷è4mµ\ºô/rÉ’ã¤Jú*‹P®!›‹Ðç{×CÃÃ@•¬¬N² #] 8ƒÑ/^Û”Ô­U(‚oCÕ>€"ˆ4~¦²N'Gú“*Íìú˜gá"–EJÄs¿åC± JSÞëýÜ;Ò Éu*+’¢´¥¯Ï.儺F-]IP÷ñ³¹]NåV¹Y»%ö°¸nçñç];9á!$³¸GVP8`ÅfUõvΔ/¤NòÜ´m'‘É”Z€kQÄd3ÝbYU€k±­\KD¿”ï~ÚŒÄs-þ§b"R~!ndéÒ?H5]ŒšÁ«P©Ãi'¶õÿë«©Lg:Bœa&²X  •Ô²r£ºˆCP÷G³bK,{Í{A †L– "ƒŠh¶7¢tT¡•¼¸f¬˜£ô½ÇŸU…Ž)„Ò€^„ÖÈf—rJiPÇ`¯-L˜Ú*$w ¸Mjú4MI —¦è3åÒá°T€ÚFu”­”«èF†<9m[¥?;ñm”.}8 9‚&¤„Ð`6Û+ØÙyîÅÔ%KöÿÏðð䘔àÄÒ€ )?ÁÒ¥Ÿ4ïßwÍ­'‘æ KyÜ#&xwösNeÙ²ÀkØYyùÔ€`%Æ Ü$Ñš˜¥$‡$ßw‰¤UÍj ŠHïDß.§Èb!œ0£CŠÌ{“QŒÛ*š{ð±ÝÌìÙÌ€ºVÞòWRl…î ŒÍ ‚ 3h­¹¥•T‚<%½œ˜§Ÿ†{ÐýÒœ±ó¡°||u¤[¨¯–~pÄÔM´¤ ëÅ›_¦;PKdÈ©`[ŒÐV”žïŒh<[ h$4˜R±Âu¨8zPn4wÏTˆwß>¨Âù÷¯¬dª¯ Æv)$çÎm@Ù¶£$‚O$w/[6ï‰Phΰ¡[N©ÃV¬  ÷“]ÏÝõ¬žA× Ê#"ffC…=¤º e×›ç_‹²#*„ò*Êýê Ô&ˆxD=Ÿ9GˆÅ¦Zp+ÊŽJmú&YÂ¥DÄL v*5¯~zJÊrÉ»•âÔ`’Ž›w6JäkÞàëÈíJªe¸O½©Uu… vúhÀV2ëüµ˜¿­8€¦V‹H-ÿoY€u„›®1?fr“¬]}«ÒΧaÇÃ71œ×ѨëR* üƒæ¦fT‘Ž‚2Œ“o5£ÿ>T(øÇ=š¨¬ü,ÊÛc„…õžI™´9ÌñûYR‘sÒ~Ÿ©NüËü=ƒì®¸ °Ÿé)À”bœ02¿Ǽ.—^*Ù燒®‹wqjoEùß§wãÒž% n¨ÛviÖMA£}Òüù¿ÀQy?DySÄ¡"^õ›er"ª¤éÉ{%½[#ÂØ1eÈz› cÆ¢©í·êþ$“/¦¢Dºlw±Vš@M}ŒB0h ժߚ²ßg1sHZ­—Éâ® Êtõé àï¨l: ø0•ÊÎuÎèFKj9μŽ&†lPeêÍ ÁÒ¥ËQ†ªÔcò@.[6ù®ÁÁ†œ]>ð “x­HÁ`¹ùý¤ûÜÅÌféÒQA›Ìm)õ/—|:P›b‡ÒPÁ_EÁgÚ††Ì·¤¶5EШˆ×4Äæ “ÅÎK%'£îé¨wdªÞ¥ëi]°ÓžØª[ˆ<ê2©ô¥†|Û›² õïÀŒƒÐ¼ã%’YZSöNy¯KÆX® ØŒšî0ŸI4z;ÒhDÓwG¢Ä-P¢]6ÔÒÛ¦¦úInüuØI+>£ÇM0 òDÓÔs1˸ÒL ³J$µi  ÛÈuû²+E¢³ª( ‰Tp|m-ÇÕÔ(šar±>jí.8Ãøà :¨(¼iåÿmÌe¯½FÙ%¬›£äìÙ•›"‘cÞ6Ã]ÏD¹ànvüNšDübâÂŒbE'&% 5Ô qóÍ«kÍÙ´^ þ~¹ä ³½ÀÜ~,™¶œl¨ê´‹éÖ·Zþzy¢íG?’ú¹—JB¨â«'£há0ì(Ö†®õvÐݼãö4 ’‘uךŸKißt BHí”ÏýEáåšyëèkWF&L)ÌÓÌ~­¢¤ËSökÔtHÓ@c*ÌÕ¾ÏSx¶ é¢4ÀRñâ‡Ó¾ÙjÝ…€25ƒ¦0€¿Lʃ³fq©ªØcÍø–pr-Úb±ó­™øœòÎþæõŠQ®×Ì-ûS[{ä}ÃÃÕ•BXΌ!åY¦$a1€é¨@* ¾š‰†¸¢s÷´:¿µ­y›kñÇK%S€G°¥œïQ€– ´†áv‡ К°Ól hÿ{™¤ñksß× µƒ;•J ûš´!Ê€±c’fsv}Œ†–¯Q]ßKCK;g~ó&ñ‰_Zš;÷Y!¡Žþv+ë°àâ$šLZñ­€‹#SZéÞaÿnž{£¢­){Ä @B]R‡¯ ¸]ÎG½@Ûäãÿ8HvlVûÕNß3ÀÁÛ õºÃD"ÄJ¹Ï>5¨ PÖðœaÁrÑ¢E7 ì“’Mãýõ£P~OJë>[1 H$õÿ#kj¨Ñ ¾z³Y¶l9yÔ€@]†k×iÿ8ø²ùw¹íJS¯@ýÔ‚W×$Ð.7¿ÿÐü\B­‡;Y;…l*lµ@û ùýJ”d×|@Bm¸_1v_ƒ” c»<¸Æ¡Ü.'ó׎íÜÐÿþÚñ3ÎùÁÒH;,=¶1ãØÍÄ#‚¾Ž*1inA ErÆ·¢W Üo Óèq2€éh’}Q¢§5{-/thƒ=ê[}3šä<”ÁGåN¼|ïTvš’–™A`3v<ÂÁRÒÄpŸêH×ÓZ€Xìh”Nj†rÖGkÚ¹¿êQcùhCõ… ±XÅ(¬h¾…;ãñ÷Xݺ¥üêYXÆÀ÷ãxgÕ±(‹PÓoPLôÇæß£(«}ch­o©ïþ*hrJ%Ïýdð6“ûD¾#4 ™  ¢ž¸¦ç\¹{ö’E(Û•ÅÔ?"¡:T @«HÖ+1Æ–LGr:é>y-Y7Ð2fÊ¥’f6½^C"®ôÀYKƒÆÞüMÖcKU8 ŒšÆt¬™W÷Ä)H• v¦[1A(VÂô˜Ú©ô™*[Ã$$œgæ3ü€¡^·Ì!ÎÞÛ-)à` Iš*@£že"S"7Ø/ÌÉd<úhßýýŸÞ‹¡_lµŒç rŸ}¦£ÜºÚ7;;X)ǧչ,#(¥¥[;Õ€¤7@$ï³%ÄëÀíÀçP ö\”wà%`Ê]z [‚œÙöº¢ÅÉË@sWÙ@÷¡}ÎüþWÇ=ϧ×4»¥ ²!¼~ÝÊ>´ÔÄÃ×ÝôXPÔù+’¶•cl@nX · ™Â¦×ì©cö~nt ZEÙV›Û>âèsšÜj¾£Ó*&p‰Ô€'ÌVSqtÊ÷ý&*ñé£êR­IF3y.Àîà`5þ*%iHåó´¤!‹„”I@SöÛrÞiݲù¨ÛÛÏümOÏD€SêêX0jH$–¢fÝÀ_úú8´ºšÙ…SŽ-Ì•‹/G¹ÍÈYYÚ­‡dX졜ÏÖË$ÛQ˜‡ ‚“¤ùù7LIPÀ>»LYoJÊžDž÷+IŠá€búÇçißêR@Uy=X¹àI5Ê`> ˆ×nd¿XH1½rO•rß«jPN @×˜Îæ×ÔÔQÛ¥yJa7 ºÀ£QÞZžìC˜¾_)™‡Åf.³ib–Oa‡ØºÉÖúÊoÛ‡’pþ |›™ˆ”lSöM1u¡5.ň–úhJ/³÷n†0[©¨Íì\;1Éô¬SÔ¹té|”ñ°ÏÜöÁôF7~殺2w_4aÔË,EÙQž»²FÁ‚#é"] 8БˆÞMÉV=S–ð™¹G3Ø8 ú$œ~•˜ âÑË¥ö³›ÔÉ¿Š¶FŞܷßùÌîÝÊܦ?÷˜¢r!& +•b*±ò$x hìÙ¢&ºúiù xô uÿB˜±3ío°0V¿7Ò¯+ŒVÕ œqûR2]n~U½=3—¹6‚Hɇ̈¿¿¢r×k€sÔ,oìŦW³klHŽ@I#V„]~7ÏOžÿ:¶ꓨßá‹‹.císÐoªôK³Æu&7É*>þË ø3që\?öEŽzu׿Øhõœ2êûÍë³f¤áȥߵhÑ»¾Ýѱ”ëïèBVø‘Â0X\Yù€µiqEç§.4RŠ€-ONÚ…ØdZv–½ŸÎ/¬Ò.ùÄ#¢î+›güAà3cŒ$òÿÖ#î¾DÒˆ’Ž@å¤óæ?yúÖOH! ¨ KNs?,Õ·f¥=ßc~žL–˜€«%~ ®w£bÍ DA6lÆó½›Y*à«úodUT’Zk>ýFÎfëÛÌÝoÀu¿‚V&q ʨfé’_§êÙE¬y¶&I˜{ã8$Žl7=¥fâ6yˆ ^–ü=}髨Ď/’¶µŸß3%ô© `qÒ“Õ@§i³—µp YFÓaÒ,Ð8•Ÿ@nxÉo›r3‹P®¶F‚£Hʺº~·&E~2y Öfâh¹|yõÛsæLÿÇôé\9y2ÿ™5+3ù§0,5àuÌÙ°^׿úæ¿íÈè“&>.‘ççéãÄ Ä³—I£ŒvwÇCLYÿ Šÿ?ëz‘LriUó±À²DbvÀÌøC½*`ò^…ExSQiÏ„û™T@þêò¸a<1€h Ðp.8q‹l–ë_žÁPw€X|¸{rù-”X5ƒk¿øSùðŸÔÖšFXRöín’ (°ðW%¥X“¼‡.³ª¦#~ñÒ¯xDV¢ü¸§ÒÔ:@°š§!.¼t;èF(5`ŽøÄ/W¾ˆøý:ðÐd²Ýs¬{ž6r¹\¶l *.ÞJú: _ÔÜü…«{z\:dǯT6ýwJ¨ṘTVÐ{d‹|ðÚƒ1šOrìÇv•x$|@è“p1þŠ|Äoi„O xL»Uþ‚›¤Žr'ýe¤¼†ÎmSi3y&–X†À0M­mÎÍÓ ûÐ ]O °y~ ðÉcjjö|âW˜Œ”«€‹4)îƒvFÚ…æ×cÆì>þS9  ²‘ø¾ç¤Šóù MÐ8-5õwÂ\÷RDá±è¶ëï9óS™ËÃÑ•òá?©ä }ŽicÂ4Wþÿ2CHÁ5?0¥‹VËß~ÜG‡rH‹òIiÚæhK<>¿œã.ˆ¦™ôÔçÿLf½³$òœ+$ÓQï®UëáçÀÒ®Õ>³ê6%þôI±Ë_]TŸÊŸHjf’"3ý`Š‘"òbÜÜLi/fÅí¯„¦ñ÷ï^@ÏÎ:ˆ÷cC©ý—eŒ‚r»ü<Ê(x ¯>Ò s™^Öu$AJ!N¸ Éíõ…‡Ä{¢ÿߊÚOÌïÿ‡bž¾çÿŒs¥S÷gø„&«bg…@CK#Éah>ò»l×*ü·²ž¶iï©É@ù¯~ª øW”»† ÕWÉ»£¢ð>u {]”ûoT†)ù®™Õx3UuÉÕ °ìèržj*wr2W|ùŸpæ7¨üìÕý#ïÖÃè@~èRɹ(7ó1À嵓‰WMÄ8èô\ð¸Ø r& Ð…DKáðÐR;ª•_äºIKyjù'ùS9G=~Œ€à£›E¨’+¯Ñ³ãCL_Ò-¾ðÇ7(ÿ*­¥`"’ Ë´Ï^õ°qÝÅ"2ŒøøÏ¡r„…5Ó ~Ìå°³‡…ˆ…#îÔèAC\{©”³<$Ñ4 ¢lZ(,ú 4!0p>äì¥CÅI?æ•“Ìs"#®êÀxbh>Ž2.‘os‰øG|X‹œ.¦-æ}_ßJMƒ¸Î"Mø¢¼SÞ')ŽQ¹øB(G*ò%fŠ£ØÊ“HÆO Ä·%|E #(Âw ‘!" ѹÐqÅ€9Ú>\ n‘Q©ÓŒä9~$9žÔ˜$É,=ì¨c ²3i3Þó!ð ‰ÊPÎy>7ÆQYwa±ÔXnÆA{ðú™Áá#ïhœ@'¤Åt;Àhbü1\ (»hdueZ½mwBCà£RËæýs{ð°"D ˜>꫆6t Ñ§›Ú¸DcÉ<àaDˆn$­,GgωtÔð •Z€:½Šf_ “ü>!B¢‚<”7`lÔ€ñfôàÁ$az©¤‰)ÄvžÚÝCÊ €¨a²ßG%C$ I"!1hBb ¡!cdþSð${,‚t!ÌähF3DD SAéåÓ5|40Çï§Fsö*’3¾HÑý5cEšð°Ç"d†Ä×2™)î×é,Ìf&GQGi¹ULÔ5tIØ"ɬ4ÀŠíB ’¢ÿX©ð°Ç"LÖÌ?Ÿ“ñ•+Å? êVög"{msP£ ‡„"CŸF*jI7àX0xØcN@TÒÄNu}l€:ÞË_8™k© p¥b‹€˜Í ޤ…½©e*Õ´PÅDSEÈN¯šijS}¨_ª?¥•EŽÚº=# ‡=aúÉðYÁ4V0À6vðLÁcgq Ë8€Í<Īäz¬™0ˆ¡ˆ[˜úºZ¦PÃ$ (C^‚8AØ)†³®Û)Pƒ„9fiJå°f|M¨¨_å4FÙ$èIJÃAÁn.4¡‹ ‹xÓSÖÍŽZìE뙑·mjzNêùœ³¸J™ÍhÂAZñ”Ù?Õ`¥ Gc øŽ”¾²¾ºz¢°à¡‘÷÷ŽCSy$ìµÜr –-=½(„“…qDRr:YF'oà§?U„èemô³)Výj J5ÌþEÆù¬_Ž}¢’&ÑÈ\½U)J&gq†À0ÔÐH $’™€v26&!ÁïHÐè‡&?ÔŽ“’R£Ÿªª ‚x¼|ýšÌ&M‚|D1¶¶‘÷[$â„IAÃM”Šfš˜K#³"ºA‚]lçi*Uç 1™T2”`ÿ²Ïgí‰@PÅeª>ÌN f.[ÂT! Ãüm)‘ßýACÇ@£™ôŽdU&áû5¨Ö!8®2JGˆ@.„yó ¹Yª”°n<ý4$Fx±>,[fÿ®©î¹V¯.½ßa@'k6Θ©+™ÀË×OÚù,ß¿åô³úT^¤®&F²S‰&tÓ 8ZØ£€šüè½E2'h#ðÞV¸·½Ì›šÁ$oHÂwÂïWFB'‘ ¡“OÂúõ™ÇÔÕÁ‚¹ûL— jká¼óàî»á­·RÛ†b83f(‰äˆ#”Tmåc«_¿_I3”Ï~=Bù糋áÖlœkŸSÐð£@6 ßÌAø…ÎgºóÆJ‡µ_í“hÂn©¡¶'’#²½šÐFѸGÛ" dkEñL,Å8,PP£Ã䊑÷•k¶tktK×ÛÓQSï~7¬ÌHsÀÙíùúôùàôÓá¸ãR‰»©II üþÔ¾ Ȧog Ðɵ/=žß²%¸é“ûDf?§5C€ÔOå °®[$“…Ìã’*ÀhÆìÑ d`L û5ŠºAc­è&ßo©(ã9««aÖ¬âˆßM)±ïµ—ã†U¥ºþœmÝôyÈ!J%˜3GIï}oîÙ¾(Bª1-_”)¿RmþäêÝÅö™}_j¬ªÔàÜg…;úLÉ휀=ZHHˆÈ–úÎ" 0;@ý0K÷ŸhN:+š`ã0¬A§‹¶è»U ²µ;òH¥owvÂ1ǨYÚjëfu¢ô>[[áœsRõûôöEŒÓé‹Ï.†çß§§1Õ®ûÌdﳄüt[€÷Ÿb H$miQB SìW±ºÊàeg¿Ø›}6 º·‹žµƒ”1ü,;ÂFkþ÷JR嫆TL`B@Iu>8t‚zßוÐa]b¹P áçjã÷ÃûßÊmç¶ÏBý–:ÎŒv©‘xÙ 6÷¾ìÀÈú´ 6ƒ°-ÿ€iW°t›)f“ð­Ù?a¾î`åDY_ÿ«öeÿOÍá×è寇?οFÚg!„ äd?Z­C.ÙMõnðÄ %yL®€J]Í +šÔü°¦X&pà™³¿EtEΤyáóÁ„ åí3=v PÛmŠˆÑO1Ðé  j}Ú¿Hc¶Ñ3ÈGù*³Ÿdœ^ÐîÓÊ”UÁxßtε¾7úò†W• ¡ÒÐZ‰ëÈþʼÍ#L|‹Iõ*Ì®Nݾ¢ ³¢Ø¢EJœ¶PŒÞ\ŒÞ>}º…‹>Sƒ|Rõïüû@`êÜç7U·}ârŸYõ'kŸN# V 0ˆD&P6ðÃ%,h °Âú]3F lúG&Ðܹ9U€z—2вzE¨¹žÂìj8®E‰÷Ù5”éU™ûVL€}\”œ›Q-ôœ‘xùPnb.¦ßQb&2e–UpK¤ªwê“ôQSð¸âßþ­‘ZóO8 !Òaô³Ë^DŒÈK2RJ׳êù38Ïyª5šÊ=Øl'”åÓ­ÂR€O¨$ n%€Hæ×Â!M8Öp±1¹B©GMLU1,X‹þö¯M»@ŽóϨ‚“¦ø®tk«Ó‘0 ¿?w»Ñ üb®Ég´]êïÜû´,KL¨)xœó»p¹Ïé IWà` f`JôSjm@}Ô*åœÿ¤”> ZJ9$ ¬‚÷¿ó™:µ’•-Õc%$lÃí´*ô¶Hþש*8ÝÚ"†z÷&VÀQÍðR¿ª'`Á"úJ ›tAÜ1x–AÙzžÂâZÅžé>3R×'”t°¼t3l´ J5ÂUT¨d¢¹sU8o<®‚‚žyFEî9Û–ëÜnúÌÙo¡È¿ìûœ A ?~j WÌ>gäŸÓöàôÒ£•'€d‰p«:šýu32±œÈÊV¤”$+, _ùßùœ'@´¯äN€ ‘]¨hû4PW!ÊÃÒ¢Ò~•ÑR‘¿ß àRˆ9Þ×J]ùB‡JP©›Š©Ü”úz:·ÚeÔ xÿT8} œ2Ι6¹0TÔž6M¹é8@ÅlÚ¤ÀâÅÊoïÆåèæüMM*šÏiÇQŸÙgã|ûœ@UXi ?nú¤ˆ}éÒ@j<-êg.¦aI£‘”ñT¥”Eü– Ó·´*§dʇ¦Ñ4£’3^é禎¨Ê¦ðkÔ4g‰Òkôã›è'°_õ,r_GÌ­¡êà&êÔR… Ä û5™Y…žOSJgõþÜb·Ùæž%µJl¯Ô "íJ¦U*»…¸¡n¦[ »9'L‚o-‚“&åiX½}î\8í4Eø[¶Àßÿ÷Þ ·ß®Âv'NL *åüV»åËá°ÃTœÁHÕ ÇÓ(&*ÐɬÒâ~S(&š°ð>UöÛ.øaGŠäv;J0UìWeÂÕqšc_yíÙØzNÿˆ‹&å–.]È9š 2!øì«ÜÞ±ë4RŸ©øuuwjüè˨oô+&Ðs«©:¸‘†i•TVhh­TXûó!î « 1§*·- *íŠ}jÌ3èy.éz½EÌ-xWKv&²¤fš,Ì•”ký™WsÚ˜W§NÉa«(†ðrµ4 NµŠ@_4@Qú;ÓZÖCôfÉx­ÊÂ|ʰ¸V=Š`BÅ ' œPåÃ,7 4¼œƒ 䎥„ƒLE¨)­Ašÿ9½OÀtS À¬jØ%So/tSòµ«¨€SNQþþ¶6xøaõ€œÇlÛóç+ÂõûUq1†HgÛ––TUbútؼÙÝõ伦⣳1€µèø‰)©ÏÉ@Éߊ°•,í_¦Yû¬¶vaµOG/k@½&¹2úemu§NÏ\ á·K9K4Jˆ~wª«üÖyG™5™×ci‰Í†D #·ÞÀ_£å·îki°,¨F¯É’#4úUœ¾e£­ÕaJ%,¨Q¸™ÕʼnïζºPjB6¯Ïª4Òp9é#:¯\©¢ £Q¸ï¾ì©À=æãBÕpsþ\cH×û[[ quMÖ ›mvÎÜçs¼ÊaSAMy+uŸãõ"e–×2<Î"%@ºûP×ÐÔý•y< L!Ðà·¯d~#¾y5| `Gˆ»nÚ®îäc]ôa¾×S*2U€¸Éü¶°$ –ÔS]©g7î ”Ø©å×`i=ÚD*È*øÕŒ› N‘<d±m ´+:M¹X±|Ò$Ø{oõûé§³ïÒV {µ!ç¹ ßb;v¨¶ºS§Ž¨ÏÜ¢¶È¹Os0€ ]Éïª4˜(ªOòž‘ÙGFŸÂ)t›Ù‚º¿:NF¹m¦Ñ/×ë–¤)Ÿ@œ1ǶÜr§ùS㛹~Z@õÑ%3˜Èî ”¢0á›ÜAêñE,xp%<)Ó³ÐèWl1Û{â°°q`bÿåJ[’%ê®ÁŸéŸwÅpOôÅöé6@©d¿üŠêÝëé7ÞÈÝÖY9(ÝhWŒ´QY©\‹  ªòÓ³¬·çºßlA…‰ÔN–D4þ€jGqP·}æ´ëý+¤D: €©Ë…ezô$#ÐÐ…–Æj˜^r@{®™?«t:_P±¤_•†XÔÀ=1y­Þƒš¨;¨I…SEÊÐèÏdî?©¬åÉsŸ9•i§µ2ï° L¹jöÝ«Žª&¿²ô×êh³«)xñ~¡fþJ ³„ôΨ²|nEýRU‚¼í^P‰Ë¯¥EYþž>uzÛl  #àd»'íí°}»ú>eŠ’ŠìS¦ÝÑb¢ôtsKC!ÓlUͤ¼Ç¹Ý§¥íK‹H[Ì6šv§PØ*Bv#àÁ\4ó>‘e“<°Y’yk)𮾻…šGŽäˆ€`ÀÓ=üC7¯hJ€ŠZ -$Õ­ËÂjüÙCª˜þtÐ`³åé•ÔØHÍ’Zªi¤fß*«|¹íÙ.Ær×IìðÜ%uåß‹m›mœ9”Êag… ÀÚµùû4 ˆ˜¹ÖÕÕ¥ŸÛ*ÒÛ«jýmÛF²¢°“9”tMéD™;JÏéL ‚›‚(óvYÔM4a¡}ZÚ>-sU`‡Jâ Ö,&a2Í*¬¡£›¡Ì ûòñS„k«l&¬ZD®&)KoÖÕºJÁ/þ½UÎ6³j¨š@µ–É&øSglZîsÏ®N5$®l.a(Q)¸Ù`1€¸ËKàFÜ.V%(vÆOGzNÁÜj8¢E ÐÔä¢ÓÛ((RfEøÖï½ùøôãøÙ庫`¹\(4÷å|ƒ5WoãYÀŸHÃ4ìU ´Á„Z·¹Ú—j´›WEµ®V:2²%@ÀoºÃ â•:¾EuŽ5¬‹pp#Uº†þ\‰HŽQKl ГGÈæ›ÏwƒÜÈ`ÅôYËã3w®*Ü™r€›N¥}<À®]JÈUì}ëÖ©¾ª*˜=[… gk— Öìo¶ñ”`ÿý•maòd5&·¹`ÕÝwúâÓcôÓ÷i@ Ä´G ¨gݬÎz\®>­ïvT ÝTVìt_Ÿ˜Îáµk¹-ˆ# ,#¦•,ÕraB&‹„h€O;œKžÃñ+«˜8¤¡¨-ÂÀ[opý6W7, ²±sW*Á¦aþ50Y$ƒú¹Õ*§`^5UþÂ;)ìI¼)`·¬‡6€f?Kê©’(>2¿šÀŸ`Æ—1éò½hþí¾4é铉ãb, %Àª&léÛåßu6Â1ajUi…œ `Æ %Æ—býBÕ;'[»tôö† êûŠÊ¢_L KÿïìL]£phHõ J (ʾÞÖ}Ÿe´T€}ÄPõÙê™YRŸYTQÏŒ”§8Cë„Ã.58=ÎTàSøãÉ{óÑÕ2ua˜þ]1‚ÝAÚ_ÚÀ½?þ _ØËúŠã+8ç>דYg„m7nc=9TˆÁdtïmeÚ}õüqýæ³OyªM~Ûaûpí+™Üà'pòdšW ²k~-¿\ÆÌ?¾ž(‰ ô%uøW4áªËd$2õЬ°ßP¶42šå§‹›TçS«<Ö¿ÛT|Ÿ9€®+"¶2ß MŸI[[Õ,ÅÏâO>©rT©°;`ëÖLF’Þ§¶°kWfÛmÛT‚дiðRž´SWãtÁgK±d»~¶2‘%41M9ŽË×gê>õ6Õ¥1€Éì[§S!„“³?Ø‚ ìå¬x¹¹pÙtŽ<oqÃÿÃEÿ‰ A(%J&~uî"e.Åb›7n›Íú ÁãÃßþ¦B‡ãq5–+r÷cÍþ±˜RÒûìïW¶Èô¸ |iÎ_v@}s…çê)€Ú׃Z EC§™EYúÈßg6QAƒÐÁ¡.VóþI¤– w•ÀJûϩӫ™8 à-þö Ó h  Q&¸– >¤Ó10¦+°Ùo3C¸7–Kê}êI%$Æ@ŒÄP‚Äg^ã­ë·³íþº._ǶO¿ÊÖ¾˜’—†bªïº´ð_çeS©5ÿFjѯL#ÞÛ³÷9¥2{ÀO¥–]Åx¥ÏP#niQ+ïPYi£%þg½ —ýmÝj#—,ÉÒkéÿ–/,)ÀbE~:ÜDð¥º"ôÑÇf¦qhžÞ]8°N•°êÒ_Çý-,«›Æ!õ©.@Az80hÌåØÅ1†ûWqÃ&ÕVV@P9¤€|FÀ‚ˆÅÔ¬Ÿm_0¡‚¬›4Ò=MÒ ôjM h+kôň_µ‰¶ï­fÛmô9;6 ©×¥9éÄ’ãÐíОZ+JˆîËÑ8}öÞ·!Ó¯úøÉRøÅÞ°¨6õÆ×äÐÿŸî4bIÝÞšÍ] V*ë½U58—Þ^ltßÚµ¶X¿|yf;]W9`»³ÁrVVº‹5È w>|=Í `íÛɳ€Z¸…e403É,Š5P›Ü¦'±•džzÙØŸOÏÔ©ÐH)–š ÐD3Kæô°n ¨Â`jŸ.Ê•ìd®ßÿ¸Lñ³a8¡ìu:)ŠÝ¬Jj.œÃþ˜Âü”ç*2]øu¦0·Ó󽧨5@6®cIƒqضí˜êr¥j7œÌYs !•›rÅ{›Ž7ïŠ.3pöYEÿ°=H<¹Øf65 c Ž^î¿P(w»B}¦ãÕWÕç¤I6±[}Za¾ŸôôÀ°¹JJ®  ŸOE0®Xaç¤!»HžI¤zš`µèä-zÙöácÌEÅ÷™ÂAûL ¬pTŠ2h¼À/ÛDfÕÉwéø…@¤Xü­ï>j|U4·ô²n›¯žÌô™ÿF ×FÀ˜´Œ€…Ú w†ÙÐàgZµ»¸²‰ÉWíÇ>0•3.œË‡¿»Ã ÞñÓQk2€`BUÔ*”D4œHJ"WCkvˆ«2]íf”ë´<> ‹èݺ-ÀðJ¿ú~¸cb›T‘*úïU—*!d“:£æù-ë>;@:¡ú|*ì…?‹íó‰ïV&áüù©í¬‚08˜¿OK ÈfRe.Ξ­Ô˜¥K³ ÔU¥`EnV P„T†7ù+ë¸m<ÎNžÃO ûp>³96gŸÙΠ.¹1Ê@ ›µ‘ç¸r³Aܘʊ–Ó¹ñУ¹lŸ–Ö9mMLã‰åÐîäõ8ö9Ó‚Gª¸2º1‚J'7̶oô³@øŽšÈÔ¾¯-à£ÕºÉ·rûë©V–T›OjØ¡ä$0hÚjr¤kØâù€Ù㎰úœV™½ÏRl•OæCtQ­ò6HTl€ØÛavº­æké3«BO]m5/DÌóç++»ýWÎj½RÚc²b ,XÄléøùÉÖ­æÅW+5 ½³AssÒ—o~&²©/Yÿ¢ gp‚8Ûy†uÜÉÛÜÄîUÏ÷3Eä"üô¨@Š 0(­€ -<:𽹋—º~m:+§ËÏŽžÅ‘Mw ˜À¼Fëø6žïpfªsèeI .‹0žÅpã’0ÀáÍ,ýÎ"Nlð1)!‰=ÐÁƒÕ:µ42![ŸPïWO¹?–Û×é|§ÚÂÊóPçCÔeIªÑíG6h*ÛMix¦ƒ(ݺü’çOÛf©¡¼Ø§>ª(¨ÂŸ * [ç_èHS¶TCÚˉ[’ [·Úzs渨UÏoÛ6Ûâîæ†ººx©b@¯•«ÐР •`ïÏ7j€!¨¤!'ág бgfûF[Á?v_æq›xÖ",ã\3†@<®")H¢ô@rÐnÖ„oá¬W~Å´{wðÌ•¾|me “ÍZ¹‚j¦4$ˆ†ÙeèIIAÃ'´¬…æÝ£d# eÈe èÝâ%€åupÇÜÛÎ}Woæë[Tk3 RJ¤µ¯) ¢»b„3)2_ÓÍ!ÛV0§Æ,vâøsZú»L‚Ú`½sUÊXL`®¶U ’€gÌ`·#ͼÆI&hÀzóüsU‡œ®ÊŸ¬‡Ÿ­WeÆÕÛ³¥;@e¥Ý._ì1‘…ÎOH)°¤‹ˆãq;¨P¿¹Ô€,¯:Qî}¿¹@œ ùfqµO²Š›Ô0‰Qpö7U FX&’–&µo€Má~6Eâ ·rÖ³1†Âj«äÂ}¬k˜T¡¿_YþEÊìo%¹(™™Ec2ê2öèúmÜ—+uêhƒ¼þãu<Ó!‘&WRg™¤ >=ر@¾A®"6W»÷­Ã—Þ®ÅQЦü‹è"sÙ®t¸‰’l²£ÇLâV óklбÏ?£ÊŽE¨q0€-AX5¨<I^kÙæÌ)¼Ìö’%ªM<®Š~f½°"CŠÓ‹Ù’…µ– ¥ÿ·µe/5–­O‹Xj@TŠÆÎîÃ÷;rË, €”–™Ç…èd'Ï0wãHäÉTAƒeÔLÛ@˜ÎXë“kY²3úy`:‡-¬fR%h¢‚†uüР=]8=årºz¯‡‡Áµ-@" ùH'm_|‹ïÜÛÎ ×næ…ë-ƒ_Ä ¶«/S«¨ÔÍ»Ö%ìf‚2$¼5¨Ô…ý3ëX À* PJØ´s“æÕdï·(•@]`«oB§ùÈl¶#;"°Ñ¬¸¥ ˜eª!–§b8‘ãü–!ÏïÏÔ»Ój¹çÖ¬±óú­v#%|'¬”ቕÑÑŠ9°ô7}vwÛjÀŒ©íÓPe–‰¨a2s9¥œÃÎb&GRƒU_ SD¯4T£ a`ä àÌã¶ò(•41‰} gã %¬VqBF;odH³ÏòÓõ’„¡áÓrêl ª €áÓðçôÀÈÕ€² K%ÐSÛ¾9Hïåkyâ/[xËò HŒ*,ÕZö’ã kmoýA Àäbòå>e0Ü»_z‰ïI&áuÇì•z Øl¾s{¥å–T—Æ$ð¸i \9ÁfDز “Ì5%A Çsœ¿£Ãžq-Ë{6‚²ªù¼ð‚㢊õÝ´“2µfÀ¬Y¶d’Î õëT²µ5·U3‘f1›ã¨fÃt'HÓ™ÃñÌà0Ç 6‘ZŒ#˜ŒVÏ=‹;²“þd ÐÊ‚ÇUš€2 Äd/…Œ,kD °5¼‹—·Ìàð¹1†ßdQ†ÃªGg‘PÅ,F0Z À•dp`ÁÀªøeKÕ¾L`ój”µ&.16s3€ôA>ß§$€:b¿›UJTu_€mi½½nÒ’e‰/táµ>øØLøÊ8~Rfck†ïr¨JuÛÒ•+ÐQq[ÌñÌ­É´d¿hi« æèÁ«Ï­[ÝÇþ—`1ŸR~s:;ÕŒ^ Ó±@UUv5À 'hÌàHƒì`²ž»hãE â42ùœ‚?iôSDZe¦*P\tß.^ …¥Ic t¤Ä8Ã- Ê !‘tðZ$ÆPÎDø·¹y@s§†Ï¬À#N­ä¬à‰Qpº6Æ}. ?FZÕŸˆ¡ôú*-¹¶8>«ZI]Q†ãFæy¬¢¡éÛW Û8¬žÊSð9gqk†Ý”Æ^3}õ3ªÜ­ø•pæT%Îa.ü`‰M´š°gø][|o ú´Â»&ƒ°Ô€y&ƒª)ÄÀ6èM˜`‡Û:ÑÚj«Ï?_ø¢Fª8C}­â6/mäR¬„£¡¡$óSbu˜<ƒåìa-›¸Ÿ(ƒTÒÄÞC•igöS“\$Hm¼À‹ü†§¸”§ù/ðs^ã&#y!¹l˜u®^TMÁö¢›Õ¬âlç)s=«¥ ’& LŸÑˆØ0íy×¶xƒ?m•R XÈÉÓ4*Q†Âé…A$ %dD6tâÒE–}NmŒ›An:7$ÒÈñãj¦®Ô©ÉÀÂló©m¦.,bz òâ®Å\ŽjÆgÜ8uìi à…>¥”ˆž Rªø}+¹çÎ]ÊÅ·o\²H15v‰ñéÇ?Öíè ¥Hi{Z*”„´Ä3ÏŸ$–Um= £J”*K «+êðHŠ‹:«sYˆFÝ¥,gëÓ’fÌP„_Y©ÜŠ}}ðÆl’°'YÇÄ 9;%L?¹Ÿ ø©a§ÒÈ&¢ˆ blå Vó/†ØIœqBD`ˆ6:x-ü‡×¸Ž7¹žNÞB" ÑŰY>lûÐÅ[ °•ÜÇjÜ~ªiÑzx;ÒÍê‚fó =ñ!vvLå–¤½¯‹UC}l °%ÜϺ`ëÃÃìŠEèŽÓ›ˆt«©fÀµ0’@Æ*]ÚA¹–ŠeVi™F@Ÿ†˜Q¥¬5k†”UʂվÔãȻڈD eUßT¥ìSo[Ùßt¸¥Š |©Oí;zb–>7hI]ò:ùóVøú*uüâ:øá8Ã̉é‹Á–Pj?O÷Ø‹„öÇ”›lO€@¹*@N—c| ?s8)(ƒh/ÒÅ›®.=H'›yˆUüƒ0½Éã&²”(C)çÛÉslãI©S!„©}næ¡«]¼½ `2ûͦ%L_8ÊP"DW,B_3Þ=Yý·ßV†ÂIY\|ÙÎíêf:ÎoIÎØ…¾Xj»¬÷sxþøG8ê(åèèP:tÿØs1íâq¸óNUK >ÿy¸æe ظQëè× Æ³ü$éŸÏ†Öñ4—±˜0›cÌ­v@P±ˆæ~Ä>|ŒjZXÆGx•?$÷·°TL`¡°ž{Š"Þ(C‰ =µLIZ¢†é] „æú€ùg £.¬ÿñàB2ØÁ+£Èvk†T2À©Sàˆf;ˆÇ)¸î3OÑ`Ü‘ò‹RW"nµÇrG÷Óg1ý&™ ‘Âw¦0±NI‚Í<\TWk¸…n3³¯"o2Qa<Ê7ˆ¤‘9Áwh`ûp¾ðG*Ú:ßÃú¤yØ íccqÖÊ"‘‹¸}§UV ‘H]d(N|WD‰øKj™pJ+Ó¦™¡Z7î`u¡> éjû‚ÜÐHZ»G»à­A53y½Ý*ÐáºOc|Ý‘©»¹ßÏ–•—¯íhZÿÝ´“Réûá"'Åžø÷¿S³Å¤¤‡µ2V8B<}0¼ÉßH£‚ÜÉjÙÑÏæbVðVò Nåᧆ òI¾_Ò̽ƒg’joˆî®Rú(é À5áG£¹ë:aÈÌ  ¯ô³`a ³gWSý©Ù °~ˆöÚéÈÙ§Q\rŽë÷4ǾëMá5ûG ;x§ç¶Î_»Y©È€‡:ó4Ü]Äì¶­”jÝÁR]éX¿z(¥NŠ”$L„èb÷ áÇË:p9ð Wñ_'AŒ£ø!Ó8” òfN ÓîÚúïÄ›üm[˜Þ~€í<å.XaPk•);¸`‰1é.ÐôæÈ|=^·…×Nháð€FàOð¡*ʈAô²u<—­½×S~A7³ÏM_êSRÀR3èþeõ#è3[Û]øÜk*’0‘v¼,$íÄãʪÞÔ¤‚‚Ê©·;Ûjkððʬ\ ‡ª¾”Œ§ŸV5Í•;å[%Oà›ù“Ù÷©^¹ñ,W°š›™ÉÑÄ”¹?f Qªlg8ñ;^=™½[y¼mÄ,WÕÂN¸ r[ع-DèW¹ã3s8©F§¦'ÆÀÖòø› 8Ç&]RT’è­ÅYòµ5ÿs³NŸ|sœ8I~®Ù¹˜>ÉÑVb†%‹Ô¶y»Ü±C­ª‰(wàGØ¡³ùn–[c!¸oûÆ6ñƒ"\PŒ ¢‚’!%Ü~»ºÆÆFqQe(WW$xŽŸ¥$òŒ}l¤fù‘#LOl¼§Â(yqÐt$$RêÈB3´ ðÏ66þ«k&û©kS+ûøÍ?࣠…Ê(Åúî¶ÝPnisøùE }šÿ¹žœÝxÖ®…×_·Âþ£2òr-´a µË‹Y1÷~é^‚žxâ‰Ì6O?­$ƒl¥Ã‹aØÁM_©•‹ø÷täb®¥Ø„iÄó‹ú`~†b¨l¹0Â$| ÏàP·u{A¥ŠïyÛãt{~«ÀçÛogî ‡!VVª;jjÔìªlºõ—­´“®+5b•Q8s¦Ý—qQØÄŸHØ«eóÏÚ%Ä=ŒäŠÌþk.&eaÂOXÿ¹×Ç Ïøj„’"Ê;;»lë–˜ ©B÷m€ …Ôd§¨mUÊ…pØ®Øë‰„ò¿wuÙþúÖV¥{Ïž[:xúéÔlÀ\ãñ0®ô! ’SÄ@FE¤»±8«„€”\ ÙŽâ|óÛÓ¶È>»£Êhe$æk (»ñ—»v©ÙýÖ[Sëû[ظ^{mìÆã¡lp“ HÐPF@7m­B Á0ÔZnú4pIøé,c»¢úLcmfPWÔ®Vìl—Òç›oº¤+7ÚÛUd^ÐáâîëS.ºR]|v+\Eºé(!‘ñxávÙ*ç<¹p÷Z]»¯ˆ€ )UݾUƒd©æVBŸY¶·9$c+¾@¢ê :ò^î5bc:ógÃð°¯ßÝ­¤‚\yÿÆ=FdŒªúo"…²+¥@J¶€Ž0щü®¬êFáþ’S¢õÿí!;î߯¥.äé ÞÏׯŠº¢jI°JÛ ©I?[Cp€¡‚Žªux°S¹× æ>ˬ]«’º»sý<ìHan‚b2^DY0))˜md€ì‹Û"^飲6O¶´œóPTè»uÛv†S“~¶‡T °F¿‚ Ã?dªUlrEjŸžïU„^£Ã±-$ë¸îL‹ôNH¼¨V-d1à®v˜£jùî›Å><Œ{¸²XVYnÚš;[€”HC C [Ã*¥ª'š}-@Ãmd+îlɶYZÆeöxüî¨ÊÜ[7¬Öˆ›9 Råï¿Ô§˜‚Õg_ ï²gùᬲϽ#‹aÜR4”W VRP©…áŠ È # µ6€›Ò`¦~/AI›‚„,Û@oœ˜Õ‡µz°á‚œ2Zôw…sëü…úÞjÎêíaU(=¥qý°bý±Ô @ Öv‰]b܃‡Ñ@Y"VL€ XeÁ,QÛ6 Œ&Ð-ù[Ð#ÖÈ®H¡Â’íõaݵ˜€œŽص¶†ÔLß™£Cª…Bò…Ž®Rõ[ð6<ŒFfŒtP»”¶†›‚„‚ 4H]Ê«+B¬9Ëì3뇉D%ñ&?Tëh:h ‰3HD%"¦ŠhU:FƒŽ¬6¯Äm$^ÌpQ/ ™›øבÛꈨ'xMd07‚¢†ËâÒ”¶µìQ{ÛC„b ‘Y²¸ùÜÀøþÉG³éÕ© M[©Ý’x¢œj€…®¨Zè³É¯ÜmÁÄÈ‚€/”Ô>„14ú_{€îØ#ñ`kr_o»^b¯ïHH`}4í‰Å¾ ümwÇ  #Ñ›Hü!.úÒ®]Oÿ±¯.V~£¿}<…èk¼‰pÖöí¼‰€K&êúÙ‹4íî±eÃÎxœ³·oç±`P.º€i(>öàßfÓQUß¼Yu_?—ú¶ò¤¹ù>àtàZà¬;/d¯p›<÷˜KÅÀô’NäÀ¶çdýŽçU?FŒ+Ò®ñ%ó·xãoL;òK”}¹ð’ßúce–"ú|âæâ/€µ2j?ƒe üX5ʧ):û±'‘भ[y[•ê–@MW"ñËüs7ܦÂ(%ïÛ¶Ç‚AlþƒbÿÞüp,Æ„M«ï•¸'m÷mÀá(£Ü²/ãçùbF‡p!)dnž}Ñ®]e×]Ë ð\(„¦r±NNö>€¿Ç« a’ópgŠna5J%öºö¾‚!/Mo´þa´«VÊš+ËáÛ.”ßJŠÍŠþ­T¬½Oýq~Nv†ò4@" ƒ”ツ‡tùŸ?¯T#7ëœ÷ €`åî¦üý§á¹Û ô+¹â¬CÊ~’Ð ò§ÀíWŸ¾òy¢ÁçÜzßÐ7 `ÀÀM˜÷òê¾¾é1j%¥âw==´ø|o”³ïD6?ÁÚ§~&¿Õ½Nž —’ƒ »oÜàŽœ’ÝëÀ§Íï'}·Öž¡Á\ÁüÓÒ·íôî5,{þ7\iâ–\ã{ôGÌIDÑ…N¸:G³ÇÌÏýw¾LÙ—  @^ÿõýêm@ˆ†ñý´ÝŠ„†w/xûIxê&ë—šMƒý‡A™£´^¼†z¬;Ó ^¸«ßÍaQ)ù¢9É x[o¾ bÇc÷îÆ;˜m±ÏšÙe]ñøoÊÕ¯”ðµpi‹ŒþáH¹ðî/ñÃ+rË7…ëß)‡L‹z×:¥zW5Çzç²ãï˜ÞˆXˆv¼)š¼žç {}J ý‘ןbd ]ŽÑ^»QÎp]¶1™0|÷~™™e¼ýÀx`¡Ÿ|ôoG Äõ¤Îþ`=Œx0·TÐË(Ï•7›Ò^ j#ð s󜞊rœç­ÇR~«Ÿveøº²»›µÑ(BU4»Ð±ëvósÖ7ÚÛïÍ{T,VU^„0ð@¹ú}ð[’[?) àþü•vÉÓøæ`›üiÅÁê³zbn‘Ý‹Qâzï–3hX÷ Ú¨%ˆ2à±ú>NñBzÏüŠiá>*F‚Ÿå9×:Ì€ -O±D”ÙºûÀŸ¾t Ã}õÇ0~¥…bÑHæÂ8¯ÜW'¿°÷"yvc­¼ë71Zh[¯˜ïg4ô]T„@èo©¬çZ›&ño]Uðm‹Å¸Ô\š[ÂÏ5ŽÝO[.ïé9!®µûT$ž6é÷wP&Iê­[áÑË’??ƒ ©ý_”}! œ|ùTŽ‘â š––ŠZWIg€¿Qþ'Ô'þ °ùqUL·v2¯£âÞûÖmÆC)GKxá9@÷s'5"ˆG8&Nyãv/èØXÅc7¼KÝù‡7B]p"Þ²uç† yÅ™‹Øúf5Áþý¹î⣣$<~ƒZ¬ ¢fø3þð…(— –45¸cSAÿïÅíí º»€t&šÀ¶¤ŸÓºfÍ? «‘kÌñª¹¨h«®¯+áð }8: w}AMBðoÔìoá>à›æ÷ ÿz†q;ŽèºaÓÁæ¯fÀåùm~N¸õ“ÆP"[Íôx”»QïI/à»ñì…#¤øõ›hîÙH@"šø“ w˜Ÿ¾ðÛ‘ÕÅLÇîe¿þäñD‚ÕÑ|7G+sj“Í8M^û…Ù„‡u¬q#qº¼þâ‹…zÐeuQJK÷¯®»åš{‹ ímÜiÞÏ?qþ'Ü+-UŒ§)gè~^ÀÎúˇûPÒ‹xð»ìW†Ç‘ÄîcÏÝÖÊ €”—@Î kûD! õ¦¿ñH/ßÛbn¿¸˜Ì¿¯¼Ç8]¼(¿yÜùò¦~[ÞöÓoËõ/Ÿ# ¾ì(iœÛVÁVÓÛ»ës«>‹z(§ñÿ/äé¢IžÝ°¿qÑò øèäßqšðËÐÐ{(Æ—¿öyõé¯H`"Áº\Í%ðes‘NŸÒ9oÌÓô,”Kir_,ö”XµªºfÍšÿÙoÓ¦¯·®]ûK±jկŪU—W®Zuú‘ÈHù-Êdßø]o/u«WSõöÛ3'­YsÐÞ•HÐo®7Áçs+X¢Ë“"CZ|æ×Š?T4p¦Ú“ø¶ùý¸‡¾gXÁ>„ûÔ§¯Ú5S’Š…9dýƒJrðWÁöfüÞ<çä_îMÚø0u[Ÿ¥ s5û `ºDCÝœHëì>ðç/ŸŽ44„X­/eƒÅüô¶«è–;1)!PÕüå3¾=v5o>ü7|ûwüéË¿äâåÿä}â`ù÷oœ€i˜)ò©›Õ—ªº¶KTÀÊ»Ìmû¡ôíß *}“×}X\g®Éu&hž¶#yÝñX­µ?®é)Ìä&Ó‡‡‹Èo ޾b\ß &w¼ ]Þø*ðãܻφ Š·ßž3eýú“âB„(†(RðL(Ä…mm Ôv&¿&wv:–7€ÜÀŠŒã•¿)ƺ¯@çjõ=ÜË/óôq7¦ ç?—°° bÊM>Q®6‹Ðg­¹[éÿu­¼‰-®CÍÞôïàÓÑaùç»þWÎG‚¼ÜRĹ,›Å‰÷^DÙŠÖíð—¯îGÛú…Hù¿äÏt²%ƒë úvùyåþIÄ#VðDø0xŸùýkÀ÷Pº×¹ùòÛäUŸû ¦ÅÖ5^5ÍÓŸ#³8éSÀÑ(‚÷Ç¢,ð3÷_`üñÿ2™ÎöÕpÇÏzå¯>v–ØÆKËXYÿ–íCõÄ£QúÚ‰tn50-ÂQ)ùFG:܉í.ʇ(JÕšœ¼ë>8ø1JÕúø®hôUñÖ[³_ˆD£D/Ëw::¬˜qÓÎΤovvnïr,mHéVÒèÁ$Þ5÷§®–¾ê6ÅûÌø‘<}HàOæ÷ÆÂâ^€˜µ"³¿( À’B´íÏ+Þˆgd ~Åö»¤–O·¿I ¥,ȰÓq3Šô§~Éi²Xõ2ʈzu|²¥¶¯®áîß~ÀüåÆ e3€ö ’»~=•XDCÓ£Æuim{€[QÒÀÀ%À¨—w÷ýî·r¸çBÜ"„õfBVdø¶"îÄ?Pv¸ëׇãdÏÜ‚üâÞÈë¾ÔÄþ|ƒñ÷ï<@tlVmBý÷}æòºÿ‹Ëó[‘.›1dü¶§‡Êí—HÀWŠ|RèB«A͈«P„õJ˜2F€/¼~ýÇnÞ|®‹g•‚§ƒAVïiBYãw\Û×7½'‘H¾ü›‰bÊ|½0¸“ù¨ç ÀÚûÌ›5“—(œ:kÅH4>ò=cK,†ù„t_Q ù®K©üÿ}[“; /¿2¿f~~w Û‰0*^ .xô‡I†:"”‡¬z¦†³jþÁGšãñ)dCÒ•gŸId¸!º/¸èÝf»Öòñ¿«ŒŠê»p§ íDICÀAœÓ¼‘LôÈÕOCÜ”¶:·›®|îFâ(¬eçZä¯Î· }j¡“Û®ÜKühßô6¨$4¤‹ˆŸ÷ôlïM$ø¡íöû*Lµœ@Í\£ÃÞÿ nÝwÈ?»¦à7½Jˆ©Ñ´Í(FóÀa¾-Ûjá‰ç†‡‹Ir±Rd÷7¼ *‡¿íUµQ®˜ÔjóºxæwLŽÛ3±æKÞw7hsþðWEÓñ%TXöÀ ¨‰©üõÎOzàÛ\œ(ƒ¦< à÷?HpH ø=»²ë(7~w›^± â®ÚJ7¦Ne<ý¯½èØ¢D¿Ðàï‹ájàróûÅòÅû®vs|ËdÒ5MA`}‘wÅ™§ ö %ò7Ÿ€Ð ±¸ €hp%Ð%-`u}•ÿÞ—ìi°;)Aü¶»»ú²®.z t¥ú|¯ÈqƒUÀ!¨Ùª¥;»ëC;v\La¿5ñ8ÿ6½Æñ3óüዞÛê4Í ¸u¬ šÚõ«¡;^²ãø»Öâ6Øé€È†ûl„Ðl©Âpˆâu¼ãZ T2Ö×PQ𥢸ºùýÓßœ `ußzúÐíß‚íÃÐUïÒ›3r Ú7¾Ç±¥‚;®lÉh·õÍnÿùGÍ_wÛbq,‹îÎuÇà«Ø…2ƒ_ 8v ?8åì`žÜXõ„úœ4kMÁ¶™°l ‚¾]Aú£ÕŸDÊÿA‰†sˆÇ7$%€¦)–E¼/ÙÓ`wr†jO$Þý«ž PL­8›FñèFÙ ^ZþÙßýÁàÙäτ㺾>¢Râ"Š4ƒb÷ M¨Ó´býÚ¯`N¯üÕl7o aŽÓ ž5?è^oKPš^GäêP‡rû2®E¾5ય žÿÉþþMAû%‚0y‰À¸Hò¹p‡œüñK ‰GRó¢×=ÓšòÛH.;íS„' ˆðSîO€å'Võ”ñ¯X_0ÝxÆùr¨ûØl¾KÕõ/l›‰¾ä·õ/òÏ_¶~]…£­Y4À¶×ÛXgNlþŠ'3ŽêsÆ—ÏJ)|B´CÞÒrbx/ŠÙìuâæÍß@ÊŸçjl0Å¿7bÇÖï´ôÆL€ZM+Ö¢=ˆ©ò¬€Z€/%óøwâÞíj…\V¼y“cM[IG‘ã±Rx·£jCŸGy¾@IÏfkØãB²9xíу3¶u혔òûÒSßCûÆýÌÁžMñe•œñ±}$ ¹h\ƒz?›¸ìŒüVÔÞ6;)'<üD çJ“ä5_Ø‹á>ÚN”N äÁ?ú“çjÛ|§5‚äþà@Fᕸ”ßWqëåÂVà<óû©­k×¾‚Yc+îbSLÙႆñë´Ý)«<4­”׆;Ytl7­uYõï\X‹4µñI»PŠ–(ºèOPîçEà:аøp"°êœïBâ’ž÷ `"qΠŸtѯgçr„ÄšÕ‚=““û¯ÿú>¼zïÍ_ß¡´ïß \]OgRz<ôvÌüjV=q0ùüÏÛ¡^*…ØcìkWaÌÒø4öK²Ýº—òÙÛ˜÷P°"Ãú’LJ‡Ò‹¡¼îã ʈ1}×í‰ÄeݑȥÙ]eÎþušö™±) ÀOIÖl˰ß@/X©¼±á¢ôk‰)Yöoa®µ1<\’Jµ“QŠ  „@*æŽ "9YD@HzÓfÈðü§° e¡aµ”Ñ¿´[úU¤ÔQ/ÎJ¼–NàTT¶‘®x«ùy¢ö=•³•Åü•¥­ÏÖŽdbâÏ(&f!eÛèÙ©b"ê&îÂ&üÖK ¦/fþeFaÁT—ø’9¶¹37nœ@Zç–XŒ{Õ¤>hWf9þ1nº ñx)Y€¨¹÷b‘¦2ؽ¡èwc @"ÊTkÃ+ÿ›2àãîÀÑŽ—íS"†µä×k÷×3õ¡=ˆ%‰¹ÜrY=7~÷;$╨Y÷\Ê£_",7Q•qÏïsª"Òb-3G0îÏ¢Œ•¿Be¦¥#Õš¥G†õˆ;«!ÝÏîMæÙŒŠs hŸŠ¤E³]Ý«– 1dµKà f>=@<^ŠUü%Lë±À_EœâÝ¡)í}ªâĨ”߯pÇ+0oÒ=X f„Hè)ìà†ýøË·~Nÿz·–EùŽ„ò—2.,WÛ!Ä"ÙÓ1-¨•L<…ŠÉ?5ËþñÄ8˜¥ÆÂ†±)7üƬïW%ÄýŒòºö(+¸åi‰ñ’|ð)iÈþÊò%Ùì)(è& [ à5ÇÞTàÇÝì>CU!X  F>~ã–¬-,à«möÊ¢ŸMÕµe¡ËË÷<¿#ßö\(Ä ffâ°”?ƒówïFÙWN#³”œ à¤òW©[u\ 4 A4,ˆ…ÕRÆš>ÄÒbð–ýžßd®7" 2'~ÅhGÚåÃx•À&8ñr(Ô÷ksö¯b¥éõ¥àY”}åžô‘”ôŠq)­Ž*Jcu$¸íŠV¤aæªË7w÷…‰(Jü†/Ï&=µr¸ÏNóv'ÏÀfëËÏz{›oìWÒxXÊËå|ÊŒdšsïzJ‰÷Ø£Q؈ÁÎOþî‰ëµ«‡-åJ©¾èá>û»Ðwç‚ã™taJQ iBùÕ¯Q¯c¤´ì):EwGi à,‘ ÀL2ÇøŽ Wõ0>q,Ð2â^. This version is currently maintained by Timothy D. Robinson and Thomas Perl at http://wavbreaker.sourceforge.net/. wavbreaker-0.16/man/wavcli.1000066400000000000000000000012651435035650500157250ustar00rootroot00000000000000.TH WAVCLI 1 "2022-04-10" .SH NAME wavcli \- CLI to losslessly split and merge WAV/MP2/MP3/OGG files .SH SYNOPSIS .B wavcli .RI [list|gen|info|merge] .SH DESCRIPTION .B wavcli is the command-line interface for wavbreaker, and is missing a cool manpage. .PP Previously, .B wavinfo(1), .B wavmerge(1) and .B wavgen(1) were separate utilities, these are now available as sub-commands. .PP .SH AUTHOR wavbreaker was initially written by Timothy D. Robinson . This version is currently maintained by Thomas Perl . .PP .SH HOMEPAGE https://wavbreaker.sourceforge.io/ .PP .SH SOURCE CODE https://github.com/thp/wavbreaker .PP .SH SEE ALSO .BR wavbreaker (1). wavbreaker-0.16/meson.build000066400000000000000000000071711435035650500157470ustar00rootroot00000000000000project('wavbreaker', 'c', version : '0.16', default_options: [ 'c_std=c99', 'warning_level=1', ], ) subdir('po') prefix = get_option('prefix') localedir = get_option('localedir') glib = dependency('glib-2.0') gtk3 = dependency('gtk+-3.0', version : '>= 3.22') ao = dependency('ao') cc = meson.get_compiler('c') libm = cc.find_library('m') core_deps = [glib, libm] gui_deps = [gtk3] ao_deps = [ao] format_deps = [] have_mpg123 = false if get_option('mp3') mpg123 = dependency('libmpg123', required : false) if mpg123.found() have_mpg123 = true format_deps += mpg123 endif endif have_vorbisfile = false if get_option('ogg_vorbis') vorbisfile = dependency('vorbisfile', required : false) if vorbisfile.found() have_vorbisfile = true format_deps += vorbisfile endif endif shared_sources = [ 'src/appinfo.c', 'src/aoaudio.c', 'src/sample.c', 'src/list.c', 'src/track_break.c', 'src/appconfig.c', 'src/cue.c', 'src/toc.c', 'src/txt.c', 'src/format.c', 'src/format_wav.c', 'src/format_cdda_raw.c', 'src/format_mp3.c', 'src/format_ogg_vorbis.c', ] gui_sources = [ 'src/about.c', 'src/appconfig_gtk.c', 'src/autosplit.c', 'src/draw.c', 'src/guimerge.c', 'src/moodbar.c', 'src/overwritedialog.c', 'src/popupmessage.c', 'src/reallyquit.c', 'src/saveas.c', 'src/wavbreaker.c', ] cli_sources = [ 'src/cli.c', 'src/wavmerge.c', 'src/wavgen.c', 'src/wavinfo.c', ] if get_option('windows_app') windows = import('windows') gui_sources += windows.compile_resources('data/wavbreaker.rc') endif add_project_arguments(['-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE', '-DGTK_DISABLE_SINGLE_INCLUDES', '-DGSEAL_ENABLE', '-DGDK_DISABLE_DEPRECATED', '-DGTK_DISABLE_DEPRECATED'], language : 'c') conf = configuration_data() # Surround the version in quotes to make it a C string conf.set_quoted('VERSION', meson.project_version()) conf.set_quoted('PACKAGE', meson.project_name()) conf.set_quoted('LOCALEDIR', join_paths(prefix, localedir)) conf.set('WANT_MOODBAR', get_option('moodbar')) conf.set('HAVE_MPG123', have_mpg123) conf.set('HAVE_VORBISFILE', have_vorbisfile) configure_file(output : 'config.h', configuration : conf) meta = configuration_data() meta.set('VERSION', meson.project_version()) info_plist = configure_file(output : 'Info.plist', input : 'data/Info.plist.in', configuration : meta) if get_option('macos_app') install_data('data/wavbreaker.icns', install_dir : 'Contents/Resources') install_data(info_plist, install_dir : 'Contents') else install_data('data/net.sourceforge.wavbreaker.desktop', install_dir: get_option('datadir') + '/applications') install_data('data/net.sourceforge.wavbreaker.appdata.xml', install_dir: get_option('datadir') + '/metainfo') icon_dir = get_option('datadir') + '/icons/hicolor' install_data('data/net.sourceforge.wavbreaker.svg', install_dir: icon_dir + '/scalable/apps') endif install_man('man/wavbreaker.1') install_man('man/wavcli.1') # For now this is a static library for internal linking with the GUI and CLI. # Once the API/ABI is stable, we can turn it into a installed shared library. libwavbreaker = static_library('wavbreaker', shared_sources, dependencies : core_deps + ao_deps + format_deps) executable('wavbreaker', gui_sources, dependencies : core_deps + gui_deps, link_with : libwavbreaker, gui_app : true, install : true) executable('wavcli', cli_sources, dependencies : core_deps, link_with : libwavbreaker, install : true) wavbreaker-0.16/meson_options.txt000066400000000000000000000007101435035650500172320ustar00rootroot00000000000000option('moodbar', type : 'boolean', value : true, description : 'Moodbar support') option('mp3', type : 'boolean', value : true, description : 'MP2/MP3 support') option('ogg_vorbis', type : 'boolean', value : true, description : 'Ogg Vorbis support') option('macos_app', type : 'boolean', value : false, description : 'macOS app bundle install layout') option('windows_app', type : 'boolean', value : false, description : 'Windows exe icon resource data') wavbreaker-0.16/po/000077500000000000000000000000001435035650500142155ustar00rootroot00000000000000wavbreaker-0.16/po/LINGUAS000066400000000000000000000000141435035650500152350ustar00rootroot00000000000000de pt fr es wavbreaker-0.16/po/README.md000066400000000000000000000002541435035650500154750ustar00rootroot00000000000000To regenerate the pot file from the sources: (cd po && ./update-potfiles.sh) meson build ninja -C build wavbreaker-pot ninja -C build wavbreaker-update-po wavbreaker-0.16/po/de.po000066400000000000000000000416211435035650500151510ustar00rootroot00000000000000# German translations for wavbreaker package. # Copyright (C) 2007 Thomas Perl # This file is distributed under the same license as the wavbreaker package. # Thomas Perl , 2007. # msgid "" msgstr "" "Project-Id-Version: wavbreaker 0.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-15 20:23+0100\n" "PO-Revision-Date: 2008-07-07 00:06+0100\n" "Last-Translator: Thomas Perl \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/about.c:29 msgid "Split a wave file into multiple chunks" msgstr "Teilen Sie eine Wave-Datei in mehrere Teile" #: src/appconfig.c:370 msgid "Select Output Directory" msgstr "Ausgabe-Verzeichnis auswählen" #: src/appconfig.c:372 msgid "Cancel" msgstr "" #: src/appconfig.c:373 #, fuzzy msgid "Open" msgstr "_Öffnen" #: src/appconfig.c:419 src/wavbreaker.c:2749 msgid "Preferences" msgstr "Einstellungen" #: src/appconfig.c:439 msgid "General" msgstr "Allgemein" #: src/appconfig.c:441 msgid "Save output files in folder:" msgstr "Ausgabe-Dateien speichern in:" #: src/appconfig.c:454 msgid "Browse" msgstr "Durchsuchen" #: src/appconfig.c:464 msgid "Maximum volume considered silence (in percent):" msgstr "Maximale, als \"Stille\" erkannte Lautstärke (in Prozent):" #: src/appconfig.c:478 msgid "File Naming" msgstr "Dateinamen" #: src/appconfig.c:480 msgid "Standard (##)" msgstr "Standard (##)" #: src/appconfig.c:485 msgid "Separator:" msgstr "Separator:" #: src/appconfig.c:502 msgid "Prepend number before filename" msgstr "Nummer vor dem Namen einfügen" #: src/appconfig.c:509 msgid "etree.org (d#t##)" msgstr "etree.org (d#t##)" #: src/appconfig.c:512 msgid "CD Length:" msgstr "CD-Länge:" #: src/autosplit.c:76 msgid "Interval (MM:SS.FF, MM:SS, SS.FF or MM):" msgstr "" #: src/autosplit.c:87 #, fuzzy msgid "Split" msgstr "Auto-Split" #: src/guimerge.c:96 src/guimerge.c:188 src/wavbreaker.c:1447 #: src/wavbreaker.c:2371 msgid "All files" msgstr "Alle Dateien" #: src/guimerge.c:100 src/guimerge.c:192 src/wavbreaker.c:1451 #: src/wavbreaker.c:2375 msgid "Supported files" msgstr "Unterstützte Dateien" #: src/guimerge.c:103 msgid "Select filename for merged wave file" msgstr "Speicherort für zusammengefügte Wave-Dateien wählen" #: src/guimerge.c:106 src/guimerge.c:197 src/moodbar.c:110 src/saveas.c:52 #: src/wavbreaker.c:1461 src/wavbreaker.c:2331 src/wavbreaker.c:2382 msgid "_Cancel" msgstr "" #: src/guimerge.c:107 src/saveas.c:53 src/wavbreaker.c:2332 msgid "_Save" msgstr "_Speichern" #: src/guimerge.c:116 msgid "Open file in wavbreaker after merge" msgstr "Datei nach dem Zusammenfügen in wavbreaker öffnen" #: src/guimerge.c:160 msgid "Wrong file format - skipping file" msgstr "Falsches Dateiformat - lasse Datei aus" #: src/guimerge.c:195 msgid "Add wave file to merge" msgstr "Wave-Datei hinzufügen" #: src/guimerge.c:198 src/wavbreaker.c:1462 src/wavbreaker.c:2383 msgid "_Open" msgstr "_Öffnen" #: src/guimerge.c:272 src/wavbreaker.c:2745 msgid "Merge wave files" msgstr "Wave-Dateien zusammenfügen" #: src/guimerge.c:309 src/wavbreaker.c:473 msgid "File Name" msgstr "Dateiname" #: src/guimerge.c:320 msgid "Length" msgstr "Länge" #: src/guimerge.c:333 msgid "_Add" msgstr "" #: src/guimerge.c:337 #, fuzzy msgid "_Remove" msgstr "Entfernen" #: src/guimerge.c:344 msgid "Merge" msgstr "Zusammenfügen" #: src/guimerge.c:379 msgid "Merging wave files" msgstr "Zusammenfügen der Wave-Dateien" #: src/guimerge.c:389 msgid "The selected files are now being merged. This can take some time." msgstr "" "Die gewählten Dateien werden nun zusammengefügt. Dies kann eine Weile dauern." #: src/guimerge.c:411 src/wavbreaker.c:1167 msgid "Operation successful" msgstr "Operation erfolgreich" #: src/guimerge.c:411 #, fuzzy msgid "The files have been merged." msgstr "Die Dateien wurden als %s zusammengefügt." #: src/guimerge.c:418 #, c-format msgid "Adding %s" msgstr "%s wird hinzugefügt" #: src/guimerge.c:434 #, c-format msgid "%d of %d files merged" msgstr "%d von %d Teilen zusammengefügt" #: src/guimerge.c:436 #, c-format msgid "%d of 1 file merged" msgstr "%d von 1 Datei zusammengefügt" #: src/moodbar.c:100 src/moodbar.c:116 msgid "Generating moodbar" msgstr "Moodbar wird generiert" #: src/moodbar.c:106 #, fuzzy msgid "_Hide window" msgstr "Fenster verstecken" #: src/moodbar.c:115 msgid "" "The moodbar tool analyzes your audio file and generates a colorful " "representation of the audio data." msgstr "" "Das \"moodbar\"-Programm analysiert Ihre Audio-Datei und erstellt eine " "farbenfrohe Darstellung der Audio-Daten." #: src/moodbar.c:136 msgid "Cannot launch \"moodbar\"" msgstr "Kann \"moodbar\" nicht starten" #: src/moodbar.c:136 msgid "" "wavbreaker could not launch the moodbar application, which is needed to " "generate the moodbar. You can download the moodbar package from:\n" "\n" " http://amarok.kde.org/wiki/Moodbar" msgstr "" "wavbreaker konnte das moodbar-Programm nicht starten, das für die Erstellung " "der Moodbar benötigt wird. Sie können das Moodbar-Paket auf dieser Website " "herunterladen:\n" "\n" " http://amarok.kde.org/wiki/Moodbar" #: src/overwritedialog.c:98 #, fuzzy, c-format msgid "" "%s already exists.\n" "\n" "Do you want to overwrite the existing file?" msgstr "" " existiert bereits.\n" "\n" "Wollen Sie die existierende Datei überschreiben?" #: src/overwritedialog.c:105 msgid "Overwrite all files" msgstr "Alle Dateien überschreiben" #: src/overwritedialog.c:118 #, fuzzy msgid "_No" msgstr "_Gehe" #: src/overwritedialog.c:123 msgid "_Yes" msgstr "" #: src/reallyquit.c:28 msgid "Quit wavbreaker?" msgstr "wavbreaker beenden?" #: src/reallyquit.c:29 msgid "If you quit wavbreaker now, any unsaved chunks will be lost." msgstr "" "Wenn Sie wavbreaker jetzt beenden, gehen alle ungespeicherten Teile verloren." #: src/sample.c:455 msgid "Open as RAW audio" msgstr "Als RAW-Audio öffnen" #: src/sample.c:456 msgid "" "The file you selected does not contain a wave header. wavbreaker can " "interpret the file as \"Signed 16 bit, 44100 Hz, Stereo\" audio. Choose the " "byte order for the RAW audio or cancel to abort." msgstr "" "Die gewählte Datei enthält keinen Wave-Header. wavbreaker kann die Datei als " "\"Signed 16 bit, 44100 Hz, Stereo\" - Audio interpretieren. Wählen Sie die " "Byte-Reihenfolge für die RAW-Audio-Datei aus, oder klicken Sie auf " "\"Abbrechen\"." #: src/sample.c:464 msgid "Big endian" msgstr "Big-Endian" #: src/sample.c:465 msgid "Little endian" msgstr "Little-Endian" #: src/sample.c:571 #, c-format msgid "Error opening %s: %s" msgstr "Fehler beim Laden von %s: %s" #: src/saveas.c:49 msgid "Select folder to save wave files" msgstr "Speicherort für Wave-Dateien wählen" #: src/wav.c:35 msgid "" "Error reading chunk. Maybe the wave file you are trying to load is truncated?" msgstr "" "Chunk konnte nicht gelesen werden. Möglicherweise ist die Datei, die Sie " "laden wollen, abgeschnitten?" #: src/wav.c:85 #, c-format msgid "Cannot open %s: %s" msgstr "Kann %s nicht öffnen: %s" #: src/wav.c:92 msgid "Cannot read wave header." msgstr "Kann Wave-Header nicht lesen." #: src/wav.c:98 #, c-format msgid "%s is not a wave file." msgstr "%s ist keine Wave-Datei." #: src/wav.c:139 src/wav.c:192 src/wav.c:213 #, c-format msgid "Error seeking to %u in %s: %s" msgstr "Kann nicht zu %u in %s springen: %s" #: src/wav.c:162 #, fuzzy, c-format msgid "Error reading format chunk: %s" msgstr "Kann nicht zu %u in %s springen: %s" #: src/wav.c:178 msgid "Loading compressed wave data is not supported." msgstr "Komprimierte Wave-Dateien werden nicht unterstützt." #: src/wavbreaker.c:462 msgid "Write" msgstr "Speichern" #: src/wavbreaker.c:491 msgid "Time" msgstr "Zeit" #: src/wavbreaker.c:502 msgid "Duration" msgstr "Länge" #: src/wavbreaker.c:512 msgid "Offset" msgstr "Offset" #: src/wavbreaker.c:553 msgid "Check all" msgstr "Alle auswählen" #: src/wavbreaker.c:554 msgid "Check none" msgstr "Keines auswählen" #: src/wavbreaker.c:555 msgid "Invert check" msgstr "Auswahl umkehren" #: src/wavbreaker.c:559 #, fuzzy msgid "Auto-rename track breaks" msgstr "Track-Breaks umbenennen" #: src/wavbreaker.c:563 src/wavbreaker.c:2020 msgid "Remove track break" msgstr "Track Break entfernen" #: src/wavbreaker.c:564 msgid "Jump to track break" msgstr "Springe zu Track Break" #: src/wavbreaker.c:1128 msgid "Splitting wave file" msgstr "Teile Wave-Datei" #: src/wavbreaker.c:1139 msgid "" "The selected track breaks are now written to disk. This can take some time." msgstr "" "Die gewählten Teile werden nun gespeichert. Dies kann eine Weile dauern." #: src/wavbreaker.c:1163 #, c-format msgid "The file %s has been split into %d parts." msgstr "Die Datei %s wurde in %d Teile gesplittet." #: src/wavbreaker.c:1165 #, c-format msgid "The file %s has been split into one part." msgstr "Die Datei %s wurde in einen Teil gesplittet." #: src/wavbreaker.c:1182 #, c-format msgid "Writing %s" msgstr "Schreibe %s" #: src/wavbreaker.c:1199 #, c-format msgid "%d of %d parts written" msgstr "%d von %d Teilen gespeichert" #: src/wavbreaker.c:1201 #, c-format msgid "%d of 1 part written" msgstr "%d von 1 Teil geschrieben" #: src/wavbreaker.c:1274 msgid "Analyzing waveform" msgstr "Analysiere Waveform" #: src/wavbreaker.c:1286 msgid "" "The waveform data of the selected file is being analyzed and processed. This " "can take some time." msgstr "" "Die Waveform der gewählten Datei wird nun analysiert und verarbeitet. Dies " "kann einige Minuten dauern." #: src/wavbreaker.c:1294 #, c-format msgid "Analyzing %s" msgstr "Analysiere %s" #: src/wavbreaker.c:1352 #, c-format msgid "%d of %d MB analyzed" msgstr "%d von %d MB analysiert" #: src/wavbreaker.c:1363 msgid "Error opening file" msgstr "Fehler beim Öffnen der Datei" #: src/wavbreaker.c:1459 msgid "Open File" msgstr "Datei öffnen" #: src/wavbreaker.c:2019 msgid "Add track break" msgstr "Track Break hinzufügen" #: src/wavbreaker.c:2021 msgid "Jump to cursor marker" msgstr "SPringe zu Cursor-Position" #: src/wavbreaker.c:2121 #, c-format msgid "Cursor" msgstr "Cursor" #: src/wavbreaker.c:2128 msgid "Playing" msgstr "Wiedergabe" #: src/wavbreaker.c:2292 src/wavbreaker.c:2318 msgid "Text files" msgstr "Text-Dateien" #: src/wavbreaker.c:2294 src/wavbreaker.c:2322 msgid "TOC files" msgstr "TOC-Dateien" #: src/wavbreaker.c:2296 src/wavbreaker.c:2326 #, fuzzy msgid "CUE files" msgstr "TOC-Dateien" #: src/wavbreaker.c:2329 #, fuzzy msgid "Export track breaks to file" msgstr "Track-Breaks in Datei speichern" #: src/wavbreaker.c:2380 #, fuzzy msgid "Import track breaks from file" msgstr "Importiere Track-Breaks von TOC-Datei" #: src/wavbreaker.c:2397 src/wavbreaker.c:2402 msgid "Import failed" msgstr "Import fehlgeschlagen" #: src/wavbreaker.c:2397 msgid "There has been an error importing track breaks from the TOC file." msgstr "" "Beim Importieren der Track-Breaks von der TOC-Datei ist ein Fehler " "aufgetreten." #: src/wavbreaker.c:2402 #, fuzzy msgid "There has been an error importing track breaks from the CUE file." msgstr "" "Beim Importieren der Track-Breaks von der TOC-Datei ist ein Fehler " "aufgetreten." #: src/wavbreaker.c:2585 msgid "Time offset:" msgstr "" #: src/wavbreaker.c:2721 #, fuzzy msgid "Open file" msgstr "Datei öffnen" #: src/wavbreaker.c:2726 #, fuzzy msgid "Open menu" msgstr "Datei öffnen" #: src/wavbreaker.c:2734 msgid "Display moodbar" msgstr "Moodbar anzeigen" #: src/wavbreaker.c:2735 msgid "Generate moodbar" msgstr "Moodbar erzeugen" #: src/wavbreaker.c:2740 #, fuzzy msgid "Import track breaks" msgstr "Springe zu Track Break" #: src/wavbreaker.c:2741 #, fuzzy msgid "Export track breaks" msgstr "Springe zu Track Break" #: src/wavbreaker.c:2753 msgid "About" msgstr "Über" #: src/wavbreaker.c:2762 msgid "Save file parts" msgstr "" #: src/wavbreaker.c:2858 msgid "Toggle playback" msgstr "" #: src/wavbreaker.c:2863 msgid "Cursor position:" msgstr "Cursor-Position:" #: src/wavbreaker.c:2880 msgid "Seek to previous silence" msgstr "Zur vorherigen stillen Position" #: src/wavbreaker.c:2887 #, fuzzy msgid "Jump to time" msgstr "Springe zum nächsten stillen Frame" #: src/wavbreaker.c:2899 msgid "Seek to next silence" msgstr "Zur nächsten stillen Position" #: src/wavbreaker.c:2909 msgid "Auto-split by interval" msgstr "" #: src/wavbreaker.c:3048 src/wavbreaker.c:3070 msgid "Export failed" msgstr "Export fehlgeschlagen" #: src/wavbreaker.c:3048 msgid "There has been an error exporting track breaks to the TOC file." msgstr "Beim Exportieren der Track-breaks ist ein Fehler aufgetreten." #: src/wavbreaker.c:3070 msgid "Unrecognised export type" msgstr "" #~ msgid "Disable audio output" #~ msgstr "Audio-Ausgabe deaktivieren" #~ msgid "wavbreaker Preferences" #~ msgstr "wavbreaker Einstellungen" #~ msgid "Audio Device" #~ msgstr "Audio-Gerät" #~ msgid "Audio Device:" #~ msgstr "Audio-Gerät:" #~ msgid "Output device:" #~ msgstr "Ausgabe-Gerät:" #~ msgid "Enter the time for autosplit:" #~ msgstr "Zeit für Auto-Split eingeben:" #~ msgid "Example (5min, 32sec, 12subsec):" #~ msgstr "Beispiel (5 Min., 32 Sek., 12 Hdstl.):" #~ msgid "Add wave files to this list and click on \"Merge\"." #~ msgstr "" #~ "Fügen Sie Wave-Dateien zu dieser Liste hinzu und klicken Sie auf " #~ "\"Zusammenfügen\"." #~ msgid "Stop" #~ msgstr "Stopp" #~ msgid "Play" #~ msgstr "Wiedergabe" #~ msgid "Select name for TOC file to export" #~ msgstr "Dateiname für TOC-Export auswählen" #~ msgid "TOC export successful" #~ msgstr "TOC erfolgreich exportiert" #~ msgid "" #~ "The track breaks have been exported to a TOC file that can be used to " #~ "burn a CD from the wave file." #~ msgstr "" #~ "Die Track-Breaks wurden in eine TOC-Datei exportiert, die benutzt werden " #~ "kann, um eine CD von der Wave-Datei zu erzeugen." #~ msgid "Load track breaks from file" #~ msgstr "Track-Breaks von Datei laden" #~ msgid "Load track breaks from TOC file" #~ msgstr "Track-Breaks von TOC-Datei laden" #~ msgid "Open a wave file" #~ msgstr "Wave-Datei öffnen" #~ msgid "Save track breaks" #~ msgstr "Track-Breaks speichern" #~ msgid "Save to..." #~ msgstr "Speichern nach..." #~ msgid "Save track breaks to folder" #~ msgstr "Track-Breaks in Ordner speichern" #~ msgid "Configure wavbreaker" #~ msgstr "wavbreaker konfigurieren" #~ msgid "Merge wave files together" #~ msgstr "Wave-Dateien zusammenfügen" #~ msgid "Quit" #~ msgstr "Beenden" #~ msgid "Close wavbreaker" #~ msgstr "wavbreaker beenden" #~ msgid "Display toolbar" #~ msgstr "Toolbar anzeigen" #~ msgid "Show or hide the main window toolbar" #~ msgstr "Anzeigen oder Verstecken der Toolbar" #~ msgid "Draw moodbar over the waveform graph" #~ msgstr "Moodbar über den Wave-Graphen zeichnen" #~ msgid "Add track break at cursor position" #~ msgstr "Track-Break an Cursor-Position hinzufügen" #~ msgid "Remove selected track break" #~ msgstr "Gewählten Track Break entfernen" #~ msgid "Set cursor position to track break" #~ msgstr "Cursor-Position auf Track-Break setzen" #~ msgid "Set view to cursor marker" #~ msgstr "Anzeige auf die Cursor-Position setzen" #~ msgid "Automatically rename all track breaks" #~ msgstr "Alle Track Breaks automatisch umbenennen" #~ msgid "Generate moodbar data" #~ msgstr "Moodbar-Daten erstellen" #~ msgid "Split into chunks with specified size" #~ msgstr "Splitten in Teile mit angegebener Größe" #~ msgid "Export to TOC" #~ msgstr "Exportiere zu TOC" #~ msgid "Export to CD-ROM TOC file for burning" #~ msgstr "Exportieren als CD-ROM TOC Datei zum brennen" #~ msgid "_Import from TOC" #~ msgstr "_Importiere von TOC" #~ msgid "_Save offsets to text file" #~ msgstr "Offsets in Text-Datei _speichern" #~ msgid "Save track breaks to text file" #~ msgstr "Track-Breaks in Text-Datei speichern" #~ msgid "_Load offsets from text file" #~ msgstr "Offsets aus Text-Datei _laden" #~ msgid "Load track breaks from text file" #~ msgstr "Track-Breaks von Text-Datei laden" #~ msgid "Start/Stop playback of media" #~ msgstr "Wiedergabe starten/stoppen/fortsetzen" #~ msgid "Jump to previous silent frame" #~ msgstr "Springe zum vorherigen stillen Frame" #~ msgid "Show information about " #~ msgstr "Informationen anzeigen über " #~ msgid "_File" #~ msgstr "_Datei" #~ msgid "_Edit" #~ msgstr "_Bearbeiten" #~ msgid "_View" #~ msgstr "_Anzeige" #~ msgid "_Help" #~ msgstr "_Hilfe" #~ msgid "Add" #~ msgstr "Hinzufügen" #~ msgid "Auto-Rename" #~ msgstr "Alle umbenennen" #~ msgid "Audio output disabled" #~ msgstr "Audio-Ausgabe deaktiviert" #~ msgid "" #~ "If you want to enable audio output, please select a audio driver in the " #~ "preferences dialog." #~ msgstr "" #~ "Wenn Sie die Audio-Ausgabe aktivieren wollen, wählen Sie bitte einen " #~ "Treiber im Einstellungs-Dialog." #~ msgid "Enter the dirname to save files:" #~ msgstr "Verzeichnis, in dem Tracks gespeichert werden:" #~ msgid " (%d of %d)" #~ msgstr " (%d von %d)" #~ msgid "Opening: " #~ msgstr "Öffne:" #~ msgid "Play from cursor" #~ msgstr "Wiedergabe vom Cursor" wavbreaker-0.16/po/es.po000066400000000000000000000403161435035650500151700ustar00rootroot00000000000000# Spanish translation for wavbreaker # Copyright (C) 2009 Thomas Perl, Ricardo Mones # This file is distributed under the same license as the wavbreaker package. # Ricardo Mones , 2009 # msgid "" msgstr "" "Project-Id-Version: wavbreaker 0.10\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-15 20:23+0100\n" "PO-Revision-Date: 2009-05-14 19:11+0200\n" "Last-Translator: Ricardo Mones \n" "Language-Team: Ricardo Mones \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/about.c:29 msgid "Split a wave file into multiple chunks" msgstr "Parte un fichero de onda en varios bloques" #: src/appconfig.c:370 msgid "Select Output Directory" msgstr "Seleccionar el directorio de salida" #: src/appconfig.c:372 msgid "Cancel" msgstr "" #: src/appconfig.c:373 #, fuzzy msgid "Open" msgstr "_Abrir" #: src/appconfig.c:419 src/wavbreaker.c:2749 msgid "Preferences" msgstr "Preferencias" #: src/appconfig.c:439 msgid "General" msgstr "General" #: src/appconfig.c:441 msgid "Save output files in folder:" msgstr "Guardar los ficheros de salida en la carpeta:" #: src/appconfig.c:454 msgid "Browse" msgstr "Buscar" #: src/appconfig.c:464 msgid "Maximum volume considered silence (in percent):" msgstr "Volumen máximo considerado silencio (porcentaje):" #: src/appconfig.c:478 msgid "File Naming" msgstr "Nombrado de ficheros" #: src/appconfig.c:480 msgid "Standard (##)" msgstr "Estándar (nº)" #: src/appconfig.c:485 msgid "Separator:" msgstr "Separador:" #: src/appconfig.c:502 msgid "Prepend number before filename" msgstr "Número antes del nombre de fichero" #: src/appconfig.c:509 msgid "etree.org (d#t##)" msgstr "etree.org (nºDnºP)" #: src/appconfig.c:512 msgid "CD Length:" msgstr "Longitud del CD:" #: src/autosplit.c:76 msgid "Interval (MM:SS.FF, MM:SS, SS.FF or MM):" msgstr "" #: src/autosplit.c:87 #, fuzzy msgid "Split" msgstr "Auto-recorte" #: src/guimerge.c:96 src/guimerge.c:188 src/wavbreaker.c:1447 #: src/wavbreaker.c:2371 msgid "All files" msgstr "Todos los ficheros" #: src/guimerge.c:100 src/guimerge.c:192 src/wavbreaker.c:1451 #: src/wavbreaker.c:2375 msgid "Supported files" msgstr "Ficheros soportados" #: src/guimerge.c:103 msgid "Select filename for merged wave file" msgstr "Seleccionar el nombre para el fichero de onda agregado" #: src/guimerge.c:106 src/guimerge.c:197 src/moodbar.c:110 src/saveas.c:52 #: src/wavbreaker.c:1461 src/wavbreaker.c:2331 src/wavbreaker.c:2382 msgid "_Cancel" msgstr "" #: src/guimerge.c:107 src/saveas.c:53 src/wavbreaker.c:2332 msgid "_Save" msgstr "_Guardar" #: src/guimerge.c:116 msgid "Open file in wavbreaker after merge" msgstr "Abrir el fichero en wavbreaker despues de agregar" #: src/guimerge.c:160 msgid "Wrong file format - skipping file" msgstr "Formato de fichero erróneo - ignorando el fichero" #: src/guimerge.c:195 msgid "Add wave file to merge" msgstr "Añadir fichero de onda a la agregación" #: src/guimerge.c:198 src/wavbreaker.c:1462 src/wavbreaker.c:2383 msgid "_Open" msgstr "_Abrir" #: src/guimerge.c:272 src/wavbreaker.c:2745 msgid "Merge wave files" msgstr "Agregar ficheros de onda" #: src/guimerge.c:309 src/wavbreaker.c:473 msgid "File Name" msgstr "Nombre de fichero" #: src/guimerge.c:320 msgid "Length" msgstr "Longitud" #: src/guimerge.c:333 msgid "_Add" msgstr "" #: src/guimerge.c:337 #, fuzzy msgid "_Remove" msgstr "Eliminar" #: src/guimerge.c:344 msgid "Merge" msgstr "Agregar" #: src/guimerge.c:379 msgid "Merging wave files" msgstr "Agregando ficheros de onda" #: src/guimerge.c:389 msgid "The selected files are now being merged. This can take some time." msgstr "" "Se están agreegando los ficheros seleccionados. Puede tardar cierto tiempo." #: src/guimerge.c:411 src/wavbreaker.c:1167 msgid "Operation successful" msgstr "Operación completada con éxito" #: src/guimerge.c:411 #, fuzzy msgid "The files have been merged." msgstr "Los ficheros se han agregado como %s." #: src/guimerge.c:418 #, c-format msgid "Adding %s" msgstr "Añadiendo %s" #: src/guimerge.c:434 #, c-format msgid "%d of %d files merged" msgstr "%d de %d ficheros agregados" #: src/guimerge.c:436 #, c-format msgid "%d of 1 file merged" msgstr "%d de 1 fichero agregado" #: src/moodbar.c:100 src/moodbar.c:116 msgid "Generating moodbar" msgstr "Generando barra de análisis" #: src/moodbar.c:106 #, fuzzy msgid "_Hide window" msgstr "Ocultar ventana" #: src/moodbar.c:115 msgid "" "The moodbar tool analyzes your audio file and generates a colorful " "representation of the audio data." msgstr "" "La herramienta de barra de análisis analiza el fichero de audio y genera una " "representación coloreada de los datos." #: src/moodbar.c:136 msgid "Cannot launch \"moodbar\"" msgstr "No puedo lanzar la barra de análisis" #: src/moodbar.c:136 msgid "" "wavbreaker could not launch the moodbar application, which is needed to " "generate the moodbar. You can download the moodbar package from:\n" "\n" " http://amarok.kde.org/wiki/Moodbar" msgstr "" "wavbreaker no pudo ejecutar la aplicación de barra de análisis, que es " "necesaria para generar la barra. Puede descargar el paquete desde:\n" "\n" " http://amarok.kde.org/wiki/Moodbar" #: src/overwritedialog.c:98 #, fuzzy, c-format msgid "" "%s already exists.\n" "\n" "Do you want to overwrite the existing file?" msgstr "" " ya existe.\n" "\n" "¿Quiere sobreescribir el fichero existente?" #: src/overwritedialog.c:105 msgid "Overwrite all files" msgstr "Sobreescribir todos los ficheros" #: src/overwritedialog.c:118 #, fuzzy msgid "_No" msgstr "_Ir" #: src/overwritedialog.c:123 msgid "_Yes" msgstr "" #: src/reallyquit.c:28 msgid "Quit wavbreaker?" msgstr "¿Salir de wavbreaker?" #: src/reallyquit.c:29 msgid "If you quit wavbreaker now, any unsaved chunks will be lost." msgstr "Si sale de wavbreaker ahora cualquier trozo no guardado se perderá." #: src/sample.c:455 msgid "Open as RAW audio" msgstr "Abrir como audio en crudo" #: src/sample.c:456 msgid "" "The file you selected does not contain a wave header. wavbreaker can " "interpret the file as \"Signed 16 bit, 44100 Hz, Stereo\" audio. Choose the " "byte order for the RAW audio or cancel to abort." msgstr "" "El fichero que ha seleccionado no tiene una cabecera de fichero de onda. " "Wavbreaker puede interpretar el fichero como audio de 16 bit con signo, " "44100 Hz, estéreo. Elija el orden de los bytes para el audio en crudo o " "cancelar para abortar." #: src/sample.c:464 msgid "Big endian" msgstr "Más significativo" #: src/sample.c:465 msgid "Little endian" msgstr "Menos significativo" #: src/sample.c:571 #, c-format msgid "Error opening %s: %s" msgstr "Error abriendo %s: %s" #: src/saveas.c:49 msgid "Select folder to save wave files" msgstr "Seleccione la carpeta para guardar los ficheros de onda" #: src/wav.c:35 msgid "" "Error reading chunk. Maybe the wave file you are trying to load is truncated?" msgstr "" "Error leyendo bloque. ¿Quizás el fichero que está cargando está truncado?" #: src/wav.c:85 #, c-format msgid "Cannot open %s: %s" msgstr "No puedo abrir %s: %s" #: src/wav.c:92 msgid "Cannot read wave header." msgstr "No se puede leer la cabecera de onda." #: src/wav.c:98 #, c-format msgid "%s is not a wave file." msgstr "%s no es un fichero de onda." #: src/wav.c:139 src/wav.c:192 src/wav.c:213 #, c-format msgid "Error seeking to %u in %s: %s" msgstr "Error desplazándose a %u en %s: %s" #: src/wav.c:162 #, fuzzy, c-format msgid "Error reading format chunk: %s" msgstr "Error desplazándose a %u en %s: %s" #: src/wav.c:178 msgid "Loading compressed wave data is not supported." msgstr "La carga de datos de onda comprimidos no está soportada." #: src/wavbreaker.c:462 msgid "Write" msgstr "Escribir" #: src/wavbreaker.c:491 msgid "Time" msgstr "Tiempo" #: src/wavbreaker.c:502 msgid "Duration" msgstr "Duración" #: src/wavbreaker.c:512 msgid "Offset" msgstr "Desplaz." #: src/wavbreaker.c:553 msgid "Check all" msgstr "Marcar todo" #: src/wavbreaker.c:554 msgid "Check none" msgstr "Marcar nada" #: src/wavbreaker.c:555 msgid "Invert check" msgstr "Invertir marca" #: src/wavbreaker.c:559 #, fuzzy msgid "Auto-rename track breaks" msgstr "Renombrar cortes de pista" #: src/wavbreaker.c:563 src/wavbreaker.c:2020 msgid "Remove track break" msgstr "Eliminar corte de pista" #: src/wavbreaker.c:564 msgid "Jump to track break" msgstr "Saltar al corte de pista" #: src/wavbreaker.c:1128 msgid "Splitting wave file" msgstr "Dividir fichero de onda" #: src/wavbreaker.c:1139 msgid "" "The selected track breaks are now written to disk. This can take some time." msgstr "" "Los trozos de pista seleccionado se están escribiendo en disco. Puede llevar " "un tiempo." #: src/wavbreaker.c:1163 #, c-format msgid "The file %s has been split into %d parts." msgstr "El fichero %s se ha dividido en %d trozos." #: src/wavbreaker.c:1165 #, c-format msgid "The file %s has been split into one part." msgstr "El fichero %s se ha dividido en un trozo." #: src/wavbreaker.c:1182 #, c-format msgid "Writing %s" msgstr "Escribiendo %s" #: src/wavbreaker.c:1199 #, c-format msgid "%d of %d parts written" msgstr "%d de %d trozos escritos" #: src/wavbreaker.c:1201 #, c-format msgid "%d of 1 part written" msgstr "%d de 1 trozo escrito" #: src/wavbreaker.c:1274 msgid "Analyzing waveform" msgstr "Analizando la onda" #: src/wavbreaker.c:1286 msgid "" "The waveform data of the selected file is being analyzed and processed. This " "can take some time." msgstr "" "Los datos de onda del fichero seleccionado se están analizando y procesando. " "Esto puede llevar un tiempo." #: src/wavbreaker.c:1294 #, c-format msgid "Analyzing %s" msgstr "Analizando %s" #: src/wavbreaker.c:1352 #, c-format msgid "%d of %d MB analyzed" msgstr "%d de %d MB analizados" #: src/wavbreaker.c:1363 msgid "Error opening file" msgstr "Error abriendo el fichero" #: src/wavbreaker.c:1459 msgid "Open File" msgstr "Abrir fichero" #: src/wavbreaker.c:2019 msgid "Add track break" msgstr "Añadir corte de pista" #: src/wavbreaker.c:2021 msgid "Jump to cursor marker" msgstr "Saltar al cursor" #: src/wavbreaker.c:2121 #, c-format msgid "Cursor" msgstr "Cursor" #: src/wavbreaker.c:2128 msgid "Playing" msgstr "Reproduciendo" #: src/wavbreaker.c:2292 src/wavbreaker.c:2318 msgid "Text files" msgstr "Ficheros de texto" #: src/wavbreaker.c:2294 src/wavbreaker.c:2322 msgid "TOC files" msgstr "Ficheros TOC" #: src/wavbreaker.c:2296 src/wavbreaker.c:2326 #, fuzzy msgid "CUE files" msgstr "Ficheros TOC" #: src/wavbreaker.c:2329 #, fuzzy msgid "Export track breaks to file" msgstr "Guardar cortes en un fichero" #: src/wavbreaker.c:2380 #, fuzzy msgid "Import track breaks from file" msgstr "Importa los cortes desde un fichero TOC" #: src/wavbreaker.c:2397 src/wavbreaker.c:2402 msgid "Import failed" msgstr "Falló la importación" #: src/wavbreaker.c:2397 msgid "There has been an error importing track breaks from the TOC file." msgstr "Hubo un error importando los cortes del fichero TOC." #: src/wavbreaker.c:2402 #, fuzzy msgid "There has been an error importing track breaks from the CUE file." msgstr "Hubo un error importando los cortes del fichero TOC." #: src/wavbreaker.c:2585 msgid "Time offset:" msgstr "" #: src/wavbreaker.c:2721 #, fuzzy msgid "Open file" msgstr "Abrir fichero" #: src/wavbreaker.c:2726 #, fuzzy msgid "Open menu" msgstr "Abrir fichero" #: src/wavbreaker.c:2734 msgid "Display moodbar" msgstr "Mostrar barra de análisis" #: src/wavbreaker.c:2735 msgid "Generate moodbar" msgstr "Generar barra de visualización" #: src/wavbreaker.c:2740 #, fuzzy msgid "Import track breaks" msgstr "Saltar al corte de pista" #: src/wavbreaker.c:2741 #, fuzzy msgid "Export track breaks" msgstr "Saltar al corte de pista" #: src/wavbreaker.c:2753 msgid "About" msgstr "Acerca de" #: src/wavbreaker.c:2762 msgid "Save file parts" msgstr "" #: src/wavbreaker.c:2858 msgid "Toggle playback" msgstr "" #: src/wavbreaker.c:2863 msgid "Cursor position:" msgstr "Posición del cursor:" #: src/wavbreaker.c:2880 msgid "Seek to previous silence" msgstr "Buscar el silencio anterior" #: src/wavbreaker.c:2887 #, fuzzy msgid "Jump to time" msgstr "Salta hasta la siguiente trama de silencio" #: src/wavbreaker.c:2899 msgid "Seek to next silence" msgstr "Buscar el siguiente silencio" #: src/wavbreaker.c:2909 msgid "Auto-split by interval" msgstr "" #: src/wavbreaker.c:3048 src/wavbreaker.c:3070 msgid "Export failed" msgstr "La exportación falló" #: src/wavbreaker.c:3048 msgid "There has been an error exporting track breaks to the TOC file." msgstr "Ha habido un error exportando los trozos de pista al fichero TOC." #: src/wavbreaker.c:3070 msgid "Unrecognised export type" msgstr "" #~ msgid "Disable audio output" #~ msgstr "Deshabilitar la salida de audio" #~ msgid "wavbreaker Preferences" #~ msgstr "Preferencias de wavbreaker" #~ msgid "Audio Device" #~ msgstr "Dispositivo de audio" #~ msgid "Audio Device:" #~ msgstr "Dispositivo de audio:" #~ msgid "Output device:" #~ msgstr "Dispositivo de salida:" #~ msgid "Enter the time for autosplit:" #~ msgstr "Introduzca el tiempo de auto-troceado:" #~ msgid "Example (5min, 32sec, 12subsec):" #~ msgstr "Ejemplo (5min, 32sec, 12subsec):" #~ msgid "Add wave files to this list and click on \"Merge\"." #~ msgstr "Añada ficheros a esta lista y pulse en \"Agregar\"." #~ msgid "Stop" #~ msgstr "Detener" #~ msgid "Play" #~ msgstr "Reproducir" #~ msgid "Select name for TOC file to export" #~ msgstr "Seleccione el nombre del fichero TOC a exportar" #~ msgid "TOC export successful" #~ msgstr "Exportación de TOC correcta" #~ msgid "Load track breaks from file" #~ msgstr "Cargar cortes de un fichero" #~ msgid "Load track breaks from TOC file" #~ msgstr "Cargar cortes de un fichero TOC" #~ msgid "Open a wave file" #~ msgstr "Abrir un fichero de onda" #~ msgid "Save track breaks" #~ msgstr "Guardar los trozos" #~ msgid "Save to..." #~ msgstr "Guardar en..." #~ msgid "Save track breaks to folder" #~ msgstr "Guardar los trozos en una carpeta" #~ msgid "Configure wavbreaker" #~ msgstr "Configurar wavbreaker" #~ msgid "Merge wave files together" #~ msgstr "Agregar ficheros de onda" #~ msgid "Quit" #~ msgstr "Salir" #~ msgid "Close wavbreaker" #~ msgstr "Cerrar wavbreaker" #~ msgid "Display toolbar" #~ msgstr "Mostrar la barra de herramientas" #~ msgid "Show or hide the main window toolbar" #~ msgstr "Mostrar u ocultar la barra de herramientas de la ventana principal" #~ msgid "Draw moodbar over the waveform graph" #~ msgstr "Dibujar la barra de análisis sobre el gráfico de la onda" #~ msgid "Add track break at cursor position" #~ msgstr "Añade un corte de pista en la posición del cursor" #~ msgid "Remove selected track break" #~ msgstr "Elimina el corte de pista seleccionado" #~ msgid "Set cursor position to track break" #~ msgstr "Establece la posición del cursor en el corte de pista" #~ msgid "Set view to cursor marker" #~ msgstr "Establece la vista sobre el cursor" #~ msgid "Automatically rename all track breaks" #~ msgstr "Renombrar automáticamente todos los cortes" #~ msgid "Generate moodbar data" #~ msgstr "Genera los datos de la barra de visualización" #~ msgid "Split into chunks with specified size" #~ msgstr "Recorta trozos del tamaño especificado" #~ msgid "Export to TOC" #~ msgstr "Exportar a TOC" #~ msgid "Export to CD-ROM TOC file for burning" #~ msgstr "Exporta a un fichero TOC de CD-ROM para grabarlo" #~ msgid "_Import from TOC" #~ msgstr "_Importar desde TOC" #~ msgid "_Save offsets to text file" #~ msgstr "_Guardar desplazamientos a un fichero de texto" #~ msgid "Save track breaks to text file" #~ msgstr "Guarda los cortes de pista a un fichero de texto" #~ msgid "_Load offsets from text file" #~ msgstr "_Guardar desplazamientos de un fichero de texto" #~ msgid "Load track breaks from text file" #~ msgstr "Carga los cortes de pista de un fichero de texto" #~ msgid "Start/Stop playback of media" #~ msgstr "Iniciar/detener la reproducción de medios" #~ msgid "Jump to previous silent frame" #~ msgstr "Salta hasta la trama de silencio anterior" #~ msgid "Show information about " #~ msgstr "Muestra información sobre " #~ msgid "_File" #~ msgstr "_Fichero" #~ msgid "_Edit" #~ msgstr "_Editar" #~ msgid "_View" #~ msgstr "_Ver" #~ msgid "_Help" #~ msgstr "_Ayuda" #~ msgid "Add" #~ msgstr "Añadir" #~ msgid "Auto-Rename" #~ msgstr "Auto-renombrar" wavbreaker-0.16/po/fr.po000066400000000000000000000417461435035650500152000ustar00rootroot00000000000000# translation of fr.po to português # translation of fr.po to # French translation of wavbreaker # Copyright (C) 2007 José Jorge # This file is distributed under the same license as the wavbreaker package. # # Jose JORGE , 2007, 2019. msgid "" msgstr "" "Project-Id-Version: fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-15 20:23+0100\n" "PO-Revision-Date: 2019-11-11 09:38+0100\n" "Last-Translator: Jose JORGE \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 19.08.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/about.c:29 msgid "Split a wave file into multiple chunks" msgstr "Couper un fichier wave en plusieurs morceaux" #: src/appconfig.c:370 msgid "Select Output Directory" msgstr "Sélectionner le Dossier de Sortie" #: src/appconfig.c:372 msgid "Cancel" msgstr "Annuler" #: src/appconfig.c:373 msgid "Open" msgstr "Ouvrir" #: src/appconfig.c:419 src/wavbreaker.c:2749 msgid "Preferences" msgstr "Préférences" #: src/appconfig.c:439 msgid "General" msgstr "Général" #: src/appconfig.c:441 msgid "Save output files in folder:" msgstr "Enregistrer les fichiers coupés dans le dossier :" #: src/appconfig.c:454 msgid "Browse" msgstr "Parcourir" #: src/appconfig.c:464 msgid "Maximum volume considered silence (in percent):" msgstr "Pourcentage maximal du volume considéré comme du silence:" #: src/appconfig.c:478 msgid "File Naming" msgstr "Nommage des Fichiers" #: src/appconfig.c:480 msgid "Standard (##)" msgstr "Standard (##)" #: src/appconfig.c:485 msgid "Separator:" msgstr "Séparateur:" #: src/appconfig.c:502 msgid "Prepend number before filename" msgstr "Mettre le numéro avant le nom du fichier" #: src/appconfig.c:509 msgid "etree.org (d#t##)" msgstr "etree.org (d#t##)" #: src/appconfig.c:512 msgid "CD Length:" msgstr "Durée du CD:" #: src/autosplit.c:76 msgid "Interval (MM:SS.FF, MM:SS, SS.FF or MM):" msgstr "Intervale (MM:SS.FF, MM:SS, SS.FF or MM):" #: src/autosplit.c:87 msgid "Split" msgstr "Couper" #: src/guimerge.c:96 src/guimerge.c:188 src/wavbreaker.c:1447 #: src/wavbreaker.c:2371 msgid "All files" msgstr "Tous les fichiers" #: src/guimerge.c:100 src/guimerge.c:192 src/wavbreaker.c:1451 #: src/wavbreaker.c:2375 msgid "Supported files" msgstr "Fichiers acceptés" #: src/guimerge.c:103 msgid "Select filename for merged wave file" msgstr "Sélectionner le nom du fichier où coller les fichiers wave" #: src/guimerge.c:106 src/guimerge.c:197 src/moodbar.c:110 src/saveas.c:52 #: src/wavbreaker.c:1461 src/wavbreaker.c:2331 src/wavbreaker.c:2382 msgid "_Cancel" msgstr "A_nnuler" #: src/guimerge.c:107 src/saveas.c:53 src/wavbreaker.c:2332 msgid "_Save" msgstr "Enregi_strer" #: src/guimerge.c:116 msgid "Open file in wavbreaker after merge" msgstr "Ouvrir le fichier dans wavbreaker après le collage" #: src/guimerge.c:160 msgid "Wrong file format - skipping file" msgstr "Mauvais format de fichier - fichier ignoré" #: src/guimerge.c:195 msgid "Add wave file to merge" msgstr "Ajouter le fichier wave au collage" #: src/guimerge.c:198 src/wavbreaker.c:1462 src/wavbreaker.c:2383 msgid "_Open" msgstr "_Ouvrir" #: src/guimerge.c:272 src/wavbreaker.c:2745 msgid "Merge wave files" msgstr "Concaténer des fichiers wave" #: src/guimerge.c:309 src/wavbreaker.c:473 msgid "File Name" msgstr "Nom du Fichier" #: src/guimerge.c:320 msgid "Length" msgstr "Durée" #: src/guimerge.c:333 msgid "_Add" msgstr "_Ajouter" #: src/guimerge.c:337 msgid "_Remove" msgstr "Supp_rimer" #: src/guimerge.c:344 msgid "Merge" msgstr "Concaténer" #: src/guimerge.c:379 msgid "Merging wave files" msgstr "Concatène les fichiers wave" #: src/guimerge.c:389 msgid "The selected files are now being merged. This can take some time." msgstr "" "Les fichiers sélectionnés sont maintenant concaténés. Cela peut être long." #: src/guimerge.c:411 src/wavbreaker.c:1167 msgid "Operation successful" msgstr "Opération réussie" #: src/guimerge.c:411 msgid "The files have been merged." msgstr "Les fichiers ont été concaténés." #: src/guimerge.c:418 #, c-format msgid "Adding %s" msgstr "Ajout de %s" #: src/guimerge.c:434 #, c-format msgid "%d of %d files merged" msgstr "%d des %d fichiers concaténés" #: src/guimerge.c:436 #, c-format msgid "%d of 1 file merged" msgstr "%d d'un fichier concaténé" #: src/moodbar.c:100 src/moodbar.c:116 msgid "Generating moodbar" msgstr "Calcul de la barre d'ambiance" #: src/moodbar.c:106 msgid "_Hide window" msgstr "Cac_her cette fenêtre" #: src/moodbar.c:115 msgid "" "The moodbar tool analyzes your audio file and generates a colorful " "representation of the audio data." msgstr "" "L'outil moodbar analyse votre fichier audio et crée une représentation " "visuelle des données audio." #: src/moodbar.c:136 msgid "Cannot launch \"moodbar\"" msgstr "Impossible d'utiliser \"moodbar\" " #: src/moodbar.c:136 msgid "" "wavbreaker could not launch the moodbar application, which is needed to " "generate the moodbar. You can download the moodbar package from:\n" "\n" " http://amarok.kde.org/wiki/Moodbar" msgstr "" "wavbreaker n'a pas réussi à lancer l'outil moodbar, qui permet de créer la " "barre d'ambiance. Vous pouvez le télécharger à partir de:\n" "\n" " http://amarok.kde.org/wiki/Moodbar" #: src/overwritedialog.c:98 #, c-format msgid "" "%s already exists.\n" "\n" "Do you want to overwrite the existing file?" msgstr "" "%s existe déjà.\n" "\n" "Voulez-vous écraser le fichier existant?" #: src/overwritedialog.c:105 msgid "Overwrite all files" msgstr "Écraser tous les fichiers" #: src/overwritedialog.c:118 msgid "_No" msgstr "_Non" #: src/overwritedialog.c:123 msgid "_Yes" msgstr "_Oui" #: src/reallyquit.c:28 msgid "Quit wavbreaker?" msgstr "Quitter wavbreaker?" #: src/reallyquit.c:29 msgid "If you quit wavbreaker now, any unsaved chunks will be lost." msgstr "Si vous quittez maintenant, toute partie non enregistrée sera perdue." #: src/sample.c:455 msgid "Open as RAW audio" msgstr "Ouvrir en tant que son RAW" #: src/sample.c:456 msgid "" "The file you selected does not contain a wave header. wavbreaker can " "interpret the file as \"Signed 16 bit, 44100 Hz, Stereo\" audio. Choose the " "byte order for the RAW audio or cancel to abort." msgstr "" "Le fichier que vous avez sélectionné ne contient pas d'en-tête wave. " "wavbreaker peut interpréter ce fichier comme du son \"16 bits, 44100 Hz, " "Stéréo\". Choisissez l'ordre des octets pour le son RAW ou annulez pour " "quitter." #: src/sample.c:464 msgid "Big endian" msgstr "Gros-boutiste" #: src/sample.c:465 msgid "Little endian" msgstr "Petit-boutiste" #: src/sample.c:571 #, c-format msgid "Error opening %s: %s" msgstr "Erreur à l'ouverture de %s : %s" #: src/saveas.c:49 msgid "Select folder to save wave files" msgstr "Sélectionner le dossier où enregistrer les fichiers wave" #: src/wav.c:35 msgid "" "Error reading chunk. Maybe the wave file you are trying to load is truncated?" msgstr "" "Erreur lors de la lecture. Le fichier que vous chargez a peut-être été " "tronqué?" #: src/wav.c:85 #, c-format msgid "Cannot open %s: %s" msgstr "Impossible d'ouvrir %s : %s" #: src/wav.c:92 msgid "Cannot read wave header." msgstr "Impossible de lire l'en-tête wave." #: src/wav.c:98 #, c-format msgid "%s is not a wave file." msgstr "%s n'est pas un fichier wave." #: src/wav.c:139 src/wav.c:192 src/wav.c:213 #, c-format msgid "Error seeking to %u in %s: %s" msgstr "Erreur en atteignant %u dans %s: %s" #: src/wav.c:162 #, c-format msgid "Error reading format chunk: %s" msgstr "Erreur en lisant le format : %s" #: src/wav.c:178 msgid "Loading compressed wave data is not supported." msgstr "Les données wave compactées ne sont pas supportées." #: src/wavbreaker.c:462 msgid "Write" msgstr "Écrire" #: src/wavbreaker.c:491 msgid "Time" msgstr "Temps" #: src/wavbreaker.c:502 msgid "Duration" msgstr "Durée" #: src/wavbreaker.c:512 msgid "Offset" msgstr "Décalage" #: src/wavbreaker.c:553 msgid "Check all" msgstr "Séleccioner Tout" #: src/wavbreaker.c:554 msgid "Check none" msgstr "Déséleccioner tout" #: src/wavbreaker.c:555 msgid "Invert check" msgstr "Inverser la sélection" #: src/wavbreaker.c:559 msgid "Auto-rename track breaks" msgstr "Renommer automatiquement les parties" #: src/wavbreaker.c:563 src/wavbreaker.c:2020 msgid "Remove track break" msgstr "Supprimer une séparation" #: src/wavbreaker.c:564 msgid "Jump to track break" msgstr "Aller à la séparation" #: src/wavbreaker.c:1128 msgid "Splitting wave file" msgstr "Découpage en cours" #: src/wavbreaker.c:1139 msgid "" "The selected track breaks are now written to disk. This can take some time." msgstr "" "Les découpages du fichier sont maintenant en écriture sur le disque. Cela " "peut être long." #: src/wavbreaker.c:1163 #, c-format msgid "The file %s has been split into %d parts." msgstr "Le fichier %s a été coupé en %d morceaux." #: src/wavbreaker.c:1165 #, c-format msgid "The file %s has been split into one part." msgstr "Le fichier %s a été coupé en un morceau." #: src/wavbreaker.c:1182 #, c-format msgid "Writing %s" msgstr "Écriture de %s" #: src/wavbreaker.c:1199 #, c-format msgid "%d of %d parts written" msgstr "%d des %d morceaux écrits" #: src/wavbreaker.c:1201 #, c-format msgid "%d of 1 part written" msgstr "%d d'un morceau écrit" #: src/wavbreaker.c:1274 msgid "Analyzing waveform" msgstr "Analyse de l'onde sonore" #: src/wavbreaker.c:1286 msgid "" "The waveform data of the selected file is being analyzed and processed. This " "can take some time." msgstr "" "L'onde sonore du fichier sélectionné est en cours d'analyse et traitement. " "Cela peut être long." #: src/wavbreaker.c:1294 #, c-format msgid "Analyzing %s" msgstr "Analyse de %s" #: src/wavbreaker.c:1352 #, c-format msgid "%d of %d MB analyzed" msgstr "%d de %d Mo analysés" #: src/wavbreaker.c:1363 msgid "Error opening file" msgstr "Erreur à l'ouverture du fichier" #: src/wavbreaker.c:1459 msgid "Open File" msgstr "Ouvrir un fichier" #: src/wavbreaker.c:2019 msgid "Add track break" msgstr "Ajouter une séparation" #: src/wavbreaker.c:2021 msgid "Jump to cursor marker" msgstr "Aller au marqueur du curseur" #: src/wavbreaker.c:2121 #, c-format msgid "Cursor" msgstr "Curseur" #: src/wavbreaker.c:2128 msgid "Playing" msgstr "En lecture" #: src/wavbreaker.c:2292 src/wavbreaker.c:2318 msgid "Text files" msgstr "Fichiers Texte" #: src/wavbreaker.c:2294 src/wavbreaker.c:2322 msgid "TOC files" msgstr "Fichiers TOC" #: src/wavbreaker.c:2296 src/wavbreaker.c:2326 msgid "CUE files" msgstr "Fichiers CUE" #: src/wavbreaker.c:2329 msgid "Export track breaks to file" msgstr "Exporter les séparations de piste dans un fichier" #: src/wavbreaker.c:2380 msgid "Import track breaks from file" msgstr "Importer les séparations de piste depuis un fichier" #: src/wavbreaker.c:2397 src/wavbreaker.c:2402 msgid "Import failed" msgstr "L'importation a échoué" #: src/wavbreaker.c:2397 msgid "There has been an error importing track breaks from the TOC file." msgstr "" "Une erreur est survenue lors de l'importation des coupures de piste depuis " "le fichier TOC." #: src/wavbreaker.c:2402 msgid "There has been an error importing track breaks from the CUE file." msgstr "" "Une erreur est survenue lors de l'importation des coupures de piste depuis " "le fichier CUE." #: src/wavbreaker.c:2585 msgid "Time offset:" msgstr "Décalage temporel :" #: src/wavbreaker.c:2721 msgid "Open file" msgstr "Ouvrir un fichier" #: src/wavbreaker.c:2726 msgid "Open menu" msgstr "Ouvrir le menu" #: src/wavbreaker.c:2734 msgid "Display moodbar" msgstr "Afficher la barre d'ambiance sonore" #: src/wavbreaker.c:2735 msgid "Generate moodbar" msgstr "Créer la barre d'ambiance" #: src/wavbreaker.c:2740 msgid "Import track breaks" msgstr "Importer les séparations de piste" #: src/wavbreaker.c:2741 msgid "Export track breaks" msgstr "Exporter les séparations de piste" #: src/wavbreaker.c:2753 msgid "About" msgstr "À propos" #: src/wavbreaker.c:2762 msgid "Save file parts" msgstr "Enregistrer les parties" #: src/wavbreaker.c:2858 msgid "Toggle playback" msgstr "Lire/Interrompre" #: src/wavbreaker.c:2863 msgid "Cursor position:" msgstr "Position du curseur :" #: src/wavbreaker.c:2880 msgid "Seek to previous silence" msgstr "Revenir au silence précédent" #: src/wavbreaker.c:2887 msgid "Jump to time" msgstr "Aller au temps" #: src/wavbreaker.c:2899 msgid "Seek to next silence" msgstr "Avancer au silence suivant" #: src/wavbreaker.c:2909 msgid "Auto-split by interval" msgstr "Découper automatiquement par intervalle" #: src/wavbreaker.c:3048 src/wavbreaker.c:3070 msgid "Export failed" msgstr "L'exportation a échoué" #: src/wavbreaker.c:3048 msgid "There has been an error exporting track breaks to the TOC file." msgstr "" "Une erreur est survenue lors de l'exportation des coupures de piste vers le " "fichier TOC." #: src/wavbreaker.c:3070 msgid "Unrecognised export type" msgstr "Type d'exportation non reconnu" #~ msgid "Disable audio output" #~ msgstr "Désactiver la sortie sonore" #~ msgid "wavbreaker Preferences" #~ msgstr "Préférences" #~ msgid "Audio Device" #~ msgstr "Périphérique Audio" #~ msgid "Audio Device:" #~ msgstr "Périphérique Audio :" #~ msgid "Output device:" #~ msgstr "Périphérique de lecture:" #~ msgid "Enter the time for autosplit:" #~ msgstr "Écrivez la durée pour la coupure automatique :" #~ msgid "Example (5min, 32sec, 12subsec):" #~ msgstr "Exemple (5min, 32sec, 12subsec):" #~ msgid "Add wave files to this list and click on \"Merge\"." #~ msgstr "" #~ "Ajoutez les fichiers wave à cette liste et cliquez sur \"Concaténer\"." #~ msgid "Stop" #~ msgstr "Arrêter" #~ msgid "Play" #~ msgstr "Écouter" #~ msgid "Select name for TOC file to export" #~ msgstr "Sélectionner le nom du fichier TOC à exporter" #~ msgid "TOC export successful" #~ msgstr "Exportation de la TOC réussie" #~ msgid "" #~ "The track breaks have been exported to a TOC file that can be used to " #~ "burn a CD from the wave file." #~ msgstr "" #~ "Les coupures de piste ont été exportées vers le fichier TOC qui peut être " #~ "utilisé pour graver un CD à partir du fichier wave." #~ msgid "Load track breaks from file" #~ msgstr "Charger les séparations de piste depuis un fichier" #~ msgid "Load track breaks from TOC file" #~ msgstr "Charger les séparations de piste depuis un fichier TOC" #~ msgid "Open a wave file" #~ msgstr "Ouvrir un fichier wave" #~ msgid "Save track breaks" #~ msgstr "Enregistrer les séparateurs de piste" #~ msgid "Save to..." #~ msgstr "Enregistrer sous..." #~ msgid "Save track breaks to folder" #~ msgstr "Enregistrer les séparateurs de piste dans un dossier" #~ msgid "Configure wavbreaker" #~ msgstr "Configurer wavbreaker" #~ msgid "Merge wave files together" #~ msgstr "Concaténer des fichiers wave ensemble" #~ msgid "Quit" #~ msgstr "Quitter" #~ msgid "Close wavbreaker" #~ msgstr "Fermer wavbreaker" #~ msgid "Display toolbar" #~ msgstr "Afficher la barre d'outils" #~ msgid "Show or hide the main window toolbar" #~ msgstr "Afficher ou cacher la barre d'outils de la fenêtre principale" #~ msgid "Draw moodbar over the waveform graph" #~ msgstr "Dessine la barre d'ambiance sous l'onde sonore" #~ msgid "Add track break at cursor position" #~ msgstr "Ajouter une séparation à la position du curseur" #~ msgid "Remove selected track break" #~ msgstr "Supprimer la séparation sélectionnée" #~ msgid "Set cursor position to track break" #~ msgstr "Définir la posiiton du curseur à la séparation" #~ msgid "Set view to cursor marker" #~ msgstr "Définir la vue au marqueur du curseur" #~ msgid "Automatically rename all track breaks" #~ msgstr "Donne automatiquement un nom à tous les morceaux" #~ msgid "Generate moodbar data" #~ msgstr "" #~ "Calcule les données nécessaires à l'affichage de la barre d'ambiance" #~ msgid "Split into chunks with specified size" #~ msgstr "Coupe en morceaux d'une taille indiquée" #~ msgid "Export to TOC" #~ msgstr "Exportation vers TOC" #~ msgid "Export to CD-ROM TOC file for burning" #~ msgstr "Exporte vers un fichier TOC de CD-ROM pour gravage" #~ msgid "_Import from TOC" #~ msgstr "_Importation depuis TOC" #~ msgid "_Save offsets to text file" #~ msgstr "Enregi_strer les séparateurs dans un fichier texte" #~ msgid "Save track breaks to text file" #~ msgstr "Enregistrer les séparations de piste dans un fichier texte" #~ msgid "_Load offsets from text file" #~ msgstr "_Charger les séparations depuis un fichier texte" #~ msgid "Load track breaks from text file" #~ msgstr "Enregistrer les séparations de piste dans un dossier" #~ msgid "Start/Stop playback of media" #~ msgstr "Démarrer/Arrêter la lecture" #~ msgid "Jump to previous silent frame" #~ msgstr "Aller au passage silencieux précédent" #~ msgid "Show information about " #~ msgstr "Affiche des informations à propos " #~ msgid "_File" #~ msgstr "_Fichier" #~ msgid "_Edit" #~ msgstr "_Édition" #~ msgid "_View" #~ msgstr "_Affichage" #~ msgid "_Help" #~ msgstr "_Aide" #~ msgid "Add" #~ msgstr "Ajouter" #~ msgid "Auto-Rename" #~ msgstr "Renommer automatiquement" wavbreaker-0.16/po/meson.build000066400000000000000000000002601435035650500163550ustar00rootroot00000000000000i18n = import('i18n') add_project_arguments('-DGETTEXT_PACKAGE="wavbreaker"', language:'c') i18n.gettext(meson.project_name(), args: '--directory=' + meson.source_root() ) wavbreaker-0.16/po/pt.po000066400000000000000000000413301435035650500152010ustar00rootroot00000000000000# translation of pt.po to português # translation of pt.po to # Português translation of wavbreaker # Copyright (C) 2007 José Jorge # This file is distributed under the same license as the wavbreaker package. # # José JORGE , 2007, 2019. msgid "" msgstr "" "Project-Id-Version: pt\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-15 20:23+0100\n" "PO-Revision-Date: 2019-11-11 09:30+0100\n" "Last-Translator: Jose JORGE \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 19.08.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/about.c:29 msgid "Split a wave file into multiple chunks" msgstr "Dividir um ficheiro wave em partes múltiplas" #: src/appconfig.c:370 msgid "Select Output Directory" msgstr "Selecionar a Pasta de Saída" #: src/appconfig.c:372 msgid "Cancel" msgstr "Cancelar" #: src/appconfig.c:373 msgid "Open" msgstr "Abrir" #: src/appconfig.c:419 src/wavbreaker.c:2749 msgid "Preferences" msgstr "Preferências" #: src/appconfig.c:439 msgid "General" msgstr "Geral" #: src/appconfig.c:441 msgid "Save output files in folder:" msgstr "Gravar os ficheiros de saída na pasta:" #: src/appconfig.c:454 msgid "Browse" msgstr "Navegar" #: src/appconfig.c:464 msgid "Maximum volume considered silence (in percent):" msgstr "Nível máximo de volume considerado como silencio (em percentagem):" #: src/appconfig.c:478 msgid "File Naming" msgstr "Nomear os Ficheiros" #: src/appconfig.c:480 msgid "Standard (##)" msgstr "Standard (##)" #: src/appconfig.c:485 msgid "Separator:" msgstr "Separador:" #: src/appconfig.c:502 msgid "Prepend number before filename" msgstr "Meter o número antes do nome do ficheiro" #: src/appconfig.c:509 msgid "etree.org (d#t##)" msgstr "etree.org (d#t##)" #: src/appconfig.c:512 msgid "CD Length:" msgstr "Duração do CD:" #: src/autosplit.c:76 msgid "Interval (MM:SS.FF, MM:SS, SS.FF or MM):" msgstr "Intervalo (MM:SS.FF, MM:SS, SS.FF or MM):" #: src/autosplit.c:87 msgid "Split" msgstr "Dividir" #: src/guimerge.c:96 src/guimerge.c:188 src/wavbreaker.c:1447 #: src/wavbreaker.c:2371 msgid "All files" msgstr "Todos os ficheiros" #: src/guimerge.c:100 src/guimerge.c:192 src/wavbreaker.c:1451 #: src/wavbreaker.c:2375 msgid "Supported files" msgstr "Ficheiros suportados" #: src/guimerge.c:103 msgid "Select filename for merged wave file" msgstr "Seleccionar o nome do ficheiro onde colar os ficheiros wave" #: src/guimerge.c:106 src/guimerge.c:197 src/moodbar.c:110 src/saveas.c:52 #: src/wavbreaker.c:1461 src/wavbreaker.c:2331 src/wavbreaker.c:2382 msgid "_Cancel" msgstr "_Cancelar" #: src/guimerge.c:107 src/saveas.c:53 src/wavbreaker.c:2332 msgid "_Save" msgstr "_Gravar" #: src/guimerge.c:116 msgid "Open file in wavbreaker after merge" msgstr "Abrir o ficheiro no wavbreaker depois da colagem" #: src/guimerge.c:160 msgid "Wrong file format - skipping file" msgstr "Erro no formato do ficheiro - será ignorado" #: src/guimerge.c:195 msgid "Add wave file to merge" msgstr "Adicione o ficheiro wave a colar" #: src/guimerge.c:198 src/wavbreaker.c:1462 src/wavbreaker.c:2383 msgid "_Open" msgstr "_Abrir" #: src/guimerge.c:272 src/wavbreaker.c:2745 msgid "Merge wave files" msgstr "Colar ficheiros wave" #: src/guimerge.c:309 src/wavbreaker.c:473 msgid "File Name" msgstr "Nome do Ficheiro" #: src/guimerge.c:320 msgid "Length" msgstr "Duração" #: src/guimerge.c:333 msgid "_Add" msgstr "_Adicionar" #: src/guimerge.c:337 msgid "_Remove" msgstr "_Remover" #: src/guimerge.c:344 msgid "Merge" msgstr "Colar" #: src/guimerge.c:379 msgid "Merging wave files" msgstr "Colar ficheiros wave" #: src/guimerge.c:389 msgid "The selected files are now being merged. This can take some time." msgstr "" "Os ficheiros seleccionados estão agora a ser colados. Isto pode levar algum " "tempo." #: src/guimerge.c:411 src/wavbreaker.c:1167 msgid "Operation successful" msgstr "Operação conseguida" #: src/guimerge.c:411 msgid "The files have been merged." msgstr "Os ficheiros foram colados." #: src/guimerge.c:418 #, c-format msgid "Adding %s" msgstr "A adicionar %s" #: src/guimerge.c:434 #, c-format msgid "%d of %d files merged" msgstr "%d dos %d ficheiros colados" #: src/guimerge.c:436 #, c-format msgid "%d of 1 file merged" msgstr "%d de 1 ficheiro colado" #: src/moodbar.c:100 src/moodbar.c:116 msgid "Generating moodbar" msgstr "A criar a barra de ambiente sonoro" #: src/moodbar.c:106 msgid "_Hide window" msgstr "_Esconder esta janela" #: src/moodbar.c:115 msgid "" "The moodbar tool analyzes your audio file and generates a colorful " "representation of the audio data." msgstr "" "A ferramenta moodbar analisa o seu ficheiro áudio e cria um gráfico colorido " "que representa o ambiente sonoro." #: src/moodbar.c:136 msgid "Cannot launch \"moodbar\"" msgstr "Impossível de iniciar \"moodbar\"" #: src/moodbar.c:136 msgid "" "wavbreaker could not launch the moodbar application, which is needed to " "generate the moodbar. You can download the moodbar package from:\n" "\n" " http://amarok.kde.org/wiki/Moodbar" msgstr "" "wavbreaker não conseguiu iniciar o programa moodbar, que é necessário para " "criar a barra de ambiente sonoro. Pode descarregar o programa em :\n" "\n" " http://amarok.kde.org/wiki/Moodbar" #: src/overwritedialog.c:98 #, c-format msgid "" "%s already exists.\n" "\n" "Do you want to overwrite the existing file?" msgstr "" "%s já existe.\n" "\n" "Deseja sobrepor o ficheiro?" #: src/overwritedialog.c:105 msgid "Overwrite all files" msgstr "Sobrepor todos os ficheiros" #: src/overwritedialog.c:118 msgid "_No" msgstr "_Não" #: src/overwritedialog.c:123 msgid "_Yes" msgstr "_Sim" #: src/reallyquit.c:28 msgid "Quit wavbreaker?" msgstr "Sair do wavbreaker?" #: src/reallyquit.c:29 msgid "If you quit wavbreaker now, any unsaved chunks will be lost." msgstr "" "Se fechar wavbreaker agora, todos as partes não gravadas serão perdidas." #: src/sample.c:455 msgid "Open as RAW audio" msgstr "Abrir como áudio RAW" #: src/sample.c:456 msgid "" "The file you selected does not contain a wave header. wavbreaker can " "interpret the file as \"Signed 16 bit, 44100 Hz, Stereo\" audio. Choose the " "byte order for the RAW audio or cancel to abort." msgstr "" "O ficheiro que escolheu não contém um cabeçalho wave. wavbreaker pode " "interpretar o ficheiro como um som \"16 bits, 44100 Hz, Estéreo\". Escolha a " "ordem dos bytes para o áudio RAW ou anule para saír." #: src/sample.c:464 msgid "Big endian" msgstr "Big endian" #: src/sample.c:465 msgid "Little endian" msgstr "Little endian" #: src/sample.c:571 #, c-format msgid "Error opening %s: %s" msgstr "Erro ao abrir %s : %s" #: src/saveas.c:49 msgid "Select folder to save wave files" msgstr "Seleccione a pasta onde gravar os ficheiros wave" #: src/wav.c:35 msgid "" "Error reading chunk. Maybe the wave file you are trying to load is truncated?" msgstr "Erro na leitura. Talvez o ficheiro wave que abriu foi cortado?" #: src/wav.c:85 #, c-format msgid "Cannot open %s: %s" msgstr "Impossível de abrir %s: %s" #: src/wav.c:92 msgid "Cannot read wave header." msgstr "Impossível de ler o cabeçalho wave." #: src/wav.c:98 #, c-format msgid "%s is not a wave file." msgstr "%s não é um ficheiro wave." #: src/wav.c:139 src/wav.c:192 src/wav.c:213 #, c-format msgid "Error seeking to %u in %s: %s" msgstr "Erro ao atingir %u em %s: %s" #: src/wav.c:162 #, c-format msgid "Error reading format chunk: %s" msgstr "Erro ao ler o formato : %s" #: src/wav.c:178 msgid "Loading compressed wave data is not supported." msgstr "Os dados wave comprimidos não são aceites." #: src/wavbreaker.c:462 msgid "Write" msgstr "Escrever" #: src/wavbreaker.c:491 msgid "Time" msgstr "Tempo" #: src/wavbreaker.c:502 msgid "Duration" msgstr "Duração" #: src/wavbreaker.c:512 msgid "Offset" msgstr "Posição" #: src/wavbreaker.c:553 msgid "Check all" msgstr "Marcar tudo" #: src/wavbreaker.c:554 msgid "Check none" msgstr "Desmarcar tudo" #: src/wavbreaker.c:555 msgid "Invert check" msgstr "Inverter a seleção" #: src/wavbreaker.c:559 msgid "Auto-rename track breaks" msgstr "Renomear automáticamente as separações de pistas" #: src/wavbreaker.c:563 src/wavbreaker.c:2020 msgid "Remove track break" msgstr "Remover uma separação de pista" #: src/wavbreaker.c:564 msgid "Jump to track break" msgstr "Saltar para a separação de pista" #: src/wavbreaker.c:1128 msgid "Splitting wave file" msgstr "A dividir o ficheiro wave" #: src/wavbreaker.c:1139 msgid "" "The selected track breaks are now written to disk. This can take some time." msgstr "" "Os cortes pedidos estão agora a ser escritos no disco. Isto pode levar algum " "tempo." #: src/wavbreaker.c:1163 #, c-format msgid "The file %s has been split into %d parts." msgstr "O ficheiro %s foi cortado em %d partes." #: src/wavbreaker.c:1165 #, c-format msgid "The file %s has been split into one part." msgstr "O ficheiro %s foi cortado em uma parte." #: src/wavbreaker.c:1182 #, c-format msgid "Writing %s" msgstr "A escrever %s" #: src/wavbreaker.c:1199 #, c-format msgid "%d of %d parts written" msgstr "%d das %d partes escritas" #: src/wavbreaker.c:1201 #, c-format msgid "%d of 1 part written" msgstr "%d de uma parte escrito" #: src/wavbreaker.c:1274 msgid "Analyzing waveform" msgstr "A analisar a onda sonora" #: src/wavbreaker.c:1286 msgid "" "The waveform data of the selected file is being analyzed and processed. This " "can take some time." msgstr "" "A onda sonora do ficheiro seleccionado está sendo analisada e processada. " "Isto pode levar algum tempo." #: src/wavbreaker.c:1294 #, c-format msgid "Analyzing %s" msgstr "A analisar %s" #: src/wavbreaker.c:1352 #, c-format msgid "%d of %d MB analyzed" msgstr "%d de %d MB analisados" #: src/wavbreaker.c:1363 msgid "Error opening file" msgstr "Erro ao abrir o ficheiro" #: src/wavbreaker.c:1459 msgid "Open File" msgstr "Abrir um Ficheiro" #: src/wavbreaker.c:2019 msgid "Add track break" msgstr "Adicionar uma separação de pista" #: src/wavbreaker.c:2021 msgid "Jump to cursor marker" msgstr "Salto até ao marcador do cursor" #: src/wavbreaker.c:2121 #, c-format msgid "Cursor" msgstr "Cursor" #: src/wavbreaker.c:2128 msgid "Playing" msgstr "A ler" #: src/wavbreaker.c:2292 src/wavbreaker.c:2318 msgid "Text files" msgstr "Ficheiros de texto" #: src/wavbreaker.c:2294 src/wavbreaker.c:2322 msgid "TOC files" msgstr "Ficheiros TOC" #: src/wavbreaker.c:2296 src/wavbreaker.c:2326 msgid "CUE files" msgstr "Ficheiros CUE" #: src/wavbreaker.c:2329 msgid "Export track breaks to file" msgstr "Exportar as separações de pista num ficheiro" #: src/wavbreaker.c:2380 msgid "Import track breaks from file" msgstr "Importar as separações de pista dum ficheiro" #: src/wavbreaker.c:2397 src/wavbreaker.c:2402 msgid "Import failed" msgstr "A importação falhou" #: src/wavbreaker.c:2397 msgid "There has been an error importing track breaks from the TOC file." msgstr "Ocorreu um erro ao importar as marcas de separação do ficheiro TOC." #: src/wavbreaker.c:2402 msgid "There has been an error importing track breaks from the CUE file." msgstr "Ocorreu um erro ao importar as marcas de separação do ficheiro CUE." #: src/wavbreaker.c:2585 msgid "Time offset:" msgstr "Salto temporal :" #: src/wavbreaker.c:2721 msgid "Open file" msgstr "Abrir um Ficheiro" #: src/wavbreaker.c:2726 msgid "Open menu" msgstr "Abrir o menu" #: src/wavbreaker.c:2734 msgid "Display moodbar" msgstr "Mostrar a barra de ambiente sonoro" #: src/wavbreaker.c:2735 msgid "Generate moodbar" msgstr "Criar a barra de ambiente sonoro" #: src/wavbreaker.c:2740 msgid "Import track breaks" msgstr "Importar as separações de pistas" #: src/wavbreaker.c:2741 msgid "Export track breaks" msgstr "Exportar as separações de pistas" #: src/wavbreaker.c:2753 msgid "About" msgstr "Acerca de" #: src/wavbreaker.c:2762 msgid "Save file parts" msgstr "Gravar as peças do ficheiro" #: src/wavbreaker.c:2858 msgid "Toggle playback" msgstr "Ler/parar" #: src/wavbreaker.c:2863 msgid "Cursor position:" msgstr "Posição do cursor:" #: src/wavbreaker.c:2880 msgid "Seek to previous silence" msgstr "Ir ao silêncio anterior" #: src/wavbreaker.c:2887 msgid "Jump to time" msgstr "Saltar até ao tempo" #: src/wavbreaker.c:2899 msgid "Seek to next silence" msgstr "Ir ao silêncio seguinte" #: src/wavbreaker.c:2909 msgid "Auto-split by interval" msgstr "Separação automática por intervalo" #: src/wavbreaker.c:3048 src/wavbreaker.c:3070 msgid "Export failed" msgstr "A exportação falhou" #: src/wavbreaker.c:3048 msgid "There has been an error exporting track breaks to the TOC file." msgstr "Ocorreu um erro ao exportar as marcas de separação no ficheiro TOC." #: src/wavbreaker.c:3070 msgid "Unrecognised export type" msgstr "Tipo de exportação desconhecida" #~ msgid "Disable audio output" #~ msgstr "Desativar a saída áudio " #~ msgid "wavbreaker Preferences" #~ msgstr "Preferências do wavbreaker" #~ msgid "Audio Device" #~ msgstr "Dispositivo Ãudio" #~ msgid "Audio Device:" #~ msgstr "Dispositivo Ãudio:" #~ msgid "Output device:" #~ msgstr "Dispositivo de saída:" #~ msgid "Enter the time for autosplit:" #~ msgstr "Escreva o tempo para o corte automático:" #~ msgid "Example (5min, 32sec, 12subsec):" #~ msgstr "Exemplo (5min, 32sec, 12subsec):" #~ msgid "Add wave files to this list and click on \"Merge\"." #~ msgstr "Adicione ficheiros wave nesta lista e carregue em \"Colar\"." #~ msgid "Stop" #~ msgstr "Parar" #~ msgid "Play" #~ msgstr "Ouvir" #~ msgid "Select name for TOC file to export" #~ msgstr "Seleccionar o nome do ficheiro TOC a exportar" #~ msgid "TOC export successful" #~ msgstr "Exporte do TOC conseguido" #~ msgid "" #~ "The track breaks have been exported to a TOC file that can be used to " #~ "burn a CD from the wave file." #~ msgstr "" #~ "As marcas de separação foram exportadas no ficheiro TOC que pode servir " #~ "para gravar um CD a partir do ficheiro." #~ msgid "Load track breaks from file" #~ msgstr "Carregar as separações de pista num ficheiro" #~ msgid "Load track breaks from TOC file" #~ msgstr "Carregar as separações de pista de um ficheiro TOC" #~ msgid "Open a wave file" #~ msgstr "Abrir um ficheiro wave" #~ msgid "Save track breaks" #~ msgstr "Gravar as separações de pista" #~ msgid "Save to..." #~ msgstr "Gravar sob..." #~ msgid "Save track breaks to folder" #~ msgstr "Gravar as separações de pista na pasta" #~ msgid "Configure wavbreaker" #~ msgstr "Configurar wavbreaker" #~ msgid "Merge wave files together" #~ msgstr "Colar ficheiros wave juntos" #~ msgid "Quit" #~ msgstr "Sair" #~ msgid "Close wavbreaker" #~ msgstr "Fechar wavbreaker" #~ msgid "Display toolbar" #~ msgstr "Mostrar a barra de ferramentas" #~ msgid "Show or hide the main window toolbar" #~ msgstr "Mostra ou esconde a barra de ferramentas" #~ msgid "Draw moodbar over the waveform graph" #~ msgstr "" #~ "Desenha a barra de ambiente sonoro por cima do gráfico da forma sonora" #~ msgid "Add track break at cursor position" #~ msgstr "Adicionar uma separação de pista na posição do cursor" #~ msgid "Remove selected track break" #~ msgstr "Remover a separação de pista seleccionada" #~ msgid "Set cursor position to track break" #~ msgstr "Define a posição do cursor na separação de pista" #~ msgid "Set view to cursor marker" #~ msgstr "Define a vista no marcador do cursor" #~ msgid "Automatically rename all track breaks" #~ msgstr "Mudar automáticamente o nome de todas as partes" #~ msgid "Generate moodbar data" #~ msgstr "" #~ "Calcula os dados necessários para mostrar a barra de ambiente sonoro" #~ msgid "Split into chunks with specified size" #~ msgstr "Dividir em partes de tamanho indicado" #~ msgid "Export to TOC" #~ msgstr "Exportar para um TOC" #~ msgid "Export to CD-ROM TOC file for burning" #~ msgstr "Exportar para um ficheiro TOC de CD ROM para gravação" #~ msgid "_Import from TOC" #~ msgstr "_Importar de um TOC" #~ msgid "_Save offsets to text file" #~ msgstr "_Gravar as separações de pista num ficheiro de texto" #~ msgid "Save track breaks to text file" #~ msgstr "Gravar as separações de pista num ficheiro de texto" #~ msgid "_Load offsets from text file" #~ msgstr "_Carregar as separações de pista num ficheiro de texto" #~ msgid "Load track breaks from text file" #~ msgstr "Carregar as separações de pista num ficheiro de texto" #~ msgid "Start/Stop playback of media" #~ msgstr "Iniciar/Parar a reprodução" #~ msgid "Jump to previous silent frame" #~ msgstr "Saltar até à zona silenciosa anterior" #~ msgid "Show information about " #~ msgstr "Mostrar as informações acerca do wavbreaker" #~ msgid "_File" #~ msgstr "_Ficheiro" #~ msgid "_Edit" #~ msgstr "_Editar" #~ msgid "_View" #~ msgstr "_Ver" #~ msgid "_Help" #~ msgstr "_Ajuda" #~ msgid "Add" #~ msgstr "Adicionar" #~ msgid "Auto-Rename" #~ msgstr "Mudar automaticamente o nome" wavbreaker-0.16/po/update-potfiles.sh000077500000000000000000000001521435035650500176570ustar00rootroot00000000000000#!/bin/sh grep "_(" ../src/*.[ch] | cut -d ':' -f 1 | sort -u | sed -e 's/..\///' > POTFILES cat POTFILES wavbreaker-0.16/po/wavbreaker.pot000066400000000000000000000221071435035650500170740ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the wavbreaker package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: wavbreaker\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-15 20:23+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/about.c:29 msgid "Split a wave file into multiple chunks" msgstr "" #: src/appconfig.c:370 msgid "Select Output Directory" msgstr "" #: src/appconfig.c:372 msgid "Cancel" msgstr "" #: src/appconfig.c:373 msgid "Open" msgstr "" #: src/appconfig.c:419 src/wavbreaker.c:2749 msgid "Preferences" msgstr "" #: src/appconfig.c:439 msgid "General" msgstr "" #: src/appconfig.c:441 msgid "Save output files in folder:" msgstr "" #: src/appconfig.c:454 msgid "Browse" msgstr "" #: src/appconfig.c:464 msgid "Maximum volume considered silence (in percent):" msgstr "" #: src/appconfig.c:478 msgid "File Naming" msgstr "" #: src/appconfig.c:480 msgid "Standard (##)" msgstr "" #: src/appconfig.c:485 msgid "Separator:" msgstr "" #: src/appconfig.c:502 msgid "Prepend number before filename" msgstr "" #: src/appconfig.c:509 msgid "etree.org (d#t##)" msgstr "" #: src/appconfig.c:512 msgid "CD Length:" msgstr "" #: src/autosplit.c:76 msgid "Interval (MM:SS.FF, MM:SS, SS.FF or MM):" msgstr "" #: src/autosplit.c:87 msgid "Split" msgstr "" #: src/guimerge.c:96 src/guimerge.c:188 src/wavbreaker.c:1447 #: src/wavbreaker.c:2371 msgid "All files" msgstr "" #: src/guimerge.c:100 src/guimerge.c:192 src/wavbreaker.c:1451 #: src/wavbreaker.c:2375 msgid "Supported files" msgstr "" #: src/guimerge.c:103 msgid "Select filename for merged wave file" msgstr "" #: src/guimerge.c:106 src/guimerge.c:197 src/moodbar.c:110 src/saveas.c:52 #: src/wavbreaker.c:1461 src/wavbreaker.c:2331 src/wavbreaker.c:2382 msgid "_Cancel" msgstr "" #: src/guimerge.c:107 src/saveas.c:53 src/wavbreaker.c:2332 msgid "_Save" msgstr "" #: src/guimerge.c:116 msgid "Open file in wavbreaker after merge" msgstr "" #: src/guimerge.c:160 msgid "Wrong file format - skipping file" msgstr "" #: src/guimerge.c:195 msgid "Add wave file to merge" msgstr "" #: src/guimerge.c:198 src/wavbreaker.c:1462 src/wavbreaker.c:2383 msgid "_Open" msgstr "" #: src/guimerge.c:272 src/wavbreaker.c:2745 msgid "Merge wave files" msgstr "" #: src/guimerge.c:309 src/wavbreaker.c:473 msgid "File Name" msgstr "" #: src/guimerge.c:320 msgid "Length" msgstr "" #: src/guimerge.c:333 msgid "_Add" msgstr "" #: src/guimerge.c:337 msgid "_Remove" msgstr "" #: src/guimerge.c:344 msgid "Merge" msgstr "" #: src/guimerge.c:379 msgid "Merging wave files" msgstr "" #: src/guimerge.c:389 msgid "The selected files are now being merged. This can take some time." msgstr "" #: src/guimerge.c:411 src/wavbreaker.c:1167 msgid "Operation successful" msgstr "" #: src/guimerge.c:411 msgid "The files have been merged." msgstr "" #: src/guimerge.c:418 #, c-format msgid "Adding %s" msgstr "" #: src/guimerge.c:434 #, c-format msgid "%d of %d files merged" msgstr "" #: src/guimerge.c:436 #, c-format msgid "%d of 1 file merged" msgstr "" #: src/moodbar.c:100 src/moodbar.c:116 msgid "Generating moodbar" msgstr "" #: src/moodbar.c:106 msgid "_Hide window" msgstr "" #: src/moodbar.c:115 msgid "" "The moodbar tool analyzes your audio file and generates a colorful " "representation of the audio data." msgstr "" #: src/moodbar.c:136 msgid "Cannot launch \"moodbar\"" msgstr "" #: src/moodbar.c:136 msgid "" "wavbreaker could not launch the moodbar application, which is needed to " "generate the moodbar. You can download the moodbar package from:\n" "\n" " http://amarok.kde.org/wiki/Moodbar" msgstr "" #: src/overwritedialog.c:98 #, c-format msgid "" "%s already exists.\n" "\n" "Do you want to overwrite the existing file?" msgstr "" #: src/overwritedialog.c:105 msgid "Overwrite all files" msgstr "" #: src/overwritedialog.c:118 msgid "_No" msgstr "" #: src/overwritedialog.c:123 msgid "_Yes" msgstr "" #: src/reallyquit.c:28 msgid "Quit wavbreaker?" msgstr "" #: src/reallyquit.c:29 msgid "If you quit wavbreaker now, any unsaved chunks will be lost." msgstr "" #: src/sample.c:455 msgid "Open as RAW audio" msgstr "" #: src/sample.c:456 msgid "" "The file you selected does not contain a wave header. wavbreaker can " "interpret the file as \"Signed 16 bit, 44100 Hz, Stereo\" audio. Choose the " "byte order for the RAW audio or cancel to abort." msgstr "" #: src/sample.c:464 msgid "Big endian" msgstr "" #: src/sample.c:465 msgid "Little endian" msgstr "" #: src/sample.c:571 #, c-format msgid "Error opening %s: %s" msgstr "" #: src/saveas.c:49 msgid "Select folder to save wave files" msgstr "" #: src/wav.c:35 msgid "" "Error reading chunk. Maybe the wave file you are trying to load is truncated?" msgstr "" #: src/wav.c:85 #, c-format msgid "Cannot open %s: %s" msgstr "" #: src/wav.c:92 msgid "Cannot read wave header." msgstr "" #: src/wav.c:98 #, c-format msgid "%s is not a wave file." msgstr "" #: src/wav.c:139 src/wav.c:192 src/wav.c:213 #, c-format msgid "Error seeking to %u in %s: %s" msgstr "" #: src/wav.c:162 #, c-format msgid "Error reading format chunk: %s" msgstr "" #: src/wav.c:178 msgid "Loading compressed wave data is not supported." msgstr "" #: src/wavbreaker.c:462 msgid "Write" msgstr "" #: src/wavbreaker.c:491 msgid "Time" msgstr "" #: src/wavbreaker.c:502 msgid "Duration" msgstr "" #: src/wavbreaker.c:512 msgid "Offset" msgstr "" #: src/wavbreaker.c:553 msgid "Check all" msgstr "" #: src/wavbreaker.c:554 msgid "Check none" msgstr "" #: src/wavbreaker.c:555 msgid "Invert check" msgstr "" #: src/wavbreaker.c:559 msgid "Auto-rename track breaks" msgstr "" #: src/wavbreaker.c:563 src/wavbreaker.c:2020 msgid "Remove track break" msgstr "" #: src/wavbreaker.c:564 msgid "Jump to track break" msgstr "" #: src/wavbreaker.c:1128 msgid "Splitting wave file" msgstr "" #: src/wavbreaker.c:1139 msgid "" "The selected track breaks are now written to disk. This can take some time." msgstr "" #: src/wavbreaker.c:1163 #, c-format msgid "The file %s has been split into %d parts." msgstr "" #: src/wavbreaker.c:1165 #, c-format msgid "The file %s has been split into one part." msgstr "" #: src/wavbreaker.c:1182 #, c-format msgid "Writing %s" msgstr "" #: src/wavbreaker.c:1199 #, c-format msgid "%d of %d parts written" msgstr "" #: src/wavbreaker.c:1201 #, c-format msgid "%d of 1 part written" msgstr "" #: src/wavbreaker.c:1274 msgid "Analyzing waveform" msgstr "" #: src/wavbreaker.c:1286 msgid "" "The waveform data of the selected file is being analyzed and processed. This " "can take some time." msgstr "" #: src/wavbreaker.c:1294 #, c-format msgid "Analyzing %s" msgstr "" #: src/wavbreaker.c:1352 #, c-format msgid "%d of %d MB analyzed" msgstr "" #: src/wavbreaker.c:1363 msgid "Error opening file" msgstr "" #: src/wavbreaker.c:1459 msgid "Open File" msgstr "" #: src/wavbreaker.c:2019 msgid "Add track break" msgstr "" #: src/wavbreaker.c:2021 msgid "Jump to cursor marker" msgstr "" #: src/wavbreaker.c:2121 #, c-format msgid "Cursor" msgstr "" #: src/wavbreaker.c:2128 msgid "Playing" msgstr "" #: src/wavbreaker.c:2292 src/wavbreaker.c:2318 msgid "Text files" msgstr "" #: src/wavbreaker.c:2294 src/wavbreaker.c:2322 msgid "TOC files" msgstr "" #: src/wavbreaker.c:2296 src/wavbreaker.c:2326 msgid "CUE files" msgstr "" #: src/wavbreaker.c:2329 msgid "Export track breaks to file" msgstr "" #: src/wavbreaker.c:2380 msgid "Import track breaks from file" msgstr "" #: src/wavbreaker.c:2397 src/wavbreaker.c:2402 msgid "Import failed" msgstr "" #: src/wavbreaker.c:2397 msgid "There has been an error importing track breaks from the TOC file." msgstr "" #: src/wavbreaker.c:2402 msgid "There has been an error importing track breaks from the CUE file." msgstr "" #: src/wavbreaker.c:2585 msgid "Time offset:" msgstr "" #: src/wavbreaker.c:2721 msgid "Open file" msgstr "" #: src/wavbreaker.c:2726 msgid "Open menu" msgstr "" #: src/wavbreaker.c:2734 msgid "Display moodbar" msgstr "" #: src/wavbreaker.c:2735 msgid "Generate moodbar" msgstr "" #: src/wavbreaker.c:2740 msgid "Import track breaks" msgstr "" #: src/wavbreaker.c:2741 msgid "Export track breaks" msgstr "" #: src/wavbreaker.c:2753 msgid "About" msgstr "" #: src/wavbreaker.c:2762 msgid "Save file parts" msgstr "" #: src/wavbreaker.c:2858 msgid "Toggle playback" msgstr "" #: src/wavbreaker.c:2863 msgid "Cursor position:" msgstr "" #: src/wavbreaker.c:2880 msgid "Seek to previous silence" msgstr "" #: src/wavbreaker.c:2887 msgid "Jump to time" msgstr "" #: src/wavbreaker.c:2899 msgid "Seek to next silence" msgstr "" #: src/wavbreaker.c:2909 msgid "Auto-split by interval" msgstr "" #: src/wavbreaker.c:3048 src/wavbreaker.c:3070 msgid "Export failed" msgstr "" #: src/wavbreaker.c:3048 msgid "There has been an error exporting track breaks to the TOC file." msgstr "" #: src/wavbreaker.c:3070 msgid "Unrecognised export type" msgstr "" wavbreaker-0.16/scripts/000077500000000000000000000000001435035650500152665ustar00rootroot00000000000000wavbreaker-0.16/scripts/build.sh000077500000000000000000000026661435035650500167360ustar00rootroot00000000000000#!/bin/bash DOCFILES="AUTHORS CONTRIBUTORS COPYING README.md CHANGELOG.md" VERSION=$(sed -n "s/^ version : '\(.*\)',/\1/p" meson.build) USAGE="Usage: $0 " if [ $# -eq 0 ]; then echo "$USAGE" exit 1 fi set -e -x case "$1" in linux) meson linux_build DESTDIR="$(pwd)/wavbreaker-$VERSION-linux/" ninja -C linux_build install -v mkdir -p dist zip -r "dist/wavbreaker-$VERSION-linux.zip" "wavbreaker-$VERSION-linux" $DOCFILES ;; windows) docker build -t wavbreaker-win32-build scripts/win32 sh scripts/win32/run-build.sh rm -rf "wavbreaker-$VERSION-win32" mv wavbreaker-win32 "wavbreaker-$VERSION-win32" mkdir -p dist zip -r "dist/wavbreaker-$VERSION-win32.zip" "wavbreaker-$VERSION-win32" $DOCFILES ;; flatpak) docker build -t wavbreaker-flatpak-build scripts/flatpak sh scripts/flatpak/package.sh ;; snap) snapcraft mkdir -p dist mv wavbreaker_*.snap dist/ ;; macos) meson --prefix=/Applications/wavbreaker.app \ --bindir=Contents/MacOS \ -Dmacos_app=true \ macos_build DESTDIR=$(pwd)/ ninja -C macos_build install -v mkdir -p dist zip -r "dist/wavbreaker-$VERSION-macos.zip" Applications $DOCFILES ;; *) echo "$USAGE" exit 1 ;; esac wavbreaker-0.16/scripts/flatpak/000077500000000000000000000000001435035650500167105ustar00rootroot00000000000000wavbreaker-0.16/scripts/flatpak/Dockerfile000066400000000000000000000005331435035650500207030ustar00rootroot00000000000000FROM ubuntu:rolling RUN mkdir /build WORKDIR /build RUN apt-get update RUN DEBIAN_FRONTEND=noninteractive apt-get install -y flatpak-builder RUN flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo RUN flatpak install -y org.freedesktop.Sdk//20.08 RUN flatpak install -y org.freedesktop.Platform//20.08 wavbreaker-0.16/scripts/flatpak/build-image.sh000066400000000000000000000000651435035650500214240ustar00rootroot00000000000000#!/bin/sh docker build -t wavbreaker-flatpak-build . wavbreaker-0.16/scripts/flatpak/net.sourceforge.wavbreaker.json000066400000000000000000000015241435035650500250450ustar00rootroot00000000000000{ "app-id": "net.sourceforge.wavbreaker", "runtime": "org.freedesktop.Platform", "runtime-version": "20.08", "sdk": "org.freedesktop.Sdk", "command": "wavbreaker", "modules": [ { "name": "libao", "buildsystem": "autotools", "sources": [ { "type": "git", "url": "https://github.com/xiph/libao.git" } ] }, { "name": "wavbreaker", "buildsystem": "meson", "sources": [ { "type": "dir", "path": "../.." } ] } ], "finish-args": [ "--socket=wayland", "--socket=fallback-x11", "--socket=pulseaudio", "--filesystem=home" ] } wavbreaker-0.16/scripts/flatpak/package.sh000066400000000000000000000010721435035650500206370ustar00rootroot00000000000000#!/bin/sh set -e -x VERSION=$(sed -n "s/^ version : '\(.*\)',/\1/p" meson.build) docker run --privileged -v "$(pwd):/build" wavbreaker-flatpak-build \ flatpak-builder \ --verbose --verbose \ --disable-rofiles-fuse \ --force-clean \ --repo=flatpak_repo \ flatpak_build \ scripts/flatpak/net.sourceforge.wavbreaker.json mkdir -p dist docker run --privileged -v "$(pwd):/build" wavbreaker-flatpak-build \ flatpak build-bundle \ --verbose \ flatpak_repo \ "dist/wavbreaker-$VERSION.flatpak" \ net.sourceforge.wavbreaker wavbreaker-0.16/scripts/win32/000077500000000000000000000000001435035650500162305ustar00rootroot00000000000000wavbreaker-0.16/scripts/win32/Dockerfile000066400000000000000000000030571435035650500202270ustar00rootroot00000000000000FROM fedora:latest RUN mkdir /build WORKDIR /build RUN dnf -y install make mingw32-gcc mingw64-gtk3 diffutils findutils automake autoconf meson gettext libtool git wget bzip2 xz RUN git clone https://github.com/xiph/libao.git && \ cd libao && \ git checkout 1.2.2 && \ ./autogen.sh && \ env LIBS="-lksuser -lwinmm" ./configure \ --build=x86_64-pc-linux-gnu \ --host=x86_64-w64-mingw32 \ --enable-shared --disable-pulse --enable-wmm \ --prefix=/usr/x86_64-w64-mingw32/sys-root/mingw/ && \ make install V=1 RUN wget https://www.mpg123.de/download/mpg123-1.29.3.tar.bz2 && \ tar xvf mpg123-1.29.3.tar.bz2 && \ cd mpg123-1.29.3 && \ ./configure \ --build=x86_64-pc-linux-gnu \ --host=x86_64-w64-mingw32 \ --enable-shared \ --prefix=/usr/x86_64-w64-mingw32/sys-root/mingw/ && \ make install V=1 RUN wget https://downloads.xiph.org/releases/ogg/libogg-1.3.5.tar.xz && \ tar xvf libogg-1.3.5.tar.xz && \ cd libogg-1.3.5 && \ ./configure \ --build=x86_64-pc-linux-gnu \ --host=x86_64-w64-mingw32 \ --enable-shared \ --prefix=/usr/x86_64-w64-mingw32/sys-root/mingw/ && \ make install V=1 RUN wget https://downloads.xiph.org/releases/vorbis/libvorbis-1.3.7.tar.xz && \ tar xvf libvorbis-1.3.7.tar.xz && \ cd libvorbis-1.3.7 && \ ./configure \ --build=x86_64-pc-linux-gnu \ --host=x86_64-w64-mingw32 \ --enable-shared \ --prefix=/usr/x86_64-w64-mingw32/sys-root/mingw/ && \ make install V=1 wavbreaker-0.16/scripts/win32/build-image.sh000066400000000000000000000000631435035650500207420ustar00rootroot00000000000000#!/bin/sh docker build -t wavbreaker-win32-build . wavbreaker-0.16/scripts/win32/iconlist.txt000066400000000000000000000007761435035650500206270ustar00rootroot00000000000000bookmark-new-symbolic document-open-recent-symbolic document-open-symbolic document-save-as-symbolic drive-* edit-cut-symbolic folder* inode-directory* list-add-symbolic list-remove-symbolic media-*-symbolic open-menu-symbolic package-x-generic pan-down-symbolic.symbolic pan-end-symbolic.symbolic pan-start-symbolic.symbolic preferences-system-time-symbolic user-* window-close-symbolic.symbolic window-maximize-symbolic.symbolic window-minimize-symbolic.symbolic window-restore-symbolic.symbolic *-x-generic wavbreaker-0.16/scripts/win32/linux-mingw-w64-64bit.txt000066400000000000000000000012221435035650500226100ustar00rootroot00000000000000[binaries] c = '/usr/bin/x86_64-w64-mingw32-gcc' cpp = '/usr/bin/x86_64-w64-mingw32-g++' ar = '/usr/bin/x86_64-w64-mingw32-ar' strip = '/usr/bin/x86_64-w64-mingw32-strip' pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config' windres = '/usr/bin/x86_64-w64-mingw32-windres' exe_wrapper = 'wine64' [properties] # Directory that contains 'bin', 'lib', etc root = '/usr/x86_64-w64-mingw32' # Directory that contains 'bin', 'lib', etc for the toolchain and system libraries # 2019-11-16: Modified by thp: Needed to set this to / to get include paths to work sys_root = '/' [host_machine] system = 'windows' cpu_family = 'x86_64' cpu = 'x86_64' endian = 'little' wavbreaker-0.16/scripts/win32/mingw-bundledlls000077500000000000000000000120571435035650500214320ustar00rootroot00000000000000#!/usr/bin/env python3 # Upstream: https://github.com/mpreisler/mingw-bundledlls # The MIT License (MIT) # # Copyright (c) 2015 Martin Preisler # # 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. import subprocess import os.path import argparse import shutil # The mingw path matches where Fedora 21 installs mingw32; this is the default # fallback if no other search path is specified in $MINGW_BUNDLEDLLS_SEARCH_PATH DEFAULT_PATH_PREFIXES = [ "", "/usr/bin", "/usr/i686-w64-mingw32/sys-root/mingw/bin", "/mingw64/bin", "/usr/i686-w64-mingw32/sys-root/mingw/lib", "C:\\msys64\\mingw64\\bin" ] env_path_prefixes = os.environ.get('MINGW_BUNDLEDLLS_SEARCH_PATH', None) if env_path_prefixes is not None: path_prefixes = [path for path in env_path_prefixes.split(os.pathsep) if path] else: path_prefixes = DEFAULT_PATH_PREFIXES # This blacklist may need extending blacklist = [ "advapi32.dll", "kernel32.dll", "msvcrt.dll", "ole32.dll", "user32.dll", "ws2_32.dll", "comdlg32.dll", "gdi32.dll", "imm32.dll", "oleaut32.dll", "shell32.dll", "winmm.dll", "winspool.drv", "wldap32.dll", "ntdll.dll", "d3d9.dll", "mpr.dll", "crypt32.dll", "dnsapi.dll", "shlwapi.dll", "version.dll", "iphlpapi.dll", "msimg32.dll", "setupapi.dll", "opengl32.dll", "dwmapi.dll", "uxtheme.dll", "secur32.dll", "gdiplus.dll", "usp10.dll", "comctl32.dll", "wsock32.dll", "netapi32.dll", "userenv.dll", "hid.dll", "avicap32.dll", "avrt.dll", "psapi.dll", "mswsock.dll", "glu32.dll" ] def find_full_path(filename, path_prefixes): for path_prefix in path_prefixes: path = os.path.join(path_prefix, filename) path_low = os.path.join(path_prefix, filename.lower()) if os.path.exists(path): return path if os.path.exists(path_low): return path_low else: raise RuntimeError( "Can't find " + filename + ". If it is an inbuilt Windows DLL, " "please add it to the blacklist variable in the script and send " "a pull request!" ) def gather_deps(path, path_prefixes, seen): ret = [path] output = subprocess.check_output(["objdump", "-p", path]).decode( "utf-8", "replace").split("\n") for line in output: if not line.startswith("\tDLL Name: "): continue dep = line.split("DLL Name: ")[1].strip() ldep = dep.lower() if ldep in blacklist: continue if ldep in seen: continue dep_path = find_full_path(dep, path_prefixes) seen.add(ldep) subdeps = gather_deps(dep_path, path_prefixes, seen) ret.extend(subdeps) return ret def main(): parser = argparse.ArgumentParser() parser.add_argument( "exe_file", help="EXE or DLL file that you need to bundle dependencies for" ) parser.add_argument( "--copy", action="store_true", help="In addition to printing out the dependencies, also copy them next to the exe_file" ) parser.add_argument( "--upx", action="store_true", help="Only valid if --copy is provided. Run UPX on all the DLLs and EXE." ) args = parser.parse_args() if args.upx and not args.copy: raise RuntimeError("Can't run UPX if --copy hasn't been provided.") all_deps = set(gather_deps(args.exe_file, path_prefixes, set())) all_deps.remove(args.exe_file) print("\n".join(all_deps)) if args.copy: print("Copying enabled, will now copy all dependencies next to the exe_file.\n") parent_dir = os.path.dirname(os.path.abspath(args.exe_file)) for dep in all_deps: target = os.path.join(parent_dir, os.path.basename(dep)) try: print("Copying '%s' to '%s'" % (dep, target)) shutil.copy(dep, parent_dir) except shutil.SameFileError: print("Dependency '%s' was already in target directory, " "skipping..." % (dep)) if args.upx: subprocess.call(["upx", target]) if __name__ == "__main__": main() wavbreaker-0.16/scripts/win32/run-build-inside.sh000066400000000000000000000020241435035650500217340ustar00rootroot00000000000000#!/bin/sh SYSROOT=/usr/x86_64-w64-mingw32/sys-root/mingw/ OUT=wavbreaker-win32 meson win32_build \ --prefix / \ --cross-file scripts/win32/linux-mingw-w64-64bit.txt \ -Dbindir=/ \ -Dwindows_app=true \ -Dmoodbar=false DESTDIR=/build/$OUT/ ninja -C /build/win32_build/ install -v MINGW_BUNDLEDLLS_SEARCH_PATH=$SYSROOT/bin \ scripts/win32/mingw-bundledlls --copy $OUT/wavbreaker.exe mkdir -p $OUT/share/glib-2.0/ cp -rpv $SYSROOT/share/glib-2.0/schemas $OUT/share/glib-2.0/ mkdir -p $OUT/share/icons/{Adwaita,hicolor} cp $SYSROOT/share/icons/Adwaita/index.theme $OUT/share/icons/Adwaita sed -e 's/Adwaita/hicolor/' $OUT/share/icons/Adwaita/index.theme \ >$OUT/share/icons/hicolor/index.theme cd $SYSROOT/share/icons/Adwaita/ cat /build/scripts/win32/iconlist.txt | while read iconfile; do for filename in `find . -name "${iconfile}.*"`; do dest=`dirname $filename` mkdir -p /build/$OUT/share/icons/Adwaita/$dest cp -v $filename /build/$OUT/share/icons/Adwaita/$filename done done wavbreaker-0.16/scripts/win32/run-build.sh000066400000000000000000000001621435035650500204640ustar00rootroot00000000000000#!/bin/bash docker run -v "$(pwd):/build" wavbreaker-win32-build \ sh -e -x scripts/win32/run-build-inside.sh wavbreaker-0.16/snap/000077500000000000000000000000001435035650500145405ustar00rootroot00000000000000wavbreaker-0.16/snap/snapcraft.yaml000066400000000000000000000034731435035650500174140ustar00rootroot00000000000000name: wavbreaker title: wavbreaker icon: data/net.sourceforge.wavbreaker.svg grade: stable license: GPL-2.0 version: '0.14' summary: GUI tool to split WAV and MP3 files description: | This application's purpose in life is to take a WAV file and break it up into multiple WAV files. It makes a clean break at the correct position to burn the files to an Audio CD without any dead air between the tracks. confinement: devmode base: core18 parts: wavbreaker: override-pull: | snapcraftctl pull # Point icon to the correct location sed -i.bak -e 's|Icon=net.sourceforge.wavbreaker|Icon=/usr/share/icons/hicolor/scalable/apps/net.sourceforge.wavbreaker.svg|g' data/net.sourceforge.wavbreaker.desktop plugin: meson source-type: local source: . # ??? https://forum.snapcraft.io/t/gtk3-applications/13483 meson-parameters: ["--prefix=/usr"] build-packages: - meson - ninja-build - libao-dev - libmpg123-dev stage-packages: - libao4 - libmpg123-0 slots: wavbreaker-slot: interface: dbus bus: session name: net.sourceforge.wavbreaker apps: wavbreaker: command: usr/bin/wavbreaker extensions: [gnome-3-28] # cargo-culted from https://forum.snapcraft.io/t/snap-issues-with-gtk/5120/2 plugs: - gsettings - home - x11 - wayland # let it run on wayland, because it's gtk3 so it should be fine - desktop # needed for a lot of gtk3 and glib interaction with the host system - desktop-legacy # needed for accessibility tools IIRC - network-bind slots: - wavbreaker-slot desktop: usr/share/applications/net.sourceforge.wavbreaker.desktop wavbreaker-0.16/src/000077500000000000000000000000001435035650500143665ustar00rootroot00000000000000wavbreaker-0.16/src/about.c000066400000000000000000000025201435035650500156430ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include "appinfo.h" void about_show(GtkWidget *main_window) { gtk_show_about_dialog(GTK_WINDOW(main_window), "name", PACKAGE, "version", appinfo_version(), "copyright", appinfo_copyright(), "comments", appinfo_description(), "website", appinfo_url(), "website-label", appinfo_url(), "authors", appinfo_authors(), "logo-icon-name", "net.sourceforge.wavbreaker", NULL); } wavbreaker-0.16/src/about.h000066400000000000000000000016261435035650500156560ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 ABOUT_H #define ABOUT_H void about_show(GtkWidget *); #endif /* ABOUT_H */ wavbreaker-0.16/src/aoaudio.c000066400000000000000000000035211435035650500161540ustar00rootroot00000000000000/* * libao output module for wavbreaker * Copyright (C) 2015 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include #include "aoaudio.h" static ao_device *device; void ao_audio_close_device() { if (device) { ao_close(device); device = NULL; ao_shutdown(); } } int ao_audio_write(unsigned char *devbuf, int size) { if (device) { if (ao_play(device, (char *)devbuf, size) == 0) { fprintf(stderr, "Error in ao_play()\n"); return -1; } return 0; } return -1; } int ao_audio_open_device(SampleInfo *sampleInfo) { int default_driver; ao_sample_format format; ao_initialize(); default_driver = ao_default_driver_id(); memset(&format, 0, sizeof(format)); format.bits = sampleInfo->bitsPerSample; format.channels = sampleInfo->channels; format.rate = sampleInfo->samplesPerSec; format.byte_format = AO_FMT_LITTLE; device = ao_open_live(default_driver, &format, NULL); if (device == NULL) { fprintf(stderr, "Cannot open default libao device\n"); return -1; } return 0; } wavbreaker-0.16/src/aoaudio.h000066400000000000000000000017431435035650500161650ustar00rootroot00000000000000/* * libao output module for wavbreaker * Copyright (C) 2015 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 AOAUDIO_H #define AOAUDIO_H #include "sample_info.h" void ao_audio_close_device(); int ao_audio_open_device(SampleInfo *); int ao_audio_write(unsigned char *, int); #endif /* AOAUDIO_H */ wavbreaker-0.16/src/appconfig.c000066400000000000000000000223501435035650500165020ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2004 Timothy Robinson * Copyright (C) 2007 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include "appconfig.h" #include "sample_info.h" #include "gettext.h" #include #include #include #include static int config_file_version = 2; /* Output directory for wave files. */ static int use_outputdir = 0; static char *outputdir = NULL; /* Etree filename suffix */ /* Filename suffix (not extension) for wave files. */ static int use_etree_filename_suffix = 0; static char *etree_filename_suffix = NULL; /* Prepend File Number for wave files. */ static int prepend_file_number = 0; /* CD Length disc cutoff. */ static char *etree_cd_length = NULL; /* Config Filename */ static char *config_filename = NULL; /* Window and pane sizes. */ static int main_window_xpos = -1; static int main_window_ypos = -1; static int main_window_width = -1; static int main_window_height = -1; static int vpane1_position = -1; static int vpane2_position = -1; /* Percentage for silence detection */ static int silence_percentage = 2; /* Draw moodbar in main window */ static int show_moodbar = 1; /* function prototypes */ static int appconfig_read_file(); static void default_all_strings(); int appconfig_get_config_file_version() { return config_file_version; } void appconfig_set_config_file_version(int x) { config_file_version = x; } int appconfig_get_main_window_xpos() { return main_window_xpos; } void appconfig_set_main_window_xpos(int x) { main_window_xpos = x; } int appconfig_get_main_window_ypos() { return main_window_ypos; } void appconfig_set_main_window_ypos(int x) { main_window_ypos = x; } int appconfig_get_main_window_width() { return main_window_width; } void appconfig_set_main_window_width(int x) { main_window_width = x; } int appconfig_get_main_window_height() { return main_window_height; } void appconfig_set_main_window_height(int x) { main_window_height = x; } int appconfig_get_vpane1_position() { return vpane1_position; } void appconfig_set_vpane1_position(int x) { vpane1_position = x; } int appconfig_get_vpane2_position() { return vpane2_position; } void appconfig_set_vpane2_position(int x) { vpane2_position = x; } int appconfig_get_silence_percentage() { return silence_percentage; } void appconfig_set_silence_percentage(int x) { silence_percentage = x; } int appconfig_get_show_moodbar() { return show_moodbar; } void appconfig_set_show_moodbar(int x) { show_moodbar = x; } int appconfig_get_use_outputdir() { return use_outputdir; } void appconfig_set_use_outputdir(int x) { use_outputdir = x; } char *appconfig_get_outputdir() { return outputdir; } void appconfig_set_outputdir(const char *val) { if (outputdir != NULL) { g_free(outputdir); } outputdir = g_strdup(val); } int appconfig_get_use_etree_filename_suffix() { return use_etree_filename_suffix; } void appconfig_set_use_etree_filename_suffix(int x) { use_etree_filename_suffix = x; } char *appconfig_get_etree_filename_suffix() { return etree_filename_suffix; } void appconfig_set_etree_filename_suffix(const char *val) { if (etree_filename_suffix != NULL) { g_free(etree_filename_suffix); } etree_filename_suffix = g_strdup(val); } int appconfig_get_prepend_file_number() { return prepend_file_number; } void appconfig_set_prepend_file_number(int x) { prepend_file_number = x; } char *appconfig_get_etree_cd_length() { return etree_cd_length; } void appconfig_set_etree_cd_length(const char *val) { if (etree_cd_length != NULL) { g_free(etree_cd_length); } etree_cd_length = g_strdup(val); } char *get_config_filename() { return config_filename; } void set_config_filename(const char *val) { if (config_filename != NULL) { g_free(config_filename); } config_filename = g_strdup(val); } enum ConfigOptionType { INVALID = 0, STRING, INTEGER, BOOLEAN, }; typedef struct ConfigOption_ ConfigOption; struct ConfigOption_ { const char *key; enum ConfigOptionType type; void *setter; void *getter; } config_options[] = { #define OPTION(name, type) { #name, type, appconfig_set_ ## name, appconfig_get_ ## name } OPTION(config_file_version, INTEGER), OPTION(use_outputdir, BOOLEAN), OPTION(outputdir, STRING), OPTION(use_etree_filename_suffix, BOOLEAN), OPTION(etree_filename_suffix, STRING), OPTION(etree_cd_length, STRING), OPTION(prepend_file_number, BOOLEAN), OPTION(main_window_xpos, INTEGER), OPTION(main_window_ypos, INTEGER), OPTION(main_window_width, INTEGER), OPTION(main_window_height, INTEGER), OPTION(vpane1_position, INTEGER), OPTION(vpane2_position, INTEGER), OPTION(silence_percentage, INTEGER), OPTION(show_moodbar, BOOLEAN), #undef OPTION { NULL, INVALID, NULL, NULL }, }; void config_option_set_string(ConfigOption *option, gchar *value) { ((void (*)(const char *))(option->setter))(value); g_free(value); } void config_option_set_integer(ConfigOption *option, int value) { ((void (*)(int))(option->setter))(value); } const char *config_option_get_string(ConfigOption *option) { return ((const char *(*)())(option->getter))(); } int config_option_get_integer(ConfigOption *option) { return ((int (*)())(option->getter))(); } static int appconfig_read_file() { GKeyFile *keyfile = g_key_file_new(); if (!g_key_file_load_from_file(keyfile, config_filename, G_KEY_FILE_NONE, NULL)) { g_key_file_free(keyfile); return 0; } ConfigOption *option = config_options; for (option=config_options; option->key; option++) { switch (option->type) { case INTEGER: config_option_set_integer(option, g_key_file_get_integer(keyfile, "wavbreaker", option->key, NULL)); break; case BOOLEAN: config_option_set_integer(option, g_key_file_get_boolean(keyfile, "wavbreaker", option->key, NULL)); break; case STRING: config_option_set_string(option, g_key_file_get_string(keyfile, "wavbreaker", option->key, NULL)); break; default: g_warning("Invalid option type: %d\n", option->type); break; } } g_key_file_free(keyfile); return 1; } void appconfig_write_file() { GKeyFile *keyfile = g_key_file_new(); g_key_file_load_from_file(keyfile, config_filename, G_KEY_FILE_KEEP_COMMENTS, NULL); ConfigOption *option = config_options; for (option=config_options; option->key; option++) { switch (option->type) { case INTEGER: g_key_file_set_integer(keyfile, "wavbreaker", option->key, config_option_get_integer(option)); break; case BOOLEAN: g_key_file_set_boolean(keyfile, "wavbreaker", option->key, config_option_get_integer(option)); break; case STRING: g_key_file_set_string(keyfile, "wavbreaker", option->key, config_option_get_string(option)); break; default: g_warning("Invalid option type: %d\n", option->type); break; } } if (!g_key_file_save_to_file(keyfile, config_filename, NULL)) { g_warning("Could not save settings"); } g_key_file_free(keyfile); } void appconfig_init() { gchar *config_filename = g_build_path("/", g_get_user_config_dir(), "wavbreaker", "wavbreaker.conf", NULL); set_config_filename(config_filename); gchar *config_dir = g_path_get_dirname(config_filename); if (g_mkdir_with_parents(config_dir, 0700) != 0) { g_warning("Could not create configuration directory: %s", config_dir); } g_free(config_dir); g_free(config_filename); if (!appconfig_read_file()) { default_all_strings(); appconfig_write_file(); } else { default_all_strings(); } } void default_all_strings() { /* default any values that where not in the config file */ if (appconfig_get_outputdir() == NULL) { outputdir = g_strdup(getenv("PWD")); } if (appconfig_get_etree_filename_suffix() == NULL) { etree_filename_suffix = g_strdup("-"); } if (appconfig_get_etree_cd_length() == NULL) { etree_cd_length = g_strdup("80"); } } wavbreaker-0.16/src/appconfig.h000066400000000000000000000042371435035650500165130ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2005 Timothy Robinson * Copyright (C) 2007 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 APPCONFIG_H #define APPCONFIG_H #include void appconfig_write_file(); void appconfig_init(); int appconfig_get_use_outputdir(); void appconfig_set_use_outputdir(int x); char *appconfig_get_outputdir(); void appconfig_set_outputdir(const char *val); int appconfig_get_use_etree_filename_suffix(); void appconfig_set_use_etree_filename_suffix(int x); int appconfig_get_prepend_file_number(); void appconfig_set_prepend_file_number(int x); char *appconfig_get_etree_filename_suffix(); void appconfig_set_etree_filename_suffix(const char *val); char *appconfig_get_etree_cd_length(); void appconfig_set_etree_cd_length(const char *val); int appconfig_get_main_window_xpos(); void appconfig_set_main_window_xpos(int x); int appconfig_get_main_window_ypos(); void appconfig_set_main_window_ypos(int x); int appconfig_get_main_window_width(); void appconfig_set_main_window_width(int x); int appconfig_get_main_window_height(); void appconfig_set_main_window_height(int x); int appconfig_get_vpane1_position(); void appconfig_set_vpane1_position(int x); int appconfig_get_vpane2_position(); void appconfig_set_vpane2_position(int x); int appconfig_get_silence_percentage(); void appconfig_set_silence_percentage(int x); int appconfig_get_show_moodbar(); void appconfig_set_show_moodbar(int x); #endif /* APPCONFIG_H */ wavbreaker-0.16/src/appconfig_gtk.c000066400000000000000000000271501435035650500173520ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2004 Timothy Robinson * Copyright (C) 2007 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include "appconfig.h" #include "appconfig_gtk.h" #include "sample_info.h" #include "popupmessage.h" #include "wavbreaker.h" #include "gettext.h" #include #include #include #include #include static GtkWidget *window; static gboolean loading_ui = FALSE; /* Output directory for wave files. */ static GtkWidget *use_outputdir_toggle = NULL; static GtkWidget *outputdir_entry = NULL; static GtkWidget *browse_button = NULL; /* Etree filename suffix */ /* Filename suffix (not extension) for wave files. */ static GtkWidget *etree_filename_suffix_label = NULL; static GtkWidget *etree_filename_suffix_entry = NULL; /* Radio buttons */ static GtkWidget *radio1 = NULL; static GtkWidget *radio2 = NULL; /* Prepend File Number for wave files. */ static GtkWidget *prepend_file_number_toggle = NULL; /* CD Length disc cutoff. */ static GtkWidget *etree_cd_length_label = NULL; static GtkWidget *etree_cd_length_entry = NULL; static GtkWidget *silence_spin_button = NULL; /* Forward declarations */ static void open_select_outputdir(); static void use_outputdir_toggled(GtkWidget *widget, gpointer user_data) { if (loading_ui) { return; } if (appconfig_get_use_outputdir()) { // disable the output dir widget gtk_widget_set_sensitive(outputdir_entry, FALSE); gtk_widget_set_sensitive(browse_button, FALSE); appconfig_set_use_outputdir(0); } else { // enable the output dir widget gtk_widget_set_sensitive(outputdir_entry, TRUE); gtk_widget_set_sensitive(browse_button, TRUE); appconfig_set_use_outputdir(1); } } static void use_etree_filename_suffix_toggled(GtkWidget *widget, gpointer user_data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { appconfig_set_use_etree_filename_suffix(1); } else { appconfig_set_use_etree_filename_suffix(0); } } static void radio_buttons_toggled(GtkWidget *widget, gpointer user_data) { if (loading_ui) { return; } if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio1)) == TRUE) { gtk_widget_set_sensitive( prepend_file_number_toggle, TRUE); gtk_widget_set_sensitive( etree_filename_suffix_entry, TRUE); gtk_widget_set_sensitive( etree_filename_suffix_label, TRUE); gtk_widget_set_sensitive( etree_cd_length_entry, FALSE); gtk_widget_set_sensitive( etree_cd_length_label, FALSE); } else { gtk_widget_set_sensitive( prepend_file_number_toggle, FALSE); gtk_widget_set_sensitive( etree_filename_suffix_entry, FALSE); gtk_widget_set_sensitive( etree_filename_suffix_label, FALSE); gtk_widget_set_sensitive( etree_cd_length_entry, TRUE); gtk_widget_set_sensitive( etree_cd_length_label, TRUE); } } static void prepend_file_number_toggled(GtkWidget *widget, gpointer user_data) { if (loading_ui) { return; } if (appconfig_get_prepend_file_number()) { appconfig_set_prepend_file_number(0); } else { appconfig_set_prepend_file_number(1); } } static void appconfig_hide(GtkWidget *main_window) { gtk_widget_destroy(main_window); } static void browse_button_clicked(GtkWidget *widget, gpointer user_data) { open_select_outputdir(); } static void open_select_outputdir() { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new(_("Select Output Directory"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("Cancel"), GTK_RESPONSE_CANCEL, _("Open"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), gtk_entry_get_text(GTK_ENTRY(outputdir_entry))); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); gtk_entry_set_text(GTK_ENTRY(outputdir_entry), filename); g_free(filename); } gtk_widget_destroy(dialog); } static void on_appconfig_close(GtkWidget *widget, GdkEvent *event, gpointer user_data) { appconfig_set_outputdir(gtk_entry_get_text(GTK_ENTRY(outputdir_entry))); appconfig_set_etree_filename_suffix(gtk_entry_get_text(GTK_ENTRY(etree_filename_suffix_entry))); appconfig_set_etree_cd_length(gtk_entry_get_text(GTK_ENTRY(etree_cd_length_entry))); appconfig_set_silence_percentage( gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(silence_spin_button))); wavbreaker_update_listmodel(); appconfig_hide(GTK_WIDGET(user_data)); appconfig_write_file(); } void appconfig_show(GtkWidget *main_window) { GtkWidget *vbox; GtkWidget *grid; GtkWidget *label; GtkWidget *stack; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_modal(GTK_WINDOW(window), TRUE); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(main_window)); gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ON_PARENT); GtkWidget *header_bar = gtk_header_bar_new(); gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header_bar), TRUE); gtk_header_bar_set_title(GTK_HEADER_BAR(header_bar), _("Preferences")); gtk_window_set_titlebar(GTK_WINDOW(window), header_bar); /* create the vbox for the first tab */ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_container_add( GTK_CONTAINER(window), vbox); stack = gtk_stack_new(); gtk_container_add(GTK_CONTAINER(vbox), stack); GtkWidget *stack_switcher = gtk_stack_switcher_new(); gtk_stack_switcher_set_stack(GTK_STACK_SWITCHER(stack_switcher), GTK_STACK(stack)); gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header_bar), stack_switcher); /* Selectable Output Directory */ grid = gtk_grid_new(); gtk_container_set_border_width(GTK_CONTAINER(grid), 10); gtk_grid_set_row_spacing(GTK_GRID(grid), 5); gtk_grid_set_column_spacing(GTK_GRID(grid), 5); gtk_stack_add_titled(GTK_STACK(stack), grid, "general", _("General")); use_outputdir_toggle = gtk_check_button_new_with_label(_("Save output files in folder:")); gtk_grid_attach(GTK_GRID(grid), use_outputdir_toggle, 0, 0, 2, 1); g_signal_connect(G_OBJECT(use_outputdir_toggle), "toggled", G_CALLBACK(use_outputdir_toggled), NULL); outputdir_entry = gtk_entry_new(); g_object_set(outputdir_entry, "hexpand", TRUE, NULL); gtk_entry_set_text(GTK_ENTRY(outputdir_entry), appconfig_get_outputdir()); gtk_entry_set_width_chars(GTK_ENTRY(outputdir_entry), 40); gtk_grid_attach(GTK_GRID(grid), outputdir_entry, 0, 1, 1, 1); browse_button = gtk_button_new_with_label(_("Browse")); gtk_grid_attach(GTK_GRID(grid), browse_button, 1, 1, 1, 1); g_signal_connect(G_OBJECT(browse_button), "clicked", (GCallback)browse_button_clicked, window); silence_spin_button = (GtkWidget*)gtk_spin_button_new_with_range( 1.0, 100.0, 1.0); gtk_spin_button_set_digits( GTK_SPIN_BUTTON(silence_spin_button), 0); gtk_spin_button_set_value( GTK_SPIN_BUTTON(silence_spin_button), appconfig_get_silence_percentage()); label = gtk_label_new( _("Maximum volume considered silence (in percent):")); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_grid_attach(GTK_GRID(grid), label, 0, 2, 1, 1); gtk_grid_attach(GTK_GRID(grid), silence_spin_button, 1, 2, 1, 1); /* Etree Filename Suffix */ grid = gtk_grid_new(); gtk_container_set_border_width(GTK_CONTAINER(grid), 10); gtk_grid_set_row_spacing(GTK_GRID(grid), 5); gtk_grid_set_column_spacing(GTK_GRID(grid), 5); gtk_stack_add_titled(GTK_STACK(stack), grid, "naming", _("File Naming")); radio1 = gtk_radio_button_new_with_label(NULL, _("Standard (##)")); gtk_grid_attach(GTK_GRID(grid), radio1, 0, 0, 3, 1); g_signal_connect(G_OBJECT(radio1), "toggled", G_CALLBACK(radio_buttons_toggled), NULL); etree_filename_suffix_label = gtk_label_new(_("Separator:")); g_object_set(G_OBJECT(etree_filename_suffix_label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_grid_attach(GTK_GRID(grid), etree_filename_suffix_label, 1, 1, 1, 1); etree_filename_suffix_entry = gtk_entry_new(); g_object_set(etree_filename_suffix_entry, "hexpand", TRUE, NULL); gtk_entry_set_text(GTK_ENTRY(etree_filename_suffix_entry), appconfig_get_etree_filename_suffix()); gtk_entry_set_width_chars(GTK_ENTRY(etree_filename_suffix_entry), 10); gtk_grid_attach(GTK_GRID(grid), etree_filename_suffix_entry, 2, 1, 1, 1); label = gtk_label_new(" "); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_grid_attach(GTK_GRID(grid), label, 0, 2, 1, 1); prepend_file_number_toggle = gtk_check_button_new_with_label(_("Prepend number before filename")); gtk_grid_attach(GTK_GRID(grid), prepend_file_number_toggle, 1, 2, 2, 1); g_signal_connect(G_OBJECT(prepend_file_number_toggle), "toggled", G_CALLBACK(prepend_file_number_toggled), NULL); radio2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio1), _("etree.org (d#t##)")); gtk_grid_attach(GTK_GRID(grid), radio2, 0, 3, 3, 1); etree_cd_length_label = gtk_label_new(_("CD Length:")); g_object_set(G_OBJECT(etree_cd_length_label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_grid_attach(GTK_GRID(grid), etree_cd_length_label, 1, 4, 1, 1); etree_cd_length_entry = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(etree_cd_length_entry), appconfig_get_etree_cd_length()); gtk_entry_set_width_chars(GTK_ENTRY(etree_cd_length_entry), 10); gtk_grid_attach(GTK_GRID(grid), etree_cd_length_entry, 2, 4, 1, 1); g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(on_appconfig_close), window); g_signal_connect(G_OBJECT(radio2), "toggled", G_CALLBACK(use_etree_filename_suffix_toggled), NULL); loading_ui = TRUE; gboolean use_output_dir = appconfig_get_use_outputdir() ? TRUE : FALSE; gtk_widget_set_sensitive(outputdir_entry, use_output_dir); gtk_widget_set_sensitive(browse_button, use_output_dir); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_outputdir_toggle), use_output_dir); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prepend_file_number_toggle), appconfig_get_prepend_file_number() ? TRUE : FALSE); gboolean use_etree = appconfig_get_use_etree_filename_suffix() ? TRUE : FALSE; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio1), !use_etree); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio2), use_etree); loading_ui = FALSE; gtk_widget_show_all(window); radio_buttons_toggled( NULL, NULL); } wavbreaker-0.16/src/appconfig_gtk.h000066400000000000000000000017011435035650500173510ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2005 Timothy Robinson * Copyright (C) 2007 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include "appconfig.h" #include void appconfig_show(GtkWidget *); wavbreaker-0.16/src/appinfo.c000066400000000000000000000027311435035650500161710ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "appinfo.h" #include #include "gettext.h" const char * appinfo_copyright() { return "Copyright (C) 2002-2007 Timothy Robinson\n" "Copyright (C) 2006-2008, 2012, 2015-2016, 2018-2019, 2022 Thomas Perl"; } const char * appinfo_description() { return _("Split a wave file into multiple chunks"); } const char * appinfo_url() { return "https://wavbreaker.sourceforge.io/"; } const char ** appinfo_authors() { static const char *AUTHORS[] = { "Timothy Robinson ", "Thomas Perl ", NULL, }; return AUTHORS; } const char * appinfo_version() { return VERSION; } wavbreaker-0.16/src/appinfo.h000066400000000000000000000017531435035650500162010ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once const char * appinfo_copyright(); const char * appinfo_description(); const char * appinfo_url(); const char ** appinfo_authors(); const char * appinfo_version(); wavbreaker-0.16/src/autosplit.c000066400000000000000000000062721435035650500165650ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2004 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "autosplit.h" #include #include #include #include "sample_info.h" #include "wavbreaker.h" #include "gettext.h" static long parse_time_string(const char *autosplit_time) { long min, sec, subsec; if (sscanf(autosplit_time, "%ld:%ld.%ld", &min, &sec, &subsec) == 3) { return (min * 60 + sec) * CD_BLOCKS_PER_SEC + subsec; } else if (sscanf(autosplit_time, "%ld:%ld", &min, &sec) == 2) { return (min * 60 + sec) * CD_BLOCKS_PER_SEC; } else if (sscanf(autosplit_time, "%ld.%ld", &sec, &subsec) == 2) { return sec * CD_BLOCKS_PER_SEC + subsec; } return atoi(autosplit_time) * 60 * CD_BLOCKS_PER_SEC; } static void on_split_button_clicked(GtkWidget *widget, gpointer user_data) { GtkEntry *entry = GTK_ENTRY(user_data); GtkPopover *popover = GTK_POPOVER(g_object_get_data(G_OBJECT(entry), "popover")); gtk_popover_popdown(popover); long time = parse_time_string(gtk_entry_get_text(entry)); if (time > 0) { wavbreaker_autosplit(time); long subsec = time % CD_BLOCKS_PER_SEC; time -= subsec; time /= CD_BLOCKS_PER_SEC; long sec = time % 60; time -= sec; time /= 60; gchar *tmp = g_strdup_printf("%02ld:%02ld.%02ld", time, sec, subsec); gtk_entry_set_text(entry, tmp); g_free(tmp); } } GtkWidget * autosplit_create(GtkPopover *popover) { GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); GtkWidget *message_label = gtk_label_new(_("Interval (MM:SS.FF, MM:SS, SS.FF or MM):")); gtk_box_pack_start(GTK_BOX(hbox), message_label, FALSE, FALSE, 0); GtkWidget *autosplit_time_entry = gtk_entry_new(); g_object_set_data(G_OBJECT(autosplit_time_entry), "popover", popover); g_signal_connect(autosplit_time_entry, "activate", G_CALLBACK(on_split_button_clicked), autosplit_time_entry); gtk_entry_set_text(GTK_ENTRY(autosplit_time_entry), "5:00.00"); gtk_entry_set_width_chars(GTK_ENTRY(autosplit_time_entry), 10); gtk_box_pack_start(GTK_BOX(hbox), autosplit_time_entry, FALSE, FALSE, 0); GtkWidget *ok_button = gtk_button_new_with_label(_("Split")); g_signal_connect(G_OBJECT(ok_button), "clicked", G_CALLBACK(on_split_button_clicked), autosplit_time_entry); gtk_box_pack_start(GTK_BOX(hbox), ok_button, FALSE, FALSE, 0); gtk_widget_show_all(hbox); return hbox; } wavbreaker-0.16/src/autosplit.h000066400000000000000000000016271435035650500165710ustar00rootroot00000000000000#pragma once /* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2003 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include GtkWidget *autosplit_create(GtkPopover *popover); wavbreaker-0.16/src/cli.c000066400000000000000000000255261435035650500153130ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "config.h" #include "track_break.h" #include "list.h" #include "appconfig.h" #include "appinfo.h" #include "sample.h" #include "format.h" #include static void cmd_list_print_track_break(int index, gboolean write, gulong start_offset, gulong end_offset, const gchar *filename, void *user_data) { gchar *time = track_break_format_timestamp(start_offset, FALSE); if (end_offset == (gulong)-1) { printf("%2d. [%c] %10s - %10s \"%s\"\n", index + 1, write ? 'x' : '_', time, "(end)", filename); } else { gchar *duration = track_break_format_timestamp(end_offset - start_offset, FALSE); gchar *end = track_break_format_timestamp(end_offset, FALSE); printf("%2d. [%c] %10s - %10s \"%s\" (duration: %s)\n", index + 1, write ? 'x' : '_', time, end, filename, duration); g_free(end); g_free(duration); } g_free(time); } static int cmd_list(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s [filename.txt|filename.cue|filename.toc] ...\n", argv[0]); return 1; } for (int i=1; imutex); finished->finished = TRUE; g_cond_signal(&finished->cond); g_mutex_unlock(&finished->mutex); } static gboolean split_is_cancelled(void *user_data) { // TODO: Support proper cancellation using Ctrl+C / signal handling return FALSE; } static enum OverwriteDecision split_ask_overwrite(const char *filename, void *user_data) { char answer = 0; while (answer != 'y' && answer != 'n' && answer != 'a' && answer != 's') { printf("\r\033[KFile '%s' exist, overwrite? ([y]es/[n]no/[a]ll/[s]kip all) ", filename); fflush(stdout); scanf("%c", &answer); } if (answer == 'y') { return OVERWRITE_DECISION_OVERWRITE; } else if (answer == 'n') { return OVERWRITE_DECISION_SKIP; } else if (answer == 'a') { return OVERWRITE_DECISION_OVERWRITE_ALL; } else { return OVERWRITE_DECISION_SKIP_ALL; } } static int cmd_split(int argc, char *argv[]) { if (argc != 4) { printf("Usage: %s [audio_file.wav] [track_breaks.txt] [output_folder]\n", argv[0]); return 1; } int exitcode = 0; const char *audio_filename = argv[1]; const char *list_filename = argv[2]; const char *output_folder = argv[3]; sample_init(); if (!g_file_test(output_folder, G_FILE_TEST_IS_DIR)) { printf("Directory does not exist: '%s'\n", output_folder); return 4; } printf("Using audio file: %s\n", audio_filename); char *error_message = NULL; Sample *sample = sample_open(audio_filename, &error_message); if (sample == NULL) { printf("Could not open %s: %s\n", argv[1], error_message); g_free(error_message); return 2; } sample_print_file_info(sample); printf("Scanning audio file...\n"); do { g_usleep(G_USEC_PER_SEC / 10); } while (!sample_is_loaded(sample)); printf("File analyzed, %lu blocks\n", sample_get_num_sample_blocks(sample)); TrackBreakList *list = track_break_list_new(sample_get_basename_without_extension(sample)); track_break_list_set_total_duration(list, sample_get_num_sample_blocks(sample)); printf("Using track break list: %s\n", list_filename); if (list_read_file(list_filename, list)) { printf("Track breaks:\n"); track_break_list_foreach(list, cmd_list_print_track_break, NULL); printf("\n"); printf("Using output folder: %s\n", output_folder); struct SplitFinished split_finished; g_mutex_init(&split_finished.mutex); g_cond_init(&split_finished.cond); split_finished.finished = FALSE; WriteStatusCallbacks write_status_callbacks = { .on_file_changed = split_on_file_changed, .on_file_progress_changed = split_on_file_progress_changed, .on_error = split_on_error, .on_finished = split_on_finished, .is_cancelled = split_is_cancelled, .ask_overwrite = split_ask_overwrite, .user_data = &split_finished, }; sample_write_files(sample, list, &write_status_callbacks, output_folder); g_mutex_lock(&split_finished.mutex); while (!split_finished.finished) { g_cond_wait(&split_finished.cond, &split_finished.mutex); } g_mutex_unlock(&split_finished.mutex); g_mutex_clear(&split_finished.mutex); g_cond_clear(&split_finished.cond); } else { printf("Could not open/parse %s\n", list_filename); exitcode = 3; } track_break_list_free(list); sample_close(sample); return exitcode; } static int cmd_version(int argc, char *argv[]) { printf("wavcli %s -- %s\n%s\n", appinfo_version(), appinfo_url(), appinfo_copyright()); printf("\n== Supported file formats ==\n\n"); format_init(); format_print_supported(); return 0; } int cmd_wavgen(int argc, char *argv[]); int cmd_wavinfo(int argc, char *argv[]); int cmd_wavmerge(int argc, char *argv[]); struct SubCommand { const char *name; int (*main)(int, char *[]); const char *help; }; int main(int argc, char *argv[]) { g_set_prgname(argv[0]); appconfig_init(); static const struct SubCommand SUBCOMMANDS[] = { { "list", cmd_list, "List track breaks from file (TXT/CUE/TOC)" }, { "analyze", cmd_analyze, "Open, analyze and preview audio file" }, { "split", cmd_split, "Split an audio file using a track break list to a folder" }, { "gen", cmd_wavgen, "Generate example WAV files (formerly 'wavgen')" }, { "info", cmd_wavinfo, "Print audio format information (WAV/MP2/MP3/OGG) (formerly 'wavinfo')" }, { "merge", cmd_wavmerge, "Merge multiple WAV files into a single file (formerly 'wavmerge')" }, { "version", cmd_version, "Print version and software information" }, { NULL, NULL, NULL }, }; gchar *argv0; if (argc > 1) { const struct SubCommand *cur = &SUBCOMMANDS[0]; while (cur->name != NULL) { if (strcmp(argv[1], cur->name) == 0) { argv0 = g_strdup_printf("%s %s", argv[0], argv[1]); argv[1] = argv0; ++argv; --argc; int res = cur->main(argc, argv); g_free(argv0); return res; } ++cur; } } printf("Usage: %s SUBCOMMAND \n\n", argv[0]); printf("wavcli(1) is the command-line interface for wavbreaker(1).\n\n"); printf("Valid SUBCOMMANDs are:\n\n"); const struct SubCommand *cur = &SUBCOMMANDS[0]; while (cur->name != NULL) { printf(" %-10s ..... %s\n", cur->name, cur->help); ++cur; } printf("\n"); return 1; } wavbreaker-0.16/src/cue.c000066400000000000000000000056161435035650500153160ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2005 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "cue.h" #include "track_break.h" #include #include gboolean cue_read_file(const char *cue_filename, TrackBreakList *list) { FILE *fp; /* These buffers must have the same length */ char line_buf[1024]; char buf[1024]; int next_track = 1; fp = fopen(cue_filename, "r"); if (!fp) { return FALSE; } track_break_list_clear(list); /* Read the first line: FILE "foo.wav" WAVE */ if (!fgets(line_buf, sizeof(line_buf), fp)) { fclose(fp); return FALSE; } /* Check that it starts with FILE and ends with WAVE */ if (sscanf(line_buf, "FILE %s WAVE", buf) != 1) { goto error; } while (!feof(fp)) { int N; int read; guint offset; read = fscanf(fp, "TRACK %02d AUDIO\n", &N); if (feof(fp)) { break; } if (read != 1 || N != next_track) { goto error; } if (!fgets(line_buf, sizeof(line_buf), fp)) { goto error; } read = sscanf(line_buf, "INDEX %02d %s", &N, buf); if (read != 2 || N != 1) { goto error; } offset = msf_time_to_offset(buf); track_break_list_add_offset(list, TRUE, offset, NULL); ++next_track; } return TRUE; error: fclose(fp); return FALSE; } static void track_break_write_cue(int index, gboolean write, gulong start_offset, gulong end_offset, const gchar *filename, void *user_data) { FILE *fp = user_data; gchar *time = track_break_format_timestamp(start_offset, TRUE); fprintf(fp, "TRACK %02d AUDIO\n", index + 1); fprintf(fp, "INDEX 01 %s\n", time); g_free(time); } gboolean cue_write_file(const char *cue_filename, const char *audio_filename, TrackBreakList *list) { FILE *fp = fopen(cue_filename, "w"); if (!fp) { g_warning("Error opening %s.", cue_filename); return FALSE; } fprintf(fp, "FILE \"%s\" WAVE\n", audio_filename); track_break_list_foreach(list, track_break_write_cue, fp); fclose(fp); return TRUE; } wavbreaker-0.16/src/cue.h000066400000000000000000000021151435035650500153120ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2005 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 CUE_H #define CUE_H #include #include "track_break.h" gboolean cue_read_file(const char *cue_filename, TrackBreakList *list); gboolean cue_write_file(const char *cue_filename, const char *audio_filename, TrackBreakList *list); #endif /* CUE_H */ wavbreaker-0.16/src/draw.c000066400000000000000000000267711435035650500155040ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002-2005 Timothy Robinson * Copyright (C) 2007-2019 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include "draw.h" static void draw_sample_surface(struct WaveformSurface *self, struct WaveformSurfaceDrawContext *ctx); static void draw_summary_surface(struct WaveformSurface *self, struct WaveformSurfaceDrawContext *ctx); /** * Generated using the following Python 3 snippet (with some editing): * * import colorsys * for i in range(6): * print(' { %3d, %3d, %3d, },' % tuple(int(x*255) * for x in colorsys.hsv_to_rgb(i/8., 0.8, 0.8))) **/ const unsigned char SAMPLE_COLORS_VALUES[][3] = { { 204, 40, 40, }, { 204, 163, 40, }, { 122, 204, 40, }, { 40, 81, 204, }, { 40, 204, 204, }, }; #define SAMPLE_COLORS G_N_ELEMENTS(SAMPLE_COLORS_VALUES) #define SAMPLE_SHADES 3 GdkRGBA sample_colors[SAMPLE_COLORS][SAMPLE_SHADES]; GdkRGBA bg_color; GdkRGBA nowrite_color; static inline void set_cairo_source(cairo_t *cr, GdkRGBA color) { cairo_set_source_rgb(cr, color.red, color.green, color.blue); } static inline void fill_cairo_rectangle(cairo_t *cr, GdkRGBA *color, int width, int height) { set_cairo_source(cr, *color); cairo_rectangle(cr, 0.f, 0.f, (float)width, (float)height); cairo_fill(cr); } static inline void draw_cairo_line(cairo_t *cr, float x, float y0, float y1) { cairo_move_to(cr, x-0.5f, y0); cairo_line_to(cr, x-0.5f, y1); } static void waveform_surface_static_init() { static gboolean inited = FALSE; if (inited) { return; } bg_color = (GdkRGBA){ .red = 1.f, .green = 1.f, .blue = 1.f }; nowrite_color = (GdkRGBA){ .red = 0.86f, .green = 0.86f, .blue = 0.86f }; for (int i=0; idraw = draw_sample_surface; return surface; } struct WaveformSurface *waveform_surface_create_summary() { waveform_surface_static_init(); struct WaveformSurface *surface = calloc(sizeof(struct WaveformSurface), 1); surface->draw = draw_summary_surface; return surface; } void waveform_surface_draw(struct WaveformSurface *surface, struct WaveformSurfaceDrawContext *ctx) { surface->draw(surface, ctx); } void waveform_surface_invalidate(struct WaveformSurface *surface) { if (surface->surface) { cairo_surface_destroy(surface->surface); surface->surface = NULL; } surface->width = 0; surface->height = 0; } void waveform_surface_free(struct WaveformSurface *surface) { if (surface->surface) { cairo_surface_destroy(surface->surface); } free(surface); } static GdkRGBA moodbar_sample_color(MoodbarData *moodbar, float position) { float index = position * moodbar->numFrames; unsigned long iindex = index; float fractional = index - iindex; if (fractional == 0.f || iindex >= moodbar->numFrames - 1) { return moodbar->frames[iindex]; } else { GdkRGBA a = moodbar->frames[iindex]; GdkRGBA b = moodbar->frames[iindex+1]; return (GdkRGBA){ .red = (1.f - fractional) * a.red + fractional * b.red, .green = (1.f - fractional) * a.green + fractional * b.green, .blue = (1.f - fractional) * a.blue + fractional * b.blue, .alpha = (1.f - fractional) * a.alpha + fractional * b.alpha, }; } } static void draw_sample_surface(struct WaveformSurface *self, struct WaveformSurfaceDrawContext *ctx) { int xaxis; int width, height; int y_min, y_max; int scale; long i; int shade; GdkRGBA new_color; { GtkAllocation allocation; gtk_widget_get_allocation(ctx->widget, &allocation); width = allocation.width; height = allocation.height; } if (self->surface != NULL && self->width == width && self->height == height && self->offset == ctx->pixmap_offset && (ctx->moodbarData && ctx->moodbarData->numFrames) == self->moodbar) { return; } if (self->surface) { cairo_surface_destroy(self->surface); } self->surface = gdk_window_create_similar_surface(gtk_widget_get_window(ctx->widget), CAIRO_CONTENT_COLOR, width, height); if (!self->surface) { printf("surface is NULL\n"); return; } cairo_t *cr = cairo_create(self->surface); cairo_set_line_width(cr, 1.f); /* clear sample_surface before drawing */ fill_cairo_rectangle(cr, &bg_color, width, height); if (ctx->graphData == NULL || ctx->graphData->data == NULL) { cairo_destroy(cr); return; } xaxis = height / 2; if (xaxis != 0) { scale = ctx->graphData->maxSampleValue / xaxis; if (scale == 0) { scale = 1; } } else { scale = 1; } /* draw sample graph */ int tb_index = 0; GList *tbl = ctx->list->breaks; for (i = 0; i < width && i < ctx->graphData->numSamples; i++) { y_min = ctx->graphData->data[i + ctx->pixmap_offset].min; y_max = ctx->graphData->data[i + ctx->pixmap_offset].max; y_min = xaxis + fabs((double)y_min) / scale; y_max = xaxis - y_max / scale; /* find the track break we are drawing now */ while (tbl->next && (i + ctx->pixmap_offset) > ((TrackBreak *)(tbl->next->data))->offset) { tbl = tbl->next; ++tb_index; } if (ctx->moodbarData && ctx->moodbarData->numFrames) { set_cairo_source(cr, moodbar_sample_color(ctx->moodbarData, (float)(i+ctx->pixmap_offset) / (float)ctx->graphData->numSamples)); draw_cairo_line(cr, i, 0.f, height); cairo_stroke(cr); } for( shade=0; shadedata; if (tb->write) { new_color = sample_colors[tb_index % SAMPLE_COLORS][shade]; } else { new_color = nowrite_color; } set_cairo_source(cr, new_color); draw_cairo_line(cr, i, y_min+(xaxis-y_min)*shade/SAMPLE_SHADES, y_min+(xaxis-y_min)*(shade+1)/SAMPLE_SHADES); draw_cairo_line(cr, i, y_max-(y_max-xaxis)*shade/SAMPLE_SHADES, y_max-(y_max-xaxis)*(shade+1)/SAMPLE_SHADES); cairo_stroke(cr); } } cairo_destroy(cr); self->width = width; self->height = height; self->offset = ctx->pixmap_offset; self->moodbar = ctx->moodbarData && ctx->moodbarData->numFrames; } static void draw_summary_surface(struct WaveformSurface *self, struct WaveformSurfaceDrawContext *ctx) { int xaxis; int width, height; int y_min, y_max; int min, max; int scale; int i, k; int loop_end, array_offset; int shade; float x_scale; GdkRGBA new_color; { GtkAllocation allocation; gtk_widget_get_allocation(ctx->widget, &allocation); width = allocation.width; height = allocation.height; } if (self->surface != NULL && self->width == width && self->height == height && (ctx->moodbarData && ctx->moodbarData->numFrames) == self->moodbar) { return; } if (self->surface) { cairo_surface_destroy(self->surface); } self->surface = gdk_window_create_similar_surface(gtk_widget_get_window(ctx->widget), CAIRO_CONTENT_COLOR, width, height); if (!self->surface) { printf("summary_surface is NULL\n"); return; } cairo_t *cr = cairo_create(self->surface); cairo_set_line_width(cr, 1.f); /* clear sample_surface before drawing */ fill_cairo_rectangle(cr, &bg_color, width, height); if (ctx->graphData == NULL || ctx->graphData->data == NULL) { cairo_destroy(cr); return; } xaxis = height / 2; if (xaxis != 0) { scale = ctx->graphData->maxSampleValue / xaxis; if (scale == 0) { scale = 1; } } else { scale = 1; } /* draw sample graph */ x_scale = (float)(ctx->graphData->numSamples) / (float)(width); if (x_scale == 0) { x_scale = 1; } int tb_index = 0; GList *tbl = ctx->list->breaks; for (i = 0; i < width && i < ctx->graphData->numSamples; i++) { min = max = 0; array_offset = (int)(i * x_scale); if (x_scale != 1) { loop_end = (int)x_scale; for (k = 0; k < loop_end; k++) { if (ctx->graphData->data[array_offset + k].max > max) { max = ctx->graphData->data[array_offset + k].max; } else if (ctx->graphData->data[array_offset + k].min < min) { min = ctx->graphData->data[array_offset + k].min; } } } else { min = ctx->graphData->data[i].min; max = ctx->graphData->data[i].max; } y_min = min; y_max = max; y_min = xaxis + fabs((double)y_min) / scale; y_max = xaxis - y_max / scale; /* find the track break we are drawing now */ while (tbl->next && array_offset > ((TrackBreak *)(tbl->next->data))->offset) { tbl = tbl->next; ++tb_index; } if (ctx->moodbarData && ctx->moodbarData->numFrames) { set_cairo_source(cr, moodbar_sample_color(ctx->moodbarData, (float)(array_offset) / (float)(ctx->graphData->numSamples))); draw_cairo_line(cr, i, 0.f, height); cairo_stroke(cr); } for( shade=0; shadedata; if (tb->write) { new_color = sample_colors[tb_index % SAMPLE_COLORS][shade]; } else { new_color = nowrite_color; } cairo_set_source_rgb(cr, new_color.red, new_color.green, new_color.blue); draw_cairo_line(cr, i, y_min+(xaxis-y_min)*shade/SAMPLE_SHADES, y_min+(xaxis-y_min)*(shade+1)/SAMPLE_SHADES); draw_cairo_line(cr, i, y_max-(y_max-xaxis)*shade/SAMPLE_SHADES, y_max-(y_max-xaxis)*(shade+1)/SAMPLE_SHADES); cairo_stroke(cr); } } cairo_destroy(cr); self->width = width; self->height = height; self->moodbar = ctx->moodbarData && ctx->moodbarData->numFrames; } wavbreaker-0.16/src/draw.h000066400000000000000000000034751435035650500155050ustar00rootroot00000000000000#pragma once /* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002-2005 Timothy Robinson * Copyright (C) 2007-2019 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "sample.h" #include "track_break.h" #include "moodbar.h" struct WaveformSurfaceDrawContext { // widget to draw into GtkWidget *widget; // sample offset of sample view long pixmap_offset; // list of track breaks TrackBreakList *list; // sample information GraphData *graphData; // moodbar information MoodbarData *moodbarData; }; struct WaveformSurface { cairo_surface_t *surface; unsigned long width; unsigned long height; unsigned long offset; gboolean moodbar; void (*draw)(struct WaveformSurface *, struct WaveformSurfaceDrawContext *); }; struct WaveformSurface *waveform_surface_create_sample(); struct WaveformSurface *waveform_surface_create_summary(); void waveform_surface_draw(struct WaveformSurface *surface, struct WaveformSurfaceDrawContext *ctx); void waveform_surface_invalidate(struct WaveformSurface *surface); void waveform_surface_free(struct WaveformSurface *surface); wavbreaker-0.16/src/format.c000066400000000000000000000133401435035650500160230ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "format.h" #include "format_wav.h" #include "format_cdda_raw.h" #include "format_mp3.h" #include "format_ogg_vorbis.h" #include #include #include #include void format_module_set_error_message(char **error_message, const char *fmt, ...) { if (error_message == NULL) { return; } va_list args; va_start(args, fmt); if (*error_message) { g_free(*error_message); } *error_message = g_strdup_vprintf(fmt, args); va_end(args); } gboolean format_module_filename_extension_check(const FormatModule *self, const char *filename, const char *extension) { if (extension == NULL) { extension = self->default_file_extension; } return (g_ascii_strcasecmp(filename + strlen(filename) - strlen(extension), extension) == 0); } gboolean format_module_open_file(const FormatModule *self, OpenedAudioFile *file, const char *filename, char **error_message) { struct stat st; if (stat(filename, &st) != 0) { format_module_set_error_message(error_message, "Could not stat %s: %s", filename, strerror(errno)); return FALSE; } FILE *fp = fopen(filename, "rb"); if (!fp) { format_module_set_error_message(error_message, "Could not open file %s: %s", filename, strerror(errno)); return FALSE; } file->mod = self; file->filename = g_strdup(filename); file->fp = fp; file->file_size = st.st_size; return TRUE; } void opened_audio_file_close(OpenedAudioFile *file) { if (file->details) { g_free(g_steal_pointer(&file->details)); } if (file->fp) { fclose(g_steal_pointer(&file->fp)); } g_free(g_steal_pointer(&file->filename)); } static GList * g_modules = NULL; void format_init(void) { static gboolean format_inited = FALSE; static const format_module_load_func CANDIDATES[] = { &format_module_wav, &format_module_cdda_raw, &format_module_mp3, &format_module_ogg_vorbis, }; if (!format_inited) { for (size_t i=0; iname); g_modules = g_list_append(g_modules, (gpointer)mod); } } format_inited = TRUE; } } void format_print_supported(void) { GList *cur = g_list_first(g_modules); while (cur != NULL) { const FormatModule *mod = cur->data; printf("Format: %s\n", mod->name); printf("Library: %s\n", mod->library_name); printf("Extension: %s\n", mod->default_file_extension); printf("\n"); cur = g_list_next(cur); } } OpenedAudioFile * format_open_file(const char *filename, char **error_message) { GList *cur = g_list_first(g_modules); while (cur != NULL) { const FormatModule *mod = cur->data; OpenedAudioFile *result = mod->open_file(mod, filename, error_message); if (result != NULL) { return result; } if (error_message) { g_debug("Open as %s failed: %s", mod->name, *error_message); g_free(*error_message); *error_message = NULL; } cur = g_list_next(cur); } format_module_set_error_message(error_message, "File format unknown/not supported"); return NULL; } static char * do_format_duration(uint64_t duration) { uint64_t seconds = duration / 1000; uint64_t fraction = duration % 1000; return g_strdup_printf("%02" PRIu64 ":%02" PRIu64 ":%02" PRIu64 ".%03" PRIu64, seconds / 60 / 60, (seconds / 60) % 60, seconds % 60, fraction); } void format_print_file_info(OpenedAudioFile *file) { SampleInfo *si = &file->sample_info; char *duration = do_format_duration((uint64_t)si->numBytes * 1000 / (uint64_t)si->avgBytesPerSec); printf("File name: %s\n", file->filename); printf("File format: %s\n", file->mod->name); if (file->details) { printf("Format details: %s\n", file->details); } printf("Duration: %s (%lu samples)\n", duration, si->numBytes / si->blockAlign); printf("Format: %d Hz / %d ch / %d bit", si->samplesPerSec, si->channels, si->bitsPerSample); printf("\n"); g_free(duration); } void format_close_file(OpenedAudioFile *file) { file->mod->close_file(file->mod, file); } long format_read_samples(OpenedAudioFile *file, unsigned char *buf, size_t buf_size, unsigned long start_pos) { return file->mod->read_samples(file, buf, buf_size, start_pos); } int format_write_file(OpenedAudioFile *file, const char *output_filename, unsigned long start_pos, unsigned long end_pos, report_progress_func report_progress, void *report_progress_user_data) { return file->mod->write_file(file, output_filename, start_pos, end_pos, report_progress, report_progress_user_data); } wavbreaker-0.16/src/format.h000066400000000000000000000055151435035650500160350ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include "sample_info.h" #include #include #include #include typedef struct FormatModule_ FormatModule; typedef struct OpenedAudioFile_ OpenedAudioFile; typedef void (*report_progress_func)(double progress, void *user_data); struct FormatModule_ { const char *name; const char *library_name; const char *default_file_extension; OpenedAudioFile *(*open_file)(const FormatModule *self, const char *filename, char **error_message); void (*close_file)(const FormatModule *self, OpenedAudioFile *file); long (*read_samples)(OpenedAudioFile *self, unsigned char *buf, size_t buf_size, unsigned long start_pos); int (*write_file)(OpenedAudioFile *self, const char *output_filename, unsigned long start_pos, unsigned long end_pos, report_progress_func report_progress, void *report_progress_user_data); }; typedef const FormatModule *(*format_module_load_func)(void); void format_module_set_error_message(char **error_message, const char *fmt, ...); struct OpenedAudioFile_ { const FormatModule *mod; char *filename; FILE *fp; SampleInfo sample_info; char *details; uint64_t file_size; }; gboolean format_module_filename_extension_check(const FormatModule *self, const char *filename, const char *extension); gboolean format_module_open_file(const FormatModule *self, OpenedAudioFile *file, const char *filename, char **error_message); void opened_audio_file_close(OpenedAudioFile *file); /* Public API */ void format_init(void); void format_print_supported(void); OpenedAudioFile * format_open_file(const char *filename, char **error_message); void format_print_file_info(OpenedAudioFile *file); void format_close_file(OpenedAudioFile *file); long format_read_samples(OpenedAudioFile *file, unsigned char *buf, size_t buf_size, unsigned long start_pos); int format_write_file(OpenedAudioFile *file, const char *output_filename, unsigned long start_pos, unsigned long end_pos, report_progress_func report_progress, void *report_progress_user_data); wavbreaker-0.16/src/format_cdda_raw.c000066400000000000000000000126601435035650500176530ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002 Timothy Robinson * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include "format_cdda_raw.h" /** * Example files can be created from an Audio CD using (for example): * * cdparanoia -l -R -B * * The filename extension here must match (".cdda.raw") since the raw * file doesn't have any header for auto-detection / probing). */ typedef struct OpenedCDDAFile_ OpenedCDDAFile; struct OpenedCDDAFile_ { OpenedAudioFile hdr; unsigned long file_size; }; static void cdda_raw_close_file(const FormatModule *self, OpenedAudioFile *file) { OpenedCDDAFile *cdda = (OpenedCDDAFile *)file; opened_audio_file_close(&cdda->hdr); g_free(cdda); } static OpenedAudioFile * cdda_raw_open_file(const FormatModule *self, const char *filename, char **error_message) { if (!format_module_filename_extension_check(self, filename, NULL)) { format_module_set_error_message(error_message, "Extension is not %s", self->default_file_extension); return NULL; } OpenedCDDAFile *cdda = g_new0(OpenedCDDAFile, 1); if (!format_module_open_file(self, &cdda->hdr, filename, error_message)) { g_free(cdda); return NULL; } struct stat statBuf; if (stat(cdda->hdr.filename, &statBuf)) { format_module_set_error_message(error_message, "Error stat()ing %s", cdda->hdr.filename); goto error; } cdda->file_size = statBuf.st_size; SampleInfo *si = &cdda->hdr.sample_info; si->numBytes = statBuf.st_size; si->channels = 2; si->samplesPerSec = 44100; si->bitsPerSample = 16; si->avgBytesPerSec = si->bitsPerSample/8 * si->samplesPerSec * si->channels; si->blockAlign = 4; si->blockSize = si->avgBytesPerSec / CD_BLOCKS_PER_SEC; return &cdda->hdr; error: cdda_raw_close_file(self, &cdda->hdr); return NULL; } static long cdda_raw_read_samples(OpenedAudioFile *self, unsigned char *buf, size_t buf_size, unsigned long start_pos) { OpenedCDDAFile *cdda = (OpenedCDDAFile *)self; size_t i = 0; size_t ret; if (fseek(cdda->hdr.fp, start_pos, SEEK_SET)) { return -1; } if (start_pos > cdda->file_size) { return -1; } ret = fread(buf, 1, buf_size, cdda->hdr.fp); #if G_BYTE_ORDER == G_LITTLE_ENDIAN for (i = 0; i < ret / 4; i++) { unsigned char tmp; /* left channel */ tmp = buf[i*4+0]; buf[i*4+0] = buf[i*4+1]; buf[i*4+1] = tmp; /* right channel */ tmp = buf[i*4+2]; buf[i*4+2] = buf[i*4+3]; buf[i*4+3] = tmp; } #endif /* G_LITTLE_ENDIAN */ return ret; } int cdda_raw_write_file(OpenedAudioFile *self, const char *output_filename, unsigned long start_pos, unsigned long end_pos, report_progress_func report_progress, void *report_progress_user_data) { OpenedCDDAFile *cdda = (OpenedCDDAFile *)self; int buf_size = cdda->hdr.sample_info.blockSize; size_t ret; FILE *new_fp; unsigned long cur_pos; unsigned char buf[buf_size]; if (end_pos == 0) { if (fseek(cdda->hdr.fp, 0, SEEK_END)) { return -1; } end_pos = ftell(cdda->hdr.fp); } if ((new_fp = fopen(output_filename, "wb")) == NULL) { g_warning("Error opening %s for writing", output_filename); return -1; } cur_pos = start_pos; if (fseek(cdda->hdr.fp, cur_pos, SEEK_SET)) { fclose(new_fp); return -1; } report_progress(0.0, report_progress_user_data); if (cur_pos > cdda->file_size) { fclose(new_fp); return -1; } if (cur_pos + buf_size > end_pos) { buf_size = end_pos - cur_pos; } while ((ret = fread(buf, 1, buf_size, cdda->hdr.fp)) > 0 && cur_pos < end_pos) { if ((fwrite(buf, 1, ret, new_fp)) < ret) { g_warning("Error writing to file %s", output_filename); fclose(new_fp); return -1; } cur_pos += ret; report_progress((double)(cur_pos - start_pos) / (double)(end_pos - start_pos), report_progress_user_data); if (cur_pos + buf_size > end_pos) { buf_size = end_pos - cur_pos; } } report_progress(1.0, report_progress_user_data); fclose(new_fp); return ret; } static const FormatModule CDDA_RAW_FORMAT_MODULE = { .name = "CD Digital Audio (Big-Endian)", .library_name = "built-in", .default_file_extension = ".cdda.raw", .open_file = cdda_raw_open_file, .close_file = cdda_raw_close_file, .read_samples = cdda_raw_read_samples, .write_file = cdda_raw_write_file, }; const FormatModule * format_module_cdda_raw() { return &CDDA_RAW_FORMAT_MODULE; } wavbreaker-0.16/src/format_cdda_raw.h000066400000000000000000000016571435035650500176640ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002 Timothy Robinson * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include "format.h" const FormatModule * format_module_cdda_raw(); wavbreaker-0.16/src/format_mp3.c000066400000000000000000000270251435035650500166070ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include "format_mp3.h" #if defined(HAVE_MPG123) //#define WAVBREAKER_MP3_DEBUG #include #include typedef struct OpenedMP3File_ OpenedMP3File; struct OpenedMP3File_ { OpenedAudioFile hdr; mpg123_handle *mpg123; size_t mpg123_offset; }; static long mp3_read_samples(OpenedAudioFile *self, unsigned char *buf, size_t buf_size, unsigned long start_pos) { OpenedMP3File *mp3 = (OpenedMP3File *)self; size_t result; gboolean retried = FALSE; if (mp3->mpg123_offset != start_pos) { retry: mpg123_seek(mp3->mpg123, start_pos / mp3->hdr.sample_info.blockAlign, SEEK_SET); mp3->mpg123_offset = start_pos; } if (mpg123_read(mp3->mpg123, buf, buf_size, &result) == MPG123_OK) { mp3->mpg123_offset += result; return result; } else { g_warning("MP3 decoding failed: %s", mpg123_strerror(mp3->mpg123)); if (!retried) { g_message("Retrying read at %zu...", mp3->mpg123_offset); retried = TRUE; goto retry; } } return -1; } static gboolean mp3_parse_header(uint32_t header, uint32_t *bitrate, uint32_t *frequency, uint32_t *samples, uint32_t *framesize) { // http://www.datavoyage.com/mpgscript/mpeghdr.htm int a = ((header >> 21) & 0x07ff); int b = ((header >> 19) & 0x0003); int c = ((header >> 17) & 0x0003); int e = ((header >> 12) & 0x000f); int f = ((header >> 10) & 0x0003); int g = ((header >> 9) & 0x0001); static const int BITRATES_V1_L2[] = { -1, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1 }; static const int BITRATES_V1_L3[] = { -1, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1 }; static const int FREQUENCIES[] = { 44100, 48000, 32000, 0 }; static const int LAYER_II = 0x2; /* 0b10 */ static const int LAYER_III = 0x1; /* 0b01 */ if (a != 0x7ff /* sync */ || b != 0x3 /* MPEG1 */ || (c != LAYER_II && c != LAYER_III) || e == 0x0 /* freeform bitrate */ || e == 0xf /* invalid bitrate */ || f == 0x3 /* invalid frequency */) { return FALSE; } *bitrate = (c == LAYER_III) ? BITRATES_V1_L3[e] : BITRATES_V1_L2[e]; *frequency = FREQUENCIES[f]; *samples = 1152; *framesize = (int)((*samples) / 8 * 1000 * (*bitrate) / (*frequency)) + g /* padding */; #if defined(WAVBREAKER_MP3_DEBUG) static const char *VERSIONS[] = { "MPEG 2.5", NULL, "MPEG 2", "MPEG 1" }; static const char *LAYERS[] = { NULL, "III", "II", "I" }; const char *mpeg_version = VERSIONS[b]; const char *layer = LAYERS[c]; g_debug("MP3 frame: %s %s, %dHz, %dkbps, %d samples (%d bytes)", mpeg_version, layer, *frequency, *bitrate, *samples, *framesize); #endif /* WAVBREAKER_MP3_DEBUG */ return TRUE; } int mp3_write_file(OpenedAudioFile *self, const char *output_filename, unsigned long start_pos, unsigned long end_pos, report_progress_func report_progress, void *report_progress_user_data) { OpenedMP3File *mp3 = (OpenedMP3File *)self; start_pos /= mp3->hdr.sample_info.blockSize; end_pos /= mp3->hdr.sample_info.blockSize; uint32_t start_samples = start_pos * mp3->hdr.sample_info.samplesPerSec / CD_BLOCKS_PER_SEC; uint32_t end_samples = end_pos * mp3->hdr.sample_info.samplesPerSec / CD_BLOCKS_PER_SEC; if (end_samples == 0) { end_samples = mp3->hdr.sample_info.numBytes / mp3->hdr.sample_info.blockAlign; } FILE *output_file = fopen(output_filename, "wb"); if (!output_file) { g_warning("Could not open '%s' for writing", output_filename); return -1; } fseek(mp3->hdr.fp, 0, SEEK_SET); report_progress(0.0, report_progress_user_data); uint32_t header = 0x00000000; uint32_t sample_position = 0; uint32_t file_offset = 0; uint32_t last_frame_end = 0; uint32_t frames_written = 0; while (!feof(mp3->hdr.fp)) { fseek(mp3->hdr.fp, file_offset, SEEK_SET); int a = fgetc(mp3->hdr.fp); if (a == EOF) { break; } header = ((header & 0xffffff) << 8) | (a & 0xff); uint32_t bitrate = 0; uint32_t frequency = 0; uint32_t samples = 0; uint32_t framesize = 0; if (mp3_parse_header(header, &bitrate, &frequency, &samples, &framesize)) { uint32_t frame_start = file_offset - 3; if (last_frame_end < frame_start) { g_warning("Skipped non-frame data in MP3 @ 0x%08x (%d bytes)", last_frame_end, frame_start - last_frame_end); } if (start_samples <= sample_position) { // Write this frame to the output file char *buf = malloc(framesize); fseek(mp3->hdr.fp, frame_start, SEEK_SET); if (fread(buf, 1, framesize, mp3->hdr.fp) != framesize) { g_warning("Tried to read over the end of the input file"); break; } if (fwrite(buf, 1, framesize, output_file) != framesize) { g_warning("Failed to write %d bytes to output file", framesize); break; } free(buf); frames_written++; report_progress((double)(sample_position - start_samples) / (double)(end_samples - start_samples), report_progress_user_data); if (end_samples <= sample_position + samples) { // Done writing this part break; } } sample_position += samples; file_offset = frame_start + framesize; last_frame_end = file_offset; header = 0x00000000; } else { file_offset++; } } report_progress(1.0, report_progress_user_data); #if defined(WAVBREAKER_MP3_DEBUG) g_debug("Wrote %d MP3 frames from '%s' to '%s'", frames_written, sample_file, output_filename); #endif /* WAVBREAKER_MP3_DEBUG */ fclose(output_file); return 0; } static void mp3_close_file(const FormatModule *self, OpenedAudioFile *file) { OpenedMP3File *mp3 = (OpenedMP3File *)file; opened_audio_file_close(&mp3->hdr); mpg123_close(g_steal_pointer(&mp3->mpg123)); g_free(mp3); } static OpenedAudioFile * mp3_open_file(const FormatModule *self, const char *filename, char **error_message) { /* This format module supports MP3 files (default extension) and MP2 file */ if (!format_module_filename_extension_check(self, filename, NULL) && !format_module_filename_extension_check(self, filename, ".mp2")) { format_module_set_error_message(error_message, "File extension is not .mp3/.mp2"); return NULL; } OpenedMP3File *mp3 = g_new0(OpenedMP3File, 1); if (!format_module_open_file(self, &mp3->hdr, filename, error_message)) { g_free(mp3); return NULL; } SampleInfo *si = &mp3->hdr.sample_info; mp3->mpg123_offset = 0; if ((mp3->mpg123 = mpg123_new(NULL, NULL)) == NULL) { format_module_set_error_message(error_message, "Failed to create MP3 decoder"); goto error; } if (mpg123_open(mp3->mpg123, mp3->hdr.filename) == MPG123_OK) { g_debug("Detected MP3 format"); long rate; int channels; int encoding; if (mpg123_getformat(mp3->mpg123, &rate, &channels, &encoding) != MPG123_OK ) { format_module_set_error_message(error_message, "Could not get MP3 file format"); goto error; } g_debug("Scanning MP3 file..."); if (mpg123_scan(mp3->mpg123) != MPG123_OK) { format_module_set_error_message(error_message, "Failed to scan MP3"); goto error; } struct mpg123_frameinfo fi; memset(&fi, 0, sizeof(fi)); if (mpg123_info(mp3->mpg123, &fi) == MPG123_OK) { si->channels = (fi.mode == MPG123_M_MONO) ? 1 : 2; si->samplesPerSec = fi.rate; si->bitsPerSample = 16; si->blockAlign = si->channels * (si->bitsPerSample / 8); si->avgBytesPerSec = si->blockAlign * si->samplesPerSec; si->blockSize = si->avgBytesPerSec / CD_BLOCKS_PER_SEC; si->numBytes = mpg123_length(mp3->mpg123) * si->blockAlign; g_debug("Channels: %d, rate: %d, bits: %d, decoded size: %lu", si->channels, si->samplesPerSec, si->bitsPerSample, si->numBytes); const char *mpeg_version = "?"; switch (fi.version) { case MPG123_1_0: mpeg_version = "1"; break; case MPG123_2_0: mpeg_version = "2"; break; case MPG123_2_5: mpeg_version = "2.5"; break; default: break; } const char *mode = "?"; switch (fi.mode) { case MPG123_M_STEREO: mode = "Stereo"; break; case MPG123_M_JOINT: mode = "Joint Stereo"; break; case MPG123_M_DUAL: mode = "Dual Channel"; break; case MPG123_M_MONO: mode = "Mono"; break; } const char *layer = "?"; switch (fi.layer) { case 1: layer = "I"; break; case 2: layer = "II"; break; case 3: layer = "III"; break; } mp3->hdr.details = g_strdup_printf("MPEG-%s Layer %s, %s, %d kbps", mpeg_version, layer, mode, fi.bitrate); mpg123_format_none(mp3->mpg123); if (mpg123_format(mp3->mpg123, si->samplesPerSec, (si->channels == 1) ? MPG123_STEREO : MPG123_MONO, MPG123_ENC_SIGNED_16) != MPG123_OK) { format_module_set_error_message(error_message, "Failed to set mpg123 format"); goto error; } } } else { format_module_set_error_message(error_message, "mpg123_open() failed"); goto error; } return &mp3->hdr; error: mp3_close_file(self, &mp3->hdr); return NULL; } static const FormatModule MP3_FORMAT_MODULE = { .name = "MPEG Audio Layer I/II/III", .library_name = "libmpg123", .default_file_extension = ".mp3", .open_file = mp3_open_file, .close_file = mp3_close_file, .read_samples = mp3_read_samples, .write_file = mp3_write_file, }; const FormatModule * format_module_mp3(void) { static gboolean mpg123_inited = FALSE; if (!mpg123_inited) { if (mpg123_init() != MPG123_OK) { g_warning("Failed to initialize libmpg123"); return NULL; } mpg123_inited = TRUE; } return &MP3_FORMAT_MODULE; } #else const FormatModule * format_module_mp3(void) { return NULL; } #endif /* HAVE_MPG123 */ wavbreaker-0.16/src/format_mp3.h000066400000000000000000000016101435035650500166040ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include "format.h" const FormatModule * format_module_mp3(void); wavbreaker-0.16/src/format_ogg_vorbis.c000066400000000000000000000130121435035650500202370ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include "format_ogg_vorbis.h" #if defined(HAVE_VORBISFILE) #include #include #include #include typedef struct OpenedOGGVorbisFile_ OpenedOGGVorbisFile; struct OpenedOGGVorbisFile_ { OpenedAudioFile hdr; OggVorbis_File ogg_vorbis_file; size_t ogg_vorbis_offset; }; static long ogg_vorbis_read_samples(OpenedAudioFile *self, unsigned char *buf, size_t buf_size, unsigned long start_pos) { OpenedOGGVorbisFile *ogg = (OpenedOGGVorbisFile *)self; if (ogg->ogg_vorbis_offset != start_pos) { ov_pcm_seek(&ogg->ogg_vorbis_file, start_pos / ogg->hdr.sample_info.blockAlign); ogg->ogg_vorbis_offset = start_pos; } long result = 0; while (buf_size > 0) { long res = ov_read(&ogg->ogg_vorbis_file, (char *)buf, buf_size, 0, 2, 1, NULL); if (res < 0) { g_warning("Error in ov_read(): %ld", res); return -1; } result += res; ogg->ogg_vorbis_offset += res; buf += res; buf_size -= res; if (res == 0) { break; } } return result; } int ogg_vorbis_write_file(OpenedAudioFile *self, const char *output_filename, unsigned long start_pos, unsigned long end_pos, report_progress_func report_progress, void *report_progress_user_data) { OpenedOGGVorbisFile *ogg = (OpenedOGGVorbisFile *)self; g_warning("TODO: Write file '%s', start=%lu, end=%lu", output_filename, start_pos, end_pos); report_progress(0.0, report_progress_user_data); uint32_t start_samples = start_pos / ogg->hdr.sample_info.blockSize * ogg->hdr.sample_info.samplesPerSec / CD_BLOCKS_PER_SEC; uint32_t end_samples = end_pos / ogg->hdr.sample_info.blockSize * ogg->hdr.sample_info.samplesPerSec / CD_BLOCKS_PER_SEC; if (end_samples == 0) { end_samples = ogg->hdr.sample_info.numBytes / ogg->hdr.sample_info.blockAlign; } // TODO: Copy Ogg Vorbis samples from source to output file (void)start_samples; (void)end_samples; return -1; } static void ogg_vorbis_close_file(const FormatModule *self, OpenedAudioFile *file) { OpenedOGGVorbisFile *ogg = (OpenedOGGVorbisFile *)file; opened_audio_file_close(&ogg->hdr); ov_clear(&ogg->ogg_vorbis_file); g_free(ogg); } static OpenedAudioFile * ogg_vorbis_open_file(const FormatModule *self, const char *filename, char **error_message) { OpenedOGGVorbisFile *ogg = g_new0(OpenedOGGVorbisFile, 1); if (!format_module_open_file(self, &ogg->hdr, filename, error_message)) { g_free(ogg); return NULL; } SampleInfo *si = &ogg->hdr.sample_info; ogg->ogg_vorbis_offset = 0; g_debug("Trying as Ogg Vorbis..."); int ogg_res = ov_fopen(ogg->hdr.filename, &ogg->ogg_vorbis_file); if (ogg_res == 0) { g_debug("Detected Ogg Vorbis"); vorbis_info *info = ov_info(&ogg->ogg_vorbis_file, -1); g_debug("Ogg Vorbis info: version=%d, channels=%d, rate=%ld, samples=%ld", info->version, info->channels, info->rate, (long int)ov_pcm_total(&ogg->ogg_vorbis_file, -1)); vorbis_comment *comment = ov_comment(&ogg->ogg_vorbis_file, -1); long bitrate = ov_bitrate(&ogg->ogg_vorbis_file, -1); if (bitrate == OV_EINVAL || bitrate == OV_FALSE) { bitrate = -1; } else { bitrate /= 1000; } uint32_t serial = ov_serialnumber(&ogg->ogg_vorbis_file, -1) & 0xFFFFFFFF; ogg->hdr.details = g_strdup_printf("%s, serial %08"PRIx32", %ld kbps", comment->vendor, serial, bitrate); si->channels = info->channels; si->samplesPerSec = info->rate; si->bitsPerSample = 16; si->blockAlign = si->channels * (si->bitsPerSample / 8); si->avgBytesPerSec = si->blockAlign * si->samplesPerSec; si->blockSize = si->avgBytesPerSec / CD_BLOCKS_PER_SEC; si->numBytes = ov_pcm_total(&ogg->ogg_vorbis_file, -1) * si->blockAlign; } else { format_module_set_error_message(error_message, "ov_fopen() returned %d, probably not an Ogg file", ogg_res); goto error; } return &ogg->hdr; error: ogg_vorbis_close_file(self, &ogg->hdr); return NULL; } static const FormatModule OGG_VORBIS_FORMAT_MODULE = { .name = "Ogg Vorbis", .library_name = "libvorbisfile", .default_file_extension = ".ogg", .open_file = ogg_vorbis_open_file, .close_file = ogg_vorbis_close_file, .read_samples = ogg_vorbis_read_samples, .write_file = ogg_vorbis_write_file, }; const FormatModule * format_module_ogg_vorbis(void) { return &OGG_VORBIS_FORMAT_MODULE; } #else const FormatModule * format_module_ogg_vorbis(void) { return NULL; } #endif /* HAVE_VORBISFILE */ wavbreaker-0.16/src/format_ogg_vorbis.h000066400000000000000000000016171435035650500202540ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include "format.h" const FormatModule * format_module_ogg_vorbis(void); wavbreaker-0.16/src/format_wav.c000066400000000000000000000363141435035650500167060ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include #include #include #include "format_wav.h" #include "gettext.h" #define RiffID "RIFF" #define WaveID "WAVE" #define FormatID "fmt " #define WaveDataID "data" typedef char ID[4]; typedef struct { ID riffID; unsigned int totSize; ID wavID; } WaveHeader; typedef struct { ID chunkID; int chunkSize; } ChunkHeader; typedef struct { short wFormatTag; unsigned short wChannels; unsigned int dwSamplesPerSec; unsigned int dwAvgBytesPerSec; unsigned short wBlockAlign; unsigned short wBitsPerSample; // unsigned short extraNonPcm; } FormatChunk; typedef struct OpenedWavFile_ OpenedWavFile; struct OpenedWavFile_ { OpenedAudioFile hdr; unsigned long wavDataPtr; unsigned long wavDataSize; }; static void wav_close_file(const FormatModule *self, OpenedAudioFile *file) { OpenedWavFile *wav = (OpenedWavFile *)file; opened_audio_file_close(&wav->hdr); g_free(wav); } static OpenedAudioFile * wav_open_file(const FormatModule *self, const char *filename, char **error_message) { const char *CHUNK_ERROR_MESSAGE = _("Error reading chunk. Maybe the wave file you are trying to load is truncated?"); WaveHeader wavHdr; ChunkHeader chunkHdr; FormatChunk fmtChunk; char str[128]; OpenedWavFile *wav = g_new0(OpenedWavFile, 1); if (!format_module_open_file(self, &wav->hdr, filename, error_message)) { g_free(wav); return NULL; } /** * This is needed for RAW audio * and also lets us check if the file size in the header * is correct (or the wave file is truncated, in which * case we are going to use the real file size instead). **/ wav->wavDataPtr = 0; wav->wavDataSize = wav->hdr.file_size; /* read in file header */ if (fread(&wavHdr, sizeof(WaveHeader), 1, wav->hdr.fp) < 1) { format_module_set_error_message(error_message, "%s", _("Cannot read wave header.")); goto error; } if (memcmp(wavHdr.riffID, RiffID, 4) && memcmp(wavHdr.wavID, WaveID, 4)) { format_module_set_error_message(error_message, _("%s is not a wave file."), wav->hdr.filename); goto error; } /* read in format chunk header */ if (fread(&chunkHdr, sizeof(ChunkHeader), 1, wav->hdr.fp) < 1) { format_module_set_error_message(error_message, "%s", CHUNK_ERROR_MESSAGE); goto error; } while (memcmp(chunkHdr.chunkID, FormatID, 4)) { memcpy(str, chunkHdr.chunkID, 4); str[4] = '\0'; g_warning("Chunk %s is not a Format Chunk", str); if (fseek(wav->hdr.fp, chunkHdr.chunkSize, SEEK_CUR)) { format_module_set_error_message(error_message, _("Error seeking to %u in %s: %s"), chunkHdr.chunkSize, wav->hdr.filename, strerror(errno)); goto error; } if (fread(&chunkHdr, sizeof(ChunkHeader), 1, wav->hdr.fp) < 1) { format_module_set_error_message(error_message, "%s", CHUNK_ERROR_MESSAGE); goto error; } } /* read in format chunk data */ if (fread(&fmtChunk, sizeof(FormatChunk), 1, wav->hdr.fp) < 1) { format_module_set_error_message(error_message, _("Error reading format chunk: %s"), strerror(errno)); goto error; } if (fmtChunk.wFormatTag != 1) { format_module_set_error_message(error_message, "%s", _("Loading compressed wave data is not supported.")); goto error; } wav->hdr.sample_info.channels = fmtChunk.wChannels; wav->hdr.sample_info.samplesPerSec = fmtChunk.dwSamplesPerSec; wav->hdr.sample_info.avgBytesPerSec = fmtChunk.dwAvgBytesPerSec; wav->hdr.sample_info.blockAlign = fmtChunk.wBlockAlign; wav->hdr.sample_info.bitsPerSample = fmtChunk.wBitsPerSample; wav->hdr.sample_info.blockSize = wav->hdr.sample_info.avgBytesPerSec / CD_BLOCKS_PER_SEC; // if we have a FormatChunk that is larger than standard size, skip over extra data if (chunkHdr.chunkSize > sizeof(FormatChunk)) { if (fseek(wav->hdr.fp, chunkHdr.chunkSize - sizeof(FormatChunk), SEEK_CUR)) { format_module_set_error_message(error_message, _("Error seeking to %u in %s: %s"), chunkHdr.chunkSize, wav->hdr.filename, strerror(errno)); goto error; } } /* read in wav data header */ if (fread(&chunkHdr, sizeof(ChunkHeader), 1, wav->hdr.fp) < 1) { format_module_set_error_message(error_message, "%s", CHUNK_ERROR_MESSAGE); goto error; } while (memcmp(chunkHdr.chunkID, WaveDataID, 4)) { memcpy(str, chunkHdr.chunkID, 4); str[4] = '\0'; g_warning("Chunk %s is not a Format Chunk", str); if (fseek(wav->hdr.fp, chunkHdr.chunkSize, SEEK_CUR)) { format_module_set_error_message(error_message, _("Error seeking to %u in %s: %s"), chunkHdr.chunkSize, wav->hdr.filename, strerror(errno)); goto error; } if (fread(&chunkHdr, sizeof(ChunkHeader), 1, wav->hdr.fp) < 1) { format_module_set_error_message(error_message, "%s", CHUNK_ERROR_MESSAGE); goto error; } } long x; if ((x = ftell(wav->hdr.fp)) >= 0) { wav->wavDataPtr = x; } /** * If we got a truncated wave file, we will not * use the header's size info here, but use the * real file size, minus the header's size. ***/ if (wav->wavDataSize != 0 && chunkHdr.chunkSize > wav->wavDataSize) { g_warning("Real file size is %lu, but wave header says it should be %d. Using real file size instead.", wav->wavDataSize, chunkHdr.chunkSize); wav->wavDataSize = wav->wavDataSize - wav->wavDataPtr; } else { wav->wavDataSize = chunkHdr.chunkSize; } wav->hdr.sample_info.numBytes = wav->wavDataSize; return &wav->hdr; error: wav_close_file(self, &wav->hdr); return NULL; } long wav_read_samples(OpenedAudioFile *self, unsigned char *buf, size_t buf_size, unsigned long start_pos) { OpenedWavFile *wav = (OpenedWavFile *)self; if (fseek(wav->hdr.fp, start_pos + wav->wavDataPtr, SEEK_SET)) { return -1; } if (start_pos > wav->wavDataSize) { return -1; } if (start_pos + buf_size > wav->wavDataSize) { buf_size = wav->wavDataSize - start_pos; } return fread(buf, 1, buf_size, wav->hdr.fp); } int wav_write_file(OpenedAudioFile *self, const char *output_filename, unsigned long start_pos, unsigned long end_pos, report_progress_func report_progress, void *report_progress_user_data) { OpenedWavFile *wav = (OpenedWavFile *)self; int buf_size = wav->hdr.sample_info.blockSize; int ret; FILE *new_fp = NULL; unsigned long cur_pos, num_bytes; unsigned char *buf = malloc(buf_size); if (start_pos > wav->wavDataSize) { goto error; } if ((new_fp = fopen(output_filename, "wb")) == NULL) { g_warning("Error opening %s for writing", output_filename); goto error; } start_pos += wav->wavDataPtr; if (end_pos != 0) { end_pos += wav->wavDataPtr; num_bytes = end_pos - start_pos; } else { num_bytes = wav->wavDataSize + wav->wavDataPtr - start_pos; } cur_pos = start_pos; if ((wav_write_file_header(new_fp, &wav->hdr.sample_info, num_bytes)) != 0) { g_message("Could not write WAV header to %s", output_filename); goto error; } if (fseek(wav->hdr.fp, cur_pos, SEEK_SET)) { g_message("Could not seek to read position in %s", wav->hdr.filename); goto error; } report_progress(0.0, report_progress_user_data); while ((ret = fread(buf, 1, buf_size, wav->hdr.fp)) > 0 && (cur_pos < end_pos || end_pos == 0)) { if ((fwrite(buf, 1, ret, new_fp)) < ret) { g_message("Error writing to file %s", output_filename); goto error; } cur_pos += ret; report_progress((double)(cur_pos - start_pos) / num_bytes, report_progress_user_data); } free(buf); fclose(new_fp); report_progress(1.0, report_progress_user_data); return ret; error: if (new_fp != NULL) { fclose(new_fp); } free(buf); return -1; } static const FormatModule WAV_FORMAT_MODULE = { .name = "RIFF WAVE", .library_name = "built-in", .default_file_extension = ".wav", .open_file = wav_open_file, .close_file = wav_close_file, .read_samples = wav_read_samples, .write_file = wav_write_file, }; const FormatModule * format_module_wav() { return &WAV_FORMAT_MODULE; } int wav_write_file_header(FILE *fp, SampleInfo *sample_info, unsigned long num_bytes) { WaveHeader wavHdr; ChunkHeader chunkHdr; FormatChunk fmtChunk; /* Write wave header */ memcpy(wavHdr.riffID, RiffID, 4); wavHdr.totSize = num_bytes + sizeof(ChunkHeader) + sizeof(FormatChunk) + sizeof(ChunkHeader) + 4; memcpy(wavHdr.wavID, WaveID, 4); if ((fwrite(&wavHdr, sizeof(WaveHeader), 1, fp)) < 1) { printf("error writing wave header\n"); return 1; } /* Write format chunk header */ memcpy(chunkHdr.chunkID, FormatID, 4); chunkHdr.chunkSize = sizeof(FormatChunk); if ((fwrite(&chunkHdr, sizeof(ChunkHeader), 1, fp)) < 1) { printf("error writing fmt chunk header\n"); return 1; } /* Write format chunk data */ fmtChunk.wFormatTag = 1; fmtChunk.wChannels = sample_info->channels; fmtChunk.dwSamplesPerSec = sample_info->samplesPerSec; fmtChunk.dwAvgBytesPerSec = sample_info->avgBytesPerSec; fmtChunk.wBlockAlign = sample_info->blockAlign; fmtChunk.wBitsPerSample = sample_info->bitsPerSample; if (fwrite(&fmtChunk, sizeof(FormatChunk), 1, fp) < 1) { printf("error writing format chunk\n"); return 1; } /* Write data chunk header */ memcpy(chunkHdr.chunkID, WaveDataID, 4); chunkHdr.chunkSize = num_bytes; if ((fwrite(&chunkHdr, sizeof(ChunkHeader), 1, fp)) < 1) { printf("error writing data chunk header\n"); return 1; } return 0; } int wav_merge_files(char *filename, int num_files, char *filenames[], WriteInfo *write_info) { int i; int ret = 0; SampleInfo sample_info[num_files]; unsigned long data_ptr[num_files]; FILE *new_fp, *read_fp; unsigned long cur_pos, end_pos, num_bytes; unsigned char buf[DEFAULT_BUF_SIZE]; if( write_info != NULL) { write_info->num_files = num_files; write_info->cur_file = 0; write_info->sync = 0; write_info->sync_check_file_overwrite_to_write_progress = 0; write_info->check_file_exists = 0; write_info->skip_file = -1; } const FormatModule *mod = format_module_wav(); for (i = 0; i < num_files; i++) { char *error_message = NULL; OpenedAudioFile *oaf = mod->open_file(mod, filenames[i], &error_message); OpenedWavFile *wav = (OpenedWavFile *)oaf; if (oaf == NULL) { g_warning("Could not read WAV header of %s: %s", filenames[i], error_message); g_free(error_message); return -1; } else { sample_info[i] = oaf->sample_info; data_ptr[i] = wav->wavDataPtr; mod->close_file(mod, oaf); } } num_bytes = sample_info[0].numBytes; for (i = 1; i < num_files; i++) { if (sample_info[0].channels != sample_info[i].channels) { return 1; } else if (sample_info[0].samplesPerSec != sample_info[i].samplesPerSec) { return 1; } else if (sample_info[0].avgBytesPerSec != sample_info[i].avgBytesPerSec) { return 1; } else if (sample_info[0].blockAlign != sample_info[i].blockAlign) { return 1; } else if (sample_info[0].bitsPerSample != sample_info[i].bitsPerSample) { return 1; } num_bytes += sample_info[i].numBytes; } if ((new_fp = fopen(filename, "wb")) == NULL) { printf("error opening %s for writing\n", filename); return -1; } if ((wav_write_file_header(new_fp, &sample_info[0], num_bytes)) != 0) { fclose(new_fp); return -1; } for (i = 0; i < num_files; i++) { if( write_info != NULL) { write_info->pct_done = 0.0; write_info->cur_file++; if (write_info->cur_filename != NULL) { free(write_info->cur_filename); } write_info->cur_filename = g_strdup(filenames[i]); } if ((read_fp = fopen(filenames[i], "rb")) == NULL) { printf("error opening %s for reading\n", filenames[i]); fclose(new_fp); fclose(read_fp); return -1; } cur_pos = data_ptr[i]; num_bytes = sample_info[i].numBytes; end_pos = cur_pos + num_bytes; if (fseek(read_fp, cur_pos, SEEK_SET)) { fclose(new_fp); fclose(read_fp); return -1; } while ((ret = fread(buf, 1, sizeof(buf), read_fp)) > 0 && (cur_pos < end_pos)) { if ((fwrite(buf, 1, ret, new_fp)) < ret) { printf("error writing to file %s\n", filename); fclose(new_fp); fclose(read_fp); return -1; } if( write_info != NULL) { write_info->pct_done = (double) cur_pos / num_bytes; } cur_pos += ret; } fclose(read_fp); } if( write_info != NULL) { write_info->sync = 1; if (write_info->cur_filename != NULL) { g_free(write_info->cur_filename); } write_info->cur_filename = NULL; } fclose(new_fp); if( write_info != NULL) { write_info->pct_done = 1.0; } return ret; } int wav_read_header(char *filename, SampleInfo *sample_info_out, int debug) { const FormatModule *mod = format_module_wav(); char *error_message = NULL; OpenedAudioFile *oaf = mod->open_file(mod, filename, &error_message); if (oaf == NULL) { g_warning("Could not read WAV header of %s: %s", filename, error_message); g_free(error_message); return 1; } *sample_info_out = oaf->sample_info; mod->close_file(mod, oaf); return 0; } wavbreaker-0.16/src/format_wav.h000066400000000000000000000023441435035650500167070ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include "format.h" #include "sample.h" const FormatModule * format_module_wav(void); int wav_read_header(char *, SampleInfo *, int); int wav_write_file_header(FILE *fp, SampleInfo *sample_info, unsigned long num_bytes); int wav_merge_files(char *filename, int num_files, char *filenames[], WriteInfo *write_info); wavbreaker-0.16/src/gettext.h000066400000000000000000000000521435035650500162200ustar00rootroot00000000000000#pragma once #include wavbreaker-0.16/src/guimerge.c000066400000000000000000000434021435035650500163410ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2004 Timothy Robinson * * This file copyright (c) 2007 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include #include #include #include "sample_info.h" #include "wavbreaker.h" #include "popupmessage.h" #include "format_wav.h" #include "gettext.h" enum { COLUMN_FILENAME, COLUMN_BASENAME, COLUMN_LENGTH, COLUMN_LENGTH_STRING, NUM_COLUMNS }; static GtkWidget *window; static GtkWidget *ok_button; static GtkWidget *remove_button; static GtkTreeView *treeview = NULL; static GtkListStore *store = NULL; static char folder[4096] = {0}; static SampleInfo common_sample_info; static WriteInfo write_info; gboolean file_merge_progress_idle_func(gpointer data); int get_merge_files_count() { GtkTreeIter iter; int i = 0; if( gtk_tree_model_get_iter_first( GTK_TREE_MODEL(store), &iter) == TRUE) { do { i++; } while( gtk_tree_model_iter_next( GTK_TREE_MODEL(store), &iter) == TRUE); } /* Only enable when we have more than one file to merge */ gtk_widget_set_sensitive( GTK_WIDGET( ok_button), (i>1)?TRUE:FALSE); gtk_widget_set_sensitive( GTK_WIDGET( remove_button), (i>0)?TRUE:FALSE); return i; } typedef struct MergeThreadData_ MergeThreadData; struct MergeThreadData_ { char *merge_filename; int num_files; GList *filenames; WriteInfo *write_info; }; MergeThreadData mtd; static gpointer merge_thread(gpointer data) { MergeThreadData *thread_data = data; char *filenames[g_list_length(thread_data->filenames)]; GList *cur, *head; int index, i; char *list_data; head = thread_data->filenames; cur = head; i = 0; while (cur != NULL) { index = g_list_position(head, cur); list_data = (char *)g_list_nth_data(head, index); filenames[i++] = list_data; cur = g_list_next(cur); } wav_merge_files(thread_data->merge_filename, g_list_length(thread_data->filenames), filenames, thread_data->write_info); head = thread_data->filenames; cur = head; while (cur != NULL) { index = g_list_position(head, cur); list_data = (char *)g_list_nth_data(head, index); free(list_data); cur = g_list_next(cur); } g_list_free(thread_data->filenames); g_free(thread_data->merge_filename); return NULL; } static void do_merge_files(char *merge_filename, GList *filenames, WriteInfo *write_info) { mtd.merge_filename = g_strdup(merge_filename); mtd.filenames = filenames; mtd.write_info = write_info; g_thread_unref(g_thread_new("merge files", merge_thread, &mtd)); } static void ok_button_clicked(GtkWidget *widget, gpointer user_data) { GtkWidget *dialog; GValue value; GtkTreeIter iter; GList *filenames = NULL; char *tmp; GtkWidget *checkbutton; GtkFileFilter *filter_all; GtkFileFilter *filter_supported; gtk_tree_model_get_iter_first( GTK_TREE_MODEL(store), &iter); do { memset (&value, 0, sizeof (GValue)); gtk_tree_model_get_value( GTK_TREE_MODEL(store), &iter, 0, &value); tmp = (char*)g_value_peek_pointer( &value); filenames = g_list_append(filenames, g_strdup(tmp)); } while( gtk_tree_model_iter_next( GTK_TREE_MODEL(store), &iter) == TRUE); filter_all = gtk_file_filter_new(); gtk_file_filter_set_name( filter_all, _("All files")); gtk_file_filter_add_pattern( filter_all, "*"); filter_supported = gtk_file_filter_new(); gtk_file_filter_set_name( filter_supported, _("Supported files")); gtk_file_filter_add_pattern( filter_supported, "*.wav"); dialog = gtk_file_chooser_dialog_new( _("Select filename for merged wave file"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_all); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_supported); gtk_file_chooser_set_filter( GTK_FILE_CHOOSER(dialog), filter_supported); gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER(dialog), TRUE); checkbutton = (GtkWidget*)gtk_check_button_new_with_label( _("Open file in wavbreaker after merge")); gtk_box_pack_end(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), checkbutton, FALSE, FALSE, 0); gtk_widget_show( GTK_WIDGET(checkbutton)); if( strlen( folder) > 0) { gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(dialog), folder); } gtk_file_chooser_set_current_name( GTK_FILE_CHOOSER(dialog), "merged.wav"); if( gtk_dialog_run( GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { tmp = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(dialog)); write_info.pct_done = 0.0; do_merge_files(tmp, filenames, &write_info); gtk_widget_destroy(GTK_WIDGET(user_data)); g_idle_add( file_merge_progress_idle_func, NULL); } gtk_widget_destroy( GTK_WIDGET(dialog)); } static void add_filename( char* filename) { GtkTreeIter iter; SampleInfo sampleinfo; unsigned int length = 0; char* length_str; int files = get_merge_files_count(); wav_read_header( filename, &sampleinfo, 0); if( files == 0) { /* Adding first file, saving sample info for later comparison */ memcpy( &common_sample_info, &sampleinfo, sizeof(SampleInfo)); } else { /* Compare the format info of the first file with the current info */ if( common_sample_info.channels != sampleinfo.channels || common_sample_info.samplesPerSec != sampleinfo.samplesPerSec || common_sample_info.avgBytesPerSec != sampleinfo.avgBytesPerSec || common_sample_info.blockAlign != sampleinfo.blockAlign || common_sample_info.bitsPerSample != sampleinfo.bitsPerSample || sampleinfo.channels == 0 || sampleinfo.samplesPerSec == 0 || sampleinfo.bitsPerSample < 8) { popupmessage_show( window, _("Wrong file format - skipping file"), filename); return; } } length = sampleinfo.numBytes / (sampleinfo.channels*sampleinfo.samplesPerSec*sampleinfo.bitsPerSample/8); length_str = (char*)malloc( 20); sprintf( length_str, "%02d:%02d", length/60, length%60); gtk_list_store_append( store, &iter); gtk_list_store_set( store, &iter, COLUMN_FILENAME, filename, COLUMN_BASENAME, basename(filename), COLUMN_LENGTH, length, COLUMN_LENGTH_STRING, length_str, -1); } static void add_button_clicked( GtkWidget *widget, gpointer user_data) { GtkWidget *dialog; GtkFileFilter *filter_all; GtkFileFilter *filter_supported; int i; filter_all = gtk_file_filter_new(); gtk_file_filter_set_name( filter_all, _("All files")); gtk_file_filter_add_pattern( filter_all, "*"); filter_supported = gtk_file_filter_new(); gtk_file_filter_set_name( filter_supported, _("Supported files")); gtk_file_filter_add_pattern( filter_supported, "*.wav"); dialog = gtk_file_chooser_dialog_new(_("Add wave file to merge"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_OPEN, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_all); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_supported); gtk_file_chooser_set_filter( GTK_FILE_CHOOSER(dialog), filter_supported); gtk_file_chooser_set_select_multiple( GTK_FILE_CHOOSER(dialog), TRUE); if( strlen( folder) > 0) { gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(dialog), folder); } if (gtk_dialog_run( GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *current_folder = gtk_file_chooser_get_current_folder( GTK_FILE_CHOOSER(dialog)); if (current_folder) { strcpy(folder, current_folder); } GSList* filenames; filenames = gtk_file_chooser_get_filenames( GTK_FILE_CHOOSER(dialog)); for( i=0; i%s", gtk_window_get_title(GTK_WINDOW(window))); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), markup); g_free(markup); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 5); label = gtk_label_new( _("The selected files are now being merged. This can take some time.")); gtk_label_set_line_wrap( GTK_LABEL(label), TRUE); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 5); pbar = gtk_progress_bar_new(); gtk_box_pack_start(GTK_BOX(vbox), pbar, FALSE, TRUE, 5); status_label = gtk_label_new( NULL); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_label_set_ellipsize( GTK_LABEL(status_label), PANGO_ELLIPSIZE_MIDDLE); gtk_box_pack_start(GTK_BOX(vbox), status_label, FALSE, TRUE, 5); gtk_widget_show_all(GTK_WIDGET(window)); cur_file_displayed = -1; } if (write_info.sync) { write_info.sync = 0; gtk_widget_destroy(window); window = NULL; popupmessage_show(NULL, _("Operation successful"), _("The files have been merged.")); return FALSE; } if (cur_file_displayed != write_info.cur_file) { gchar *bn = g_path_get_basename(write_info.cur_filename); gchar *tmp = g_strdup_printf(_("Adding %s"), bn); g_free(bn); gchar *msg = g_markup_printf_escaped("%s", tmp); g_free(tmp); gtk_label_set_markup(GTK_LABEL(status_label), msg); g_free(msg); cur_file_displayed = write_info.cur_file; } fraction = 1.00*(write_info.cur_file-1+write_info.pct_done)/write_info.num_files; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar), fraction); gchar *msg; if (write_info.num_files > 1) { // TODO: i18n plural forms msg = g_strdup_printf(_("%d of %d files merged"), write_info.cur_file-1, write_info.num_files); } else { msg = g_strdup_printf(_("%d of 1 file merged"), write_info.cur_file-1); } gtk_progress_bar_set_text( GTK_PROGRESS_BAR(pbar), msg); g_free(msg); return TRUE; } wavbreaker-0.16/src/guimerge.h000066400000000000000000000017211435035650500163440ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2003 Timothy Robinson * * This file copyright (c) 2007 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 GUIMERGE_H #define GUIMERGE_H void guimerge_show( GtkWidget*); #endif /* GUIMERGE_H */ wavbreaker-0.16/src/list.c000066400000000000000000000034141435035650500155070ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "list.h" #include "toc.h" #include "cue.h" #include "txt.h" gboolean list_read_file(const char *list_filename, TrackBreakList *list) { if (g_str_has_suffix(list_filename, ".toc") || g_str_has_suffix(list_filename, ".TOC")) { if (toc_read_file(list_filename, list)) { return TRUE; } } else if (g_str_has_suffix(list_filename, ".cue") || g_str_has_suffix(list_filename, ".CUE")) { if (cue_read_file(list_filename, list)) { return TRUE; } } return txt_read_file(list_filename, list); } gboolean list_write_file(const char *list_filename, const char *wav_filename, TrackBreakList *list) { if (g_str_has_suffix(list_filename, ".toc")) { return toc_write_file(list_filename, wav_filename, list); } else if (g_str_has_suffix(list_filename, ".cue")) { return cue_write_file(list_filename, wav_filename, list); } return txt_write_file(list_filename, wav_filename, list); } wavbreaker-0.16/src/list.h000066400000000000000000000020411435035650500155070ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include #include "track_break.h" gboolean list_read_file(const char *list_filename, TrackBreakList *list); gboolean list_write_file(const char *list_filename, const char *wav_filename, TrackBreakList *list); wavbreaker-0.16/src/moodbar.c000066400000000000000000000135631435035650500161650ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * Copyright (C) 2006-2019 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include "moodbar.h" #include "popupmessage.h" #include "wavbreaker.h" #if defined(WANT_MOODBAR) #include #include #include #include #include #include #include "gettext.h" static pid_t moodbar_pid; static gboolean moodbar_cancelled; static GtkWidget *moodbar_wait_dialog; static guint moodbar_update_source_id; static gchar *moodbar_filename; static void cancel_moodbar_process(GtkWidget *widget, gpointer user_data) { moodbar_cancelled = TRUE; if (moodbar_pid != 0) { kill(moodbar_pid, SIGKILL); moodbar_pid = 0; } if (moodbar_filename) { /* remove (partial) .mood file */ unlink(moodbar_filename); free(moodbar_filename); moodbar_filename = NULL; } } static void hide_moodbar_process(GtkWidget *widget, gpointer user_data) { gtk_widget_hide(GTK_WIDGET(user_data)); } void moodbar_abort() { cancel_moodbar_process(NULL, NULL); } static gboolean update_moodbar_func(gpointer user_data) { GtkWidget *child = user_data; gtk_progress_bar_pulse(GTK_PROGRESS_BAR(child)); int child_status; if (waitpid(moodbar_pid, &child_status, WNOHANG) != 0) { gtk_widget_destroy(moodbar_wait_dialog); moodbar_wait_dialog = NULL; if (child_status != 0 && !moodbar_cancelled) { popupmessage_show(NULL, _("Cannot launch \"moodbar\""), _("wavbreaker could not launch the moodbar application, which is needed to generate the moodbar. You can download the moodbar package from:\n\n http://amarok.kde.org/wiki/Moodbar")); } moodbar_update_source_id = 0; wavbreaker_update_moodbar_state(); return FALSE; } return TRUE; } static gchar * get_moodbar_filename(const gchar *filename) { /* replace ".xxx" with ".mood" */ gchar *fn = (gchar*)malloc(strlen(filename)+2); strcpy(fn, filename); strcpy((gchar*)(fn+strlen(fn)-4), ".mood"); return fn; } void moodbar_generate(GtkWidget *window, const gchar *filename) { struct stat st; GtkWidget *child, *cancel_button; if (moodbar_filename) { free(moodbar_filename); } moodbar_filename = get_moodbar_filename(filename); if (stat(moodbar_filename, &st) == 0) { return; } if (moodbar_wait_dialog != NULL) { return; } moodbar_cancelled = FALSE; moodbar_pid = fork(); if (moodbar_pid == 0) { if (execlp("moodbar", "moodbar", "-o", moodbar_filename, filename, (char*)NULL) == -1) { fprintf(stderr, "Error running moodbar: %s (Have you installed the \"moodbar\" package?)\n", strerror(errno)); _exit(-1); } } else if (moodbar_pid > 0) { moodbar_wait_dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_NONE, _("Generating moodbar")); child = gtk_progress_bar_new(); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(moodbar_wait_dialog))), child, FALSE, TRUE, 0); cancel_button = gtk_button_new_with_mnemonic(_("_Hide window")); g_signal_connect(G_OBJECT(cancel_button), "clicked", G_CALLBACK(hide_moodbar_process), moodbar_wait_dialog); gtk_dialog_add_action_widget(GTK_DIALOG(moodbar_wait_dialog), cancel_button, -1); cancel_button = gtk_button_new_with_mnemonic(_("_Cancel")); g_signal_connect(G_OBJECT(cancel_button), "clicked", G_CALLBACK(cancel_moodbar_process), NULL); gtk_dialog_add_action_widget(GTK_DIALOG(moodbar_wait_dialog), cancel_button, -1); gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(moodbar_wait_dialog), _("The moodbar tool analyzes your audio file and generates a colorful representation of the audio data.")); gtk_window_set_title(GTK_WINDOW(moodbar_wait_dialog), _("Generating moodbar")); gtk_widget_show_all(moodbar_wait_dialog); // Update progress bar/window in idle thread if (moodbar_update_source_id) { g_source_remove(moodbar_update_source_id); } moodbar_update_source_id = g_timeout_add(500, update_moodbar_func, child); } else { fprintf(stderr, "fork() failed for moodbar process: %s\n", strerror(errno)); } } MoodbarData * moodbar_open(const gchar *filename) { gchar *fn = get_moodbar_filename(filename); FILE *fp = fopen(fn, "rb"); if (!fp) { free(fn); return NULL; } MoodbarData *result = calloc(sizeof(MoodbarData), 1); fseek(fp, 0, SEEK_END); long length = ftell(fp); fseek(fp, 0, SEEK_SET); result->numFrames = length/3; result->frames = calloc(result->numFrames, sizeof(GdkRGBA)); unsigned long pos = 0; guchar tmp[3]; while (fread(&tmp, 3, 1, fp) > 0) { result->frames[pos].red = (float)tmp[0]/255.f; result->frames[pos].green = (float)tmp[1]/255.f; result->frames[pos].blue = (float)tmp[2]/255.f; pos++; } fclose(fp); free(fn); return result; } void moodbar_free(MoodbarData *data) { free(data->frames); free(data); } #else void moodbar_generate(GtkWidget *window, const gchar *filename) { } MoodbarData * moodbar_open(const gchar *filename) { return NULL; } void moodbar_free(MoodbarData *data) { } #endif wavbreaker-0.16/src/moodbar.h000066400000000000000000000022631435035650500161650ustar00rootroot00000000000000#pragma once /* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002-2005 Timothy Robinson * Copyright (C) 2007-2019 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include typedef struct MoodbarData_ MoodbarData; struct MoodbarData_ { unsigned long numFrames; GdkRGBA *frames; }; void moodbar_generate(GtkWidget *window, const gchar *filename); void moodbar_abort(); MoodbarData * moodbar_open(const gchar *filename); void moodbar_free(MoodbarData *data); wavbreaker-0.16/src/overwritedialog.c000066400000000000000000000040521435035650500177410ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "overwritedialog.h" #include "gettext.h" enum OverwriteDecision overwritedialog_show(GtkWidget *main_window, const char *filename) { GtkDialog *dialog = GTK_DIALOG(gtk_message_dialog_new(GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("%s already exists. Overwrite?"), filename)); gtk_dialog_add_buttons(dialog, _("Skip all"), OVERWRITE_DECISION_SKIP_ALL, _("Skip"), OVERWRITE_DECISION_SKIP, _("Overwrite"), OVERWRITE_DECISION_OVERWRITE, _("Overwrite all"), OVERWRITE_DECISION_OVERWRITE_ALL, NULL); gtk_dialog_set_default_response(dialog, OVERWRITE_DECISION_OVERWRITE); enum OverwriteDecision decision = OVERWRITE_DECISION_SKIP_ALL; int result = gtk_dialog_run(dialog); switch (result) { case OVERWRITE_DECISION_SKIP_ALL: case OVERWRITE_DECISION_SKIP: case OVERWRITE_DECISION_OVERWRITE: case OVERWRITE_DECISION_OVERWRITE_ALL: decision = result; break; default: case GTK_RESPONSE_NONE: break; } gtk_widget_destroy(GTK_WIDGET(dialog)); return decision; } wavbreaker-0.16/src/overwritedialog.h000066400000000000000000000020341435035650500177440ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 OVERWRITEDIALOG_H #define OVERWRITEDIALOG_H #include #include "sample.h" enum OverwriteDecision overwritedialog_show(GtkWidget *main_window, const char *filename); #endif /* OVERWRITEDIALOG_H */ wavbreaker-0.16/src/popupmessage.c000066400000000000000000000035621435035650500172500ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2003 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include "wavbreaker.h" void popupmessage_hide( GtkDialog *dialog, int response_id, gpointer user_data) { gtk_widget_destroy( GTK_WIDGET(user_data)); } void popupmessage_show( GtkWidget *main_window, const char *message, const char *description) { GtkWidget *dialog; gint buttons_type = GTK_BUTTONS_OK; if( main_window == NULL) { main_window = wavbreaker_get_main_window(); buttons_type = GTK_BUTTONS_CLOSE; } dialog = gtk_message_dialog_new( GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, buttons_type, "%s", message); gtk_message_dialog_format_secondary_text( GTK_MESSAGE_DIALOG(dialog), "%s", description); gtk_window_set_title( GTK_WINDOW(dialog), message); g_signal_connect( G_OBJECT(dialog), "response", (GCallback)popupmessage_hide, dialog); gtk_widget_show_all( GTK_WIDGET(dialog)); } wavbreaker-0.16/src/popupmessage.h000066400000000000000000000017441435035650500172550ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2003 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 POPUPMESSAGE_H #define POPUPMESSAGE_H #include void popupmessage_show(GtkWidget *, const char *, const char *); #endif /* POPUPMESSAGE_H */ wavbreaker-0.16/src/reallyquit.c000066400000000000000000000033071435035650500167300ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "reallyquit.h" #include "gettext.h" gboolean reallyquit_show(GtkWidget *main_window) { gboolean result = FALSE; const gchar *message = _("Quit wavbreaker?"); const gchar *info_text = _("If you quit wavbreaker now, any unsaved chunks will be lost."); GtkMessageDialog *dialog = (GtkMessageDialog*)gtk_message_dialog_new( GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "%s", message); gtk_window_set_title(GTK_WINDOW(dialog), message); gtk_message_dialog_format_secondary_text(dialog, "%s", info_text); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) { result = TRUE; } gtk_widget_destroy(GTK_WIDGET(dialog)); return result; } wavbreaker-0.16/src/reallyquit.h000066400000000000000000000017041435035650500167340ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 REALLYQUIT_H #define REALLYQUIT_H #include gboolean reallyquit_show(GtkWidget *); #endif /* REALLYQUIT_H */ wavbreaker-0.16/src/sample.c000066400000000000000000000411221435035650500160130ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "sample.h" #include #include #include #include #include #include #include #include #include "aoaudio.h" #include "sample_info.h" #include "track_break.h" #include "format.h" #include "gettext.h" typedef struct WriteThreadData_ WriteThreadData; struct WriteThreadData_ { Sample *sample; TrackBreakList *list; WriteStatusCallbacks *callbacks; const char *outputdir; }; struct Sample_ { OpenedAudioFile *opened_audio_file; gchar *filename_dirname; gchar *filename_basename; gchar *basename_without_extension; GMutex load_mutex; gboolean loaded; GraphData graph_data; double load_percentage; GThread *play_thread; GMutex play_mutex; gboolean playing; gboolean kill_play_thread; gulong play_position; unsigned long play_start_position; GMutex write_mutex; gboolean writing; WriteThreadData write_thread_data; }; static void sample_max_min(Sample *sample); static long read_sample(OpenedAudioFile *oaf, unsigned char *buf, int buf_size, unsigned long start_pos) { if (oaf != NULL) { return format_read_samples(oaf, buf, buf_size, start_pos); } return -1; } void sample_init() { format_init(); } static gpointer play_thread(gpointer thread_data) { Sample *sample = thread_data; int read_ret = 0; int i; unsigned char *devbuf; /* printf("play_thread: calling open_audio_device\n"); */ if (ao_audio_open_device(&sample->opened_audio_file->sample_info) != 0) { g_mutex_lock(&sample->play_mutex); sample->playing = FALSE; ao_audio_close_device(); g_mutex_unlock(&sample->play_mutex); //printf("play_thread: return from open_audio_device != 0\n"); return NULL; } //printf("play_thread: return from open_audio_device\n"); i = 0; devbuf = malloc(DEFAULT_BUF_SIZE); if (devbuf == NULL) { g_mutex_lock(&sample->play_mutex); sample->playing = FALSE; ao_audio_close_device(); g_mutex_unlock(&sample->play_mutex); printf("play_thread: out of memory\n"); return NULL; } read_ret = read_sample(sample->opened_audio_file, devbuf, DEFAULT_BUF_SIZE, sample->play_start_position + (DEFAULT_BUF_SIZE * i++)); while (read_ret > 0 && read_ret <= DEFAULT_BUF_SIZE) { /* if (read_ret < 0) { printf("read_ret: %d\n", read_ret); } */ ao_audio_write(devbuf, read_ret); if (g_mutex_trylock(&sample->play_mutex)) { if (sample->kill_play_thread) { ao_audio_close_device(); sample->playing = FALSE; sample->kill_play_thread = FALSE; g_mutex_unlock(&sample->play_mutex); return NULL; } g_mutex_unlock(&sample->play_mutex); } read_ret = read_sample(sample->opened_audio_file, devbuf, DEFAULT_BUF_SIZE, sample->play_start_position + (DEFAULT_BUF_SIZE * i++)); g_mutex_lock(&sample->play_mutex); sample->play_position = ((DEFAULT_BUF_SIZE * i) + sample->play_start_position) / sample->opened_audio_file->sample_info.blockSize; g_mutex_unlock(&sample->play_mutex); } g_mutex_lock(&sample->play_mutex); ao_audio_close_device(); sample->playing = FALSE; g_mutex_unlock(&sample->play_mutex); return NULL; } gboolean sample_is_playing(Sample *sample) { gboolean result; g_mutex_lock(&sample->play_mutex); result = sample->playing; g_mutex_unlock(&sample->play_mutex); return result; } gulong sample_get_play_marker(Sample *sample) { gulong result; g_mutex_lock(&sample->play_mutex); result = sample->play_position; g_mutex_unlock(&sample->play_mutex); return result; } gboolean sample_is_writing(Sample *sample) { gboolean result; g_mutex_lock(&sample->write_mutex); result = sample->writing; g_mutex_unlock(&sample->write_mutex); return result; } int sample_play(Sample *sample, gulong startpos) { g_mutex_lock(&sample->play_mutex); if (sample->playing) { g_mutex_unlock(&sample->play_mutex); return 2; } if (sample->opened_audio_file == NULL) { g_mutex_unlock(&sample->play_mutex); return 3; } sample->playing = TRUE; sample->play_start_position = startpos * sample->opened_audio_file->sample_info.blockSize; /* setup thread */ sample->play_position = startpos; sample->play_thread = g_thread_new("play_sample", play_thread, sample); g_mutex_unlock(&sample->play_mutex); return 0; } void sample_stop(Sample *sample) { g_mutex_lock(&sample->play_mutex); if (!sample->playing) { g_mutex_unlock(&sample->play_mutex); return; } sample->kill_play_thread = TRUE; g_mutex_unlock(&sample->play_mutex); // Wait for play thread to actually quit g_thread_join(g_steal_pointer(&sample->play_thread)); } static gpointer open_thread(gpointer data) { Sample *sample = data; sample_max_min(sample); return NULL; } Sample * sample_open(const char *filename, char **error_message) { Sample *sample = g_new0(Sample, 1); sample->opened_audio_file = format_open_file(filename, error_message); if (sample->opened_audio_file == NULL) { g_free(sample); g_message("Could not open %s with format_open_file(): %s", filename, *error_message); return NULL; } sample->filename_dirname = g_path_get_dirname(filename); sample->filename_basename = g_path_get_basename(filename); gchar *tmp = g_strdup(sample->filename_basename); if (format_module_filename_extension_check(sample->opened_audio_file->mod, tmp, NULL)) { tmp[strlen(tmp)-strlen(sample->opened_audio_file->mod->default_file_extension)] = '\0'; } else { gchar *end = strrchr(tmp, '.'); if (end) { *end = '\0'; } } sample->basename_without_extension = tmp; g_mutex_init(&sample->load_mutex); g_mutex_init(&sample->play_mutex); g_mutex_init(&sample->write_mutex); // TODO: Capture thread and properly tear it down - if needed - in sample_close() g_thread_unref(g_thread_new("open file", open_thread, sample)); return sample; } void sample_print_file_info(Sample *sample) { format_print_file_info(sample->opened_audio_file); } GraphData * sample_get_graph_data(Sample *sample) { GraphData *result = NULL; g_mutex_lock(&sample->load_mutex); if (sample->loaded) { result = &sample->graph_data; } g_mutex_unlock(&sample->load_mutex); return result; } unsigned long sample_get_num_sample_blocks(Sample *sample) { return sample->graph_data.numSamples; } void sample_close(Sample *sample) { g_free(sample->basename_without_extension); g_free(sample->filename_basename); g_free(sample->filename_dirname); if (sample->opened_audio_file != NULL) { format_close_file(g_steal_pointer(&sample->opened_audio_file)); } g_free(sample); } gboolean sample_is_loaded(Sample *sample) { gboolean result; g_mutex_lock(&sample->load_mutex); result = sample->loaded; g_mutex_unlock(&sample->load_mutex); return result; } double sample_get_load_percentage(Sample *sample) { double result; g_mutex_lock(&sample->load_mutex); result = sample->load_percentage; g_mutex_unlock(&sample->load_mutex); return result; } uint64_t sample_get_file_size(Sample *sample) { return sample->opened_audio_file->file_size; } const char * sample_get_filename(Sample *sample) { return sample->opened_audio_file->filename; } const char * sample_get_dirname(Sample *sample) { return sample->filename_dirname; } const char * sample_get_basename(Sample *sample) { return sample->filename_basename; } const char * sample_get_basename_without_extension(Sample *sample) { return sample->basename_without_extension; } static void sample_max_min(Sample *sample) { GraphData *graphData = &sample->graph_data; SampleInfo *sample_info = &sample->opened_audio_file->sample_info; int tmp = 0; long int ret = 0; int min, max, xtmp; int min_sample, max_sample; long int i, k; long int numSampleBlocks; long int tmp_sample_calc; unsigned char devbuf[sample->opened_audio_file->sample_info.blockSize]; Points *graph_data; tmp_sample_calc = sample_info->numBytes; tmp_sample_calc = tmp_sample_calc / sample_info->blockSize; numSampleBlocks = (tmp_sample_calc + 1); /* DEBUG CODE START */ /* printf("\nsample_info->numBytes: %lu\n", sample_info->numBytes); printf("sample_info->bitsPerSample: %d\n", sample_info->bitsPerSample); printf("sample_info->blockSize: %d\n", sample_info->blockSize); printf("sample_info->channels: %d\n", sample_info->channels); printf("numSampleBlocks: %d\n\n", numSampleBlocks); */ /* DEBUG CODE END */ graph_data = (Points *)malloc(numSampleBlocks * sizeof(Points)); if (graph_data == NULL) { printf("NULL returned from malloc of graph_data\n"); return; } i = 0; ret = read_sample(sample->opened_audio_file, devbuf, sample_info->blockSize, sample_info->blockSize * i); min_sample = SHRT_MAX; /* highest value for 16-bit samples */ max_sample = 0; while (ret == sample_info->blockSize && i < numSampleBlocks) { min = max = 0; for (k = 0; k < ret; k++) { if (sample_info->bitsPerSample == 8) { tmp = devbuf[k]; tmp -= 128; } else if (sample_info->bitsPerSample == 16) { tmp = (char)devbuf[k+1] << 8 | (char)devbuf[k]; k++; } else if (sample_info->bitsPerSample == 24) { tmp = ((char)devbuf[k]) | ((char)devbuf[k+1] << 8); tmp &= 0x0000ffff; xtmp = (char)devbuf[k+2] << 16; tmp |= xtmp; k += 2; } if (tmp > max) { max = tmp; } else if (tmp < min) { min = tmp; } // skip over any extra channels k += (sample_info->channels - 1) * (sample_info->bitsPerSample / 8); } graph_data[i].min = min; graph_data[i].max = max; if( min_sample > (max-min)) { min_sample = (max-min); } if( max_sample < (max-min)) { max_sample = (max-min); } ret = read_sample(sample->opened_audio_file, devbuf, sample_info->blockSize, sample_info->blockSize * i); g_mutex_lock(&sample->load_mutex); sample->load_percentage = (double) i / numSampleBlocks; g_mutex_unlock(&sample->load_mutex); i++; } graphData->numSamples = numSampleBlocks; if (graphData->data != NULL) { free(graphData->data); } graphData->data = graph_data; graphData->minSampleAmp = min_sample; graphData->maxSampleAmp = max_sample; if (sample_info->bitsPerSample == 8) { graphData->maxSampleValue = UCHAR_MAX; } else if (sample_info->bitsPerSample == 16) { graphData->maxSampleValue = SHRT_MAX; } else if (sample_info->bitsPerSample == 24) { graphData->maxSampleValue = 0x7fffff; } g_mutex_lock(&sample->load_mutex); sample->load_percentage = 1.0; sample->loaded = TRUE; g_mutex_unlock(&sample->load_mutex); } static void trampoline_file_progress_changed(double progress, void *user_data) { WriteStatusCallbacks *callbacks = user_data; callbacks->on_file_progress_changed(progress, callbacks->user_data); } static gpointer write_thread(gpointer data) { WriteThreadData *thread_data = data; TrackBreakList *list = thread_data->list; GList *tbl_head = list->breaks; GList *tbl_cur, *tbl_next; const char *outputdir = thread_data->outputdir; TrackBreak *tb_cur, *tb_next; WriteStatusCallbacks *callbacks = thread_data->callbacks; Sample *sample = thread_data->sample; unsigned long start_pos, end_pos; char filename[1024]; gulong num_files = 0; enum OverwriteDecision overwrite_decision = OVERWRITE_DECISION_ASK; tbl_cur = tbl_head; while (tbl_cur != NULL) { tb_cur = tbl_cur->data; if (tb_cur->write == TRUE) { ++num_files; } tbl_cur = g_list_next(tbl_cur); } int i = 1; tbl_cur = tbl_head; tbl_next = g_list_next(tbl_cur); while (tbl_cur != NULL && !callbacks->is_cancelled(callbacks->user_data)) { tb_cur = tbl_cur->data; if (tb_cur->write) { start_pos = tb_cur->offset * sample->opened_audio_file->sample_info.blockSize; if (tbl_next == NULL) { end_pos = 0; tb_next = NULL; } else { tb_next = tbl_next->data; end_pos = tb_next->offset * sample->opened_audio_file->sample_info.blockSize; } /* add output directory to filename */ strcpy(filename, outputdir); strcat(filename, "/"); gchar *tmp = track_break_get_filename(tb_cur, list); strcat(filename, tmp); g_free(tmp); // TODO: CDDA needs .cdda.raw file extension, not .raw const char *source_file_extension = sample->opened_audio_file->filename ? strrchr(sample->opened_audio_file->filename, '.') : NULL; if (source_file_extension == NULL) { /* Fallback extensions if not in source filename */ if (sample->opened_audio_file != NULL) { source_file_extension = sample->opened_audio_file->mod->default_file_extension; } } /* add file extension to filename */ if (source_file_extension != NULL && strstr(filename, source_file_extension) == NULL) { strcat(filename, source_file_extension); } callbacks->on_file_changed(i, num_files, filename, callbacks->user_data); callbacks->on_file_progress_changed(0.0, callbacks->user_data); gboolean file_exists = g_file_test(filename, G_FILE_TEST_EXISTS); if (file_exists && overwrite_decision == OVERWRITE_DECISION_ASK) { overwrite_decision = callbacks->ask_overwrite(filename, callbacks->user_data); } if (!file_exists || overwrite_decision == OVERWRITE_DECISION_OVERWRITE || overwrite_decision == OVERWRITE_DECISION_OVERWRITE_ALL) { if (format_write_file(sample->opened_audio_file, filename, start_pos, end_pos, trampoline_file_progress_changed, callbacks) == -1) { g_warning("Could not write file %s", filename); callbacks->on_error(filename, callbacks->user_data); } } callbacks->on_file_progress_changed(1.0, callbacks->user_data); if (overwrite_decision != OVERWRITE_DECISION_SKIP_ALL && overwrite_decision != OVERWRITE_DECISION_OVERWRITE_ALL) { overwrite_decision = OVERWRITE_DECISION_ASK; } i++; } tbl_cur = g_list_next(tbl_cur); tbl_next = g_list_next(tbl_next); } g_mutex_lock(&sample->write_mutex); sample->writing = FALSE; g_mutex_unlock(&sample->write_mutex); callbacks->on_finished(callbacks->user_data); return NULL; } void sample_write_files(Sample *sample, TrackBreakList *list, WriteStatusCallbacks *callbacks, const char *output_dir) { sample->write_thread_data = (WriteThreadData) { .sample = sample, .list = list, .callbacks = callbacks, .outputdir = output_dir, }; g_mutex_lock(&sample->write_mutex); sample->writing = TRUE; g_mutex_unlock(&sample->write_mutex); // TODO: Capture thread and properly tear it down - if needed - in sample_close() g_thread_unref(g_thread_new("write data", write_thread, &sample->write_thread_data)); } wavbreaker-0.16/src/sample.h000066400000000000000000000067421435035650500160310ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002-2005 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SAMPLE_H #define SAMPLE_H #include "sample_info.h" #include "track_break.h" #include #include #include typedef struct Points_ Points; struct Points_ { int min, max; }; typedef struct GraphData_ GraphData; struct GraphData_{ unsigned long numSamples; unsigned long maxSampleValue; unsigned long maxSampleAmp; unsigned long minSampleAmp; Points *data; }; enum OverwriteDecision { OVERWRITE_DECISION_NONE = 0, OVERWRITE_DECISION_ASK, OVERWRITE_DECISION_SKIP, OVERWRITE_DECISION_SKIP_ALL, OVERWRITE_DECISION_OVERWRITE, OVERWRITE_DECISION_OVERWRITE_ALL, }; typedef struct WriteStatusCallbacks_ WriteStatusCallbacks; struct WriteStatusCallbacks_ { // Write thread reporting to the UI void (*on_file_changed)(guint position, guint total, const char *filename, void *user_data); void (*on_file_progress_changed)(double percentage, void *user_data); void (*on_error)(const char *message, void *user_data); void (*on_finished)(void *user_data); // Write thread querying the UI gboolean (*is_cancelled)(void *user_data); enum OverwriteDecision (*ask_overwrite)(const char *filename, void *user_data); // Closure pointer passed to the callbacks void *user_data; }; typedef struct WriteInfo_ WriteInfo; struct WriteInfo_ { guint num_files; guint cur_file; char *cur_filename; double pct_done; guint sync; gint check_file_exists; gint skip_file; /* -1 = waiting for check * 0 = don't overwrite file * 1 = file is ok to overwrite * 2 = overwrite all files */ gint sync_check_file_overwrite_to_write_progress; GList *errors; }; void sample_init(); typedef struct Sample_ Sample; Sample * sample_open(const char *filename, char **error_message); void sample_print_file_info(Sample *sample); void sample_close(Sample *sample); gboolean sample_is_loaded(Sample *sample); double sample_get_load_percentage(Sample *sample); uint64_t sample_get_file_size(Sample *sample); const char * sample_get_dirname(Sample *sample); const char * sample_get_filename(Sample *sample); const char * sample_get_basename(Sample *sample); const char * sample_get_basename_without_extension(Sample *sample); int sample_play(Sample *sample, gulong startpos); gulong sample_get_play_marker(Sample *sample); void sample_stop(Sample *sample); void sample_write_files(Sample *sample, TrackBreakList *list, WriteStatusCallbacks *callbacks, const char *output_dir); GraphData * sample_get_graph_data(Sample *sample); unsigned long sample_get_num_sample_blocks(Sample *sample); gboolean sample_is_playing(Sample *sample); gboolean sample_is_writing(Sample *sample); #endif /* SAMPLE_H*/ wavbreaker-0.16/src/sample_info.h000066400000000000000000000023261435035650500170360ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002-2005 Timothy Robinson * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #define DEFAULT_BUF_SIZE (4096) #define CD_BLOCKS_PER_SEC (75) typedef struct SampleInfo_ SampleInfo; struct SampleInfo_ { unsigned short channels; unsigned int samplesPerSec; unsigned int avgBytesPerSec; unsigned short blockAlign; unsigned short bitsPerSample; unsigned long numBytes; unsigned int blockSize; }; wavbreaker-0.16/src/saveas.c000066400000000000000000000041751435035650500160230ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2005 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include #include "sample_info.h" #include "wavbreaker.h" #include "gettext.h" static char *saveas_dirname = NULL; char *saveas_get_dirname() { return saveas_dirname; } void saveas_set_dirname(const char *val) { if (saveas_dirname != NULL) { g_free(saveas_dirname); } saveas_dirname = g_strdup(val); } void saveas_show(GtkWidget *parent_window) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new( _("Select folder to save wave files"), GTK_WINDOW(parent_window), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_ACCEPT, NULL); if( saveas_get_dirname() == NULL) { saveas_set_dirname( getenv( "PWD")); } gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(dialog), saveas_get_dirname()); if( gtk_dialog_run( GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { saveas_set_dirname( gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(dialog))); wavbreaker_write_files( saveas_get_dirname()); } gtk_widget_destroy( GTK_WIDGET(dialog)); } wavbreaker-0.16/src/saveas.h000066400000000000000000000017351435035650500160270ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2005 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 SAVEAS_H #define SAVEAS_H void saveas_show(GtkWidget *); char *saveas_get_dirname(); void saveas_set_dirname(const char *); #endif /* SAVEAS_H */ wavbreaker-0.16/src/toc.c000066400000000000000000000060121435035650500153160ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2005 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include #include "track_break.h" #include "sample_info.h" #include "toc.h" gboolean toc_read_file(const char *toc_filename, TrackBreakList *list) { char buf[1024]; gchar *ptr, *eptr; guint offset; FILE *fp = fopen(toc_filename, "r"); if (!fp) { return FALSE; } track_break_list_clear(list); do { do { ptr = fgets(buf, sizeof(buf), fp); if (!ptr) { if (feof(fp)) { fclose(fp); return TRUE; } else { goto error; } } } while(memcmp(buf, "FILE", 4)); ptr = strrchr(buf, '"'); if (!ptr) { goto error; } ptr += 2; eptr = strchr(ptr, ':'); if (!eptr) { goto error; } eptr += 6; *eptr = '\0'; offset = msf_time_to_offset(ptr); track_break_list_add_offset(list, TRUE, offset, NULL); } while (!feof(fp)); fclose(fp); return TRUE; error: fclose( fp ); return FALSE; } struct WriteTOCForEach { FILE *fp; const char *wav_filename; }; static void write_toc_entry(int index, gboolean write, gulong start_offset, gulong end_offset, const gchar *filename, void *user_data) { struct WriteTOCForEach *wtfe = user_data; fprintf(wtfe->fp, "\n// track %02d\n", index); fprintf(wtfe->fp, "TRACK AUDIO\n"); gchar *tocTime = track_break_format_timestamp(start_offset, TRUE); gchar *tocDuration = track_break_format_timestamp(end_offset - start_offset, TRUE); fprintf(wtfe->fp, "FILE \"%s\" %s %s\n", wtfe->wav_filename, tocTime, tocDuration); g_free(tocDuration); g_free(tocTime); } gboolean toc_write_file(const char *toc_filename, const char *wav_filename, TrackBreakList *list) { FILE *fp = fopen(toc_filename, "w"); if (!fp) { return FALSE; } fprintf(fp, "// Generated with wavbreaker\n\nCD_DA\n"); struct WriteTOCForEach wtfe = { .fp = fp, .wav_filename = wav_filename, }; track_break_list_foreach(list, write_toc_entry, &wtfe); fclose(fp); return TRUE; } wavbreaker-0.16/src/toc.h000066400000000000000000000021141435035650500153220ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2005 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 TOC_H #define TOC_H #include #include "track_break.h" gboolean toc_read_file(const char *toc_filename, TrackBreakList *list); gboolean toc_write_file(const char *toc_filename, const char *wav_filename, TrackBreakList *list); #endif /* TOC_H */ wavbreaker-0.16/src/track_break.c000066400000000000000000000157161435035650500170140ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002-2005 Timothy Robinson * Copyright (C) 2007, 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "track_break.h" #include "sample_info.h" // FIXME: Remove appconfig dependency #include "appconfig.h" #include gchar * track_break_format_timestamp(gulong time, gboolean toc_format) { int min = time / (CD_BLOCKS_PER_SEC * 60); int sec = time % (CD_BLOCKS_PER_SEC * 60); int subsec = sec % CD_BLOCKS_PER_SEC; sec = sec / CD_BLOCKS_PER_SEC; if (toc_format) { return g_strdup_printf("%d:%02d:%02d", min, sec, subsec); } else { return g_strdup_printf("%d:%02d.%02d", min, sec, subsec); } } void track_break_rename(TrackBreak *track_break, const char *new_name) { if (track_break->filename != NULL) { g_free(g_steal_pointer(&track_break->filename)); } if (new_name != NULL && strlen(new_name) > 0) { track_break->filename = g_strdup(new_name); } } /** @param str Time in MM:SS:FF format (where there are CD_BLOCKS_PER_SEC frames per second). * @return offset in frames. */ guint msf_time_to_offset(const gchar *str) { guint offset; int mm = 0, ss = 0, ff = 0; int consumed; consumed = sscanf(str, "%d:%d:%d", &mm, &ss, &ff); if (consumed != 3) { return 0; } offset = mm * CD_BLOCKS_PER_SEC * 60; offset += ss * CD_BLOCKS_PER_SEC; offset += ff; return offset; } TrackBreakList * track_break_list_new(const char *basename) { TrackBreakList *list = g_new0(TrackBreakList, 1); list->basename = g_strdup(basename); return list; } void track_break_list_set_total_duration(TrackBreakList *list, gulong total_duration) { list->total_duration = total_duration; } void track_break_list_foreach(TrackBreakList *list, track_break_visitor_func visitor, void *visitor_user_data) { int index = 0; GList *cur = g_list_first(list->breaks); while (cur != NULL) { TrackBreak *track_break = cur->data; GList *next = g_list_next(cur); TrackBreak *next_track_break = (next != NULL) ? next->data : NULL; gulong start_offset = track_break->offset; gulong end_offset = (next_track_break != NULL) ? next_track_break->offset : list->total_duration; gchar *filename = track_break_get_filename(track_break, list); visitor(index++, track_break->write, start_offset, end_offset, filename, visitor_user_data); g_free(filename); cur = next; } } static void track_break_free_element(gpointer data, gpointer user_data) { TrackBreak *track_break = data; g_free(track_break->filename); g_free(track_break); } void track_break_list_remove_nth_element(TrackBreakList *list, int index) { TrackBreak *track_break = g_list_nth_data(list->breaks, index); list->breaks = g_list_remove(list->breaks, track_break); track_break_free_element(track_break, NULL); } void track_break_list_clear(TrackBreakList *list) { g_list_foreach(list->breaks, track_break_free_element, NULL); g_list_free(g_steal_pointer(&list->breaks)); } void track_break_list_free(TrackBreakList *list) { track_break_list_clear(list); g_free(list->basename); g_free(list); } static gint track_break_cmp(gconstpointer a, gconstpointer b) { const TrackBreak *x = a; const TrackBreak *y = b; if (x->offset < y->offset) { return -1; } else if (x->offset > y->offset) { return 1; } else { return 0; } } TrackBreak * track_break_list_add_offset(TrackBreakList *list, gboolean write, gulong offset, const char *filename) { if (offset > list->total_duration) { g_warning("Offset out of range"); return NULL; } // Check for existing track break GList *cur = list->breaks; while (cur != NULL) { TrackBreak *existing = cur->data; if (existing->offset == offset) { return existing; } cur = g_list_next(cur); } TrackBreak *track_break = g_new0(TrackBreak, 1); track_break->write = write; track_break->offset = offset; track_break->filename = filename ? g_strdup(filename) : NULL; list->breaks = g_list_insert_sorted(list->breaks, track_break, track_break_cmp); return track_break; } struct GetDiscNumber { int track_index; int disc_num; int track_num; int cd_length_minutes; int disc_remaining_minutes; }; static void get_disc_number_visitor(int index, gboolean write, gulong start_offset, gulong end_offset, const char *filename, void *user_data) { struct GetDiscNumber *gdn = user_data; if (index > gdn->track_index) { return; } const gulong CD_BLOCKS_PER_MINUTE = 60 * CD_BLOCKS_PER_SEC; gulong duration_minutes = (end_offset - start_offset + CD_BLOCKS_PER_MINUTE - 1) / CD_BLOCKS_PER_MINUTE; if (duration_minutes > gdn->disc_remaining_minutes) { gdn->disc_num++; gdn->track_num = 0; gdn->disc_remaining_minutes = gdn->cd_length_minutes; } gdn->track_num++; gdn->disc_remaining_minutes -= duration_minutes; } gchar * track_break_get_filename(TrackBreak *track_break, TrackBreakList *list) { if (track_break->filename != NULL) { return g_strdup(track_break->filename); } int index = g_list_index(list->breaks, track_break); if (appconfig_get_use_etree_filename_suffix()) { struct GetDiscNumber gdn = { .track_index = index, .disc_num = 0, .track_num = 0, .cd_length_minutes = atoi(appconfig_get_etree_cd_length()), .disc_remaining_minutes = 0, }; track_break_list_foreach(list, get_disc_number_visitor, &gdn); return g_strdup_printf("%sd%dt%02d", list->basename, gdn.disc_num, gdn.track_num); } else if (appconfig_get_prepend_file_number()) { return g_strdup_printf("%02d%s%s", index + 1, appconfig_get_etree_filename_suffix(), list->basename); } return g_strdup_printf("%s%s%02d", list->basename, appconfig_get_etree_filename_suffix(), index + 1); } void track_break_list_reset_filenames(TrackBreakList *list) { GList *cur = list->breaks; while (cur != NULL) { TrackBreak *track_break = cur->data; track_break_rename(track_break, NULL); cur = g_list_next(cur); } } wavbreaker-0.16/src/track_break.h000066400000000000000000000042311435035650500170070ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002-2005 Timothy Robinson * Copyright (C) 2007, 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include typedef struct TrackBreak_ TrackBreak; struct TrackBreak_ { gboolean write; gulong offset; gchar *filename; }; void track_break_rename(TrackBreak *track_break, const char *new_name); gchar * track_break_format_timestamp(gulong time, gboolean toc_format); guint msf_time_to_offset(const gchar *str); typedef struct TrackBreakList { gchar *basename; GList *breaks; gulong total_duration; } TrackBreakList; gchar * track_break_get_filename(TrackBreak *track_break, TrackBreakList *list); TrackBreakList * track_break_list_new(const char *basename); void track_break_list_clear(TrackBreakList *list); TrackBreak * track_break_list_add_offset(TrackBreakList *list, gboolean write, gulong offset, const char *filename); void track_break_list_set_total_duration(TrackBreakList *list, gulong total_duration); typedef void (*track_break_visitor_func)(int index, gboolean write, gulong start_offset, gulong end_offset, const gchar *filename, void *user_data); void track_break_list_foreach(TrackBreakList *list, track_break_visitor_func visitor, void *visitor_user_data); void track_break_list_remove_nth_element(TrackBreakList *list, int index); void track_break_list_reset_filenames(TrackBreakList *list); void track_break_list_free(TrackBreakList *list); wavbreaker-0.16/src/txt.c000066400000000000000000000060071435035650500153540ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include "txt.h" #include "config.h" #include "track_break.h" #include #include static void track_break_write_text(int index, gboolean write, gulong start_offset, gulong end_offset, const gchar *filename, void *user_data) { FILE *fp = user_data; if (write) { fprintf(fp, "%lu=%s\n", start_offset, filename); } else { fprintf(fp, "%lu\n", start_offset); } } gboolean txt_write_file(const char *txt_filename, const char *wav_filename, TrackBreakList *list) { FILE *fp = fopen(txt_filename, "w"); if (!fp) { g_warning("Could not open %s for writing: %s", txt_filename, strerror(errno)); return FALSE; } fprintf(fp, "\n; Created by " PACKAGE " " VERSION "\n; http://thpinfo.com/2006/wavbreaker/tb-file-format.txt\n\n"); track_break_list_foreach(list, track_break_write_text, fp); fprintf(fp, "\n; Total breaks: %d\n; Original file: %s\n\n", g_list_length(list->breaks), wav_filename); fclose(fp); return TRUE; } gboolean txt_read_file(const char *filename, TrackBreakList *list) { char tmp[1024]; char *fname; FILE *fp = fopen(filename, "r"); if (!fp) { g_warning("Cannot open %s: %s", filename, strerror(errno)); return FALSE; } track_break_list_clear(list); char *ptr = tmp; while(!feof(fp)) { int c = fgetc(fp); if (c == EOF) { break; } if (c == '\n') { *ptr = '\0'; if (ptr != tmp && tmp[0] != ';') { fname = strchr(tmp, '='); if (fname == NULL) { track_break_list_add_offset(list, FALSE, atol(tmp), NULL); } else { *(fname++) = '\0'; while (*fname == ' ') { fname++; } track_break_list_add_offset(list, TRUE, atol(tmp), fname); } } ptr = tmp; } else { *ptr++ = c; if (ptr > tmp+sizeof(tmp)) { g_warning("Error parsing file %s", filename); fclose(fp); return FALSE; } } } fclose(fp); return TRUE; } wavbreaker-0.16/src/txt.h000066400000000000000000000020321435035650500153530ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2022 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #pragma once #include #include "track_break.h" gboolean txt_read_file(const char *filename, TrackBreakList *list); gboolean txt_write_file(const char *txt_filename, const char *wav_filename, TrackBreakList *list); wavbreaker-0.16/src/wavbreaker.c000066400000000000000000002642061435035650500166750ustar00rootroot00000000000000/* -*- c-basic-offset: 4 -*- */ /* wavbreaker - A tool to split a wave file up into multiple waves. * Copyright (C) 2002-2006 Timothy Robinson * Copyright (C) 2006-2007 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include #include #include #include #include #include #include #include #include #include "wavbreaker.h" #include "sample.h" #include "about.h" #include "appconfig.h" #include "appconfig_gtk.h" #include "autosplit.h" #include "saveas.h" #include "popupmessage.h" #include "overwritedialog.h" #include "reallyquit.h" #include "guimerge.h" #include "moodbar.h" #include "draw.h" #include "list.h" #include #include "gettext.h" #define APPNAME "wavbreaker" enum { CHECK_ALL = 0, CHECK_NONE, CHECK_INVERT }; /** * When the play marker reaches (x-1)/x (where x is the * value of PLAY_MARKER_SCROLL), scroll the waveform so * that the play marker continues at position 1/x. * * i.e. play marker at 7/8 of width -> go to 1/8 of width **/ #define PLAY_MARKER_SCROLL 8 #define SILENCE_MIN_LENGTH 4 static struct WaveformSurface *sample_surface; static struct WaveformSurface *summary_surface; static GtkWidget *main_window; static GtkWidget *header_bar; static GtkWidget *header_bar_save_button; static GtkWidget *vpane1, *vpane2; static GtkWidget *scrollbar; static GtkAdjustment *adj; static GtkWidget *draw; static GtkWidget *draw_summary; static GtkWidget *play_button; static GtkWidget *jump_to_popover; static GtkWidget *autosplit_popover; static GtkWidget *menu_popover; static GtkWidget *cursor_marker_spinner; static GtkWidget *cursor_marker_min_spinner; static GtkWidget *cursor_marker_sec_spinner; static GtkWidget *cursor_marker_subsec_spinner; static GtkWidget *button_seek_backward; static GtkWidget *button_jump_to_time; static GtkWidget *button_seek_forward; static GtkWidget *button_auto_split; static GtkWidget *button_add_break; static GtkWidget *button_remove_break; static GtkAdjustment *cursor_marker_spinner_adj; static GtkAdjustment *cursor_marker_min_spinner_adj; static GtkAdjustment *cursor_marker_sec_spinner_adj; static GtkAdjustment *cursor_marker_subsec_spinner_adj; static Sample *g_sample = NULL; static MoodbarData *moodbarData; static gulong cursor_marker; static int pixmap_offset; // one-shot idle_add-style event sources static guint open_file_source_id; static guint redraw_source_id; // timeout-based (periodic) progress UI update event sources static guint file_open_progress_source_id; static guint play_progress_source_id; static struct FileWriteProgressUI * current_file_write_progress_ui = NULL; enum { COLUMN_WRITE, COLUMN_FILENAME, COLUMN_TIME, COLUMN_DURATION, COLUMN_OFFSET, NUM_COLUMNS }; static TrackBreakList * track_breaks = NULL; static GtkListStore *store = NULL; GtkWidget *treeview; /* *------------------------------------------------------------------------- * Function Prototypes *------------------------------------------------------------------------- */ /* Track Break Functions */ static gboolean track_break_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data); void track_break_write_toggled(GtkWidget *widget, gchar *path_str, gpointer data); void track_break_filename_edited(GtkCellRendererText *cell, const gchar *path_str, const gchar *new_text, gpointer user_data); guint track_break_find_offset(); void track_break_delete_entry(); void track_break_add_entry(); static void track_break_update_gui_model(); void track_break_set_duration(gpointer data, gpointer user_data); /* File Functions */ static void open_file(const char *filename); static void set_title(const char *title); /* Sample and Summary Display Functions */ static void force_redraw(); static void redraw(); static gboolean redraw_later( gpointer data); static void reset_sample_display(guint); static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data); static gboolean draw_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data); static gboolean draw_summary_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data); static gboolean draw_summary_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data); static gboolean draw_summary_button_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data); /* Menu Functions */ static void menu_open_file(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_menu(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_delete_track_break(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_import(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_save(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_save_as(GSimpleAction *action, GVariant *parameter, gpointer user_data); #if defined(WANT_MOODBAR) static void menu_view_moodbar(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_moodbar(GSimpleAction *action, GVariant *parameter, gpointer user_data); #endif static void menu_about(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_config(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_merge(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_export(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_autosplit(gpointer callback_data, guint callback_action, GtkWidget *widget); static void menu_rename(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void menu_play(GtkWidget *widget, gpointer user_data); static void menu_stop(GtkWidget *widget, gpointer user_data); static void menu_next_silence( GtkWidget* widget, gpointer user_data); static void menu_jump_to(GtkWidget *widget, gpointer user_data); static void menu_prev_silence( GtkWidget* widget, gpointer user_data); void menu_add_track_break(GSimpleAction *action, GVariant *parameter, gpointer user_data); static void set_stop_icon(); static void set_play_icon(); static void save_window_sizes(); static void check_really_quit(); static void offset_to_time(guint, gchar *, gboolean); static guint time_to_offset(gint min, gint sec, gint subsec); static void update_status(gboolean); /* static char *status_message = NULL; char *get_status_message() { return status_message; } void set_status_message(const char *val) { if (status_message != NULL) { g_free(status_message); } status_message = g_strdup(val); } */ void parts_check_cb(GtkWidget *widget, gpointer data) { TrackBreak *track_break; guint list_pos; gpointer list_data; gint i; GtkTreeIter iter; i = 0; while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, i++)) { list_pos = i - 1; list_data = g_list_nth_data(track_breaks->breaks, list_pos); track_break = (TrackBreak *)list_data; switch ((glong)data) { case CHECK_ALL: track_break->write = TRUE; break; case CHECK_NONE: track_break->write = FALSE; break; case CHECK_INVERT: track_break->write = !track_break->write; break; } gtk_list_store_set(GTK_LIST_STORE(store), &iter, COLUMN_WRITE, track_break->write, -1); } force_redraw(); } void jump_to_cursor_marker(GSimpleAction *action, GVariant *parameter, gpointer user_data) { reset_sample_display(cursor_marker); redraw(); } void jump_to_track_break(GSimpleAction *action, GVariant *parameter, gpointer user_data) { guint n = 0; n = track_break_find_offset(); if (n <= sample_get_num_sample_blocks(g_sample)) { reset_sample_display(n); } redraw(); } void wavbreaker_autosplit(long x) { long n = x; gulong orig_cursor_marker = cursor_marker; while (n <= sample_get_num_sample_blocks(g_sample)) { cursor_marker = n; track_break_add_entry(); n += x; } cursor_marker = orig_cursor_marker; force_redraw(); } /* *------------------------------------------------------------------------- * Track Break *------------------------------------------------------------------------- */ /* TODO */ /* static void cell_data_func_gpa (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gchar buf[32]; GValue val = {0, }; gtk_tree_model_get_value(model, iter, COLUMN_TIME, &val); g_snprintf(buf, sizeof(buf), "%s", g_value_get_string(&val)); g_printf("text: %s\n", buf); // g_object_set(cell, "text", buf, NULL); } */ static void set_action_enabled(const char *action, gboolean enabled) { g_object_set(G_OBJECT(g_action_map_lookup_action(G_ACTION_MAP(main_window), action)), "enabled", enabled, NULL); } static void on_tree_selection_changed(GtkTreeSelection *selection, gpointer user_data) { gboolean can_remove = TRUE; GList *list = gtk_tree_selection_get_selected_rows(selection, NULL); GList *cur = list; while (cur) { GtkTreePath *path = cur->data; if (gtk_tree_path_get_indices(path)[0] == 0) { can_remove = FALSE; break; } cur = cur->next; } g_list_free(list); set_action_enabled("remove_break", can_remove); } GtkWidget * track_break_create_list_gui() { GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkWidget *sw; /* create the scrolled window for the list */ sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); /* create the data store */ store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT); /* create the treeview */ treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); gtk_container_add(GTK_CONTAINER(sw), treeview); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(on_tree_selection_changed), NULL); /* connect/add the right-click signal */ gtk_widget_add_events(draw_summary, GDK_BUTTON_RELEASE_MASK); gtk_widget_add_events(draw_summary, GDK_BUTTON_PRESS_MASK); g_signal_connect(G_OBJECT(treeview), "button_press_event", G_CALLBACK(track_break_button_press), NULL); gtk_widget_show(treeview); /* create the columns */ /* Write Toggle Column */ column = gtk_tree_view_column_new(); renderer = gtk_cell_renderer_toggle_new(); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(track_break_write_toggled), store); gtk_tree_view_column_set_title(column, _("Write")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "active", COLUMN_WRITE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(column, 50); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* File Name Column */ column = gtk_tree_view_column_new(); renderer = gtk_cell_renderer_text_new(); g_object_set(renderer, "editable", TRUE, NULL); g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(track_break_filename_edited), store); gtk_tree_view_column_set_title(column, _("File Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", COLUMN_FILENAME); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); //gtk_tree_view_column_set_fixed_width(column, 200); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* File Time Start Column */ column = gtk_tree_view_column_new(); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_set_title(column, _("Time")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "text", COLUMN_TIME); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* File Duration Column */ column = gtk_tree_view_column_new(); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_set_title(column, _("Duration")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "text", COLUMN_DURATION); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* File Offset Column */ column = gtk_tree_view_column_new(); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_set_title(column, _("Offset")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "text", COLUMN_OFFSET); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); return sw; } static gboolean track_break_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if ((event->type == GDK_2BUTTON_PRESS) && (event->button == 1)) { cursor_marker = track_break_find_offset(); gtk_spin_button_set_value (GTK_SPIN_BUTTON (cursor_marker_spinner), cursor_marker); jump_to_cursor_marker(NULL, NULL, NULL); return FALSE; } else if (event->button != 3) { return FALSE; } GMenu *menu_model = g_menu_new(); GMenu *check_model = g_menu_new(); g_menu_append(check_model, _("Check all"), "win.check_all"); g_menu_append(check_model, _("Check none"), "win.check_none"); g_menu_append(check_model, _("Invert check"), "win.check_invert"); g_menu_append_section(menu_model, NULL, G_MENU_MODEL(check_model)); GMenu *all_model = g_menu_new(); g_menu_append(all_model, _("Auto-rename track breaks"), "win.auto_rename"); g_menu_append_section(menu_model, NULL, G_MENU_MODEL(all_model)); GMenu *break_model = g_menu_new(); g_menu_append(break_model, _("Remove track break"), "win.remove_break"); g_menu_append(break_model, _("Jump to track break"), "win.jump_break"); g_menu_append_section(menu_model, NULL, G_MENU_MODEL(break_model)); GtkMenu *menu = GTK_MENU(gtk_menu_new_from_model(G_MENU_MODEL(menu_model))); gtk_menu_attach_to_widget(menu, main_window, NULL); gtk_menu_popup_at_pointer(GTK_MENU(menu), NULL); return FALSE; } void track_break_delete_selected(gpointer data, gpointer user_data) { GtkTreePath *path = (GtkTreePath*)data; GtkTreeIter iter; guint list_pos = gtk_tree_path_get_indices(path)[0]; if (list_pos == 0) { // Do not allow first break to be deleted return; } track_break_list_remove_nth_element(track_breaks, list_pos); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); gtk_tree_model_get_iter(model, &iter, path); gtk_list_store_remove(GTK_LIST_STORE(model), &iter); gtk_tree_path_free(path); } void track_break_delete_entry() { GtkTreeSelection *selection; GtkTreeModel *model; GList *list; if (g_sample == NULL) { return; } selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); list = gtk_tree_selection_get_selected_rows(selection, &model); g_list_foreach(list, track_break_delete_selected, NULL); g_list_free(list); track_break_update_gui_model(); force_redraw(); } guint track_break_find_offset() { GtkTreeSelection *selection; GtkTreeIter iter; GtkTreeModel *model; guint offset = 0; gchar *time; gchar *duration; gchar *filename; if (g_sample == NULL) { return 0; } selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { gtk_tree_model_get(model, &iter, COLUMN_FILENAME, &filename, COLUMN_TIME, &time, COLUMN_DURATION, &duration, COLUMN_OFFSET, &offset, -1); g_free(time); g_free(duration); g_free(filename); } return offset; /* *tb = (TrackBreak *) gtk_tree_selection_get_user_data(selection); cursor_data->is_equal = FALSE; cursor_data->marker = cursor_marker; printf("tb->offset: %s\n", tb->offset); */ } static void select_and_show_track_break(int index) { GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_unselect_all(selection); GtkTreePath *path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_selection_select_path(selection, path); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path, NULL, FALSE, 0.f, 0.f); gtk_tree_path_free(path); } void track_break_add_entry() { gulong marker = cursor_marker; if (g_sample != NULL && sample_is_playing(g_sample)) { marker = sample_get_play_marker(g_sample); } TrackBreak *track_break = track_break_list_add_offset(track_breaks, TRUE, marker, NULL); track_break_update_gui_model(); select_and_show_track_break(g_list_index(track_breaks->breaks, track_break)); force_redraw(); } static void track_break_add_to_model(int index, gboolean write, gulong start_offset, gulong end_offset, const gchar *filename, void *user_data) { gchar *time = track_break_format_timestamp(start_offset, FALSE); gchar *duration = track_break_format_timestamp(end_offset - start_offset, FALSE); gtk_list_store_insert_with_values(store, NULL, -1, COLUMN_WRITE, write, COLUMN_FILENAME, filename, COLUMN_TIME, time, COLUMN_DURATION, duration, COLUMN_OFFSET, start_offset, -1); g_free(duration); g_free(time); } void track_break_update_gui_model() { gtk_list_store_clear(store); if (track_breaks != NULL) { track_break_list_foreach(track_breaks, track_break_add_to_model, NULL); } redraw(); } void wavbreaker_update_listmodel() { track_break_update_gui_model(); } void track_break_write_toggled(GtkWidget *widget, gchar *path_str, gpointer user_data) { GtkTreeModel *model = (GtkTreeModel *)user_data; GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string(path_str); TrackBreak *track_break; guint list_pos; gpointer list_data; list_pos = atoi(path_str); list_data = g_list_nth_data(track_breaks->breaks, list_pos); track_break = (TrackBreak *)list_data; track_break->write = !track_break->write; /* DEBUG CODE START */ /* g_print("gtktreepath: %s\n", path_str); g_print("list_pos: %d\n", list_pos); g_print("track_break->offset: %d\n", track_break->offset); g_print("track_break->write: %d\n\n", track_break->write); */ /* DEBUG CODE END */ gtk_tree_model_get_iter(model, &iter, path); gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_WRITE, track_break->write, -1); gtk_tree_path_free(path); force_redraw(); } void track_break_filename_edited(GtkCellRendererText *cell, const gchar *path_str, const gchar *new_text, gpointer user_data) { GtkTreeModel *model = GTK_TREE_MODEL(user_data); GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string(path_str); guint list_pos; gpointer list_data; list_pos = atoi(path_str); list_data = g_list_nth_data(track_breaks->breaks, list_pos); TrackBreak *track_break = list_data; track_break_rename(track_break, new_text); gchar *resulting_filename = track_break_get_filename(track_break, track_breaks); gtk_tree_model_get_iter(model, &iter, path); gtk_list_store_set(GTK_LIST_STORE(model), &iter, COLUMN_FILENAME, resulting_filename, -1); g_free(resulting_filename); gtk_tree_path_free(path); force_redraw(); } /* *------------------------------------------------------------------------- * File Save Dialog Stuff *------------------------------------------------------------------------- */ struct FileWriteProgressUI { GMutex mutex; guint position; guint total; gchar *filename; double percentage; GList *errors; gboolean cancelled; gboolean finished; struct { GtkWidget *window; GtkWidget *status_label; GtkWidget *pbar; guint cur_file_displayed; } gtk; struct { GCond cond; gchar *filename; enum OverwriteDecision result; } overwrite_decision; guint source_id; WriteStatusCallbacks callbacks; }; static void file_write_progress_ui_on_file_changed(guint position, guint total, const char *filename, void *user_data) { struct FileWriteProgressUI *ui = user_data; g_mutex_lock(&ui->mutex); if (ui->filename != NULL) { g_free(g_steal_pointer(&ui->filename)); } ui->position = position; ui->total = total; ui->filename = g_strdup(filename); ui->percentage = 0.0; g_mutex_unlock(&ui->mutex); } static void file_write_progress_ui_on_file_progress_changed(double percentage, void *user_data) { struct FileWriteProgressUI *ui = user_data; g_mutex_lock(&ui->mutex); ui->percentage = percentage; g_mutex_unlock(&ui->mutex); } static void file_write_progress_ui_on_error(const char *message, void *user_data) { struct FileWriteProgressUI *ui = user_data; g_warning("Error writing file: %s", message); g_mutex_lock(&ui->mutex); ui->errors = g_list_append(ui->errors, g_strdup(message)); g_mutex_unlock(&ui->mutex); } static void file_write_progress_ui_on_finished(void *user_data) { struct FileWriteProgressUI *ui = user_data; g_mutex_lock(&ui->mutex); ui->finished = TRUE; g_mutex_unlock(&ui->mutex); } static gboolean file_write_progress_ui_is_cancelled(void *user_data) { struct FileWriteProgressUI *ui = user_data; gboolean cancelled; g_mutex_lock(&ui->mutex); cancelled = ui->cancelled; g_mutex_unlock(&ui->mutex); return cancelled; } static enum OverwriteDecision file_write_progress_ui_ask_overwrite(const char *filename, void *user_data) { struct FileWriteProgressUI *ui = user_data; g_mutex_lock(&ui->mutex); ui->overwrite_decision.result = OVERWRITE_DECISION_ASK; ui->overwrite_decision.filename = g_strdup(filename); while (ui->overwrite_decision.result == OVERWRITE_DECISION_ASK) { g_cond_wait(&ui->overwrite_decision.cond, &ui->mutex); } g_free(g_steal_pointer(&ui->overwrite_decision.filename)); enum OverwriteDecision decision = ui->overwrite_decision.result; g_mutex_unlock(&ui->mutex); return decision; } static void on_write_dialog_cancel_button_clicked(GtkWidget *button, void *user_data) { struct FileWriteProgressUI *ui = user_data; g_mutex_lock(&ui->mutex); gtk_widget_set_sensitive(button, FALSE); ui->cancelled = TRUE; g_mutex_unlock(&ui->mutex); } gboolean file_write_progress_idle_func(gpointer data) { struct FileWriteProgressUI *ui = data; g_mutex_lock(&ui->mutex); if (ui->overwrite_decision.result == OVERWRITE_DECISION_ASK) { if (ui->gtk.window != NULL) { gtk_widget_destroy(g_steal_pointer(&ui->gtk.window)); } ui->overwrite_decision.result = overwritedialog_show(wavbreaker_get_main_window(), ui->overwrite_decision.filename); g_cond_signal(&ui->overwrite_decision.cond); } if (ui->gtk.window == NULL) { ui->gtk.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_realize(ui->gtk.window); gtk_window_set_resizable(GTK_WINDOW(ui->gtk.window), FALSE); gtk_window_set_modal(GTK_WINDOW(ui->gtk.window), TRUE); gtk_window_set_transient_for(GTK_WINDOW(ui->gtk.window), GTK_WINDOW(main_window)); gtk_window_set_type_hint(GTK_WINDOW(ui->gtk.window), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_window_set_position(GTK_WINDOW(ui->gtk.window), GTK_WIN_POS_CENTER_ON_PARENT); gdk_window_set_functions(GDK_WINDOW(gtk_widget_get_window(ui->gtk.window)), GDK_FUNC_MOVE); GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(ui->gtk.window), vbox); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_window_set_title(GTK_WINDOW(ui->gtk.window), _("Splitting wave file")); gchar *tmp_str = g_markup_printf_escaped("%s", gtk_window_get_title(GTK_WINDOW(ui->gtk.window))); GtkWidget *label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), tmp_str); g_free(tmp_str); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 5); label = gtk_label_new(_("The selected track breaks are now written to disk. This can take some time.")); gtk_label_set_line_wrap( GTK_LABEL(label), TRUE); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 5); ui->gtk.pbar = gtk_progress_bar_new(); g_object_set(G_OBJECT(ui->gtk.pbar), "show-text", TRUE, NULL); gtk_box_pack_start(GTK_BOX(vbox), ui->gtk.pbar, FALSE, TRUE, 5); ui->gtk.status_label = gtk_label_new( NULL); g_object_set(G_OBJECT(ui->gtk.status_label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_label_set_ellipsize( GTK_LABEL(ui->gtk.status_label), PANGO_ELLIPSIZE_MIDDLE); gtk_box_pack_start(GTK_BOX(vbox), ui->gtk.status_label, FALSE, TRUE, 5); GtkWidget *hbbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); GtkWidget *cancel_button = gtk_button_new_with_label(_("Cancel")); g_signal_connect(G_OBJECT(cancel_button), "clicked", G_CALLBACK(on_write_dialog_cancel_button_clicked), ui); gtk_box_pack_end(GTK_BOX(hbbox), cancel_button, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, TRUE, 5); gtk_widget_show_all(GTK_WIDGET(ui->gtk.window)); ui->gtk.cur_file_displayed = 0; } if (ui->gtk.cur_file_displayed != ui->position && ui->filename != NULL) { gchar *file_basename = g_path_get_basename(ui->filename); gchar *tmp = g_strdup_printf(_("Writing %s"), file_basename); gchar *msg = g_markup_printf_escaped("%s", tmp); gtk_label_set_markup(GTK_LABEL(ui->gtk.status_label), msg); g_free(msg); g_free(tmp); g_free(file_basename); // FIXME: i18n plural forms gchar *tmp_str = g_strdup_printf(_("%d of %d parts written"), ui->position-1, ui->total); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ui->gtk.pbar), tmp_str); g_free(tmp_str); ui->gtk.cur_file_displayed = ui->position; } if (ui->finished) { gtk_widget_destroy(g_steal_pointer(&ui->gtk.window)); if (ui->errors != NULL) { gchar *tmp_str = g_strdup_printf("%s:\n", _("There was an error splitting the file")); GList *cur = g_list_first(ui->errors); while (cur != NULL) { gchar *tmp = g_strdup_printf("%s\n%s", tmp_str, (gchar *)cur->data); g_free(tmp_str); tmp_str = tmp; g_free(cur->data); cur = g_list_next(cur); } g_list_free(g_steal_pointer(&ui->errors)); popupmessage_show(NULL, _("Operation failed"), tmp_str); g_free(tmp_str); } else if (ui->cancelled) { popupmessage_show(NULL, _("Operation cancelled"), _("The split operation was cancelled.")); } else { // TODO: gettext plurals gchar *tmp_str = g_strdup_printf(_("The file %s has been split into %d parts."), sample_get_basename(g_sample), ui->total); popupmessage_show(NULL, _("Operation successful"), tmp_str); g_free(tmp_str); } current_file_write_progress_ui = NULL; ui->source_id = 0; if (ui->filename) { g_free(ui->filename); } g_cond_clear(&ui->overwrite_decision.cond); g_mutex_unlock(&ui->mutex); g_mutex_clear(&ui->mutex); g_free(ui); return FALSE; } double fraction = 1.0 * (ui->position-1+ui->percentage) / ui->total; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ui->gtk.pbar), fraction); g_mutex_unlock(&ui->mutex); return TRUE; } gboolean file_play_progress_idle_func(gpointer data) { GtkAllocation allocation; gtk_widget_get_allocation(draw, &allocation); gint half_width = allocation.width / 2; gint offset = allocation.width * (1.0/PLAY_MARKER_SCROLL); gulong play_marker = sample_get_play_marker(g_sample); gint x = play_marker - half_width; gint y = play_marker - pixmap_offset; gint z = allocation.width * (1.0 - 1.0/PLAY_MARKER_SCROLL); if (y > z && x > 0) { reset_sample_display(play_marker - offset + half_width); } else if (pixmap_offset > play_marker) { reset_sample_display(play_marker); } gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), pixmap_offset); gtk_widget_queue_draw(scrollbar); redraw(); update_status(FALSE); if (sample_is_playing(g_sample)) { return TRUE; } else { set_play_icon(); play_progress_source_id = 0; return FALSE; } } /* *------------------------------------------------------------------------- * File Open Dialog Stuff *------------------------------------------------------------------------- */ gboolean file_open_progress_idle_func(gpointer data) { Sample *sample = data; static GtkWidget *window; static GtkWidget *pbar; static GtkWidget *vbox; static GtkWidget *label; static char tmp_str[6144]; static char tmp_str2[6144]; static int current, size; if (window == NULL) { window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_realize(window); gtk_window_set_resizable(GTK_WINDOW(window), FALSE); gtk_window_set_modal(GTK_WINDOW(window), TRUE); gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(main_window)); gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ON_PARENT); gdk_window_set_functions(GDK_WINDOW(gtk_widget_get_window(window)), GDK_FUNC_MOVE); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(window), vbox); gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); gtk_window_set_title( GTK_WINDOW(window), _("Analyzing waveform")); tmp_str[0] = '\0'; strcat( tmp_str, ""); strcat( tmp_str, gtk_window_get_title( GTK_WINDOW( window))); strcat( tmp_str, ""); label = gtk_label_new( NULL); gtk_label_set_markup( GTK_LABEL(label), tmp_str); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 5); label = gtk_label_new( _("The waveform data of the selected file is being analyzed and processed. This can take some time.")); gtk_label_set_line_wrap( GTK_LABEL(label), TRUE); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 5); pbar = gtk_progress_bar_new(); gtk_box_pack_start(GTK_BOX(vbox), pbar, FALSE, TRUE, 5); sprintf( tmp_str, _("Analyzing %s"), sample_get_basename(sample)); gchar *str = g_markup_escape_text(tmp_str, -1); sprintf( tmp_str2, "%s", str); g_free(str); label = gtk_label_new( NULL); gtk_label_set_markup( GTK_LABEL(label), tmp_str2); g_object_set(G_OBJECT(label), "xalign", 0.0f, "yalign", 0.5f, NULL); gtk_label_set_ellipsize( GTK_LABEL(label), PANGO_ELLIPSIZE_END); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 5); gtk_widget_show_all(GTK_WIDGET(window)); } if (sample_is_loaded(sample)) { gtk_widget_destroy(window); window = NULL; /* --------------------------------------------------- */ /* Reset things because we have a new file */ /* --------------------------------------------------- */ gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), 0); gtk_adjustment_set_value(GTK_ADJUSTMENT(cursor_marker_spinner_adj), 0); gtk_adjustment_set_value(GTK_ADJUSTMENT(cursor_marker_min_spinner_adj), 0); gtk_adjustment_set_value(GTK_ADJUSTMENT(cursor_marker_sec_spinner_adj), 0); gtk_adjustment_set_value(GTK_ADJUSTMENT(cursor_marker_subsec_spinner_adj), 0); gtk_widget_queue_draw(scrollbar); /* TODO: Remove FIX !!!!!!!!!!! */ configure_event(draw, NULL, NULL); #if defined(WANT_MOODBAR) if (moodbarData) { moodbar_free(moodbarData); } moodbarData = moodbar_open(sample_get_filename(sample)); set_action_enabled("display_moodbar", moodbarData != NULL); set_action_enabled("generate_moodbar", moodbarData == NULL); #endif if (!track_breaks) { track_breaks = track_break_list_new(sample_get_basename_without_extension(sample)); } track_break_list_set_total_duration(track_breaks, sample_get_num_sample_blocks(sample)); // Now that the file is fully loaded, update the duration track_break_update_gui_model(); redraw(); /* --------------------------------------------------- */ file_open_progress_source_id = 0; return FALSE; } else { double load_percentage = sample_get_load_percentage(sample); size = sample_get_file_size(sample) / (1024*1024); current = size*load_percentage; sprintf( tmp_str, _("%d of %d MB analyzed"), current, size); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar), load_percentage); gtk_progress_bar_set_text( GTK_PROGRESS_BAR(pbar), tmp_str); return TRUE; } } static void open_file(const char *filename) { if (g_sample != NULL) { sample_close(g_steal_pointer(&g_sample)); } char *error_message = NULL; if ((g_sample = sample_open(filename, &error_message)) == NULL) { popupmessage_show(main_window, _("Error opening file"), error_message); g_free(error_message); return; } set_action_enabled("add_break", TRUE); set_action_enabled("jump_cursor", TRUE); set_action_enabled("check_all", TRUE); set_action_enabled("check_none", TRUE); set_action_enabled("check_invert", TRUE); set_action_enabled("auto_rename", TRUE); set_action_enabled("remove_break", TRUE); set_action_enabled("jump_break", TRUE); set_action_enabled("export", TRUE); set_action_enabled("import", TRUE); #if defined(WANT_MOODBAR) set_action_enabled("display_moodbar", moodbarData != NULL); set_action_enabled("generate_moodbar", moodbarData == NULL); #endif gtk_widget_set_sensitive( play_button, TRUE); gtk_widget_set_sensitive( header_bar_save_button, TRUE); gtk_widget_set_sensitive( cursor_marker_spinner, TRUE); gtk_widget_set_sensitive( cursor_marker_min_spinner, TRUE); gtk_widget_set_sensitive( cursor_marker_sec_spinner, TRUE); gtk_widget_set_sensitive( cursor_marker_subsec_spinner, TRUE); gtk_widget_set_sensitive(button_seek_backward, TRUE); gtk_widget_set_sensitive(button_jump_to_time, TRUE); gtk_widget_set_sensitive(button_seek_forward, TRUE); gtk_widget_set_sensitive(button_auto_split, TRUE); gtk_widget_set_sensitive(button_add_break, TRUE); gtk_widget_set_sensitive(button_remove_break, TRUE); menu_stop(NULL, NULL); cursor_marker = 0; gtk_list_store_clear(store); if (track_breaks != NULL) { track_break_list_free(g_steal_pointer(&track_breaks)); } track_breaks = track_break_list_new(sample_get_basename_without_extension(g_sample)); track_break_add_entry(); if (file_open_progress_source_id) { g_source_remove(file_open_progress_source_id); } file_open_progress_source_id = g_timeout_add(100, file_open_progress_idle_func, g_sample); set_title(sample_get_basename(g_sample)); } static gboolean open_file_arg(gpointer data) { if (data) { open_file((char *)data); g_free(data); } /* do not call this function again = return FALSE */ open_file_source_id = 0; return FALSE; } static void set_title(const char *title) { char buf[1024]; if( title == NULL) { gtk_window_set_title( (GtkWindow*)main_window, APPNAME); gtk_header_bar_set_title(GTK_HEADER_BAR(header_bar), APPNAME); return; } sprintf( buf, "%s (%s)", APPNAME, title); gtk_window_set_title( (GtkWindow*)main_window, buf); gtk_header_bar_set_title(GTK_HEADER_BAR(header_bar), buf); } static void open_select_file() { GtkWidget *dialog; GtkFileFilter *filter_all; GtkFileFilter *filter_supported; filter_all = gtk_file_filter_new(); gtk_file_filter_set_name( filter_all, _("All files")); gtk_file_filter_add_pattern( filter_all, "*"); filter_supported = gtk_file_filter_new(); gtk_file_filter_set_name( filter_supported, _("Supported files")); gtk_file_filter_add_pattern( filter_supported, "*.wav"); #if defined(HAVE_MPG123) gtk_file_filter_add_pattern( filter_supported, "*.mp2"); gtk_file_filter_add_pattern( filter_supported, "*.mp3"); #endif #if defined(HAVE_VORBISFILE) gtk_file_filter_add_pattern( filter_supported, "*.ogg"); #endif gtk_file_filter_add_pattern( filter_supported, "*.dat"); gtk_file_filter_add_pattern( filter_supported, "*.raw"); dialog = gtk_file_chooser_dialog_new(_("Open File"), GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_OPEN, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_all); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_supported); gtk_file_chooser_set_filter( GTK_FILE_CHOOSER(dialog), filter_supported); if (g_sample != NULL) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), sample_get_dirname(g_sample)); } if (gtk_dialog_run( GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { char *dirname = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog)); char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); gtk_widget_destroy(dialog); saveas_set_dirname(dirname); g_free(dirname); open_file(filename); g_free(filename); } else { gtk_widget_destroy(dialog); } } /* *------------------------------------------------------------------------- * Sample Drawing Area Stuff *------------------------------------------------------------------------- */ static inline void blit_cairo_surface(cairo_t *cr, cairo_surface_t *surface, int width, int height) { if (!surface) { return; } cairo_set_source_surface(cr, surface, 0.f, 0.f); cairo_rectangle(cr, 0.f, 0.f, (float)width, (float)height); cairo_fill(cr); } static void force_redraw() { waveform_surface_invalidate(sample_surface); waveform_surface_invalidate(summary_surface); redraw(); } static void redraw() { static int redraw_done = 1; if( redraw_done) { /* Only redraw if the last operation finished already. */ redraw_done = 0; if (redraw_source_id) { g_source_remove(redraw_source_id); } redraw_source_id = g_idle_add(redraw_later, &redraw_done); } } static gboolean redraw_later( gpointer data) { if (g_sample == NULL) { return FALSE; } int *redraw_done = (int*)data; struct WaveformSurfaceDrawContext ctx = { .widget = draw, .pixmap_offset = pixmap_offset, .list = track_breaks, .graphData = sample_get_graph_data(g_sample), .moodbarData = appconfig_get_show_moodbar() ? moodbarData : NULL, }; waveform_surface_draw(sample_surface, &ctx); gtk_widget_queue_draw(draw); ctx.widget = draw_summary; waveform_surface_draw(summary_surface, &ctx); gtk_widget_queue_draw(draw_summary); *redraw_done = 1; redraw_source_id = 0; return FALSE; } static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { if (g_sample == NULL) { return FALSE; } GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); int width = allocation.width; if (sample_get_num_sample_blocks(g_sample) == 0) { pixmap_offset = 0; gtk_adjustment_set_page_size(adj, 1); gtk_adjustment_set_upper(adj, 1); gtk_adjustment_set_page_increment(adj, 1); } else if (width > sample_get_num_sample_blocks(g_sample)) { pixmap_offset = 0; gtk_adjustment_set_page_size(adj, sample_get_num_sample_blocks(g_sample)); gtk_adjustment_set_upper(adj, sample_get_num_sample_blocks(g_sample)); gtk_adjustment_set_page_increment(adj, width / 2); } else { if (pixmap_offset + width > sample_get_num_sample_blocks(g_sample)) { pixmap_offset = sample_get_num_sample_blocks(g_sample) - width; } gtk_adjustment_set_page_size(adj, width); gtk_adjustment_set_upper(adj, sample_get_num_sample_blocks(g_sample)); gtk_adjustment_set_page_increment(adj, width / 2); } gtk_adjustment_set_step_increment(adj, 10); gtk_adjustment_set_value(adj, pixmap_offset); gtk_adjustment_set_upper(cursor_marker_spinner_adj, sample_get_num_sample_blocks(g_sample) - 1); struct WaveformSurfaceDrawContext ctx = { .widget = widget, .pixmap_offset = pixmap_offset, .list = track_breaks, .graphData = sample_get_graph_data(g_sample), .moodbarData = appconfig_get_show_moodbar() ? moodbarData : NULL, }; waveform_surface_draw(sample_surface, &ctx); return TRUE; } static gboolean draw_draw_event(GtkWidget *widget, cairo_t *cr, gpointer data) { if (g_sample == NULL) { return FALSE; } GList *tbl; TrackBreak *tb_cur = NULL, *tb_first = NULL; TrackBreak **tbs; const int border = 3; int tbc = 0, i, border_left, border_right, text_height = 0, ellipsis_width = 0; gboolean label_truncated = FALSE; char tmp[1024]; cairo_text_extents_t te; GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); guint width = allocation.width, height = allocation.height; blit_cairo_surface(cr, sample_surface->surface, width, height); cairo_set_line_width( cr, 1); if( cursor_marker >= pixmap_offset && cursor_marker <= pixmap_offset + width) { /** * Draw RED cursor marker **/ float x = cursor_marker - pixmap_offset + 0.5f; cairo_set_source_rgba(cr, 1.f, 0.f, 0.f, 0.9f); cairo_move_to(cr, x, 0.f); cairo_line_to(cr, x, height); cairo_stroke(cr); static const float TRIANGLE_SIDE = 3.f; cairo_move_to(cr, x-TRIANGLE_SIDE, 0.f); cairo_line_to(cr, x+TRIANGLE_SIDE, 0.f); cairo_line_to(cr, x, 2.f*TRIANGLE_SIDE); cairo_move_to(cr, x-TRIANGLE_SIDE, height); cairo_line_to(cr, x+TRIANGLE_SIDE, height); cairo_line_to(cr, x, height-2.f*TRIANGLE_SIDE); cairo_fill(cr); } if (sample_is_playing(g_sample)) { /** * Draw GREEN play marker **/ float x = sample_get_play_marker(g_sample) - pixmap_offset + 0.5f; cairo_set_source_rgba(cr, 0.f, 0.7f, 0.f, 0.9f); cairo_move_to(cr, x, 0.f); cairo_line_to(cr, x, height); cairo_stroke(cr); } /** * Prepare text output (filename labels) **/ cairo_select_font_face( cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size( cr, 10); cairo_text_extents( cr, "...", &te); ellipsis_width = te.width; /** * Find track breaks for which we need to draw labels **/ tb_cur = NULL; tbs = NULL;; for( tbl = track_breaks->breaks; tbl != NULL; tbl = g_list_next( tbl)) { tb_cur = tbl->data; if (tb_cur != NULL) { gchar *filename = track_break_get_filename(tb_cur, track_breaks); cairo_text_extents(cr, filename, &te); g_free(filename); if( pixmap_offset <= tb_cur->offset) { if( tbs == NULL && tb_first != NULL) { tbs = (TrackBreak**)malloc( sizeof( TrackBreak*)); tbs[tbc] = tb_first; tbc++; } tbs = (TrackBreak**)realloc( tbs, (tbc+1)*sizeof( TrackBreak*)); tbs[tbc] = tb_cur; tbc++; if( te.height > text_height) { text_height = te.height; } } tb_first = tb_cur; } } if( tbs == NULL && tb_first != NULL) { tbs = (TrackBreak**)malloc( sizeof( TrackBreak*)); tbs[tbc] = tb_first; tbc++; text_height = te.height; } /** * Calculate label size (and if we need to draw it) and * finally draw the label with the right size and position **/ for( i=0; iwrite)) { continue; } border_left = (tbs[i]->offset > pixmap_offset)?(tbs[i]->offset - pixmap_offset):(0); border_right = (i+1 == tbc)?(width+100):(tbs[i+1]->offset - pixmap_offset); gchar *filename = track_break_get_filename(tbs[i], track_breaks); strcpy(tmp, filename); g_free(filename); cairo_text_extents( cr, tmp, &te); label_truncated = FALSE; while( border_left + te.width + ellipsis_width + border*2 > border_right - border*2 && strlen( tmp) > 1) { tmp[strlen( tmp)-1] = '\0'; cairo_text_extents( cr, tmp, &te); label_truncated = TRUE; } if( label_truncated) { strcat( tmp, "..."); cairo_text_extents( cr, tmp, &te); if( border_left + te.width + border*2 > border_right - border*2) { border_left -= (border_left + te.width + border*2) - (border_right - border*2); } } cairo_set_source_rgba(cr, 1.f, 1.f, 1.f, 0.8f); cairo_rectangle(cr, border_left, height - text_height - border*2, te.width + border*2, text_height + border*2); cairo_fill(cr); cairo_set_source_rgb(cr, 0.f, 0.f, 0.f); cairo_move_to(cr, border_left + border, height - (text_height+1)/2); cairo_show_text(cr, tmp); } if( tbs != NULL) { free( tbs); } return FALSE; } static gboolean draw_summary_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer user_data) { if (g_sample == NULL) { return FALSE; } struct WaveformSurfaceDrawContext ctx = { .widget = widget, .pixmap_offset = pixmap_offset, .list = track_breaks, .graphData = sample_get_graph_data(g_sample), .moodbarData = appconfig_get_show_moodbar() ? moodbarData : NULL, }; waveform_surface_draw(summary_surface, &ctx); return TRUE; } static gboolean draw_summary_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data) { if (g_sample == NULL) { return FALSE; } GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); guint width = allocation.width, height = allocation.height; gfloat summary_scale; summary_scale = (float)(sample_get_num_sample_blocks(g_sample)) / (float)(width); /** * Draw shadow in summary pixmap to show current view **/ blit_cairo_surface(cr, summary_surface->surface, width, height); cairo_set_source_rgba( cr, 0, 0, 0, 0.3); cairo_rectangle( cr, 0, 0, pixmap_offset / summary_scale, height); cairo_fill( cr); cairo_rectangle( cr, (pixmap_offset+width) / summary_scale, 0, width - (pixmap_offset+width) / summary_scale, height); cairo_fill( cr); cairo_set_source_rgba( cr, 1, 1, 1, 0.6); cairo_set_line_width( cr, 1); cairo_move_to( cr, (int)(pixmap_offset / summary_scale) + 0.5, 0); cairo_line_to( cr, (int)(pixmap_offset / summary_scale) + 0.5, height); cairo_move_to( cr, (int)((pixmap_offset+width) / summary_scale) + 0.5, 0); cairo_line_to( cr, (int)((pixmap_offset+width) / summary_scale) + 0.5, height); cairo_stroke( cr); return FALSE; } static gboolean draw_summary_button_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { guint midpoint, width; int x_scale, x_scale_leftover, x_scale_mod; int leftover_count; if (!g_sample) { return TRUE; } if (sample_is_playing(g_sample)) { return TRUE; } if (sample_get_num_sample_blocks(g_sample) == 0) { return TRUE; } GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); width = allocation.width; x_scale = sample_get_num_sample_blocks(g_sample) / width; x_scale_leftover = sample_get_num_sample_blocks(g_sample) % width; if (x_scale_leftover > 0) { x_scale_mod = width / x_scale_leftover; leftover_count = event->x / x_scale_mod; } else { x_scale_mod = 0; leftover_count = 0; } if (event->x < 0) { return TRUE; } midpoint = event->x * x_scale + leftover_count; reset_sample_display(midpoint); redraw(); return TRUE; } void reset_sample_display(guint midpoint) { GtkAllocation allocation; gtk_widget_get_allocation(draw, &allocation); int width = allocation.width; int start = midpoint - width / 2; if (!g_sample) { return; } if (sample_get_num_sample_blocks(g_sample) == 0) { pixmap_offset = 0; } else if (width > sample_get_num_sample_blocks(g_sample)) { pixmap_offset = 0; } else if (start + width > sample_get_num_sample_blocks(g_sample)) { pixmap_offset = sample_get_num_sample_blocks(g_sample) - width; } else { pixmap_offset = start; } if (pixmap_offset < 0) { pixmap_offset = 0; } gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), pixmap_offset); gtk_widget_queue_draw(scrollbar); } /* *------------------------------------------------------------------------- * Scrollbar and Buttons *------------------------------------------------------------------------- */ static gboolean adj_value_changed(GtkAdjustment *adj, gpointer data) { if (sample_is_playing(g_sample)) { return FALSE; } pixmap_offset = gtk_adjustment_get_value(adj); redraw(); return TRUE; } static void cursor_marker_time_spinners_changed(GtkAdjustment *adj, gpointer data) { gint min, sec, subsec; if (sample_is_playing(g_sample)) { return; } min = gtk_adjustment_get_value(cursor_marker_min_spinner_adj); sec = gtk_adjustment_get_value(cursor_marker_sec_spinner_adj); subsec = gtk_adjustment_get_value(cursor_marker_subsec_spinner_adj); cursor_marker = time_to_offset (min, sec, subsec); gtk_spin_button_set_value (GTK_SPIN_BUTTON (cursor_marker_spinner), cursor_marker); if (gtk_widget_get_visible(jump_to_popover)) { reset_sample_display(cursor_marker); } redraw(); update_status(FALSE); } static void cursor_marker_spinner_changed(GtkAdjustment *adj, gpointer data) { if (sample_is_playing(g_sample)) { return; } cursor_marker = gtk_adjustment_get_value(adj); /* printf("adj->value: %lu\n", adj->value); printf("cursor_marker: %lu\n", cursor_marker); printf("pixmap_offset: %lu\n", pixmap_offset); */ update_status(TRUE); redraw(); } static gboolean scroll_event( GtkWidget *widget, GdkEventScroll *event, gpointer data) { long step, upper, size; step = gtk_adjustment_get_page_increment(adj); upper = gtk_adjustment_get_upper(adj); size = gtk_adjustment_get_page_size(adj); if( widget == draw) { /* Scroll in more detail on the zoomed view */ step /= 2; } if( event->direction == GDK_SCROLL_UP || event->direction == GDK_SCROLL_LEFT) { if( pixmap_offset >= step) { pixmap_offset -= step; } else { pixmap_offset = 0; } } if( event->direction == GDK_SCROLL_DOWN || event->direction == GDK_SCROLL_RIGHT) { if( pixmap_offset <= upper-step-size) { pixmap_offset += step; } else { pixmap_offset = upper-size; } } gtk_adjustment_set_value( GTK_ADJUSTMENT(adj), pixmap_offset); gtk_widget_queue_draw( scrollbar); redraw(); update_status(FALSE); return TRUE; } static gboolean button_release(GtkWidget *widget, GdkEventButton *event, gpointer data) { gtk_widget_grab_focus(play_button); if (!g_sample) { return TRUE; } if (event->x + pixmap_offset > sample_get_num_sample_blocks(g_sample)) { return TRUE; } if (sample_is_playing(g_sample)) { return TRUE; } int w = gtk_widget_get_allocated_width(widget); int center = pixmap_offset + w/2; static const int MINIMUM_SCROLL_STEP = 10; static const int MAXIMUM_SCROLL_STEP = 50; if (event->x < 0) { // scroll left int offset = event->x; if (offset > -MINIMUM_SCROLL_STEP) { offset = -MINIMUM_SCROLL_STEP; } else if (offset < -MAXIMUM_SCROLL_STEP) { offset = -MAXIMUM_SCROLL_STEP; } reset_sample_display(center + offset); cursor_marker = pixmap_offset; } else if (event->x > w-1) { // scroll right int offset = event->x - (w-1); if (offset < MINIMUM_SCROLL_STEP) { offset = MINIMUM_SCROLL_STEP; } else if (offset > MAXIMUM_SCROLL_STEP) { offset = MAXIMUM_SCROLL_STEP; } reset_sample_display(center + offset); cursor_marker = pixmap_offset + w-1; } else { cursor_marker = pixmap_offset + event->x; } if (event->type == GDK_BUTTON_RELEASE && event->button == 3) { GMenu *menu_model = g_menu_new(); g_menu_append(menu_model, _("Add track break"), "win.add_break"); g_menu_append(menu_model, _("Remove track break"), "win.remove_break"); g_menu_append(menu_model, _("Jump to cursor marker"), "win.jump_cursor"); GtkMenu *menu = GTK_MENU(gtk_menu_new_from_model(G_MENU_MODEL(menu_model))); gtk_menu_attach_to_widget(menu, main_window, NULL); gtk_menu_popup_at_pointer(GTK_MENU(menu), NULL); redraw(); return TRUE; } TrackBreak *nearest_track_break = NULL; int nearest_track_break_index = 0; int containing_track_break_index = 0; { GList *cur = track_breaks->breaks; int idx = 0; nearest_track_break = cur ? cur->data : NULL; while (cur) { TrackBreak *tb = cur->data; if (ABS((long)tb->offset - (long)cursor_marker) < ABS((long)nearest_track_break->offset - (long)cursor_marker)) { nearest_track_break = tb; nearest_track_break_index = idx; } if (tb->offset < cursor_marker) { containing_track_break_index = idx; } cur = cur->next; ++idx; } } static const long SNAP_DISTANCE_FRAMES = 20; if (nearest_track_break && ABS((long)cursor_marker - (long)nearest_track_break->offset) < SNAP_DISTANCE_FRAMES) { // snap cursor to track break cursor_marker = nearest_track_break->offset; containing_track_break_index = nearest_track_break_index; } select_and_show_track_break(containing_track_break_index); gtk_adjustment_set_value(cursor_marker_spinner_adj, cursor_marker); /* DEBUG CODE START */ /* printf("cursor_marker: %lu\n", cursor_marker); */ /* DEBUG CODE END */ update_status(FALSE); redraw(); return TRUE; } static guint time_to_offset(gint min, gint sec, gint subsec) { guint offset; offset = (min * CD_BLOCKS_PER_SEC * 60) + sec * CD_BLOCKS_PER_SEC + subsec; return offset; } static void offset_to_time(guint time, gchar *str, gboolean time_offset_update) { int min, sec, subsec; if (time > 0) { min = time / (CD_BLOCKS_PER_SEC * 60); sec = time % (CD_BLOCKS_PER_SEC * 60); subsec = sec % CD_BLOCKS_PER_SEC; sec = sec / CD_BLOCKS_PER_SEC; } else { min = sec = subsec = 0; } if (time_offset_update) { gtk_spin_button_set_value (GTK_SPIN_BUTTON (cursor_marker_min_spinner), min); gtk_spin_button_set_value (GTK_SPIN_BUTTON (cursor_marker_sec_spinner), sec); gtk_spin_button_set_value (GTK_SPIN_BUTTON (cursor_marker_subsec_spinner), subsec); } sprintf(str, "%d:%02d.%02d", min, sec, subsec); } static void update_status(gboolean update_time_offset) { char str[1024]; char strbuf[1024]; sprintf( str, _("Cursor")); strcat( str, ": "); offset_to_time(cursor_marker, strbuf, update_time_offset); strcat(str, strbuf); if (sample_is_playing(g_sample)) { strcat( str, "\t"); strcat( str, _("Playing")); strcat( str, ": "); offset_to_time(sample_get_play_marker(g_sample), strbuf, update_time_offset); strcat(str, strbuf); } gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header_bar), str); } static void menu_play(GtkWidget *widget, gpointer user_data) { if (sample_is_playing(g_sample)) { menu_stop( NULL, NULL); update_status(FALSE); set_play_icon(); return; } switch (sample_play(g_sample, cursor_marker)) { case 0: if (play_progress_source_id) { g_source_remove(play_progress_source_id); } play_progress_source_id = g_timeout_add(10, file_play_progress_idle_func, NULL); set_stop_icon(); break; case 1: printf("error in play_sample\n"); break; case 2: menu_stop( NULL, NULL); update_status(FALSE); set_play_icon(); break; } } static void set_stop_icon() { gtk_button_set_image(GTK_BUTTON(play_button), gtk_image_new_from_icon_name("media-playback-stop-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR)); } static void set_play_icon() { gtk_button_set_image(GTK_BUTTON(play_button), gtk_image_new_from_icon_name("media-playback-start-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR)); } static void menu_stop(GtkWidget *widget, gpointer user_data) { if (g_sample != NULL) { sample_stop(g_sample); } } static void menu_jump_to(GtkWidget *widget, gpointer user_data) { gtk_popover_popup(GTK_POPOVER(jump_to_popover)); } static void menu_next_silence( GtkWidget* widget, gpointer user_data) { if (g_sample == NULL) { return; } int i, c = SILENCE_MIN_LENGTH+1, v; GraphData *graphData = sample_get_graph_data(g_sample); int amp = graphData->minSampleAmp + (graphData->maxSampleAmp-graphData->minSampleAmp)*appconfig_get_silence_percentage()/100; for( i=cursor_marker+1; idata[i].max - graphData->data[i].min; if( v < amp) { c++; } else { c = 0; } if( c==SILENCE_MIN_LENGTH) { cursor_marker = i; jump_to_cursor_marker(NULL, NULL, NULL); update_status(FALSE); return; } } } static void menu_prev_silence( GtkWidget* widget, gpointer user_data) { if (g_sample == NULL) { return; } int i, c = SILENCE_MIN_LENGTH+1, v; GraphData *graphData = sample_get_graph_data(g_sample); int amp = graphData->minSampleAmp + (graphData->maxSampleAmp-graphData->minSampleAmp)*appconfig_get_silence_percentage()/100; for( i=cursor_marker-1; i>0; i--) { v = graphData->data[i].max - graphData->data[i].min; if( v < amp) { c++; } else { c = 0; } if( c==SILENCE_MIN_LENGTH) { cursor_marker = i; jump_to_cursor_marker(NULL, NULL, NULL); update_status(FALSE); return; } } } static void menu_save(GSimpleAction *action, GVariant *parameter, gpointer user_data) { if (g_sample == NULL) { return; } if( appconfig_get_use_outputdir()) { wavbreaker_write_files( appconfig_get_outputdir()); } else { wavbreaker_write_files( "."); } } static void menu_save_as(GSimpleAction *action, GVariant *parameter, gpointer user_data) { if (g_sample == NULL) { return; } saveas_show(main_window); } void wavbreaker_write_files(char *dirname) { if (!sample_is_writing(g_sample)) { struct FileWriteProgressUI *ui = g_new0(struct FileWriteProgressUI, 1); g_mutex_init(&ui->mutex); g_cond_init(&ui->overwrite_decision.cond); ui->callbacks = (WriteStatusCallbacks) { .on_file_changed = file_write_progress_ui_on_file_changed, .on_file_progress_changed = file_write_progress_ui_on_file_progress_changed, .on_error = file_write_progress_ui_on_error, .on_finished = file_write_progress_ui_on_finished, .is_cancelled = file_write_progress_ui_is_cancelled, .ask_overwrite = file_write_progress_ui_ask_overwrite, .user_data = ui, }; sample_write_files(g_sample, track_breaks, &ui->callbacks, dirname); ui->source_id = g_timeout_add(50, file_write_progress_idle_func, ui); current_file_write_progress_ui = ui; } } static void filter_changed (GtkFileChooser* chooser, gpointer user_data) { gchar *old_filename; gchar *base; gchar *dot; gchar *new_filename; GtkFileFilter *filter; filter = gtk_file_chooser_get_filter (chooser); if (!filter) { return; } old_filename = gtk_file_chooser_get_uri( chooser); base = basename( old_filename); new_filename = malloc( strlen(base) + 4); strcpy( new_filename, base); dot = g_strrstr( new_filename, "."); if ( !dot) { dot = new_filename + strlen(new_filename); } else { *dot = '\0'; } if( strcmp( gtk_file_filter_get_name( filter), _("Text files")) == 0) { strcat( new_filename, ".txt"); } else if( strcmp( gtk_file_filter_get_name( filter), _("TOC files")) == 0) { strcat( new_filename, ".toc"); } else if( strcmp( gtk_file_filter_get_name( filter), _("CUE files")) == 0) { strcat( new_filename, ".cue"); } gtk_file_chooser_set_current_name( chooser, new_filename); g_free( old_filename); free( new_filename); } static void menu_export(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *dialog; GtkFileFilter *filter_text; GtkFileFilter *filter_toc; GtkFileFilter *filter_cue; filter_text = gtk_file_filter_new(); gtk_file_filter_set_name( filter_text, _("Text files")); gtk_file_filter_add_pattern( filter_text, "*.txt"); filter_toc = gtk_file_filter_new(); gtk_file_filter_set_name( filter_toc, _("TOC files")); gtk_file_filter_add_pattern( filter_toc, "*.toc"); filter_cue = gtk_file_filter_new(); gtk_file_filter_set_name( filter_cue, _("CUE files")); gtk_file_filter_add_pattern( filter_cue, "*.cue"); dialog = gtk_file_chooser_dialog_new(_("Export track breaks to file"), GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_SAVE, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_text); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_toc); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_cue); gtk_file_chooser_set_filter( GTK_FILE_CHOOSER(dialog), filter_text); gchar *filename = g_strdup_printf("%s.txt", sample_get_basename_without_extension(g_sample)); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); g_free(filename); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), sample_get_dirname(g_sample)); g_signal_connect ( GTK_FILE_CHOOSER(dialog), "notify::filter", G_CALLBACK( filter_changed), NULL); if (gtk_dialog_run( GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { if (!list_write_file(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)), sample_get_basename(g_sample), track_breaks)) { popupmessage_show(main_window, _("Export failed"), _("There has been an error exporting track breaks.")); } } gtk_widget_destroy(dialog); } void menu_delete_track_break(GSimpleAction *action, GVariant *parameter, gpointer user_data) { track_break_delete_entry(); } void menu_import(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkWidget *dialog; GtkFileFilter *filter_all; GtkFileFilter *filter_supported; filter_all = gtk_file_filter_new(); gtk_file_filter_set_name( filter_all, _("All files")); gtk_file_filter_add_pattern( filter_all, "*"); filter_supported = gtk_file_filter_new(); gtk_file_filter_set_name( filter_supported, _("Supported files")); gtk_file_filter_add_pattern( filter_supported, "*.txt"); gtk_file_filter_add_pattern( filter_supported, "*.toc"); gtk_file_filter_add_pattern( filter_supported, "*.cue"); dialog = gtk_file_chooser_dialog_new(_("Import track breaks from file"), GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_OPEN, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_all); gtk_file_chooser_add_filter( GTK_FILE_CHOOSER(dialog), filter_supported); gtk_file_chooser_set_filter( GTK_FILE_CHOOSER(dialog), filter_supported); gchar *filename = g_strdup_printf("%s%s%s.txt", sample_get_dirname(g_sample), G_DIR_SEPARATOR_S, sample_get_basename_without_extension(g_sample)); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), filename); g_free(filename); if (gtk_dialog_run( GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const gchar *list_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); if (!list_read_file(list_filename, track_breaks)) { popupmessage_show(main_window, _("Import failed"), _("There has been an error importing track breaks.")); } } gtk_widget_destroy(dialog); track_break_update_gui_model(); force_redraw(); } void menu_add_track_break(GSimpleAction *action, GVariant *parameter, gpointer user_data) { track_break_add_entry(); } static void menu_open_file(GSimpleAction *action, GVariant *parameter, gpointer user_data) { open_select_file(); } static void menu_menu(GSimpleAction *action, GVariant *parameter, gpointer user_data) { gtk_popover_popup(GTK_POPOVER(menu_popover)); } #if defined(WANT_MOODBAR) void wavbreaker_update_moodbar_state() { if (moodbarData) { moodbar_free(moodbarData); } moodbarData = moodbar_open(sample_get_filename(g_sample)); set_action_enabled("display_moodbar", moodbarData != NULL); set_action_enabled("generate_moodbar", moodbarData == NULL); redraw(); } static void menu_view_moodbar(GSimpleAction *action, GVariant *parameter, gpointer user_data) { GVariant *state = g_action_get_state(G_ACTION(action)); gboolean new_value = !g_variant_get_boolean(state); g_variant_unref(state); g_action_change_state(G_ACTION(action), g_variant_new("b", new_value)); appconfig_set_show_moodbar(new_value); wavbreaker_update_moodbar_state(); } static void menu_moodbar(GSimpleAction *action, GVariant *parameter, gpointer user_data) { moodbar_generate(main_window, sample_get_filename(g_sample)); } #endif static void menu_about(GSimpleAction *action, GVariant *parameter, gpointer user_data) { about_show(main_window); } static void menu_config(GSimpleAction *action, GVariant *parameter, gpointer user_data) { appconfig_show(main_window); } static void menu_merge(GSimpleAction *action, GVariant *parameter, gpointer user_data) { guimerge_show(main_window); } static void menu_autosplit(gpointer callback_data, guint callback_action, GtkWidget *widget) { gtk_popover_popup(GTK_POPOVER(autosplit_popover)); } static void menu_rename(GSimpleAction *action, GVariant *parameter, gpointer user_data) { /* rename (AND overwrite) track breaks */ if (track_breaks != NULL) { track_break_list_reset_filenames(track_breaks); wavbreaker_update_listmodel(); } } static void save_window_sizes() { gint x, y, w, h; gdk_window_get_root_origin(GDK_WINDOW(gtk_widget_get_window(main_window)), &x, &y); gtk_window_get_size(GTK_WINDOW(main_window), &w, &h); /* g_print("w: %d\n", w); g_print("h: %d\n", h); */ appconfig_set_main_window_xpos(x); appconfig_set_main_window_ypos(y); appconfig_set_main_window_width(w); appconfig_set_main_window_height(h); appconfig_set_vpane1_position(gtk_paned_get_position(GTK_PANED(vpane1))); appconfig_set_vpane2_position(gtk_paned_get_position(GTK_PANED(vpane2))); } void wavbreaker_quit() { if (g_sample != NULL) { sample_stop(g_sample); sample_close(g_steal_pointer(&g_sample)); } if (track_breaks != NULL) { track_break_list_free(g_steal_pointer(&track_breaks)); } if (current_file_write_progress_ui != NULL) { // TODO: Would need to properly tear down the progress UI g_source_remove(current_file_write_progress_ui->source_id); current_file_write_progress_ui->source_id = 0; } if (open_file_source_id) { g_source_remove(open_file_source_id); open_file_source_id = 0; } if (file_open_progress_source_id) { g_source_remove(file_open_progress_source_id); file_open_progress_source_id = 0; } if (redraw_source_id) { g_source_remove(redraw_source_id); redraw_source_id = 0; } if (play_progress_source_id) { g_source_remove(play_progress_source_id); play_progress_source_id = 0; } save_window_sizes(); gtk_widget_destroy(main_window); } static void check_really_quit() { if (g_sample != NULL && g_list_length(track_breaks->breaks) != 1) { if (reallyquit_show(main_window)) { wavbreaker_quit(); } } else { wavbreaker_quit(); } } GtkWidget *wavbreaker_get_main_window() { return main_window; } /* *------------------------------------------------------------------------- * Main Window Events *------------------------------------------------------------------------- */ static gboolean delete_event(GtkWidget *widget, GdkEventAny *event, gpointer data) { //g_print("delete_event event occurred\n"); check_really_quit(); return TRUE; } static GtkWidget * make_time_offset_widget() { GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_box_pack_start( GTK_BOX( hbox), gtk_label_new( _("Time offset:")), FALSE, FALSE, 0); cursor_marker_min_spinner_adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 74.0, 0); cursor_marker_min_spinner = gtk_spin_button_new(cursor_marker_min_spinner_adj, 1.0, 0); gtk_widget_set_sensitive( cursor_marker_min_spinner, FALSE); gtk_box_pack_start(GTK_BOX(hbox), cursor_marker_min_spinner, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(cursor_marker_min_spinner_adj), "value-changed", G_CALLBACK(cursor_marker_time_spinners_changed), NULL); gtk_box_pack_start( GTK_BOX( hbox), gtk_label_new(":"), FALSE, FALSE, 0); cursor_marker_sec_spinner_adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 59.0, 1.0, 74.0, 0); cursor_marker_sec_spinner = gtk_spin_button_new(cursor_marker_sec_spinner_adj, 1.0, 0); gtk_widget_set_sensitive( cursor_marker_sec_spinner, FALSE); gtk_box_pack_start(GTK_BOX(hbox), cursor_marker_sec_spinner, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(cursor_marker_sec_spinner_adj), "value-changed", G_CALLBACK(cursor_marker_time_spinners_changed), NULL); gtk_box_pack_start( GTK_BOX( hbox), gtk_label_new("."), FALSE, FALSE, 0); cursor_marker_subsec_spinner_adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, CD_BLOCKS_PER_SEC-1, 1.0, 74.0, 0); cursor_marker_subsec_spinner = gtk_spin_button_new(cursor_marker_subsec_spinner_adj, 1.0, 0); gtk_widget_set_sensitive( cursor_marker_subsec_spinner, FALSE); gtk_box_pack_start(GTK_BOX(hbox), cursor_marker_subsec_spinner, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(cursor_marker_subsec_spinner_adj), "value-changed", G_CALLBACK(cursor_marker_time_spinners_changed), NULL); gtk_widget_show_all(hbox); return hbox; } static void do_startup(GApplication *application, gpointer user_data) { setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); textdomain(PACKAGE); appconfig_init(); } static void menu_check_all(GSimpleAction *action, GVariant *parameter, gpointer user_data) { parts_check_cb(NULL, GINT_TO_POINTER(CHECK_ALL)); } static void menu_check_none(GSimpleAction *action, GVariant *parameter, gpointer user_data) { parts_check_cb(NULL, GINT_TO_POINTER(CHECK_NONE)); } static void menu_check_invert(GSimpleAction *action, GVariant *parameter, gpointer user_data) { parts_check_cb(NULL, GINT_TO_POINTER(CHECK_INVERT)); } static void do_activate(GApplication *app, gpointer user_data) { GtkWidget *vbox; GtkWidget *tbl_widget; GtkWidget *vpane_vbox; GtkWidget *list_vbox; GtkWidget *frame; GtkWidget *hbox; GtkWidget *button; sample_surface = waveform_surface_create_sample(); summary_surface = waveform_surface_create_summary(); main_window = gtk_application_window_new(GTK_APPLICATION(app)); GActionEntry entries[] = { { "open", menu_open_file, NULL, NULL, NULL, }, { "menu", menu_menu, NULL, NULL, NULL, }, // TODO: "save" is currently unused { "save", menu_save, NULL, NULL, NULL, }, { "save_to_folder", menu_save_as, NULL, NULL, NULL, }, { "export", menu_export, NULL, NULL, NULL, }, { "import", menu_import, NULL, NULL, NULL, }, { "add_break", menu_add_track_break, NULL, NULL, NULL, }, { "jump_cursor", jump_to_cursor_marker, NULL, NULL, NULL, }, #if defined(WANT_MOODBAR) { "display_moodbar", menu_view_moodbar, NULL, appconfig_get_show_moodbar()?"true":"false", NULL, }, { "generate_moodbar", menu_moodbar, NULL, NULL, NULL, }, #endif { "check_all", menu_check_all, NULL, NULL, NULL, }, { "check_none", menu_check_none, NULL, NULL, NULL, }, { "check_invert", menu_check_invert, NULL, NULL, NULL, }, { "auto_rename", menu_rename, NULL, NULL, NULL, }, { "remove_break", menu_delete_track_break, NULL, NULL, NULL, }, { "jump_break", jump_to_track_break, NULL, NULL, NULL, }, }; g_action_map_add_action_entries(G_ACTION_MAP(main_window), entries, G_N_ELEMENTS(entries), main_window); set_action_enabled("add_break", FALSE); set_action_enabled("jump_cursor", FALSE); set_action_enabled("check_all", FALSE); set_action_enabled("check_none", FALSE); set_action_enabled("check_invert", FALSE); set_action_enabled("auto_rename", FALSE); set_action_enabled("remove_break", FALSE); set_action_enabled("jump_break", FALSE); set_action_enabled("export", FALSE); set_action_enabled("import", FALSE); #if defined(WANT_MOODBAR) set_action_enabled("display_moodbar", FALSE); set_action_enabled("generate_moodbar", FALSE); #endif gtk_window_set_default_icon_name( PACKAGE); header_bar = gtk_header_bar_new(); gtk_header_bar_set_title(GTK_HEADER_BAR(header_bar), APPNAME); gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header_bar), TRUE); GtkWidget *open_button = gtk_button_new_from_icon_name("document-open-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_text(open_button, _("Open file")); gtk_actionable_set_action_name(GTK_ACTIONABLE(open_button), "win.open"); gtk_header_bar_pack_start(GTK_HEADER_BAR(header_bar), open_button); GtkWidget *menu_button = gtk_button_new_from_icon_name("open-menu-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_text(menu_button, _("Open menu")); gtk_actionable_set_action_name(GTK_ACTIONABLE(menu_button), "win.menu"); gtk_header_bar_pack_end(GTK_HEADER_BAR(header_bar), menu_button); GMenu *top_menu = g_menu_new(); #if defined(WANT_MOODBAR) GMenu *display_menu = g_menu_new(); g_menu_append(display_menu, _("Display moodbar"), "win.display_moodbar"); g_menu_append(display_menu, _("Generate moodbar"), "win.generate_moodbar"); g_menu_append_section(top_menu, NULL, G_MENU_MODEL(display_menu)); #endif GMenu *toc_menu = g_menu_new(); g_menu_append(toc_menu, _("Import track breaks"), "win.import"); g_menu_append(toc_menu, _("Export track breaks"), "win.export"); g_menu_append_section(top_menu, NULL, G_MENU_MODEL(toc_menu)); GMenu *tools_menu = g_menu_new(); g_menu_append(tools_menu, _("Merge wave files"), "app.guimerge"); g_menu_append_section(top_menu, NULL, G_MENU_MODEL(tools_menu)); GMenu *prefs_menu = g_menu_new(); g_menu_append(prefs_menu, _("Preferences"), "app.preferences"); g_menu_append_section(top_menu, NULL, G_MENU_MODEL(prefs_menu)); GMenu *about_menu = g_menu_new(); g_menu_append(about_menu, _("About"), "app.about"); g_menu_append_section(top_menu, NULL, G_MENU_MODEL(about_menu)); menu_popover = gtk_popover_new_from_model(menu_button, G_MENU_MODEL(top_menu)); gtk_popover_set_position(GTK_POPOVER(menu_popover), GTK_POS_BOTTOM); header_bar_save_button = GTK_WIDGET(gtk_button_new_from_icon_name("document-save-as-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR)); gtk_actionable_set_action_name(GTK_ACTIONABLE(header_bar_save_button), "win.save_to_folder"); gtk_widget_set_sensitive(header_bar_save_button, FALSE); gtk_widget_set_tooltip_text(header_bar_save_button, _("Save file parts")); gtk_header_bar_pack_start(GTK_HEADER_BAR(header_bar), header_bar_save_button); gtk_window_set_titlebar(GTK_WINDOW(main_window), header_bar); set_title( NULL); g_signal_connect(G_OBJECT(main_window), "delete_event", G_CALLBACK(delete_event), NULL); gtk_container_set_border_width(GTK_CONTAINER(main_window), 0); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(main_window), vbox); /* paned view */ vpane1 = gtk_paned_new(GTK_ORIENTATION_VERTICAL); gtk_box_pack_start(GTK_BOX(vbox), vpane1, TRUE, TRUE, 0); /* vbox for the vpane */ vpane_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_paned_pack1(GTK_PANED(vpane1), vpane_vbox, FALSE, FALSE); /* paned view */ vpane2 = gtk_paned_new(GTK_ORIENTATION_VERTICAL); gtk_box_pack_start(GTK_BOX(vpane_vbox), vpane2, TRUE, TRUE, 0); /* The summary_surface drawing area */ draw_summary = gtk_drawing_area_new(); gtk_widget_set_size_request(GTK_WIDGET(draw_summary), -1, 60); g_signal_connect(G_OBJECT(draw_summary), "draw", G_CALLBACK(draw_summary_draw_event), NULL); g_signal_connect(G_OBJECT(draw_summary), "configure_event", G_CALLBACK(draw_summary_configure_event), NULL); g_signal_connect(G_OBJECT(draw_summary), "button_release_event", G_CALLBACK(draw_summary_button_release), NULL); g_signal_connect(G_OBJECT(draw_summary), "motion_notify_event", G_CALLBACK(draw_summary_button_release), NULL); g_signal_connect(G_OBJECT(draw_summary), "scroll-event", G_CALLBACK(scroll_event), NULL); gtk_widget_add_events(draw_summary, GDK_BUTTON_RELEASE_MASK); gtk_widget_add_events(draw_summary, GDK_BUTTON_PRESS_MASK); gtk_widget_add_events(draw_summary, GDK_BUTTON_MOTION_MASK); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(frame), draw_summary); gtk_paned_pack1(GTK_PANED(vpane2), frame, TRUE, FALSE); /* The sample_surface drawing area */ draw = gtk_drawing_area_new(); gtk_widget_set_size_request(GTK_WIDGET(draw), -1, 90); g_signal_connect(G_OBJECT(draw), "draw", G_CALLBACK(draw_draw_event), NULL); g_signal_connect(G_OBJECT(draw), "configure_event", G_CALLBACK(configure_event), NULL); g_signal_connect(G_OBJECT(draw), "button_release_event", G_CALLBACK(button_release), NULL); g_signal_connect(G_OBJECT(draw), "motion_notify_event", G_CALLBACK(button_release), NULL); g_signal_connect(G_OBJECT(draw), "scroll-event", G_CALLBACK(scroll_event), NULL); gtk_widget_add_events(draw, GDK_BUTTON_RELEASE_MASK); gtk_widget_add_events(draw, GDK_BUTTON_PRESS_MASK); gtk_widget_add_events(draw, GDK_BUTTON_MOTION_MASK); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(frame), draw); gtk_paned_pack2(GTK_PANED(vpane2), frame, TRUE, FALSE); // gtk_box_pack_start(GTK_BOX(vpane_vbox), draw, TRUE, TRUE, 5); /* Add scrollbar */ adj = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 100)); g_signal_connect(G_OBJECT(adj), "value_changed", G_CALLBACK(adj_value_changed), NULL); scrollbar = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT(adj)); gtk_box_pack_start(GTK_BOX(vpane_vbox), scrollbar, FALSE, TRUE, 0); /* vbox for the list */ list_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); gtk_container_set_border_width(GTK_CONTAINER(list_vbox), 5); gtk_paned_pack2(GTK_PANED(vpane1), list_vbox, TRUE, FALSE); /* Add cursor marker spinner and track break add and delete buttons */ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); gtk_box_pack_start(GTK_BOX(list_vbox), hbox, FALSE, FALSE, 0); play_button = gtk_button_new_from_icon_name("media-playback-start-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_sensitive(play_button, FALSE); gtk_widget_set_tooltip_text(play_button, _("Toggle playback")); gtk_box_pack_start(GTK_BOX(hbox), play_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(play_button), "clicked", G_CALLBACK(menu_play), NULL); gtk_box_pack_start( GTK_BOX( hbox), gtk_label_new( _("Cursor position:")), FALSE, FALSE, 0); cursor_marker_spinner_adj = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 74.0, 0); cursor_marker_spinner = gtk_spin_button_new(cursor_marker_spinner_adj, 1.0, 0); gtk_widget_set_sensitive( cursor_marker_spinner, FALSE); gtk_box_pack_start(GTK_BOX(hbox), cursor_marker_spinner, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(cursor_marker_spinner_adj), "value-changed", G_CALLBACK(cursor_marker_spinner_changed), NULL); //gtk_box_pack_start(GTK_BOX(hbox), make_time_offset_widget(), FALSE, FALSE, 0); // Jump Around GtkWidget *bbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_start(GTK_BOX(hbox), bbox, FALSE, FALSE, 0); gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_EXPAND); button = gtk_button_new_from_icon_name("media-seek-backward-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_text(button, _("Seek to previous silence")); gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(menu_prev_silence), NULL); button_seek_backward = button; button = gtk_button_new_from_icon_name("preferences-system-time-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_text(button, _("Jump to time")); gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(menu_jump_to), NULL); jump_to_popover = gtk_popover_new(button); gtk_popover_set_position(GTK_POPOVER(jump_to_popover), GTK_POS_BOTTOM); gtk_container_add(GTK_CONTAINER(jump_to_popover), make_time_offset_widget()); button_jump_to_time = button; button = gtk_button_new_from_icon_name("media-seek-forward-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_text(button, _("Seek to next silence")); gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(menu_next_silence), NULL); button_seek_forward = button; // Spacer gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(""), TRUE, TRUE, 0); button = gtk_button_new_from_icon_name("edit-cut-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_text(button, _("Auto-split by interval")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(menu_autosplit), NULL); autosplit_popover = gtk_popover_new(button); gtk_popover_set_position(GTK_POPOVER(autosplit_popover), GTK_POS_BOTTOM); gtk_container_add(GTK_CONTAINER(autosplit_popover), autosplit_create(GTK_POPOVER(autosplit_popover))); button_auto_split = button; gtk_box_pack_start(GTK_BOX(hbox), gtk_separator_new(GTK_ORIENTATION_VERTICAL), FALSE, FALSE, 0); /* add track break button */ button = gtk_button_new_from_icon_name("list-add-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.add_break"); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); button_add_break = button; /* delete track break button */ button = gtk_button_new_from_icon_name("list-remove-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_actionable_set_action_name(GTK_ACTIONABLE(button), "win.remove_break"); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); button_remove_break = button; /* Set buttons to be disabled initially */ gtk_widget_set_sensitive(button_seek_forward, FALSE); gtk_widget_set_sensitive(button_jump_to_time, FALSE); gtk_widget_set_sensitive(button_seek_backward, FALSE); gtk_widget_set_sensitive(button_auto_split, FALSE); gtk_widget_set_sensitive(button_add_break, FALSE); gtk_widget_set_sensitive(button_remove_break, FALSE); /* Track Break List */ tbl_widget = track_break_create_list_gui(); gtk_box_pack_start(GTK_BOX(list_vbox), tbl_widget, TRUE, TRUE, 0); /* Finish up */ sample_init(); if (appconfig_get_main_window_xpos() > 0) { gtk_window_move (GTK_WINDOW (main_window), appconfig_get_main_window_xpos(), appconfig_get_main_window_ypos()); } if( appconfig_get_main_window_width() > 0) { gtk_window_resize(GTK_WINDOW(main_window), appconfig_get_main_window_width(), appconfig_get_main_window_height()); gtk_paned_set_position(GTK_PANED(vpane1), appconfig_get_vpane1_position()); gtk_paned_set_position(GTK_PANED(vpane2), appconfig_get_vpane2_position()); } gtk_widget_show_all( GTK_WIDGET(main_window)); if (user_data) { open_file_source_id = g_idle_add(open_file_arg, user_data); } } static void do_open(GApplication *application, gpointer files, gint n_files, gchar *hint, gpointer user_data) { GFile **gfiles = (GFile **)files; for (int i=0; i void wavbreaker_autosplit(long x); void wavbreaker_write_files(char *dirname); GtkWidget *wavbreaker_get_main_window(); void wavbreaker_update_moodbar_state(); void wavbreaker_update_listmodel(); void wavbreaker_quit(); #endif /* WAVBREAKER_H */ wavbreaker-0.16/src/wavgen.c000066400000000000000000000112471435035650500160260ustar00rootroot00000000000000/* wavgen - Generate a test wave file for testing wavbreaker * Copyright (C) 2015 Thomas Perl * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include #include #include #ifndef M_PI #define M_PI (3.14159265358979323846) #endif #include "format_wav.h" #include "sample_info.h" typedef void (*ampfreq_func_t)(float, float *, float *); static inline void ampfreq1(float pos, float *amp, float *freq) { pos *= 2 * M_PI; *amp = fabsf(cosf(pos * 13.f)); *freq = 440.f + 440.f * sinf(pos * 77.f); } typedef void (*generate_audio_func_t)(FILE *, SampleInfo *, void *); static void generate_ampfreq(FILE *fp, SampleInfo *si, void *user_data) { ampfreq_func_t f = (ampfreq_func_t)user_data; int samples = si->numBytes / si->channels; int i; for (i=0; isamplesPerSec)); int ch; for (ch=0; chchannels; ch++) { if (si->bitsPerSample == 8) { char buf = 127 + 127 * amp; fwrite(&buf, sizeof(buf), 1, fp); } else if (si->bitsPerSample == 16) { short buf = amp * 0x7fff; fwrite(&buf, sizeof(buf), 1, fp); } } } } typedef char (*oneliner_func_t)(int t); // http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html static char oneliner(int t) { return t*(((t>>12)|(t>>8))&(63&(t>>4))); } static void generate_oneliner(FILE *fp, SampleInfo *si, void *user_data) { g_assert_cmpint(si->channels, ==, 1); g_assert_cmpint(si->bitsPerSample, ==, 8); g_assert_cmpint(si->samplesPerSec, ==, 8000); oneliner_func_t f = (oneliner_func_t)user_data; int t; for (t=0; tnumBytes; t++) { fputc(f(t), fp); } } int cmd_wavgen(int argc, char *argv[]) { struct { char *name; int channels; int samplesPerSec; int bitsPerSample; int seconds; generate_audio_func_t generate_func; void *generate_func_user_data; } templates[] = { { "gen", 2, 44100, 16, 60, generate_ampfreq, &freq1 }, { "gen", 2, 44100, 8, 60, generate_ampfreq, &freq1 }, { "gen", 1, 44100, 16, 60, generate_ampfreq, &freq1 }, { "gen", 1, 44100, 8, 60, generate_ampfreq, &freq1 }, { "gen", 1, 22050, 8, 60, generate_ampfreq, &freq1 }, { "gen", 1, 11025, 8, 60, generate_ampfreq, &freq1 }, { "oneliner", 1, 8000, 8, 60, generate_oneliner, &oneliner }, { "gen_long", 2, 44100, 16, 60 * 3, generate_ampfreq, &freq1 }, }; int i; for (i=0; i #include "format.h" int cmd_wavinfo(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s [file1.wav] [...]\n", argv[0]); return 1; } format_init(); for (int i = 1; i < argc; i++) { char *error_message = NULL; OpenedAudioFile *oaf = format_open_file(argv[i], &error_message); if (oaf == NULL) { printf("Error opening %s: %s\n", argv[i], error_message); g_free(error_message); continue; } format_print_file_info(oaf); format_close_file(oaf); printf("\n"); } return 0; } wavbreaker-0.16/src/wavmerge.c000066400000000000000000000043121435035650500163470ustar00rootroot00000000000000/* wavbreaker - A tool to split a wave file up into multiple wave. * Copyright (C) 2002-2006 Timothy Robinson * * This program is free software; you can redistribute it and/or modify * it under the terms of the 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 */ #include #include #include #include #include "sample_info.h" #include "format_wav.h" static void usage() { printf("Must pass filenames of wave files to merge.\n"); printf("Usage: wavmerge [-o outfile] mergefiles...\n"); } int cmd_wavmerge(int argc, char *argv[]) { int ret; char *merge_filename; int num_files; char **filenames; if (argc > 1 && strcmp(argv[1], "-o") == 0) { if (argc < 5) { usage(); return 1; } merge_filename = g_strdup(argv[2]); num_files = argc - 3; filenames = &argv[3]; } else { if (argc < 3) { usage(); return 1; } merge_filename = g_strdup("merged.wav"); num_files = argc - 1; filenames = &argv[1]; } if (g_file_test(merge_filename, G_FILE_TEST_EXISTS)) { fprintf(stderr, "ERROR: The output file %s already exists.\n", merge_filename); return 2; } ret = wav_merge_files(merge_filename, num_files, filenames, NULL); if (ret != 0) { fprintf(stderr, "ERROR: The files are not of the same format.\n\n" "This means that the sample rate, bits per sample, etc. are different.\n" "Please use a tool, like sox, to convert the files to the same format and\n" "try again.\n" ); return 1; } g_free(merge_filename); return 0; }