jpylyzer-1.17.0/ 0000775 0000000 0000000 00000000000 12642767257 0013512 5 ustar 00root root 0000000 0000000 jpylyzer-1.17.0/.gitignore 0000664 0000000 0000000 00000003140 12642767257 0015500 0 ustar 00root root 0000000 0000000 # If you're thinking of un-ignoring any of these artefacts in a lower
# level .gitignore please think again. The none eclipse / maven options
# below are recommended candidates from http://help.github.com/ignore-files/
#
# As a general rule please don't commit:
# IDE generated files, it upsets the IDEs of others
# Compiled / built files (exes, jars, etc.), it's a source repository
# Test data larger than a few KB, we'll go for bigger test files in the testbed
#
# Remember, we'd like to keep the git repo light and small enough for people to
# download quickly and easily.
#
# Any questions then get in touch:
#
# Carl Wilson Open Planets Foundation
# carlwilson@GitHub carl( AT )openplanetsfoundation.org.
# Eclipse Files #
#################
.externalToolBuilders
.settings
.classpath
.project
*.md.html
bin
.pydevproject
# Netbeans Files #
#################
nbactions.xml
# project build directories #
#############################
target
build
dist
pyi-build
# Compiled Source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
*.pyc
# PyInstaller bits #
####################
*.spec
# Vagrant bits #
####################
.vagrant/
# Packages #
############
# Better to unpack and commt the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.war
*.zip
*.dsc
*.deb
*.changes
# Logs and databases #
######################
*.log
*.sql
*.sqlite
# Vue Backup Files #
######################
.~*.vue
# OS Generated files #
######################
.DS_Store*
ehthumbs.db
Icon?
Thumbs.db
.directory
# Files from gh-pages #
#######################
/_site
jpylyzer-1.17.0/.opf.yml 0000664 0000000 0000000 00000000153 12642767257 0015076 0 ustar 00root root 0000000 0000000 name: jpylyzer
vendor: SCAPE
maintainer:
name: Johan van der Knijff
email: johan.vanderknijff@kb.nl jpylyzer-1.17.0/.travis.yml 0000664 0000000 0000000 00000000426 12642767257 0015625 0 ustar 00root root 0000000 0000000 language: python
python:
- "2.7"
- "3.2"
- "3.3"
before_install:
- sudo -H pip install pyinstaller
install:
- dpkg-buildpackage -tc -uc -us
script:
- python -m unittest discover
after_success:
- sudo dpkg -i ../jpylyzer_1.10.1_amd64.deb
- jpylyzer --version
jpylyzer-1.17.0/BUILD_HOWTO_LINUX 0000664 0000000 0000000 00000004111 12642767257 0016230 0 ustar 00root root 0000000 0000000 This howto explains how to build 'jpylyzer' as an linux executable so that python is no longer a dependency.
This was done because there was an incompatibility between 'jpylyzer' and python version below 2.7.
## INSTRUCTIONS (APPLIES TO PYINSTALLER 2)
1. Download 'pyinstaller' from:
http://www.pyinstaller.org/
2. Unpack it:
tar -xjf pyinstaller-2.0.tar.bz2
3. compile (in below example result as one single file):
python pyinstaller.py --onefile ./jpylyzer/jpylyzer.py
4. look in the directory 'dist'.
Voila!
## INSTRUCTIONS (APPLIES TO PYINSTALLER 1.5)
With PyInstaller 1.5 (which I think is the version that is still used on the Amazon Webcloud setup)
you first need to make a .spec file, so the compilation involves two steps:
python Makespec.py --onefile ./jpylyzer/jpylyzer.py
python pyinstaller.py jpylyzer.spec
## NOTE ON JPYLYZER MAKEFILE
The current version of the makefile uses the following commands:
pymakespec --onefile ./jpylyzer/jpylyzer.py
pyinstaller jpylyzer.spec
Apparently pymakespec/pyinstaller are helper scripts that call Makespec.py and pyinstaller.py, respectively.
This works on the Amazon Webcloud setup, but for local builds you will need to change these lines
so that the actual Python scripts are called. To make things slightly more complicated PyInstaller
has no default installation location, so you'll have to insert the file paths that apply to you
system, e.g.:
python /home/johan/pyinstall/Makespec.py --onefile ./jpylyzer/jpylyzer.py
python /home/johan/pyinstall/pyinstaller.py jpylyzer.spec
## BUILDING THE DEBIAN PACKAGES LOCALLY
You can build jpylyzer locally using:
dpkg-buildpackage -tc
However this will result in an error because of a missing changelog file. Apparently it is generated
automatically on the Amazon Webcloud setup, but I'm not exactly sure how! For testing purposes you may
use a dummy changelog as a workaround.
In addition you will need to edit the makefile as described in the previous section.
More info on all this here:
http://www.openplanetsfoundation.org/blogs/2013-04-23-adventures-debian-packaging
Updated 2/5/2013 by JvdK jpylyzer-1.17.0/BUILD_HOWTO_WIN32 0000664 0000000 0000000 00000002323 12642767257 0016136 0 ustar 00root root 0000000 0000000 This howto explains how to build 'jpylyzer' as a 32-bit Windows
executable so that Python is no longer a dependency. Procedure described
here will also pack binaries in a distribution-ready ZIP file.
This was tested under Windows 7 using PyInstaller 2.0. (I haven't found
a way to build actual Win64 binaries, since the build packages don't
appear to support this yet). For older PyInstaller versions (1.5) things
are a bit more complicated, so use version 2 if possible.
SET-UP AND CONFIGURATION (YOU ONLY NEED TO GO THROUGH THESE STEPS ONCE):
1. Download and install 'PyWin32' (Python for Windows extensions) from:
http://sourceforge.net/projects/pywin32/files/
2. Download 'pyinstaller' from
http://www.pyinstaller.org/
3. Unpack/unzip it with your favourite file archive manager. PyInstaller
is now ready for use.
4. Open the batch file 'buildWin32.bat' which is part of the jpylyzer
distribution, and update the configuration variables 'python' and
'pathPyInstaller' according to your own system
BUILDING THE WIN32 DISTRIBUTION:
1. Run the batch file from the repo's root dir ( i.e. the one in which
it is located):
buildWin32.bat
2. Look at the zip file in the directory 'dist_win32'.
Voila!
jpylyzer-1.17.0/LICENSE 0000664 0000000 0000000 00000004341 12642767257 0014521 0 ustar 00root root 0000000 0000000 Copyright:
KB / National Library of the Netherlands, Open Preservation Foundation
License:
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
On Debian systems, the complete text of the GNU Lesser General Public License
version 3 can be found in "/usr/share/common-licenses/LGPL-3".
The Debian packaging is:
Copyright (C) 2012 Open Planets Foundation
and is licensed under the GPL version 3, see above.
Python Six (which is included in the jpylyzer source):
Copyright (c) 2010-2015 Benjamin Peterson
Python Six License:
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.
jpylyzer-1.17.0/MANIFEST.in 0000664 0000000 0000000 00000000077 12642767257 0015254 0 ustar 00root root 0000000 0000000 recursive-include example_files *
recursive-include doc *.html
jpylyzer-1.17.0/Makefile 0000664 0000000 0000000 00000000157 12642767257 0015155 0 ustar 00root root 0000000 0000000 build:
./build-with-pyinstaller.sh
install:
mv pyi-build/dist/jpylyzer $(DESTDIR)
clean:
rm -fR pyi-build
jpylyzer-1.17.0/README.md 0000664 0000000 0000000 00000010701 12642767257 0014770 0 ustar 00root root 0000000 0000000 #jpylyzer
## About
*Jpylyzer* is a JP2 [(JPEG 2000 Part 1)][2] image validator and properties extractor. Its development was partially supported by the [SCAPE][4] Project. The SCAPE project is co-funded by the European Union under FP7 ICT-2009.4.1 (Grant Agreement number 270137).
## Jpylyzer homepage
## Cd Status
- [](https://travis-ci.org/openpreserve/jpylyzer "Jpylyzer Travis-CI integration build") Travis-CI
- [](http://jenkins.opf-labs.org/job/jpylyser/) OPF Jenkins
## Downloads
* [User Manual][1] - exhaustive documentation of all aspects of *jpylyzer*
* [Windows binaries][5] - stand-alone Windows binaries that allow you to run *jpylyzer* without any *Python* dependencies
* [Debian packages][6] - i386 (32 bit) architecture
* [Debian packages][7] - Amd 64 (64 bit) architecture
## Command line use
### Usage
usage: jpylyzer.py [-h] [--verbose] [--recurse] [--wrapper] [--nullxml]
[--nopretty] [--version] jp2In [jp2In ...]
### Positional arguments
`jp2In` : input JP2 image(s), may be one or more (whitespace-separated) path expressions; prefix wildcard (\*) with backslash (\\) in Linux..
### Optional arguments
`-h, --help` : show this help message and exit;
`-v, --version` : show program's version number and exit;
`--verbose` : report test results in verbose format;
`--recurse, -r` : when analysing a directory, recurse into subdirectories (implies `--wrapper`)
`--wrapper, -w` : wrap the output for individual image(s) in 'results' XML element.
`--nullxml` : extract null-terminated XML content from XML and UUID boxes (doesn't affect validation)
`--nopretty` : suppress pretty-printing of XML output
## Output
Output is directed to the standard output device (*stdout*).
### Example
`jpylyzer.py rubbish.jp2 > rubbish.xml`
In the above example, output is redirected to the file 'rubbish.xml'.
### Outline of output elements
1. *toolInfo*: tool name (jpylyzer) + version.
2. *fileInfo*: name, path, size and last modified time/date of input file.
3. *isValidJP2*: *True* / *False* flag indicating whether file is valid JP2.
4. *tests*: tree of test outcomes, expressed as *True* / *False* flags.
A file is considered valid JP2 only if all tests return *True*. Tree follows JP2 box structure. By default only tests that returned *False* are reported, which results in an empty *tests* element for files that are valid JP2. Use the `--verbose` flag to get *all* test results.
5. *properties*: tree of image properties. Follows JP2 box structure. Naming of properties follows [ISO/IEC 15444-1 Annex I][2] (JP2 file format syntax) and [Annex A][3] (Codestream syntax).
## Debian packages build process
The [Vagrant directory](vagrant) of this repo contains instructions on how to build Debian packages using [VirtualBox](https://www.virtualbox.org/) and [Vagrant](https://www.vagrantup.com/). A Vagrantfile and provisioning scripts are included for a number of target platforms, which should make the process of building the packages fairly easy.
## Steps in preparing a jpylyzer release
(Outline only, this section is under development and needs more detail!).
1. Make changes to code
1. Update version number in *jpylyzer.py*, *setup.py* and *sonar-project.properties* (do we really need last file?)
1. In case of changes to command-line interface, update [jpylyzer.pod](debian/jpylyzer.pod) file in *Debian* folder.
1. Create new entry in changelog using `dch -i`; then manually update version number, and create list of changes.
1. Update [User Manual](doc/jpylyzerUserManual.md) if necessary
1. Commit all changes
1. Add tag and commit
1. Build Linux packages using [instructions here](vagrant)
1. Build Windows binaries
1. Upload Linux/Windows packages to BinTray
1. Website: update *binVersion* in *_config.yml* (this updates the links to all packages on BinTray to the correct version)
1. Website: write short release note
1. Commit changes to website
1. Spread the word!
[1]: http://jpylyzer.openpreservation.org//jpylyzerUserManual.html
[2]: http://www.jpeg.org/public/15444-1annexi.pdf
[3]: http://www.itu.int/rec/T-REC-T.800/en
[4]: http://www.scape-project.eu/
[5]: https://bintray.com/openplanets/opf-windows/jpylyzer_win32/
[6]: https://bintray.com/openplanets/opf-debian/jpylyzer_i386/
[7]: https://bintray.com/openplanets/opf-debian/jpylyzer_amd64/
jpylyzer-1.17.0/build-with-pyinstaller.sh 0000775 0000000 0000000 00000002106 12642767257 0020464 0 ustar 00root root 0000000 0000000 #!/bin/bash
# Bash script to build jpylyzer using PyInstaller
# First check for PyInstaller
command -v pyinstaller >/dev/null 2>&1 || {
echo >&2 "http://www.pyinstaller.org/ is required to build the Jpylyzer executable.";
echo >&2 "Please install PyInstaller http://pythonhosted.org/PyInstaller/#installing-pyinstaller.";
exit 1;
}
# PyInstaller cannot be run as root
originalUserId=$(id -u);
userId=$originalUserId
if [ $originalUserId == 0 ]
then
uname=$(getent passwd 1000 | cut -d: -f1)
sudo -u $uname "pyi-makespec --strip --onefile --paths=jpylyzer --specpath=pyi-build ./jpylyzer/jpylyzer.py"
sudo -u $uname "pyinstaller --strip --clean --paths=jpylyzer --distpath=pyi-build/dist --workpath=pyi-build/build ./pyi-build/jpylyzer.spec"
else
# So making stripped binaries for debian packaging
pyi-makespec --strip --onefile --paths=jpylyzer --specpath=pyi-build ./jpylyzer/jpylyzer.py
pyinstaller --strip --clean --paths=jpylyzer --distpath=pyi-build/dist --workpath=pyi-build/build ./pyi-build/jpylyzer.spec
fi
./pyi-build/dist/jpylyzer --version;
jpylyzer-1.17.0/buildWin32.bat 0000664 0000000 0000000 00000003360 12642767257 0016126 0 ustar 00root root 0000000 0000000 :
:: Build 32 bit Windows jpylyzer binaries from Python script, and pack them in ZIP file
::
:: ZIP file includes license file, PDF User Manual and example files
::
:: Johan van der Knijff, 25 april 2013
::
:: Dependencies:
::
:: - Python 2.7, 32-bit version (PyInstaller doesn't work with Python 3 yet!)
:: - PyInstaller 2: http://www.pyinstaller.org/
:: - PyWin32 (needed by PyInstaller): http://sourceforge.net/projects/pywin32/files/
:: - a spec file with
::
@echo off
setlocal
::::::::: CONFIGURATION ::::::::::
:: Python
:: Note that to produce a 32-bit binary we need a 32-bit Python version!
::set python=c:\python27\python
set python=c:\python27_32bit\python
:: Path to PyInstaller
set pathPyInstaller=c:\pyinstall\
:: Script base name (i.e. script name minus .py extension)
set scriptBaseName=jpylyzer
:: PyInstaller spec file that defines build options
set specFile=jpylyzer_win32.spec
:: Directory where build is created (should be identical to 'name' in 'coll' in spec file!!)
set distDir=.\dist_win32\
:: Executes jpylyzer with -v option and stores output to
:: env variable 'version'
set vCommand=%python% .\%scriptBaseName%\%scriptBaseName%.py -v
%vCommand% 2> temp.txt
set /p version= < temp.txt
del temp.txt
::::::::: BUILD ::::::::::::::::::
:: Build binaries
%python% %pathPyInstaller%\pyinstaller.py %specFile%
:: Generate name for ZIP file
set zipName=%scriptBaseName%_%version%_win32.zip
:: Create ZIP file
%python% zipdir.py %distDir%\jpylyzer %distDir%\%zipName%
::::::::: CLEANUP :::::::::::::::::
:: Delete build directory
rmdir build /S /Q
:: Delete jpylyzer directory in distdir
rmdir %distDir%\jpylyzer /S /Q
::::::::: PARTY TIME! :::::::::::::::::
echo /
echo Done! Created %zipName% in directory %distDir%!
echo /
jpylyzer-1.17.0/buildWin64.bat 0000664 0000000 0000000 00000003464 12642767257 0016140 0 ustar 00root root 0000000 0000000 :
:: Build 64 bit Windows jpylyzer binaries from Python script, and pack them in ZIP file
::
:: ZIP file includes license file, PDF User Manual and example files
::
:: Johan van der Knijff, 25 april 2013
::
:: Dependencies:
::
:: - Python 2.7, 64-bit version (PyInstaller doesn't work with Python 3 yet!)
:: - PyInstaller 2: http://www.pyinstaller.org/
:: - PyWin32 (needed by PyInstaller): http://sourceforge.net/projects/pywin32/files/
:: - a spec file with
::
@echo off
setlocal
::::::::: CONFIGURATION ::::::::::
:: Python
:: Note that to produce a 32-bit binary we need a 32-bit Python version!
set python=c:\python27\python
::set python=c:\python27_32bit\python
:: Path to PyInstaller
set pathPyInstaller=c:\pyinstall\
:: Script base name (i.e. script name minus .py extension)
set scriptBaseName=jpylyzer
:: PyInstaller spec file that defines build options
set specFile=jpylyzer_win64.spec
:: Directory where build is created (should be identical to 'name' in 'coll' in spec file!!)
set distDir=.\dist_win64\
:: Executes jpylyzer with -v option and stores output to
:: env variable 'version'
set vCommand=%python% .\%scriptBaseName%\%scriptBaseName%.py -v
%vCommand% 2> temp.txt
set /p version= < temp.txt
del temp.txt
::::::::: BUILD ::::::::::::::::::
:: Build binaries
%python% %pathPyInstaller%\pyinstaller.py %specFile%
:: Generate name for ZIP file
set zipName=%scriptBaseName%_%version%_win64.zip
:: Create ZIP file
%python% zipdir.py %distDir%\jpylyzer %distDir%\%zipName%
::::::::: CLEANUP :::::::::::::::::
:: Delete build directory
rmdir build /S /Q
:: Delete jpylyzer directory in distdir
rmdir %distDir%\jpylyzer /S /Q
::::::::: PARTY TIME! :::::::::::::::::
echo /
echo Done! Created %zipName% in directory %distDir%!
echo /
jpylyzer-1.17.0/doc/ 0000775 0000000 0000000 00000000000 12642767257 0014257 5 ustar 00root root 0000000 0000000 jpylyzer-1.17.0/doc/README.md 0000664 0000000 0000000 00000007545 12642767257 0015551 0 ustar 00root root 0000000 0000000 # Notes on jpylyzer User Manual
## Syntax
The jpylyzer User Manual uses the [Markdown Extra](http://michelf.ca/projects/php-markdown/extra/) syntax with some Pandoc-specific extras. This Markdown version differs in a number of ways from [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown), and as a result the Markdown file doesn't render correctly when viewed in Github. This is no reason for any concern.
For the rendering of the equation objects (which are in [MathML](http://en.wikipedia.org/wiki/MathML)) there is a dependency on [MathJax](http://www.mathjax.org/)
## Exporting to HTML
Run the script [mdToDeliveryFormats.sh](mdToDeliveryFormats.sh) to export the Markdown file to the folllowing delivery formats:
1. Jekyll template with HTML that can be used to replace the on-line manual on the jpylyzer homepage (file [userManual.html](https://github.com/openpreserve/jpylyzer/blob/gh-pages/userManual.html))
1. Self-contained HTML without any external dependencies (style sheets, images etc. are all embedded in one single file; this replaces the former PDF version).
Script requires [Pandoc](http://johnmacfarlane.net/pandoc/) and [Xmllint](http://xmlsoft.org/xmllint.html).
Note on the command-line switches used in the script:
* `-s` creates a stand-alone file
* `--toc` automatically generates a table of contents
* `--toc-depth=2` specifies that table of contents contains Chapter (level 1) and Section (level 2) headings (so level 3 and higher are left out).
* `--ascii` generates output in ascii format (not sure if this is really needed?)
* `-N` activates automatic chapter/section/subsection numbering
* `-w html5` sets the output format to `html 5`
* `-c jpylyzer.css` defines style sheet
You will need a fairly recent version of *Pandoc* to make this work, as older versions do not support `markdown_phpextra` as an input format. Note that it is important to use html5 as the output format, because the Markdown file contains [MathML](http://nl.wikipedia.org/wiki/Mathematical_Markup_Language) content that is not supported in previous html versions.
## Export to other delivery formats
Could be included at later stage. So far I have briefly investigated te following.
### PDF
First attempt, after some experimentation:
pandoc -s --toc --toc-depth=2 -N --chapters --latex-engine=xelatex -o jpylyzerUserManual.pdf jpylyzerUserManual.md
This results in a PDF, but it has a number of issues:
* Equations are mangled
* Some of the tables don't fit on the page (cell contents aren't wrapped)
* Size of images isn't quite right.
### EPUB3
pandoc -S -N --chapters -w epub3 --epub-stylesheet jpylyzer.css -o jpylyzerUserManual.epub frontMatter.md jpylyzerUserManual.md
This produces a file that is valid EPUB 3 according to [epubcheck](https://github.com/idpf/epubcheck).
Issues:
* Equations are mangled
* TOC numbering isn't quite right.
Because of the many issues with the PDF and EPUB export I'll be sticking to HTML for now.
## Stylesheet
The stylesheet *jpylyzer.css* is based on John MacFarlane's [pandoc.css](http://johnmacfarlane.net/pandoc/demo/pandoc.css), with some adaptations.
## Figures
The directory `figuresSVG` contains the Figures in [SVG](http://en.wikipedia.org/wiki/Scalable_Vector_Graphics) format. If you ever need to change/modify any of the figures in the manual, try editing the SVG (e.g. in [Inkscape](http://www.inkscape.org/)), then export the updated image to PNG. Note that the SVGs were derived from an MS Powerpoint file, and I'm not 100% sure as to how easy it is to edit them.
For best results in Inkscape:
* select all the Figure elements by drawing a rectangle around them;
* then use *Export Bitmap* from the *File* menu;
* set the *Export area* to *Selection*, and *Width* to a value between 350 (smaller figures) and 400 (larger ones);
* export result to directory *images*, using the same base name as the SVG.
jpylyzer-1.17.0/doc/figuresSVG/ 0000775 0000000 0000000 00000000000 12642767257 0016303 5 ustar 00root root 0000000 0000000 jpylyzer-1.17.0/doc/figuresSVG/boxStructure.svg 0000664 0000000 0000000 00000045505 12642767257 0021546 0 ustar 00root root 0000000 0000000
jpylyzer-1.17.0/doc/figuresSVG/codestreamOutput.svg 0000664 0000000 0000000 00000201324 12642767257 0022375 0 ustar 00root root 0000000 0000000
jpylyzer-1.17.0/doc/figuresSVG/codestreamStructure.svg 0000664 0000000 0000000 00000131466 12642767257 0023106 0 ustar 00root root 0000000 0000000
jpylyzer-1.17.0/doc/figuresSVG/jp2FormatStructure.svg 0000664 0000000 0000000 00000131124 12642767257 0022613 0 ustar 00root root 0000000 0000000
jpylyzer-1.17.0/doc/figuresSVG/outputStructure.svg 0000664 0000000 0000000 00000157126 12642767257 0022321 0 ustar 00root root 0000000 0000000
jpylyzer-1.17.0/doc/images/ 0000775 0000000 0000000 00000000000 12642767257 0015524 5 ustar 00root root 0000000 0000000 jpylyzer-1.17.0/doc/images/boxStructure.png 0000664 0000000 0000000 00000032704 12642767257 0020751 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR Ž ^“ sBIT|dˆ pHYs N N¿Ÿ¤( tEXtSoftware www.inkscape.org›î< IDATxœíwœTEòÀ¿,$› OQQ1£"(0õx†S¼3ž?³ÑóND=3§ž¨¨ˆ¢ EELË¡( V%Ãê÷GÕÛy;ìîÌ»;»K?Ÿù̼î~ýªßÌt½®î®`
Õjù€fY–ò$¨tî~´ kƒŸ€—€+€iÀààeàSà>à6/÷p)°xAUŠÈ`Šªž,"ß ³UõHùÈWÕEd"ÐHU»ŠÈ›@{UÝYDFªj[y8hî2v™ÿê×ì
œüp8°w1mx<ƒ¶=äåÒmÛrU=LD¦ µKѶû€i¶í<àQêý›
TQTUku€O€IY–§<Ù8øø,˲”'Ç;K€o€g€À
ÿ<X矿–ùço°ŽôàkàWÿü9¦tŸÅ~#€€©~½W™þùuàgÿ<XïŸßêùç÷€þyÖa«oÖÙ?ë×ýÜåøÕåzÆå,®mdضi¥lÛjÿ<¨Uж}â÷"¶Õr:wîLÇŽ *_~ù%3gÎD°§›aªzu¶…*/Ddpp¹ªÞ›myÊŽ=ÕÖPÕðÔZ…‘vÀìAƒÑ¿ÿ,KfäÈ‘Œ5ŠÙ$P¦t÷÷²*E ,XºH ]‚©^üèï[¼VuçwÙ HEP Õ‹ ªHÕga¶RHõ¢€ˆVÕgy¶RHõ"zjÍϪ²`çl¤"(êÅ ª&`«>?e[€@ AT/zC0aU~ɶ @*‚©^DOë²*E ,è”mTR½˜ ª«²-H`³ù9u‘@ »R½8@Dg[ÀfH ÒHõb™¿oȪ²`×l¤¢Vê"†ˆlˆªþ˜¢\s aRòJUÔOT"ÒHçÉ=_UøS~³ä<`aýP}ôTÕ•Ù¸¸ˆÔ¶6¨ê¼bʰ=°Îïc= °DU—uŽŸWÃÏ‹£À"U][&
¨\,N]¤ú²råJ–//¼¦N:4nܘš5kyN~~>K–,)”V£F
š7oNáY¹