pax_global_header00006660000000000000000000000064121456632540014522gustar00rootroot0000000000000052 comment=0962dc65384d5cbd3b591e6625caa129f7edf820 impressive-0.10.3+svn61/000077500000000000000000000000001214566325400147425ustar00rootroot00000000000000impressive-0.10.3+svn61/Artwork/000077500000000000000000000000001214566325400163735ustar00rootroot00000000000000impressive-0.10.3+svn61/Artwork/impressive.svg000066400000000000000000000167421214566325400213140ustar00rootroot00000000000000 impressive-0.10.3+svn61/Artwork/make_menu_images.py000066400000000000000000000031041214566325400222310ustar00rootroot00000000000000import Image Height = 32 Width = 64 FileName = "../site/menu_%s.png" GradStart = 0.875 GradEnd = 0.75 BaseGradient = [GradStart + (y / float(Height - 1)) * (GradEnd - GradStart) for y in xrange(Height)] def tf(x): return x*x * (3 - 2*x) TransitionL = [tf((x + 0.5) / Width) for x in xrange(Width)] TransitionR = TransitionL[:] TransitionR.reverse() NoTransition = Width * [1.0] NormalColor = (1.0, 1.0, 1.0) ActiveColor = (0.75, 0.75, 1.0) CurrentColor = (0.85, 0.85, 0.88) LightenFactor = [0.5**b for b in (1,2,3,4,5,6,7,8)] + [0.0] * (Height - 8) DarkenFactor = [1.0] * (Height - 8) + [1.0-0.5**b for b in (8,7,6,5,4,3,2,1)] DitherMatrix = ( ( 4, 9, 7,11), (12, 0,15, 3), ( 6,10, 5, 8), (14, 2,13, 1), ) def makeimg(name, color, trans): name = FileName % name print name data = [] for y in xrange(Height): b = BaseGradient[y] * DarkenFactor[y] lf = LightenFactor[y] ilf = 1.0 - lf for x in xrange(len(trans)): t = trans[x] d = (DitherMatrix[y & 3][x & 3] + 0.5) / 16 for c in color: i = (1.0 - t + t * c) * b i = lf + ilf * i data.append(chr(max(0, min(255, int(i * 255 + d))))) Image.fromstring('RGB', (len(trans), Height), "".join(data)).save(name) makeimg("n", NormalColor, NoTransition) makeimg("c_c", CurrentColor, NoTransition) makeimg("c_l", CurrentColor, TransitionL) makeimg("c_r", CurrentColor, TransitionR) makeimg("a_c", ActiveColor, NoTransition) makeimg("a_l", ActiveColor, TransitionL) makeimg("a_r", ActiveColor, TransitionR) impressive-0.10.3+svn61/Makefile000066400000000000000000000013201214566325400163760ustar00rootroot00000000000000all: impressive.py man demo man: impressive.1 impressive.1: site/impressive.html html2man.py python html2man.py -O $@ site/impressive.html demo: demo.pdf test: impressive.py demo.pdf xvfb-run -s "-screen 0 640x480x24 -ac +extension GLX +render -noreset" ./impressive.py -I alltrans.info -a 1 -Q demo.pdf test-demo: demo xpdf demo.pdf & release: sh makerelease.sh %.pdf: %.tex pdflatex -halt-on-error $< pdflatex -halt-on-error $< impressive.py: compile.py impressive_dev.py src/*.py python compile.py chmod +x $@ clean: rm -f *.nav *.out *.snm *.toc *.vrb *.aux *.log *.pyc *.pyo distclean: clean rm -f demo.pdf impressive.1 impressive.py .PHONY: all man demo test test-demo release clean distclean impressive-0.10.3+svn61/alltrans.info000066400000000000000000000002631214566325400174400ustar00rootroot00000000000000# info script that cycles through all transitions, used for smoke testing PageProps = dict([(i+1, {'transition':t}) for i,t in zip(xrange(PageCount), [PagePeel]+AllTransitions)]) impressive-0.10.3+svn61/changelog.txt000066400000000000000000000165561214566325400174470ustar00rootroot000000000000000.10.3 - fixed display problems when using odd window sizes - loading image data earlier so that no unhandled exceptions will be thrown when a file is broken - fixed typo in --aspect parameter - using -u doesn't periodically re-load the input file any longer if it changed only once - fixed a bunch of problems related to non-standard aspect ratios - adjustable zoom factor - black-out and white-out are now assigned to keys [.] and [,] - PDF hyperlinks are now also available if the cache is disabled - releasing all locks at the end of run_main() - included some library version numbers in crash messages - added option to fade in at program start and fade out at program end - added --nologo option - added shuffle feature - right mouse button will no longer switch to previous page in zoom mode (prevents accidental page switches) - improved MPlayer interface - added 'always' PageProp to play sound or video every time a page is entered - 'timeout' PageProp is now respected every time a page is entered if wrap mode (-w) is enabled - added finer-grained control over the progress bar colors and timing; added --page-progress option - added overscan option - display will now be quickly uninitialized when Impressive quits - improved PDF parser robustness - now using hashlib instead of md5 module, if available, to avoid a DeprecationWarning on Python 2.6 - software rendering warning now also reacts on any OpenGL renderer string beginning with 'software' - added FadeOutFadeIn transition (idea by Antonio Terceiro) - hyperlinks now work correctly on rotated pages 0.10.2 [2008-02-03] - --listtrans now shows which transitions are enabled by default - number of digits in pdftoppm output file names is cached - using xrandr to get current resolution on X11 - enabled URL hyperlinks using ShellExecute (Win32) or fd.o's xdg-open (UNIX) - 'keys' PageProp for arbitrary key bindings - exceptions in info scripts are now non-fatal - 'video' PageProp and PlayVideo() function for (HIGHLY EXPERIMENTAL!!!) fullscreen video playback - PDF parser now emits warnings instead of failing silently if something isn't OK - support for list files using the @filename syntax - 'comment' PageProp displays overlay text on a slide permanently - added auto-overview mode (idea by Tobias Maier) - restore compatibility with KeyJnoteGUI 0.10.1a [2007-11-27] - restored compatibility with poppler-based pdftoppm - added Alt+Tab as alias for "exit fullscreen mode" - improved cleanup code 0.10.1 [2007-09-09] - re-enabled GL_ARB_texture_non_power_of_two support (was broken in 0.10.0) - PDF hyperlink support - added compatibility fix for PyOpenGL 3.x - generalized and simplified PageProp system - rotate PageProp - multi-file support - persistent cache 0.10.0 [2007-06-02] - added pdftoppm rendering backend - overview page update fix - more font search paths (DejaVuSans.ttf, OSX paths) - graceful handling of failed renders - converted logo to PNG - fixed -T0 crash - allowed None as a value for the 'transition' PageProp and -t parameter - added 'transtime' PageProp to set transition duration for single pages - R key: reset timer - added 'progress' PageProp to show/hide progress bar - added 'reset' PageProp to reset the timer when the page is left - allowed special value FirstTimeOnly for the 'reset' prop - L key: return to last (= most recently used) page or back - added OnEnter, OnLeave, OnEnterOnce and OnLeaveOnce page props - customizable OSD layout and alpha - I and O keys change 'skip' and 'overlay' PageProps interactively - now accepting image file names at the command line - fixed supersample mode - added key repeat to quickly change the spotlight size via the keyboard - Home and End keys now navigate to the start and end of the presentation - shortcut function for any unused letter, number or function key - removed PagePeel from the default transitions list - two new families of transitions: {Slide,Squeeze}{Left,Right,Up,Down} 0.9.4 [2007-03-19] - middle mouse button now acts as overview toggle - automatic display mode guessing now implemented on Unix, too - fixed 'T' key - fixed crash in the OSD code if a broken version of PIL is used - added gamma controls (courtesy of Luke Campagnola) - added progress bar / estimated duration - added loadable cursor image 0.9.3 [2007-02-26] - fixed indentation bug (removing a box caused a transition to the prev page) - improved pdftk parser (handles non-ASCII characters gracefully) - all messages are redirected to stderr - added timer ([T] key) and time tracking mode - made all main keyboard bindings unicode key queries 0.9.2 [2007-02-17] - fixed memory cache - added "polling" option - added "cache range" option - added overview page OSD 0.9.1 [2007-01-24] - FIX: 'whitening' mode didn't work with GL_EXT_texture_rectangle - FIX: crash when clicking a mouse button in fade mode - FIX: occasionally left behind temp files 0.9.0 [2007-01-07] - fixed all OpenGL calls to use the explicit form (glTexCoord2d instead of glTexCoord) - corrected texture target specification for rare transitions - added unicode key aliases for the [+] and [-] keys (should improve i18n) - added "fade to solid color" feature - added 'skip' PageProp - improved/fixed window caption in overview mode - GhostScript is now called with -dUseCropBox, should improve handling of some LaTeX-beamer generated PDFs - using a temp file for the page cache now - added background rendering - Win32: true fullscreen by default 0.8.3 [2006-09-28] - 'overview' PageProp to remove pages from the overview screen - experimental aspect ratio option - new transition contributed by Ronan Le Hy - OpenGL non-power-of-two texture size extension support 0.8.2 [2006-07-13] - fixed crash on some files - added overview mode keyboard navigation - added "--rotate" option 0.8.1 [2006-02-04] - made OpenGL error reporting more concise - added "render" option to produce PNG files from a PDF 0.8.0 [2005-11-23] - fixed command-line option parser - changed some cmdline options (see documentation or -h) - added new --transition option to specify which transitions can be chosen randomly - added some new transitions from Rob Reid - fixed image file mode - fixed display of portrait images or pages - added experimental 2x zoom mode 0.7.2 [2005-10-24] - fixed two annoying bugs introduced in 0.7.1, related to mouse key remapping - fixed bug that caused parts of the old page content to be visible after transitions - added two slideshow-related options 0.7.1 [2005-10-22] - more intuitive highlight box handling (the middle mouse button is no longer used to create and destroy highlight boxes; instead, dragging the mouse while LMB is pressed creates a box and clicking with RMB deletes a box) - added 'initial page number' option (-i) 0.7.0 [2005-09-29] - fixed bug in overview page that caused the program to crash if the user clicked outside the area occupied by thumbnails - added 'timeout' PageProp to automatically advance to the next page - added EXPERIMENTAL support for sound via 'sound' PageProp 0.6.3 [2005-09-07] - Some PDF files generated by pdflatex would not play because of negative object counts. Fixed. 0.6.2 [2006-09-06] - bugfix: filenames with spaces didn't work on Win32 0.6.1 [2005-09-05] - initial public release impressive-0.10.3+svn61/compile.py000066400000000000000000000011731214566325400167460ustar00rootroot00000000000000#!/usr/bin/env python PROJECT_NAME = "impressive" IN_FILE_NAME = PROJECT_NAME + "_dev.py" OUT_FILE_NAME = PROJECT_NAME + ".py" import re re_exec = re.compile('\s*execfile\s*\(\s*[\'"](.*?)[\'"]\s*,\s*globals\s*\(\s*\)\s*\)\s*$') out = open(OUT_FILE_NAME, "wb") was_include = False for line in open(IN_FILE_NAME, "r"): m = re_exec.match(line) if m: if was_include: out.write("\n\n") print m.group(1) out.write(open(m.group(1), "rb").read().replace("\r\n", "\n").strip("\n") + "\n") else: out.write(line.replace("\r\n", "\n")) was_include = not(not(m)) out.close() impressive-0.10.3+svn61/cursor.png000066400000000000000000000016621214566325400167720ustar00rootroot00000000000000‰PNG  IHDRéÁtÚ+tEXtCreation TimeMo 19 Mrz 2007 21:31:58 +01000jäJtIME×(šKuí pHYs  ÒÝ~ügAMA± üa IDATxÚ¥”]l QÇïÎÌÎvÖnmUµÕРMú‘V•UBRABDx”j¢¡‰´©¬!!¢ú„$EÐhmÑlµ¶x ’î§Ö®ÝÎLwwæŽsÇtMªe['ùÍìœ;÷¿ÿsÎÝ¥Ä[ÇÝ+œ ?w¼vÅѰkúŽm[j^oÞW¦åf-ÆÄ%ô=cAnñ†uË;/;ºrÆÙŠ)<χmó¢Îl-)YrãZ»ý ä¹ÙˆÉ/(šA©¶LÄÐ •——uäÎÍÓ÷ë÷nÍuÃŒœ‰"?‚e IJðˆ¢h”f³®ß¹½¦ë¤½nu²}$/aAÝËj‚”k0Pˆ¢ˆãRòW®(îh»x¸!™>þê™0 b 0ÇšŽX“ ªC†a¸‚Å9—¯··\--^dù›M.Õk«r–--ØCŒ,‡>ˆõrU gªXUUX›—›ñ¤»g04­3¯×ï%ÎTw †©Zgž«:3ŨŸSS-•5ÕeÝgOÕožªjâÑã—Ã0œÄ¥¥çª“aY6£¨0ÿ^Û…ÆæÉ}TËôûGŒõu»š£‘%Ϥ_ŒÑ„d9Žâ1Q_n„ÕÂm¬ÝT^jæR:ú]C"ÒY•`¢£äxèÝÙÒ² SÕ—K¾HÆ …ù±XL.­,/h…ýê`˜ ±h4ÄXʧ0­ Jêñèw ‡GÄç÷xã^ߨàEQxØç€,`hBLEŽVE ˜R_t:‚šìNY–}ðNàuD€0àH™Ê„ŽÆâ#d’2”JÊzïú4v°©¥„ÞÀºCÛDDƵÍ1¸v—bðc÷uDp»½Ñý Çúx^pÂÚCÀ©9Á“'¡ß΢1q‰Rã¡>ÿ·w {h:?Ή¡°GŠÇäVûù¾?÷CêЫõêŸB‰sF¢¢¼h~¯s½uûÁWxì:ŸVZR¡ÿ¯ÊÖf ø¢57éЋ‘l@ÒEg"4•°Q_úLã'ÇezÈ ôðIEND®B`‚impressive-0.10.3+svn61/demo.tex000066400000000000000000000167131214566325400164200ustar00rootroot00000000000000\documentclass[bigger,hyperref={colorlinks=true,linkcolor=white,urlcolor=blue}]{beamer} \usepackage[latin1]{inputenc} \usepackage[english]{babel} \usepackage{helvet,listings} \usepackage{pgfpages} \title{Introducing Impressive} \author{Martin J. Fiedler} %\institute{Dream Chip Technologies GmbH} \date{version 0.10.2 and up} \subject{Impressive} \titlegraphic{\href{http://impressive.sourceforge.net/}{http://impressive.sourceforge.net/}} \usetheme{Warsaw} \setbeamertemplate{navigation symbols}{} %\setbeameroption{show notes on second screen=right} \begin{document} \maketitle \section{Overview} \subsection{What is Impressive?} \begin{frame}{What is Impressive?} \large \textbf{Impressive is a PDF and image viewer optimized for presentations} \normalsize \begin{itemize} \item ... with some eye candy ;) \item uses OpenGL for display \item uses Xpdf or GhostScript to render PDF files \item written in Python \item available for Unix-like and Windows operating systems \item Open Source (GPLv2) \end{itemize} \end{frame} \subsection{Software Requirements} \begin{frame}{Software Requirements} Impressive requires a few libraries and helper applications: \begin{itemize} \item Python 2.3 or newer \item PyGame (SDL port for Python) \item PyOpenGL \item Python Imaging Library (PIL) \item Xpdf or GhostScript \item pdftk \emph{(optional, but recommended)} \end{itemize} Packages for these dependencies should be available for almost every operating system. \\ For Windows, there's a convenient self-contained archive with everything needed. \end{frame} \subsection{Hardware Requirements} \begin{frame}{Hardware Requirements} \begin{itemize} \item hardware accelerated OpenGL \begin{itemize} \item every post-2000 graphics chip should do \item Linux/BSD users need a driver that actually implements hardware acceleration! \end{itemize} \item a fast CPU \begin{itemize} \item some transitions are quite CPU-intensive \item rule of thumb: the faster the better! \item absolute minimum is at about 700 MHz \end{itemize} \end{itemize} \end{frame} \subsection{How does it work?} \begin{frame}{How does it work?} \begin{enumerate} \item create slides with the presentation software of your choice \item export them to a PDF file \item \texttt{impressive MySlides.pdf} \begin{itemize} \item left mouse button, [PageDown] or [Space]: \\ next slide \item right mouse button, [PageUp] or [Backspace]: \\ previous slide \item {}[Q] or [Esc]: quit \end{itemize} \end{enumerate} \end{frame} \section{Features} \subsection{Emphasis} \begin{frame}{Emphasis} Impressive offers multiple ways of emphasizing parts of a page. \vspace{0.5cm} \\ \textbf{Option 1:} {\glqq}Spotlight{\grqq} \begin{itemize} \item toggle with [Enter] \item a bright circular spot follows the mouse cursor \item everything else gets dark and blurry \item spot size adjustable with [+]/[-] or the mouse wheel \end{itemize} \end{frame} \begin{frame}{Highlight Boxes and Zoom} \textbf{Option 2:} Highlight Boxes \begin{itemize} \item drag a box with the left mouse button \item any number of boxes per page \item delete a box by clicking it with the right mouse button \item boxes stay even after leaving and re-entering the page \end{itemize} \textbf{Option 3:} Zoom \begin{itemize} \item {}[Z] key toggles 2x zoom \item visible image can be moved around with the right mouse button \end{itemize} \end{frame} \subsection{Overview Page} \begin{frame}{Overview Page} \begin{itemize} \item press the [Tab] key \item Impressive zooms back to an overview screen showing all pages of the presentation \item new page can be selected with mouse or keyboard \item left mouse button or [Enter] zooms into selected page \item right mouse button or [Tab] cancels and returns to the previously shown page \end{itemize} \end{frame} \subsection{Customization} \begin{frame}{Customization} \begin{itemize} \item command line parameters (lots of them!) \item {\glqq}Info Scripts{\grqq} \begin{itemize} \item same name as the input file, but suffix \texttt{.info}, e.g. \\ \texttt{slides.pdf} $\rightarrow$ \texttt{slides.pdf.info} \item real Python scripts, executed before the presentation starts \item can be used to set the document title or other settings \item can be used to set up per-page settings: {\glqq}Page Properties{\grqq} \begin{itemize} \item title \item transition effect \item ... \end{itemize} \end{itemize} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Info Script Example} \begin{verbatim} # -*- coding: iso8859-1 -*- DocumentTitle = "Example Presentation" PageProps = { 1: { 'title': 'Title Page', 'transition': PagePeel }, 2: { 'title': 'Introduction' }, 5: { 'timeout': 3500 }, 8: { 'overview': False } } \end{verbatim} \end{frame} \subsection{Other Features} \begin{frame}{Other Features} \begin{itemize} \item support for PDF hyperlinks inside the document \item page cache in RAM or on disk, temporary (default) or persistent \item background rendering \item fade to black or white \item hide specific pages from the overview page \item page bookmarks (keyboard shortcuts) \item only show a subset of the presentation \item rotation in 90-degree steps \item time display and measurement \end{itemize} \end{frame} \begin{frame}{Rarely Used Features} \begin{itemize} \item automatic, timed presentations \item customization of almost every timing or OSD parameter \item automatic reloading of the input file(s) on change \item permanent storage of the highlight boxes \item playing sounds or videos or executing arbitrary Python code when entering a page \item {\glqq}Render Mode{\grqq}: doesn't show the presentation, but renders the input PDF file into a directory with one PNG file per page \end{itemize} \end{frame} \section{Future} \subsection{Missing Features} \begin{frame}{Missing Features} \begin{itemize} \item painting and annotations \item multi-monitor support \item support for embedded videos \item integration into (or cooperation with) latex-beamer and OpenOffice.org Impress \item \alert{\emph{your feature here}} \end{itemize} \end{frame} \subsection{Get in touch} \begin{frame}{Get in touch} \begin{center} \textbf{Questions, Suggestions, Comments?} \\ just write to \\ \href{mailto:martin.fiedler@gmx.net}{martin.fiedler@gmx.net} \vspace{1.5cm} \\ \textbf{Try Impressive!} \\ packages are available at \\ \href{http://impressive.sourceforge.net/}{http://impressive.sourceforge.net/} \end{center} \end{frame} \end{document} impressive-0.10.3+svn61/html2man.py000066400000000000000000000146571214566325400170530ustar00rootroot00000000000000#!/usr/bin/env python import sys, re, optparse, os, HTMLParser __version__ = "0.1" DEBUG = False REPLACEMENTS = ( ('\n', " "), ('\t', " "), ('\r', ""), ("\\", "\\\\"), ('/', "/\\:"), ('-', "\\-"), ) ENTITIES = { "laquo": '"', "raquo": '"', "ldquo": '"', "rdquo": '"', "quot": '"', "amp": '&', "ndash": '-', "mdash": '--', "gt": '>', "lt": '<', "times": 'x', "eacute": 'e', "nbsp": ' ', } class Converter(HTMLParser.HTMLParser): def __init__(self, outfile): HTMLParser.HTMLParser.__init__(self) self.f = outfile self.f.write(".\\\" generated by KeyJ's html2man.py version %s\n" % __version__) self.stack = [] self.enabled = False self.data = "" self.start = True self.listspace = True def flush(self): if not self.data: return self.f.write(self.data + "\n") self.data = "" def newblock(self, cmd=None, prefix=None): self.flush() if cmd: self.f.write(cmd + "\n") self.start = True if prefix: self.data = prefix + " " self.start = False def endheading(self, index=None, indent=0): if not self.data: return heading = self.data.strip().upper() self.data = "" self.start = True self.f.write(".SH \"%s%s\"\n" % (indent * ' ', heading)) if index: self.f.write(".IX %s \"%s\"\n" % (index, heading)) def handle_starttag(self, tag, attrs): if DEBUG: print "starttag:", tag, attrs tag = tag.lower() self.stack.append(tag) if not self.enabled: return if tag in ("b", "strong", "code"): self.data += "\\fB" if tag in ("i", "em"): self.data += "\\fI" if tag == "dt": self.newblock(cmd=".br") if tag == "dd": self.newblock(cmd=".RS") if tag == "pre": self.newblock(cmd=".nf") if tag in ("h2", "h3"): self.newblock() def handle_startendtag(self, tag, attrs): if DEBUG: print "startendtag:", tag, attrs if not self.enabled: return tag = tag.lower() if tag == "br": self.newblock(cmd=".br") def handle_endtag(self, tag): if DEBUG: print "endtag:", tag tag = tag.lower() if not(self.stack) or (self.stack[-1] != tag): raise HTMLParser.HTMLParseError("start/end tag mismatch") del self.stack[-1] if not self.enabled: return if tag == "p": self.newblock(cmd=".PP") if tag in ("b", "strong", "code", "i", "em"): self.data += "\\fR" if tag == "dd": self.newblock(cmd=".RE") if self.listspace and not("dd" in self.stack): self.f.write(".PP\n") if tag == "pre": self.newblock(cmd=".fi") if tag == "h2": self.endheading("Header") if tag == "h3": self.endheading("Subsection", 4) def handle_data(self, data): if DEBUG: print "data:", repr(data) if not self.enabled: return if self.stack: tag = self.stack[-1] else: tag = None if tag == "pre": lines = data.replace("\r", "").rstrip().split("\n") self.f.write(".ne %d\n" % len(lines)) for l in lines: self.f.write("\\& %s\n" % l.replace('\\', '\\\\')) self.f.write(".\n") self.data = "" else: for old, new in REPLACEMENTS: data = data.replace(old, new) if not(self.data) and self.start: data = data.lstrip() self.data += data def handle_charref(self, name): if DEBUG: print "charref:", name def handle_entityref(self, name): if DEBUG: print "entityref:", name if not self.enabled: return self.data += ENTITIES.get(name, "") def handle_comment(self, data): if DEBUG: print "comment:", repr(data) data = data.strip() if data[:3].lower() != "man": return commands = data.split()[0] for x in commands.lower().split(':'): x = x.split('=', 1) if len(x) == 1: cmd = x[0] arg = None else: cmd, arg = x arg = arg.replace('~', ' ') if arg.startswith('"') and arg.endswith('"'): arg = arg[1:-1] if cmd == "on": self.enabled = True elif cmd == "off": self.flush() self.enabled = False elif cmd == "nolistspace": self.listspace = False elif cmd == "listspace": self.listspace = True elif cmd == "head": self.data = arg self.endheading("Header") elif cmd == "subhead": self.data = arg self.endheading("Subsection", 4) elif cmd != "man": print >>sys.stderr, "unknown command `%s'" % cmd data = data[len(commands):].lstrip().replace("\r\n", "\n") if data: if self.data: self.data += data else: self.f.write(data + "\n") def handle_decl(self, decl): if DEBUG: print "decl:", decl def handle_pi(self, data): if DEBUG: print "PI:", data if __name__ == "__main__": parser = optparse.OptionParser(usage="%prog [OPTIONS...] ", version=__version__) parser.add_option("-O", "--output", dest="OutputFile", metavar="FILE", type="string", default=None, help="write document(s) to FILE instead of .1") options, args = parser.parse_args() globals().update(options.__dict__) if not args: parser.error("no input file specified") if len(args) > 1: parser.error("invalid number of arguments") InputFile = args[0] if not OutputFile: OutputFile = os.path.splitext(InputFile)[0] + ".1" try: InputFile = open(InputFile, "r") except IOError: parser.error("cannot open input file") try: OutputFile = open(OutputFile, "w") except IOError: parser.error("cannot open output file") c = Converter(OutputFile) c.feed(InputFile.read()) c.close() InputFile.close() OutputFile.close() impressive-0.10.3+svn61/impressive-de.pdf.info000066400000000000000000000016521214566325400211470ustar00rootroot00000000000000# -*- coding: iso8859-1 -*- DocumentTitle = "Präsentationen mit KeyJnote" AvailableTransitions.remove(PagePeel) PageProps = { 1: { 'title': "Titelseite", 'transition': PagePeel }, 2: { 'title': "Präsentationen erstellen" }, 3: { 'title': "Einschränkungen herkömmlicher Tools", 'transition': PagePeel }, 4: { 'title': "Was ist KeyJnote?" }, 5: { 'title': "Software-Anforderungen" }, 6: { 'title': "Hardware-Anforderungen" }, 7: { 'title': "Wie funktioniert's?", 'transition': PagePeel }, 8: { 'title': "Hervorhebungen" }, 9: { 'title': "Hervorhebungsrahmen und Zoom" }, 10: { 'title': "Übersichtsseite" }, 11: { 'title': "Customization" }, 12: { 'title': "Beispiel für ein Info Script", 'transition': PagePeel }, 13: { 'title': "Sonstige Features" }, 14: { 'title': "Exotische Features" }, 15: { 'title': "Fehlende Features", 'transition': PagePeel }, 16: { 'title': "Kontakt" }, } impressive-0.10.3+svn61/impressive-de.tex000066400000000000000000000240021214566325400202360ustar00rootroot00000000000000\documentclass[bigger,hyperref={colorlinks=true,linkcolor=white,urlcolor=blue}]{beamer} \usepackage[latin1]{inputenc} \usepackage[ngerman]{babel} \usepackage{helvet,listings} \title{Präsentationen mit Impressive} \author{Martin J. Fiedler} \institute{Silicon Image Germany} \date{Chemnitzer Linux-Tage 2007} \subject{Impressive} \titlegraphic{\href{http://impressive.sourceforge.net/}{http://impressive.sourceforge.net/}} \usetheme{Warsaw} \setbeamertemplate{navigation symbols}{} \begin{document} \maketitle \section{Motivation} \subsection{Präsentationen erstellen} \begin{frame}{Präsentationen erstellen} Das Erstellen und Anzeigen von Präsentationen ist unter Linux längst kein Problem mehr. \begin{itemize} \item mit LaTeX: \begin{itemize} \item foiltex \item Prosper \item latex-beamer \end{itemize} \item mit der Maus: \begin{itemize} \item OpenOffice.org Impress \item KPresenter \end{itemize} \item im Browser: \begin{itemize} \item \texttt{@media projection} / Opera Show \item S5 \end{itemize} \end{itemize} \end{frame} \subsection{Einschränkungen herkömmlicher Tools} \begin{frame}{Einschränkungen herkömmlicher Tools} \begin{itemize} \item Präsentationen sehen recht bieder aus \begin{itemize} \item entweder gar keine Seitenübergänge ... \item ... oder ziemlich hässliche, wie in Powerpoint oder Acrobat Reader \end{itemize} \item fehlende Features \begin{itemize} \item Sprung zurück zu bestimmter älterer Folie aufwändig oder unschön \begin{itemize} \item wildes Hin- und Herspringen \item Verlassen des Vollbildmodus \end{itemize} \item keine Tools, um die Aufmerksamkeit des Publikums auf bestimmte Teile der Folie zu richten \end{itemize} \end{itemize} \end{frame} \section{Impressive-Übersicht} \subsection{Was ist Impressive?} \begin{frame}{Was ist Impressive?} \large \textbf{Impressive ist ein auf Präsentationen zugeschnittener PDF- und Bildbetrachter.} \normalsize \begin{itemize} \item ... mit ein bisschen "`Eye Candy"' ;) \item verwendet OpenGL zur Darstellung \item verwendet GhostScript zum Rendern der PDFs \item in Python geschrieben \item verfügbar für Linux und andere Unixoide sowie Windows \item Open Source, unter GPL lizenziert \end{itemize} \end{frame} \subsection{Software-Anforderungen} \begin{frame}{Software-Anforderungen} Impressive benötigt einige Bibliotheken und Hilfsprogramme: \begin{itemize} \item Python ab 2.3 \item PyGame (SDL-Port für Python) \item PyOpenGL \item Python Imaging Library (PIL) \item GhostScript \item pdftk \emph{(optional)} \end{itemize} Pakete für diese Abhängigkeiten sollten in jeder Linux-Distribution verfügbar sein. \\ Für Debian und Gentoo existieren fertige, aber leicht veraltete Impressive-Pakete. \end{frame} \subsection{Hardware-Anforderungen} \begin{frame}{Hardware-Anforderungen} \begin{itemize} \item OpenGL-Hardwarebeschleunigung \begin{itemize} \item nVidia ab GeForce 2 MX (\texttt{nvidia}) \item ATI ab Radeon 7000 (\texttt{ati} oder \texttt{fglrx}) \item Intel ab GMA 900 (\texttt{i915}) \end{itemize} \item schnelle CPU \begin{itemize} \item einige Überblendungen sind ziemlich rechenaufwändig \item Faustregel: je schneller, desto besser! \item absolutes Minimum ca. 500 MHz \end{itemize} \end{itemize} \end{frame} \subsection{Wie funktioniert's?} \begin{frame}{Wie funktioniert's?} \begin{enumerate} \item Folien erstellen \item Folien als PDF exportieren \item \texttt{impressive MeineFolien.pdf} \begin{itemize} \item linke Maustaste, [BildAb] oder [Space]: \\ eine Folie weiter \item rechte Maustaste, [BildAuf] oder [Rück]: \\ eine Folie zurück \item {}[Q] oder [Esc]: Beenden \end{itemize} \end{enumerate} \end{frame} \section{Features} \subsection{Hervorhebungen} \begin{frame}{Hervorhebungen} Impressive bietet mehrere Möglichkeiten, Teile einer Seite hervorzuheben. \vspace{0.5cm} \\ \textbf{Möglichkeit 1:} "`Spotlight"' \begin{itemize} \item Ein-/Ausschalten mit [Enter] \item Rest der Seite wird dunkler und verschwimmt leicht \item kreisförmige Hervorhebung, folgt dem Mauscursor \item Größe mit [+] und [-] einstellbar \end{itemize} \end{frame} \begin{frame}{Hervorhebungsrahmen und Zoom} \textbf{Möglichkeit 2:} Rahmen \begin{itemize} \item Rahmen mit der linken Maustaste aufziehen \item pro Seite können beliebig viele Rahmen angelegt werden \item Löschen eines Rahmens durch Anklicken mit der rechten Maustaste \item Rahmen bleiben auch nach dem Verlassen der Seite bestehen \end{itemize} \textbf{Möglichkeit 3:} Zoom \begin{itemize} \item Taste [Z] aktiviert/deaktiviert 2x-Zoom \item Verschieben des Bildausschnitts mit gedrückter rechter Maustaste \end{itemize} \end{frame} \subsection{Übersichtsseite} \begin{frame}{Übersichtsseite} \begin{itemize} \item mit der Taste [Tab] zoomt man zurück auf eine Übersicht über alle Seiten der Präsentation \item Seite kann mit Maus oder Tastatur ausgewählt werden \item linke Maustaste oder [Enter] zoomt zur Zielseite \item rechte Maustaste oder [Tab] bricht die Auswahl ab und kehrt zur Ursprungsseite zurück \end{itemize} \end{frame} \subsection{Customization} \begin{frame}{Customization} \begin{itemize} \item Kommandozeilenparameter \item "`Info Scripts"' \begin{itemize} \item zusätzliches Suffix \texttt{.info}, z.B. \\ \texttt{folien.pdf} $\rightarrow$ \texttt{folien.pdf.info} \item echte Python-Scripte, werden vor dem Start der Präsentation ausgeführt \item Einstellen von Dokumenttitel oder verfügbaren Überblendeffekten, Implementieren neuer Effekte, ... \item Einstellen von seitenspezifischen Eigenschaften: "`Page Properties"' \begin{itemize} \item Titel \item Überblendeffekt \item ... \end{itemize} \end{itemize} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Beispiel für ein Info Script} \begin{verbatim} # -*- coding: iso8859-1 -*- DocumentTitle = "Beispielpräsentation" AvailableTransitions.remove(PagePeel) PageProps = { 1: { 'title': 'Titelseite', 'transition': PagePeel }, 2: { 'title': 'Einführung' }, 5: { 'timeout': 3500 }, 8: { 'overview': False } } \end{verbatim} \end{frame} \subsection{Sonstige Features} \begin{frame}{Sonstige Features} \begin{itemize} \item anstatt einer PDF-Datei kann auch ein Verzeichnis mit Bilddateien (JPEG, PNG) als Eingabe verwendet werden \item Seitencache im RAM oder auf Festplatte \item Background-Rendering \item Abblenden nach Weiß oder Schwarz \item Ausblenden einzelner Seiten von der Übersichtsseite oder aus der normalen Rotation \item Einschränkung auf einen Teil der Seiten \item Drehen der Präsentation in 90-Grad-Schritten \item Zeitanzeige und -Messung \end{itemize} \end{frame} \begin{frame}{Exotische Features} \begin{itemize} \item selbstablaufende Präsentationen \item nahezu alle Timing-Parameter einstellbar \item periodisches Überprüfen der Eingabedatei und automatisches Neuladen \item permanentes Speichern der Hervorhebungsrahmen \item Abspielen eines Sounds beim Betreten einer Seite \item "`Render Mode"': zeigt die Präsentation nicht an, sondern rendert das Eingabe-PDF in ein Verzeichnis als eine PDF-Datei pro Seite \end{itemize} \end{frame} \section{Ausblick} \subsection{Fehlende Features} \begin{frame}{Fehlende Features} \begin{itemize} \item Unterstützung von Hyperlinks innerhalb des Dokuments \begin{itemize} \item latex-beamer verwendet sie zur Navigation: \\ \insertslidenavigationsymbol \insertframenavigationsymbol \insertsubsectionnavigationsymbol \insertsectionnavigationsymbol \insertdocnavigationsymbol \insertbackfindforwardnavigationsymbol \item Problem: keine praktikable Möglichkeit, die Hyperlinks zu extrahieren \end{itemize} \item "`Malen"' im Dokument, Hinzufügen von Notizen \item Unterstützung mehrerer Monitore \item Unterstützung von Videos auf der Seite \item bessere Integration oder Kooperation mit latex-beamer \item \alert{\emph{Hier könnte Ihr Wunschfeature stehen!}} \end{itemize} \end{frame} \subsection{Kontakt} \begin{frame}{Kontakt} \begin{center} \textbf{Fragen? Wünsche? Kommentare?} \\ Bitte jetzt stellen oder an \\ \href{mailto:martin.fiedler@gmx.net}{martin.fiedler@gmx.net} \\ schicken. \vspace{0.5cm} \\ Ansonsten: \\ \textbf{Impressive ausprobieren!} \\ Pakete gibt es auf \\ \href{http://impressive.sourceforge.net/}{http://impressive.sourceforge.net/} \vspace{0.5cm} \\ \textbf{Vielen Dank für Ihr Interesse!} \end{center} \end{frame} \end{document} impressive-0.10.3+svn61/impressive_dev.py000077500000000000000000000042421214566325400203450ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: iso-8859-1 -*- # # Impressive, a fancy presentation tool # Copyright (C) 2005-2010 Martin J. Fiedler # portions Copyright (C) 2005 Rob Reid # portions Copyright (C) 2006 Ronan Le Hy # portions Copyright (C) 2007 Luke Campagnola # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License, version 2, as # published by the Free Software Foundation. # # 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 __title__ = "Impressive" __version__ = "0.10.4-WIP" __author__ = "Martin J. Fiedler" __email__ = "martin.fiedler@gmx.net" __website__ = "http://impressive.sourceforge.net/" import sys def greet(): print >>sys.stderr, "Welcome to", __title__, "version", __version__ if __name__ == "__main__": greet() execfile("src/defaults.py", globals()) execfile("src/init.py", globals()) execfile("src/globals.py", globals()) execfile("src/tools.py", globals()) execfile("src/gltools.py", globals()) execfile("src/transitions.py", globals()) execfile("src/osdfont.py", globals()) execfile("src/pdfparse.py", globals()) execfile("src/cache.py", globals()) execfile("src/render.py", globals()) execfile("src/scriptwriter.py", globals()) execfile("src/gldraw.py", globals()) execfile("src/control.py", globals()) execfile("src/overview.py", globals()) execfile("src/event.py", globals()) execfile('src/filelist.py', globals()) execfile('src/main.py', globals()) execfile("src/options.py", globals()) # use this function if you intend to use Impressive as a library def run(): try: run_main() except SystemExit, e: return e.code if __name__=="__main__": ParseOptions(sys.argv[1:]) run_main() impressive-0.10.3+svn61/license.txt000066400000000000000000000436541214566325400171410ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. impressive-0.10.3+svn61/makedist.bat000066400000000000000000000007011214566325400172310ustar00rootroot00000000000000@echo off set PY=C:\Programme\Dev\Python25\Lib rm -rfv dist python deploy.py py2exe --excludes=OpenGL if errorlevel 1 goto end rem cp -a gs dist cp -a OpenGL dist rm -rf build cp license.txt dist cp changelog.txt dist cp site/impressive.html dist cp demo.pdf dist cp msvcr71.dll dist cp *.exe dist rm -f Impressive.zip cd dist rm -rf tcl tcl*.dll tk*.dll zip -rv9 ..\Impressive * cd .. du -hs dist Impressive.zip :endimpressive-0.10.3+svn61/makerelease.sh000077500000000000000000000006561214566325400175660ustar00rootroot00000000000000#!/bin/bash make all base=_releases dir=Impressive exe=impressive.py hlp=site/impressive.html ver=$(grep __version__ $exe | head -n 1 | cut -d'"' -f2) dir=$dir-$ver mkdir -p $base/$dir chmod -x demo.pdf cp demo.pdf $base/$dir for file in $exe $hlp license.txt changelog.txt impressive.1 ; do tr -d '\r' <$file >$base/$dir/$(basename $file) done chmod +x $base/$dir/$exe cd $base rm -f $dir.tar.gz tar czvf $dir.tar.gz $dir/ impressive-0.10.3+svn61/site/000077500000000000000000000000001214566325400157065ustar00rootroot00000000000000impressive-0.10.3+svn61/site/faq.php000066400000000000000000000120731214566325400171710ustar00rootroot00000000000000

Frequently Asked Questions

Why are some symbols rendered incorrectly on some systems?

You're most likely using the GhostScript rendering backend if you encounter this. First of all, try to use Xpdf-based rendering, as this solves a lot of problems. If you're stuck with GhostScript for some reason, note that some versions prior to 8.15 seem to have some serious rendering bugs (like drawing hyphens at the wrong location in some pdfTeX genereted files) or even crashes. To solve this, you should upgrade to a newer GhostScript version. If you can't or don't want to do that, you can also try to find a machine with a decent Xpdf or GhostScript installation an render the PDF into images there using Impressive's -o option.
The Windows version of Impressive already ships with Xpdf 3.02, so you will likely not get any of these problems there.

Impressive shows annoying white stripes in gradients. How can I get rid of them?

This is a common problem with a whole bunch of PDF viewers and results from the way gradients are stored in PDF files: They aren't. In PDF versions prior to 1.5 (I guess), gradients have to be »simulated« using a series of rectangular »strips« whose colors are interpolated from the gradient start color to the gradient end color. Almost every application produces PDFs that way.

The problem arises if the PDF display application tries to apply fancy anti-aliasing to smooth the edges of text and lines. Usually, this is done by an algorithm called »multisampling« that smooths the edges of each object individually. So, if one of the gradient strips ends in the middle of a pixel, the antialiasing would blend that pixel towards white (the page background color). But then, the next strip is rendered, and it (of course) starts in the middle of the very same pixel. So, the renderer blends the strip's color with the color that is already in the buffer — the one that has already been blended with white! All in all, this worst case scenario results in a stripe that is 25 percent white, which is easily visible and, unfortunately, quite annoying.

There are three possible solutions to this problem: First, don't use gradients at all. (Yes, I am serious.) Second, if you absolutely have to use gradients, try another PDF-producing application to generate the slides. Or third, use the Impressive command line switch »–s« to disable multisampling (GhostScript only) and use supersampling instead. This method simply renders the page un-antialiased, but with double resolution. Afterwards, it scales the resulting oversized image down to screen resolution again. This effectively eliminates the annoying stripes, but degrades overall antialiasing quality a bit, because Xpdf's and GhostScript's 16x multisampling is much more precise than Impressive's simple 4x supersampling. Moreover, it is much slower and uses four times as much memory. So use it with care.

In some PDF files, all text has jagged edges, like antialiasing is absent. How do I force antialiasing?

This is most probably a problem with the rendering backend. I don't have a real solution for that other than trying the alternative renderer (Xpdf if you used GhostScript, or vice-versa). In general, this kind of problems seems to be much more common with GhostScript than it is with Xpdf.
If changing the backend doesn't help either, you may try the aforementioned »–s« option as a last resort.

I get a lot of font-related warnings. Is anything wrong?

On Windows, Xpdf seems to print the following two messages for every page rendered:
Error: No display font for 'Symbol' Error: No display font for 'ZapfDingbats'
As far as I see, there's no problem with that, so you can safely ignore these errors. If there are really missing characters or something like that, you may try GhostScript-based rendering instead. To check if it helps, install GhostScript on your system and use the -P switch to point to the installed gswin32c.exe (Windows) or gs (Unix) executable.

I have a multi-monitor setup and Impressive behaves strangely. What can I do?

Unfortunately PyGame, the windowing API currently used by Impressive, does not contain any support for multi-monitor setups whatsoever. This means that you can't really tell Impressive on with monitor it shall run. On Linux, you can try to run it in windowed mode, move the window to the proper monitor and enable fullscreen mode there, but it isn't guaranteed that this works either.

As a corollary to PyGame's inability to support multiple monitors or even multiple windows, it is also not possible to have a presenter screen like OpenOffice or Keynote.

impressive-0.10.3+svn61/site/hlbox.png000066400000000000000000000776021214566325400175440ustar00rootroot00000000000000‰PNG  IHDR@ðþO*<sRGB®Îé IDATxÚì}wœ\e½þésæLï}¶÷MvS!€‘›pi‚^!Ü¥¨H‘«àOPÁ½(Fª€p÷é"¨ „@únؾ³;»3;½·3sêï7&Û²)›çù+›™9çmÏûíï å+wõöFy^€€8íŸâ¤ÿÞ§S½ví– †!~úÅ»úúÂwÀ3Eqêc§BÜÿ@íºuå¾ðÂîÞÞPŧ}Ž(—ãK—ºþýß›].-ACCÑ—_îŒØ»¹¶aJÅY‡hÊSø±8—×M®©_8ÔçˆsûòAæw.Ï9¤ùúÌY‡úžsç×å2]~ùÊöö* CÇÇcþóûŸ~:Æqütó{Èëd¦ù…a¸©É±tiã™g¶ét*s9zëÖþO>éëígnÒs°ò¿`’Ëq…‚ Ea†AdY¡Xds¹Ò$6ž˜(•¸h4W(0¢aB’†!0<§ßbBQ„\Žã8‚¢îóÅ"—Ï—X–ÅcÚ)ŠË ™ EQ†aA8ŽÓÁ²ÜÜÛÃ\N$A’Š‚Þ‰ w¥›Ï—†v÷–ËAû1 Ca† Hކ£i¦P( Âa.*’$”J’$q0¿1‘¤RùÙ·E,­Óip:v»N§Sâ8Æó\*U~Üë G"é9nýG*•¼½½jÁ‚»Ýˆ¢ˆ(ŠCCƒƒþîîQšf§Ýd1‚4Ys³©¡ÁPWgÐëå2V) ÆïÏŒŒ$º»Cccɲ(–Ëñæfã’%»]¢°Ã¡Å0°÷Œ3ª—/wA41‘Ù²elh(zl8 Ã0A €Ní.ævW®lil´aæóÅþõ¯ÞÑÑpS“£¥ÅÑÒâ°Zµ$I`A°(Š Ãµµ¹ÆÆ¢ÃáݻGÇÇcÓ>‚ ’Ä[[]MMŽÆF›Õª§(Ç1Át·¶º&&âCCÁžžñ|¾4p´€ãh[[Us³³±ÑãA@|`À¿{÷H:]Åé·$L©”uvÚíí…‡+¶…Q!IL«•k42G†›˜È–·7¹œp¹4.—AÐTMYKÙ¾Ýw̆@&Ã,•BÃ0T*q±X¦¹Y51¬£ÃÙÒbio· ÀüJ  (B’¸F#·ZÕZ­\¥"wìO§ `‘çóL¡À ŒN§Ðé(«UÃó|4𠳬8E¨’ –öv{M†áîn?Ç ÉäòEá¶6{k«}Á‡Ý®ÃqdºéÀ5ÊjÕèõ”F#ß¶ÍgÒ1i/«¯7/\è\¸Ðívë …' E ’$ÔjÊlV¦}òÉH>_:lÃ0ÒÒb_¸ÐÝÑá¶Ûõ“Ú_îAà*i6«F%IÊx^ôùâS¼0@•3ÔÔX0 Å0ä“O†ÚÛÝ­­Î%KêŒF%‚TNÖ>u]¯Wj4 džSå°\Ž/^\×ÖæZ¸°Ú`8à!0 ËdˆL†k4”Ѩ’ˉX,´•cc156:ššœ Ö$Ãp:]èéïî …¦œ}nk3Ëdh[›… ÐtºT(°ÀŠÀqT©$ A`«ªt¥æS©b.Ç€9$Áq ÃàJÄãyðÊp8{,g—Këvë´Z AàL¦¤³ÙâL E‘–kk«uÉ—JE",b.WÊç÷Ém Cär\¥"qU«ÉE‹\@ݾ}Œ¦°È}¾¤Á 4•‹»är¢¡ÁœHb±|$’­¤Š"õõæúz“Ë¥CQt|<áñDûú‚Åâg²†áÆFK[›}Ù²°@AÌdèBaYN€U«T$A`*•¬³ÓM¨ ˆ[·zR©Â$ÒY,ªÖVûÒ¥Õ‡ÃA³YºP`††! Cår\­–cªR‘.Žããñ\OO€e¹Ã›MÓÜl?唫U‹ ˆ(‚ö—ÀK!Â0”$q•JNŠ"µµŽ‰\2™Ïf§Q%`†a†!‚««ÍE,YR§ÕRé4](”X–Q*I•JŽ 0‚ uu†ac±t:›´¡(ÒÖænksrJ=нEÊ狹 Zˆ¢EÉÔjÊbÑ-Z„„B)“It‡ù†ÝnhjrvtÔªÕ Ã,ËõöŽõ÷û†‡,;ƒ°êj^Orœ08OOLd2™" Ã:érikj´55z‚@!r8ÔN§fh(žÏ³¢(–JÜØX’çŠÂM&ÅâÅ—Kƒ¢H4šß¹Óï÷§y^(9Ÿ/=¯†a¨ N§¦©ÉÜÜlQ* †áGGã>_*—›Q'´Û5uu¦… €½¥;2óz“ãã •J™Ã¡­ªÒ74˜mÚÚl…憆B@Æò¼04Ñë)“IYSc´ZÕuu¦X,—ÉЕF‹Ã¡­­557[ ÏdèÁÁpoo0™,TJ‹EÕØhéìtÉÏ—<žØøxbb"žH8N (Ân׸Ýúº:³É¤Â0¤¥Å^,²ÉdaÏžñʽ€ P·ÛÐÔdµÛu†0 çñ„ÇÆããñD"_,2(ЍTr—KWUeli±Q”L.'êê,>_ÜçK&“ùÃp/æp蛚¬&“AŽã‡‡Ã££‘±±x"‘-9…U*Òfӹ݆–‡VK!âtªªŒýý\®8‹Y­–74Xõz%Ž#Ÿ~êóz£~,¦aÒén·±®ÎÚÐ`Åq †a—Ëèv›ƒ…S9û.—¡¾ÞÖÑQ ØËqüèhdt4ìõF£Ñ4ÇñJ%ér«ªÌÍÍ£QM’„R);PÔÏ 4ª­Í½paͦGQDÄÁÁ‰w··rZ§'°Å¢Ìf‹{öbO"“)qœ Š"A ££ÉHÄT,r--f‚@e2ÌjU*P‹AL$è\ŽaØéT76Á‹J%nx8Þßæ¸}Rz/Åátj fj A` ƒ)Jfµ*NmCƒÉbQ ‚ØßŽz½‰™v/¹œ¨ªÒ77›µZ9‚À…³g¿¯/<0N¥èR‰Eá¡hCƒ1Í-[V¥×SEÔ×›‚ÁL(”N& `d!u:J¯WètT])ÏE"Ù¡¡}Š´J%kh0·´Ø4JÄ¡¡Èà`xl,Q©V]mjj²Z,ER©Â®]ã¡ÁÁp&S^bE††Â.—.H/^쮪2à8ÚÐ`Çó~"H•i…Bf·ëìvŠÂÇwwû»»}}}D"¿_І‡[Zì Ã-ZTE’¸V+w¹ ÍD*•?Œ9R(›Mk±hQ¡¿?°{÷Xw÷X<žk†! CúûƒõõÖl–^¾¼Q­–Ëd˜Å¢-;öf&0YUeâ8nûvO_ßÄðp0¦WÇ'f8Žoiqà8&—6›N©$+Ÿ)—UUæ–ðî2 ×Õåííõõôø"‘4ð‚ `:4hjr$ÙSOmÐé”ðü;²ko¯jiq×ÕÙ€Çnb"ÞßïÛ³g$›-ÌÎ^¹œÀ8Nèé‰ôôD>ý4RáAK%.Ȱ,/—ãf³ÒbQ (¢Px…™,b±È‡j囊Eަ¹£%xNÍ™gÖ._^5‹–É0•J&“a ç…¡¡¨Ni“ᩯ7ÆbÙ;Æ PžIO¥ CC‘O? d2ô¾+ÄlVº\z¥’„ ÈçKx<Ñžž@±8 ]E¯7NQ„Å¢Öjåàf³Z©”1 Úƒ¢ˆB±ÏyÍ0\$’Íféi÷ò|¾86ïé™H§i C&&,+ÞcBÓL<žÍçK@Òë&¹iUq†aÃá4M3û[‹ô¢(NL$GFÂ}}¥;µ+±Xf|<šN» †ÁåÈóþ¶¡F£Úá0‚dzÃá®®±i†áûúüj5årª«-6 Þé4659;;kÔj9 à Ã~úéxoï˜Çä=„÷"b±¨2™RG‡Ãgú]I.ÇF¥NG¡(ÄqB$’ñzé4=“ºR(0ããñ@Àd·kP”P«åƒ’¢ðJñ˜ÉÐCC HëõŠº:s<žÏçƒAÑÒbÕé(žç#!¿?5I7¡(ÂhT J…ŠE6Êx<±™f¬fŸ/áó%Ìr9N’„Å¢¦(Y2Y8pÐöÑC£‘ËdD™Þ•à8ap0˜JåAP¡`05÷\ˆ÷ú\w÷¸ÏG¸Xd††ÂÓ2 ¼åPÝ4͆é‘‘pÙ}8¥#|"‘+•¸i i¹œ0™Ôz½ˆßP(52ŠF33Åfr¹âØXÔïÛl:/!¬Ó)[[Ý V›Í:AAðú{zÆŠEö #$—F£ ‡³©ÔŒ±DQ„xžŸCzÚüÂïOϾª€­V“2ÚØhR«e$‰£(28žÊa‚À@² Á…B)ÉE"Ù²><Ãê,„ÃÙl¶$—ã$‰JŠ"‰ÂL @‘v+•²¦&‹JEZScÀ0dx82<OÍÑ/¥’€ ¸P`‚Át*U˜ÝqP,ráp¨ 8Žèt”\Ž•—Ï Ùl‘e9G EM1Ÿ/ S©|©4Yªsœ$+güðP,²O¸ì³-Ù™º R‘6›ž$ñ¹GYiº ïš8s7“ï 0£QMQ2‚óùb8œ’7[v],– “Ù, Œ‚ùy¶µ¹[[ݵµVG!òùbýý»wd2ô\68‚ÀÍf5–HÐÅ";«ö‰âqfïŒ Å*8,V gA ÂfS¹\ºæf‹ÑHÙíyžO¥ @fÒ¼b¢V“2ÃÃð‘H¶P`foC©ÄW&ij4û~^  Hëõ “IU[kt:uE(•2ÇâñÜÐP´§g"“™Æ+N¨V+—Ép†X–W(p›M£Ñȧv¶Â{‡ J‹aˆB!Ãq¬Ì‡Bñû“ ¹œ lÑ¢*µZn·kÇÆbÑh6›¥iš-•ØrtçÈÙ[&íÔÃPGqÅ0Ç•JîtêmÀÇ6Ç'3 gg¿eÏ’#¡ÕR`„K%6Næó!I©ÄF"éB¡4‹†áæfWS“³½Ý-“á%ÙÞÞñîî‘h45ÇA`+–Dñ8ËØƒrØëÏRÌ€¢ððp´¶Ö˜JѧVm0(,Um­ÁïO%…I>6 C( É.,Ëg³¥Ré J#Ëò™L‘axQ„€ß¥2u´Œl¶88Öj)½ž2”z½,…ÁÁp(LO†q£(Ž£0 Ûlš¥K«ÛÚ3©Ï•Üp8t@õ•É0ÿlCÉdŠããñÞÞ€BAhµ Š"ÚÚìn·>v§R…D"g¢ÑL*UH§é|¾˜Ï§Í³=lP¡PÈ(J¦T’J%©ÑPj5©RɵZ9øÓ`Pt…9>PÄB$äÎBEQ„$e@б,—Nª£²,—Éäg²Žn·¹©ÉÑÑQ£T’0 ‹loïxoïøèhxîö ‚ %Ã@Ð:á1»"Àq"Ç1½½AôzÅâÅ2¹³ÙÔv»fh(JÓÜB& †A…€HÓ,Ïó³‚ ˆ4Í€Á ›3•Iøýiƒ!âvë@Ö±(B±X~l,><ž–$0 c"“}æ2µX4‡ê@QÃaEQÅ¡¡°B!±¥Åf±¨Aþ–ZM9ÚR‰+Yµç'&©`0gæH×+IN§ÎéÔ»ÝF«U£ÑP$‰ã8V–À8މ¢HÓ¬(‚K…ç–A8¼æ!"“¡`|渀T\Ž;úö£Á jksutԘ͚ý¦¯o`ÀßÓ3~Hû‚ÀaÂÉÁß9N³èõ&œNmm­ž$Ur9n±¨ ‚ä*caBÄçEQäyñ ‘jð50R 5mfª ©Ͳ<ÃpAßÔäÊÊ0Xe²Àa\0 #RÙ*–åwïK$rápª¦Æäpèt:…\N$NQE¢¨°ZµÕÕ\K‹#M{½q'ÜÓ3‘L»HH§SttT54Xêê,z½R.'0 ˆã8–åY–§éM³ÉdŽçŪ*£^¯˜{šÄa³·¼àÁÉó"Ïóí£( Çy Ô oo¯jmuWW[€76íïŸØ³g4—£‘Š0‚ ôùB¡ÀNLìóîì7Vѩ¼¼mÁ0„ ÐAu9„ßW0Ë@«T²š£VKQ” A`‚ ¥Ó©­ªÒ Gf¢qåóüþä¡*´Á`šaØI>!ŽFF¢¡Pz` d2©m6áÓë•Z­”’$.“á2®ÕÊívѨÔh¨?öÄbÙÃØÔÕjréÒš ÜmmNŠ" ÊçKÑh!¦³Y:•*¤Ó…T*ôvF~î¹Z-5ÿiNû˜ç÷±8Mš Ã0¨â<Š@Q¸¥ÅÕØèhmuAP<žéë¦oúÐ7 QÄÏy^Èåö«‚€â¤I³ªAEAP%;») 0¨>…öÕñúh¸¿ÿ §LF  d“zšÏ—òùR ’äg­–2•‹Æ`P N,ÕŽ7 Ù ½cÇè¤$Ĺ™µµ–ÆFÛ‚.¹œà8~d$22ñz£‘H:“¡†gYŽaö‰b§SØrþðT3–åx^ m$)Ã0”afS!Éé=‡êjkc££³³V¡Ã0\,2Ÿ~:ÞÓ3îõF#t'"˲Ÿ7‹¢(Ÿ-úiwPžhšaY CT*¹L†Î^Ç‹ã°iaâ8‘¦ÙióÌœNm}½©¥Å*“áù|)Nkµ Žr84uuÆX,·c‡wR€W–hšåyEQ…#‘ìøx¢2+nZ'ÖÜ}°@£N§ é4gp•É0’Ä5ÒfÓUWÛÚìv»ú:s(”‰ÌT}:”JÒn×ÕÕY@2\o¯¿«k|ï^,–ÑòýӶ΃S€A®ÕR$‰ÍîÓÆqL£QÈdøÑÂ&“¦¥ÅÙÙY«×«¡¯Ï70àïíõM,ÎѦ(˜ÏQQ* àoE¡Tâx~r¸e…L¦X*qEÈd¨É¤ ("“)Íî²7™@ž Äq|:MOtFÞØhimµiµËò{÷NLL¤ÕjÙ²eÕ¼¾ÞœH¢ÑŒÇ¤H3 —ËK%ž 0GÕj9A` sL.Ç  ¥C4ÍæóŸež¡(b0€â01Ÿgr¹Ï>ñR†a³Y:ÍŒ'B¡T>_:óLÜdRQ”ÌᘜE<Èå¸Ã¡U©ä0 '“9'²{·7ÎÌ” 8¥rs~Á0B*•/•X¥RF’¸Å¢U(ä©=ˆ"“af³æ IÚsvËËÚÚªÚÚªÜn3ê^ox``bÏž‘|þ0k°Y–K§óŸ7“$n±¨ A –Òéb±ÈO™N.ÍÓ4£ÓÉI’0›UF£"ÍÍ’Ë¡×SV«Z¥"Arb,–+p¢(ÚÐ`nl´¸\:GFâOtÛ¶±†³NGut8T*²¡ÁœHäc±\<~@’z©ÄE"9šf”J‚$q»]«V“ù|iÖA´·;ªªŒjµ¬XäO÷£(bQ6›¶Xd½ÞXw·/‘ÈO»J†óx¢J¥¬½Ýa0¨PQ*÷´iØ1 E‚ (21‘L$ft†!¬TÊ0 =fåò ÃÆb™B¡d0()Jf±hm6]8œšÅ1f0¨­VÈp9’‚Ÿb±¦ù!|ì©Kh]±±ÑÒÐ`¢(†áx¼ ¥3™É…¦'Äãù@ S,2¢(šÍªšCk«mÚB CššÌõõ&›M‹¢0Ãpáp&ÎVzŒt:ECƒ¹µÕ¦V“<Ï EÃÁ`F„d²0<éë år%ëëMõõf—K_©C‚³øt©ÄÁ0\]m¨¯7·´ØHrzýÈfÓ44˜›š,F£’¢d4Íd³Å²ÛID†áY–éGf³ººÚ8K> ZMÚíûÔfŽã³Yú0θãy±Xdö¢bf³z¦:ƒAÕÑánmu˜Lªr i¾‹æy^ˆÅ²I`hʺ:Û‚UZí4[Ž£à\Pºt„¯¶Xt--®ÎÎZ½^‰ 0Ï }}¾þþ‰¾>ÿž3Ų|<žÅ惽jµ ÇQŽ@^Á‘?ÓnWçr¥™ž¨©Ñ×Ö1 imµÒ4ÃÐà`$•ö­ˆa¨BAÔ×›M°)D£9¯7‰|vŠ Žcæ¦&38Ì㉌Ä£ µ¢(Ž%L&•Å¢jk³«Õr H'¹DbŸ"-Šb4šñzcn·¾ªJ¯PÈ:;]‚ Êd¸ÇÉdhPO‹¢ˆL†ÚíÚæfkG‡ÛfÓ"’ÉÐ>_2LWž›IÓ,Hü$ÌåÒ74XX– ¦ÓàQð²¦ÕRÍÍÖ–»Å¢F8ŸgT6[<ÔIc.‘(‹¬L†kµTU•©½=×Ó3‘ÍÒ@È€ãDl6mCƒ¥µÕÙÚê)„€½Z­R&æz+Ž"’ɼ×®­5+$Ž£ÍÍvš.Á0ÔÓã‹F³ >Ô!66Ú››U8~¤ì I¢¾ÞÚÖæv:(ŠB‹ehšI§ &“ÆhœÚÛƒœJå3™ÏÂc± vô6¹}U©ˆª*m±È¦R4Ï‹ÿ¦” IDATÀœOœ•½ªÓO¯>åç,[XÜjµœ$ÂÐPÌ㉃ӜAM3cc‰ˆ^¯Ðë)…‚XºÔ­ÓQv»z|<•LæR«eN§ÖíÖ76šÁ©ù<ãñD=žh¹:†áêj}]©±ÑLh2YŽöös¹Ry”K%nh(b0(Ìf•Õªv:u±X.ÍíÞýYæM.Wòz£f³ œt¥×+–/¯1›UÕÕŸ/‘Hä8NÉp«UårêêLN'8(G홹Íç‹>_"ͪÕr’Ä—.­6UUzŸ/‹eAƲ\Ž*§SçvjkM2A¢ßŸðûétáP·Ýb‘ ©Txà::Ü8Žj¿?žÍÒ)•r›MëtêkjL6›.Ÿ/‰¢@’8‚ Z-U[k5†^oì°ô9¨íõF&“Æ`P¾hQF£°Zu^o$Ë‚9Üncuµ¹©ÉIQD4š6TGâˆV*I‹Eër™Êá(“IÍó‚ɤ®ðPÎu¨S©|W—g÷î‘DbßtÓt ;Zì¥i–ãx…ÕjrùrwK‹™ç…@ »e‹wpðˆN¥DÄíÖÎAiß7Î,Ë D#Ÿ~,N…ߟ2bJ¥léR—R)£(¢­ÍêvëòyH3 ƒ)ŠP©H CÁ)y==ÁÈèh¢ìî2õõ¦¶6›JEò¼8<Š“½¯±XÖ㉚LJ†¤(YCƒ)‘ÈG£Y¯7 %Š××é” ±xq•R)S*ɶ6{U•´g¿ÆT*’$qpŠâÐPdh(Üßœtð M³‰ÁÁѨÔër9ÑÜls:õàL,Ð6Eå@•‹†††Â‡C‚ h¨9l2© ™B!ë訪­5 ûòO÷Ÿ†EÊd¸× ‡Ó Y]m==í´†¦&ëðpøƒúƒ‡WÏxP‰ÁÁ€RIžzjƒJ%'´±Ñn·ë;:ªA]†¡E¨ÕŽ£ýýàœ§Óx$Š´R)¯4—±ZµV«ö0•Häüþ䟙xGi{ã&&2uu£ƒaH­&U*¨—Û¶ùóç’pÇóÃðÙlqd$îñÄvïžH$èY<|Ÿ/®Õ*l¶£f Î}1Ïä½§ü@à¹øÁ&&2r9a°ß?ý u™LÑçKõô„ÛÛ- ‰ã(Á‚ ÌRzPøýi¹|_òÓÁVÄóð-ûý鉉ôØX<—cúêb‘ݵ˗Ï3™L©®Îh³©@UŠÂ ý'€ ûÑÑøðp´§'˜Ï—öç`…ㆡ©|žKôõ§-„ ¨P`††" Åq¼Z-(ŸËËæk¡À‚c}ÒéB]Én×P”Œ À1ݰ ˆàf†d²0:‰îÝ;NêÇ ]]>Žã ¦¾Þbµª)ŠÀñ}—<€ÔnŽãK%.•ÊÇGF¢½½@ qØ~Ñb‘ݽ{ ‚`šf­:µÿÜfˆç…R‰K&ó££áááÈÞ½ã±X–ç¹€\NhµrEy^˜šþåóÅAá×øxl.é¥ý~±ÈîÜé)KÙ,ÝÐ`³Ùô`Æ ‘eù|¾èõ†ƒ»vyDQ‰`‚a˜ß;¼ƒïc±Œ×ÖhrGîÙM&³Éääé†ëë¿?ÝÉoŒ£Ã¡ÚŸML¤§ý>A`Íͦš½Ë¥Q«e—JœßŸþä“ñññÇ ‡zwŽÓ©/-³t[_Eà}-˜|ž™õ2$qêŽh0(\.Õª±Û5:\.Ça.•¸TŠ…2Á`fb"OºbB„aØlVÉå8˜š\ŽI$òG@M“A¥×+€9 8§§ŠkЧSg³iìv Ћ8“¡Ãál0˜òûSÁ`ê@]Wœ. ›Í*‡Co³il6V«¤( °¥Xd3:ɆB©P( ¦ …ÒÌ[Þ\ïF’Éðª*£Ëep¹ &“R¡ a¢i&Éø| ¿?6>D•Ëñ… Ý V§ÓH’8°Q·l˜˜øì¸?—ËP^>_¼‚“Óg§¹\FP% AÏ7çEEÌf­Ëet: v»^§£ù9~Ìç‹z<Áx¤|¾tà}H"pƒËå2…YV(™x)W-"‘D‚„“%H,A‚‰À$H,A‚D` $H– A‚D` $H– A"° $K A"° %Hp2S©¦=áˆÊ §ÿÆœŠ=棜ððqd%2ð±}5|(cr$ó;Kƒçµ\:¤¾Ìùû‡¹~æ§œð›57—wUÍGùÕ‰PÒ!Å£Dþc9&'÷<ÎOâI3&˜V í….A‚„c¥BËd2i$H8Y L’¤4 $œ¬–ËåÒ(H X‚ ’ -A‚IK I` $HX‚ ’– A‚D` >G&B NVöuÃ$H8îØ+A‚D` $H– A‚D` $K A"° $K A"° %H X‚ %H,A‚‰À$H,A‚‰À$H– A‚D` $H– A‚D` $K A"° $K X‚ %H X‚ %H,A‚‰À$H,A‚‰À$œìÀŽñû‚.4•ð¹G±Xü|‚ µZ-qXÂç™Læs+%KØ{ÒXâ°‰½'7!"IRšr Ÿ0 sì_*É@ NbH– A"° $K A"° %H X‚ %H X‚‰À$H,A‚„y&0˲‰DÂçóy<ž¡¡¡áááÑÑÑ`0˜ÍfA˜¿f­]»V.—Ã0¼}ûvžçïËÑhÔívÃ0¼|ùòP(tä­ZµjA0 {½Þ¹ÿj¦fÞÓfÂOúSµZ Ãð‹/¾x ŠQËš 2™¬¦¦fÍš5o¼ñÆ1+ŽýbÆbQ#‘ˆÇãÇãÅbA•JeµZ«ªªjjjjkk)Š‚aXG “À0Œ×ëõz½7nüú׿þðÃ[­Vi©#‹¢888¸sçν{÷ŽŒŒär9†axž‡aÃ0’$ CSSS[[Ûi§¦Óé¤ÂÀ“k×® …Bv»ý¡‡2‡ô[­V»téR™LV¹xxžO$}}}ù|^Å—_~™ ˆ‡~Ø`0H£},<>>¾}ûö-[¶x<–e!‚a˜ AX–e&“É„Ãá\.'ÂÊ•+òv¢õ¢¨ÿøÇÙlÖn·«Tª­y×^{í9çœ#‚N§;¾-ùä“O¼^ommm©T:Ôß655=÷ÜsV«uêGÙlö¡‡Z¿~}:~ñÅ/»ì²ÿ÷¯¤º„y!p¡PܳgÏÈÈ`/I’UUU …‚ D"111Á²l¡PصkEQN§sÁ‚8ŽŸh}S(7Üpà ;ôëÖ­û|¯-•JõÓŸþ4›Í>úè£Ùlöµ×^;ýôÓ%Ï;S©pVqAL&;ýôÓ;;;K¥Òààà‡~ØÓÓ8<00ÐÔÔT]]­Õj%EZÂT\vÙeÏ>ûl6›ò@Â<X„t:€z AÝnojjZ±b…V«…aX¥R%‰P(‰DAH&“@ “Éh4šÊ- —ÂZ­Ö`0 (zìý(Û¶m+‹¦££ƒ ˆ9þpxxØçóñ<¿`Á“É4OÓÎ;S©”(ŠgœqÆÜ'‰F£½½½,˺ÝîÚÚZ ÃNðf6›ÁÔÏkØâ ‹ÉK“ã8š¦Óé4nÇÕjuuuµJ¥B†a“Éäp8T*0z9ŽK§Ó È¢žL&·oßþüóÏ?ðÀ÷Þ{ïSO=µyóæP(tìç/N_vÙegŸ}öM7Ý”H$¦nUo¾ùæš5kAf³yݺu»wïæ8îé§ŸþêW¿zöÙg¿÷Þ{3“ÂqÜŸÿüçÕ«WëõzE êU«ž~úé\.7Çæý¿ÿ÷ÿÎ;ï¼³Ï>{Ú×îÝ»¯¿þú††™L¦ÑhV­Zõú믋Å?þxÍš5gŸ}ö£>:Ë»6oÞ¼nÝ:»ÝŽa˜R©\²dɯ~õ«H$Rž&‚6mÚd±XÊq¬‘‘§Ó Ãð%—\‹ÅŽÖ,ŒU®ººz¦ífÏž=?üá;;;U*†aF£ñK_úÒo~ó›`0X¹lxžÿú׿N’$ ÃúÓŸhšžjÌÛl6†-Zä÷û+?bYöå—_^»vmuuµL&#I²©©éšk®ùðÃg9 gûöí7ß|sGG‡J¥BQT­V/Y²ä¶Ûnóx<n Ìó¼ z½Þb±pG’d%]!B„$ɲ8ã¸IäL¥RgbbxhÜn÷‰¶û&“Éë®»P¢,Ù^|ñÅ7ÞxãÉ'Ÿøà¾ûî{衇¾öµ¯ EÑßýîw]]]£££?ùÉON=õÔ¦¦¦²~T(n½õÖX,&—Ëxà‹ÅR~àÀÀÀw¾ó­[·VêðƒƒƒƒƒƒO=õÔ•W^yÏ=÷˜ÍæJG,Ã0?úÑž|òÉ|>_é–#ù‡?üá‰'ž¸è¢‹Žû¹n“ L„Óé\¹regg§ (ŠšL&‹ÅR&žç³Ùly P¥( ðÊ΋âDÓ:J¥Ò•W^ù÷¿ÿ½T*Á0¼lÙ² p·eË–ÑÑÑk®¹fñâÅ@h̄믿~ûöíz½þk_ûZCCC$yùå—=Çq¯¾úêé§Ÿ~Ýu×)•ÊÃkÞ]wÝuÿý÷ö666žzê©r¹|ïÞ½;wîüõ¯}ÞyçU.©©xì±Ç¶oߎ Ⱥuë/^Ì0Ì;ï¼óÉ'Ÿ”J¥_üâ=öˆ-^¼ø•W^afݺu¡PÈf³0’Édª4ˆ¢(ÿæ7¿y饗hš^½zõêÕ«'-wA®¿þú_|±P(@TSS³bÅ ½^ïóùþõ¯¥R©h4zùå—?ÿüóeªÔÖÖþìg?»õÖ[ƒÁà]wÝõûßÿ¾šúÝï~×ÝÝÍqÜ/ùËÅ‹—½ª###_ÿú×ûûûAÐjµ+V¬¨©©aY¶»»{×®] Ã<óÌ3ñxüÉ'Ÿ¬Üvï¼óΧŸ~ uggggg§Z­‡Ãï¿ÿ~4Íd2ßùÎwšššÚÛÛ½m8c)Š*P´Là`0è÷ûS©ª …Âjµ*Šy #­Y³æ ›\ 8¤øÇ£>úÁ”J%»ÝþÔSOuÖYÀ<æ8î‘GùÅ/~ñÁÌþ„Í›7_tÑE<òˆÃá¿ãŽ;¾÷½ïýßÿýMÓ¯¿þúå—_~xþè£üñL&ƒãø½÷Þû­o}«üœM›6]sÍ5o¿ýöì{âæÍ››šš6lØÐÑÑÖÖí·ßþûßÿþç?ÿy*•úë_ÿšÉdu:ÝŠ+ ýǃÊåòÓN;ÍápRƒ»ººÎ8ãŒIº1ˆ—ÉùçŸÿè£NÕJ^xá…×^{­P(Èd²{î¹çšk®)w6‹ýà?øË_þBÓô~ðƒ%K–ÔÖÖ‚¡¾òÊ+ßyç×^{í…^¸à‚ .¾øb’$wìØñØce2™³Î:ëꫯ.G Aø¯ÿú/Ç#Â~ðƒÿøÇ•’vïÞ½7ÞxãÖ­[ß|óÍ 6\{íµ ¡PhÆ ÙlV©T>ûì³çŸ~ÙyžJ¥¾ñoüóŸÿL§Ó/¿ürMMZ­>±¼Ð@ןöÛÝÝݽ½½™LFEEëêêÜn7ðo•¿¦Õjëêê ØóÊnŒÃ³ Žn‡óùüÿøÇL&ƒaØŸþô§/ùËå­ð›o¾9 =òÈ#Ùlv–‡444<øàƒeö‚ÕÇwüóŸÿœ˜˜³ ðYððçR) ‡+Ù AЪU«|ðÁoûÛÑht–'à8þ¿ÿû¿ .,9 Ã7ÞxãóÏ?¿sçÎb±˜H$ªªªŽ–Ü(‹g–/^§ÓMÚâyžä‘G€v½~ýú«¯¾ºRÁ6O>ùd,{÷ÝwÀÆo¸á0‚¬_¿~×®]ÃÃ÷ÝvÛ)§œâr¹~ô£Åb1N·~ýz“ÉT~Îûï¿¿mÛ¶R©tà 7ÜqÇ“Bî ,ظqã¿ýÛ¿õööþñ¼ôÒKÁ+º»»H¸øâ‹W®\YúÒjµ7ÞxãŽ;"‘Hooïq9Jö žI#òx<»wïÞ¶mÛðð0P¡›››[ZZš››e2Yyzt:Ý)§œR[[[¶{µZ­Ñhºúê«7nÜXþæž={@gÏ9眩ìX¹r¥V«F£]]]“¦cíÚµûÛß6nÜøÌ3Ï "Â%—\rÉ%—LšÓ½{÷–eéL¹Fñxá###­­­(Š.Z´H©TF£ÑüãßøÆ7®»îºÕ«Wk4š0ÝðàŽD"{öìéííݱcG(âyž¢¨ŽŽŽ ,_¾ÜívO»2NØ´uŸÏÄW}}ýL3Z[[;{tÁf³ÍæØ¶Ù“Þæ©m‡ A ÃW¿úÕÓO?ý¼óÎÛ½{÷–-[Þ~ûíÿüÏÿ”Ëå@¸Î666ÎÔ#Çkjj¼^o2™Ìår¢(–× ÿýíowîÜ ¼S‡ã®»îÒëõ“ž‡Ò1222—ØÆ_ÿú×7ÝtS$Ù´iÓ¦M›0 kiiYºté)§œòå/¹¡¡á‰À#³Ç3úúúÞ}÷Ý÷ߘ"‚ Øl¶/ù˧Ÿ~úªU«Ž¢)uÌP(€n¯T*gÚe*ÃfÓo{zÝ¿m;lÆïÿû@#Û´iu ”y…B1‹y*§ «ÕzÖYgí ££Ã`0L}Î!9#ŠÅbÙ¾¸ôÒK7oÞüýïßjµ"ÂqÜÞ½{Ÿ~úé믿¾µµuÉ’%Ï<óL¹/'¢fYv×®]]]]Û·ocYÇñ¦¦¦… vvv¶¶¶ž¤…„8ŽƒfƒB™™ˆt\¢_'rÛŽe­¾œÔAPÙo2•™• i|Zég)ûÛ7nÜ"=o½õÖ믿¾nݺI*4à¿ÅbÙ¶m›Óé<¤f755=øàƒ÷Þ{oWW×ÇüÉ'Ÿ|üñÇ Å¸»»ûª«®êêêºóÎ;+­ÅEs·sçÎíÛ·¿÷Þ{ ¤¢¨åË—éK_ZµjUggçüÅæ6› (?åB«©=.Y»'rÛŽ w ÆåݧÜÙYr¤9ŽC¡R©Ê¢ •JÝrË-±X ”šÁ0ü“ŸüddddÒ^Ò¿b±X¥t=4‡aK–,¹á†ž}öÙÁÁA¯×{÷ÝwÒ>øàƒ}}}‡q˜/ƒáÓO?ݲe Hx&bÉ’%‹/>ãŒ3@œ­Çq“†&›Íú|¾±ýH$'N&V9)úÝwßV …B{÷î=.árÛÞ{ï½iÛ&Šâûï¿?5…ðG?Ï2i+;ûÎ;ïÌ”š²yóæd2)Šbggç$ÏÜwÜÑ××Çóüúõëׯ_¯Óé"‘ÈwÞ9)gvÉ’%2™ŒeÙ>úhZ7§(Š7ß|ó9çœsÉ%—”ãsýýýwÝu×´)“‡ãöÛocAº»»o$içr9dzgÏžX,ˆJ …ÏçÛ»woW@ÅÙž (“Étww¿úê«O>ùäO<ñÒK/}òÉ' rs",¦Õ«Wƒ û•W^Ù»wïÔ½ÿ‘GI&“Ç¥mÕÕÕmmmAx½Þ—^zijªó[o½ÕÝÝ}rI`Ažxâ à6_¶lY™‡À‡ÒÕÕõÚk¯Måp©TZ¿~=˜‹óÏ?¿R7~ýõ×_zé¥|>Ùe—sÎ9ßþö·Ï:ë,™LöÊ+¯€Ìò7/¼ðBàâ¾ûî»ÀT!üú믿ð ÿûß+i$yä‘Gî¹çž7ÞxcÚí²¬ÏOUì¿ œN§=pYÿ ƒ¢(ŽMm«L&koo_½zu¹2†çùp8ÜÝÝxž!¥öööd=™L¦uëÖ=üðÃÙlöÊ+¯|ê©§¾ô¥/QÀóüc=vÐ,Žù Ã7ÜpÃîÝ»£ÑèOúS…Bqùå——C,ï½÷ÞM7ÝÇçéí•)G Ùlöç?ÿù_ÿú×b±¨ÓéÊtªé÷¾÷½þð‡‰Dâ–[nEñŠ+®(Ï¢ÑèÍ7ßü¯ý‹a‡Ã±fÍšòG¡Pè'?ùI<·Ùl 7A{î¹g×®]^¯äH·¶¶}»©©é /|î¹ç.»ì²G}´££,TQßyçïÿû rãꫯ.ç/µµµæ·¿ýmKKK9WüêÿøÇ3Ï<“Ëå‚X´hÑñ­pž¦œ0›Í†B¡|>_)3C¡Ð´; I’z½~’Àq\©T*‹‚ ”J¥ãk$LÅm·Ý¶eË–­[·ú|¾sÎ9çÔSOmooç8î£>òx<ƒáÜsÏݼys¡P8öÝ /¼pÍš5Ï<óL>ŸÿÞ÷¾÷àƒ.[¶¬œ ÍqÜÚµkßxãl6[öx9@ê‚ßïÿÕ¯~µ`Á‚šššU«VïîA100pùå—O]Ä¢(],›Í‚}á¿ø…Ëåªló7¿ùÍ÷Þ{äŸÞpà ÷ß?8¡i||üý÷ßO§Ó¢(ñÀ”“ÞAøÑ~lÝßüæ7UUU€¨uuu·ÞzëÏ~ö³H$òóŸÿüñÇ/Ÿ t×]wíÚµ ä -_¾|ÅŠ  d×®]{öì ðw¿ûÝ3Ï<³Ü ƒÁpÑE=õÔSÁ`ðÜsÏíèèèììÔét™LfÇŽ}}}@ ºá†Ê 8Q ¸7í¡“ÓnÏ'f¹ÂìP«Õ/¾øâµ×^»iÓ¦R©´uëÖ­[·‚ÌfóóÏ?ÿæ›o~øá‡•Þ—c)„ï¿ÿ~™LöÄOär¹þþþþþþ²Èzà´Zíßÿþ÷l6{•·+Vš¦Ÿxâ ‚.¾øâåË—Ï‘À©TêŸÿüçA7ˆ;ï¼ó[ßúÖ¤„ Eÿð‡?h4Pô3<<<<<\ù‹ÅòÈ#\pÁeÅû¹çž{ë­·hš¾ôÒKÏ?ÿüÊF~ç;ßyóÍ77mÚôòË/_pÁëÖ­ŸšL¦7^{íµ@žoÞ¼yóæÍŸÙrýõ×ÿò—¿œ”eù«_ýj||üí·ß.•JÀª– IDATZœÔòo¼ñŽ;î8¾.èé%0An·›eÙ¹T<’$év»'µb.ôüù{_{íµW_}õ™gžÙºuk*•²Z­_ùÊWn½õÖššš¿üå/`Ôjõ±ß_ ‚¸ï¾ûÖ¬YóÄOlÚ´) ªTª3Ï<óÖ[o]¶lÙ /¼pÔÛvÿý÷kµÚ—_~9 RªˆÂÚÂ0‡Ã±råÊë®»néÒ¥ÓfkÈåò|ðŠ+®xöÙgAȃ¦i­VÛÚÚzá…^qÅ b|yddä®»îJ&“‹åÎ;¶aØúõëÏ=÷\¿ßûí·/[¶¬¬H»ÝngÚ°aÃLJ©ªªZ¹rå5×\³dÉ’©mÓjµ7n|õÕW_zé¥íÛ·ƒA–eÕju]]ÝÊ•+¯¸âŠööö!—~ï½÷&ýW±X<¤t|’$'My2™ŒÇãÓæB¡Ýi3O|å+_ùÇ?þÁ²l___ccã 0ûïÿþïõë×g2™çž{îâ‹/ž£œ”p À0Lj?ŽYŽ6-!kjjUñ«üó(æBuD"‘ï~÷»ÑhôŒ3θí¶Û¦ª@‰D¢§§‡a˜šššY2¢æ ×_}OOZ­žTžZ6X¶lÙÂ!s?$HÂçØ\yx¶Ü‰Ùa½^?88ØßßßÛÛ{Ùe—MUDzè!K<óÌ3ýy 4Moß¾¦é÷ßêï¼ó¨Aollt8']«„£Ž/Ü9’†}å+_¡(*™L^rÉ%å\<‚ÆÇÇo¹å–òY6k×®=ö§I_tÑEÀÓóíoûᇎF£ÀG˜N§{챫®º $\vÙe'àI×Nx¾=4ÇÝ…B«W¯îëëV:EQ‹¥X,F"‘²ßîÊ+¯¼ï¾û¦V·Ì7xž_³fÍ[o½Šà0 ³Ûí Í匟ööö7ß|\M$­à/¸ üE<ÉÙjµnذ¡³³8Þ …¸±­ÌÞo~ó›÷ÜsÏq¹0EÑ'Ÿ|²8á8n|||||¼ÌÞSN9eÆ àøH‰3¾ˆ —Ëmذá•W^I£†UWWŸ~úéW^yå©§žz|ýC<ÏÿíoÛ°aÃÖ­[ÁѪ6›mÉ’%—^zie2“Iq ,A‚¤BK áxB"° %H X‚ %H,A‚‰À$H˜?Ï‚Æ9Þ¥ A‚„ŽÀ³\"A‚„šÀ{%H8Y ,±W‚„“•ÀÇý>U >O¼Ð$H– A‚D` $H– á‹ìdlt*•ŠÇã<Ï›Íæãröú‰€|>‡9ŽÓjµàö¹ƒþ$'“Ip¾Ç181—çùññq–e§ž~R ×\ÍfS©¸ÜÏh4j4šc¼Ñ«®ºêäZ¸ÉdrÇŽo½õ¸íÂ`0û PNövuuýíoÛ¶mÃ0:î „ŒÅbüñ[o½Õ×ׇ ˆ^¯'bþÆçù¡¡¡·ß~ûÝwßM&“æØ/î#®¹`lllëÖ­ï¿ÿþ{ï½700 Š¢N§“ËåÇr5ž¬ÜûÜÔÔ4—û_>¯öx<ÉdÒápLºÈ* q‡¢è¤Kmb±Øðð0‚ ,8Š7Zår¹L&®Ñ©¼ùçy¯×;44D’äq¿àn–á:<ÄãñmÛ¶}ôÑGÃÃÃ(Š:š¦ËON$4M‹¢h6›çõ|µ“’Àâ~|‘Çõz=Š¢“„I0üàƒÆÇÇívûi§æv»+9<ˆöôôtuuñ<ßÑÑÑÞÞ®R©&IÚa¦ŽnA‡Ãà†µZ½pẺº¦¦&põt<—*ŠÓN;­¡¡aþ” ’pr²×ívŸyæ™Åb±ººº|±-A4M÷ôôôôô477]I;-8Ž ƒ»wïfYÖh4666~ÆŸeYš¦Ãá0AuuugžyfKK‹J¥WF2 ãñxvìØ¡V«›››çõj{‰À'%‚p::NE’$I’¬zÅb‘¦i Â›Õ\(X–å8î ¢ ‚P,yžGQT£Ñ8  •¿À0 ¸_z¾M<ìP§ \mLĉp·â(Š’$)Šâ±¿…\B¥N~|Ç›ÉâÏd24Mó< EQ:AŸÏ EQ¬©©±X,soº(й\.ŸÏ‹E°OÃ0ŒaAJ¥R©T‰²P(d³Ùrke2™J¥šj‰U¢T*e2 7DQD„ …B¡V«+7&žçý~?Ã00 ;Ωwj—ZÆh4ΜˆD"ÀÙc±X&5¦é`0<=V«uÒ€”?-ÇcxžF££££ ÃØl6—ËE’$MÓ¡Phhhl²,ËŽŽŽb¦Õj-ËÔöÐôÿoﻚ۸–ü `sÎÀ $@H*ÓvÙëÚ±U»_i_·jŸwŸöl]Û²$Z3ˆœó g ÿ‡¾w. ¤(’uíý£\3s¦OwŸ¿szÐétúýþt:¥P(À¡P¸¼i. ù|¾Z­Â:S­Vc±X£Ñ0 7;îÑh4:Îx<žÍf`€D"Ñi[‚ :N·ÛF0H:ÓD§Ó¿¬Ú ‡Cy ŸÏçr¹ ‚Ôh4òù|6›…ùêt:‰Db4) ¡P˜Íf³Ùl§Ó Ïf³‰„ËåÞÊ“Êçóý~ô Av»Ýn·¡F… —Ë•H$0;8Ž7^¯wKƒïD"Fc±X>Ÿ Ç`0X­VN ŽŽùþûïy<ž@ X†‰ý~?‹e2™T*U*•Úí6Žã‚ðù|…Ba4M&“ÝnX+À\.W.—c±X.—  C¥R™L¦õõu›Ívó™³Ù¬P(D£Ñd2™Éd(†L&#GÇÓéôùùùññ±\.ßÙÙyõêÕ|ƨR©¼yó&Ìf³W¯^9N¥Rù1®T*———ïÞ½CäñãÇ/_¾›Št~~~tt”L&årùÞÞÞË—/E"yõìììÇ¥RéÑ£GÏž=CQt4E£ÑŸþ¹ÕjíïïƒLƒÁ·oß&“Éx<>Ãáp¯×‹Å;;; „óù<ð!—Ëu»]A¤R©Éd²ÙlN§s™æù|þÍ›7———™L¦V«ñþýû@ `4¿ÿþû­­­‹éõzc±X"‘¨Õj8Žs¹\Ng6›].—F£¹É·N§F‰D*•ªT*ƒÁA‰Db0PµÛír¹ü‹”s ‚Èd2ñx<‘Häóy(•s¹\µZ¢¨Ùl¶Z­d©²^¯Ÿ¥ÓiÐáËËË\.§T*÷÷÷e2™Çã …BÀÕf³ùÓO?}øða}}ýŸþéŸìvûÆ1—˽~ýúòòR¥R}ÿý÷t:=‹E£ÑJ¥åk³Ù¼¾¾îv»'“I ˆD"Éd!‚40ÓéôâââòòÒãñäóy°CT*5çr9FÓívs¹‚ `'–áN»Ý>::òûý¡PÚv#f³Žã E"‘8N Þ={vßZ2™¬T*©T*ŸÏO§S‚ @pƒÁ HÕ“'O8ùL‚ ÀÅÅ…ÏçK§Óãñ˜F£Q(‚ ®¯¯=ÝnO§Ó/_¾T«Õ‚Èd2&“‰ãøéé)‚ *•ÊétBU`4ŸÏç÷ûwww™LæB´@l6› ˆR©Ôh4D"Ñöö6Ùšx0 ¿ß_(ŠÅ¢L&[¸šÏç}>ßh4ÚØØ`³Ù¤b …F£a³Ù MBÄ`0è÷ûðÏÙl6ûý>˜ðùÁ€¤¦R)À6L&“ápx}} …¶··»ÝîÓ§Oçùv‡#KøÁ¦Óéü‡Ãáû÷ïûý~$«pc0´X,årù‡~Ðétó ]µZ=::ººº …BÝnÄf6›% ŸÏg6›S©ÔóçÏÍfóg†r8Ž{<¯×ëóù@ŠHù …B2™Ìáp‹ÅgÏžA†n Ãá¾Çqà3,È} ӣшF£‘?þäj‹ÅšÍ¦@ ÀqüúúºÕjA8=¯¯¯Ëår­V!3L&&“ Ó …...Þ¾}‹a˜^¯W©TB¡p:¶Ûí|>aØ`0èõzó9ÏOÆÌÁ`Ðãñ¼ÿÇqEår¹H$Bd86B¡Ëå:FÓëõf³yy›Ún·#‘Žãt:Ýjµ …Bø#¸7Íf̼Ûí& qñxüüüüÝ»wÙlV.—[,‰DÂd2{½†a©Têèè¨ÛíÎf³üQ, …­­- Ã*• L§J¥R*• %‹¥0›››.— Øx‡+•J™LV*•J¥R«Õ"ü‡Ãb±Øét@‹Å"xÚ Ðý~¿X,v»]‰D¢ÑhH1Z ‹e±X¨Tj,{óæM&“ÑétÏž=3™L0f²‹j³Ù ƒ4Ëå:N™L6™LjµZ<Ïf³''', EQ£Ñx÷\Èåò§OŸÊår¯×ëñx‚ØÙÙq: …b}}ô}  o×h4J¥’ÅbµÛíB¡‡}>ü}\ÑjµŽŽŽŽ½^¯H$²Ùl‰„ÃáŒÇãF£Q*•|>_§Ó™N§,kAóï»öƒÁóóóÃÃÃv»­ÕjA>)J§ÓÁ0,“ɇC:þôéS6›-¶¶¶Ølv0<>>n6›6›íñãÇZ­Ö`0ˆD"àÞéé)YFZ__—J¥ƒa™qÎf³r¹ì÷û¹\®R©t:4­^¯G£Ñt:ýþýûL&‹ÉdR(H¿ß§ÓéT*µÙl†B¡³³³F£±··“!‘Hf³Y±X …B>|( ý~ùδív;“É\]]á8þüùóGÙívð¦Ói­V …B¿üòK<O&“†--?´T«U‹Å²»»»½½­R©(J¥R ‡Ã'''WWW^¯W*•êt:•JE¥RÛív(:??Ïårv»}wwwkkK­VÓéôáp˜L&C¡Ð»wïÇÓëõ»»»0•J¥R©¼ÿ>«TªW¯^ ƒP(äñx¸\®Ãáxüøñ'£ XÏår9‚ õzì(‚ ³Ù¬Õjqäóù`J0 $Æl6k6›ðc‰D¢T*?æ¤Ðh4™LÆçóy<žÇã¡Ñh|>ßårmnn2™LƒAvë †=~üxggÇåráËår~¿ÿ§Ÿ~Êçóàåêtº»ç*("‘¨Ùl†ÃaÇFãÞÞžT*åp8ä‚3q—J¥ûûûn·BAX~…Bá‡2™ Ø/à8‰D‚Á ÏçbƒADµZD"^¯÷üüœÅb©ÕêÏUa ONNF£Ñ7ß|ãt:­V+Èç`0H¥R××ׇ‡‡^¯—Ïçët:Mˆ:N@·ÛU(ð], A§Ó)‹3™ XìvûÞÞ‡ÃY¨ÜAƒÁ€F£mnnºÝn­V‹ H±Xôx<ÿû¿ÿ[(’ɤ^¯úôéîî®F£A`Ý'¢P(D"‘B¡€¢¨Ëåúæ›oär9ðE¥RñùüÉd‚aiÈ—!È=…B½^ït:Ÿ?æ Ü!•JE§Ó¯¯¯a…™L&A@~kÉç‹D¢—/_šL&6•JmA›Íf>ŸÇãÅb>¤\.G£ÑT*¥T*=ztpp‹ F­Vs8œÁ`ðæÍ›h4jµZ- ™œNg­VƒH[¡PÈd²z½î÷û«ÕêþþþÎι–ÞM<O§ÓñùüN§S.—{½›ÍF†Õëu§ÑhJ¥R·Û­ÕjÝn—Á` ‡ÃZ­V¯×AX%ÉB@¥RÙl6écÃ?9΂“I¡P4Íæææ«W¯ÈH*R‘H¤\.CâÜà»ç‚Éd²Ùl¥@§Óá` ç½ƒ½½=2—Ã0ð[­éd¶Ûíd2 e2™ÛíþöÛo½0MJ¥R¥R1 òÙl2™t8çÁ0)óõzÝívïîîîïïCÃ=x—F£ƒÁàíÛ·d‘Àg’Q1‚ ðÕ0˜0|;—˽ÚW  (º»»»±±ì‰DÃáÐçó•Ëe:n·Û÷÷÷ív;ƒÁ@€kƒÁ R©är9ƒ¡×ë].—T*—E«Õj ¨ÕjËóH*•ÂÚÈ`0l6).$ÈïœÍf÷­˜!¢Õj766ŒF㼌êõúf³FK¥R±X¬V«ÃáA˜òÙlÖD¯×“wAzÓápÔjµëëëB¡N§[­–L&£R©à5‘Ž4ÔW¯®®¬V«Óét8Kbå m#‹s¹\¡Pèv»R©t4Ò* ›ÍF¡P µ ù'Ò»f³Ùz½^(~~êÒ3N§s~…B‘Ëå\.—Éd>`.>)`çÓ°S€dÏ-Ûív:îõzjµšËåŽÇã\.wÓpðx¼|>ñ×ÊϽ^¯Z­ær9‡Ãd2¹\n¹\^°‚Ðét>ŸnQ¿ß_F?sŽÙl6$»¨Tª\.çp8t:](šÍf2§î(˜^6›­Óé@pçJ§Ó5Í}w0™L‹Åb2™ Þëõ ’Œã8ôbŒÅbÅbq09›{ ¢\.¿™À¤P(jµZ¥R ‚~¿ßh4 ;aX«Õb³Ù*• rT äp8z½^*•f2™jµ ¹ t«ÕêÛ·o¡þ$—Ë766=z´¼ÿÆ`0d2™L&K§Óår¹Ùlêõz¨ýà8®P(,K«ÕÊçód p¯×ÓétJ¥ò3ëmäz1磠’ôÅKš‚ðx<µZ}Óù‡ØmaUì÷ûà€d2™·oßžžžÞTÈz½^£ÑX>Ÿº@ãñ¸R©ôz=°Ú†Ý (}•Ëe‡Óh4¾ÎAÈt:]*•.°‹J¥Bålá*BæâÚíöx<æp8‰äÖ@‹Ãá‚»S5·ŠK§Ó)•JØß¨Ýnw:v» eá\.÷0¤û­ßI°5P|žL&–˜L&!¾µ51…B …\.—F£õz=p#ÁG R©‡J¯±XŒÁ`Æ¥R¹¼FQ(±X ¢Üh4ªÕêh4‚ŠÃjµZ­V(/Çcˆ–×ÖÖ ÄÏ_D£ø|þWë`Nz˜Ë˜ÇG£Ñp8$¢×ë…Ãá;~IÄh4z@äEf×@6pŸècY%Ç™L& ¾Ôì&â`~aŸ¿Š–f2™ý[# °¤Ó»$% ¯×{}}Éd ¥>¡ü Z­>à#a<·ê3à+`vg³Ì4 =>¦uáÐh4(JÍÏǃŠ_8BóÕÀC÷}Év‡£P(îæ0x’Ïf3‚ à^•Juw “Ïç“)¡?ý=ÕA¿5%_ë»)›ÍA¦Q©TêõzµZ-“ÉD"äK;Î/¿ürrròÖã¹õXhRÉÉÿZñǦnl$ÛÈK¥R \k¨æ×ëõ««+™Lv¯(‡ÃQ©T2™ ðB¡P©T ÄR©T"‘Èår±X ¶J¥’Ïç»Ý®P(T«ÕKÂf–Tªµ?$‹H¥Ry<žÝnÿî»ï Ã'uøÖõj™w"X§Ó<~üx~/ä­:¼°=ó¤À¨0ŒÉd¾þÍäÝh4ú$"Œü}:öù|‰DÂétîïïCÕ²í@¥RéÁÛñ'“ ¹ëòfxƒaØp8„j “É„²'Nïv»õzýÖ`f6›cã8$6@¡ëóù|>_£ÑÐét­V+‹©T*Fãr¹–wG©TªT*U*•Ñh´Z­B¾ Çq‰D;ì¥R©L&K$Ëçó£Ñjò¿ëþû?Š8"Á†êtºõõõ›:HRÇÙlöƒ1•t:] 0 (” (z«Ójµz½A7³ f2™æªÕjÙlð…á®1Њepv ÀÕjµX, £ÑøäÉ“›¥Ex–ó„,b¡PXx,®³©ÕjÉC¤R)ŸÏ¯V«¥R©P(ÜÜiÝï÷³Ùl­V£Ñhr¹œ\Z ‚ÿ‡Åb‡¿ýö[0”J¥ …B«Õ.?µPQär¹F#™Lf³ÙétªT*!'Ìår¡º†aX</•JT*rN4Ûÿ;­À<ºf³™ÉdL&ÓBüŒãøÕÕÕÕÕ†aN§ªÄP-‹G2•Ëeù›g†Ôjµãããd2Éåró°Õþ÷#*éÚ) F3²Ù¬ßïD(ù»T*‰D`¹X>ÆÇd\}s¥Å0, U*¨Þ7=¹‡p8œÉdæG•Ëå‚Á`<ŸÍfZ­0€vÖëõ %›Í…䀯B¡P©Tâñx&“‰,zåóù`0xqq!‘Hìvû?ÿó??zôh{{€(^¯·×ë-?x‡£ÕjÿF3™ FS©T`Ùl6À­ªÕj4Íf³L&S§Ó-~›çÿŸQ‡ùR©´T*¢c4ÍT2™ôz½¯_¿¾ººj6›^Y,–\.7£Ñ(N{<È&ÎtŸÏwzzúöíÛl6 Ý}µ÷÷ž¤^¯óù|‹¥Õj×××Óét2™„"°ÃáPD©T”%‰âXæ3 fÅf³Ëå2Àß æ;ž+•Êõõ58Ø HÕjÃ0¥R¹¤‹¾¶¶Ön·}>‚ NÌp¹\$V.—3 ëëëâP(J¥Òf³Á!/———4mkkK¥R!2‰D8>==‡;;;&“ |n·ëóù<O·Û}öì™Û톽DµZ-ŸÏÇb1¥R©Ñh¶¶¶–t¤¡˜¤P(b±X6›í÷û6›M&“g@ª$I*•Êd2ÃáP§Ó)Š›{bî^Çf³Ùh4ªÕjÍf ¿ë² ’Úh4‚ 07ó l0677_¿~}vvÕG“É`òB¡ …NNN …ÂãÇaÐÖD(7Z­V G„Ãá€]e½^/‰\]]y<§Õj°Ð­V«T*q¹\Ðç› ž[ Àœëëë¥Réìì¬Ûí‰DB¡PZ­àg³™H$,®Ïç›N§äF‚O>ŸÃáÈd²V«õæÍ›ëëk`Úív.—Ëçó …b{{ ‚À8@àp8êõz¿ß‡ÃF|`&“ à'€ìº\.‡Ã±±±A§Ó. …¢Ñ¨Ýnw8V«•N§‹D"¨*U*ø(ð_–œ!2)U©T ÀðÉ ŽMd³Ùív›Ãá(•Ê{m»+g¾œœœ”Ëe³Ùl·Û§¥€B¡ö«ÕjE"‘µµ5(°Éd²ú„TªÕj- ­Vëôôô—_~‰ÅbÑL&“f³ UôÍÍM@#=ا%E¢×럟‹E¿ß/‹aI¨T*‰D‚Éd¬X.—/¯GÃ0ÌçóµÛmE···ÀQ_F½^¯\.LÌÖÖÖ`0 R©^¯0÷‚Ðh4ƒa·ÛÕju«Õ:;;#3ºw3ŽF£ÁLŒÇã«««`0‹Å¡R©4Íf›ÍfFC¡P...ÂáðÅÅŽãz½^&“}²lBL§Ó±X ?“É„J¥Z,—˵··úFÞbµZá}>_&“  6AL§S·½½ C-&‰P(tyy)‘H›JÆc(ŠB,}rr …`)X2#Íårõz½@ ¨V«L&ªäÔ¦Rô°ô^‹ ›ÍFQ4N …ãããx<0¯[KߟO,K"‘ (ŠaX$)‹f³Y$=™3/ýOž<½ @v $»··çp8^½zuqt_ëc³ÙH™'3 €öu:n·{{{{yÇÃá¨ÕjN‰D.//“É$ìñø=Ò`¸g08ƒñäÉ©Tª×ëE<x<Š¢6›M¥RýüóÏAÜQ+¾™°988H$F£1™LÖëõÉdñ¶Ùl6™LV«µV«A>°Õjþna…t”Õj%Âív«TªB¡PÕápÈf³ÕjµÙlÞØØ@QtÁ­…Åb±Á`€ýÀ°i "dEa£)D¿Ýnv“k4ƒÁ°³³3oƒétºÓ鄪쌩ÕjP^FÇ”JåÖÖ`QPßáŒËåZ­àÓ7yÂårÍfs§ÓYpí`ëòÚÚZ4m·Ûà¼AªV&“EûØ–&•Je³Ù ðY^×××—Ë-‹“É„Ñh4E¡Òs+[Øl¶ÉdâñxÈÌ_’H$ß~û-¸¸ñx¼Z­áFE777諒c•JÝÞÞ–H$z½>‘Hd³ÙV«Eî† Òf³ùfîêŽÁÃÂÞï÷¥R)X‘H´ J«ÕÚl¶E‘·^¥üçþ'ø'³Ù ¶³X,ƒÑív!? GˆÅâR©ôßÿýßïß¿W©Tÿú¯ÿº¿¿¿dÔ7™L OŇfðx<ØpS¯×[­ìò×h4ŸLô5›Íz½Žã¸\. …Ãá°ÙlPR …àÃ|ì pü‰pDÁ|¢¢ÛJÛYIDATíOÀ.Ü”Âv» çQ|ìw±Óé4줽yG¿ß|åuÎ^¯W*•¦Ó©H$ZåétŠaX·Û…×B¡Ž2‡˜ ˆ›o‚]%¿Wy¯ÛíBõ0³0‰ðó‰Üœ…B¡€ãøÇJ¬Ano>Êáp„Bá}«Gw°‹,š"1_ÐúXöáîÁCFÐkƒ¯~RŸ!x—…Ï|Ý—š‚¯9Ý¿«l<`vþ¥ …*•ŠÉdƒA‡3-‹X,ÆqŽJ;99©T*6›Íd2ݽ1uE+ZÑס¿ûÀb±ØjµîììÇb1ˆ¼áœŸ4Ãá°ÛíKn.YÑŠVô•A—ËÕét¨TªßïÇ0¬Z­$vðlll¤EÑÕ¡Ð+ZÑK×ÖÖ¸\î«W¯ Š¢pàc¿ß§ÑhPÏ€bÒ2ÇÛ®hE+ú:DyýúõŸÈÓ´Émp@ Xþ`®­hE_{¢R©B¡ð&œuô®hE^©ëŠVôg¡•?¼¢­xE+ZÑJW´¢­xE+Z)ðŠV´¢•¯hE+Z)ðŠV´¢•¯hE+^ÑŠV´Rà­hE+^ÑŠV ¼¢­h¥À+ZÑŠV ¼¢­h9úÿúdœR©Ôív ‚xpÙ? ‡CèÆJ´«¾ûhþOÚ¼¢•ÿ#©X,¾}ûöââB$}ÿý÷ÛÛÛîTüǧz½ýk²Ù,…BÙÚÚ:88¸Ù핤Á` ýõ×jµêr¹Î _ÑJÿ+p4 …ÏŸ?ÿ?ü™ƒÁàüüüýû÷g2™ÈårE?Ù“y0@Ÿq¹\¾|OÙ­øëuÿ'í£»<5x<îóù&“É£G Y!´‰\’E+Z)ðŠþa4‹Åâ`00 Ož<ÙßßçóùÐtÅœ•¯èNAŒF#è¬×ë¥Réê`à•¯èÏ,Ðh´Ovu^Ñ}ó ³Ù Œã?„±Wàl6;×þÖÏò“wæóù~¿?›ÍL&Nï÷ûÐã“ èä nö°ìõzårÇqèC3±ù±`Öh4‚P«Õ\.w0´Z-x´ ‹ÅP "¢ÕjAOJèv Wïnå>›Í “%ôÈ„gB§Ü;î‚6¥ƒÁÚ”BsÓõ¤œN§™Lf2™@³I …R¯×¡·°F£Y¾[Íh4ºÙ•Ëå ‚…ŽƒÁ X,F£Qh™9™L’É$‚ B¡P©TÞ«½Æx<ît:½^Z–’ÝXïxŽãívÚÊB[i:ÎápÁÂ\ÔëõF£1N…B¡L&[ŠétšÏçÁ‰Ðjµ ªr¯)øØÀ@Hàäóåõp0h¼¾¾=ÙÉ–¢Ð—÷îN¨³Ù¬×ëÔA¦pþ ö[{ÊÎkŽãå~4ýõ×_C¡Éd:88p8w÷_Íår¯_¿¾¼¼T©T?þø£@ ˆF£×××…B¡ßï³X,•Je±X666, é°õz=¯×ûîÝ»v»ýèÑ£çÏŸ«Õêy.ìµZíÇ'''t:ýÅ‹r¹<›ÍÆb±|>M½F£Íf{ôèÇ ‡Ã×××±X¬V«M§S>Ÿo4­Vë£G„Bá­“JD(Êd2Ñh´\.O&.—«Õj¡Q¸^¯¿és‘Édâñx"‘Èçó`\ +4Š¢f³ÙjµÎÏÁt:F£ùË_ÒéôúúúóçÏ»Ýn8ŽÅb<ïÕ«Wn·›Çã}²Ÿe¡PˆF£Ð¼ÑhÝÉF£Éd²Ûíä7‚xýú믉D"Çãp8Üëõ„BáÎÎÎ7ß|c0–¬ 5T*•H$R©T»ÝFú’[,‡Ãqk«áz½‰D’Éd:®V«£ÑˆN§CkuƒÁ`·ÛU*¼½^¯G£Ñׯ_·Ûm“ÉôÝwß™L&Ò.qvvvvv‹Å ³Ïúú:0ö¾S@®äÀjµÚh4‚ƒÐu:ÉdÚÜÜÔh4K²¥X,¾{÷. Ùl6:ND<ÅbÕj• ‘H„¢¨Édr:·6Ç0øD"Q,¡«ŸÏ×ëõÐeAð´Ãáp‹EfºP(øýþl6«P(8Î|“ë;t8‹µZ-ƒÁ0@¥RÇ“Éd0„B!ÐçÉd²±±1¯Ãñx¼ÑhhµZ‚ n>öc?¨Õj±XŒJ¥r¹\ƒ‘N§áuÃáp0À»0 c³ÙÉd2ôûýét:‡Ãa(r¹\ÃáðÕ«W7›ÓÏf3¯×K¡PŽã8ŽƒA½^ŸÉdž={æp8æ.ã8îñx¼^¯ÏçËçóÐ{ …d20÷Ù³gó¯›N§©T*B[óN§ …ºÝ®N§ƒò“¡l ¸¸¸ðù|étz<Ã4q}}íñxìv{:~ùò¥Z­$øœœÍfÃáÁ`ŒF£åÓˆ½yó¦^¯Çb±ÉdBü÷êêÊét‹Åo¾ùf!§Ífý~4ít:àºÏf3H†ÆT*õôéÓõõu:.‰X,—Ë=>>n·ÛÐŽ\$ħÓép8üþý{6› ˆ\.?ëaSÏ玎¼^o4 PÌf³d2yuu…¢h6›ýöÛoM&Ó’:\*•òù<›ÍþðáÃh4òù|­Vk:‚»Ý^(ÈI!åüääÄçóZ­~89Ë:Îápìîî<á¦vðùüZ­V.—‘µµµn·›J¥ªÕ*ŸÏ7›ÍR©tùÙ­VËãñP(&“ K\¿ß¯T*¡P(!‹•J%Ùý“rsÇàuÁ`Çãñùü½½=‡Ójµ2™L(:;;«T*L&³ßï«Õj¥RÉf³¡‚’H$.//ù|¾Õjår¹ sS©T‚Á`¯×ãóù›››|>2™´Z­T*‡»ÝîÚÚÇ#'• ˆ`0x~~~xxØn·µZ­\.‰D ¥Óé`–Éd‡Ã!Núôé‚ND*•G]§Ó)•JFc2™>¶ÄãñóóówïÞe³Y¹\n±X$ “Éìõz†¥R©£££n·;›Í~üñG(,Ë?þh2™Þ¼y“Édt:ݳgÏL&“B¡P*•Ëd¡G£Q</‹£ÑH«ÕB$Ž\*•úí·ßF£‹Å:88àr¹ð™Õjõøøøèè(p¹\«Õ*“ɸ\îh4j4™LÆçóµÛmÇ9xv»½R©‹Å«««ëëkF³··Çb±:N0ôx<ãñxww×ívËår*•ú°)èv»çôôÔëõŠÅâ ‰DÂáp``‰Dâêêj2™ˆD"±X,‹—ÏÒg³Y‚ šÍ¦P(Ôëõl6{8¤‡CA~øáÒ*Çã³³³ÓÓÓ>Ðh4£Ñ(•Jù|><¤Z­&‰z½>™L˜L&¸ÃóÚ1™LÂá0ôèF‚¨T*Ùl¶ÛíÚívNÇçó—z£ÑÀ0l{{ÛétÚív6› ¾¢B¡xýúu©TJ¥RFãKõî÷ûãñØb±loo¯¯¯3™Ìv»íõzÁî¦R)¹\þüùs·ÛmµZ F­Vóx<8ާÓét:Ýl6§Óé‚F£r¹¼³³_!‹ ‚Ãxx˜Íf¯®®4\.–a ONNF£Ñ7ß|ãt:­V+¸‘ƒÁ •J]__z½^>ŸŽÙ| 8pW(=r»ÝZ­âIAî°›ív; ŸŸçr9»Ý¾»»»µµ¥V«étúp8L&“¡PèÝ»w@€ÇãéõúÝÝ]‹%‹···y<žÇã¡Ñh|>ßårmnn2™Ì»3ó£N§L&óåË—.— EQƒÑn·Ãá°ÏçûðáƒÏç …&“Éjµ"Žºßïr¹üÙ³g[[[(вÙlÇóù|8>::ŠÅbl6[¥RI$ˆ÷\.W½^/—ËápX&“©T*ƒÁ‡ƒÁ`2™ÜÚÚÚÚÚ²ÙlÀɇM†aЧ^*•~÷ÝwÛÛÛ:ŽN§O§Ól6þò—¿d2™D"±½½-‰–”ÉÉd2™LÊåòîî®ËåZ__çr¹Ãá0ƒA˜¡Pˆ¢èÎÎøq ]§§§b±xoookkË`0°ÙlHÄÄb±`0øÛo¿¡Q©T`¶È7‚™V«Õn·‡Åb1—Ë1 ½^¿|ð×$‚¨T*‡ÃñìÙ3r©áóùÃáXßl6!¦ÿ"Ä`0 ƒËåzòä „7‰d:^__g2™áph2™\.×ÞÞ8Zb±ÜûB¡ÐívAIwR#[[[ß~û­L&ƒKjµ–âN§“ÍfãñøÖÖĨ…B!‰Ôëu·Û½»»»¿¿Ïápà9³ÙL£Ñ‚Á`ðöíÛX,–Ëån‚Ùl¶ÕjÝßß·Ûíóžù®G¹\ŽF£©TJ©T>zôèààÀh4‚ sÉápƒÁ›7o¢Ñ¨ÕjµX, …‚J¥²Ùl²ä ÿäp8÷J_Ñéôíííýý}Rþ”J¥B¡ ÓéÍfÓï÷' XÞ¹\n³ÙL$‘H„Ífïîî>}úÔår±˜Íf*•J(Â:“N§£Ñ(„Ð4M©T:ŽZ­öóÏ?‡B!¹\Þëõ‚Á ×ëU«Õn·Œ ˆL•JF¥Ri:ŠÅb»Ýîv»É) ‚ Úív"‘àñx»W’zk¿xñ‚Ldh4p"À`¥R)³Ù ™Ëå‚ÁàÚÚšÛí~ñâÅææ&™rR(Z­\K¿ßÇ+•ŠT*]XÿÁÆÆÆË—/‘V«•L&ëõºX,6™L÷]*…B¡Á`ØÜÜœÏ0™L)ˆU¾ šG h4«Õ:¿÷@ @/rƒ¡Õj- ¹¼P(ðߘLæl6»?ÈãñÀ(Ì;…B±Ûíõz=‡B¡l6[¯×õzýp8¬V«¹\ŽÃá0™L.—[.—8† Nçóù†aY½ùˆÅb‹ÅÙû%3À†e³ÙÙl¦×ëN§^¯'•²» ý H§Ó­V‹ [>“”J¥ÍfÛØØ˜_´E"‘ÓéL§Ó™L¦V«•J¥N§1 ¼EÑõõõÍÍÍù¹ P(‹¥Ñh„ÃaÇ÷êõz°Dëëë•J¥T*ùýþ‹‹‹X,V(¦Ó©Ãáxüø1éÓöz½L˜Ð° ­VK,ƒæÐh´'Ož( Ç™gï2$‰Ìf³ËåšÏç1™L§ÓY*•b±X³ÙÌf³­VK$õz½l6[©Tø|>“ÉD$ŸÏ/xCL&.•J%ð¥ç×:®T*ív»B¡@ÀF*•J§ÓÝ·œÅf³u:ø–ók“Éü=€>‚Èd26›=ÿG¨jÀ4H¥Ò›WïÖ‡£×ëoŠ;¸$r¹ruNg2™ŒF£J¥Òëõ@[0 »9ÓA4r¹Ìápçæ?Çã©Tªå÷?A@ÕjµÀíT«Õ7_ _!•J3™LµZ…Ðýó‰ÉdŠD"ˆëF+•J ƒP(¬ÕjµZm0ŒÇãn·‹a™p¾ù4M§Ó) 6›Ýl6¡èÓÇd2Á‘®T*>ŸO ´Z­'Ož¸\®yc70à} †ëëët:}zzÚívQ•Ëå\.—Åb±ÙlEI[s/.ñù|ƒÁ ‹näóù(ŠJ$’jµZ.—{½Þl6ƒñ÷ûýz½îñx‰ÄÍ×M§ÓB¡Ðjµ xŽó)˜¨·!¹\®X,2™L£ÑxßÚ ˆãͲÞïG 3 » ¶ÿ·\"‘ÜZïåñx#FPiÄq¼×ëÁÿär¹B¡ð1Ÿ Çq&“9 ÀiŸçˆËò›N§`>èt:ä]nýv¡P)º^¯ÁÂ2Õ„OúÏB¡ðÖBNs9N»Ý. àÕ‚ˆD"2­µ@, ¸ Ì„r=üR.—;X Êå²^¯·Ùl.—kÞ…™N§›¥R¹¾¾Þét¼^/$¢E"‘H$’ËåjµZ­VËår¥R)‘HîEBå™\Ì´æ znC,IŠÐd2‰ÇãwL:Œÿæ¯C ߥT*F#äñ°*~M ÊÝïzÀH`¿uÎ#A&Ÿg³Ùl6lmmM¥RÝ­‡°ívá`eî5N²r™Ù/F§Ói4Út:…Ñ~>·©T*<óÖKL&“d©3€-K·~&,¶0Nø®ùKjµšÅbñx<ð{…BáÄåÁSÀ`0ž={Q¤Ö[­V½^ÇãPžÔh46›mkkËét.D=w³ääÖa÷¨T*Žãó"˜­V{·{¨P(ø|þ­ ¼šZ­ÖétÛÔþµ—”€¯ 3œL&·†Çóšk;Fc0‚ètºƒƒƒÇl!vÃrûÞ'µÊ'ú˜ž“ús·ÓñÛqë¥ñx X•Jkw-¸ ™[x&÷|ýúúºÑh4 Àx$“Él6k6›çcþ‡M°«V«aV.— …B¹\n4µZíââ"N7 Ø2½L~ø¬øê‹TW2•È`0ÀçýñÇ777ïv{årù­¤¿*p±Xär¹&“éKå<>‡ÀWŸê«½t<×ëõápxSúý~«ÕF"‘ˆÍf3Œét !àþP½ÕmiµZ½^ÊàŸÏUÆårétz·Û…¡~ PGÈî|Ø3”ÄáÜ’…uÇq F!¯žL&F¶·†ôÍfßEŽ3™LƒA¿ßÏãñ ;i©TJr’N§?l wE‡Ã±Z­(ŠÎÂéD"ÈÇ£Õj!¡°ÌÜM§ÓÑhÕ–§c:ÖÖÖ¸\.X7ˆJÌ#—ËÍfó­€jµ:›õ1í][[C a¨×ëÁWSàÙl6nÚõf³ ÇÜ|M«Ñï÷³Ù,†a Ê6ï…ã¸D"¦³X,…B!Êå2ÜuÓ:Öjµãããd2Éår8± ¶üîLú«Õj©T* …ba}€¯¨Õj4M.—•¹$hf³Y(óÎ?ðhQ(êçñx‰$ÖëõL&ƒ¢è‚L‘Ëå*•Ê`0€ô'™7­×ëWWW———4m_ D"‘@ ‡U*Õ“'O =ù°)`0†u:ƒÁå+@ f³™ÑhÔjµ8Ž—J¥v»]«Õz½žD"Y’Kív;“É€ã=ÿ±N'•JAš Xáàù{½^&“ÙØØ¸¹v&‰‹‹‹l6k0?~|è• UÐOúâ_0L¡PÀB~}¾<‡3™ Ô©¿šw»]€ÕëuÒ¦‰D®¯¯s¹›Í†(°\.7£Ñ(N{<žZ­6o‰úý¾Ïç;==}ûö-ìùüL“É”Édz½žB¡ä —ËÍŸ’1™L‚Á`(*•J#A?ŸOP‚¾¾¾ž÷[­ÖÕÕU4mµZ€{“!‹F£@ (•J‘H$‰Ìß5›ÍJ‘J¥ètº^¯'ÛÉdâ÷ûý~.—ÛØØØÛÛûá‡z …®®®²Ù,|òæÆì÷ûúé§÷ïß§R)Rö( ä¨I/÷¾Û¶ úí÷û!ÏLÚ¾`0‰Dã{ …Âãñ4F£i6›±XÌëõ.<$áÏÎÎÊåòݺ€Ü>ù™Çb±úý~>Ÿ÷z½`¼i4Z·Û …B>Ÿ¯\.N¸ø0w ŸÏ_]]Ñh4§Ó)‰% …Ž[­Ööö6É"ȲX­V@5óx<‚ äô{½^$¹ººòx<<O«Õ~‘ãà( cᥰFmmm©T*AF£Q"‘dÏp8ÜÙÙ1™L_Äu']e¯× @@bµZ­ëëkŸÏ …„B¡ÅbAQ”DÎ˜Íæõõõ“““‹‹ @z È9 àjµZÝÜÜ´Ùl€1šÍf‘H$ ùý~Ng·Û‡H$jµZ•Jå—_~ ƒ2™Œt¤0Wc2™•Je6›‰Åâñx¬V« Æl6ëv»Ñh4‘HT«U™Lµ¥{e nE„Ýnxf4 …B“ÉÀWIèÚÚšF£ÙÜÜlµZ‡‡‡‡‡‡étúììL$Ú 8Æår9λG‚Æ[¿SÈ`0lll ¯×[,«Õ*“É„T;€¨ètú‡ÚíöWð`E•Ëå›››T*5ƒA‚  ¼AJÀ‹/æ¡ÿ Åf³Á^¯×KFž}À Óét»ÝÛÛÛ_J‘(ŠÕj…—ú|¾L&È”ït:åñxÛÛÛ›››¯^½ú"ÈsR!­V«T*…í‰D*A( —˵½½ív»çë …âÉ“'PEF£°²Á2‹ã8ƒÁØÙÙì-`°F£‘ßï÷ù|Åb0ÞdÈÇf³·¶¶éÙ,µZ éL¨}«Õ¢R©ét:Ðh4xTw´Z-Üe·Û—Ÿ8¦×ëÍfód2 …BÅb‘ÜÐÆår÷÷÷·¶¶^¼x1ÔÐh4·Û sŸÏW( …Œd:R©T»Ýît:Ÿ>} I„»\hEo"H–!­Vk³Ù”JåÇ>EÑÑh„¢è¼u`±X/^¼ …Z­6‘H`ß©×ë-‹Åb©V«F£Ýn/8Ÿ2™Ìjµ>îæhᆰR©l6ìΟÿ»Z­^__ …OŸ>e2™Z­6BÖ ‚“É´µµ¥T*˜H¥R···%‰^¯O$€’#7£šL&›ÍÙÅùÁÐh4E×ÖÖ Ã,&•Ju¹\€p‚ýÀÍf“ÜŒ¢(Š¢v»ýÖè÷Ö¹øäÚkµZE"Ñææ¦ÓéÄ0L¯×§R©N§C§Óa;”Õj…, <7°‹`ccƒÜv‹ DÈ0Nà*A°{<ïíí9Ž…úZ­ÞÜÜl·Û×××dr€%˜Èf©Tªx<žÍfÛíöd2A„ÏçkµZ£Ñ×û“¸\îÁÁAF£1×ëuXða[²Óé¼™Ðf±XÏŸ?W((ŠBQº×ëQ(@ûagÑÂ|q¹\³ÙÜétHí üû¿ÿûü~¥å)—ËA~⢛?H&“À›âáHÀˆ‘Ç_@©¦ßï“gÌgçjµÔT*ÕM`ÐÝW‹Å"ä ôzý|ž<Ø]¯×3™ÌN§E#8ǃÃáÄú޹ äákCYÝq"G:•Óh4özà Š…9 §ú±„ÙsqÇ[æv‡Š”©à|>ÞxG ªÓéH ¾`0pÎɼ†À)½^Ôõ&ë q ų›?¸×ÌßBâ'rÀ]gyç%‘HüÇüÇÕÕÕÆÆÆ¿ýÛ¿­¯¯Ãñ·£Óé\.W$Ý}"G·Û½y"‡P(¼±Óëõ`?©”ÿú¯ÿZrkèÍwß äXþ ?ƒ¿ß¼ëcÿäÕäæß?6¤%YñÉ»>É“ð™>ì½wóç 2ç÷“¥åö€IYP`‡Ã Èç³hú{RÛŽ‘~Ü÷ºü'V|æó?ÿQ_ê»~' Þï'K_g.¾æH~Lý?ßhE+ú?L«CFW´¢?³¯Žç_ÑŠþ¼´:Ø}E+z8= >÷…Cîׯ_¯¦aE+z= >·ZW´¢?Ð üוð”KZ)ðŠVôì?:¼Ê`­hEbZ)ðŠVô'¦ÿPéÛZZ¾¯IEND®B`‚impressive-0.10.3+svn61/site/impressive.html000066400000000000000000001421521214566325400207670ustar00rootroot00000000000000 Impressive Documentation

Impressive Documentation

http://impressive.sourceforge.net/
Version: 0.10.4-WIP
Author: Martin J. Fiedler
Last updated: 2012-02-19

Table Of Contents

  1. Description
  2. Requirements
  3. Installation
  4. Command Line Parameters
  5. Usage
  6. Info Scripts
  7. Other Useful Information

Description

Impressive is a simple presentation program that displays slideshows of image files (JPEG, PNG, TIFF and BMP) or PDF documents. Rendering is done via OpenGL, which allows for some “eye candy” effects.

Requirements

The following software packages are required or recommended to use Impressive:

Debian users can install all these packages at once by typing
aptitude install python python-opengl python-pygame python-imaging xpdf-reader gs pdftk xdg-utils mplayer

Windows users can download a “batteries included” ZIP file containing all necessary libraries instead of the standard source code distribution of Impressive.

In addition to these software requirements, the following hardware requirements exist:

  • a moderately fast graphics accelerator card or chip with hardware OpenGL support (GeForce2- and i810-level hardware is sufficient)
  • a fast processor (numerical calculations in Python are really slow, so the CPU clock should be well above 1 GHz)
  • a lot of free disk space (depending on the length of the presentation being shown)

Installation

The installation procedure differs between Windows and Unix-like systems.

Generic Installation

After installing the prerequisites mentioned in the last chapter, extract the file impressive.py from the downloadable archive. You can either start it directly or copy it to some location in your $PATH (~/bin or /usr/local/bin are good candidates).

To start a presentation, simply type something like
impressive.py demo.pdf

Windows Installation

Download the ZIP file of the Windows version and extract it into a folder of your choice. There is an executable file called impressive.exe in this directory. You can either directly drop PDF files or directories containing image files on this .exe in Explorer, or you install a link to impressive.exe in your “Send To” Menu (usually C:\Documents and Settings\YourNameHere\SendTo on Windows XP or shell:sendto on Windows 7). Using the latter method, you can start a presentation by right-clicking a PDF file and selecting “Send To / Impressive”.

MacOS X Installation

On OS X, an update of the Python version that came with the operating system may be required, as well as an installation of the PyGame, PyOpenGL and PyObjC packages. Prebuilt packages for this purpose are available at http://pythonmac.org/packages/. Xpdf, GhostScript and pdftk for the Mac are available via Fink (packages xpdf, ghostscript, ghostscript-fonts and pdftk).

Prebuilt Packages

Some Linux Distributions are already including Impressive into their standard package repositories. For example, if you are using Debian or Gentoo, you may succeed installing the program with a mere apt-get install impressive or emerge impressive. However, note that these packages are not mainained by the program's author and may be outdated.

Command Line Parameters

When used from the command line (some terminal and shell in Unix, cmd.exe on Windows), Impressive accepts a range of command-line options in GNU getopt syntax.

The following options are available (in alphabetical order):

-a <seconds> or --auto <seconds>
Automatically advance to the next page after the given number of seconds. Together with the -w option (described below), this can be used to create automatic slideshows.
-A <X>:<Y> or --aspect <X>:<Y>
Specifies the display aspect ratio. Normally, Impressive assumes that the pixel aspect ratio is 1:1 (square pixels), regardless of the display resolution that has been set up. If a resolution has been selected that doesn't match the display's aspect ratio, the screen will be distorted. To overcome this, this option may be used to manually specify the display aspect ratio, e.g. »-A 16:9«. Note that this option has no effect if Xpdf is used for rendering.
-b or --noback
Disabled background rendering. By default, Impressive will pre-render all pages in a separate background thread while the presentation runs. If this option is specified, it will instead render all pages immediately on startup. This option has no effect if caching is disabled (--cache none, see below).
-B <ms> or --boxfade <ms>
Sets the duration (in milliseconds) of the highlight box fade-in/fade-out animation. Default value: 100 ms.
-c <mode> or --cache <mode>
Specifies the page cache mode to use. Valid options are:
none
Disables page caching altogether, only the current and the following page will be kept in RAM. Jumping between pages will be very slow, because Impressive will need to render the requested pages on the fly. In addition, the overview page won't be complete until every page has been shown at least once.
memory
Caches all page images in memory. This is the fastest method, but it requires very large amounts of memory (about 3 MiB per page at 1024x768 resolution).
disk
Like above, but uses a temporary file rather than memory for storage. This is the default.
persistent
Uses a permanent cache file for caching. This file will not be deleted when Impressive quits and will be reused on subsequent invocations. The default name for the cache file is derived like the names for Info Scripts (see below for an explanation), but with a .cache file name extension instead of .info. This method is a little bit slower than disk mode, but the time span until the overview page is fully populated will be significantly decreased if Impressive is ran again with the same input files and options.
The mode name may be abbreviated at will, down to one character. Thus, --cache persistent, -c persist and even -cp are all synonyms.
-C <filename>[:<X>,<Y>] or --cursor <filename>[:<X>,<Y>]
This option can be used to specify the path to an image file (typically a transparent .png) that shall be used as the mouse cursor instead of the default one. Optionally, the hotspot may be specified (this is the position inside the cursor image where the real mouse position is located). Example: --cursor mycursor.png:2,4
--clock
If this option is enabled, the current time will be shown instead of the elapsed time if time display is activated with the T key. Compatible with the -M option.
-d <time> or --duration <time>
Specifies the expected run time of the presentation. The time parameter can be either a number of seconds or a human-readable time like 1:23 (1 minute and 23 seconds), 4:56h (4 hours and 56 minutes), 3m45s (3 minutes and 45 seconds), 5m (5 minutes) or 1:23:45 (1 hour, 23 minutes and 45 seconds).
If an expected duration is specified, Impressive will show a semi-transparent green progress bar at the lower edge of the screen, indicating how much time has already passed. If the time is up, the bar will occupy the whole edge and fade to yellow (at 125% of the expected time) to red (at 150% or more).
-D <ms> or --mousedelay <ms>
Sets the time (in milliseconds) the mouse cursor is shown in fullscreen mode if it is not moved. Default value: 3000 ms.
-e or --noext
OpenGL normally only supports textures with power-of-two dimensions. This means that for a 1024x768 screen, the actual texture size will be 1024x1024, for 1600x1200 it will even be 2048x2048. To overcome this limit and save texture memory, Impressive will automatically use the OpenGL extensions GL_ARB_texture_rectangle (available on most graphics cards) or GL_ARB_texture_non_power_of_two (available on modern graphics cards with current drivers). If these cause any trouble, the -e option may be used to prevent Impressive from using the problematic extensions.
-f or --fullscreen
Toggles fullscreen mode. By default, fullscreen mode is activated, and can be deactivated using this switch.
Note: On Windows systems, toggling fullscreen mode while Impressive runs does not work. So, this option is the only way to set whether fullscreen mode shall be used or not.
-F <file> or --font <file>
Impressive uses some kind of text OSD to overlay the current page number and title (if available) on the overview page. This option can be used to specify a TrueType font file (.ttf) to use for the OSD. If the path specified doesn't directly point to a useable font file, Impressive will try to search the system font directories. On Unix-like systems, it assumes that all fonts are stored below /usr/share/fonts, /usr/local/share/fonts or /usr/X11R6/lib/X11/fonts/TTF for this purpose (the latter one is useful for Mac OS X systems specifically). If this option is not specified, Verdana.ttf will be used as a default if the operating system is Windows, or any of DejaVuSans.ttf or Vera.ttf (the typical file name of Bitstream Vera Sans) if it's not.
-g <width>x<height> or --geometry <width>x<height>
Sets the screen size or resolution Impressive shall use (in pixels). On Win32 platforms and Unix platforms with xrandrinstalled, the default screen size for fullscreen mode is the current screen resolution; on other platforms, Impressive uses the highest resolution available to the graphics system. If a standard resolution cannot be determined, the default is 1024x768 pixels. Note that this option is not the standard X “geometry” option and does therefore not support window positioning (e.g. -g 800x600+0-0 will not work!).
-G <gamma>[:<blacklevel>] or --gamma <gamma>[:<blacklevel>]
Sets up the startup gamma and (optional) black level value. The black level is the original image's intensity level (0...254) that is to be mapped to black in Impressive's output. Note that gamma and black level adjustments may be unavailable or constrained on some systems.
-h or --help
If this option is specified, Impressive writes a short command line help screen to standard output and does not start a presentation.
-H or --half-screen
This option makes Impressive show the overview page and OSD elements on the right half of the screen only. The overview page will only show the left half of the slides as previews. Using a multi-monitor setup with a wide virtual screen and specially crafted slides (e.g. those that can be generated with LaTeX's beamer class), this makes it possible to have presenter's notes on the second screen.
Note that transitions and animations are still operating on the whole screen, making some of them (like PagePeel) look ugly. Impressive also disables the overview zoom animation in half-screen mode; it can be re-enabled by explicitly setting it to another value with a later command line option (--zoomtime).
Another limitation is that the allocation of the screen halves (slides left, overview right) is fixed.
-i <page> or --initialpage <page>
Specifies the page number to start with. The default value is 1 (start with the first page). If another value is specified, the page shown by Impressive right after initialization is not the first one of the PDF or image list. Additionally, pre-rendering (if enabled) will also start at the specified page.
-I <filename> or --script <filename>
Overrides automatic derivation of the info script filename and specifies a script file directly.
-l or --listtrans
If this option is specified, Impressive writes a list of all available transition classes to standard output and does not start a presentation. Transitions that are enabled by default are marked with a star (*) left of the class name.
-L <spec> or --layout <spec>
Specified the OSD layout. Read below for an explanation of this option
-M or --minutes
If this option is set, Impressive will show the on-screen timer (activated with the [T] key) only with 1 minute resolution. By default, it will show a timer with 1 second resolution.
--nologo
This option disables the Impressive logo and version number display. Instead, the loading screen will be just black or, if background rendering is disabled, only the progress bar will be visible.
--noclicks
If this option is enabled, switching to the previous or next page with the left and right mouse buttons is deactivated. The keyboard shortcuts are unaffected from this.
-o <directory> or --output <directory>
Do not display the presentation, but render it into a series of PNG image files inside the specified directory. The images will be generated in the current resolution as specified by the -g option. This option is useful if you're going to give a presentation on a foreigh PC with an old, broken or otherwise problematic Xpdf or GhostScript installation: By generating images of the PDF pages you can ensure that no rendering bugs will happen on the target system.
-O <mode> or --autooverview <mode>
Enables or disables automatic derivation of whether a page shall or shall not be shown on the overview page. This feature is based on the fact that some LaTeX presentation packages tag all pages with a title (that can be read by Impressive with the help of pdftk), except those that contain multiple reveal steps.
The following modes are available:
off
Disables automatic overview mode. All pages will be shown on the overview page by default. This is also the default setting.
first
All pages with a PDF title will be shown on the overview page. The purpose is to show the initial state of multi-step slides on the overview page.
last
All pages before a page with a PDF title will be shown on the overview page. The purpose is to show the final state of multi-step slides on the overview page.
Again, the mode may be abbreviated arbitrarily, down to one character, just like with the -c option above..
-p <start>-<end> or --pages <start>-<end>
Using this option, the range of the page displayed can be narrowed down. The presentation will start at the first page in the range. All pages outside of the range will not be shown on the overview page and will not be cached. However, they can be entered manually when cycling through the presentation. Due to the fact that these pages are uncached, preparation of the display will take considerably longer.
-P <path> or --gspath <path>
This option can be used to override the Xpdf / GhostScript path autodetection. The full path to the executable of either GhostScript (gs or gs.exe) or Xpdf's pdftoppm utility must be specified.
-q or --page-progress
If this option is enabled, Impressive will show a light-blue semi-transparent progress bar at the lower edge of the screen that shows the position inside the presentation, i.e. the relation between the current page number and the total number of pages. Note that this progress bar will not be shown if the duration progress bar (-d option) is also enabled.
-Q or --autoquit
If this option is specified, Impressive quits automatically when trying to navigate to the page after the last page or the page before the first page.
This option does not have any effect if --wrap is used.
-r <n> or --rotate <n>
Display all pages rotated by n×90 degrees clockwise. Try -r 1 or -r 3 if you run into problems with PDFs generated by LaTeX on some Xpdf or GhostScript versions.
-R <X>x<Y> or --meshres <X>x<Y>
Most effects subdivide the visible screen into a mesh of rectangular or quadratic pieces, each with its own coordinates and alpha blend values. Using this parameter, the resolution of the subdivision mesh can be defined. The default value is 48x36. On slow machines, lower values like 24x18 or 12x9 can heavily speed up transition rendering at the cost of visual quality. On the other hand, higher values like 64x48 or 96x72 improve quality, but use much more CPU cycles.
-s or --scale (image input only)
If a directory with image files is used as input, Impressive will scale down images that are too big for the screen. But by default, it will not scale up smaller images to fit the screen; it will leave a black border instead. This option overrides this setting and enables upscaling of smaller images.
-s or --supersample (PDF input only)
This switch enables antialiasing by 4x supersampling instead of the normal multisampling method used by Xpdf or GhostScript. While this usually degrades both visual quality and performance, it may be necessary for circumventing white strips or moiré-like patterns in gradients.
-S <pixels> or --fontsize <pixels>
This option sets the size, in pixels, of the OSD font. The default value is 14.
--spot-radius <pixels>
This option sets the initial radius of the spotlight, in pixels. The default value is 64.
-t <ms> or --transition <trans1[,trans2...]>
Using this switch, the set of transitions Impressive will randomly draw at page changes can be specified. If only one transition class is specified, this class will be used for all pages that do not have another transition explicitly assigned in their page properties. Multiple transitions have to be separated by commas; they will be used in random order. The -l option can be used to get a list of available transitions.
-T <ms> or --transtime <ms>
Sets the duration (in milliseconds) of page transitions. 0 (zero) disables transitions altogether. Default value: 1000 ms.
-u <seconds> or --poll <seconds>
If this option is specified, the source file or directory will be checked for changed regularly. If a change in the input PDF file or any of the image files in the input image directory is detected, the page cache will be flushed and the current page as well as the info script will be reloaded. The current page's transition will be shown between the old and the new version of the page.
The new PDF file must have at least as much pages as the old one; also, it should have the same aspect ratio. If the input is a directory, image files must not have disappeared.
-V <pixels> or --overscan <pixels>
PDF files often contain tiny amounts of white borders around the edges which look bad in screen presentations. To eliminate this problem, Impressive uses »overscan«: PDF files will not be rendered to fit the screen size exactly, but they will be rendered a bit larger so that the (possibly broken) borders can be cropped off. The amount of overscan, in screen pixels, can be set with this option. The default value is 3 pixels, which should remove borders in most presentations at most common screen resolutions without cropping the pages too much.
-w or --wrap
If this option is set, Impressive will “wrap” over to the first page after the last page. In other words, advancing to the next page at the end of the presentation will restart the whole presentation.
-x or --fade
This option enables a smooth fade-in effect at the start of the presentation and a fade-out effect just before Impressive quits.
-X or --shuffle
If this option is enabled, the input files will be shuffled into random order before starting the presentation. The individual pages of PDF input files will stay in their original order, though, so this option is mainly useful for image presentations.
-z <factor> or --zoom <factor>
Sets the zoom factor that is used in zoom mode. It must be an integer value of at least 2. The default value is 2. Note that it might not be possible to get high-quality zooming for large zoom factors due to hardware restrictions.
-Z <ms> or --zoomtime <ms>
Sets the duration (in milliseconds) of the overview page zoom-in/zoom-out effects. Default value: 250 ms.
--cachefile <filename>
Activates persistent cache mode and specifies the name of the cache file to use.

Following the options, the input file name(s) must be specified. Recognized file types are PDF, JPEG, PNG, TIFF, BMP and PGM/PPM. If the name of a directory is put on the command line, all recognized image files (no PDF files!) in this directory will be played in alphanumeric order (case-insensitive).

In addition, Impressive can use a text file containing a list of files or directories to show: This text file must contain at most one file name per line; every character after a hash sign (#) is treated as a comment and will be ignored. If such a comment is put on the same line as an image file name, it will be used as the page's title. List file names must be prefixed with an at sign (@) on the command line, e.g. impressive @my_list_file.

Impressive will also expand wild-card characters (* and ?) if this isn't already done by the shell, but apart from that, it will not reorder the arguments. Thus, it will show the documents in the order specified at the command line.

Layout options

The OSD layout option (-L/--layout) accepts a string with comma-separated key=value pairs. The following keywords are recognized:

alpha
The opacity of the OSD text, either as a floating-point value between 0 and 1 or a percentage between 2 and 100.
margin
The distance (in pixels) of the OSD text to the screen borders.
time
The position of the timer.
title
The position of the page title in overview mode.
page
The position of the page number in overview mode.
status
The position of the status line.

The position specifications are composed by one character that indicates whether the text shall be displayed at the top (T) or bottom (B) edge of the screen and one character that indicates whether it shall appear on the left (L), on the right (R) or centered (C).

For example, the default OSD layout equals the following option string:
-L margin=16,alpha=1,time=TR,title=BL,page=BR,status=TL

Usage

On startup, Impressive will display a black screen with the program logo at the center. If caching is enabled, but background rendering is disabled, all pages of the presentation will then be rendered once. A bar in the lower half of the screen displays the progress of this operation. Any key (except for Q and Esc) or mouse click skips this process, with the effect that Impressive will render the remaining pages on demand. Please note that the overview page will not be complete until every page has been rendered at least once. In other words, if the precaching process was skipped, placeholders will be displayed for all pages that have not been rendered yet. By default, Impressive will build up the cache in the background while the presentation runs. Thus, the progress bar will not appear and the preparation will only take the amount of time required to render the first two pages of the presentation.

After this initialization process, Impressive will switch to the first page directly and without any transition. The following keyboard and mouse operations are available from this moment on:

Q key or Esc key
Quit Impressive immediately.
LMB (left mouse button), Page Down key, Cursor Down key, Cursor Right key or Spacebar
Go to the next page (using a transition).
RMB (right mouse button), Page Up key, Cursor Up key, Cursor Left key or Backspace key
Go to the previous page (using a transition).
Home key / End key
Go directly to the first or last page of the presentation.
L key
Return to the last (most recently displayed) page. This can be used to toggle back and forth between two pages.
F key
Toggle fullscreen mode. Unfortunately, this does not work on Windows systems.
Tab key or MMB (middle mouse button)
Zoom back to the overview page. While in overview mode, a page can be selected with the mouse and activated with the left mouse button. The right or middle mouse button or the Tab key leave overview mode without changing the current page.
LMB over a PDF hyperlink
Jump to the page referenced by the hyperlink. Two types of hyperlinks are supported: Links that point to some other page of the same document, and URL hyperlinks like Web links and e-mail addresses. This feature is only available if pdftk is installed. Furthermore, xdg-open from the freedesktop.org Portland project is required for URL links on non-Win32 platforms. Please note that the hyperlink feature will not work properly when pages are rotated.
click&drag with LMB (left mouse button)
Create a new highlight box. While at least one highlight box is defined on the current page, the page itself will be shown in a darker and blurry rendition. Only the highlight boxes will be displayed in their original lightness and sharpness.
If a page with highlight boxes is left, the boxes will be saved and restored the next time this page is shown again.
RMB (right mouse button) over a highlight box
If the right mouse button is clicked while the mouse cursor is above a highlight box, the box will be removed. If the last box on a page is removed, the page will turn bright and sharp again.
S key
Save the info script associated with the current presentation. The main purpose for this is to permanently save highlight boxes or keyboard shortcuts, so they will be restored the next time this presentation is started.
T key
Activate or deactivate the time display at the upper-right corner of the screen. If the timer is activated while the very first page of the presentation is shown, it activates »time tracking» mode. In this mode, a report of all pages visited with their display duration, enter and leave times will be written to standard output. This can be very useful when preparing presentations.
R key
Reset the presentation timer.
Return key or Enter key
Toggle spotlight mode. In this mode, the page is darkened in the same way as if highlight boxes are present, but instead of (or in addition to) the boxes, a circular “spotlight” will be shown around the mouse cursor position, following every motion of the mouse cursor.
+ key / key or mouse wheel
Adjust the spotlight radius.
Z key
Toggle zoom mode. When this key is first pressed, the current page will zoom in. The page will be displayed at double size, but in its original resolution (i.e. it will be blurry). Impressive will re-render the page at the new resolution if the graphics hardware supports it. During this time, Impressive will not accept any input, so don't even think about clicking the mouse or pressing keys before the image gets crisp again.
In zoom mode, all other functions will work as normal. Any operations that leave the current page, such as flipping the page or entering the overview screen, will leave zoom mode, too.
[ / ] key
Adjust the gamma value of the display (might not be supported on every hardware).
{ / } key
Adjust the black level of the display (might not be supported on every hardware).
\ key
Revert gamma and black level back to normal.
O key
This will toggle the »visible on overview page« flag of the current page. The result will not be visible immediately, but it can be saved to the info script (using the S key) and will be in effect the next time the presentation is started.
I key
This will toggle the skip flag of the current page. A page marked as skipped will not be reachable with the normal forward/backward navigation keys.
B key / W key
Fade to black or white, respectively. This feature can be used if a whiteboard or blackboard in front of the projection area is to be used during the presentation. Using these two keys, the screen will fade into a solid color. On any keypress or mouse click, it will fade back to normal. These keys are not available in overview mode.
click&drag with RMB (right mouse button) in zoom mode
Move the visible part of the page in zoom mode.
Cursor keys in overview mode
Navigate through pages.
Alt+Tab keys
Leaves fullscreen mode on Unix-like systems to facilitate task switching while running full-screen presentations.

Any other alphanumeric (A-z, 0-9) or function key (F1-F12) can be used to assign shortcuts to pages that require quick access. If one of the keys is pressed together with Shift, the currently displayed page is associated with this key. To recall the page later, it is sufficient to press the shortcut key again. Shortcuts can be permanently stored with the S key.

Info Scripts

Impressive offers a powerful way to customize individual presentations using so-called info scripts. An info script is a text file having the same name and located in the same directory as the presentation file itself, except for the additional suffix .info. Thus, a presentation file called BrandNewProduct.pdf would have a info script with the name BrandNewProduct.pdf.info. If multiple arguments were specified on the command line, the info script will be called just .info (a dot file, so to speak). If a directory name was specified as the only argument, either a file called DirectoryName.info or a file called .info inside the directory will be used, depending on whether a path separator was specified at the end of the directory name or not – Impressive simply appends .info to whatever the input path name was.
In any case, the default file name can be overridden by the -I command line option.

Info scripts are actually Python scripts with full access to Impressive's global data structures and functions. (It is possible to write real interactive applications using info scripts.) Thus, they can modify a broad range of settings concerning Impressive. This manual will only cover the most basic ones.

Page Properties

The main part of an info script defines the properties of each page. At the moment, the following properties are defined:

title
Each page can have a title that is displayed in the Impressive window's title bar. If there is no title explicitly specified in the info script, the title of the page will be extracted from PDF metadata if pdftk is installed, or the image file name will be used if the presentation is an image slideshow.
transition
With this property, the transition class to be used for rendering the transition between this page and the following page can be specified. For pages lacking this property, random transitions will be chosen. A list of available transition classes can be obtained with impressive -l.
transtime
This property overrides the global transition time parameter (-T at the command line). It contains the integer time (in milliseconds) the transition between this page and the following page shall be shown.
overview
This property holds a boolean value (0/False or 1/True) that specifies whether the page shall be included in the overview page. If this property isn't specified, it is assumed to be True.
skip
This boolean property can be set to 1/True if the page shall be skipped during the presentation.
Pages with overview:True, skip:False will be accessible both by cycling through the pages and using the overview page,
pages with overview:True, skip:True will be silently skipped in the normal page cycle, but remain accessible from the overview page,
pages with overview:False, skip:False will appear in the normal cycle, but not on the overview page
and pages with overview:False, skip:True will not be accessible at all.
boxes
This property stores a list of highlight box coordinates. Normally, there is no need to edit this by hand, as Impressive handles this automatically if the S key is pressed.
timeout
If a timeout property is present and the page is shown, Impressive will automatically switch to the next page after the specified number of milliseconds. Normally, the timeout will only be effective the first time the page is shown unless wrap mode is used (command-line option -w or --wrap). This restriction makes it possible to create self-running presentations with individual per-page timeouts.
comment
This property can hold a string with a single line of text that will be displayed on screen while the page is shown. Display of this text can not be disabled.
sound
Specifies the file name of a sound file to be played (via MPlayer) when the page is first entered. Once started, the sound will be played until its end is reached, another sound or video is played, or Impressive is exited.
video
Specifies the file name of a video file to be played when the page is first entered. The video will be displayed full-screen. Any key or mouse click stops playback, except the cursor keys, which are used to seek in the video file, and space, which can be used to pause playback. Note that this function is highly experimental and might not work reliably on every system!
always
If this property is present and set to 1 or True, the media file specified in the sound or video properties will be played every time the page is entered, not just the first time.
progress
If this property is set to zero, the presentation progress bar (which is usually set up with the -d/--duration command line switch) will not be shown on this page. In practice, it might be useful to hide the bar from the first page so that it is not visible during the introduction.
reset
If this property is set to 1 or True, the timer will be reset each time this page is left, just as if the R has been pressed. If the special value 2 or FirstTimeOnly is used, the reset will only take place if the page was shown for the first time. Again, this is particularly useful on the first page: A combination of progress:False, reset:FirstTimeOnly makes it possible to set up the presentation long before it actually begins – the first page can be showed as long as desired, actual timing starts at the second page.
rotate
This property is a per-page override of the global -r command line option: It specifies how the page shall be rotated, in 90-degree steps clockwise.
OnEnter, OnLeave, OnEnterOnce, OnLeaveOnce
These properties can contain a Python callable (i.e. a function reference or lambda expression) that is executed when the page is entered or left. The ~Once variants will only be executed when the page is entered or left for the first time. The callable must not take any arguments. This feature can be used to associate arbitrary Python code with specific pages, for example to execute external programs.
Warning: Lambda expressions cannot be properly processed by the Info Script save function (S key). If Impressive encounters lambda expressions when saving, it will remove them. In addition, it will not overwrite the original info script, but generate an extra file that needs to be merged withe the original script by hand.
keys
This property can be assigned a dictionary that maps alphanumerical keys to Python functions. For example, 'keys': { 'x': SomeFunction } will invoke SomeFunction() if the lowercase character 'x' is typed while the page is displayed. Regarding the functions, the same restrictions as for the OnEnter/OnLeave family apply: the function must not take any parameters and lambda functions can not be saved. Also note that it is not possible to overwrite Impressive's pre-defined key bindings with this method.

The properties are stored together in a Python dictionary called PageProps. The syntax looks like in this example:

PageProps = {
  1: {
       'title': "Title Page",
       'transition': PagePeel,
       'sound': "background_music.mp3"
     },
  2: {
       'title': "Another Page",
       'timeout': 5000
     }
}

The PageProps definition (and only the PageProps definition) will be rewritten by Impressive if the S key is pressed. User-defined PageProps entries will also be left untouched, except for some pretty-printing.

Global Presentation Properties

The name of the presentation is shown in the title bar of the Impressive window (if not in fullscreen mode). By default, the file name or (if available) PDF metadata title will be used for this purpose, but the presentation title can also be explicitly set by overwriting the DocumentTitle variable:
    DocumentTitle = "My Presentation"

Another useful variable, AvailableTransitions, contains a list of all transition classes that may be used for randomly assigning transitions to pages lacking the transition property. Thus, if you want to exclude a certain transition (either because you don't like it or because you want to have it exclusively on pages where you manually assigned it using PageProps), you can write something like
    AvailableTransitions.remove(WipeBlobs)
On the other side, it's possible to activate transitions that are not enabled by default:
    AvailableTransitions += [SlideUp, SlideDown]
Alternatively, you can completely overwrite AvailableTransitions to have the same transition (or set of transitions) assigned to all pages:
    AvailableTransitions = [Crossfade]

Option Overrides

Another use of info scripts is overriding the default or command-line settings on a per-file basis. This can be done by simply overwriting one of the variables that are defined at the beginning of impressive.py. Each of these variables corresponds either to a command-line setting, or to some constant related to visual appearance or performance. So, for example, to force fullscreen mode for a presentation, write
    Fullscreen = True

Other Useful Information

Useful Third-Party Tools

Rob Reid has written a Perl script that extracts transition information from special comments in LaTeX beamer source files and generates a Impressive info script from the gathered information: gettransitions.

Joel Berger has written a similar tool called makebeamerinfo.

License

Impressive is free software; you can redistribute it and/or modify it under the terms of the 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 any particular purpose. See the GNU General Public License for more details.

Contact

You can always contact the author of Impressive to send him ...

  • bug reports
  • feature suggestions
  • fan mail
  • corrections regarding the web page (I'm not a native speaker – any grammatical, ortographical or stylistic corrections or suggestions are welcome!)
  • new silly quotations for the web page's title bar :)
impressive-0.10.3+svn61/site/index.php000066400000000000000000000074041214566325400175330ustar00rootroot00000000000000

The stylish way of giving presentations

Impressive is a program that displays presentation slides. But unlike OpenOffice.org Impress or other similar applications, it does so with style. Smooth alpha-blended slide transitions are provided for the sake of eye candy, but in addition to this, Impressive offers some unique tools that are really useful for presentations. Read below if you want to know more about these features.

Creating presentations for Impressive is very simple: You just need to export a PDF file from your presentation software. This means that you can create slides in the application of your choice and use Impressive for displaying them. If your application does not support PDF output, you can alternatively use a set of pre-rendered image files – or you use Impressive to make a slideshow with your favorite photos.

Technology

Impressive is written in Python, a feature-rich interpreted scripting language. Python is available on numerous platforms. Because of this, Impressive works with most operating systems, including Microsoft Windows, Apple Mac OS X, and of course Linux.

Xpdf (preferred) or GhostScript are used for PDF rendering, and OpenGL enables hardware acceleration support required for the various graphical effects in Impressive.

Features

As stated above, Impressive contains some unique features that come in handy when giving presentations:

Page transitions

The page transition effects aren't exactly useful, but they are nice to watch and provide a moment of relaxation for both the audience and the presenter :)

Overview screen

Imagine the following common situation: After you finished your presentation, the audience puts questions, and you need to go back to a specific slide to explain some fact in more detail.

In Impressive, you just have to hit the [Tab] key and the current slide will smoothly zoom out, revealing a thumbnail grid of all pages. Now you can select one of the pages, click on it, and watch it zoom back in.

Highlight boxes

Maybe you want to focus the attention of your audience on a specific part of the current slide. To accomplish this, you can drag a rectangle on the screen while holding down the left mouse button. After releasing the button, the screen will get dark and blurry – except for the part you just selected.

You can set up multiple highlighting boxes per page. To delete a box again, just right-click on it. Once the last box has been deleted, the whole page will become bright and clear again.

If you leave a page that has boxes on it, the boxes will automatically be restored if you re-enter the pager later. By pressing the [S] key, you can even save the box positions to disk and reuse them the next time you start the presentation.

Spotlight effect

The highlight boxes are already a nice thing, but there are maybe situations where you want to have a somewhat more “dynamic” highlighting. So try to press the [Enter] key: a highlighting circle will appear and follow the mouse cursor as you move it.

You can adjust the size of the spotlight using the [+] and [–] keys.

impressive-0.10.3+svn61/site/logo.png000066400000000000000000000064071214566325400173630ustar00rootroot00000000000000‰PNG  IHDR Pœ½÷)sRGB®Îé ÁIDATxÚíœëWgÇ?CBÜ ŠVT*V«RQÛÚªxZÛÚ‹íîž³g÷ïÛ³ïöôìöô¶µõ²õîÚÑ¢ØVP+H @.2ɾx&3Ï33Z³§èÉóçú\¾óý}—™¨•©·•ZC‚:@u€êÕªT¨P z«T¨öÍû”®«|ïÑtº5º«íq;ÒžÎd5jZ,¯¿¿nbníì´A¤áLš¾;ÿà3ÿ¨²Uº_S *ž™€¾ƒO<@÷¬ÍtMôýpçÎD›RMºgïþ •èYk;\S€ÊÒß'¸eùÔÀ¦Ç诘Ëår9ý÷hAÚÕT¤Rзý1ú»6 p´g½ÔP[€¼o&ÒíÑÇé/S“Çö˜mÑÚ j5N5::¯?PpݘØc?ªGÒå,@àwÎð–j§Ñµ([^¢`m¶¯3€Ö…±lmv®[€ Ùåß%,V;£/V Ïòù 7ÿ}X,®"Ò y€8¶¸Ðê9ìlv)îòI½M¥Òz´­]EXd>ùo¦uðF6õØÉTšh ËãéB$·À»Ÿ)àÅ;ž±cp+™Ê–½áhd£ª)S?§Ry‘HÛf+@‚@³^u*³šé±Kc‰Å’‰Ç6ª˜*õ ¯&Nˆ"ÓÆŽw‚þÓèM¶V¦pç–p‘#JTpúº4mÛ€_­|Ðs~úv ÿ¡¢^W~1/Úüj£ü`ï|o’DÛúb«åÍ¿½kn7÷o3Uùoæá#[>Êþ¿*ÙÚ€-GŒ]1ü‡6Ve¢ æÎÌùTÅ;œËî9ÛÅŠÎöêVGòâî½wbü‚ráè5‰ÞãsG#–mLHýý<¶mO@l?:%Ý’»|³¿WsHP±,ÏȾã:€fTÓ²'%ºžÚ½Ws× á£›½’µøšú<%õ;”®žµü„~9¿@?9á´Á0ÉóÊUß]VÌ?õ™5ã搜þÛpUçTÅÈ^q8±0ÛMËYù,Àa°™/&•žn|UvHñÑKË¡òùë²–¾…â—·E¼nm?I˜§c÷à¾Í‹§g†O+éÚРÂÂ1¡%ÅK•2ÅäˆCKÅ?—z^rH ‚Ã3 sÈ~iôäëh1ƼãnbiÙÂÄNëÙû@û–MMÓWS“:§@Û Ís—“£{+ŠñËYž«œ<¿ ó¾×6Fà´²º»㦗6y('ÎgÌíF‰Êв MÉÄTκgn€–ÑÒTbFg¦Í£« Ÿ³¤Ÿjºy K7F†¶øÜRÒ±s¿ô÷kÐýîG@4: þƒ=@ìí,¥ŒñêàÁÙ’1±ÿ̇—ÆRCûÕ1|W“@Sw`b`ñЏ|Ðhï•®÷úÊsž·ãбƒÌðO•Ž’‚"Ç<°}òZÊ ƒA í `V¯xº²¬@CóÚ`pCmç¥áýn&¦”®°ÖìE À· €s ø®Èַʳp¾dË|ƒb†£¦*ò…{|ï/‡÷øóp¡Ð2hø;ÿ€Â°˜F`—!ôÁ×Þ‰ÊnšÃbÍž x 96Vš3 4°5ø€½•úCo7À­7€ÒN'Íïm0¶Oò7¤d:âÒò¹MöTõe  8êqÿ±@`LMhGÍx ³@ÔÝÅ¢,ŸÖqâ@£uÂ0×±ûÃg5»Hw!dÚ˜J 2@÷ns„~€Òô„ïMs¹•Ét¿ÝdF‘p{Šƒ­öL#"”$aÈ{̺HHþƘÍ9§$ ŠðÚÎãÖ‰ü#ëDëë}vÙª¨ôX  70'Ø‹R=Ãc®TÎø}òR<¯[q áUÃG=¶¬ÐPæ•>È¡¡(¥’íˆGö¾t¡±V=kqô¾*ø$ò~Ÿwœp(Ð"1¨<,¹0ñtbqûèi‘^(IÊ´ÃR²'\ˆÿF{eÊpké¥íâ&%—x‹@¶¢ƒv[_f‡<{l'^;ƒB« áÄÌXÂkËšoê ­jLTr‘ª­åÍBÔìçô0l,õÉÍ,}>d ´°-`è×›Xµ0H“-/©ëuÞ4%ªê[ª÷jì.gWEÈ;QbN³Å…,”Φ*)û¸r•õJݳÛnàsµÐ ã)^ÞÕ‰É *]FÊ «$®r/¬^—å¡WŒÉ»òÚCVïÃ~Wii3gÞ'©·ø¶a,U¥¬«dEÅ•Á¼_åÄŒ›¬×Jú1ÛÞðJ ?ô³Zšgò4€~ý_Ò{¤N+"˜>wjÑþî¢ÅJ>…1*]6´»O@éª-Wùï˜ Q¤¯äòùµ81Û!Á1ë¦ÜIñ¦+ôÒ "ݾËòóΞ=Y˜/çN“WC†6‘"üò±åØ“¾V@— pÆ)BÀvåÅà&~”ýøÏ‘ Ó‹­&A«çêúȰs=ƒ¬Ä #_ŸûØŒgõ7uÑÏ06¹o“`Q˜aÔ8Q¸8¾·]MšÇ—eÿ¾äg—rtSkàâÌ 3WfäuzWx¥±&'fƒZtʹ¥Ô/FÀ¯½ÖÆÊõ=Xür{w[kqf:‘(T’¡Y€¥ cÝÏ”fnŠÒu(ÏLLøžénώݳLµ) Y^Ì  í¶7˯} ÀG;Û¢ÞLb:1øý5aP ¡U½bD}å=ºÁÒlññÇ®ˆ‡?æ5:ŠÏ¤@HòþåéióåÛ! ÈŽÂ=³̈ßss\"T\¼»mƒwíº)f­±öe6üª@Z‰ñŒÚ…æ(È+iÔIYª|<xËÌ4 |¢m‡¶Ù¿ ÛÑ|3b÷ƇÄJ¤—ÛC.‘ÐvGR3Ðgº® > [\ZÅÄôÅ*^>è,ÂYôéÿSûÊV*ZûqÛZ‚‡O44¿z¢[9Ñcä¤ÝTL¥±bÈ¡fÁb?N€¼»ƒkw«OA{î;¨bbž€ËÎZ hvµôìRí½ú×UáG†­×}~‹8Ñ7^3=Sà³–­õm½1b–7½lε/t! °cÀñù%ð¼[V<°ùªTYìÙ«$æç/ºU°¶íH‡4å[‡@Ce-úß­²©©9¶1∾ÔÔVœx0—Ë7GÂáH›M¥’³ÉY=‰nQ [¥¹Ùdr>‰v(4Óg’Km1g®t©¬í¯’¸§îO.æÊ¡H8µÝX»ß‹Í °áOW«Ý'xéªT¨šç«ÄZ|T :@k71­PµfD’ u€ª´õñ#„u ÐSêÄjÐúø•FAO:ƒêÕú­´.~j¸ŽzZ½üÓúßã¬ÇT£P zsiÿ‹.Y¨SÔFIEND®B`‚impressive-0.10.3+svn61/site/manual.php000066400000000000000000000007671214566325400177060ustar00rootroot00000000000000

Impressive Documentation

",@fread($fd,1024*1024)); @fclose($fd); $data=explode("",$data[1]); echo $data[0]; $data=explode("",$data[1]); ?>

You can download this document for offline reading or print it.

impressive-0.10.3+svn61/site/menu.php000066400000000000000000000030661214566325400173700ustar00rootroot00000000000000\n"; $Menu=array( array("About","index.php"), array("News","news.php"), array("Download","http://sourceforge.net/project/showfiles.php?group_id=239794"), array("Documentation","manual.php"), array("FAQ","faq.php") ); $Quotes=array( "makes even the dullest|presentation look bright", "so convincing that your|audience will believe everything", "impressing your audience|has never been that easy", "the simplest way of keeping|your audience from yawning", "the Chuck Norris|of presentation software", "the name|actually makes sense" ); ?> Impressive
",$Quotes[rand()%count($Quotes)]); ?>”
"; else echo "
\n"; else echo "\n"; } ?>
impressive-0.10.3+svn61/site/menu_a_c.png000066400000000000000000000011431214566325400201610ustar00rootroot00000000000000‰PNG  IHDR@ -ÿéÓ*IDATxœb¼|ù=ÃPÿÿbyõêÇÿÿÿ‡( ÿÿbùòå×@"Eÿÿbùõë߀‡"%$ÿÿbùóçï@"Eÿÿbù÷ï?Ä7 ÿ‡ÿÿbù÷ï##ÿÿþ96ÿÿba`øÿï##Ãÿÿ ŒŒ CŽ ÿÿbøãÿ†!Jÿÿbb`øÿÿÿ?†ÿÿÿÿŠlÿÿbúÿÿ?$=ýŠlÿÿbxˆñß?DBlÿÿ‚x€’†ÿÿBÎC’ÿÿb‚”BC—ÿÿbb`øÿïß¿¡KÿÿbúÿÿÃcÿÿbyûö9ÃPÿÿb¹sçÂÿߤ„ÿÿLlT5j¢6¼IEND®B`‚impressive-0.10.3+svn61/site/menu_a_l.png000066400000000000000000000024131214566325400201730ustar00rootroot00000000000000‰PNG  IHDR@ -ÿéÓÒIDATxœb|ÿþ= üÿÏÀÈÈðÿ?”,N ‰É€s1ÕÿûG¬ÉÈnÀdÿÿdŽ1 0ÄzÐÿ¿×Étä´KAánD’€sTž9X½é¥Ü Àð¾tÿ¿–wY{|'ðÿÿbùõëÏa ?8~ÿÿCÙp® MMœ ÂŒ[¬1ÿÿbù÷H o4öXE 1€©Oü`ºÍÿÿbùû÷/Ü7ÐÂŸŽ †7.6šz‚qB0Ÿ@ÿÿbù laD†=1lüqÏ{hù-'00üÿÿbù÷ïÃÿÿÿá$2΂°á"t‡Gœöÿÿ8Íùûaï¿·!³!$ÿÿb9KŠ™_±Š ¥bØÈºpÙˆ,ûï·ADÿÿBxOšÃt1ÖôJ<«0ÍÄ“¡"ÿÿBÎÐÔgÃR ËŒ0w@R*,Æ ³1ÍD‡å:,ê‘ÝaÿÿbAN[°xøä×ÿHáñ)„PÄ‘Âò?Rh¡˜ƒŸ½»`±n&²½€Æf``ÿÿÂR a­ƒÑjV4³ÆU+c­¡ñÔÇXkd×ÿÿbAÎÑȱ5ïc–H¡Ž`,…MC³Ó%¸Äþ300ÿÿ"3Ðb-œð„:ÖZOÌ ‡=Ö¶ÿÿBËXb9œðÄÁPÇT‰)N0–ÐÜÉÈÈÿÿ"90IüéžõxZ_XI¸kÿýûÿÿb‚Ôİø‡6ÿàa€Æþ«A!lX¡› ³Hኮ.Žß^Lõpsÿÿbð‘bàRØÿC •Hi;Y „ 7)N°«Ac#…1Š{ÐÜùÿÿÿÿbÂNÈþþhüƒ§{¸z´x 5NÅ1ã+ÍÿÿBÎÿÒz<`Æ Z<à c¸z¬j âhñ‰ç˜ö"ÇÿÿÂ’Ðü+ ‡þt? â¸â--`šÿÿ"?àOÓ¸ôâRƒl&rØÌÿÿ‚ÇÀ?¤Rè’ïÿ!ÅÀ?xhÁâAÂÕ#…:Š™hjÐTbµÓ=˜fÿÿbBVÇe¸\€FÂ}‹f&¦ËÐTbúÙ¸lùÿÿÿÿbùû÷/,ŽàqÇ€¿ ð|³‰)o ذ¼ˆPOª8šùhn@fÃÝ ÿÿbùÿÿ?,0Àå lXúc€ë‡µ{!f1 ÙÍ÷²X_ŒXq¸™˜l$?@z3ÿÿÿB•`€5Áá äþÌD¨8\„þãBðÑÿÿbùû÷/,_ã›ÀlIâ ÂJbÚˆF"Jÿÿbùñãfð#û9¼ÑžT„oxÂ3°ºÿÿbùüù3Ìg9x^a€ç¸8Ì\qX½F–wÑ͇‹ÃÂ!w'Ãÿÿbyþü9*Àêo¬é›´¸Åêøcÿÿb¹pá\YŠèjà%V6šJˆíh$¼üÁ”…—™ÿÿÿÿÿb…Á¸ŸËär®“D c„VY8YÆ($²½h²È&ÿÿBäx=€XË`äÃöÿÿÿÿÿ] røÁcS <쉉ÿÿb—²È>C«°Ær\¡…=ZèTç˜õZØÃeÿÿ‚Æþ<€*Xc3,IJýh1Œ–Ðb9½üû÷ÿÿl•A 0ÃÆþÿæd‡‚8·[)±‚‚nEkèÊg€Ë¯KdZ¥{mgTýëÎÇO_9ƒysÿÿlŽA ÂÿÿfêÁA¦ñFH]öΰ±Ó‚î¥æý_¯>;a¾|¾N¶ë»?&³ÿÿb‚ÕÄØÃf+zØàR6hq[\açhiM Ä.ÿÿbB {xx£±1à 9<ÐÂk˜¡Å3²´8‡‡1¦8füÿÿb"˜¾avcI—¸Âkxcš‰–߈ÉhêÿÿbÂöxÒÖ8ÁöXãWž!2 Ç?D/ÿÿbBŠ$w3 éÁB"åT,z‰Ar+’[±Û‚¦ÙLÿÿbBs¦ ¤R‹8»q‰` "ýŒfò¿ÿÿÿl—1 0 èÿìÑA$mè&7¹ˆºAyh¦•Î#}±€¬Œ϶Áë`pirÿ¸›ïúh{«jÎÉÿÿ‚4æ öAÚ¨ÿàmqˆ›þÿGGSaÃú"$‹3222Bûìÿ˜˜ l4» í~FFˆ;”ÿÿ‚Ä0"G “ŒŒèlÌ>Ìnô).q¤!Lóÿ£ŽÉa’pÿÿbùû÷/r›ÞÞÀB• †„·yÐH"G„°ŽÏýGÅÿÿbùõ벟Ð|Ɉ1&‡Æ†‡.6©Ó.ü1ÿÿbùþýóÿÿ °v2›æWˆ›ð±aé6~óánÀêNÿÿbyûö9Zðc2‹‡?\1e †=šÛ ÿÿb¹sçÝ×M«üɤ³ëlÿÿb˜÷ß¿ hé-CB)c W ×C㇯°ÄZ~ƒûÉ´ÀÿÿbA¶æÿþÃÓrxüû÷)t‘]ó3T±ù*ˆÇÈq~45Héåÿÿb;ý?ÎòKŠ$)­ãRK{8Ë"T{®Bv'ÿÿBx–Ž é 5þa8#\ÿá`cQƒ̈X…“0ëþÁó!Ü= ÿÿBÉh1I—¸â3äË"l¡ŽE î:Yu-ÃÿÿbÁp< é7H%¦uÈ¡‹–SqªAŽgä˜A󰜀–.¡ÿÿÂèå.Ö<€~Ää¤ôƒ+Yüƒ”ªÿÿˆü ìyf7fYæúÿ¨ê±Äš8$Å#Ù…é6hÿÿ¢r€×06fZ‡Ä–²£ŽÇ™àuÿÿbÁÌ[È© 9 –Øó¬žFcÿ‡E Jùƒf&,ÞI”°GЏ ÿÿBŽxó–À“ÐJI´CKKÈm*ä¶*¼õ…ÍUÐÿÿbè!. §Zb󶲈©AއhöÂS#š«"„ÿÿb§WHH30 ‡:¢-„µ,úÑÀHë8Ë"ñ€0«½h1ÀÀÀÿÿBÎд‹œÚ`5Ü´3`†+\KžAŽ9¤tÿÙ^xm€5ÿÿÂW,…°Ö£xbGžÁC"»žžÿ#§ÿÿb—wðRÙ¯¨mbóf •lÿQÕ#âI1ÂHac¡¦ÿÿBäxîÁÚ <`†:‘m!\e„ÿÿbÁöPƆ®<O¬ÿ±æLß"©G1)üõ1¼'w!r¾ÿÿ"¿"”þcÄ-β›9X[XÆ&ÿÿbùû÷/rŸ É—ÿ`éa2r8ýÿÙJCd ¸J<½M¸®ÜŒ7uAEÿÿbص-„Y`Œ °ÿýCac†+Þ<ƒ/ ºêr ÿÿB•@NaÈlx? âVFa•BófF‚G;Ä ð²"Ë+i ™ÿÿbùû÷/ZêÇÛ&%2%B0pÏ!»ÿÿbùñãF  ø)NÐ ¬q‚3­ãñ<~pÄ9º{à!Îÿÿbùüù3¶ÀHl,mwb•Di‡bµ —{ÿÿgÿÿbyþü9Á@c£F ö\ÃńűÅ<œ>FÍÈÈÿÿb¹páÂÔº ³Í)‚»¤Âžj‰WƒYÒÃÓ VwÿÿFŸ˜Ï)ý_¿IEND®B`‚impressive-0.10.3+svn61/site/menu_c_r.png000066400000000000000000000033221214566325400202030ustar00rootroot00000000000000‰PNG  IHDR@ -ÿéÓ™IDATxœ|ޱ 0Ãìÿ¬ÔKèRQ`(SÉ®µA@‰@)gÇÇJ~õ¾…Aßý¥tP‹Ó€ÿÿlOÉ 0 Béþ³†.`90Ј¨1'âJ0HfrñÉg/YJóYüGó µ9wl7ûÖú!•ÿÿbùöí;R@à W£’(ŒŒhJá‘„ÐÍAÖN|¼!ÿÿbùóçr À}†ÆÞÈâ¨l¦ÿÿÿ311Á‹ 8ÌD{d— ¸ÿÿbùóç²/‘ýŽŒÿþÁIäp…%Ì„Jˆ²ÿþ!ÙúM%DÍß¿¸ÒÞ_ä¼wÚ‡ÿÿt“1 0MéÿŸœë Š\$‡3Á €›¬­åÝ–NnN‚ÊØÒ‰pæ=þ§õæËþœeÆ¢yÿÿt”Á 0B öÿŸüÚ¡ì"!RiФÈ,”ýUd» þ㎂âyòϳ&ßi1¬­fÝxÿÿl”1À0¯Vþÿd»ƒCÚJe`Á2ˆ¬0\àã>“ýlBÂî=Ôeÿ_éé1U%eB•_ƒÀ ¡áá¹Éœ\Âï 7ÿÿt”10¯IÿÿdÚÁBXºÅp÷°“àùköùÄ3ßÞº^"úôÈ©®!håÎPµQIÞšÿÿ\‘· 0 Äü3™AH]4t=A’DQ{] ©)«Y¾>@y‰ ¬Ì›»Ãq®‰Û,÷­*ù¶Rÿÿbúÿÿ?ì†«‘pýÿ`>ÿ3¢ê7T! äÐAR ÿ¤®á+¸;ÿÿbBÕì„H¾ÿöÿ‘cfàûr\¡©ÙõY%rØÃlD¤˜F¸;¡êÿÿb•?ÿa¹’/1ËH9‹š‡Ë´R-`WW‰-!J¸ ajþÁÄÿÿbB{´t†3HiÐâžö°¦I5Däÿðüƒä”<ðïß?ÿÿbAò+´¶Cò7¼tB„ Z‹-\‘Tb-—Ñ[Èe¬–D· - — ÿÿbø ^ÿ#ÇÄ… hu0¼VG.ÝÍ…—ñÿuöºæ¸ùðRaRX »ðÿÿÿÿÿbù‘;a.CHlÀIx‰;\ÑbÎÆ¬IÐóÌvô<c#òÿÿ‚ÄŠ ÐÒ< `µ&Â&&&Æÿ°Ô¯°cBŽk¤Ø@n1!…Z<0ÀÒrÌ„\6üÿÿÿÿB®þ#•zÿ‘JÌÿHur9 1Êu”ºžËQUS r9Ì=wBHÿÿ‚´…0cî{xHÀãÒÂAoE"µ|°¤~lí%D\!‡=r» ©­Y CãÿÿbÂô,´ËÁÈá5ì‘B­N„×ÁØã ©ƒç(u0¼5TRC] ÿÿbB­qá$z[5Í ·PÚ<Øê]äô€P#x"Õhu0fšD¸ÿÿbÂ{d¿2 År=ÒÂCõç?x¨#çx É5Dåd"åO„›ÿÿbB«Ûâú?’¹p62‰H¨57<Ô±ÔÁ¨®A” HmX8 D¨cÆÿÿd˜1 0=èÿé Ak7¹A§$ijnO×s‡j>º¸¬³È”_«‘uó‚&’¨ úüd³½;

2010-10-170.10.3 is out — finally a new release after a long time!

It has been over one and a half years since the last regular Impressive release. Development slowed down considerably since, but it didn't halt: A few changes were made in the Subversion repository. Most of these are bugfixes, stability fixes and compatibility fixes to make Impressive work with newer versions of the tools it relies on. There are a few new features, though these are just minor ones.

2008-02-030.10.2 is out, containing a few new features

This release contains some internal fixes and improvements, but also a few user-visible new features. First, there's support for URL hyperlinks like web links and e-mail addresses. Second, Impressive now understands list files: These are text files that contain the actual names of the files to show, which can be useful for image slideshows. Third, there's are new »automatic overview« mode that hides PDF pages from Impressive's overview page based on whether they have a title or not. This makes use of the fact that some LaTeX packages for presentation slide generation don't emit PDF titles for pages that are part of multi-step slides (those who are revealed one step after another).
Finally, there are three new PageProps: Using keys, alphanumeric keys can be bound to user-provided Python functions now, comment permanently shows a line of text on a page and video is a highly experimental(!!!) feature that plays a fullscreen video when a page is entered.

2007-11-27a little interim release

Over the last few weeks, it came to my attention that most Linux distributions switched to an incompatible pdftoppm implementation that breaks Impressive's page rendering. Since I don't have the time to turn my TODO list into a new release, I just updated a few spots to make it work on newer Linux distributions again. Users of the Win32 package don't need to (and, in fact, can't) update.

2007-09-090.10.1 supports PDF hyperlinks

Apart from bugfixes and internal improvements, there are three important new features in this release:
First, Impressive now contains a simple PDF parser, which (in conjuction with pdftk) can extract PDF hyperlinks and make them usable. This means that the navigation controls put into the files, e.g. by the latex-beamer, can finally be used.
Second, there is a more generic command-line parser: Impressive now accepts an arbitrary number of image files, PDF files or image directories as inputs and concatenates them automatically.
The third feature is a new (optional) "persistent" cache mode, which can be useful for large and frequently held presentations. It works just like the normal disk cache that was introduced in 0.9.0, but the cache files won't be deleted and can be used to speed up initialization the next time the presentation is shown. Please note that some caching-specific command line options have been changed in this process; please refer to the help screen or manual for details.

2007-06-020.10.0 comes with a huge load of new features

Up to now, I took the time to describe each release's new features in detail, but 0.10.0 has so much of them that I will use a more compact presentation this time :)

  • Most importantly, Impressive now uses Xpdf's pdftoppm as the default PDF rendering backend. This not only solves numerous GhostScript problems – it's also faster and cuts the Windows version's size down to a half.
  • New keyboard shortcuts: [Home]/[End] for first/last page, [L] to return to the most recently displayed page, [I] and [O] for interactive toggle of the skip and »visible on overview page« flags, [R] to reset the timer
  • Unused alphanumeric or function keys can now be used for shortcuts to quickly access specific pages.
  • Impressive finally accepts lists of image file names on the command line. This makes JPEG/PNG slideshows much easier.
  • Transitions can now be turned off completely, either globally or on a per-page basis.
  • The PagePeel transition is not longer part of the default set of transitions. This means that now all default (automatically assigned) transitions are of the non-intrusive Crossfade and Wipe kind. Note that any info scripts which do a AvailableTransitions.remove(PagePeel) will not work any longer!
  • On the other hand, two new families of (rather intrusive) transitions have been added: Slide and Squeeze. Both come in variants for all four main directions, Left, Right, Up and Down.
  • The OSD layout is now configurable on the command line.
  • New page properties: transtime to set the transition duration for a single slide, progress to suppress display of the duration/progress indicator bar, reset to reset the timer after a page has been shown
  • Added the possibility to execute any Python code before and after specific pages.
  • Of course, there's a bunch of minor extensions and also bugfixes, most importantly the one for the supersample mode. (Which, on the other hand, is somewhat obsolete now that Xpdf is used for rendering :)

2007-03-19A bunch of new features in 0.9.4

Besides numerous smaller bugfixes, the current release adds some new interesting features: If the target duration of the presentation is known, Impressive can display a progress bar at the lower edge of the screen. Luke Campagnola contributed code to adjust the gamma curve and the black level of the presentation. Impressive may now use a transparent PNG file as the mouse cursor image instead of the default one. And finally, the middle mouse button comes to life again: it toggles the overview mode now.

2007-02-26Time for 0.9.3

Today's new version fixes some annoying bugs and implements some minor under-the-hood polishing. But there's a new feature, too: The [T] key now shows a little time display in the upper-right corner of the screen. If [T] is pressed while the first page of the presentation is still shown, it will enable a special logging mode. In this mode, Impressive will dump a trace of all visited pages with some timing information to standard output (which can, of course, be redirected). This is a great tool for preparing presentations.

2007-02-17How about some text? Go and get 0.9.2!

The 0.9.2 release adds an on-screen text display for the overview window, indicating the page number and page title, if available. Furthermore, the page cache and overview screen can now be constrained to a user-defined range of consecutive pages. A third new feature is the the »poll« option: With this, Impressive periodically checks if the input file(s) have changed and reloads them if necessary. Finally, there's a fix for a bug that prevented the -m option from working.

2007-01-240.9.1 fixes some bugs

Nothing special, just three more-or-less nasty bugs introduced in 0.9.0 were fixed: First, the 'whitening' mode didn't work on all graphics cards, clicking a mouse button in fade mode crashed the program and there were occasionally temp files left behind after exiting Impressive.

2007-01-070.9.0, the next big update

One of the most frequently requested features is now finally implemented: Background rendering. This means that there's no longer need for watching that pesky progress bar on startup, as Impressive now starts much quicker and pre-renders all the pages calmly in the background. Also, the cache images are now by default stored on disk, which eliminates the memory problems of earlier versions.
A few minor bugfixes and features have also been added. Most notably, the [B] and [W] keys now fade the screen to black and white, which is useful if you are going to use a blackboard or whiteboard in parallel to a Impressive presentation. A new page property in the info scripts can be used to make Impressive skip a page when going through the presentation. Finally, on Win32, the default fullscreen resolution is now taken from the current desktop resolution.

2006-09-28A few new features in 0.8.3

After a long time, I added some new features to Impressive again. The most useful one is that pages can now be removed from the overview screen via the new overview PageProps item. This comes in handy for presentations that contain slides that build up over multiple pages (i.e. the points are appearing one after another).
The new aspect ratio option helps if the display aspect ratio differs from the selected screen resolution. A new (optional) transition has been contributed by Ronan Le Hy. Another change »behind the scenes« is OpenGL extension support to load textures with non-power-of-two dimensions. This helps saving graphics memory, but in case it causes trouble, it can be deactivated with the -e option.

2006-07-130.8.2, another minor update

Again, there's a little bugfix release that fixes a crash on strangely sized pages. There are some new features, though: Keyboard navigation is now available in overview mode, and a new »rotate« option allows users with broken LaTeXes or GhostScripts to display presentations in correct orientation (try -r 1 or -r 3). Please note that the »render« (-r) option had to be renamed to »output« (-o) due to the name collision.

2006-02-04just a minor update: 0.8.1

0.8.1 only adds features that will only help in certain situations: First, OpenGL error reporting is now a little bit more concise. And second, there's a »render« option that renders the presentation from PDF into a bunch of PNG files instead of displaying it. This feature was implemented due to an urgent request of a good friend. He's going to give a presentation on some college-supplied PC soon. Unfortunately, this PC does only have an ancient version of GhostScript, so he needed to render the files at home to circumvent the display flaws this old GS version produces.

2005-11-230.8.0: a lot of fixes and a brand-new zoom mode

Recently, one specific feature was requested quite often: A zoom mode. The problem is that really nice zoom is very hard, if not impossible, to implement in a sane manner. 0.8.0 adds a somewhat experimental 2x zoom option that can be activated with the [Z] key. It is not fast, it is not very elegant, and it eats memory and CPU cycles as hell, but well ... it's there.
For those who do not want to zoom into the pages, 0.8.0 has some additional features to offer as well: The command line option parser was severly broken, as was the image display mode and support for portrait-format pages. Some uncommon command line options now have capital letters as shortcuts, so if you have any scripts calling Impressive, don't forget to fix them. A new option has also been added to select which transition(s) to use if no other transition is specified in the page properties.

2005-10-24Some quick additions again ...

In the brand-new 0.7.2 release, there are some critical fixes for regression bugs found in 0.7.1. (Changing most of the event handling tends to break things ...) In addition, there are two new command-line options, –a and –w, that come in handy if you intend to use Impressive as an automatic slideshow tool.

2005-10-22Usability improvements in 0.7.1

Today, I implemented two suggestions from users. The first one affects highlight box handling: Boxes are no longer created and destroyed with the middle mouse button, but intuitively with the left button (drag to create a box) and the right button (delete a box). This is how I should have done that in the first place, I think :)
The other suggestion was to add an option to specify the page that is shown right after initialization (start page, initial page, ... you name it). Now it's there: Try –i and note how even the pre-rendering process is adopted to reflect your wish.

2005-09-29Impressive 0.7.0 – let there be sound!

schrd, the guy who had most of the cool ideas that sum up to the Impressive experience, reported a bug yesterday, so I fixed it: If the user clicked at some areas in the overview page, Impressive would crash. Oops.
However, this is not the reason for the leap in the version number. The 0.7 is due to two additional features that have been requested by schrd, too: First, a timeout PageProp can be used to create semi-automatic presentations, and second, there's experimental sound support!

2005-09-07Bugfix No. 2: 0.6.3

Yesterday night, a friend of mine informed me about another bug in 0.6.2: Some PDF files produced with »uncommon« pdfLaTeX packages had negative(!) object counts in them. This confused my oh-so-simple PDF page count parser, so that Impressive wouldn't play those files at all. This is (of course) fixed in the new release.

2005-09-060.6.2, the first bugfix release

The worls seems to spin really fast these days. Only a couple of hours after releasing 0.6.1, some guy found the first (really annoying) bug: On Win32, filenames containing spaces didn't work. This is fixed in 0.6.2, and now I wait for the next bugs to come :)

2005-09-05Initial official release: 0.6.1

It's been more than a month that the nearly-done package and webpage waited for finally being released. Now I finally found some time to add another feature (the supersampling option) to 0.6, lifting it to 0.6.1. The activation of the sourceforge project was done in less then 24 hours, so here we go ...

impressive-0.10.3+svn61/site/oview.png000066400000000000000000001354111214566325400175520ustar00rootroot00000000000000‰PNG  IHDR@ðþO*<sRGB®Îé IDATxÚì½Ylé•&{FîûžÌ…Ì$“‘Ú¥ÒVU–j“]¶ËKÛncº/ÜôË3ÀEÏ\ô¼÷ è‡y˜î‹™v7ìjÛe—\‹KkI*QEq·$“™Ì}ß3"3–ûpÄPI©6©´TDddDdĉÿüÿY¾száÂd'bY–eYµZ¢(òJ$6› EÑÎcŠÅ"ÏóAètº-Ççóy½^aò`ªV«r¹œa‚ hšFDÅb±¨Óé~â#§7Þx£V«Áöþð•J…t©Ëÿ§ŒˆB¡N§ ‚ ‚$Éh4ÚÓÓc02™L«ÕZ__W«Õív[©T¦Óé±±±jµº¸¸888(—Ëß{c* Š¢@ðœNçäädOOÏ;wFGG)Š"I2•JõõõÅãqÇ[­V.—³Ûíkkkããã<ÏOOOû|¾d2IÓ´L&»~ýú+¯¼Fãñøž={r¹œF£™››³X,8Ž»\.¸ÃL& ¿f‘îR—ž:ŽF£ …âÃ?Ôét …B«ÕÎÎÎŽŒŒ,--µÛm§Óùî»ïj4§ÓÙn·yžÏår•JevvöðáÃF£ñò刦éL&ãóù\.†a±XL­Vg2™|>?::Z¯×'''e2†a×®]£i:—Ë5f³Y¯×†¹~ý:MÓ‚ pg2™áyÞëõNNNÆãq½^¯×ë×××-ËÛo¿­P(Òé´ßïïJo—ºDèt:•J5<<,—ËEQœ™™Ù»wïôô´ÝnGQÔb±ìÙ³GE…B‘H$á8Ž ÆÞÞ^­V«Ñh8Žóù|r¹A«Õ*Šb4EÄ EQš¦Ng«Õ2 …BÁn·‡B!AAày^¡PÀQ­VS©EQz½^¥R ‚ T* Š¢‘HD¡P?~|}}ÝçóéõúîËëR—P°EQ„ÏÉdR£Ñ(•Jɬ…¯PEvJßn¹nçþ·;¯¶ã‘×Aduuµ··¾zˆYÞµÁº6ð7k¾'Ç›"áp8¶ŠøæWÛ7"K:æ‹^MÚã÷û»o«K]ÚBØääd*•jµZ]^t©KÏž FC’d—]êÒ³'À(Šf³Y–e»¼èÒ3Mâ&=—ö@øÔ©S_O¨K]z¬ô«_ݼy3áõÊ~ñ‹—I’@6½­ÒèGQB•¥RÉl6#›ÎTAd2™Çã‰D"6›M.—c&‚ªE‘eÙL&CD¥R@Q4“Éd³Ù@ @QT§SVE öøk¥‚ Ôj5žçµZ-Š¢Éd’eY·Û ñš-Î] k×®¹Ýn›Í†ãxç¥DQ$¶8–äUîÒ37g?ä%>üÛgða‘H$=?_Ý»wø÷¿¿pøpttÔ×hÔ?üðC§ÓFu:]2™œ˜˜˜ŸŸ÷z½‚ Èd²×_ýÂ… ‚ âhuu5ß½{wxxxeeåèÑ£†E£ÑB¡ R©xžO§Ó ÄÃáÓ§O_¸pEÑ………¡¡¡©©©ÞÞÞC‡ýË¿ü MÓ^]^^v8™L¦¿¿ccƒeYNW©TÌf3˲FC¯×‡B¡€]ÈåòjµzôèQ–e/]º411q÷î]‹Å²²²²²²âv»3™LOO†aápØãñÁ뜚šÊår‚D"‘¥¥%ãÎÿÛ?>dç7[rîm°,›Ëå¶³+™LvîÜÂÞNmpË·…BeÙ-ûÛívçÁpñJ¥òÉ'ŸÀ¯oy•¢(–J¥k×®år¹L&ÃóüóÁvF™H¬_ºt›çë:AÄB¡`0(вZ­™LF£Ñ$“I…BQ­VU*Ã0°HªÕêb±Øn·kµZ½^·Ùl€ B:¶X,SSSÑh Fƒ¡¯¯OEA¬V+`(ÖÖÖd20“çyš¦+• MÓA‚`4c±X±X”ÉdǹÝnÇyž—ÉdÙlÖf³U*ŽãH’l6›§R©$©P(–——Ífs©Têéé±Ùl€¤ŠD"…B¡Ýn—J%‡ÃAÔëõjµªÓé®]»öúë¯W*•ÅÅE¯×[(nܸ1<<‡Ož?66vçΣѨP(@OØØØèïï_^^~ñźüM¦jµùÇ?Þ=rÄçpèëõú‡~866Ön·›Í¦V«Åq<‘H$“É#GŽ”J%™LV,U*U½^·Z­ÑhtddD¯×ONNR¥P(²Ù¬ÕjM&“'‹á8n2™âñx$!I’ã¸H$²{÷îd29<<<33S(Þ|óÍ>úèäÉ“.\ðx<…BV¿ß¿²²¢ÑhÂáð±cÇ–——[­ÖþýûqÖÙŽ¢ˆÁ ú›¿yåÊ•Åññ½n·ÃP·ÛͲ¬ÅbEqll,•JÙl¶T*¥Õj9Žk·Û …‚ ¯×k±Xt:Ïó‚ ‹ÅžžžÕÕÕ@  P(ü~?Aßÿþ÷qW«ÕN§³\.Ã0 m6›:Îårmll¸\.Qiš0 † ‡Ã‘N§Fc«Õj·Û*•Š E+•J­VS(†QÅqÇq …‚$I5÷õõùýþH$222Âóù„ ˆF£1==Ýn·›ÍæúúºJ¥êJ/‚ óóñË—c(Úzë­ƒ‚ 8N`ÎÆÆ†N§3n·»R©\¾|¹^¯ƒ577§R©ªÕj©TZYYÙ½{7Ã0+++:îСC—.]:zôèo~ó•Je4—–– Ã0&“©\.ollx½Þ™™QÏ;711Q.—Áq\¥R)•Êõõõ`0§×ëu™L–L& ‚h6›³³³ýýýÏ“êÔÛëèíu€<õõõIȵZ ˆJ¥Úb;HÆ0h(&“ EÑ]»v¡(:446°Åbd2™F£‘,U½^¯Óéà«`0o¼ñ†L&ƒmxÅ´Å8U*•;ÍD÷ï ~½¿¿¿ÓÈÝnÕ:®Ñh¨Tªd2É0L»Ý¶Z­r¹•LJ•vxx˜¢¨þþ~0ìv»(Š^¯wzzÚï÷sו^Aöíë•Ëñ' G{zz†) N§S«Õöõõ}òÉ'===ÇÑ4m6›—––ìv»Ñh´Z­wîܨ™(ЇÃ`0ÌÌÌ;wîœ8qd5 ...ƒAÇëõºËåÒét6›-ŽÝ¾}Ûét¢(:11ñá‡öõõ-,,„Ãá3gÎܹs' B†™B¡˜››Öh4çÎÛ³gÍf{˜¿Ý¨¡Õj-..îÞ½d FÇñv»MQÔCPF’kû1Á#u®do™8>Ó¿¾åúÛ/…>(°K_Ê÷…¼G;¼e®Ý2yæ)u<·ÙlA<讞foÖWRB êÅ‹ÇÒÒ$±¶Z-½^Ï0 wZ*ÕjU&“Áq\³Ù§¨L&$ÉF£AQT»Ý&¢Õj¡(‡wíÚuóæÍr¹¬×ë«ÕªÙlN$^¯7 ½üòËAÔj5š¦9ŽkµZ*•ªÙl¢(z÷î]ðß pÀ‚ W«ÕB¡ÛífF«Õ"¢P(xžgfnnnhh,mÐ<ÏÚÚš×ëU«Õ¡PH¡Ph4¸ÔS;Úíö#GލT*ðƒHCÂØŒ¥RÉh4>ëãŠxûí·ý~ÿôôô±cÇ\.W6›mµZ4M“$IÓôÄÄÄÜÜÃ0 uï¾û.Ã0}}}†ŠD"‚ >|¸P(„B¡µµµžžžµµµï|ç;à4Ïår“““+·x0\^^v»Ýëëë*Øh4ÀÁðÇñÿôOS½½Êãǃ…Bá½÷ÞCÄív'‰V«e±X(Šbï¼ó DQ,—Ë@ ŸÏ+•J«ÕZ,“É$Ç;wzzz²Ùl4M$ Ãø|¾D"!“É*•ŠR©l6›ñxAŠ¢‚Èd2ßþö·WVVêõz¡P‡Ã2™ üá'Ož¼sçN³ÙdY6™L‚•Ȳlooo<_ZZbÆår]¹r%•J!®×ÁÁÁ§J†;gI¸ÉÎÛ“¬S’$Q…°Ð³N˜ÝnO$ƒ&oÐÊÜn÷ÜÜ\£ÑX__×h4Õj5›ÍŠ¢þÏ¥¥%¿ßöÀVÀ¥æõz“ɤÓé/ÜÐÐÐk¯½Æ0 „×4MooïÚÚZooo2™´Ùl0/6›Íç~ù%\«¬V5Š¢03ŽŽŽ†Ãá`0¨P(L&“ßïÏårýýý‚@@Çqš¦m6[©T¢iÚd2]¾|X](Ìfs6›u¹\étZ«Õ‚*HQ8<Çqr¹¼··W¥RÉårøˆaX¹\¦iº^¯CŒÇqAp'Âl6W*•Jåv»¡¾‚F£'D;0 Ðh40Ë?e:ŽX¯7aP=Ü@xT“ÎÓ`!¢¿ûÝïd2ÙÚÚZ?Aüñððp4…`#‚ @`yy™çùÁÁÁ?þñ>ŸÏï÷‡B!ŸÏ(p¯ó<F=O»ÝÖjµPaÇñ?üpttÖ¥R‰ãx8öz½•^ZZÚ³gEQÏ™åáî"ؤždÂܺuk÷îÝ,ˆÃá¡¡¡-~¬íùØÿS©ÔÜÜÜþýû5 •J%•Jõ÷÷K×G¶ebwþ.?B>+÷ûkö{}!þ ‚ðÿxum­"—3ÿé?½AÓ¨Ê`²IÎ’$Á4à8nfff|||yy¹T*ùý~“ÉÔh4à+¸ MÓ‰DBƒÁÓ_»Ý†ÂâââÊÊ ÌhPF&ŸÏS588¨×ë?øàƒ`0X*•†††ÀVzŒk˜@’.´ÿ~’$‡‡‡!¯s``6^~ùeð¼C=*°($<ï’V|èÐ!`½ôÖ;kY=µÒû8æÊMušƒå«^¯K5QݳgŠ¢ÍfÔZ¨Rät:#‘ˆÑhÔëõŠ(ˆ¢h³Ù¬V«ô­N§œ-‚ õz½“ÿ¢(Öj5ˆ<«T* Ãàw¥»„Å^ÐŽ¸ÜÎi¨Ýnƒôd½¢ˆ¬­¥ÖÖ˜ýû‡þíßÎÏÏGÇÇûÊåÒ/ùKƒÁ@Ó´Ûí¾sçŽ^¯'I’eYˆá-,,€Ôjµ²Ù¬N§›™™q¹\ Ã4 ¥Rùï|'›ÍJ6ÈK/½tåÊ•P(ôÓŸþ\£Ñ`vòäÉ‹/‚õAÓ4Ã0,ËF£ÑV«õÿø‹å{ßûÞããÏý„~xI N vÉd²{š÷Nõ¨vܹݾí<ì#½H:]Òj4M–J¥P(4>>‡«ÕªÕjÕét¥R &Ä…… ÃæççÁa&‰ÌÏÏŸ:u*ŸÏ“$Y¯×s¹œÇã‰Çã&“ =###õz}eee```mm-¬®®ú|¾•••L&óÆoLOOC znn A8 ð@ù|~``àìÙ³r¹\§ÓõõõxxxX§ÓÍÍÍùýþåååB¡àp8úúú*•J,S(¡P(X,‹ÅòX—š‡“ͦ/6>ø ‡ u»Ý€¢X¹6› €‡R Ã<ÏÆÆØÉ…Batt4 Y­V»Ý¨T*¡’T§ÆU¥ uïðáÃ.—ë½÷Þ»~ý:EQ†½ð 2™ŒeY½^gY,ˆÌ?Æ‚ÝFãÒ¥K<Ï9r$‘HLLL ]z¤N¬ÿñ?®Žêßzk?ìi·ÛKKK}}}7nÜØµkW.—[\\<}ú´Õj][[E±¯¯/“ÉÔëu½^ßl6yž_YYQ(¥R‰ã¸ÅÅEFF‡††R©”ÓéL¥Ræ½÷ÞS©TkkkE…B!Pņ)•JËËË6›-›ÍªTªL&U!¥üÉããã&“‰çyŠ¢fffjµŽã&›Í‹ÅwÞyçôéÓ ÃT«Õd2¹ººŠaX2™¡T*mll¼úê«OÎ猨Tòÿò_¾{ûöêàà‹ À:î7Þ€DwÈ%:pà¨ÐPÑ ¾=pà N'˲2™L²#p`î ý½ï}ôpÊ`öòË/3 £V«¡”2¸ÊŽ?7Öjµà·£ÿö·¿åy^.—Ÿ8qbrr²V«1 Ó™HÕ¥GâÄúÅ/ö ÃÕ¸¾¾>22b45M*•2™L§OŸn6›.—+•JA¥ÁB¡044$Ïûûûa]Íår###€³W*•&“I¥R¹\.Š¢´Zm, ¡P¨¯¯oee¥¯¯ •JÞ,¸²Ùlóðô’ŽÝÓÓÃó¼F£Q©TµZ NµZm6›Ýn÷êêªÛíE1N÷õõÕj5 Ã@ßïÆ“e²Ù¬=}z(ŠÒ‚§P(¤o;¶e'h8ŽKwÞy¼¤{R%é‰ÛývÆ„¢h§ö!m * ú7ó7Pö1™Lò<ït:WWWÇÆÆºU—µ y&õ Gуª>\%{Të˹Ü>ó"¹\N¯×?rþ¢üÏå*33Ñ`Ð+ð#tno±ü‘mu?“·ÏóG¼ôÒKàä„+Š¢À–f ]z$jÃ0*}U­V …¤twæ‚ ‹¢˜ÉdÀGéG}}}WŽD"V«µsqØ.ÿÛc @ s‰Èçó­VËh4‚Ÿtãf³ép8^ Ôh4>ñÑR«1ÿóÞ0›ÍÿüÏ¿ù¯ÿõûV«Ax<.ùö$Ï?èÆP”g–e)Š˜´t¬«Fcrr’a˜_|ðÙÙÙr¹l6›ÕjµÝn‡ÓÓÓ»víE‘¢(PÂ¥ÊA0 ³¶¶¦V«kµX4X€¥jXRz´Dy„¿ôœ¥Eª×ësssÙlEQ‡ÃǵZ-†aŸ|ò‰ÃáH&“‚ôôô$ ö‚¿šçùÑÑQ¿ßõêÕh4 1†aT*U*•r¹\¥R RFkµ˲ƒ!—˽öÚk™LæÚµk§V«I1€mÅb1†axžw¹\+++€^¡^¯CƤ+úÿ¡sÓ~¹¢ˆ¤R…d²êpX†ßØÈZ,:E ˆý›ßüÆëõ6›M£ÑX«ÕœNg¡Pv% ¿ß¿¸¸øÒK/­¬¬ ²´´dµZWVVz{{ÇÆÆ0 K§ÓfrrÃ0½^ϲ,äèHÜÔr¹|nn.¬¬¬LLLx½^†aÞÿ}³Ù av€!>FÝ‹ð·Û ÎçJ¥R¯×a•ö¨Æb±€Ùl4#‘4¬h6›¥R @¬¢(xŒR©”Ïç³Ù¬V«mµZw‹Å €ƒZ­.•JJ¥¼Ù‚”J%Š¢äry½^—À†¥R EÑz½>³—ÕS¢Ýø|6}ÿý ~¿jp°†0˲ÅbÑl6ƒzÙ¶‹Åh4FQU*U»ÝV«Õ,ËV«UP%¼^¯V«…eŒã¸`0¨V«išöz½étEÑ\.—N§¡I`išÖh42™ ôüµµ5ÇEQ„©¹Ýnà z,ÏþÑGe2™D"€>Ç)Š’æ'å‚G¾Z­ÂºzõêÞ½{ …Âââ¢Õjõûý…BôµZ ñ±V«¥Õj'''[­„ÈÀÛqàÀPÕ|>ßS¾,?¦Ââàö‡œJ¥2™Ìèè(dxk4i„ø-l·Ûmp„Âë@¤Ùl| Ã0@öJ°¶Îý:’¿išÐ5`@ÓƒvIWè¿L&ƒPð–ÈâÓÏAËåšZ­ ¼Ó^…ÿׯ_ß¿?Ôê\f¶#[¶äuÁ+›žž†¹SïxЉ¢(6›ÍÅÅÅñññÇ­§€‘l6›SSS´Û퇠P(ÀÓHÓôôô4†aù|þÏþìÏàù3™ Láï¿ÿ>A´Z­ÃÃ÷oßV*•/¼ðB©TR©TÙl¶··.zãåË—}>ß7s–‰ *÷ôôÀ+ß²ÖuŠÍöí‡Û¹M’$,&ð£€Û‘âùwÚPÏ cQNÝ)&¦û¡C‡¤öoOÿÚ"l†íX}ȉ …bû)_´à\ç,óÀ§›ž¢(·Ûíóù, ”"I²R©!—Ëý~?àÂAÆ0ìÂ… í©TÊh4º\®L&K„ÓéL§Ó`ÖC^ûk¯½¶ÿ~4/^„Ò~ß«Xz ƒlOÒT† ‰D"—˵Z-Žã¤Ô‘¯W }^ÇCBbi¥RY[[a˜?þJÁí˜B»å-ÌÏÏKc,ÛØØŒAéÈ;wîLOOŸ={vvvv‹u)ŠâG}ôþûï×jµí™¶‹‹‹ñx¼s»Ý¾zõêõë×ÏŸ?ßiÆvþ_^^&ÀM'9뤯£Ñè7>l6›Qu»Ýï¿ÿ>ø->¼ÝA5::*YÈP€ºŸ¹\.Ý£G"›…ןK‰mµ¸©©Èð°C¥’ƒ§×d2Y,–ßþö·ûöíkµZn·;CÐßëõ~øá‡ …bddäÊ•+†9NÀNîÛ·¯[¢è’ ï½·äv«vír5›Íååep®®®òÆ…V«e&™LBU*µZýòË/_¿~=Ê* ‚`6›yž`Ö+¯¼"—Ë‹Å"I’r¹<‰¬®®Êåržç!µS£Ñ´ÛíÑÑÑ‹/B^8 † ^¯W„jµº²²"—Ë ‚€¦‚Ð^÷òåË¥RÉëõÎÏÏ»\.0šb±ØÐÐÑùU<<Og±EOŸ>Ý^’@ö[fq‚¸šBDjGÖyÌööKÏ MMEþíßÖ"‘Ôx¸Ùl&“ÉéééýèGF£1•J­­­¥R©r¹ìv»¡f]oo¯Ïçk6›F’`@]zänêåå˜RéE Fp º\.’$yž‡$œr¹ Šd2Ùh4¬Vëêê*ćÀ$ËÒuÝîx¿ /(ŠBÁ'Ÿ|’H$˲€“Íçó333à9S(Ñh”ã¸þþ~…BG£Ñ€Ê²»w"Aår]«««Alll@e5’$I¨ D«¼^o«Õˆö–‘T, …Boo¯d¾ @Ø?¤#Ù7-z4:êL$²GK¥l“É”J¥Ôjµ{dÆï÷Ÿ={vyyùرc­T*.\€ÜÝ®Ô=BÂqì?ü‡oÁ`´X,gΜL²PµwïÞMªE’$øáMµÛm(ùýï»m Ç (šÏçEQ„j’t;uêŽã/^ CCC$IŽ ‚ V«!“ÊÐÂ5ïÞ½KÓôàà`µZwo»ÝfYŠÒÍÌÌô÷÷k4Èu—p½^F£è?üÃ? ¼óÎ;ÃÃÃétÊŒŒŒÌÎή®®Úl¶«W¯2 3<Ÿ1!•JíÚµËét>goý«{¡·wNÝ2¯=¨j7lŽ<Îö¢;ª9€¾@6;`K¶áWŒ¢}ž*hÈWÀÏ€M¡(ЦéõõuµZ-Šâ|°wïÞóçσÇR§ÓY­Öp8œÏç-K&“)—Ë€(’âiÝ÷pÏÐCÊ_=gÒŽÊ7Úíöêê*$rABe,alllqq‘çùjµÚ××wýúõT*hRÿ¨¼ƒ_¨ÆÀçy/q¹\333f³ñƒáæÍ›Á`p}}&¤t: Hÿ­[·œN§Ífk4±XL&“y½ÞJ¥ñ‰.}ž™ê]ñúˆ$IFó4—ݽç…éz¨( ø¯Îx”Ëå’Ì`š¦À7¡$ÝW÷‚¾ÿþbOz×.W.—ûýï?<<\( ê‚ €š4G޹}ûöää¤Ëå ‡Ã˜¯T*I’Ìd2wNÓ4$ýW*•‘‘‘±±±>ú¨Ñh°,«R©Êåòw¿ûÝ[·nE£Q¥RÙÛÛ›J¥‰D"‘H¥R¯¾úêüü<Ο?²*“É …B.—Ëf³ëëë‚@!¤X,æt:Áe’Ï燆†Òé´Á`H$Ç}ï{ß{æ2º)Šòz½F£X,êt:»Ý3”\.×jµ …ê%“ɱ±±L&£×ëŸæÇ!®ËíX¯TÚƒ]áüœ^Ð¥¥¸\î“D­V'“I(nê÷ûyž1Öh44MÓ4 í|`uµX, Ã@ú¾J¥‚ Äê2‰DúûûËår³Ù ¥J¥ DÞ»l IDAT––– ‘šwPe·Û¯^½ ¾ÐC‡Õëõk×®Á2 åW}>ßÚÚ”‘ÉdCCCápÇñx<ÍÁp— w<[¤V«¡ÈÄvÕ+¯¼²Å=-žj3­³°;Œ$N·åň¢˜Ïç)šËå Ãî«(–FAÀî!’Ëå@oyâŒ{|é„÷¦¤à€©")Ãà¢õXƒ@‚¤Á¥8ŽƒŒV–eq‡ð$åCÉ1(Çnm@°CXÀÒ’“Ð[šbJNZøØjµ¤mAÀéúŒ:± ›EÑx<ît:«ÕêöÒ1["¦ð@ÇÀºjµ P%©ë'œR«Õâñx>Ÿ‡ g‡ÀA@Ë+HóšêTcS©T±XÌår>ŸÏårÁYÇåóyЗ;çââÅ‹ƒƒƒP®áÚµk»wï.‹ÅbÑf³­¯¯ïÚµkaa¡¯¯o~~þĉ¢(¾ÿþû‹…¦ép8Ìqܦ¦¦ìv{:öx<óó󣣣мcyy²½)Š‚ü›áááÅÅEŸÏ‡•J%”™˜˜H§ÓÁ`ðîÝ»•JE&“>|x;Üïwh}J‹Ç¡ô^¡Z%²‡q)Òb æ+ —¥%UœráR0±nÌÀÂea²F§„ëÔ°V-}”°%pKÏÿçæ‹ÊlVƒº¡Óé nQ"‘èéé ‡Ã?ÿùÏ/]ºT©Tär¹Á`(‹z½^­Vçr9Žãt:]:~饗¦§§¡ŠÅbùøã ‚ðûýétÚår%‰‘‘·ÛËå†)‹ù|¾^¯×ëu­V›L&Ýn7ØMF£qaaazzúq799 8öV«Ù‹‰D¢^¯Ãt_.—{{{WWWƒÁศ§Óyþüù]»v-..ööö& xm·oßv8sssµZmyypöÇA%ç¹¹90ÏÆÆÆb±AgÏž…*¤'Ožüøã‡††®\¹ât:K¥R­Vƒ ^­Vøá‡ù!“É666L&“R©¼v튢¡PèèÑ£¾þ´èV«M†¡Ç%“IÐr¯_¿>22BQdÿ ‚ðñÇë[ßšœœä8J%â8Þjµ*• ÌÇíÚµ‹çy’$¯\¹Òl6÷ïß ©Édzûí·÷ìÙ£P(@žHäÜܾ}›eY»Ý¢Ñ¨×ë…šŒ{öì‰Åb$I‹¶Z­&“©P(¬­­8pà9À„qÿ¯ÿ:5>nyóÍ} Ã@Û7£ÑX,ÂaµZQåy^­VSN¬ÕÕUN'—Ë …B4…A´Zíââ"Ô4™LP{pqqqbb"•JI ÆV«uäÈ‘›7of2€|ܽ{®µµÚívµZ“Š•J%ƒÁ°±±ØøL&S,‰„Édr»Ýóóóf³YÅÕÕU£ÑxçεZM¬®®êõzè«H$ t³Åb1™LP­rŒ 1R©Tr§Ñh8ŽcYÖh4ÂÒjµšV«eYvffÆçó…B¡þþ~µZm±Xêõ:tµ Âd2—U«Õêõúh4ªP(l6[­VÓëõ³³³Á`0“ɉ¸\.IYÚ^CEQsuz¤‘yx Ń ”HgËž(Ò£µÁ®^]ôẋ¡Z­ÆãñD"Ýka"ß³gÏÅ‹AÐét###·nÝŸV¥Rî²P³jAŽŽŽj4³Ù|éÒ%h< úÐP2›ÍBB?h=à¶a|||~~¾R©ØíöJ¥’L&>\,§¦¦¢Ñ¨ßïÏd2`Ây½^˜©Ç“zÈÍ“$;bK íëÁ1ÒÆŽ3 åì¤ß‚ÌMÉ~C *TÃÿN¹€ylœ-â¿1¼{FV·;á×?€¶ ‘-…ב‡ÁÚñ°í} ·L‹Ûý1ÒNL0&:OéÐÏÿ!gàÇðàÐ×z\H™Õ01óR©T,ûûûWVVÜn7Žã[š¶¼eˆ´Ûm¨á²Ýe']*ÃsnIqn4R;©ÎQ»¶¶æñx`¹ø²¾¾îñx ÃúúºÛíî¸mÖP„~êÑT«U à / A¹¹9è¬û”€yž‡){ŠÅ¢Éd¡ÝnÃüÝÉ¥l6 ¨h¶þ “œL€¹—Ëåp@:îÌ<ƒ‘ªT*c±X¹\öz½ù|Þf³%“IÇø^XO´Zm£Ñ›ü™Ö«‹Å"$±, k0¤\.+•J†a, TÒ=xð ÅbùÍo~J¥Òêêª kkkÍfóå—_¶ÙlOˆ?üáP¯ôĉ/^„¾PvÜ`0€<NåäÉ“ù|,‡¥¥%ƒÁtýX^^†öHÑht÷îÝPò+‰ŒŽŽÞ¹sDôÆ'ºÝî¡¡¡K—.)Š•••¥¥¥`0l@)d³ÙP(‰D~þóŸOMMÍÍÍMLLܹsgdd¤§§˜ƒó•J%—ËFK¥R*•¢iúÚµkP|,™LŽŒŒ8ÎO>ùìÇ=Ïö9è±ÒÂBÊlV˜LšV«õñÇëtº©©©áááR©Íâ C*•‚fõz]©TÚíö>ø|‡$IÞ¾}H®_¿}ÀÕju½^O§ÓàÝ¿4ššÚµk—Åb¹|ù²B¡H§Óo¾ùæ•+Wd2Ùìì,´EÂÎ.\øó?ÿsFs÷îÝX,†¢èôô4„S©äÍQ¢wïÞ=;;ûúë¯?»N ˜Ñ,‹Ýn‡êB¢(BÙúV«ÞDQÍfs.—s¹\`Ó4 •j&µÔxò<::zûömèþb6››Í&t6+ F¼‘H2$WVVöìÙsãÆz½Î²,Ã0‡ãüùóF£Œ¨ÙÙY»Ý®×ë¡€ Á`prrrll¬Ñh,,,‚°±± "€y•ËeFc0¦§§÷íÛwãÆ h Ðjµl6`³q÷z½úÓŸt:¤h¶•†dÂüZ.—yžß¿ÿ¹s硘h<¸gÏž¯Ù‰õþÏ͉ ó›oî¯T*­V âvñx\¡P‚/ ‹ÅŠÅ¢B¡ ‡ßï§iº,ËêtºT*Åó¼Ýno·ÛÑhT¯×çóy³ÙÜn·‹Å"ä–@ÉuŠ¢8Ž‹Åb6› ZÌE£QƒÁP( Ðí|€-ÍfÓf³e2©¤NgmpE¡ÇO¥R ƒÏ´‹‘ ˆC‡ùýþ-ð$€¯v¶_†Þw¿ûÝí:æÓ£ƒ ÷wxžw8étºP(ôôô@w,£Ñ½'iš. cccÍfszz"]ƒáêÕ«@Àçó---õ÷÷“$Y«ÕÒé4Žã°>;h~ ƃL&ƒÒäÑhÔjµz<ž™™Š¢ÀùF’äÝ»wwïÞ}÷î]ƒÁ T*a,Ž…B¡\.+ùàà Á`¸}ûv»Ý†¾PËB§ÓQa7…B‘Ëåúúúd2ÙÒÒ´œŠÇãPDN¥R9ÎÏD€>Z¬^gd2Š 0p/CÁQ³ÙœÏçív;4 … ¾Éd‚Ö;f³ä,7X ¡Ø¸=AÈf³jµä R̳Ùl&“éééQ*•¡PH&“|: A¤D2ó “\.d; ÃØ°±±100P©T ) 4¦ƒ­Vëë©þ˜€4`Ëd2†a á^êŸÿ+• †aÕjU¯×CXÀl@pn‹çú!=IþÒN,€gI¨¬-_}ÍSÔãøÅ¯!­sRïô!}þi~ÇôÃ#;n?(š°Ý+¶ÝÓöl p±XS*i’ijÙ,4ŽŽÉdòÔ©S³³³V«ò=Ξ=‹ã¸Ûí†ºŽ½½½+++Ç)•ʾ¾>š¦gff yÃ0áp˜¢(èbÿDël¾¸ecKžjµšN§;+6Æ-žn8«R©Ôùt‘¡Ç8=Snt“´ùöÏ©qcËmßÞ~úŽè÷-|æÔfŽãþÛ»ú»ßÝE´‡Ã188Øh4‚ˆF£ Ã\¾|9™LByF¨é =ÐÏŸ?o2™ ü tœEñæÍ›KKK·nÝÊçóO2Hܾ}[§ÓU*•±±±sçÎA‚[µZ}uuuU )•J0ÏFFFîÞ½«T*?~þüy•JHƒB¡€a`0#‘H0\^^FÄf³íÛ·¯›§Þ¥'e÷þøÇCV«E°¡A¸zõê¾}ûB¡ÇQä8Îjµ”R£Ñ¸Ýî……ƒÁP¯×›ÍfOOÏåË—e2Þ¬'8°‰`0øË_þòرcP6‘ã¸\..\¸ Óéâñ84¿, ¢5CCC·nÝ^ZZ‚²=ù|^.—3 £Õjóù¼Óé\YYÈôž‡ßœf¢]zÚh`ÀR¦ÓéÌfsooïjµÚÀÀI’'Ož”ôpë@´ <ö@`ccÃh4BxõÔ©SeùT„‘ œŸO§ÓíÙ³çúõë*• j¾[­VèXÕèÕjõÀÀ¤¹CK„\.g³ÙºM»ô„Ì–{EIÍ¥¤ÔÂNQìtPK…Ûíî¼Ú׃|˜‹¢xüøqP ®c2™ £Pª…m±X¶ø6Ôj5dŸ¢(:44„ ˆR©t8òùWŸìÒs-êÏ’¡‡á8ò ·Þh4jµXêÛýX‹‹‹R" ÊårÉM%ßÅO“´r¥= ä󘙙™›7oB—í”L&!I½P(äóyð“I´¼¼Ì0Ì– Š¢855Õn·“É$|‹< ¦Y—ºôLš÷×®]«V« üúê«$I&‰Û·o7›Íf³Y«Õ Ôüü¼Çã±Ùlÿú¯ÿzüøq«ÕúÁð<ÿÚk¯]½zµT*iµZ)+R¡Px<žx<År3™ MÓf³yee%N{½Þl6 ^{íµ·ß~²Û8Žƒh­Ãá¨ÕjW¯^u»Ý±XÌd2¥ÓiŠ¢F___(òûýF#ŸÏ»\.ÈùBQR:“Éä•+W<ÏÆÆ†F£ÕP™3336›-N'‰Ó§OÛíöîëïÒ³NØôô´Ýno6›™L†ã8µZ­Õj€TÁ Ê;rº¼g2™Z­ žçs¹œÇãÉf³P°rÏž=4MŸ;wN«Õ‚× Õj’Y–ãyzðÆX,h5Qm6[¥R‰D"v»½^¯›L&@Cfb>Ÿ§i:™LV«Õ‰‰‰B¡5ßšÍ&è¹\½V«µZ­:N(J–ËåœNç;w.÷ ïØ¥çg~ë­·d2™\.o·ÛÍfÓl6B*)t…P«Õ )Éåòþþ~¿ßOQT0ÁqüÅ_Ìçó§NŠÇããããEétºÁÁA³Ù¬Õj¡å,‚  ñ–J%ˆªY­ÖJ¥‚ã¸ÏçÓëõ­VK…B6†a+++.—+C9l¸ä@Cå1¥R©×ë‹Å"À-¡–B Ëår¹rèªÕê‘#G uV¥RÙl6¥R‰Dž›L×.}Ó-v(þÜYÚêA8žÎì3d§¼¶íIp;&UîxÌŽ%Îw„mñ4l?ýAyy¹«鱦v©ËÿG£Bƒƒ¶IªÛ5ÌNŸl—J¥ååå-y­öðÂå;B‘r…ÁCÛOß²ýðkv©K϶ ýûßÿªº7›MÇ‹Åpíµ×~ýë_a6›÷îÝ;55¼¡tp:öûý>Ÿï©JÎèR—¾Y+0Xá8nppŠC`­V ðn“ÉNf(ÿ#—ËËå²Á`(•J‰V­V»|ìR—žÌ <:: ™h2™L£Ñœ?Ú”A‚Åøøx"‘€2ßÐÓŒ š¦Ëå²ÕjÇãRM‰.u©KO@€;«çØíö3gÎ@Rªsíóù U7Š¢v»]BbaH¬.»Ô¥'&À¿úÕ¯>ç¡rn!ÛYï+è®Ó퓸<[Äq‚´ýÛßþö‰gbtùßåÿŽ?ý¹–PÈR€z oƒãZ¡P´Z-¨,íÞX–m·ÛpY‚y½ÿ·(Ò(Šà8Âó÷žÇQQDx^$I¬ÝP!Œç!Ü ?‡`ø“Ž1ì ¬ókkÿ¯ 0/ï R—ÿ]þï¼~@’Ûíöx<•JºŸà8>;;ëp8âñ¸^¯÷x<¨À0¬R©Ü¼y“ã8Q¼w† éiµš&( ­Õ8Q1 ‘¢ðX¬îv«X–§i¼Ýärœe‚@ÛmA£¡J¥Rë B§žØV—ÿ]þ¥˜¢(¸oè£y4MCw2Š¢0 ƒ¢MзaË D’÷à$‰a4ÈÑíV®¯×pÃ0D.'ªÕ6A@4Wä8ÃVëþäô]ºüïò@òç·v|¶Nàħ‹úaÍ‚@Áç^YÄϬjðõOÁÑ蟃íÏÏ¥Çmƒuùßå—ºÔ¥.u©K]zâzÁc½:†zý  Bð¼HðsNpO1@ѧT=(.Š"÷L¿]§¬Öo#t¾ïÌ”Š$w¶Ú(•z[ZÏ4ÿ;Çÿ¦R½ÿ¿Êø'÷ÇDF¨×«J&›pÓj5Q©´EQ$Iœã„f“ ¹_,^yØáxK†šÍt©Ä"Š "MÍ&'ŠA •Ëåv»Ëå0 ƒÒB$@QtË:L’X  EÃPëuN.Çe2\‘h´>1aÈd˜J¥­Ñ¥R»» ?Cãÿ«ÚÀ@ ‹ñA%3Žã‚¨T*Ífs ÿ1 1›iQÆq”$±V‹‡m–å Û´–»üôã_­&:Ç?EÝÿàôúÒãÿÑðs R1¶­÷f}­–džaxA@4 Öh‡ì*†jµîúb´…áÍfsGþ‹¢ˆ ¢Ñ(«×¹FƒçyÞh”aÒlòJ%)Žc·åmvéiÿŠâ;ªfèÑPDE¤XdÀ;R© ’.Ýl6¶LTOƒZº“ On>Ë—¼ÂcÐN?ãŠÀLA¸Çÿtº{r¹¦¡­ÕXé5AD Q~Ù!!~ŽñðŇJ|m|{¶Æ?êrý_ð""ˆ(âæG°°Dé¿´_ïÿ—ÎÝvä½(ŠÁ€-Üy˜( Ãú ]Y|Ð5á¡UÃæ ˆ›lÍEz8 ó0A¥;¿ÿ›}Ø:ÿAhKlýÿp\ ‚to“("##®@ÀªRÉ´Zå±c$Itheèã7ÄO³N|è;r[|ÀYŸy}ñü¿÷à2¾¿åŒšÍr½žÖh(ET*ЦÉÑQ3Eá?øÁ NG ò`Є¢ˆVKƒf½žÞµË î:£Qéñè %E»w;ÔjzlÌyà€—e9E‡†ì&“Š¢“I=4äìÝ-7óÈ9ÿeÆ?þñƒƒ¶K—V_}u(-œ:5(Šâ¾}^†i¿ôÒÐúzî…»v9#‘œÇcŒÅ ‚:äGÔfÓ¼øâðúzêÔ©Ý&“¦VkîÝÛwëVˆeÛÇíÙÈfK‹‹?ýéÉh43>îß½Û‹¥^}õ Aà6›æèÑÝé'&nß^~€Œ!Ÿ%„ÿê3øóŸ‚ØlßGQ Åþ~]:]F«ÉdýØ1ÇÀ€ny¹øÃö8`_Z*üð‡V«R£‘ƒ†d²öç>Ša¨^O9âQ(¿ßäriþê¯öÇ㥣G}wîÄQýéO'L&•ɤÌçë¢(þä'{óùÆð°cxØ È~´y9õúëc7n¬=@6>S¨ÄÏ-3OÉõ·òß`8.™Á.—²\ne³ÍÕÕr½Î½úªgi©xü¸s÷nËúzÅáP™ÍŠõõÒ·¾å+šn·öÄ O8\üÞ÷k5V&#FF¬¥`Ðl0ÈFe¡Ð8uª?®¢(28h3UÇ9ÒW©0ÇpÃ0´P¨=êñ&î4ß}™ñýò—SÿôO“ÇÒÕ*{÷n*´­¯ç …ÏgªV™Ë——ý~«^¯D‘ 0½^¥VÓ†V*Í»wårC­¦gfÖïÞÝ]ÃfÓ»\†K—f)ŠH& ÓÓ«r¹ DZ™™õr¹ŽãØìl$ÉÌϯ³l뙋= ŒÝ®¿?Žc×®¥~üã7R‡^O1 IDATj×.S&ÓñÚµø… Ñï?¸¸˜CÑfSëõ´Z- …rccöÉÉü`ôÆ ˜ÈÒÿûßøÛ¿=«Rɼ^#‚ n·áÊ•ÐLJärÊlVÚóùZ×Ù T¯sZ-Åób¿ÎëUJ‘$ñ+W€N£¡ªUAH¤<3“Ñje¥ ¢ÑÊúz ÇQ ÆS(ÈsçBÌjU!Z­²ÅbCDN>7—X_Ï«T²ÅÅÔúzDZ§™ØO~2þï ‡Ãùõõü_þå!–m:Ôû¿þו½{=¡PÆhTÕjL0hS©dRѵšÖé”N§±Tª#R«1ssù—/ûýžx^xõÕ}*•â¿xÅ㱪TŠÿïßXY‰‡Ã©¿ú«3`s_©ÔEQ,—kÏpOÅx¼N’øücû·û~÷»µùù¼Ë¥ž™É^¿ž´Z ×JL»ÍG£‹Euõj¬ZmMO'E±ÛÕ©T-‘¨|ôQˆçÅP(Þél¶Æ²†¡4M¸\z•J‰äþÝ¿;üÃî­V™¥¥”ͦ-k]„#¼L¦©ÓÉÞz«oÿ~k"QW«©7ßô7\0hË C[-^­¦\.õÏ~6²°­VYQ+–ey†á …Æk¯ þ >š&­VµNGsœ Zk5vv6ñ“Ÿìs» ™LµÙl±l»Õâžæ5µÙþÖUð‰â½g¤÷‚mÎtا±"[LYáÓá_iöcÒ°–N:·3EE•¢n"Ž‹¢ˆÄ=ÆvHË}Îüdùÿ‘Íá„IÃRêŠ _ ‚¸|7/uÏ“,i@[ø/ÇO›ü¹úæK¿ÿCÀp¸1é”/7þ‰Ÿüäv'ûÚT¯ã‡þþïÿžaîá‡ñ‹ºB!>øfÐÍ1ýÔAPžî÷ø0úë¿þk(¹Œ È™3M™L|0FÜœ ç…ÿ_à‡Ð÷Þ{¯kWíHo½õ–Ô!>kµÚ.O¾Nr:år¶ýë_«Tª.O¶AÓt— ŸI …¢³c—¾÷L‡×ަéî@ÝÙ ÝeA—ºÔà.u©K]îR—ºôHøA EQº5`»Ô¥§D€9Ž»uëÖÚÚ@/nܸÁ²l(šŸŸo·Û‚ „ÃáT*%Šâúúº(Šï¾ûî»ï¾ …ÄP—§]êÒ×FĹsçjµZ½^_XXÈçór¹|}}Ýjµ2 “ÉdR©”Ñh,—ˇcmmíg?ûY¡PP*•…BannŽ¢(Š¢äry8&IR&“)Š_|‘ ˆ.g»ôD¨³ÙçŽË‰Ô6Pô>H¦^¯ »Ý‡µZ­ÅbyÈY[þwþD±XÔjµ›YŠ÷ÎB$—Ë‹E—Ë%“É8ŽcF¥RP ‡ÃF£ÇñJ¥BQ”ÑhÜró,Ënllèt:³ù|ƒ8qâÄåË—kµ´0V*• ±­V«ÙlªÕjžç8‰D *—Ë@4Åqœa˜V«âªV«u:¤ï p—žåóµßýnîØ1o_Ÿe™?ýéO.—+™LjµÚF£Q.—1 ¡PÃ0ŸÏ—Ëå@º*•Jÿôô´Ëå2™L Àׯ_w»ÝPïêĉ“““‰DbbbbnnÎívG"«ÕšH$|>ßúú:Š¢~¿?“$‡ÇÆÆ"‘H ( •JÅëõîÚµkvv–¢¨jµº¾¾ÞÓÓ‡)Šóù|}ô†añxüÌ™3³³³ñx¼Õj §Ói™L&B¡PÀ0ìÀétzccãøñã8Ž#B$yðàAQÏŸ?/ /¼@¨ÓËËËwîÜ9}ú´Ùl6™LPi騱c•JåÔ©S¥R‰¦i¨I?22Ò~¿_&“uGR—ž…ÙÉÉ ½ëíµ$ »Ý.‚Z­.‹$I Š¢R©ÔÀÀÃ0ÉdÃ0Ð1-ËÜÜÜèèh±XD„ã¸T*Âáp&“Ñét<ϋš¡¡Û·oëtºÕÕU£ÑX­Vá:@€çùX,ÇF£Ûí^^^¦i:•Jõ÷÷///g2™¡¡!–e•Je(‡Ã‹…a˜\.÷)‚Åb¡(J¥RF§Ó¹²²’ÍfM&Af³Y&“±,k·Û———¡€‚ Š¢Q8}ú4Š¢AHJÅøøøÐÐH)EQ …EQ‹Åb6›1 3›ÍºJ§*Ò¥.=Ú³Çg±¨#,°¥RÉáp¤Ói·ÛM†a†q§T*yž·Ûí™LÆb±hµZ¹\’`UA£Ñ †J¥‚ã8A8Žçrÿ?{ß×}Ýû¿e{ï‹íè‹°€Ý”BŠ’%E–剜ŒãÉÄ_2ãñäC2oâj€e±€ôž;»woýß9çwÎùðþýûÁÆÔététZ§ÓÉd2£ÑÈqœÁ`°Ûí"‘ˆ$ÉúúúÅÅÅòòr™L‡Íf3ŽãjµÚl6WVVNOOïÞ½{qq1WTTˆÅb‡Ã|ÀB¡Ðår ³Ù¬T*£Ñ¨X,‰DPóA$%“I•JÅ+¹ØÅ‹K/~S9vìJFÕju©Mž¤h4šX,ßO:õ¡”ëlàbÛõ!÷¿ß™ãñ¸B¡(â–Úäû¶çóy ÃÁ¦÷³é±7BÑ>. I$ÇÑ4Í® ¿–r777799yýúuÈÎY^^ZZZâá8îÆ¹\Ž¢¨©©©¾¾¾ååeð6A½ Ø“¿!(S|,Ï£›Édæææ&&&hš^wàs ºlÜRŒçó/¢4¤FŠ»{17ئ¼éþ÷¥R¹nôn<ä~g€í"‘H(nz?÷;vãF¡PXUJÆãñóçÏ«T*X¬ …BEEE}}ý¥K—¼^¯ÓéÄqÜçóÑ4½¼¼|üøqdzºº:;;«Ñhfff$É›o¾™Íf?ýôÓ@ PQQÊårz½þĉù|^©TªTªH$¢×ëkjjFGG;::z{{ Åo¼áõz———…Ba[[ÛÄÄD,Ëår“““Pâ¦é½{÷ãÏ ÊW¬ƒíP<–ÿ„™LF*•ò;Ð4 s¹ÇqN§“$IØauuU©Tâ  ‹¯‚•2ý‹$•ÊÊdbÞ »råJWWBhrrR"‘ðð_|Á0ÌáÇ¡ (˲Çápà8>>>^SSƒLk+·3‰’ËåétZ$ à¤&" * ‘H`·D"‹Å,ËB)Úæææ©©)¹\®Õjù³X,jµZ*•¦Ói–e-K>Ÿ …™LZmll¬P(èõú……¥R©Óé`6‚KŽŽŠD"˜ç ƒ …B›ÍÆçôm}¡iæÆ™íÛR©(ŸÏß½{×b±$ ½^ïñxš››GGG\øÕ¯~•ËåzzzÊË˧§§›››ggg‰„\._]]5Ÿ|òIgg'Ì€$IÆb±ªªª`0h³ÙH’Ìf³‹¥4†AÆÇ}ï¾;¹s§îðá&Pž …‰'À¼Ìf³“““N§Óívc&•J'''}>ŸD"Áq<ŸÏ_¿~]¥Re³ÙÙÙYÀk·~ ¹cÇŽD"ö,°n¼öÚkàÈb†¢(·„Bacc#˜æeee¹\N ±sçNP€år9AÙlV,¸Âq<™Lj4šh4*—Ëãñ¸F£)ÇñãÇg2¥R 6Ì Ð#x âYé@gÎŒþŸÿ3zðàôßüÍŸ„B¡þþþ\.§T*!6& ¥ÓéÁÁA©TÚØØ(‰ÒéôÀÀÀéÓ§#‘Çqаv»]£Ñ ;wN ŒŒŒ”••Aƒüë¿þë_ýÕ_>}Úb±( ½^o±XJCD&d2A½ÞFÓt"‘`YV£Ñ( ° I’¤( ̽\.‡ã¸P(d¦ªªjddm¥R©V«'''!Ìa«`€×1 Óh4Å9ï "IR$ñ:AJ¥¾ðû€R.ÝãÍ‚y«ØŸ—€O€¯ÁÓ ÇÂðïÖo²(Ï;v”ß¼9~üx0B{½ÞÆÆF¹\n±X†iii¹zõj.—“H$Ñh´ªª*™Lf³ÙœNg8¿†a‘HD"‘ „‰DUU¼‹Ÿüä'>Ÿ¯¢¢¢µµõìٳǎ+[^Ãÿú_oB/. “““àå»n"‘€Žwøða†a`9‘Éd8Žk4šŽŽPž‰Ò ýˆQhùŒD"KKKMMM¼=Ö/¾³.‚6ƒÁÞÞÞãÇóA< §OŸ®­­u¹\üÎ Ã|üñǯ¼òÊ3¤¡<úÛ`O"ùF0çýŽÂ …B¡PÈår7nÜ8:•J±,Ë—x‡ø²óçÏSuíÚµB¡À0 Ä`QEÓt:†£yÎd2 À9 ê7˲Ùl–¦i¸¿ò\¢ †étºææf¾ Vð>Q?ÿ—Ùl~ùå—ag¬HŽ9R^^ÎÿèåÕW_݈‹>*Èú9{5ÅOSüh0~-Ô_ì(öP‰DŠ7‰D¢P(¬;!ø\ ê#ûV¢Ñ(ϾFÓôº³Ù¬ßï÷ûý€k®»ŽãÈ'Nd2ð ‡B!©T:11QUU …Þxã[·nÅb1¹\Å‹!4„$Iˆñù|A,..ºÝîP(tôèÑD"qùòeµZ †Ñjµ]]]"‘è³Ï>S«Õ …Âãñ”••$355ÕØØ¸wïÞç ƒ.2 K$`n|­D"µZ½ÑÇøà…aX.—cÀ ^b±˜Z­.^á7†ÙoÙÍ‹J&“àöXwŇØ[ð….,„5©R)I§Ó}}}µµµÓÓÓ‹ÅëõbV^^ …ŒF£ËåºråŠB¡À?ŸÏg³Y©Tj4Ãáp[[Ûâââ‚ÑhŒÇãï¾û®T*U«Õ555óóó;vìˆF£¡P(•Jéõú@ àp84ÍåË—b±X"‘ÈårÕÕÕÑh´³³“ ˆÛ·oâ«V«¯_¿ÞÙÙ) §§§F£\.Û¾}»R©‰D555Âá÷ûá]6› n1 aXYY™^¯—J¥ðò0 ‹Å† ¨à§ …N§Ól6¯¬¬„B!°{9ŽS©TàöÐëõÉdg¿ßè”ÅbÑëõÏÓè-èK—&;;Ë I¡P8sæŒÝnåY£Ñ,..655---ì) ƒÁ ̃b±8Ëårš¦C¡Ð¶mÛ"‘ÈíÛ·›››GGG;::ÆÇÇÍfs<奾¾~ppp×®]ÓÓÓ7nÜxá…`bÕëõ‹‹‹ãããuuuï½÷ÞöíÛ½^oWW—\.ïëëƒ euuµ««‹eÙK—.UWW‚ …œN§×ë•H$eee333v»}nnÎjµÂ‚ã¸N§»zõ*ÜUeeåââ¢Õj ƒµµµƒƒƒ £££N§Óápl5ïÀÿý¿7[Ztú§…B!™LNNNæóù;wî8𦇇‡óù|,³Ùl,Ë‘Hä÷û!Ä*—Ë]¿~]*•ÂëóûýÇÅb1Š¢Ìf3˲R©ôܹs&G"Çc³ÙFFFÜn÷Í›7›ššX–U©T‹Å®_¿†eY“ÉtýúõÆÆF¡P¨R© çauuÕd2Q]]-8Žt»Ý,ËB!èP(ä÷û±³gÏò3k>Ÿ'T*ÈŽã8øÉqd/@¸% BPçr¹œT*M¥Rr¹Üï÷¯®®Ö×ׯñBA¬®®œÃ0 ŽãwïÞ˜˜8vìAr¹|Ëà?Àþ쳡ÿý¿GTþô§Ç …ÂÉ“'“Éd"‘€ˆ<·Û=22ÒÞÞþþûï«Õj—Ë% Aû"I’a–eGGG ‚øÉO~b2™þýßÿ¦ö3g΀ët6F#—Ë}>ß«¯¾fgg}>ŸÅbÓét===¿úÕ¯Ün÷_üÅ_|öÙg+++mmm£££¯¿þú|0==­T* þ}ûFãÕ«W% Ã0Çjµ"„êêêæææt:Ýôôt6›Õjµ‘Hð·Þz‹ ˆ“'OÚl6¹\ÎCë@­V' ›Íf2™ÂáðŸÿùŸoªÛ?E8Ž+R‘HÀ»÷B¡Žã&“ Tâp8¬×ëM&S0›¦iF`Šuuu‹‹‹|ÄDccãââ"Ã0:ú|¾ÆÆÆx<žL&¥Ri?¼¾¹¹9“Éê MÓðo8°òûý~»ÝîõzÍf³T*ÅqÜãñ˜Í楥%›ÍFÓ´X,N$"‘¨¬¬Œ¦éX,($}™9ß¡¥x3¬¸áøb v€©ÝjµB'(½^Ï{ÃBmmmmmmÏŸë’ã¸îîªÑQÏë¯wBB‡gpppxx¸¹¹Ùb±tuu‚ãõzm6ÌFŸÏwàÀ¯ïëëËf³—/_Þ½{÷ÐÐÉd‚ùÜo‹‹‹ÙlV©TÎÏÏ×ÖÖú|>•Je6›{{{÷îÝKÓt&“ÑjµA\¸p¡§§§P(À4d·Ûõz½@ ¨©©9uêÔŽ;úûû_{íµO?ý´®®.NwwwOLLØív“É4>>~äÈ‘³gÏf2«Õ zµR©œššªªªª¬¬„ßÜÜÜ×××ÚÚºeÙçt:ô8‘HÔÞÞÎqÄ'óïÎd2AŸ4›Íë'øb6›1 s:N§“?-|‡ ÜH§Ó?eçÎÔPÜùB h6›A5³Z­6›ßWÔjµ¡b!ËD’$‡%ú¯Àk´æ<ïö—æbss3DÒÁ”ÿµÑ¹Å§›îvs½ÙF÷J^àÅö*zG†­»û·p•b tÝå6ÅWÉìüøPhÀðC¡ÙlN§Ó2™,N …B@°îÑàÁãñ¸R©ŒD"Z­v£fÁq\0Ôét°BÔƒJ¥â_Dñ©Ùå8Ž$ F X²ù,8„+"„†††惢»zõ*¿…GÞFFFÆÆÆhš¦( |›333JÃ,ËR577755Åw,ËÎÎÎNLLÀ9B^¯·8²®ÙÁ`¼íýýý ÃŒŒŒFGÓ4ÿu83EQàýã8.BK!„¦¦¦æææ É^Þcb‚ÊÉÅϲ,ôÂöövÀ „B¡â{(ŽD"‘H¤ÐÞZ7Èý~??×(þÌÃîï7Òr¹OÈ\ìôº×cŠ€ôb)Þ²µqŠÂ¥K—VVVfgg³Ùì­[·¢ÑèÅ‹çææ |øÂ… ét!4==}íÚµùùù3gÎx<žóçÏC$6›M$ÐÎ###·oߎÇã~¿tt4‹ ß¼yspppzzº··wzzšôܹsSSS½½½ãããï¿ÿ~&“> ¹gΜYYYùðÃc±Xoo/ÏhÿµB^ºtÉãñüà?ˆÅbçϟ׶D"Éf³•••MMMápX$I$’îîî¡¡¡P($‘HX–]\\Äq< Á588Ȳ,`-*•ª££†Myy9YaØÊÊJ>Ÿ÷ûýYJ¥fgg @"‘|ÿûß?yòdYY! ñ///§R©ŠŠŠ@ €ÍM.— •Jå÷ûiš6 CCCûöí³Z­ jµš ˆ@ €ã¸L&¼ayyY&“þø: EQ—/_v8'Ož<|ø°X,…B&“)N«Õêååe¿ßF›ššúûûëëëívû•+WŒFc__Ao¾ùf__MÓ.—k||¼»»»··×áp@ÔZ.—Ëd2mmmápx``@¥RÍÍͽúê«¿øÅ/X–íêꪮ®žššêêêJ&“º.--9Îùùù¦¦¦¾¾¾®®®ááẺºÉÉI¹\~öìÙ_|qqqQ¡PÌÎÎîØ±£···µµuvvV*•¶¶¶>7&O.—ˆ(‹e³Ùd2 Ióáp8K$’X,–L&@¡P izff‚¥A…†–§( Ã0µZ½²²R( úÇñ•••x<‰:nuu•eY ÉÈårG,g³YN'•JÌfs2™„ùÂçó †D"‘Ïça >L›“°Ð „D"ÉårB¡œÃ0IC~¿V«…”ƒ\.à×U«Õ‘år9™Ljo ±XL„ßï—Ëå|dµV«…)@.—CGœœœ„ôK Ã$‰J¥ZYYQ©T±XÌétcfUUUÀï÷ °ôB¡Ëåšœœ”J¥V«hà®Âáp6›5™L$I¦Ói¹\žËå\.W,cYöñ `ŽãB¡ÐÄÄAƒáÖ­[E™L¦;wî,--Y,pKX­Ößþö·Û·o¿sçŽÁ`XYYéííµZ¡¨4ºvíšÓéôûýÁ`p||¼§§çóÏ?_ZZÒjµ€vlÛ¶í£>ª¯¯¬@Žx<¾¸¸ô J¥â?ýôS±X|óæÍL&³¼¼F£ÑèÄÄÄÄĤF˜Íæ`0¡Âb±øäÉ“û÷ïÿàƒ¤Ri>Ÿw»ÝöˆR©|á…„BaEE…@ 8xð H$*//'‚¦i‘HÔÔÔ¨ÞØØXEE…ÕjåÐx…BÊ<¼£={ö€ÈŸbæ`Pª1 £(J&“íÙ³‡¦iHY8Ç<(ìv;Žã555‰Äb±<<Ž@=zÆÌÎ;“ɤZ­ŽÇã ”ƒï÷7Þ iúîÝ»ííí¡Ý»wƒg¬£t:Íór€åõz¯_¿ÞÝÝ-‹»»»!ò7Þ- t]x*@ÐÜÜ Oqdõþýû ‚P©TçÏŸ¯¯¯oll%Y tttÀ0®®®†ˆkÈX™Z­C!tüøqÈ àÁ9Hýv0BkG‘J¥"‘ˆa˜ÊÊÊl6›J¥‚Á`GGGmmm<7:N©TÊd²›7oÖÔÔäóyJ‡é,"µZ »I¥Òëׯ+ŠíÛ· †l6‡9ŽkllìïïïééÇÁ0¬¶¶V )¸…nß¾ÝÝÝ-‘HärùÐÐP}}ýõë×+++3™ÌöíÛÓé4Ì×@RÛ3™LgggoooKK †a°¶ùFçP(ÀŘÅW@¬ +ë,òË7ÚùÂó†<Â…ñáUÁoŸÐíðàȇ………K—.½ôÒKfÝíõ÷÷oÛ¶ ŽãVWW?ùä“ýû÷Ûíöu@Ôƒ£,ü~?EQÅG¡¯æ6>€?øéf,>Z+“ɉÅBÇ)Šš•H$ ÁQ599ùï|çĉÆP__áÂ`±©««›žžv8KKKUUUB¡p||¼¼¼|vvÖd2Åb1‚ Òé4EQ‰„ã¸ÚÚZð0MNNÚŒãx<×ét@@£ÑˆD¢óçÏ÷ôô@,ÓÕ«WÛÛÛ———išƒE(ÎÏÏ›L&—ËAZ:N¡P|ñÅ™L¦½½],Ó4íp8æææ(Š"2€æ!{zTö6z0JŸpGäÑàìãr¹ظgGGÛz½þí·ß~@BùýÞ¸"6m“M/úÚêÁXô·™=y Ç?ÿóu·[ùÊ+m‰D"x½^ Âñx<@þ‹¡X,>sæŒR©÷£>jkkÛÈȈÕjݶmÛíÛ·].×ððpMMÍäädMMÍòò²Ñh4›Í·oßöûýÉd˜±@ìîîîïï×étb±øòåË`6›L&€Kd2Ù;ï¼£×멨¨8uê”Ûíž››“Ëå/¼ðø‡'''WWWp·ê’x IDATghhH£Ñ`4Çb±²²2È ­bžA—ð ìoÉÊd2$Iž={V¯×777ÀrñâÅÎÎNpW¦R)‰D6°L&R©4›ÍB&0k‚á ¶VoooOOMÓ€À¤ Ó$ØÏù|LG°ÃÁe êP6›%IR(Æb±ŽŽ™Lá%O¬ß¬«[¬Mm$1]çéÙ¸Š®ûîóùŠ]—ëÖ[¿ßo2™Š›ÅƒŽ… ‘ã8ŸÏg2™ xŸ%ïh¹q…‡/ Ã@Ærñ¿R²îøŒF£"‘詤ø$ñï8ìv=Žc"‘Èn·K¥R‰D|ÉŸÔØØXWW™ýv»=™LšL&µZ=??¿}ûvN—Ífår¹\.·Z­“““V«Õ`0¨Õê¹¹¹öövøwiiI$}§P(ZZZ`‰ÖjµSSSƒ!™LBŒ$¬ÀÓÓÓ2™Ìl6ONN>|xnn®ººÚd2ÍÎζµµë$~K¥R‹ÅX€ÙlV£Ñ`?úÑš››C¡P&“I§Óð÷¾}û~ýë_çr9«ÕªR©¢ÑhUUÇqV«µ©©éôéÓÉd­%ÎÍÍ555år¹#GŽœ;w¦Ÿ]»vݽ{8‰-˜X±XìûßÿþÍ›7ÇÆÆìv;Äšd2™d2ùæ›o¾óÎ;‡ãîÝ»---z½`z—ËŲ¬Z­ŽÅb‹‹‹F£1›Í:ÎH$éÚ…B!N÷»ß}÷ÝwAE4£££;vìØ±cÇðsÊdò<¸ɤÎår—.]*++üL©TÆb1FSQQ122âõzwîÜÙÛÛ IüÀ¿á÷û»»»³ÙìÙ³g·oß><<ÜÔÔ4==­P(vìØñ‹_üÂl68pàæÍ›Û·o×ëõ/^4E1 á“~¿ßív߸qR‹q¯¯¯ŸššºzõêÏ~ö³………x<®×ëÃáðÅ‹%‰Ýná…(Šºrå DbB€gyy9ÄWŽwvvÞ½{·ººÚn·ß½{8â …‚Íf;{ö¬ÛíN$jµZ,SõᇶµµÕÔÔܹsg÷îÝ7nÜhjjššš2™LgÏž}饗ª««r>}¬ÙHÅ\±jì­ÅïzSÖ+~ãÊÊŠ\.ç9UÀèÛt²^7Ýϸî–65†á;L4$Žã¹\ò(ŠòûýŒV«Õçó©Õj•J%—ËËËË@2™L¥Rš¸´ÃáËåt¹¾ƒ¸Ìfs___ww7ÄëŒ …×ë…¨ÌÖÖÖ‰‰ ^ç4J¥Òn·›Íf“É455¨µÕjÅb02­Vk*•‚Ϊª*੆Ã,[£ÑÀì˜Ö C/Žÿò—cËËÁŸþôx#|>ßøø¸V«Õjµà6øë¿þëþþþÖÖÖO>ùD*•¾÷Þ{555‹‹‹gΜ‘Ëån·»¯¯¯¥¥­¾øâ …B±°°°mÛ6Žãt:Ý?ýÓ?Éd²l6{ôèÑÙÙÙT*uùòeNg·Ûÿó?ÿS¥Rݹsç•W^™››[\\\^^µÛí † CD—Édr:B033#‹ÁÊÊJ0Ìçó‹åóÏ?ïêꚘ˜H&“.\˜šššýË¿üË7nØíöÓ§O¿ýöÛ$Iž8qâÇ?þñ_|‹•\.—Édù|þw¿ûÝ>ÿüs¡Pxúôiºº¥­ ØŒ H&¤ô›ëìŽuäï_’EÞ>¸ŸÙ²nû¾ðß!·”|ùå—e2EQE ‚Ó§O\~üøq»[ZZ`lCü{ôèQˆn‡3æóyp3à8¾ÿ~˜Š€ý@ ìØ±ƒ‡L´Zí'Ÿ| ù«¯¾ Õj ÇñC‡‘$Y[[ êú±cÇhšæ±>ˆ8Ž?­Á`øâ‹/`v?räü…ã8Ï8õdôçêR©äÁƒ-RUU•J¥(NétÜr·nÝjkkóx<.—+„B¡#GŽ„B!•JÕÚÚúñÇ×ÔÔ@NHeee:&ÂápLNN¾ýöÛW¯^"nÈ!;pàÇqÆáp,//777þùçÝÝÝÐíííwîÜ-±®®Îf³%“I¥R™ÉdT*•ÍfS*•àÆP«ÕE¥R©@ ÐÕÕ500^âÚÚZŠ¢ pee¥³³-?ûÙÏ@GG‡^¯ƒõõõÉd2ßüü|4M¥R6›ÍçóíÙ³Çn·öÙg6)Ä>Ÿ¯©©éòåË›žËåššš&''ûúúþöoÿ¶¿¿iiiÏž=ׯ_ß¾}ûøø8BÈn·ƒÁƒ>1B/ŽûR?* B¡0›ÍJ$øžËå€råùò`0yñQ·ýýýííí£££@L ù½åβìäädCCÃÔÔT2™lhhH$€ ±,ëóù …‚Ùl棕yï,BH$AX!D_gðüüþøã¶¶¶¥¥% æ&‚eYð9™L&À_~ùå3gÎüéŸþi(Êår½½½F£±¬¬ìÝwßÕëõ“““¯½öÚèèèÊÊŠßï £££­­­Ÿþ¹B¡8qâDccãÜÜܵk×”JeGG`¿ûÕ0 ó›ß •—Kwî¬ ‡Ã}}}6›mjjJ*•B‚¶¶¶ááá……ˆt8vìØµk×À)SQQ±°° ‰A(‚9hii xáÏž=+“Éb±¤¸ÝîÑÑQ $‹ÅÑhôÅ_œ™™|; †ˆ‰ÊÊÊ‘‘¢&“iqqQ¯×§ÓiȺÑétí^·nÝjhh²[ˆ~ùå—OŸ>]Z±:ÔȲԞ=õ†)ŠC‡744@,4MÓÕÕÕš£Ó醆†šššVWWãñ¸Óé, ßýîwjkk1 K&“@”´/f³ùäÉ“¤iº¬¬ Ã°æææùùù½{÷ò/.— œä555Ùl6“É”——{½ÞÚÚZHlg’Íf«ªªZYYyõÕW¯^½zèÐ!™L+CôNuu5EQ¤×ëOž<¹oß>’$år¹Á`xá…†Ñh4555^¯·¥¥åÌ™3;vì€ô/ƒ˜FFGGÛÛÛçææÜn7Tö8vìX8ê©'ð^pǰ¬B¡EƒÐÔ••ljT$äy)Šš'ÈU²X,P1ò„ÀŠ4}XxÍfóÌÌŒL&S*•`éhµZ ò…Br¹\,C)̪PÃ@(Ž‘$ér¹ ¸©@ Ðh4v»ÝçóA¸„H$ó–zFzT?Ã׃<ÞÛtùã”G•Ðÿ€tÜX†Þaž ‡œ={vïÞ½Åõ%‹J¥RwïÞ÷ÒÌÑu4w÷ {x™™™q¹\<:ýÅ_”——WWWm{´(t± œ|úMñÆuäéà/~^ؘÔ]Ü€<¦5Á‹Mn˜Š)Š?ù‹³ àÒøo~ó›©©)yƒ'™L®®®®Ë8/ÉCjÑÅ íÅÙíGÈý¤øØMÿB_-ÛÅo?tèк̘bQ(;wî|ðE‹ïyÓ›ÙxÚ¯}p˜ñ?¿óþ).* D­<Ïñðð0Ð!«ÏÔÈÀqóæM`Àƒ¸ EpEQwïÞåI&†Éçó0IÊk ¾è„Ó4 {p?p Ü ä{ÎÏÏó$Íp-ÀÌa&Íf3Ã0SSSýýý07@r™X,îììÜHpU’o´ƒ5H0‚¢ †Í¦ëêý–/xëÐÛø|ÔMƒ«Áâ &“ P€Óé¼téÒ®]»¾6‰²øŠym§§§+++í_Ø!ÌkÓ'J¥R`áÃý§ÓéÕÕU—Ëõ„U<–eOœ¸ër)¶owÛÀ€3 <44äñx ,ÿرcW®\ÐîÊÊJÇ#„Ba8æm`š¦>|ñâEˆù‡¡èv»/_¾ ÁsB¡°££cqq11KYYAµµµW®\‘J¥Z­vvv”sˆŽ~饗FFF¢Ñ¨P(\]]åY«ÕöõõãO2™_FWW—ÑhÄ0Œ”J¥E%“I…BÇÄv>»%NžâèÅÒï¼ÓwìX½ËeL¥R§OŸÖjµsssâÒ*++çççøÃ¾ûî»þR__óæÍ;v@4ÇS__@ÔÞ½{Ïž= û”——ŽŽöõõ¥Óé®®.à¦\XXx饗Áïÿ{S}ñÅ'&&öìÙóÑG¹\®ßþö·µµµŸ}öYwww4- sss7nÜèèè@õÎ;555Á`@NŠ¢Âá0°À9rdrrR[ZZ¦§§‡‡‡ÿîïþîÒ¥K___ÿßÿýßÇŽ“J¥+++P~¸ï EOOÏ?þã?¾øâ‹###/¿ür,ûàƒ²Ùl{{;ÐßÂÍ?™·‰Dm6 B¨ØN&“---`ó 6Pú'‘Hd³Y ý …z½>•J*¡R©xåò …N§» “¤×ëåK1Á ưJ¥Òëõøˆã¸ßïõ!$ ùY§Ó-,,èõz…B!“É@ý"Ñ`0̾óóóÙlˆÇIÈ3nnnÞÈ~T’o*7nL¿÷ÞM§þæoŽ&“I’$#‘H´´´øý~«ÕJÓ4Aù|ž ˆ«W¯nß¾ýܹs …CCCZ­v×®]8Ž744|úé§ßûÞ÷ÂápMMM"‘ˆÇãr¹|xxØív{½Þx<ÞØØxóæM zå黃Á X,¨®®^^^†<õ+W®:t yõõõ¹\®þþ~³Ùl±X~ýë_›L&­V œO Ã,,,@íµÖÖÖ‹/:N^XXÈd2>ŸÃ0ÈUH$‘H¤§§‚«áyY–mllêìì„Iª²²戫W¯jµZH”}ý Çñÿx\G§Ó‰Å:ø?ø*";vìØýlà_|­åToß¾}Û¶mņÆÞ½{ù¡¡A$­®®677ÃPäI«««š!466¶²²ÒÓÓ*q]]ø¨6æcOOO{<žÎÎÎ;wòî7’§½-¡VßÞ>|¸I$Â:;kÀæüyxxøöíÛ¯½öšÕjÕét0ï6553 Pj|ï{ß»råJssóòòruu5dcÉüüüŸýٟݾ}»©©)CÞ?EQ=== …B*•ÖÔÔ|üñÇ===À S~ss3(U«ÕÑhÔårÍÌÌpwðàÁ›7o‚*‹+++¡€ÀêêêÑ£G!}ja4ôØb±:thvvôç¶¶6—ËU(Z[[X–M§ÓÝÐÐ$Gb±Çq—ËUUU5::zôèQ‰D¢T*­Vk>Ÿonn^\\|2>$þíðpѧŸ~*‰8€¾šÄcN^¯—ã8ˆcA%“Éd2É—q]÷¹1X ðmÛ¶Áöúúúu ŽãP²gÖÁ ›Æêêꪪªâíjµ»xñâÆi¶çF¡¯²Šcw|­†ûÙþñ Ð¨¨´ ÿs||<•JÝ/JþïFûm/¹Ÿ‡¬ƒuºzõjwwwqàĦQÐëpÔ÷v?\ú~÷³©¹û06ðcŠ…†ŠÁr¹œ¢(µZN§¡X¤V« ÊŽ=ÈTM$‹Åår=8ªìi ÉqÜ©S§víÚ•N§F#° ¬®®Êd²ááa¨C ›Ùl¾uëÖòòrMMÓé" ðO¥RZ­âHÄbq<‡ÌáÇÍ;µ%×áõýØívwôP(4Öñ= ÔÁžãããUUU|nJ±ñ'd™m»wï~È(褰múóÁáÖ›^ô)NîÀá¾gÏȈ. `ÜB¦*äÛ8—Ëå´Z­ÑhŒÅb?·û Èõ¥K—Äbq:Öh4ƒƒƒ`1K¥Ò÷ß_&“) ­V«×ëëêê"‘ˆT*ýÿø·ÞzK,{<ž@ @QT<‡´l6 õâñ8_\óÐâb±Ø{ï½W]] kjj H7TW1™Lýýý;wîä8hMN‚ÎÎN¨ €SOOϹsç***”J%EQù|~qq±®®nÇŽï¼óB¨µµõÖ­[===W¯^µZ­mwèСuQŠ%ûD$AÖÔ¾}û‚€œmˆŽÌÔZ€ÍyfÉ-[ÇG"h“É ÏPŽL©Tº\®ÚÚZà@å8îÊ•+ýïr¹êX\\Ôjµ@g ÄœƒÁáp”——ÿ‘ãØ©TJ£Ñ@D+æ'“É_þò—8ŽŸ;wîøñã—/_öz½ÃÃÃ,Ëò€ÓÊÊ Ô ŠD"b±¸¬¬ì“O>9~üøììì‰'~ÿûßC8×ÔÔZKC`YöÃ?ܵk×ÄÄÄ­[·ÆÆÆÀKY’ÍW-’„O«r»Ý_ H’P(„Ê "‘h‹{dHÇ_xáøáñx‚Á`]]]___cc#è~ÅSø‹/¾Š¿´þèG?B_Í+Íô|;ÌÍÍ9rœ×®]Û¿¿V«­¨¨oá믿~ëÖ­æææ\.ıUvÔjµV«•ÉdW®\yå•WfggB‡ƒ$IFs@J‹‹‹ååå~ø¡ÑhlnnæÃ÷Jò0ºôØX,‰D2™ Ð×ò3ÐÍ6Mèßš™œÏˆÅ7#¨*àm_—÷w?Ðhxx¸¡¡•èþÌrü%m6OTrùò厎¨2÷È_ßÅ‹÷íÛ÷$Ûÿ±rbÐ4óË_Þªª’8P¿¼¼±ñÛ¡– _§ ðQoÅÃÂÙ îl]ží“\~% Œ^´Á7°i("B¨©©‰÷êÝ/"²ø€¬ÀvàÖ?ðã˜|÷ïßÿüÕÁ#I¢¬Œ´Û5àö.h¡PXVVæp8¶¬Ýû•GX^^>A`‹ž™™©ªª‚`Ûl¶B¡0==]QQ‘t~¿bJ>ûì3°<x¨fggÁâ×h4ËËËz½€¾•••ªªª™™™™™™?ù“? ÙlV­VÓ4F¡J2DE"ˆ:J&“ù|m8öx<Eµµµ9Ž+W®$“IƒÁÐÔÔR«ÕKKK™LH´…BáäädggçåË—_~ùå§Â´ðMÒ·Üÿqäû÷ï¿páÂ^‡·?Þ­¨V«×ez<J(¹¸¸˜J¥€Ø™¦iÇ3== œ’ Àüð‡?ìíí5 sss^¯Ê“çóù—^z)ŸÏû|¾Û·oC9¦ÆÆÆ©©©T*¥T*išÖjµãããNJ¥FGGm6¤\ÍÌÌÌÎÎBù\ˆÄ†ùXÝ€¿`˜³gÏ®®®ºÝn ¦iz``ŠqîÜ9¯×«Õjßxã ¨288X^^¾°° úûû‹ëb”¤4†ï'™L&—Ë©T*(LϧE£Q %˜–¯™÷«««N§Ô{à-b,¨÷°B¡«I(‚C b¦Y–u»Ý@i6›ÇÇÇõz=<€ÝnO$!‰D‚|åA‹ÅR(€‡%ìÞ½ûâŋ۷o‡¸Ùááam‡êJ2™¬¼¼üÚµkF£1‰äóy³Ù¬R©€,Ûb±Ñ¼Ó鬨¨áp “J¥œN',;PÌjµB}³¥¥%©Tj³ÙR©0æ–ÆÞ#‘}ûö]ºté¹Àk‰þ²;«ÃáðÜÜtN•J•H$T*U2™´Z­ rBí®D"ÑØØ˜H$F#Ð6°,«×ëqW*•æI.Ý÷"±Š¡‘|>þüy‡ÃQ__ÏTÅutîÁ³ÅYÛÜ/ßø~d‹›~ßH±6p^ûýþ¾¾¾Ý»wCœí È}ûÚHÏÙÚûóŸÿüþá.\¸ðÜ€XÇý¿ÿw½±ÑÒÒâŠF£cccz½~bb‚$I·Û‰D–——AmÄqò®L&¤þMOOÃú@”H$ …¢±±ñI£ÐÀ¾®*ÇS¯mõ-_Ì·¿çÒ¾ß0~2+ðÀh³Š·lÚ©6Íå| 60˲_|ñEUUT%]\\ôx<ǹÝnÀЉ„ø=Cý¬ä{LòóŸÿü¹{¦Mh6íHpú0øc@hkk)‘H€fAÎeee9P’’ ü<=˲}4æpȶow=£“>,xà¼Ñjµ@œŸ‡ƒ¯jW’’< †òy !M`•z†îŸ„ÜåbÅà9Ë ,II°|ýÕ_í‡NÄc b{¼=DùŒ’”äy•bÂgQÓÄK¯°$%y†•ˆR”¤$¥\’’”¤4€KR’’|)ÕFz(yZi‰BJäs=€ß{gí÷¯Ù³)•!BÇ µºã&húËÊ2ÿöoÿöLð3lx/„ÁpämÿBáËöÿðßznýÖìÿ›ü űžeY(²ÆqœT*- ƒauuèóù<MD‘¤Èåú[Žc"Ä0÷žŸ 0ŽC à 8E±†Hg˜/‹1qÂñ{u†hšÃñ§°ŒÌÍýO–Í¿¼§«èõz„P4…¡@x —Ës¹œÍfóûý¹\N­Vg³YHØÂ0Œ$¥ ¿ä8)†!£(–ãÇqβˆ¦Y‘ˆÈç CB!±VÖçËž¯€¦YÇžüJ~÷î÷&½uÚköòá5C‡Ãát:‰D"‘€*²wïÞ…ú‹Æét*  ÆN$ýýý4Msܽ›ÀqT_¯†iU,&…B,•¢9ŽÃqŒe9¡XZJ;ò|ž‹ Šb%"ŸgI£(V©ŽÇb±ÂSÔa·‚þ\[[[__‰DVWW!ùäÚµk•••333&“©®®8ßI’ ‡ÃgΜ„j‚¸×:; ‡òyF&#E""/°,GÃpb11=p»UÙ,#“‘ù<#“ r9Z ÀóyV§õõ…‚ÁÜÓ?O½ý·fÿÿ+°P(„û†š À\#‹3™ BH(°CCâ~ñ $àpÇqŒã8–åX±,çpÈ<žAà8Ž$2™¤Hò^­FšF8Ž …§P)q«­ÀÀ‘"2™ TZbF*•…¨X,"Å\.GQT&“)Z%†D"!Ý… 0Žã†ã8DӜۭ‹‘$N˜LFÆb’Äqƒ–Çq”˱,û¤‡ÐÝ»om©xköìá³äî׈닳1 W*·#…aH© Ë"†á2æÅÌ|ÛœJ¥jkkI’d†a¨ežËånÞ¼IÓë§|žÍf9ü” Ãr¹{Éa]jÿgH …‚N§ƒA˲l>Ÿ‡ºBKKKÅÆ0Ërñ8‹*Çqa,ËQƒa÷Æ3Ãü!Mÿmðüüüüü<”GƒŠæP{z£öã˜F#ÄqL Àùrˆk‘¢ÃpÆ l$R(u‹Rû?+D–J¥2—Ë „P8Þ´ýE"\¡$¶²’S«…ñxA©`FÓI"šæÂáüSÀ Z­Ê;@a$©TºqŠÅ `ƒ­Õjù2-ÝóRni·äV–Rû?]©­­…™‰DB( †uËr‘HžoÞ`0 ‰%P !ìÎÖx48C)7õÎçóënˆ 0‡CƲBX"Qà8D’˜XLd24BIbé4-â¡\ŽÍfK J©ýŸ%P 0‰;–ŠÆ0Zg¡¬ÕÌF=%ºØøª­•ßhîC$BœÝ.‹Dò‰EQœÃ!Ãq”LRjµ¦YO$¨R*µÿ³%Ä Ôî|2Bbئq^J‹ÂâbYÍÍ% |ÏëMÁ CCC_†ðÊÛÓ.ô)åùXÏ_jÿç»ý‹~>â+b6ÛÖ®Á!ı,WtI ‚º÷Éoç¸/?ùc×íÉÁ0!vMs`‹wã8ví´Üš2ÁŸ™Ûìê_ÞË"þ&ùkÄUü³ÀÅ»%źíkÎW.X–⛩²òïp\´®Š.±¾}ŠÏ¶v«ÅßWô/Dz†qü_hÿ¢í´í`ähÿµÝþðöß"ýŸÄ0\ À(Šãñ{YÇ8DZ8;Â#­cuã0ŒXk}ü«-ˆ!Aü]ß\¸ø²k”܆V.nµuï‰{ÀC®µÅúÖÜØÄ›íÉn4K0ŒÀ0Ãà• ®.#Ib‘HöîÝU¾_®5 ©ØF£4ÏårŽß;•N'Îf©D"WUe˜›[]{µPÒq‹aœDBh4¿?FØîÝU8ŽE"©;w0ì^‡ã³FI£i†ãX„Žca‡$8pÈóÖþ¡æfÍà`!lÛ6½×›¤i&‘È#ôe0 A`6›|a!Ʋö¤Çq‹Êí6 „îÞ]…ÒàÔY{¹I"†a¡éàU‚`DzBÜZ߯¶BÿÇÂÞ~{‡L&’J…) T*‰ÕªV*%MM6‚Àårñ¶mN‘H°®ËcPœŠÛšûºŠwã¾î<Üf‡pÔ[¸ÍÔ! !$à*•ðÖ­£Qj0HÔjQS“$q¹\èp(H’hj2J¥‚Š N' ¡‰!»]­ÑHX–kmµ „ÜnƒÅ¢dY®¢Bo·«Y–³Ù4µµ¦êj#†aR©P($¯]›÷“$ÞÒâÉD†54Øl6F#ãn¥RŠR($b±ÐbÑJ$Âêj«Ý®ç8TQQVYYöM°Íg©ýs©T"­Vò Nˆ0›å55Z„0‡CYQ¡AåóŒR)r» …ˆ ðÆF£N'ƒñ]U¥ ^»æY]Í–•)«ª !µZÚÒb#Iü•WZÍf¥B!Á0\.Ëå§S/--N©TH’xk«K­–n‘þO´´¬¨Ðù|±š˲6›êå—[ÆÇ—_|±Ñ狵¶Úwì(Ÿ™Y±XÔ~üþï=Ä [w+h³ÏotNôèîçÁ‡ ­vïšÆá8¶o_™B!´Ûå}}+ííÆ|ž)/W´µ™WWs»vY}¾äÁƒå±X®P`Ün½Ã¡ŽD2¹e6Ë3™B,–mj2#„Ìf…F#‘ËEV«ª¢BO’Dss„òx§Ó`³i§§ýÇŽµ!Ķ·Wâ8n4*ëêìqÛ¶U°,‰$ ê9k’ÄŒF Ç!£Q‚Êdh•J¸sgY,–—ÉmmfŠbr9º¡A¿w¯sj*¼g£¼\½¼œ|ýõ†þþe–e].M{»­¢Bg;:ì")“ÕÕú|žªª2H¥B¯7ÒÓS==Ü»·¶½ÝÄöï¯ózWj´X4ÑhÊé4x¦Ô‚;j CR©°µÕÖÓS•ËQñx..ø|1N‹e-‰ Ä^܉M³‘HN*%årR£••É’ÉŽcwï†Ôj1˲©TãÐêjÖëƒõ15>x°òí··‡Ã)•Jìtj »{×/• ÔjÉààRwwùÑ£ ™L\>™L$q’$††¼Œe9‚À ¥X,Ðhd‡>OÿÙŸõ¨TÒL¦@QÌ;s …D­–åót}½ƒ ð'ÏD÷dÚ?“¡ãñ‚ߟN¥ ¹CÓLCƒž$q’Äëêt³,›NS‰D!”ÉPóó±·Þjq8Tp†tº€"Üã‰"Äét²h4#—‹´Z©Å¢J§ ••FúÚkÛs9*‘Èbv÷î¢V+£(Ún×étò­SÁ³Ù~ ˲EXÆ0 t¸‘:ëPPBü*°öàñF<¿3]®ÙlÅè\1˜ùåE,Z师âWQÇÍ1•¯‚ÜW±Í{RUõ?p\Ìÿ˲ †Ýƒ Y–[ü8¿wQÀ<„BüÍ7Þ}w4Ÿ/À ¬%©Ü&aY4s†a8Ž<:°ËÞ{;,Ë®Å3³q Ãà8€+ˆaîŠe‹Oõ¶ÑsÁ p8Ý6â8¢i¶§Ç®TФRÁï? ¸¦ýr Ã"Äâ8Æ÷ÿ¢§æ‘ä{È6ÇqvH‡6êýŸ„¨5üò1°4Öâ¼0¾Aׂï¾ôýüÊÎÀ—¸Ü}©¾³,^„ÔakWAk¤‹_^!-żÇò wÏeÉ#½áÇr<V|Û|pÌZðïüÄ‹»B8ìPœ†a†ÝkA ㉹µÇ‡ËqÀqÁ?5M³¿ùÍ0Ãp|· É/™ 0„p`†×ƒãØÚH¸ç|^ÍÚnxQûã±Að=k©0pNÞuð|¶‘÷n ¸ýÑÚ³ºvmA$"òy Ãî¥pðð†aÐŒkýÿÞi×`|xLv­9x@xq[¡ÿ“o½ex².ògæBÿüÏÿ ÕB/½”‰¸uŠÜWofóè‡'Z\jÿû«šOâE<…ö'÷íë)™µ›Ê¿üË¿ðßwîì–Ëå¥6)µÿVR,—ZákE,—ªÔþ[PJõKR’Ò.IIJRÀ%)IIÙþÒ Áñ¤YCIJ²…„ŒF£‰„ ˆÁÁÁ¶¶6Þaå÷û{{{õz½D"ñûý+++áp¸¥¥E§Óù|¾ŠŠŠñ(»122¢Õj- Bhdd¤¡¡g<õx<6› Ø3 ªÕêL&“J¥l6s®¬¬ƒA·Û-X–Å×2¤FFFÜn7I’üµ6N+kÉ=EQ©TJ§Ó•ÞqIžç|óæM›Í¦Õj§§§———M&ÓÒÒÒ‘#Gb±I’@@«Õ9räüùó4MK$•JEÓôÕ«W¡®t>Ÿ÷x<2™Ì`0ÌÎÎÖÖÖær¹T*•J¥nÞ¼©ÑhÂáp:…BZ­¶»»;OLLd³Y³Ù ].—Ç㙞žv:P®º££ã“O>ÓÓÓn·{pppÇŽ.—ë³Ï> áp8;Îùùy‹ÅRQQáñx¼^/Ã0Z­V$ù|>§Ó hýK/½ô„£ÞŠ3þŠ ær9(![<ÑÀ—B¡N§¥R©H$Z#¬b³Ùl&“Ñëõü´ŸÙl6N †¯†"|EoZwQ80—Ë¥Ói8añ9KcàÙÀF£Q©TÊd2’$aPiµZ™L†²ÙluuuW®\ …B†‰Åâîîn‰D’H$ªªªÒéôììlEEBH(NMM)•Êd2év»ïܹFËÊʉD&“‰D"J¥2 ², Õ¨Íf3†a4M‡ÃáH$R^^‡8î- È©©)¹\žÉdÒé´P(T*•ñx\¥RMLL´´´ø|¾åååp8ìt:Óé4Ã0 …"•J577Ã<áÖŒÅ2§NìÙSît(Šº~ýºV«b±¸¯¯¯¾¾~aa¡©©ibbÇq•J%‘HVVV …‚P(t:“““»wïV(~¿ÿÊ•+uuuwîÜ= ÅÊÊŠÓéìïï·ÙlJ¥òܹsf³9N—••y<žÚÚÚñññ†††ùùyƒÁ …†Y]]­¬¬ V«utt´©©ixx¸¬¬,‰Ð4m4C¡Ð®]»x¥¦$ÏÞ®©©Éd22™ìðáÃËËË555 µ:ÇÅbqCCƒßïïééÉd2‰Çq™LÖÐ䦦fff¦ººº««ËëõÚív‰DÒÞÞ£š¢((H$*++I’lnnfY–$I–eår¹Åb!baa¡¹¹yaaÁáp`ÖÔÔ„’H$ÍÍÍSSSµµµ"‘¨²²Çq…B±ºººcÇŽÙÙÙ®®.ÇÓÞÞ. Y–e¦¥¥%›L&‘Hd0b±ØnÍ©)ßK ãpèÓé4ŽããããF ˜L&¯×ÛÝÝ}ñâE›Í–J¥¢Ñh6› ‡!Ô××wðàAˆ”Édeee‹‹‹ƒ!NÇb±ááa•J ›ššb±X¡P¡Pˆ¢¨B¡H$¦§§išž˜˜X^^íI*•êõú|>ãx$1›Í###UUUŠúÄb±T*EQTi?»‚]¼xq¹ÊB÷)O‹ÅÀ‚•H$Å*ÙÆólz’uû›»üžÅ×YÚëŠÓó[Šmão£";v,•JÁ÷S§N=L$ËrÓÓËååf¡Ìd2ƒƒƒP,'“ÉX,ŽãæææB…BeÙx<ú0hËãããV«U§ÓéõúÁÁA•J%•J)Š¢iÃ0°8FGGëêêT*Õ‰'ÚÚÚD"‘N§ª««›˜˜¨®®öz½&“‰ã8àIŒÇãÀ6žËåt:Ý‚ÅbÁ0L(¦ÓéÕÕÕÎÎέ9€ÿ€öÿcÀÑAd+rü{Îäë@žA¼Øýqßt-ž§(ŠŠÅbz½þ~“׃'åG2Á•ðV{J ###…B¡˜þjnnòåBccc§N:{ö,Ã0¿ûÝï …Âûï¿_(Nž< Dļ Í\P¡ÑÑÑÙÙYš¦9Ž ¨{¬e‰D"²k<¹ëN²éwþÓï÷G£Ñ|>?66;\¿~=—Ëñû,--ÍÌÌ,/////Ÿäq͈ECbS”þÁû>ÿàÓ"„Á`à7ò ÿ×ø}í$µî-—ä©ÙÀW®\ñù|‡#³,;11áv»ûûûkkk»ººü~ÿÀÀI’GÇãb±xuuunnŽ ˆ©©©p8¼¸¸¸°°@Ót °Z­ç•W^^XX°ÛíKKK‹¥³³óÔ©S>Ÿ¯©©i||\&“%“Ép8|àÀ‚ æææÀÊÊ ÜØä …"‘HTTT,,,Nãr¹fff*++†Äk÷îÝããã&“illL*• èõú`0˜ÏçƒÁ Ýn7™L €¾ær¹²²²‹/ÂÚ%—Ë·mÛöÈ— û­ÀÐѓɤ\.çµE>ŸÏl6óE±Òét"‘0¼³_fBóóóÿ¿½ïìnãºÖ>3 `Т`'Ø$QÅ×¢l¹J^qVœ{e;×ßógîÈZù•,gù:ŽYq‘mÊvT,ö 6 щÞ1èï‡ÌÅKR´­f9Ñù ŽÌÁœ}ö~ö³Ÿ­×ë%I«Õ*‹¥RI«Õ¶ŸoX®yd¾ V«UŽã8ŽsÐjµB¡Ñhä¿Lû•áÏjµ:55E„ÛížžžfF&“mnnöôô@0ÿt<ÖœL&K¥R4µÛíápØétƒAš¦á—ËçóZ­¶Z­B÷Ä¡¡¡™™™ÍÍM€ˆívûçŸît:BÉdÒb±„Ãa£Ñˆa€I±Xlpp04f³É0L¡PP*•¡PH(‚O@«Õ"IR(êõzXÀñx\§Óy½^«Õ‹ÅŒFc"‘©TêäÉ“7oÞ´Z­¼3ÙÑщD„B!Žã<úL&áé”ËåR©4—˵Z­L&#“Ér¹ÜðððC_½©Tá/Y9ÞÖÙ©¯V«_~ù¥Éd"¢Z­f2’$GGGC¡Ëåòz½B¡ÐjµV«ÕÍÍM’$¡1Š×ëíííF£‘HÄn·û|>·Ûm6›oܸA’äúúú•+WÀ°šL¦l6;== óV.—kµMÓù|‚[š¦oݺŲ¬Ùl†$œÕjÝÝÝU«Õ,ËR•L&766,ËÔÔ”@ Ðh48ޝ¯¯ N·µµuîÜ9‰Dòõ×_;ÎóçÏÏÏÏ»\®p8<;;›H$äry8>{öìää¤^¯Çqüé¢z¬ øÔ©SFC¡P@ÊÃ0‡Ã ;::ÁéÓ§Áã8ÞßßO’ä¹sçêõ:˲©TJ,‘$)‘H†‡‡½^ï /¼OáÄÄ„ßï‰DZ­ðӧOW«Uš¦«ÕªÝn—J¥ ‰Ð4m³Ù E6›ÕëõÍ&(Nˆî޽˲ìÙ³gwvvÜn7`9¹\N"‘(•J úºº„B¡Á`0›ÍÉd²··7N+ @P*•êõ:MÓ©TŠeY0(!¡PxñâÅT*ŧÊîØÞŽMO•JÝ®õûýƒ ˆýýýt:­R©Òé4Ì­Åbñx<===Åb1šÐÙÙ¹´´‰D, ÇqápØd2­­­+—Ë›•yðÓžœ!—Kÿû¿'@0ðÿøÿp:ÇäØÔjõõë×ûúúD"Ñ¥K—øÓ o|ö³ŸñÇùá@ÑÝÒ£¾Ñhqdìsà²p`·Ç0Ží~ú¸<¢¡P(.]º´ þç9ìÅ!„ ¨ëéxÀQ«Õççý}}F™Œ¬×ëÛÛÛb±˜ ‚ 0 [^^ÎçóF£±»»[(ú|>Ç% Žã©TJ£Ñ„ÃaµZ½··×jµhš†²-½^ѬÙl&I²P($ ¥R È¿Á`ðù|6›-‘HÌÏÏ¿üòËo?¾ÌgàoØZ­Ö·ß~;>>.‰ OõC€¼ÍÍÍõ÷÷‹D"8èóùìv;o±þ%yÑ÷1pç…§VòñŒÙÙ½?ÿygl,úŸÿy&›Íú|¾|>OQ”H$R(¥R ðL&3;;KQT*•º^¯Sµ¼¼l4ƒÁ P(ä8®^¯ommU«UžV˜Ïç;::VVV*•Š@ ( jµzffÆáp‰å^4ØG»€?úè#‘HD„R©L&“•J…eÙx<žÏçÇÇÇÿøÇ?vtt,-- „Ãa¹\¬ÉD"±µµåv»+•ŠH$šžž&IR*•îïï¿ôÒKZ­öߨ…;:žN§år9ð(Ú];¨µ,—Ër¹ª5Û´õõu§Ó ¾td}}¦i€ÇÚ œ0===::šÉdâñ¸Ãá€ZKøP€ÐøïŸU©T G:??ϲ,Çq.—K $ ’$­E’$MÓ‡™˜Íf³T*% ¨E‡ ųý4ûçÏ÷¦c4¥ŸËå€Éd‰D¥RÉív—Ëe©T YbŽã¯Q"‘¤R©X,¦Ñh0 ‰D4M×j5’$§§§ E °Ûíûûû$IÚív¿ßo·Û!ýÛÞMâñíÀ`Nà ^YY!¢T*!„†Áq\¯×“$i³ÙR©T³Ù”J¥Õj¦Ãáplll˜L¦Z­V*•‚xÔ¸ù“<"‘ÌÿþïòsÏY-ÕjurrRúϱ¼¼l·Û@OOÏÆÆF³ÙT*• …Âï÷“$)‹ÕjµÏ盘˜(‹^¯·V«5 Ãâñx*•X\\ìëëÛÜÜ,•J.—k~~ž$I™L¶»»{ùòåR©tûöíÎÎεµµ±±±¿þõ¯R©Ôãñ¸Ýî¹¹¹¡¡!žÿºB¡Ðh4êõzŸÏ—Ëå^~ù奥%·ÛJ¥¼^/¨,±,ëõzŸyæ™ååå3gÎܸqx©‰Dâ™gžÁq¸¢kkkv»ènÀEïïï÷x<,ËþÂ… "‘è1Ì?E‘¿üåYx̓XG¢ÊårNwRF™ÍæÃÁ³Ëå4{hh¨X,Z,‡ÃÓ%N:§ñVì±.`('Ë$•JÅb±V«- ðNLL$i±XÔj5ð™Ð}’ɤR©‰D@ÄGÍÌÌ$“Ég5Ïz<®.ª¿ßœËå€t¥P(B:ÅVVV, äý“É$/ܵ±±qòäÉf³ ò`ß|óF£‹Å‰DB«ÕnnnJ$’ÅÅÅ®®.ŸÏ—L&”H$T*U­Vóûýn·Ûëõ‚´˜Ùl†Dåêê*Žã „'sW­V5ÍÞÞÄD*• 8 à‚¥R)µZaÔ —Ëår¹ °!CÈ×l6­V«P(t¹\ét¼Ñz§ê‡IDATS ÃìvûÊÊJ__ŸÇã) Ãü¸©c€âö#íîÒ½ÎI ÈÚ ÿAéîøzàÃ8Û½˜•÷ª>å£åÕxL¬L¦ PP@öxÒ÷"ƒu;@Ým ’Œ?¡Õjåóy‘¢( L!ÄüW¨\.×^‚öp9Ò?¬ ÿßjÜ/•òˆ4Æ‘fþ^ÞÝaz¯¨²Õj¹4ÆŽ©d<ð¸är9(8;Fƒʶ1 zÏ‘™’Ã%‡ükŸÏg±XÀs¾¿‡õ>æ¿Z­OMí¸Ýf¹\Úl6—––Ìf3tuÍårÕjUÁ÷Ùl‘H$F†a âÊd2A]X,zóÎÎŽX,†bU›ÍÖÝÝ âkkk»»»333.\H$v»}qq±R©œ>}ÌÕ,..ž? QÖ××ûûûA;vòu¡[­Ö­[·FGG½^¯ÍfÃ0L"‘p I’Ôét8ŽW«UÑ?;:‚!Ay<FCQT$iµZ‹…wºþGû³úýß“p/.‘@  i¬ûw¾½}ðL¯cX <ƒ—oJôjí¯ívûãw)çævÿú×Ý`0ñ_ÿu&•Jíì쀵˜J«ÕBàúþû|óÍ7† ðSjµ$_šÍfWW×­[·vvvü~?@๔J¥÷ßâÎÎNŽã¼^/I’Ÿ~úi³Ùôx<ƒƒƒÁ`ðééi©T uo"‘èÚµk†Éåò/¾ø¢^¯3 ópp½^ßßßÿôÓOBÕjÕãñX­ÖB¡€ãøÖÖÖo¼ãøää¤D"I$—.]òù|r „¶·· E¥R©T*“““2™ìÊ•+ÿækøÈ ß{Ézµï®©², ¼R©T­Vp’K‚….NG£ÑÞÞ^PðîëëkWù …&‰½´´488¸¹¹‰ã8l•ÛÛÛPËÍf5 ı÷úÜï\œ?J@84dI$2gÎtƒÝ>›Íâ8^( <ËãñŒ¯®®Z­V Ã(Š‚@½««Ëï÷ƒÊ¢@ p:¹\y†a@–,‘Hœ={vkkk```aa€¡Z­644‰D\.×ÒÒL¦T*íïïßÛÛ‹F£8Ž år9³Ù ³ ª‡³a|þùç}ôàdCì?’Éd@ª+.^¼˜Ëå®^½šËåNœ8a6›×××I’ÌårÀ7š˜˜xþøc½^_©TŠÅ"˲PS«Õ …^¯ßØØ°Ûí‘HÄét®¬¬mðJ¥òì³Ïf³Ù……›Í‹ÅjµšV« …B‡ÃëõnmmAÙ I’¯¼òÊôôt(R©TR©´¯¯ïêÕ«Pè«T*£ŽF£óóóPïÑu.—“ËåN—ËåP(¤Ñhòù¼Íf ƒ¯¿þúo~óN§V«c±˜ÙlÎf³Ey½ÞžžŸÏ÷üóÏóÓOTs8æ¡z{{···­V+Žã÷ Ú.å-×½²eÇW­´ç]‹Å¯½öÇqà)U*Ç9ŽãK·q‡’(@€a˜J¥zûí·aKzz¨ÝÄ™Õ{#“)nmåPÞ ª@ù|ò*•ª£££T*5 PÉN&“ccc«««ð£ÊårÇ¡2©R©LÕl6u:]<‡ì€X,öx<.—kgg§\.C) $-ëõºR©”H$jµÈ€Á`P&“A4{âĉb±¨R©âñ¸^¯§iJˆ‹Å¢B¡ò}0=m­ŽD"ƒ¡^¯ïíí±,Ë0 ÈžÄãq–eŸp‚J{dÑßß ¡ïÝ 6vÂwÆ5ßG¥ìð•¿>nC´Ã<ð‚§Á‚< ^Ñ^ß_åiè c` ãþç Á[ßsçÎA;³Ëåàé@ç’$Õj5¨ÞC ÍV«¥Ñh\.WWW¯õõõF<¯×ë³³³v»Ýd2I¥R Ã&&&B¡ô¬Á0¬··xÃÃÑHD¥Rî¯J¥ª×ë_ý5H©ðn×âââÎÎΫ¯¾ªR©†Éf³¡ññq¡P¨T*Ãá0˲P ÔQ=á«0$PG8fǃÐC¡P´ï=p Ù÷òøßwâÞGþ/¨…ÃÏqø„d2ɲl:föT¡P˜N§•J%jÓ„åϯ×ëG ÐGzßùk?G?E.áºp@‹o7vÇ8lGNÑa–<ÿ.ØrÛÎï A·Z­d2IÓ4´\# ÆGÚ‡ìW{Ÿ×ét›››F£±X,6›MÇN't‚F?.—‹a˜õõuŽã ÅÍ›7'&&ö÷÷ÇÆÆ*•ÊÊÊ €OAH¥R½^?33c4£Ñ(Ô¨ ¹\‰D†††666¬VëÞÞžL&Ëf³ÇÒîînoo¯ÏçS(N§3 AF*›ÍÎÏÏã8´°b±ØÓÓóå—_‚ã·ß~{áÂ…x<Á‹R©l4¢_ýêWÇA …R© §¦¦x)p€ ¡³I:†”f¥RA‹E<‚H¥R·oßjK©T‰D@TMœ™™€¬Åb1°OA.—ƒÝ¦^¯CE{£Ñà8ðt:L&9¼ôOŒŽãp…b±D”‡þ½ûî»<ÒðÖ[oýÐJi¡Pp?ûcß§fíÀi0(Š: ý=!h@ ‘H €‘?"‹Û÷„Ÿû}ððG1îcþgf|ù‹ãÒ@¤Y^^¦(*Ó4=55•L&ƒÁ h˜¯ÆãñÆjµºµµ¥R©–––`½™L¦éééf³‹ÅT*U Ëå¥R)—Ë‘$¹··ÇqœÏçðûýµZ-—ËAíè.z<‡ÃñùçŸÇb±d2 ZE^¯W¡P…ÂåååáááÛ·oƒ iggç;w–——‹Å"Çq *@’¤^¯%Ö­­­f³¹¶¶f4———á+}òÉ'fûôÓOƒÁ H$2™L4M—J¥R© …ü~¿D"9wîÜßÿþ÷F£!•J¡CR«Õ~\,s¹\ÙlöòåËÅb±V«]»v fY,ó~àÙ³gwww+•Êõë×¥R©×ë}î¹çt:ÝíÛ·¡æ£R©øý~ÇI’ìììæj½^‡V*•étÚårðÁ4Mëõúµµ5«Õ dCŸÏ§Õjßxã'$ü>œË››kׯÝÞÞ¶ÛíüvXîëÀ. ÚKƒƒƒ‡Ó­ðg£ÑlyvvTÄTÚMÀ½¨Qð_Á`°Ñh´7‘l¿ô—P«Õ$IF£Q‚  ^çÈ„ðc##Öb±tâD§@ Â`0¨ÕjH猎Ž‹E†a@7‡a˜ÝÝ]¥R)•J[­@w½½½,˾c0d2Çq¥R vÔÞÞÞr¹ì÷ûÅbq«ÕH`’šL&€`–Éd«««§«««\.KD*•‹Åááá©©©ÞÞÞV«U*•AGG‡Éd‚|{±X”Ëå …¢V«Z+tº¸ÑívG"‘z½~òäIƒÁ€ã8Ù…BÑh4 Ì‚eÙf³ ŠÁðcT*°…puÖ)Šuµt:MÃ0*•*‘H€ï¹ èND’¤B¡í5«Õ ™±F£A’d¹\¶Ùl¥R‰eÙz½>44ôÛßþö•W^ñù|&“Én·OOOK$¨¶ƒ=9Áql¼ƒ¡Öÿ㎽½Ä{ï­ž?o22Ø2ŽãEÅb±R©p†‡‡>ùä“Z­s"“É¢Ñ(`׳³³¹\.  «Õ ¢¼{{{/¾ø"†a_}õ•B¡ˆD"—.]J&“7nÜèêêJ¥RƒayyÙår}tövvv,ËÒÒR½^·X,@@­VŸ;wîúõëà’$933xû4™L;;;V«@5ì~ü&• ÄÏ?ïæsÝccc–H$’L&Ïœ9CÄK/½Ô2ðFV©T ‚ÑÑÑÃÖ¢(Žã@˜Ï–ƒ$@»áÞÝÝíèèÀ0 hj‡ƒ¦îîîö'úïˆ\âñ8mgÚ­*öòË/ó…°BÚ£8±X¬T*ÇÇÇ)Š‚Â£Ï>ûL«Õ>ÿüó;Cç1„¯T¯×y ŒÙ+¯¼àÕpþåË—ú …===ðB(þú׿6›­V«á8ŒS¡PX¯×`Z[­V ¸sçÎ3Ï<£×ëÅbñRÃX.W|¾ÀÉ“ªV …*•J†$“I…BÀ2Ã0 Ó½ZÅb±\.ßÞÞ Ëåâñ8I’‡2“Ñh”eÙ`0Ø××vºZ­šÍf‚ ®^½zñâÅ……š¦˜É0L&“Q©Tpæþþ>Ðw¡üM&“moo«T*P½¤iB)Ç¥Ri0ÅFÐÐétápX§ÓqÿP ì¨~‹ïïïƒë4<<|íÚ5·ÛýDU•Â{ésÏ=˸½mu»û‡3™L___8†Õ:Ž¿¨v8|ýb±+!Õµ?(®9žð %ò/~(•òGt36v V­ö Åb±ùùyÀr!\_^^…tP(ÜØØX\\|õÕWµZ-Ô‹ƒ*(@Ea‚ÍÉdR«ÕR}d(Š‚0Z·rÇ7j)•öûý‡C$ùý~•JÕl6ÞÙÙÑjµb±¸V«Åãq³ÙœH$`‘cüpp¢Ñè­[·†‡‡Ýnw €V©AD£Q£ÑÈ{Œ°¼ ‚P©TW¯^}å•WxþÖ"ÎÎÎBr»Z­ †»wïöööj4š»wïvwwƒ+a€‚»»»ƒ:D"‘íím„ÐéÓ§¡=Z­N&“Åbq~~x2™,‹oooCfÃ0@’R© …ÉdÒl6ƒÆ-ð¢;;;&º=ût$òÉs}P½ùN\íÔô¿æë]áø‘¤¢Ã|à¥Ú>@¿ñEÞ€O¶óOX¹\üVVûžtTÉ‘dý#> SSÄÛNœþNÆÂáÛü±æ?ŸÏ/,,D£Q©TªT*¡ç»L&ÕØ¾¾¾/¾øÊ}A›a˜žžàH•0Ôz½ŽúðÃ)Šzíµ×æççûúúnß¾­ÕjÁnŽûý~p©’É$Ø5½^ ¥£P(pW(™LF.—Ÿ={öa=Ï¢·Þz+‘HH¥Òh4Z©TVWW¥Ri©T‚:oðÅò™™,ð÷µµµ­­-H<& xRÀÊÊ ´¥…·ïïï‘Ïç9Žûꫯ,K½^O§Óóóó@å…Âèl6 E°¥R R/¥RéîÝ» !°°° ÓésLõ€(t£Ñøàƒ677- `ø‘HÊSx˜è1<=„ÔÖó 6¬Àùçø€ãÇ[ù\ÎV@PÓî啯™ ‚hÇ¥œpø¿)àçÀQ€cär¹R©ÜÛÛëìì4›Í[[[çäÉ“ÓÓÓZ­¶»»[$Y­VÈÉG£ÑõõõñññV«%“ÉÀxE£Ñ®®.€'X–™™Ëå™LÆçó A< ²ê4MÝØápØíöl6ër¹ Z$û"jƒýíoƒêµZËåU*ÕÜÜTEÙl¶¥¥¥ŽŽ¥R955%•JWVVz{{O: ÅŸþô§'N,,,@Itýøì³Ï`± Çý’É$ø“““FC ,--­¯¯cÆq\6›µX,ÀGY,¯×[(®]»æt:ûN‘Á'j4›MPÛžššbš¶•ËeŸÏñR³Ù¬ÕjÀN››/K&“åóùX,Çý~ÿo¼ A¦^¯ßÙÙ¡i‹Ë—/ƒÁÉÉÉþþþP($—Ëc±ØÚÚZ8v¹\E‹Åo¿ýR—ÑhôÍ7ßL$·nÝr¹\ƒƒƒï¾û.Ã0u:ÑhT©Tnoo›Íæ_|ñ'­Ž$—ËŸþùvç‚§v?ûì³€Þ¿üò˼D ü—J¥r8ð OÉ‘âW`¹\fY–$I¾¿ ¼H$P,ºxñ"BZˆ“5¼¿!>Z­N§ÓE;wÎëõZ,›Íf0Âá0Ðú,ËØØt—€>€T:u Ї††VWWív{µZ…¾xæ’J¥ÇÙl6p V«Íd28Ž;N€m(вZ­€ñ@iøòò2ðÀôz}8þ)v‘‡äÄ/~ñ‹'Nܼy0§þþ~È¢ÃÝ™ÍæR©”ÍfU*U±Xê¥@ €iÑét€çÕÕU•JuòäIH¿zd4F>Ÿ×h4„FP M©TÜ¥Ñh@‡ð*AéìB0lµZûûûÐ|„¦i^eþ'=ø àïÉ‘Yúc.Õþ¢¯¯ïĉ‡-ÝLáñï<¹]î@»#þhµÚöص«« "ôÏÂÔÁÁÁŽŽŽ·ß~ûÀs —å!õÑÑÑ‘‘‘v=þu?œÏ‡âàR®¬¬oݺe¡CCCÐ@¤Ùl², âã•J%‹ÍÎΞ={V*•‚rõOqѶWƒ}þL¥@€ ÿ8R­¢#½ôpéõè³ñ££¹³ ÿÑÁÂ? óauˆçûªs‡‘¤T /Pªý(i€H’ÿ€Ùxª\.ƒ¡|² ÷1ÿù<÷Ùgž³gmF£ !„¼^„a¨\FÉ$²XTŠ ‰ S§ÐÿˆÆÆP2‰zzÐÒ²ÙÐì,Gõ:J¥Ë¢@õõ!–E¿ÿ=@j5 ‘шŠEÄqH&C]]è ˜%ìa-­ ö÷ltxüÓŒ/w+â1wq<¼„¾«@ÿûTÉÉÊ> ˜ñS÷œWWƒß|h6¹_þò¬µÐò2R*Q­†yïóùz{{ùØ~aaH;;;€¾ „677ÕjµB¡‡Ãõz¬  ill þýJà„@ŸQ¿ßOÓ´Õj9¨|çóõ 68‹$VXÒ|ÇVxø äu€'+‰@!äóù€Týñ€׿yóæ™3gàGO§Ó|@þˆÆÉ“’vw›Áˆ¡Z :…¦¦Ë"’D…2›hÛ툢M£B©TˆaP³‰ü~ÔÑ$T¯£H9ÿØ¢3DÓH©DÒjQ&ƒ††Ð“b`“““@ø^žÃá8þü;wvvvÞyçééép8l4m6Ûòòr:†Ê‰®®®••Žã¬V+Èa²Ù¿ßúꫯX–]YYéïï¿páŸÿüg†aÊå²Ùl^XXºßÈÈÈ;w(Š‚ ÊÙü~¿L&Ëår©TjeeE(BÄK/½ô¨»~=àØØˆ¼÷ÞÆ3Ϩ/\ø9®P(€AüÝï~}šÍ&ÀxAܹsÇh4f2™×_ðh4 ÀõÕ«WA :[­Öõõõ¡¡¡¡¡¡P(d0vww¡V& #vvvf2‹Å’H$ŒF#˲Pvó‡?üatttkk+Ò4Ïç!,gYvtt4*îóùB¡P³Ù|çw¾øâ 0—µZ ô’€ˆ ¹C·Û ¥vð£‡ÃaŠ¢†ÙÚÚ 4HÃlmmÅb1’$­Vk$y¸”#’¢"áÐÐ?¥|2tú4’JÑùóGl•r8†Ç==ÿ'h 4o•êÿ;ùâÅ'瑊D" ÷A{E@Õ¡m|­VH³Z­.,,@ñ@  Ñh¨ˆÅâjµJ’$yÕÎápˆÅb& JÍM&“Åbfz½Þn·³,ÛÑÑAÓ4ˆ¿@!`¤"‘Já¿jö®DétX&Ãa“Ìår@;- ED£Åb)•J$I6 ¥R ^EQµZaãæe储V«F£Q£Ñ€è/ÐQ‚ϳ>Ìf³V«å8.—ËŒŒU  ÃÞÞ^GG˲ `4[­–×ë¥iè\€QÃ/y~Žã@^§Ó `¹wttˆÅbhC’d"‘(—Ë2™¬ÙlV*’$+•Êðð0Øð8D"Q¥RÙÜÜ„Òåǃ<#„à ‹sö8þDzÿðåÇTJ}@†IEND®B`‚impressive-0.10.3+svn61/site/spotlite.png000066400000000000000000000626001214566325400202630ustar00rootroot00000000000000‰PNG  IHDR@ðþO*<sRGB®Îé IDATxÚì}wx[ÕÝ¿öÞ–dÉK’mYq;{e•Â[)m€–’¾mi›R OËz_ i 4Ê(Pf>$PB¶gxo˲dÙ–ek¯«yïïïËý©’-ˉ“ØÖýüáG–®®Î=ç|Îwžó%Ÿ¯¦¦fùòå2™ŒB¡&FËÏÏÇŸq\8Žƒîß¿EÑ믿~óæÍ‰$ùžƒƒƒo¿ýöéÓ§¥RéÝwß½hÑ"ƒA&“ þ}ûÚÚÚJKKô£•——ÃC‘H$‹ÅòÁ?~\ lÛ¶méÒ¥,Ël6¿ýöÛgÏžU(›6m*++ï2™L(R(¿ßêÔ©?þØét®]»öÆoÌÍÍMnç”…”ðȵµµr¹ü§?ýiuuu|O¦þtÜnI1Ñh´­­í­·Þêëë‹¿ þÙ×­[wà 7àÏ>QÿÛl¶ýû÷õÕWT*õÖ[o]³fP( …BçÏŸï½÷†††jjjn¿ýö¢¢"*•ÿÔáp¸©©éwÞ1™L‹-úþ÷¿_TT …’`³Ù8ðÕW_1™Ì«®ºª¦¦§Æ¸àóùr¹<áç’¢hKKË|ÐÝݽxñâ7Æðùüïÿû .ìîî~ÿý÷  ¿—ÛíŽD" £   ??? "‚ ˆÓé4™LuuuMMM‰¤¸¸˜Íf“Éd—Ë…¢(‡Ã)..V«ÕÁ`0 úý~›Íf0šššš›››ššrssóóó³²²R´˜F£eggçååõööZ­V‹ÅÂ`0ŒF£ÛíÎÏÏÏÏχ W ‹åv»™L¦J¥w#âr¹b±˜P(œ´¿¨T*—Ë¥Óé>ŸÏápƒÁäk0 óx<~¿?r8&“I¡PR U Ðéth†a2™¬°°Éd&_666‡) ŸÏO~ÀqEÑ©JŠµïŠ ‹ù|¾p8ŒaØ%ý¡p8ìv»}>Š¢ 3$‰Øíö`0H¡P`bL4Ðt:] €p …jµZ$%_ìv»ý~?Š¢b±8§P(YYYÙÙÙ½½½cccÃÃÃCCCÑhT"‘H$ƒ‘••%•J Íãñ¯×ÛÚÚj±XD"Ñ‚ ²²²x<ÇÃ0,//O£Ñ°ÙìÁÁAƒÁ`µZý~?¬ñçÎóz½ååå<O  ÀTÑhtddÄãñØl6¿ß/‘HR7~§Ói6›Ãá°Ùl&‘Hyyyyyyø"Íd2…BaVVÖàààØØ˜ÅbQ( à÷ûÏŸ?ßÓÓ‡/^¬ÕjAŠŽc2™YYY|>llldddxxX.—'H§@ `6›m6•J•Éd<ïÂØ ?§T*¹\®ßï(--å"þƒÁÐÐÐ`6› jjj ÒY¶ívûôÊ¥†a‘HEÑ„÷ý~ÿàà ×ëMþhÚ ìr¹Š‹‹i4ZühÚíö—ËÅ`0är9ˆ«qoÂb±är¹@ °Z­f³Ùn·ã’‡Íf«¯¯ïïïçr¹Ë–-Óh4L&sÒÉÃçóóòò¸\®Óéìïï7›Í±X,;;f2—ËU(t:M÷ûý½½½‡®­­íìì ‡Ãø2O¡PX,,Bñp»Ý­­­_ýumm­ÑhŒÅbñ_a³ÙT*ž^LÚb—››«T*ioookk …&^¡¥P(‰D¥R1™L³ÙÜÖÖ600Fãu°ÎÎΆ††Ã‡÷õõy½Þ„á—QR©4??ŸL&›ÍæöööÁÁÁø{F"‘ŽŽŽÎÎΑ‘§ÑhD"ÑË.—“““““ãr¹ôz}ss³Ïç‹8£££---'Ožþü)õ9—ËÍÏÏcccL&S¡Pį¹`ˆÑâõÒÕ«WËd²¢¢"“Éät:C¡™Lær¹ÙÙÙ*•J£ÑhµÚxçF£a0 …¢¯¯Ïl6{<žH$B£Ñø|~nn®J¥***‚kð¯P©TµZM"‘ ’u$ТµZm( ‡ÃEEE)0*•ŠËåæååõõõ™L&»Ý‰D@µÐh4°óùüôÍ< …RYY)‹ úûûÁFY,–T*U«ÕjµZ§ÓkýªÕêP(¤V«“J¡PhµZ¡P˜ Ô±X¬åË—ËårµZÝ××g±Xü~?¬Œùùùð[ñÞ;|P ½^ïDÊØ JjäææjµÚìììq'_êOÇí …RUU3R¯×[­VAX,–B¡(***--Å0Ìét²X,µZÛ‰ž]&“UUU‘H¤ÞÞ^ÇÃçóù|>xm¤Riqq1Nw&(ŠU«Vù|>˜B^¯—J¥fee0þ[5€B¡ÌŸ?_"‘äçç ³Ùìv»Qår¹J¥ˆ±†)9Ølvvvö¼yóètzVV(Mñó'77—|äÈ‘לÇã áplqÆd2Á)=îŒAÄãñ «™L¦Ñh,‹Ïçs8œ„¹‹ÅL&°"''g\;gttÔívƒtMÖŸ“}‰ÐàP(„aØà}M_p%  Â=á‰( ƒÁÀï9îô÷÷O’c΋|TùùùÉÖ8X§^¯7 ‚ÛŒN§³Ùl¡P‘ªd'íÈÈH,‰Dɾë ”ICÁ@ؘ7NýiŠnAQÔëõƒ£( j°P(„ØÇÀÀ,Çñ“$ųÇb1»Ýîóù¢Ñ(héYYYT*LbE Ç£P(‚@Øb±¬\¹òæ›oV(^¯„à‚±Nžx“v>t;Ìàô9—˽0• EQ“ÉwÃ!ÞC–Hà‰¼y“®é¿2Å=Ó¹&ůO‹suJ÷LÑà)=o:?§óŒ0ŽS‹‹ù4E'OôÅÔÏ>î·¾’L`•J1ùéêüé©û6‘ZΉi¼rª ¸á)Ý3ÅÅÓþ¼ÓÛÕy“‹ù4ÅS}?ŧivÂ4^6½³1õÝfV¦‚À&@€À•è™6›­Ñhx<dÚ&@`6±·¢¢B,G£Ñ47÷&@`Åbi4x}E¶s&@à¢0Ûy‹ƒpb @˜  @˜‚À˜ñ ¼Ð³pÒþ—D"a›Èá/ÑE \I~&P4õßd'ü›ü—èd‚À¦Õ¤¡Pèt:œ/“>u/˜ÀÑ8O˜À'-¼€¿—‡À‘H /àbD˜T*5™´ñÿNJÚIbR'³7þ_B,&hÖ¦ m²¾øŸK‘©?®žˆÌ—ºN‚À3ݲM‡´—sw™L†V‘H¤X,6)‡ñĀΠê2¿E ö^ñ cp|4“ÉÄ=[ãr8‡B¡P(DИ pQ—ÉdB}©öÎL%Ä2›Í±OæÐ‚ 1AàŒ .¼`03AØ^€X&‘H‘H  Î,ê2™Ì+UÇdºbž… 1A`‚º³T*Š›“™LИ 0AÝYCãP(4®@&hLx–Q7ž·s˜º ϰX, mR7MƒA¨{F€ ð ™Læp8l6›Ãád‚Â|Á4¦ÓéT*ABž1ýE£q8œÀl6;é;½AB¡Ñ?¯0˜Lf{jvÀiL£Ñ`·NcB&<#Ôfü!xS€Á`P“b±Ñ9¯°Ú<Õ"÷+Šù|>Î^Æ@ C˜P›gpu:^#Bô AàK®6ã:3¡6O‹:3™F£ê4AàK«6'³—P›§KÆE1¡N¾Tjs¼ËŠP›§]ÆMbB&<Í“,^êjó¥V§©Tªßï'NÒ#< `³Ù\.—Çãáì%ÔæK­NCû|>¢g_X,7„Ú|Ôi`/œ€ë÷û‰n!|áv/N]П‰>¹ êtüÖ†ÙZ/p&áÔ}rÙÖMüz`2áÓ"<5Ðétœ·@c¢O.³å‚ÅEQbçAàt™÷ñ¦/1'.?Øl6öŸ âÃ'…Báþ' Âˇ“ÀáH$Bt Aà A&“ØKDŒ®,¸\n<}>qAàTÓ%)j¸‚&ò¥ OÎÞ™Y$!cÕ¢uÕ'š[ñì%2%g c"ÃD¢%Aàÿ$Kâ`0Ä$˜i R©É&º… ðÿ…|qöBÕ3q^ÒhñŽÅbD‚A`û[p¹\‹E ÿ _m¹\.Š¢PÖ”(M<¾Å‘Qì…ÓØ‰ý½³ /bÁÍh L¥R‰©0K—ÝH$ê›}’‰ÆÅ/‹Å"W³IE¤P€Ã8‰¨RÆ*âwV_ä[[3‹Àd2Ø â—ȸšŠ4‘&AŽ÷]âw¶NS Â@c¢O2‚Àt:Pžç’Æ ‰>™ûŽWž‰”ÉÙn %(ÒÄ>ÒÜŽãng"ð;7€‡…aX‰™Ë8!ðKìÔŸKŠ4.„‰ƒ;æ,ã—j"çyŽ­ËñÆp†oTš›f0À^Âw5W…0.3|“ÃÜ$p|܈ج?·ép8œÉÞ¬9èÄ¢Óé Ͼ"¦ûœb°Œ`¬3¹+æ  ý[s}®‚ñ-2|”çÉd2¬Êb¢Ïa!Lpx˜"í9C„p&¯ÔbP Ì!œ±gzϩǦÑh„Z•9 R©àéÈäõzN§.N'R¯2G‹Îd‡åÜ!0¸¯2|=Îd383þs‡Àñ‘¼‘™&L $Y¼pg Ý4GL¥R ÷Uf‚F£e²é4GïÌ ª„f¦™®¬92× ÷AàÌÌÞ¡Ì öús&ƒL&g¬d.˜p_ÈØø9"aüñ›ÉÆ‘QAÄYO`ê‚˜Ê –Ó`N˜˜Ä™ ˜ … 0A`ÄL |¹† ]‚À ÃF`¶‚L&gàd˜ÝÆe/ÈabB˜ 01`f÷|È(?A`„&L b>¾€#\ÐþÿlÎ<ŸÈ,~ÈÌô: „ð!0Á^ÍŠÌñc&@HàYŒ+¿oEQ Ã0 •˜*gFQÔl6wtt´µµõ÷÷‡B¡ôë5_ †agΜyðÁW®\©P(X,—Ë-((ؼyó“O>Ù××7+*Yîß¿_©TÒéôßüæ7‡óæÍpò›^¯¿ø_ùãÿ(‘Hètú| /þ†### Ý›üΔœ gÜ]a ¬×ë;ÖÞÞ‹ÅÊËË7lØPXX˜æ~Îi_kwìØñÅ_P àý@ 088xøðá'Ÿ|rûöí=ôT*áã‹Å¢Ñh4Ô§cÇ,Š¢ð鯹)nõ裾ð MMM*•ŠD"!rß}÷?þ«¯¾ÊÍͽ`OÔ§ccc]]]ÍÍÍ===4M(Nµ»Éßââ300póÍ7777Ã’¯ÑhæÏŸ/“É"‘ˆÙlnhhp»Ý‚üõ¯íïïß»wovvö¼§žzêäÉ“@`ß¾}Z­vN¶nÝ:22’““óÜsÏI¥Ò¼ùæ›/¿ü2Þ«ûöí«¯¯ß»w¯\.ŸêͧkJ_GF£Á`Ðjµ¶µµ?Þ`0D"*•zñ ùÅ´êèèèˆÅbóçÏßµk׺uë˜L&~A x÷Ýw{ì1‹ÅòÙgŸ-_¾ü¾ûîãóùWvðÚÛÛ;<O|ïMÔ“wÝuׯQ‹ÅW¶åµµµF£±°°0 ‘H¤,[¶lýúõ, .8pàÀu×]W]]Mœ²2ƒ<88èñx<ÏÐÐÑh4 z½>_ñ^hnn®­­ ƒZ­ö£>Òjµ K8‡ÃùÉO~RRRrÇw ¿øâ‹ÿõ_ÿuÅ ‹Å&âê¸fÅ–-[fæ,4™LEEEñнÉdÚ´iQacʃÃÃø*Ëb±rrrPu¹\~¿? €<O L©‡††Ž9ÒØØèv»ƒÁ ×ëõûý(ŠÎ„^¨««C„D"Ý}÷Ý …b"lÍš5›7oþðÃM&S___nnî—ã8¾ý³B¯‡Ã¯¼òÊ‹/¾Øß߯V«I$R$yðÁ÷íÛwüøñ©ÚÀ™K`A:::Ž= îV‹UQQQ]]íóùúúúŒF£Çã¡ÑhYYY¦¨¨¨¼¼œËå¦9EÀá¬×ë}>ßhË.—Ën·ã>I‘H$¦«¬V+¬YJ¥2õª´téÒÏ?ÿ<ÆåË—ãv»Ý---¡P(;;[§Ó]æ³'rÕ& MCCƒËåÂ0låÊ•¸²šŽ«¢££#‰¤ïb$p™ìñxø|>¾f#b0z{{À$Éãñø|¾ööv·ÛKàöööÊÊJ»Ý~ÕUWñx¼4} …B£Ñøý~\ÚãÌI §Óyîܹºº:ˆ+ˆÅâE‹ ‚é²å˜L&}úô=÷Ü366vÿý÷?öØc"‘hÜö?~|ï޽ǎe±X:nºï¾ûd2þȇ¾ãŽ;FGGá_ƒÁ­åñx³">7 \WW·jÕ*‡?± ˆFM&“Çã±X,‘HûÁ`Ðb±x½^‰$—ËçÏŸŸŽÀÉÍÍ]»ví¢E‹@üƒÁ®®®ãÇ›L¦tÏårõõõ ¦  `Õ pY½øâ‹Z­öŽ;îàñxã^)‰&šÁ8Μ9³cÇŽÞÞ^ha(ª¯¯¯¯¯õÕWßxã%K–$+Þo½õÖÃ?l±XpÝ$ ?þüùó/½ôÒŽ;~ó›ßįV «t Þ)8(ŠÆb±äÞŽÅbO>ùä3Ï<ãñxpö›o¾ùæ›ozè¡òòòIÕø§žzêùçŸw»ÝðŽßïohhhhhøÇ?þññÇ—••¥õ]}õÕ/¿ür|p®¿¿Ÿ gZnmm•ËåÉ$ŒD"@A‰D"(J 2“H$ŸÏ×ÕÕ¥Õj5X,žT‘¦P(jµŸ[‚ƒÁúúúô½xLo/lܸ±¸¸Øn·#²}ûö½{÷~ï{ß»úê««ªªâ}Ñé`ddä§?ýéÈȈX,^±b…H$êééijj …Bz½~Ë–-û÷ïŸ7o^|wýío{øá‡A.‰ÅâU«Våçç»Ýî“'O"òÔSO…B¡‡z8Ìd2ß~ûmxÿÔ©S¡PèùçŸ/--e³Ù2™ìÿÉ'Ÿ|öÙg½Z­vÉ’%l6»­­­¡¡a×®]×\sM HñõW^yåìÙ³ žTWW‡ÃáƒÖ×ׇÃážžž'žx⥗^rÖÔÔ|üñÇápø?øÁÈȈR©„0’\. …/„Àíííùùùùùù‰dÜ5»ººzÁ‚Z­–Á`ô÷÷×××777CÊ”Ëåöx<“ ¥d“lFåÊp8œ½{÷Þyçmmm±X¬¹¹¹¥¥åñÇÏÊÊZ±bÅÚµk×­[WZZšŽ¢qôèQ Ã~øÃþÏÿüONN<`mmí}÷Ý×ÝÝm6›ÿô§?=÷Üs8Ózzzžzꩱ±1‰tÏ=÷<òÈ#999 ðp8üüóÏïÚµËét>÷ÜsëÖ­Û°a”ÿY¾|9‰DzõÕWáþË–-«®®¾0ë´®®îå—_v»Ýt:ýÏþó¶mÛÀ&Â0ì›o¾ùÉO~òïÿ;µ²sìØ1­VûÎ;ïTUUA~ÿûßïÙ³ç‰'žp¹\û÷ïß¹s'–'pŽ’H$6›½råJðQe`eÐiett´¯¯Ïn·+Örss,X°fÍššššªªª%K–”••eeeAwG£Q·Û‡/CW$•”””””hµZ¹\>½É®óæÍûúë¯üñââb …Úæèèè¿þõ¯ßüæ7555fëÖ­_~ùeê´A î½öÚ§žz*???j|ÕªUo¾ù¦R©$‘H}ôÑÀÀ®Ç¾òÊ+ccc†ÝvÛmO>ùdAAFƒQ6›ýÀlß¾ÏçG£ÑW_}Wq“sàß  Á /¼àt:I$Òã?~×]w …B†a“.¯f³nX\\ßDœÁSGñ¼üN¤q ð6!\Ÿ‡S» pîùýþ‰–†)­é/š÷¦‡Àd2Y p¹Ü©<ç d2líììœtc:…B‹Å HÇåRŠí½½½ð‘B¡„gn¦ÞÔÑÝÝ *wNNN¼ìJGGodòõ¸öÛ××7‘uÝßߟŽáMàŠ€Æf³ …D"¡P(39Íëõº\.\Lñù|@€çu\ŒîP\\ ä—_~900•••‚§½½= )•ÊqÓWz{{õz=ˆ‘ðÑ¿ÿýoŸÏG"‘æÍ›Ðââb@@&“Ïœ9322¢P(’oèr¹êêê‚Á ›Í.))‰¿mšãöð¸ÍŸ?î£GdqaØÑ£Ga§ÇlÁ¥Hõ™¹X.—K¥Ò™¼mÅãñ´´´|öÙgûÛß^}õÕ>ø ¾¾~tt4Ž›8%°X¬k¯½–Çãù|¾ûï¿ßd2M4ü†ýéO†`ïDé–Ï>û¬ÝnOx³±±ñ³Ï>óù|T*uÆ nÍ`06lØÀårC¡ÐîÝ»“¿wÁ0lÓ¦MB¡pJKÕD‰k¸«Ñh Ôßßÿá‡Âú/¾ø¢¥¥evIàXæ>+**t:dJÎä!±Z­---çÏŸ?wî\cc£ÙlFdºÆéW¿úU^^…B©­­½æšk^ýu§Ó™°E¾³³ó¾ûîÛ½{·Çãáñx÷Þ{ïDùgxøá‡çðN]]ÝwÞ944D"‘¾ûÝïÆï}½÷Þ{³²²H$ÒÛo¿ýøãWá£P(´sçÎ={öx½^*•º}ûö‰ò riâ_»\®ÔÂyûöíð øÃÞ}÷Ýø¬É£Gþâ¿wY™\Š xöf‚¦UUU%(f3Ñh4 ƒAEC¡œÆ4]ÎÏÏß»wï¶mÛL&SooïüãŸÿüçEEE …‚Á`x½^ƒÁ`µZᇨTê³Ï>;oÞ¼q]©yyyV«õ7ÞøüóÏW®\)‹»»»ÀˆU*•=ô0P^^þÀ<òÈ#‡cïÞ½}ôÑêÕ«óòòœNçñãÇAúýîw¿[¾|yB8oÀã?~õÕWïØ±Ø»ÿ~0+R(Ï8n¼ñƃ¾õÖ[@àg?ûÙž={–,YÂb±ÚÚÚÎ;‡¿ÿýï8pÀëõNäm¾€Çtppð‰'ž¨¬¬Ôh46l˜(üv†Ü›Œ°—-[6UßælÔ”¶nÝúé§Ÿ"RWW·xñâþð‡ñÿR©Ô5kÖ|ñÅ¿ýío> +E{{{{{{Â} wîÜyýõ×O4Û®ºêªÅ‹ïÚµËjµþë_ÿŠÿ¨¨¨èµ×^«¬¬Œ·±AÒéôGydtttttôŸÿü'¸Çd2zè¡_ýêWÉâwùòå_|ñE0ÕªU;vìX¶lÙ|¾C¡P8]vÖsÏ='‰>ùä‹ÅÂáp¼ëÓùÈ‘#ñÿ{¤N|çNzAú˜Ò­œN§ÝnǽÐ"‘H*•ŠD"¡P{tSÇT&•ÀÙõõõ·Ür ¾¡’=ðÖ‘&ýø÷ñßJy†¢è¸·F£¾oãfá¸1øéø6S(2™ü¿ÿû¿þóŸ=Ïßÿþ÷[o½—“(Š¢(:ÓR2Ün·Ëå‚¿3äÀ¦K+“cF“àç˜ÒSrÿ¦+±Xï4‚+ã—ÛÔ$¼óÎ;e2Ùo¼Óÿ÷Ùi26Y_€<þ¸Ž·‹`Ü.ºÿþû[[[ù|þ¾}û’ãX†Áq$)A€G3j6ã'€œ ˜2ÑäK±öOzÁT'zš·J¾2}}éšk®Ù´iœÅG¡Pà_.—;ÃÝï—~¿ÿÌ™3Ÿþù¸ñÞƒž?>kµÚÜÜÜžÞœi,Òl¯ŒV:V[[«Õjq›¿¶¶¶¸¸xÒDß9ë®»ŽÇãa¶}ûö_|qttä¶ÇãyõÕWï¾ûn8l`Ë–-Wü]žƒNsÀvíÚõòË/ÿèG?‚d£„37ÜpêU«X,–ËåzðÁU*UQQQQQ‘R©Ü¾};D³+**îºë.‚À¯˜Í“ýá‡nÙ²R ²³³ßÿý;î¸#Å”öòË/_wÝu, EÑ`0Øßßo0Ð`Ñ¢Eÿûßóòòf¾ª’žõ»ºâÇ,…5»mÛ¶ÿf8¤Ré{ï½÷å—_¾ÿþûuuu‹EQ…BQSSsë­·^ýõSMá¼"ˆ+fÃH³l6$¥Xù%š=¤¸Á³x )>Ž‘¤YÑþh4êr¹ †”z[(!g–Nßu B2y¶oRŸ½KOÆêϳÞÎØa#0ÑLȨÒ\#0ÁáLÆ4nn!|Y‰D"‘H8&ŽÈXDâQçõ̇ã@LåŒ%pfÎ9% !œ™€24g·Æ9LLèLC<{3ÍB™KC¢8C¶¡wô3íÙçc±¾ZtF!ÆÛPç‚ELëÌA¼û* ŒPæä@ÿg¦œ?wŒaX&«R{3sզ̽á5i3ŠÀëø˜SŽF£Äˆfb±ž}•±:×\;Špeeâ½;œË&ö6dŽœ±0·°úý~«ÕFE"QêZÉHpeMËaÿf¸øM6—b±ØÀÀ@ÂûxAfB_Bö677ôÑGo½õÖñãÇGFF¦ª]‘¼œ?þñR©”ÍfòÉ'PiR<úè£pTÍ»ï¾;]õ;·nÝ …rp<úè£n·>=sæŒJ¥¢'<ètºL&ëïïŸáâ7y”QÕëõؽ{÷3ßâ£>jnnƒsÌ»9C%p__ŸÓéÌÍͽÛÖf¨oD§Ó/ŽF£Á`0 ¦¯·_~³ ÎýI3ÜÛkgæ1#‘H$ †B¡î+ŸÏçñx¢Ñ¨Ûí†É°råJB…¾Lóì"ï  .a®à,ììì„ʃ6løùÏ..ÏïþáÐh4 ¥ªª*y S*•åååPÚ0®bÉãñ¦ñ˜±{î¹Çl6+•Ê;w*•Ê‹¹‚ °\B‰Ùä ²³³W¬XQZZêt:›ššðÚQg{AœÀUâžFlÚ´I$E"‘„²£n·ûÔ©S###J¥2…J?íÓëºë®KQóiÍš5Ï=÷œL&‹óRˆuúôé®®.F…Z.’½8‡Ç1 )¡PX]]¢¨Åb±ÙlsÕ@›«ú3NQ/m.Ö®]»zõjÒxuðo1s:ί»ÌGØ¡ßâbº"‹áìEd¢[‘Éd8†Þï÷OcYã9KàP(š ›ÍN¿³0 §…B™v÷ Œ4®HOcmÛqq1•¾fõY—‚àìM'z4çëæÐz{{) ƒÁ€J_)ÌEE½^¯×ë …BPW’Çã‰Åâh4ÚÛÛk·ÛétzyyyrYp$øý~Ø/Â`0ŸÏÝÝÝ>ŸO$'T*N-]=‚ 2I¥RY,ŸÏçr¹ñ? „/i†¾¾¾ÁÁÁX,6oÞ<©T:.™‰Ê/'pÓ7   Ã4 Fs»Ýn·;‹Åb‰D’!5ëh»wïf±XR©T¥Ri4N7nç`0ØÓÓ£×ëõzýèèh$ …………%%%b±¸®®®±±Q.—³ÙìÊÊÊø¯»\®îîn½^ßßßïp8H$RVVVqq±V«¥R©Gíïï/--år¹………“z›Pèëë3 CCCN§EQ.—«T*Õjuaaaqq1‹ÅœÃ8ð[Ýÿýï¼óN Ø»wïí·ßï­9uêÔí·ßn³ÙH$Ò믿~óÍ7ÇzòäÉ-[¶Øl¶¥K—~üñÇR©”D"½ñÆ/½ô’ßïÿÇ?þeJž~úé¿üå/n·t“÷Þ{ïÃ?ŒF£»víÚ¾}{r¡'N¼üòË'Nœe2™:îÆo¼÷Þ{e2ÙÌ#>úè /¼µ‚¿ûÝïÆ_|ñСCÃÃÃÐæ›nºiÛ¶mñm>~üøÝwß=44Ñ5£ÑX^^N&“o¼ñÆÝ»w+ üæF£ñÝwß=xð`ww·×ë‰D×_ý–-[ “ãM_“ÉtäÈ‘ÆÆF…B±qãFÖÕÕÕÝÝ¢è‚ –.]*—Ë3ôááaE»»»›ššt:ÉdZ¹r¥R©Œ×ëü~]]]kkkKK‹ÍfƒCÌûúú,‹T*íïïLÞbµZá‹^¯ì®ƒÁ0<<,ŒFãàà D"I'¶F›ššš››[ZZ†††b±^Àº³³S*•–——[,–eË–á5!Þï‘Æï¶bÅŠwß}7 ÖÖÖ~÷»ß§èéÓ§=8HN:õï|'þÓÚÚZ·Û a Ü´ÆOÀ=U(ŠB$·&zF ÃvîÜùüóÏ»\.0êB¡Ð¹sçΟ?´/++›!s1ú-PýüóÏûÛß …ïóùNŸ>}æÌ™÷ßÿïÿ{yy9´EQœøÃ“ã·ï¢(úÒK/íÚµËjµâe®9räÈîÝ»wïÞ½lÙ2Mà0‰DÔëõn·[*•†Ãá––‡Ã!‘Hæ^°7W¯^í÷ûív»Ñh¬««óù|†mÚ´I,ÃD"‘††††††ÚÚÚX,¦R©d2ŸÏ…B‡£»»{xxxtt4Ù ñz½gÏž=sæLcc#‡ÃÑétYYY,Ëï÷µ´´ðx¼‘‘¼lü¤²·££ãüùó'Ožôx<¹¹¹2™L$‘Éd¯×k·ÛNž< "wéÒ¥¸5Ž»£Æ8׬YåªOž<™zQ__¿S[[›ði]]¼³~ýúQ–­[·®ZµªµµõÑGu8ëÖ­ûå/)‰ qeüå—_>þ<‰Dºí¶Ûª««ÃáðÁƒëëëÃápggçã?þÒK/š9hiiyûí·=Ï­·ÞZSS‰DŽ;vêÔ)Ašššž|òÉçž{¤ëüùóa¡üñl6› Å®]» …\.ÇKCîܹó¯ý«ÍfƒJˆUUU"‘Èjµž:ujtt´¿¿ÿ‡?üá3Ï<³xñb(¿¿öÙl¶ÖÖV‰$‹u:]NNNiié¬(æ4=¾ãŽ;  ]ggç‰'ÚÛÛy<^~~þÂ… avvuu;wŽD"­Zµª²²²´´”ÃáD£Q£ÑØÙÙ ò*!F‚¢hoooGGGsssVVÖòåËçÍ›§Ñh˜Lf èééikkkllt»ÝñR1ìv{GGÇ™3gB¡ÐêÕ«+**Àl¦P(‚Æîîî“'O677óùü¼¼<°‹pWY¼ ÊEvvöüùóm6[WW—Åb‘Éd°`…B¡†††p8L£Ñb±¬ë¸Nè÷û#‘H^^^YYYŠÆ«Õj•JÅ`0`™P(+W®ŒÜà&ñ‰'´Zí;ï¼SUUmþýï¿gÏž'žxÂåríß¿çÎÓKà444Lä<õ†Ÿýìgwß}wB={ö|òÉ'5554 EÑxàùçŸß¹s§ÃáøüóÏyä‘ììl2™,‘HV­ZE"‘¸\.¸9W®\©ÑhðBíÇå•Wl6[aaá3Ï<³nÝ:ûì3¿ßöìYµZ ËÙ¹sçü~?†aëׯOðŠ%k¹0G'u2Óh´}ûö-X°_(Ê/ùË÷Þ{¯¡¡A‡Ã¡R©¦ÑYíñxR”ÿÂ"›Í6‘ã-¾øâ‹555°‡¥ÃáÀ¹zj¦áÿ¾ôÒK£££|>ÿõ×__¶lÜ  ýë_‡B¡¿þõ¯&“©±±‘Á`$øh˜Lf^^^eeåâÅ‹ãÝ t(8KKK …Ïç3™Ln·EQ¿ß?00`µZy<^aaaee%îé…©©Óé´Zm²ßÕëõ‚×J&“iµÚÒÒR®ƒîÀ¡PˆÍf㮦x-½aÆt²”Ò™O×^{mEEE‚0§R©*• W"¦}౉‘ÎסÍñd#‘H,«¸¸ÞLó>ÃÃÃçÏŸGäÆoÔét 7„û¬[·’dz{{q7@PPPPRR’9R÷?Vü‡ÃÉÏÏÏÊÊóù| »FFF|>ŸL&+((›3þû\.7ù}E}>ŸÍf‹ÅbB¡°   9>, óóóù|~:• Ãáðèè¨ßï·ÙlÝÝÝv»=Ù_¢¨Óé´Z­Çét&äè@X×¢a¢TWWËår»Ýoƒñ¹hÑ¢’’’¢¢"›Í†½8Y,ÖòåËã“C.ÆÉ´råÊq¶“sB¦ ·Ýv[r&V‚R0i›Ç ËáŠqšhkkƒÿþ÷¿’—L&Çb1p•9ŽP(”@`‹•››‹»-3—Àd2Y(r¹\*•ê÷û!7#‰@F8ƒÁ‰DÉI-¶ÆápâH4EÄçóÑh4¡P–jÂÓét±Xœ¦Î‹Åü~?”½žHªD£Q&“ )² # Þ,\‘f³Ù4mÍš5ýýýF£ìÌsçÎ…B¡¥K—2™Ì+V455µµµÙív©T ;¥ÂáðúõëÅbñt͘Ÿÿåл(v1)âJ¥r"ûJúÂèè(8çAošh9@Q”N§#’ìɇ|„¹n•aɸò¡â3ø ¨TêDÉL4J¥ÆS˜¢(…B¡ÓéãJ'ÈISÈ@KÀS(©ó½ø|þD±Sà04˜L&³X¬õë׿ÿþû@àÔ©S•••=== ¤-[¶ŒÉd®\¹òoû›ßﯯ¯×h4gΜq‘ÚÿŽÌf³Íf£R©2™ 2“™Lfvv6‡ÃÁ]Ó | ƒƒƒ.—+^ÌÒh4.—+‘H`QH&ªÇ㄀ͤ­d±Xr¹\ „B!³Ùl·Û1 K8AÂn·Ÿ:uêÓO?ýúë¯ûûûS, @Àÿ-|>á±±±ŽŽŽS§N…Ãa0€ai_±b“Élooïíímii‰D"ëׯO}HÀ83V†TTT€ÿéĉà7…Ø Øl¶³gÏ~ñÅŸþyww·Çã!RÊÇ!p$éèèèììáñxx€’:¤R)„…ÚÛÛ@¼òÜÓÓÓÓÓ366–Э 'Åbñèè¨^¯ïêêŠOÕB¤³³Ó`0@2s:–Éd*•* ™L¦¦¦¦„e hii9{öìñãÇÍfs0Lm]ÇO‘šš‡ƒaØk¯½f±XP÷0C¾$Š¢{öì³iRëÏp’Þ\•*é¬J\.wýúõ<¯©©éã?v»Ý>Ÿ·ÛÝÖÖÖÐÐpøðá¾¾>¯×K£Ñ2YaGÓ …Bƒ¡««ëìÙ³Á`°ªªJ£Ñ€Êf³!åhxx¸µµU(Æb1­VËårñL¬ÎÎÎäߨØX8–H$‚øýþt‚¨ ¼¼ÜápøýþóçÏ[,–ÖÖV±XŒ¶Á``2™UUUx^djE8ŒaØÂ… »ºº "=þüx["‘Ì›76`‘H¤Õ«W§¿íú.>tèгÏ>›““³téRHJ»‚£~ìØ±;ï¼3C®¿þúÛo¿=yïÔt¢ááá]»vUUU©Õêµk×r¹Üyóæíرã±Ç³ÛíùË_>ùäµZÍd2½^¯Ãáèëë ƒ555ùùù„ œ8ÁŽ=Š¢h,ãñxóçÏ/++[µjUüvJ&“¹xñâH$B§ÓÛÚÚ ƒÑh„H ô¾L&ƒî¦Ñhñ–H$K–,‰Åbl6»»»»«« b E&“ÁÎáH$b6›!Ô4©Öjµ‚P(”ææfÜ\_7†a …¢¢¢bÁ‚óçÏO3¿Ì-V^^Îçóa#â/[±bÅ©S§€À6l˜È·ýeeer¹Üb±x<ž§Ÿ~šD"ýå/)++»²¶X,é\©V«§ëpÏ%K–€xýõ×)Ê7ÞˆG~úÓŸF"‘^xÁjµêõz“ÉD¥Rá>@ì]ºtiêÐC†ò™¥R©Z­¥79½Q(®^½:;;[£ÑôõõÅ+‘H acƒ^¯ª',yyyëׯí×`0¸\.–]TT¤Õja»Ž·‹ ½^o‚&L¡PæÏŸ/‘Hòóó ƒÙl†|OجÑh´Zmaaá”RêÀdU(&D"š IDAT‘d¯\¹rÏž=>ŸL&¯]»v\Á5‘Àçp8o¾ùæOþøc»Ý¾nݺn¸Óûý~Øf(‰Æ=ÝAˆNp ÑhãžÈ1…eŒFóûý<O"‘äääàÑHœfxµ4ƒ1ÑipJI:b­'ò·Åb±©jŒ[·nýôÓO©««Kq¨‰DJópÙ©„öÇ= Rð À¾ƒ>ŸÏçó¹\.‹Å266 Z§eòo ‚KU­VO¤ÑX,–>øàøñã`Û¶màјKbœ¦ÕjSh€@À`0œ>}: .Y²$//¿’L&û|¾¡¡!—ËE§Óa»/|êr¹ÚÛÛi4Zeeå‚ â7Ä‘Éd«Õ:88èõzá‹ñz)HànL6›Íf³„ÃÅŒJ4åóù<Éd†B¡@ Ÿè 3iº&:~Ù¤_¹¤öÞ%Šc§h3œ‘ð»¡Pb@*iäçç§9¬¹¹¹Sú9©~Oâ”§R©Á`Ð`0ôõõ¹\..—[SSƒ{qéèèèîî¶Ùl'''×s€Û^¯7‹ñù||¿†aàÙêïïw:F&“%˜7éôõôŽG8†$-™L&ʲ\4PéMiX§:æ&S ênvvv{{{SS“Éôù|\.A³ÙÜÓÓsæÌ™@ P^^ž——'@ªp¹\±X,•Jûúúภ›Í–““Ã`0`«0ìõg0&77w&ì ƒxZ8ö8N†œvù H<{ý~ÿ4Þ6G£Q‹Åû·ç¬kÒ+rrr´Z­Õjmll ·ñsä/Ý¡ÓÐ5d2›Íæp8ðÉ!ÇéR›qö^º ì(ŠÆ„PÙœ¬<.8x3QŸË &“ÏáÙ¨NÏ4µ^\êMv\e¢z\¹tÁm6v¡NO‹Úoô^"µ9è: Î@D£Q°¦â™L¨Ó3MmÎLNWƒÉBNSmÆÙKt Aà¡NÇKc&“IˆâÁ …à nÜèM8÷ŸAà+©NãìD"ÌoAШ €*dÀÞ47N |™Ôi¿ßr83ÿ™IcœºÁ`0žÃ„ÚLx†ŽJ …BppqÆÒx\êÁKxFEQ°î2“Æu ÏA'3yîј .Aà9Kc8`®Ò˜ .AàÌ¢q<“¡:Ì,MáŠD"‘H„ .AàÌ¢q¼@†ºjPÇø"‹^6yF¡($¼ ¨K8siO]xÿ;sÄ2f€ó6ž½6#¨K8i E‰“9œLæ+.lH›ü‚V‚ÀGc\p2㤆—Z,ƒ°M çD¤%JŠÍbF8‚#//oz½©~¿ßjµF£Q‘H”••u‘©NïÝ.gŒFc À0¬¸¸˜Íf§ 3Ž™âo:?‡j÷︤µÙl6› A¬¬¬uÚÑœD$q:>Ÿ/‹Ŧ¤…M~©Á`8xð`wwwQQц ´Zít©y~¿¿¹¹ùĉ§ººzùòåJ¥ò‚ÅÎôÞíappðÈ‘# …bóæÍ° N$S8áo2c'%p2{GFFjkkÏœ9C§ÓW¬X±páÂxæÑœA0lhhèêêêëëCD£ÑlܸqJKëºþþþžž …2]erâY×××çt:sss/^I»˜»9A0 “Ëå—´pÑàà ^¯w»Ýk×®_†#‘T~Š÷l]ãÀµ}›Í¦×ë)Jeeå>uáóù t¶H$J¿€S4mkk«¯¯?sæŒÛí†"Su1\a˜N§K$*•:-ªÚÏ6»Ý~îܹÎÎN.—»|ùr­VË`0.‘ê($ FMa-“H$8¡úb<)§½'3^¯·­­­¹¹EѪªªyóæñùüttÇc6›[ZZœNgYY S(SÒwhW–½W]uU0T«ÕWðäÞp8Ü××wîÜ9@PZZzé6B¡ªÌ@A¶ÔV:ν‰.˜”À».àøø†††X,&“ÉJJJÒŸu£££^¯W*•VWWCUЩ,W’À #//O,cÆb±X,Ö´µà 8°þÒý ŸÏ¯¬¬,++#‘HÉU /@ã N¨™!ƒàDHÝÄ0 A¨‰—››«P(ØlöTõ¾+¬BS©T‹…a^;Í'ƒx»Ùå&e2™à¢ ¼»—àË “ɳ¢!>õÁÌÓIàX,æñx¼^/œ-ˆ l4Æb±(ôš““C&“g‘““ÃápPëïï‡ÃJ¥2???¡Ç£Ñ¨Û톓¨¡ ©@ àóù@ »»Ûçó‰D¢âââ‰ìçp8ìõzý~?øÞ ©"‘(¾³  T߀®4›Í‰„Ëå¤3ƒª«^¯7 Æb12™Œ|p‡`0ØÛÛk·Ûét:”8Ç+ªÆÀ¢Ñ¨Ãá€h“J¥Š¿I,óz½PäN熜|>?A!Ÿ4¨vaQ7èU8\Ô{p¼±Ùl@< Æ}4¨¥¢V«Ó,ÈŠ?2h4ÉdŽ[PAöövÇÃçóu:—Ëõz½'~ºÂHñsPîM¨_+’%äðððÐÐÐØØ4ltt ¤X> š?ëÀ¦R©ð>‰F£ñ'±“Édh|?Ó¦º¶566B±B»ÝŽa˜P(T©T¦¢¢"Þ1‹Åz{{:d2™JJJ–/_îóùºººôz=Ç[µjÕ‚ H$Roo/T¾^¼x1˜…ø3»\®îîn½^ßßßïp8H$RVVVqq±V«¥R©Gíïï/--…Z¤ÉóÀårA;F£Ëå•U¥RVUUúŠ¢h__ß¡C‡ÚÛÛ¡Dí×_}úôé’’’7êtºIgX(Òëõð[###~¿ŸŸ››«V«‹‹‹U*¤:zôhSSÓÀÀ”°©­­mooW©Tëׯ¯ªªW%Æ0Ì`0|õÕWàÁ>tèPmmmqqñæÍ›KKKi4šÃá€7™LP3j¡èt:…BA¥R§@à`0X[[ …::: r7„ÚÛÛµZíÐÐÐUW]•ŸŸÏa£ÑØÛÛK¥R1 óz½>Ÿ///G!2<<ìt:µZm¼·ÆjµÖÕÕµ¶¶vttx½^*•J¥R Ãðð°@ 0ƒƒƒ‰d\·»Ýn?vì˜Íf3™LápL”žžžöööŠŠ §Ó¹víZ‘H„?œÛka(‚¢ªé3@ ¾¾¾µµµµµuttœI†õöö¶¶¶êtºÁÁÁ«®º úçðÐд*~šBŒÏçÛl6«Õª×ë£Ñ(ƒÁÀ»Åf³ÕÖÖ¶µµAŸÀo¡(ÚÓÓÓÚÚ ´_µj•@ À9œ:¨6¥¨Š¢]]]çÎkii1›Í¡Pf?8Ìàp¿ÂÂB“É´nݺ¼¼¼xÇ?ÚÈÈH___£¥ðÓÖÖÖ¶´´´··»\.ÜWF;:: …Ùlöù|UUUñ‘?‹Å244Äf³¡®uKK‹Ûí†*í±X¬½½]§Ó ¯^½:~\H$’Óé<}út[[[{{»Óéï 8ÚÚÚrrrÊËËkjjjjjX,® ‚Ïgø7¤v"BYsApdéá³n``àÌ™3­­­½½½0ÿ¡%z½¾¥¥E­VÆ¥K—–””¤K`EÂá°ÇãÉÎÎ.**âp8‚Øív£ÑxîÜ9A¨Tê¦M›JœA‘ hY^^^vvvNNŽF£a2™ðíõzÏž={æÌ™ÆÆF‡£Óé t¸ßïkiiáñx###x­÷ä…¦««‹ÇãÑéô¢¢"6›Íl6ëõúúúz*•ZPPPUU΃իWçççŸ={#•””dee¤–HÑh´¡¡¡¡¡¡¶¶6‰¨T*¹\ÎçóC¡Óé4 õõõ‚0™LX/ðÅ8¹ÙðN$éêê–––*ŠÜÜ\(ÝèõzëëëÏž=ÛÐÐÀáp´Z-TE÷ù|6›­¯¯ïäÉ“‘H„Ïç/^¼¦×¤ ДÜÔcccÿ¯½kmJ+ËÚGàp¿_Dîwo1Ú±§;=Ýýuj~ÂôÏê1Ÿ§¦j&™L¥&"rQä~äv€÷ÃSu^ ј™ž÷eH¥=gïuÖÚ{­õ›ÍV*•[[[J¥òèèèðð°×ë­®®z<•Jåp8îr¡ †F£yùò¥^¯ßÛÛ ƒ´ÖÉd2£ÑX(vww±•›ÍØz•H$°%¡991}èÛétŠÅâÖÖ–Ï烷Öl6#‘H xóæM ‰DF£ñÙ³gôþ„­…¢(•Jµ¶¶¶ººªÓéØl¶@ b,-¤×ë…ÃaÜ,—Ë_¼x±´´ƒ¿½½ …B'''?~¬T*w…1Èìi4šgÏž­®®ªT*&“Y.—?}úÄf³ý~4Å­¨B¡$I¯×+•J‰D8ær¹N§sccƒÇãÝ›O¥RÁ`poo¯×ë}óÍ7ËË˸̭ÛíÆb±`0øúõë`0(“É\.îd,äZ­Öï÷µZíêêêÊÊŠB¡˜ŸŸÇÍ ‘HäôôôãÇÉòò2núgñéÓ§ýë_'''Z­Öb±,,,\cyy™>¢ð§Z­v»Ýápiçl6Ûh4>³b ÔÀ~¿'¹Z­âòÝ!ýg0V«µX,ƒA$Ï`ÀB¡Ð`0 Ærô¡a4e2Y&“Éçó?èŸ!B h4šiÛn·‹ ®ÛíŠÅbƒÁ0šÇ‹Åz½^(ÞÜÜŒ}—Ë•Éd£Û<²ðL&óIÈ­V+N×j5¥R©×ëÅbñП/—Ë`/‹år™ÏçÃØ¥MR©Ôf³mnn²X,Db±œF£ÑjµJ¥R£Ñ(•ÊQÏ¡!ÌŸž ~> <¥V«1™L@bcw‡#—Ë9N½^¿¹¹iµZONVÅ4šÍ&A´MÝÚ`EMkÀL&encŸˆ £÷OÿÙÌз‡ÕT&“Éf³'Ü äýK³2K@!&,ðAæ4VVpøiÎÆ]'Ø—¦ÕëõÃÃÃÓÓS`ªL&“þóóó|>Ÿ P ¦_Ú½*‡P_­V‡B¡ËËËb±˜L&‰D¿ß'IhˆËåZ__Ê™1™L¨ÐØ7ÒÝѨ£ÛíÒªu×èÿ}eòAJl3¡£’»fÒív‰=ú®Z'\ö…oy×[§ßé±@kﲜ»0¤6Ó*‚ùÜ%–^¯‡TAvœÉ“§Me‚Lð 0ùùùiÜTÔN©…ívûÇ»»»ûûûý~ß`0h4F#•JÁb±Xçççýë_³ÙìÓû.—kqqquuµP(d³Ùt:}}}](Æb±\.GQÔW_}5x^Á&'«k¿ß¾ e±X“%<(±é¿æC• SÂLPÍr—ˆy>Fj6›¥R©ÝnÍ91PdD"‡Ãyôh$2âCêHQT©TúÌCu Þ,¨…EŠ%›Í¦R©v» |š2ãQµ€7ÈårA¢{ÊQ¾ÎÜÜœÝn‹Å÷ OGõÞYåóùP(ôáÃñòåKŸÏg6›ù|>޲ùùùv» æÃÓ ‘6›Í6z½ä$´âñx ØÙÙ9<<”ËåV«u0©‹þÕcÕµÛí–J%pÈø|>Ž8h`V.—»Ýî(æ×ét …B³Ùħÿ§A`JhÓQ¯×ïb:”ËåF£!ĺ¹¹I$^¯w(þ¬V«ˆ¼ÕjõôÍw-@&“õûýjµšH$l6Û??¯×ë‰ÁŒñ½š %I¿ß·Ûí<ªPÍl·ÛM&ËGoÆPV§Ó ï 8£ÑH3±ü~2™¤( júTn ÄåóùB¡  'ó„H’\\\t»ÝWWWÇÇÇ"‘ˆ¢(ˆ´Ó@ prrÒëõL&“V«ýœ²ÇQ™4 ½^&. ¡®2“É\.ÏÑÑ›ÍÆÕjµ@ ðéÓ§L&3ÍgB`·¨R©€úF .p˜ŠÅ"\’B¡ —Ë?eáp8<¯V«žžÂ! v‹ÅÎÎÎÒé4I’:n49ßëõ@·êõz ªk§Óº1Âvìr¹®¯¯ŽŽø|~»Ýknn.—ËœŸŸ«Õj‡Ã1¶õ\¤R©¼àq­ã¤R©Åbq8{{{ûûûl6»^¯£¶‰¢¨«««@ ðîÝ»l6ëñxÖÛ½9[‚ Øl¶B¡888H$p!ˆêŒZ«Õú™m+ ‚p:étºR©œœœüòË/‘HD¡P€÷›ËåÚí¶L&k4õzý SÍ`Ï …OŸ>F_^^õ£ Þl6»\®J¥²»»ûüãââ\hpN£Ñh±X\YYq»Ýƒ5–ÉÕÕdòêÕ«H$¾Þíím.—‹D"ÝnwuuÕår) ”‚“H$...æææR©¬®P(¤Ói íSÖlH$«Õ þÌ›7o‰„F£ár¹­V õ õz ÙZ­vqq±³³Ón·½^ïç| ¡P¸¸¸h·Ûß½{÷úõëh4*“ÉP‚R­VÁjn6›V««Ütæçç%ÉÞÞ^2™ÜÛÛó7ŸÏƒA¶ tû8&“i³Ù.//«Õêû÷ïÿùÏâkŠÅbšz:SPA8˜agggàQ¯¬¬h4šU¹Ór·ÛÉdPüó÷¿ÿ= )•JPAüçr9³Ùìóù|>Q,Á½§“ÉÔëõv»½Ùlžœœ\^^Òyi@°¶¶æõz_¼x1”ÍÜÉd›››Ýn—$ɳ³³`0H7yS*•(£ít:Édòó“Þ´õjµÚÅÅÅP(ôñãÇX,æõzU*ըгÁ#âùóçðü~ÿÅÅE<‡¡v:’$·¶¶1~¾Xd2ÙÖÖò.¡P2½¥¶^¯×ç󭬬Ð!ŸÁ`p¹\Fãèè(Nçr9ܱÆb±t:¶ÚwïÞU«Õ{ç†ç£,æòò2ŸÏã9 …âÙ³gb±8•Jíìì\]]íïïƒ&•J½d¨r6›E!T(Âëh´R$mllx;r1IDAT½Þµµµ¡l«ÕÚn·ÀÕÕ]<Ççó}>Ôu°Áãñ¶¶¶z½I’~¿?‘H$“Iúk²X,»ÝƲ×ëÌG‚8d2™ …B(J§Ó‹ÅÏ;„U*Õææf¿ß …áp8G£QT#QÅápVVV<Ï‹/ôz=q¯kÇd2Ífs§Ó±X,ÛÛÛ­VK§Ó¡2Š…:ÉÁòtZˆ&“ št×JàõÝÜÜ ‘¿ÿþ{­Vk³Ù¢Ñh¹\&¸ŸÝnG¹Ò(jw×Ó†N’^¯7d™"‘ÈãñÜÞÞÊåò|>Ïb±$É4ét±XŒª4«ÕF3™ ²”‹Ùlöx<ƒõÀsss:În·«ÕêAWåÞ™C&<oaaÁáp€YÙn·¹\®B¡°X,@D3ˆ\.w{{[,ët:Ф ¾Ðl«ÕšËåJ¥RµZz©B¡@‘-½ï€$e8 ƒÁ`4‡T*ýðáAÉd’Ëå …Bäi±´Z­6ai¶­—/_ªT*«ÕÇ>à™ L™Íf8º£:Ìçó÷»ßõz=£ÑˆœŒX,¯×;ê^Éd²ï¾ûnaaÁn·G£Ñl6‹œ|“Éd·Û Ú€XÒét§Ó‘ÉdS¦<4ÝnU6£ÑH{õàxâjDȈ§Ôj5‹Åb¼zõê^?g°±;*{€@çóù‰dÔ[èv»ñxœ¢(täkÃõz…Èìa&årõƉ¤Ùl¢#ƒÁÓÉdîììüùÏ. ¿ÿýïÿð‡?`Vw=mp”J¥B¡Ðëõ”JåÐv*ݺaœǦy@Hé8;•Œr R©$&“‰V…{g>f viÀ.& E"ÑXó ‡v@>I’”H$$IÞÞÞÒ½2_ –*ºcË~¿_¯×«Õj³ÙÄJ/¶Úl6s¹\£Ñ`08‚˜Lf­VC°}ïÒ& ÐÀé èȤôЪ£ÑèÏ?ÿì÷û].ןþô'‡ÃötG¨ëV Ý9ð:’$Åbñ„µZ­V,!d”©Nƒ3]]]ËšúÖÐ+Ìä Ò¯_¿ž>1;¶¢uÂ,Gñ®ŸlÄá÷û?~üH„Ïç[]]Ì×3ŒL&ó—¿üåoû[¿ßÿãÿøÃ? n¥CO»÷u²ˆuzG)h’ɽ3Ä»îýù»^:a2“_=vuZÚôèÀØðO?ý„Žø¬S¾î3•gz¹ëÉS0£O©hšŸ¡:W …‡›² '''±X¬T*™Íf÷ƒO¸÷“às”ì3eòPÒå“Ìí“y„Ÿ)ø7|šßæ¯Lþ™ßÜåf|>_*•*Šóóóýý}xt l6¥Â¨õg³Ùf³Y§Óý×u¥œÙxÂñ›3`‚ L&“Ûí:R*•QLQT¹\Fw²õõu·Û=¹'ËlÌÆÌ€ÿC©T®¯¯SÅãñÐa@¿ßG-¡Óéôz½›››³»ófcfÀ¿¹Á`0Ð\jaa!‹£‡¾‡*• íZNçìÖ¼Ù;Ìfs»Ýž²éôû˜* ýŸÍføJ«PSކé_¨žk6þŒh4JQA³øß1PF÷PÈd6f'ðÿUù/ØŸf;3…¹kÌbÈÙ˜™ÏÆlÌÆÌ€gc6fãAãV3•’¥pnÒIEND®B`‚impressive-0.10.3+svn61/site/style.css000066400000000000000000000060321214566325400175610ustar00rootroot00000000000000* { font-family:"Myriad Web Pro","Segoe UI","Bitstream Vera Sans",Verdana,sans-serif; font-size:14px; } body { margin:0; padding:0; background:#f8f8f8; } code, code em, pre { font-family:"Bitstream Vera Sans Mono","Lucida Console",Courier,monospace; } #content { margin:8px; } h1 { font-weight:bold; font-style:normal; font-size:20px; margin:26px 0 0 0; border-bottom:solid 2px #D0D0D0; } h2 { font-weight:bold; font-style:normal; font-size:16px; margin:16px 0 0 0; border-bottom:solid 1px #B0B0B0; } h3 { font-weight:bold; font-style:normal; font-size:14px; margin:8px 0 0 0; border-bottom:solid 1px #D0D0D0; } p { margin:8px 0 0 0; text-indent:8px; } p, ul.text li { text-align:justify; } ol,ul,dl { margin-top:0; margin-bottom:8px; } dl dt { margin-top:8px; } a { text-decoration:none; color:#0000E0; border-bottom:dotted 1px #C0C0FF; } a:visited { color:#0000B0; } a:hover { color:#000080; background-color:#F0F0FF; } div.feature { clear:both; min-height:240px; margin-bottom:8px; } div.feature img { width:320px; height:240px; border:none; float:left; margin-right:8px; border:1px solid #b0b0b0; } .date { font-size:17px; color:#808080; padding-right:12px; } .note { text-indent:0; padding:4px; border:1px dotted red; background-color:#FFFFE8; } p.q { text-indent:0; margin-top:20px; font-weight:bold; } p.nospace { margin-top:0; } p.a { text-indent:0; } p.q:before { content:"Q: "; } p.a:before { content:"A: "; } /***** Page head and menu stuff *****/ #headl { width:100%; height:80px; background:white url(logo.png) top left no-repeat; text-align:right; } #headr { height:80px; text-align:right; } #quote { font-family:Georgia,"Bitstream Vera Serif",serif; font-style:italic; font-size:20px; color:#808080; padding-top:18px; padding-right:10px; cursor:default; white-space:nowrap; letter-spacing:0.01em; word-spacing:0.2em; } #menu { width:100%; height:32px; margin:0 0 0 0; padding:0 0 0 0; border-collapse:collapse; border-spacing:0; } #menu tr { margin:0 0 0 0; padding:0 0 0 0; } #menu td { margin:0 0 0 0; padding:0 0 0 0; width:20%; } .menuitem, #currentitem { display:block; float:left; width:100%; height:32px; } .menuitem { background:url(menu_n.png); } .menuitem:hover { background:url(menu_a_c.png); } #currentitem { background:url(menu_c_c.png); } .l, .r, .c { width:100%; height:32px; } .c { text-align:center; padding-top:8px; } .menuitem:hover .l { background:url(menu_a_l.png) left no-repeat; } .menuitem:hover .r { background:url(menu_a_r.png) right no-repeat; } #currentitem .l { background:url(menu_c_l.png) left no-repeat; } #currentitem .r { background:url(menu_c_r.png) right no-repeat; } #currentitem { cursor:default; font-weight:bold; } #menu a { border-bottom:none; } #menu a:link, #menu a:active, #menu a:visited, #menu a:hover { text-decoration:none; cursor:hand; color:black; font-weight:bold; } /***** Print style *****/ @media print { body { background:white; } #headl, #menu, .note { display:none; } } impressive-0.10.3+svn61/site/trans.png000066400000000000000000000370011214566325400175440ustar00rootroot00000000000000‰PNG  IHDR@ðþO*<sRGB®Îé IDATxÚíw|eþǿӷfwÓCz%$!"AŠ `‰ž Q¼;<8Û)?=Ð;ì=¥ˆíäDŠ€ ¨X)¡ é¤BzÛ$»›-³;í÷Ç,Ë’F@J Ïû•W^3³Ï33;û|æû}¾OÃàjG­V'''>|РAJ¥R¥R©ÕjU EQA€$Ižì}ÙîÄÉ~/ç½{~yW®üîÇ}ëáf1ìŒO:%ëšëÌÔXsu“¦×ëžå~ÎåºÝ'ðޓa}øÖÝ'#¯VÝ1hРôôôääd½^ß­hU*•R©d†$I øҸ ¬R©œ™™)ëV­V«ÕjÙüz›\š¦qG…à¦jiq:¢÷ÁQ£ü•G¶ÕÔØÐ#èÆ0,$$$###99Ù×××£Û^Ln/~)â¼¼,<\=x°®¸Ø¬ÓÑ!!Êœœ–áÃým6ÎdrÅÇûœÈOîWð¼TQÑ£U* §SP«IÙ–¶µ9CCÕ'êõ´Ë%ÖÕÙ †$±€Ãà ƒ³¬ÐÖæÔëi›·Zy†E9Hƒ~ß+AÀ†ùúú&''§§§‡††ª»ÃB®r¿…¦ñ¸8­VK·µ¹ÂÂÔ.—ÈqÏK>´Ù쀠 %ŽcvT.ƒ€q4hÐСCSRR ¤9n½«¸ˆA`$‰“$&Wq}|(‹…£(œ$1ƒ–$Én( ÃqL¡ Ô>t ¬ÓéäÙ•ÃÃÃ娲F£ñÔu=Qå®3` :¡V©H—Kt:‡CˆŒÔ$^_o÷óSPQVf1AAÊSU\ÄE°B¡2dHfff||¼,ÚNuÝN­¸ÈU°°¬¨0›9–p“;l¸\‚ÃÁ›Í.š–346:P¹¸–«¸iiiC‡õõõõö“=V×{l-ìv¾¨È$@EÉÏ©ª²R.ŠR]MÇ1ž—Pi¹X&"$$$555---$$Ä[´ª¸¨£2¢[,äæyÞIžàTU°.‚€åVÜ”””ôôôððp­V++Vþïq•½— A/Q¢_8+++---&&F§ÓuÕ­F£ñ̇D‹èIr²lÇ{rjÃýþ?5Ûv:«gNã*IRç“`X§3Kà•¬SùôžÐCžÛõŒ]ÏBn}ùj§.-u÷­û”Ý{¢Þ3‘tæ6tÙíUÀ3fÌð(Ö³á )£Þˆ¾ÃqíFã¾3KžtJ’×qYœ’w2oó€a’÷J‰g&ëtP>â}ro÷PN&uѪ䕬멤îæ#îz*©çSõräôÁ®7ÐsÆnŸ•d||¼·½EºExÛQ”PYè×.t\\œÜÛ±ÛÕq§ShiaËË-¹¹m'ΘççÇ ÇÒOŠì-ÂåF¶¬Ì’—×VVfijrœŠKz==kVø¯ÒË©úr¤/âœî¶ÓA$àÓÎŒÅâ:yÒZ^n)*2••u45Ù].4ŒîÜuÞ’ðl_XMö]}¹ŸsRì%¸Ä€0ÏK--lq±éøqsI‰¹ºÚÖÑÁɵY¯Ù†}…¢¨   óSTßõÙ‹Îû~æKœ÷\BïÊжZùÊÊŽ‚‚öâbse¥Åhd‘™½P`&—­sUàWo_’]®¼}´Òç—÷*°$Ç õõŽãÇMÅÅæÂÂöêj›×4nýÎÆR®®¬ì@¯D_¸ ìr‰&“«²ÒRP`*)1WTt´¶²WŠKl0ÐþsÌË/碢‰(EÉlæjjlåå–ÂBSi©{Šã+×k@ ®rÛí|]½¬Ì"w¨¨­µÛlüUЛÂlv}ñEE×ã C ìSVf±ÛyTjWž€EQjhp””˜KKÍEEæÊÊ›ãyñ*³WN§xò¤Õ³KÓ¸^O77³Ó¦EÝygä¶m5}TŠJ-â 0ÏK‹«¼¼£°°ýøqsi©¹µÕy¦½J´‹aàëËà8ÖÒâ i<6Vë秨¨°44ØSS ~7VÝxch}½}„ N¢¡ˆˆþ(`Ž­VîäI[a¡©¬Ì\Zjnhpô·J%qAùû3QQšüüv§SŒ÷ù׿Òx^|òɃ…OU]mE©¡Án00µµö¤$}AAûÒ¥ÅÏ?Ÿ¬DFô ‹¢d2¹jjl²W\^nihpœªãõSëºpaú¼yGÎ) A`‚ (RSõû÷·Øí¼FC.Xšà³fMå—_ž˜:5 Ôj2-Í·¨ÈõõöAƒ”¤ÌÍmKO÷ݱ£ÁfãsrZBCUÇ›QÁE\›L®ÚZ›Ü]Q^\Ë{Þ¶þ}6S« ›—$0èÀ@å!ºo¿­}ê©äÔTÃæÍÕ+W–Œàï¯ÈÍmÏÊ Ü´©: @±`Á‘´4ß„,à¶6gR’""Ô»w7¤Ú±£Ìf.0PJ-âÒ Ønçåá²¥¥æãÇ͵µ6‡C©ŸØXšÆ ÂbáÎû ùú2rý<.Î'&Fóç?Ç,YRtôhÛ“O¦´·;ÛÚ\C†èÃÃÕ¿þÚ0vlÐ矗jX¹²äСÖ%KFh4¤ÕÊÕÔØEÚÛò9[ZX­–ÂqŒaˆ¶6§Á@gg‡+££5»w7¡R‹¸X‰eùª*kQ‘¹¬Ìrü¸©ªÊæt ý¶EF†_D„zýú“ç” Ç1…‚¸ï¾èC‡ŒêLx㼜œ–¹s“T*R¥"§N:v¬¦q­–Ú°¡jòäÏ?/ß±£~Ñ¢áaaj¦²Òêt ~X‚a˜ZMÒ4^Wg««³*0  I’¸$ÕÊÓ4qç‘r¥YÄ…°<][m­­¸Ø\R" °ö“ydp£(¼÷µ‚DQòŠ“ur†Ý.qWÙüíoñ CÜrKXZš/†AG7zt`NNKp°òûïëvîlX° U­&1 Ûµ«©ªÊªÚºµV¥üüv­–E)&FÓÔäÈËkW* ƒù¿ÿKúî»Ú‚¸»Š*©Rž{ÛºµæÄ kU•µ®Î†J-âüÌób{»«¶ÖVVf)*2•—[êëV+×#Oááêqã‚þûߊ^Òäæ¶ååµ{œa…‚°Ùx0è9söìi2DßµéÕÏOÀ¼óNÑ£&®YSQ\l¾ï¾ (ü‡êjkmMM¬¯/#IRi©D0 Öét4Mãee–'žHºæš–µkOÔ×Ûú©þž{¢F xñÅcõõvù\B‚ÎlvÉÏ|íÚíí. ­€8OWVv|öYyQ‘Ùhdm6¾ÿ7ÃÆ0ÄÙÞGŽIâ}ÛmcƽøâÑ'¬Ó¦EïCX·}'~ýµñûïën¹%,'§ÅéeYÙl|m­M’ ±Ñ¡ÕR’--,†Á AªeËF)Ib¿ÿnüñÇú”øqAŠyóެ_²¼Ürûí7ÜúÉ'eòù‰‰:¹S‡ÙÌ©ÕT{»kܸ úzûï¿·¢‚‹p»™}L×Þî|ê©CÛ·×UUYeuå¢TO<‘ôàƒñ…§¤èo¸aP` bÖ¬øqã‚}|¨ñムbØ0¿yó8ÐBÝ[¼òr ˜L®º:»ÇÇ6›]rDÝjåäwlj8Žf³ñíß|S]Scoia_~ùØë¯ç‡„¨pà€ñwŠtºÓ!îêjkLŒ¶¦ÆõõöädIb£F F`ÄùXàŸnðxw—Ònjrt¯‹ãXb¢»¹¥'0 hšÀqLN¤hhp¨Õäôé1}Tzë­á7Ý*ŠPXØ.I VS©©¾¯½–ëçÇŒèëË47³í wíµÝ^Ân<õUÏA϶(J§&XQ”ª«mo½Uàr I’¤4Ùœœ–)SÅÄh“’t\n±œ¡Ì–6%E/äòrËÄÅÆjCCUTjçl2^ú››;7É×—ét¦ñÛoèü"±ÈHµZí~ýéOáÿýïØ1c@«¥x hšˆ‰Ñb\}È?ÿyxÍš ¹­õ” ùãÇÍ¥¥ ƒ•ÅÅfÙ>§µéIÒý< ÒårÏ$ #IL’¤©S#££53gÆéõ´œÞnç“’ôj59zt ·†[ZX ÃZZX¹¢NXvvØo¿5 œÁ mmmF£­çra,—¤~‚lÜ”J24T=~|0Ìœ¿zõ˜gŸJ’¸VKÍš_Ue»å–ð®y5Êfã ÛwîlôvËÊ,‚ ‚þþŒÜ2̲Â9 ­–’ï- €ñn[Æ0ˆŒÔ6rd€ÕÊ‹"Œ˜™éªª¨èÐj©×^Ë|è¡ÄŒrÄ jkíe¹Z,Ü{ï¯]{bݺ“§hfgg1Âét"•^Z.Ù—‘k® P©È]»³²ÓÓ}ÿô§ð¡C …×ÖÚŠŠLÙÙa_}ubÊ”AááªèhÍáío¼‘÷ä“É]Ϭ¬¬´Êq¦ÿý¯2%Å 7™N†!N­ynhµTh¨Úhdýýíí.ï·ÃŒ±ÅÅ&•Šhnf‹‹M³g'`üüsƒÍÆïÛ×ÜzåŽß°Z­UUUjµ:22²ô9sæØl6y=DŽã*++%IŠ¥iº¼¶¶ÖßßРA®XWW§V«õzý²À—±ñ"++àÞ{£_}5sÁ‚Ô˜mt´†ã¤úz»¯/£P[·ÖŒéÿý÷u}Túãõ~ÑÑÚ={š8NóÌá—_ÎeYÁå««m§|ï+L®,˾ùæ›ãÆûÛßþ¶dÉ’#F¬[·rrrn¸á†ìììÉ“'?ñÄÇéj¼$IóçÏ9rdii)ìß¿?33sñâÅr®]»v‰¢ØØØ8mÚ´I“&Mš4éÖ[o­¬¬ÜµkWzzú|/¿ürjjêöíÛ%Iºçž{&Nœh6›¿þúëk¯½vÒ¤I×^{íË/¿Ìó<üóŸÿLNN^´hÑØ±cûí·åBÓôe[Ù90P‘öì³GrrZ22|×®=QTÔ~øp+Iâ6œllt„…©n•$(.6ûúÒ:]^Þµµ¶n«©ž qOo¥¶6§Ÿ~~Šž¢Ð=U4Fœ93nçÎFQtGªàäIëÛo¬\Yºm[|þýëè¿ÿ}¬µÕ ‡P\l–›|¯hòóó?üðCÇ›šš–/_ÞÔÔd·ÛÇÓO?Ͳì /¼pã7nÞ¼yõêÕ^¯>”¬U£‘¥i‚¢p9ätŠÌ#†Ó)È <>>Ôôé1Ý^®¾Þ1l˜Ã×\ã/‡²{BŽsœXZj›ÿýâõëOÊc< È’{÷6oÚTå S ‚tõõ‹A§Ómܸñ믿ÎÈÈæååUWWßqÇ·Þzë¼yóÔjõ÷ß/›D™1cÆøûûïܹS„]»vEDD¤§§{>íèèØ¹sçСCgΜùÀdee9rD„!C†äçç·´´”——'$$äææ:Žë®»nÏž=&“iöìÙ7ß|ó¼yó‚ضm›ÇY¸páºuëFމ|騨èž?c)A8N‚ÀXVðøœ¢(Q.KÔû$ AÓ„Ñè U@P²§‘=­­¬VK½øbú¸qÁ:ZÊóEîÜÙÐÖæ€wß-’-ªG«¿ýÖ´zu™|?„„___Š¢F-illEqÅŠYYYV«U>âÉâëë;f̘cÇŽ–––NžµÙl&“é÷ßOOO:tè®]»l6›Ùlž0a‚ÑhܱcŽãS§N-++Û»w/I’£G®««“$éÙgŸ2dHvv6ÇqõõõÞw8ƒX—;ÒÓh!IV²RI˜L ×3N§€ãXX˜Úhd££5r"ƒ€äd=Mã--lR’>>Þçæ›Ã<µÍ3Î(I‡°ysõ¬Yñ+W–ÜpC¨÷§ÿùO!ìßß"ï^~oŸ^ó8NQAgMi2™AÀq¼¥Åýˆ”J%†a?üðwÞ)' iZMy¼èììì-[¶¬X±ÂåreggŸYw£)Š>|ø«¯¾Šã¸Õju¹\±±±<Ïã8þÙgŸ…„„Lœ8qñâÅ[·n ‹‹S«Õ°hÑ¢¬¬,QM&“N§»Z» ^¸÷hNG¥€ØXm[›Óhd33ýHÏÌôA‡ ÑÝv[Dvv8Ë ,+äç·-]zÍĉ!¶°¬`2¹änR`2¹V¯.#ì—_~xÿþý-rÄË[ÞЮRÉ0L_\VVöî»ï®Y³fóæÍò‘´´4­VûóÏ?———ÿúë¯sæÌÙ°aC'9eeenÙ²%"""--íÌ £.55µ  àÀ………O<ñÄ‹/¾(IRJJŠ¿¿AAAZZZLLŒŸŸ_QQѵ×^Ë0̨Q£†Ù¼yóÉ“'¿úê«3fìÞ½ûjýi®†iekkí'?n?>øõ×óh_¼xDd¤Z«¥äzi]ýñLJ¬YS!W;W¯.EØ¿¿YÁ'¿ rrZäÚlK ¦¾ãŽˆeËŠ'N 9§þgWëp?¥H’<« ôõõ]ºt©B¡HNN>räýûßÿþ÷¿ÿýÐCa6lذ¹sçv:•Á`¸îºë6lØpÓM71 s*ÜèæÅ_œ5kÖüùó $$ä­·ÞÒh4†3fÓ¦MÇ×h4‰‰‰ÍÍÍ&L€ÌÌÌüãK—.Ý»w/A·ÜrËý÷ßAôå[ _t|}ïZûö5?òÈàQ£Nœ°ÖÕÙA:xÐ8t¨áµ×òl6N’àå—su¿ýÖ(Çœ¯½–×Ëùm6nܸ à`å!º·ß.èû½ð±«Ñ–üü0Š¢ú"àwß}W„ÈÈÈõë×9rDVã=÷Ü3a„ãÇëõú”””n-ùâÅ‹åÖ#{÷î•ìÔÔÔÝ»w;v 222T*•œ`Ù²eË–-“·×®]ëí“Ï›7oúôé¡¡¡ƒ–ï|ÅŠ+V¬@ø²‡:¥¸8íÔ©‘­­,ÏKr é?ÿ)9Òÿÿ«”cNo¾Y Pà‹{hA]½®ÎÞ÷^&“ëûïën½5üðaãÁƒçЇôª¬k4œZÍÐ4}V¬\¹rÚ´iƒáË/¿ôõõõ„²ÏûT*•|ª¾ÛÏÈÈȾwA¾ˆU_«•—ƒº%%æÊÊŽß{ïxU•µ²²CÜÁÌŸnøùçOF§Sp:ù?rÝÏ>«øæ›j³™ëi¸ÿÀ!,ŒU©ô ÜU qqq÷ßaa¡$I7ß|óý÷ß ˆ+àE‹òFgss£:ò,ùõÓOr«ÀE¬prœØÜÌÌ2aŽK&ḨÑp‰‰œZ­öTM{Áßßÿ¥—^:';‰¸š<`%t $*ëÇ% B$I¦ŠâiZ (axŠiZ0H??¿> Œøãâ ÃÀ#Q‚ B (÷Mó ÃÓ´@’M 4-’$„D@Žãò2¿8Žã8©R©t:V«õn¹E #þ¨Dq0Ì£O‘$ÙŠÒ4O’"Ãð #P”H’"E‰8Žá¸,NÃp§¼ëùJÀ¸GÀ8Ž£'Œè»‹+ëÓ-Q>eJÓ¢ìå’¤HÓE‰²ý”%ꑎ“ÞjôVi§]o {W*•:N¥R¡j-0â´ •k¡r¸È£Ooÿ–¢D†dG—$%Ë ¨¯IDATŠ’ÃqÀqŒ <ò£zRc'¡žõxOÛ*•J¯×S…~5$à%°Ó.î)qòrÍ“¦Ýú¤(‰¢€$% “Å鑉ãtO6ó¬‚ìźö.ÚNV«ÕÈü"_UõOã·8.„$‡ˆ<ñÛN!"Š’HH²“7Ká8#!¢[qvR]·"ìËF·ö¹kš®»$I¢Ú/ð¦OOýÓcJE^$Yzw"éÌ:'¯PÈ1[a†qû´^²t·yÊ1ÛNxüÛ¾›Óóh›éɄʺò6˜ÝZKd6WÀ±±Ú}ûšÏ¯Â)7¥xW8=!†hZd‘¦åCEy‹³S%³«Ù<« =kô¨—ŠhWW֣̮f³'"A".›€o½5âÛokåiP=¼j›nŸVnA9e3ÝqÚS-F’IÊ]ˆSz¡½éuïK”¨Ûí³6œöâÓvûAjD\ñŽŠÒ¼óÎÈßonn®kh¨E;MK4-jäÄO…jÝjÄqÒ£L¼Ïœ“P»m€‘_*–ÞÖù±ˆÄJLÔÅÅ©‹‹ÙÒÒV§SágWËéíßvd×ÝžÜÕvÁö%ꃉ@ "00ã8§ÓyÖŠèY-j_š.‘ˆ &` Ãüýý)Šr¹\½ ²÷v‘¾ˆ‰¸À–°Á`ÕuÖ¸+$Ñ¿ hÆ#¢ß€š HÀ @ #HÀ @ #$` @ #$` @ #$`,c³Ù\.ˆ¢h±XzJÆqœ Ý~ät:½wY–µÛív»]ùÌày^EQZaBãL‘€/''ç­·Þêš~ÕªUG=tè*^ˆ‹ÍÕ¿6’Ë媬¬”ÜÞÞÞ­‰þì³ÏÆïëëÛ“ ÷ÞU«ÕÏ?ÿ<ÄÅÅš={öÒ¥Kn»í¶ÜÜÜ_~ùÅã¥777üñÇ3fÌ`Y¶¢¢"***&&•9ªŸ …‚eY“ɤÑhjjjŸþù}ûö555?þ†nÈÎÎV«Õ<Ïçää<ôÐCß}÷]/g3›Í[¶l‘…Z]]““STT´fͳÙüÞ{ïåææÈ)—-[vôèÑU«VÕÕÕ½ûî»\q ¸O>\.—B¡8pà€w”çù®óÎã8ÞØØÈq\GG‡ =uÌðóó›5kÖ-·ÜØØØ(Š¢Õjš¦Çÿå—_Ο?_^ƒ•6ð9£Óé†IHH efĈK—.ýþûï:$I‚ öîÝÛµ‰Ã0AæÏŸtðàÁ²²²nϱqãÆÕ«W«Tª’’’âââ’’Yÿf³yõêÕ¨œ!Pø<™={6I’o¿ý¶B¡˜;w®J¥Z»v­Z­6E©T*Ç.\¨Óéüüün¾ùf ò²²ä¼=ôÐçŸ~ß}÷•——{:ZêõzÏÉiš7nÜ´iÓâããCCC#""yä‘¡C‡ÊŸOŸ>ýºë®Cå q‘Àd×ñ\7ê”ædÿ#é{YoédïšÆûˆ AÈG¬V«F£©¯¯W*•ƒÁb±TTT¨T*¹ÁY­VõÕWwÞy§Ùl!..î‚?¥ þMÏ/¯¼»ÿþ &@—NÑ=ívÝ8¼}Ov¹òö¾ÛûÓ8k^$à+ïÒýVÀ;vìÈËË{öÙg=aü^Š Ë² ,# …â¶Ûn»þúëyžÿÇ?þ!‡‚‚‚|ðA¹ëËV®\é ãOš4iúôéžëÊðÉÉÉ&“iòäÉï¼óÎ3Ï<#·\õÍHˆKÇqèã2”‚ äçç¿ýöÛ Ã477¿ôÒKÑÑÑaaaùùùË—/'I2??öìÙk×® hhhP«Õ?ü°\|½ê­Vë_|±lÙ2I’üüü8ŽËÉÉé:dÕˆ³àirEqÏž=ÇŽ‹2e MÓ_ýulllAAÁôéÓ ‚p>’LHHP©TIII[·n­¬¬ £(*11‘¦é¤¤¤“'OnݺuÖ¬Y²h‡ Ò5˜ÿÃ?455åää :TŽÿ{^?ÿüsAAÁ!C&OžLQÔ‰'¾ûî;I’²³³¯š>­¨kâ‚Q]]-Y»ví×_Ÿ““³xñbI’6mÚ´jÕª¸¸8oº\®œœœ½{÷®_¿þÀÞ1™ÌÌÌââbyûСCo¼ñÆë¯¿þŸÿüÇd2yÒ$%% †´´´¼¼¼}ûöyޝX±âÛo¿žç·oß.;´÷ßÿ5×\ã-`‡Ã±qãÆuëÖ8pàÍ7ßŒŠŠêtB‚ <Íï:.&&&&&&::Ú»ŽªV«#"":ç5kÖÀîÝ»9ŽÛ¾}»Óét¹\<Ï;výúõJ¥¹ÐÄÈ]Se/:++ËÏÏO’¤ñãÇË>³N§ë”^§Ó½õÖ[r÷µnOXXXè1Ë Ó¦Më{Q'L˜À0Œ$IúÓŸ´Zí† vîÜùþûïWVV®Y³¦÷ïÈ#õõõV«• ˆáÇÆÌÌL«ÕºgÏžsê…&‚ÑhlnnÞ³gϦM›n½õÖó»™±cÇ6551¢©©iÿþý‡ãé§Ÿ7nÜ‚ xž7È#g‘žžŽãøÃ?¼dÉ’¹s熄„<ýôÓ†EFFvê Žãxlll§8Žûúú>öØc ×ëß~ûmyNÒíE ‚ˆ‰‰!Â`0ˆ¢HDll,A ,xýõ×~øáèèègžyF£ÑÜtÓMO>ù$I’÷ÝwŸ<àä*µ_y—î'ßuä€~ÐŒ\hÕ0@F €0@F HÀ0@F HÀ0@F HÀ @F HÀ @ #HÀ @ #HÀÄ•Ífã8N’¤'žx‚ã8$`âJbáÂ…‡€›nº©ÓÄñWheÄC’$»Ýþå—_Μ9³¥¥eݺu³gÏ–à~ðÁ;¶k×.µZ}çwzr±,»mÛ¶ÊÊÊÔÔÔ)S¦ˆ¢¸|ùòaÆíÛ·/%%åÆoÄq¼¥¥eóæÍf³ù†nHMMmmmݾ}»¯¯¯N§KJJÚ²eKCCCttôwÜQ^^~ðàA‹Å’˜˜xèСI“&ýðÃ~~~‡–$éÞ{ï °ÛíëׯommÍÈÈhhh¸ï¾ûÎiñdW'UUUN§ó›o¾ijjÚ·o߇~XYY™———››[QQ±pᤤ$§ÓùÜsÏyÖ”$éÕW_=pà@ffæºuëV¯^Íó¼¼daJJʪU«6lØ`·ÛŸxâ yÅà… æææ¶··/Z´¨¾¾>::zÞ¼yÍÍÍ£FÚ±cǧŸ~9aµZ½mÛ6QwîÜùÖ[o%%%ÕÕÕ½òÊ+’$ÍŸ?¿¤¤$>>~Ñ¢Eû÷ïGhllø`ÿþýK–,±Ûí~ø¡¼Ö™lŠiš•J%Ÿ(Š’?Õh4N§S„ðððììlÇN§¼Œ°J¥"IÒår-X°`РAòBÄ]ñññ Ã0 ã8Ž ’$@­V_¹Î3r¡F“žžžššzôèQµZœœ\]]ͲlpppYYÙûï¿?a„Ç{¬¶¶–eY9‹B¡ÿú믛šš>ÿüóŒŒ ’$Ífó† >ùä“áÇ'&&²,+›èõë×wttx®h·Û+**fÏž••UUUe·ÛA‹ÅâñÒ;À0ÌöíÛëêê6nÜØËªqÈ#C† €ñãÇ'''Ó4=vìØ€€yÉO¹¾ªT*çÍ›'›DÀqü•W^Y²dÉ·ß~ÿôÓO€Á`°ÙlO=õTBBÂ#<¢Ñh^xá…åË—³,{ã76¬¡¡A^ø[§ÓÍš5ë¹çž ˜2eʆ 'NœøÅ_Œ92)) ðððp½^/혘š¦/^üæ›onÙ²%>>Þl6_ÑÏ-/zå]ºŸ|Ó‹´¼¨Ãá˜>}ú'Ÿ|âëë ayQI’}ôÑÇ{,!!á¹çžKHH˜={vóBÿ[^Y`Dÿs É‹X,1 »ë®»fÏžÝÑÑ1räÈ»ï¾Y`d‘¾ |‹¢è S_¤¾%I’$I¾Ê½À7²Àˆ~Ç%è>%G¤¯†g…Š |ep¥· È#HÀ yé0<¸Ä-È#€0Œ@ €"¨>Œ@F HÀ0@(\ƒ×HÀ YZ ‰Œ@ €ÄU#`Ôs ¸R,Šðá‡è×A ®X ÜÜìÞèaÍ* ¸»Ð²n««aÝ:(,£ý^Ä"àŠ ˜:~û jjÀh„¼<¨«ë&™Í=,C‡@ _>,xþyزjká³Ï`Û6ؽŽA8#ÙŽàpÀ‘#pô(ú5HÀý†¡C!#( FŽ„Y³`ÌÐjá½÷`Æ Ø±D,Š¥êëáë¯Ñ¯‰@î7PÈ™0  ÈÈ€¦&¸ë.øôS`YX½Àn ³æÎE¿& ¸7ß ))àpÀí·ƒÓ N'Øí`0Àöí`³Ãˆþ»:a·ýˆH‚ƒÁl†˜hh€¨((-…ÄDxÿ} …/¿˜3‚ƒAGÍÈ_êÛÂáþûA©„ßI§Z[Áj–uË»¡"#¡¬  rgÔj¡­ æÍƒÇƒŽøúk(*Baj²À—œèh€üp’’ * Ö­‹¾ú ~ùþügE¨¯‡¨($P(ܹ&N„övÐj¡ š›aõjho‡çŸ‡øxàyˆŒ•ªÇ+J áCd/è †‡ÇƒQ£`ÁˆŠ‚¢"ˆš†M›@ÀÇTªÓ“}ìÈH0€ã@­†M›àÇ¡²žy†M›`óæî¯ÕÚŠBÙd/Z•Ø×Þ|0 T*p:ÃÀdê&±,é¤$ D¦L¸8Xº¢£¢`ǘ1tºÓâ÷l#HÀ‚ ‡›nžQ„ŒŒÞdJ%p$%A]Œ·ÝÛ¶AM ´´ÀÇÃ_þ+W´i×^‹Š¹Ð'ž8#ªL@’’0{6€ÁpFúÊJ°ÙǦÁj…wÞ¿üš› àw€eaóf¨®†7ߣ¶n…_uׇd/0ÁÁ=J+)ét…4Àq¨©ÿýÊËaÜ8• ^x”JE°ÙàÝwáñÇáãá_ÿ‚­[Áj“ àºëà‹/`êThj‚ÐP ITNÈ_*BCÁÏî½BB`ôhغî¼ÓíK‡„€Ý·ÝññpÇ ðÁpÍ5ðòËp×] VPäçCNL Ë–¡B‚@¾ô® 8Z-¬] ÷ÜÑÑaa°w/¼ò 9_}óçCk+$%ÁèѰ`{˜„JF#øøÀÞ½°z5TVºG5šLðÆPT„Ê  øR~Cp†Áƒ à™gÀd‚;î–…åËÁh„Í›aêTˆ‰qO! ‡Ah(´´ÀO?AX?ðóÏP\ ¯¿°w/lÜØy\|!Q*á®»:LM…÷Þƒ€˜>rsaôh€E‹ ¶Ö 6vî„ðp€~€?t »© ž{’“Áfƒ7ß„O>œÈÉÚZp¹€ãz»A@½ÁÇÓ¼ºmoBBŸêU IàrÁ?A€¿?@XääÀãCd$¼ò Ô×»#Û#FÀÊ•ðôÓ`4ÂðáðÀðÉ'’*44€Ãv;$&BTT7×Ú´ Ôj¸ñFTÞÈ_8ä&e…/†wÞ__HN­Ö=B£ª*ÈÏwÏ´4 ƒ_»âã!<8Îý‘ €Ë›6Á«¯Be%¼õ–{¬²‡¼<·IG €/Š­&IP«aôh iX´h¦LþV¬½Nœ€_~™3!, êê€ Ôê3Ú´œNX¸>þ~ÿÖ¬— V®„‚­¶7_@¾fyØ0€¨(˜?žpÖ® ƒmÛ€a@ ©É­XoBC!8>ý!'¶mƒW_…êjؼ ÀéD5aª_BÆII‚»ï??øË_€eáÁáûš›!9DÑÁ¢(÷†)S 'Þ{~ýšš`È0›áÑG!"žl6P«ÑÈ'ð¥²Éqq_| èõ÷ܳfR uuÐØ‘‘§( píµðÍ7ðÌ3!!˜J%$ÔÕAq1üü3ˆ"<ô´µŸŸ»É@¾¸èõ ×Ìž iižííð·¿J=æ–º,Åúz`ð÷‡ï¾ƒ#à¡þúWÐéàȨ«†’˜3¦N…?ý bcÀ]µF Pøâ¢PÀر ÕBx8ÌŸ3f¸ç À0à8¨¯‡U«@¯‡W_…]»`‹ "Â=»õœ9°s'<ú(üöX,ðÍ7p×]§£@ ¾DÞµ¬OIν{ï½0bŒ ‡A¸6E$Iº6 PS<⎇ýôdeÁÿ O> °?ÄÆ‚N4}úZ55 Š ûöÁèÑèÙ#¾ JNN ƒ1cà™gàñÇaØ0XºÞ~Û-`??hnž—Ë]éU©€$!:XàñÇÁfsŸm×.xæxé%–» ±** û*È#.Ä%á–[ÜÛsçBU•;¾ ÿûHèõ܆¬P€Ãß~ ¹¹î8¶Ìu×Á¯¿BG¬\ û÷ÃÊ•ÐÔ$ ‚€Â×$àKÂõ×»UzÝu µµðôÓðÁ°s§;l]•J;0 òòÎÈ+ŠPSåå0|8üð= ¥¥0nœÛ¤#@J’„¡WúEFîòúë—iingfÂÖ­°?Ü{/„‡ÃܹÐÞ~:‹F>>ÐÞ0w.,] ÙÙãnyêŸH’$Іa’Wµžv½{ àyäíº{æ Ï’Μü¬wÕI+gÍÛû®W ÃÎ'/yÇw<úè£cÆŒQx¦fE\aÒ$€¿þ( ®»î¸”JÀq÷|ן|âby~'–…O>£G!,  ˆ‡–Ðhúé,)±|þù€®öë®b=%èî î"{Ö4SJÖÝE{9Öà ϒÃzü.ÝÞU/»ÝYÕn’‘[¶lùî»ï222fΜyûí·!¥]%K= +VÀ¾}€ãçîhm±œ12‘ `âDp¹NŽ0™ $¤Ÿ~/ŽFçy¨«gyœUù}QàY¯{–û9—랟±>|ë Çðí·ny÷OêrrÀ`  Mz=¨ü駆¬¬Iž—¢£µz=ÝÐà RZ­<ÃE˜Í®À@…¿¿"(H¥ÓÑ éï¯8~Ü"Šp_|–žX’$•––Λ7oĈO?ýtaa¡€¦r»´"‡åË!>ââ ½ûïÝò¼èt V+ÏqÏ‹!!Ê›n ­¨èèèàjkíN§`6»œN¦q½žEP« •ŠdYáĉQ”òòÚÚÚœ‚€¦Õïs 9§Ô:nòäÉsæÌ=z4Ã0Þ:ïv»Ó»à‚§—z^@ádï·—æ8„ÎuàËõM;—$iåÊï~üÑÇS®FŒð?|ØØ¹ÍE¡/ Ý-N§³¨¨hýúõ;wîT(‘‘‘Þ2F\üO¿^&âÈ‘²Š ÆS¶êëíݸHÀ—QÀ§<%¾ªªjóæÍ›7ov¹\111jyQÄÀ¦“€»¯ _Pÿ?”a-pуaôIEND®B`‚impressive-0.10.3+svn61/src/000077500000000000000000000000001214566325400155315ustar00rootroot00000000000000impressive-0.10.3+svn61/src/cache.py000066400000000000000000000125071214566325400171530ustar00rootroot00000000000000##### PAGE CACHE MANAGEMENT #################################################### # helper class that allows PIL to write and read image files with an offset class IOWrapper: def __init__(self, f, offset=0): self.f = f self.offset = offset self.f.seek(offset) def read(self, count=None): if count is None: return self.f.read() else: return self.f.read(count) def write(self, data): self.f.write(data) def seek(self, pos, whence=0): assert(whence in (0, 1)) if whence: self.f.seek(pos, 1) else: self.f.seek(pos + self.offset) def tell(self): return self.f.tell() - self.offset # generate a "magic number" that is used to identify persistent cache files def UpdateCacheMagic(): global CacheMagic pool = [PageCount, ScreenWidth, ScreenHeight, b2s(Scaling), b2s(Supersample), b2s(Rotation)] flist = list(FileProps.keys()) flist.sort(lambda a,b: cmp(a.lower(), b.lower())) for f in flist: pool.append(f) pool.extend(list(GetFileProp(f, 'stat', []))) CacheMagic = md5obj("\0".join(map(str, pool))).hexdigest() # set the persistent cache file position to the current end of the file def UpdatePCachePos(): global CacheFilePos CacheFile.seek(0, 2) CacheFilePos = CacheFile.tell() # rewrite the header of the persistent cache def WritePCacheHeader(reset=False): pages = ["%08x" % PageCache.get(page, 0) for page in range(1, PageCount+1)] CacheFile.seek(0) CacheFile.write(CacheMagic + "".join(pages)) if reset: CacheFile.truncate() UpdatePCachePos() # return an image from the persistent cache or None if none is available def GetPCacheImage(page): if CacheMode != PersistentCache: return # not applicable if persistent cache isn't used Lcache.acquire() try: if page in PageCache: img = Image.open(IOWrapper(CacheFile, PageCache[page])) img.load() return img finally: Lcache.release() # returns an image from the non-persistent cache or None if none is available def GetCacheImage(page): if CacheMode in (NoCache, PersistentCache): return # not applicable in uncached or persistent-cache mode Lcache.acquire() try: if page in PageCache: if CacheMode == FileCache: CacheFile.seek(PageCache[page]) return CacheFile.read(TexSize) else: return PageCache[page] finally: Lcache.release() # adds an image to the persistent cache def AddToPCache(page, img): if CacheMode != PersistentCache: return # not applicable if persistent cache isn't used Lcache.acquire() try: if page in PageCache: return # page is already cached and we can't update it safely # -> stop here (the new image will be identical to the old # one anyway) img.save(IOWrapper(CacheFile, CacheFilePos), "ppm") PageCache[page] = CacheFilePos WritePCacheHeader() finally: Lcache.release() # adds an image to the non-persistent cache def AddToCache(page, data): global CacheFilePos if CacheMode in (NoCache, PersistentCache): return # not applicable in uncached or persistent-cache mode Lcache.acquire() try: if CacheMode == FileCache: if not(page in PageCache): PageCache[page] = CacheFilePos CacheFilePos += len(data) CacheFile.seek(PageCache[page]) CacheFile.write(data) else: PageCache[page] = data finally: Lcache.release() # invalidates the whole cache def InvalidateCache(): global PageCache, CacheFilePos Lcache.acquire() try: PageCache = {} if CacheMode == PersistentCache: UpdateCacheMagic() WritePCacheHeader(True) else: CacheFilePos = 0 finally: Lcache.release() # initialize the persistent cache def InitPCache(): global CacheFile, CacheMode # try to open the pre-existing cache file try: CacheFile = file(CacheFileName, "rb+") except IOError: CacheFile = None # check the cache magic UpdateCacheMagic() if CacheFile and (CacheFile.read(32) != CacheMagic): print >>sys.stderr, "Cache file mismatch, recreating cache." CacheFile.close() CacheFile = None if CacheFile: # if the magic was valid, import cache data print >>sys.stderr, "Using already existing persistent cache file." for page in range(1, PageCount+1): offset = int(CacheFile.read(8), 16) if offset: PageCache[page] = offset UpdatePCachePos() else: # if the magic was invalid or the file didn't exist, (re-)create it try: CacheFile = file(CacheFileName, "wb+") except IOError: print >>sys.stderr, "Error: cannot write the persistent cache file (`%s')" % CacheFileName print >>sys.stderr, "Falling back to temporary file cache." CacheMode = FileCache WritePCacheHeader() impressive-0.10.3+svn61/src/control.py000066400000000000000000000346521214566325400175750ustar00rootroot00000000000000##### CONTROL AND NAVIGATION ################################################### # update the applications' title bar def UpdateCaption(page=0, force=False): global CurrentCaption, CurrentOSDCaption, CurrentOSDPage, CurrentOSDStatus global CurrentOSDComment if (page == CurrentCaption) and not(force): return CurrentCaption = page caption = __title__ if DocumentTitle: caption += " - " + DocumentTitle if page < 1: CurrentOSDCaption = "" CurrentOSDPage = "" CurrentOSDStatus = "" CurrentOSDComment = "" pygame.display.set_caption(caption, __title__) return CurrentOSDPage = "%d/%d" % (page, PageCount) caption = "%s (%s)" % (caption, CurrentOSDPage) title = GetPageProp(page, 'title') or GetPageProp(page, '_title') if title: caption += ": %s" % title CurrentOSDCaption = title else: CurrentOSDCaption = "" status = [] if GetPageProp(page, 'skip', False): status.append("skipped: yes") if not GetPageProp(page, ('overview', '_overview'), True): status.append("on overview page: no") CurrentOSDStatus = ", ".join(status) CurrentOSDComment = GetPageProp(page, 'comment') pygame.display.set_caption(caption, __title__) # get next/previous page def GetNextPage(page, direction): try_page = page while True: try_page += direction if try_page == page: return 0 # tried all pages, but none found if Wrap: if try_page < 1: try_page = PageCount if try_page > PageCount: try_page = 1 else: if try_page < 1 or try_page > PageCount: return 0 # start or end of presentation if not GetPageProp(try_page, 'skip', False): return try_page # pre-load the following page into Pnext/Tnext def PreloadNextPage(page): global Pnext, Tnext if (page < 1) or (page > PageCount): Pnext = 0 return 0 if page == Pnext: return 1 RenderPage(page, Tnext) Pnext = page return 1 # perform box fading; the fade animation time is mapped through func() def BoxFade(func): t0 = pygame.time.get_ticks() while BoxFadeDuration > 0: if pygame.event.get([KEYDOWN,MOUSEBUTTONUP]): break t = (pygame.time.get_ticks() - t0) * 1.0 / BoxFadeDuration if t >= 1.0: break DrawCurrentPage(func(t)) DrawCurrentPage(func(1.0)) return 0 # reset the timer def ResetTimer(): global StartTime, PageEnterTime if TimeTracking and not(FirstPage): print "--- timer was reset here ---" StartTime = pygame.time.get_ticks() PageEnterTime = 0 # start video playback def PlayVideo(video): global MPlayerProcess, VideoPlaying if not video: return StopMPlayer() opts = ["-quiet", "-slave", \ "-monitorpixelaspect", "1:1", \ "-autosync", "100"] + \ MPlayerPlatformOptions if Fullscreen: opts += ["-fs"] else: try: opts += ["-wid", str(pygame.display.get_wm_info()['window'])] except KeyError: print >>sys.stderr, "Sorry, but Impressive only supports video on your operating system if fullscreen" print >>sys.stderr, "mode is used." VideoPlaying = False MPlayerProcess = None return opts += [FileNameEscape + video + FileNameEscape] try: MPlayerProcess = subprocess.Popen([MPlayerPath] + opts, stdin=subprocess.PIPE) if MPlayerColorKey: glClear(GL_COLOR_BUFFER_BIT) pygame.display.flip() VideoPlaying = True except OSError: MPlayerProcess = None # called each time a page is entered def PageEntered(update_time=True): global PageEnterTime, MPlayerProcess, IsZoomed, WantStatus if update_time: PageEnterTime = pygame.time.get_ticks() - StartTime IsZoomed = False # no, we don't have a pre-zoomed image right now WantStatus = False # don't show status unless it's changed interactively timeout = AutoAdvance shown = GetPageProp(Pcurrent, '_shown', 0) if not(shown) or Wrap: timeout = GetPageProp(Pcurrent, 'timeout', timeout) if not(shown) or GetPageProp(Pcurrent, 'always', False): video = GetPageProp(Pcurrent, 'video') sound = GetPageProp(Pcurrent, 'sound') PlayVideo(video) if sound and not(video): StopMPlayer() try: MPlayerProcess = subprocess.Popen( \ [MPlayerPath, "-quiet", "-really-quiet", "-novideo", \ FileNameEscape + sound + FileNameEscape], \ stdin=subprocess.PIPE) except OSError: MPlayerProcess = None SafeCall(GetPageProp(Pcurrent, 'OnEnterOnce')) SafeCall(GetPageProp(Pcurrent, 'OnEnter')) if timeout: pygame.time.set_timer(USEREVENT_PAGE_TIMEOUT, timeout) SetPageProp(Pcurrent, '_shown', shown + 1) # called each time a page is left def PageLeft(overview=False): global FirstPage, LastPage, WantStatus WantStatus = False if not overview: if GetTristatePageProp(Pcurrent, 'reset'): ResetTimer() FirstPage = False LastPage = Pcurrent if GetPageProp(Pcurrent, '_shown', 0) == 1: SafeCall(GetPageProp(Pcurrent, 'OnLeaveOnce')) SafeCall(GetPageProp(Pcurrent, 'OnLeave')) if TimeTracking: t1 = pygame.time.get_ticks() - StartTime dt = (t1 - PageEnterTime + 500) / 1000 if overview: p = "over" else: p = "%4d" % Pcurrent print "%s%9s%9s%9s" % (p, FormatTime(dt), \ FormatTime(PageEnterTime / 1000), \ FormatTime(t1 / 1000)) # perform a transition to a specified page def TransitionTo(page): global Pcurrent, Pnext, Tcurrent, Tnext global PageCount, Marking, Tracing, Panning, TransitionRunning # first, stop video and kill the auto-timer if VideoPlaying: StopMPlayer() pygame.time.set_timer(USEREVENT_PAGE_TIMEOUT, 0) # invalid page? go away if not PreloadNextPage(page): if QuitAtEnd: PageLeft() Quit() return 0 # notify that the page has been left PageLeft() # box fade-out if GetPageProp(Pcurrent, 'boxes') or Tracing: skip = BoxFade(lambda t: 1.0 - t) else: skip = 0 # some housekeeping Marking = False Tracing = False UpdateCaption(page) # check if the transition is valid tpage = min(Pcurrent, Pnext) if 'transition' in PageProps[tpage]: tkey = 'transition' else: tkey = '_transition' trans = PageProps[tpage][tkey] if trans is None: transtime = 0 else: transtime = GetPageProp(tpage, 'transtime', TransitionDuration) try: dummy = trans.__class__ except AttributeError: # ah, gotcha! the transition is not yet intantiated! trans = trans() PageProps[tpage][tkey] = trans # backward motion? then swap page buffers now backward = (Pnext < Pcurrent) if backward: Pcurrent, Pnext = (Pnext, Pcurrent) Tcurrent, Tnext = (Tnext, Tcurrent) # transition animation if not(skip) and transtime: transtime = 1.0 / transtime TransitionRunning = True t0 = pygame.time.get_ticks() while not(VideoPlaying): if pygame.event.get([KEYDOWN,MOUSEBUTTONUP]): skip = 1 break t = (pygame.time.get_ticks() - t0) * transtime if t >= 1.0: break if backward: t = 1.0 - t glEnable(TextureTarget) trans.render(t) DrawOverlays(t) pygame.display.flip() TransitionRunning = False # forward motion => swap page buffers now if not backward: Pcurrent, Pnext = (Pnext, Pcurrent) Tcurrent, Tnext = (Tnext, Tcurrent) # box fade-in if not(skip) and GetPageProp(Pcurrent, 'boxes'): BoxFade(lambda t: t) # finally update the screen and preload the next page DrawCurrentPage() # I do that twice because for some strange reason, the PageEntered() if not PreloadNextPage(GetNextPage(Pcurrent, 1)): PreloadNextPage(GetNextPage(Pcurrent, -1)) return 1 # zoom mode animation def ZoomAnimation(targetx, targety, func): global ZoomX0, ZoomY0, ZoomArea t0 = pygame.time.get_ticks() while ZoomDuration > 0: if pygame.event.get([KEYDOWN,MOUSEBUTTONUP]): break t = (pygame.time.get_ticks() - t0) * 1.0 / ZoomDuration if t >= 1.0: break t = func(t) t = (2.0 - t) * t ZoomX0 = targetx * t ZoomY0 = targety * t ZoomArea = 1.0 - (1.0 - 1.0 / ZoomFactor) * t DrawCurrentPage() t = func(1.0) ZoomX0 = targetx * t ZoomY0 = targety * t ZoomArea = 1.0 - (1.0 - 1.0 / ZoomFactor) * t GenerateSpotMesh() DrawCurrentPage() # enter zoom mode def EnterZoomMode(targetx, targety): global ZoomMode, IsZoomed, ZoomWarningIssued ZoomAnimation(targetx, targety, lambda t: t) ZoomMode = True if TextureTarget != GL_TEXTURE_2D: if not ZoomWarningIssued: print >>sys.stderr, "Sorry, but I can't increase the detail level in zoom mode any further when" print >>sys.stderr, "GL_ARB_texture_rectangle is used. Please try running Impressive with the" print >>sys.stderr, "'-e' parameter. If a modern nVidia or ATI graphics card is used, a driver" print >>sys.stderr, "update may also fix the problem." ZoomWarningIssued = True return if not(HaveNPOT) and (npot(ZoomFactor) != ZoomFactor): if not ZoomWarningIssued: print >>sys.stderr, "Sorry, but I can't increase the detail level in zoom mode any further when" print >>sys.stderr, "conventional power-of-two textures are used and the zoom factor is not a" print >>sys.stderr, "power of two. Please use another zoom factor or a current graphics card" print >>sys.stderr, "with current drivers." ZoomWarningIssued = True return if IsZoomed: return glBindTexture(TextureTarget, Tcurrent) try: glTexImage2D(TextureTarget, 0, 3, ZoomFactor * TexWidth, ZoomFactor * TexHeight, 0, \ GL_RGB, GL_UNSIGNED_BYTE, PageImage(Pcurrent, True)) except GLerror: if not ZoomWarningIssued: print >>sys.stderr, "Sorry, but I can't increase the detail level in zoom mode any further, because" print >>sys.stderr, "your OpenGL implementation does not support that. Either the texture memory is" print >>sys.stderr, "exhausted, or there is no support for large textures (%dx%d). If you really" \ % (ZoomFactor * TexWidth, ZoomFactor * TexHeight) print >>sys.stderr, "need high-res zooming, please try to run Impressive in a smaller resolution" print >>sys.stderr, "or use a lower zoom factor." ZoomWarningIssued = True return DrawCurrentPage() IsZoomed = True # leave zoom mode (if enabled) def LeaveZoomMode(): global ZoomMode if not ZoomMode: return ZoomAnimation(ZoomX0, ZoomY0, lambda t: 1.0 - t) ZoomMode = False Panning = False # increment/decrement spot radius def IncrementSpotSize(delta): global SpotRadius if not Tracing: return SpotRadius = max(SpotRadius + delta, 8) GenerateSpotMesh() DrawCurrentPage() # post-initialize the page transitions def PrepareTransitions(): Unspecified = 0xAFFED00F # STEP 1: randomly assign transitions where the user didn't specify them cnt = sum([1 for page in xrange(1, PageCount + 1) \ if GetPageProp(page, 'transition', Unspecified) == Unspecified]) newtrans = ((cnt / len(AvailableTransitions) + 1) * AvailableTransitions)[:cnt] random.shuffle(newtrans) for page in xrange(1, PageCount + 1): if GetPageProp(page, 'transition', Unspecified) == Unspecified: SetPageProp(page, '_transition', newtrans.pop()) # STEP 2: instantiate transitions for page in PageProps: for key in ('transition', '_transition'): if not key in PageProps[page]: continue trans = PageProps[page][key] if trans is not None: PageProps[page][key] = trans() # update timer values and screen timer def TimerTick(): global CurrentTime, ProgressBarPos redraw = False newtime = (pygame.time.get_ticks() - StartTime) * 0.001 if EstimatedDuration: newpos = int(ScreenWidth * newtime / EstimatedDuration) if newpos != ProgressBarPos: redraw = True ProgressBarPos = newpos newtime = int(newtime) if TimeDisplay and (CurrentTime != newtime): redraw = True CurrentTime = newtime return redraw # set cursor visibility def SetCursor(visible): global CursorVisible CursorVisible = visible if not CursorImage: pygame.mouse.set_visible(visible) # shortcut handling def IsValidShortcutKey(key): return ((key >= K_a) and (key <= K_z)) \ or ((key >= K_0) and (key <= K_9)) \ or ((key >= K_F1) and (key <= K_F12)) def FindShortcut(shortcut): for page, props in PageProps.iteritems(): try: check = props['shortcut'] if type(check) != types.StringType: check = int(check) elif (len(check) > 1) and (check[0] in "Ff"): check = K_F1 - 1 + int(check[1:]) else: check = ord(check.lower()) except (KeyError, TypeError, ValueError): continue if check == shortcut: return page return None def AssignShortcut(page, key): old_page = FindShortcut(key) if old_page: del PageProps[old_page]['shortcut'] if key < 127: shortcut = chr(key) elif (key >= K_F1) and (key <= K_F15): shortcut = "F%d" % (key - K_F1 + 1) else: shortcut = int(key) SetPageProp(page, 'shortcut', shortcut) impressive-0.10.3+svn61/src/defaults.py000066400000000000000000000033671214566325400177230ustar00rootroot00000000000000TopLeft, BottomLeft, TopRight, BottomRight, TopCenter, BottomCenter = range(6) NoCache, MemCache, FileCache, PersistentCache = range(4) # for CacheMode Off, First, Last = range(3) # for AutoOverview # You may change the following lines to modify the default settings Fullscreen = True Scaling = False Supersample = None BackgroundRendering = True UseGhostScript = False UseAutoScreenSize = True ScreenWidth = 1024 ScreenHeight = 768 TransitionDuration = 1000 MouseHideDelay = 3000 BoxFadeDuration = 100 ZoomDuration = 250 BlankFadeDuration = 250 MeshResX = 48 MeshResY = 36 MarkColor = (1.0, 0.0, 0.0, 0.1) BoxEdgeSize = 4 SpotRadius = 64 SpotDetail = 16 CacheMode = FileCache OverviewBorder = 3 OverviewLogoBorder = 24 AutoOverview = Off InitialPage = None Wrap = False AutoAdvance = None RenderToDirectory = None Rotation = 0 AllowExtensions = True DAR = None PAR = 1.0 Overscan = 3 PollInterval = 0 PageRangeStart = 0 PageRangeEnd = 999999 FontSize = 14 FontTextureWidth = 512 FontTextureHeight = 256 Gamma = 1.0 BlackLevel = 0 GammaStep = 1.1 BlackLevelStep = 8 EstimatedDuration = None PageProgress = False ProgressBarSizeFactor = 0.02 ProgressBarAlpha = 128 ProgressBarColorNormal = (0, 255, 0) ProgressBarColorWarning = (255, 255, 0) ProgressBarColorCritical = (255, 0, 0) ProgressBarColorPage = (0, 128, 255) ProgressBarWarningFactor = 1.25 ProgressBarCriticalFactor = 1.5 CursorImage = None CursorHotspot = (0, 0) MinutesOnly = False OSDMargin = 16 OSDAlpha = 1.0 OSDTimePos = TopRight OSDTitlePos = BottomLeft OSDPagePos = BottomRight OSDStatusPos = TopLeft ZoomFactor = 2 FadeInOut = False ShowLogo = True Shuffle = False QuitAtEnd = False PageClicks = True ShowClock = False HalfScreen = False impressive-0.10.3+svn61/src/event.py000066400000000000000000000302601214566325400172250ustar00rootroot00000000000000##### EVENT HANDLING ########################################################### # set fullscreen mode def SetFullscreen(fs, do_init=True): global Fullscreen # let pygame do the real work if do_init: if fs == Fullscreen: return if not pygame.display.toggle_fullscreen(): return Fullscreen=fs # redraw the current page (pygame is too lazy to send an expose event ...) DrawCurrentPage() # show cursor and set auto-hide timer if fs: pygame.time.set_timer(USEREVENT_HIDE_MOUSE, MouseHideDelay) else: pygame.time.set_timer(USEREVENT_HIDE_MOUSE, 0) SetCursor(True) # PageProp toggle def TogglePageProp(prop, default): global WantStatus SetPageProp(Pcurrent, prop, not(GetPageProp(Pcurrent, prop, default))) UpdateCaption(Pcurrent, force=True) WantStatus = True DrawCurrentPage() # main event handling function def HandleEvent(event): global HaveMark, ZoomMode, Marking, Tracing, Panning, SpotRadius, FileStats global MarkUL, MarkLR, MouseDownX, MouseDownY, PanAnchorX, PanAnchorY global ZoomX0, ZoomY0, RTrunning, RTrestart, StartTime, PageEnterTime global CurrentTime, TimeDisplay, TimeTracking, ProgressBarPos if event.type == QUIT: if FadeInOut: EnterFadeMode() PageLeft() Quit() elif event.type == VIDEOEXPOSE: DrawCurrentPage() elif event.type == KEYDOWN: if VideoPlaying: try: if event.key in (K_ESCAPE, K_RETURN, u'q'): StopMPlayer() DrawCurrentPage() elif event.unicode == u' ': MPlayerProcess.stdin.write('pause\n') elif event.unicode == u'.': MPlayerProcess.stdin.write('frame_step\n') elif event.key == K_LEFT: MPlayerProcess.stdin.write('seek -1 pausing_keep\n') elif event.key == K_RIGHT: MPlayerProcess.stdin.write('seek 1 pausing_keep\n') elif event.key == K_UP: MPlayerProcess.stdin.write('seek 10 pausing_keep\n') elif event.key == K_DOWN: MPlayerProcess.stdin.write('seek -10 pausing_keep\n') except: StopMPlayer() DrawCurrentPage() elif (event.key == K_ESCAPE) or (event.unicode == u'q'): pygame.event.post(pygame.event.Event(QUIT)) elif event.unicode == u'f': SetFullscreen(not Fullscreen) elif (event.key == K_TAB) and (event.mod & KMOD_ALT) and Fullscreen: SetFullscreen(False) elif event.unicode == u's': SaveInfoScript(InfoScriptPath) elif event.unicode == u'z': # handle QWERTY and QWERTZ keyboards if ZoomMode: LeaveZoomMode() else: tx, ty = MouseToScreen(pygame.mouse.get_pos()) EnterZoomMode((1.0 - 1.0 / ZoomFactor) * tx, \ (1.0 - 1.0 / ZoomFactor) * ty) elif event.unicode in (u'b', u'.'): FadeMode(0.0) elif event.unicode in (u'w', u','): FadeMode(1.0) elif event.unicode == u't': TimeDisplay = not(TimeDisplay) DrawCurrentPage() if TimeDisplay and not(TimeTracking) and not(ShowClock) and FirstPage: print >>sys.stderr, "Time tracking mode enabled." TimeTracking = True print "page duration enter leave" print "---- -------- -------- --------" elif event.unicode == u'r': ResetTimer() if TimeDisplay: DrawCurrentPage() elif event.unicode == u'l': TransitionTo(LastPage) elif event.unicode == u'o': TogglePageProp('overview', GetPageProp(Pcurrent, '_overview', True)) elif event.unicode == u'i': TogglePageProp('skip', False) elif event.key == K_TAB: LeaveZoomMode() DoOverview() elif event.key in (32, K_DOWN, K_RIGHT, K_PAGEDOWN): LeaveZoomMode() TransitionTo(GetNextPage(Pcurrent, 1)) elif event.key in (K_BACKSPACE, K_UP, K_LEFT, K_PAGEUP): LeaveZoomMode() TransitionTo(GetNextPage(Pcurrent, -1)) elif event.key == K_HOME: if Pcurrent != 1: TransitionTo(1) elif event.key == K_END: if Pcurrent != PageCount: TransitionTo(PageCount) elif event.key in (K_RETURN, K_KP_ENTER): if not(GetPageProp(Pcurrent, 'boxes')) and Tracing: BoxFade(lambda t: 1.0 - t) Tracing = not(Tracing) if not(GetPageProp(Pcurrent, 'boxes')) and Tracing: BoxFade(lambda t: t) elif event.unicode == u'+': IncrementSpotSize(+8) elif event.unicode == u'-': IncrementSpotSize(-8) elif event.unicode == u'[': SetGamma(new_gamma=Gamma / GammaStep) elif event.unicode == u']': SetGamma(new_gamma=Gamma * GammaStep) elif event.unicode == u'{': SetGamma(new_black=BlackLevel - BlackLevelStep) elif event.unicode == u'}': SetGamma(new_black=BlackLevel + BlackLevelStep) elif event.unicode == u'\\': SetGamma(1.0, 0) else: keyfunc = GetPageProp(Pcurrent, 'keys', {}).get(event.unicode, None) if keyfunc: SafeCall(keyfunc) elif IsValidShortcutKey(event.key): if event.mod & KMOD_SHIFT: AssignShortcut(Pcurrent, event.key) else: # load keyboard shortcut page = FindShortcut(event.key) if page and (page != Pcurrent): TransitionTo(page) elif event.type == MOUSEBUTTONDOWN: if VideoPlaying: Marking = False Panning = False return MouseDownX, MouseDownY = event.pos if event.button == 1: MarkUL = MarkLR = MouseToScreen(event.pos) elif (event.button == 3) and ZoomMode: PanAnchorX = ZoomX0 PanAnchorY = ZoomY0 elif event.button == 4: IncrementSpotSize(+8) elif event.button == 5: IncrementSpotSize(-8) elif event.type == MOUSEBUTTONUP: if VideoPlaying: StopMPlayer() DrawCurrentPage() Marking = False Panning = False return if event.button == 2: LeaveZoomMode() DoOverview() return if event.button == 1: if Marking: # left mouse button released in marking mode -> stop box marking Marking = False # reject too small boxes if (abs(MarkUL[0] - MarkLR[0]) > 0.04) \ and (abs(MarkUL[1] - MarkLR[1]) > 0.03): boxes = GetPageProp(Pcurrent, 'boxes', []) oldboxcount = len(boxes) boxes.append(NormalizeRect(MarkUL[0], MarkUL[1], MarkLR[0], MarkLR[1])) SetPageProp(Pcurrent, 'boxes', boxes) if not(oldboxcount) and not(Tracing): BoxFade(lambda t: t) DrawCurrentPage() else: # left mouse button released, but no marking LeaveZoomMode() dest = GetNextPage(Pcurrent, 1) x, y = event.pos for valid, target, x0, y0, x1, y1 in GetPageProp(Pcurrent, '_href', []): if valid and (x >= x0) and (x < x1) and (y >= y0) and (y < y1): dest = target break if type(dest) == types.IntType: if PageClicks: TransitionTo(dest) else: RunURL(dest) if (event.button == 3) and not(Panning): # right mouse button -> check if a box has to be killed boxes = GetPageProp(Pcurrent, 'boxes', []) x, y = MouseToScreen(event.pos) try: # if a box is already present around the clicked position, kill it idx = FindBox(x, y, boxes) if (len(boxes) == 1) and not(Tracing): BoxFade(lambda t: 1.0 - t) del boxes[idx] SetPageProp(Pcurrent, 'boxes', boxes) DrawCurrentPage() except ValueError: # no box present -> go to previous page if PageClicks and not ZoomMode: TransitionTo(GetNextPage(Pcurrent, -1)) Panning = False elif event.type == MOUSEMOTION: pygame.event.clear(MOUSEMOTION) # mouse move in fullscreen mode -> show mouse cursor and reset mouse timer if Fullscreen: pygame.time.set_timer(USEREVENT_HIDE_MOUSE, MouseHideDelay) SetCursor(True) # don't react on mouse input during video playback if VideoPlaying: return # activate marking if mouse is moved away far enough if event.buttons[0] and not(Marking): x, y = event.pos if (abs(x - MouseDownX) > 4) and (abs(y - MouseDownY) > 4): Marking = True # mouse move while marking -> update marking box if Marking: MarkLR = MouseToScreen(event.pos) # mouse move while RMB is pressed -> panning if event.buttons[2] and ZoomMode: x, y = event.pos if not(Panning) and (abs(x - MouseDownX) > 4) and (abs(y - MouseDownY) > 4): Panning = True ZoomX0 = PanAnchorX + (MouseDownX - x) * ZoomArea / ScreenWidth ZoomY0 = PanAnchorY + (MouseDownY - y) * ZoomArea / ScreenHeight ZoomX0 = min(max(ZoomX0, 0.0), 1.0 - ZoomArea) ZoomY0 = min(max(ZoomY0, 0.0), 1.0 - ZoomArea) # if anything changed, redraw the page if Marking or Tracing or event.buttons[2] or (CursorImage and CursorVisible): DrawCurrentPage() elif event.type == USEREVENT_HIDE_MOUSE: # mouse timer event -> hide fullscreen cursor pygame.time.set_timer(USEREVENT_HIDE_MOUSE, 0) SetCursor(False) DrawCurrentPage() elif event.type == USEREVENT_PAGE_TIMEOUT: TransitionTo(GetNextPage(Pcurrent, 1)) elif event.type == USEREVENT_POLL_FILE: dirty = False for f in FileProps: s = my_stat(f) if s != GetFileProp(f, 'stat'): dirty = True SetFileProp(f, 'stat', s) if dirty: # first, check if the new file is valid if not os.path.isfile(GetPageProp(Pcurrent, '_file')): return # invalidate everything we used to know about the input files InvalidateCache() for props in PageProps.itervalues(): for prop in ('_overview_rendered', '_box', '_href'): if prop in props: del props[prop] LoadInfoScript() # force a transition to the current page, reloading it Pnext=-1 TransitionTo(Pcurrent) # restart the background renderer thread. this is not completely safe, # i.e. there's a small chance that we fail to restart the thread, but # this isn't critical if CacheMode and BackgroundRendering: if RTrunning: RTrestart = True else: RTrunning = True thread.start_new_thread(RenderThread, (Pcurrent, Pnext)) elif event.type == USEREVENT_TIMER_UPDATE: if VideoPlaying and MPlayerProcess: if MPlayerProcess.poll() is not None: StopMPlayer() DrawCurrentPage() elif TimerTick(): DrawCurrentPage() impressive-0.10.3+svn61/src/filelist.py000066400000000000000000000035621214566325400177240ustar00rootroot00000000000000##### FILE LIST GENERATION ##################################################### def IsImageFileName(name): return os.path.splitext(name)[1].lower() in \ (".jpg", ".jpeg", ".png", ".tif", ".tiff", ".bmp", ".ppm", ".pgm") def IsPlayable(name): return IsImageFileName(name) or name.lower().endswith(".pdf") or os.path.isdir(name) def AddFile(name, title=None): global FileList, FileName if os.path.isfile(name): FileList.append(name) if title: SetFileProp(name, 'title', title) elif os.path.isdir(name): images = [os.path.join(name, f) for f in os.listdir(name) if IsImageFileName(f)] images.sort(lambda a, b: cmp(a.lower(), b.lower())) if not images: print >>sys.stderr, "Warning: no image files in directory `%s'" % name for img in images: AddFile(img) elif name.startswith('@') and os.path.isfile(name[1:]): name = name[1:] dirname = os.path.dirname(name) try: f = file(name, "r") next_title = None for line in f: line = [part.strip() for part in line.split('#', 1)] if len(line) == 1: subfile = line[0] title = None else: subfile, title = line if subfile: AddFile(os.path.normpath(os.path.join(dirname, subfile)), title) f.close() except IOError: print >>sys.stderr, "Error: cannot read list file `%s'" % name if not FileName: FileName = name else: FileName = "" else: files = list(filter(IsPlayable, glob.glob(name))) if files: for f in files: AddFile(f) else: print >>sys.stderr, "Error: input file `%s' not found" % name impressive-0.10.3+svn61/src/gldraw.py000066400000000000000000000254141214566325400173710ustar00rootroot00000000000000##### OPENGL RENDERING ######################################################### # draw OSD overlays def DrawOverlays(trans_time=0.0): reltime = pygame.time.get_ticks() - StartTime if (EstimatedDuration or PageProgress) and (OverviewMode or GetPageProp(Pcurrent, 'progress', True)): if EstimatedDuration: rel = (0.001 * reltime) / EstimatedDuration if rel < 1.0: r, g, b = ProgressBarColorNormal elif rel < ProgressBarWarningFactor: r, g, b = lerpColor(ProgressBarColorNormal, ProgressBarColorWarning, (rel - 1.0) / (ProgressBarWarningFactor - 1.0)) elif rel < ProgressBarCriticalFactor: r, g, b = lerpColor(ProgressBarColorWarning, ProgressBarColorCritical, (rel - ProgressBarWarningFactor) / (ProgressBarCriticalFactor - ProgressBarWarningFactor)) else: r, g, b = ProgressBarColorCritical else: rel = (Pcurrent + trans_time * (Pnext - Pcurrent)) / PageCount r, g, b = ProgressBarColorPage if HalfScreen: zero = 0.5 rel = 0.5 + 0.5 * rel else: zero = 0.0 glDisable(TextureTarget) glDisable(GL_TEXTURE_2D) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glBegin(GL_QUADS) glColor4ub(r, g, b, 0) glVertex2d(zero, 1.0 - ProgressBarSizeFactor) glVertex2d(rel, 1.0 - ProgressBarSizeFactor) glColor4ub(r, g, b, ProgressBarAlpha) glVertex2d(rel, 1.0) glVertex2d(zero, 1.0) glEnd() glDisable(GL_BLEND) if WantStatus: DrawOSDEx(OSDStatusPos, CurrentOSDStatus) if TimeDisplay: if ShowClock: DrawOSDEx(OSDTimePos, ClockTime(MinutesOnly)) else: t = reltime / 1000 DrawOSDEx(OSDTimePos, FormatTime(t, MinutesOnly)) if CurrentOSDComment and (OverviewMode or not(TransitionRunning)): DrawOSD(ScreenWidth/2, \ ScreenHeight - 3*OSDMargin - FontSize, \ CurrentOSDComment, Center, Up) if CursorImage and CursorVisible: x, y = pygame.mouse.get_pos() x -= CursorHotspot[0] y -= CursorHotspot[1] X0 = x * PixelX Y0 = y * PixelY X1 = X0 + CursorSX Y1 = Y0 + CursorSY glDisable(TextureTarget) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, CursorTexture) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glColor4ub(255, 255, 255, 255) glBegin(GL_QUADS) glTexCoord2d(0.0, 0.0); glVertex2d(X0, Y0) glTexCoord2d(CursorTX, 0.0); glVertex2d(X1, Y0) glTexCoord2d(CursorTX, CursorTY); glVertex2d(X1, Y1) glTexCoord2d(0.0, CursorTY); glVertex2d(X0, Y1) glEnd() glDisable(GL_BLEND) glDisable(GL_TEXTURE_2D) # draw the complete image of the current page def DrawCurrentPage(dark=1.0, do_flip=True): if VideoPlaying: return boxes = GetPageProp(Pcurrent, 'boxes') glClear(GL_COLOR_BUFFER_BIT) # pre-transform for zoom glLoadIdentity() glOrtho(ZoomX0, ZoomX0 + ZoomArea, ZoomY0 + ZoomArea, ZoomY0, -10.0, 10.0) # background layer -- the page's image, darkened if it has boxes glDisable(GL_BLEND) glEnable(TextureTarget) glBindTexture(TextureTarget, Tcurrent) if boxes or Tracing: light = 1.0 - 0.25 * dark else: light = 1.0 glColor3d(light, light, light) DrawFullQuad() if boxes or Tracing: # alpha-blend the same image some times to blur it EnableAlphaBlend() DrawTranslatedFullQuad(+PixelX * ZoomArea, 0.0, light, dark / 2) DrawTranslatedFullQuad(-PixelX * ZoomArea, 0.0, light, dark / 3) DrawTranslatedFullQuad(0.0, +PixelY * ZoomArea, light, dark / 4) DrawTranslatedFullQuad(0.0, -PixelY * ZoomArea, light, dark / 5) if boxes: # draw outer box fade EnableAlphaBlend() for X0, Y0, X1, Y1 in boxes: glBegin(GL_QUAD_STRIP) DrawPointEx(X0, Y0, 1); DrawPointEx(X0 - EdgeX, Y0 - EdgeY, 0) DrawPointEx(X1, Y0, 1); DrawPointEx(X1 + EdgeX, Y0 - EdgeY, 0) DrawPointEx(X1, Y1, 1); DrawPointEx(X1 + EdgeX, Y1 + EdgeY, 0) DrawPointEx(X0, Y1, 1); DrawPointEx(X0 - EdgeX, Y1 + EdgeY, 0) DrawPointEx(X0, Y0, 1); DrawPointEx(X0 - EdgeX, Y0 - EdgeY, 0) glEnd() # draw boxes glDisable(GL_BLEND) glBegin(GL_QUADS) for X0, Y0, X1, Y1 in boxes: DrawPoint(X0, Y0) DrawPoint(X1, Y0) DrawPoint(X1, Y1) DrawPoint(X0, Y1) glEnd() if Tracing: x, y = MouseToScreen(pygame.mouse.get_pos()) # outer spot fade EnableAlphaBlend() glBegin(GL_TRIANGLE_STRIP) for x0, y0, x1, y1 in SpotMesh: DrawPointEx(x + x0, y + y0, 1) DrawPointEx(x + x1, y + y1, 0) glEnd() # inner spot glDisable(GL_BLEND) glBegin(GL_TRIANGLE_FAN) DrawPoint(x, y) for x0, y0, x1, y1 in SpotMesh: DrawPoint(x + x0, y + y0) glEnd() if Marking: # soft alpha-blended rectangle glDisable(TextureTarget) glColor4d(*MarkColor) EnableAlphaBlend() glBegin(GL_QUADS) glVertex2d(MarkUL[0], MarkUL[1]) glVertex2d(MarkLR[0], MarkUL[1]) glVertex2d(MarkLR[0], MarkLR[1]) glVertex2d(MarkUL[0], MarkLR[1]) glEnd() # bright red frame glDisable(GL_BLEND) glBegin(GL_LINE_STRIP) glVertex2d(MarkUL[0], MarkUL[1]) glVertex2d(MarkLR[0], MarkUL[1]) glVertex2d(MarkLR[0], MarkLR[1]) glVertex2d(MarkUL[0], MarkLR[1]) glVertex2d(MarkUL[0], MarkUL[1]) glEnd() glEnable(TextureTarget) # unapply the zoom transform glLoadIdentity() glOrtho(0.0, 1.0, 1.0, 0.0, -10.0, 10.0) # Done. DrawOverlays() if do_flip: pygame.display.flip() # draw a black screen with the Impressive logo at the center def DrawLogo(): glClear(GL_COLOR_BUFFER_BIT) glColor3ub(255, 255, 255) if not ShowLogo: return if HalfScreen: x0 = 0.25 else: x0 = 0.5 if TextureTarget != GL_TEXTURE_2D: glDisable(TextureTarget) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, LogoTexture) glBegin(GL_QUADS) glTexCoord2d(0, 0); glVertex2d(x0 - 128.0 / ScreenWidth, 0.5 - 32.0 / ScreenHeight) glTexCoord2d(1, 0); glVertex2d(x0 + 128.0 / ScreenWidth, 0.5 - 32.0 / ScreenHeight) glTexCoord2d(1, 1); glVertex2d(x0 + 128.0 / ScreenWidth, 0.5 + 32.0 / ScreenHeight) glTexCoord2d(0, 1); glVertex2d(x0 - 128.0 / ScreenWidth, 0.5 + 32.0 / ScreenHeight) glEnd() if OSDFont: OSDFont.Draw((int(ScreenWidth * x0), ScreenHeight / 2 + 48), \ __version__, align=Center, alpha=0.25) glDisable(GL_TEXTURE_2D) # draw the prerender progress bar def DrawProgress(position): glDisable(TextureTarget) x0 = 0.1 x2 = 1.0 - x0 x1 = position * x2 + (1.0 - position) * x0 y1 = 0.9 y0 = y1 - 16.0 / ScreenHeight if HalfScreen: x0 *= 0.5 x1 *= 0.5 x2 *= 0.5 glBegin(GL_QUADS) glColor3ub( 64, 64, 64); glVertex2d(x0, y0); glVertex2d(x2, y0) glColor3ub(128, 128, 128); glVertex2d(x2, y1); glVertex2d(x0, y1) glColor3ub( 64, 128, 255); glVertex2d(x0, y0); glVertex2d(x1, y0) glColor3ub( 8, 32, 128); glVertex2d(x1, y1); glVertex2d(x0, y1) glEnd() glEnable(TextureTarget) # fade mode def DrawFadeMode(intensity, alpha): if VideoPlaying: return DrawCurrentPage(do_flip=False) glDisable(TextureTarget) EnableAlphaBlend() glColor4d(intensity, intensity, intensity, alpha) DrawFullQuad() glEnable(TextureTarget) pygame.display.flip() def EnterFadeMode(intensity=0.0): t0 = pygame.time.get_ticks() while True: if pygame.event.get([KEYDOWN,MOUSEBUTTONUP]): break t = (pygame.time.get_ticks() - t0) * 1.0 / BlankFadeDuration if t >= 1.0: break DrawFadeMode(intensity, t) DrawFadeMode(intensity, 1.0) def LeaveFadeMode(intensity=0.0): t0 = pygame.time.get_ticks() while True: if pygame.event.get([KEYDOWN,MOUSEBUTTONUP]): break t = (pygame.time.get_ticks() - t0) * 1.0 / BlankFadeDuration if t >= 1.0: break DrawFadeMode(intensity, 1.0 - t) DrawCurrentPage() def FadeMode(intensity): EnterFadeMode(intensity) while True: event = pygame.event.wait() if event.type == QUIT: PageLeft() Quit() elif event.type == VIDEOEXPOSE: DrawFadeMode(intensity, 1.0) elif event.type == MOUSEBUTTONUP: break elif event.type == KEYDOWN: if event.unicode == u'q': pygame.event.post(pygame.event.Event(QUIT)) else: break LeaveFadeMode(intensity) # gamma control def SetGamma(new_gamma=None, new_black=None, force=False): global Gamma, BlackLevel if new_gamma is None: new_gamma = Gamma if new_gamma < 0.1: new_gamma = 0.1 if new_gamma > 10.0: new_gamma = 10.0 if new_black is None: new_black = BlackLevel if new_black < 0: new_black = 0 if new_black > 254: new_black = 254 if not(force) and (abs(Gamma - new_gamma) < 0.01) and (new_black == BlackLevel): return Gamma = new_gamma BlackLevel = new_black scale = 1.0 / (255 - BlackLevel) power = 1.0 / Gamma ramp = [int(65535.0 * ((max(0, x - BlackLevel) * scale) ** power)) for x in range(256)] return pygame.display.set_gamma_ramp(ramp, ramp, ramp) # cursor image def PrepareCustomCursor(cimg): global CursorTexture, CursorSX, CursorSY, CursorTX, CursorTY w, h = cimg.size tw, th = map(npot, cimg.size) if (tw > 256) or (th > 256): print >>sys.stderr, "Custom cursor is rediculously large, reverting to normal one." return False img = Image.new('RGBA', (tw, th)) img.paste(cimg, (0, 0)) CursorTexture = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, CursorTexture) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tw, th, 0, GL_RGBA, GL_UNSIGNED_BYTE, img.tostring()) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) CursorSX = w * PixelX CursorSY = h * PixelY CursorTX = w / float(tw) CursorTY = h / float(th) return True impressive-0.10.3+svn61/src/globals.py000066400000000000000000000024501214566325400175270ustar00rootroot00000000000000##### GLOBAL VARIABLES ######################################################### # initialize private variables FileName = "" FileList = [] InfoScriptPath = None Marking = False Tracing = False Panning = False FileProps = {} PageProps = {} PageCache = {} CacheFile = None CacheFileName = None CacheFilePos = 0 CacheMagic = "" MPlayerProcess = None VideoPlaying = False MouseDownX = 0 MouseDownY = 0 MarkUL = (0, 0) MarkLR = (0, 0) ZoomX0 = 0.0 ZoomY0 = 0.0 ZoomArea = 1.0 ZoomMode = False IsZoomed = False ZoomWarningIssued = False TransitionRunning = False CurrentCaption = 0 OverviewNeedUpdate = False FileStats = None OSDFont = None CurrentOSDCaption = "" CurrentOSDPage = "" CurrentOSDStatus = "" CurrentOSDComment = "" Lrender = create_lock() Lcache = create_lock() Loverview = create_lock() RTrunning = False RTrestart = False StartTime = 0 CurrentTime = 0 PageEnterTime = 0 TimeDisplay = False TimeTracking = False FirstPage = True ProgressBarPos = 0 CursorVisible = True OverviewMode = False LastPage = 0 WantStatus = False # tool constants (used in info scripts) FirstTimeOnly = 2 # event constants USEREVENT_HIDE_MOUSE = USEREVENT USEREVENT_PAGE_TIMEOUT = USEREVENT + 1 USEREVENT_POLL_FILE = USEREVENT + 2 USEREVENT_TIMER_UPDATE = USEREVENT + 3 impressive-0.10.3+svn61/src/gltools.py000066400000000000000000000051351214566325400175720ustar00rootroot00000000000000##### RENDERING TOOL CODE ###################################################### # draw a fullscreen quad def DrawFullQuad(): glBegin(GL_QUADS) glTexCoord2d( 0.0, 0.0); glVertex2i(0, 0) glTexCoord2d(TexMaxS, 0.0); glVertex2i(1, 0) glTexCoord2d(TexMaxS, TexMaxT); glVertex2i(1, 1) glTexCoord2d( 0.0, TexMaxT); glVertex2i(0, 1) glEnd() # draw a generic 2D quad def DrawQuad(x0=0.0, y0=0.0, x1=1.0, y1=1.0): glBegin(GL_QUADS) glTexCoord2d( 0.0, 0.0); glVertex2d(x0, y0) glTexCoord2d(TexMaxS, 0.0); glVertex2d(x1, y0) glTexCoord2d(TexMaxS, TexMaxT); glVertex2d(x1, y1) glTexCoord2d( 0.0, TexMaxT); glVertex2d(x0, y1) glEnd() # helper function: draw a translated fullscreen quad def DrawTranslatedFullQuad(dx, dy, i, a): glColor4d(i, i, i, a) glPushMatrix() glTranslated(dx, dy, 0.0) DrawFullQuad() glPopMatrix() # draw a vertex in normalized screen coordinates, # setting texture coordinates appropriately def DrawPoint(x, y): glTexCoord2d(x *TexMaxS, y * TexMaxT) glVertex2d(x, y) def DrawPointEx(x, y, a): glColor4d(1.0, 1.0, 1.0, a) glTexCoord2d(x * TexMaxS, y * TexMaxT) glVertex2d(x, y) # a mesh transformation function: it gets the relative transition time (in the # [0.0,0.1) interval) and the normalized 2D screen coordinates, and returns a # 7-tuple containing the desired 3D screen coordinates, 2D texture coordinates, # and intensity/alpha color values. def meshtrans_null(t, u, v): return (u, v, 0.0, u, v, 1.0, t) # (x, y, z, s, t, i, a) # draw a quad, applying a mesh transformation function def DrawMeshQuad(time=0.0, f=meshtrans_null): line0 = [f(time, u * MeshStepX, 0.0) for u in xrange(MeshResX + 1)] for v in xrange(1, MeshResY + 1): line1 = [f(time, u * MeshStepX, v * MeshStepY) for u in xrange(MeshResX + 1)] glBegin(GL_QUAD_STRIP) for col in zip(line0, line1): for x, y, z, s, t, i, a in col: glColor4d(i, i, i, a) glTexCoord2d(s * TexMaxS, t * TexMaxT) glVertex3d(x, y, z) glEnd() line0 = line1 def GenerateSpotMesh(): global SpotMesh rx0 = SpotRadius * PixelX ry0 = SpotRadius * PixelY rx1 = (SpotRadius + BoxEdgeSize) * PixelX ry1 = (SpotRadius + BoxEdgeSize) * PixelY steps = max(6, int(2.0 * pi * SpotRadius / SpotDetail / ZoomArea)) SpotMesh=[(rx0 * sin(a), ry0 * cos(a), rx1 * sin(a), ry1 * cos(a)) for a in \ [i * 2.0 * pi / steps for i in range(steps + 1)]] impressive-0.10.3+svn61/src/init.py000066400000000000000000000102031214566325400170420ustar00rootroot00000000000000# import basic modules import random, getopt, os, types, re, codecs, tempfile, glob, StringIO, re import traceback, subprocess, time from math import * # import hashlib for MD5 generation, but fall back to old md5 lib if unavailable # (this is the case for Python versions older than 2.5) try: import hashlib md5obj = hashlib.md5 except ImportError: import md5 md5obj = md5.new # initialize some platform-specific settings if os.name == "nt": root = os.path.split(sys.argv[0])[0] or "." pdftoppmPath = os.path.join(root, "pdftoppm.exe") GhostScriptPath = os.path.join(root, "gs\\gswin32c.exe") GhostScriptPlatformOptions = ["-I" + os.path.join(root, "gs")] try: import win32api MPlayerPath = os.path.join(root, "mplayer.exe") def GetScreenSize(): dm = win32api.EnumDisplaySettings(None, -1) #ENUM_CURRENT_SETTINGS return (int(dm.PelsWidth), int(dm.PelsHeight)) def RunURL(url): win32api.ShellExecute(0, "open", url, "", "", 0) except ImportError: MPlayerPath = "" def GetScreenSize(): return pygame.display.list_modes()[0] def RunURL(url): print "Error: cannot run URL `%s'" % url MPlayerPlatformOptions = [ "-colorkey", "0x000000" ] MPlayerColorKey = True pdftkPath = os.path.join(root, "pdftk.exe") FileNameEscape = '"' spawn = os.spawnv if getattr(sys, "frozen", None): sys.path.append(root) FontPath = [] FontList = ["Verdana.ttf", "Arial.ttf"] else: pdftoppmPath = "pdftoppm" GhostScriptPath = "gs" GhostScriptPlatformOptions = [] MPlayerPath = "mplayer" MPlayerPlatformOptions = [ "-vo", "gl" ] MPlayerColorKey = False pdftkPath = "pdftk" spawn = os.spawnvp FileNameEscape = "" FontPath = ["/usr/share/fonts", "/usr/local/share/fonts", "/usr/X11R6/lib/X11/fonts/TTF"] FontList = ["DejaVuSans.ttf", "Vera.ttf", "Verdana.ttf"] def RunURL(url): try: spawn(os.P_NOWAIT, "xdg-open", ["xdg-open", url]) except OSError: print >>sys.stderr, "Error: cannot open URL `%s'" % url def GetScreenSize(): res_re = re.compile(r'\s*(\d+)x(\d+)\s+\d+\.\d+\*') for path in os.getenv("PATH").split(':'): fullpath = os.path.join(path, "xrandr") if os.path.exists(fullpath): res = None try: for line in os.popen(fullpath, "r"): m = res_re.match(line) if m: res = tuple(map(int, m.groups())) except OSError: pass if res: return res return pygame.display.list_modes()[0] # import special modules try: from OpenGL.GL import * import pygame from pygame.locals import * from PIL import Image, ImageDraw, ImageFont, ImageFilter from PIL import TiffImagePlugin, BmpImagePlugin, JpegImagePlugin, PngImagePlugin, PpmImagePlugin except (ValueError, ImportError), err: print >>sys.stderr, "Oops! Cannot load necessary modules:", err print >>sys.stderr, """To use Impressive, you need to install the following Python modules: - PyOpenGL [python-opengl] http://pyopengl.sourceforge.net/ - PyGame [python-pygame] http://www.pygame.org/ - PIL [python-imaging] http://www.pythonware.com/products/pil/ or Pillow http://pypi.python.org/pypi/Pillow/ - PyWin32 (OPTIONAL, Win32) http://starship.python.net/crew/mhammond/win32/ Additionally, please be sure to have pdftoppm or GhostScript installed if you intend to use PDF input.""" sys.exit(1) try: import thread EnableBackgroundRendering = True def create_lock(): return thread.allocate_lock() except ImportError: EnableBackgroundRendering = False class pseudolock: def __init__(self): self.state = False def acquire(self, dummy=0): self.state = True def release(self): self.state = False def locked(self): return self.state def create_lock(): return pseudolock() impressive-0.10.3+svn61/src/main.py000066400000000000000000000365541214566325400170440ustar00rootroot00000000000000##### INITIALIZATION ########################################################### def main(): global ScreenWidth, ScreenHeight, TexWidth, TexHeight, TexSize, LogoImage global TexMaxS, TexMaxT, MeshStepX, MeshStepY, EdgeX, EdgeY, PixelX, PixelY global OverviewGridSize, OverviewCellX, OverviewCellY, HaveNPOT global OverviewOfsX, OverviewOfsY, OverviewImage, OverviewPageCount global OverviewPageMap, OverviewPageMapInv, FileName, FileList, PageCount global DocumentTitle, PageProps, LogoTexture, OSDFont global Pcurrent, Pnext, Tcurrent, Tnext, InitialPage global CacheFile, CacheFileName global Extensions, AllowExtensions, TextureTarget, PAR, DAR, TempFileName global BackgroundRendering, FileStats, RTrunning, RTrestart, StartTime global CursorImage, CursorVisible, InfoScriptPath global HalfScreen # allocate temporary file TempFileName = tempfile.mktemp(prefix="impressive-", suffix="_tmp") # some input guesswork DocumentTitle = os.path.splitext(os.path.split(FileName)[1])[0] if FileName and not(FileList): AddFile(FileName) if not(FileName) and (len(FileList) == 1): FileName = FileList[0] # initialize PyGame pygame.init() # detect screen size and compute aspect ratio if Fullscreen and UseAutoScreenSize: size = GetScreenSize() if size: ScreenWidth, ScreenHeight = size print >>sys.stderr, "Detected screen size: %dx%d pixels" % (ScreenWidth, ScreenHeight) if DAR is None: PAR = 1 else: PAR = DAR / float(ScreenWidth) * float(ScreenHeight) # fill the page list if Shuffle: random.shuffle(FileList) PageCount = 0 for name in FileList: ispdf = name.lower().endswith(".pdf") if ispdf: # PDF input -> try to pre-parse the PDF file pages = 0 out = [(ScreenWidth + Overscan, ScreenHeight + Overscan), (ScreenWidth + Overscan, ScreenHeight + Overscan)] res = [(72.0, 72.0), (72.0, 72.0)] # phase 1: internal PDF parser try: pages, pdf_width, pdf_height = analyze_pdf(name) out = [ZoomToFit((pdf_width, pdf_height * PAR)), ZoomToFit((pdf_height, pdf_width * PAR))] res = [(out[0][0] * 72.0 / pdf_width, out[0][1] * 72.0 / pdf_height), (out[1][1] * 72.0 / pdf_width, out[1][0] * 72.0 / pdf_height)] except KeyboardInterrupt: raise except: pass # phase 2: use pdftk try: assert 0 == spawn(os.P_WAIT, pdftkPath, \ ["pdftk", FileNameEscape + name + FileNameEscape, \ "dump_data", "output", TempFileName + ".txt"]) title, pages = pdftkParse(TempFileName + ".txt", PageCount) if DocumentTitle and title: DocumentTitle = title except KeyboardInterrupt: raise except: pass else: # Image File pages = 1 SetPageProp(PageCount + 1, '_title', os.path.split(name)[-1]) # validity check if not pages: print >>sys.stderr, "Warning: The input file `%s' could not be analyzed." % name continue # add pages and files into PageProps and FileProps pagerange = list(range(PageCount + 1, PageCount + pages + 1)) for page in pagerange: SetPageProp(page, '_file', name) if ispdf: SetPageProp(page, '_page', page - PageCount) title = GetFileProp(name, 'title') if title: SetPageProp(page, '_title', title) SetFileProp(name, 'pages', GetFileProp(name, 'pages', []) + pagerange) SetFileProp(name, 'offsets', GetFileProp(name, 'offsets', []) + [PageCount]) if not GetFileProp(name, 'stat'): SetFileProp(name, 'stat', my_stat(name)) if ispdf: SetFileProp(name, 'out', out) SetFileProp(name, 'res', res) PageCount += pages # no pages? strange ... if not PageCount: print >>sys.stderr, "The presentation doesn't have any pages, quitting." sys.exit(1) # if rendering is wanted, do it NOW if RenderToDirectory: sys.exit(DoRender()) # load and execute info script if not InfoScriptPath: InfoScriptPath = FileName + ".info" LoadInfoScript() # initialize graphics flags = OPENGL|DOUBLEBUF if Fullscreen: flags |= FULLSCREEN try: pygame.display.set_mode((ScreenWidth, ScreenHeight), flags) except: print >>sys.stderr, "FATAL: cannot create rendering surface in the desired resolution (%dx%d)" % (ScreenWidth, ScreenHeight) sys.exit(1) pygame.display.set_caption(__title__) pygame.key.set_repeat(500, 30) if Fullscreen: pygame.mouse.set_visible(False) CursorVisible = False glOrtho(0.0, 1.0, 1.0, 0.0, -10.0, 10.0) if (Gamma <> 1.0) or (BlackLevel <> 0): SetGamma(force=True) # check if graphics are unaccelerated renderer = glGetString(GL_RENDERER) print >>sys.stderr, "OpenGL renderer:", renderer renderer = renderer.lower() if (renderer in ("mesa glx indirect", "gdi generic")) \ or renderer.startswith("software"): print >>sys.stderr, "WARNING: Using an OpenGL software renderer. Impressive will work, but it will" print >>sys.stderr, " very likely be too slow to be usable." # setup the OpenGL texture mode Extensions = dict([(ext.split('_', 2)[-1], None) for ext in \ glGetString(GL_EXTENSIONS).split()]) if AllowExtensions and ("texture_non_power_of_two" in Extensions): print >>sys.stderr, "Using GL_ARB_texture_non_power_of_two." HaveNPOT = True TextureTarget = GL_TEXTURE_2D TexWidth = (ScreenWidth + 3) & (-4) TexHeight = (ScreenHeight + 3) & (-4) TexMaxS = float(ScreenWidth) / TexWidth TexMaxT = float(ScreenHeight) / TexHeight elif AllowExtensions and ("texture_rectangle" in Extensions): print >>sys.stderr, "Using GL_ARB_texture_rectangle." HaveNPOT = True TextureTarget = 0x84F5 # GL_TEXTURE_RECTANGLE_ARB TexWidth = (ScreenWidth + 3) & (-4) TexHeight = (ScreenHeight + 3) & (-4) TexMaxS = ScreenWidth TexMaxT = ScreenHeight else: print >>sys.stderr, "Using conventional power-of-two textures with padding." HaveNPOT = False TextureTarget = GL_TEXTURE_2D TexWidth = npot(ScreenWidth) TexHeight = npot(ScreenHeight) TexMaxS = ScreenWidth * 1.0 / TexWidth TexMaxT = ScreenHeight * 1.0 / TexHeight TexSize = TexWidth * TexHeight * 3 # set up some variables MeshStepX = 1.0 / MeshResX MeshStepY = 1.0 / MeshResY PixelX = 1.0 / ScreenWidth PixelY = 1.0 / ScreenHeight EdgeX = BoxEdgeSize * 1.0 / ScreenWidth EdgeY = BoxEdgeSize * 1.0 / ScreenHeight if InitialPage is None: InitialPage = GetNextPage(0, 1) Pcurrent = InitialPage # prepare logo image LogoImage = Image.open(StringIO.StringIO(LOGO)) LogoTexture = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, LogoTexture) glTexImage2D(GL_TEXTURE_2D, 0, 1, 256, 64, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, LogoImage.tostring()) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) DrawLogo() pygame.display.flip() # initialize OSD font try: OSDFont = GLFont(FontTextureWidth, FontTextureHeight, FontList, FontSize, search_path=FontPath) DrawLogo() titles = [] for key in ('title', '_title'): titles.extend([p[key] for p in PageProps.itervalues() if key in p]) if titles: OSDFont.AddString("".join(titles)) except ValueError: print >>sys.stderr, "The OSD font size is too large, the OSD will be rendered incompletely." except IOError: print >>sys.stderr, "Could not open OSD font file, disabling OSD." except (NameError, AttributeError, TypeError): print >>sys.stderr, "Your version of PIL is too old or incomplete, disabling OSD." # initialize mouse cursor if CursorImage: try: CursorImage = PrepareCustomCursor(Image.open(CursorImage)) except: print >>sys.stderr, "Could not open the mouse cursor image, using standard cursor." CursorImage = False # set up page cache if CacheMode == PersistentCache: if not CacheFileName: CacheFileName = FileName + ".cache" InitPCache() if CacheMode == FileCache: CacheFile = tempfile.TemporaryFile(prefix="impressive-", suffix=".cache") # initialize overview metadata OverviewPageMap=[i for i in xrange(1, PageCount + 1) \ if GetPageProp(i, ('overview', '_overview'), True) \ and (i >= PageRangeStart) and (i <= PageRangeEnd)] OverviewPageCount = max(len(OverviewPageMap), 1) OverviewPageMapInv = {} for page in xrange(1, PageCount + 1): OverviewPageMapInv[page] = len(OverviewPageMap) - 1 for i in xrange(len(OverviewPageMap)): if OverviewPageMap[i] >= page: OverviewPageMapInv[page] = i break # initialize overview page geometry OverviewGridSize = 1 while OverviewPageCount > OverviewGridSize * OverviewGridSize: OverviewGridSize += 1 if HalfScreen: # in half-screen mode, temporarily override ScreenWidth saved_screen_width = ScreenWidth ScreenWidth /= 2 OverviewCellX = int(ScreenWidth / OverviewGridSize) OverviewCellY = int(ScreenHeight / OverviewGridSize) OverviewOfsX = int((ScreenWidth - OverviewCellX * OverviewGridSize)/2) OverviewOfsY = int((ScreenHeight - OverviewCellY * \ int((OverviewPageCount + OverviewGridSize - 1) / OverviewGridSize)) / 2) OverviewImage = Image.new('RGB', (TexWidth, TexHeight)) if HalfScreen: OverviewOfsX += ScreenWidth ScreenWidth = saved_screen_width # fill overlay "dummy" images dummy = LogoImage.copy() border = max(OverviewLogoBorder, 2 * OverviewBorder) maxsize = (OverviewCellX - border, OverviewCellY - border) if (dummy.size[0] > maxsize[0]) or (dummy.size[1] > maxsize[1]): dummy.thumbnail(ZoomToFit(dummy.size, maxsize), Image.ANTIALIAS) margX = int((OverviewCellX - dummy.size[0]) / 2) margY = int((OverviewCellY - dummy.size[1]) / 2) dummy = dummy.convert(mode='RGB') for page in range(OverviewPageCount): pos = OverviewPos(page) OverviewImage.paste(dummy, (pos[0] + margX, pos[1] + margY)) del dummy # set up background rendering if not EnableBackgroundRendering: print >>sys.stderr, "Background rendering isn't available on this platform." BackgroundRendering = False # if caching is enabled, pre-render all pages if CacheMode and not(BackgroundRendering): DrawLogo() DrawProgress(0.0) pygame.display.flip() for pdf in FileProps: if pdf.lower().endswith(".pdf"): ParsePDF(pdf) stop = False progress = 0.0 for page in range(InitialPage, PageCount + 1) + range(1, InitialPage): event = pygame.event.poll() while event.type != NOEVENT: if event.type == KEYDOWN: if (event.key == K_ESCAPE) or (event.unicode == u'q'): Quit() stop = True elif event.type == MOUSEBUTTONUP: stop = True event = pygame.event.poll() if stop: break if (page >= PageRangeStart) and (page <= PageRangeEnd): PageImage(page) DrawLogo() progress += 1.0 / PageCount; DrawProgress(progress) pygame.display.flip() # create buffer textures DrawLogo() pygame.display.flip() glEnable(TextureTarget) Tcurrent = glGenTextures(1) Tnext = glGenTextures(1) for T in (Tcurrent, Tnext): glBindTexture(TextureTarget, T) glTexParameteri(TextureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glTexParameteri(TextureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexParameteri(TextureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP) glTexParameteri(TextureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP) # prebuffer current and next page Pnext = 0 RenderPage(Pcurrent, Tcurrent) PageEntered(update_time=False) PreloadNextPage(GetNextPage(Pcurrent, 1)) # some other preparations PrepareTransitions() GenerateSpotMesh() if PollInterval: pygame.time.set_timer(USEREVENT_POLL_FILE, PollInterval * 1000) # start the background rendering thread if CacheMode and BackgroundRendering: RTrunning = True thread.start_new_thread(RenderThread, (Pcurrent, Pnext)) # parse PDF file if caching is disabled if not CacheMode: for pdf in FileProps: if pdf.lower().endswith(".pdf"): SafeCall(ParsePDF, [pdf]) # start output and enter main loop StartTime = pygame.time.get_ticks() pygame.time.set_timer(USEREVENT_TIMER_UPDATE, 100) if not(Fullscreen) and CursorImage: pygame.mouse.set_visible(False) if FadeInOut: LeaveFadeMode() else: DrawCurrentPage() UpdateCaption(Pcurrent) while True: HandleEvent(pygame.event.wait()) # wrapper around main() that ensures proper uninitialization def run_main(): global CacheFile try: try: main() except SystemExit: raise except KeyboardInterrupt: pass except: print >>sys.stderr print >>sys.stderr, 79 * "=" print >>sys.stderr, "OOPS! Impressive crashed!" print >>sys.stderr, "This shouldn't happen. Please report this incident to the author, including the" print >>sys.stderr, "full output of the program, particularly the following lines." print >>sys.stderr print >>sys.stderr, "Python version:", sys.version print >>sys.stderr, "PyGame version:", pygame.__version__ print >>sys.stderr, "PIL version:", Image.VERSION print >>sys.stderr, "PyOpenGL version:", OpenGL.__version__ raise finally: StopMPlayer() # ensure that background rendering is halted Lrender.acquire() Lcache.acquire() # remove all temp files if 'CacheFile' in globals(): del CacheFile for tmp in glob.glob(TempFileName + "*"): try: os.remove(tmp) except OSError: pass pygame.quit() # release all locks try: if Lrender.locked(): Lrender.release() except: pass try: if Lcache.locked(): Lcache.release() except: pass try: if Loverview.locked(): Loverview.release() except: pass impressive-0.10.3+svn61/src/options.py000066400000000000000000000467341214566325400176140ustar00rootroot00000000000000##### COMMAND-LINE PARSER AND HELP ############################################# def if_op(cond, res_then, res_else): if cond: return res_then else: return res_else def HelpExit(code=0): print """A nice presentation tool. Usage: """+os.path.basename(sys.argv[0])+""" [OPTION...] You may either play a PDF file, a directory containing image files or individual image files. Input options: -r, --rotate rotate pages clockwise in 90-degree steps --scale scale images to fit screen (not used in PDF mode) --supersample use supersampling (only used in PDF mode) -s --supersample for PDF files, --scale for image files -I, --script set the path of the info script -u, --poll check periodically if the source file has been updated and reload it if it did -X, --shuffle put input files into random order -h, --help show this help text and exit Output options: -o, --output don't display the presentation, only render to .png -f, --fullscreen """+if_op(Fullscreen,"do NOT ","")+"""start in fullscreen mode -g, --geometry set window size or fullscreen resolution -A, --aspect adjust for a specific display aspect ratio (e.g. 5:4) -G, --gamma specify startup gamma and black level Page options: -i, --initialpage start with page -p, --pages only cache pages in the specified range; implicitly sets -i -w, --wrap go back to the first page after the last page -a, --auto automatically advance to next page after some seconds -O, --autooverview automatically derive page visibility on overview page -O first = show pages with captions -O last = show pages before pages with captions -Q, --autoquit quit after the last slide (no effect with --wrap) Display options: -t, --transition force a specific transitions or set of transitions -l, --listtrans print a list of available transitions and exit -F, --font use a specific TrueType font file for the OSD -S, --fontsize specify the OSD font size in pixels -C, --cursor use a .png image as the mouse cursor -L, --layout set the OSD layout (please read the documentation) -z, --zoom set zoom factor (integer number, default: 2) -x, --fade fade in at start and fade out at end --spot-radius set the initial radius of the spotlight, in pixels Timing options: -M, --minutes display time in minutes, not seconds --clock show current time instead of time elapsed -d, --duration