visionegg-1.2.1/0000755000076500000240000000000011231315557012674 5ustar astrawstaffvisionegg-1.2.1/.gitignore0000644000076500000240000000011511224565527014667 0ustar astrawstaff*.pyc *.so .installed.cfg bin build dist *~ VisionEgg.log visionegg.egg-info visionegg-1.2.1/bootstrap.py0000644000076500000240000000451411224565530015267 0ustar astrawstaff############################################################################## # # Copyright (c) 2006 Zope Corporation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## """Bootstrap a buildout-based project Simply run this script in a directory containing a buildout.cfg. The script accepts buildout command-line options, so you can use the -c option to specify an alternate configuration file. $Id$ """ import os, shutil, sys, tempfile, urllib2 tmpeggs = tempfile.mkdtemp() is_jython = sys.platform.startswith('java') try: import pkg_resources except ImportError: ez = {} exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py' ).read() in ez ez['use_setuptools'](to_dir=tmpeggs, download_delay=0) import pkg_resources if sys.platform == 'win32': def quote(c): if ' ' in c: return '"%s"' % c # work around spawn lamosity on windows else: return c else: def quote (c): return c cmd = 'from setuptools.command.easy_install import main; main()' ws = pkg_resources.working_set if is_jython: import subprocess assert subprocess.Popen([sys.executable] + ['-c', quote(cmd), '-mqNxd', quote(tmpeggs), 'zc.buildout'], env=dict(os.environ, PYTHONPATH= ws.find(pkg_resources.Requirement.parse('setuptools')).location ), ).wait() == 0 else: assert os.spawnle( os.P_WAIT, sys.executable, quote (sys.executable), '-c', quote (cmd), '-mqNxd', quote (tmpeggs), 'zc.buildout', dict(os.environ, PYTHONPATH= ws.find(pkg_resources.Requirement.parse('setuptools')).location ), ) == 0 ws.add_entry(tmpeggs) ws.require('zc.buildout') import zc.buildout.buildout zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap']) shutil.rmtree(tmpeggs) visionegg-1.2.1/build-demo-dir.py0000755000076500000240000000055711224565530016055 0ustar astrawstaffimport sys, os, glob demos = glob.glob('demo/*.py') + ['check-config.py'] + glob.glob('test/*.py') outdir = 'demo-dist' os.mkdir(outdir) os.mkdir(os.path.join(outdir,'test')) for d in demos: if d.startswith('test'): newname = os.path.join(outdir,d) else: newname = os.path.join(outdir,os.path.split(d)[-1]) print d os.link(d,newname) visionegg-1.2.1/build-win-exe-demos.py0000755000076500000240000000466711224565530017044 0ustar astrawstaff# In addition to running this script, there are additional things that # must be done to build the binary demos: # For the demos to find the font file, we modify # site-packages/VisionEgg/Text.py to include r'.\freesansbold.ttf' as # the default font. (in Text.__init__ # self.font = pygame.font.Font(r'.\freesansbold.ttf',cp.font_size) # In VisionEgg.cfg, set VISIONEGG_LOG_TO_STDERR = 0. import sys import setup # our setup.py file import distutils.core import py2exe numarray_includes=['numarray.libnumarray', 'numarray.memory', 'numarray._bytes', 'numarray._chararray', 'numarray._conv', 'numarray._converter', 'numarray._ndarray', 'numarray._numarray', 'numarray._operator', 'numarray._sort', 'numarray._ufunc', 'numarray._ufuncBool', 'numarray._ufuncComplex32', 'numarray._ufuncComplex64', 'numarray._ufuncFloat32', 'numarray._ufuncFloat64', 'numarray._ufuncInt16', 'numarray._ufuncInt32', 'numarray._ufuncInt64', 'numarray._ufuncInt8', 'numarray._ufuncUInt16', 'numarray._ufuncUInt32', 'numarray._ufuncUInt64', 'numarray._ufuncUInt8', ] tk_excludes=[ 'Tkconstants', 'Tkinter', 'tcl', ] import sys, os, glob windowed_scripts = glob.glob(r'demo\*.py') data_files = [] for d in setup.data_files: todir = d[0] source = d[1] todir = os.path.normpath(todir.replace( 'VisionEgg','.')) source = [s for s in source if not s.endswith('.py')] # don't include .py files data_files.append( (todir,source) ) # include pygame font data_files.append( ('.',[os.path.join(sys.prefix, 'lib','site-packages','pygame','freesansbold.ttf'), ])) print data_files console_scripts = ['check-config.py'] #1/0 distutils.core.setup( windows=windowed_scripts, console=console_scripts, data_files=data_files, options={"py2exe":{"optimize":2, "includes":numarray_includes, #"excludes":tk_excludes, "dll_excludes": ["glut32.dll"], },}, ) visionegg-1.2.1/buildout.cfg0000644000076500000240000000041711224565530015206 0ustar astrawstaff[buildout] parts = test python develop = . eggs = VisionEgg [test] recipe = pbp.recipe.noserunner eggs = pbp.recipe.noserunner ${buildout:eggs} working-directory = ${buildout:directory} [python] recipe = zc.recipe.egg interpreter = python eggs = ${buildout:eggs} visionegg-1.2.1/CHANGELOG.txt0000644000076500000240000003113411224565527014734 0ustar astrawstaffChanges for 1.1.2: ------------------ * Various small bugfixes and improvements: - bugfix: cast to int to prevent breaking ctypes based PyOpenGL 3 (r1506) - make default projection retain pixel coordinates by default when size changes (answers issue of Marcus Leinweber) (r1507) - support for paletted images (r1508) - use numpy instead of Numeric (r1511, r1513, r1514) - bugfix: don't auto-adjust projection if user-specified (r1512) - allow conversion of pygame surface texture to image (r1518) - allow export of texel data as numpy array. includes example (r1522) - add depth_test_enabled parameter to Rectangle3D stimulus type (r1523) - make depth_test parameter compatible with TextureStimulus3D (r1524) Changes for 1.1.1: ------------------ * Various small bugfixes and performance improvements: - Removed old CVS cruft from VisionEgg/PyroClient.py VisionEgg/PyroHelpers.py - Fix trivial documentation bugs to have the correct version number. - Workaraound pygame/SDL issue when creating Font objects. (r1491, reported by Jeremy Hill) - bugfix: allow 4D as well as 3D vectors to specify vertices (r1472, r1474) - fix comments: improve description of coordinate system transforms (r1473) - Use standard Python idiom (r1475) - Further removal of 'from blah import *' (r1476, r1501) - Minor performance improvement (r1486) - Remove unintended print statement (r1487 thanks to Jeremy Hill) - properly detect String and Unicode types (r1470, reported by Dav Clark) - update license to mention other code (r1502) Changes for 1.1: ---------------- * Explicitly require Python 2.3 by removing duplicate of Python standard library's logging module and assume the "True" and "False" are defined. There were probably other assumptions depending on 2.3 creeping into the code, as well. * Removed Lib3DS module. * Workaround PyOpenGL 3.0.0a and 3.0.0b1 bug in glLoadMatrixf(). * Fix SphereMap.AzElGrid() to properly draw iso elevation and azimuth lines at specified intervals. * Change to use numpy at the core instead of Numeric. (Require numpy, no longer require Numeric.) * Require setuptools * No longer supporting Python 2.2 * Update Textures to accept numpy arrays as data source (by Martin Spacek) * Update to work with PyOpenGL 3 * Changes so to reflect standard idioms on Python project layouts: - src/ directory renamed to VisionEgg/ (but .c files need to be moved back to src/) - use 'package_data' distutils argument This enables setuptools to work with the Vision Egg. * QuickTime movies work in Windows (need to check on OS X). * FilledCircle stimulus is now anti-aliased. Thanks to Peter Jurica and Gijs Plomp. * Added demo/texture3D_alpha.py Changes for 1.0: ---------------- * Major enhancements to the ephys server/GUI code to use normal (or slightly modified) demo scripts in this environment were done by Imran Ali and Lachlan Dowd in the lab of David O'Carroll at the University of Adelaide. * An initial patch for stereo support sent by Yuichi Sakano and Kevin J. MacKenzie at York University. * Parallel port enhancements by Hubertus Becker, University of Tübingen. * Arrow and FilledCircle stimuli by Hubertus Becker, University of Tübingen. * DaqKeyboard and ResponseControl by Hubertus Becker, University of Tübingen. * Full screen anti-aliasing support (FSAA) by Mark Halko, Boston University. * Various patches by Tony Arkles (University of Saskatchewan), including a suggestion to separate camera motions from the GL_PROJECTION matrix and put them in the GL_MODELVIEW matrix, where they belong. * Patch for VISIONEGG_SYSTEM_DIR by Nick Knouf, MIT. * Added win32_vretrace.WaitForRetrace() (but it's not used for much, yet) * Enhancements to EPhys Server/GUI sequencer * Added 'lat-long rectangle' to available 3D masking windows * Moved controller.CONSTANTS into FlowControl module namespace * Numerous bugfixes Changes for 0.9.9: ------------------ Screen.put_pixels() method for "blitting" of raw pixel data Support for QuickTime movies (currently Mac OS X only) Redesign of type check system for accuracy and clarity TrueType font rendering with SDL_ttf2 Textures with alpha--bugfixes and examples Positioning of viewports and 2D stimuli can use relative positioning anchors Now requires Python 2.2 -- new style classes used to restrict attribute acccess Now requires pygame 1.5 Renamed timing_func() to time_func() EPhysGUI saves absolute time a trial was started (to recontruct all stimuli) Allow use of pygame Surfaces as source of texture data Mipmaps of sphere-mapped sinusoidal grating to prevent spatial aliasing De-emphasis on Presentation and Controller classes (moved to FlowControl module) Changed orientations such that 0 degrees is right and 90 degrees is up. Bugfix in SphereMap module -- gaussian formula produced windows too wide by 2/sqrt(2) Allow conversion of 3D vertices into 2D screen coordinates Added wireframe azimuth/elevation grid with text labels Allow arbitrary orientation of textures and text with angle parameter FrameTimer class now available for use in your own main loops Use Python 2.3 logging module (copy included for use with Python 2.2) No installation of demos or documentation (get source or demo package) Improved docstrings by using automatic docstring generation Many small enhancements and bugfixes New tests: high-voltage regulation test for displays (Brainard et al., 2002) incomplete DC restoration test for displays (Brainard et al., 2002) unit-test suite: among many other things, pixel accuracy of textures New demos: mpeg.py plays MPEG movies quicktime.py plays QuickTime movies (currently Mac OS X only) convert3d_to_2d.py converts 3D positions to 2D positions dots_simple_loop.py uses own loop rather than Presentation class makeMovie2.py makes a movie with get_framebuffer_as_image() function mouse_gabor_2d.py shows a gabor wavelet under mouse and keyboard control mouse_gabor_perspective.py is sphereGratingWindowed.py improved and renamed mouseTarget_user_loop.py uses own loop rather than Presentation class multi_stim.py shows many stimuli at once Changes for 0.9.4: ------------------ Major features: Complete electrophysiology application (see below) Luminance and color calibration possible Constant visual angle (perspective-distorted) grating stimulus added Constant visual angle (perspective-distorted) gaussian and circular windows added 3D texture-mapped sphere stimulus added Random dot stimulus added Texture module re-written for ease-of-use, clarity, and support of dynamic texture updating Color grating stimulus added Support for plaids added Masks for gratings and textures implemented using multitexturing - uses high bit depth available there on some hardware Vision Egg Programmer's Manual created Many more minor features and bug fixes New electrophysiology application features: Complete application with ready-to-run experiments Application extendible with new experiments by modifying example experiments Full-screen graphics possible with "server" application, GUI client controls experiments over TCP Automated sequence control, including sequences-of-sequences Stimulus onset timing calibration / verification support 3D position / perspective-distortion calibration support Parameters saved during experiments as Python or Matlab scripts Complete configurations can be saved and restored from file All code written for the 0.9.3 release should continue to run on the 0.9.4 release. (There may be some slight changes in functionality due to bug fixes.) Changes for 0.9.3: ------------------ MAJOR: Added .3ds file support to load 3D models. MAJOR: Added Labview code to control gratings in a new "contrib" package. Thanks Jamie Theobald! Fixed texture-resizing bug. Added Rectangle3D stimulus class. Further refined log printing and other small enhancements. Changes for 0.9.2: ------------------ MAJOR: GUI enhancements. Maximum priority (with various options) can be set on Mac OS X and win32. Frame swap sync with vertical retrace support added to Mac OS X. Friendly binary installer for Mac OS X, especially useful since now Mac OS X code requires compilation. Added SYNC_SWAP, RECORD_TIMES, HIDE_MOUSE, and FRAMELESS_WINDOW options. Textures now use mipmaps by default. Minor: Improvements to check-config.py Changes for 0.9.1: ------------------ Windows demos now distributed in standalone directory that does not require python installation. TCPServer mode can print current state, prints command summary, has help, minor bugfixes. Lots of little GUI adjustments, including automatic pop-up of exception dialog box. check-config.py detects old version. Changes for 0.9.0: ------------------ MAJOR: Overall quality of code and base feature set now approaching 1.0 status. MAJOR: Parameter control over TCP interface implemented using TCPController class. MAJOR: Triggering, both out and in, (re)implemented. Same for other data acquisition. MAJOR: Gratings module, with SinGrating2D and SinGrating3D (with perspective distortion) added. MAJOR: Support for SGI IRIX now added. MAJOR: Support for variable size (including 10 bits per channel) frame buffers added. MAJOR: Support for gamma table setting (including greater than 8 bit) added. (Requires pygame 1.5.) MAJOR: ``Run forever'' mode added. MAJOR: Type-checking implemented for parameters under realtime control. Complete re-design and re-implementation of realtime controllers. MINOR: Too many to list! Changed license to LGPL from GPL. Changes for 0.8.2: ------------------ MAJOR: Added frame-by-frame control with realtime_frame_contoller. (Also renamed realtime_controller to realtime_time_controller.) Make sure you set your OpenGL driver to swap buffers at vertical retrace sync if you use this feature! Added support for on-screen text though VisionEgg.Text module. Bitmapped text works pretty well, stroke fonts have a few issues still. Must specify units for stimulus duration, either seconds or frames. Created new module PlatformDependent, which houses all the platform dependent C code. Re-enabled setting of maximum priority (on linux, at least). Made lower_left and size attributes of Viewport class part of parameters, so now they can be changed in realtime. Added automatic detection of all extensions in tests/opengl_info.py. Removed data acquisition stuff from distribution until I get time to get it working again. Re-incorporated linux (and other unix?) kernel scheduler maximum priority stuff. Re-incorporated collection and printing of frame-timing statistics. Turn on by setting "collect_timing_info" argument of Presentation.go() to non-zero value. Contrast control in SpinningDrum now acheived with standard OpenGL texture environment functions, not OpenGL extension. Changes for 0.8.1: ------------------ Fixed some Mac OS X glitches. Removed Overlay class from VisionEgg.Core. (The Overlay class was the same as the Stimulus class with the inclusion of its own projection. Now, if your stimulus has an associated projection, as 2D stimuli would, you must keep track of that yourself.) Support for specifying the order in which stimuli are drawn added by draw_order argument to the add_stimulus method of the Viewport class. (Necessary to ensure any graphics that must get drawn on top of everything else can be drawn last.) Added remove_stimulus method to Viewport class. Added remove controller methods to Presentation class. Improved auto-setting of video modes. Added GetKeypressDialog and ToplevelDialog classes to GUI module. Changes for 0.8.0: ------------------ MAJOR: Implemented new Screen, Viewport, Stimulus, Overlay, and Presentation classes in VisionEgg.Core to more cleanly separate components and allow multiple viewports on same screen. MAJOR: Implemented new Parameters class in VisionEgg.Core to allow more flexible control of any parameters which may change during or between stimulus presentations. This paves the way for easy control using any imaginable means, including a local window, a remote python script (see below about Pyro), or from a data-acquisition card. MAJOR: Added remote execution methods, so now you can run the VisionEgg in fullscreen mode while controlling it from a different computer. Check out the the demos in the demo/Pyro directory. Requires python package "Pyro" (Python Remote Objects). New configuration system added. VisionEgg.config holds system-wide configuration defaults. Changed VisionEgg.py to Core.py, so now you must do "import VisionEgg.Core". Moved demo scripts into 'demo' directory within the main package. Now there is only one package to maintain. Pulled texture stuff into Textures.py. Pulled data acquisition stuff into Daq.py Added lots of docstrings. Created this changelog. visionegg-1.2.1/check-config.py0000755000076500000240000002514211224565530015575 0ustar astrawstaff#!/usr/bin/env python """check-config.py -- VisionEgg configuration check Run this program first to check the installation status or version number of the Vision Egg. """ import sys, string, os, traceback # Mac OS X weirdness: gui_ok = 1 print "check-config.py for Vision Egg 1.0" print "[%s CVS revision %s]"%(__date__,__cvs__) print "Beginning configuration check." if sys.platform == 'darwin': try: if not os.path.isabs(sys.argv[0]): print """Mac OS X - It appears you are running this script from the commandline -- turning off GUIs.""" gui_ok = 0 except Exception, x: raise print # sys.stdout and sys.stderr hard to see: if sys.platform in ['darwin','mac','win32'] and gui_ok: try: import Tkinter class showwarning(Tkinter.Frame): def format_string(self,in_str): min_line_length = 65 in_list = string.split(in_str) out_str = "" cur_line = "" for word in in_list: cur_line = cur_line + word + " " if len(cur_line) > min_line_length: out_str = out_str + cur_line[:-1] + "\n" cur_line = "" out_str = out_str + cur_line return out_str def close_window(self,dummy_arg=None): #self.destroy() self.winfo_toplevel().destroy() def __init__(self,title="Vision Egg Warning",message=None): Tkinter.Frame.__init__(self,borderwidth=20) #self.focus_force() self.pack() self.winfo_toplevel().title(title) Tkinter.Label(self,text=self.format_string(message)).pack() b = Tkinter.Button(self,text="OK",command=self.close_window) b.pack() b.focus_force() b.bind('',self.close_window) self.mainloop() if sys.platform == 'darwin': add_str = """ To see this information, switch to the Terminal window that should have opened when you launched this program.""" elif sys.platform == 'win32': add_str = """ After this script has finished, a second GUI window will appear. Until the second window is closed, the console will be available for viewing.""" else: add_str = """ Information specific to your platform has not been written yet.""" showwarning(title="Conole location warning", message= """This script displays information on the console, which is not readily visible on this platform."""+add_str) except: print "(Failed to open dialog box-- is Tkinter installed?)" # Import unknown_import_fail = 0 import ConfigParser # If this line fails, you have an old version of Python. try: import VisionEgg except ImportError: print """Could not import the VisionEgg module. This is probably because it is not yet installed. Try installing by running 'python setup.py install' from the command line (as root if necessary). The exception raised was:""" traceback.print_exc() except AttributeError, x: if str(x) != "'module' object has no attribute 'release_name'": unknown_import_fail = 1 traceback.print_exc() else: try: def my_import(name): mod = __import__(name) components = string.split(name, '.') for comp in components[1:]: mod = getattr(mod, comp) return mod mod = my_import("VisionEgg.VisionEgg") if mod.__name__ == "VisionEgg.VisionEgg": print """********************************************************** YOU APPEAR TO HAVE AN OLD COPY OF THE VISION EGG INSTALLED Please remove the old installation directory and re-install. The old installation directory is %s **********************************************************"""%(os.path.abspath(os.path.dirname(mod.__file__)),) else: unknown_import_fail = 1 traceback.print_exc() except: unknown_import_fail = 1 traceback.print_exc() except (ConfigParser.MissingSectionHeaderError, ConfigParser.NoSectionError): print """********************************************************** YOU APPEAR TO HAVE AN OLD OR BROKEN COPY "VisionEgg.cfg" INSTALLED Please remove or rename the the file at the location specified above and re-install. The file name and location should be printed above. **********************************************************""" except: unknown_import_fail = 1 traceback.print_exc() if unknown_import_fail: print """********************************************************** Could not import the VisionEgg module for an unknown reason. See the traceback printed above. **********************************************************""" # Finally, do it! if 'VisionEgg' in globals().keys(): print "VisionEgg version %s"%(VisionEgg.release_name,) print print "VisionEgg modules in %s"%(os.path.split(os.path.abspath(VisionEgg.__file__))[0],) print "VisionEgg system directory %s"%(VisionEgg.config.VISIONEGG_SYSTEM_DIR,) print "VisionEgg user directory %s"%(VisionEgg.config.VISIONEGG_USER_DIR,) print if VisionEgg.config.VISIONEGG_CONFIG_FILE: print "Config file found at %s"%(VisionEgg.config.VISIONEGG_CONFIG_FILE,) else: configuration_src = '' try: import VisionEgg.Configuration configuration_src = VisionEgg.Configuration.__file__ except: pass print "No config file found, using defaults from file %s"%(configuration_src,) print for configname in dir(VisionEgg.config): if not configname.startswith('_'): print configname + " = " + str(getattr(VisionEgg.config,configname)) print # Check for old demo install location if sys.executable != sys.argv[0]: # Not running as binary executable in own demo directory old_demo_install_dir = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,'demo') if os.path.isdir(old_demo_install_dir): print """ ************************************************************ WARNING: You have the old Vision Egg demos in %(old_demo_install_dir)s Although the old demos will not cause problems for Vision Egg scripts, they may lead to confusion. Therefore, you should remove this directory and its contents. The new demos (and documentation) are no longer installed, but available with the source code or as a separate package. ************************************************************ """%locals() # These things have been removed from the installed library directory. # Print error if it's still around ancient_VisionEgg_files = ['AppHelper.py', # old module 'AppHelper.pyo', # old module 'AppHelper.pyc', # old module 'demo', # old install location 'test', # old install location ] try: files_installed = os.listdir(os.path.dirname(VisionEgg.__file__)) except: files_installed = [] ancient_files = [] for filename in ancient_VisionEgg_files: if filename in files_installed: ancient_files.append(filename) if len(ancient_files): print """ ************************************************************ WARNING: The following files were found in your VisionEgg library directory: %s The library directory is %s These files are from old installations of the Vision Egg. Although they will not cause problems unless your scripts import them, they may lead to confusion. ************************************************************ """%(string.join(ancient_files),os.path.abspath(os.path.dirname(VisionEgg.__file__))) else: print "VisionEgg not installed (or other VisionEgg import problems)" print print "Continuing with prerequisites check." print print "Version checklist:" print print "Python version %s"%(string.split(sys.version)[0],), if sys.version >= '2.3': print "(OK)" else: print "(Unsupported, probably won't work)" print "extra Python info:",string.join(string.split(sys.version)[1:]) try: import numpy print "numpy version %s"%(numpy.__version__,), if numpy.__version__ >= '1.0': print "(OK)" else: print "(Untested)" except: print "numpy failed" try: import OpenGL print 'PyOpenGL (package "OpenGL") version %s'%(OpenGL.__version__,), if OpenGL.__version__ >= '2.0': # 2.x is OK print "(OK)" else: print "(WILL FAIL)" except: print 'PyOpenGL (package "OpenGL") failed' try: import pygame.version print "pygame version %s"%(pygame.version.ver,), if pygame.version.ver >= '1.5.3': print "(OK)" else: print "(Unsupported, probably won't work)" except Exception, x: print "pygame failed:",str(x.__class__),str(x) try: import Image # PIL print 'Python Imaging Library (package "Image") version %s'%(Image.VERSION,), if Image.VERSION >= '1.1.2': print "(OK)" else: print "(Untested)" except: print 'Python Imaging Library (package "Image") failed' print print "Optional module(s):" print try: import Pyro.core print "Pyro version %s"%(Pyro.core.constants.VERSION,), if Pyro.core.constants.VERSION >= '2.7': print "(OK)" else: print "(Untested)" except: print "Pyro failed" if sys.platform == 'win32': try: import winioport print "winioport", try: winioport.out(0x378,0) print "(appears to work)" except: print "(not working)" except: print "winioport failed" if gui_ok and sys.platform == 'win32': showwarning(title="View the console", message= """This dialog keeps the console open until you close it. Although by default the Vision Egg prints everything (including errors) to VisionEgg.log, it may be necessary to view the console. In that case, you have to run the script from the command line so that the console does not disappear when the program is finished executing.""") visionegg-1.2.1/demo/0000755000076500000240000000000011231315556013617 5ustar astrawstaffvisionegg-1.2.1/demo/alpha_texture.py0000644000076500000240000000526311224565530017045 0ustar astrawstaff#!/usr/bin/env python """ Textures with alpha (transparency). """ import VisionEgg as ve ve.start_default_logging(); ve.watch_exceptions() import VisionEgg.Core as vec from VisionEgg.FlowControl import Presentation import VisionEgg.Textures as vet import Image, ImageDraw # Python Imaging Library (PIL) import OpenGL.GL as gl # PyOpenGL import os import numpy # Numeric screen = vec.get_default_screen() texel_scale = 5 # create background texture from image file bg_filename = os.path.join(ve.config.VISIONEGG_SYSTEM_DIR,"data","panorama.jpg") bg_texture = vet.Texture(bg_filename) bg = vet.TextureStimulus(texture = bg_texture, size = bg_texture.size, shrink_texture_ok=False, mipmaps_enabled=False, ) # create alpha texture from numpy numpy_size = (50,50,4) numpy_data = numpy.ones(numpy_size,dtype=numpy.float)*1.0 # white numpy_data[:,:,3] = numpy.random.uniform(0.0,1.0,size=(numpy_size[:2])) # random alpha numpy_texture = vet.Texture(numpy_data) numpy_stim = vet.TextureStimulus(texture=numpy_texture, internal_format = gl.GL_RGBA, position = (10,10), mipmaps_enabled=0, size=(numpy_size[0]*texel_scale,numpy_size[1]*texel_scale), texture_min_filter=gl.GL_NEAREST, texture_mag_filter=gl.GL_NEAREST, ) # create alpha texture from Image im_size = (50*texel_scale,50*texel_scale) im_texels = Image.new("RGBA",im_size,(0,0,0,0)) # transparent im_draw = ImageDraw.Draw(im_texels) im_draw.ellipse((0,0) + im_size, fill=(255,255,255,255)) # opaque circle r,g,b,a = im_texels.split() # get individual bands (we only use alpha below) im_draw.rectangle((0,0) + (im_size[0]/2,im_size[1]), fill=(255,255,255,255)) # white im_draw.rectangle((im_size[0]/2,0) + (im_size[0],im_size[1]), fill=(0,0,0,255)) # white im_texels.putalpha(a) im_texture = vet.Texture(im_texels) im_stim = vet.TextureStimulus(texture=im_texture, internal_format = gl.GL_RGBA, position = (20+numpy_size[0]*texel_scale,10), mipmaps_enabled=0, size=(im_size[0],im_size[1]), texture_min_filter=gl.GL_NEAREST, texture_mag_filter=gl.GL_NEAREST, ) viewport = vec.Viewport(screen=screen, stimuli=[bg,numpy_stim,im_stim]) p = vec.Presentation(go_duration=(5.0,'seconds'), viewports=[viewport]) p.go() visionegg-1.2.1/demo/az_el_grid.py0000644000076500000240000000257711224565530016304 0ustar astrawstaff#!/usr/bin/env python """Azimuth and elevation grid""" from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.SphereMap import * from VisionEgg.Textures import * import math, os import numpy numpy.seterr(all='raise') def projection_matrix_f(t): # This bit of code is from the "movingPOV" demo and can be used to # gain a moving external view of the texture-mapped sphere by # uncommenting the appropriate line below. projection = SimplePerspectiveProjection(fov_x=55.0,aspect_ratio=(screen.size[0]/2.)/screen.size[1]) eye = (0.0,t*0.3+1.0,-2.0) camera_look_at = (0.0,0.0,0.0) camera_up = (0.0,1.0,0.0) projection.look_at( eye, camera_look_at, camera_up) return projection.get_matrix() screen = get_default_screen() screen.parameters.bgcolor = (1.0,1.0,1.0,1.0) projection = SimplePerspectiveProjection(fov_x=90.0) text_viewport = Viewport(screen=screen) stimulus = AzElGrid() viewport = Viewport(screen=screen, projection=projection, stimuli=[stimulus]) stimulus.parameters.my_viewport = viewport # set afterwards p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport])#,text_viewport]) #p.add_controller(projection,'matrix', FunctionController(during_go_func=projection_matrix_f)) p.go() visionegg-1.2.1/demo/color_grating.py0000755000076500000240000000524611224565530017035 0ustar astrawstaff#!/usr/bin/env python """Colored sine wave grating in circular mask""" ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Gratings import SinGrating2D from VisionEgg.Textures import Mask2D from math import * ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() ###################################### # Create sinusoidal grating object # ###################################### mask = Mask2D(function='circle', # also supports 'circle' radius_parameter=100, # sigma for gaussian, radius for circle (units: num_samples) num_samples=(256,256)) # this many texture elements in mask (covers whole size specified below) # NOTE: I am not a color scientist, and I am not familiar with the # needs of color scientists. Color interpolation is currently done in # RGB space, but I assume there are other interpolation methods that # people may want. Please submit any suggestions. stimulus = SinGrating2D(color1 = (0.5, 0.25, 0.5), # RGB (alpha ignored if given) color2 = (1.0, 0.5, 0.1), # RGB (alpha ignored if given) contrast = 0.2, pedestal = 0.1, mask = mask, # optional position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), anchor = 'center', size = ( 300.0 , 300.0 ), spatial_freq = 20.0 / screen.size[0], # units of cycles/pixel temporal_freq_hz = 1.0, orientation = 270.0 ) def pedestal_func(t): # Calculate pedestal over time. (Pedestal range [0.1,0.9] and # contrast = 0.2 limits total range to [0.0,1.0]) temporal_freq_hz = 0.2 return 0.4 * sin(t*2*pi * temporal_freq_hz) + 0.5 ############################################################### # Create viewport - intermediary between stimuli and screen # ############################################################### viewport = Viewport( screen=screen, stimuli=[stimulus] ) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport]) p.add_controller(stimulus,'pedestal',FunctionController(during_go_func=pedestal_func)) p.go() visionegg-1.2.1/demo/convert3d_to_2d.py0000644000076500000240000000504411224565530017173 0ustar astrawstaff#!/usr/bin/env python """Convert 3D position to 2D position""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Text import * from VisionEgg.Textures import * screen = get_default_screen() screen.parameters.bgcolor = 0.0, 0.0, 0.0 # background black l = -0.1 r = 0.5 t = 0.3 b = 0 z = 0 vertices = [(l,b,z), (r,b,z), (l,t,z), (r,t,z)] # Get a texture filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","visionegg.bmp") texture = Texture(filename) rect = TextureStimulus3D(texture=texture, lowerleft=vertices[0], lowerright=vertices[1], upperleft=vertices[2], upperright=vertices[3], ) viewport2D = Viewport(screen=screen) camera_matrix = ModelView() def update(t): new_camera_matrix = ModelView() new_camera_matrix.stateless_translate(0,0,-1) new_camera_matrix.stateless_rotate(36.0*t,0.0,1.0,0) camera_matrix.parameters.matrix = new_camera_matrix.get_matrix() eye_coords = camera_matrix.apply_to_vertices( vertices ) for i in range(len(vertex_labels)): text = vertex_labels[i] eye_coord_vertex = eye_coords[i] window_coords = viewport3D.eye_2_window(eye_coord_vertex) # eye to window text.parameters.text='<- %.1f, %.1f'%(window_coords[0],window_coords[1]) text.parameters.position = window_coords[0],window_coords[1] viewport3D = Viewport( screen=screen, projection=SimplePerspectiveProjection(fov_x=90.0), camera_matrix=camera_matrix, stimuli=[rect]) vertex_labels = [] for vertex in vertices: vertex_labels.append( Text(text='temporary text', anchor='left', ) ) other_text = [] other_text.append( Text(text='Pixel positions (x,y) calculated from 3D coordinates', position=(screen.size[0]/2,screen.size[1]), anchor='top', ) ) other_text.append( Text(text='----> x', position=(10,10), anchor='left', ) ) other_text.append( Text(text='----> y', angle=90.0, position=(10,10), anchor='left', ) ) viewport2D.parameters.stimuli = vertex_labels + other_text p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport3D,viewport2D]) p.add_controller(None, None, FunctionController(during_go_func=update)) p.go() visionegg-1.2.1/demo/daq/0000755000076500000240000000000011231315556014364 5ustar astrawstaffvisionegg-1.2.1/demo/daq/simple_lpt_out.py0000644000076500000240000000057311224565530020003 0ustar astrawstaff"""very simple example of using the parallel port""" from VisionEgg.DaqLPT import raw_lpt_module import time LPT1 = 0x378 # address of parallel port -- make sure your computer agrees # turn all pins on data = 0xFF # values to output on parallel port raw_lpt_module.out(LPT1,data) time.sleep(1.0) # wait 1 second # turn all pins off data = 0x00 raw_lpt_module.out(LPT1,data) visionegg-1.2.1/demo/daq/trigger_in.py0000644000076500000240000000267611224565530017103 0ustar astrawstaff#!/usr/bin/env python """Use an external device to trigger the Vision Egg.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, ConstantController from VisionEgg.Gratings import * import VisionEgg.Daq from VisionEgg.DaqLPT import * # Normal stuff (from grating demo): screen = get_default_screen() stimulus = SinGrating2D(on = 0, # turn grating is off when not in go loop position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), anchor = 'center', size = ( 300.0 , 300.0 ), spatial_freq = 10.0 / screen.size[0], temporal_freq_hz = 5.0, orientation = 45.0 ) viewport = Viewport( screen=screen, stimuli=[stimulus] ) p = Presentation(go_duration=(5.0,'seconds'), trigger_go_if_armed=0, # wait for trigger viewports=[viewport]) # Stimulus on controller stimulus_on_controller = ConstantController(during_go_value=1,between_go_value=0) # Create a trigger input controller trigger_in_controller = LPTTriggerInController() # Add the trigger output controller to the presentation's list of controllers p.add_controller(stimulus,'on',stimulus_on_controller) p.add_controller(p,'trigger_go_if_armed',trigger_in_controller) # Go! p.go() visionegg-1.2.1/demo/daq/trigger_out.py0000755000076500000240000000216011224565530017273 0ustar astrawstaff#!/usr/bin/env python """Use the Vision Egg to trigger an external device.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Gratings import * import VisionEgg.Daq from VisionEgg.DaqLPT import * # Normal stuff (from grating demo): screen = get_default_screen() stimulus = SinGrating2D(position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), anchor = 'center', size = ( 300.0 , 300.0 ), spatial_freq = 10.0 / screen.size[0], # units of cycles/pixel temporal_freq_hz = 5.0, orientation = 45.0 ) viewport = Viewport( screen=screen, stimuli=[stimulus] ) p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) # Create a trigger output controller trigger_out_controller = LPTTriggerOutController() # Add the trigger output controller to the presentation's list of controllers p.add_controller(None,None,trigger_out_controller) # Go! p.go() visionegg-1.2.1/demo/demo_arrow.py0000644000076500000240000000317611224565530016337 0ustar astrawstaff#!/usr/bin/env python """Demo for the arrow stimulus.""" # Author(s): Hubertus Becker # Copyright: (C) 2004-2005 by Hertie Institute for Clinical Brain Research, # Department of Cognitive Neurology, University of Tuebingen # URL: http://www.hubertus-becker.de/resources/visionegg/ # $Revision$ $Date$ ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.MoreStimuli import * ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,0.0,0.0) # Make it black (RGBA) ###################################### # Arrow stimulus # ###################################### stimulus = Arrow( anchor = 'center', position = (screen.size[0]/2.0, screen.size[1]/2.0), size = (64.0, 16.0), color = (1.0, 1.0, 1.0, 1.0), # Draw it in white (RGBA) orientation = 0.0 # Right ) ############################################################### # Create viewport - intermediary between stimuli and screen # ############################################################### viewport = Viewport( screen=screen, stimuli=[stimulus] ) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(5.0, 'seconds'), viewports=[viewport]) p.go() visionegg-1.2.1/demo/demo_fixationpoint.py0000644000076500000240000000310011224565530020063 0ustar astrawstaff#!/usr/bin/env python """Demo for the fixation point stimulus.""" # Author(s): Hubertus Becker # Copyright: (C) 2004-2005 by Hertie Institute for Clinical Brain Research, # Department of Cognitive Neurology, University of Tuebingen # URL: http://www.hubertus-becker.de/resources/visionegg/ # $Revision$ $Date$ ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.MoreStimuli import * ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,0.0,0.0) # make it black (RGBA) ###################################### # Create fixation point stimulus # ###################################### stimulus = FilledCircle( anchor = 'center', position = (screen.size[0]/2.0, screen.size[1]/2.0), radius = 5.0, color = (255, 0, 0) # Draw it in red ) ############################################################### # Create viewport - intermediary between stimuli and screen # ############################################################### viewport = Viewport( screen=screen, stimuli=[stimulus] ) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(5.0, 'seconds'), viewports=[viewport]) p.go() visionegg-1.2.1/demo/demo_keyboardresponse.py0000644000076500000240000000534411231304066020554 0ustar astrawstaff#!/usr/bin/env python """Demo for the keyboard response controller class.""" # Author(s): Hubertus Becker # Copyright: (C) 2005 by Hertie Institute for Clinical Brain Research, # Department of Cognitive Neurology, University of Tuebingen # URL: http://www.hubertus-becker.de/resources/visionegg/ # $Revision$ $Date$ ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Dots import * import pygame import VisionEgg.Daq from VisionEgg.ResponseControl import * ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,0.0,0.0) # make black (RGBA) ###################################### # Create random dot stimulus # ###################################### stimulus = DotArea2D( position = (screen.size[0]/2.0, screen.size[1]/2.0), anchor = 'center', size = (300.0 , 300.0), signal_fraction = 0.1, signal_direction_deg = 180.0, velocity_pixels_per_sec = 10.0, dot_lifespan_sec = 5.0, dot_size = 3.0, num_dots = 100 ) ############################################################### # Create viewport - intermediary between stimuli and screen # ############################################################### viewport = Viewport(screen=screen, stimuli=[stimulus]) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(5.0,'seconds'), viewports=[viewport]) ############################################## # Connect the controller with the stimulus # ############################################## keyboard_response = KeyboardResponseController() # Add the keyboard controller to the presentation's list of controllers p.add_controller(None, None, keyboard_response) ######## # Go # ######## for i in range(3): p.go() # Print responses collected during the presentation # print "all =",keyboard_response.get_responses_since_go() # print "all_time =",keyboard_response.get_time_responses_since_go() print "first =",keyboard_response.get_first_response_since_go() print "first_time=",keyboard_response.get_time_first_response_since_go() # print "last =",keyboard_response.get_last_response_since_go() # print "last_time =",keyboard_response.get_time_last_response_since_go() # sleep(1) # Sleep for 1 second visionegg-1.2.1/demo/demo_keyboardtrigger.py0000644000076500000240000000334411224565530020366 0ustar astrawstaff#!/usr/bin/env python """Use the keyboard to trigger the Vision Egg.""" # Author(s): Hubertus Becker # Copyright: (C) 2005 by Hertie Institute for Clinical Brain Research, # Department of Cognitive Neurology, University of Tuebingen # URL: http://www.hubertus-becker.de/resources/visionegg/ # $Revision$ $Date$ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, ConstantController from VisionEgg.Gratings import * import VisionEgg.Daq from VisionEgg.DaqKeyboard import * import pygame # Normal stuff (from grating demo): screen = get_default_screen() stimulus = SinGrating2D( on = 0, # turn grating is off when not in go loop position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), anchor = 'center', size = ( 300.0 , 300.0 ), spatial_freq = 10.0 / screen.size[0], temporal_freq_hz = 5.0, orientation = 45.0 ) viewport = Viewport( screen=screen, stimuli=[stimulus] ) p = Presentation( go_duration=(5.0,'seconds'), trigger_go_if_armed=0, # wait for trigger viewports=[viewport] ) # Stimulus on controller stimulus_on_controller = ConstantController(during_go_value=1,between_go_value=0) # Create a trigger input controller trigger_in_controller = KeyboardTriggerInController() # Default is key '1' #trigger_in_controller = KeyboardTriggerInController(pygame.locals.K_2) # Use '2' # Add the trigger output controller to the presentation's list of controllers p.add_controller(stimulus,'on',stimulus_on_controller) p.add_controller(p,'trigger_go_if_armed',trigger_in_controller) # Go! p.go() p.go() p.go() visionegg-1.2.1/demo/displayText.py0000755000076500000240000000140711224565530016511 0ustar astrawstaff#!/usr/bin/env python """Display text strings.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import get_default_screen, Viewport from VisionEgg.FlowControl import Presentation from VisionEgg.Text import Text screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,1.0) # background blue (RGB) text = Text(text="Hello world!", color=(1.0,1.0,1.0), # alpha is ignored (set with max_alpha_param) position=(screen.size[0]/2,screen.size[1]/2), font_size=50, anchor='center') viewport = Viewport(screen=screen, size=screen.size, stimuli=[text]) p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) p.go() visionegg-1.2.1/demo/displayUnicode.py0000644000076500000240000000625511224565530017156 0ustar astrawstaff#!/usr/bin/env python # -*- coding: UTF-8 -*- """Display unicode text strings.""" # data from http://www.columbia.edu/kermit/utf8.html phrases = {'English': u"I can eat glass and it doesn't hurt me.", 'Sanskrit': u"कà¤à¤šà¤‚ à¤ĥकàà¤¨à‹à¤àà¤Żà¤¤àà¤¤àà¤à ठनà‹à¤Şà¤ıà¤żà¤¨à¤¸àà¤¤à¤ż à¤à¤à¤à à", 'Sanskrit (standard transcription)': u"kācaáıƒ Ċ›aknomyattum; nopahinasti mām.", 'Classical Greek': u"ὕÎħÎğÎżÎ½ ϕÎħÎ³Îµáż–Î½ δá½ğνÎħÎĵÎħÎı· Ï„ÎżáżĤÏ„Îż Îżá½” Îĵε βÎğá½ħπτεÎı.", 'Greek': u"ÎœÏ€ÎżÏÏŽ νÎħ φÎĴω σπÎħσÎĵένÎħ γυÎħÎğÎıÎĴ Ï‡Ï‰ÏÎŻÏ‚ νÎħ πÎĴθω Ï„ÎŻÏ€ÎżÏ„Îħ.", 'Thai': u"ฉà¸ħนกินกระจกàı„ดàı‰ àıà¸•àıˆà¸Ħà¸ħนàı„à¸Ħàıˆà¸—ำàıƒà¸Ğàı‰à¸‰à¸ħนàı€à¸ˆàı‡à¸š", 'Chinese': u"ĉˆ‘能ċžä¸‹çŽğ璃而不äĵ¤èşĞ体", 'Chinese (Traditional)': u"ĉˆ‘能ċžä¸‹çŽğ璃而不ċ‚·èşĞéĞ”", 'Japanese': u"私Ż‚Ĵƒİ‚ı‚’食ı‚‰‚Œ™€‚‚ŒŻç§‚’ċ‚·¤‘›‚“€‚", 'Korean': u"나는 유ëĤĴëĵ ë¨ı을 수 있어요. 그래도 아프지 않아요", 'Arabic': u"Ĝ£Ù†Ĝ§ قĜ§ĜŻĜħ Ĝıلى Ĝ£ÙƒÙ„ Ĝ§Ù„Ĝ²ĜĴĜ§ĜĴ و هĜ°Ĝ§ لĜ§ يĜ¤Ù„مني.", 'Hebrew': u"אני יכול לאכול זכוכית וזה לא מזיק לי.", } # collect above data into 2 sequences: language, phrase = zip(*[item for item in phrases.iteritems()]) import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Text import * import pygame from pygame.locals import * screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,1.0) # background blue (RGB) if sys.platform == 'win32': font_name = r'C:\Windows\Fonts\Arial.ttf' else: font_name = '/usr/share/fonts/truetype/Arial.ttf' if not os.path.exists(font_name): print 'WARNING: font_name "%s" does not exist, using default font'%font_name font_name = None text = Text(color=(1.0,1.0,1.0), # alpha is ignored (set with max_alpha_param) position=(screen.size[0]/2,screen.size[1]/2), ignore_size_parameter=False, # ignore font size (use texture size) size = (screen.size[0],max(screen.size[0]/10,10)), anchor='center', font_name=font_name) viewport = Viewport(screen=screen, size=screen.size, stimuli=[text]) # The main loop below is an alternative to using the # VisionEgg.FlowControl.Presentation class. frame_timer = FrameTimer() quit_now = 0 while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = 1 idx = int(VisionEgg.time_func()%len(language)) text.parameters.text = "%s: %s"%(language[idx],phrase[idx]) screen.clear() viewport.draw() swap_buffers() frame_timer.tick() frame_timer.log_histogram() visionegg-1.2.1/demo/dots.py0000755000076500000240000000321711224565530015151 0ustar astrawstaff#!/usr/bin/env python """Random dot stimulus""" ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import get_default_screen, Viewport from VisionEgg.FlowControl import Presentation from VisionEgg.Dots import DotArea2D ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,0.0,0.0) # make black (RGBA) ###################################### # Create random dot stimulus # ###################################### stimulus = DotArea2D( position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), anchor = 'center', size = ( 300.0 , 300.0 ), signal_fraction = 0.1, signal_direction_deg = 180.0, velocity_pixels_per_sec = 10.0, dot_lifespan_sec = 5.0, dot_size = 3.0, num_dots = 100) ############################################################### # Create viewport - intermediary between stimuli and screen # ############################################################### viewport = Viewport( screen=screen, stimuli=[stimulus] ) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport]) p.go() visionegg-1.2.1/demo/dots_pyro_client.py0000644000076500000240000000172111231305027017542 0ustar astrawstaff#!/usr/bin/env python """Contact the server run by dots_pyro_server and modulate the display """ import time import Pyro.core Pyro.config.PYRO_MULTITHREADED = 0 Pyro.config.PYRO_TRACELEVEL = 3 Pyro.config.PYRO_USER_TRACELEVEL = 3 Pyro.config.PYRO_DETAILED_TRACEBACK = 1 Pyro.config.PYRO_PRINT_REMOTE_TRACEBACK = 1 def main(): Pyro.core.initClient(banner=0) hostname = 'localhost' port = 4321 name = 'DotServer' URI = "PYROLOC://%s:%d/%s" % (hostname,port,name) dot_server_instance = Pyro.core.getProxyForURI(URI) dot_server_instance.set_text('') # clear the "awaiting connection" text try: while True: dot_server_instance.set_signal_fraction(1.0) print 'signal 1.0' time.sleep(0.5) dot_server_instance.set_signal_fraction(0.1) print 'signal 0.1' time.sleep(0.5) finally: dot_server_instance.quit() if __name__=='__main__': main() visionegg-1.2.1/demo/dots_pyro_server.py0000644000076500000240000000637611231305036017605 0ustar astrawstaff#!/usr/bin/env python """User-defined mainloop while listening for commands over network This example implements a mainloop directly within this short script in addition to starting a Pyro server which listens for commands on the network. NOTE THAT USING PYRO IN THIS WAY A SECURITY RISK - PLEASE ONLY RUN BEHIND A FIREWALL. AN ATTACKER COULD PROBABLY EXECUTE ARBITRARY PYTHON COMMANDS ON YOUR COMPUTER WHEN RUNNING THIS SERVER. """ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() import VisionEgg.Core import pygame import pygame.locals import VisionEgg.Text import VisionEgg.Dots import Pyro.core Pyro.config.PYRO_MULTITHREADED = 0 Pyro.config.PYRO_TRACELEVEL = 3 Pyro.config.PYRO_USER_TRACELEVEL = 3 Pyro.config.PYRO_DETAILED_TRACEBACK = 1 Pyro.config.PYRO_PRINT_REMOTE_TRACEBACK = 1 class DotServer(Pyro.core.ObjBase): def post_init(self,screen,pyro_daemon): self.pyro_daemon = pyro_daemon screen.parameters.bgcolor = (0.0,0.0,0.0) # black (RGB) self.dots = VisionEgg.Dots.DotArea2D( position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), size = ( 300.0 , 300.0 ), signal_fraction = 0.1, signal_direction_deg = 180.0, velocity_pixels_per_sec = 10.0, dot_lifespan_sec = 5.0, dot_size = 3.0, num_dots = 100) self.text = VisionEgg.Text.Text( text = "awaiting connection from dots_pyro_client", position = (screen.size[0]/2,2), anchor = 'bottom', color = (1.0,1.0,1.0)) self.screen = screen self.viewport = VisionEgg.Core.Viewport( screen=screen, stimuli=[self.dots,self.text] ) self.frame_timer = VisionEgg.Core.FrameTimer() self.quit_now = False def set_text(self,t): self.text.parameters.text = t def set_signal_fraction(self,f): self.dots.set(signal_fraction=f) def quit(self): self.quit_now = True def mainloop(self): pyro_timeout = 0.0 # just check for any already events present while not self.quit_now: for event in pygame.event.get(): if event.type in (pygame.locals.QUIT, pygame.locals.KEYDOWN, pygame.locals.MOUSEBUTTONDOWN): self.quit_now = True self.pyro_daemon.handleRequests(pyro_timeout) self.screen.clear() self.viewport.draw() VisionEgg.Core.swap_buffers() self.frame_timer.tick() self.frame_timer.log_histogram() def main(): screen = VisionEgg.Core.get_default_screen() Pyro.core.initServer(banner=0) hostname = 'localhost' port = 4321 daemon = Pyro.core.Daemon(host=hostname,port=port) dot_server_instance = DotServer() dot_server_instance.post_init(screen,daemon) URI=daemon.connect(dot_server_instance,'DotServer') dot_server_instance.mainloop() if __name__=='__main__': main() visionegg-1.2.1/demo/dots_simple_loop.py0000755000076500000240000000324711224565530017556 0ustar astrawstaff#!/usr/bin/env python """Draw dots, using your own event loop. This bypasses the VisionEgg.FlowControl.Presentation class. It may be easier to create simple experiments this way.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import Screen, Viewport, swap_buffers, FrameTimer, \ get_default_screen import pygame from pygame.locals import QUIT,KEYDOWN,MOUSEBUTTONDOWN from VisionEgg.Text import Text from VisionEgg.Dots import DotArea2D screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,0.0) # black (RGB) dots = DotArea2D( position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), size = ( 300.0 , 300.0 ), signal_fraction = 0.1, signal_direction_deg = 180.0, velocity_pixels_per_sec = 10.0, dot_lifespan_sec = 5.0, dot_size = 3.0, num_dots = 100) text = Text( text = "Vision Egg dot_simple_loop demo.", position = (screen.size[0]/2,2), anchor = 'bottom', color = (1.0,1.0,1.0)) viewport = Viewport( screen=screen, stimuli=[dots,text] ) # The main loop below is an alternative to using the # VisionEgg.FlowControl.Presentation class. frame_timer = FrameTimer() quit_now = 0 while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = 1 screen.clear() viewport.draw() swap_buffers() frame_timer.tick() frame_timer.log_histogram() visionegg-1.2.1/demo/ephys_gui.pyw0000755000076500000240000000116311224565530016361 0ustar astrawstaff#!/usr/bin/env python import sys import Pyro import Tkinter, tkMessageBox import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.PyroApps.EPhysGUI import client_list, AppWindow, get_server # You can add your own controllers and GUIs to client_list result = get_server() if result: hostname,port = result app_window = AppWindow(client_list=client_list, server_hostname=hostname, server_port=port) app_window.winfo_toplevel().wm_iconbitmap() app_window.pack(expand=1,fill=Tkinter.BOTH) app_window.mainloop() visionegg-1.2.1/demo/ephys_server.py0000755000076500000240000000047711224565530016723 0ustar astrawstaff#!/usr/bin/env python import sys import tkMessageBox import Pyro import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.PyroApps.EPhysServer import server_modules, start_server # You can add your own server modules to the server_modules list start_server( server_modules ) visionegg-1.2.1/demo/flames_pygame.py0000755000076500000240000001126111224565530017007 0ustar astrawstaff#!/usr/bin/env python """flames.py - Realtime Fire Effect Demo Pete Shinners, April 3, 2001 Slightly modified by Andrew Straw, July 24, 2003 Ok, this is a pretty intense demonstation of using the surfarray module and numeric. It uses an 8bit surfaces with a colormap to represent the fire. We then go crazy on a separate Numeric array to get realtime fire. I'll try to explain my methods here... This flame algorithm is very popular, and you can find it for just about all graphic libraries. The fire effect works by placing random values on the bottom row of the image. Then doing a simplish blur that is weighted to move the values upward. Then slightly darken the image so the colors get darker as they move up. The secret is that the blur routine is "recursive" so when you blur the 2nd row, the values there are used when you blur the 3rd row, and all the way up. This fire algorithm works great, but the bottom rows are usually a bit ugly. In this demo we just render a fire surface that has 3 extra rows at the bottom we just don't use. Also, the fire is rendered at half the resolution of the full image. We then simply double the size of the fire data before applying to the surface. Several of these techniques are covered in the pygame surfarray tutorial. doubling an image, and the fancy blur is just a modified version of what is in the tutorial. This runs at about 40fps on my celeron-400 """ import pygame from pygame.surfarray import * import pygame.surfarray import numpy as np if hasattr(pygame.surfarray,'use_arraytype'): use_arraytype('numpy') pygame_array_func = np.asarray else: import Numeric pygame_array_func = Numeric.array from pygame.locals import * from numpy.oldnumeric import * from numpy.oldnumeric.random_array import * import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import FrameTimer RES = array((240, 180)) MAX = 246 RESIDUAL = 86 HSPREAD, VSPREAD = 26, 78 VARMIN, VARMAX = -2, 3 def main(): "main function called when the script is run" #first we just init pygame and create some empty arrays to work with pygame.init() screen = pygame.display.set_mode(RES, 0, 8) print screen.get_flags() setpalette(screen) flame = zeros(RES/2 + (0,3)) doubleflame = zeros(RES) randomflamebase(flame) #the mainloop is pretty simple, the work is done in these funcs frame_timer = FrameTimer() quit_now = 0 while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = 1 modifyflamebase(flame) processflame(flame) blitdouble(screen, flame, doubleflame) pygame.display.flip() frame_timer.tick() frame_timer.log_histogram() def setpalette(screen): "here we create a numeric array for the colormap" gstep, bstep = 75, 150 cmap = zeros((256, 3)) cmap[:,0] = minimum(arange(256)*3, 255) cmap[gstep:,1] = cmap[:-gstep,0] cmap[bstep:,2] = cmap[:-bstep,0] screen.set_palette(cmap) def randomflamebase(flame): "just set random values on the bottom row" flame[:,-1] = randint(0, MAX, flame.shape[0]) def modifyflamebase(flame): "slightly change the bottom row with random values" bottom = flame[:,-1] mod = randint(VARMIN, VARMAX, bottom.shape[0]) add(bottom, mod, bottom) maximum(bottom, 0, bottom) #if values overflow, reset them to 0 bottom[:] = choose(greater(bottom,MAX), (bottom,0)) def processflame(flame): "this function does the real work, tough to follow" notbottom = flame[:,:-1] #first we multiply by about 60% multiply(notbottom, 146, notbottom) right_shift(notbottom, 8, notbottom) #work with flipped image so math accumulates.. magic! flipped = flame[:,::-1] #all integer based blur, pulls image up too tmp = flipped * 20 right_shift(tmp, 8, tmp) tmp2 = tmp >> 1 add(flipped[1:,:], tmp2[:-1,:], flipped[1:,:]) add(flipped[:-1,:], tmp2[1:,:], flipped[:-1,:]) add(flipped[1:,1:], tmp[:-1,:-1], flipped[1:,1:]) add(flipped[:-1,1:], tmp[1:,:-1], flipped[:-1,1:]) tmp = flipped * 80 right_shift(tmp, 8, tmp) add(flipped[:,1:], tmp[:,:-1]>>1, flipped[:,1:]) add(flipped[:,2:], tmp[:,:-2], flipped[:,2:]) #make sure no values got too hot minimum(notbottom, MAX, notbottom) def blitdouble(screen, flame, doubleflame): "double the size of the data, and blit to screen" doubleflame[::2,:-2:2] = flame[:,:-4] doubleflame[1::2,:-2:2] = flame[:,:-4] doubleflame[:,1:-2:2] = doubleflame[:,:-2:2] to_blit = pygame_array_func( doubleflame.astype(np.uint8)) blit_array(screen, to_blit) if __name__ == '__main__': main() visionegg-1.2.1/demo/flames_visionegg.py0000755000076500000240000000616011231305155017512 0ustar astrawstaff#!/usr/bin/env python """flames_visionegg.py - a Vision Egg implementation of pygame flames. This demo renders a pygame surface (drawn with the flames demo of the PCR - pygame code repository) and then updates and OpenGL texture with surface using the Vision Egg.""" import os import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController, TIME_INDEPENDENT from VisionEgg.Text import * from VisionEgg.Textures import * import pygame.surface, pygame.locals import pygame.surfarray import OpenGL.GL as gl import flames_pygame as flames # "flames" from the pygame code repository import pygame.surfarray import numpy as np if hasattr(pygame.surfarray,'use_arraytype'): pygame.surfarray.use_arraytype('numpy') pygame_array_func = np.asarray else: import Numeric pygame_array_func = Numeric.array import numpy.oldnumeric as Numeric screen = get_default_screen() # create 8 bit pygame surface pygame_surface = pygame.surface.Surface((256,128),0,8) # set the colormap of the pygame surface flames.setpalette(pygame_surface) # create a texture using this surface as the source of texel data texture = Texture(pygame_surface) # create an empty array flame = Numeric.zeros(texture.size) # fill it flames.randomflamebase(flame) text = Text( text = "Vision Egg/pygame flames demo - Press Esc to quit", position = (screen.size[0]/2,2), anchor = 'bottom', color = (1.0,1.0,1.0,1.0)) # Create the instance of TextureStimulus # (The bottom 3 pixels of the flames texture contains artifacts from # the flame-drawing algorithm, so put them below the visible portion # of the screen) hide_fraction = 3.0/texture.size[1] screen_hide_height = screen.size[1]*hide_fraction*2 stimulus = TextureStimulus(texture = texture, position = (0,-screen_hide_height), anchor = 'lowerleft', size = (screen.size[0],screen.size[1]+screen_hide_height), # scale to fit screen mipmaps_enabled = 0, texture_min_filter=gl.GL_LINEAR) texture_object = stimulus.parameters.texture.get_texture_object() def update_flames(): # this does the work of updating the flames flames.modifyflamebase( flame ) flames.processflame( flame ) to_blit = pygame_array_func( flame.astype( np.uint8) ) pygame.surfarray.blit_array(pygame_surface, to_blit) texture_object.put_sub_image( pygame_surface ) viewport = Viewport(screen=screen, stimuli=[stimulus,text]) p = Presentation(go_duration=('forever',),viewports=[viewport]) def quit(dummy_arg=None): p.parameters.go_duration = (0,'frames') def keydown(event): if event.key == pygame.locals.K_ESCAPE: quit() p.parameters.handle_event_callbacks=[(pygame.locals.QUIT, quit), (pygame.locals.KEYDOWN, keydown)] p.add_controller(None,None,FunctionController(during_go_func=update_flames, temporal_variables=TIME_INDEPENDENT)) p.go() visionegg-1.2.1/demo/framecount.py0000755000076500000240000000203311224565530016336 0ustar astrawstaff#!/usr/bin/env python """Use frame information to display stimuli.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import get_default_screen, Viewport from VisionEgg.FlowControl import Presentation, FunctionController, FRAMES_ABSOLUTE from VisionEgg.Text import Text screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,1.0) # background blue (RGB) textvar = Text(color=(1.0,1.0,1.0), # alpha is ignored (set with max_alpha_param) position=(screen.size[0]/4,screen.size[1]/2), font_size=50, anchor='left') def text_func(f_abs): return "framecount: % 4d"%f_abs t_controller = FunctionController(during_go_func=text_func, temporal_variables = FRAMES_ABSOLUTE) viewport = Viewport(screen=screen, size=screen.size, stimuli=[textvar]) p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) p.add_controller(textvar,'text',t_controller) p.go() visionegg-1.2.1/demo/gabor.py0000755000076500000240000000344311224565530015273 0ustar astrawstaff#!/usr/bin/env python """Sinusoidal grating in a gaussian mask""" ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Gratings import SinGrating2D from VisionEgg.Textures import Mask2D ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() ########################################################## # Create sinusoidal grating object and gaussian window # ########################################################## mask = Mask2D(function='gaussian', # also supports 'circle' radius_parameter=25, # sigma for gaussian, radius for circle (units: num_samples) num_samples=(256,256)) # this many texture elements in mask (covers whole size specified below) stimulus = SinGrating2D(mask = mask, position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), size = ( 300.0 , 300.0 ), spatial_freq = 10.0 / screen.size[0], # units of cycles/pixel temporal_freq_hz = 1.0, orientation = 45.0 ) ############################################################### # Create viewport - intermediary between stimuli and screen # ############################################################### viewport = Viewport( screen=screen, stimuli=[stimulus] ) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) p.go() visionegg-1.2.1/demo/gamma.py0000755000076500000240000000443111231305343015251 0ustar astrawstaff#!/usr/bin/env python """Test whether your video drivers support setting gamma ramps""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import Viewport, get_default_screen from VisionEgg.FlowControl import Presentation from VisionEgg.Gratings import SinGrating2D from VisionEgg.Text import Text import pygame import numpy as np if not hasattr(pygame.display,"set_gamma_ramp"): raise RuntimeError("Need pygame 1.5 or greater for set_gamma_ramp function.") # Initialize OpenGL graphics screen. screen = get_default_screen() center_x = screen.size[0]/2.0 # Create the instance SinGrating with appropriate parameters stimulus = SinGrating2D() text2 = Text(text="set_gamma_ramp(r,g,b):", position=(center_x,0),anchor="bottom") text1 = Text(text="Press - to decrease luminance range, + to increase.", position=(center_x,text2.parameters.size[1]+5),anchor="bottom") # Use viewport with pixel coordinate system for projection viewport = Viewport(screen=screen,stimuli=[stimulus,text1,text2]) def quit(event): global p # get presentation instance p.parameters.quit = 1 # set initial value global gamma_scale gamma_scale = 1.0 def keydown(event): global gamma_scale if event.key == pygame.locals.K_ESCAPE: quit(event) elif event.key in [pygame.locals.K_KP_PLUS, pygame.locals.K_PLUS, pygame.locals.K_EQUALS]: gamma_scale += 0.05 do_gamma() elif event.key in [pygame.locals.K_KP_MINUS, pygame.locals.K_MINUS]: gamma_scale -= 0.05 do_gamma() def do_gamma(): global gamma_scale, text2 r = (np.arange(256)*256*gamma_scale).astype('i') g = r b = r worked = pygame.display.set_gamma_ramp(r,g,b) if worked: text2.parameters.text = "set_gamma_ramp(r,g,b): success" else: text2.parameters.text = "set_gamma_ramp(r,g,b): failure" do_gamma() # set gamma once initially handle_event_callbacks = [(pygame.locals.QUIT, quit), (pygame.locals.KEYDOWN, keydown)] # Create an instance of the Presentation class p = Presentation(viewports=[viewport], handle_event_callbacks=handle_event_callbacks) # Go! p.run_forever() visionegg-1.2.1/demo/grating.py0000755000076500000240000000266011224565530015634 0ustar astrawstaff#!/usr/bin/env python """Sinusoidal grating calculated in realtime.""" ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Gratings import * ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() ###################################### # Create sinusoidal grating object # ###################################### stimulus = SinGrating2D(position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), anchor = 'center', size = ( 300.0 , 300.0 ), spatial_freq = 10.0 / screen.size[0], # units of cycles/pixel temporal_freq_hz = 1.0, orientation = 45.0 ) ############################################################### # Create viewport - intermediary between stimuli and screen # ############################################################### viewport = Viewport( screen=screen, stimuli=[stimulus] ) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) p.go() visionegg-1.2.1/demo/gratings_multi.py0000644000076500000240000000475311224565530017233 0ustar astrawstaff#!/usr/bin/env python """Sinusoidal gratings calculated in realtime.""" ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Gratings import * ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() ####################################### # Create sinusoidal grating objects # ####################################### size = (50,100) grating_data_size = max(size)*2, max(size)*2 # make sure tilting it doesn't show edges up = SinGrating2D(position = ( size[0]/2.0, size[1]/2.0 ), anchor = 'center', size = grating_data_size, spatial_freq = 1.0/30.0, # units of cycles/pixel temporal_freq_hz = 1.0, orientation = 80.0, recalculate_phase_tolerance = 5.0, # speedup ) down = SinGrating2D(position = ( size[0]/2.0, size[1]/2.0 ), anchor = 'center', size = grating_data_size, spatial_freq = 1.0/30.0, # units of cycles/pixel temporal_freq_hz = 1.0, orientation = -80.0, recalculate_phase_tolerance = 5.0, # speedup ) ################################################################ # Create viewports - intermediary between stimuli and screen # ################################################################ x_space = 10 y_space = 10 viewports = [] for x in range(size[0]+x_space,screen.size[0],size[0]+x_space): even_row = 0 for y in range(size[1]+y_space,screen.size[1],size[1]+y_space): even_row = not even_row if even_row: stimulus = up else: stimulus = down viewports.append( Viewport( screen=screen, stimuli=[stimulus], position=(x,y), anchor='top', size=size)) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(10.0,'seconds'),viewports=viewports) p.go() visionegg-1.2.1/demo/GUI/0000755000076500000240000000000011231315556014243 5ustar astrawstaffvisionegg-1.2.1/demo/GUI/drumDemoGUI.py0000755000076500000240000001232511224565530016745 0ustar astrawstaff#!/usr/bin/env python """Spinning drum with a graphical user interface. This demo is complex because there are two tasks which normally have their own mainloop: the GUI and the Vision Egg drawing routines. Here, the GUI mainloop is in charge between trials, and it is locked out during trials.""" # This is the python source code for a demo application that uses the # Vision Egg package. # # This program displays a spinning drum, with the inside of the drum # texture-mapped with a panoramic image. # # This demo uses the GUI tookit "Tkinter", which may not be available on # all platforms. Also, because this code also controls a GUI, it is much # more complicated than the minimum needed to create a stimulus with the # VisionEgg. import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg import * from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, Controller, FunctionController from VisionEgg.GUI import * from VisionEgg.Textures import * import Tkinter from math import * import os import time default_max_speed = 400.0 class DrumGui(AppWindow): def __init__(self,master=None,**cnf): AppWindow.__init__(self,master,**cnf) self.winfo_toplevel().title('Vision Egg - spinning drum') self.pack(expand=1,fill=Tkinter.BOTH) # Position formula Tkinter.Label(self,text="Position as a function of time:").pack() self.positionFormula = Tkinter.StringVar() self.validated_pos_string = "%.1f*cos(t)"%default_max_speed self.positionFormula.set(self.validated_pos_string) Tkinter.Entry(self,textvariable=self.positionFormula).pack(expand=1,fill=Tkinter.X) # Contrast formula Tkinter.Label(self,text="Contrast as a function of time:").pack() self.contrastFormula = Tkinter.StringVar() self.validated_c_string = '1.0' self.contrastFormula.set(self.validated_c_string) Tkinter.Entry(self,textvariable=self.contrastFormula).pack(expand=1,fill=Tkinter.X) # Duration self.duration = Tkinter.Scale(self, from_=0.5, to=60.0, resolution=0.5, orient=Tkinter.HORIZONTAL, label="Duration of go loop (seconds):") self.duration.set(10.0) self.duration.pack(expand=1,fill=Tkinter.X) # Fixation spot self.fixation_spot = Tkinter.BooleanVar() self.fixation_spot.set(1) Tkinter.Checkbutton(self, text='Fixation spot', variable=self.fixation_spot, relief=Tkinter.FLAT).pack() # Go button Tkinter.Button(self,text="go",command=self.go).pack() self.validate_pos_string() self.validate_c_string() def positionFunction(self,t): return eval(self.validated_pos_string) def contrastFunction(self,t): if t < 0.0: # In between stimulus presentations return 0.0 return eval(self.validated_c_string) def validate_pos_string(self): tmp = self.positionFormula.get() try: t = 1.2 eval(tmp) self.validated_pos_string = tmp finally: self.positionFormula.set(self.validated_pos_string) def validate_c_string(self): tmp = self.contrastFormula.get() try: t = 1.2 eval(tmp) self.validated_c_string = tmp finally: self.contrastFormula.set(self.validated_c_string) def go(self): self.validate_pos_string() self.validate_c_string() p.go() config.VISIONEGG_GUI_INIT=1 VisionEgg.config.VISIONEGG_HIDE_MOUSE = 0 # make sure mouse is visible screen = get_default_screen() # initialize graphics if config.VISIONEGG_FULLSCREEN==1: raise RuntimeError("Cannot enter fullscreen mode if you want to see GUI panel!") # Get a texture filename = os.path.join(config.VISIONEGG_SYSTEM_DIR,"data/panorama.jpg") texture = Texture(filename) drum = SpinningDrum(texture=texture,shrink_texture_ok=1) fixation_spot = FixationSpot(position=(screen.size[0]/2,screen.size[1]/2), anchor='center') perspective = SimplePerspectiveProjection(fov_x=90.0) perspective_viewport = Viewport(screen=screen, projection=perspective, stimuli=[drum]) flat_viewport = Viewport(screen=screen, stimuli=[fixation_spot]) p = Presentation(viewports=[perspective_viewport,flat_viewport]) gui_window = DrumGui(idle_func=p.between_presentations) p.add_controller(fixation_spot,'on',FunctionController(during_go_func=lambda t: gui_window.fixation_spot.get(),eval_frequency=Controller.TRANSITIONS)) p.add_controller(p,'go_duration',FunctionController(during_go_func=lambda t: (gui_window.duration.get(),'seconds'),eval_frequency=Controller.TRANSITIONS)) p.add_controller(drum,'angular_position',FunctionController(during_go_func=gui_window.positionFunction)) p.add_controller(drum,'contrast',FunctionController(during_go_func=gui_window.contrastFunction)) gui_window.mainloop() visionegg-1.2.1/demo/image_sequence_fast.py0000755000076500000240000000400011224565530020156 0ustar astrawstaff#!/usr/bin/env python """Display a sequence of images using a pseudo-blit routine. This is a fast way to switch images because the OpenGL texture object is already created and the image data is already in system RAM. Switching the image merely consists of putting the new data into OpenGL. Currently, there is no support for ensuring image sizes remain constant, so if you get strange behavior, please ensure that all your images are the same size. """ from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Textures import * import Image, ImageDraw import OpenGL.GL as gl num_images = 20 duration_per_image = 0.1 # seconds image_size = (256,256) # Generate some images image_list = [] for i in range(num_images): image = Image.new("RGB",image_size,(0,0,255)) # Blue background draw = ImageDraw.Draw(image) line_x = image_size[0]/float(num_images) * i draw.line((line_x, 0, line_x, image_size[1]), fill=(255,255,255)) image_list.append(image) screen = get_default_screen() # create a TextureStimulus to allocate memory in OpenGL stimulus = TextureStimulus(mipmaps_enabled=0, texture=Texture(image_list[0]), size=image_size, texture_min_filter=gl.GL_LINEAR, position=(screen.size[0]/2.0,screen.size[1]/2.0), anchor='center') viewport = Viewport(screen=screen, stimuli=[stimulus]) p = Presentation(go_duration=(num_images*duration_per_image,'seconds'),viewports=[viewport]) # Use a controller to hook into go loop, but control texture buffer # through direct manipulation. texture_object = stimulus.parameters.texture.get_texture_object() def put_image(t): i = int(t/duration_per_image) # choose image texture_object.put_sub_image( image_list[i] ) p.add_controller(None,None,FunctionController(during_go_func=put_image)) p.go() visionegg-1.2.1/demo/image_sequence_slow.py0000755000076500000240000000324311224565530020215 0ustar astrawstaff#!/usr/bin/env python """Display a sequence of images. The displayed image is changes by changing the TextureStimulus's Texture parameter, which will delete the old OpenGL texture object and create a new one. This method to switch images is slower than that demonstrated in the image_sequence_fast.py demo. The images need not all be the same size. """ from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Textures import * import Image, ImageDraw import OpenGL.GL as gl num_images = 20 duration_per_image = 0.1 # seconds image_size = (256,256) # Generate some images image_list = [] for i in range(num_images): image = Image.new("RGB",image_size,(0,0,255)) # Blue background draw = ImageDraw.Draw(image) line_x = image_size[0]/float(num_images) * i draw.line((line_x, 0, line_x, image_size[1]), fill=(255,255,255)) image_list.append(image) texture_list = map(Texture,image_list) # create instances of Texture from images screen = get_default_screen() stimulus = TextureStimulus(texture=texture_list[0], position = (screen.size[0]/2.0,screen.size[1]/2.0), anchor='center', size=image_size) viewport = Viewport(screen=screen, stimuli=[stimulus]) p = Presentation(go_duration=(num_images*duration_per_image,'seconds'),viewports=[viewport]) def put_image(t): i = int(t/duration_per_image) # choose image stimulus.parameters.texture = texture_list[i] p.add_controller(None,None,FunctionController(during_go_func=put_image)) p.go() visionegg-1.2.1/demo/makeMovie.py0000755000076500000240000000523611224565530016120 0ustar astrawstaff#!/usr/bin/env python """Save movie of a black target moving across a white background.""" fps = 12.0 ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, Controller, FunctionController from VisionEgg.MoreStimuli import * from math import * from types import * import os ################################# # Initialize the various bits # ################################# # Initialize OpenGL graphics screen. screen = get_default_screen() # Set the background color to white (RGBA). screen.parameters.bgcolor = (1.0,1.0,1.0,1.0) # Create an instance of the Target2D class with appropriate parameters. target = Target2D(size = (25.0,10.0), anchor = 'center', color = (0.0,0.0,0.0,1.0), # Set the target color (RGBA) black orientation = -45.0) # Create a Viewport instance viewport = Viewport(screen=screen, stimuli=[target]) # Create an instance of the Presentation class. This contains the # the Vision Egg's runtime control abilities. p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport]) ####################### # Define controller # ####################### # calculate a few variables we need mid_x = screen.size[0]/2.0 mid_y = screen.size[1]/2.0 max_vel = min(screen.size[0],screen.size[1]) * 0.4 # define position as a function of time def get_target_position(t): global mid_x, mid_y, max_vel return ( max_vel*sin(0.1*2.0*pi*t) + mid_x , # x max_vel*sin(0.1*2.0*pi*t) + mid_y ) # y # Create an instance of the Controller class target_position_controller = FunctionController(during_go_func=get_target_position) ############################################################# # Connect the controllers with the variables they control # ############################################################# p.add_controller(target,'position', target_position_controller ) ####################### # Run the stimulus! # ####################### base_dir = VisionEgg.config.VISIONEGG_USER_DIR if not os.path.isdir(base_dir): base_dir = VisionEgg.config.VISIONEGG_SYSTEM_DIR save_directory = os.path.join(base_dir,'movie') if not os.path.isdir(save_directory): os.mkdir(save_directory) if not os.path.isdir(save_directory): print "Error: cannot make movie directory '%s'."%save_directory print "Saving movie to directory '%s'."%save_directory basename = "movie_"+os.path.splitext(os.path.basename(sys.argv[0]))[0] p.export_movie_go(frames_per_sec=fps,filename_base=basename,path=save_directory) visionegg-1.2.1/demo/makeMovie2.py0000755000076500000240000000307311224565530016177 0ustar astrawstaff#!/usr/bin/env python """Draw dots and save movie using your own event loop. This bypasses the VisionEgg.FlowControl.Presentation class. It may be easier to create simple scripts this way.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * import pygame from pygame.locals import * from VisionEgg.Text import * from VisionEgg.Dots import * screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,0.0,0.0) # black (RGBA) dots = DotArea2D( position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), size = ( 300.0 , 300.0 ), signal_fraction = 0.1, signal_direction_deg = 180.0, velocity_pixels_per_sec = 10.0, dot_lifespan_sec = 5.0, dot_size = 3.0, num_dots = 100) text = Text( text = "Vision Egg makeMovie2 demo.", position = (screen.size[0]/2,2), anchor = 'bottom', color = (1.0,1.0,1.0)) viewport = Viewport( screen=screen, stimuli=[dots,text] ) VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ = 60.0 # fake framerate VisionEgg.set_time_func_to_frame_locked() # force VisionEgg to fake this framerate num_frames = 5 for i in range(num_frames): screen.clear() viewport.draw() swap_buffers() im = screen.get_framebuffer_as_image(buffer='front',format=gl.GL_RGB) filename = "movie_%02d.jpg"%(i+1) im.save(filename) print 'saved',filename visionegg-1.2.1/demo/mouse_gabor_2d.py0000755000076500000240000001427411224565530017074 0ustar astrawstaff#!/usr/bin/env python """sinusoidal grating in gaussian window""" from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.Gratings import * from VisionEgg.SphereMap import * from VisionEgg.Text import * from VisionEgg.Textures import * import VisionEgg.ParameterTypes as ve_types import math, os import pygame import OpenGL.GL as gl def get_mouse_position(): # convert to OpenGL coordinates (x,y) = pygame.mouse.get_pos() y = screen.size[1]-y return x,y screen = get_default_screen() mask = Mask2D(function='gaussian', # also supports 'circle' radius_parameter=25, # sigma for gaussian, radius for circle (units: num_samples) num_samples=(512,512)) # this many texture elements in mask (covers whole size specified below) grating_stimulus = SinGrating2D(mask = mask, position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), size = ( 800 , 800 ), spatial_freq = 10.0 / screen.size[0], # units of cycles/pixel temporal_freq_hz = 1.0, num_samples = 1024, orientation = 45.0 ) text_color = (0.0,0.0,1.0) # RGB ( blue) xpos = 10.0 yspace = 5 text_params = {'anchor':'lowerleft','color':text_color,'font_size':20} text_stimuli = [] ypos = 0 text_stimuli.append( Text( text = "Numeric keypad changes grating orientation.", position=(xpos,ypos),**text_params)) ypos += text_stimuli[-1].parameters.size[1] + yspace tf_text = Text(text = "'t/T' changes TF (now %.2f hz)"%(grating_stimulus.parameters.temporal_freq_hz), position=(xpos,ypos),**text_params) text_stimuli.append( tf_text ) ypos += text_stimuli[-1].parameters.size[1] + yspace text_stimuli.append( Text( text = "'-' shrinks window, '+' grows window (slow)", position=(xpos,ypos),**text_params)) ypos += text_stimuli[-1].parameters.size[1] + yspace sf_text = Text(text = "'s/S' changes SF (now %.3f cycles/pixel = %.1f pixels/cycle)"%(grating_stimulus.parameters.spatial_freq,1.0/grating_stimulus.parameters.spatial_freq), position=(xpos,ypos),**text_params) text_stimuli.append( sf_text ) ypos += text_stimuli[-1].parameters.size[1] + yspace text_stimuli.append( Text( text = "Mouse moves gabor, press Esc to quit", position=(xpos,ypos),**text_params)) ypos += text_stimuli[-1].parameters.size[1] + yspace text_stimuli.append( Text( text = "Demonstration of mouse controlled gabor.", position=(xpos,ypos),**text_params)) viewport = Viewport(screen=screen, stimuli=[grating_stimulus] + text_stimuli) quit_now = False shift_key = False frame_timer = FrameTimer() while not quit_now: for event in pygame.event.get(): if event.type == pygame.locals.QUIT: quit_now = True elif event.type == pygame.locals.KEYUP: if event.key in [pygame.locals.K_LSHIFT,pygame.locals.K_RSHIFT]: shift_key = False elif event.type == pygame.locals.KEYDOWN: if event.key == pygame.locals.K_ESCAPE: quit_now = True elif event.key in [pygame.locals.K_LSHIFT,pygame.locals.K_RSHIFT]: shift_key = True elif event.key == pygame.locals.K_KP1: grating_stimulus.parameters.orientation = 225.0 elif event.key == pygame.locals.K_KP2: grating_stimulus.parameters.orientation = 270.0 elif event.key == pygame.locals.K_KP3: grating_stimulus.parameters.orientation = 315.0 elif event.key == pygame.locals.K_KP6: grating_stimulus.parameters.orientation = 0.0 elif event.key == pygame.locals.K_KP9: grating_stimulus.parameters.orientation = 45.0 elif event.key == pygame.locals.K_KP8: grating_stimulus.parameters.orientation = 90.0 elif event.key == pygame.locals.K_KP7: grating_stimulus.parameters.orientation = 135.0 elif event.key == pygame.locals.K_KP4: grating_stimulus.parameters.orientation = 180.0 elif event.key == pygame.locals.K_s: if shift_key: grating_stimulus.parameters.spatial_freq *= (1.0/1.5) else: grating_stimulus.parameters.spatial_freq *= 1.5 sf_text.parameters.text = "'s/S' changes SF (now %.3f cycles per pixel = %.1f pixels per cycle)"%(grating_stimulus.parameters.spatial_freq,1.0/grating_stimulus.parameters.spatial_freq) elif event.key == pygame.locals.K_t: if shift_key: grating_stimulus.parameters.temporal_freq_hz *= (1.0/1.5) else: grating_stimulus.parameters.temporal_freq_hz *= 1.5 tf_text.parameters.text = "'t/T' changes TF (now %.2f hz)"%(grating_stimulus.parameters.temporal_freq_hz) elif event.key == pygame.locals.K_MINUS: old_params = grating_stimulus.parameters.mask.constant_parameters new_radius = old_params.radius_parameter * 0.8 new_mask = Mask2D(function=old_params.function, radius_parameter=old_params.radius_parameter*0.8, num_samples=old_params.num_samples) grating_stimulus.parameters.mask = new_mask elif event.key == pygame.locals.K_EQUALS: old_params = grating_stimulus.parameters.mask.constant_parameters new_radius = old_params.radius_parameter * 0.8 new_mask = Mask2D(function=old_params.function, radius_parameter=old_params.radius_parameter/0.8, num_samples=old_params.num_samples) grating_stimulus.parameters.mask = new_mask screen.clear() x,y = get_mouse_position() grating_stimulus.parameters.position = x,y viewport.draw() swap_buffers() frame_timer.tick() frame_timer.log_histogram() visionegg-1.2.1/demo/mouse_gabor_perspective.py0000755000076500000240000002555711224565530021126 0ustar astrawstaff#!/usr/bin/env python """Perspective-distorted sinusoidal grating in gaussian window""" from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.Gratings import * from VisionEgg.SphereMap import * from VisionEgg.Text import * from VisionEgg.Textures import * import VisionEgg.ParameterTypes as ve_types import math, os import pygame import OpenGL.GL as gl elevation = 0.0 azimuth = 0.0 fov_x = 90.0 def get_mouse_position(): # convert to OpenGL coordinates (x,y) = pygame.mouse.get_pos() y = screen.size[1]-y return x,y grating_orient_method = 'reorient stimulus' # start with this as default def set_az_el(x,y): global screen, elevation global grid_stimulus_moving, grating_stimulus, mask global grating_orient_method azimuth = (float(x) / screen.size[0]) * 180 - 90 elevation = (float(y) / screen.size[1]) * 180 - 90 az_el_text.parameters.text = "Mouse moves window, press Esc to quit. Az, El = (%5.1f, %5.1f)"%(azimuth,elevation) mask.parameters.window_center_azimuth = azimuth mask.parameters.window_center_elevation = elevation if grating_orient_method == 'reorient stimulus': # normal grid_stimulus_moving.parameters.center_azimuth = azimuth grid_stimulus_moving.parameters.center_elevation = elevation grating_stimulus.parameters.grating_center_azimuth = azimuth grating_stimulus.parameters.grating_center_elevation = elevation elif grating_orient_method == 'mask only': grating_stimulus.parameters.grating_center_azimuth = 0.0 grating_stimulus.parameters.grating_center_elevation = 0.0 grid_stimulus_moving.parameters.center_azimuth = 0.0 grid_stimulus_moving.parameters.center_elevation = 0.0 screen = get_default_screen() projection_3d = SimplePerspectiveProjection(fov_x=fov_x) grid_stimulus_moving = AzElGrid(use_text=False, # no text minor_line_color=(0.9,0.5,0.5,.2),# set low alpha major_line_color=(1.0,0.0,0.0,.4),# set low alpha on=False) # start with grid off grid_stimulus_fixed = AzElGrid(on=False, minor_line_color=(0.5,0.5,0.7), ) # start with grid off try: # We want the maximum number of samples possible, hopefully 2048 grating_stimulus = SphereGrating(num_samples=2048, radius = 1.0, spatial_freq_cpd = 1.0/9.0, temporal_freq_hz = 1.0, slices = 50, stacks = 50) except NumSamplesTooLargeError: grating_stimulus = SphereGrating(num_samples=1024, radius = 1.0, spatial_freq_cpd = 1.0/9.0, temporal_freq_hz = 1.0, slices = 50, stacks = 50) min_filters = ['GL_LINEAR', 'GL_NEAREST', 'GL_NEAREST_MIPMAP_LINEAR', 'GL_NEAREST_MIPMAP_NEAREST', 'GL_LINEAR_MIPMAP_LINEAR', 'GL_LINEAR_MIPMAP_NEAREST', ] cur_min_filter_index = 0 def set_filter_and_text(): global grating_stimulus, filter_text, cur_min_filter_index, min_filters min_filter = min_filters[cur_min_filter_index] filter_text.parameters.text = "'g' toggles grid display, 'f' cycles min_filter (now %s)"%min_filter min_filter_int = eval("gl."+min_filter) grating_stimulus.parameters.min_filter = min_filter_int mask = SphereWindow(radius=1.0*0.90, # make sure window is inside sphere with grating window_shape_radius_parameter=40.0, slices=50, stacks=50) text_color = (0.0,0.0,1.0) # RGB ( blue) xpos = 10.0 yspace = 5 text_params = {'anchor':'lowerleft','color':text_color,'font_size':20} text_stimuli = [] ypos = 0 text_stimuli.append( Text( text = "(Hold mouse button to prevent re-orienting stimulus with mask.)", position=(xpos,ypos),**text_params)) ypos += text_stimuli[-1].parameters.size[1] + yspace text_stimuli.append( Text( text = "Numeric keypad changes grating orientation.", position=(xpos,ypos),**text_params)) ypos += text_stimuli[-1].parameters.size[1] + yspace filter_text = Text( text = "temporary text", position=(xpos,ypos),**text_params) set_filter_and_text() text_stimuli.append( filter_text ) ypos += text_stimuli[-1].parameters.size[1] + yspace sf_cutoff_text = Text(text = "'c/C' changes cutoff SF (now %.2f cycles per texel)"%(grating_stimulus.parameters.lowpass_cutoff_cycles_per_texel), position=(xpos,ypos),**text_params) text_stimuli.append( sf_cutoff_text ) ypos += text_stimuli[-1].parameters.size[1] + yspace zoom_text = Text(text = "'z/Z' changes zoom (X field of view %.2f degrees)"%(fov_x), position=(xpos,ypos),**text_params) text_stimuli.append( zoom_text ) ypos += text_stimuli[-1].parameters.size[1] + yspace tf_text = Text(text = "'t/T' changes TF (now %.2f hz)"%(grating_stimulus.parameters.temporal_freq_hz), position=(xpos,ypos),**text_params) text_stimuli.append( tf_text ) ypos += text_stimuli[-1].parameters.size[1] + yspace sf_text = Text(text = "'-' shrinks window, '+' grows window, 's/S' changes SF (now %.2f cycles per degree)"%(grating_stimulus.parameters.spatial_freq_cpd), position=(xpos,ypos),**text_params) text_stimuli.append( sf_text ) ypos += text_stimuli[-1].parameters.size[1] + yspace az_el_text = Text( text = "Mouse moves window, press Esc to quit. Az, El = (%05.1f, %05.1f)"%(azimuth,elevation), position=(xpos,ypos),**text_params) text_stimuli.append( az_el_text ) ypos += text_stimuli[-1].parameters.size[1] + yspace text_stimuli.append( Text( text = "Demonstration of perspective distorted, windowed grating.", position=(xpos,ypos),**text_params)) viewport = Viewport(screen=screen, projection=projection_3d, stimuli=[grating_stimulus, grid_stimulus_moving, mask, # mask must be drawn after grating grid_stimulus_fixed, ]) grid_stimulus_fixed.set(my_viewport=viewport) # must know viewport for proper positioning of text labels grid_stimulus_moving.set(my_viewport=viewport) # must know viewport for proper positioning of text labels text_viewport = Viewport(screen=screen, # default (orthographic) viewport stimuli=text_stimuli) quit_now = False shift_key = False frame_timer = FrameTimer() while not quit_now: for event in pygame.event.get(): if event.type == pygame.locals.QUIT: quit_now = True elif event.type == pygame.locals.MOUSEBUTTONDOWN: if event.button == 1: grating_orient_method = 'mask only' elif event.type == pygame.locals.MOUSEBUTTONUP: if event.button == 1: grating_orient_method = 'reorient stimulus' elif event.type == pygame.locals.KEYUP: if event.key in [pygame.locals.K_LSHIFT,pygame.locals.K_RSHIFT]: shift_key = False elif event.type == pygame.locals.KEYDOWN: if event.key == pygame.locals.K_ESCAPE: quit_now = True elif event.key in [pygame.locals.K_LSHIFT,pygame.locals.K_RSHIFT]: shift_key = True elif event.key == pygame.locals.K_KP1: grating_stimulus.parameters.orientation = 225.0 elif event.key == pygame.locals.K_KP2: grating_stimulus.parameters.orientation = 270.0 elif event.key == pygame.locals.K_KP3: grating_stimulus.parameters.orientation = 315.0 elif event.key == pygame.locals.K_KP6: grating_stimulus.parameters.orientation = 0.0 elif event.key == pygame.locals.K_KP9: grating_stimulus.parameters.orientation = 45.0 elif event.key == pygame.locals.K_KP8: grating_stimulus.parameters.orientation = 90.0 elif event.key == pygame.locals.K_KP7: grating_stimulus.parameters.orientation = 135.0 elif event.key == pygame.locals.K_KP4: grating_stimulus.parameters.orientation = 180.0 elif event.key == pygame.locals.K_s: if shift_key: grating_stimulus.parameters.spatial_freq_cpd *= (1.0/1.5) else: grating_stimulus.parameters.spatial_freq_cpd *= 1.5 sf_text.parameters.text = "'-' shrinks window, '+' grows window, 's/S' changes SF (now %.2f cycles per degree)"%(grating_stimulus.parameters.spatial_freq_cpd) elif event.key == pygame.locals.K_t: if shift_key: grating_stimulus.parameters.temporal_freq_hz *= (1.0/1.5) else: grating_stimulus.parameters.temporal_freq_hz *= 1.5 tf_text.parameters.text = "'t/T' changes TF (now %.2f hz)"%(grating_stimulus.parameters.temporal_freq_hz) elif event.key == pygame.locals.K_c: if shift_key: grating_stimulus.parameters.lowpass_cutoff_cycles_per_texel *= (1.0/1.5) else: grating_stimulus.parameters.lowpass_cutoff_cycles_per_texel *= 1.5 sf_cutoff_text.parameters.text = "'c/C' changes cutoff SF (now %.2f cycles per texel)"%(grating_stimulus.parameters.lowpass_cutoff_cycles_per_texel) elif event.key == pygame.locals.K_g: grid_stimulus_fixed.parameters.on = not grid_stimulus_fixed.parameters.on grid_stimulus_moving.parameters.on = not grid_stimulus_moving.parameters.on elif event.key == pygame.locals.K_z: if shift_key: fov_x *= (1.0/1.1) else: fov_x *= 1.1 viewport.parameters.projection = SimplePerspectiveProjection(fov_x=fov_x) zoom_text.parameters.text = "'z/Z' changes zoom (X field of view %.2f degrees)"%(fov_x) elif event.key == pygame.locals.K_f: cur_min_filter_index = (cur_min_filter_index+1) % len(min_filters) set_filter_and_text() elif event.key == pygame.locals.K_MINUS: mask.parameters.window_shape_radius_parameter *= 0.8 elif event.key == pygame.locals.K_EQUALS: mask.parameters.window_shape_radius_parameter *= (1.0/0.8) screen.clear() x,y = get_mouse_position() set_az_el(x,y) viewport.draw() text_viewport.draw() swap_buffers() frame_timer.tick() frame_timer.log_histogram() visionegg-1.2.1/demo/mouseTarget.py0000755000076500000240000001111611224565530016474 0ustar astrawstaff#!/usr/bin/env python """Control a target with the mouse, get SDL/pygame events.""" # Variables to store the mouse position mouse_position = (320.0, 240.0) last_mouse_position = (0.0,0.0) ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.MoreStimuli import * from VisionEgg.Text import * from math import * import pygame ################################# # Initialize the various bits # ################################# # Initialize OpenGL graphics screen. screen = get_default_screen() # Set the background color to white (RGBA). screen.parameters.bgcolor = (1.0,1.0,1.0,1.0) # Create an instance of the Target2D class with appropriate parameters. target = Target2D(size = (25.0,10.0), anchor = 'center', color = (0.0,0.0,0.0,1.0)) # Set the target color (RGBA) black text = Text( text = "Press Esc to quit, arrow keys to change size of target.", position = (screen.size[0]/2.0,5), anchor='bottom', color = (0.0,0.0,0.0,1.0)) # Create a Viewport instance viewport = Viewport(screen=screen, stimuli=[target,text]) ################ # Math stuff # ################ def cross_product(b,c): """Cross product between vectors, represented as tuples of length 3.""" det_i = b[1]*c[2] - b[2]*c[1] det_j = b[0]*c[2] - b[2]*c[0] det_k = b[0]*c[1] - b[1]*c[0] return (det_i,-det_j,det_k) def mag(b): """Magnitude of a vector.""" return b[0]**2.0 + b[1]**2.0 + b[2]**2.0 def every_frame_func(t=None): # Get mouse position global mouse_position, last_mouse_position just_current_pos = mouse_position (x,y) = pygame.mouse.get_pos() y = screen.size[1]-y # convert to OpenGL coords mouse_position = (x,y) if just_current_pos != mouse_position: last_mouse_position = just_current_pos # Set target position target.parameters.position = mouse_position # Set target orientation b = (float(last_mouse_position[0]-mouse_position[0]), float(last_mouse_position[1]-mouse_position[1]), 0.0) orientation_vector = cross_product(b,(0.0,0.0,1.0)) target.parameters.orientation = atan2(orientation_vector[1],orientation_vector[0])/math.pi*180.0 # Set target size global target_w, target_h global up, down, left, right amount = 0.02 if up: target_w = target_w+(amount*target_w) elif down: target_w = target_w-(amount*target_w) elif right: target_h = target_h+(amount*target_h) elif left: target_h = target_h-(amount*target_h) target_w = max(target_w,0.0) target_h = max(target_h,0.0) target.parameters.size = (target_w, target_h) ############################################# # Create event handler callback functions # ############################################# # target size global variables target_w = 50.0 target_h = 10.0 # key state global variables up = 0 down = 0 left = 0 right = 0 def keydown(event): global up, down, left, right if event.key == pygame.locals.K_ESCAPE: quit(event) elif event.key == pygame.locals.K_UP: up = 1 elif event.key == pygame.locals.K_DOWN: down = 1 elif event.key == pygame.locals.K_RIGHT: right = 1 elif event.key == pygame.locals.K_LEFT: left = 1 def keyup(event): global up, down, left, right if event.key == pygame.locals.K_UP: up = 0 elif event.key == pygame.locals.K_DOWN: down = 0 elif event.key == pygame.locals.K_RIGHT: right = 0 elif event.key == pygame.locals.K_LEFT: left = 0 # Create an instance of the Presentation class. This contains the # the Vision Egg's runtime control abilities. p = Presentation(go_duration=('forever',), viewports=[viewport]) def quit(event): p.parameters.go_duration = (0,'frames') p.parameters.handle_event_callbacks = [(pygame.locals.QUIT, quit), (pygame.locals.KEYDOWN, keydown), (pygame.locals.KEYUP, keyup)] ############################################################# # Connect the controllers with the variables they control # ############################################################# p.add_controller(None, None, FunctionController(during_go_func=every_frame_func) ) ####################### # Run the stimulus! # ####################### p.go() visionegg-1.2.1/demo/mouseTarget_user_loop.py0000755000076500000240000001007011224565530020561 0ustar astrawstaff#!/usr/bin/env python """Control a target with the mouse, using your own event loop.""" # Variables to store the mouse position mouse_position = (320.0, 240.0) last_mouse_position = (0.0,0.0) ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.MoreStimuli import * from VisionEgg.Text import * from math import * import pygame # Use Python's bool constants if available, make aliases if not try: True except NameError: True = 1==1 False = 1==0 ################################# # Initialize the various bits # ################################# # Initialize OpenGL graphics screen. screen = get_default_screen() # Set the background color to white (RGBA). screen.parameters.bgcolor = (1.0,1.0,1.0,1.0) # Create an instance of the Target2D class with appropriate parameters. target = Target2D(size = (25.0,10.0), anchor = 'center', color = (0.0,0.0,0.0,1.0)) # Set the target color (RGBA) black text = Text( text = "Press Esc to quit, arrow keys to change size of target.", position = (screen.size[0]/2.0,5), anchor='bottom', color = (0.0,0.0,0.0,1.0)) # Create a Viewport instance viewport = Viewport(screen=screen, stimuli=[target,text]) ################ # Math stuff # ################ def cross_product(b,c): """Cross product between vectors, represented as tuples of length 3.""" det_i = b[1]*c[2] - b[2]*c[1] det_j = b[0]*c[2] - b[2]*c[0] det_k = b[0]*c[1] - b[1]*c[0] return (det_i,-det_j,det_k) def mag(b): """Magnitude of a vector.""" return b[0]**2.0 + b[1]**2.0 + b[2]**2.0 # target size target_w = 50.0 target_h = 10.0 # key state up = False down = False left = False right = False # The main loop below is an alternative to using the # VisionEgg.FlowControl.Presentation class. quit_now = False frame_timer = FrameTimer() while not quit_now: for event in pygame.event.get(): if event.type == pygame.locals.QUIT: quit_now = True elif event.type == pygame.locals.KEYDOWN: if event.key == pygame.locals.K_ESCAPE: quit_now = True elif event.key == pygame.locals.K_UP: up = True elif event.key == pygame.locals.K_DOWN: down = True elif event.key == pygame.locals.K_RIGHT: right = True elif event.key == pygame.locals.K_LEFT: left = True elif event.type == pygame.locals.KEYUP: if event.key == pygame.locals.K_UP: up = False elif event.key == pygame.locals.K_DOWN: down = False elif event.key == pygame.locals.K_RIGHT: right = False elif event.key == pygame.locals.K_LEFT: left = False just_current_pos = mouse_position (x,y) = pygame.mouse.get_pos() y = screen.size[1]-y # convert to OpenGL coords mouse_position = (x,y) if just_current_pos != mouse_position: last_mouse_position = just_current_pos # Set target position target.parameters.position = mouse_position # Set target orientation b = (float(last_mouse_position[0]-mouse_position[0]), float(last_mouse_position[1]-mouse_position[1]), 0.0) orientation_vector = cross_product(b,(0.0,0.0,1.0)) target.parameters.orientation = atan2(orientation_vector[1],orientation_vector[0])/math.pi*180.0 # Set target size amount = 0.02 if up: target_w = target_w+(amount*target_w) elif down: target_w = target_w-(amount*target_w) elif right: target_h = target_h+(amount*target_h) elif left: target_h = target_h-(amount*target_h) target_w = max(target_w,0.0) target_h = max(target_h,0.0) target.parameters.size = (target_w, target_h) screen.clear() viewport.draw() swap_buffers() frame_timer.tick() frame_timer.log_histogram() visionegg-1.2.1/demo/movingPOV.py0000755000076500000240000000423011224565530016060 0ustar astrawstaff#!/usr/bin/env python """2 viewports, one with a changing perspective.""" import math,os from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Textures import * from OpenGL.GL import * def angle_as_function_of_time(t): return 90.0*t # rotate at 90 degrees per second def cam_matrix_f(t): projection = Projection()#SimplePerspectiveProjection(fov_x=55.0,aspect_ratio=(screen.size[0]/2.)/screen.size[1]) eye = (0.0,t*0.3+1.0,-2.0) camera_look_at = (0.0,0.0,0.0) camera_up = (0.0,1.0,0.0) projection.look_at( eye, camera_look_at, camera_up) return projection.get_matrix() screen = get_default_screen() mid_x = screen.size[0]/2 mid_y = screen.size[1]/2 projection1 = SimplePerspectiveProjection(fov_x=90.0, aspect_ratio=(float(mid_x)/screen.size[1])) projection2 = SimplePerspectiveProjection(fov_x=55.0, aspect_ratio=(float(mid_x)/screen.size[1])) camera_matrix = ModelView() # Parameters set in realtime, so no need to specify here # Get a texture filename = os.path.join(config.VISIONEGG_SYSTEM_DIR,"data","panorama.jpg") texture = Texture(filename) stimulus = SpinningDrum(texture=texture,shrink_texture_ok=1) viewport1 = Viewport(screen=screen, position=(0,0), anchor='lowerleft', size=(mid_x,screen.size[1]), projection=projection1, stimuli=[stimulus]) viewport2 = Viewport(screen=screen, position=(mid_x,0), anchor='lowerleft', size=(mid_x,screen.size[1]), projection=projection2, camera_matrix=camera_matrix, stimuli=[stimulus]) p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport1,viewport2]) p.add_controller(stimulus,'angular_position', FunctionController(during_go_func=angle_as_function_of_time)) p.add_controller(camera_matrix,'matrix', FunctionController(during_go_func=cam_matrix_f)) p.go() visionegg-1.2.1/demo/mpeg.py0000644000076500000240000000675211224565530015134 0ustar astrawstaff#!/usr/bin/env python """mpeg.py - play MPEG movies in the Vision Egg This demo uses pygame.movie to draw movies. See also the quicktime.py demo.""" import os import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController, TIME_INDEPENDENT from VisionEgg.Text import * from VisionEgg.Textures import * import sys import pygame import pygame.surface, pygame.locals import pygame.movie import OpenGL.GL as gl if len(sys.argv) > 1: filename = sys.argv[1] else: filename = None screen = get_default_screen() def quit(dummy_arg=None): p.parameters.go_duration = (0,'frames') def keydown(event): if event.key == pygame.locals.K_ESCAPE: quit() if not filename: text = Text( text = "Error: Use MPEG file as command line argument - Press Esc to quit", position = (screen.size[0]/2,screen.size[1]), anchor = 'top', font_size=24, color = (1.0,0.0,0.0)) text2 = Text( text = "(If you have a free MPEG to contribute, it could go here.)", position = (screen.size[0]/2,screen.size[1]/2), anchor = 'center', font_size=20, color = (1.0,1.0,1.0)) viewport = Viewport(screen=screen, stimuli=[text,text2]) p = Presentation(go_duration=('forever',), viewports=[viewport], handle_event_callbacks=[(pygame.locals.QUIT, quit), (pygame.locals.KEYDOWN, keydown)], ) p.go() sys.exit(1) movie = pygame.movie.Movie(filename) width, height = movie.get_size() scale_x = screen.size[0]/float(width) scale_y = screen.size[1]/float(height) scale = min(scale_x,scale_y) # maintain aspect ratio # create pygame surface (buffer to draw uncompressed movie data into) pygame_surface = pygame.surface.Surface((width,height)) # tell the movie to render onto the surface movie.set_display( pygame_surface ) # create a texture using this surface as the source of texel data texture = Texture(pygame_surface) text = Text( text = "Vision Egg MPEG demo - Press Esc to quit", position = (screen.size[0]/2,2), anchor = 'bottom', color = (1.0,1.0,1.0,1.0)) # Create the instance of TextureStimulus stimulus = TextureStimulus(texture = texture, position = (screen.size[0]/2,screen.size[1]/2), anchor = 'center', size = (width*scale,height*scale), mipmaps_enabled = 0, texture_min_filter=gl.GL_LINEAR) texture_object = stimulus.parameters.texture.get_texture_object() def update_movie(): # While movie.play() decompresses the movie to pygame surface # in a separate thread, this sends the data to OpenGL. texture_object.put_sub_image( pygame_surface ) viewport = Viewport(screen=screen, stimuli=[stimulus,text]) p = Presentation(go_duration=('forever',), viewports=[viewport], handle_event_callbacks=[(pygame.locals.QUIT, quit), (pygame.locals.KEYDOWN, keydown)], ) p.add_controller(None,None,FunctionController(during_go_func=update_movie, temporal_variables=TIME_INDEPENDENT)) movie.play() p.go() visionegg-1.2.1/demo/multi_stim.py0000755000076500000240000002723011224565530016367 0ustar astrawstaff#!/usr/bin/env python """ multiple stimulus demo """ ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.Dots import DotArea2D from VisionEgg.Gratings import SinGrating2D from VisionEgg.MoreStimuli import Target2D from VisionEgg.Textures import Mask2D, Texture, SpinningDrum, TextureStimulus from VisionEgg.Textures import TextureTooLargeError from VisionEgg.Text import Text from math import sin, pi import math from pygame.locals import QUIT, KEYDOWN, MOUSEBUTTONDOWN import numpy ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,0.0,0.0) # make black (RGBA) # display loading screen ASAP screen.clear() loading_text = Text( text = "Vision Egg multi stimulus demo - Loading...", position = (screen.size[0]/2,screen.size[1]/2), anchor = 'center', color = (1.0, 1.0, 1.0), ) viewport_2d = Viewport( screen = screen, stimuli = [loading_text], ) viewport_2d.draw() swap_buffers() x1 = screen.size[0]/4 x2 = 2*screen.size[0]/4 x3 = 3*screen.size[0]/4 y1 = screen.size[1]/3 y2 = 2*screen.size[1]/3 width = screen.size[0]/5 height = width warning_stimuli = [] # display known errors warning_color = (1.0, 0.0, 0.0) # RGB warning_font_size = 20 legends = [] # display legends legend_color = (1.0, 1.0, 1.0) # RGB legend_font_size = 20 ##################################### # text # ##################################### text = Text( text = "Vision Egg multi stimulus demo - Press any key to quit", position = (screen.size[0]/2,screen.size[1]), anchor = 'top', color = (1.0, 1.0, 1.0), ) ##################################### # Random dots # ##################################### dots = DotArea2D( position = ( x1, y1), anchor = 'center', size = ( width, height ), ) legends.append( Text( text = "DotArea2D", position = (x1,y1-height/2+2), anchor = 'top', color = legend_color, font_size = legend_font_size, ) ) ##################################### # Color grating # ##################################### try: circle_mask = Mask2D(function='circle', radius_parameter=100, num_samples=(256,256)) except Exception, x: circle_mask = None warning_stimuli.append( Text( text = "Texture Mask", position = (x1,y2), anchor = 'center', color = warning_color, font_size = warning_font_size, ) ) print "Exception while trying to create circle_mask: %s: %s"%(x.__class__,str(x)) color_grating = SinGrating2D(color1 = (0.5, 0.25, 0.5), # RGB, Alpha ignored if given color2 = (1.0, 0.5, 0.1), # RGB, Alpha ignored if given contrast = 0.2, pedestal = 0.1, mask = circle_mask, position = (x1,y2), anchor = 'center', size = (width,width), # must be square for circle shape spatial_freq = 20.0/ screen.size[0], temporal_freq_hz = 1.0, orientation = 270.0) legends.append( Text( text = "SinGrating2D (color)", position = (x1,y2-height/2+2), anchor = 'top', color = legend_color, font_size = legend_font_size, ) ) def pedestal_func(t): # Calculate pedestal over time. (Pedestal range [0.1,0.9] and # contrast = 0.2 limits total range to [0.0,1.0]) temporal_freq_hz = 0.2 return 0.4 * sin(t*2*pi * temporal_freq_hz) + 0.5 ##################################### # Spinning drum with moving POV # ##################################### # Get a texture filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","panorama.jpg") texture = Texture(filename) drum = SpinningDrum(texture=texture,shrink_texture_ok=True) legends.append( Text( text = "SpinningDrum", position = (x2,y2-height/2+2), anchor = 'top', color = legend_color, font_size = legend_font_size, ) ) def angle_as_function_of_time(t): return 90.0*t % 360.0 # rotate at 90 degrees per second (wrap at 360) def cam_matrix_f(t): cam_matrix = ModelView() eye = (0.0,sin(t*0.3)+2.0,-2.0) camera_look_at = (0.0,0.0,0.0) camera_up = (0.0,1.0,0.0) cam_matrix.look_at( eye, camera_look_at, camera_up) return cam_matrix.get_matrix() drum_camera_matrix = ModelView() ########## # Gabor # ########## gray_rect = Target2D( position = ( x2, y1 ), anchor = 'center', size = ( width, height ), color = (0.5, 0.5, 0.5, 1.0), ) try: gaussian_mask = Mask2D(function='gaussian', radius_parameter=25, num_samples=(256,256)) except Exception, x: gaussian_mask = None warning_stimuli.append( Text( text = "Texture Mask", position = (x2,y1), anchor = 'center', color = warning_color, font_size = warning_font_size, ) ) print "Exception while trying to create gaussian_mask: %s: %s"%(x.__class__,str(x)) gabor = SinGrating2D(mask = gaussian_mask, position = ( x2, y1 ), anchor = 'center', size = ( width, height ), spatial_freq = 40.0 / screen.size[0], # units of cycles/pixel temporal_freq_hz = 2.0, orientation = 45.0 ) legends.append( Text( text = "SinGrating2D (gabor)", position = (x2,y1-height/2+2), anchor = 'top', color = legend_color, font_size = legend_font_size, ) ) ######################### # Copy of framebuffer # ######################### # setup Texture instance for proper size and scaling, etc. framebuffer_copy_texture = Texture( texels=screen.get_framebuffer_as_image(format=gl.GL_RGBA) ) try: framebuffer_copy = TextureStimulus( texture = framebuffer_copy_texture, internal_format = gl.GL_RGBA, mipmaps_enabled = False, size = (width,height), texture_min_filter = gl.GL_LINEAR, position = (x3,y1), anchor = 'center', shrink_texture_ok = False, # settting to True causes massive slowdowns ) framebuffer_copy_works = True except Exception, x: warning_stimuli.append( Text( text = "Framebuffer copy", position = (x3,y1), anchor = 'center', color = warning_color, font_size = warning_font_size, ) ) framebuffer_copy_works = False print "Exception while trying to create framebuffer_copy: %s: %s"%(x.__class__,str(x)) legends.append( Text( text = "put_new_framebuffer()", position = (x3,y1-height/2+2), anchor = 'top', color = legend_color, font_size = legend_font_size, ) ) legends.append( Text( text = "put_pixels()", position = (x3,y2-height/2+2), anchor = 'top', color = legend_color, font_size = legend_font_size, ) ) if framebuffer_copy_works: framebuffer_texture_object = framebuffer_copy.parameters.texture.get_texture_object() # OpenGL textures must be power of 2 def next_power_of_2(f): return math.pow(2.0,math.ceil(math.log(f)/math.log(2.0))) fb_width_pow2 = int(next_power_of_2(screen.size[0])) fb_height_pow2 = int(next_power_of_2(screen.size[1])) def copy_framebuffer(): "Replace contents of texture object with new texture copied from framebuffer" framebuffer_texture_object.put_new_framebuffer(size=(fb_width_pow2,fb_height_pow2), internal_format=gl.GL_RGB, buffer='back', ) ######################################## # Create viewports # ######################################## stimuli_2d = [dots, gray_rect, gabor, text, color_grating] if framebuffer_copy_works: stimuli_2d.append(framebuffer_copy) if len(warning_stimuli): warning_stimuli.append( Text( text = "WARNING: This video system has incomplete OpenGL support. Errors in red.", position = (screen.size[0]/2,5), anchor = 'bottom', color = warning_color, font_size = warning_font_size, ) ) stimuli_2d.extend(warning_stimuli) stimuli_2d.extend(legends) viewport_2d.set(stimuli = stimuli_2d) # give viewport_2d our stimuli drum_viewport = Viewport( screen = screen, position = (x2-width/2,y2-height/2), anchor = 'lowerleft', size = (width,height), projection = SimplePerspectiveProjection( fov_x=55.0, aspect_ratio=float(width)/height), camera_matrix = drum_camera_matrix, stimuli = [drum]) ############################################################## # Main loop (not using VisionEgg.FlowControl.Presentation) # ############################################################## # save time frame_timer = VisionEgg.Core.FrameTimer() quit_now = 0 while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = 1 t = VisionEgg.time_func() # update parameters (could also be done with VisionEgg.FlowControl.Controllers) color_grating.parameters.pedestal = pedestal_func(t) drum.parameters.angular_position = angle_as_function_of_time(t) drum_camera_matrix.parameters.matrix = cam_matrix_f(t) # do drawing, etc. (can be done with Presentation.go() method) screen.clear() # clear the back buffer drum_viewport.draw() # draw spinning drum viewport_2d.draw() # draw 2D stimuli pixels = numpy.random.randint(0,256,size=(20,20,3)).astype(numpy.uint8) screen.put_pixels(pixels, scale_x=5.0, scale_y=5.0, position=(x3,y2), anchor='center', ) if framebuffer_copy_works: copy_framebuffer() # make copy of framebuffer in texture for draw on next frame swap_buffers() # display the frame we've drawn in back buffer frame_timer.tick() frame_timer.log_histogram() visionegg-1.2.1/demo/plaid.py0000755000076500000240000000473511224565530015277 0ustar astrawstaff#!/usr/bin/env python """Multiple sinusoidal gratings (with mask).""" ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Gratings import SinGrating2D from VisionEgg.Textures import Mask2D ##################################### # Initialize OpenGL window/screen # ##################################### screen = get_default_screen() ###################################### # Create sinusoidal grating object # ###################################### mask = Mask2D(function='circle', # also supports 'gaussian' radius_parameter=100, # radius for circle, sigma for gaussian (units: num_samples) num_samples=(256,256)) # this many texture elements in mask (covers whole size specified below) # NOTE: I have never worked with plaids before, and I'm not sure the # arithmetic used when combining these gratings is what people want. # Please submit any suggestions. sin1 = SinGrating2D(position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), mask = mask, size = ( 500.0 , 500.0 ), spatial_freq = 10.0 / screen.size[0], # units of cycles/pixel temporal_freq_hz = 0.5, orientation = 45.0, max_alpha = 0.5) # controls "opacity": 1.0 = completely opaque, 0.0 = completely transparent sin2 = SinGrating2D(position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), mask = mask, size = ( 500.0 , 500.0 ), spatial_freq = 10.0 / screen.size[0], # units of cycles/pixel temporal_freq_hz = 0.5, orientation = 135.0, max_alpha = 0.5) # controls "opacity": 1.0 = completely opaque, 0.0 = completely transparent ############################################################### # Create viewport - intermediary between stimuli and screen # ############################################################### viewport = Viewport( screen=screen, stimuli=[sin1,sin2] ) ######################################## # Create presentation object and go! # ######################################## p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport]) p.go() visionegg-1.2.1/demo/project_linear_grating_on_cylinder.py0000644000076500000240000000734211224565530023300 0ustar astrawstaff""" project a linear grating onto a cylinder This script draws a linear sinusoidal grating (on a rectangle positioned in 3D space). The grating is then viewed through many individual viewports approximating the appearance of being projected onto a cylinder. Details on the coordinate transforms are given below. This script does not make use of the VisionEgg.FlowControl module but rather performs the flow control itself. This is a demo script for the Vision Egg realtime visual stimulus generation library. """ from __future__ import division import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import get_default_screen, Viewport,\ SimplePerspectiveProjection, FrameTimer, swap_buffers import pygame from pygame.locals import QUIT, KEYDOWN, MOUSEBUTTONDOWN from VisionEgg.Text import Text from VisionEgg.Gratings import SinGrating3D from math import pi, sin, cos import numpy screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,0.0) # black (RGB) stimulus = SinGrating3D( spatial_freq=20.0, temporal_freq_hz=1.0, upperleft=(-5, .25, -1), lowerleft=(-5, -.25, -1), lowerright=(5, -.25, -1), upperright=(5, .25, -1), ) text = Text( text = "Vision Egg project_linear_grating_on_cylinder demo.", position = (screen.size[0]/2,2), anchor = 'bottom', color = (1.0,1.0,1.0)) # use default 2D pixel-coordinate projection for text overlay_viewport = Viewport(screen=screen, stimuli=[text]) num_viewports = 20 arc_degrees = 150 # angle of display D2R = pi/180.0 arc = arc_degrees*D2R arc_center = arc/2 viewport_arc = arc/num_viewports eye = (0,0,0) camera_up = (0,1,0) viewports = [] # The center of the screen is looking, in 3D world coordinates, at -z, # with +y up and +x right. In cylindrical coordinates, the -z axis # corresponds with theta = 0 and the +y axis corresponds with +h, and # theta increases from right to left. In screen coordinates, 0,0 is # the lower left. # Computer lower left corner of viewports (in screen coordinates). lowerlefts = numpy.linspace(0,screen.size[0],num=(num_viewports+1))[::-1] lowerlefts.astype(int) height = screen.size[1] fov_x = viewport_arc/D2R fov_y = 30.0 aspect_ratio = fov_x/fov_y # setup the projections and viewports for i in range(num_viewports): # Compute viewport coordinates (in cylindrical coordinates). theta1 = i*viewport_arc - arc_center theta2 = (i+1)*viewport_arc - arc_center theta = (theta1 + theta2)/2 # Compute camera coordinates (in 3D world coordinates). x = -sin(theta) z = -cos(theta) camera_look_at = (x,0,z) # Now setup the projection and the viewport. ll = int(lowerlefts[i+1]) width = int(lowerlefts[i]-ll) projection = SimplePerspectiveProjection(fov_x=fov_x, aspect_ratio=aspect_ratio) projection.look_at( eye, camera_look_at, camera_up ) viewport = Viewport(screen=screen, projection=projection, stimuli=[stimulus], anchor='lowerleft', position=(ll,0), size=(width,height)) viewports.append(viewport) # list of viewports, drawn in order, so overlay viewport goes last viewports.append( overlay_viewport ) frame_timer = FrameTimer() quit_now = False while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = True screen.clear() for v in viewports: v.draw() swap_buffers() frame_timer.tick() frame_timer.log_histogram() im = screen.get_framebuffer_as_image(buffer='front') im.save('project_linear_grating_on_cylinder.png') visionegg-1.2.1/demo/put_pixels.py0000755000076500000240000000235111224565530016372 0ustar astrawstaff#!/usr/bin/env python import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * import pygame from pygame.locals import * import numpy screen = get_default_screen() screen.set( bgcolor = (0.0,0.0,0.0) ) # black (RGB) white_data = numpy.ones((100,200,3),dtype=numpy.uint8)*255 red_data = white_data.copy() red_data[:,:,1:] = 0 # zero non-red channels blue_data = white_data.copy() blue_data[:,:,:-1] = 0 # zero non-blue channels frame_timer = FrameTimer() # start frame counter/timer count = 0 quit_now = 0 # This style of main loop is an alternative to using the # VisionEgg.FlowControl module. while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = 1 screen.clear() count = (count+1) % 3 if count == 0: pixels = white_data elif count == 1: pixels = red_data elif count == 2: pixels = blue_data screen.put_pixels(pixels=pixels, position=(screen.size[0]/2.0,screen.size[1]/2.0), anchor="center") swap_buffers() # display what we've drawn frame_timer.tick() # register frame draw with timer frame_timer.log_histogram() visionegg-1.2.1/demo/pygame_texture.py0000755000076500000240000000207111224565530017237 0ustar astrawstaff#!/usr/bin/env python """Load a texture from a file using pygame""" import os import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Textures import * import pygame.image import OpenGL.GL as gl filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","visionegg.bmp") pygame_surface = pygame.image.load(filename) texture = Texture(pygame_surface) screen = get_default_screen() # Create the instance of TextureStimulus stimulus = TextureStimulus(texture = texture, position = (screen.size[0]/2.0,screen.size[1]/2.0), anchor = 'center', size = texture.size, mipmaps_enabled = 0, texture_min_filter=gl.GL_LINEAR, shrink_texture_ok=1) viewport = Viewport(screen=screen, stimuli=[stimulus]) p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) p.go() visionegg-1.2.1/demo/Pyro/0000755000076500000240000000000011231315556014550 5ustar astrawstaffvisionegg-1.2.1/demo/Pyro/gratingPyroGUI.py0000755000076500000240000002071111224565530020001 0ustar astrawstaff#!/usr/bin/env python """GUI panel for control of gratingPyroServer""" # Copyright (c) 2002-2003 Andrew Straw. Distributed under the terms # of the GNU Lesser General Public License (LGPL). import sys, os import Tkinter import VisionEgg.PyroClient class CallbackEntry(Tkinter.Entry): def __init__(self,master=None,callback=None,**kw): Tkinter.Entry.__init__(self,master,**kw) self.bind('',callback) self.bind('',callback) class StimulusControlFrame(Tkinter.Frame): def __init__(self, master=None, suppress_begin_button=0,**kw): Tkinter.Frame.__init__(self,master,**kw) self.entry_width = 10 self.connected = 0 # let columns expand self.columnconfigure(0,weight=1) self.columnconfigure(1,weight=1) row = 0 Tkinter.Label(self,text="Grating Experiment").grid(row=row,column=0,columnspan=2) row += 1 # let columns expand connected_frame = Tkinter.Frame(self) connected_frame.grid(row=row,column=0,columnspan=2,sticky=Tkinter.W+Tkinter.E) connected_frame.columnconfigure(0,weight=1) connected_frame.columnconfigure(1,weight=1) connected_frame.columnconfigure(2,weight=1) Tkinter.Label(connected_frame,text="Server hostname:").grid(row=0,column=0,sticky=Tkinter.E) self.server_hostname = Tkinter.StringVar() self.server_hostname.set( '' ) Tkinter.Entry(connected_frame,textvariable=self.server_hostname).grid(row=0, column=1, columnspan=2, sticky=Tkinter.W+Tkinter.E) self.connected_label = Tkinter.Label(connected_frame,text="Server status: Not connected") self.connected_label.grid(row=1,column=0) Tkinter.Button(connected_frame,text="Connect",command=self.connect).grid(row=1,column=1) Tkinter.Button(connected_frame,text="Quit server",command=self.quit_server).grid(row=1,column=2) row += 1 between_go_frame = Tkinter.Frame(self) between_go_frame.grid(row=row,column=0,sticky=Tkinter.N) bgf_row = 0 Tkinter.Label(between_go_frame,text="Between trials").grid(row=bgf_row,column=0,columnspan=2) bgf_row += 1 Tkinter.Label(between_go_frame,text="Contrast:").grid(row=bgf_row,column=0) self.between_contrast = Tkinter.DoubleVar() self.between_contrast.set(1.0) CallbackEntry(between_go_frame,self.send_values,width=self.entry_width,textvariable=self.between_contrast).grid(row=bgf_row,column=1) bgf_row += 1 Tkinter.Label(between_go_frame,text="Spatial Frequency:").grid(row=bgf_row,column=0) self.between_sf = Tkinter.DoubleVar() self.between_sf.set(0.02) CallbackEntry(between_go_frame,self.send_values,width=self.entry_width,textvariable=self.between_sf).grid(row=bgf_row,column=1) bgf_row += 1 Tkinter.Label(between_go_frame,text="Temporal Frequency:").grid(row=bgf_row,column=0) self.between_tf = Tkinter.DoubleVar() self.between_tf.set(0.0) CallbackEntry(between_go_frame,self.send_values,width=self.entry_width,textvariable=self.between_tf).grid(row=bgf_row,column=1) bgf_row += 1 Tkinter.Label(between_go_frame,text="Orientation:").grid(row=bgf_row,column=0) self.between_orient = Tkinter.DoubleVar() self.between_orient.set(0.0) CallbackEntry(between_go_frame,self.send_values,width=self.entry_width,textvariable=self.between_orient).grid(row=bgf_row,column=1) trial_frame = Tkinter.Frame(self) trial_frame.grid(row=row,column=1,sticky=Tkinter.N) tf_row = 0 Tkinter.Label(trial_frame,text="Trial Parameters").grid(row=tf_row,column=0,columnspan=2) tf_row += 1 Tkinter.Label(trial_frame,text="Contrast:").grid(row=tf_row,column=0) self.trial_contrast = Tkinter.DoubleVar() self.trial_contrast.set(1.0) CallbackEntry(trial_frame,self.send_values,width=self.entry_width,textvariable=self.trial_contrast).grid(row=tf_row,column=1) tf_row += 1 Tkinter.Label(trial_frame,text="Spatial Frequency:").grid(row=tf_row,column=0) self.trial_sf = Tkinter.DoubleVar() self.trial_sf.set(0.02) CallbackEntry(trial_frame,self.send_values,width=self.entry_width,textvariable=self.trial_sf).grid(row=tf_row,column=1) tf_row += 1 Tkinter.Label(trial_frame,text="Temporal Frequency:").grid(row=tf_row,column=0) self.trial_tf = Tkinter.DoubleVar() self.trial_tf.set(0.5) CallbackEntry(trial_frame,self.send_values,width=self.entry_width,textvariable=self.trial_tf).grid(row=tf_row,column=1) tf_row += 1 Tkinter.Label(trial_frame,text="Orientation:").grid(row=tf_row,column=0) self.trial_orient = Tkinter.DoubleVar() self.trial_orient.set(0.0) CallbackEntry(trial_frame,self.send_values,width=self.entry_width,textvariable=self.trial_orient).grid(row=tf_row,column=1) tf_row += 1 Tkinter.Label(trial_frame,text="Duration (sec):").grid(row=tf_row,column=0) self.trial_dur_sec = Tkinter.DoubleVar() self.trial_dur_sec.set(2.0) CallbackEntry(trial_frame,self.send_values,width=self.entry_width,textvariable=self.trial_dur_sec).grid(row=tf_row,column=1) if not suppress_begin_button: tf_row += 1 Tkinter.Button(trial_frame,text="Begin Trial",command=self.go).grid(row=tf_row,column=0,columnspan=2) def get_stim_param_dict(self): dict = {} self_dict = dir(self) for attrname in self_dict: if isinstance( getattr(self,attrname), Tkinter.Variable): dict[attrname] = getattr(self,attrname) return dict def go(self): self.send_values() self.go_controller.set_between_go_value(1) self.go_controller.evaluate_now() def send_values(self,dummy=None): if self.connected: self.duration_controller.set_during_go_value( (self.trial_dur_sec.get(),'seconds') ) self.contrast_controller.set_during_go_value( self.trial_contrast.get() ) self.contrast_controller.set_between_go_value( self.between_contrast.get() ) self.contrast_controller.evaluate_now() self.sf_controller.set_during_go_value( self.trial_sf.get() ) self.sf_controller.set_between_go_value( self.between_sf.get() ) self.sf_controller.evaluate_now() self.tf_controller.set_during_go_value( self.trial_tf.get() ) self.tf_controller.set_between_go_value( self.between_tf.get() ) self.tf_controller.evaluate_now() self.orient_controller.set_during_go_value( self.trial_orient.get() ) self.orient_controller.set_between_go_value( self.between_orient.get() ) self.orient_controller.evaluate_now() def connect(self,dummy=None): client = VisionEgg.PyroClient.PyroClient(server_hostname=self.server_hostname.get(), server_port=7766) self.tf_controller = client.get('tf_controller') self.sf_controller = client.get('sf_controller') self.contrast_controller = client.get('contrast_controller') self.orient_controller = client.get('orient_controller') self.duration_controller = client.get('duration_controller') self.go_controller = client.get('go_controller') self.quit_controller = client.get('quit_controller') self.connected = 1 self.send_values() self.connected_label.config(text="Server status: connected") def quit_server(self,dummy=None): self.quit_controller.set_during_go_value(1) self.quit_controller.set_between_go_value(1) self.quit_controller.evaluate_now() self.connected = 0 del self.tf_controller del self.sf_controller del self.contrast_controller del self.orient_controller del self.duration_controller del self.go_controller del self.quit_controller if __name__=='__main__': frame = StimulusControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/demo/Pyro/gratingPyroServer.py0000755000076500000240000000417411224565530020630 0ustar astrawstaff#!/usr/bin/env python """Create sinusoidal grating stimulus and allow control with gratingPyroGUI """ # Copyright (c) 2002-2003 Andrew Straw. Distributed under the terms # of the GNU Lesser General Public License (LGPL). import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Gratings import * from VisionEgg.PyroHelpers import * pyro_server = PyroServer() # get visionegg stimulus ready to go screen = get_default_screen() stimulus = SinGrating2D() viewport = Viewport(screen=screen,stimuli=[stimulus]) p = Presentation(viewports=[viewport]) # make a controller, serve it via pyro, and glue it to the Presentation tf_controller = PyroConstantController(during_go_value=0.0) pyro_server.connect(tf_controller,'tf_controller') p.add_controller(stimulus,'temporal_freq_hz', tf_controller) sf_controller = PyroConstantController(during_go_value=0.0) pyro_server.connect(sf_controller,'sf_controller') p.add_controller(stimulus,'spatial_freq', sf_controller) contrast_controller = PyroConstantController(during_go_value=0.0) pyro_server.connect(contrast_controller,'contrast_controller') p.add_controller(stimulus,'contrast', contrast_controller) orient_controller = PyroConstantController(during_go_value=0.0) pyro_server.connect(orient_controller,'orient_controller') p.add_controller(stimulus,'orientation', orient_controller) duration_controller = PyroConstantController(during_go_value=(5.0,'seconds')) pyro_server.connect(duration_controller,'duration_controller') p.add_controller(p,'go_duration', duration_controller) go_controller = PyroConstantController(during_go_value=0,eval_frequency=0) pyro_server.connect(go_controller,'go_controller') p.add_controller(p,'enter_go_loop', go_controller) quit_controller = PyroConstantController(during_go_value=0) pyro_server.connect(quit_controller,'quit_controller') p.add_controller(p,'quit', quit_controller) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # initialize graphics to between presentations state p.run_forever() visionegg-1.2.1/demo/Pyro/metaPyroGUI.py0000755000076500000240000002360411224565530017300 0ustar astrawstaff#!/usr/bin/env python """Sinusoidal grating stimulus control (see metaPyroServer) """ # Copyright (c) 2002 Andrew Straw. Distributed under the terms # of the GNU Lesser General Public License (LGPL). import sys, os import Tkinter import Pyro.core import VisionEgg.PyroClient class GratingMetaParameters: def __init__(self): self.contrast = 1.0 self.orient = 0.0 self.sf = 0.02 self.tf = 1.0 self.pre_stim_sec = 1.0 self.stim_sec = 2.0 self.post_stim_sec = 1.0 class CallbackEntry(Tkinter.Entry): def __init__(self,master=None,callback=None,**kw): Tkinter.Entry.__init__(self,master, **kw) self.bind('',callback) self.bind('',callback) class StimulusControlFrame(Tkinter.Frame): def __init__(self, master=None, suppress_begin_button=0,**kw): Tkinter.Frame.__init__(self,master,**kw) self.pyro_client = None self.entry_width = 10 self.connected = 0 self.meta_params = GratingMetaParameters() self.loopable_variables = {} row = 0 Tkinter.Label(self,text="Grating Experiment").grid(row=row,column=0,columnspan=2) row += 1 # let columns expand connected_frame = Tkinter.Frame(self) connected_frame.grid(row=row,column=0,columnspan=2,sticky=Tkinter.W+Tkinter.E) connected_frame.columnconfigure(0,weight=1) connected_frame.columnconfigure(1,weight=1) connected_frame.columnconfigure(2,weight=1) Tkinter.Label(connected_frame,text="Server hostname:").grid(row=0,column=0,sticky=Tkinter.E) self.server_hostname = Tkinter.StringVar() self.server_hostname.set( '' ) Tkinter.Entry(connected_frame,textvariable=self.server_hostname).grid(row=0, column=1, columnspan=2, sticky=Tkinter.W+Tkinter.E) self.connected_label = Tkinter.Label(connected_frame,text="Server status: Not connected") self.connected_label.grid(row=1,column=0) Tkinter.Button(connected_frame,text="Connect",command=self.connect).grid(row=1,column=1) Tkinter.Button(connected_frame,text="Quit server",command=self.quit_server).grid(row=1,column=2) row += 1 param_frame = Tkinter.Frame(self) param_frame.grid(row=row,column=0,sticky=Tkinter.N) param_frame.columnconfigure(0,weight=1) param_frame.columnconfigure(1,weight=1) pf_row = 0 Tkinter.Label(param_frame,text="Contrast:").grid(row=pf_row,column=0) self.contrast_tk_var = Tkinter.DoubleVar() self.contrast_tk_var.set(1.0) CallbackEntry(param_frame, self.send_values, width=self.entry_width, textvariable=self.contrast_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Contrast"] = ("contrast",self.contrast_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Spatial frequency:").grid(row=pf_row,column=0) self.sf_tk_var = Tkinter.DoubleVar() self.sf_tk_var.set(0.02) CallbackEntry(param_frame, self.send_values, width=self.entry_width, textvariable=self.sf_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Spatial frequency"] = ("sf",self.sf_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Temporal frequency:").grid(row=pf_row,column=0) self.tf_tk_var = Tkinter.DoubleVar() self.tf_tk_var.set(5.0) CallbackEntry(param_frame, self.send_values, width=self.entry_width, textvariable=self.tf_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Temporal frequency"] = ("tf",self.tf_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Orientation:").grid(row=pf_row,column=0) self.orient_tk_var = Tkinter.DoubleVar() self.orient_tk_var.set(0.0) CallbackEntry(param_frame, self.send_values, width=self.entry_width, textvariable=self.orient_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Orientation"] = ("orient",self.orient_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0) self.prestim_dur_tk_var = Tkinter.DoubleVar() self.prestim_dur_tk_var.set(1.0) CallbackEntry(param_frame, self.send_values, width=self.entry_width, textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0) self.stim_dur_tk_var = Tkinter.DoubleVar() self.stim_dur_tk_var.set(2.0) CallbackEntry(param_frame, self.send_values, width=self.entry_width, textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0) self.poststim_dur_tk_var = Tkinter.DoubleVar() self.poststim_dur_tk_var.set(1.0) CallbackEntry(param_frame, self.send_values, width=self.entry_width, textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=1) if not suppress_begin_button: row += 1 Tkinter.Button(self,text="Begin Trial",command=self.go).grid(row=row,column=0,columnspan=2) def get_shortname(self): """Used as basename for saving parameter files""" return "simple_grating" def get_param_dict(self): result = {} for param_name in dir(self.meta_params): if param_name[:2] != '__' and param_name[-2:] != '__': result[param_name] = getattr(self.meta_params,param_name) return result def get_type(self): return "metaPyroGUI" def set_param_dict(self,new_param_dict): orig_params = dir(self.meta_params) for new_param_name in new_param_dict.keys(): if new_param_name[:2] != '__' and new_param_name[-2:] != '__': if new_param_name not in orig_params: raise ValueError('Gave parameter "%s", which I do not know about.'%(new_param_name,)) setattr(self.meta_params,new_param_name,new_param_dict[new_param_name]) self.contrast_tk_var.set( self.meta_params.contrast ) self.sf_tk_var.set( self.meta_params.sf ) self.tf_tk_var.set( self.meta_params.tf ) self.orient_tk_var.set( self.meta_params.orient ) self.prestim_dur_tk_var.set( self.meta_params.pre_stim_sec ) self.stim_dur_tk_var.set( self.meta_params.stim_sec ) self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec ) def get_parameters_as_strings(self): result = [] for param_name in dir(self.meta_params): if param_name[:2] != '__' and param_name[-2:] != '__': value = getattr(self.meta_params,param_name) value_string = str(value) result.append((param_name,value_string)) return result def get_loopable_variable_names(self): return self.loopable_variables.keys() def set_loopable_variable(self,easy_name,value): meta_param_var_name,tk_var = self.loopable_variables[easy_name] setattr(self.meta_params,meta_param_var_name,value) tk_var.set(value) self.update() # update screen with new tk_var value def send_values(self,dummy_arg=None): self.meta_params.contrast = self.contrast_tk_var.get() self.meta_params.sf = self.sf_tk_var.get() self.meta_params.tf = self.tf_tk_var.get() self.meta_params.orient = self.orient_tk_var.get() self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() if self.connected: self.meta_controller.set_parameters( self.meta_params ) def get_duration_sec(self): self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec def go(self,dummy_arg=None): self.send_values() if not self.connected: raise RuntimeError("must be connected to metaPyroServer to run trial") self.meta_controller.go() ## if self.connected: ## self.meta_controller.go() def connect(self): self.pyro_client = VisionEgg.PyroClient.PyroClient(server_hostname=self.server_hostname.get(), server_port=7766) self.meta_controller = self.pyro_client.get("meta_controller") self.meta_params = self.meta_controller.get_parameters() self.connected = 1 self.meta_controller.turn_off() self.connected_label.config(text="Server status: Connected") def quit_server(self,dummy=None): self.meta_controller.quit_server() self.connected = 0 self.connected_label.config(text="Server status: Not connected") if __name__=='__main__': frame = StimulusControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/demo/Pyro/metaPyroServer.py0000755000076500000240000000736311224565530020126 0ustar astrawstaff#!/usr/bin/env python """Sinusoidal grating stimulus with complex control from metaPyroGUI This demo illustrates a very easy way to exert complex control of visual stimuli in an experimental setting. A Vision Egg server is started, which opens the display and will do all the drawing. There is a "meta-controller" which is served (via Pyro) to another program which controls the stimuli. The meta-controller can store information in a higher-level format than the Controllers used on individual instances of the Stimulus class. """ # Copyright (c) 2002-2003 Andrew Straw. Distributed under the terms # of the GNU Lesser General Public License (LGPL). import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() import sys import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.Gratings import VisionEgg.PyroHelpers import Pyro.core from metaPyroGUI import GratingMetaParameters class GratingExperimentMetaController( Pyro.core.ObjBase ): """Encapsulates all parameters controlling a grating""" def __init__(self,presentation,grating_stimulus): Pyro.core.ObjBase.__init__(self) self.meta_params = GratingMetaParameters() if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") if not isinstance(grating_stimulus,VisionEgg.Gratings.SinGrating2D): raise ValueError("Expecting instance of VisionEgg.Gratings.SinGrating2D") self.p = presentation self.stim = grating_stimulus self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController(during_go_func=self.on_function)) def turn_off(self): self.stim.parameters.on = 0 def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, GratingMetaParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of GratingMetaParameters") self.update() def on_function(self,t=-1.0): # default time to between trials time """Compute when the grating is on""" if t <= self.meta_params.pre_stim_sec: return 0 # not on yet elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): return 1 # on else: return 0 # off again def update(self): self.stim.parameters.contrast = self.meta_params.contrast self.stim.parameters.orientation = self.meta_params.orient self.stim.parameters.spatial_freq = self.meta_params.sf self.stim.parameters.temporal_freq_hz = self.meta_params.tf self.p.parameters.go_duration = ( self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec, 'seconds') def go(self): self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() # get Vision Egg stimulus ready to go screen = VisionEgg.Core.Screen.create_default() stimulus = VisionEgg.Gratings.SinGrating2D() viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus]) p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) # now hand over control of stimulus to GratingExperimentMetaController meta_controller = GratingExperimentMetaController(p,stimulus) pyro_server.connect(meta_controller,"meta_controller") # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/demo/Pyro/simpleClient.py0000755000076500000240000000130611224565530017556 0ustar astrawstaff#!/usr/bin/env python from VisionEgg.PyroClient import * import time, sys if len(sys.argv) >= 2: server_hostname = sys.argv[1] else: server_hostname = '' print "using server hostname '%s'"%server_hostname # Get the controllers client = PyroClient(server_hostname=server_hostname) tf_controller = client.get('tf_controller') quit_controller = client.get('quit_controller') # Set a temporal frequency # Note that we never enter the 'go' loop in this demo, so we are only # concerned with setting the between_go_value tf_controller.set_between_go_value(1.0) tf_controller.evaluate_now() time.sleep(5.0) # show for 5 seconds quit_controller.set_between_go_value(1) quit_controller.evaluate_now() visionegg-1.2.1/demo/Pyro/simpleServer.py0000755000076500000240000000257011224565530017612 0ustar astrawstaff#!/usr/bin/env python """Run a simple VisionEgg Pyro server. You will need to have a Pyro Name Server running on your network for this to work. It comes with the Pyro distribution as a script in the bin directory called ns. Run it, run this script, and then run simpleClient.py from any computer on your network! """ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Gratings import * from VisionEgg.PyroHelpers import * pyro_server = PyroServer() # get visionegg stimulus ready to go screen = get_default_screen() stimulus = SinGrating2D(temporal_freq_hz=0.0) viewport = Viewport(screen=screen,stimuli=[stimulus]) p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) # make a controller, serve it via pyro, and glue it to the Presentation tf_controller = PyroConstantController(during_go_value=0.0) pyro_server.connect(tf_controller,'tf_controller') p.add_controller(stimulus,'temporal_freq_hz', tf_controller) quit_controller = PyroConstantController(during_go_value=0) pyro_server.connect(quit_controller,'quit_controller') p.add_controller(p,'quit', quit_controller) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # initialize graphics to between presentations state p.run_forever() visionegg-1.2.1/demo/quicktime.py0000755000076500000240000000363411224565530016176 0ustar astrawstaff#!/usr/bin/env python """Display a quicktime movie in the Vision Egg. See also mpeg.py, which plays MPEG movies. """ import os, sys import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.Text import * from VisionEgg.Textures import * from VisionEgg.QuickTime import new_movie_from_filename, MovieTexture from pygame.locals import * screen = get_default_screen() screen.set(bgcolor=(0,0,0)) if len(sys.argv) > 1: filename = sys.argv[1] else: filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","water.mov") movie = new_movie_from_filename(filename) bounds = movie.GetMovieBox() height = bounds.bottom-bounds.top width = bounds.right-bounds.left scale_x = screen.size[0]/float(width) scale_y = screen.size[1]/float(height) scale = min(scale_x,scale_y) # maintain aspect ratio movie_texture = MovieTexture(movie=movie) stimulus = TextureStimulus( texture=movie_texture, position = (screen.size[0]/2.0,screen.size[1]/2.0), anchor = 'center', mipmaps_enabled = False, # can't do mipmaps with QuickTime movies shrink_texture_ok = True, size = (width*scale, height*scale), ) text = Text( text = "Vision Egg QuickTime movie demo - Press any key to quit", position = (screen.size[0]/2,screen.size[1]), anchor = 'top', color = (1.0, 1.0, 1.0), ) viewport = Viewport(screen=screen, stimuli=[stimulus, text]) movie.StartMovie() frame_timer = FrameTimer() quit_now = 0 while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = 1 movie.MoviesTask(0) screen.clear() viewport.draw() swap_buffers() # display the frame we've drawn in back buffer frame_timer.tick() if movie.IsMovieDone(): movie.GoToBeginningOfMovie() frame_timer.log_histogram() visionegg-1.2.1/demo/README.txt0000644000076500000240000001022511224565530015316 0ustar astrawstaffThis directory contains several demonstration scripts for the Vision Egg library. Most of these demos are merely a feature overview of the Vision Egg, are not meant to be used for experiments. You can rename the files from *.py to *.pyw so they don't open a console window. On Mac OS X this may be required (depending on how Python is configured). The multi_stim.py demo shows many stimuli at once, and may be a good starting point. The metaPyroServer.py and metaPyroGUI.py scripts are the easiest place to get started creating a complete experiment generation application using a pure Python approach. These demos are advanced and attempt to "put it all together". The ephys_server.py and ephys_gui.py applications one step farther. Another example of a script that could be used for experiments is the gratingTCP script in the tcp directory. This can be controlled by gratingGUI, the LabView VIs contributed by Jamie Theobald, or your own program. See trigger_out in the daq directory to see how you could combine it with triggering for easy integration into your current data acquisition system. Contents: --------- alpha_texture.py -- Textures with alpha (transparency). color_grating.py -- Colored sine wave grating in circular mask convert3d_to_2d.py -- Convert 3D position to 2D position displayText.py -- Display text strings dots.py -- Random dot stimulus dots_simple_loop.py -- Draw dots, using your own event loop ephys_gui.pyw -- Client GUI application for electrophysiology experiments ephys_server.py -- Server application for electrophysiology experiments flames_pygame.py -- Flames demo from pygame code repository flames_visionegg.py -- a Vision Egg implementation of pygame flames gabor.py -- Sinusoidal grating in a gaussian mask gamma.py -- Test whether your video drivers support setting gamma ramps grating.py -- Sinusoidal grating calculated in realtime gratings_multi.py -- Sinusoidal gratings calculated in realtime image_sequence_fast.py -- Display a sequence of images using a pseudo-blit routine image_sequence_slow.py -- Display a sequence of images lib3ds-demo.py -- Demonstrate the loading of .3ds file using the lib3ds library makeMovie.py -- Save movie of a black target moving across a white background makeMovie2.py -- Draw dots and save movie using your own event loop mouseTarget.py -- Control a target with the mouse, get SDL/pygame events mouseTarget_user_loop.py -- Control a target with the mouse, using your own event loop. mouse_gabor_2d.py -- sinusoidal grating in gaussian window mouse_gabor_perspective.py -- Perspective-distorted sinusoidal grating in gaussian window movingPOV.py -- 2 viewports, one with a changing perspective mpeg.py -- play MPEG movies in the Vision Egg multi_stim.py -- multiple stimulus demo plaid.py -- Multiple sinusoidal gratings (with mask) sphereMap.py -- Mapping of texture onto sphere target.py -- A moving target targetBackground.py -- Moving target over a spinning drum targetBackground2D.py -- Moving target over a 2D spinning drum texture.py -- Load a texture from a file textureDrum.py -- A texture-mapped spinning drum visual_jitter.py -- Retinal slip demonstration Pyro -- demo directory for remote control of Vision Egg programs Pyro/simpleServer.py -- Very simple usage of Pyro (server) Pyro/simpleClient.py -- Very simple usage of Pyro (client) Pyro/gratingPyroServer.py -- Grating control with low-level Controllers (server) Pyro/gratingPyroGUI.py -- Grating control with low-level Controllers (GUI client) Pyro/metaPyroServer.py -- Grating control with high-level meta-controller (server) Pyro/metaPyroGUI.py -- Grating control with high-level meta-controller (GUI client) daq -- demo directory for data acquisition daq/simple_lpt_out.py -- very simple example of using the parallel port daq/trigger_in.py -- Use an external device to trigger the Vision Egg. daq/trigger_out.py -- Use the Vision Egg to trigger an external device. GUI -- demo directory for graphical user interfaces GUI/drumDemoGUI.py -- Spinning drum with a graphical user interface (old). tcp -- demo directory for control of Vision Egg over TCP tcp/gratingTCP.py -- Start a Vision Egg TCPServer to control a grating tcp/gratingGUI.py -- Python GUI to control gratingTCPvisionegg-1.2.1/demo/sphereMap.py0000755000076500000240000000262611224565530016127 0ustar astrawstaff#!/usr/bin/env python """Mapping of texture onto sphere, compare to az_el_grid""" from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.SphereMap import * from VisionEgg.Textures import * import math, os def projection_matrix_f(t): # This bit of code is from the "movingPOV" demo and can be used to # gain a moving external view of the texture-mapped sphere by # uncommenting the appropriate line below. projection = SimplePerspectiveProjection(fov_x=55.0,aspect_ratio=(screen.size[0]/2.)/screen.size[1]) eye = (0.0,t*0.3+1.0,-2.0) camera_look_at = (0.0,0.0,0.0) camera_up = (0.0,1.0,0.0) projection.look_at( eye, camera_look_at, camera_up) return projection.get_matrix() screen = get_default_screen() filename = os.path.join(config.VISIONEGG_SYSTEM_DIR,"data","az_el.png") texture = Texture(filename) projection = SimplePerspectiveProjection(fov_x=90.0) stimulus = SphereMap(texture=texture,shrink_texture_ok=1,stacks=100,slices=100) viewport = Viewport(screen=screen, size=screen.size, projection=projection, stimuli=[stimulus]) p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport]) #p.add_controller(projection,'matrix', FunctionController(during_go_func=projection_matrix_f)) p.go() visionegg-1.2.1/demo/spiral.py0000755000076500000240000000354511224565530015476 0ustar astrawstaff#!/usr/bin/env python """Load a texture with alpha from a file and draw with mask.""" import os import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.Textures import * import pygame from pygame.locals import * filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","spiral.png") texture = Texture(filename) screen = get_default_screen() screen.set(bgcolor=(0,0,1)) # blue background mask = Mask2D(function='circle', # also supports 'gaussian' radius_parameter=220, # sigma for gaussian, radius for circle (units: num_samples) num_samples=(512,512)) # this many texture elements in mask (covers whole size specified below) # Create the instance of TextureStimulus stimulus = TextureStimulus(texture = texture, mask = mask, position = (screen.size[0]/2.0,screen.size[1]/2.0), anchor = 'center', shrink_texture_ok=True, internal_format=gl.GL_RGBA, ) viewport = Viewport(screen=screen, stimuli=[stimulus]) frame_timer = FrameTimer() quit_now = False spinning = True while not quit_now and spinning: for event in pygame.event.get(): if event.type == QUIT: quit_now = True elif event.type in (KEYDOWN,MOUSEBUTTONDOWN): spinning = False screen.clear() stimulus.parameters.angle = (VisionEgg.time_func()*-180.0)%360.0 # rotate viewport.draw() swap_buffers() frame_timer.tick() while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = True screen.clear() viewport.draw() swap_buffers() frame_timer.tick() frame_timer.log_histogram() visionegg-1.2.1/demo/target.py0000755000076500000240000000375711224565530015477 0ustar astrawstaff#!/usr/bin/env python """A moving target.""" ############################ # Import various modules # ############################ import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, Controller, FunctionController from VisionEgg.MoreStimuli import * from math import * ################################# # Initialize the various bits # ################################# # Initialize OpenGL graphics screen. screen = get_default_screen() # Set the background color to white (RGBA). screen.parameters.bgcolor = (1.0,1.0,1.0,1.0) # Create an instance of the Target2D class with appropriate parameters. target = Target2D(size = (25.0,10.0), color = (0.0,0.0,0.0,1.0), # Set the target color (RGBA) black orientation = -45.0) # Create a Viewport instance viewport = Viewport(screen=screen, stimuli=[target]) # Create an instance of the Presentation class. This contains the # the Vision Egg's runtime control abilities. p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport]) ####################### # Define controller # ####################### # calculate a few variables we need mid_x = screen.size[0]/2.0 mid_y = screen.size[1]/2.0 max_vel = min(screen.size[0],screen.size[1]) * 0.4 # define position as a function of time def get_target_position(t): global mid_x, mid_y, max_vel return ( max_vel*sin(0.1*2.0*pi*t) + mid_x , # x max_vel*sin(0.1*2.0*pi*t) + mid_y ) # y # Create an instance of the Controller class target_position_controller = FunctionController(during_go_func=get_target_position) ############################################################# # Connect the controllers with the variables they control # ############################################################# p.add_controller(target,'position', target_position_controller ) ####################### # Run the stimulus! # ####################### p.go() visionegg-1.2.1/demo/targetBackground.py0000755000076500000240000000563111224565530017470 0ustar astrawstaff#!/usr/bin/env python """Moving target over a spinning drum.""" ############################ # Import various modules # ############################ from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, Controller, FunctionController from VisionEgg.MoreStimuli import * from VisionEgg.Textures import * import os from math import * # Initialize OpenGL graphics screen. screen = get_default_screen() ####################### # Create the target # ####################### # Create an instance of the Target2D class with appropriate parameters target = Target2D(size = (25.0,10.0), color = (1.0,1.0,1.0,1.0), # Set the target color (RGBA) black orientation = -45.0) # Create a viewport for the target target_viewport = Viewport(screen=screen, stimuli=[target]) ##################### # Create the drum # ##################### # Get a texture filename = os.path.join(config.VISIONEGG_SYSTEM_DIR,"data","panorama.jpg") texture = Texture(filename) # Create an instance of SpinningDrum class drum = SpinningDrum(texture=texture,shrink_texture_ok=1) # Create a perspective projection for the spinning drum perspective = SimplePerspectiveProjection(fov_x=90.0) # Create a viewport with this projection drum_viewport = Viewport(screen=screen, projection=perspective, stimuli=[drum]) ################################################## # Create an instance of the Presentation class # ################################################## # Add target_viewport last so its stimulus is drawn last. This way the # target is always drawn after (on top of) the drum and is therefore # visible. p = Presentation(go_duration=(10.0,'seconds'),viewports=[drum_viewport,target_viewport]) ######################## # Define controllers # ######################## # calculate a few variables we need mid_x = screen.size[0]/2.0 mid_y = screen.size[1]/2.0 max_vel = min(screen.size[0],screen.size[1]) * 0.4 # define target position as a function of time def get_target_position(t): global mid_x, mid_y, max_vel return ( max_vel*sin(0.1*2.0*pi*t) + mid_x , # x max_vel*sin(0.1*2.0*pi*t) + mid_y ) # y def get_drum_angle(t): return 50.0*math.cos(0.2*2*math.pi*t) # Create instances of the Controller class target_position_controller = FunctionController(during_go_func=get_target_position) drum_angle_controller = FunctionController(during_go_func=get_drum_angle) ############################################################# # Connect the controllers with the variables they control # ############################################################# p.add_controller(target,'position', target_position_controller ) p.add_controller(drum,'angular_position', drum_angle_controller ) ####################### # Run the stimulus! # ####################### p.go() visionegg-1.2.1/demo/targetBackground2D.py0000644000076500000240000000553611224565530017657 0ustar astrawstaff#!/usr/bin/env python """Moving target over a 2D spinning drum.""" ############################ # Import various modules # ############################ from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, Controller, FunctionController from VisionEgg.MoreStimuli import * from VisionEgg.Textures import * import os from math import * # Initialize OpenGL graphics screen. screen = get_default_screen() ####################### # Create the target # ####################### # Create an instance of the Target2D class with appropriate parameters target = Target2D(size = (25.0,10.0), color = (1.0,1.0,1.0,0.5), # Set the target color (RGBA) black orientation = -45.0) ########################## # Create the flat drum # ########################## # Get a texture filename = os.path.join(config.VISIONEGG_SYSTEM_DIR,"data","panorama.jpg") texture = Texture(filename) # Create an instance of SpinningDrum class drum = SpinningDrum(texture=texture, shrink_texture_ok=1, flat=1, anchor='center', position=(screen.size[0]/2,screen.size[1]/2), ) ######################### # Create the viewport # ######################### # Create a viewport for the target viewport = Viewport(screen=screen, stimuli=[drum,target]) ################################################## # Create an instance of the Presentation class # ################################################## # Add target_viewport last so its stimulus is drawn last. This way the # target is always drawn after (on top of) the drum and is therefore # visible. p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport]) ######################## # Define controllers # ######################## # calculate a few variables we need mid_x = screen.size[0]/2.0 mid_y = screen.size[1]/2.0 max_vel = min(screen.size[0],screen.size[1]) * 0.4 # define target position as a function of time def get_target_position(t): global mid_x, mid_y, max_vel return ( max_vel*sin(0.1*2.0*pi*t) + mid_x , # x max_vel*sin(0.1*2.0*pi*t) + mid_y ) # y def get_drum_angle(t): return 10.0*t # Create instances of the Controller class target_position_controller = FunctionController(during_go_func=get_target_position) drum_angle_controller = FunctionController(during_go_func=get_drum_angle) ############################################################# # Connect the controllers with the variables they control # ############################################################# p.add_controller(target,'position', target_position_controller ) p.add_controller(drum,'angular_position', drum_angle_controller ) ####################### # Run the stimulus! # ####################### p.go() visionegg-1.2.1/demo/tcp/0000755000076500000240000000000011231315556014405 5ustar astrawstaffvisionegg-1.2.1/demo/tcp/gratingGUI.py0000755000076500000240000011140311231310753016754 0ustar astrawstaff#!/usr/bin/env python """gratingGUI.py -- Control stimulus produced by gratingTCP.py When used with the gratingTCP demo, this is a near-complete application for use in experiments. Because this program sends commands to the Vision Egg only over TCP, it can serve as a template for control of the Vision Egg via a TCP connection from any language capable of making such a connection. The most dominant source of complexity in this code is GUI creation, followed by Python code to do networking and parse strings. To use the Vision Egg over the TCP, you don't need to know Python (either for networking or GUI creation). Therefore, it would be instructive to see what is sent over the TCP port without delving into this code. If you set the variable "log_tcp_commands" below, the program will save a copy of everything sent over the TCP port. That may be more instructive than trying to understand this code! Also, if you do want to exercise control from Python on a remote computer, I highly recommend using Pyro rather than dealing with this kind of stuff!""" # Note that the Vision Egg is not imported! # This script can be run on computers without the Vision Egg installed import Tkinter, tkMessageBox import sys, socket, time, select, re, string, types, traceback import numpy, math # Save a copy of everything sent? log_stream = sys.stdout BUFSIZE = 4096 class SocketChecker: _re_controllable = re.compile(r'^"(.*)" controllable with this connection.$',re.MULTILINE) _re_error_line = re.compile(r"^(Error.*)\n",re.MULTILINE) def __init__(self,my_socket,starting_buffer,name_dict): self.socket = my_socket if starting_buffer is None: self.buffer = "" else: self.buffer = starting_buffer self.name_dict = name_dict self.name_handler = {} self.first_check_done = 0 def check(self): # Check to see if anything has happened on the socket try: fileno = self.socket.fileno() except: return ready_to_read, temp, temp2 = select.select([fileno],[],[],0) new_info = 0 while len(ready_to_read): try: new = self.socket.recv(BUFSIZE) if len(new) == 0: # Disconnected raise RuntimeError("Socket disconnected") except Exception, x: tkMessageBox.showwarning(title="Connection Error", message="%s:\n%s"%(str(x.__class__),str(x))) raise new_info = 1 self.buffer += new try: fileno = self.socket.fileno() except: return ready_to_read, temp, temp2 = select.select([fileno],[],[],0) if new_info or not self.first_check_done: self.first_check_done = 1 # Handle variations on newlines: self.buffer = string.replace(self.buffer,chr(0x0D),"") # no CR self.buffer = string.replace(self.buffer,chr(0x0A),"\n") # LF = newline # New names? self.buffer = SocketChecker._re_controllable.sub(self.new_name_parser,self.buffer) # New values from names? for tcp_name in self.name_handler.keys(): (name_re_str, parser) = self.name_handler[tcp_name] self.buffer = name_re_str.sub(parser,self.buffer) # Unhandles lines? self.buffer = SocketChecker._re_error_line.sub(self.unhandled_line,self.buffer) def unhandled_line(self,match): tkMessageBox.showwarning(title="Unexpected error", message="The following error was received from the server:\n"+match.group(1)) return "" def new_name_parser(self,match): class Parser: def __init__(self,tcp_name,name_dict): self.tcp_name = tcp_name self.name_dict = name_dict def parse_func(self,match): # Could make this into a lambda function self.name_dict[self.tcp_name] = match.groups()[-1] return "" tcp_name = match.group(1) name_re_str = re.compile("^"+tcp_name+r"\s*=\s*(.*)\s*$",re.MULTILINE) parser = Parser(tcp_name,self.name_dict).parse_func self.name_handler[tcp_name] = (name_re_str, parser) self.name_dict[tcp_name] = None # initial value # request value self.socket.send(tcp_name+"\n") return "" class SocketLogger: def __init__(self,*args,**kw): self.socket = socket.socket(*args,**kw) for attr in dir(self.socket): if attr != "send" and attr != "recv" and attr[:2] != "__": setattr(self,attr,getattr(self.socket,attr)) def send(self,message): log_stream.write(">>> "+message) self.socket.send(message) def recv(self,bufsize): message = self.socket.recv(bufsize) log_stream.write("<<< "+message) return message def connect(): class ConnectWindow(Tkinter.Frame): def __init__(self,master=None,host="",port=5000,**kw): Tkinter.Frame.__init__(self,master,**kw) self.next_row = 0 self.socket = None self.buffer = "" real_problem = 0 try: host = socket.getfqdn(host) except Exception, x: real_problem = x if real_problem: tkMessageBox.showerror(title="Fatal Error", message="Could not get default hostname and port:\n%s\n%s"%(str(real_problem.__class__),str(real_problem))) raise real_problem Tkinter.Label(self, text="""Welcome to the Grating GUI demo of the Vision Egg! This demo allows you to control a sinusoidal grating in realtime. Please enter the hostname and port number of the computer on which you have the "gratingTCP" demo running. That computer should display a dialog box saying "awaiting connection...". This demo illustrates the concept of "Controllers" by exposing most of their functionality. Any errors produced by this program will be sent to Python's standard error console. Any errors produced by the gratingTCP program should be logged in the normal Vision Egg way. In this demo is possible to crash the Vision Egg TCP server. Because this is still beta software, and because the purpose of this demonstration is to expose as much power and functionality as possible, you can set various controllers to values that will crash the server.""").grid(row=self.next_row,column=0,columnspan=2) self.next_row += 1 Tkinter.Label(self,text="Hostname:").grid(row=self.next_row, column=0) self.hostname = Tkinter.StringVar() self.hostname.set(host) Tkinter.Entry(self,textvariable=self.hostname).grid(row=self.next_row, column=1) self.next_row += 1 Tkinter.Label(self,text="Port:").grid(row=self.next_row, column=0) self.port = Tkinter.StringVar() self.port.set(port) Tkinter.Entry(self,textvariable=self.port).grid(row=self.next_row, column=1) self.next_row += 1 b = Tkinter.Button(self,text="Connect",command=self.connect) b.bind("",self.connect) b.grid(row=self.next_row,columnspan=2) self.next_row += 1 def connect(self,dummy_arg=None): global BUFSIZE host = self.hostname.get() try: port = int(self.port.get()) except: port = self.port.get() try: host = socket.getfqdn(host) except Exception,x: traceback.print_exc() tkMessageBox.showwarning(title="Connection Error", message="%s:\n%s"%(str(x.__class__),str(x))) return self.socket = SocketLogger(socket.AF_INET,socket.SOCK_STREAM) try: self.socket.connect((host,port)) except Exception,x: sys.stderr.write("Attempting to connect to \"%s\":\n"%(str(host),)) traceback.print_exc() tkMessageBox.showwarning(title="Connection Error", message="%s:\n%s"%(str(x.__class__),str(x))) return self.socket.setblocking(0) timeout = 3.0 ready_to_read, temp, temp2 = select.select([self.socket],[],[],timeout) while len(ready_to_read): try: new = self.socket.recv(BUFSIZE) if len(new) == 0: # Disconnected raise RuntimeError("Socket disconnected") except Exception, x: traceback.print_exc() tkMessageBox.showwarning(title="Connection Error", message="%s:\n%s"%(str(x.__class__),str(x))) return self.buffer += new ready_to_read, temp, temp2 = select.select([self.socket],[],[],0) self.destroy() self.quit() connect_window = ConnectWindow() connect_window.pack() connect_window.winfo_toplevel().title("Vision Egg: Connect") connect_window.mainloop() return (connect_window.socket, connect_window.buffer) class BarButton(Tkinter.Menubutton): # Taken from Guido van Rossum's Tkinter svkill demo def __init__(self, master=None, **cnf): Tkinter.Menubutton.__init__(self, master, **cnf) self.pack(side=Tkinter.LEFT) self.menu = Tkinter.Menu(self, name='menu') self['menu'] = self.menu class GratingControl(Tkinter.Frame): def __init__(self,master=None,socket=None,**kw): Tkinter.Frame.__init__(self,master,**kw) self.socket = socket self.next_row = 0 self.last_values = {} self.complete_list = {} self.names = [] self.columnconfigure(2,weight=2)#,minsize=300) self.columnconfigure(3,weight=2)#,minsize=300) Tkinter.Label(self,text="Controlled parameter").grid(row=self.next_row,column=0) Tkinter.Label(self,text="Controller class").grid(row=self.next_row,column=1) Tkinter.Label(self,text="During go loop").grid(row=self.next_row,column=2) Tkinter.Label(self,text="Between go loops").grid(row=self.next_row,column=3) Tkinter.Label(self,text="Evaluation frequency").grid(row=self.next_row,column=4,columnspan=4) Tkinter.Label(self,text="Temporal variables available\n to eval_str and exec_str").grid(row=self.next_row,column=8,columnspan=4) self.next_row += 1 Tkinter.Label(self,text="Time (seconds)").grid(row=self.next_row,column=8,columnspan=2) Tkinter.Label(self,text="Frames").grid(row=self.next_row,column=10,columnspan=2) self.next_row += 1 Tkinter.Label(self,text="Every frame").grid(row=self.next_row,column=4) Tkinter.Label(self,text="Transitions").grid(row=self.next_row,column=5) Tkinter.Label(self,text="Not during go").grid(row=self.next_row,column=6) Tkinter.Label(self,text="Not between go").grid(row=self.next_row,column=7) Tkinter.Label(self,text="Absolute").grid(row=self.next_row,column=8) Tkinter.Label(self,text="Since go").grid(row=self.next_row,column=9) Tkinter.Label(self,text="Absolute").grid(row=self.next_row,column=10) Tkinter.Label(self,text="Since go").grid(row=self.next_row,column=11) self.next_row += 1 self.make_tkinter_stuff("sf") self.next_row += 1 self.make_tkinter_stuff("tf") self.next_row += 1 self.make_tkinter_stuff("contrast") self.next_row += 1 self.make_tkinter_stuff("phase") self.next_row += 1 self.make_tkinter_stuff("orient") self.next_row += 1 self.make_tkinter_stuff("size") self.next_row += 1 self.make_tkinter_stuff("center") self.next_row += 1 self.make_tkinter_stuff("num_samples") self.next_row += 1 self.make_tkinter_stuff("bit_depth") self.next_row += 1 # take up extra vertical space extra_space = Tkinter.Frame(self) self.rowconfigure(self.next_row, weight=1) extra_space.grid(row=self.next_row,sticky=Tkinter.NW+Tkinter.SE,columnspan=4) self.next_row += 1 def make_tkinter_stuff(self,tcp_name): if tcp_name == "sf": text = "Spatial frequency (cycles/pixel)" elif tcp_name == "tf": text = "Temporal frequency (hz)" elif tcp_name == "contrast": text = "Contrast" elif tcp_name == "center": text = "Center (x,y pixels)" elif tcp_name == "size": text = "Size (x,y pixels)" elif tcp_name == "phase": text = "Phase (degrees)" elif tcp_name == "orient": text = "Orientation (degrees)" elif tcp_name == "num_samples": text = "Number of spatial samples" elif tcp_name == "bit_depth": text = "Bit depth" else: raise RuntimeError("Unknown tcp_name %s"%(tcp_name,)) self.names.append(tcp_name) # comments will show what's happening for tcp_name == "sf" setattr(self,tcp_name+"_class",Tkinter.StringVar()) # self.sf_class = Tkinter.StringVar() setattr(self,tcp_name+"_during",Tkinter.StringVar()) # self.sf_during = Tkinter.StringVar() setattr(self,tcp_name+"_between",Tkinter.StringVar()) # self.sf_between = Tkinter.StringVar() setattr(self,tcp_name+"_eval_flag_every",Tkinter.IntVar()) setattr(self,tcp_name+"_eval_flag_trans",Tkinter.IntVar()) setattr(self,tcp_name+"_eval_flag_ndur",Tkinter.IntVar()) setattr(self,tcp_name+"_eval_flag_nbet",Tkinter.IntVar()) setattr(self,tcp_name+"_t_flag_t_abs",Tkinter.IntVar()) setattr(self,tcp_name+"_t_flag_t",Tkinter.IntVar()) setattr(self,tcp_name+"_t_flag_f_abs",Tkinter.IntVar()) setattr(self,tcp_name+"_t_flag_f",Tkinter.IntVar()) class_var = getattr(self,tcp_name+"_class") during_var = getattr(self,tcp_name+"_during") between_var = getattr(self,tcp_name+"_between") eval_flag_every_var = getattr(self,tcp_name+"_eval_flag_every") eval_flag_trans_var = getattr(self,tcp_name+"_eval_flag_trans") eval_flag_ndur_var = getattr(self,tcp_name+"_eval_flag_ndur") eval_flag_nbet_var = getattr(self,tcp_name+"_eval_flag_nbet") t_flag_t_abs_var = getattr(self,tcp_name+"_t_flag_t_abs") t_flag_t_var = getattr(self,tcp_name+"_t_flag_t") t_flag_f_abs_var = getattr(self,tcp_name+"_t_flag_f_abs") t_flag_f_var = getattr(self,tcp_name+"_t_flag_f") self.last_values[tcp_name+"_class"] = class_var.get() self.last_values[tcp_name+"_during"] = during_var.get() self.last_values[tcp_name+"_between"] = between_var.get() self.last_values[tcp_name+"_eval_flag_every"] = eval_flag_every_var.get() self.last_values[tcp_name+"_eval_flag_trans"] = eval_flag_trans_var.get() self.last_values[tcp_name+"_eval_flag_ndur"] = eval_flag_ndur_var.get() self.last_values[tcp_name+"_eval_flag_nbet"] = eval_flag_nbet_var.get() self.last_values[tcp_name+"_t_flag_t_abs"] = t_flag_t_abs_var.get() self.last_values[tcp_name+"_t_flag_t"] = t_flag_t_var.get() self.last_values[tcp_name+"_t_flag_f_abs"] = t_flag_f_abs_var.get() self.last_values[tcp_name+"_t_flag_f"] = t_flag_f_var.get() Tkinter.Label(self, text=text).grid(row=self.next_row, column=0) setattr(self,tcp_name+"_class_update",self.make_updater(tcp_name,"class")) class_updater = getattr(self,tcp_name+"_class_update") bar = Tkinter.Menubutton(self,textvariable=class_var,relief=Tkinter.RAISED) bar.grid(row=self.next_row,column=1,sticky=Tkinter.W+Tkinter.E,pady=2,padx=2) bar.menu = Tkinter.Menu(bar) bar.menu.add_radiobutton(label="const",variable=class_var,value="const",command=class_updater) bar.menu.add_radiobutton(label="eval_str",variable=class_var,value="eval_str",command=class_updater) bar.menu.add_radiobutton(label="exec_str",variable=class_var,value="exec_str",command=class_updater) bar['menu'] = bar.menu during_entry = Tkinter.Entry(self, textvariable=during_var) during_entry.grid(row=self.next_row, column=2, sticky=Tkinter.W+Tkinter.E,padx=2,ipady=2) setattr(self,tcp_name+"_during_update",self.make_updater(tcp_name,"during")) # self.sf_during_update = self.make_updater("sf","during") during_updater = getattr(self,tcp_name+"_during_update") during_entry.bind("",during_updater) during_entry.bind("",during_updater) between_entry = Tkinter.Entry(self, textvariable=between_var ) between_entry.grid(row=self.next_row, column=3, sticky=Tkinter.W+Tkinter.E,padx=2,ipady=2) setattr(self,tcp_name+"_between_update",self.make_updater(tcp_name,"between")) # self.sf_between_update = self.make_updater("sf","between") between_updater = getattr(self,tcp_name+"_between_update") between_entry.bind("",between_updater) between_entry.bind("",between_updater) setattr(self,tcp_name+"_eval_flag_every_update",self.make_updater(tcp_name,"eval_flag_every")) updater = getattr(self,tcp_name+"_eval_flag_every_update") eval_flag_every_check = Tkinter.Checkbutton(self, variable=eval_flag_every_var, command=updater, takefocus=0) eval_flag_every_check.grid(row=self.next_row, column=4) setattr(self,tcp_name+"_eval_flag_trans_update",self.make_updater(tcp_name,"eval_flag_trans")) updater = getattr(self,tcp_name+"_eval_flag_trans_update") eval_flag_trans_check = Tkinter.Checkbutton(self, variable=eval_flag_trans_var, command=updater, takefocus=0) eval_flag_trans_check.grid(row=self.next_row, column=5) setattr(self,tcp_name+"_eval_flag_ndur_update",self.make_updater(tcp_name,"eval_flag_ndur")) updater = getattr(self,tcp_name+"_eval_flag_ndur_update") eval_flag_ndur_check = Tkinter.Checkbutton(self, variable=eval_flag_ndur_var, command=updater, takefocus=0) eval_flag_ndur_check.grid(row=self.next_row, column=6) setattr(self,tcp_name+"_eval_flag_nbet_update",self.make_updater(tcp_name,"eval_flag_nbet")) updater = getattr(self,tcp_name+"_eval_flag_nbet_update") eval_flag_nbet_check = Tkinter.Checkbutton(self, variable=eval_flag_nbet_var, command=updater, takefocus=0) eval_flag_nbet_check.grid(row=self.next_row, column=7) setattr(self,tcp_name+"_t_flag_t_abs_update",self.make_updater(tcp_name,"t_flag_t_abs")) updater = getattr(self,tcp_name+"_t_flag_t_abs_update") t_flag_t_abs_check = Tkinter.Checkbutton(self, variable=t_flag_t_abs_var, command=updater, takefocus=0) t_flag_t_abs_check.grid(row=self.next_row, column=8) setattr(self,tcp_name+"_t_flag_t_update",self.make_updater(tcp_name,"t_flag_t")) updater = getattr(self,tcp_name+"_t_flag_t_update") t_flag_t_check = Tkinter.Checkbutton(self, variable=t_flag_t_var, command=updater, takefocus=0) t_flag_t_check.grid(row=self.next_row, column=9) setattr(self,tcp_name+"_t_flag_f_abs_update",self.make_updater(tcp_name,"t_flag_f_abs")) updater = getattr(self,tcp_name+"_t_flag_f_abs_update") t_flag_f_abs_check = Tkinter.Checkbutton(self, variable=t_flag_f_abs_var, command=updater, takefocus=0) t_flag_f_abs_check.grid(row=self.next_row, column=10) setattr(self,tcp_name+"_t_flag_f_update",self.make_updater(tcp_name,"t_flag_t")) updater = getattr(self,tcp_name+"_t_flag_f_update") t_flag_f_check = Tkinter.Checkbutton(self, variable=t_flag_f_var, command=updater, takefocus=0) t_flag_f_check.grid(row=self.next_row, column=11) def make_updater(self,tcp_name,attr_name): my_last_value_key = tcp_name+"_"+attr_name # sf_during my_value_var = getattr(self,my_last_value_key) # my_value_var = self.sf_during class UpdaterClass: def __init__(self,my_value_var,my_last_value_key,parent,tcp_name,attr_name): self.my_value_var = my_value_var self.my_last_value_key = my_last_value_key self.parent = parent self.tcp_name = tcp_name self.attr_name = attr_name def update_func(self,dummy_arg=None): tcp_name = self.tcp_name attr_name = self.attr_name my_value_var = self.my_value_var my_last_value_key = self.my_last_value_key new_value = my_value_var.get() if new_value != self.parent.last_values[my_last_value_key]: self.parent.last_values[my_last_value_key] = new_value if tcp_name in self.parent.complete_list.keys(): # send string over TCP controller_tuple = self.parent.complete_list[tcp_name] klass, during, between, eval_frequency, temporal_variables, return_type = controller_tuple if attr_name == "class": if klass != "const" and new_value == "const": #convert from strings try: during = eval(during,{},{}) except: during = 0. during_var = getattr(self.parent,tcp_name+"_during") during_var.set(str(during)) try: between = eval(between,{},{}) except: between = 0. between_var = getattr(self.parent,tcp_name+"_between") between_var.set(str(between)) elif klass == "const" and new_value != "const": #convert to strings during = str(during) between = str(between) klass = new_value elif attr_name == "during": if klass == "const": try: new_value = eval(new_value,{},{}) except: new_value = 0.0 my_value_var.set(str(new_value)) during = new_value elif attr_name == "between": if klass == "const": try: new_value = eval(new_value,{},{}) except: new_value = 0.0 my_value_var.set(str(new_value)) between = new_value elif attr_name == "eval_flag_every": mask = eval_frequency_flags['EVERY_FRAME'] # set the mask bit, but leave the others unchanged eval_frequency = (new_value * mask) + (eval_frequency & ~mask) elif attr_name == "eval_flag_trans": mask = eval_frequency_flags['TRANSITIONS'] # set the mask bit, but leave the others unchanged eval_frequency = (new_value * mask) + (eval_frequency & ~mask) elif attr_name == "eval_flag_ndur": mask = eval_frequency_flags['NOT_DURING_GO'] # set the mask bit, but leave the others unchanged eval_frequency = (new_value * mask) + (eval_frequency & ~mask) elif attr_name == "eval_flag_nbet": mask = eval_frequency_flags['NOT_BETWEEN_GO'] # set the mask bit, but leave the others unchanged eval_frequency = (new_value * mask) + (eval_frequency & ~mask) elif attr_name == "t_flag_t_abs": mask = temporal_variables_flags['TIME_SEC_ABSOLUTE'] # set the mask bit, but leave the others unchanged temporal_variables = (new_value * mask) + (temporal_variables & ~mask) elif attr_name == "t_flag_t": mask = temporal_variables_flags['TIME_SEC_SINCE_GO'] # set the mask bit, but leave the others unchanged temporal_variables = (new_value * mask) + (temporal_variables & ~mask) elif attr_name == "t_flag_f_abs": mask = temporal_variables_flags['FRAMES_ABSOLUTE'] # set the mask bit, but leave the others unchanged temporal_variables = (new_value * mask) + (temporal_variables & ~mask) elif attr_name == "t_flag_f": mask = temporal_variables_flags['FRAMES_SINCE_GO'] # set the mask bit, but leave the others unchanged temporal_variables = (new_value * mask) + (temporal_variables & ~mask) controller_tuple = klass, during, between, eval_frequency, temporal_variables, return_type self.parent.complete_list[tcp_name] = controller_tuple if type(during) == types.StringType: send_during = '"' + during + '"' else: send_during = str(during) if type(between) == types.StringType: send_between = '"' + between + '"' else: send_between = str(between) send_eval = eval2str(eval_frequency) + " | ONCE" send_temporal = temporal2str(temporal_variables) tcp_command = "%s=%s( %s, %s, %s, %s)\n"%(tcp_name,klass,send_during,send_between,send_eval,send_temporal) self.parent.socket.send(tcp_command) instance = UpdaterClass(my_value_var,my_last_value_key,self,tcp_name,attr_name) return instance.update_func def check_dict(self,name_dict): for name in self.names: if name in name_dict.keys(): tcp_string = name_dict[name] if tcp_string is not None: controller_tuple = parse_tcp_string(tcp_string) self.complete_list[name] = controller_tuple klass, during, between, eval_frequency, temporal_variables, return_type = controller_tuple name_dict[name] = None class_name = name+"_class" class_var = getattr(self,class_name) class_var.set(klass) self.last_values[class_name] = klass during_name = name+"_during" during_var = getattr(self,during_name) during_var.set(str(during)) self.last_values[during_name] = during between_name = name+"_between" between_var = getattr(self,between_name) between_var.set(str(between)) self.last_values[between_name] = between e_name = name+"_eval_flag_every" e_var = getattr(self,e_name) e_var.set( (eval_frequency & eval_frequency_flags['EVERY_FRAME']) != 0 ) self.last_values[e_name] = e_var.get() e_name = name+"_eval_flag_trans" e_var = getattr(self,e_name) e_var.set( (eval_frequency & eval_frequency_flags['TRANSITIONS']) != 0 ) self.last_values[e_name] = e_var.get() e_name = name+"_eval_flag_ndur" e_var = getattr(self,e_name) e_var.set( (eval_frequency & eval_frequency_flags['NOT_DURING_GO']) != 0 ) self.last_values[e_name] = e_var.get() e_name = name+"_eval_flag_nbet" e_var = getattr(self,e_name) e_var.set( (eval_frequency & eval_frequency_flags['NOT_BETWEEN_GO']) != 0 ) self.last_values[e_name] = e_var.get() t_name = name+"_t_flag_t_abs" t_var = getattr(self,t_name) t_var.set( (temporal_variables & temporal_variables_flags['TIME_SEC_ABSOLUTE']) != 0 ) self.last_values[t_name] = t_var.get() t_name = name+"_t_flag_t" t_var = getattr(self,t_name) t_var.set( (temporal_variables & temporal_variables_flags['TIME_SEC_SINCE_GO']) != 0 ) self.last_values[t_name] = t_var.get() t_name = name+"_t_flag_f_abs" t_var = getattr(self,t_name) t_var.set( (temporal_variables & temporal_variables_flags['FRAMES_ABSOLUTE']) != 0 ) self.last_values[t_name] = t_var.get() t_name = name+"_t_flag_f" t_var = getattr(self,t_name) t_var.set( (temporal_variables & temporal_variables_flags['FRAMES_SINCE_GO']) != 0 ) self.last_values[t_name] = t_var.get() _re_const = re.compile(r'^const\(\s?(.*)\s?\)$',re.DOTALL) _re_eval_str = re.compile(r'^eval_str\(\s?(.*)\s?\)$',re.DOTALL) _re_exec_str = re.compile(r'^exec_str\(\s?(\*)?\s?(.*)\s?\)$',re.DOTALL) _parse_args_globals = {'numpy':numpy,'math':math} _parse_args_locals = {} eval_frequency_flags = { # eval_frequency flags: 'NEVER' : 0x00, 'EVERY_FRAME' : 0x01, 'TRANSITIONS' : 0x02, 'ONCE' : 0x04, 'NOT_DURING_GO' : 0x08, 'NOT_BETWEEN_GO' : 0x10, } temporal_variables_flags = { # temporal_variables flags: 'TIME_INDEPENDENT' : 0x00, 'TIME_SEC_ABSOLUTE' : 0x01, 'TIME_SEC_SINCE_GO' : 0x02, 'FRAMES_ABSOLUTE' : 0x04, 'FRAMES_SINCE_GO' : 0x08, } for key in dir(numpy): if key[:2] != "__": _parse_args_locals[key] = getattr(numpy,key) for key in dir(math): if key[:2] != "__": _parse_args_locals[key] = getattr(math,key) for key in eval_frequency_flags.keys(): _parse_args_locals[key] = eval_frequency_flags[key] for key in temporal_variables_flags.keys(): _parse_args_locals[key] = temporal_variables_flags[key] def eval2str(flags): str = "" for key in eval_frequency_flags.keys(): if flags & eval_frequency_flags[key]: str += key + " | " if str: str = str[:-3] else: str = "NEVER" return str def temporal2str(flags): str = "" for key in temporal_variables_flags.keys(): if flags & temporal_variables_flags[key]: str += key + " | " if str: str = str[:-3] else: str = "TIME_INDEPENDENT" return str def parse_tcp_string(tcp_string): tcp_string = string.replace(tcp_string,r"\n","\n") match = _re_const.match(tcp_string) if match: klass = "const" if not match: match = _re_eval_str.match(tcp_string) if match: klass = "eval_str" if not match: match = _re_exec_str.match(tcp_string) if match: klass = "exec_str" if not match: raise RuntimeError("Unknown value") arg_string = match.group(1) args = eval("tuple(("+arg_string+"))",_parse_args_globals,_parse_args_locals) num_args = len(args) if num_args == 0: result = (klass,None,None,None,None,None) elif num_args == 1: result = (klass,args[0],None,None,None,None) elif num_args == 2: result = (klass,args[0],args[1],None,None,None) elif num_args == 3: result = (klass,args[0],args[1],args[2],None,None) elif num_args == 4: result = (klass,args[0],args[1],args[2],args[3],None) elif num_args == 5: result = (klass,args[0],args[1],args[2],args[3],args[4]) else: raise RuntimeError return result class TCPApp(Tkinter.Frame): def __init__(self,master=None,socket=None,starting_buffer=None,**kw): Tkinter.Frame.__init__(self,master,**kw) self.socket = socket self.name_dict = {} self.other_interested_instances = [] # also want to know what's happening on the socket self.next_row = 0 self.columnconfigure(1,weight=2)#,minsize=300) self.columnconfigure(2,weight=2)#,minsize=300) # create a menu bar self.bar = Tkinter.Frame(self, name='bar', relief=Tkinter.RAISED, borderwidth=2) self.bar.grid(row=self.next_row, column=0, columnspan=3, sticky=Tkinter.W+Tkinter.E+Tkinter.N) self.bar.file = BarButton(self.bar, text='File') self.bar.file.menu.add_command(label='Quit', command=self.quit) self.bar.file.menu.add_command(label='Also Quit Server', command=self.quit_server) self.bar.tk_menuBar(self.bar.file) self.next_row += 1 # create go loop information b = Tkinter.Button(self,text="Enter go loop",command=self.go) b.bind("",self.go) b.grid(row=self.next_row,column=0) Tkinter.Label(self,text="Go loop duration (value, units):").grid(row=self.next_row, column=1, sticky=Tkinter.E) self.go_duration = Tkinter.StringVar() self.last_duration_value = self.go_duration.get() e = Tkinter.Entry(self,textvariable=self.go_duration) e.bind("",self.duration_updater) e.bind("",self.duration_updater) e.grid(row=self.next_row, column=2,sticky=Tkinter.W+Tkinter.E) self.next_row += 1 # make horizontal rule horiz_rule = Tkinter.Frame(self, relief=Tkinter.SUNKEN, borderwidth=2) self.rowconfigure(self.next_row, minsize=4) horiz_rule.grid(row=self.next_row,sticky=Tkinter.NW+Tkinter.SE,columnspan=3) self.next_row += 1 self.socket_checker = SocketChecker(self.socket,starting_buffer,self.name_dict) self.after(100,self.check_socket) # check socket every 100 msec def duration_updater(self,dummy_arg=None): new_value = self.go_duration.get() if new_value != self.last_duration_value: self.last_duration_value=new_value self.socket.send("go_duration=const(%s,None,ONCE)\n"%(new_value,)) def register_interest(self,instance): self.other_interested_instances.append(instance) def go(self,dummy_arg=None): self.socket.send("go=const(0,1,ONCE)\n") def quit_server(self,dummy_arg=None): # send server quit command self.socket.send("quit\n") time.sleep(0.1) # give it a bit of time... self.socket.shutdown(1) self.socket.close() self.quit() def check_socket(self): self.socket_checker.check() if 'go_duration' in self.name_dict.keys(): tcp_string = self.name_dict['go_duration'] if tcp_string is not None: klass, during, between, eval_frequency, temporal_variables, return_type = parse_tcp_string(tcp_string) if str(during) != self.last_duration_value: self.last_duration_value = str(during) self.go_duration.set( self.last_duration_value ) self.name_dict['go_duration'] = None # reset for instance in self.other_interested_instances: instance.check_dict(self.name_dict) self.after(100,self.check_socket) # check socket every 100 msec if __name__ == '__main__': # Connect (socket, start_buffer) = connect() if socket is None: print "Didn't get a socket, quitting." sys.exit() # Create main application window tcp_app = TCPApp(socket=socket, starting_buffer=start_buffer) tcp_app.pack(expand=1,fill=Tkinter.BOTH) tcp_app.winfo_toplevel().title("Vision Egg: Grating GUI") # Create grating controller tcp_app.grating_control = GratingControl(master=tcp_app, socket=socket) tcp_app.register_interest(tcp_app.grating_control) tcp_app.rowconfigure(tcp_app.next_row, weight=2) tcp_app.grating_control.grid( row=tcp_app.next_row, column=0, columnspan=3, sticky=Tkinter.NW+Tkinter.SE) tcp_app.next_row += 1 # Run until quit tcp_app.mainloop() visionegg-1.2.1/demo/tcp/gratingTCP.py0000755000076500000240000001275111224565530016773 0ustar astrawstaff#!/usr/bin/env python """Sinusoidal grating under network control.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, \ ConstantController, EvalStringController, \ EVERY_FRAME, TIME_SEC_ABSOLUTE from VisionEgg.Gratings import * from VisionEgg.TCPController import * import sys # Vision Egg server name and port hostname = '' port = 5000 # Allow command line to override defaults if len(sys.argv) == 2: try: port = int(sys.argv[1]) except ValueError: hostname = sys.argv[1] elif len(sys.argv) == 3: hostname = sys.argv[1] port = int(sys.argv[2]) # See if user wants to adjust default parameters if VisionEgg.config.VISIONEGG_GUI_INIT: import VisionEgg.GUI # Could import in beginning, but no need if not using GUI window = VisionEgg.GUI.GraphicsConfigurationWindow() window.mainloop() # All this does is adjust VisionEgg.config if not window.clicked_ok: sys.exit() # User wants to quit # Should do dialog here to ask for hostname and port tcp_server = TCPServer(hostname=hostname,port=port,single_socket_but_reconnect_ok=1,confirm_address_with_gui=1) if tcp_server.server_socket is None: # User wants to quit sys.exit() tcp_listener = tcp_server.create_listener_once_connected() # Initialize OpenGL graphics screen. # We don't want to use VisionEgg.get_default_screen() here because we've already # shown the graphics configuration window. screen = Screen(size=(VisionEgg.config.VISIONEGG_SCREEN_W, VisionEgg.config.VISIONEGG_SCREEN_H), fullscreen=VisionEgg.config.VISIONEGG_FULLSCREEN, preferred_bpp=VisionEgg.config.VISIONEGG_PREFERRED_BPP, bgcolor=(0.5,0.5,0.5,0.0), maxpriority=VisionEgg.config.VISIONEGG_MAXPRIORITY) tcp_listener.send_raw_text("Screen size = %s\n"%(screen.size,)) # Create controllers for all variables of a sine wave grating on_controller = tcp_listener.create_tcp_controller( tcp_name="on", initial_controller=ConstantController(during_go_value=1) ) contrast_controller = tcp_listener.create_tcp_controller( tcp_name="contrast", initial_controller=ConstantController(during_go_value=1.0) ) center_controller = tcp_listener.create_tcp_controller( tcp_name="center", initial_controller=ConstantController((screen.size[0]/2.0,screen.size[1]/2.0)) ) size_controller = tcp_listener.create_tcp_controller( tcp_name="size", initial_controller=ConstantController(during_go_value=(300.0,300.0)) ) spatial_freq_controller = tcp_listener.create_tcp_controller( tcp_name="sf", initial_controller=ConstantController(during_go_value=15.0/640.0) ) temporal_freq_controller = tcp_listener.create_tcp_controller( tcp_name="tf", initial_controller=ConstantController(during_go_value=5.0) ) phase_controller = tcp_listener.create_tcp_controller( tcp_name="phase", initial_controller=ConstantController(during_go_value=0.0) ) orientation_controller = tcp_listener.create_tcp_controller( tcp_name="orient", initial_controller=EvalStringController(during_go_eval_string="0.0", between_go_eval_string="fmod(t_abs,360.0/5.0)*5.0", eval_frequency=EVERY_FRAME, temporal_variables=TIME_SEC_ABSOLUTE) ) num_samples_controller = tcp_listener.create_tcp_controller( tcp_name="num_samples", initial_controller=ConstantController(during_go_value=512, return_type=ve_types.UnsignedInteger), require_type=ve_types.UnsignedInteger, ) bit_depth_controller = tcp_listener.create_tcp_controller( tcp_name="bit_depth", initial_controller=ConstantController(during_go_value=8, return_type=ve_types.UnsignedInteger), require_type=ve_types.UnsignedInteger, ) go_duration_controller = tcp_listener.create_tcp_controller( tcp_name="go_duration", initial_controller=ConstantController(during_go_value=(10,'seconds')) ) go_controller = tcp_listener.create_tcp_controller( tcp_name="go", initial_controller=ConstantController(during_go_value=0) ) # Create the instance SinGrating with appropriate parameters stimulus = SinGrating2D(anchor='center') # Create a viewport (with default pixel coordinate system) # with stimulus viewport = Viewport( screen=screen, stimuli=[stimulus] ) # Create an instance of the Presentation class p = Presentation(viewports=[viewport],check_events=1) # Register the controller functions, connecting them with the parameters they control p.add_controller(None,None, tcp_listener) # Actually listens to the TCP socket p.add_controller(stimulus,'on', on_controller) p.add_controller(stimulus,'contrast', contrast_controller) p.add_controller(stimulus,'position', center_controller) p.add_controller(stimulus,'size', size_controller) p.add_controller(stimulus,'spatial_freq', spatial_freq_controller) p.add_controller(stimulus,'temporal_freq_hz', temporal_freq_controller) p.add_controller(stimulus,'phase_at_t0', phase_controller) p.add_controller(stimulus,'orientation', orientation_controller) p.add_controller(stimulus,'num_samples', num_samples_controller) p.add_controller(stimulus,'bit_depth', bit_depth_controller) p.add_controller(p,'go_duration', go_duration_controller) p.add_controller(p,'enter_go_loop', go_controller) # Go! p.run_forever() visionegg-1.2.1/demo/texture.py0000755000076500000240000000145711224565530015704 0ustar astrawstaff#!/usr/bin/env python """Load a texture from a file.""" import os import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation from VisionEgg.Textures import * filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","panorama.jpg") texture = Texture(filename) screen = get_default_screen() # Create the instance of TextureStimulus stimulus = TextureStimulus(texture = texture, position = (screen.size[0]/2.0,screen.size[1]/2.0), anchor = 'center', shrink_texture_ok=1) viewport = Viewport(screen=screen, stimuli=[stimulus]) p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) p.go() visionegg-1.2.1/demo/texture3D.py0000644000076500000240000000237111224565530016064 0ustar astrawstaff#!/usr/bin/env python """Display a texture in 3D coordinates.""" import os import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Textures import * filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","panorama.jpg") texture = Texture(filename) screen = get_default_screen() # Create the instance of TextureStimulus3D duration = 5.0 speed = 1.0 z = duration*speed stimulus = TextureStimulus3D(texture = texture, shrink_texture_ok=True, ) def every_frame_func(t=None): z=t*speed-duration stimulus.parameters.upperleft=(-5,1,z) stimulus.parameters.lowerleft=(-5,-1,z) stimulus.parameters.lowerright=(5,-1,z) stimulus.parameters.upperright=(5,1,z) every_frame_func(0.0) # set initial stimulus postion projection = SimplePerspectiveProjection(fov_x=135.0) viewport = Viewport(screen=screen, projection=projection, stimuli=[stimulus]) p = Presentation(go_duration=(duration,'seconds'),viewports=[viewport]) p.add_controller(None, None, FunctionController(during_go_func=every_frame_func) ) p.go() visionegg-1.2.1/demo/texture3D_alpha.py0000644000076500000240000000310711224565530017227 0ustar astrawstaff#!/usr/bin/env python """Display a texture in 3D coordinates using alpha.""" # This is a fusion of sprial.py and texture3D_alpha.py import os, sys import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import get_default_screen, SimplePerspectiveProjection, Viewport from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Textures import Texture, TextureStimulus3D import OpenGL.GL as gl if len(sys.argv)>1: filename = sys.argv[1] else: filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","spiral.png") texture = Texture(filename) screen = get_default_screen() screen.set(bgcolor=(0,0,1)) # blue background # Create the instance of TextureStimulus3D duration = 5.0 speed = 1.0 z = duration*speed stimulus = TextureStimulus3D(texture = texture, shrink_texture_ok=True, internal_format=gl.GL_RGBA, ) def every_frame_func(t=None): z=t*speed-duration stimulus.parameters.upperleft=(-5,1,z) stimulus.parameters.lowerleft=(-5,-1,z) stimulus.parameters.lowerright=(5,-1,z) stimulus.parameters.upperright=(5,1,z) every_frame_func(0.0) # set initial stimulus postion projection = SimplePerspectiveProjection(fov_x=135.0) viewport = Viewport(screen=screen, projection=projection, stimuli=[stimulus]) p = Presentation(go_duration=(duration,'seconds'),viewports=[viewport]) p.add_controller(None, None, FunctionController(during_go_func=every_frame_func) ) p.go() visionegg-1.2.1/demo/texture_as_numpy_array.py0000644000076500000240000000226511224565530021010 0ustar astrawstaff#!/usr/bin/env python """Get texture as numpy array and manipulate it.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import get_default_screen, Viewport, gl from VisionEgg.FlowControl import Presentation from VisionEgg.Text import Text from VisionEgg.Textures import Texture, TextureStimulus screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,1.0) # background blue (RGB) orig_text = Text(text="Hello world!", color=(1.0,1.0,1.0), font_size=50, ) arr=orig_text.parameters.texture.get_texels_as_array() # get numpy array arr = arr[::-1] # flip upside down flipped_text = TextureStimulus(texture=Texture(arr), position=(screen.size[0]/2,screen.size[1]/2), anchor='center', internal_format = gl.GL_RGBA, mipmaps_enabled = False, ) viewport = Viewport(screen=screen, size=screen.size, stimuli=[flipped_text]) p = Presentation(go_duration=(5.0,'seconds'),viewports=[viewport]) p.go() visionegg-1.2.1/demo/textureDrum.py0000755000076500000240000000220411224565530016523 0ustar astrawstaff#!/usr/bin/env python """A texture-mapped spinning drum.""" from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Textures import * import math, os max_speed = 100.0 # degrees per second def angle_as_function_of_time(t): return max_speed*math.cos(t) def contrast_as_function_of_time(t): return abs(math.cos(2*math.pi*t*0.2)) filename = os.path.join(config.VISIONEGG_SYSTEM_DIR,"data","panorama.jpg") texture = Texture(filename) screen = get_default_screen() projection = SimplePerspectiveProjection(fov_x=90.0) stimulus = SpinningDrum(texture=texture,shrink_texture_ok=1) viewport = Viewport(screen=screen, size=screen.size, projection=projection, stimuli=[stimulus]) p = Presentation(go_duration=(10.0,'seconds'),viewports=[viewport]) p.add_controller(stimulus,'angular_position', FunctionController(during_go_func=angle_as_function_of_time)) p.add_controller(stimulus,'contrast', FunctionController(during_go_func=contrast_as_function_of_time)) p.go() visionegg-1.2.1/demo/visual_jitter.py0000755000076500000240000000775711224565530017101 0ustar astrawstaff#!/usr/bin/env python """Retinal slip demonstration""" # Visual jitter demonstration for the Vision Egg. # Copyright (C) 2002 Andrew Straw. This software may be # (re)distributed under the terms of the LGPL (Lesser GNU Public # License). # Inspired by # Murakami, I. & Cavanagh, P. (2001). Visual jitter: evidence for # visual-motion-based compensation of retinal slip due to small eye # movements. Vision Research, 41, 173-186. # Murakami, I. & Cavanagh, P. (1998). A jitter after-effect reveals # motion-based stabilization of vision. Nature, 395, 798-801. from VisionEgg import * start_default_logging(); watch_exceptions() from VisionEgg.Core import * from VisionEgg.FlowControl import Presentation, FunctionController from VisionEgg.Textures import * import Image, ImageDraw # Python Imaging Library (PIL) import OpenGL.GL as gl # PyOpenGL import numpy dynamic_time = 10.0 # seconds static_time = 10.0 # seconds dynamic_checkerboard_size = (32,32) # width, height in texture elements static_checkerboard_size = (50,50) # width, height in texture elements scale = 6 # magification of checkerboard (this many pixels per texture element) screen = get_default_screen() # allocate temporary texture in grayscale mode for dynamic texture temp_grayscale_image = Image.new("L",dynamic_checkerboard_size,0) temp_texture = Texture(temp_grayscale_image) # create TextureStimulus for dynamic stimulus scaled_dynamic_size = (scale*dynamic_checkerboard_size[0],scale*dynamic_checkerboard_size[1]) # find center of screen x = screen.size[0]/2.0 y = screen.size[1]/2.0 dynamic_checkerboard = TextureStimulus(texture=temp_texture, position=(x,y), anchor="center", mipmaps_enabled=0, size=scaled_dynamic_size, texture_min_filter=gl.GL_NEAREST, texture_mag_filter=gl.GL_NEAREST, ) # allocate static texture # (Note: numpy arrays have indices flipped from images, thus the re-ordering) static_data = numpy.random.randint(0,2,size=(static_checkerboard_size[1],static_checkerboard_size[0]))*255 static_texture = Texture(static_data) # create TextureStimulus for static stimulus scaled_static_size = (scale*static_checkerboard_size[0],scale*static_checkerboard_size[1]) static_checkerboard = TextureStimulus(texture=static_texture, position=(x,y), anchor="center", mipmaps_enabled=0, size=scaled_static_size, texture_min_filter=gl.GL_NEAREST, texture_mag_filter=gl.GL_NEAREST, ) fixation_spot = FixationSpot(position=(screen.size[0]/2,screen.size[1]/2), anchor='center', color=(255,0,0,0), size=(4,4)) viewport = Viewport(screen=screen, stimuli=[static_checkerboard, dynamic_checkerboard, fixation_spot]) p = Presentation(go_duration=(dynamic_time+static_time,'seconds'), viewports=[viewport]) # Use a controller to hook into go loop, but control texture buffer # through direct manipulation. dynamic_texture_object = dynamic_checkerboard.parameters.texture.get_texture_object() width,height = dynamic_checkerboard_size # (Note: numpy arrays have indices flipped from images, thus the re-ordering) flipped_shape = (height,width) def control_dynamic(t): if t <= dynamic_time: random_data = numpy.random.randint(0,2,size=(dynamic_checkerboard_size[1],dynamic_checkerboard_size[0]))*255 dynamic_texture_object.put_sub_image( random_data ) p.add_controller(None,None,FunctionController(during_go_func=control_dynamic)) p.go() visionegg-1.2.1/demo/wrapped_text.py0000755000076500000240000000257311225532650016710 0ustar astrawstaff#!/usr/bin/env python """Display text strings.""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import get_default_screen, Viewport, swap_buffers, \ FrameTimer from VisionEgg.Text import Text from VisionEgg.WrappedText import WrappedText import pygame from pygame.locals import QUIT,KEYDOWN,MOUSEBUTTONDOWN screen = get_default_screen() screen.parameters.bgcolor = (0.0,0.0,1.0) # background blue (RGB) text = WrappedText( text="""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas ac magna nibh. Cras ac volutpat purus. Suspendisse potenti. Vestibulum accumsan erat ac massa hendrerit semper. Ut a laoreet magna. Suspendisse risus odio, porttitor nec sodales nec, laoreet sit amet tellus. Maecenas condimentum orci id magna laoreet tincidunt. Sed porta velit a ligula ullamcorper accumsan. Fusce a felis tortor, vel hendrerit mauris.""", position=(0,screen.size[1])) viewport = Viewport(screen=screen, size=screen.size, stimuli=[text]) frame_timer = FrameTimer() quit_now = 0 print "press any key or click the mouse to stop" while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = 1 screen.clear() viewport.draw() swap_buffers() frame_timer.tick() frame_timer.log_histogram() visionegg-1.2.1/doc/0000755000076500000240000000000011231315556013440 5ustar astrawstaffvisionegg-1.2.1/doc/BUILD.sh0000755000076500000240000000112511224565530014636 0ustar astrawstaff#!/bin/bash # This is explained in BUILD.txt. # Exit immediately on any errors set -o errexit PY_DOC_SRC="$HOME/other-peoples-src/Python-2.4.3/Doc" LINK_PATHS="html paper-a4 paper-letter perl templates texinputs tools" for LINK_PATH in $LINK_PATHS; do rm -f $LINK_PATH ln -s $PY_DOC_SRC/$LINK_PATH $LINK_PATH done rm -f icons /bin/ln -s $PY_DOC_SRC/html/icons icons # make HTML /usr/bin/python tools/mkhowto --iconserver "../images" -s 3 --up-link "http://www.visionegg.org/" --up-title "Vision Egg website" visionegg.tex # make PDF /usr/bin/python tools/mkhowto --pdf visionegg.texvisionegg-1.2.1/doc/BUILD.txt0000644000076500000240000000161611224565530015045 0ustar astrawstaffThis directory contains the source for the Vision Egg documentation. The bash script BUILD.sh implements the instructions in this file. The source for the manual is in LaTeX using the classes, styles, and tools from the Python language documentation itself. These files are not included with the Vision Egg, but should be copied/linked into the Vision Egg doc directory. Link the following directories from the directory of the same name in the Python documentation source. html paper-a4 paper-letter perl templates texinputs tools Additionally, create a link called icons that links html/icons. To make the manual in HTML form, run: python tools/mkhowto visionegg.tex In fact, I run: python tools/mkhowto --iconserver "../images" -s 3 --up-link "http://www.visionegg.org/" --up-title "Vision Egg website" visionegg.tex To make the manual in PDF form, run: python tools/mkhowto --pdf visionegg.tex visionegg-1.2.1/doc/index.html0000644000076500000240000000060711224565530015441 0ustar astrawstaff Vision Egg documentation

Vision Egg documentation

Vision Egg manual HTML | PDF

Vision Egg API reference HTML


visionegg-1.2.1/doc/reference/0000755000076500000240000000000011231315556015376 5ustar astrawstaffvisionegg-1.2.1/doc/reference/epydoc0000755000076500000240000000014711224565530016612 0ustar astrawstaff#!/usr/bin/python # # Call the command line interface for Epydoc. # from epydoc.cli import cli cli() visionegg-1.2.1/doc/reference/html/0000755000076500000240000000000011231315557016343 5ustar astrawstaffvisionegg-1.2.1/doc/reference/html/api-objects.txt0000644000076500000240000100171211224565531021307 0ustar astrawstaffVisionEgg VisionEgg-module.html VisionEgg._get_lowerleft VisionEgg-module.html#_get_lowerleft VisionEgg.stop_watching_exceptions VisionEgg-module.html#stop_watching_exceptions VisionEgg.set_time_func_to_frame_locked VisionEgg-module.html#set_time_func_to_frame_locked VisionEgg._default_logging_started VisionEgg-module.html#_default_logging_started VisionEgg.get_type VisionEgg-module.html#get_type VisionEgg.set_time_func_to_true_time VisionEgg-module.html#set_time_func_to_true_time VisionEgg.log_formatter VisionEgg-module.html#log_formatter VisionEgg.true_time_func VisionEgg-module.html#true_time_func VisionEgg.logger VisionEgg-module.html#logger VisionEgg._get_center VisionEgg-module.html#_get_center VisionEgg.assert_type VisionEgg-module.html#assert_type VisionEgg.recursive_base_class_finder VisionEgg-module.html#recursive_base_class_finder VisionEgg.start_default_logging VisionEgg-module.html#start_default_logging VisionEgg.timing_func VisionEgg-module.html#timing_func VisionEgg.config VisionEgg-module.html#config VisionEgg.watch_exceptions VisionEgg-module.html#watch_exceptions VisionEgg.time_func_locked_to_frames VisionEgg-module.html#time_func_locked_to_frames VisionEgg.release_name VisionEgg-module.html#release_name VisionEgg.time_func VisionEgg-module.html#time_func VisionEgg.Configuration VisionEgg.Configuration-module.html VisionEgg.Configuration.extra_darwin_defaults VisionEgg.Configuration-module.html#extra_darwin_defaults VisionEgg.Configuration.save_settings VisionEgg.Configuration-module.html#save_settings VisionEgg.Configuration.defaults VisionEgg.Configuration-module.html#defaults VisionEgg.Core VisionEgg.Core-module.html VisionEgg.Core.post_gl_init VisionEgg.Core-module.html#post_gl_init VisionEgg.Core.message VisionEgg.Core-module.html#message VisionEgg.Core.sum VisionEgg.Core-module.html#sum VisionEgg.Core.get_default_screen VisionEgg.Core-module.html#get_default_screen VisionEgg.Core.add_gl_assumption VisionEgg.Core-module.html#add_gl_assumption VisionEgg.Core.init_gl_extension VisionEgg.Core-module.html#init_gl_extension VisionEgg.Core.gl_assumptions VisionEgg.Core-module.html#gl_assumptions VisionEgg.Core.swap_buffers VisionEgg.Core-module.html#swap_buffers VisionEgg.Daq VisionEgg.Daq-module.html VisionEgg.DaqKeyboard VisionEgg.DaqKeyboard-module.html VisionEgg.DaqKeyboard.__version__ VisionEgg.DaqKeyboard-module.html#__version__ VisionEgg.DaqLPT VisionEgg.DaqLPT-module.html VisionEgg.DaqLPT.__version__ VisionEgg.DaqLPT-module.html#__version__ VisionEgg.Deprecated VisionEgg.Deprecated-module.html VisionEgg.Dots VisionEgg.Dots-module.html VisionEgg.Dots.draw_dots VisionEgg.Dots-module.html#draw_dots VisionEgg.FlowControl VisionEgg.FlowControl-module.html VisionEgg.FlowControl.TIME_INDEPENDENT VisionEgg.FlowControl-module.html#TIME_INDEPENDENT VisionEgg.FlowControl.FRAMES_SINCE_GO VisionEgg.FlowControl-module.html#FRAMES_SINCE_GO VisionEgg.FlowControl.NOT_BETWEEN_GO VisionEgg.FlowControl-module.html#NOT_BETWEEN_GO VisionEgg.FlowControl.FRAMES_ABSOLUTE VisionEgg.FlowControl-module.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.NEVER VisionEgg.FlowControl-module.html#NEVER VisionEgg.FlowControl.TRANSITIONS VisionEgg.FlowControl-module.html#TRANSITIONS VisionEgg.FlowControl.ONCE VisionEgg.FlowControl-module.html#ONCE VisionEgg.FlowControl.EVERY_FRAME VisionEgg.FlowControl-module.html#EVERY_FRAME VisionEgg.FlowControl.TIME_SEC_ABSOLUTE VisionEgg.FlowControl-module.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.TIME_SEC_SINCE_GO VisionEgg.FlowControl-module.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.NOT_DURING_GO VisionEgg.FlowControl-module.html#NOT_DURING_GO VisionEgg.GL VisionEgg.GL-module.html VisionEgg.GL.GL_UNSIGNED_INT_8_8_8_8_REV VisionEgg.GL-module.html#GL_UNSIGNED_INT_8_8_8_8_REV VisionEgg.GL.glLoadMatrixf VisionEgg.GL-module.html#glLoadMatrixf VisionEgg.GL.__version__ VisionEgg.GL-module.html#__version__ VisionEgg.GL._orig_glLoadMatrixf VisionEgg.GL-module.html#_orig_glLoadMatrixf VisionEgg.GLTrace VisionEgg.GLTrace-module.html VisionEgg.GLTrace.bitmask_names_by_value VisionEgg.GLTrace-module.html#bitmask_names_by_value VisionEgg.GLTrace.gl_trace_attach VisionEgg.GLTrace-module.html#gl_trace_attach VisionEgg.GLTrace.bitmasks_by_function VisionEgg.GLTrace-module.html#bitmasks_by_function VisionEgg.GLTrace.raw_args_by_function VisionEgg.GLTrace-module.html#raw_args_by_function VisionEgg.GLTrace.gl_constants VisionEgg.GLTrace-module.html#gl_constants VisionEgg.GLTrace.arg_to_str VisionEgg.GLTrace-module.html#arg_to_str VisionEgg.GUI VisionEgg.GUI-module.html VisionEgg.GUI.showexception VisionEgg.GUI-module.html#showexception VisionEgg.GUI.tkMessageBox VisionEgg.GUI-module.html#tkMessageBox VisionEgg.GUI.tkFileDialog VisionEgg.GUI-module.html#tkFileDialog VisionEgg.GUI.Tkinter VisionEgg.GUI-module.html#Tkinter VisionEgg.Gratings VisionEgg.Gratings-module.html VisionEgg.Gratings._get_type_info VisionEgg.Gratings-module.html#_get_type_info VisionEgg.MoreStimuli VisionEgg.MoreStimuli-module.html VisionEgg.ParameterTypes VisionEgg.ParameterTypes-module.html VisionEgg.ParameterTypes.array_types VisionEgg.ParameterTypes-module.html#array_types VisionEgg.ParameterTypes.is_parameter_type_def VisionEgg.ParameterTypes-module.html#is_parameter_type_def VisionEgg.ParameterTypes.get_type VisionEgg.ParameterTypes-module.html#get_type VisionEgg.ParameterTypes.assert_type VisionEgg.ParameterTypes-module.html#assert_type VisionEgg.ParameterTypes.get_all_classes_list VisionEgg.ParameterTypes-module.html#get_all_classes_list VisionEgg.PlatformDependent VisionEgg.PlatformDependent-module.html VisionEgg.PlatformDependent.attempt_to_load_multitexturing VisionEgg.PlatformDependent-module.html#attempt_to_load_multitexturing VisionEgg.PlatformDependent.sync_swap_with_vbl_post_gl_init VisionEgg.PlatformDependent-module.html#sync_swap_with_vbl_post_gl_init VisionEgg.PlatformDependent.sync_swap_with_vbl_pre_gl_init VisionEgg.PlatformDependent-module.html#sync_swap_with_vbl_pre_gl_init VisionEgg.PlatformDependent.linux_but_unknown_drivers VisionEgg.PlatformDependent-module.html#linux_but_unknown_drivers VisionEgg.PlatformDependent.query_refresh_rate VisionEgg.PlatformDependent-module.html#query_refresh_rate VisionEgg.PlatformDependent.set_priority VisionEgg.PlatformDependent-module.html#set_priority VisionEgg.PyroApps VisionEgg.PyroApps-module.html VisionEgg.PyroApps.AST_ext VisionEgg.PyroApps.AST_ext-module.html VisionEgg.PyroApps.AST_ext.modify_AST VisionEgg.PyroApps.AST_ext-module.html#modify_AST VisionEgg.PyroApps.AST_ext.gen_assign_val_subtree VisionEgg.PyroApps.AST_ext-module.html#gen_assign_val_subtree VisionEgg.PyroApps.AST_ext.extract_from_AST VisionEgg.PyroApps.AST_ext-module.html#extract_from_AST VisionEgg.PyroApps.AST_ext.name_sequence VisionEgg.PyroApps.AST_ext-module.html#name_sequence VisionEgg.PyroApps.ColorCalGUI VisionEgg.PyroApps.ColorCalGUI-module.html VisionEgg.PyroApps.ColorCalGUI.__date__ VisionEgg.PyroApps.ColorCalGUI-module.html#__date__ VisionEgg.PyroApps.ColorCalGUI.__cvs__ VisionEgg.PyroApps.ColorCalGUI-module.html#__cvs__ VisionEgg.PyroApps.ColorCalGUI.get_control_list VisionEgg.PyroApps.ColorCalGUI-module.html#get_control_list VisionEgg.PyroApps.ColorCalServer VisionEgg.PyroApps.ColorCalServer-module.html VisionEgg.PyroApps.ColorCalServer.get_meta_controller_stimkey VisionEgg.PyroApps.ColorCalServer-module.html#get_meta_controller_stimkey VisionEgg.PyroApps.ColorCalServer.__date__ VisionEgg.PyroApps.ColorCalServer-module.html#__date__ VisionEgg.PyroApps.ColorCalServer.make_stimuli VisionEgg.PyroApps.ColorCalServer-module.html#make_stimuli VisionEgg.PyroApps.ColorCalServer.get_meta_controller_class VisionEgg.PyroApps.ColorCalServer-module.html#get_meta_controller_class VisionEgg.PyroApps.ColorCalServer.__cvs__ VisionEgg.PyroApps.ColorCalServer-module.html#__cvs__ VisionEgg.PyroApps.DropinGUI VisionEgg.PyroApps.DropinGUI-module.html VisionEgg.PyroApps.DropinGUI.get_control_list VisionEgg.PyroApps.DropinGUI-module.html#get_control_list VisionEgg.PyroApps.DropinServer VisionEgg.PyroApps.DropinServer-module.html VisionEgg.PyroApps.DropinServer.get_meta_controller_stimkey VisionEgg.PyroApps.DropinServer-module.html#get_meta_controller_stimkey VisionEgg.PyroApps.DropinServer.get_meta_controller_class VisionEgg.PyroApps.DropinServer-module.html#get_meta_controller_class VisionEgg.PyroApps.DropinServer.make_stimuli VisionEgg.PyroApps.DropinServer-module.html#make_stimuli VisionEgg.PyroApps.EPhysGUI VisionEgg.PyroApps.EPhysGUI-module.html VisionEgg.PyroApps.EPhysGUI.get_server VisionEgg.PyroApps.EPhysGUI-module.html#get_server VisionEgg.PyroApps.EPhysGUI.client_list VisionEgg.PyroApps.EPhysGUI-module.html#client_list VisionEgg.PyroApps.EPhysGUI.__version__ VisionEgg.PyroApps.EPhysGUI-module.html#__version__ VisionEgg.PyroApps.EPhysGUI.__cvs__ VisionEgg.PyroApps.EPhysGUI-module.html#__cvs__ VisionEgg.PyroApps.EPhysGUI.__author__ VisionEgg.PyroApps.EPhysGUI-module.html#__author__ VisionEgg.PyroApps.EPhysGUI.__date__ VisionEgg.PyroApps.EPhysGUI-module.html#__date__ VisionEgg.PyroApps.EPhysGUIUtils VisionEgg.PyroApps.EPhysGUIUtils-module.html VisionEgg.PyroApps.EPhysGUIUtils.__date__ VisionEgg.PyroApps.EPhysGUIUtils-module.html#__date__ VisionEgg.PyroApps.EPhysGUIUtils.__author__ VisionEgg.PyroApps.EPhysGUIUtils-module.html#__author__ VisionEgg.PyroApps.EPhysGUIUtils.__version__ VisionEgg.PyroApps.EPhysGUIUtils-module.html#__version__ VisionEgg.PyroApps.EPhysGUIUtils.__cvs__ VisionEgg.PyroApps.EPhysGUIUtils-module.html#__cvs__ VisionEgg.PyroApps.EPhysServer VisionEgg.PyroApps.EPhysServer-module.html VisionEgg.PyroApps.EPhysServer.start_server VisionEgg.PyroApps.EPhysServer-module.html#start_server VisionEgg.PyroApps.EPhysServer.server_modules VisionEgg.PyroApps.EPhysServer-module.html#server_modules VisionEgg.PyroApps.EPhysServer.__author__ VisionEgg.PyroApps.EPhysServer-module.html#__author__ VisionEgg.PyroApps.EPhysServer.__date__ VisionEgg.PyroApps.EPhysServer-module.html#__date__ VisionEgg.PyroApps.EPhysServer.__version__ VisionEgg.PyroApps.EPhysServer-module.html#__version__ VisionEgg.PyroApps.EPhysServer.__cvs__ VisionEgg.PyroApps.EPhysServer-module.html#__cvs__ VisionEgg.PyroApps.FlatGratingGUI VisionEgg.PyroApps.FlatGratingGUI-module.html VisionEgg.PyroApps.FlatGratingGUI.__date__ VisionEgg.PyroApps.FlatGratingGUI-module.html#__date__ VisionEgg.PyroApps.FlatGratingGUI.__cvs__ VisionEgg.PyroApps.FlatGratingGUI-module.html#__cvs__ VisionEgg.PyroApps.FlatGratingGUI.get_control_list VisionEgg.PyroApps.FlatGratingGUI-module.html#get_control_list VisionEgg.PyroApps.FlatGratingServer VisionEgg.PyroApps.FlatGratingServer-module.html VisionEgg.PyroApps.FlatGratingServer.get_meta_controller_stimkey VisionEgg.PyroApps.FlatGratingServer-module.html#get_meta_controller_stimkey VisionEgg.PyroApps.FlatGratingServer.__date__ VisionEgg.PyroApps.FlatGratingServer-module.html#__date__ VisionEgg.PyroApps.FlatGratingServer.get_meta_controller_class VisionEgg.PyroApps.FlatGratingServer-module.html#get_meta_controller_class VisionEgg.PyroApps.FlatGratingServer.make_stimuli VisionEgg.PyroApps.FlatGratingServer-module.html#make_stimuli VisionEgg.PyroApps.FlatGratingServer.__cvs__ VisionEgg.PyroApps.FlatGratingServer-module.html#__cvs__ VisionEgg.PyroApps.GridGUI VisionEgg.PyroApps.GridGUI-module.html VisionEgg.PyroApps.GridGUI.__author__ VisionEgg.PyroApps.GridGUI-module.html#__author__ VisionEgg.PyroApps.GridGUI.__date__ VisionEgg.PyroApps.GridGUI-module.html#__date__ VisionEgg.PyroApps.GridGUI.__version__ VisionEgg.PyroApps.GridGUI-module.html#__version__ VisionEgg.PyroApps.GridGUI.__cvs__ VisionEgg.PyroApps.GridGUI-module.html#__cvs__ VisionEgg.PyroApps.GridGUI.get_control_list VisionEgg.PyroApps.GridGUI-module.html#get_control_list VisionEgg.PyroApps.GridServer VisionEgg.PyroApps.GridServer-module.html VisionEgg.PyroApps.GridServer.get_meta_controller_stimkey VisionEgg.PyroApps.GridServer-module.html#get_meta_controller_stimkey VisionEgg.PyroApps.GridServer.__author__ VisionEgg.PyroApps.GridServer-module.html#__author__ VisionEgg.PyroApps.GridServer.__date__ VisionEgg.PyroApps.GridServer-module.html#__date__ VisionEgg.PyroApps.GridServer.get_meta_controller_class VisionEgg.PyroApps.GridServer-module.html#get_meta_controller_class VisionEgg.PyroApps.GridServer.make_stimuli VisionEgg.PyroApps.GridServer-module.html#make_stimuli VisionEgg.PyroApps.GridServer.__version__ VisionEgg.PyroApps.GridServer-module.html#__version__ VisionEgg.PyroApps.GridServer.__cvs__ VisionEgg.PyroApps.GridServer-module.html#__cvs__ VisionEgg.PyroApps.MouseTargetGUI VisionEgg.PyroApps.MouseTargetGUI-module.html VisionEgg.PyroApps.MouseTargetGUI.__date__ VisionEgg.PyroApps.MouseTargetGUI-module.html#__date__ VisionEgg.PyroApps.MouseTargetGUI.__cvs__ VisionEgg.PyroApps.MouseTargetGUI-module.html#__cvs__ VisionEgg.PyroApps.MouseTargetGUI.get_control_list VisionEgg.PyroApps.MouseTargetGUI-module.html#get_control_list VisionEgg.PyroApps.MouseTargetServer VisionEgg.PyroApps.MouseTargetServer-module.html VisionEgg.PyroApps.MouseTargetServer.get_meta_controller_stimkey VisionEgg.PyroApps.MouseTargetServer-module.html#get_meta_controller_stimkey VisionEgg.PyroApps.MouseTargetServer.right VisionEgg.PyroApps.MouseTargetServer-module.html#right VisionEgg.PyroApps.MouseTargetServer.get_target_size VisionEgg.PyroApps.MouseTargetServer-module.html#get_target_size VisionEgg.PyroApps.MouseTargetServer.make_stimuli VisionEgg.PyroApps.MouseTargetServer-module.html#make_stimuli VisionEgg.PyroApps.MouseTargetServer.down VisionEgg.PyroApps.MouseTargetServer-module.html#down VisionEgg.PyroApps.MouseTargetServer.__date__ VisionEgg.PyroApps.MouseTargetServer-module.html#__date__ VisionEgg.PyroApps.MouseTargetServer.mouse_position VisionEgg.PyroApps.MouseTargetServer-module.html#mouse_position VisionEgg.PyroApps.MouseTargetServer.get_meta_controller_class VisionEgg.PyroApps.MouseTargetServer-module.html#get_meta_controller_class VisionEgg.PyroApps.MouseTargetServer.__cvs__ VisionEgg.PyroApps.MouseTargetServer-module.html#__cvs__ VisionEgg.PyroApps.MouseTargetServer.target_h VisionEgg.PyroApps.MouseTargetServer-module.html#target_h VisionEgg.PyroApps.MouseTargetServer.keyup VisionEgg.PyroApps.MouseTargetServer-module.html#keyup VisionEgg.PyroApps.MouseTargetServer.keydown VisionEgg.PyroApps.MouseTargetServer-module.html#keydown VisionEgg.PyroApps.MouseTargetServer.mag VisionEgg.PyroApps.MouseTargetServer-module.html#mag VisionEgg.PyroApps.MouseTargetServer.last_mouse_position VisionEgg.PyroApps.MouseTargetServer-module.html#last_mouse_position VisionEgg.PyroApps.MouseTargetServer.target_w VisionEgg.PyroApps.MouseTargetServer-module.html#target_w VisionEgg.PyroApps.MouseTargetServer.handle_event_callbacks VisionEgg.PyroApps.MouseTargetServer-module.html#handle_event_callbacks VisionEgg.PyroApps.MouseTargetServer.cross_product VisionEgg.PyroApps.MouseTargetServer-module.html#cross_product VisionEgg.PyroApps.MouseTargetServer.up VisionEgg.PyroApps.MouseTargetServer-module.html#up VisionEgg.PyroApps.MouseTargetServer.left VisionEgg.PyroApps.MouseTargetServer-module.html#left VisionEgg.PyroApps.ScreenPositionGUI VisionEgg.PyroApps.ScreenPositionGUI-module.html VisionEgg.PyroApps.ScreenPositionGUI.__date__ VisionEgg.PyroApps.ScreenPositionGUI-module.html#__date__ VisionEgg.PyroApps.ScreenPositionGUI.__version__ VisionEgg.PyroApps.ScreenPositionGUI-module.html#__version__ VisionEgg.PyroApps.ScreenPositionGUI.__cvs__ VisionEgg.PyroApps.ScreenPositionGUI-module.html#__cvs__ VisionEgg.PyroApps.ScreenPositionServer VisionEgg.PyroApps.ScreenPositionServer-module.html VisionEgg.PyroApps.ScreenPositionServer.__date__ VisionEgg.PyroApps.ScreenPositionServer-module.html#__date__ VisionEgg.PyroApps.ScreenPositionServer.__version__ VisionEgg.PyroApps.ScreenPositionServer-module.html#__version__ VisionEgg.PyroApps.ScreenPositionServer.__cvs__ VisionEgg.PyroApps.ScreenPositionServer-module.html#__cvs__ VisionEgg.PyroApps.SphereGratingGUI VisionEgg.PyroApps.SphereGratingGUI-module.html VisionEgg.PyroApps.SphereGratingGUI.__date__ VisionEgg.PyroApps.SphereGratingGUI-module.html#__date__ VisionEgg.PyroApps.SphereGratingGUI.__cvs__ VisionEgg.PyroApps.SphereGratingGUI-module.html#__cvs__ VisionEgg.PyroApps.SphereGratingGUI.get_control_list VisionEgg.PyroApps.SphereGratingGUI-module.html#get_control_list VisionEgg.PyroApps.SphereGratingServer VisionEgg.PyroApps.SphereGratingServer-module.html VisionEgg.PyroApps.SphereGratingServer.get_meta_controller_stimkey VisionEgg.PyroApps.SphereGratingServer-module.html#get_meta_controller_stimkey VisionEgg.PyroApps.SphereGratingServer.__date__ VisionEgg.PyroApps.SphereGratingServer-module.html#__date__ VisionEgg.PyroApps.SphereGratingServer.get_meta_controller_class VisionEgg.PyroApps.SphereGratingServer-module.html#get_meta_controller_class VisionEgg.PyroApps.SphereGratingServer.make_stimuli VisionEgg.PyroApps.SphereGratingServer-module.html#make_stimuli VisionEgg.PyroApps.SphereGratingServer.__cvs__ VisionEgg.PyroApps.SphereGratingServer-module.html#__cvs__ VisionEgg.PyroApps.SpinningDrumGUI VisionEgg.PyroApps.SpinningDrumGUI-module.html VisionEgg.PyroApps.SpinningDrumGUI.__author__ VisionEgg.PyroApps.SpinningDrumGUI-module.html#__author__ VisionEgg.PyroApps.SpinningDrumGUI.__date__ VisionEgg.PyroApps.SpinningDrumGUI-module.html#__date__ VisionEgg.PyroApps.SpinningDrumGUI.__version__ VisionEgg.PyroApps.SpinningDrumGUI-module.html#__version__ VisionEgg.PyroApps.SpinningDrumGUI.__cvs__ VisionEgg.PyroApps.SpinningDrumGUI-module.html#__cvs__ VisionEgg.PyroApps.SpinningDrumGUI.get_control_list VisionEgg.PyroApps.SpinningDrumGUI-module.html#get_control_list VisionEgg.PyroApps.SpinningDrumServer VisionEgg.PyroApps.SpinningDrumServer-module.html VisionEgg.PyroApps.SpinningDrumServer.get_meta_controller_stimkey VisionEgg.PyroApps.SpinningDrumServer-module.html#get_meta_controller_stimkey VisionEgg.PyroApps.SpinningDrumServer.__author__ VisionEgg.PyroApps.SpinningDrumServer-module.html#__author__ VisionEgg.PyroApps.SpinningDrumServer.__date__ VisionEgg.PyroApps.SpinningDrumServer-module.html#__date__ VisionEgg.PyroApps.SpinningDrumServer.get_meta_controller_class VisionEgg.PyroApps.SpinningDrumServer-module.html#get_meta_controller_class VisionEgg.PyroApps.SpinningDrumServer.make_stimuli VisionEgg.PyroApps.SpinningDrumServer-module.html#make_stimuli VisionEgg.PyroApps.SpinningDrumServer.__version__ VisionEgg.PyroApps.SpinningDrumServer-module.html#__version__ VisionEgg.PyroApps.SpinningDrumServer.__cvs__ VisionEgg.PyroApps.SpinningDrumServer-module.html#__cvs__ VisionEgg.PyroApps.TargetGUI VisionEgg.PyroApps.TargetGUI-module.html VisionEgg.PyroApps.TargetGUI.get_control_list VisionEgg.PyroApps.TargetGUI-module.html#get_control_list VisionEgg.PyroApps.TargetGUI.__date__ VisionEgg.PyroApps.TargetGUI-module.html#__date__ VisionEgg.PyroApps.TargetGUI.__cvs__ VisionEgg.PyroApps.TargetGUI-module.html#__cvs__ VisionEgg.PyroApps.TargetServer VisionEgg.PyroApps.TargetServer-module.html VisionEgg.PyroApps.TargetServer.get_meta_controller_stimkey VisionEgg.PyroApps.TargetServer-module.html#get_meta_controller_stimkey VisionEgg.PyroApps.TargetServer.__date__ VisionEgg.PyroApps.TargetServer-module.html#__date__ VisionEgg.PyroApps.TargetServer.get_meta_controller_class VisionEgg.PyroApps.TargetServer-module.html#get_meta_controller_class VisionEgg.PyroApps.TargetServer.make_stimuli VisionEgg.PyroApps.TargetServer-module.html#make_stimuli VisionEgg.PyroApps.TargetServer.__cvs__ VisionEgg.PyroApps.TargetServer-module.html#__cvs__ VisionEgg.PyroApps.VarTypes VisionEgg.PyroApps.VarTypes-module.html VisionEgg.PyroApps.VarTypes.getType VisionEgg.PyroApps.VarTypes-module.html#getType VisionEgg.PyroApps.VarTypes.getID VisionEgg.PyroApps.VarTypes-module.html#getID VisionEgg.PyroClient VisionEgg.PyroClient-module.html VisionEgg.PyroClient.__date__ VisionEgg.PyroClient-module.html#__date__ VisionEgg.PyroClient.__cvs__ VisionEgg.PyroClient-module.html#__cvs__ VisionEgg.PyroHelpers VisionEgg.PyroHelpers-module.html VisionEgg.PyroHelpers.__date__ VisionEgg.PyroHelpers-module.html#__date__ VisionEgg.PyroHelpers.__version__ VisionEgg.PyroHelpers-module.html#__version__ VisionEgg.PyroHelpers.__cvs__ VisionEgg.PyroHelpers-module.html#__cvs__ VisionEgg.QuickTime VisionEgg.QuickTime-module.html VisionEgg.QuickTime.__version__ VisionEgg.QuickTime-module.html#__version__ VisionEgg.QuickTime.new_movie_from_filename VisionEgg.QuickTime-module.html#new_movie_from_filename VisionEgg.ResponseControl VisionEgg.ResponseControl-module.html VisionEgg.ResponseControl.__version__ VisionEgg.ResponseControl-module.html#__version__ VisionEgg.SphereMap VisionEgg.SphereMap-module.html VisionEgg.SphereMap.__version__ VisionEgg.SphereMap-module.html#__version__ VisionEgg.TCPController VisionEgg.TCPController-module.html VisionEgg.TCPController.__cvs__ VisionEgg.TCPController-module.html#__cvs__ VisionEgg.TCPController.__date__ VisionEgg.TCPController-module.html#__date__ VisionEgg.TCPController.__version__ VisionEgg.TCPController-module.html#__version__ VisionEgg.Text VisionEgg.Text-module.html VisionEgg.Text._font_objects VisionEgg.Text-module.html#_font_objects VisionEgg.Text.have_glut VisionEgg.Text-module.html#have_glut VisionEgg.Textures VisionEgg.Textures-module.html VisionEgg.Textures.array_types VisionEgg.Textures-module.html#array_types VisionEgg.Textures.convert_to_numpy_if_array VisionEgg.Textures-module.html#convert_to_numpy_if_array VisionEgg.Textures.next_power_of_2 VisionEgg.Textures-module.html#next_power_of_2 VisionEgg.Textures.is_power_of_2 VisionEgg.Textures-module.html#is_power_of_2 VisionEgg.Textures.shrink_filter VisionEgg.Textures-module.html#shrink_filter VisionEgg.ThreeDeeMath VisionEgg.ThreeDeeMath-module.html VisionEgg.ThreeDeeMath.make_homogeneous_coord_rows VisionEgg.ThreeDeeMath-module.html#make_homogeneous_coord_rows VisionEgg.ThreeDeeMath.normalize_homogeneous_rows VisionEgg.ThreeDeeMath-module.html#normalize_homogeneous_rows VisionEgg.WrappedText VisionEgg.WrappedText-module.html VisionEgg.WrappedText.main VisionEgg.WrappedText-module.html#main VisionEgg.darwin_getrefresh VisionEgg.darwin_getrefresh-module.html VisionEgg.darwin_getrefresh._swig_getattr VisionEgg.darwin_getrefresh-module.html#_swig_getattr VisionEgg.darwin_getrefresh._swig_setattr_nondynamic VisionEgg.darwin_getrefresh-module.html#_swig_setattr_nondynamic VisionEgg.darwin_getrefresh.getrefresh VisionEgg.darwin_getrefresh-module.html#getrefresh VisionEgg.darwin_getrefresh._swig_setattr VisionEgg.darwin_getrefresh-module.html#_swig_setattr VisionEgg.darwin_getrefresh._newclass VisionEgg.darwin_getrefresh-module.html#_newclass VisionEgg.gl_qt VisionEgg.gl_qt-module.html VisionEgg.gl_qt._swig_getattr VisionEgg.gl_qt-module.html#_swig_getattr VisionEgg.gl_qt.gl_qt_renderer_delete VisionEgg.gl_qt-module.html#gl_qt_renderer_delete VisionEgg.gl_qt._swig_setattr_nondynamic VisionEgg.gl_qt-module.html#_swig_setattr_nondynamic VisionEgg.gl_qt._swig_setattr VisionEgg.gl_qt-module.html#_swig_setattr VisionEgg.gl_qt._newclass VisionEgg.gl_qt-module.html#_newclass VisionEgg.gl_qt.gl_qt_renderer_update VisionEgg.gl_qt-module.html#gl_qt_renderer_update VisionEgg.gl_qt.gl_qt_renderer_create VisionEgg.gl_qt-module.html#gl_qt_renderer_create VisionEgg.posix_maxpriority VisionEgg.posix_maxpriority-module.html VisionEgg.posix_maxpriority._swig_getattr VisionEgg.posix_maxpriority-module.html#_swig_getattr VisionEgg.posix_maxpriority.stop_memory_paging VisionEgg.posix_maxpriority-module.html#stop_memory_paging VisionEgg.posix_maxpriority._swig_setattr_nondynamic VisionEgg.posix_maxpriority-module.html#_swig_setattr_nondynamic VisionEgg.posix_maxpriority.set_self_policy_priority VisionEgg.posix_maxpriority-module.html#set_self_policy_priority VisionEgg.posix_maxpriority.SCHED_RR VisionEgg.posix_maxpriority-module.html#SCHED_RR VisionEgg.posix_maxpriority.sched_get_priority_max VisionEgg.posix_maxpriority-module.html#sched_get_priority_max VisionEgg.posix_maxpriority._swig_setattr VisionEgg.posix_maxpriority-module.html#_swig_setattr VisionEgg.posix_maxpriority._newclass VisionEgg.posix_maxpriority-module.html#_newclass VisionEgg.posix_maxpriority.SCHED_FIFO VisionEgg.posix_maxpriority-module.html#SCHED_FIFO VisionEgg.qtlowlevel VisionEgg.qtlowlevel-module.html VisionEgg.qtlowlevel.kQTPropertyClass_NewMovieProperty VisionEgg.qtlowlevel-module.html#kQTPropertyClass_NewMovieProperty VisionEgg.qtlowlevel.paramErr VisionEgg.qtlowlevel-module.html#paramErr VisionEgg.qtlowlevel.NewMovieFromProperties VisionEgg.qtlowlevel-module.html#NewMovieFromProperties VisionEgg.qtlowlevel.SetMovieBox VisionEgg.qtlowlevel-module.html#SetMovieBox VisionEgg.qtlowlevel.IsMovieDone VisionEgg.qtlowlevel-module.html#IsMovieDone VisionEgg.qtlowlevel.Movie VisionEgg.qtlowlevel-module.html#Movie VisionEgg.qtlowlevel.kQTMovieResourceLocatorPropertyID_LegacyResName VisionEgg.qtlowlevel-module.html#kQTMovieResourceLocatorPropertyID_LegacyResName VisionEgg.qtlowlevel.kQTContextPropertyID_AudioContext VisionEgg.qtlowlevel-module.html#kQTContextPropertyID_AudioContext VisionEgg.qtlowlevel.kQTMovieResourceLocatorPropertyID_Callback VisionEgg.qtlowlevel-module.html#kQTMovieResourceLocatorPropertyID_Callback VisionEgg.qtlowlevel.kQTPropertyClass_DataLocation VisionEgg.qtlowlevel-module.html#kQTPropertyClass_DataLocation VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontUpdateForeBackPointers VisionEgg.qtlowlevel-module.html#kQTMovieInstantiationPropertyID_DontUpdateForeBackPointers VisionEgg.qtlowlevel.NewMovieFromFile VisionEgg.qtlowlevel-module.html#NewMovieFromFile VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFStringHFSPath VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_CFStringHFSPath VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontAutoUpdateClock VisionEgg.qtlowlevel-module.html#kQTMovieInstantiationPropertyID_DontAutoUpdateClock VisionEgg.qtlowlevel.CFStringCreateWithCString VisionEgg.qtlowlevel-module.html#CFStringCreateWithCString VisionEgg.qtlowlevel.OSType VisionEgg.qtlowlevel-module.html#OSType VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_IdleImportOK VisionEgg.qtlowlevel-module.html#kQTMovieInstantiationPropertyID_IdleImportOK VisionEgg.qtlowlevel.OSErr VisionEgg.qtlowlevel-module.html#OSErr VisionEgg.qtlowlevel.NativePathNameToFSSpec VisionEgg.qtlowlevel-module.html#NativePathNameToFSSpec VisionEgg.qtlowlevel.CFIndex VisionEgg.qtlowlevel-module.html#CFIndex VisionEgg.qtlowlevel.movieToolboxUninitialized VisionEgg.qtlowlevel-module.html#movieToolboxUninitialized VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFStringNativePath VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_CFStringNativePath VisionEgg.qtlowlevel.QTMLClient VisionEgg.qtlowlevel-module.html#QTMLClient VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontResolveDataRefs VisionEgg.qtlowlevel-module.html#kQTMovieInstantiationPropertyID_DontResolveDataRefs VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontAutoAlternates VisionEgg.qtlowlevel-module.html#kQTMovieInstantiationPropertyID_DontAutoAlternates VisionEgg.qtlowlevel.kQTNewMoviePropertyID_Active VisionEgg.qtlowlevel-module.html#kQTNewMoviePropertyID_Active VisionEgg.qtlowlevel.InitializeQTML VisionEgg.qtlowlevel-module.html#InitializeQTML VisionEgg.qtlowlevel.kQTNewMoviePropertyID_DefaultDataRef VisionEgg.qtlowlevel-module.html#kQTNewMoviePropertyID_DefaultDataRef VisionEgg.qtlowlevel.CFStringGetCString VisionEgg.qtlowlevel-module.html#CFStringGetCString VisionEgg.qtlowlevel.kCFStringEncodingMacRoman VisionEgg.qtlowlevel-module.html#kCFStringEncodingMacRoman VisionEgg.qtlowlevel.GetErrorString VisionEgg.qtlowlevel-module.html#GetErrorString VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs VisionEgg.qtlowlevel-module.html#kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs VisionEgg.qtlowlevel.kQTPropertyClass_Context VisionEgg.qtlowlevel-module.html#kQTPropertyClass_Context VisionEgg.qtlowlevel.ByteCount VisionEgg.qtlowlevel-module.html#ByteCount VisionEgg.qtlowlevel.kQTPropertyClass_MovieResourceLocator VisionEgg.qtlowlevel-module.html#kQTPropertyClass_MovieResourceLocator VisionEgg.qtlowlevel.kQTDataLocationPropertyID_DataFork VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_DataFork VisionEgg.qtlowlevel.kQTDataLocationPropertyID_DataReference VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_DataReference VisionEgg.qtlowlevel.kQTMovieResourceLocatorPropertyID_FileOffset VisionEgg.qtlowlevel-module.html#kQTMovieResourceLocatorPropertyID_FileOffset VisionEgg.qtlowlevel.ItemCount VisionEgg.qtlowlevel-module.html#ItemCount VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFStringPosixPath VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_CFStringPosixPath VisionEgg.qtlowlevel.kQTDataLocationPropertyID_LegacyMovieResourceHandle VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_LegacyMovieResourceHandle VisionEgg.qtlowlevel.CFStringGetCStringPtr VisionEgg.qtlowlevel-module.html#CFStringGetCStringPtr VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFURL VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_CFURL VisionEgg.qtlowlevel.kQTDataLocationPropertyID_Scrap VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_Scrap VisionEgg.qtlowlevel.CheckOSStatus VisionEgg.qtlowlevel-module.html#CheckOSStatus VisionEgg.qtlowlevel.FSSpec VisionEgg.qtlowlevel-module.html#FSSpec VisionEgg.qtlowlevel.kQTContextPropertyID_VisualContext VisionEgg.qtlowlevel-module.html#kQTContextPropertyID_VisualContext VisionEgg.qtlowlevel.CFStringCreateWithCharacters VisionEgg.qtlowlevel-module.html#CFStringCreateWithCharacters VisionEgg.qtlowlevel.QTVisualContextRef VisionEgg.qtlowlevel-module.html#QTVisualContextRef VisionEgg.qtlowlevel.kQTDataLocationPropertyID_QTDataHandler VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_QTDataHandler VisionEgg.qtlowlevel.kQTDataLocationPropertyID_MovieUserProc VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_MovieUserProc VisionEgg.qtlowlevel.OpenMovieFile VisionEgg.qtlowlevel-module.html#OpenMovieFile VisionEgg.qtlowlevel.kCFAllocatorDefault VisionEgg.qtlowlevel-module.html#kCFAllocatorDefault VisionEgg.qtlowlevel.QTGetCFConstant VisionEgg.qtlowlevel-module.html#QTGetCFConstant VisionEgg.qtlowlevel.GetMovieBox VisionEgg.qtlowlevel-module.html#GetMovieBox VisionEgg.qtlowlevel.EnterMovies VisionEgg.qtlowlevel-module.html#EnterMovies VisionEgg.qtlowlevel.GoToBeginningOfMovie VisionEgg.qtlowlevel-module.html#GoToBeginningOfMovie VisionEgg.qtlowlevel.noErr VisionEgg.qtlowlevel-module.html#noErr VisionEgg.qtlowlevel.kQTPropertyClass_MovieInstantiation VisionEgg.qtlowlevel-module.html#kQTPropertyClass_MovieInstantiation VisionEgg.qtlowlevel.StartMovie VisionEgg.qtlowlevel-module.html#StartMovie VisionEgg.qtlowlevel.FOUR_CHAR_CODE VisionEgg.qtlowlevel-module.html#FOUR_CHAR_CODE VisionEgg.qtlowlevel.CFAllocatorRef VisionEgg.qtlowlevel-module.html#CFAllocatorRef VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_AsyncOK VisionEgg.qtlowlevel-module.html#kQTMovieInstantiationPropertyID_AsyncOK VisionEgg.qtlowlevel.kQTMovieResourceLocatorPropertyID_LegacyResID VisionEgg.qtlowlevel-module.html#kQTMovieResourceLocatorPropertyID_LegacyResID VisionEgg.qtlowlevel.QTPropertyID VisionEgg.qtlowlevel-module.html#QTPropertyID VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_ResultDataLocationChanged VisionEgg.qtlowlevel-module.html#kQTMovieInstantiationPropertyID_ResultDataLocationChanged VisionEgg.qtlowlevel.MoviesTask VisionEgg.qtlowlevel-module.html#MoviesTask VisionEgg.qtlowlevel.CFStringEncoding VisionEgg.qtlowlevel-module.html#CFStringEncoding VisionEgg.qtlowlevel.FourCharCode VisionEgg.qtlowlevel-module.html#FourCharCode VisionEgg.qtlowlevel.OSStatus VisionEgg.qtlowlevel-module.html#OSStatus VisionEgg.qtlowlevel.kQTNewMoviePropertyID_DontInteractWithUser VisionEgg.qtlowlevel-module.html#kQTNewMoviePropertyID_DontInteractWithUser VisionEgg.qtlowlevel.CFStringRef VisionEgg.qtlowlevel-module.html#CFStringRef VisionEgg.qtlowlevel.QTPropertyClass VisionEgg.qtlowlevel-module.html#QTPropertyClass VisionEgg.qtlowlevel.QTPropertyValuePtr VisionEgg.qtlowlevel-module.html#QTPropertyValuePtr VisionEgg.qtlowlevel.kQTDataLocationPropertyID_ResourceFork VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_ResourceFork VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFStringWindowsPath VisionEgg.qtlowlevel-module.html#kQTDataLocationPropertyID_CFStringWindowsPath VisionEgg.qtmovie VisionEgg.qtmovie-module.html VisionEgg.qtmovie.new_movie_from_filename VisionEgg.qtmovie-module.html#new_movie_from_filename VisionEgg.win32_getrefresh VisionEgg.win32_getrefresh-module.html VisionEgg.win32_getrefresh._swig_getattr VisionEgg.win32_getrefresh-module.html#_swig_getattr VisionEgg.win32_getrefresh._swig_setattr_nondynamic VisionEgg.win32_getrefresh-module.html#_swig_setattr_nondynamic VisionEgg.win32_getrefresh.getrefresh VisionEgg.win32_getrefresh-module.html#getrefresh VisionEgg.win32_getrefresh._swig_setattr VisionEgg.win32_getrefresh-module.html#_swig_setattr VisionEgg.win32_getrefresh._newclass VisionEgg.win32_getrefresh-module.html#_newclass VisionEgg.win32_maxpriority VisionEgg.win32_maxpriority-module.html VisionEgg.win32_maxpriority._swig_getattr VisionEgg.win32_maxpriority-module.html#_swig_getattr VisionEgg.win32_maxpriority.HIGH_PRIORITY_CLASS VisionEgg.win32_maxpriority-module.html#HIGH_PRIORITY_CLASS VisionEgg.win32_maxpriority._swig_setattr_nondynamic VisionEgg.win32_maxpriority-module.html#_swig_setattr_nondynamic VisionEgg.win32_maxpriority.THREAD_PRIORITY_BELOW_NORMAL VisionEgg.win32_maxpriority-module.html#THREAD_PRIORITY_BELOW_NORMAL VisionEgg.win32_maxpriority.THREAD_PRIORITY_NORMAL VisionEgg.win32_maxpriority-module.html#THREAD_PRIORITY_NORMAL VisionEgg.win32_maxpriority.set_self_process_priority_class VisionEgg.win32_maxpriority-module.html#set_self_process_priority_class VisionEgg.win32_maxpriority.THREAD_PRIORITY_IDLE VisionEgg.win32_maxpriority-module.html#THREAD_PRIORITY_IDLE VisionEgg.win32_maxpriority.THREAD_PRIORITY_TIME_CRITICAL VisionEgg.win32_maxpriority-module.html#THREAD_PRIORITY_TIME_CRITICAL VisionEgg.win32_maxpriority.set_self_thread_priority VisionEgg.win32_maxpriority-module.html#set_self_thread_priority VisionEgg.win32_maxpriority._swig_setattr VisionEgg.win32_maxpriority-module.html#_swig_setattr VisionEgg.win32_maxpriority.THREAD_PRIORITY_HIGHEST VisionEgg.win32_maxpriority-module.html#THREAD_PRIORITY_HIGHEST VisionEgg.win32_maxpriority.THREAD_PRIORITY_LOWEST VisionEgg.win32_maxpriority-module.html#THREAD_PRIORITY_LOWEST VisionEgg.win32_maxpriority.THREAD_PRIORITY_ABOVE_NORMAL VisionEgg.win32_maxpriority-module.html#THREAD_PRIORITY_ABOVE_NORMAL VisionEgg.win32_maxpriority._newclass VisionEgg.win32_maxpriority-module.html#_newclass VisionEgg.win32_maxpriority.IDLE_PRIORITY_CLASS VisionEgg.win32_maxpriority-module.html#IDLE_PRIORITY_CLASS VisionEgg.win32_maxpriority.REALTIME_PRIORITY_CLASS VisionEgg.win32_maxpriority-module.html#REALTIME_PRIORITY_CLASS VisionEgg.win32_maxpriority.NORMAL_PRIORITY_CLASS VisionEgg.win32_maxpriority-module.html#NORMAL_PRIORITY_CLASS VisionEgg.ClassWithParameters VisionEgg.ClassWithParameters-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__init__ VisionEgg.ClassWithParameters-class.html#__init__ VisionEgg.Configuration.Config VisionEgg.Configuration.Config-class.html VisionEgg.Configuration.Config.__init__ VisionEgg.Configuration.Config-class.html#__init__ VisionEgg.Core.FixationSpot VisionEgg.Core.FixationSpot-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.FixationSpot.draw VisionEgg.Core.FixationSpot-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.FixationSpot.parameters_and_defaults VisionEgg.Core.FixationSpot-class.html#parameters_and_defaults VisionEgg.Core.FixationSpot.__init__ VisionEgg.Core.FixationSpot-class.html#__init__ VisionEgg.Core.FrameTimer VisionEgg.Core.FrameTimer-class.html VisionEgg.Core.FrameTimer.get_longest_frame_duration_sec VisionEgg.Core.FrameTimer-class.html#get_longest_frame_duration_sec VisionEgg.Core.FrameTimer.get_all_frametimes VisionEgg.Core.FrameTimer-class.html#get_all_frametimes VisionEgg.Core.FrameTimer.print_histogram VisionEgg.Core.FrameTimer-class.html#print_histogram VisionEgg.Core.FrameTimer.get_average_ifi_sec VisionEgg.Core.FrameTimer-class.html#get_average_ifi_sec VisionEgg.Core.FrameTimer.__init__ VisionEgg.Core.FrameTimer-class.html#__init__ VisionEgg.Core.FrameTimer.log_histogram VisionEgg.Core.FrameTimer-class.html#log_histogram VisionEgg.Core.FrameTimer.tick VisionEgg.Core.FrameTimer-class.html#tick VisionEgg.Core.FrameTimer.get_running_average_ifi_sec VisionEgg.Core.FrameTimer-class.html#get_running_average_ifi_sec VisionEgg.Core.ModelView VisionEgg.Core.ModelView-class.html VisionEgg.Core.ProjectionBaseClass.apply_to_vertices VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertices VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.eye_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_norm_device VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.ProjectionBaseClass.stateless_translate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_translate VisionEgg.Core.ModelView.__init__ VisionEgg.Core.ModelView-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Core.ProjectionBaseClass.set_gl_modelview VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_modelview VisionEgg.Core.ProjectionBaseClass.translate VisionEgg.Core.ProjectionBaseClass-class.html#translate VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.ProjectionBaseClass.stateless_scale VisionEgg.Core.ProjectionBaseClass-class.html#stateless_scale VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Core.ProjectionBaseClass.apply_to_vertex VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertex VisionEgg.Core.ProjectionBaseClass.look_at VisionEgg.Core.ProjectionBaseClass-class.html#look_at VisionEgg.Core.ProjectionBaseClass.clip_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#clip_2_norm_device VisionEgg.Core.ProjectionBaseClass.eye_2_clip VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_clip VisionEgg.Core.ProjectionBaseClass.rotate VisionEgg.Core.ProjectionBaseClass-class.html#rotate VisionEgg.Core.ProjectionBaseClass.scale VisionEgg.Core.ProjectionBaseClass-class.html#scale VisionEgg.Core.ProjectionBaseClass._get_matrix_type VisionEgg.Core.ProjectionBaseClass-class.html#_get_matrix_type VisionEgg.Core.ProjectionBaseClass.apply_to_gl VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_gl VisionEgg.Core.ProjectionBaseClass.get_matrix VisionEgg.Core.ProjectionBaseClass-class.html#get_matrix VisionEgg.Core.ProjectionBaseClass.set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_projection VisionEgg.Core.ProjectionBaseClass.parameters_and_defaults VisionEgg.Core.ProjectionBaseClass-class.html#parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.stateless_rotate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_rotate VisionEgg.Core.ProjectionBaseClass.push_and_set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#push_and_set_gl_projection VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.OrthographicProjection VisionEgg.Core.OrthographicProjection-class.html VisionEgg.Core.ProjectionBaseClass.apply_to_vertices VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertices VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.eye_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_norm_device VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.ProjectionBaseClass.stateless_translate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_translate VisionEgg.Core.OrthographicProjection.__init__ VisionEgg.Core.OrthographicProjection-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Core.ProjectionBaseClass.set_gl_modelview VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_modelview VisionEgg.Core.ProjectionBaseClass.translate VisionEgg.Core.ProjectionBaseClass-class.html#translate VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.ProjectionBaseClass.stateless_scale VisionEgg.Core.ProjectionBaseClass-class.html#stateless_scale VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Core.ProjectionBaseClass.apply_to_vertex VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertex VisionEgg.Core.ProjectionBaseClass.look_at VisionEgg.Core.ProjectionBaseClass-class.html#look_at VisionEgg.Core.ProjectionBaseClass.clip_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#clip_2_norm_device VisionEgg.Core.ProjectionBaseClass.eye_2_clip VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_clip VisionEgg.Core.ProjectionBaseClass.rotate VisionEgg.Core.ProjectionBaseClass-class.html#rotate VisionEgg.Core.ProjectionBaseClass.scale VisionEgg.Core.ProjectionBaseClass-class.html#scale VisionEgg.Core.ProjectionBaseClass._get_matrix_type VisionEgg.Core.ProjectionBaseClass-class.html#_get_matrix_type VisionEgg.Core.ProjectionBaseClass.apply_to_gl VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_gl VisionEgg.Core.ProjectionBaseClass.get_matrix VisionEgg.Core.ProjectionBaseClass-class.html#get_matrix VisionEgg.Core.ProjectionBaseClass.set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_projection VisionEgg.Core.ProjectionBaseClass.parameters_and_defaults VisionEgg.Core.ProjectionBaseClass-class.html#parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.stateless_rotate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_rotate VisionEgg.Core.ProjectionBaseClass.push_and_set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#push_and_set_gl_projection VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.OrthographicProjectionNoZClip VisionEgg.Core.OrthographicProjectionNoZClip-class.html VisionEgg.Core.ProjectionBaseClass.apply_to_vertices VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertices VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.eye_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_norm_device VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.ProjectionBaseClass.stateless_translate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_translate VisionEgg.Core.OrthographicProjectionNoZClip.__init__ VisionEgg.Core.OrthographicProjectionNoZClip-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Core.ProjectionBaseClass.set_gl_modelview VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_modelview VisionEgg.Core.ProjectionBaseClass.translate VisionEgg.Core.ProjectionBaseClass-class.html#translate VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.ProjectionBaseClass.stateless_scale VisionEgg.Core.ProjectionBaseClass-class.html#stateless_scale VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Core.ProjectionBaseClass.apply_to_vertex VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertex VisionEgg.Core.ProjectionBaseClass.look_at VisionEgg.Core.ProjectionBaseClass-class.html#look_at VisionEgg.Core.ProjectionBaseClass.clip_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#clip_2_norm_device VisionEgg.Core.ProjectionBaseClass.eye_2_clip VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_clip VisionEgg.Core.ProjectionBaseClass.rotate VisionEgg.Core.ProjectionBaseClass-class.html#rotate VisionEgg.Core.ProjectionBaseClass.scale VisionEgg.Core.ProjectionBaseClass-class.html#scale VisionEgg.Core.ProjectionBaseClass._get_matrix_type VisionEgg.Core.ProjectionBaseClass-class.html#_get_matrix_type VisionEgg.Core.ProjectionBaseClass.apply_to_gl VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_gl VisionEgg.Core.ProjectionBaseClass.get_matrix VisionEgg.Core.ProjectionBaseClass-class.html#get_matrix VisionEgg.Core.ProjectionBaseClass.set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_projection VisionEgg.Core.ProjectionBaseClass.parameters_and_defaults VisionEgg.Core.ProjectionBaseClass-class.html#parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.stateless_rotate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_rotate VisionEgg.Core.ProjectionBaseClass.push_and_set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#push_and_set_gl_projection VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.PerspectiveProjection VisionEgg.Core.PerspectiveProjection-class.html VisionEgg.Core.ProjectionBaseClass.apply_to_vertices VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertices VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.eye_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_norm_device VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.ProjectionBaseClass.stateless_translate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_translate VisionEgg.Core.PerspectiveProjection.__init__ VisionEgg.Core.PerspectiveProjection-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Core.ProjectionBaseClass.set_gl_modelview VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_modelview VisionEgg.Core.ProjectionBaseClass.translate VisionEgg.Core.ProjectionBaseClass-class.html#translate VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.ProjectionBaseClass.stateless_scale VisionEgg.Core.ProjectionBaseClass-class.html#stateless_scale VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Core.ProjectionBaseClass.apply_to_vertex VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertex VisionEgg.Core.ProjectionBaseClass.look_at VisionEgg.Core.ProjectionBaseClass-class.html#look_at VisionEgg.Core.ProjectionBaseClass.clip_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#clip_2_norm_device VisionEgg.Core.ProjectionBaseClass.eye_2_clip VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_clip VisionEgg.Core.ProjectionBaseClass.rotate VisionEgg.Core.ProjectionBaseClass-class.html#rotate VisionEgg.Core.ProjectionBaseClass.scale VisionEgg.Core.ProjectionBaseClass-class.html#scale VisionEgg.Core.ProjectionBaseClass._get_matrix_type VisionEgg.Core.ProjectionBaseClass-class.html#_get_matrix_type VisionEgg.Core.ProjectionBaseClass.apply_to_gl VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_gl VisionEgg.Core.ProjectionBaseClass.get_matrix VisionEgg.Core.ProjectionBaseClass-class.html#get_matrix VisionEgg.Core.ProjectionBaseClass.set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_projection VisionEgg.Core.ProjectionBaseClass.parameters_and_defaults VisionEgg.Core.ProjectionBaseClass-class.html#parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.stateless_rotate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_rotate VisionEgg.Core.ProjectionBaseClass.push_and_set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#push_and_set_gl_projection VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.Projection VisionEgg.Core.Projection-class.html VisionEgg.Core.ProjectionBaseClass.apply_to_vertices VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertices VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.eye_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_norm_device VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.ProjectionBaseClass.stateless_translate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_translate VisionEgg.Core.Projection.__init__ VisionEgg.Core.Projection-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Core.ProjectionBaseClass.set_gl_modelview VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_modelview VisionEgg.Core.ProjectionBaseClass.translate VisionEgg.Core.ProjectionBaseClass-class.html#translate VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.ProjectionBaseClass.stateless_scale VisionEgg.Core.ProjectionBaseClass-class.html#stateless_scale VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Core.ProjectionBaseClass.apply_to_vertex VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertex VisionEgg.Core.ProjectionBaseClass.look_at VisionEgg.Core.ProjectionBaseClass-class.html#look_at VisionEgg.Core.ProjectionBaseClass.clip_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#clip_2_norm_device VisionEgg.Core.ProjectionBaseClass.eye_2_clip VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_clip VisionEgg.Core.ProjectionBaseClass.rotate VisionEgg.Core.ProjectionBaseClass-class.html#rotate VisionEgg.Core.ProjectionBaseClass.scale VisionEgg.Core.ProjectionBaseClass-class.html#scale VisionEgg.Core.ProjectionBaseClass._get_matrix_type VisionEgg.Core.ProjectionBaseClass-class.html#_get_matrix_type VisionEgg.Core.ProjectionBaseClass.apply_to_gl VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_gl VisionEgg.Core.ProjectionBaseClass.get_matrix VisionEgg.Core.ProjectionBaseClass-class.html#get_matrix VisionEgg.Core.ProjectionBaseClass.set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_projection VisionEgg.Core.ProjectionBaseClass.parameters_and_defaults VisionEgg.Core.ProjectionBaseClass-class.html#parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.stateless_rotate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_rotate VisionEgg.Core.ProjectionBaseClass.push_and_set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#push_and_set_gl_projection VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.ProjectionBaseClass VisionEgg.Core.ProjectionBaseClass-class.html VisionEgg.Core.ProjectionBaseClass.apply_to_vertices VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertices VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.eye_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_norm_device VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.ProjectionBaseClass.stateless_translate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_translate VisionEgg.Core.ProjectionBaseClass.__init__ VisionEgg.Core.ProjectionBaseClass-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Core.ProjectionBaseClass.set_gl_modelview VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_modelview VisionEgg.Core.ProjectionBaseClass.translate VisionEgg.Core.ProjectionBaseClass-class.html#translate VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.ProjectionBaseClass.stateless_scale VisionEgg.Core.ProjectionBaseClass-class.html#stateless_scale VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Core.ProjectionBaseClass.apply_to_vertex VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertex VisionEgg.Core.ProjectionBaseClass.look_at VisionEgg.Core.ProjectionBaseClass-class.html#look_at VisionEgg.Core.ProjectionBaseClass.clip_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#clip_2_norm_device VisionEgg.Core.ProjectionBaseClass.eye_2_clip VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_clip VisionEgg.Core.ProjectionBaseClass.rotate VisionEgg.Core.ProjectionBaseClass-class.html#rotate VisionEgg.Core.ProjectionBaseClass.scale VisionEgg.Core.ProjectionBaseClass-class.html#scale VisionEgg.Core.ProjectionBaseClass._get_matrix_type VisionEgg.Core.ProjectionBaseClass-class.html#_get_matrix_type VisionEgg.Core.ProjectionBaseClass.apply_to_gl VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_gl VisionEgg.Core.ProjectionBaseClass.get_matrix VisionEgg.Core.ProjectionBaseClass-class.html#get_matrix VisionEgg.Core.ProjectionBaseClass.set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_projection VisionEgg.Core.ProjectionBaseClass.parameters_and_defaults VisionEgg.Core.ProjectionBaseClass-class.html#parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.stateless_rotate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_rotate VisionEgg.Core.ProjectionBaseClass.push_and_set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#push_and_set_gl_projection VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.Screen VisionEgg.Core.Screen-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.Screen.set_size VisionEgg.Core.Screen-class.html#set_size VisionEgg.Core.Screen.query_refresh_rate VisionEgg.Core.Screen-class.html#query_refresh_rate VisionEgg.Core.Screen.close VisionEgg.Core.Screen-class.html#close VisionEgg.Core.Screen.measure_refresh_rate VisionEgg.Core.Screen-class.html#measure_refresh_rate VisionEgg.Core.Screen.__init__ VisionEgg.Core.Screen-class.html#__init__ VisionEgg.Core.Screen.size VisionEgg.Core.Screen-class.html#size VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Core.Screen.make_current VisionEgg.Core.Screen-class.html#make_current VisionEgg.Core.Screen.get_size VisionEgg.Core.Screen-class.html#get_size VisionEgg.Core.Screen.set_gamma_ramp VisionEgg.Core.Screen-class.html#set_gamma_ramp VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.Screen._open_gamma_file VisionEgg.Core.Screen-class.html#_open_gamma_file VisionEgg.Core.Screen.put_pixels VisionEgg.Core.Screen-class.html#put_pixels VisionEgg.Core.Screen.__del__ VisionEgg.Core.Screen-class.html#__del__ VisionEgg.Core.Screen.get_framebuffer_as_array VisionEgg.Core.Screen-class.html#get_framebuffer_as_array VisionEgg.Core.Screen._create_inverted_gamma_ramp VisionEgg.Core.Screen-class.html#_create_inverted_gamma_ramp VisionEgg.Core.Screen.get_framebuffer_as_image VisionEgg.Core.Screen-class.html#get_framebuffer_as_image VisionEgg.Core.Screen.constant_parameters_and_defaults VisionEgg.Core.Screen-class.html#constant_parameters_and_defaults VisionEgg.Core.Screen.create_default VisionEgg.Core.Screen-class.html#create_default VisionEgg.Core.Screen.parameters_and_defaults VisionEgg.Core.Screen-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.Core.Screen.clear VisionEgg.Core.Screen-class.html#clear VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.SimplePerspectiveProjection VisionEgg.Core.SimplePerspectiveProjection-class.html VisionEgg.Core.ProjectionBaseClass.apply_to_vertices VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertices VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.eye_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_norm_device VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.ProjectionBaseClass.stateless_translate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_translate VisionEgg.Core.SimplePerspectiveProjection.__init__ VisionEgg.Core.SimplePerspectiveProjection-class.html#__init__ VisionEgg.Core.ProjectionBaseClass.scale VisionEgg.Core.ProjectionBaseClass-class.html#scale VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Core.ProjectionBaseClass.set_gl_modelview VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_modelview VisionEgg.Core.ProjectionBaseClass.translate VisionEgg.Core.ProjectionBaseClass-class.html#translate VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.ProjectionBaseClass.stateless_scale VisionEgg.Core.ProjectionBaseClass-class.html#stateless_scale VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Core.ProjectionBaseClass.apply_to_vertex VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_vertex VisionEgg.Core.ProjectionBaseClass.look_at VisionEgg.Core.ProjectionBaseClass-class.html#look_at VisionEgg.Core.ProjectionBaseClass.clip_2_norm_device VisionEgg.Core.ProjectionBaseClass-class.html#clip_2_norm_device VisionEgg.Core.ProjectionBaseClass.eye_2_clip VisionEgg.Core.ProjectionBaseClass-class.html#eye_2_clip VisionEgg.Core.ProjectionBaseClass.push_and_set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#push_and_set_gl_projection VisionEgg.Core.ProjectionBaseClass._get_matrix_type VisionEgg.Core.ProjectionBaseClass-class.html#_get_matrix_type VisionEgg.Core.ProjectionBaseClass.apply_to_gl VisionEgg.Core.ProjectionBaseClass-class.html#apply_to_gl VisionEgg.Core.ProjectionBaseClass.get_matrix VisionEgg.Core.ProjectionBaseClass-class.html#get_matrix VisionEgg.Core.ProjectionBaseClass.set_gl_projection VisionEgg.Core.ProjectionBaseClass-class.html#set_gl_projection VisionEgg.Core.ProjectionBaseClass.parameters_and_defaults VisionEgg.Core.ProjectionBaseClass-class.html#parameters_and_defaults VisionEgg.Core.ProjectionBaseClass.stateless_rotate VisionEgg.Core.ProjectionBaseClass-class.html#stateless_rotate VisionEgg.Core.SimplePerspectiveProjection._compute_matrix VisionEgg.Core.SimplePerspectiveProjection-class.html#_compute_matrix VisionEgg.Core.ProjectionBaseClass.rotate VisionEgg.Core.ProjectionBaseClass-class.html#rotate VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.Stimulus VisionEgg.Core.Stimulus-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.Stimulus.draw VisionEgg.Core.Stimulus-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Core.Stimulus.__init__ VisionEgg.Core.Stimulus-class.html#__init__ VisionEgg.Core.Viewport VisionEgg.Core.Viewport-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Core.Viewport.norm_device_2_window VisionEgg.Core.Viewport-class.html#norm_device_2_window VisionEgg.Core.Viewport.__init__ VisionEgg.Core.Viewport-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Core.Viewport.make_current VisionEgg.Core.Viewport-class.html#make_current VisionEgg.Core.Viewport.eye_2_window VisionEgg.Core.Viewport-class.html#eye_2_window VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.Viewport.draw VisionEgg.Core.Viewport-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Core.Viewport.parameters_and_defaults VisionEgg.Core.Viewport-class.html#parameters_and_defaults VisionEgg.Core.Viewport.clip_2_window VisionEgg.Core.Viewport-class.html#clip_2_window VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Core.Viewport.make_new_pixel_coord_projection VisionEgg.Core.Viewport-class.html#make_new_pixel_coord_projection VisionEgg.Daq.Analog VisionEgg.Daq.Analog-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Daq.Analog.constant_parameters_and_defaults VisionEgg.Daq.Analog-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.SignalType.__init__ VisionEgg.Daq.SignalType-class.html#__init__ VisionEgg.Daq.Buffered VisionEgg.Daq.Buffered-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Daq.Buffered.parameters_and_defaults VisionEgg.Daq.Buffered-class.html#parameters_and_defaults VisionEgg.Daq.DaqMode.__init__ VisionEgg.Daq.DaqMode-class.html#__init__ VisionEgg.Daq.Channel VisionEgg.Daq.Channel-class.html VisionEgg.Daq.Channel.arm_trigger VisionEgg.Daq.Channel-class.html#arm_trigger VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Daq.Channel.constant_parameters_and_defaults VisionEgg.Daq.Channel-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.Channel.__init__ VisionEgg.Daq.Channel-class.html#__init__ VisionEgg.Daq.ChannelParameters VisionEgg.Daq.ChannelParameters-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__init__ VisionEgg.ClassWithParameters-class.html#__init__ VisionEgg.Daq.DaqMode VisionEgg.Daq.DaqMode-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.DaqMode.__init__ VisionEgg.Daq.DaqMode-class.html#__init__ VisionEgg.Daq.Device VisionEgg.Daq.Device-class.html VisionEgg.Daq.Device.add_channel VisionEgg.Daq.Device-class.html#add_channel VisionEgg.Daq.Device.__init__ VisionEgg.Daq.Device-class.html#__init__ VisionEgg.Daq.Digital VisionEgg.Daq.Digital-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Daq.SignalType.constant_parameters_and_defaults VisionEgg.Daq.SignalType-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.SignalType.__init__ VisionEgg.Daq.SignalType-class.html#__init__ VisionEgg.Daq.Functionality VisionEgg.Daq.Functionality-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.Functionality.__init__ VisionEgg.Daq.Functionality-class.html#__init__ VisionEgg.Daq.Immediate VisionEgg.Daq.Immediate-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.DaqMode.__init__ VisionEgg.Daq.DaqMode-class.html#__init__ VisionEgg.Daq.Input VisionEgg.Daq.Input-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Daq.Input.get_data VisionEgg.Daq.Input-class.html#get_data VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.Functionality.__init__ VisionEgg.Daq.Functionality-class.html#__init__ VisionEgg.Daq.Output VisionEgg.Daq.Output-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Daq.Output.put_data VisionEgg.Daq.Output-class.html#put_data VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.Functionality.__init__ VisionEgg.Daq.Functionality-class.html#__init__ VisionEgg.Daq.SignalType VisionEgg.Daq.SignalType-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Daq.SignalType.constant_parameters_and_defaults VisionEgg.Daq.SignalType-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.SignalType.__init__ VisionEgg.Daq.SignalType-class.html#__init__ VisionEgg.Daq.Trigger VisionEgg.Daq.Trigger-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__init__ VisionEgg.ClassWithParameters-class.html#__init__ VisionEgg.DaqKeyboard.KeyboardInput VisionEgg.DaqKeyboard.KeyboardInput-class.html VisionEgg.DaqKeyboard.KeyboardInput.get_string_data VisionEgg.DaqKeyboard.KeyboardInput-class.html#get_string_data VisionEgg.DaqKeyboard.KeyboardInput.get_data VisionEgg.DaqKeyboard.KeyboardInput-class.html#get_data VisionEgg.DaqKeyboard.KeyboardInput.get_pygame_data VisionEgg.DaqKeyboard.KeyboardInput-class.html#get_pygame_data VisionEgg.DaqKeyboard.KeyboardTriggerInController VisionEgg.DaqKeyboard.KeyboardTriggerInController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.DaqKeyboard.KeyboardTriggerInController.between_go_eval VisionEgg.DaqKeyboard.KeyboardTriggerInController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.DaqKeyboard.KeyboardTriggerInController.__init__ VisionEgg.DaqKeyboard.KeyboardTriggerInController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.DaqKeyboard.KeyboardTriggerInController.during_go_eval VisionEgg.DaqKeyboard.KeyboardTriggerInController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.DaqLPT.LPTChannel VisionEgg.DaqLPT.LPTChannel-class.html VisionEgg.Daq.Channel.arm_trigger VisionEgg.Daq.Channel-class.html#arm_trigger VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Daq.Channel.constant_parameters_and_defaults VisionEgg.Daq.Channel-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.DaqLPT.LPTChannel.__init__ VisionEgg.DaqLPT.LPTChannel-class.html#__init__ VisionEgg.DaqLPT.LPTDevice VisionEgg.DaqLPT.LPTDevice-class.html VisionEgg.DaqLPT.LPTDevice.add_channel VisionEgg.DaqLPT.LPTDevice-class.html#add_channel VisionEgg.DaqLPT.LPTDevice.__init__ VisionEgg.DaqLPT.LPTDevice-class.html#__init__ VisionEgg.DaqLPT.LPTInput VisionEgg.DaqLPT.LPTInput-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.DaqLPT.LPTInput.get_data VisionEgg.DaqLPT.LPTInput-class.html#get_data VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.Daq.Functionality.__init__ VisionEgg.Daq.Functionality-class.html#__init__ VisionEgg.DaqLPT.LPTOutput VisionEgg.DaqLPT.LPTOutput-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.DaqLPT.LPTOutput.put_data VisionEgg.DaqLPT.LPTOutput-class.html#put_data VisionEgg.Daq.Functionality.__init__ VisionEgg.Daq.Functionality-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.DaqLPT.LPTOutput.__del__ VisionEgg.DaqLPT.LPTOutput-class.html#__del__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.DaqLPT.LPTTriggerInController VisionEgg.DaqLPT.LPTTriggerInController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.DaqLPT.LPTTriggerInController.between_go_eval VisionEgg.DaqLPT.LPTTriggerInController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.DaqLPT.LPTTriggerInController.__init__ VisionEgg.DaqLPT.LPTTriggerInController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.DaqLPT.LPTTriggerInController.during_go_eval VisionEgg.DaqLPT.LPTTriggerInController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.DaqLPT.LPTTriggerOutController VisionEgg.DaqLPT.LPTTriggerOutController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.DaqLPT.LPTTriggerOutController.between_go_eval VisionEgg.DaqLPT.LPTTriggerOutController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.DaqLPT.LPTTriggerOutController.__init__ VisionEgg.DaqLPT.LPTTriggerOutController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.DaqLPT.LPTTriggerOutController.during_go_eval VisionEgg.DaqLPT.LPTTriggerOutController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.Deprecated.Message VisionEgg.Deprecated.Message-class.html VisionEgg.Deprecated.Message.INFO VisionEgg.Deprecated.Message-class.html#INFO VisionEgg.Deprecated.Message.DEPRECATION VisionEgg.Deprecated.Message-class.html#DEPRECATION VisionEgg.Deprecated.Message.handle VisionEgg.Deprecated.Message-class.html#handle VisionEgg.Deprecated.Message.NAG VisionEgg.Deprecated.Message-class.html#NAG VisionEgg.Deprecated.Message.format_string VisionEgg.Deprecated.Message-class.html#format_string VisionEgg.Deprecated.Message.add VisionEgg.Deprecated.Message-class.html#add VisionEgg.Deprecated.Message.WARNING VisionEgg.Deprecated.Message-class.html#WARNING VisionEgg.Deprecated.Message.ERROR VisionEgg.Deprecated.Message-class.html#ERROR VisionEgg.Deprecated.Message.FATAL VisionEgg.Deprecated.Message-class.html#FATAL VisionEgg.Deprecated.Message.TRIVIAL VisionEgg.Deprecated.Message-class.html#TRIVIAL VisionEgg.Deprecated.Message.__init__ VisionEgg.Deprecated.Message-class.html#__init__ VisionEgg.Dots.DotArea2D VisionEgg.Dots.DotArea2D-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Dots.DotArea2D.draw VisionEgg.Dots.DotArea2D-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Dots.DotArea2D.constant_parameters_and_defaults VisionEgg.Dots.DotArea2D-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Dots.DotArea2D.parameters_and_defaults VisionEgg.Dots.DotArea2D-class.html#parameters_and_defaults VisionEgg.Dots.DotArea2D.__init__ VisionEgg.Dots.DotArea2D-class.html#__init__ VisionEgg.FlowControl.ConstantController VisionEgg.FlowControl.ConstantController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.ConstantController.between_go_eval VisionEgg.FlowControl.ConstantController-class.html#between_go_eval VisionEgg.FlowControl.ConstantController.set_during_go_value VisionEgg.FlowControl.ConstantController-class.html#set_during_go_value VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.FlowControl.ConstantController.__init__ VisionEgg.FlowControl.ConstantController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.ConstantController.get_during_go_value VisionEgg.FlowControl.ConstantController-class.html#get_during_go_value VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.ConstantController.set_between_go_value VisionEgg.FlowControl.ConstantController-class.html#set_between_go_value VisionEgg.FlowControl.ConstantController.get_between_go_value VisionEgg.FlowControl.ConstantController-class.html#get_between_go_value VisionEgg.FlowControl.ConstantController.during_go_eval VisionEgg.FlowControl.ConstantController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.FlowControl.Controller VisionEgg.FlowControl.Controller-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.Controller.between_go_eval VisionEgg.FlowControl.Controller-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.FlowControl.Controller.__init__ VisionEgg.FlowControl.Controller-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.during_go_eval VisionEgg.FlowControl.Controller-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.FlowControl.EncapsulatedController VisionEgg.FlowControl.EncapsulatedController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.EncapsulatedController.between_go_eval VisionEgg.FlowControl.EncapsulatedController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.FlowControl.EncapsulatedController.__init__ VisionEgg.FlowControl.EncapsulatedController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.EncapsulatedController.set_new_controller VisionEgg.FlowControl.EncapsulatedController-class.html#set_new_controller VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.EncapsulatedController.__sync_mimic VisionEgg.FlowControl.EncapsulatedController-class.html#__sync_mimic VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.EncapsulatedController.during_go_eval VisionEgg.FlowControl.EncapsulatedController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.FlowControl.EvalStringController VisionEgg.FlowControl.EvalStringController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.EvalStringController.set_between_go_eval_string VisionEgg.FlowControl.EvalStringController-class.html#set_between_go_eval_string VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.EvalStringController.get_between_go_eval_string VisionEgg.FlowControl.EvalStringController-class.html#get_between_go_eval_string VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.EvalStringController.between_go_eval VisionEgg.FlowControl.EvalStringController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.FlowControl.EvalStringController.__init__ VisionEgg.FlowControl.EvalStringController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.EvalStringController.get_during_go_eval_string VisionEgg.FlowControl.EvalStringController-class.html#get_during_go_eval_string VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.EvalStringController.set_during_go_eval_string VisionEgg.FlowControl.EvalStringController-class.html#set_during_go_eval_string VisionEgg.FlowControl.EvalStringController.during_go_eval VisionEgg.FlowControl.EvalStringController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.FlowControl.ExecStringController VisionEgg.FlowControl.ExecStringController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.ExecStringController.set_between_go_exec_string VisionEgg.FlowControl.ExecStringController-class.html#set_between_go_exec_string VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.ExecStringController.between_go_eval VisionEgg.FlowControl.ExecStringController-class.html#between_go_eval VisionEgg.FlowControl.ExecStringController.get_between_go_exec_string VisionEgg.FlowControl.ExecStringController-class.html#get_between_go_exec_string VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.FlowControl.ExecStringController.__init__ VisionEgg.FlowControl.ExecStringController-class.html#__init__ VisionEgg.FlowControl.ExecStringController.get_during_go_exec_string VisionEgg.FlowControl.ExecStringController-class.html#get_during_go_exec_string VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.ExecStringController.set_during_go_exec_string VisionEgg.FlowControl.ExecStringController-class.html#set_during_go_exec_string VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.ExecStringController.during_go_eval VisionEgg.FlowControl.ExecStringController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.FlowControl.FunctionController VisionEgg.FlowControl.FunctionController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.FunctionController.between_go_eval VisionEgg.FlowControl.FunctionController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.FlowControl.FunctionController.__init__ VisionEgg.FlowControl.FunctionController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.FunctionController.during_go_eval VisionEgg.FlowControl.FunctionController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.FlowControl.Presentation VisionEgg.FlowControl.Presentation-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.FlowControl.Presentation.remove_controller VisionEgg.FlowControl.Presentation-class.html#remove_controller VisionEgg.FlowControl.Presentation.go VisionEgg.FlowControl.Presentation-class.html#go VisionEgg.FlowControl.Presentation.were_frames_dropped_in_last_go_loop VisionEgg.FlowControl.Presentation-class.html#were_frames_dropped_in_last_go_loop VisionEgg.FlowControl.Presentation.run_forever VisionEgg.FlowControl.Presentation-class.html#run_forever VisionEgg.FlowControl.Presentation.__init__ VisionEgg.FlowControl.Presentation-class.html#__init__ VisionEgg.FlowControl.Presentation.add_controller VisionEgg.FlowControl.Presentation-class.html#add_controller VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.FlowControl.Presentation.is_in_go_loop VisionEgg.FlowControl.Presentation-class.html#is_in_go_loop VisionEgg.FlowControl.Presentation.__call_controllers VisionEgg.FlowControl.Presentation-class.html#__call_controllers VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.FlowControl.Presentation.get_last_go_loop_start_time_absolute_sec VisionEgg.FlowControl.Presentation-class.html#get_last_go_loop_start_time_absolute_sec VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.FlowControl.Presentation.between_presentations VisionEgg.FlowControl.Presentation-class.html#between_presentations VisionEgg.FlowControl.Presentation.parameters_and_defaults VisionEgg.FlowControl.Presentation-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.FlowControl.Presentation.export_movie_go VisionEgg.FlowControl.Presentation-class.html#export_movie_go VisionEgg.GLTrace.Wrapper VisionEgg.GLTrace.Wrapper-class.html VisionEgg.GLTrace.Wrapper.run VisionEgg.GLTrace.Wrapper-class.html#run VisionEgg.GLTrace.Wrapper.__init__ VisionEgg.GLTrace.Wrapper-class.html#__init__ VisionEgg.GUI.AppWindow VisionEgg.GUI.AppWindow-class.html VisionEgg.GUI.AppWindow.idle VisionEgg.GUI.AppWindow-class.html#idle VisionEgg.GUI.AppWindow.__init__ VisionEgg.GUI.AppWindow-class.html#__init__ VisionEgg.GUI.GetKeypressDialog VisionEgg.GUI.GetKeypressDialog-class.html VisionEgg.GUI.ToplevelDialog.destroy VisionEgg.GUI.ToplevelDialog-class.html#destroy VisionEgg.GUI.GetKeypressDialog.keypress VisionEgg.GUI.GetKeypressDialog-class.html#keypress VisionEgg.GUI.GetKeypressDialog.__init__ VisionEgg.GUI.GetKeypressDialog-class.html#__init__ VisionEgg.GUI.GraphicsConfigurationWindow VisionEgg.GUI.GraphicsConfigurationWindow-class.html VisionEgg.GUI.GraphicsConfigurationWindow.format_string VisionEgg.GUI.GraphicsConfigurationWindow-class.html#format_string VisionEgg.GUI.GraphicsConfigurationWindow.start VisionEgg.GUI.GraphicsConfigurationWindow-class.html#start VisionEgg.GUI.GraphicsConfigurationWindow.darwin_maxpriority_tune VisionEgg.GUI.GraphicsConfigurationWindow-class.html#darwin_maxpriority_tune VisionEgg.GUI.GraphicsConfigurationWindow._set_config_values VisionEgg.GUI.GraphicsConfigurationWindow-class.html#_set_config_values VisionEgg.GUI.GraphicsConfigurationWindow.save VisionEgg.GUI.GraphicsConfigurationWindow-class.html#save VisionEgg.GUI.GraphicsConfigurationWindow.set_gamma_file VisionEgg.GUI.GraphicsConfigurationWindow-class.html#set_gamma_file VisionEgg.GUI.GraphicsConfigurationWindow.__init__ VisionEgg.GUI.GraphicsConfigurationWindow-class.html#__init__ VisionEgg.GUI.InfoFrame VisionEgg.GUI.InfoFrame-class.html VisionEgg.GUI.InfoFrame.update VisionEgg.GUI.InfoFrame-class.html#update VisionEgg.GUI.InfoFrame.__init__ VisionEgg.GUI.InfoFrame-class.html#__init__ VisionEgg.GUI.ProgressBar VisionEgg.GUI.ProgressBar-class.html VisionEgg.GUI.ProgressBar.updateProgress VisionEgg.GUI.ProgressBar-class.html#updateProgress VisionEgg.GUI.ProgressBar.update VisionEgg.GUI.ProgressBar-class.html#update VisionEgg.GUI.ProgressBar.__init__ VisionEgg.GUI.ProgressBar-class.html#__init__ VisionEgg.GUI.ToplevelDialog VisionEgg.GUI.ToplevelDialog-class.html VisionEgg.GUI.ToplevelDialog.destroy VisionEgg.GUI.ToplevelDialog-class.html#destroy VisionEgg.GUI.ToplevelDialog.__init__ VisionEgg.GUI.ToplevelDialog-class.html#__init__ VisionEgg.Gratings.AlphaGratingCommon VisionEgg.Gratings.AlphaGratingCommon-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Gratings.AlphaGratingCommon.calculate_bit_depth_dependencies VisionEgg.Gratings.AlphaGratingCommon-class.html#calculate_bit_depth_dependencies VisionEgg.Core.Stimulus.__init__ VisionEgg.Core.Stimulus-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.Stimulus.draw VisionEgg.Core.Stimulus-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Gratings.AlphaGratingCommon.parameters_and_defaults VisionEgg.Gratings.AlphaGratingCommon-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Gratings.LuminanceGratingCommon VisionEgg.Gratings.LuminanceGratingCommon-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Gratings.LuminanceGratingCommon.calculate_bit_depth_dependencies VisionEgg.Gratings.LuminanceGratingCommon-class.html#calculate_bit_depth_dependencies VisionEgg.Core.Stimulus.__init__ VisionEgg.Core.Stimulus-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.Stimulus.draw VisionEgg.Core.Stimulus-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Gratings.LuminanceGratingCommon.parameters_and_defaults VisionEgg.Gratings.LuminanceGratingCommon-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Gratings.NumSamplesTooLargeError VisionEgg.Gratings.NumSamplesTooLargeError-class.html VisionEgg.Gratings.SinGrating2D VisionEgg.Gratings.SinGrating2D-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Gratings.LuminanceGratingCommon.calculate_bit_depth_dependencies VisionEgg.Gratings.LuminanceGratingCommon-class.html#calculate_bit_depth_dependencies VisionEgg.Gratings.SinGrating2D.__init__ VisionEgg.Gratings.SinGrating2D-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Gratings.SinGrating2D.draw VisionEgg.Gratings.SinGrating2D-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Gratings.SinGrating2D.__del__ VisionEgg.Gratings.SinGrating2D-class.html#__del__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Gratings.SinGrating2D.parameters_and_defaults VisionEgg.Gratings.SinGrating2D-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Gratings.SinGrating3D VisionEgg.Gratings.SinGrating3D-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Gratings.LuminanceGratingCommon.calculate_bit_depth_dependencies VisionEgg.Gratings.LuminanceGratingCommon-class.html#calculate_bit_depth_dependencies VisionEgg.Gratings.SinGrating3D.__init__ VisionEgg.Gratings.SinGrating3D-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Gratings.SinGrating3D.draw VisionEgg.Gratings.SinGrating3D-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Gratings.SinGrating3D.__del__ VisionEgg.Gratings.SinGrating3D-class.html#__del__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.Gratings.SinGrating3D.parameters_and_defaults VisionEgg.Gratings.SinGrating3D-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.MoreStimuli.Arrow VisionEgg.MoreStimuli.Arrow-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.MoreStimuli.Arrow.draw VisionEgg.MoreStimuli.Arrow-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.MoreStimuli.Arrow.parameters_and_defaults VisionEgg.MoreStimuli.Arrow-class.html#parameters_and_defaults VisionEgg.MoreStimuli.Arrow.__init__ VisionEgg.MoreStimuli.Arrow-class.html#__init__ VisionEgg.MoreStimuli.FilledCircle VisionEgg.MoreStimuli.FilledCircle-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.MoreStimuli.FilledCircle.draw VisionEgg.MoreStimuli.FilledCircle-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.MoreStimuli.FilledCircle.parameters_and_defaults VisionEgg.MoreStimuli.FilledCircle-class.html#parameters_and_defaults VisionEgg.MoreStimuli.FilledCircle.__init__ VisionEgg.MoreStimuli.FilledCircle-class.html#__init__ VisionEgg.MoreStimuli.Rectangle3D VisionEgg.MoreStimuli.Rectangle3D-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.MoreStimuli.Rectangle3D.draw VisionEgg.MoreStimuli.Rectangle3D-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.MoreStimuli.Rectangle3D.parameters_and_defaults VisionEgg.MoreStimuli.Rectangle3D-class.html#parameters_and_defaults VisionEgg.MoreStimuli.Rectangle3D.__init__ VisionEgg.MoreStimuli.Rectangle3D-class.html#__init__ VisionEgg.MoreStimuli.Target2D VisionEgg.MoreStimuli.Target2D-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.MoreStimuli.Target2D.draw VisionEgg.MoreStimuli.Target2D-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.MoreStimuli.Target2D.parameters_and_defaults VisionEgg.MoreStimuli.Target2D-class.html#parameters_and_defaults VisionEgg.MoreStimuli.Target2D.__init__ VisionEgg.MoreStimuli.Target2D-class.html#__init__ VisionEgg.ParameterDefinition VisionEgg.ParameterDefinition-class.html VisionEgg.ParameterDefinition.OPENGL_ENUM VisionEgg.ParameterDefinition-class.html#OPENGL_ENUM VisionEgg.ParameterDefinition.DEPRECATED VisionEgg.ParameterDefinition-class.html#DEPRECATED VisionEgg.ParameterTypes.AnyClass VisionEgg.ParameterTypes.AnyClass-class.html VisionEgg.ParameterTypes.AnyClass.__metaclass__ VisionEgg.ParameterTypes.AnyClassMC-class.html VisionEgg.ParameterTypes.AnyClass.verify VisionEgg.ParameterTypes.AnyClass-class.html#verify VisionEgg.ParameterTypes.AnyClassMC VisionEgg.ParameterTypes.AnyClassMC-class.html VisionEgg.ParameterTypes.AnyClassMC.__str__ VisionEgg.ParameterTypes.AnyClassMC-class.html#__str__ VisionEgg.ParameterTypes.AnyOf VisionEgg.ParameterTypes.AnyOf-class.html VisionEgg.ParameterTypes.AnyOf.verify VisionEgg.ParameterTypes.AnyOf-class.html#verify VisionEgg.ParameterTypes.AnyOf.__str__ VisionEgg.ParameterTypes.AnyOf-class.html#__str__ VisionEgg.ParameterTypes.AnyOf.get_item_types VisionEgg.ParameterTypes.AnyOf-class.html#get_item_types VisionEgg.ParameterTypes.AnyOf.__init__ VisionEgg.ParameterTypes.AnyOf-class.html#__init__ VisionEgg.ParameterTypes.Boolean VisionEgg.ParameterTypes.Boolean-class.html VisionEgg.ParameterTypes.Boolean.__metaclass__ VisionEgg.ParameterTypes.BooleanMC-class.html VisionEgg.ParameterTypes.Boolean.verify VisionEgg.ParameterTypes.Boolean-class.html#verify VisionEgg.ParameterTypes.BooleanMC VisionEgg.ParameterTypes.BooleanMC-class.html VisionEgg.ParameterTypes.BooleanMC.__str__ VisionEgg.ParameterTypes.BooleanMC-class.html#__str__ VisionEgg.ParameterTypes.Callable VisionEgg.ParameterTypes.Callable-class.html VisionEgg.ParameterTypes.Callable.__metaclass__ VisionEgg.ParameterTypes.CallableMC-class.html VisionEgg.ParameterTypes.Callable.verify VisionEgg.ParameterTypes.Callable-class.html#verify VisionEgg.ParameterTypes.CallableMC VisionEgg.ParameterTypes.CallableMC-class.html VisionEgg.ParameterTypes.CallableMC.__str__ VisionEgg.ParameterTypes.CallableMC-class.html#__str__ VisionEgg.ParameterTypes.Instance VisionEgg.ParameterTypes.Instance-class.html VisionEgg.ParameterTypes.Instance.verify VisionEgg.ParameterTypes.Instance-class.html#verify VisionEgg.ParameterTypes.Instance.__str__ VisionEgg.ParameterTypes.Instance-class.html#__str__ VisionEgg.ParameterTypes.Instance.__init__ VisionEgg.ParameterTypes.Instance-class.html#__init__ VisionEgg.ParameterTypes.Integer VisionEgg.ParameterTypes.Integer-class.html VisionEgg.ParameterTypes.Integer.__metaclass__ VisionEgg.ParameterTypes.IntegerMC-class.html VisionEgg.ParameterTypes.Integer.verify VisionEgg.ParameterTypes.Integer-class.html#verify VisionEgg.ParameterTypes.IntegerMC VisionEgg.ParameterTypes.IntegerMC-class.html VisionEgg.ParameterTypes.IntegerMC.__str__ VisionEgg.ParameterTypes.IntegerMC-class.html#__str__ VisionEgg.ParameterTypes.NoneMC VisionEgg.ParameterTypes.NoneMC-class.html VisionEgg.ParameterTypes.NoneMC.__str__ VisionEgg.ParameterTypes.NoneMC-class.html#__str__ VisionEgg.ParameterTypes.NoneType VisionEgg.ParameterTypes.NoneType-class.html VisionEgg.ParameterTypes.NoneType.__metaclass__ VisionEgg.ParameterTypes.NoneMC-class.html VisionEgg.ParameterTypes.NoneType.verify VisionEgg.ParameterTypes.NoneType-class.html#verify VisionEgg.ParameterTypes.ParameterTypeDef VisionEgg.ParameterTypes.ParameterTypeDef-class.html VisionEgg.ParameterTypes.ParameterTypeDef.verify VisionEgg.ParameterTypes.ParameterTypeDef-class.html#verify VisionEgg.ParameterTypes.Real VisionEgg.ParameterTypes.Real-class.html VisionEgg.ParameterTypes.Real.__metaclass__ VisionEgg.ParameterTypes.RealMC-class.html VisionEgg.ParameterTypes.Real.verify VisionEgg.ParameterTypes.Real-class.html#verify VisionEgg.ParameterTypes.RealMC VisionEgg.ParameterTypes.RealMC-class.html VisionEgg.ParameterTypes.RealMC.__str__ VisionEgg.ParameterTypes.RealMC-class.html#__str__ VisionEgg.ParameterTypes.Sequence VisionEgg.ParameterTypes.Sequence-class.html VisionEgg.ParameterTypes.Sequence.verify VisionEgg.ParameterTypes.Sequence-class.html#verify VisionEgg.ParameterTypes.Sequence.__str__ VisionEgg.ParameterTypes.Sequence-class.html#__str__ VisionEgg.ParameterTypes.Sequence.__init__ VisionEgg.ParameterTypes.Sequence-class.html#__init__ VisionEgg.ParameterTypes.Sequence2 VisionEgg.ParameterTypes.Sequence2-class.html VisionEgg.ParameterTypes.Sequence2.verify VisionEgg.ParameterTypes.Sequence2-class.html#verify VisionEgg.ParameterTypes.Sequence2.__str__ VisionEgg.ParameterTypes.Sequence2-class.html#__str__ VisionEgg.ParameterTypes.Sequence.__init__ VisionEgg.ParameterTypes.Sequence-class.html#__init__ VisionEgg.ParameterTypes.Sequence3 VisionEgg.ParameterTypes.Sequence3-class.html VisionEgg.ParameterTypes.Sequence3.verify VisionEgg.ParameterTypes.Sequence3-class.html#verify VisionEgg.ParameterTypes.Sequence3.__str__ VisionEgg.ParameterTypes.Sequence3-class.html#__str__ VisionEgg.ParameterTypes.Sequence.__init__ VisionEgg.ParameterTypes.Sequence-class.html#__init__ VisionEgg.ParameterTypes.Sequence4 VisionEgg.ParameterTypes.Sequence4-class.html VisionEgg.ParameterTypes.Sequence4.verify VisionEgg.ParameterTypes.Sequence4-class.html#verify VisionEgg.ParameterTypes.Sequence4.__str__ VisionEgg.ParameterTypes.Sequence4-class.html#__str__ VisionEgg.ParameterTypes.Sequence.__init__ VisionEgg.ParameterTypes.Sequence-class.html#__init__ VisionEgg.ParameterTypes.Sequence4x4 VisionEgg.ParameterTypes.Sequence4x4-class.html VisionEgg.ParameterTypes.Sequence4x4.verify VisionEgg.ParameterTypes.Sequence4x4-class.html#verify VisionEgg.ParameterTypes.Sequence4x4.__str__ VisionEgg.ParameterTypes.Sequence4x4-class.html#__str__ VisionEgg.ParameterTypes.Sequence.__init__ VisionEgg.ParameterTypes.Sequence-class.html#__init__ VisionEgg.ParameterTypes.String VisionEgg.ParameterTypes.String-class.html VisionEgg.ParameterTypes.String.__metaclass__ VisionEgg.ParameterTypes.StringMC-class.html VisionEgg.ParameterTypes.String.verify VisionEgg.ParameterTypes.String-class.html#verify VisionEgg.ParameterTypes.StringMC VisionEgg.ParameterTypes.StringMC-class.html VisionEgg.ParameterTypes.StringMC.__str__ VisionEgg.ParameterTypes.StringMC-class.html#__str__ VisionEgg.ParameterTypes.SubClass VisionEgg.ParameterTypes.SubClass-class.html VisionEgg.ParameterTypes.SubClass.verify VisionEgg.ParameterTypes.SubClass-class.html#verify VisionEgg.ParameterTypes.SubClass.__str__ VisionEgg.ParameterTypes.SubClass-class.html#__str__ VisionEgg.ParameterTypes.SubClass.__init__ VisionEgg.ParameterTypes.SubClass-class.html#__init__ VisionEgg.ParameterTypes.Unicode VisionEgg.ParameterTypes.Unicode-class.html VisionEgg.ParameterTypes.Unicode.__metaclass__ VisionEgg.ParameterTypes.UnicodeMC-class.html VisionEgg.ParameterTypes.Unicode.verify VisionEgg.ParameterTypes.Unicode-class.html#verify VisionEgg.ParameterTypes.UnicodeMC VisionEgg.ParameterTypes.UnicodeMC-class.html VisionEgg.ParameterTypes.UnicodeMC.__str__ VisionEgg.ParameterTypes.UnicodeMC-class.html#__str__ VisionEgg.ParameterTypes.UnsignedInteger VisionEgg.ParameterTypes.UnsignedInteger-class.html VisionEgg.ParameterTypes.UnsignedInteger.__metaclass__ VisionEgg.ParameterTypes.UnsignedIntegerMC-class.html VisionEgg.ParameterTypes.UnsignedInteger.verify VisionEgg.ParameterTypes.UnsignedInteger-class.html#verify VisionEgg.ParameterTypes.UnsignedIntegerMC VisionEgg.ParameterTypes.UnsignedIntegerMC-class.html VisionEgg.ParameterTypes.UnsignedIntegerMC.__str__ VisionEgg.ParameterTypes.UnsignedIntegerMC-class.html#__str__ VisionEgg.Parameters VisionEgg.Parameters-class.html VisionEgg.PyroApps.AST_ext.AST_Visitor VisionEgg.PyroApps.AST_ext.AST_Visitor-class.html VisionEgg.PyroApps.AST_ext.AST_Visitor.traverse VisionEgg.PyroApps.AST_ext.AST_Visitor-class.html#traverse VisionEgg.PyroApps.AST_ext.AST_Visitor.__init__ VisionEgg.PyroApps.AST_ext.AST_Visitor-class.html#__init__ VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame.title VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html#title VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame.get_shortname VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame.send_values VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html#send_values VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame.update_tk_vars VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame.__init__ VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame.get_duration_sec VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.ColorCalGUI.ColorCalMetaParameters VisionEgg.PyroApps.ColorCalGUI.ColorCalMetaParameters-class.html VisionEgg.PyroApps.ColorCalGUI.ColorCalMetaParameters.__init__ VisionEgg.PyroApps.ColorCalGUI.ColorCalMetaParameters-class.html#__init__ VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.html VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController.go VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.html#go VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController.set_parameters VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.html#set_parameters VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController.__init__ VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.html#__init__ VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController.get_parameters VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.html#get_parameters VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController.update VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.html#update VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController.quit_server VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.html#quit_server VisionEgg.PyroApps.DropinGUI.DropinControlFrame VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.DropinGUI.DropinControlFrame.title VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html#title VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.DropinGUI.DropinControlFrame.get_shortname VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.DropinGUI.DropinControlFrame.gen_var_widgets VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html#gen_var_widgets VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.DropinGUI.DropinControlFrame.send_values VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html#send_values VisionEgg.PyroApps.DropinGUI.DropinControlFrame.update_tk_vars VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.DropinGUI.DropinControlFrame.__init__ VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.DropinGUI.DropinControlFrame.get_duration_sec VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.DropinGUI.DropinMetaParameters VisionEgg.PyroApps.DropinGUI.DropinMetaParameters-class.html VisionEgg.PyroApps.DropinGUI.DropinMetaParameters.__init__ VisionEgg.PyroApps.DropinGUI.DropinMetaParameters-class.html#__init__ VisionEgg.PyroApps.DropinServer.DropinMetaController VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html VisionEgg.PyroApps.DropinServer.DropinMetaController.go VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html#go VisionEgg.PyroApps.DropinServer.DropinMetaController.set_parameters VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html#set_parameters VisionEgg.PyroApps.DropinServer.DropinMetaController.__init__ VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html#__init__ VisionEgg.PyroApps.DropinServer.DropinMetaController.get_parameters VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html#get_parameters VisionEgg.PyroApps.DropinServer.DropinMetaController.update VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html#update VisionEgg.PyroApps.DropinServer.DropinMetaController.quit_server VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html#quit_server VisionEgg.PyroApps.EPhysGUI.AppWindow VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUI.AppWindow.do_single_trial_post VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#do_single_trial_post VisionEgg.PyroApps.EPhysGUI.AppWindow.change_stimulus VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#change_stimulus VisionEgg.PyroApps.EPhysGUI.AppWindow.sleep_with_progress VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#sleep_with_progress Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.EPhysGUI.AppWindow.set_autosave_dir VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#set_autosave_dir VisionEgg.PyroApps.EPhysGUI.AppWindow.do_loops VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#do_loops VisionEgg.PyroApps.EPhysGUI.AppWindow.update_stim_onset_cal VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#update_stim_onset_cal VisionEgg.PyroApps.EPhysGUI.AppWindow.load_config VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#load_config VisionEgg.PyroApps.EPhysGUI.AppWindow.load_demoscript VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#load_demoscript VisionEgg.PyroApps.EPhysGUI.AppWindow.do_single_trial VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#do_single_trial VisionEgg.PyroApps.EPhysGUI.AppWindow.do_single_trial_work VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#do_single_trial_work VisionEgg.PyroApps.EPhysGUI.AppWindow.load_params VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#load_params VisionEgg.PyroApps.EPhysGUI.AppWindow.quit VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#quit VisionEgg.PyroApps.EPhysGUI.AppWindow.launch_gamma_panel VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#launch_gamma_panel VisionEgg.PyroApps.EPhysGUI.AppWindow.launch_screen_pos VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#launch_screen_pos VisionEgg.PyroApps.EPhysGUI.AppWindow.__del__ VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#__del__ VisionEgg.PyroApps.EPhysGUI.AppWindow.switch_to_stimkey VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#switch_to_stimkey VisionEgg.PyroApps.EPhysGUI.AppWindow.set_stim_onset_cal_position VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#set_stim_onset_cal_position VisionEgg.PyroApps.EPhysGUI.AppWindow.save_config VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#save_config VisionEgg.PyroApps.EPhysGUI.AppWindow.save_image_sequence VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#save_image_sequence VisionEgg.PyroApps.EPhysGUI.AppWindow.__init__ VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#__init__ VisionEgg.PyroApps.EPhysGUI.AppWindow.do_single_trial_pre VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#do_single_trial_pre VisionEgg.PyroApps.EPhysGUI.AppWindow.destroy VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#destroy VisionEgg.PyroApps.EPhysGUI.AppWindow.reset_autosave_basename VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#reset_autosave_basename VisionEgg.PyroApps.EPhysGUI.AppWindow.launch_stim_onset_cal VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html#launch_stim_onset_cal VisionEgg.PyroApps.EPhysGUI.BarButton VisionEgg.PyroApps.EPhysGUI.BarButton-class.html Tkinter.Misc.getdouble float-class.html Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.EPhysGUI.BarButton.__init__ VisionEgg.PyroApps.EPhysGUI.BarButton-class.html#__init__ VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase-class.html VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase.header VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase-class.html#header VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase.get_str_30 VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase-class.html#get_str_30 VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase.__init__ VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase-class.html#__init__ VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase.get_contained VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase-class.html#get_contained VisionEgg.PyroApps.EPhysGUI.GammaFrame VisionEgg.PyroApps.EPhysGUI.GammaFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUI.GammaFrame.set_from_file VisionEgg.PyroApps.EPhysGUI.GammaFrame-class.html#set_from_file Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.EPhysGUI.GammaFrame.get_corrected_gamma_table VisionEgg.PyroApps.EPhysGUI.GammaFrame-class.html#get_corrected_gamma_table VisionEgg.PyroApps.EPhysGUI.GammaFrame.linearize VisionEgg.PyroApps.EPhysGUI.GammaFrame-class.html#linearize VisionEgg.PyroApps.EPhysGUI.GammaFrame.__init__ VisionEgg.PyroApps.EPhysGUI.GammaFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUI.GammaFrame.set_monitor_default VisionEgg.PyroApps.EPhysGUI.GammaFrame-class.html#set_monitor_default VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher-class.html Tkinter.Misc.getdouble float-class.html Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher.do_it VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher-class.html#do_it VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher.__init__ VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher-class.html#__init__ VisionEgg.PyroApps.EPhysGUI.Loop VisionEgg.PyroApps.EPhysGUI.Loop-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.PyroApps.EPhysGUI.Loop.get_current VisionEgg.PyroApps.EPhysGUI.Loop-class.html#get_current VisionEgg.PyroApps.EPhysGUI.Loop.__init__ VisionEgg.PyroApps.EPhysGUI.Loop-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.PyroApps.EPhysGUI.Loop.is_done VisionEgg.PyroApps.EPhysGUI.Loop-class.html#is_done VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.PyroApps.EPhysGUI.Loop.parameters_and_defaults VisionEgg.PyroApps.EPhysGUI.Loop-class.html#parameters_and_defaults VisionEgg.PyroApps.EPhysGUI.Loop.reset VisionEgg.PyroApps.EPhysGUI.Loop-class.html#reset VisionEgg.PyroApps.EPhysGUI.Loop.advance VisionEgg.PyroApps.EPhysGUI.Loop-class.html#advance VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.PyroApps.EPhysGUI.LoopContainedObject VisionEgg.PyroApps.EPhysGUI.LoopContainedObject-class.html VisionEgg.PyroApps.EPhysGUI.LoopContainedObject.contained_class VisionEgg.PyroApps.EPhysGUI.Loop-class.html VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase.get_contained VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase-class.html#get_contained VisionEgg.PyroApps.EPhysGUI.LoopContainedObject.get_str_30 VisionEgg.PyroApps.EPhysGUI.LoopContainedObject-class.html#get_str_30 VisionEgg.PyroApps.EPhysGUI.LoopContainedObject.__init__ VisionEgg.PyroApps.EPhysGUI.LoopContainedObject-class.html#__init__ VisionEgg.PyroApps.EPhysGUI.LoopContainedObject.header VisionEgg.PyroApps.EPhysGUI.LoopContainedObject-class.html#header VisionEgg.PyroApps.EPhysGUI.LoopParamDialog VisionEgg.PyroApps.EPhysGUI.LoopParamDialog-class.html Tkinter.Misc.getdouble float-class.html Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.EPhysGUI.LoopParamDialog.body VisionEgg.PyroApps.EPhysGUI.LoopParamDialog-class.html#body VisionEgg.PyroApps.EPhysGUI.LoopParamDialog.__init__ VisionEgg.PyroApps.EPhysGUI.LoopParamDialog-class.html#__init__ VisionEgg.PyroApps.EPhysGUI.LoopParamDialog.destroy VisionEgg.PyroApps.EPhysGUI.LoopParamDialog-class.html#destroy VisionEgg.PyroApps.EPhysGUI.LoopParamDialog.validate VisionEgg.PyroApps.EPhysGUI.LoopParamDialog-class.html#validate VisionEgg.PyroApps.EPhysGUI.ScrollListFrame VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.make_loop_contained_object VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#make_loop_contained_object VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.get_list_uncontained VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#get_list_uncontained VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.list2D_coordinates VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#list2D_coordinates VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.edit_contained_object VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#edit_contained_object VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.remove_selected VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#remove_selected Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.make_merge VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#make_merge VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.add_new VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#add_new VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.move_selected_down VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#move_selected_down VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.get_selected VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#get_selected VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.map_to_listbox_index VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#map_to_listbox_index VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.move_selected_up VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#move_selected_up VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.update_now VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#update_now VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.__init__ VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.edit_selected VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#edit_selected VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.delegate_hscroll VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#delegate_hscroll VisionEgg.PyroApps.EPhysGUI.ScrollListFrame.make_contained_object VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html#make_contained_object VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.send_values VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#send_values VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.update_tk_vars VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.EPhysServer.EPhysServer VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html VisionEgg.PyroApps.EPhysServer.EPhysServer.get_cwd VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#get_cwd VisionEgg.PyroApps.EPhysServer.EPhysServer.get_next_stimulus_meta_controller VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#get_next_stimulus_meta_controller VisionEgg.PyroApps.EPhysServer.EPhysServer.set_stim_onset_cal VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#set_stim_onset_cal VisionEgg.PyroApps.EPhysServer.EPhysServer.save_image_sequence VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#save_image_sequence VisionEgg.PyroApps.EPhysServer.EPhysServer.were_frames_dropped_in_last_go_loop VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#were_frames_dropped_in_last_go_loop VisionEgg.PyroApps.EPhysServer.EPhysServer.__init__ VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#__init__ VisionEgg.PyroApps.EPhysServer.EPhysServer.first_connection VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#first_connection VisionEgg.PyroApps.EPhysServer.EPhysServer.get_stimkey VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#get_stimkey VisionEgg.PyroApps.EPhysServer.EPhysServer.set_stim_onset_cal_location VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#set_stim_onset_cal_location VisionEgg.PyroApps.EPhysServer.EPhysServer.is_in_go_loop VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#is_in_go_loop VisionEgg.PyroApps.EPhysServer.EPhysServer.get_stim_onset_cal_location VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#get_stim_onset_cal_location VisionEgg.PyroApps.EPhysServer.EPhysServer.set_quit_status VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#set_quit_status VisionEgg.PyroApps.EPhysServer.EPhysServer.run_demoscript VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#run_demoscript VisionEgg.PyroApps.EPhysServer.EPhysServer.set_next_stimkey VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#set_next_stimkey VisionEgg.PyroApps.EPhysServer.EPhysServer.set_override_t_abs_sec VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#set_override_t_abs_sec VisionEgg.PyroApps.EPhysServer.EPhysServer.get_last_go_loop_start_time_absolute_sec VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#get_last_go_loop_start_time_absolute_sec VisionEgg.PyroApps.EPhysServer.EPhysServer.__del__ VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#__del__ VisionEgg.PyroApps.EPhysServer.EPhysServer.get_quit_status VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#get_quit_status VisionEgg.PyroApps.EPhysServer.EPhysServer.exec_AST VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#exec_AST VisionEgg.PyroApps.EPhysServer.EPhysServer.build_AST VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#build_AST VisionEgg.PyroApps.EPhysServer.EPhysServer.set_gamma_ramp VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html#set_gamma_ramp VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame.title VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.html#title VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame.get_shortname VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame.send_values VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.html#send_values VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame.update_tk_vars VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame.__init__ VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame.get_duration_sec VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters-class.html VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters.__init__ VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters-class.html#__init__ VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.go VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#go VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.set_parameters VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#set_parameters VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.__init__ VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#__init__ VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.on_function_between_go VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#on_function_between_go VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.on_function_during_go VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#on_function_during_go VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.get_parameters VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#get_parameters VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.__del__ VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#__del__ VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.update VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#update VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController.quit_server VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html#quit_server VisionEgg.PyroApps.GridGUI.GridControlFrame VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.GridGUI.GridControlFrame.title VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html#title VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.GridGUI.GridControlFrame.get_shortname VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.GridGUI.GridControlFrame.send_values VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html#send_values VisionEgg.PyroApps.GridGUI.GridControlFrame.update_tk_vars VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.GridGUI.GridControlFrame.__init__ VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.GridGUI.GridControlFrame.get_duration_sec VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.GridGUI.GridMetaParameters VisionEgg.PyroApps.GridGUI.GridMetaParameters-class.html VisionEgg.PyroApps.GridGUI.GridMetaParameters.__init__ VisionEgg.PyroApps.GridGUI.GridMetaParameters-class.html#__init__ VisionEgg.PyroApps.GridServer.GridMetaController VisionEgg.PyroApps.GridServer.GridMetaController-class.html VisionEgg.PyroApps.GridServer.GridMetaController.go VisionEgg.PyroApps.GridServer.GridMetaController-class.html#go VisionEgg.PyroApps.GridServer.GridMetaController.set_parameters VisionEgg.PyroApps.GridServer.GridMetaController-class.html#set_parameters VisionEgg.PyroApps.GridServer.GridMetaController.__init__ VisionEgg.PyroApps.GridServer.GridMetaController-class.html#__init__ VisionEgg.PyroApps.GridServer.GridMetaController.get_parameters VisionEgg.PyroApps.GridServer.GridMetaController-class.html#get_parameters VisionEgg.PyroApps.GridServer.GridMetaController.update VisionEgg.PyroApps.GridServer.GridMetaController-class.html#update VisionEgg.PyroApps.GridServer.GridMetaController.quit_server VisionEgg.PyroApps.GridServer.GridMetaController-class.html#quit_server VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame.title VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.html#title VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame.get_shortname VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame.send_values VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.html#send_values VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame.update_tk_vars VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame.__init__ VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame.get_duration_sec VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters-class.html VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters.__init__ VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters-class.html#__init__ VisionEgg.PyroApps.MouseTargetServer.MousePositionController VisionEgg.PyroApps.MouseTargetServer.MousePositionController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.Controller.between_go_eval VisionEgg.FlowControl.Controller-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroApps.MouseTargetServer.MousePositionController.__init__ VisionEgg.PyroApps.MouseTargetServer.MousePositionController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.PyroApps.MouseTargetServer.MousePositionController.during_go_eval VisionEgg.PyroApps.MouseTargetServer.MousePositionController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController.go VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html#go VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController.set_parameters VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html#set_parameters VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController.__init__ VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html#__init__ VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController.get_parameters VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html#get_parameters VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController.__del__ VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html#__del__ VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController.update VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html#update VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController.quit_server VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html#quit_server VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.Controller.between_go_eval VisionEgg.FlowControl.Controller-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController.__init__ VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController.during_go_eval VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroApps.MouseTargetServer.TargetPositionController VisionEgg.PyroApps.MouseTargetServer.TargetPositionController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.Controller.between_go_eval VisionEgg.FlowControl.Controller-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroApps.MouseTargetServer.TargetPositionController.__init__ VisionEgg.PyroApps.MouseTargetServer.TargetPositionController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.PyroApps.MouseTargetServer.TargetPositionController.during_go_eval VisionEgg.PyroApps.MouseTargetServer.TargetPositionController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroApps.ScreenPositionGUI.CallbackEntry VisionEgg.PyroApps.ScreenPositionGUI.CallbackEntry-class.html Tkinter.Misc.getdouble float-class.html Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.ScreenPositionGUI.CallbackEntry.__init__ VisionEgg.PyroApps.ScreenPositionGUI.CallbackEntry-class.html#__init__ VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.up_az_increase VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#up_az_increase VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.get_loopable_variable_names VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#get_loopable_variable_names VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.save VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#save VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.get_xyz VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#get_xyz VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.el_decrease VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#el_decrease Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.get_shortname VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#get_shortname VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.frustum_left VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#frustum_left VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.set_param_dict VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#set_param_dict VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.frustum_wider VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#frustum_wider VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.connect VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#connect VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.get_param_dict VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#get_param_dict VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.get_parameters_as_strings VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#get_parameters_as_strings VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.up_el_decrease VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#up_el_decrease VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.quit_server VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#quit_server VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.az_decrease VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#az_decrease VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.load VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#load VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.frustum_taller VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#frustum_taller VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.el_increase VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#el_increase VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.get_type VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#get_type VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.set_loopable_variable VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.az_increase VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#az_increase VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.frustum_narrower VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#frustum_narrower VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.send_values VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#send_values VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.up_az_decrease VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#up_az_decrease VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.frustum_up VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#frustum_up VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.frustum_shorter VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#frustum_shorter VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.__init__ VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#__init__ VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.get_az_el VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#get_az_el VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.frustum_down VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#frustum_down VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.up_el_increase VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#up_el_increase VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame.frustum_right VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html#frustum_right VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters-class.html VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters.__init__ VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters-class.html#__init__ VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.html VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController.go VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.html#go VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController.set_parameters VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.html#set_parameters VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController.__init__ VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.html#__init__ VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController.get_parameters VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.html#get_parameters VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController.update VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.html#update VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController.quit_server VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.html#quit_server VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame.title VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.html#title VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame.get_shortname VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame.send_values VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.html#send_values VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame.update_tk_vars VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame.__init__ VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame.get_duration_sec VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters-class.html VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters.__init__ VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters-class.html#__init__ VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.go VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#go VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.set_parameters VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#set_parameters VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.__init__ VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#__init__ VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.on_function_between_go VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#on_function_between_go VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.on_function_during_go VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#on_function_during_go VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.get_parameters VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#get_parameters VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.__del__ VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#__del__ VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.update VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#update VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController.quit_server VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html#quit_server VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame.title VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.html#title VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame.get_shortname VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame.send_values VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.html#send_values VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame.update_tk_vars VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame.__init__ VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame.get_duration_sec VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters-class.html VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters.__init__ VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters-class.html#__init__ VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.angular_position_between_go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#angular_position_between_go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.set_parameters VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#set_parameters VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.__init__ VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#__init__ VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.on_function_between_go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#on_function_between_go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.on_function_during_go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#on_function_during_go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.get_parameters VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#get_parameters VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.__del__ VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#__del__ VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.update VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#update VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.quit_server VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#quit_server VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController.angular_position_during_go VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html#angular_position_during_go VisionEgg.PyroApps.TargetGUI.TargetControlFrame VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html Tkinter.Misc.getdouble float-class.html VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#go VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.make_callback_entry VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#make_callback_entry VisionEgg.PyroApps.TargetGUI.TargetControlFrame.title VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html#title VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_loopable_variable_names VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_loopable_variable_names Tkinter.Misc.getint int-class.html VisionEgg.PyroApps.TargetGUI.TargetControlFrame.get_shortname VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html#get_shortname VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#standalone_connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_param_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#connect VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_m_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#quit_server VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_as_py_strings VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_matlab_string VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_loopable_variable VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_loopable_variable VisionEgg.PyroApps.TargetGUI.TargetControlFrame.send_values VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html#send_values VisionEgg.PyroApps.TargetGUI.TargetControlFrame.update_tk_vars VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html#update_tk_vars VisionEgg.PyroApps.TargetGUI.TargetControlFrame.__init__ VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html#__init__ VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.set_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#set_parameters_dict VisionEgg.PyroApps.TargetGUI.TargetControlFrame.get_duration_sec VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html#get_duration_sec VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame.get_parameters_dict VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html#get_parameters_dict VisionEgg.PyroApps.TargetGUI.TargetMetaParameters VisionEgg.PyroApps.TargetGUI.TargetMetaParameters-class.html VisionEgg.PyroApps.TargetGUI.TargetMetaParameters.__init__ VisionEgg.PyroApps.TargetGUI.TargetMetaParameters-class.html#__init__ VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.set_parameters VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#set_parameters VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.__init__ VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#__init__ VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.on_function_between_go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#on_function_between_go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.on_function_during_go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#on_function_during_go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.get_parameters VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#get_parameters VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.__del__ VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#__del__ VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.update VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#update VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.quit_server VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#quit_server VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.center_between_go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#center_between_go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController.center_during_go VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html#center_during_go VisionEgg.PyroClient.PyroClient VisionEgg.PyroClient.PyroClient-class.html VisionEgg.PyroClient.PyroClient.__init__ VisionEgg.PyroClient.PyroClient-class.html#__init__ VisionEgg.PyroClient.PyroClient.get VisionEgg.PyroClient.PyroClient-class.html#get VisionEgg.PyroHelpers.PyroConstantController VisionEgg.PyroHelpers.PyroConstantController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.ConstantController.between_go_eval VisionEgg.FlowControl.ConstantController-class.html#between_go_eval VisionEgg.FlowControl.ConstantController.set_during_go_value VisionEgg.FlowControl.ConstantController-class.html#set_during_go_value VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroHelpers.PyroConstantController.__init__ VisionEgg.PyroHelpers.PyroConstantController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.ConstantController.get_during_go_value VisionEgg.FlowControl.ConstantController-class.html#get_during_go_value VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.ConstantController.set_between_go_value VisionEgg.FlowControl.ConstantController-class.html#set_between_go_value VisionEgg.FlowControl.ConstantController.get_between_go_value VisionEgg.FlowControl.ConstantController-class.html#get_between_go_value VisionEgg.FlowControl.ConstantController.during_go_eval VisionEgg.FlowControl.ConstantController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroHelpers.PyroEncapsulatedController VisionEgg.PyroHelpers.PyroEncapsulatedController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.EncapsulatedController.between_go_eval VisionEgg.FlowControl.EncapsulatedController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroHelpers.PyroEncapsulatedController.__init__ VisionEgg.PyroHelpers.PyroEncapsulatedController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.EncapsulatedController.set_new_controller VisionEgg.FlowControl.EncapsulatedController-class.html#set_new_controller VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.EncapsulatedController.during_go_eval VisionEgg.FlowControl.EncapsulatedController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroHelpers.PyroEvalStringController VisionEgg.PyroHelpers.PyroEvalStringController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.EvalStringController.set_between_go_eval_string VisionEgg.FlowControl.EvalStringController-class.html#set_between_go_eval_string VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.EvalStringController.get_between_go_eval_string VisionEgg.FlowControl.EvalStringController-class.html#get_between_go_eval_string VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.EvalStringController.between_go_eval VisionEgg.FlowControl.EvalStringController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroHelpers.PyroEvalStringController.__init__ VisionEgg.PyroHelpers.PyroEvalStringController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.EvalStringController.get_during_go_eval_string VisionEgg.FlowControl.EvalStringController-class.html#get_during_go_eval_string VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.EvalStringController.set_during_go_eval_string VisionEgg.FlowControl.EvalStringController-class.html#set_during_go_eval_string VisionEgg.FlowControl.EvalStringController.during_go_eval VisionEgg.FlowControl.EvalStringController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroHelpers.PyroExecStringController VisionEgg.PyroHelpers.PyroExecStringController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.ExecStringController.set_between_go_exec_string VisionEgg.FlowControl.ExecStringController-class.html#set_between_go_exec_string VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.ExecStringController.between_go_eval VisionEgg.FlowControl.ExecStringController-class.html#between_go_eval VisionEgg.FlowControl.ExecStringController.get_between_go_exec_string VisionEgg.FlowControl.ExecStringController-class.html#get_between_go_exec_string VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroHelpers.PyroExecStringController.__init__ VisionEgg.PyroHelpers.PyroExecStringController-class.html#__init__ VisionEgg.FlowControl.ExecStringController.get_during_go_exec_string VisionEgg.FlowControl.ExecStringController-class.html#get_during_go_exec_string VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.ExecStringController.set_during_go_exec_string VisionEgg.FlowControl.ExecStringController-class.html#set_during_go_exec_string VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.ExecStringController.during_go_eval VisionEgg.FlowControl.ExecStringController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroHelpers.PyroListenController VisionEgg.PyroHelpers.PyroListenController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.PyroHelpers.PyroListenController.between_go_eval VisionEgg.PyroHelpers.PyroListenController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroHelpers.PyroListenController.__init__ VisionEgg.PyroHelpers.PyroListenController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.PyroHelpers.PyroListenController.during_go_eval VisionEgg.PyroHelpers.PyroListenController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroHelpers.PyroLocalDictController VisionEgg.PyroHelpers.PyroLocalDictController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.EncapsulatedController.between_go_eval VisionEgg.FlowControl.EncapsulatedController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.PyroHelpers.PyroLocalDictController.__init__ VisionEgg.PyroHelpers.PyroLocalDictController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.PyroHelpers.PyroLocalDictController.add_controller VisionEgg.PyroHelpers.PyroLocalDictController-class.html#add_controller VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.EncapsulatedController.set_new_controller VisionEgg.FlowControl.EncapsulatedController-class.html#set_new_controller VisionEgg.PyroHelpers.PyroLocalDictController.use_controller VisionEgg.PyroHelpers.PyroLocalDictController-class.html#use_controller VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.EncapsulatedController.during_go_eval VisionEgg.FlowControl.EncapsulatedController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.PyroHelpers.PyroServer VisionEgg.PyroHelpers.PyroServer-class.html VisionEgg.PyroHelpers.PyroServer.disconnect VisionEgg.PyroHelpers.PyroServer-class.html#disconnect VisionEgg.PyroHelpers.PyroServer.create_listener_controller VisionEgg.PyroHelpers.PyroServer-class.html#create_listener_controller VisionEgg.PyroHelpers.PyroServer.connect VisionEgg.PyroHelpers.PyroServer-class.html#connect VisionEgg.PyroHelpers.PyroServer.handleRequests VisionEgg.PyroHelpers.PyroServer-class.html#handleRequests VisionEgg.PyroHelpers.PyroServer.get_hostname_and_port VisionEgg.PyroHelpers.PyroServer-class.html#get_hostname_and_port VisionEgg.PyroHelpers.PyroServer.__init__ VisionEgg.PyroHelpers.PyroServer-class.html#__init__ VisionEgg.QuickTime.MovieTexture VisionEgg.QuickTime.MovieTexture-class.html VisionEgg.QuickTime.MovieTexture.load VisionEgg.QuickTime.MovieTexture-class.html#load VisionEgg.Textures.Texture.get_pixels_as_image VisionEgg.Textures.Texture-class.html#get_pixels_as_image VisionEgg.QuickTime.MovieTexture.make_half_size VisionEgg.QuickTime.MovieTexture-class.html#make_half_size VisionEgg.QuickTime.MovieTexture.unload VisionEgg.QuickTime.MovieTexture-class.html#unload VisionEgg.QuickTime.MovieTexture.__del__ VisionEgg.QuickTime.MovieTexture-class.html#__del__ VisionEgg.Textures.Texture.get_texture_object VisionEgg.Textures.Texture-class.html#get_texture_object VisionEgg.QuickTime.MovieTexture.update VisionEgg.QuickTime.MovieTexture-class.html#update VisionEgg.QuickTime.MovieTexture.get_texels_as_image VisionEgg.QuickTime.MovieTexture-class.html#get_texels_as_image VisionEgg.QuickTime.MovieTexture.__init__ VisionEgg.QuickTime.MovieTexture-class.html#__init__ VisionEgg.ResponseControl.KeyboardResponseController VisionEgg.ResponseControl.KeyboardResponseController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.ResponseControl.ResponseController.get_time_first_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_first_responses_since_go VisionEgg.ResponseControl.ResponseController.get_time_first_response_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_first_response_since_go VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.ResponseControl.ResponseController.get_time_last_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_last_responses_since_go VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.ResponseControl.KeyboardResponseController.between_go_eval VisionEgg.ResponseControl.KeyboardResponseController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.ResponseControl.KeyboardResponseController.__init__ VisionEgg.ResponseControl.KeyboardResponseController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.ResponseControl.ResponseController.get_last_response_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_last_response_since_go VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.ResponseControl.ResponseController.get_data VisionEgg.ResponseControl.ResponseController-class.html#get_data VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.ResponseControl.ResponseController.get_first_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_first_responses_since_go VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.ResponseControl.ResponseController.get_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_responses_since_go VisionEgg.ResponseControl.ResponseController.get_last_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_last_responses_since_go VisionEgg.ResponseControl.ResponseController.get_first_response_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_first_response_since_go VisionEgg.ResponseControl.ResponseController.get_time_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_responses_since_go VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.ResponseControl.KeyboardResponseController.during_go_eval VisionEgg.ResponseControl.KeyboardResponseController-class.html#during_go_eval VisionEgg.ResponseControl.ResponseController.get_time_last_response_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_last_response_since_go VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.ResponseControl.ResponseController.get_responses VisionEgg.ResponseControl.ResponseController-class.html#get_responses VisionEgg.ResponseControl.ResponseController._reset VisionEgg.ResponseControl.ResponseController-class.html#_reset VisionEgg.ResponseControl.ResponseController VisionEgg.ResponseControl.ResponseController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.ResponseControl.ResponseController.get_data VisionEgg.ResponseControl.ResponseController-class.html#get_data VisionEgg.ResponseControl.ResponseController.get_time_first_response_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_first_response_since_go VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.ResponseControl.ResponseController.get_time_last_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_last_responses_since_go VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.ResponseControl.ResponseController.between_go_eval VisionEgg.ResponseControl.ResponseController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.ResponseControl.ResponseController.__init__ VisionEgg.ResponseControl.ResponseController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.ResponseControl.ResponseController.get_last_response_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_last_response_since_go VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.ResponseControl.ResponseController.get_time_first_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_first_responses_since_go VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.ResponseControl.ResponseController.get_first_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_first_responses_since_go VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.ResponseControl.ResponseController.get_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_responses_since_go VisionEgg.ResponseControl.ResponseController.get_last_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_last_responses_since_go VisionEgg.ResponseControl.ResponseController.get_first_response_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_first_response_since_go VisionEgg.ResponseControl.ResponseController.get_time_responses_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_responses_since_go VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.ResponseControl.ResponseController.during_go_eval VisionEgg.ResponseControl.ResponseController-class.html#during_go_eval VisionEgg.ResponseControl.ResponseController._reset VisionEgg.ResponseControl.ResponseController-class.html#_reset VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.ResponseControl.ResponseController.get_responses VisionEgg.ResponseControl.ResponseController-class.html#get_responses VisionEgg.ResponseControl.ResponseController.get_time_last_response_since_go VisionEgg.ResponseControl.ResponseController-class.html#get_time_last_response_since_go VisionEgg.SphereMap.AzElGrid VisionEgg.SphereMap.AzElGrid-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.SphereMap.AzElGrid.__rebuild_display_lists VisionEgg.SphereMap.AzElGrid-class.html#__rebuild_display_lists VisionEgg.SphereMap.AzElGrid.__init__ VisionEgg.SphereMap.AzElGrid-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.SphereMap.AzElGrid.draw VisionEgg.SphereMap.AzElGrid-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.SphereMap.AzElGrid.constant_parameters_and_defaults VisionEgg.SphereMap.AzElGrid-class.html#constant_parameters_and_defaults VisionEgg.SphereMap.AzElGrid.parameters_and_defaults VisionEgg.SphereMap.AzElGrid-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.SphereMap.SphereGrating VisionEgg.SphereMap.SphereGrating-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Gratings.LuminanceGratingCommon.calculate_bit_depth_dependencies VisionEgg.Gratings.LuminanceGratingCommon-class.html#calculate_bit_depth_dependencies VisionEgg.SphereMap.SphereGrating.__init__ VisionEgg.SphereMap.SphereGrating-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.SphereMap.SphereGrating.draw VisionEgg.SphereMap.SphereGrating-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.SphereMap.SphereGrating.__rebuild_texture_object VisionEgg.SphereMap.SphereGrating-class.html#__rebuild_texture_object VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.SphereMap.SphereGrating.parameters_and_defaults VisionEgg.SphereMap.SphereGrating-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.SphereMap.SphereGrating.__rebuild_display_list VisionEgg.SphereMap.SphereGrating-class.html#__rebuild_display_list VisionEgg.SphereMap.SphereMap VisionEgg.SphereMap.SphereMap-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.SphereMap.SphereMap.__init__ VisionEgg.SphereMap.SphereMap-class.html#__init__ VisionEgg.Textures.TextureStimulusBaseClass._mipmap_modes VisionEgg.Textures.TextureStimulusBaseClass-class.html#_mipmap_modes VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.SphereMap.SphereMap.draw VisionEgg.SphereMap.SphereMap-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.Textures.TextureStimulusBaseClass.constant_parameters_and_defaults VisionEgg.Textures.TextureStimulusBaseClass-class.html#constant_parameters_and_defaults VisionEgg.SphereMap.SphereMap.parameters_and_defaults VisionEgg.SphereMap.SphereMap-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.SphereMap.SphereMap.__rebuild_display_list VisionEgg.SphereMap.SphereMap-class.html#__rebuild_display_list VisionEgg.Textures.TextureStimulusBaseClass._reload_texture VisionEgg.Textures.TextureStimulusBaseClass-class.html#_reload_texture VisionEgg.SphereMap.SphereWindow VisionEgg.SphereMap.SphereWindow-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Gratings.LuminanceGratingCommon.calculate_bit_depth_dependencies VisionEgg.Gratings.LuminanceGratingCommon-class.html#calculate_bit_depth_dependencies VisionEgg.SphereMap.SphereWindow.__rebuild_display_lists VisionEgg.SphereMap.SphereWindow-class.html#__rebuild_display_lists VisionEgg.SphereMap.SphereWindow.__init__ VisionEgg.SphereMap.SphereWindow-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.SphereMap.SphereWindow.draw VisionEgg.SphereMap.SphereWindow-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.SphereMap.SphereWindow.__rebuild_texture_object VisionEgg.SphereMap.SphereWindow-class.html#__rebuild_texture_object VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.SphereMap.SphereWindow.parameters_and_defaults VisionEgg.SphereMap.SphereWindow-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.TCPController.SocketListenController VisionEgg.TCPController.SocketListenController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.TCPController.SocketListenController._re_exec_str VisionEgg.TCPController.SocketListenController-class.html#_re_exec_str VisionEgg.TCPController.SocketListenController.__unprocessed_line VisionEgg.TCPController.SocketListenController-class.html#__unprocessed_line VisionEgg.TCPController.SocketListenController.__do_assignment_command VisionEgg.TCPController.SocketListenController-class.html#__do_assignment_command VisionEgg.TCPController.SocketListenController._parse_args_globals VisionEgg.TCPController.SocketListenController-class.html#_parse_args_globals VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.TCPController.SocketListenController.between_go_eval VisionEgg.TCPController.SocketListenController-class.html#between_go_eval VisionEgg.TCPController.SocketListenController.send_raw_text VisionEgg.TCPController.SocketListenController-class.html#send_raw_text VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.TCPController.SocketListenController.__init__ VisionEgg.TCPController.SocketListenController-class.html#__init__ VisionEgg.TCPController.SocketListenController._parse_args_locals VisionEgg.TCPController.SocketListenController-class.html#_parse_args_locals VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.TCPController.SocketListenController._re_eval_str VisionEgg.TCPController.SocketListenController-class.html#_re_eval_str VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.TCPController.SocketListenController._re_x_finder VisionEgg.TCPController.SocketListenController-class.html#_re_x_finder VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.TCPController.SocketListenController.create_tcp_controller VisionEgg.TCPController.SocketListenController-class.html#create_tcp_controller VisionEgg.TCPController.SocketListenController.during_go_eval VisionEgg.TCPController.SocketListenController-class.html#during_go_eval VisionEgg.TCPController.SocketListenController.__process_common_args VisionEgg.TCPController.SocketListenController-class.html#__process_common_args VisionEgg.TCPController.SocketListenController._re_const VisionEgg.TCPController.SocketListenController-class.html#_re_const VisionEgg.TCPController.SocketListenController.help_string VisionEgg.TCPController.SocketListenController-class.html#help_string VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.TCPController.SocketListenController.__check_socket VisionEgg.TCPController.SocketListenController-class.html#__check_socket VisionEgg.TCPController.SocketListenController._re_line VisionEgg.TCPController.SocketListenController-class.html#_re_line VisionEgg.TCPController.SocketListenController.__get_five_args VisionEgg.TCPController.SocketListenController-class.html#__get_five_args VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.TCPController.TCPController VisionEgg.TCPController.TCPController-class.html VisionEgg.FlowControl.Controller.set_eval_frequency VisionEgg.FlowControl.Controller-class.html#set_eval_frequency VisionEgg.TCPController.TCPController.__str__ VisionEgg.TCPController.TCPController-class.html#__str__ VisionEgg.FlowControl.Controller.TIME_INDEPENDENT VisionEgg.FlowControl.Controller-class.html#TIME_INDEPENDENT VisionEgg.FlowControl.EncapsulatedController.between_go_eval VisionEgg.FlowControl.EncapsulatedController-class.html#between_go_eval VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO VisionEgg.FlowControl.Controller-class.html#FRAMES_SINCE_GO VisionEgg.TCPController.TCPController.__init__ VisionEgg.TCPController.TCPController-class.html#__init__ VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO VisionEgg.FlowControl.Controller-class.html#NOT_BETWEEN_GO VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#FRAMES_ABSOLUTE VisionEgg.FlowControl.Controller.NEVER VisionEgg.FlowControl.Controller-class.html#NEVER VisionEgg.FlowControl.EncapsulatedController.set_new_controller VisionEgg.FlowControl.EncapsulatedController-class.html#set_new_controller VisionEgg.FlowControl.Controller.returns_type VisionEgg.FlowControl.Controller-class.html#returns_type VisionEgg.FlowControl.Controller.evaluate_now VisionEgg.FlowControl.Controller-class.html#evaluate_now VisionEgg.FlowControl.Controller._test_self VisionEgg.FlowControl.Controller-class.html#_test_self VisionEgg.FlowControl.Controller.TRANSITIONS VisionEgg.FlowControl.Controller-class.html#TRANSITIONS VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller-class.html#TIME_SEC_ABSOLUTE VisionEgg.FlowControl.Controller.ONCE VisionEgg.FlowControl.Controller-class.html#ONCE VisionEgg.FlowControl.Controller.EVERY_FRAME VisionEgg.FlowControl.Controller-class.html#EVERY_FRAME VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller-class.html#TIME_SEC_SINCE_GO VisionEgg.FlowControl.Controller.flag_dictionary VisionEgg.FlowControl.Controller-class.html#flag_dictionary VisionEgg.FlowControl.EncapsulatedController.during_go_eval VisionEgg.FlowControl.EncapsulatedController-class.html#during_go_eval VisionEgg.FlowControl.Controller.NOT_DURING_GO VisionEgg.FlowControl.Controller-class.html#NOT_DURING_GO VisionEgg.TCPController.TCPServer VisionEgg.TCPController.TCPServer-class.html VisionEgg.TCPController.TCPServer.__init__ VisionEgg.TCPController.TCPServer-class.html#__init__ VisionEgg.TCPController.TCPServer.create_listener_once_connected VisionEgg.TCPController.TCPServer-class.html#create_listener_once_connected VisionEgg.Text.BitmapText VisionEgg.Text.BitmapText-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Text.BitmapText.draw VisionEgg.Text.BitmapText-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Text.BitmapText.parameters_and_defaults VisionEgg.Text.BitmapText-class.html#parameters_and_defaults VisionEgg.Text.BitmapText.__init__ VisionEgg.Text.BitmapText-class.html#__init__ VisionEgg.Text.GlutTextBase VisionEgg.Text.GlutTextBase-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.Stimulus.draw VisionEgg.Core.Stimulus-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Text.GlutTextBase.parameters_and_defaults VisionEgg.Text.GlutTextBase-class.html#parameters_and_defaults VisionEgg.Text.GlutTextBase.__init__ VisionEgg.Text.GlutTextBase-class.html#__init__ VisionEgg.Text.StrokeText VisionEgg.Text.StrokeText-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Text.StrokeText.draw VisionEgg.Text.StrokeText-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.ClassWithParameters.constant_parameters_and_defaults VisionEgg.ClassWithParameters-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Text.StrokeText.parameters_and_defaults VisionEgg.Text.StrokeText-class.html#parameters_and_defaults VisionEgg.Text.StrokeText.__init__ VisionEgg.Text.StrokeText-class.html#__init__ VisionEgg.Text.Text VisionEgg.Text.Text-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Text.Text._render_text VisionEgg.Text.Text-class.html#_render_text VisionEgg.Text.Text.__init__ VisionEgg.Text.Text-class.html#__init__ VisionEgg.Textures.TextureStimulusBaseClass._mipmap_modes VisionEgg.Textures.TextureStimulusBaseClass-class.html#_mipmap_modes VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Text.Text.draw VisionEgg.Text.Text-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.Text.Text.constant_parameters_and_defaults VisionEgg.Text.Text-class.html#constant_parameters_and_defaults VisionEgg.Text.Text.parameters_and_defaults VisionEgg.Text.Text-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Textures.TextureStimulusBaseClass._reload_texture VisionEgg.Textures.TextureStimulusBaseClass-class.html#_reload_texture VisionEgg.Textures.FixationCross VisionEgg.Textures.FixationCross-class.html VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Textures.FixationCross.draw VisionEgg.Textures.FixationCross-class.html#draw VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Textures.FixationCross.constant_parameters_and_defaults VisionEgg.Textures.FixationCross-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Textures.FixationCross.parameters_and_defaults VisionEgg.Textures.FixationCross-class.html#parameters_and_defaults VisionEgg.Textures.FixationCross.__init__ VisionEgg.Textures.FixationCross-class.html#__init__ VisionEgg.Textures.Mask2D VisionEgg.Textures.Mask2D-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Textures.Mask2D.__init__ VisionEgg.Textures.Mask2D-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.Textures.Mask2D.draw_masked_quad VisionEgg.Textures.Mask2D-class.html#draw_masked_quad VisionEgg.Textures.Mask2D.draw_masked_quad_3d VisionEgg.Textures.Mask2D-class.html#draw_masked_quad_3d VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.Textures.Mask2D.constant_parameters_and_defaults VisionEgg.Textures.Mask2D-class.html#constant_parameters_and_defaults VisionEgg.ClassWithParameters.parameters_and_defaults VisionEgg.ClassWithParameters-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Textures.SpinningDrum VisionEgg.Textures.SpinningDrum-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Textures.SpinningDrum.__init__ VisionEgg.Textures.SpinningDrum-class.html#__init__ VisionEgg.Textures.TextureStimulusBaseClass._mipmap_modes VisionEgg.Textures.TextureStimulusBaseClass-class.html#_mipmap_modes VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Textures.SpinningDrum.draw VisionEgg.Textures.SpinningDrum-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.Textures.TextureStimulusBaseClass.constant_parameters_and_defaults VisionEgg.Textures.TextureStimulusBaseClass-class.html#constant_parameters_and_defaults VisionEgg.Textures.SpinningDrum.parameters_and_defaults VisionEgg.Textures.SpinningDrum-class.html#parameters_and_defaults VisionEgg.Textures.SpinningDrum.rebuild_display_list VisionEgg.Textures.SpinningDrum-class.html#rebuild_display_list VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Textures.TextureStimulusBaseClass._reload_texture VisionEgg.Textures.TextureStimulusBaseClass-class.html#_reload_texture VisionEgg.Textures.Texture VisionEgg.Textures.Texture-class.html VisionEgg.Textures.Texture.load VisionEgg.Textures.Texture-class.html#load VisionEgg.Textures.Texture.get_pixels_as_image VisionEgg.Textures.Texture-class.html#get_pixels_as_image VisionEgg.Textures.Texture.make_half_size VisionEgg.Textures.Texture-class.html#make_half_size VisionEgg.Textures.Texture.unload VisionEgg.Textures.Texture-class.html#unload VisionEgg.Textures.Texture.get_texture_object VisionEgg.Textures.Texture-class.html#get_texture_object VisionEgg.Textures.Texture.update VisionEgg.Textures.Texture-class.html#update VisionEgg.Textures.Texture.get_texels_as_image VisionEgg.Textures.Texture-class.html#get_texels_as_image VisionEgg.Textures.Texture.__init__ VisionEgg.Textures.Texture-class.html#__init__ VisionEgg.Textures.TextureFromFile VisionEgg.Textures.TextureFromFile-class.html VisionEgg.Textures.Texture.load VisionEgg.Textures.Texture-class.html#load VisionEgg.Textures.Texture.get_pixels_as_image VisionEgg.Textures.Texture-class.html#get_pixels_as_image VisionEgg.Textures.Texture.make_half_size VisionEgg.Textures.Texture-class.html#make_half_size VisionEgg.Textures.Texture.unload VisionEgg.Textures.Texture-class.html#unload VisionEgg.Textures.Texture.get_texture_object VisionEgg.Textures.Texture-class.html#get_texture_object VisionEgg.Textures.Texture.update VisionEgg.Textures.Texture-class.html#update VisionEgg.Textures.Texture.get_texels_as_image VisionEgg.Textures.Texture-class.html#get_texels_as_image VisionEgg.Textures.TextureFromFile.__init__ VisionEgg.Textures.TextureFromFile-class.html#__init__ VisionEgg.Textures.TextureObject VisionEgg.Textures.TextureObject-class.html VisionEgg.Textures.TextureObject.set_priority VisionEgg.Textures.TextureObject-class.html#set_priority VisionEgg.Textures.TextureObject.set_mag_filter VisionEgg.Textures.TextureObject-class.html#set_mag_filter VisionEgg.Textures.TextureObject.put_new_image_build_mipmaps VisionEgg.Textures.TextureObject-class.html#put_new_image_build_mipmaps VisionEgg.Textures.TextureObject.__init__ VisionEgg.Textures.TextureObject-class.html#__init__ VisionEgg.Textures.TextureObject.set_wrap_mode_s VisionEgg.Textures.TextureObject-class.html#set_wrap_mode_s VisionEgg.Textures.TextureObject.set_wrap_mode_r VisionEgg.Textures.TextureObject-class.html#set_wrap_mode_r VisionEgg.Textures.TextureObject.set_wrap_mode_t VisionEgg.Textures.TextureObject-class.html#set_wrap_mode_t VisionEgg.Textures.TextureObject.set_min_filter VisionEgg.Textures.TextureObject-class.html#set_min_filter VisionEgg.Textures.TextureObject.is_resident VisionEgg.Textures.TextureObject-class.html#is_resident VisionEgg.Textures.TextureObject.__del__ VisionEgg.Textures.TextureObject-class.html#__del__ VisionEgg.Textures.TextureObject.put_sub_image VisionEgg.Textures.TextureObject-class.html#put_sub_image VisionEgg.Textures.TextureObject.put_new_framebuffer VisionEgg.Textures.TextureObject-class.html#put_new_framebuffer VisionEgg.Textures.TextureObject.put_new_image VisionEgg.Textures.TextureObject-class.html#put_new_image VisionEgg.Textures.TextureObject.set_border_color VisionEgg.Textures.TextureObject-class.html#set_border_color VisionEgg.Textures.TextureObject._cube_map_side_names VisionEgg.Textures.TextureObject-class.html#_cube_map_side_names VisionEgg.Textures.TextureStimulus VisionEgg.Textures.TextureStimulus-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Textures.TextureStimulusBaseClass.__init__ VisionEgg.Textures.TextureStimulusBaseClass-class.html#__init__ VisionEgg.Textures.TextureStimulusBaseClass._mipmap_modes VisionEgg.Textures.TextureStimulusBaseClass-class.html#_mipmap_modes VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Textures.TextureStimulus.draw VisionEgg.Textures.TextureStimulus-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.Textures.TextureStimulusBaseClass.constant_parameters_and_defaults VisionEgg.Textures.TextureStimulusBaseClass-class.html#constant_parameters_and_defaults VisionEgg.Textures.TextureStimulus.parameters_and_defaults VisionEgg.Textures.TextureStimulus-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Textures.TextureStimulusBaseClass._reload_texture VisionEgg.Textures.TextureStimulusBaseClass-class.html#_reload_texture VisionEgg.Textures.TextureStimulus3D VisionEgg.Textures.TextureStimulus3D-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Textures.TextureStimulusBaseClass.__init__ VisionEgg.Textures.TextureStimulusBaseClass-class.html#__init__ VisionEgg.Textures.TextureStimulusBaseClass._mipmap_modes VisionEgg.Textures.TextureStimulusBaseClass-class.html#_mipmap_modes VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Textures.TextureStimulus3D.draw VisionEgg.Textures.TextureStimulus3D-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.Textures.TextureStimulusBaseClass.constant_parameters_and_defaults VisionEgg.Textures.TextureStimulusBaseClass-class.html#constant_parameters_and_defaults VisionEgg.Textures.TextureStimulus3D.parameters_and_defaults VisionEgg.Textures.TextureStimulus3D-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Textures.TextureStimulusBaseClass._reload_texture VisionEgg.Textures.TextureStimulusBaseClass-class.html#_reload_texture VisionEgg.Textures.TextureStimulusBaseClass VisionEgg.Textures.TextureStimulusBaseClass-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.Textures.TextureStimulusBaseClass.__init__ VisionEgg.Textures.TextureStimulusBaseClass-class.html#__init__ VisionEgg.Textures.TextureStimulusBaseClass._mipmap_modes VisionEgg.Textures.TextureStimulusBaseClass-class.html#_mipmap_modes VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.Core.Stimulus.draw VisionEgg.Core.Stimulus-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.Textures.TextureStimulusBaseClass.constant_parameters_and_defaults VisionEgg.Textures.TextureStimulusBaseClass-class.html#constant_parameters_and_defaults VisionEgg.Textures.TextureStimulusBaseClass.parameters_and_defaults VisionEgg.Textures.TextureStimulusBaseClass-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.Textures.TextureStimulusBaseClass._reload_texture VisionEgg.Textures.TextureStimulusBaseClass-class.html#_reload_texture VisionEgg.Textures.TextureTooLargeError VisionEgg.Textures.TextureTooLargeError-class.html VisionEgg.ThreeDeeMath.TransformMatrix VisionEgg.ThreeDeeMath.TransformMatrix-class.html VisionEgg.ThreeDeeMath.TransformMatrix.rotate VisionEgg.ThreeDeeMath.TransformMatrix-class.html#rotate VisionEgg.ThreeDeeMath.TransformMatrix.transform_vertices VisionEgg.ThreeDeeMath.TransformMatrix-class.html#transform_vertices VisionEgg.ThreeDeeMath.TransformMatrix.scale VisionEgg.ThreeDeeMath.TransformMatrix-class.html#scale VisionEgg.ThreeDeeMath.TransformMatrix.__make_normalized_vert3 VisionEgg.ThreeDeeMath.TransformMatrix-class.html#__make_normalized_vert3 VisionEgg.ThreeDeeMath.TransformMatrix.translate VisionEgg.ThreeDeeMath.TransformMatrix-class.html#translate VisionEgg.ThreeDeeMath.TransformMatrix.get_matrix VisionEgg.ThreeDeeMath.TransformMatrix-class.html#get_matrix VisionEgg.ThreeDeeMath.TransformMatrix.__init__ VisionEgg.ThreeDeeMath.TransformMatrix-class.html#__init__ VisionEgg.WrappedText.WrappedText VisionEgg.WrappedText.WrappedText-class.html VisionEgg.ClassWithParameters.set VisionEgg.ClassWithParameters-class.html#set VisionEgg.WrappedText.WrappedText.__init__ VisionEgg.WrappedText.WrappedText-class.html#__init__ VisionEgg.ClassWithParameters.verify_parameters VisionEgg.ClassWithParameters-class.html#verify_parameters VisionEgg.ClassWithParameters.is_constant_parameter VisionEgg.ClassWithParameters-class.html#is_constant_parameter VisionEgg.WrappedText.WrappedText._splitText VisionEgg.WrappedText.WrappedText-class.html#_splitText VisionEgg.ClassWithParameters.__getstate__ VisionEgg.ClassWithParameters-class.html#__getstate__ VisionEgg.ClassWithParameters.get_specified_type VisionEgg.ClassWithParameters-class.html#get_specified_type VisionEgg.WrappedText.WrappedText.draw VisionEgg.WrappedText.WrappedText-class.html#draw VisionEgg.ClassWithParameters.__setstate__ VisionEgg.ClassWithParameters-class.html#__setstate__ VisionEgg.WrappedText.WrappedText.constant_parameters_and_defaults VisionEgg.WrappedText.WrappedText-class.html#constant_parameters_and_defaults VisionEgg.WrappedText.WrappedText.parameters_and_defaults VisionEgg.WrappedText.WrappedText-class.html#parameters_and_defaults VisionEgg.ClassWithParameters.__safe_for_unpickling__ VisionEgg.ClassWithParameters-class.html#__safe_for_unpickling__ VisionEgg.qtlowlevel.QTNewMoviePropertyElement VisionEgg.qtlowlevel.QTNewMoviePropertyElement-class.html VisionEgg.qtlowlevel.QTNewMoviePropertyElement._fields_ VisionEgg.qtlowlevel.QTNewMoviePropertyElement-class.html#_fields_ VisionEgg.qtlowlevel.Rect VisionEgg.qtlowlevel.Rect-class.html VisionEgg.qtlowlevel.Rect._fields_ VisionEgg.qtlowlevel.Rect-class.html#_fields_ VisionEgg.qtlowlevel.qtlowlevelError VisionEgg.qtlowlevel.qtlowlevelError-class.html VisionEgg.qtmovie.Movie VisionEgg.qtmovie.Movie-class.html VisionEgg.qtmovie.Movie.GetMovieBox VisionEgg.qtmovie.Movie-class.html#GetMovieBox VisionEgg.qtmovie.Movie.StartMovie VisionEgg.qtmovie.Movie-class.html#StartMovie VisionEgg.qtmovie.Movie.SetMovieBox VisionEgg.qtmovie.Movie-class.html#SetMovieBox VisionEgg.qtmovie.Movie.GoToBeginningOfMovie VisionEgg.qtmovie.Movie-class.html#GoToBeginningOfMovie VisionEgg.qtmovie.Movie.MoviesTask VisionEgg.qtmovie.Movie-class.html#MoviesTask VisionEgg.qtmovie.Movie.__init__ VisionEgg.qtmovie.Movie-class.html#__init__ VisionEgg.qtmovie.Movie.IsMovieDone VisionEgg.qtmovie.Movie-class.html#IsMovieDone VisionEgg.qtmovie.Rect VisionEgg.qtmovie.Rect-class.html VisionEgg.qtmovie.Rect.__init__ VisionEgg.qtmovie.Rect-class.html#__init__ float float-class.html float.__int__ float-class.html#__int__ float.__rtruediv__ float-class.html#__rtruediv__ float.__str__ float-class.html#__str__ float.__getattribute__ float-class.html#__getattribute__ float.__radd__ float-class.html#__radd__ float.__getformat__ float-class.html#__getformat__ float.__truediv__ float-class.html#__truediv__ float.__rsub__ float-class.html#__rsub__ float.__rdiv__ float-class.html#__rdiv__ float.__rmul__ float-class.html#__rmul__ float.__lt__ float-class.html#__lt__ float.__getnewargs__ float-class.html#__getnewargs__ float.__rmod__ float-class.html#__rmod__ float.__float__ float-class.html#__float__ float.__rpow__ float-class.html#__rpow__ float.__new__ float-class.html#__new__ float.__abs__ float-class.html#__abs__ float.__pos__ float-class.html#__pos__ float.__sub__ float-class.html#__sub__ float.__rfloordiv__ float-class.html#__rfloordiv__ float.__neg__ float-class.html#__neg__ float.__ne__ float-class.html#__ne__ float.__rdivmod__ float-class.html#__rdivmod__ float.__coerce__ float-class.html#__coerce__ float.__divmod__ float-class.html#__divmod__ float.__add__ float-class.html#__add__ float.__gt__ float-class.html#__gt__ float.__eq__ float-class.html#__eq__ float.__repr__ float-class.html#__repr__ float.__nonzero__ float-class.html#__nonzero__ float.__mod__ float-class.html#__mod__ float.__div__ float-class.html#__div__ float.__le__ float-class.html#__le__ float.__mul__ float-class.html#__mul__ float.__floordiv__ float-class.html#__floordiv__ float.__hash__ float-class.html#__hash__ float.__setformat__ float-class.html#__setformat__ float.__long__ float-class.html#__long__ float.__ge__ float-class.html#__ge__ float.__pow__ float-class.html#__pow__ int int-class.html int.__int__ int-class.html#__int__ int.__ror__ int-class.html#__ror__ int.__rtruediv__ int-class.html#__rtruediv__ int.__add__ int-class.html#__add__ int.__str__ int-class.html#__str__ int.__getattribute__ int-class.html#__getattribute__ int.__radd__ int-class.html#__radd__ int.__and__ int-class.html#__and__ int.__truediv__ int-class.html#__truediv__ int.__rrshift__ int-class.html#__rrshift__ int.__rsub__ int-class.html#__rsub__ int.__rdiv__ int-class.html#__rdiv__ int.__rmul__ int-class.html#__rmul__ int.__rmod__ int-class.html#__rmod__ int.__getnewargs__ int-class.html#__getnewargs__ int.__float__ int-class.html#__float__ int.__rpow__ int-class.html#__rpow__ int.__rand__ int-class.html#__rand__ int.__divmod__ int-class.html#__divmod__ int.__new__ int-class.html#__new__ int.__pos__ int-class.html#__pos__ int.__cmp__ int-class.html#__cmp__ int.__abs__ int-class.html#__abs__ int.__rfloordiv__ int-class.html#__rfloordiv__ int.__mul__ int-class.html#__mul__ int.__rshift__ int-class.html#__rshift__ int.__rdivmod__ int-class.html#__rdivmod__ int.__invert__ int-class.html#__invert__ int.__coerce__ int-class.html#__coerce__ int.__pow__ int-class.html#__pow__ int.__rlshift__ int-class.html#__rlshift__ int.__lshift__ int-class.html#__lshift__ int.__sub__ int-class.html#__sub__ int.__hex__ int-class.html#__hex__ int.__oct__ int-class.html#__oct__ int.__rxor__ int-class.html#__rxor__ int.__nonzero__ int-class.html#__nonzero__ int.__mod__ int-class.html#__mod__ int.__neg__ int-class.html#__neg__ int.__xor__ int-class.html#__xor__ int.__div__ int-class.html#__div__ int.__repr__ int-class.html#__repr__ int.__floordiv__ int-class.html#__floordiv__ int.__hash__ int-class.html#__hash__ int.__index__ int-class.html#__index__ int.__long__ int-class.html#__long__ int.__or__ int-class.html#__or__ visionegg-1.2.1/doc/reference/html/class-tree.html0000644000076500000240000003051711224565531021302 0ustar astrawstaff Class Hierarchy
 
[frames] | no frames]
[ Module Hierarchy | Class Hierarchy ]

Class Hierarchy

visionegg-1.2.1/doc/reference/html/crarr.png0000644000076500000240000000052411224565531020164 0ustar astrawstaff‰PNG  IHDR e˘E,tEXtCreation TimeTue 22 Aug 2006 00:43:10 -0500` XtIMEÖ)Ó}Ö pHYsÂÂnu>gAMAħ üaEPLTE˙˙˙Ͱ×ÏÀ€f4sW áۊrD`@bCÜĠÈéäܖX{`,ݟ€lN‡o@ġóŞ™xdEí螊dĈ´”~TÖwĊvtRNS@ĉĜfMIDATxÚc`@ĵìĵ0&+š—Šˆ°ğ(’ˆ€ ;; /EXùĜ‘? n ƒކ— b;'Ş+˜˜Y#œ(r<£"IENDB`‚visionegg-1.2.1/doc/reference/html/epydoc.css0000644000076500000240000003643011224565531020347 0ustar astrawstaff /* Epydoc CSS Stylesheet * * This stylesheet can be used to customize the appearance of epydoc's * HTML output. * */ /* Default Colors & Styles * - Set the default foreground & background color with 'body'; and * link colors with 'a:link' and 'a:visited'. * - Use bold for decision list terms. * - The heading styles defined here are used for headings *within* * docstring descriptions. All headings used by epydoc itself use * either class='epydoc' or class='toc' (CSS styles for both * defined below). */ body { background: #ffffff; color: #000000; } a:link { color: #0000ff; } a:visited { color: #204080; } dt { font-weight: bold; } h1 { font-size: +140%; font-style: italic; font-weight: bold; } h2 { font-size: +125%; font-style: italic; font-weight: bold; } h3 { font-size: +110%; font-style: italic; font-weight: normal; } code { font-size: 100%; } /* Page Header & Footer * - The standard page header consists of a navigation bar (with * pointers to standard pages such as 'home' and 'trees'); a * breadcrumbs list, which can be used to navigate to containing * classes or modules; options links, to show/hide private * variables and to show/hide frames; and a page title (using *

). The page title may be followed by a link to the * corresponding source code (using 'span.codelink'). * - The footer consists of a navigation bar, a timestamp, and a * pointer to epydoc's homepage. */ h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } h2.epydoc { font-size: +130%; font-weight: bold; } h3.epydoc { font-size: +115%; font-weight: bold; } td h3.epydoc { font-size: +115%; font-weight: bold; margin-bottom: 0; } table.navbar { background: #a0c0ff; color: #000000; border: 2px groove #c0d0d0; } table.navbar table { color: #000000; } th.navbar-select { background: #70b0ff; color: #000000; } table.navbar a { text-decoration: none; } table.navbar a:link { color: #0000ff; } table.navbar a:visited { color: #204080; } span.breadcrumbs { font-size: 85%; font-weight: bold; } span.options { font-size: 70%; } span.codelink { font-size: 85%; } td.footer { font-size: 85%; } /* Table Headers * - Each summary table and details section begins with a 'header' * row. This row contains a section title (marked by * 'span.table-header') as well as a show/hide private link * (marked by 'span.options', defined above). * - Summary tables that contain user-defined groups mark those * groups using 'group header' rows. */ td.table-header { background: #70b0ff; color: #000000; border: 1px solid #608090; } td.table-header table { color: #000000; } td.table-header table a:link { color: #0000ff; } td.table-header table a:visited { color: #204080; } span.table-header { font-size: 120%; font-weight: bold; } th.group-header { background: #c0e0f8; color: #000000; text-align: left; font-style: italic; font-size: 115%; border: 1px solid #608090; } /* Summary Tables (functions, variables, etc) * - Each object is described by a single row of the table with * two cells. The left cell gives the object's type, and is * marked with 'code.summary-type'. The right cell gives the * object's name and a summary description. * - CSS styles for the table's header and group headers are * defined above, under 'Table Headers' */ table.summary { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin-bottom: 0.5em; } td.summary { border: 1px solid #608090; } code.summary-type { font-size: 85%; } table.summary a:link { color: #0000ff; } table.summary a:visited { color: #204080; } /* Details Tables (functions, variables, etc) * - Each object is described in its own div. * - A single-row summary table w/ table-header is used as * a header for each details section (CSS style for table-header * is defined above, under 'Table Headers'). */ table.details { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } table.details table { color: #000000; } table.details a:link { color: #0000ff; } table.details a:visited { color: #204080; } /* Fields */ dl.fields { margin-left: 2em; margin-top: 1em; margin-bottom: 1em; } dl.fields dd ul { margin-left: 0em; padding-left: 0em; } div.fields { margin-left: 2em; } div.fields p { margin-bottom: 0.5em; } /* Index tables (identifier index, term index, etc) * - link-index is used for indices containing lists of links * (namely, the identifier index & term index). * - index-where is used in link indices for the text indicating * the container/source for each link. * - metadata-index is used for indices containing metadata * extracted from fields (namely, the bug index & todo index). */ table.link-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; } td.link-index { border-width: 0px; } table.link-index a:link { color: #0000ff; } table.link-index a:visited { color: #204080; } span.index-where { font-size: 70%; } table.metadata-index { border-collapse: collapse; background: #e8f0f8; color: #000000; border: 1px solid #608090; margin: .2em 0 0 0; } td.metadata-index { border-width: 1px; border-style: solid; } table.metadata-index a:link { color: #0000ff; } table.metadata-index a:visited { color: #204080; } /* Function signatures * - sig* is used for the signature in the details section. * - .summary-sig* is used for the signature in the summary * table, and when listing property accessor functions. * */ .sig-name { color: #006080; } .sig-arg { color: #008060; } .sig-default { color: #602000; } .summary-sig { font-family: monospace; } .summary-sig-name { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:link { color: #006080; font-weight: bold; } table.summary a.summary-sig-name:visited { color: #006080; font-weight: bold; } .summary-sig-arg { color: #006040; } .summary-sig-default { color: #501800; } /* To render variables, classes etc. like functions */ table.summary .summary-name { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:link { color: #006080; font-weight: bold; font-family: monospace; } table.summary a.summary-name:visited { color: #006080; font-weight: bold; font-family: monospace; } /* Variable values * - In the 'variable details' sections, each varaible's value is * listed in a 'pre.variable' box. The width of this box is * restricted to 80 chars; if the value's repr is longer than * this it will be wrapped, using a backslash marked with * class 'variable-linewrap'. If the value's repr is longer * than 3 lines, the rest will be ellided; and an ellipsis * marker ('...' marked with 'variable-ellipsis') will be used. * - If the value is a string, its quote marks will be marked * with 'variable-quote'. * - If the variable is a regexp, it is syntax-highlighted using * the re* CSS classes. */ pre.variable { padding: .5em; margin: 0; background: #dce4ec; color: #000000; border: 1px solid #708890; } .variable-linewrap { color: #604000; font-weight: bold; } .variable-ellipsis { color: #604000; font-weight: bold; } .variable-quote { color: #604000; font-weight: bold; } .variable-group { color: #008000; font-weight: bold; } .variable-op { color: #604000; font-weight: bold; } .variable-string { color: #006030; } .variable-unknown { color: #a00000; font-weight: bold; } .re { color: #000000; } .re-char { color: #006030; } .re-op { color: #600000; } .re-group { color: #003060; } .re-ref { color: #404040; } /* Base tree * - Used by class pages to display the base class hierarchy. */ pre.base-tree { font-size: 80%; margin: 0; } /* Frames-based table of contents headers * - Consists of two frames: one for selecting modules; and * the other listing the contents of the selected module. * - h1.toc is used for each frame's heading * - h2.toc is used for subheadings within each frame. */ h1.toc { text-align: center; font-size: 105%; margin: 0; font-weight: bold; padding: 0; } h2.toc { font-size: 100%; font-weight: bold; margin: 0.5em 0 0 -0.3em; } /* Syntax Highlighting for Source Code * - doctest examples are displayed in a 'pre.py-doctest' block. * If the example is in a details table entry, then it will use * the colors specified by the 'table pre.py-doctest' line. * - Source code listings are displayed in a 'pre.py-src' block. * Each line is marked with 'span.py-line' (used to draw a line * down the left margin, separating the code from the line * numbers). Line numbers are displayed with 'span.py-lineno'. * The expand/collapse block toggle button is displayed with * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not * modify the font size of the text.) * - If a source code page is opened with an anchor, then the * corresponding code block will be highlighted. The code * block's header is highlighted with 'py-highlight-hdr'; and * the code block's body is highlighted with 'py-highlight'. * - The remaining py-* classes are used to perform syntax * highlighting (py-string for string literals, py-name for names, * etc.) */ pre.py-doctest { padding: .5em; margin: 1em; background: #e8f0f8; color: #000000; border: 1px solid #708890; } table pre.py-doctest { background: #dce4ec; color: #000000; } pre.py-src { border: 2px solid #000000; background: #f0f0f0; color: #000000; } .py-line { border-left: 2px solid #000000; margin-left: .2em; padding-left: .4em; } .py-lineno { font-style: italic; font-size: 90%; padding-left: .5em; } a.py-toggle { text-decoration: none; } div.py-highlight-hdr { border-top: 2px solid #000000; border-bottom: 2px solid #000000; background: #d8e8e8; } div.py-highlight { border-bottom: 2px solid #000000; background: #d0e0e0; } .py-prompt { color: #005050; font-weight: bold;} .py-more { color: #005050; font-weight: bold;} .py-string { color: #006030; } .py-comment { color: #003060; } .py-keyword { color: #600000; } .py-output { color: #404040; } .py-name { color: #000050; } .py-name:link { color: #000050 !important; } .py-name:visited { color: #000050 !important; } .py-number { color: #005000; } .py-defname { color: #000060; font-weight: bold; } .py-def-name { color: #000060; font-weight: bold; } .py-base-class { color: #000060; } .py-param { color: #000060; } .py-docstring { color: #006030; } .py-decorator { color: #804020; } /* Use this if you don't want links to names underlined: */ /*a.py-name { text-decoration: none; }*/ /* Graphs & Diagrams * - These CSS styles are used for graphs & diagrams generated using * Graphviz dot. 'img.graph-without-title' is used for bare * diagrams (to remove the border created by making the image * clickable). */ img.graph-without-title { border: none; } img.graph-with-title { border: 1px solid #000000; } span.graph-title { font-weight: bold; } span.graph-caption { } /* General-purpose classes * - 'p.indent-wrapped-lines' defines a paragraph whose first line * is not indented, but whose subsequent lines are. * - The 'nomargin-top' class is used to remove the top margin (e.g. * from lists). The 'nomargin' class is used to remove both the * top and bottom margin (but not the left or right margin -- * for lists, that would cause the bullets to disappear.) */ p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; margin: 0; } .nomargin-top { margin-top: 0; } .nomargin { margin-top: 0; margin-bottom: 0; } /* HTML Log */ div.log-block { padding: 0; margin: .5em 0 .5em 0; background: #e8f0f8; color: #000000; border: 1px solid #000000; } div.log-error { padding: .1em .3em .1em .3em; margin: 4px; background: #ffb0b0; color: #000000; border: 1px solid #000000; } div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; background: #ffffb0; color: #000000; border: 1px solid #000000; } div.log-info { padding: .1em .3em .1em .3em; margin: 4px; background: #b0ffb0; color: #000000; border: 1px solid #000000; } h2.log-hdr { background: #70b0ff; color: #000000; margin: 0; padding: 0em 0.5em 0em 0.5em; border-bottom: 1px solid #000000; font-size: 110%; } p.log { font-weight: bold; margin: .5em 0 .5em 0; } tr.opt-changed { color: #000000; font-weight: bold; } tr.opt-default { color: #606060; } pre.log { margin: 0; padding: 0; padding-left: 1em; } visionegg-1.2.1/doc/reference/html/epydoc.js0000644000076500000240000002360211224565531020170 0ustar astrawstafffunction toggle_private() { // Search for any private/public links on this page. Store // their old text in "cmd," so we will know what action to // take; and change their text to the opposite action. var cmd = "?"; var elts = document.getElementsByTagName("a"); for(var i=0; i...
"; elt.innerHTML = s; } } function toggle(id) { elt = document.getElementById(id+"-toggle"); if (elt.innerHTML == "-") collapse(id); else expand(id); return false; } function highlight(id) { var elt = document.getElementById(id+"-def"); if (elt) elt.className = "py-highlight-hdr"; var elt = document.getElementById(id+"-expanded"); if (elt) elt.className = "py-highlight"; var elt = document.getElementById(id+"-collapsed"); if (elt) elt.className = "py-highlight"; } function num_lines(s) { var n = 1; var pos = s.indexOf("\n"); while ( pos > 0) { n += 1; pos = s.indexOf("\n", pos+1); } return n; } // Collapse all blocks that mave more than `min_lines` lines. function collapse_all(min_lines) { var elts = document.getElementsByTagName("div"); for (var i=0; i 0) if (elt.id.substring(split, elt.id.length) == "-expanded") if (num_lines(elt.innerHTML) > min_lines) collapse(elt.id.substring(0, split)); } } function expandto(href) { var start = href.indexOf("#")+1; if (start != 0 && start != href.length) { if (href.substring(start, href.length) != "-") { collapse_all(4); pos = href.indexOf(".", start); while (pos != -1) { var id = href.substring(start, pos); expand(id); pos = href.indexOf(".", pos+1); } var id = href.substring(start, href.length); expand(id); highlight(id); } } } function kill_doclink(id) { var parent = document.getElementById(id); parent.removeChild(parent.childNodes.item(0)); } function auto_kill_doclink(ev) { if (!ev) var ev = window.event; if (!this.contains(ev.toElement)) { var parent = document.getElementById(this.parentID); parent.removeChild(parent.childNodes.item(0)); } } function doclink(id, name, targets_id) { var elt = document.getElementById(id); // If we already opened the box, then destroy it. // (This case should never occur, but leave it in just in case.) if (elt.childNodes.length > 1) { elt.removeChild(elt.childNodes.item(0)); } else { // The outer box: relative + inline positioning. var box1 = document.createElement("div"); box1.style.position = "relative"; box1.style.display = "inline"; box1.style.top = 0; box1.style.left = 0; // A shadow for fun var shadow = document.createElement("div"); shadow.style.position = "absolute"; shadow.style.left = "-1.3em"; shadow.style.top = "-1.3em"; shadow.style.background = "#404040"; // The inner box: absolute positioning. var box2 = document.createElement("div"); box2.style.position = "relative"; box2.style.border = "1px solid #a0a0a0"; box2.style.left = "-.2em"; box2.style.top = "-.2em"; box2.style.background = "white"; box2.style.padding = ".3em .4em .3em .4em"; box2.style.fontStyle = "normal"; box2.onmouseout=auto_kill_doclink; box2.parentID = id; // Get the targets var targets_elt = document.getElementById(targets_id); var targets = targets_elt.getAttribute("targets"); var links = ""; target_list = targets.split(","); for (var i=0; i" + target[0] + ""; } // Put it all together. elt.insertBefore(box1, elt.childNodes.item(0)); //box1.appendChild(box2); box1.appendChild(shadow); shadow.appendChild(box2); box2.innerHTML = "Which "+name+" do you want to see documentation for?" + ""; } return false; } function get_anchor() { var href = location.href; var start = href.indexOf("#")+1; if ((start != 0) && (start != href.length)) return href.substring(start, href.length); } function redirect_url(dottedName) { // Scan through each element of the "pages" list, and check // if "name" matches with any of them. for (var i=0; i-m" or "-c"; // extract the portion & compare it to dottedName. var pagename = pages[i].substring(0, pages[i].length-2); if (pagename == dottedName.substring(0,pagename.length)) { // We've found a page that matches `dottedName`; // construct its URL, using leftover `dottedName` // content to form an anchor. var pagetype = pages[i].charAt(pages[i].length-1); var url = pagename + ((pagetype=="m")?"-module.html": "-class.html"); if (dottedName.length > pagename.length) url += "#" + dottedName.substring(pagename.length+1, dottedName.length); return url; } } } visionegg-1.2.1/doc/reference/html/float-class.html0000644000076500000240000010405511224565531021447 0ustar astrawstaff float
float :: Class float
[frames] | no frames]

Class float



object --+
         |
        float

float(x) -> floating point number

Convert a string or number to a floating point number, if possible.



Instance Methods
 
__abs__(x)
abs(x)
 
__add__(x, y)
x+y
 
__coerce__(x, y)
coerce(x, y)
 
__div__(x, y)
x/y
 
__divmod__(x, y)
divmod(x, y)
 
__eq__(x, y)
x==y
 
__float__(x)
float(x)
 
__floordiv__(x, y)
x//y
 
__ge__(x, y)
x>=y
 
__getattribute__(...)
x.__getattribute__('name') <==> x.name
 
__getformat__(float, typestr)
You probably don't want to use this function.
 
__getnewargs__(...)
 
__gt__(x, y)
x>y
 
__hash__(x)
hash(x)
 
__int__(x)
int(x)
 
__le__(x, y)
x<=y
 
__long__(x)
long(x)
 
__lt__(x, y)
x<y
 
__mod__(x, y)
x%y
 
__mul__(x, y)
x*y
 
__ne__(x, y)
x!=y
 
__neg__(x)
-x
 
__new__(T, S, ...)
 
__nonzero__(x)
x != 0
 
__pos__(x)
+x
 
__pow__(x, y, z=...)
pow(x, y[, z])
 
__radd__(x, y)
y+x
 
__rdiv__(x, y)
y/x
 
__rdivmod__(x, y)
divmod(y, x)
 
__repr__(x)
repr(x)
 
__rfloordiv__(x, y)
y//x
 
__rmod__(x, y)
y%x
 
__rmul__(x, y)
y*x
 
__rpow__(y, x, z=...)
pow(x, y[, z])
 
__rsub__(x, y)
y-x
 
__rtruediv__(x, y)
y/x
 
__setformat__(float, typestr, fmt)
You probably don't want to use this function.
 
__str__(x)
str(x)
 
__sub__(x, y)
x-y
 
__truediv__(x, y)
x/y

Inherited from object: __delattr__, __init__, __reduce__, __reduce_ex__, __setattr__

Properties

Inherited from object: __class__

Method Details

__getattribute__(...)

 
x.__getattribute__('name') <==> x.name

Overrides: object.__getattribute__

__getformat__(float, typestr)

 
You probably don't want to use this function.  It exists mainly to be
used in Python's test suite.

typestr must be 'double' or 'float'.  This function returns whichever of
'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the
format of floating point numbers used by the C type named by typestr.

Returns:
string

__hash__(x)
(Hashing function)

 
hash(x)

Overrides: object.__hash__

__new__(T, S, ...)

 


Returns:
a new object with type S, a subtype of T

Overrides: object.__new__

__repr__(x)
(Representation operator)

 
repr(x)

Overrides: object.__repr__

__setformat__(float, typestr, fmt)

 
You probably don't want to use this function.  It exists mainly to be
used in Python's test suite.

typestr must be 'double' or 'float'.  fmt must be one of 'unknown',
'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be
one of the latter two if it appears to match the underlying C reality.

Overrides the automatic determination of C-level floating point type.
This affects how floats are converted to and from binary strings.

Returns:
None

__str__(x)
(Informal representation operator)

 
str(x)

Overrides: object.__str__

visionegg-1.2.1/doc/reference/html/frames.html0000644000076500000240000000111011224565531020500 0ustar astrawstaff Vision Egg visionegg-1.2.1/doc/reference/html/help.html0000644000076500000240000002546111224565531020172 0ustar astrawstaff Help
 
[frames] | no frames]

API Documentation

This document contains the API (Application Programming Interface) documentation for Vision Egg. Documentation for the Python objects defined by the project is divided into separate pages for each package, module, and class. The API documentation also includes two pages containing information about the project as a whole: a trees page, and an index page.

Object Documentation

Each Package Documentation page contains:

  • A description of the package.
  • A list of the modules and sub-packages contained by the package.
  • A summary of the classes defined by the package.
  • A summary of the functions defined by the package.
  • A summary of the variables defined by the package.
  • A detailed description of each function defined by the package.
  • A detailed description of each variable defined by the package.

Each Module Documentation page contains:

  • A description of the module.
  • A summary of the classes defined by the module.
  • A summary of the functions defined by the module.
  • A summary of the variables defined by the module.
  • A detailed description of each function defined by the module.
  • A detailed description of each variable defined by the module.

Each Class Documentation page contains:

  • A class inheritance diagram.
  • A list of known subclasses.
  • A description of the class.
  • A summary of the methods defined by the class.
  • A summary of the instance variables defined by the class.
  • A summary of the class (static) variables defined by the class.
  • A detailed description of each method defined by the class.
  • A detailed description of each instance variable defined by the class.
  • A detailed description of each class (static) variable defined by the class.

Project Documentation

The Trees page contains the module and class hierarchies:

  • The module hierarchy lists every package and module, with modules grouped into packages. At the top level, and within each package, modules and sub-packages are listed alphabetically.
  • The class hierarchy lists every class, grouped by base class. If a class has more than one base class, then it will be listed under each base class. At the top level, and under each base class, classes are listed alphabetically.

The Index page contains indices of terms and identifiers:

  • The term index lists every term indexed by any object's documentation. For each term, the index provides links to each place where the term is indexed.
  • The identifier index lists the (short) name of every package, module, class, method, function, variable, and parameter. For each identifier, the index provides a short description, and a link to its documentation.

The Table of Contents

The table of contents occupies the two frames on the left side of the window. The upper-left frame displays the project contents, and the lower-left frame displays the module contents:

Project
Contents
...
API
Documentation
Frame


Module
Contents
 
...
 

The project contents frame contains a list of all packages and modules that are defined by the project. Clicking on an entry will display its contents in the module contents frame. Clicking on a special entry, labeled "Everything," will display the contents of the entire project.

The module contents frame contains a list of every submodule, class, type, exception, function, and variable defined by a module or package. Clicking on an entry will display its documentation in the API documentation frame. Clicking on the name of the module, at the top of the frame, will display the documentation for the module itself.

The "frames" and "no frames" buttons below the top navigation bar can be used to control whether the table of contents is displayed or not.

The Navigation Bar

A navigation bar is located at the top and bottom of every page. It indicates what type of page you are currently viewing, and allows you to go to related pages. The following table describes the labels on the navigation bar. Note that not some labels (such as [Parent]) are not displayed on all pages.

Label Highlighted when... Links to...
[Parent] (never highlighted) the parent of the current package
[Package] viewing a package the package containing the current object
[Module] viewing a module the module containing the current object
[Class] viewing a class the class containing the current object
[Trees] viewing the trees page the trees page
[Index] viewing the index page the index page
[Help] viewing the help page the help page

The "show private" and "hide private" buttons below the top navigation bar can be used to control whether documentation for private objects is displayed. Private objects are usually defined as objects whose (short) names begin with a single underscore, but do not end with an underscore. For example, "_x", "__pprint", and "epydoc.epytext._tokenize" are private objects; but "re.sub", "__init__", and "type_" are not. However, if a module defines the "__all__" variable, then its contents are used to decide which objects are private.

A timestamp below the bottom navigation bar indicates when each page was last updated.

visionegg-1.2.1/doc/reference/html/identifier-index.html0000644000076500000240000117545411224565531022502 0ustar astrawstaff Identifier Index
 
[frames] | no frames]

Identifier Index

[ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ ]

A

B

C

D

E

F

G

H

I

K

L

M

N

O

P

Q

R

S

T

U

V

W

_



visionegg-1.2.1/doc/reference/html/index.html0000644000076500000240000000111011224565531020332 0ustar astrawstaff Vision Egg visionegg-1.2.1/doc/reference/html/int-class.html0000644000076500000240000011013711224565531021132 0ustar astrawstaff int
int :: Class int
[frames] | no frames]

Class int



object --+
         |
        int
Known Subclasses:
bool

int(x[, base]) -> integer

Convert a string or number to an integer, if possible.  A floating point
argument will be truncated towards zero (this does not include a string
representation of a floating point number!)  When converting a string, use
the optional base.  It is an error to supply a base when converting a
non-string. If the argument is outside the integer range a long object
will be returned instead.



Instance Methods
 
__abs__(x)
abs(x)
 
__add__(x, y)
x+y
 
__and__(x, y)
x&y
 
__cmp__(x, y)
cmp(x,y)
 
__coerce__(x, y)
coerce(x, y)
 
__div__(x, y)
x/y
 
__divmod__(x, y)
divmod(x, y)
 
__float__(x)
float(x)
 
__floordiv__(x, y)
x//y
 
__getattribute__(...)
x.__getattribute__('name') <==> x.name
 
__getnewargs__(...)
 
__hash__(x)
hash(x)
 
__hex__(x)
hex(x)
 
__index__(...)
x[y:z] <==> x[y.__index__():z.__index__()]
 
__int__(x)
int(x)
 
__invert__(x)
~x
 
__long__(x)
long(x)
 
__lshift__(x, y)
x<<y
 
__mod__(x, y)
x%y
 
__mul__(x, y)
x*y
 
__neg__(x)
-x
 
__new__(T, S, ...)
 
__nonzero__(x)
x != 0
 
__oct__(x)
oct(x)
 
__or__(x, y)
x|y
 
__pos__(x)
+x
 
__pow__(x, y, z=...)
pow(x, y[, z])
 
__radd__(x, y)
y+x
 
__rand__(x, y)
y&x
 
__rdiv__(x, y)
y/x
 
__rdivmod__(x, y)
divmod(y, x)
 
__repr__(x)
repr(x)
 
__rfloordiv__(x, y)
y//x
 
__rlshift__(x, y)
y<<x
 
__rmod__(x, y)
y%x
 
__rmul__(x, y)
y*x
 
__ror__(x, y)
y|x
 
__rpow__(y, x, z=...)
pow(x, y[, z])
 
__rrshift__(x, y)
y>>x
 
__rshift__(x, y)
x>>y
 
__rsub__(x, y)
y-x
 
__rtruediv__(x, y)
y/x
 
__rxor__(x, y)
y^x
 
__str__(x)
str(x)
 
__sub__(x, y)
x-y
 
__truediv__(x, y)
x/y
 
__xor__(x, y)
x^y

Inherited from object: __delattr__, __init__, __reduce__, __reduce_ex__, __setattr__

Properties

Inherited from object: __class__

Method Details

__getattribute__(...)

 
x.__getattribute__('name') <==> x.name

Overrides: object.__getattribute__

__hash__(x)
(Hashing function)

 
hash(x)

Overrides: object.__hash__

__new__(T, S, ...)

 


Returns:
a new object with type S, a subtype of T

Overrides: object.__new__

__repr__(x)
(Representation operator)

 
repr(x)

Overrides: object.__repr__

__str__(x)
(Informal representation operator)

 
str(x)

Overrides: object.__str__

visionegg-1.2.1/doc/reference/html/module-tree.html0000644000076500000240000003346411224565531021466 0ustar astrawstaff Module Hierarchy
 
[frames] | no frames]
[ Module Hierarchy | Class Hierarchy ]

Module Hierarchy

visionegg-1.2.1/doc/reference/html/redirect.html0000644000076500000240000002372111224565531021040 0ustar astrawstaffEpydoc Redirect Page

Epydoc Auto-redirect page

When javascript is enabled, this page will redirect URLs of the form redirect.html#dotted.name to the documentation for the object with the given fully-qualified dotted name.

 

visionegg-1.2.1/doc/reference/html/toc-everything.html0000644000076500000240000020415311224565531022206 0ustar astrawstaff Everything

Everything


All Classes

VisionEgg.ClassWithParameters
VisionEgg.Configuration.Config
VisionEgg.Core.FixationSpot
VisionEgg.Core.FrameTimer
VisionEgg.Core.ModelView
VisionEgg.Core.OrthographicProjection
VisionEgg.Core.OrthographicProjectionNoZClip
VisionEgg.Core.PerspectiveProjection
VisionEgg.Core.Projection
VisionEgg.Core.ProjectionBaseClass
VisionEgg.Core.Screen
VisionEgg.Core.SimplePerspectiveProjection
VisionEgg.Core.Stimulus
VisionEgg.Core.Viewport
VisionEgg.Daq.Analog
VisionEgg.Daq.Buffered
VisionEgg.Daq.Channel
VisionEgg.Daq.ChannelParameters
VisionEgg.Daq.DaqMode
VisionEgg.Daq.Device
VisionEgg.Daq.Digital
VisionEgg.Daq.Functionality
VisionEgg.Daq.Immediate
VisionEgg.Daq.Input
VisionEgg.Daq.Output
VisionEgg.Daq.SignalType
VisionEgg.Daq.Trigger
VisionEgg.DaqKeyboard.KeyboardInput
VisionEgg.DaqKeyboard.KeyboardTriggerInController
VisionEgg.DaqLPT.LPTChannel
VisionEgg.DaqLPT.LPTDevice
VisionEgg.DaqLPT.LPTInput
VisionEgg.DaqLPT.LPTOutput
VisionEgg.DaqLPT.LPTTriggerInController
VisionEgg.DaqLPT.LPTTriggerOutController
VisionEgg.Deprecated.Message
VisionEgg.Dots.DotArea2D
VisionEgg.FlowControl.ConstantController
VisionEgg.FlowControl.Controller
VisionEgg.FlowControl.EncapsulatedController
VisionEgg.FlowControl.EvalStringController
VisionEgg.FlowControl.ExecStringController
VisionEgg.FlowControl.FunctionController
VisionEgg.FlowControl.Presentation
VisionEgg.GLTrace.Wrapper
VisionEgg.GUI.AppWindow
VisionEgg.GUI.GetKeypressDialog
VisionEgg.GUI.GraphicsConfigurationWindow
VisionEgg.GUI.InfoFrame
VisionEgg.GUI.ProgressBar
VisionEgg.GUI.ToplevelDialog
VisionEgg.Gratings.AlphaGratingCommon
VisionEgg.Gratings.LuminanceGratingCommon
VisionEgg.Gratings.NumSamplesTooLargeError
VisionEgg.Gratings.SinGrating2D
VisionEgg.Gratings.SinGrating3D
VisionEgg.MoreStimuli.Arrow
VisionEgg.MoreStimuli.FilledCircle
VisionEgg.MoreStimuli.Rectangle3D
VisionEgg.MoreStimuli.Target2D
VisionEgg.ParameterDefinition
VisionEgg.ParameterTypes.AnyClass
VisionEgg.ParameterTypes.AnyClassMC
VisionEgg.ParameterTypes.AnyOf
VisionEgg.ParameterTypes.Boolean
VisionEgg.ParameterTypes.BooleanMC
VisionEgg.ParameterTypes.Callable
VisionEgg.ParameterTypes.CallableMC
VisionEgg.ParameterTypes.Instance
VisionEgg.ParameterTypes.Integer
VisionEgg.ParameterTypes.IntegerMC
VisionEgg.ParameterTypes.NoneMC
VisionEgg.ParameterTypes.NoneType
VisionEgg.ParameterTypes.ParameterTypeDef
VisionEgg.ParameterTypes.Real
VisionEgg.ParameterTypes.RealMC
VisionEgg.ParameterTypes.Sequence
VisionEgg.ParameterTypes.Sequence2
VisionEgg.ParameterTypes.Sequence3
VisionEgg.ParameterTypes.Sequence4
VisionEgg.ParameterTypes.Sequence4x4
VisionEgg.ParameterTypes.String
VisionEgg.ParameterTypes.StringMC
VisionEgg.ParameterTypes.SubClass
VisionEgg.ParameterTypes.Unicode
VisionEgg.ParameterTypes.UnicodeMC
VisionEgg.ParameterTypes.UnsignedInteger
VisionEgg.ParameterTypes.UnsignedIntegerMC
VisionEgg.Parameters
VisionEgg.PyroApps.AST_ext.AST_Visitor
VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame
VisionEgg.PyroApps.ColorCalGUI.ColorCalMetaParameters
VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController
VisionEgg.PyroApps.DropinGUI.DropinControlFrame
VisionEgg.PyroApps.DropinGUI.DropinMetaParameters
VisionEgg.PyroApps.DropinServer.DropinMetaController
VisionEgg.PyroApps.EPhysGUI.AppWindow
VisionEgg.PyroApps.EPhysGUI.BarButton
VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase
VisionEgg.PyroApps.EPhysGUI.GammaFrame
VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher
VisionEgg.PyroApps.EPhysGUI.Loop
VisionEgg.PyroApps.EPhysGUI.LoopContainedObject
VisionEgg.PyroApps.EPhysGUI.LoopParamDialog
VisionEgg.PyroApps.EPhysGUI.ScrollListFrame
VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame
VisionEgg.PyroApps.EPhysServer.EPhysServer
VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame
VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters
VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController
VisionEgg.PyroApps.GridGUI.GridControlFrame
VisionEgg.PyroApps.GridGUI.GridMetaParameters
VisionEgg.PyroApps.GridServer.GridMetaController
VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame
VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters
VisionEgg.PyroApps.MouseTargetServer.MousePositionController
VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController
VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController
VisionEgg.PyroApps.MouseTargetServer.TargetPositionController
VisionEgg.PyroApps.ScreenPositionGUI.CallbackEntry
VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame
VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters
VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController
VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame
VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters
VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController
VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame
VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters
VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController
VisionEgg.PyroApps.TargetGUI.TargetControlFrame
VisionEgg.PyroApps.TargetGUI.TargetMetaParameters
VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController
VisionEgg.PyroClient.PyroClient
VisionEgg.PyroHelpers.PyroConstantController
VisionEgg.PyroHelpers.PyroEncapsulatedController
VisionEgg.PyroHelpers.PyroEvalStringController
VisionEgg.PyroHelpers.PyroExecStringController
VisionEgg.PyroHelpers.PyroListenController
VisionEgg.PyroHelpers.PyroLocalDictController
VisionEgg.PyroHelpers.PyroServer
VisionEgg.QuickTime.MovieTexture
VisionEgg.ResponseControl.KeyboardResponseController
VisionEgg.ResponseControl.ResponseController
VisionEgg.SphereMap.AzElGrid
VisionEgg.SphereMap.SphereGrating
VisionEgg.SphereMap.SphereMap
VisionEgg.SphereMap.SphereWindow
VisionEgg.TCPController.SocketListenController
VisionEgg.TCPController.TCPController
VisionEgg.TCPController.TCPServer
VisionEgg.Text.BitmapText
VisionEgg.Text.GlutTextBase
VisionEgg.Text.StrokeText
VisionEgg.Text.Text
VisionEgg.Textures.FixationCross
VisionEgg.Textures.Mask2D
VisionEgg.Textures.SpinningDrum
VisionEgg.Textures.Texture
VisionEgg.Textures.TextureFromFile
VisionEgg.Textures.TextureObject
VisionEgg.Textures.TextureStimulus
VisionEgg.Textures.TextureStimulus3D
VisionEgg.Textures.TextureStimulusBaseClass
VisionEgg.Textures.TextureTooLargeError
VisionEgg.ThreeDeeMath.TransformMatrix
VisionEgg.WrappedText.WrappedText
VisionEgg.qtlowlevel.QTNewMoviePropertyElement
VisionEgg.qtlowlevel.Rect
VisionEgg.qtlowlevel.qtlowlevelError
VisionEgg.qtmovie.Movie
VisionEgg.qtmovie.Rect
float
int

All Functions

VisionEgg.Configuration.save_settings
VisionEgg.Core.add_gl_assumption
VisionEgg.Core.get_default_screen
VisionEgg.Core.init_gl_extension
VisionEgg.Core.post_gl_init
VisionEgg.Core.sum
VisionEgg.Core.swap_buffers
VisionEgg.Dots.draw_dots
VisionEgg.GL.glLoadMatrixf
VisionEgg.GLTrace.arg_to_str
VisionEgg.GLTrace.gl_trace_attach
VisionEgg.GUI.showexception
VisionEgg.ParameterTypes.assert_type
VisionEgg.ParameterTypes.get_all_classes_list
VisionEgg.ParameterTypes.get_type
VisionEgg.ParameterTypes.is_parameter_type_def
VisionEgg.PlatformDependent.attempt_to_load_multitexturing
VisionEgg.PlatformDependent.linux_but_unknown_drivers
VisionEgg.PlatformDependent.query_refresh_rate
VisionEgg.PlatformDependent.set_priority
VisionEgg.PlatformDependent.sync_swap_with_vbl_post_gl_init
VisionEgg.PlatformDependent.sync_swap_with_vbl_pre_gl_init
VisionEgg.PyroApps.AST_ext.extract_from_AST
VisionEgg.PyroApps.AST_ext.gen_assign_val_subtree
VisionEgg.PyroApps.AST_ext.modify_AST
VisionEgg.PyroApps.ColorCalGUI.get_control_list
VisionEgg.PyroApps.ColorCalServer.get_meta_controller_class
VisionEgg.PyroApps.ColorCalServer.get_meta_controller_stimkey
VisionEgg.PyroApps.ColorCalServer.make_stimuli
VisionEgg.PyroApps.DropinGUI.get_control_list
VisionEgg.PyroApps.DropinServer.get_meta_controller_class
VisionEgg.PyroApps.DropinServer.get_meta_controller_stimkey
VisionEgg.PyroApps.DropinServer.make_stimuli
VisionEgg.PyroApps.EPhysGUI.get_server
VisionEgg.PyroApps.EPhysServer.start_server
VisionEgg.PyroApps.FlatGratingGUI.get_control_list
VisionEgg.PyroApps.FlatGratingServer.get_meta_controller_class
VisionEgg.PyroApps.FlatGratingServer.get_meta_controller_stimkey
VisionEgg.PyroApps.FlatGratingServer.make_stimuli
VisionEgg.PyroApps.GridGUI.get_control_list
VisionEgg.PyroApps.GridServer.get_meta_controller_class
VisionEgg.PyroApps.GridServer.get_meta_controller_stimkey
VisionEgg.PyroApps.GridServer.make_stimuli
VisionEgg.PyroApps.MouseTargetGUI.get_control_list
VisionEgg.PyroApps.MouseTargetServer.cross_product
VisionEgg.PyroApps.MouseTargetServer.get_meta_controller_class
VisionEgg.PyroApps.MouseTargetServer.get_meta_controller_stimkey
VisionEgg.PyroApps.MouseTargetServer.get_target_size
VisionEgg.PyroApps.MouseTargetServer.keydown
VisionEgg.PyroApps.MouseTargetServer.keyup
VisionEgg.PyroApps.MouseTargetServer.mag
VisionEgg.PyroApps.MouseTargetServer.make_stimuli
VisionEgg.PyroApps.SphereGratingGUI.get_control_list
VisionEgg.PyroApps.SphereGratingServer.get_meta_controller_class
VisionEgg.PyroApps.SphereGratingServer.get_meta_controller_stimkey
VisionEgg.PyroApps.SphereGratingServer.make_stimuli
VisionEgg.PyroApps.SpinningDrumGUI.get_control_list
VisionEgg.PyroApps.SpinningDrumServer.get_meta_controller_class
VisionEgg.PyroApps.SpinningDrumServer.get_meta_controller_stimkey
VisionEgg.PyroApps.SpinningDrumServer.make_stimuli
VisionEgg.PyroApps.TargetGUI.get_control_list
VisionEgg.PyroApps.TargetServer.get_meta_controller_class
VisionEgg.PyroApps.TargetServer.get_meta_controller_stimkey
VisionEgg.PyroApps.TargetServer.make_stimuli
VisionEgg.PyroApps.VarTypes.getID
VisionEgg.PyroApps.VarTypes.getType
VisionEgg.Textures.convert_to_numpy_if_array
VisionEgg.Textures.is_power_of_2
VisionEgg.Textures.next_power_of_2
VisionEgg.ThreeDeeMath.make_homogeneous_coord_rows
VisionEgg.ThreeDeeMath.normalize_homogeneous_rows
VisionEgg.WrappedText.main
VisionEgg.assert_type
VisionEgg.get_type
VisionEgg.qtlowlevel.CheckOSStatus
VisionEgg.qtlowlevel.FOUR_CHAR_CODE
VisionEgg.qtlowlevel.GetErrorString
VisionEgg.qtmovie.new_movie_from_filename
VisionEgg.recursive_base_class_finder
VisionEgg.set_time_func_to_frame_locked
VisionEgg.set_time_func_to_true_time
VisionEgg.start_default_logging
VisionEgg.stop_watching_exceptions
VisionEgg.time_func_locked_to_frames
VisionEgg.timing_func
VisionEgg.watch_exceptions

All Variables

VisionEgg.Configuration.defaults
VisionEgg.Configuration.extra_darwin_defaults
VisionEgg.Core.gl_assumptions
VisionEgg.Core.message
VisionEgg.DaqKeyboard.__version__
VisionEgg.DaqLPT.__version__
VisionEgg.FlowControl.EVERY_FRAME
VisionEgg.FlowControl.FRAMES_ABSOLUTE
VisionEgg.FlowControl.FRAMES_SINCE_GO
VisionEgg.FlowControl.NEVER
VisionEgg.FlowControl.NOT_BETWEEN_GO
VisionEgg.FlowControl.NOT_DURING_GO
VisionEgg.FlowControl.ONCE
VisionEgg.FlowControl.TIME_INDEPENDENT
VisionEgg.FlowControl.TIME_SEC_ABSOLUTE
VisionEgg.FlowControl.TIME_SEC_SINCE_GO
VisionEgg.FlowControl.TRANSITIONS
VisionEgg.GL.GL_UNSIGNED_INT_8_8_8_8_REV
VisionEgg.GL.__version__
VisionEgg.GLTrace.bitmask_names_by_value
VisionEgg.GLTrace.bitmasks_by_function
VisionEgg.GLTrace.gl_constants
VisionEgg.GLTrace.raw_args_by_function
VisionEgg.GUI.Tkinter
VisionEgg.GUI.tkFileDialog
VisionEgg.GUI.tkMessageBox
VisionEgg.ParameterTypes.array_types
VisionEgg.PyroApps.AST_ext.name_sequence
VisionEgg.PyroApps.ColorCalGUI.__cvs__
VisionEgg.PyroApps.ColorCalGUI.__date__
VisionEgg.PyroApps.ColorCalServer.__cvs__
VisionEgg.PyroApps.ColorCalServer.__date__
VisionEgg.PyroApps.EPhysGUI.__author__
VisionEgg.PyroApps.EPhysGUI.__cvs__
VisionEgg.PyroApps.EPhysGUI.__date__
VisionEgg.PyroApps.EPhysGUI.__version__
VisionEgg.PyroApps.EPhysGUI.client_list
VisionEgg.PyroApps.EPhysGUIUtils.__author__
VisionEgg.PyroApps.EPhysGUIUtils.__cvs__
VisionEgg.PyroApps.EPhysGUIUtils.__date__
VisionEgg.PyroApps.EPhysGUIUtils.__version__
VisionEgg.PyroApps.EPhysServer.__author__
VisionEgg.PyroApps.EPhysServer.__cvs__
VisionEgg.PyroApps.EPhysServer.__date__
VisionEgg.PyroApps.EPhysServer.__version__
VisionEgg.PyroApps.EPhysServer.server_modules
VisionEgg.PyroApps.FlatGratingGUI.__cvs__
VisionEgg.PyroApps.FlatGratingGUI.__date__
VisionEgg.PyroApps.FlatGratingServer.__cvs__
VisionEgg.PyroApps.FlatGratingServer.__date__
VisionEgg.PyroApps.GridGUI.__author__
VisionEgg.PyroApps.GridGUI.__cvs__
VisionEgg.PyroApps.GridGUI.__date__
VisionEgg.PyroApps.GridGUI.__version__
VisionEgg.PyroApps.GridServer.__author__
VisionEgg.PyroApps.GridServer.__cvs__
VisionEgg.PyroApps.GridServer.__date__
VisionEgg.PyroApps.GridServer.__version__
VisionEgg.PyroApps.MouseTargetGUI.__cvs__
VisionEgg.PyroApps.MouseTargetGUI.__date__
VisionEgg.PyroApps.MouseTargetServer.__cvs__
VisionEgg.PyroApps.MouseTargetServer.__date__
VisionEgg.PyroApps.MouseTargetServer.down
VisionEgg.PyroApps.MouseTargetServer.handle_event_callbacks
VisionEgg.PyroApps.MouseTargetServer.last_mouse_position
VisionEgg.PyroApps.MouseTargetServer.left
VisionEgg.PyroApps.MouseTargetServer.mouse_position
VisionEgg.PyroApps.MouseTargetServer.right
VisionEgg.PyroApps.MouseTargetServer.target_h
VisionEgg.PyroApps.MouseTargetServer.target_w
VisionEgg.PyroApps.MouseTargetServer.up
VisionEgg.PyroApps.ScreenPositionGUI.__cvs__
VisionEgg.PyroApps.ScreenPositionGUI.__date__
VisionEgg.PyroApps.ScreenPositionGUI.__version__
VisionEgg.PyroApps.ScreenPositionServer.__cvs__
VisionEgg.PyroApps.ScreenPositionServer.__date__
VisionEgg.PyroApps.ScreenPositionServer.__version__
VisionEgg.PyroApps.SphereGratingGUI.__cvs__
VisionEgg.PyroApps.SphereGratingGUI.__date__
VisionEgg.PyroApps.SphereGratingServer.__cvs__
VisionEgg.PyroApps.SphereGratingServer.__date__
VisionEgg.PyroApps.SpinningDrumGUI.__author__
VisionEgg.PyroApps.SpinningDrumGUI.__cvs__
VisionEgg.PyroApps.SpinningDrumGUI.__date__
VisionEgg.PyroApps.SpinningDrumGUI.__version__
VisionEgg.PyroApps.SpinningDrumServer.__author__
VisionEgg.PyroApps.SpinningDrumServer.__cvs__
VisionEgg.PyroApps.SpinningDrumServer.__date__
VisionEgg.PyroApps.SpinningDrumServer.__version__
VisionEgg.PyroApps.TargetGUI.__cvs__
VisionEgg.PyroApps.TargetGUI.__date__
VisionEgg.PyroApps.TargetServer.__cvs__
VisionEgg.PyroApps.TargetServer.__date__
VisionEgg.PyroClient.__cvs__
VisionEgg.PyroClient.__date__
VisionEgg.PyroHelpers.__cvs__
VisionEgg.PyroHelpers.__date__
VisionEgg.PyroHelpers.__version__
VisionEgg.QuickTime.__version__
VisionEgg.ResponseControl.__version__
VisionEgg.SphereMap.__version__
VisionEgg.TCPController.__cvs__
VisionEgg.TCPController.__date__
VisionEgg.TCPController.__version__
VisionEgg.Text.have_glut
VisionEgg.Textures.array_types
VisionEgg.Textures.shrink_filter
VisionEgg.config
VisionEgg.darwin_getrefresh.getrefresh
VisionEgg.gl_qt.gl_qt_renderer_create
VisionEgg.gl_qt.gl_qt_renderer_delete
VisionEgg.gl_qt.gl_qt_renderer_update
VisionEgg.log_formatter
VisionEgg.logger
VisionEgg.posix_maxpriority.SCHED_FIFO
VisionEgg.posix_maxpriority.SCHED_RR
VisionEgg.posix_maxpriority.sched_get_priority_max
VisionEgg.posix_maxpriority.set_self_policy_priority
VisionEgg.posix_maxpriority.stop_memory_paging
VisionEgg.qtlowlevel.ByteCount
VisionEgg.qtlowlevel.CFAllocatorRef
VisionEgg.qtlowlevel.CFIndex
VisionEgg.qtlowlevel.CFStringCreateWithCString
VisionEgg.qtlowlevel.CFStringCreateWithCharacters
VisionEgg.qtlowlevel.CFStringEncoding
VisionEgg.qtlowlevel.CFStringGetCString
VisionEgg.qtlowlevel.CFStringGetCStringPtr
VisionEgg.qtlowlevel.CFStringRef
VisionEgg.qtlowlevel.EnterMovies
VisionEgg.qtlowlevel.FSSpec
VisionEgg.qtlowlevel.FourCharCode
VisionEgg.qtlowlevel.GetMovieBox
VisionEgg.qtlowlevel.GoToBeginningOfMovie
VisionEgg.qtlowlevel.InitializeQTML
VisionEgg.qtlowlevel.IsMovieDone
VisionEgg.qtlowlevel.ItemCount
VisionEgg.qtlowlevel.Movie
VisionEgg.qtlowlevel.MoviesTask
VisionEgg.qtlowlevel.NativePathNameToFSSpec
VisionEgg.qtlowlevel.NewMovieFromFile
VisionEgg.qtlowlevel.NewMovieFromProperties
VisionEgg.qtlowlevel.OSErr
VisionEgg.qtlowlevel.OSStatus
VisionEgg.qtlowlevel.OSType
VisionEgg.qtlowlevel.OpenMovieFile
VisionEgg.qtlowlevel.QTGetCFConstant
VisionEgg.qtlowlevel.QTMLClient
VisionEgg.qtlowlevel.QTPropertyClass
VisionEgg.qtlowlevel.QTPropertyID
VisionEgg.qtlowlevel.QTPropertyValuePtr
VisionEgg.qtlowlevel.QTVisualContextRef
VisionEgg.qtlowlevel.SetMovieBox
VisionEgg.qtlowlevel.StartMovie
VisionEgg.qtlowlevel.kCFAllocatorDefault
VisionEgg.qtlowlevel.kCFStringEncodingMacRoman
VisionEgg.qtlowlevel.kQTContextPropertyID_AudioContext
VisionEgg.qtlowlevel.kQTContextPropertyID_VisualContext
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFStringHFSPath
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFStringNativePath
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFStringPosixPath
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFStringWindowsPath
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_CFURL
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_DataFork
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_DataReference
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_LegacyMovieResourceHandle
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_MovieUserProc
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_QTDataHandler
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_ResourceFork
VisionEgg.qtlowlevel.kQTDataLocationPropertyID_Scrap
VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_AsyncOK
VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs
VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontAutoAlternates
VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontAutoUpdateClock
VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontResolveDataRefs
VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_DontUpdateForeBackPointers
VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_IdleImportOK
VisionEgg.qtlowlevel.kQTMovieInstantiationPropertyID_ResultDataLocationChanged
VisionEgg.qtlowlevel.kQTMovieResourceLocatorPropertyID_Callback
VisionEgg.qtlowlevel.kQTMovieResourceLocatorPropertyID_FileOffset
VisionEgg.qtlowlevel.kQTMovieResourceLocatorPropertyID_LegacyResID
VisionEgg.qtlowlevel.kQTMovieResourceLocatorPropertyID_LegacyResName
VisionEgg.qtlowlevel.kQTNewMoviePropertyID_Active
VisionEgg.qtlowlevel.kQTNewMoviePropertyID_DefaultDataRef
VisionEgg.qtlowlevel.kQTNewMoviePropertyID_DontInteractWithUser
VisionEgg.qtlowlevel.kQTPropertyClass_Context
VisionEgg.qtlowlevel.kQTPropertyClass_DataLocation
VisionEgg.qtlowlevel.kQTPropertyClass_MovieInstantiation
VisionEgg.qtlowlevel.kQTPropertyClass_MovieResourceLocator
VisionEgg.qtlowlevel.kQTPropertyClass_NewMovieProperty
VisionEgg.qtlowlevel.movieToolboxUninitialized
VisionEgg.qtlowlevel.noErr
VisionEgg.qtlowlevel.paramErr
VisionEgg.release_name
VisionEgg.time_func
VisionEgg.true_time_func
VisionEgg.win32_getrefresh.getrefresh
VisionEgg.win32_maxpriority.HIGH_PRIORITY_CLASS
VisionEgg.win32_maxpriority.IDLE_PRIORITY_CLASS
VisionEgg.win32_maxpriority.NORMAL_PRIORITY_CLASS
VisionEgg.win32_maxpriority.REALTIME_PRIORITY_CLASS
VisionEgg.win32_maxpriority.THREAD_PRIORITY_ABOVE_NORMAL
VisionEgg.win32_maxpriority.THREAD_PRIORITY_BELOW_NORMAL
VisionEgg.win32_maxpriority.THREAD_PRIORITY_HIGHEST
VisionEgg.win32_maxpriority.THREAD_PRIORITY_IDLE
VisionEgg.win32_maxpriority.THREAD_PRIORITY_LOWEST
VisionEgg.win32_maxpriority.THREAD_PRIORITY_NORMAL
VisionEgg.win32_maxpriority.THREAD_PRIORITY_TIME_CRITICAL
VisionEgg.win32_maxpriority.set_self_process_priority_class
VisionEgg.win32_maxpriority.set_self_thread_priority

visionegg-1.2.1/doc/reference/html/toc-VisionEgg-module.html0000644000076500000240000000554211224565531023200 0ustar astrawstaff VisionEgg

Module VisionEgg


Classes

ClassWithParameters
ParameterDefinition
Parameters

Functions

assert_type
get_type
recursive_base_class_finder
set_time_func_to_frame_locked
set_time_func_to_true_time
start_default_logging
stop_watching_exceptions
time_func_locked_to_frames
timing_func
watch_exceptions

Variables

config
log_formatter
logger
release_name
time_func
true_time_func

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.Configuration-module.html0000644000076500000240000000254611224565531026007 0ustar astrawstaff Configuration

Module Configuration


Classes

Config

Functions

save_settings

Variables

defaults
extra_darwin_defaults

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.Core-module.html0000644000076500000240000000753411224565531024072 0ustar astrawstaff Core

Module Core


Classes

ConstantController
Controller
EncapsulatedController
EvalStringController
ExecStringController
FixationSpot
FrameTimer
FunctionController
Message
ModelView
OrthographicProjection
OrthographicProjectionNoZClip
PerspectiveProjection
Presentation
Projection
ProjectionBaseClass
Screen
SimplePerspectiveProjection
Stimulus
Viewport

Functions

add_gl_assumption
get_default_screen
init_gl_extension
post_gl_init
sum
swap_buffers

Variables

gl_assumptions
message

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.Daq-module.html0000644000076500000240000000400011224565531023670 0ustar astrawstaff Daq

Module Daq


Classes

Analog
Buffered
Channel
ChannelParameters
DaqMode
Device
Digital
Functionality
Immediate
Input
Output
SignalType
Trigger

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.DaqKeyboard-module.html0000644000076500000240000000235211224565531025361 0ustar astrawstaff DaqKeyboard

Module DaqKeyboard


Classes

KeyboardInput
KeyboardTriggerInController

Variables

__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.DaqLPT-module.html0000644000076500000240000000313311224565531024256 0ustar astrawstaff DaqLPT

Module DaqLPT


Classes

LPTChannel
LPTDevice
LPTInput
LPTOutput
LPTTriggerInController
LPTTriggerOutController

Variables

__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.darwin_getrefresh-module.html0000644000076500000240000000174511224565531026702 0ustar astrawstaff darwin_getrefresh

Module darwin_getrefresh


Variables

getrefresh

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.Deprecated-module.html0000644000076500000240000000170711224565531025236 0ustar astrawstaff Deprecated

Module Deprecated


Classes

Message

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.Dots-module.html0000644000076500000240000000207111224565531024102 0ustar astrawstaff Dots

Module Dots


Classes

DotArea2D

Functions

draw_dots

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.FlowControl-module.html0000644000076500000240000000555711224565531025455 0ustar astrawstaff FlowControl

Module FlowControl


Classes

ConstantController
Controller
EncapsulatedController
EvalStringController
ExecStringController
FunctionController
Presentation

Variables

EVERY_FRAME
FRAMES_ABSOLUTE
FRAMES_SINCE_GO
NEVER
NOT_BETWEEN_GO
NOT_DURING_GO
ONCE
TIME_INDEPENDENT
TIME_SEC_ABSOLUTE
TIME_SEC_SINCE_GO
TRANSITIONS

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.GL-module.html0000644000076500000240000000230111224565531023467 0ustar astrawstaff GL

Module GL


Functions

glLoadMatrixf

Variables

GL_UNSIGNED_INT_8_8_8_8_REV
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.gl_qt-module.html0000644000076500000240000000230711224565531024301 0ustar astrawstaff gl_qt

Module gl_qt


Variables

gl_qt_renderer_create
gl_qt_renderer_delete
gl_qt_renderer_update

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.GLTrace-module.html0000644000076500000240000000324611224565531024457 0ustar astrawstaff GLTrace

Module GLTrace


Classes

Wrapper

Functions

arg_to_str
gl_trace_attach

Variables

bitmask_names_by_value
bitmasks_by_function
gl_constants
raw_args_by_function

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.Gratings-module.html0000644000076500000240000000264111224565531024752 0ustar astrawstaff Gratings

Module Gratings


Classes

AlphaGratingCommon
LuminanceGratingCommon
NumSamplesTooLargeError
SinGrating2D
SinGrating3D

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.GUI-module.html0000644000076500000240000000362311224565531023621 0ustar astrawstaff GUI

Module GUI


Classes

AppWindow
GetKeypressDialog
GraphicsConfigurationWindow
InfoFrame
ProgressBar
ToplevelDialog

Functions

showexception

Variables

Tkinter
tkFileDialog
tkMessageBox

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.MoreStimuli-module.html0000644000076500000240000000237511224565531025451 0ustar astrawstaff MoreStimuli

Module MoreStimuli


Classes

Arrow
FilledCircle
Rectangle3D
Target2D

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.ParameterTypes-module.html0000644000076500000240000001033611224565531026141 0ustar astrawstaff ParameterTypes

Module ParameterTypes


Classes

AnyClass
AnyClassMC
AnyOf
Boolean
BooleanMC
Callable
CallableMC
Instance
Integer
IntegerMC
NoneMC
NoneType
ParameterTypeDef
Real
RealMC
Sequence
Sequence2
Sequence3
Sequence4
Sequence4x4
String
StringMC
SubClass
Unicode
UnicodeMC
UnsignedInteger
UnsignedIntegerMC

Functions

assert_type
get_all_classes_list
get_type
is_parameter_type_def

Variables

array_types

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PlatformDependent-module.html0000644000076500000240000000326711224565531026614 0ustar astrawstaff PlatformDependent

Module PlatformDependent


Functions

attempt_to_load_multitexturing
linux_but_unknown_drivers
query_refresh_rate
set_priority
sync_swap_with_vbl_post_gl_init
sync_swap_with_vbl_pre_gl_init

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.posix_maxpriority-module.html0000644000076500000240000000273511224565531027011 0ustar astrawstaff posix_maxpriority

Module posix_maxpriority


Variables

SCHED_FIFO
SCHED_RR
sched_get_priority_max
set_self_policy_priority
stop_memory_paging

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps-module.html0000644000076500000240000000150411224565531024746 0ustar astrawstaff PyroApps

Module PyroApps



visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.AST_ext-module.html0000644000076500000240000000275711224565531026267 0ustar astrawstaff AST_ext

Module AST_ext


Classes

AST_Visitor

Functions

extract_from_AST
gen_assign_val_subtree
modify_AST

Variables

name_sequence

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.ColorCalGUI-module.html0000644000076500000240000000301411224565531027006 0ustar astrawstaff ColorCalGUI

Module ColorCalGUI


Classes

ColorCalControlFrame
ColorCalMetaParameters

Functions

get_control_list

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.ColorCalServer-module.html0000644000076500000240000000327211224565531027636 0ustar astrawstaff ColorCalServer

Module ColorCalServer


Classes

ColorCalMetaController

Functions

get_meta_controller_class
get_meta_controller_stimkey
make_stimuli

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.DropinGUI-module.html0000644000076500000240000000240111224565531026542 0ustar astrawstaff DropinGUI

Module DropinGUI


Classes

DropinControlFrame
DropinMetaParameters

Functions

get_control_list

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.DropinServer-module.html0000644000076500000240000000265311224565531027375 0ustar astrawstaff DropinServer

Module DropinServer


Classes

DropinMetaController

Functions

get_meta_controller_class
get_meta_controller_stimkey
make_stimuli

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.EPhysGUI-module.html0000644000076500000240000000510611224565531026344 0ustar astrawstaff EPhysGUI

Module EPhysGUI


Classes

AppWindow
BarButton
ContainedObjectBase
GammaFrame
ImageSequenceLauncher
Loop
LoopContainedObject
LoopParamDialog
ScrollListFrame

Functions

get_server

Variables

__author__
__cvs__
__date__
__version__
client_list

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.EPhysGUIUtils-module.html0000644000076500000240000000273011224565531027365 0ustar astrawstaff EPhysGUIUtils

Module EPhysGUIUtils


Classes

StimulusControlFrame

Variables

__author__
__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.EPhysServer-module.html0000644000076500000240000000330711224565531027167 0ustar astrawstaff EPhysServer

Module EPhysServer


Classes

EPhysServer

Functions

start_server

Variables

__author__
__cvs__
__date__
__version__
server_modules

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.FlatGratingGUI-module.html0000644000076500000240000000305511224565531027517 0ustar astrawstaff FlatGratingGUI

Module FlatGratingGUI


Classes

FlatGratingControlFrame
FlatGratingMetaParameters

Functions

get_control_list

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.FlatGratingServer-module.html0000644000076500000240000000335411224565531030343 0ustar astrawstaff FlatGratingServer

Module FlatGratingServer


Classes

FlatGratingExperimentMetaController

Functions

get_meta_controller_class
get_meta_controller_stimkey
make_stimuli

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.GridGUI-module.html0000644000076500000240000000327411224565531026205 0ustar astrawstaff GridGUI

Module GridGUI


Classes

GridControlFrame
GridMetaParameters

Functions

get_control_list

Variables

__author__
__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.GridServer-module.html0000644000076500000240000000356411224565531027031 0ustar astrawstaff GridServer

Module GridServer


Classes

GridMetaController

Functions

get_meta_controller_class
get_meta_controller_stimkey
make_stimuli

Variables

__author__
__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.MouseTargetGUI-module.html0000644000076500000240000000305511224565531027554 0ustar astrawstaff MouseTargetGUI

Module MouseTargetGUI


Classes

MouseTargetControlFrame
MouseTargetMetaParameters

Functions

get_control_list

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.MouseTargetServer-module.html0000644000076500000240000000742211224565531030400 0ustar astrawstaff MouseTargetServer

Module MouseTargetServer


Classes

MousePositionController
MouseTargetExperimentMetaController
TargetOrientationController
TargetPositionController

Functions

cross_product
get_meta_controller_class
get_meta_controller_stimkey
get_target_size
keydown
keyup
mag
make_stimuli

Variables

__cvs__
__date__
down
handle_event_callbacks
last_mouse_position
left
mouse_position
right
target_h
target_w
up

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.ScreenPositionGUI-module.html0000644000076500000240000000322711224565531030262 0ustar astrawstaff ScreenPositionGUI

Module ScreenPositionGUI


Classes

CallbackEntry
ScreenPositionControlFrame
ScreenPositionParameters

Variables

__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.ScreenPositionServer-module.html0000644000076500000240000000263711224565531031110 0ustar astrawstaff ScreenPositionServer

Module ScreenPositionServer


Classes

ScreenPositionMetaController

Variables

__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.SphereGratingGUI-module.html0000644000076500000240000000310311224565531030051 0ustar astrawstaff SphereGratingGUI

Module SphereGratingGUI


Classes

SphereGratingControlFrame
SphereGratingMetaParameters

Functions

get_control_list

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.SphereGratingServer-module.html0000644000076500000240000000340011224565531030673 0ustar astrawstaff SphereGratingServer

Module SphereGratingServer


Classes

SphereGratingExperimentMetaController

Functions

get_meta_controller_class
get_meta_controller_stimkey
make_stimuli

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.SpinningDrumGUI-module.html0000644000076500000240000000344411224565531027734 0ustar astrawstaff SpinningDrumGUI

Module SpinningDrumGUI


Classes

SpinningDrumControlFrame
SpinningDrumMetaParameters

Functions

get_control_list

Variables

__author__
__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.SpinningDrumServer-module.html0000644000076500000240000000375011224565531030556 0ustar astrawstaff SpinningDrumServer

Module SpinningDrumServer


Classes

SpinningDrumExperimentMetaController

Functions

get_meta_controller_class
get_meta_controller_stimkey
make_stimuli

Variables

__author__
__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.TargetGUI-module.html0000644000076500000240000000276611224565531026553 0ustar astrawstaff TargetGUI

Module TargetGUI


Classes

TargetControlFrame
TargetMetaParameters

Functions

get_control_list

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.TargetServer-module.html0000644000076500000240000000327211224565531027366 0ustar astrawstaff TargetServer

Module TargetServer


Classes

TargetExperimentMetaController

Functions

get_meta_controller_class
get_meta_controller_stimkey
make_stimuli

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroApps.VarTypes-module.html0000644000076500000240000000206111224565531026521 0ustar astrawstaff VarTypes

Module VarTypes


Functions

getID
getType

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroClient-module.html0000644000076500000240000000226211224565531025263 0ustar astrawstaff PyroClient

Module PyroClient


Classes

PyroClient

Variables

__cvs__
__date__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.PyroHelpers-module.html0000644000076500000240000000405111224565531025445 0ustar astrawstaff PyroHelpers

Module PyroHelpers


Classes

PyroConstantController
PyroEncapsulatedController
PyroEvalStringController
PyroExecStringController
PyroListenController
PyroLocalDictController
PyroServer

Variables

__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.qtlowlevel-module.html0000644000076500000240000002640511224565531025376 0ustar astrawstaff qtlowlevel

Module qtlowlevel


Classes

QTNewMoviePropertyElement
Rect
qtlowlevelError

Functions

CheckOSStatus
FOUR_CHAR_CODE
GetErrorString

Variables

ByteCount
CFAllocatorRef
CFIndex
CFStringCreateWithCString
CFStringCreateWithCharacters
CFStringEncoding
CFStringGetCString
CFStringGetCStringPtr
CFStringRef
EnterMovies
FSSpec
FourCharCode
GetMovieBox
GoToBeginningOfMovie
InitializeQTML
IsMovieDone
ItemCount
Movie
MoviesTask
NativePathNameToFSSpec
NewMovieFromFile
NewMovieFromProperties
OSErr
OSStatus
OSType
OpenMovieFile
QTGetCFConstant
QTMLClient
QTPropertyClass
QTPropertyID
QTPropertyValuePtr
QTVisualContextRef
SetMovieBox
StartMovie
kCFAllocatorDefault
kCFStringEncodingMacRoman
kQTContextPropertyID_AudioContext
kQTContextPropertyID_VisualContext
kQTDataLocationPropertyID_CFStringHFSPath
kQTDataLocationPropertyID_CFStringNativePath
kQTDataLocationPropertyID_CFStringPosixPath
kQTDataLocationPropertyID_CFStringWindowsPath
kQTDataLocationPropertyID_CFURL
kQTDataLocationPropertyID_DataFork
kQTDataLocationPropertyID_DataReference
kQTDataLocationPropertyID_LegacyMovieResourceHandle
kQTDataLocationPropertyID_MovieUserProc
kQTDataLocationPropertyID_QTDataHandler
kQTDataLocationPropertyID_ResourceFork
kQTDataLocationPropertyID_Scrap
kQTMovieInstantiationPropertyID_AsyncOK
kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs
kQTMovieInstantiationPropertyID_DontAutoAlternates
kQTMovieInstantiationPropertyID_DontAutoUpdateClock
kQTMovieInstantiationPropertyID_DontResolveDataRefs
kQTMovieInstantiationPropertyID_DontUpdateForeBackPointers
kQTMovieInstantiationPropertyID_IdleImportOK
kQTMovieInstantiationPropertyID_ResultDataLocationChanged
kQTMovieResourceLocatorPropertyID_Callback
kQTMovieResourceLocatorPropertyID_FileOffset
kQTMovieResourceLocatorPropertyID_LegacyResID
kQTMovieResourceLocatorPropertyID_LegacyResName
kQTNewMoviePropertyID_Active
kQTNewMoviePropertyID_DefaultDataRef
kQTNewMoviePropertyID_DontInteractWithUser
kQTPropertyClass_Context
kQTPropertyClass_DataLocation
kQTPropertyClass_MovieInstantiation
kQTPropertyClass_MovieResourceLocator
kQTPropertyClass_NewMovieProperty
movieToolboxUninitialized
noErr
paramErr

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.qtmovie-module.html0000644000076500000240000000226011224565531024655 0ustar astrawstaff qtmovie

Module qtmovie


Classes

Movie
Rect

Functions

new_movie_from_filename

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.QuickTime-module.html0000644000076500000240000000237011224565531025066 0ustar astrawstaff QuickTime

Module QuickTime


Classes

MovieTexture

Functions

new_movie_from_filename

Variables

__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.ResponseControl-module.html0000644000076500000240000000240611224565531026332 0ustar astrawstaff ResponseControl

Module ResponseControl


Classes

KeyboardResponseController
ResponseController

Variables

__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.SphereMap-module.html0000644000076500000240000000260611224565531025061 0ustar astrawstaff SphereMap

Module SphereMap


Classes

AzElGrid
SphereGrating
SphereMap
SphereWindow

Variables

__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.TCPController-module.html0000644000076500000240000000303311224565531025662 0ustar astrawstaff TCPController

Module TCPController


Classes

SocketListenController
TCPController
TCPServer

Variables

__cvs__
__date__
__version__

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.Text-module.html0000644000076500000240000000252311224565531024117 0ustar astrawstaff Text

Module Text


Classes

BitmapText
GlutTextBase
StrokeText
Text

Variables

have_glut

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.Textures-module.html0000644000076500000240000000502011224565531025011 0ustar astrawstaff Textures

Module Textures


Classes

FixationCross
Mask2D
SpinningDrum
Texture
TextureFromFile
TextureObject
TextureStimulus
TextureStimulus3D
TextureStimulusBaseClass
TextureTooLargeError

Functions

convert_to_numpy_if_array
is_power_of_2
next_power_of_2

Variables

array_types
shrink_filter

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.ThreeDeeMath-module.html0000644000076500000240000000242211224565531025470 0ustar astrawstaff ThreeDeeMath

Module ThreeDeeMath


Classes

TransformMatrix

Functions

make_homogeneous_coord_rows
normalize_homogeneous_rows

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.win32_getrefresh-module.html0000644000076500000240000000174211224565531026355 0ustar astrawstaff win32_getrefresh

Module win32_getrefresh


Variables

getrefresh

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.win32_maxpriority-module.html0000644000076500000240000000516311224565531026607 0ustar astrawstaff win32_maxpriority

Module win32_maxpriority


Variables

HIGH_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_TIME_CRITICAL
set_self_process_priority_class
set_self_thread_priority

visionegg-1.2.1/doc/reference/html/toc-VisionEgg.WrappedText-module.html0000644000076500000240000000211711224565531025441 0ustar astrawstaff WrappedText

Module WrappedText


Classes

WrappedText

Functions

main

visionegg-1.2.1/doc/reference/html/toc.html0000644000076500000240000003274011224565531020025 0ustar astrawstaff Table of Contents

Table of Contents


Everything

Modules

VisionEgg
VisionEgg.Configuration
VisionEgg.Core
VisionEgg.Daq
VisionEgg.DaqKeyboard
VisionEgg.DaqLPT
VisionEgg.Deprecated
VisionEgg.Dots
VisionEgg.FlowControl
VisionEgg.GL
VisionEgg.GLTrace
VisionEgg.GUI
VisionEgg.Gratings
VisionEgg.MoreStimuli
VisionEgg.ParameterTypes
VisionEgg.PlatformDependent
VisionEgg.PyroApps
VisionEgg.PyroApps.AST_ext
VisionEgg.PyroApps.ColorCalGUI
VisionEgg.PyroApps.ColorCalServer
VisionEgg.PyroApps.DropinGUI
VisionEgg.PyroApps.DropinServer
VisionEgg.PyroApps.EPhysGUI
VisionEgg.PyroApps.EPhysGUIUtils
VisionEgg.PyroApps.EPhysServer
VisionEgg.PyroApps.FlatGratingGUI
VisionEgg.PyroApps.FlatGratingServer
VisionEgg.PyroApps.GridGUI
VisionEgg.PyroApps.GridServer
VisionEgg.PyroApps.MouseTargetGUI
VisionEgg.PyroApps.MouseTargetServer
VisionEgg.PyroApps.ScreenPositionGUI
VisionEgg.PyroApps.ScreenPositionServer
VisionEgg.PyroApps.SphereGratingGUI
VisionEgg.PyroApps.SphereGratingServer
VisionEgg.PyroApps.SpinningDrumGUI
VisionEgg.PyroApps.SpinningDrumServer
VisionEgg.PyroApps.TargetGUI
VisionEgg.PyroApps.TargetServer
VisionEgg.PyroApps.VarTypes
VisionEgg.PyroClient
VisionEgg.PyroHelpers
VisionEgg.QuickTime
VisionEgg.ResponseControl
VisionEgg.SphereMap
VisionEgg.TCPController
VisionEgg.Text
VisionEgg.Textures
VisionEgg.ThreeDeeMath
VisionEgg.WrappedText
VisionEgg.darwin_getrefresh
VisionEgg.gl_qt
VisionEgg.posix_maxpriority
VisionEgg.qtlowlevel
VisionEgg.qtmovie
VisionEgg.win32_getrefresh
VisionEgg.win32_maxpriority

visionegg-1.2.1/doc/reference/html/VisionEgg-module.html0000644000076500000240000006657111224565530022425 0ustar astrawstaff VisionEgg
Package VisionEgg
[frames] | no frames]

Package VisionEgg

source code


The Vision Egg package.

The Vision Egg is a programming library (with demo applications) that
uses standard, inexpensive computer graphics cards to produce visual
stimuli for vision research experiments.

Today's consumer computer graphics cards, thanks to the demands of
computer gamers, are capable of drawing and updating computer graphics
suitable for producing research-quality visual stimuli. The Vision Egg
allows the vision scientist (or anyone else) to program these cards
using OpenGL, the standard in computer graphics
programming. Potentially difficult tasks, such as initializing
graphics, getting precise timing information, controlling stimulus
parameters in real-time, and synchronizing with data acquisition are
greatly eased by routines within the Vision Egg.

See the 'Core' module for the fundamental Vision Egg classes.




Version: 1.1.dev

Submodules

Classes
  Parameters
Parameter container.
  ParameterDefinition
Define parameters used in ClassWithParameters...
  ClassWithParameters
Base class for any class that uses parameters.
Functions
 
start_default_logging(maxBytes=100000)
Create and add log handlers
source code
 
watch_exceptions()
Catch exceptions, log them, and optionally open GUI.
source code
 
stop_watching_exceptions()
Stop catching exceptions, returning to previous state.
source code
 
recursive_base_class_finder(klass)
A function to find all base classes.
source code
 
time_func_locked_to_frames() source code
 
set_time_func_to_true_time() source code
 
set_time_func_to_frame_locked() source code
 
timing_func()
DEPRECATED.
source code
 
get_type(value) source code
 
assert_type(*args) source code
Variables
  release_name = '1.1.dev'
  config = VisionEgg.Configuration.Config()
  log_formatter = logging.Formatter('%(asctime)s (%(process)d) %...
  logger = logging.getLogger('VisionEgg.Configuration')
  true_time_func = time.time
  time_func = time.time
Function Details

timing_func()

source code 
DEPRECATED.  Use time_func instead


Variables Details

log_formatter

Value:
logging.Formatter('%(asctime)s (%(process)d) %(levelname)s: %(message)\
s')

visionegg-1.2.1/doc/reference/html/VisionEgg-pysrc.html0000644000076500000240000056024711224565530022277 0ustar astrawstaff VisionEgg
Package VisionEgg
[frames] | no frames]

Source Code for Package VisionEgg

  1  # The Vision Egg 
  2  # 
  3  # Copyright (C) 2001-2004 Andrew Straw 
  4  # Copyright (C) 2004-2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10  # 
 11   
 12  """ 
 13  The Vision Egg package. 
 14   
 15  The Vision Egg is a programming library (with demo applications) that 
 16  uses standard, inexpensive computer graphics cards to produce visual 
 17  stimuli for vision research experiments. 
 18   
 19  Today's consumer computer graphics cards, thanks to the demands of 
 20  computer gamers, are capable of drawing and updating computer graphics 
 21  suitable for producing research-quality visual stimuli. The Vision Egg 
 22  allows the vision scientist (or anyone else) to program these cards 
 23  using OpenGL, the standard in computer graphics 
 24  programming. Potentially difficult tasks, such as initializing 
 25  graphics, getting precise timing information, controlling stimulus 
 26  parameters in real-time, and synchronizing with data acquisition are 
 27  greatly eased by routines within the Vision Egg. 
 28   
 29  See the 'Core' module for the fundamental Vision Egg classes. 
 30   
 31  """ 
 32  release_name = '1.1.dev' 
 33   
 34  __version__ = release_name 
 35   
 36  import VisionEgg.Configuration 
 37  import VisionEgg.ParameterTypes as ve_types 
 38  import os, sys, time, types # standard python modules 
 39  import numpy 
 40  import numpy.oldnumeric as Numeric 
 41  import warnings 
 42  import traceback 
 43  import StringIO 
 44   
 45  import logging  # available in Python 2.3 
 46  import logging.handlers 
 47   
 48  if not hasattr(Numeric,'UInt8'): 
 49      Numeric.UInt8 = 'b' 
 50  if not hasattr(Numeric,'Float32'): 
 51      Numeric.UInt8 = 'f' 
 52   
 53  # Make sure we don't have an old version of the VisionEgg installed. 
 54  # (There used to be a module named VisionEgg.VisionEgg.  If it still 
 55  # exists, it will randomly crash things.) 
 56  if not hasattr(sys,'frozen'): 
 57      # don't do this if frozen: 
 58      try: 
 59          __import__('VisionEgg.VisionEgg') 
 60      except ImportError: 
 61          pass # It's OK, the old version isn't there 
 62      else: 
 63          # If we can import it, report error 
 64          raise RuntimeError('Outdated "VisionEgg.py" and/or "VisionEgg.pyc" found.  Please delete from your VisionEgg package directory.') 
 65   
 66  ############# Get config defaults ############# 
 67  config = VisionEgg.Configuration.Config() 
 68   
 69  ############# Logging ############# 
 70   
 71  logger = logging.getLogger('VisionEgg') 
 72  logger.setLevel( logging.INFO ) 
 73  log_formatter = logging.Formatter('%(asctime)s (%(process)d) %(levelname)s: %(message)s') 
 74  _default_logging_started = False 
 75   
76 -def start_default_logging(maxBytes=100000):
77 """Create and add log handlers""" 78 global _default_logging_started 79 if _default_logging_started: 80 return # default logging already started 81 82 if config.VISIONEGG_LOG_TO_STDERR: 83 log_handler_stderr = logging.StreamHandler() 84 log_handler_stderr.setFormatter( log_formatter ) 85 logger.addHandler( log_handler_stderr ) 86 87 if config.VISIONEGG_LOG_FILE: 88 if hasattr(logging, 'handlers'): 89 log_handler_logfile = logging.handlers.RotatingFileHandler( config.VISIONEGG_LOG_FILE, 90 maxBytes=maxBytes ) 91 else: 92 log_handler_logfile = logging.FileHandler( config.VISIONEGG_LOG_FILE ) 93 log_handler_logfile.setFormatter( log_formatter ) 94 logger.addHandler( log_handler_logfile ) 95 96 script_name = sys.argv[0] 97 if not script_name: 98 script_name = "(interactive shell)" 99 logger.info("Script "+script_name+" started Vision Egg %s with process id %d."%(VisionEgg.release_name,os.getpid())) 100 _default_logging_started = True
101 102 103 ############# Default exception handler ############# 104 105 if not sys.argv[0]: # Interactive mode 106 config.VISIONEGG_GUI_ON_ERROR = 0 107
109 - def handle_exception(self, exc_type, exc_value, exc_traceback):
110 global config 111 112 traceback_stream = StringIO.StringIO() 113 traceback.print_exception(exc_type,exc_value,exc_traceback,None,traceback_stream) 114 traceback_stream.seek(0) 115 116 try: 117 # don't send to stderr here (original exception handler does it) 118 logger.removeHandler( log_handler_stderr ) 119 removed_stderr = True 120 except: 121 removed_stderr = False 122 123 logger.critical(traceback_stream.read()) 124 125 if removed_stderr: 126 logger.addHandler( log_handler_stderr ) 127 128 if config is not None: 129 if config.VISIONEGG_GUI_ON_ERROR and config.VISIONEGG_TKINTER_OK: 130 # Should really check if any GUI windows are open and only do this then 131 132 # close any open screens 133 if hasattr(config,'_open_screens'): 134 for screen in config._open_screens: 135 screen.close() 136 137 traceback_stream = StringIO.StringIO() 138 traceback.print_tb(exc_traceback,None,traceback_stream) 139 traceback_stream.seek(0) 140 141 pygame_bug_workaround = False # do we need to workaround pygame bug? 142 if hasattr(config,"_pygame_started"): 143 if config._pygame_started: 144 pygame_bug_workaround = True 145 if sys.platform.startswith('linux'): # doesn't affect linux for some reason 146 pygame_bug_workaround = False 147 if not pygame_bug_workaround: 148 if hasattr(config,'_Tkinter_used'): 149 if config._Tkinter_used: 150 import GUI 151 GUI.showexception(exc_type, exc_value, traceback_stream.getvalue()) 152 153 # continue on with normal exception processing: 154 __keep_config__ = config # bizarre that the exception handler changes our values... 155 self.orig_hook(exc_type, exc_value, exc_traceback) 156 config = __keep_config__ # but we work around it!
157
158 - def __init__(self):
159 self._sys = sys # preserve ref to sys module 160 self.orig_hook = self._sys.excepthook # keep copy 161 sys.excepthook = self.handle_exception
162
163 - def __del__(self):
164 self._sys.excepthook = self.orig_hook # restore original
165
166 -def watch_exceptions():
167 """Catch exceptions, log them, and optionally open GUI.""" 168 global _exception_hook_keeper 169 _exception_hook_keeper = _ExceptionHookKeeper()
170
172 """Stop catching exceptions, returning to previous state.""" 173 global _exception_hook_keeper 174 del _exception_hook_keeper
175 176 if config.VISIONEGG_ALWAYS_START_LOGGING: 177 start_default_logging() 178 watch_exceptions() 179 if len(config._delayed_configuration_log_warnings) != 0: 180 logger = logging.getLogger('VisionEgg.Configuration') 181 for msg in config._delayed_configuration_log_warnings: 182 logger.warning( msg ) 183 184 ############ A base class finder utility function ########### 185
187 """A function to find all base classes.""" 188 result = [klass] 189 for base_class in klass.__bases__: 190 for base_base_class in recursive_base_class_finder(base_class): 191 result.append(base_base_class) 192 # Make only a single copy of each class found 193 result2 = [] 194 for r in result: 195 if r not in result2: 196 result2.append(r) 197 return result2
198 199 ############# Setup timing functions ############# 200 201 if sys.platform == "win32": 202 # on win32, time.clock() theoretically has better resolution than time.time() 203 true_time_func = time.clock 204 else: 205 true_time_func = time.time 206 # XXX Possible To-Do: 207 # On MacOSX use AudioGetCurrentHostTime() and 208 # AudioConvertHostTimeToNanos() # 209 210 config._FRAMECOUNT_ABSOLUTE = 0 # initialize global variable
212 return config._FRAMECOUNT_ABSOLUTE / float(config.VISIONEGG_MONITOR_REFRESH_HZ)
213 214 time_func = true_time_func # name of time function Vision Egg programs should use 215 218 221
222 -def timing_func():
223 """DEPRECATED. Use time_func instead""" 224 warnings.warn("timing_func() has been changed to time_func(). " 225 "This warning will only be issued once, but each call to " 226 "timing_func() will be slower than if you called time_func() " 227 "directly", DeprecationWarning, stacklevel=2) 228 return time_func()
229 230 #################################################################### 231 # 232 # Parameters 233 # 234 #################################################################### 235
236 -class Parameters:
237 """Parameter container. 238 239 Simple empty class to act something like a C struct.""" 240 pass
241
242 -class ParameterDefinition( dict ):
243 """Define parameters used in ClassWithParameters 244 """ 245 DEPRECATED = 1 246 OPENGL_ENUM = 2
247
248 -class ClassWithParameters( object ):
249 """Base class for any class that uses parameters. 250 251 Any class that uses parameters potentially modifiable in realtime 252 should be a subclass of ClassWithParameters. This class enforces 253 type checking and sets default values. 254 255 Any subclass of ClassWithParameters can define two class (not 256 instance) attributes, "parameters_and_defaults" and 257 "constant_parameters_and_defaults". These are dictionaries where 258 the key is a string containing the name of the parameter and the 259 the value is a tuple of length 2 containing the default value and 260 the type. For example, an acceptable dictionary would be 261 {"parameter1" : (1.0, ve_types.Real)} 262 263 See the ParameterTypes module for more information about types. 264 265 """ 266 267 parameters_and_defaults = ParameterDefinition({}) # empty for base class 268 constant_parameters_and_defaults = ParameterDefinition({}) # empty for base class 269 270 __slots__ = ('parameters','constant_parameters') # limit access only to specified attributes 271
272 - def __getstate__(self):
273 """support for being pickled""" 274 result = {} 275 classes = recursive_base_class_finder(self.__class__) 276 for klass in classes: 277 if hasattr(klass,'__slots__'): 278 for attr in klass.__slots__: 279 if hasattr(self,attr): 280 result[attr] = getattr(self,attr) 281 return result
282
283 - def __setstate__(self,dict):
284 """support for being unpickled""" 285 for attr in dict.keys(): 286 setattr(self,attr,dict[attr])
287 288 __safe_for_unpickling__ = True # tell python 2.2 we know what we're doing 289
290 - def __init__(self,**kw):
291 """Create self.parameters and set values.""" 292 self.constant_parameters = Parameters() # create self.constant_parameters 293 self.parameters = Parameters() # create self.parameters 294 295 # Get a list of all classes this instance is derived from 296 classes = recursive_base_class_finder(self.__class__) 297 298 done_constant_parameters_and_defaults = [] 299 done_parameters_and_defaults = [] 300 done_kw = [] 301 302 # Fill self.parameters with parameter names and set to default values 303 for klass in classes: 304 if klass == object: 305 continue # base class of new style classes - ignore 306 # Create self.parameters and set values to keyword argument if found, 307 # otherwise to default value. 308 # 309 # If a class didn't override base class's parameters_and_defaults dictionary, don't deal with it twice 310 if hasattr(klass, 'parameters_and_defaults') and klass.parameters_and_defaults not in done_parameters_and_defaults: 311 for parameter_name in klass.parameters_and_defaults.keys(): 312 # Make sure this parameter key/value pair doesn't exist already 313 if hasattr(self.parameters,parameter_name): 314 raise ValueError("More than one definition of parameter '%s'"%parameter_name) 315 # Get default value and the type 316 value,tipe = klass.parameters_and_defaults[parameter_name][:2] 317 # Check tipe is valid 318 if not ve_types.is_parameter_type_def(tipe): 319 raise ValueError("In definition of parameter '%s', %s is not a valid type declaration."%(parameter_name,tipe)) 320 # Was a non-default value passed for this parameter? 321 if kw.has_key(parameter_name): 322 value = kw[parameter_name] 323 done_kw.append(parameter_name) 324 # Allow None to pass as acceptable value -- lets __init__ set own defaults 325 if value is not None: 326 # Check anything other than None 327 if not tipe.verify(value): 328 print 'parameter_name',parameter_name 329 print 'value',value 330 print 'type value',type(value) 331 print 'isinstance(value, numpy.ndarray)',isinstance(value, numpy.ndarray) 332 print 'tipe',tipe 333 334 if not isinstance(value, numpy.ndarray): 335 value_str = str(value) 336 else: 337 if Numeric.multiply.reduce(value.shape) < 10: 338 value_str = str(value) # print array if it's smallish 339 else: 340 value_str = "(array data)" # don't pring if it's big 341 raise TypeError("Parameter '%s' value %s is type %s (not type %s) in %s"%(parameter_name,value_str,type(value),tipe,self)) 342 setattr(self.parameters,parameter_name,value) 343 done_parameters_and_defaults.append(klass.parameters_and_defaults) 344 345 # Same thing as above for self.constant_parameters: 346 # 347 # Create self.constant_parameters and set values to keyword argument if found, 348 # otherwise to default value. 349 # 350 # If a class didn't override base class's parameters_and_defaults dictionary, don't deal with it twice 351 if hasattr(klass, 'constant_parameters_and_defaults') and klass.constant_parameters_and_defaults not in done_constant_parameters_and_defaults: 352 for parameter_name in klass.constant_parameters_and_defaults.keys(): 353 # Make sure this parameter key/value pair doesn't exist already 354 if hasattr(self.parameters,parameter_name): 355 raise ValueError("Definition of '%s' as variable parameter and constant parameter."%parameter_name) 356 if hasattr(self.constant_parameters,parameter_name): 357 raise ValueError("More than one definition of constant parameter '%s'"%parameter_name) 358 # Get default value and the type 359 value,tipe = klass.constant_parameters_and_defaults[parameter_name][:2] 360 361 if not ve_types.is_parameter_type_def(tipe): 362 raise ValueError("In definition of constant parameter '%s', %s is not a valid type declaration."%(parameter_name,tipe)) 363 # Was a non-default value passed for this parameter? 364 if kw.has_key(parameter_name): 365 value = kw[parameter_name] 366 done_kw.append(parameter_name) 367 # Allow None to pass as acceptable value -- lets __init__ set own default 368 if type(value) != type(None): 369 # Check anything other than None 370 if not tipe.verify(value): 371 if type(value) != Numeric.ArrayType: 372 value_str = str(value) 373 else: 374 if Numeric.multiply.reduce(value.shape) < 10: 375 value_str = str(value) # print array if it's smallish 376 else: 377 value_str = "(array data)" # don't pring if it's big 378 raise TypeError("Constant parameter '%s' value %s is type %s (not type %s) in %s"%(parameter_name,value_str,type(value),tipe,self)) 379 setattr(self.constant_parameters,parameter_name,value) 380 done_constant_parameters_and_defaults.append(klass.constant_parameters_and_defaults) 381 382 # Set self.parameters to the value in "kw" 383 for kw_parameter_name in kw.keys(): 384 if kw_parameter_name not in done_kw: 385 raise ValueError("parameter '%s' passed as keyword argument, but not specified by %s (or subclasses) as potential parameter"%(kw_parameter_name,self.__class__))
386
387 - def is_constant_parameter(self,parameter_name):
388 # Get a list of all classes this instance is derived from 389 classes = recursive_base_class_finder(self.__class__) 390 for klass in classes: 391 if klass == object: 392 continue # base class of new style classes - ignore 393 if klass.constant_parameters_and_defaults.has_key(parameter_name): 394 return True 395 # The for loop only completes if parameter_name is not in any subclass 396 return False
397
398 - def get_specified_type(self,parameter_name):
399 # Get a list of all classes this instance is derived from 400 classes = recursive_base_class_finder(self.__class__) 401 for klass in classes: 402 if klass == object: 403 continue # base class of new style classes - ignore 404 if klass.parameters_and_defaults.has_key(parameter_name): 405 return klass.parameters_and_defaults[parameter_name][1] 406 # The for loop only completes if parameter_name is not in any subclass 407 raise AttributeError("%s has no parameter named '%s'"%(self.__class__,parameter_name))
408
409 - def verify_parameters(self):
410 """Perform type check on all parameters""" 411 for parameter_name in dir(self.parameters): 412 if parameter_name.startswith('__'): 413 continue 414 require_type = self.get_specified_type(parameter_name) 415 this_type = ve_types.get_type(getattr(self.parameters,parameter_name)) 416 ve_types.assert_type(this_type,require_type)
417
418 - def set(self,**kw):
419 """Set a parameter with type-checked value 420 421 This is the slow but safe way to set parameters. It is recommended to 422 use this method in all but speed-critical portions of code. 423 """ 424 # Note that we don't overload __setattr__ because that would always slow 425 # down assignment, not just when it was convenient. 426 # 427 # (We could make a checked_parameters attribute though.) 428 for parameter_name in kw.keys(): 429 setattr(self.parameters,parameter_name,kw[parameter_name]) 430 require_type = self.get_specified_type(parameter_name) 431 value = kw[parameter_name] 432 this_type = ve_types.get_type(value) 433 ve_types.assert_type(this_type,require_type) 434 setattr(self.parameters,parameter_name,value)
435
436 -def get_type(value):
437 warnings.warn("VisionEgg.get_type() has been moved to "+\ 438 "VisionEgg.ParameterTypes.get_type()", 439 DeprecationWarning, stacklevel=2) 440 return ve_types.get_type(value)
441
442 -def assert_type(*args):
443 warnings.warn("VisionEgg.assert_type() has been moved to "+\ 444 "VisionEgg.ParameterTypes.assert_type()", 445 DeprecationWarning, stacklevel=2) 446 return ve_types.assert_type(*args)
447
448 -def _get_lowerleft(position,anchor,size):
449 """Private helper function 450 451 size is (width, height) 452 """ 453 if anchor == 'lowerleft': 454 lowerleft = position 455 else: 456 if len(position) > 2: z = position[2] 457 else: z = 0.0 458 if len(position) > 3: w = position[3] 459 else: w = 1.0 460 if z != 0.0: warnings.warn( "z coordinate (other than 0.0) specificed where anchor not 'lowerleft' -- cannot compute") 461 if w != 1.0: warnings.warn("w coordinate (other than 1.0) specificed where anchor not 'lowerleft' -- cannot compute") 462 if anchor == 'center': 463 lowerleft = (position[0] - size[0]/2.0, position[1] - size[1]/2.0) 464 elif anchor == 'lowerright': 465 lowerleft = (position[0] - size[0],position[1]) 466 elif anchor == 'upperright': 467 lowerleft = (position[0] - size[0],position[1] - size[1]) 468 elif anchor == 'upperleft': 469 lowerleft = (position[0],position[1] - size[1]) 470 elif anchor == 'left': 471 lowerleft = (position[0],position[1] - size[1]/2.0) 472 elif anchor == 'right': 473 lowerleft = (position[0] - size[0],position[1] - size[1]/2.0) 474 elif anchor == 'bottom': 475 lowerleft = (position[0] - size[0]/2.0,position[1]) 476 elif anchor == 'top': 477 lowerleft = (position[0] - size[0]/2.0,position[1] - size[1]) 478 else: 479 raise ValueError("No anchor position %s"%anchor) 480 return lowerleft
481
482 -def _get_center(position,anchor,size):
483 """Private helper function""" 484 if anchor == 'center': 485 center = position 486 else: 487 if len(position) > 2: z = position[2] 488 else: z = 0.0 489 if len(position) > 3: w = position[3] 490 else: w = 1.0 491 if z != 0.0: raise ValueError("z coordinate (other than 0.0) specificed where anchor not 'center' -- cannot compute") 492 if w != 1.0: raise ValueError("w coordinate (other than 1.0) specificed where anchor not 'center' -- cannot compute") 493 if anchor == 'lowerleft': 494 center = (position[0] + size[0]/2.0, position[1] + size[1]/2.0) 495 elif anchor == 'lowerright': 496 center = (position[0] - size[0]/2.0, position[1] + size[1]/2.0) 497 elif anchor == 'upperright': 498 center = (position[0] - size[0]/2.0, position[1] - size[1]/2.0) 499 elif anchor == 'upperleft': 500 center = (position[0] + size[0]/2.0, position[1] - size[1]/2.0) 501 elif anchor == 'left': 502 center = (position[0] + size[0]/2.0, position[1]) 503 elif anchor == 'right': 504 center = (position[0] - size[0]/2.0, position[1]) 505 elif anchor == 'bottom': 506 center = (position[0],position[1] + size[1]/2.0) 507 elif anchor == 'top': 508 center = (position[0],position[1] - size[1]/2.0) 509 else: 510 raise ValueError("No anchor position %s"%anchor) 511 return center
512

visionegg-1.2.1/doc/reference/html/VisionEgg.ClassWithParameters-class.html0000644000076500000240000003504311224565530026157 0ustar astrawstaff VisionEgg.ClassWithParameters
Package VisionEgg :: Class ClassWithParameters
[frames] | no frames]

Class ClassWithParameters

source code

object --+
         |
        ClassWithParameters

Base class for any class that uses parameters.

Any class that uses parameters potentially modifiable in realtime
should be a subclass of ClassWithParameters.  This class enforces
type checking and sets default values.

Any subclass of ClassWithParameters can define two class (not
instance) attributes, "parameters_and_defaults" and
"constant_parameters_and_defaults". These are dictionaries where
the key is a string containing the name of the parameter and the
the value is a tuple of length 2 containing the default value and
the type.  For example, an acceptable dictionary would be
{"parameter1" : (1.0, ve_types.Real)}

See the ParameterTypes module for more information about types.



Instance Methods
 
__getstate__(self)
support for being pickled
source code
 
__setstate__(self, dict)
support for being unpickled
source code
 
__init__(self, **kw)
Create self.parameters and set values.
source code
 
is_constant_parameter(self, parameter_name) source code
 
get_specified_type(self, parameter_name) source code
 
verify_parameters(self)
Perform type check on all parameters
source code
 
set(self, **kw)
Set a parameter with type-checked value This is the slow but safe way to set parameters.
source code

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = ParameterDefinition({})
  constant_parameters_and_defaults = ParameterDefinition({})
  __safe_for_unpickling__ = True
Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: object.__init__

set(self, **kw)

source code 
Set a parameter with type-checked value

This is the slow but safe way to set parameters.  It is recommended to
use this method in all but speed-critical portions of code.


visionegg-1.2.1/doc/reference/html/VisionEgg.Configuration-module.html0000644000076500000240000002753111224565530025224 0ustar astrawstaff VisionEgg.Configuration
Package VisionEgg :: Module Configuration
[frames] | no frames]

Module Configuration

source code


Load config values from environment, config file, or defaults.

Applications should not import this module directly.  Instead, 'import
VisionEgg' will result in an attribute 'VisionEgg.config', which has
the configuration options as attributes.

This module searches for configuration options from the following
places: environment variables, configuration file, generic defaults.
Environment variables take precedence over the configuration file,
which takes precedence over the generic defaults.

This module also determines the location of the Vision Egg
directories.  The VISIONEGG_SYSTEM_DIR directory is by default the
'VisionEgg' directory in Python's site-packages.  VISIONEGG_USER_DIR
is by default 'VisionEgg' in the directory specified by the
environment variable HOME, if it exists, and os.curdir otherwise.

You can create a configuration file that contains defaults for your
system.  This should be a text file with key/value pairs.  Blank lines
and anything after the pound symbol ('#') will be treated as a
comment.  Each key/value pairs should be on its own line and in the
format 'KEY=VALUE'.  By default the file 'VisionEgg.cfg' from the
VISIONEGG_USER_DIR or VISIONEGG_SYSTEM_DIR as specified above.
However, You can specify a different filename and directory by setting
the environment variable VISIONEGG_CONFIG_FILE.



Classes
  Config
Holds global Vision Egg configuration information.
Functions
 
save_settings()
Save the current values to the config file, overwriting what is there.
source code
Variables
  defaults = {'VISIONEGG_ALWAYS_START_LOGGING': 0, 'VISIONEGG_DO...
  extra_darwin_defaults = {'VISIONEGG_DARWIN_MAXPRIORITY_CONVENT...
Variables Details

defaults

Value:
{'VISIONEGG_ALWAYS_START_LOGGING': 0, 'VISIONEGG_DOUBLE_BUFFER': 1, 'V\
ISIONEGG_FRAMELESS_WINDOW': 0, 'VISIONEGG_FULLSCREEN': 0, 'VISIONEGG_G\
UI_INIT': 1, 'VISIONEGG_GAMMA_INVERT_RED': 2.1, 'VISIONEGG_GAMMA_INVER\
T_GREEN': 2.1, 'VISIONEGG_GAMMA_INVERT_BLUE': 2.1, 'VISIONEGG_GAMMA_FI\
LE': 'custom.ve_gamma', 'VISIONEGG_GAMMA_SOURCE': 'none', 'VISIONEGG_G\
UI_ON_ERROR': 1, 'VISIONEGG_HIDE_MOUSE': 1, 'VISIONEGG_LOG_FILE': 'Vis\
ionEgg.log', 'VISIONEGG_LOG_TO_STDERR': 1, 'VISIONEGG_MAXPRIORITY': 0,\
 'VISIONEGG_MONITOR_REFRESH_HZ': 60.0, 'VISIONEGG_MULTISAMPLE_SAMPLES'\
...

extra_darwin_defaults

Value:
{'VISIONEGG_DARWIN_MAXPRIORITY_CONVENTIONAL_NOT_REALTIME': 1, 'VISIONE\
GG_DARWIN_CONVENTIONAL_PRIORITY':-20, 'VISIONEGG_DARWIN_REALTIME_PERIO\
D_DENOM': 120, 'VISIONEGG_DARWIN_REALTIME_COMPUTATION_DENOM': 2400, 'V\
ISIONEGG_DARWIN_REALTIME_CONSTRAINT_DENOM': 1200, 'VISIONEGG_DARWIN_RE\
ALTIME_PREEMPTIBLE': 0, 'VISIONEGG_DARWIN_PTHREAD_PRIORITY': 'max',}

visionegg-1.2.1/doc/reference/html/VisionEgg.Configuration-pysrc.html0000644000076500000240000021320411224565530025071 0ustar astrawstaff VisionEgg.Configuration
Package VisionEgg :: Module Configuration
[frames] | no frames]

Source Code for Module VisionEgg.Configuration

  1  # The Vision Egg: Configuration 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Copyright (C) 2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Load config values from environment, config file, or defaults. 
 13   
 14  Applications should not import this module directly.  Instead, 'import 
 15  VisionEgg' will result in an attribute 'VisionEgg.config', which has 
 16  the configuration options as attributes. 
 17   
 18  This module searches for configuration options from the following 
 19  places: environment variables, configuration file, generic defaults. 
 20  Environment variables take precedence over the configuration file, 
 21  which takes precedence over the generic defaults. 
 22   
 23  This module also determines the location of the Vision Egg 
 24  directories.  The VISIONEGG_SYSTEM_DIR directory is by default the 
 25  'VisionEgg' directory in Python's site-packages.  VISIONEGG_USER_DIR 
 26  is by default 'VisionEgg' in the directory specified by the 
 27  environment variable HOME, if it exists, and os.curdir otherwise. 
 28   
 29  You can create a configuration file that contains defaults for your 
 30  system.  This should be a text file with key/value pairs.  Blank lines 
 31  and anything after the pound symbol ('#') will be treated as a 
 32  comment.  Each key/value pairs should be on its own line and in the 
 33  format 'KEY=VALUE'.  By default the file 'VisionEgg.cfg' from the 
 34  VISIONEGG_USER_DIR or VISIONEGG_SYSTEM_DIR as specified above. 
 35  However, You can specify a different filename and directory by setting 
 36  the environment variable VISIONEGG_CONFIG_FILE. 
 37   
 38  """ 
 39   
 40  # Warning: This code is a bit of a hack 
 41   
 42  import VisionEgg 
 43  import re, os, errno, sys                  # standard python packages 
 44  import ConfigParser 
 45   
 46  #################################################################### 
 47  # 
 48  #        Default configuration variables 
 49  # 
 50  #################################################################### 
 51   
 52  defaults= { 
 53      'VISIONEGG_ALWAYS_START_LOGGING': 0, 
 54      'VISIONEGG_DOUBLE_BUFFER':        1, 
 55      'VISIONEGG_FRAMELESS_WINDOW':     0, 
 56      'VISIONEGG_FULLSCREEN':           0, 
 57      'VISIONEGG_GUI_INIT':             1, 
 58      'VISIONEGG_GAMMA_INVERT_RED':     2.1, # only used in 'invert' mode 
 59      'VISIONEGG_GAMMA_INVERT_GREEN':   2.1, # only used in 'invert' mode 
 60      'VISIONEGG_GAMMA_INVERT_BLUE':    2.1, # only used in 'invert' mode 
 61      'VISIONEGG_GAMMA_FILE':           'custom.ve_gamma', # only used in 'file' mode 
 62      'VISIONEGG_GAMMA_SOURCE':         'none', #also 'invert' or 'file' 
 63      'VISIONEGG_GUI_ON_ERROR':         1, 
 64      'VISIONEGG_HIDE_MOUSE':           1, 
 65      'VISIONEGG_LOG_FILE':             'VisionEgg.log', 
 66      'VISIONEGG_LOG_TO_STDERR':        1, 
 67      'VISIONEGG_MAXPRIORITY':          0, 
 68      'VISIONEGG_MONITOR_REFRESH_HZ':   60.0, 
 69      'VISIONEGG_MULTISAMPLE_SAMPLES':  0, 
 70      'VISIONEGG_PREFERRED_BPP':        32, 
 71      'VISIONEGG_REQUEST_ALPHA_BITS':   8, 
 72      'VISIONEGG_REQUEST_BLUE_BITS':    8, 
 73      'VISIONEGG_REQUEST_GREEN_BITS':   8, 
 74      'VISIONEGG_REQUEST_RED_BITS':     8, 
 75      'VISIONEGG_REQUEST_STEREO':       0, 
 76      'VISIONEGG_SCREEN_W':             640, 
 77      'VISIONEGG_SCREEN_H':             480, 
 78      'VISIONEGG_SYNC_SWAP':            1, 
 79      'VISIONEGG_TKINTER_OK':           1, 
 80      'SYNCLYNC_PRESENT':               0, 
 81      } 
 82  if sys.platform.startswith('linux'): 
 83      defaults['VISIONEGG_PREFERRED_BPP']=24 
 84   
 85  extra_darwin_defaults = { 
 86      'VISIONEGG_DARWIN_MAXPRIORITY_CONVENTIONAL_NOT_REALTIME'  : 1, 
 87      'VISIONEGG_DARWIN_CONVENTIONAL_PRIORITY'                  : -20, # -20 is best priority 
 88      'VISIONEGG_DARWIN_REALTIME_PERIOD_DENOM'                  : 120, 
 89      'VISIONEGG_DARWIN_REALTIME_COMPUTATION_DENOM'             : 2400, 
 90      'VISIONEGG_DARWIN_REALTIME_CONSTRAINT_DENOM'              : 1200, 
 91      'VISIONEGG_DARWIN_REALTIME_PREEMPTIBLE'                   : 0, 
 92      'VISIONEGG_DARWIN_PTHREAD_PRIORITY'                      : 'max', 
 93  } 
 94   
95 -class Config:
96 """Holds global Vision Egg configuration information."""
97 - def __init__(self):
98 """Load global Vision Egg configuration information.""" 99 cfg = ConfigParser.ConfigParser() 100 101 if sys.executable == sys.argv[0]: # Windows binary 102 self.VISIONEGG_SYSTEM_DIR = os.curdir 103 self.VISIONEGG_USER_DIR = os.curdir 104 else: 105 # non-standard VisionEgg installations 106 try: 107 self.VISIONEGG_SYSTEM_DIR = os.environ['VISIONEGG_SYSTEM_DIR'] 108 except KeyError: 109 self.VISIONEGG_SYSTEM_DIR = os.path.split(__file__)[0] 110 user_dir = os.path.expanduser("~") 111 self.VISIONEGG_USER_DIR = os.path.join(user_dir,"VisionEgg") 112 113 # See if there's an environment variable for the config file 114 if 'VISIONEGG_CONFIG_FILE' in os.environ.keys(): 115 configFile = os.environ['VISIONEGG_CONFIG_FILE'] 116 else: 117 # Is there one in VISIONEGG_USER_DIR? 118 configFile = os.path.join(self.VISIONEGG_USER_DIR,"VisionEgg.cfg") 119 if not os.path.isfile(configFile): 120 configFile = os.path.join(self.VISIONEGG_SYSTEM_DIR,"VisionEgg.cfg") 121 if not os.path.isfile(configFile): 122 configFile = None # No file, use defaults specified in environment variables then here 123 124 print 'configFile',configFile 125 if configFile: 126 cfg.read(configFile) 127 else: 128 # pretend we have a config file 129 cfg.add_section('General') 130 for key in defaults.keys(): 131 cfg.set('General',key,str(defaults[key])) 132 if sys.platform == 'darwin': 133 cfg.add_section('darwin') 134 for key in extra_darwin_defaults.keys(): 135 cfg.set('darwin',key,str(extra_darwin_defaults[key])) 136 137 # Do the general stuff first 138 # Set the default values 139 for name in defaults.keys(): 140 if name in os.environ.keys(): 141 value = os.environ[name] 142 else: 143 value = defaults[name] 144 if isinstance(defaults[name], int): 145 if value == 'False': 146 value = 0 147 elif value == 'True': 148 value = 1 149 setattr(self,name,int(value)) 150 elif isinstance(defaults[name], float): 151 setattr(self,name,float(value)) 152 else: 153 setattr(self,name,value) 154 155 # Get the values from the configFile 156 general_options = cfg.options('General') 157 158 self._delayed_configuration_log_warnings = [] # chick and egg problem 159 # set defaults from config file 160 for option in general_options: 161 name = option.upper() 162 if name not in defaults.keys(): 163 self._delayed_configuration_log_warnings.append( 164 "While reading %s: The variable \"%s\" is not (anymore) a Vision Egg variable."%(os.path.abspath(configFile),option)) 165 continue 166 value = cfg.get('General',option) 167 if name in os.environ.keys(): 168 value = os.environ[name] 169 if isinstance(defaults[name], int): 170 if value == 'False': 171 value = 0 172 elif value == 'True': 173 value = 1 174 setattr(self,name,int(value)) 175 elif isinstance(defaults[name], float): 176 setattr(self,name,float(value)) 177 else: 178 setattr(self,name,value) 179 180 # Do platform specific stuff 181 # Set the default values 182 platform_name = sys.platform 183 extra_name = "extra_%s_defaults"%(platform_name,) 184 if extra_name in globals().keys(): 185 extra_defaults = globals()[extra_name] 186 for name in extra_defaults.keys(): 187 setattr(self,name,extra_defaults[name]) 188 189 # Get the values from the configFile 190 platform_options = cfg.options(platform_name) 191 for option in platform_options: 192 name = option.upper() 193 if name not in extra_defaults.keys(): 194 raise KeyError("No Vision Egg configuration variable \"%s\""%option) 195 value = cfg.get(platform_name,option) 196 if name in os.environ.keys(): 197 value = os.environ[name] 198 if isinstance(extra_defaults[name], int): 199 if value == 'False': 200 value = 0 201 elif value == 'True': 202 value = 1 203 setattr(self,name,int(value)) 204 elif isinstance(extra_defaults[name], float): 205 setattr(self,name,float(value)) 206 else: 207 setattr(self,name,value) 208 209 if(configFile): 210 self.VISIONEGG_CONFIG_FILE = os.path.abspath(configFile) 211 else: 212 self.VISIONEGG_CONFIG_FILE = None
213
214 -def save_settings():
215 """Save the current values to the config file, overwriting what is there.""" 216 217 dont_save = ['VISIONEGG_CONFIG_FILE', 218 'VISIONEGG_SYSTEM_DIR', 219 'VISIONEGG_USER_DIR', 220 ] 221 222 if not VisionEgg.config.VISIONEGG_CONFIG_FILE: 223 raise RuntimeError("No config file in use.") 224 re_setting_finder = re.compile(r"^\s?((?:VISIONEGG_[A-Z_]*)|(?:SYNCLYNC_[A-Z_]*))\s?=\s?(\S*)\s?$",re.IGNORECASE) 225 226 orig_file = open(VisionEgg.config.VISIONEGG_CONFIG_FILE,"r") 227 orig_lines = orig_file.readlines() 228 229 line_ending = orig_lines[0][-2:] 230 if line_ending[0] not in ['\r','\n','\l']: 231 line_ending = line_ending[1] 232 233 out_file_lines = [] 234 235 saved_config_vars = [] 236 237 for line in orig_lines: 238 out_line = line # The output is the same as the input unless there's a match 239 match = re_setting_finder.match(line) 240 if match: 241 name = match.group(1).upper() 242 if name in VisionEgg.config.__dict__.keys(): 243 if name not in dont_save: 244 # Change the output line 245 out_line = ("%s = %s"%(name,getattr(VisionEgg.config,name,))) + line_ending 246 saved_config_vars.append(name) 247 out_file_lines.append(out_line) 248 249 # Close and reopen orig_file in write mode 250 orig_file.close() 251 orig_file = open(VisionEgg.config.VISIONEGG_CONFIG_FILE,"w") 252 for line in out_file_lines: 253 orig_file.write(line)
254

visionegg-1.2.1/doc/reference/html/VisionEgg.Configuration.Config-class.html0000644000076500000240000001221311224565530026237 0ustar astrawstaff VisionEgg.Configuration.Config
Package VisionEgg :: Module Configuration :: Class Config
[frames] | no frames]

Class Config

source code

Holds global Vision Egg configuration information.



Instance Methods
 
__init__(self)
Load global Vision Egg configuration information.
source code
visionegg-1.2.1/doc/reference/html/VisionEgg.Core-module.html0000644000076500000240000004207011224565530023300 0ustar astrawstaff VisionEgg.Core
Package VisionEgg :: Module Core
[frames] | no frames]

Module Core

source code


Core Vision Egg functionality.

This module contains the architectural foundations of the Vision Egg.



Classes
  Screen
An OpenGL window, possibly displayed across multiple displays.
  ProjectionBaseClass
Converts stimulus coordinates to viewport coordinates.
  Projection
for use of OpenGL PROJECTION_MATRIX...
  ModelView
for use of OpenGL MODELVIEW_MATRIX...
  OrthographicProjection
An orthographic projection.
  OrthographicProjectionNoZClip
An orthographic projection without Z clipping.
  SimplePerspectiveProjection
A simplified perspective projection.
  PerspectiveProjection
A perspective projection.
  Stimulus
Base class for a stimulus.
  Viewport
Connects stimuli to a screen.
  FixationSpot
A rectangle stimulus, typically used as a fixation spot.
  FrameTimer
Time inter frame intervals and compute frames per second.
  Message
DEPRECATED Handles message/warning/error printing, exception raising.
  Presentation
Handles the timing and coordination of stimulus presentation.
  Controller
Control parameters.
  ConstantController
Set parameters to a constant value.
  EvalStringController
Set parameters using dynamically interpreted Python string.
  ExecStringController
Set parameters using potentially complex Python string.
  FunctionController
Set parameters using a Python function.
  EncapsulatedController
Set parameters by encapsulating another Controller.
Functions
 
sum(values) source code
 
swap_buffers() source code
 
get_default_screen()
Make an instance of Screen using a GUI window or from config file.
source code
 
add_gl_assumption(gl_variable, required_value, failure_callback)
Save assumptions for later checking once OpenGL context created.
source code
 
init_gl_extension(prefix, name) source code
 
post_gl_init()
Called by Screen instance.
source code
Variables
  message = VisionEgg.Deprecated.Message()
  gl_assumptions = []
Function Details

post_gl_init()

source code 
Called by Screen instance. Requires OpenGL context to be created.


visionegg-1.2.1/doc/reference/html/VisionEgg.Core-pysrc.html0000644000076500000240000237011311224565530023157 0ustar astrawstaff VisionEgg.Core
Package VisionEgg :: Module Core
[frames] | no frames]

Source Code for Module VisionEgg.Core

   1  # The Vision Egg: Core 
   2  # 
   3  # Copyright (C) 2001-2004 Andrew Straw 
   4  # Copyright (C) 2004-2008 California Institute of Technology 
   5  # 
   6  # URL: <http://www.visionegg.org/> 
   7  # 
   8  # Distributed under the terms of the GNU Lesser General Public License 
   9  # (LGPL). See LICENSE.TXT that came with this file. 
  10   
  11  """ 
  12  Core Vision Egg functionality. 
  13   
  14  This module contains the architectural foundations of the Vision Egg. 
  15   
  16  """ 
  17   
  18  #################################################################### 
  19  # 
  20  #        Import all the necessary packages 
  21  # 
  22  #################################################################### 
  23   
  24  import sys, types, math, time, os               # standard Python modules 
  25  import StringIO 
  26   
  27  import logging                                  # available in Python 2.3 
  28   
  29  import VisionEgg                                # Vision Egg base module (__init__.py) 
  30  import VisionEgg.PlatformDependent              # platform dependent Vision Egg C code 
  31  import VisionEgg.ParameterTypes as ve_types     # Vision Egg type checking 
  32  import VisionEgg.GLTrace                        # Allows tracing of all OpenGL calls 
  33  import VisionEgg.ThreeDeeMath                   # OpenGL math simulation 
  34   
  35  import pygame                                   # pygame handles OpenGL window setup 
  36  import pygame.locals 
  37  import pygame.display 
  38   
  39  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
  40   
  41  import numpy 
  42  import numpy.oldnumeric as Numeric # emulate old Numeric Python package 
  43   
  44  # Define "sum" if it's not available as Python function 
  45  try: 
  46      sum 
  47  except NameError: 
  48      import operator 
49 - def sum( values ):
50 return reduce(operator.add, values )
51
52 -def swap_buffers():
53 VisionEgg.config._FRAMECOUNT_ABSOLUTE += 1 54 return pygame.display.flip()
55 56 #################################################################### 57 # 58 # Screen 59 # 60 #################################################################### 61
62 -class Screen(VisionEgg.ClassWithParameters):
63 """An OpenGL window, possibly displayed across multiple displays. 64 65 A Screen instance is an OpenGL window for the Vision Egg to draw 66 in. For an instance of Screen to do anything useful, it must 67 contain one or more instances of the Viewport class and one or 68 more instances of the Stimulus class. 69 70 Currently, only one OpenGL window is supported by the library with 71 which the Vision Egg initializes graphics (pygame/SDL). However, 72 this need not limit display to a single physical display device. 73 Many video drivers, for example, allow applications to treat two 74 separate monitors as one large array of contiguous pixels. By 75 sizing a window such that it occupies both monitors and creating 76 separate viewports for the portion of the window on each monitor, 77 a multiple screen effect can be created. 78 79 Public read-only variables 80 ========================== 81 size -- Tuple of 2 integers specifying width and height 82 83 Parameters 84 ========== 85 bgcolor -- background color (AnyOf(Sequence3 of Real or Sequence4 of Real)) 86 Default: (0.5, 0.5, 0.5, 0.0) 87 88 Constant Parameters 89 =================== 90 alpha_bits -- number of bits per pixel for alpha channel. Can be set with VISIONEGG_REQUEST_ALPHA_BITS (UnsignedInteger) 91 Default: (determined at runtime) 92 blue_bits -- number of bits per pixel for blue channel. Can be set with VISIONEGG_REQUEST_BLUE_BITS (UnsignedInteger) 93 Default: (determined at runtime) 94 double_buffer -- use double buffering? Can be set with VISIONEGG_DOUBLE_BUFFER (Boolean) 95 Default: (determined at runtime) 96 frameless -- remove standard window frame? Can be set with VISIONEGG_FRAMELESS_WINDOW (Boolean) 97 Default: (determined at runtime) 98 fullscreen -- use full screen? Can be set with VISIONEGG_FULLSCREEN (Boolean) 99 Default: (determined at runtime) 100 green_bits -- number of bits per pixel for green channel. Can be set with VISIONEGG_REQUEST_GREEN_BITS (UnsignedInteger) 101 Default: (determined at runtime) 102 hide_mouse -- hide the mouse cursor? Can be set with VISIONEGG_HIDE_MOUSE (Boolean) 103 Default: (determined at runtime) 104 is_stereo -- allocate stereo framebuffers? Can be set with VISIONEGG_REQUEST_STEREO (Boolean) 105 Default: (determined at runtime) 106 maxpriority -- raise priority? (platform dependent) Can be set with VISIONEGG_MAXPRIORITY (Boolean) 107 Default: (determined at runtime) 108 multisample_samples -- preferred number of multisamples for FSAA (UnsignedInteger) 109 Default: (determined at runtime) 110 preferred_bpp -- preferred bits per pixel (bit depth) Can be set with VISIONEGG_PREFERRED_BPP (UnsignedInteger) 111 Default: (determined at runtime) 112 red_bits -- number of bits per pixel for red channel. Can be set with VISIONEGG_REQUEST_RED_BITS (UnsignedInteger) 113 Default: (determined at runtime) 114 size -- size (units: pixels) Can be set with VISIONEGG_SCREEN_W and VISIONEGG_SCREEN_H (Sequence2 of Real) 115 Default: (determined at runtime) 116 sync_swap -- synchronize buffer swaps to vertical sync? Can be set with VISIONEGG_SYNC_SWAP (Boolean) 117 Default: (determined at runtime) 118 """ 119 120 parameters_and_defaults = VisionEgg.ParameterDefinition({ 121 'bgcolor':((0.5,0.5,0.5,0.0), 122 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 123 ve_types.Sequence4(ve_types.Real)), 124 'background color',), 125 }) 126 127 constant_parameters_and_defaults = VisionEgg.ParameterDefinition({ 128 'size':(None, 129 ve_types.Sequence2(ve_types.Real), 130 'size (units: pixels) Can be set with VISIONEGG_SCREEN_W and VISIONEGG_SCREEN_H'), 131 'fullscreen':(None, 132 ve_types.Boolean, 133 'use full screen? Can be set with VISIONEGG_FULLSCREEN'), 134 'double_buffer':(None, 135 ve_types.Boolean, 136 'use double buffering? Can be set with VISIONEGG_DOUBLE_BUFFER'), 137 'preferred_bpp':(None, 138 ve_types.UnsignedInteger, 139 'preferred bits per pixel (bit depth) Can be set with VISIONEGG_PREFERRED_BPP'), 140 'maxpriority':(None, 141 ve_types.Boolean, 142 'raise priority? (platform dependent) Can be set with VISIONEGG_MAXPRIORITY'), 143 'hide_mouse':(None, 144 ve_types.Boolean, 145 'hide the mouse cursor? Can be set with VISIONEGG_HIDE_MOUSE'), 146 'frameless':(None, 147 ve_types.Boolean, 148 'remove standard window frame? Can be set with VISIONEGG_FRAMELESS_WINDOW'), 149 'sync_swap':(None, 150 ve_types.Boolean, 151 'synchronize buffer swaps to vertical sync? Can be set with VISIONEGG_SYNC_SWAP'), 152 'red_bits':(None, 153 ve_types.UnsignedInteger, 154 'number of bits per pixel for red channel. Can be set with VISIONEGG_REQUEST_RED_BITS'), 155 'green_bits':(None, 156 ve_types.UnsignedInteger, 157 'number of bits per pixel for green channel. Can be set with VISIONEGG_REQUEST_GREEN_BITS'), 158 'blue_bits':(None, 159 ve_types.UnsignedInteger, 160 'number of bits per pixel for blue channel. Can be set with VISIONEGG_REQUEST_BLUE_BITS'), 161 'alpha_bits':(None, 162 ve_types.UnsignedInteger, 163 'number of bits per pixel for alpha channel. Can be set with VISIONEGG_REQUEST_ALPHA_BITS'), 164 'is_stereo':(None, 165 ve_types.Boolean, 166 'allocate stereo framebuffers? Can be set with VISIONEGG_REQUEST_STEREO'), 167 'multisample_samples':(None, # support added by Mark Halko 168 ve_types.UnsignedInteger, 169 'preferred number of multisamples for FSAA'), 170 }) 171 172 __slots__ = ( 173 '__cursor_visible_func__', 174 '__pygame_quit__', 175 '_put_pixels_texture_stimulus', 176 '_pixel_coord_projection', 177 ) 178
179 - def __init__(self,**kw):
180 logger = logging.getLogger('VisionEgg.Core') 181 182 VisionEgg.ClassWithParameters.__init__(self,**kw) 183 184 cp = self.constant_parameters # shorthand 185 if cp.size is None: 186 cp.size = (VisionEgg.config.VISIONEGG_SCREEN_W, 187 VisionEgg.config.VISIONEGG_SCREEN_H) 188 if cp.double_buffer is None: 189 cp.double_buffer = VisionEgg.config.VISIONEGG_DOUBLE_BUFFER 190 if cp.fullscreen is None: 191 cp.fullscreen = VisionEgg.config.VISIONEGG_FULLSCREEN 192 if cp.preferred_bpp is None: 193 cp.preferred_bpp = VisionEgg.config.VISIONEGG_PREFERRED_BPP 194 if cp.maxpriority is None: 195 cp.maxpriority = VisionEgg.config.VISIONEGG_MAXPRIORITY 196 if cp.hide_mouse is None: 197 cp.hide_mouse = VisionEgg.config.VISIONEGG_HIDE_MOUSE 198 if cp.frameless is None: 199 cp.frameless = VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW 200 if cp.sync_swap is None: 201 cp.sync_swap = VisionEgg.config.VISIONEGG_SYNC_SWAP 202 if cp.red_bits is None: 203 cp.red_bits = VisionEgg.config.VISIONEGG_REQUEST_RED_BITS 204 if cp.green_bits is None: 205 cp.green_bits = VisionEgg.config.VISIONEGG_REQUEST_GREEN_BITS 206 if cp.blue_bits is None: 207 cp.blue_bits = VisionEgg.config.VISIONEGG_REQUEST_BLUE_BITS 208 if cp.alpha_bits is None: 209 cp.alpha_bits = VisionEgg.config.VISIONEGG_REQUEST_ALPHA_BITS 210 if cp.is_stereo is None: 211 cp.is_stereo = VisionEgg.config.VISIONEGG_REQUEST_STEREO 212 if cp.multisample_samples is None: 213 cp.multisample_samples = VisionEgg.config.VISIONEGG_MULTISAMPLE_SAMPLES 214 215 if VisionEgg.config.SYNCLYNC_PRESENT: 216 global synclync # import into global namespace 217 import synclync 218 try: 219 VisionEgg.config._SYNCLYNC_CONNECTION = synclync.SyncLyncConnection() 220 except synclync.SyncLyncError, x: 221 logger.warning( "Could not connect to SyncLync device (SyncLyncError: %s)."%str(x)) 222 VisionEgg.config._SYNCLYNC_CONNECTION = None 223 else: 224 logger.info( "Connected to SyncLync device" ) 225 else: 226 VisionEgg.config._SYNCLYNC_CONNECTION = None 227 228 # Attempt to synchronize buffer swapping with vertical sync 229 if cp.sync_swap: 230 sync_success = VisionEgg.PlatformDependent.sync_swap_with_vbl_pre_gl_init() 231 232 # Initialize pygame stuff 233 # if sys.platform == "darwin": # bug in Mac OS X version of pygame 234 # pygame.init() 235 pygame.display.init() 236 237 if hasattr(pygame.display,"gl_set_attribute"): 238 pygame.display.gl_set_attribute(pygame.locals.GL_RED_SIZE,cp.red_bits) 239 pygame.display.gl_set_attribute(pygame.locals.GL_GREEN_SIZE,cp.green_bits) 240 pygame.display.gl_set_attribute(pygame.locals.GL_BLUE_SIZE,cp.blue_bits) 241 pygame.display.gl_set_attribute(pygame.locals.GL_ALPHA_SIZE,cp.alpha_bits) 242 pygame.display.gl_set_attribute(pygame.locals.GL_STEREO,cp.is_stereo) 243 #Request FSAA 244 if cp.multisample_samples > 0 : 245 pygame.display.gl_set_attribute(pygame.locals.GL_MULTISAMPLEBUFFERS,1) 246 pygame.display.gl_set_attribute(pygame.locals.GL_MULTISAMPLESAMPLES,cp.multisample_samples) 247 else: 248 logger.debug("Could not request or query exact bit depths, " 249 "alpha or stereo because you need " 250 "pygame release 1.4.9 or greater. This is " 251 "only of concern if you use a stimulus that " 252 "needs this. In that case, the stimulus " 253 "should check for the desired feature(s).") 254 255 if not hasattr(pygame.display,"set_gamma_ramp"): 256 logger.debug("set_gamma_ramp function not available " 257 "because you need pygame release 1.5 or " 258 "greater. This is only of concern if you " 259 "need this feature.") 260 pygame.display.set_caption("Vision Egg") 261 262 flags = pygame.locals.OPENGL 263 if cp.double_buffer: 264 flags = flags | pygame.locals.DOUBLEBUF 265 if cp.fullscreen: 266 flags = flags | pygame.locals.FULLSCREEN 267 if cp.frameless: 268 flags = flags | pygame.locals.NOFRAME 269 270 try_bpp = cp.preferred_bpp 271 272 append_str = "" 273 if cp.fullscreen: 274 screen_mode = "fullscreen" 275 else: 276 screen_mode = "window" 277 if hasattr(pygame.display,"gl_set_attribute"): 278 append_str = " (%d %d %d %d RGBA)."%(cp.red_bits, 279 cp.green_bits, 280 cp.blue_bits, 281 cp.alpha_bits) 282 283 logger.info("Requesting %s %d x %d %d bpp%s"% 284 (screen_mode,self.size[0],self.size[1], 285 try_bpp,append_str)) 286 287 pygame.display.set_mode(self.size, flags, try_bpp ) 288 # set a global variable so we know workaround avoid pygame bug 289 VisionEgg.config._pygame_started = 1 290 291 try: 292 if sys.platform != 'darwin': 293 pygame.display.set_icon(pygame.transform.scale(pygame.image.load( 294 os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR, 295 'data','visionegg.bmp')).convert(),(32,32))) 296 else: 297 import AppKit # requires PyObjC, which is required by pygame osx 298 im = AppKit.NSImage.alloc() 299 im.initWithContentsOfFile_( 300 os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR, 301 'data','visionegg.tif')) 302 AppKit.NSApplication.setApplicationIconImage_(AppKit.NSApp(),im) 303 304 except Exception,x: 305 logger.info("Error while trying to set_icon: %s: %s"% 306 (str(x.__class__),str(x))) 307 308 global gl_vendor, gl_renderer, gl_version 309 gl_vendor = gl.glGetString(gl.GL_VENDOR) 310 gl_renderer = gl.glGetString(gl.GL_RENDERER) 311 gl_version = gl.glGetString(gl.GL_VERSION) 312 313 logger.info("OpenGL %s, %s, %s (PyOpenGL %s)"% 314 (gl_version, gl_renderer, gl_vendor, gl.__version__)) 315 316 if gl_renderer == "GDI Generic" and gl_vendor == "Microsoft Corporation": 317 logger.warning("Using default Microsoft Windows OpenGL " 318 "drivers. Please (re-)install the latest " 319 "video drivers from your video card " 320 "manufacturer to get hardware accelerated " 321 "performance.") 322 if gl_renderer == "Mesa GLX Indirect" and gl_vendor == "VA Linux Systems, Inc.": 323 logger.warning("Using default Mesa GLX drivers. Please " 324 "(re-)install the latest video drivers from " 325 "your video card manufacturer or DRI " 326 "project to get hardware accelarated " 327 "performance.") 328 # Set values to unknown and fill based on OpenGL values 329 cp.red_bits = None 330 cp.green_bits = None 331 cp.blue_bits = None 332 cp.alpha_bits = None 333 cp.is_stereo = None 334 got_bpp = pygame.display.Info().bitsize 335 append_str = '' 336 if hasattr(pygame.display,"gl_get_attribute"): 337 # Fill in values as known 338 cp.red_bits = pygame.display.gl_get_attribute(pygame.locals.GL_RED_SIZE) 339 cp.green_bits = pygame.display.gl_get_attribute(pygame.locals.GL_GREEN_SIZE) 340 cp.blue_bits = pygame.display.gl_get_attribute(pygame.locals.GL_BLUE_SIZE) 341 cp.alpha_bits = pygame.display.gl_get_attribute(pygame.locals.GL_ALPHA_SIZE) 342 cp.is_stereo = pygame.display.gl_get_attribute(pygame.locals.GL_STEREO) 343 if cp.is_stereo: stereo_string = ' stereo' 344 else: stereo_string = '' 345 append_str = " (%d %d %d %d RGBA%s)"%( 346 cp.red_bits,cp.green_bits,cp.blue_bits,cp.alpha_bits, 347 stereo_string) 348 logger.info("Video system reports %d bpp%s."%(got_bpp,append_str)) 349 if got_bpp < try_bpp: 350 logger.warning("Video system reports %d bits per pixel, " 351 "while your program requested %d. Can you " 352 "adjust your video drivers?"%(got_bpp, 353 try_bpp)) 354 # Save the address of these functions so they can be called 355 # when closing the screen. 356 self.__cursor_visible_func__ = pygame.mouse.set_visible 357 self.__pygame_quit__ = pygame.quit 358 359 #Check FSAA requests 360 if cp.multisample_samples>0 : 361 if hasattr(pygame.display,"gl_set_attribute"): 362 got_ms_buf = pygame.display.gl_get_attribute(pygame.locals.GL_MULTISAMPLEBUFFERS) 363 got_ms_samp = pygame.display.gl_get_attribute(pygame.locals.GL_MULTISAMPLESAMPLES) 364 if got_ms_samp < cp.multisample_samples : 365 logger.warning("Video system reports %d multisample samples, " 366 "while you requested %d. FSAA requires " 367 "SDL > 1.2.6, check that it is installed."%(got_ms_samp, cp.multisample_samples)) 368 369 # Attempt to synchronize buffer swapping with vertical sync again 370 if cp.sync_swap: 371 if not sync_success: 372 if not VisionEgg.PlatformDependent.sync_swap_with_vbl_post_gl_init(): 373 cp.sync_swap = False 374 logger.warning("Unable to detect or automatically " 375 "synchronize buffer swapping with " 376 "vertical retrace. May be possible " 377 "by manually adjusting video " 378 "drivers. (Look for 'Enable " 379 "Vertical Sync' or similar.) If " 380 "buffer swapping is not " 381 "synchronized, frame by frame " 382 "control will not be possible. " 383 "Because of this, you will probably " 384 "get a warning about calculated " 385 "frames per second different than " 386 "specified.") 387 # Check previously made OpenGL assumptions now that we have OpenGL window 388 post_gl_init() 389 390 if cp.hide_mouse: 391 self.__cursor_visible_func__(0) 392 393 # Attempt to set maximum priority (This may not be the best 394 # place in the code to do it because it's an application-level 395 # thing, not a screen-level thing, but it fits reasonably well 396 # here for now.) 397 if cp.maxpriority: 398 VisionEgg.PlatformDependent.set_priority() # defaults to max priority 399 400 if hasattr(VisionEgg.config,'_open_screens'): 401 VisionEgg.config._open_screens.append(self) 402 else: 403 VisionEgg.config._open_screens = [self]
404 405 # Use Python descriptors (introduced in Python 2.2) to link size 406 # attribute to constant_parameters.size.
407 - def get_size(self): return self.constant_parameters.size
408 - def set_size(self, value): raise RuntimeError("Attempting to set read-only value")
409 size = property(get_size,set_size) 410
411 - def get_framebuffer_as_image(self, 412 buffer='back', 413 format=gl.GL_RGB, 414 position=(0,0), 415 anchor='lowerleft', 416 size=None, # if None, use full screen 417 ):
418 """get pixel values from framebuffer to PIL image""" 419 import Image # Could import this at the beginning of the file, but it breaks sometimes. 420 421 fb_array = self.get_framebuffer_as_array(buffer=buffer, 422 format=format, 423 position=position, 424 anchor=anchor, 425 size=size, 426 ) 427 size = fb_array.shape[1], fb_array.shape[0] 428 if format == gl.GL_RGB: 429 pil_mode = 'RGB' 430 elif format == gl.GL_RGBA: 431 pil_mode = 'RGBA' 432 fb_image = Image.fromstring(pil_mode,size,fb_array.tostring()) 433 fb_image = fb_image.transpose( Image.FLIP_TOP_BOTTOM ) 434 return fb_image
435
436 - def get_framebuffer_as_array(self, 437 buffer='back', 438 format=gl.GL_RGB, 439 position=(0,0), 440 anchor='lowerleft', 441 size=None, # if None, use full screen 442 ):
443 """get pixel values from framebuffer to Numeric array"""# (SLOW)""" 444 if size is None: 445 size = self.size 446 lowerleft = VisionEgg._get_lowerleft(position,anchor,size) 447 if buffer == 'front': 448 gl.glReadBuffer( gl.GL_FRONT ) 449 elif buffer == 'back': 450 gl.glReadBuffer( gl.GL_BACK ) 451 else: 452 raise ValueError('No support for "%s" framebuffer'%buffer) 453 454 # according to Apple's glGrab demo, this should force DMA transfers: 455 gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 4) 456 gl.glPixelStorei(gl.GL_PACK_ROW_LENGTH, 0) 457 gl.glPixelStorei(gl.GL_PACK_SKIP_ROWS, 0) 458 gl.glPixelStorei(gl.GL_PACK_SKIP_PIXELS, 0) 459 if gl_version >= '1.2' and hasattr(gl,'GL_BGRA'): 460 framebuffer_pixels = gl.glReadPixels(lowerleft[0],lowerleft[1], 461 size[0],size[1], 462 gl.GL_BGRA, 463 gl.GL_UNSIGNED_INT_8_8_8_8_REV) 464 raw_format = 'BGRA' 465 else: 466 framebuffer_pixels = gl.glReadPixels(lowerleft[0],lowerleft[1], 467 size[0],size[1], 468 gl.GL_RGBA, 469 gl.GL_UNSIGNED_BYTE) 470 raw_format = 'RGBA' 471 fb_array = Numeric.fromstring(framebuffer_pixels,Numeric.UInt8) 472 fb_array = Numeric.reshape(fb_array,(size[1],size[0],4)) 473 # These work, but I don't know why. There must be something I 474 # don't understand about byte ordering! 475 if format == gl.GL_RGB: 476 if raw_format == 'BGRA': 477 fb_array = fb_array[:,:,1:] 478 elif raw_format == 'RGBA': 479 fb_array = fb_array[:,:,:3] 480 elif format == gl.GL_RGBA: 481 if raw_format == 'BGRA': 482 alpha = fb_array[:,:,0,Numeric.NewAxis] 483 fb_array = fb_array[:,:,1:] 484 fb_array = Numeric.concatenate( (fb_array,alpha), axis=2) 485 elif raw_format == 'RGBA': 486 pass 487 else: 488 raise NotImplementedError("Only RGB and RGBA formats currently supported") 489 return fb_array
490
491 - def put_pixels(self, 492 pixels=None, 493 position=(0,0), 494 anchor='lowerleft', 495 scale_x=1.0, # "zoom" the pixels 496 scale_y=1.0, # "zoom" the pixels 497 texture_min_filter=gl.GL_NEAREST, # only used if scale < 1.0 498 texture_mag_filter=gl.GL_NEAREST, # only used if scale > 1.0 499 internal_format=gl.GL_RGB, # pixel data converted to this format in texture (gl.GL_RGBA also useful) 500 ):
501 """Put pixel values to screen. 502 503 Pixel values become texture data using the VisionEgg.Textures 504 module. Any source of texture data accepted by that module is 505 accepted here. 506 507 This function could be sped up by allocating a fixed OpenGL texture object. 508 509 """ 510 511 import VisionEgg.Textures # import here to avoid import loop 512 make_new_texture_object = 0 513 if not hasattr(self, "_put_pixels_texture_stimulus"): 514 make_new_texture_object = 1 515 else: 516 if internal_format != self._put_pixels_texture_stimulus.constant_parameters.internal_format: 517 make_new_texture_object = 1 518 if make_new_texture_object: 519 # For speed, don't do this on anything other than 1st run 520 texture = VisionEgg.Textures.Texture(pixels) 521 on_screen_size = (texture.size[0]*scale_x, texture.size[1]*scale_y) 522 t = VisionEgg.Textures.TextureStimulus(texture=texture, 523 position=position, 524 anchor=anchor, 525 size=on_screen_size, 526 mipmaps_enabled=0, 527 texture_min_filter=texture_min_filter, 528 texture_mag_filter=texture_mag_filter, 529 internal_format = internal_format, 530 ) 531 self._put_pixels_texture_stimulus = t # rename 532 self._pixel_coord_projection = OrthographicProjection(left=0, 533 right=self.size[0], 534 bottom=0, 535 top=self.size[1], 536 z_clip_near=0.0, 537 z_clip_far=1.0) 538 else: 539 # We've run once before and therefore already have a 540 # texture stimulus. (XXX In the future, make use of 541 # already assigned texture object and use put_sub_image 542 # for speed.) 543 self._put_pixels_texture_stimulus.parameters.texture = VisionEgg.Textures.Texture(pixels) 544 545 self._pixel_coord_projection.push_and_set_gl_projection() # Save projection 546 self._put_pixels_texture_stimulus.draw() # Draw pixels as texture 547 548 gl.glMatrixMode(gl.GL_PROJECTION) # Restore projection 549 gl.glPopMatrix()
550
551 - def query_refresh_rate(self):
553
554 - def measure_refresh_rate(self,average_over_seconds=0.1):
555 """Measure the refresh rate. Assumes swap buffers synced.""" 556 start_time = VisionEgg.time_func() 557 duration_sec = 0.0 558 num_frames = 0 559 while duration_sec < average_over_seconds: 560 swap_buffers() 561 now = VisionEgg.time_func() 562 num_frames += 1 563 duration_sec = now - start_time 564 if duration_sec > 0.0: 565 fps = num_frames / duration_sec 566 else: 567 fps = 0.0 568 return fps
569
570 - def clear(self):
571 """Called by Presentation instance. Clear the screen.""" 572 573 c = self.parameters.bgcolor # Shorthand 574 if len(c) == 4: 575 gl.glClearColor(*c) 576 else: 577 gl.glClearColor(c[0],c[1],c[2],0.0) # set alpha to 0.0 unless specified 578 gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
579
580 - def make_current(self):
581 """Called by Viewport instance. Makes screen active for drawing. 582 583 Can not be implemented until multiple screens are possible.""" 584 pass
585
586 - def set_gamma_ramp(self,*args,**kw):
587 """Set the gamma_ramp, if supported. 588 589 Call pygame.display.set_gamma_ramp, if available. 590 591 Returns True on success, False otherwise.""" 592 if not hasattr(pygame.display,"set_gamma_ramp"): 593 logger = logging.getLogger('VisionEgg.Core') 594 logger.error("Need pygame 1.5 or greater for set_gamma_ramp function") 595 return False 596 if pygame.display.set_gamma_ramp(*args,**kw): 597 return True 598 else: 599 return False
600
601 - def close(self):
602 """Close the screen. 603 604 You can call this to close the screen. Not necessary during 605 normal operation because it gets automatically deleted.""" 606 # Close pygame if possible 607 if hasattr(VisionEgg.config,'_open_screens'): 608 if self in VisionEgg.config._open_screens: 609 VisionEgg.config._open_screens.remove(self) 610 if len(VisionEgg.config._open_screens) == 0: 611 # no more open screens 612 if hasattr(self,"__cursor_visible_func__"): 613 self.__cursor_visible_func__(1) 614 pygame.quit() 615 # No access to the cursor visible function anymore 616 if hasattr(self,"__cursor_visible_func__"): 617 del self.__cursor_visible_func__
618
619 - def __del__(self):
620 # Make sure mouse is visible after screen closed. 621 if hasattr(self,"__cursor_visible_func__"): 622 try: 623 self.__cursor_visible_func__(1) 624 self.__pygame_quit__() 625 except pygame.error, x: 626 if str(x) != 'video system not initialized': 627 raise
628
629 - def create_default():
630 """Alternative constructor using configuration variables. 631 632 Most of the time you can create and instance of Screen using 633 this method. If your script needs explicit control of the 634 Screen parameters, initialize with the normal constructor. 635 636 Uses VisionEgg.config.VISIONEGG_GUI_INIT to determine how the 637 default screen parameters should are determined. If this 638 value is 0, the values from VisionEgg.cfg are used. If this 639 value is 1, a GUI panel is opened and allows manual settings 640 of the screen parameters. """ 641 642 global VisionEgg # Allow "VisionEgg.config" instead of just "config" 643 if VisionEgg.config.VISIONEGG_GUI_INIT: 644 import VisionEgg.GUI # Could import in beginning, but no need if not using GUI 645 window = VisionEgg.GUI.GraphicsConfigurationWindow() 646 window.mainloop() # All this does is adjust VisionEgg.config 647 if not window.clicked_ok: 648 sys.exit() # User wants to quit 649 screen = None 650 try: 651 screen = Screen(size=(VisionEgg.config.VISIONEGG_SCREEN_W, 652 VisionEgg.config.VISIONEGG_SCREEN_H), 653 fullscreen=VisionEgg.config.VISIONEGG_FULLSCREEN, 654 preferred_bpp=VisionEgg.config.VISIONEGG_PREFERRED_BPP, 655 bgcolor=(0.5,0.5,0.5,0.0), 656 maxpriority=VisionEgg.config.VISIONEGG_MAXPRIORITY, 657 frameless=VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW, 658 hide_mouse=VisionEgg.config.VISIONEGG_HIDE_MOUSE) 659 finally: 660 if screen is None: 661 # Opening screen failed. Let's do any cleanup that Screen.__init__ missed. 662 try: 663 pygame.mouse.set_visible(1) # make sure mouse is visible 664 pygame.quit() # close screen 665 except pygame.error, x: 666 if str(x) != 'video system not initialized': 667 raise 668 669 if screen is None: 670 raise RuntimeError("Screen open failed. Check your error log for a traceback.") 671 672 gamma_source = VisionEgg.config.VISIONEGG_GAMMA_SOURCE.lower() 673 if gamma_source != 'none': 674 if gamma_source == 'invert': 675 native_red = VisionEgg.config.VISIONEGG_GAMMA_INVERT_RED 676 native_green = VisionEgg.config.VISIONEGG_GAMMA_INVERT_GREEN 677 native_blue = VisionEgg.config.VISIONEGG_GAMMA_INVERT_BLUE 678 red = screen._create_inverted_gamma_ramp( native_red ) 679 green = screen._create_inverted_gamma_ramp( native_green ) 680 blue = screen._create_inverted_gamma_ramp( native_blue ) 681 gamma_set_string = "linearized gamma lookup tables to correct "+\ 682 "monitor with native gammas (%f, %f, %f) RGB"%( 683 native_red, 684 native_green, 685 native_blue) 686 elif gamma_source == 'file': 687 filename = VisionEgg.config.VISIONEGG_GAMMA_FILE 688 red, green, blue = screen._open_gamma_file(filename) 689 gamma_set_string = "set gamma lookup tables from data in file %s"%os.path.abspath(filename) 690 else: 691 raise ValueError("Unknown gamma source: '%s'"%gamma_source) 692 logger = logging.getLogger('VisionEgg.Core') 693 if not screen.set_gamma_ramp(red,green,blue): 694 logger.warning( "Setting gamma ramps failed." ) 695 else: 696 logger.info( "Gamma set sucessfully: %s"%gamma_set_string ) 697 return screen
698 create_default = staticmethod(create_default) 699
700 - def _create_inverted_gamma_ramp(self, gamma):
701 # c is a constant scale factor. It is always 1.0 when 702 # luminance is normalized to range [0.0,1.0] and input units 703 # in range [0.0,1.0], as is OpenGL standard. 704 c = 1.0 705 inc = 1.0/255 706 target_luminances = Numeric.arange(0.0,1.0+inc,inc) 707 output_ramp = Numeric.zeros(target_luminances.shape,Numeric.Int) 708 for i in range(len(target_luminances)): 709 L = target_luminances[i] 710 if L == 0.0: 711 v_88fp = 0 712 else: 713 v = math.exp( (math.log(L) - math.log(c)) /gamma) 714 v_88fp = int(round((v*255) * 256)) # convert to from [0.0,1.0] floating point to [0.0,255.0] 8.8 fixed point 715 output_ramp[i] = v_88fp # 8.8 fixed point format 716 return list(output_ramp) # convert to Python list
717
718 - def _open_gamma_file(self, filename):
719 fd = open(filename,"r") 720 gamma_values = [] 721 for line in fd.readlines(): 722 line = line.strip() # remove leading/trailing whitespace 723 if line.startswith("#"): # comment, ignore 724 continue 725 gamma_values.append( map(int, line.split() ) ) 726 if len(gamma_values[-1]) != 3: 727 raise ValueError("expected 3 values per gamma entry") 728 if len(gamma_values) != 256: 729 raise ValueError("expected 256 gamma entries") 730 red, green, blue = zip(*gamma_values) 731 return red,green,blue
732
733 -def get_default_screen():
734 """Make an instance of Screen using a GUI window or from config file.""" 735 return Screen.create_default()
736 737 #################################################################### 738 # 739 # Projection and derived classes 740 # 741 #################################################################### 742
743 -class ProjectionBaseClass(VisionEgg.ClassWithParameters):
744 """Converts stimulus coordinates to viewport coordinates. 745 746 This is an abstract base class which should be subclassed for 747 actual use. 748 749 Parameters 750 ========== 751 matrix -- matrix specifying projection (Sequence4x4 of Real) 752 Default: [[1 0 0 0] 753 [0 1 0 0] 754 [0 0 1 0] 755 [0 0 0 1]] 756 """ 757 758 # WARNING: This implementation should really get cleaned up and 759 # NOT use OpenGL except when purposefully setting matrices. 760 761 parameters_and_defaults = VisionEgg.ParameterDefinition({ 762 'matrix':( Numeric.identity(4), # 4x4 identity matrix 763 ve_types.Sequence4x4(ve_types.Real), 764 'matrix specifying projection'), 765 }) 766 767 __slots__ = ( 768 'projection_type', 769 ) 770
771 - def __init__(self,**kw):
772 VisionEgg.ClassWithParameters.__init__(self,**kw) 773 self.projection_type = None # derived class must override
774
775 - def _get_matrix_type(self):
776 if self.projection_type == gl.GL_PROJECTION: 777 return gl.GL_PROJECTION_MATRIX 778 elif self.projection_type == gl.GL_MODELVIEW: 779 return gl.GL_MODELVIEW_MATRIX
780
781 - def apply_to_gl(self):
782 """Set the OpenGL projection matrix.""" 783 gl.glMatrixMode(self.projection_type) 784 gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0
785
786 - def set_gl_modelview(self):
787 """Set the OpenGL modelview matrix.""" 788 gl.glMatrixMode(gl.GL_MODELVIEW) 789 gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0
790
791 - def set_gl_projection(self):
792 """Set the OpenGL projection matrix.""" 793 gl.glMatrixMode(gl.GL_PROJECTION) 794 gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0
795
796 - def push_and_set_gl_projection(self):
797 """Set the OpenGL projection matrix, pushing current projection matrix to stack.""" 798 gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix 799 gl.glPushMatrix() 800 gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0
801
802 - def translate(self,x,y,z):
803 """Compose a translation and set the OpenGL projection matrix.""" 804 gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix 805 gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 806 gl.glTranslatef(x,y,z) 807 self.parameters.matrix = gl.glGetFloatv(self._get_matrix_type())
808
809 - def stateless_translate(self,x,y,z):
810 """Compose a translation without changing OpenGL state.""" 811 M = VisionEgg.ThreeDeeMath.TransformMatrix(self.parameters.matrix) 812 M.translate(x,y,z) 813 self.parameters.matrix = M.get_matrix()
814
815 - def rotate(self,angle_degrees,x,y,z):
816 """Compose a rotation and set the OpenGL projection matrix.""" 817 gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix 818 gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 819 gl.glRotatef(angle_degrees,x,y,z) 820 self.parameters.matrix = gl.glGetFloatv(self._get_matrix_type())
821
822 - def stateless_rotate(self,angle_degrees,x,y,z):
823 """Compose a rotation without changing OpenGL state.""" 824 M = VisionEgg.ThreeDeeMath.TransformMatrix(self.parameters.matrix) 825 M.rotate(angle_degrees,x,y,z) 826 self.parameters.matrix = M.get_matrix()
827
828 - def scale(self,x,y,z):
829 """Compose a rotation and set the OpenGL projection matrix.""" 830 gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix 831 gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 832 gl.glScalef(x,y,z) 833 self.parameters.matrix = gl.glGetFloatv(self._get_matrix_type())
834
835 - def stateless_scale(self,x,y,z):
836 """Compose a rotation without changing OpenGL state.""" 837 M = VisionEgg.ThreeDeeMath.TransformMatrix(self.parameters.matrix) 838 M.scale(x,y,z) 839 self.parameters.matrix = M.get_matrix()
840
841 - def get_matrix(self):
842 return self.parameters.matrix
843
844 - def look_at(self, eye, center, up ):
845 # Basically the same as gluLookAt 846 def normalize(vec): 847 numpy_vec = numpy.asarray(vec) 848 mag = math.sqrt(numpy.sum(numpy_vec**2)) 849 return numpy_vec / mag
850 def cross(vec1,vec2): 851 return ( vec1[1]*vec2[2] - vec1[2]*vec2[1], 852 vec1[2]*vec2[0] - vec1[0]*vec2[2], 853 vec1[0]*vec2[1] - vec1[1]*vec2[0] )
854 forward = numpy.array(( center[0] - eye[0], 855 center[1] - eye[1], 856 center[2] - eye[2]),'f') 857 forward = normalize(forward) 858 side = cross(forward,up) 859 side = normalize(side) 860 new_up = cross(side,forward) # recompute up 861 # XXX I might have to transpose this matrix 862 m = Numeric.array([[side[0], new_up[0], -forward[0], 0.0], 863 [side[1], new_up[1], -forward[1], 0.0], 864 [side[2], new_up[2], -forward[2], 0.0], 865 [ 0.0, 0.0, 0.0, 1.0]]) 866 # XXX This should get optimized -- don't do it in OpenGL 867 gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix 868 gl.glPushMatrix() # save current matrix 869 try: 870 gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 871 gl.glMultMatrixf(m) 872 gl.glTranslatef(-eye[0],-eye[1],-eye[2]) 873 self.parameters.matrix = gl.glGetFloatv(self._get_matrix_type()) 874 finally: 875 gl.glPopMatrix() # save current matrix 876
877 - def eye_2_clip(self,eye_coords_vertex):
878 """Transform eye coordinates to clip coordinates""" 879 m = Numeric.array(self.parameters.matrix) 880 v = Numeric.array(eye_coords_vertex) 881 homog = VisionEgg.ThreeDeeMath.make_homogeneous_coord_rows(v) 882 r = numpy.dot(homog,m) 883 if len(homog.shape) > len(v.shape): 884 r = Numeric.reshape(r,(4,)) 885 return r
886 - def clip_2_norm_device(self,clip_coords_vertex):
887 """Transform clip coordinates to normalized device coordinates""" 888 v = numpy.array(clip_coords_vertex) 889 homog = VisionEgg.ThreeDeeMath.make_homogeneous_coord_rows(v) 890 err=numpy.seterr(all='ignore') 891 r = (homog/homog[:,3,numpy.newaxis])[:,:3] 892 numpy.seterr(**err) 893 if len(homog.shape) > len(v.shape): 894 r = Numeric.reshape(r,(3,)) 895 return r
896 - def eye_2_norm_device(self,eye_coords_vertex):
897 """Transform eye coordinates to normalized device coordinates""" 898 return self.clip_2_norm_device(self.eye_2_clip(eye_coords_vertex))
899
900 - def apply_to_vertex(self,vertex):
901 """Perform multiplication on vertex to get transformed result""" 902 M = VisionEgg.ThreeDeeMath.TransformMatrix(matrix=self.parameters.matrix) 903 r = M.transform_vertices([vertex]) 904 return r[0]
905
906 - def apply_to_vertices(self,vertices):
907 """Perform multiplication on vertex to get transformed result""" 908 M = VisionEgg.ThreeDeeMath.TransformMatrix(matrix=self.parameters.matrix) 909 r = M.transform_vertices(vertices) 910 return r
911
912 -class Projection(ProjectionBaseClass):
913 """for use of OpenGL PROJECTION_MATRIX 914 915 Parameters 916 ========== 917 matrix -- matrix specifying projection (Sequence4x4 of Real) 918 Default: [[1 0 0 0] 919 [0 1 0 0] 920 [0 0 1 0] 921 [0 0 0 1]] 922 """ 923
924 - def __init__(self,*args,**kw):
925 ProjectionBaseClass.__init__(self,*args,**kw) 926 self.projection_type = gl.GL_PROJECTION
927
928 -class ModelView(ProjectionBaseClass):
929 """for use of OpenGL MODELVIEW_MATRIX 930 931 Parameters 932 ========== 933 matrix -- matrix specifying projection (Sequence4x4 of Real) 934 Default: [[1 0 0 0] 935 [0 1 0 0] 936 [0 0 1 0] 937 [0 0 0 1]] 938 """ 939
940 - def __init__(self,*args,**kw):
941 ProjectionBaseClass.__init__(self,*args,**kw) 942 self.projection_type = gl.GL_MODELVIEW
943
944 -class OrthographicProjection(Projection):
945 """An orthographic projection. 946 947 Parameters 948 ========== 949 matrix -- matrix specifying projection (Sequence4x4 of Real) 950 Default: [[1 0 0 0] 951 [0 1 0 0] 952 [0 0 1 0] 953 [0 0 0 1]] 954 """ 955
956 - def __init__(self,left=0.0,right=640.0,bottom=0.0,top=480.0,z_clip_near=0.0,z_clip_far=1.0):
957 """Create an orthographic projection. 958 959 Defaults to map x eye coordinates in the range [0,640], y eye 960 coordinates [0,480] and clip coordinates [0,1] to [0,1]. 961 Therefore, if the viewport is 640 x 480, eye coordinates 962 correspond 1:1 with window (pixel) coordinates. Only points 963 between these clipping planes will be displayed. 964 """ 965 966 # using Numeric (from the OpenGL spec): 967 matrix = Numeric.array([[ 2./(right-left), 0., 0., -(right+left)/(right-left)], 968 [ 0., 2./(top-bottom), 0., -(top+bottom)/(top-bottom)], 969 [ 0., 0., -2./(z_clip_far-z_clip_near), -(z_clip_far+z_clip_near)/(z_clip_far-z_clip_near)], 970 [ 0., 0., 0., 1.0]]) 971 matrix = Numeric.transpose(matrix) # convert to OpenGL format 972 973 ## same as above, but use OpenGL 974 #gl.glMatrixMode(gl.GL_PROJECTION) 975 #gl.glPushMatrix() # save current matrix 976 #gl.glLoadIdentity() 977 #gl.glOrtho(left,right,bottom,top,z_clip_near,z_clip_far) 978 #matrix = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) 979 #gl.glPopMatrix() # restore original matrix 980 981 Projection.__init__(self,**{'matrix':matrix})
982
983 -class OrthographicProjectionNoZClip(Projection):
984 """An orthographic projection without Z clipping. 985 986 Parameters 987 ========== 988 matrix -- matrix specifying projection (Sequence4x4 of Real) 989 Default: [[1 0 0 0] 990 [0 1 0 0] 991 [0 0 1 0] 992 [0 0 0 1]] 993 """ 994
995 - def __init__(self,left=0.0,right=640.0,bottom=0.0,top=480.0):
996 """Create an orthographic projection without Z clipping. 997 998 Defaults to map x eye coordinates in the range [0,640] and y 999 eye coordinates [0,480] -> [0,1]. Therefore, if the viewport 1000 is 640 x 480, eye coordinates correspond 1:1 with window 1001 (pixel) coordinates. 1002 """ 1003 1004 # using Numeric (from the OpenGL spec): 1005 matrix = Numeric.array([[ 2./(right-left), 0, 0, -(right+left)/(right-left)], 1006 [ 0, 2./(top-bottom), 0, -(top+bottom)/(top-bottom)], 1007 [ 0, 0, -1, -1.], 1008 [ 0, 0, 0, 1]]) 1009 matrix = Numeric.transpose(matrix) # convert to OpenGL format 1010 1011 Projection.__init__(self,**{'matrix':matrix})
1012
1013 -class SimplePerspectiveProjection(Projection):
1014 """A simplified perspective projection. 1015 1016 Parameters 1017 ========== 1018 matrix -- matrix specifying projection (Sequence4x4 of Real) 1019 Default: [[1 0 0 0] 1020 [0 1 0 0] 1021 [0 0 1 0] 1022 [0 0 0 1]] 1023 """ 1024
1025 - def __init__(self,fov_x=45.0,z_clip_near = 0.1,z_clip_far=10000.0,aspect_ratio=4.0/3.0):
1026 matrix = self._compute_matrix(fov_x,z_clip_near,z_clip_far,aspect_ratio) 1027 Projection.__init__(self,**{'matrix':matrix})
1028
1029 - def _compute_matrix(self,fov_x=45.0,z_clip_near = 0.1,z_clip_far=10000.0,aspect_ratio=4.0/3.0):
1030 """Compute a 4x4 projection matrix that performs a perspective distortion.""" 1031 fov_y = fov_x / aspect_ratio 1032 # This is a translation of what gluPerspective does: 1033 #glu.gluPerspective(fov_y,aspect_ratio,z_clip_near,z_clip_far) 1034 radians = fov_y / 2.0 * math.pi / 180.0 1035 delta_z = z_clip_far - z_clip_near 1036 sine = math.sin(radians) 1037 if (delta_z == 0.0) or (sine == 0.0) or (aspect_ratio == 0.0): 1038 raise ValueError("Invalid parameters passed to SimpleProjection.__init__()") 1039 cotangent = math.cos(radians) / sine 1040 matrix = Numeric.zeros((4,4),'f') 1041 matrix[0][0] = cotangent/aspect_ratio 1042 matrix[1][1] = cotangent 1043 matrix[2][2] = -(z_clip_far + z_clip_near) / delta_z 1044 matrix[2][3] = -1.0 # XXX this 1045 matrix[3][2] = -2.0 * z_clip_near * z_clip_far / delta_z # XXX and this might cause the matrix to need to be transposed 1046 matrix[3][3] = 0.0 1047 return matrix
1048
1049 -class PerspectiveProjection(Projection):
1050 """A perspective projection. 1051 1052 Parameters 1053 ========== 1054 matrix -- matrix specifying projection (Sequence4x4 of Real) 1055 Default: [[1 0 0 0] 1056 [0 1 0 0] 1057 [0 0 1 0] 1058 [0 0 0 1]] 1059 """ 1060
1061 - def __init__(self,left,right,bottom,top,near,far):
1062 # XXX right now this is done in OpenGL, we should do it ourselves 1063 gl.glMatrixMode(gl.GL_PROJECTION) # Set OpenGL matrix state to modify the projection matrix 1064 gl.glPushMatrix() 1065 gl.glLoadIdentity() # Clear the projection matrix 1066 gl.glFrustum(left,right,bottom,top,near,far) # Let GL create a matrix and compose it 1067 matrix = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) 1068 gl.glPopMatrix() 1069 if matrix is None: 1070 # OpenGL wasn't started 1071 raise RuntimeError("OpenGL matrix operations can only take place once OpenGL context started.") 1072 if type(matrix) != Numeric.ArrayType: 1073 matrix = Numeric.array(matrix) # Convert to Numeric array 1074 Projection.__init__(self,**{'matrix':matrix})
1075 1076 #################################################################### 1077 # 1078 # Stimulus - Base class 1079 # 1080 #################################################################### 1081
1082 -class Stimulus(VisionEgg.ClassWithParameters):
1083 """Base class for a stimulus. 1084 1085 Any stimulus element should be a subclass of this Stimulus class. 1086 The draw() method contains the code executed before every buffer 1087 swap in order to render the stimulus to the frame buffer. It 1088 should execute as quickly as possible. The init_gl() method must 1089 be called before the first call to draw() so that any internal 1090 data, OpenGL display lists, and OpenGL:texture objects can be 1091 established. 1092 1093 To illustrate the concept of the Stimulus class, here is a 1094 description of several methods of drawing two spots. If your 1095 experiment displays two spots simultaneously, you could create two 1096 instances of (a single subclass of) Stimulus, varying parameters 1097 so each draws at a different location. Another possibility is to 1098 create one instance of a subclass that draws two spots. Another, 1099 somewhat obscure, possibility is to create a single instance and 1100 add it to two different viewports. (Something that will not work 1101 would be adding the same instance two times to the same viewport. 1102 It would also get drawn twice, although at exactly the same 1103 location.) 1104 1105 OpenGL is a 'state machine', meaning that it has internal 1106 parameters whose values vary and affect how it operates. Because 1107 of this inherent uncertainty, there are only limited assumptions 1108 about the state of OpenGL that an instance of Stimulus should 1109 expect when its draw() method is called. Because the Vision Egg 1110 loops through stimuli this also imposes some important behaviors: 1111 1112 First, the framebuffer will contain the results of any drawing 1113 operations performed since the last buffer swap by other instances 1114 of (subclasses of) Stimulus. Therefore, the order in which stimuli 1115 are present in the stimuli list of an instance of Viewport may be 1116 important. Additionally, if there are overlapping viewports, the 1117 order in which viewports are added to an instance of Screen is 1118 important. 1119 1120 Second, previously established OpenGL display lists and OpenGL 1121 texture objects will be available. The __init__() method should 1122 establish these things. 1123 1124 Third, there are several OpenGL state variables which are 1125 commonly set by subclasses of Stimulus, and which cannot be 1126 assumed to have any particular value at the time draw() is called. 1127 These state variables are: blending mode and function, texture 1128 state and environment, the matrix mode (modelview or projection), 1129 the modelview matrix, depth mode and settings. Therefore, if the 1130 draw() method depends on specific values for any of these states, 1131 it must specify its own values to OpenGL. 1132 1133 Finally, a well-behaved Stimulus subclass resets any OpenGL state 1134 values other than those listed above to their initial state before 1135 draw() and init_gl() were called. In other words, before your 1136 stimulus changes the state of an OpenGL variable, use 1137 glGetBoolean, glGetInteger, glGetFloat, or a similar function to 1138 query its value and restore it later. For example, upon calling 1139 the draw() method, the projection matrix will be that which was 1140 set by the viewport. If the draw() method alters the projection 1141 matrix, it must be restored. The glPushMatrix() and glPopMatrix() 1142 commands provide an easy way to do this. 1143 1144 The default projection of Viewport maps eye coordinates in a 1:1 1145 fashion to window coordinates (in other words, it sets eye 1146 coordinates to use pixel units from the lower left corner of the 1147 viewport). Therefore the default parameters for a stimulus should 1148 specify pixel coordinates if possible (such as for a 2D 1149 stimulus). Assuming a window size of 640 by 480 for the default 1150 parameters is a pretty safe way to do things. 1151 1152 Also, be sure to check for any assumptions made about the system 1153 in the __init__ method. For example, if your stimulus needs alpha 1154 in the framebuffer, check the value of 1155 glGetIntegerv(GL_ALPHA_BITS) and raise an exception if it is not 1156 available. 1157 """ 1158
1159 - def __init__(self,**kw):
1160 """Instantiate and get ready to draw. 1161 1162 Set parameter values and create anything needed to draw the 1163 stimulus including OpenGL state variables such display lists 1164 and texture objects. 1165 1166 """ 1167 VisionEgg.ClassWithParameters.__init__(self,**kw)
1168
1169 - def draw(self):
1170 """Draw the stimulus. (Called by Viewport instance.) 1171 1172 This method is called every frame. This method actually 1173 performs the OpenGL calls to draw the stimulus. 1174 1175 """ 1176 pass
1177 1178 #################################################################### 1179 # 1180 # Viewport 1181 # 1182 #################################################################### 1183
1184 -class Viewport(VisionEgg.ClassWithParameters):
1185 """Connects stimuli to a screen. 1186 1187 A viewport defines a (possibly clipped region) of the screen on 1188 which stimuli are drawn. 1189 1190 A screen may have multiple viewports. The viewports may be 1191 overlapping. 1192 1193 A viewport may have multiple stimuli. 1194 1195 A single stimulus may be drawn simultaneously by several 1196 viewports, although this is typically useful only for 3D stimuli 1197 to represent different views of the same object. 1198 1199 The coordinates of the stimulus are converted to screen 1200 coordinates via several steps, the most important of which is the 1201 projection, which is defined by an instance of the Projection 1202 class. 1203 1204 By default, a viewport has a projection which maps eye coordinates 1205 to viewport coordinates in 1:1 manner. In other words, eye 1206 coordinates specify pixel location in the viewport. 1207 1208 For cases where pixel units are not natural to describe 1209 coordinates of a stimulus, the application should specify the a 1210 projection other than the default. This is usually the case for 1211 3D stimuli. 1212 1213 For details of the projection and clipping process, see the 1214 section 'Coordinate Transformations' in the book/online document 1215 'The OpenGL Graphics System: A Specification' 1216 1217 Parameters 1218 ========== 1219 anchor -- How position parameter is interpreted (String) 1220 Default: lowerleft 1221 camera_matrix -- extrinsic camera parameter matrix (position and orientation) (Instance of <class 'VisionEgg.Core.ModelView'>) 1222 Default: (determined at runtime) 1223 depth_range -- depth range (in object units) for rendering (Sequence2 of Real) 1224 Default: (0, 1) 1225 position -- Position (in pixel units) within the screen (Sequence2 of Real) 1226 Default: (0, 0) 1227 projection -- intrinsic camera parameter matrix (field of view, focal length, aspect ratio) (Instance of <class 'VisionEgg.Core.Projection'>) 1228 Default: (determined at runtime) 1229 screen -- The screen in which this viewport is drawn (Instance of <class 'VisionEgg.Core.Screen'>) 1230 Default: (determined at runtime) 1231 size -- Size (in pixel units) (Sequence2 of Real) 1232 Default: (determined at runtime) 1233 stimuli -- sequence of stimuli to draw in screen (Sequence of Instance of <class 'VisionEgg.Core.Stimulus'>) 1234 Default: (determined at runtime) 1235 """ 1236 1237 parameters_and_defaults = VisionEgg.ParameterDefinition({ 1238 'screen':(None, 1239 ve_types.Instance(Screen), 1240 'The screen in which this viewport is drawn'), 1241 'position':((0,0), 1242 ve_types.Sequence2(ve_types.Real), 1243 'Position (in pixel units) within the screen'), 1244 'anchor':('lowerleft', 1245 ve_types.String, 1246 'How position parameter is interpreted'), 1247 'depth_range':((0,1), 1248 ve_types.Sequence2(ve_types.Real), 1249 'depth range (in object units) for rendering'), 1250 'size':(None, # will use screen.size if not specified 1251 ve_types.Sequence2(ve_types.Real), 1252 'Size (in pixel units)'), 1253 'projection':(None, 1254 ve_types.Instance(Projection), 1255 'intrinsic camera parameter matrix (field of view, focal length, aspect ratio)'), 1256 'camera_matrix':(None, 1257 ve_types.Instance(ModelView), 1258 'extrinsic camera parameter matrix (position and orientation)'), 1259 'stimuli':(None, 1260 ve_types.Sequence(ve_types.Instance(Stimulus)), 1261 'sequence of stimuli to draw in screen'), 1262 'lowerleft':(None, # DEPRECATED -- don't use 1263 ve_types.Sequence2(ve_types.Real), 1264 'position (in pixel units) of lower-left viewport corner', 1265 VisionEgg.ParameterDefinition.DEPRECATED), 1266 }) 1267 1268 __slots__ = ( 1269 '_is_drawing', 1270 ) 1271
1272 - def __init__(self,**kw):
1273 """Create a new instance. 1274 1275 Required arguments: 1276 1277 screen 1278 1279 Optional arguments (specify parameter value other than default): 1280 1281 position -- defaults to (0,0), position relative to screen by anchor (see below) 1282 anchor -- defaults to 'lowerleft' 1283 size -- defaults to screen.size 1284 projection -- defaults to self.make_new_pixel_coord_projection() 1285 stimuli -- defaults to empty list 1286 """ 1287 VisionEgg.ClassWithParameters.__init__(self,**kw) 1288 1289 if self.parameters.screen is None: 1290 raise ValueError("Must specify screen when creating an instance of Viewport.") 1291 1292 p = self.parameters # shorthand 1293 if p.size is None: 1294 p.size = p.screen.constant_parameters.size 1295 if p.projection is None: 1296 # Default projection maps eye coordinates 1:1 on window (pixel) coordinates 1297 p.projection = self.make_new_pixel_coord_projection() 1298 if p.camera_matrix is None: 1299 p.camera_matrix = ModelView() 1300 if p.stimuli is None: 1301 p.stimuli = [] 1302 self._is_drawing = False
1303
1305 """Create instance of Projection mapping eye coordinates 1:1 with pixel coordinates.""" 1306 return OrthographicProjectionNoZClip(left=0,right=self.parameters.size[0], 1307 bottom=0,top=self.parameters.size[1])
1308
1309 - def make_current(self):
1310 p = self.parameters # shorthand 1311 p.screen.make_current() 1312 1313 if p.lowerleft != None: 1314 if not hasattr(Viewport,"_gave_lowerleft_warning"): 1315 logger = logging.getLogger('VisionEgg.Core') 1316 logger.warning("lowerleft parameter of Viewport class " 1317 "will stop being supported. Use " 1318 "'position' instead with anchor set to " 1319 "'lowerleft'.") 1320 Viewport._gave_lowerleft_warning = True 1321 p.anchor = 'lowerleft' 1322 p.position = p.lowerleft[0], p.lowerleft[1] # copy values (don't copy ref to tuple) 1323 1324 lowerleft = VisionEgg._get_lowerleft(p.position,p.anchor,p.size) 1325 1326 gl.glViewport(lowerleft[0], 1327 lowerleft[1], 1328 p.size[0], 1329 p.size[1]) 1330 gl.glDepthRange(p.depth_range[0],p.depth_range[1]) 1331 1332 p.projection.apply_to_gl() 1333 p.camera_matrix.apply_to_gl()
1334
1335 - def draw(self):
1336 """Set the viewport and draw stimuli.""" 1337 self.make_current() 1338 self._is_drawing = True 1339 for stimulus in self.parameters.stimuli: 1340 stimulus.draw() 1341 self._is_drawing = False
1342
1343 - def norm_device_2_window(self,norm_device_vertex):
1344 """Transform normalized device coordinates to window coordinates""" 1345 v = Numeric.asarray(norm_device_vertex) 1346 homog = VisionEgg.ThreeDeeMath.make_homogeneous_coord_rows(v) 1347 xd = homog[:,0,Numeric.NewAxis] 1348 yd = homog[:,1,Numeric.NewAxis] 1349 zd = homog[:,2,Numeric.NewAxis] 1350 1351 p = self.parameters # shorthand 1352 lowerleft = VisionEgg._get_lowerleft(p.position,p.anchor,p.size) 1353 x,y = lowerleft 1354 w,h = p.size 1355 n,f = p.depth_range 1356 1357 # clamp n and f 1358 n = min(1.0,max(0.0,n)) 1359 f = min(1.0,max(0.0,f)) 1360 1361 ox = x + w/2.0 1362 oy = y + h/2.0 1363 px = w 1364 py = h 1365 xw = (px/2.0)*xd + ox 1366 yw = (py/2.0)*yd + oy 1367 zw = ((f-n)/2.0)*zd + (n+f)/2.0 1368 # XXX I think zw (or zd) is clamped in OpenGL, but I can't 1369 # find it in any spec! 1370 #zw = Numeric.clip(zw,0.0,1.0) # clamp 1371 r = Numeric.concatenate((xw,yw,zw),axis=1) 1372 if len(homog.shape) > len(v.shape): 1373 r = Numeric.reshape(r,(3,)) 1374 return r
1375 - def clip_2_window(self,eye_coords_vertex):
1376 """Transform clip coordinates to window coordinates""" 1377 my_proj = self.parameters.projection 1378 return self.norm_device_2_window( my_proj.clip_2_norm_device( eye_coords_vertex ) )
1379 - def eye_2_window(self,eye_coords_vertex):
1380 """Transform eye coordinates to window coordinates""" 1381 my_proj = self.parameters.projection 1382 return self.norm_device_2_window( my_proj.eye_2_norm_device( eye_coords_vertex ) )
1383 1384 #################################################################### 1385 # 1386 # FixationSpot 1387 # 1388 #################################################################### 1389
1390 -class FixationSpot(Stimulus):
1391 """A rectangle stimulus, typically used as a fixation spot. 1392 1393 Parameters 1394 ========== 1395 anchor -- how position parameter is used (String) 1396 Default: center 1397 color -- color (AnyOf(Sequence3 of Real or Sequence4 of Real)) 1398 Default: (1.0, 1.0, 1.0) 1399 on -- draw? (Boolean) 1400 Default: True 1401 position -- position in eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) 1402 Default: (320.0, 240.0) 1403 size -- size in eye coordinates (Sequence2 of Real) 1404 Default: (4.0, 4.0) 1405 """ 1406 1407 parameters_and_defaults = VisionEgg.ParameterDefinition({ 1408 'on':(True, 1409 ve_types.Boolean, 1410 'draw?'), 1411 'color':((1.0,1.0,1.0), 1412 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 1413 ve_types.Sequence4(ve_types.Real)), 1414 'color'), 1415 'position' : ( ( 320.0, 240.0 ), # in eye coordinates 1416 ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), 1417 ve_types.Sequence3(ve_types.Real), 1418 ve_types.Sequence4(ve_types.Real)), 1419 'position in eye coordinates'), 1420 'anchor' : ('center', 1421 ve_types.String, 1422 'how position parameter is used'), 1423 'size':((4.0,4.0), # horiz and vertical size 1424 ve_types.Sequence2(ve_types.Real), 1425 'size in eye coordinates'), 1426 'center' : (None, # DEPRECATED -- don't use 1427 ve_types.Sequence2(ve_types.Real), 1428 'position in eye coordinates', 1429 VisionEgg.ParameterDefinition.DEPRECATED), 1430 }) 1431
1432 - def __init__(self,**kw):
1433 Stimulus.__init__(self,**kw)
1434
1435 - def draw(self):
1436 p = self.parameters # shorthand 1437 if p.center is not None: 1438 if not hasattr(VisionEgg.config,"_GAVE_CENTER_DEPRECATION"): 1439 logger = logging.getLogger('VisionEgg.Core') 1440 logger.warning("Specifying FixationSpot by deprecated " 1441 "'center' parameter deprecated. Use " 1442 "'position' parameter instead. (Allows " 1443 "use of 'anchor' parameter to set to " 1444 "other values.)") 1445 VisionEgg.config._GAVE_CENTER_DEPRECATION = 1 1446 p.anchor = 'center' 1447 p.position = p.center[0], p.center[1] # copy values (don't copy ref to tuple) 1448 if p.on: 1449 # calculate center 1450 center = VisionEgg._get_center(p.position,p.anchor,p.size) 1451 gl.glDisable(gl.GL_DEPTH_TEST) 1452 gl.glDisable(gl.GL_TEXTURE_2D) 1453 gl.glDisable(gl.GL_BLEND) 1454 1455 if len(p.color)==3: 1456 gl.glColor3f(*p.color) 1457 elif len(p.color)==4: 1458 gl.glColor4f(*p.color) 1459 1460 # This could go in a display list to speed it up, but then 1461 # size wouldn't be dynamically adjustable this way. Could 1462 # still use one of the matrices to make it change size. 1463 x_size = self.parameters.size[0]/2.0 1464 y_size = self.parameters.size[1]/2.0 1465 x,y = center[0],center[1] 1466 x1 = x-x_size; x2 = x+x_size 1467 y1 = y-y_size; y2 = y+y_size 1468 gl.glBegin(gl.GL_QUADS) 1469 gl.glVertex2f(x1,y1) 1470 gl.glVertex2f(x2,y1) 1471 gl.glVertex2f(x2,y2) 1472 gl.glVertex2f(x1,y2) 1473 gl.glEnd() # GL_QUADS
1474 1475 #################################################################### 1476 # 1477 # Frame timing information 1478 # 1479 #################################################################### 1480
1481 -class FrameTimer:
1482 """Time inter frame intervals and compute frames per second."""
1483 - def __init__(self, bin_start_msec=2, bin_stop_msec=28, bin_width_msec=2, running_average_num_frames=0,save_all_frametimes=False):
1484 """Create instance of FrameTimer.""" 1485 self.bins = Numeric.arange( bin_start_msec, bin_stop_msec, bin_width_msec ) 1486 self.bin_width_msec = float(bin_width_msec) 1487 self.timing_histogram = Numeric.zeros( self.bins.shape, Numeric.Float ) # make float to avoid (early) overflow errors 1488 self._true_time_last_frame = None # no frames yet 1489 self.longest_frame_draw_time_sec = None 1490 self.first_tick_sec = None 1491 self.total_frames = 0 1492 self.running_average_num_frames = running_average_num_frames 1493 if self.running_average_num_frames: 1494 self.last_n_frame_times_sec = [None]*self.running_average_num_frames 1495 self.save_all_frametimes = save_all_frametimes 1496 if self.save_all_frametimes: 1497 self.all_frametimes = []
1498
1499 - def tick(self):
1500 """Declare a frame has just been drawn.""" 1501 true_time_now = VisionEgg.true_time_func() 1502 if self._true_time_last_frame != None: 1503 this_frame_draw_time_sec = true_time_now - self._true_time_last_frame 1504 index = int(math.ceil(this_frame_draw_time_sec*1000.0/self.bin_width_msec))-1 1505 if index > (len(self.timing_histogram)-1): 1506 index = -1 1507 self.timing_histogram[index] += 1 1508 self.longest_frame_draw_time_sec = max(self.longest_frame_draw_time_sec,this_frame_draw_time_sec) 1509 if self.running_average_num_frames: 1510 self.last_n_frame_times_sec.append(true_time_now) 1511 self.last_n_frame_times_sec.pop(0) 1512 else: 1513 self.first_tick_sec = true_time_now 1514 self._true_time_last_frame = true_time_now # set for next frame 1515 1516 if self.save_all_frametimes: 1517 self.all_frametimes.append( true_time_now )
1518
1519 - def get_all_frametimes(self):
1520 if self.save_all_frametimes: 1521 return self.all_frametimes 1522 else: 1523 raise ValueError("must set save_all_frametimes")
1524
1526 return self.longest_frame_draw_time_sec
1527
1529 if self.running_average_num_frames: 1530 frame_times = [] 1531 for frame_time in self.last_n_frame_times_sec: 1532 if frame_time is not None: 1533 frame_times.append( frame_time ) 1534 if len(frame_times) >= 2: 1535 return (frame_times[-1] - frame_times[0]) / len(frame_times) 1536 else: 1537 raise RuntimeError("running_average_num_frames not set when creating FrameTimer instance")
1538
1539 - def get_average_ifi_sec(self):
1540 if self._true_time_last_frame is None: 1541 raise RuntimeError("No frames were drawn, can't calculate average IFI") 1542 return (self._true_time_last_frame - self.first_tick_sec) / sum( self.timing_histogram )
1543
1544 - def print_histogram(self):
1545 logger = logging.getLogger('VisionEgg.Core') 1546 logger.warning("print_histogram() method of FrameTimer is " 1547 "deprecated will stop being supported. Use " 1548 "log_histogram() instead.") 1549 self.log_histogram()
1550
1551 - def log_histogram(self):
1552 """Send histogram to logger.""" 1553 buffer = StringIO.StringIO() 1554 1555 n_frames = sum( self.timing_histogram )+1 1556 if n_frames < 2: 1557 print >> buffer, '%d frames were drawn.'%n_frames 1558 return 1559 average_ifi_sec = self.get_average_ifi_sec() 1560 print >> buffer, '%d frames were drawn.'%int(n_frames) 1561 print >> buffer, 'Mean IFI was %.2f msec (%.2f fps), longest IFI was %.2f msec.'%( 1562 average_ifi_sec*1000.0,1.0/average_ifi_sec,self.longest_frame_draw_time_sec*1000.0) 1563 1564 h = hist = self.timing_histogram # shorthand 1565 maxhist = float(max(h)) 1566 if maxhist == 0: 1567 print >> buffer, "No frames were drawn." 1568 return 1569 lines = min(10,int(math.ceil(maxhist))) 1570 hist = hist/maxhist*float(lines) # normalize to number of lines 1571 print >> buffer, "histogram:" 1572 for line in range(lines): 1573 val = float(lines)-1.0-float(line) 1574 timing_string = "%6d "%(round(maxhist*val/lines),) 1575 q = Numeric.greater(hist,val) 1576 for qi in q: 1577 s = ' ' 1578 if qi: 1579 s = '*' 1580 timing_string += "%4s "%(s,) 1581 print >> buffer, timing_string 1582 timing_string = " Time: " 1583 timing_string += "%4d "%(0,) 1584 for bin in self.bins[:-1]: 1585 timing_string += "%4d "%(bin,) 1586 timing_string += "+(msec)\n" 1587 timing_string += "Total: " 1588 for hi in h: 1589 if hi <= 999: 1590 num_str = str(int(hi)).center(5) 1591 else: 1592 num_str = " +++ " 1593 timing_string += num_str 1594 print >> buffer, timing_string 1595 1596 buffer.seek(0) 1597 logger = logging.getLogger('VisionEgg.Core') 1598 logger.info(buffer.read())
1599 1600 #################################################################### 1601 # 1602 # Error handling and assumption checking 1603 # 1604 #################################################################### 1605 1606 import VisionEgg.Deprecated 1607 Message = VisionEgg.Deprecated.Message 1608 1609 message = VisionEgg.Deprecated.Message() # create instance of Message class for everything to use 1610 1611 gl_assumptions = [] 1612
1613 -def add_gl_assumption(gl_variable,required_value,failure_callback):
1614 """Save assumptions for later checking once OpenGL context created.""" 1615 if type(failure_callback) != types.FunctionType: 1616 raise ValueError("failure_callback must be a function!") 1617 gl_assumptions.append((gl_variable,required_value,failure_callback))
1618
1619 -def init_gl_extension(prefix,name):
1620 global gl # interpreter knows when we're up to something funny with GLTrace 1621 logger = logging.getLogger('VisionEgg.Core') 1622 1623 if gl is VisionEgg.GLTrace: 1624 watched = True 1625 gl = VisionEgg.GLTrace.gl # manipulate original module for now 1626 else: 1627 watched = False 1628 1629 module_name = "OpenGL.GL.%(prefix)s.%(name)s"%locals() 1630 try: 1631 exec "import "+module_name 1632 except ImportError: 1633 logger.warning("Could not import %s -- some features will be " 1634 "missing."%(module_name,)) 1635 return False 1636 module = eval(module_name) 1637 init_function_name = "glInit"+name.title().replace('_','')+prefix 1638 init_function = getattr(module,init_function_name) 1639 if not init_function(): 1640 logger.warning("Could not initialize %s -- some features will " 1641 "be missing."%(module_name,)) 1642 return False 1643 for attr_name in dir(module): 1644 # put attributes from module into "gl" module dictionary 1645 # (Namespace overlap as you'd get OpenGL apps written in C) 1646 attr = getattr(module,attr_name) 1647 # reject unwanted attributes 1648 if attr_name.startswith('__'): 1649 continue 1650 elif attr_name == init_function_name: 1651 continue 1652 elif attr_name == 'gl': 1653 continue 1654 elif type(attr) == type(VisionEgg): # module type 1655 continue 1656 1657 gl_attr_name = attr_name 1658 setattr(gl,gl_attr_name,attr) 1659 1660 if watched: 1661 VisionEgg.GLTrace.gl_trace_attach() # (re)scan namespace 1662 gl = VisionEgg.GLTrace # reinstall GLTrace 1663 return True # success!
1664
1665 -def post_gl_init():
1666 """Called by Screen instance. Requires OpenGL context to be created.""" 1667 global gl_vendor, gl_renderer, gl_version # set above 1668 logger = logging.getLogger('VisionEgg.Core') 1669 1670 if gl_version < '1.3': 1671 if not init_gl_extension('ARB','multitexture'): 1672 logger.warning("multitexturing not available. Some features " 1673 "will not be available") 1674 else: 1675 if not hasattr(gl,'glActiveTexture'): 1676 logger.debug("PyOpenGL bug: OpenGL multitexturing not available " 1677 "even though OpenGL is 1.3 or greater. " 1678 "Attempting ctypes-based workaround.") 1679 VisionEgg.PlatformDependent.attempt_to_load_multitexturing() 1680 if hasattr(gl,'glActiveTexture'): # the above worked or PyOpenGL fixed 1681 # OpenGL 1.3 has this extension built-in, 1682 # but doing this allows use of ARB names. 1683 gl.glActiveTextureARB = gl.glActiveTexture 1684 gl.glMultiTexCoord2fARB = gl.glMultiTexCoord2f 1685 gl.GL_TEXTURE0_ARB = gl.GL_TEXTURE0 1686 gl.GL_TEXTURE1_ARB = gl.GL_TEXTURE1 1687 1688 if gl_version < '1.2': 1689 if init_gl_extension('EXT','bgra'): 1690 # make sure gl.GL_BRGA is defined 1691 gl.GL_BGRA = gl.GL_BGRA_EXT 1692 1693 for gl_variable,required_value,failure_callback in gl_assumptions: 1694 # Code required for each variable to be checked 1695 if gl_variable == "__SPECIAL__": 1696 if required_value == "linux_nvidia_or_new_ATI": 1697 ok = 0 1698 # Test for nVidia 1699 if "nvidia" == gl_vendor.split()[0].lower(): 1700 ok = 1 # yes it is 1701 if gl_renderer.startswith('Mesa DRI Radeon'): 1702 date = gl_renderer.split()[3] 1703 if date > "20021216": # not sure about exact date 1704 ok=1 1705 if not ok: 1706 failure_callback() 1707 else: 1708 raise RuntimeError, "Unknown gl_assumption: %s == %s"%(gl_variable,required_value) 1709 1710 elif gl_variable.upper() == "GL_VERSION": 1711 value_str = gl_version.split()[0] 1712 value_ints = map(int,value_str.split('.')) 1713 value = float( str(value_ints[0]) + "." + ''.join(map(str,value_ints[1:]))) 1714 if value < required_value: 1715 failure_callback() 1716 else: 1717 raise RuntimeError, "Unknown gl_assumption" 1718 1719 # Do we have gl.GL_CLAMP_TO_EDGE ? 1720 try: 1721 gl.GL_CLAMP_TO_EDGE 1722 except AttributeError: 1723 if gl_version >= '1.2': 1724 # If OpenGL version >= 1.2, this should be defined 1725 # It seems to be a PyOpenGL bug that it's not. 1726 logger.debug("GL_CLAMP_TO_EDGE is not defined. " 1727 "Because you have OpenGL version 1.2 or " 1728 "greater, this is probably a bug in " 1729 "PyOpenGL. Assigning GL_CLAMP_TO_EDGE to " 1730 "the value that is usually used.") 1731 gl.GL_CLAMP_TO_EDGE = 0x812F 1732 else: 1733 try: 1734 init_gl_extension('SGIS','texture_edge_clamp') 1735 gl.GL_CLAMP_TO_EDGE = gl.GL_CLAMP_TO_EDGE_SGIS 1736 except: 1737 1738 logger.warning("GL_CLAMP_TO_EDGE is not " 1739 "available. OpenGL version is " 1740 "less than 1.2, and the " 1741 "texture_edge_clamp_SGIS extension " 1742 "failed to load. It may be impossible to " 1743 "get exact 1:1 reproduction of " 1744 "textures. Using GL_CLAMP instead of " 1745 "GL_CLAMP_TO_EDGE.") 1746 gl.GL_CLAMP_TO_EDGE = gl.GL_CLAMP
1747 1748 ######################################################################### 1749 # 1750 # Moved to FlowControl.py -- here only for backwards compatibility 1751 # 1752 ######################################################################### 1753 1754 import VisionEgg.FlowControl 1755 Presentation = VisionEgg.FlowControl.Presentation 1756 Controller = VisionEgg.FlowControl.Controller 1757 ConstantController = VisionEgg.FlowControl.ConstantController 1758 EvalStringController = VisionEgg.FlowControl.EvalStringController 1759 ExecStringController = VisionEgg.FlowControl.ExecStringController 1760 FunctionController = VisionEgg.FlowControl.FunctionController 1761 EncapsulatedController = VisionEgg.FlowControl.EncapsulatedController 1762

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.FixationSpot-class.html0000644000076500000240000003500311224565530025544 0ustar astrawstaff VisionEgg.Core.FixationSpot
Package VisionEgg :: Module Core :: Class FixationSpot
[frames] | no frames]

Class FixationSpot

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
               Stimulus --+
                          |
                         FixationSpot

A rectangle stimulus, typically used as a fixation spot.

Parameters
==========
anchor   -- how position parameter is used (String)
            Default: center
color    -- color (AnyOf(Sequence3 of Real or Sequence4 of Real))
            Default: (1.0, 1.0, 1.0)
on       -- draw? (Boolean)
            Default: True
position -- position in eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real))
            Default: (320.0, 240.0)
size     -- size in eye coordinates (Sequence2 of Real)
            Default: (4.0, 4.0)



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'on':...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'on':(True, ve_types.Boolean, 'draw?'),\
 'color':((1.0, 1.0, 1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.\
Real), ve_types.Sequence4(ve_types.Real)), 'color'), 'position':((320.\
0, 240.0), ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.\
Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), 'positio\
n in eye coordinates'), 'anchor':('center', ve_types.String, 'how posi\
tion parameter is used'), 'size':((4.0, 4.0), ve_types.Sequence2(ve_ty\
pes.Real), 'size in eye coordinates'), 'center':(None, ve_types.Sequen\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.FrameTimer-class.html0000644000076500000240000002443111224565530025153 0ustar astrawstaff VisionEgg.Core.FrameTimer
Package VisionEgg :: Module Core :: Class FrameTimer
[frames] | no frames]

Class FrameTimer

source code

Time inter frame intervals and compute frames per second.



Instance Methods
 
__init__(self, bin_start_msec=2, bin_stop_msec=28, bin_width_msec=2, running_average_num_frames=0, save_all_frametimes=False)
Create instance of FrameTimer.
source code
 
tick(self)
Declare a frame has just been drawn.
source code
 
get_all_frametimes(self) source code
 
get_longest_frame_duration_sec(self) source code
 
get_running_average_ifi_sec(self) source code
 
get_average_ifi_sec(self) source code
 
print_histogram(self) source code
 
log_histogram(self)
Send histogram to logger.
source code
visionegg-1.2.1/doc/reference/html/VisionEgg.Core.ModelView-class.html0000644000076500000240000002742511224565530025021 0ustar astrawstaff VisionEgg.Core.ModelView
Package VisionEgg :: Module Core :: Class ModelView
[frames] | no frames]

Class ModelView

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
    ProjectionBaseClass --+
                          |
                         ModelView

for use of OpenGL MODELVIEW_MATRIX

Parameters
==========
matrix -- matrix specifying projection (Sequence4x4 of Real)
          Default: [[1 0 0 0]
                    [0 1 0 0]
                    [0 0 1 0]
                    [0 0 0 1]]



Instance Methods
 
__init__(self, *args, **kw) source code

Inherited from ProjectionBaseClass: apply_to_gl, apply_to_vertex, apply_to_vertices, clip_2_norm_device, eye_2_clip, eye_2_norm_device, get_matrix, look_at, push_and_set_gl_projection, rotate, scale, set_gl_modelview, set_gl_projection, stateless_rotate, stateless_scale, stateless_translate, translate

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ProjectionBaseClass: parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, *args, **kw)
(Constructor)

source code 
Overrides: ProjectionBaseClass.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.OrthographicProjection-class.html0000644000076500000240000003243311224565530027607 0ustar astrawstaff VisionEgg.Core.OrthographicProjection
Package VisionEgg :: Module Core :: Class OrthographicProjection
[frames] | no frames]

Class OrthographicProjection

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
    ProjectionBaseClass --+    
                          |    
                 Projection --+
                              |
                             OrthographicProjection

An orthographic projection.

Parameters
==========
matrix -- matrix specifying projection (Sequence4x4 of Real)
          Default: [[1 0 0 0]
                    [0 1 0 0]
                    [0 0 1 0]
                    [0 0 0 1]]



Instance Methods
 
__init__(self, left=0.0, right=640.0, bottom=0.0, top=480.0, z_clip_near=0.0, z_clip_far=1.0)
Create an orthographic projection.
source code

Inherited from ProjectionBaseClass: apply_to_gl, apply_to_vertex, apply_to_vertices, clip_2_norm_device, eye_2_clip, eye_2_norm_device, get_matrix, look_at, push_and_set_gl_projection, rotate, scale, set_gl_modelview, set_gl_projection, stateless_rotate, stateless_scale, stateless_translate, translate

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ProjectionBaseClass: parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, left=0.0, right=640.0, bottom=0.0, top=480.0, z_clip_near=0.0, z_clip_far=1.0)
(Constructor)

source code 
Create an orthographic projection.

Defaults to map x eye coordinates in the range [0,640], y eye
coordinates [0,480] and clip coordinates [0,1] to [0,1].
Therefore, if the viewport is 640 x 480, eye coordinates
correspond 1:1 with window (pixel) coordinates.  Only points
between these clipping planes will be displayed.

Overrides: Projection.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.OrthographicProjectionNoZClip-class.html0000644000076500000240000003170711224565530031051 0ustar astrawstaff VisionEgg.Core.OrthographicProjectionNoZClip
Package VisionEgg :: Module Core :: Class OrthographicProjectionNoZClip
[frames] | no frames]

Class OrthographicProjectionNoZClip

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
    ProjectionBaseClass --+    
                          |    
                 Projection --+
                              |
                             OrthographicProjectionNoZClip

An orthographic projection without Z clipping.

Parameters
==========
matrix -- matrix specifying projection (Sequence4x4 of Real)
          Default: [[1 0 0 0]
                    [0 1 0 0]
                    [0 0 1 0]
                    [0 0 0 1]]



Instance Methods
 
__init__(self, left=0.0, right=640.0, bottom=0.0, top=480.0)
Create an orthographic projection without Z clipping.
source code

Inherited from ProjectionBaseClass: apply_to_gl, apply_to_vertex, apply_to_vertices, clip_2_norm_device, eye_2_clip, eye_2_norm_device, get_matrix, look_at, push_and_set_gl_projection, rotate, scale, set_gl_modelview, set_gl_projection, stateless_rotate, stateless_scale, stateless_translate, translate

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ProjectionBaseClass: parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, left=0.0, right=640.0, bottom=0.0, top=480.0)
(Constructor)

source code 
Create an orthographic projection without Z clipping.

Defaults to map x eye coordinates in the range [0,640] and y
eye coordinates [0,480] -> [0,1].  Therefore, if the viewport
is 640 x 480, eye coordinates correspond 1:1 with window
(pixel) coordinates.

Overrides: Projection.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.PerspectiveProjection-class.html0000644000076500000240000003055511224565530027452 0ustar astrawstaff VisionEgg.Core.PerspectiveProjection
Package VisionEgg :: Module Core :: Class PerspectiveProjection
[frames] | no frames]

Class PerspectiveProjection

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
    ProjectionBaseClass --+    
                          |    
                 Projection --+
                              |
                             PerspectiveProjection

A perspective projection.

Parameters
==========
matrix -- matrix specifying projection (Sequence4x4 of Real)
          Default: [[1 0 0 0]
                    [0 1 0 0]
                    [0 0 1 0]
                    [0 0 0 1]]



Instance Methods
 
__init__(self, left, right, bottom, top, near, far) source code

Inherited from ProjectionBaseClass: apply_to_gl, apply_to_vertex, apply_to_vertices, clip_2_norm_device, eye_2_clip, eye_2_norm_device, get_matrix, look_at, push_and_set_gl_projection, rotate, scale, set_gl_modelview, set_gl_projection, stateless_rotate, stateless_scale, stateless_translate, translate

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ProjectionBaseClass: parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, left, right, bottom, top, near, far)
(Constructor)

source code 
Overrides: Projection.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.Projection-class.html0000644000076500000240000002743711224565530025245 0ustar astrawstaff VisionEgg.Core.Projection
Package VisionEgg :: Module Core :: Class Projection
[frames] | no frames]

Class Projection

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
    ProjectionBaseClass --+
                          |
                         Projection

for use of OpenGL PROJECTION_MATRIX

Parameters
==========
matrix -- matrix specifying projection (Sequence4x4 of Real)
          Default: [[1 0 0 0]
                    [0 1 0 0]
                    [0 0 1 0]
                    [0 0 0 1]]



Instance Methods
 
__init__(self, *args, **kw) source code

Inherited from ProjectionBaseClass: apply_to_gl, apply_to_vertex, apply_to_vertices, clip_2_norm_device, eye_2_clip, eye_2_norm_device, get_matrix, look_at, push_and_set_gl_projection, rotate, scale, set_gl_modelview, set_gl_projection, stateless_rotate, stateless_scale, stateless_translate, translate

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ProjectionBaseClass: parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, *args, **kw)
(Constructor)

source code 
Overrides: ProjectionBaseClass.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.ProjectionBaseClass-class.html0000644000076500000240000006104011224565530027012 0ustar astrawstaff VisionEgg.Core.ProjectionBaseClass
Package VisionEgg :: Module Core :: Class ProjectionBaseClass
[frames] | no frames]

Class ProjectionBaseClass

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     ProjectionBaseClass

Converts stimulus coordinates to viewport coordinates.

This is an abstract base class which should be subclassed for
actual use.

Parameters
==========
matrix -- matrix specifying projection (Sequence4x4 of Real)
          Default: [[1 0 0 0]
                    [0 1 0 0]
                    [0 0 1 0]
                    [0 0 0 1]]



Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code
 
apply_to_gl(self)
Set the OpenGL projection matrix.
source code
 
set_gl_modelview(self)
Set the OpenGL modelview matrix.
source code
 
set_gl_projection(self)
Set the OpenGL projection matrix.
source code
 
push_and_set_gl_projection(self)
Set the OpenGL projection matrix, pushing current projection matrix to stack.
source code
 
translate(self, x, y, z)
Compose a translation and set the OpenGL projection matrix.
source code
 
stateless_translate(self, x, y, z)
Compose a translation without changing OpenGL state.
source code
 
rotate(self, angle_degrees, x, y, z)
Compose a rotation and set the OpenGL projection matrix.
source code
 
stateless_rotate(self, angle_degrees, x, y, z)
Compose a rotation without changing OpenGL state.
source code
 
scale(self, x, y, z)
Compose a rotation and set the OpenGL projection matrix.
source code
 
stateless_scale(self, x, y, z)
Compose a rotation without changing OpenGL state.
source code
 
get_matrix(self) source code
 
look_at(self, eye, center, up) source code
 
eye_2_clip(self, eye_coords_vertex)
Transform eye coordinates to clip coordinates
source code
 
clip_2_norm_device(self, clip_coords_vertex)
Transform clip coordinates to normalized device coordinates
source code
 
eye_2_norm_device(self, eye_coords_vertex)
Transform eye coordinates to normalized device coordinates
source code
 
apply_to_vertex(self, vertex)
Perform multiplication on vertex to get transformed result
source code
 
apply_to_vertices(self, vertices)
Perform multiplication on vertex to get transformed result
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'matr...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'matrix':(Numeric.identity(4), ve_types\
.Sequence4x4(ve_types.Real), 'matrix specifying projection'),})

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.Screen-class.html0000644000076500000240000010507011224565530024336 0ustar astrawstaff VisionEgg.Core.Screen
Package VisionEgg :: Module Core :: Class Screen
[frames] | no frames]

Class Screen

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     Screen

An OpenGL window, possibly displayed across multiple displays.

A Screen instance is an OpenGL window for the Vision Egg to draw
in.  For an instance of Screen to do anything useful, it must
contain one or more instances of the Viewport class and one or
more instances of the Stimulus class.

Currently, only one OpenGL window is supported by the library with
which the Vision Egg initializes graphics (pygame/SDL).  However,
this need not limit display to a single physical display device.
Many video drivers, for example, allow applications to treat two
separate monitors as one large array of contiguous pixels.  By
sizing a window such that it occupies both monitors and creating
separate viewports for the portion of the window on each monitor,
a multiple screen effect can be created.

Public read-only variables
==========================
size -- Tuple of 2 integers specifying width and height

Parameters
==========
bgcolor -- background color (AnyOf(Sequence3 of Real or Sequence4 of Real))
           Default: (0.5, 0.5, 0.5, 0.0)

Constant Parameters
===================
alpha_bits          -- number of bits per pixel for alpha channel. Can be set with VISIONEGG_REQUEST_ALPHA_BITS (UnsignedInteger)
                       Default: (determined at runtime)
blue_bits           -- number of bits per pixel for blue channel. Can be set with VISIONEGG_REQUEST_BLUE_BITS (UnsignedInteger)
                       Default: (determined at runtime)
double_buffer       -- use double buffering? Can be set with VISIONEGG_DOUBLE_BUFFER (Boolean)
                       Default: (determined at runtime)
frameless           -- remove standard window frame? Can be set with VISIONEGG_FRAMELESS_WINDOW (Boolean)
                       Default: (determined at runtime)
fullscreen          -- use full screen? Can be set with VISIONEGG_FULLSCREEN (Boolean)
                       Default: (determined at runtime)
green_bits          -- number of bits per pixel for green channel. Can be set with VISIONEGG_REQUEST_GREEN_BITS (UnsignedInteger)
                       Default: (determined at runtime)
hide_mouse          -- hide the mouse cursor? Can be set with VISIONEGG_HIDE_MOUSE (Boolean)
                       Default: (determined at runtime)
is_stereo           -- allocate stereo framebuffers? Can be set with VISIONEGG_REQUEST_STEREO (Boolean)
                       Default: (determined at runtime)
maxpriority         -- raise priority? (platform dependent) Can be set with VISIONEGG_MAXPRIORITY (Boolean)
                       Default: (determined at runtime)
multisample_samples -- preferred number of multisamples for FSAA (UnsignedInteger)
                       Default: (determined at runtime)
preferred_bpp       -- preferred bits per pixel (bit depth) Can be set with VISIONEGG_PREFERRED_BPP (UnsignedInteger)
                       Default: (determined at runtime)
red_bits            -- number of bits per pixel for red channel. Can be set with VISIONEGG_REQUEST_RED_BITS (UnsignedInteger)
                       Default: (determined at runtime)
size                -- size (units: pixels) Can be set with VISIONEGG_SCREEN_W and VISIONEGG_SCREEN_H (Sequence2 of Real)
                       Default: (determined at runtime)
sync_swap           -- synchronize buffer swaps to vertical sync? Can be set with VISIONEGG_SYNC_SWAP (Boolean)
                       Default: (determined at runtime)



Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code
 
get_size(self) source code
 
set_size(self, value) source code
 
get_framebuffer_as_image(self, buffer='back', format=gl.GL_RGB, position=(0,0), anchor='lowerleft', size=None)
get pixel values from framebuffer to PIL image
source code
 
get_framebuffer_as_array(self, buffer='back', format=gl.GL_RGB, position=(0,0), anchor='lowerleft', size=None)
get pixel values from framebuffer to Numeric array
source code
 
put_pixels(self, pixels=None, position=(0,0), anchor='lowerleft', scale_x=1.0, scale_y=1.0, texture_min_filter=gl.GL_NEAREST, texture_mag_filter=gl.GL_NEAREST, internal_format=gl.GL_RGB)
Put pixel values to screen.
source code
 
query_refresh_rate(self) source code
 
measure_refresh_rate(self, average_over_seconds=0.1)
Measure the refresh rate.
source code
 
clear(self)
Called by Presentation instance.
source code
 
make_current(self)
Called by Viewport instance.
source code
 
set_gamma_ramp(self, *args, **kw)
Set the gamma_ramp, if supported.
source code
 
close(self)
Close the screen.
source code
 
__del__(self) source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
create_default()
Alternative constructor using configuration variables.
source code
Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'bgco...
  constant_parameters_and_defaults = VisionEgg.ParameterDefiniti...
  size = property(get_size, set_size)

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

put_pixels(self, pixels=None, position=(0,0), anchor='lowerleft', scale_x=1.0, scale_y=1.0, texture_min_filter=gl.GL_NEAREST, texture_mag_filter=gl.GL_NEAREST, internal_format=gl.GL_RGB)

source code 
Put pixel values to screen.

Pixel values become texture data using the VisionEgg.Textures
module.  Any source of texture data accepted by that module is
accepted here.

This function could be sped up by allocating a fixed OpenGL texture object.

measure_refresh_rate(self, average_over_seconds=0.1)

source code 
Measure the refresh rate. Assumes swap buffers synced.

clear(self)

source code 
Called by Presentation instance. Clear the screen.

make_current(self)

source code 
Called by Viewport instance. Makes screen active for drawing.

Can not be implemented until multiple screens are possible.

set_gamma_ramp(self, *args, **kw)

source code 
Set the gamma_ramp, if supported.

Call pygame.display.set_gamma_ramp, if available.

Returns True on success, False otherwise.

close(self)

source code 
Close the screen.

You can call this to close the screen.  Not necessary during
normal operation because it gets automatically deleted.

create_default()
Static Method

source code 
Alternative constructor using configuration variables.

Most of the time you can create and instance of Screen using
this method.  If your script needs explicit control of the
Screen parameters, initialize with the normal constructor.

Uses VisionEgg.config.VISIONEGG_GUI_INIT to determine how the
default screen parameters should are determined.  If this
value is 0, the values from VisionEgg.cfg are used.  If this
value is 1, a GUI panel is opened and allows manual settings
of the screen parameters.  


Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'bgcolor':((0.5, 0.5, 0.5, 0.0), ve_typ\
es.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_type\
s.Real)), 'background color',),})

constant_parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'size':(None, ve_types.Sequence2(ve_typ\
es.Real), 'size (units: pixels) Can be set with VISIONEGG_SCREEN_W and\
 VISIONEGG_SCREEN_H'), 'fullscreen':(None, ve_types.Boolean, 'use full\
 screen? Can be set with VISIONEGG_FULLSCREEN'), 'double_buffer':(None\
, ve_types.Boolean, 'use double buffering? Can be set with VISIONEGG_D\
OUBLE_BUFFER'), 'preferred_bpp':(None, ve_types.UnsignedInteger, 'pref\
erred bits per pixel (bit depth) Can be set with VISIONEGG_PREFERRED_B\
PP'), 'maxpriority':(None, ve_types.Boolean, 'raise priority? (platfor\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.SimplePerspectiveProjection-class.html0000644000076500000240000003116611224565530030623 0ustar astrawstaff VisionEgg.Core.SimplePerspectiveProjection
Package VisionEgg :: Module Core :: Class SimplePerspectiveProjection
[frames] | no frames]

Class SimplePerspectiveProjection

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
    ProjectionBaseClass --+    
                          |    
                 Projection --+
                              |
                             SimplePerspectiveProjection

A simplified perspective projection.

Parameters
==========
matrix -- matrix specifying projection (Sequence4x4 of Real)
          Default: [[1 0 0 0]
                    [0 1 0 0]
                    [0 0 1 0]
                    [0 0 0 1]]



Instance Methods
 
__init__(self, fov_x=45.0, z_clip_near=0.1, z_clip_far=10000.0, aspect_ratio=4.0/3.0) source code

Inherited from ProjectionBaseClass: apply_to_gl, apply_to_vertex, apply_to_vertices, clip_2_norm_device, eye_2_clip, eye_2_norm_device, get_matrix, look_at, push_and_set_gl_projection, rotate, scale, set_gl_modelview, set_gl_projection, stateless_rotate, stateless_scale, stateless_translate, translate

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ProjectionBaseClass: parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, fov_x=45.0, z_clip_near=0.1, z_clip_far=10000.0, aspect_ratio=4.0/3.0)
(Constructor)

source code 
Overrides: Projection.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.Core.Stimulus-class.html0000644000076500000240000003504011224565530024743 0ustar astrawstaff VisionEgg.Core.Stimulus
Package VisionEgg :: Module Core :: Class Stimulus
[frames] | no frames]

Class Stimulus

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     Stimulus

Base class for a stimulus.

Any stimulus element should be a subclass of this Stimulus class.
The draw() method contains the code executed before every buffer
swap in order to render the stimulus to the frame buffer.  It
should execute as quickly as possible.  The init_gl() method must
be called before the first call to draw() so that any internal
data, OpenGL display lists, and OpenGL:texture objects can be
established.

To illustrate the concept of the Stimulus class, here is a
description of several methods of drawing two spots.  If your
experiment displays two spots simultaneously, you could create two
instances of (a single subclass of) Stimulus, varying parameters
so each draws at a different location.  Another possibility is to
create one instance of a subclass that draws two spots.  Another,
somewhat obscure, possibility is to create a single instance and
add it to two different viewports.  (Something that will not work
would be adding the same instance two times to the same viewport.
It would also get drawn twice, although at exactly the same
location.)

OpenGL is a 'state machine', meaning that it has internal
parameters whose values vary and affect how it operates.  Because
of this inherent uncertainty, there are only limited assumptions
about the state of OpenGL that an instance of Stimulus should
expect when its draw() method is called.  Because the Vision Egg
loops through stimuli this also imposes some important behaviors:

First, the framebuffer will contain the results of any drawing
operations performed since the last buffer swap by other instances
of (subclasses of) Stimulus. Therefore, the order in which stimuli
are present in the stimuli list of an instance of Viewport may be
important.  Additionally, if there are overlapping viewports, the
order in which viewports are added to an instance of Screen is
important.

Second, previously established OpenGL display lists and OpenGL
texture objects will be available.  The __init__() method should
establish these things.

Third, there are several OpenGL state variables which are
commonly set by subclasses of Stimulus, and which cannot be
assumed to have any particular value at the time draw() is called.
These state variables are: blending mode and function, texture
state and environment, the matrix mode (modelview or projection),
the modelview matrix, depth mode and settings. Therefore, if the
draw() method depends on specific values for any of these states,
it must specify its own values to OpenGL.

Finally, a well-behaved Stimulus subclass resets any OpenGL state
values other than those listed above to their initial state before
draw() and init_gl() were called.  In other words, before your
stimulus changes the state of an OpenGL variable, use
glGetBoolean, glGetInteger, glGetFloat, or a similar function to
query its value and restore it later.  For example, upon calling
the draw() method, the projection matrix will be that which was
set by the viewport. If the draw() method alters the projection
matrix, it must be restored. The glPushMatrix() and glPopMatrix()
commands provide an easy way to do this.

The default projection of Viewport maps eye coordinates in a 1:1
fashion to window coordinates (in other words, it sets eye
coordinates to use pixel units from the lower left corner of the
viewport). Therefore the default parameters for a stimulus should
specify pixel coordinates if possible (such as for a 2D
stimulus). Assuming a window size of 640 by 480 for the default
parameters is a pretty safe way to do things.

Also, be sure to check for any assumptions made about the system
in the __init__ method.  For example, if your stimulus needs alpha
in the framebuffer, check the value of
glGetIntegerv(GL_ALPHA_BITS) and raise an exception if it is not
available.



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: ClassWithParameters.__init__

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.


visionegg-1.2.1/doc/reference/html/VisionEgg.Core.Viewport-class.html0000644000076500000240000004575011224565530024746 0ustar astrawstaff VisionEgg.Core.Viewport
Package VisionEgg :: Module Core :: Class Viewport
[frames] | no frames]

Class Viewport

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     Viewport

Connects stimuli to a screen.

A viewport defines a (possibly clipped region) of the screen on
which stimuli are drawn.

A screen may have multiple viewports.  The viewports may be
overlapping.

A viewport may have multiple stimuli.

A single stimulus may be drawn simultaneously by several
viewports, although this is typically useful only for 3D stimuli
to represent different views of the same object.

The coordinates of the stimulus are converted to screen
coordinates via several steps, the most important of which is the
projection, which is defined by an instance of the Projection
class.

By default, a viewport has a projection which maps eye coordinates
to viewport coordinates in 1:1 manner.  In other words, eye
coordinates specify pixel location in the viewport.

For cases where pixel units are not natural to describe
coordinates of a stimulus, the application should specify the a
projection other than the default.  This is usually the case for
3D stimuli.

For details of the projection and clipping process, see the
section 'Coordinate Transformations' in the book/online document
'The OpenGL Graphics System: A Specification'

Parameters
==========
anchor        -- How position parameter is interpreted (String)
                 Default: lowerleft
camera_matrix -- extrinsic camera parameter matrix (position and orientation) (Instance of <class 'VisionEgg.Core.ModelView'>)
                 Default: (determined at runtime)
depth_range   -- depth range (in object units) for rendering (Sequence2 of Real)
                 Default: (0, 1)
position      -- Position (in pixel units) within the screen (Sequence2 of Real)
                 Default: (0, 0)
projection    -- intrinsic camera parameter matrix (field of view, focal length, aspect ratio) (Instance of <class 'VisionEgg.Core.Projection'>)
                 Default: (determined at runtime)
screen        -- The screen in which this viewport is drawn (Instance of <class 'VisionEgg.Core.Screen'>)
                 Default: (determined at runtime)
size          -- Size (in pixel units) (Sequence2 of Real)
                 Default: (determined at runtime)
stimuli       -- sequence of stimuli to draw in screen (Sequence of Instance of <class 'VisionEgg.Core.Stimulus'>)
                 Default: (determined at runtime)



Instance Methods
 
__init__(self, **kw)
Create a new instance.
source code
 
make_new_pixel_coord_projection(self)
Create instance of Projection mapping eye coordinates 1:1 with pixel coordinates.
source code
 
make_current(self) source code
 
draw(self)
Set the viewport and draw stimuli.
source code
 
norm_device_2_window(self, norm_device_vertex)
Transform normalized device coordinates to window coordinates
source code
 
clip_2_window(self, eye_coords_vertex)
Transform clip coordinates to window coordinates
source code
 
eye_2_window(self, eye_coords_vertex)
Transform eye coordinates to window coordinates
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'scre...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create a new instance.

Required arguments:

screen

Optional arguments (specify parameter value other than default):

position -- defaults to (0,0), position relative to screen by anchor (see below)
anchor -- defaults to 'lowerleft'
size -- defaults to screen.size
projection -- defaults to self.make_new_pixel_coord_projection()
stimuli -- defaults to empty list

Overrides: ClassWithParameters.__init__

Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'screen':(None, ve_types.Instance(Scree\
n), 'The screen in which this viewport is drawn'), 'position':((0, 0),\
 ve_types.Sequence2(ve_types.Real), 'Position (in pixel units) within \
the screen'), 'anchor':('lowerleft', ve_types.String, 'How position pa\
rameter is interpreted'), 'depth_range':((0, 1), ve_types.Sequence2(ve\
_types.Real), 'depth range (in object units) for rendering'), 'size':(\
None, ve_types.Sequence2(ve_types.Real), 'Size (in pixel units)'), 'pr\
ojection':(None, ve_types.Instance(Projection), 'intrinsic camera para\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq-module.html0000644000076500000240000001753211224565530023122 0ustar astrawstaff VisionEgg.Daq
Package VisionEgg :: Module Daq
[frames] | no frames]

Module Daq

source code


Definition of data acquisition and triggering interfaces.

This module provides an interface to abstract data acquisition
devices.  To interface with real data acquisition devices, use a
module that subclasses the classes defined here.

*WARNING* This module has not been extensively tested or used, and should be
considered unstable.




Version: 1.1.dev

Classes
  Trigger
  ChannelParameters
  SignalType
  Analog
  Digital
  DaqMode
  Buffered
  Immediate
  Functionality
  Input
  Output
  Channel
  Device
visionegg-1.2.1/doc/reference/html/VisionEgg.Daq-pysrc.html0000644000076500000240000027277611224565530023012 0ustar astrawstaff VisionEgg.Daq
Package VisionEgg :: Module Daq
[frames] | no frames]

Source Code for Module VisionEgg.Daq

  1  # The Vision Egg: Daq 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  5  # URL: <http://www.visionegg.org/> 
  6  # 
  7  # Distributed under the terms of the GNU Lesser General Public License 
  8  # (LGPL). See LICENSE.TXT that came with this file. 
  9   
 10  """ 
 11  Definition of data acquisition and triggering interfaces. 
 12   
 13  This module provides an interface to abstract data acquisition 
 14  devices.  To interface with real data acquisition devices, use a 
 15  module that subclasses the classes defined here. 
 16   
 17  *WARNING* This module has not been extensively tested or used, and should be 
 18  considered unstable. 
 19   
 20  """ 
 21   
 22  import VisionEgg 
 23  import VisionEgg.ParameterTypes as ve_types 
 24   
 25  __version__ = VisionEgg.release_name 
 26   
27 -class Trigger(VisionEgg.ClassWithParameters):
28 pass
29
30 -class ChannelParameters(VisionEgg.ClassWithParameters):
31 pass
32
33 -class SignalType(ChannelParameters):
34 constant_parameters_and_defaults = { 35 'units':('Unknown units', 36 ve_types.String), 37 }
38 - def __init__(self,**kw):
39 if self.__class__ == SignalType: 40 raise RuntimeError("Trying to instantiate abstract base class.") 41 else: 42 ChannelParameters.__init__(self,**kw)
43
44 -class Analog(SignalType):
45 constant_parameters_and_defaults = { 46 'gain':(1.0, 47 ve_types.Real), 48 'offset':(0.0, 49 ve_types.Real)}
50
51 -class Digital(SignalType):
52 pass
53
54 -class DaqMode(ChannelParameters):
55 - def __init__(self,**kw):
56 if self.__class__ == DaqMode: 57 raise RuntimeError("Trying to instantiate abstract base class.") 58 else: 59 ChannelParameters.__init__(self,**kw)
60
61 -class Buffered(DaqMode):
62 parameters_and_defaults = { 63 'sample_rate_hz':(5000.0, 64 ve_types.Real), 65 'duration_sec':(5.0, 66 ve_types.Real), 67 'trigger':(None, 68 ve_types.Instance(Trigger)), 69 }
70
71 -class Immediate(DaqMode):
72 pass
73
74 -class Functionality(ChannelParameters):
75 - def __init__(self,**kw):
76 if self.__class__ == Functionality: 77 raise RuntimeError("Trying to instantiate abstract base class.") 78 else: 79 ChannelParameters.__init__(self,**kw)
80
81 -class Input(Functionality):
82 - def get_data(self):
83 raise RuntimeError("Must override get_data method with daq implementation!")
84
85 -class Output(Functionality):
86 - def put_data(self,data):
87 raise RuntimeError("Must override put_data method with daq implementation!")
88
89 -class Channel(VisionEgg.ClassWithParameters):
90 constant_parameters_and_defaults = { 91 'signal_type' : (None, 92 ve_types.Instance(SignalType)), 93 'daq_mode' : (None, 94 ve_types.Instance(DaqMode)), 95 'functionality' : (None, 96 ve_types.Instance(Functionality)), 97 }
98 - def __init__(self,**kw):
99 VisionEgg.ClassWithParameters.__init__(self,**kw) 100 self.constant_parameters.signal_type.channel = self 101 self.constant_parameters.daq_mode.channel = self 102 self.constant_parameters.functionality.channel = self 103 self.device = None # Not set yet
104
105 - def arm_trigger(self):
106 raise NotImpelemetedError("This method must be overridden.")
107
108 -class Device:
109 - def __init__(self, channels = None):
110 self.channels = [] 111 if channels is not None: 112 if type(channels) is not types.ListType: 113 raise ValueError("channels must be a list of channels") 114 for channel in channels: 115 self.add_channel( channel )
116
117 - def add_channel(self,channel):
118 # override this method if you need to do error checking 119 if isinstance(channel,Channel): 120 self.channels.append(channel) 121 else: 122 raise ValueError("%s not instance of VisionEgg.Daq.Channel"%channel) 123 channel.device = self
124

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Analog-class.html0000644000076500000240000002162411224565530024137 0ustar astrawstaff VisionEgg.Daq.Analog
Package VisionEgg :: Module Daq :: Class Analog
[frames] | no frames]

Class Analog

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
      ChannelParameters --+    
                          |    
                 SignalType --+
                              |
                             Analog

Instance Methods

Inherited from SignalType: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  constant_parameters_and_defaults = {'gain':(1.0, ve_types.Real...

Inherited from ClassWithParameters: __safe_for_unpickling__, parameters_and_defaults

Properties

Inherited from object: __class__

Class Variable Details

constant_parameters_and_defaults

Value:
{'gain':(1.0, ve_types.Real), 'offset':(0.0, ve_types.Real)}

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Buffered-class.html0000644000076500000240000002213211224565530024453 0ustar astrawstaff VisionEgg.Daq.Buffered
Package VisionEgg :: Module Daq :: Class Buffered
[frames] | no frames]

Class Buffered

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
      ChannelParameters --+    
                          |    
                    DaqMode --+
                              |
                             Buffered

Instance Methods

Inherited from DaqMode: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'sample_rate_hz':(5000.0, ve_types....

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Class Variable Details

parameters_and_defaults

Value:
{'sample_rate_hz':(5000.0, ve_types.Real), 'duration_sec':(5.0, ve_typ\
es.Real), 'trigger':(None, ve_types.Instance(Trigger)),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Channel-class.html0000644000076500000240000002664611224565530024317 0ustar astrawstaff VisionEgg.Daq.Channel
Package VisionEgg :: Module Daq :: Class Channel
[frames] | no frames]

Class Channel

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     Channel

Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code
 
arm_trigger(self) source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  constant_parameters_and_defaults = {'signal_type':(None, ve_ty...

Inherited from ClassWithParameters: __safe_for_unpickling__, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

Class Variable Details

constant_parameters_and_defaults

Value:
{'signal_type':(None, ve_types.Instance(SignalType)), 'daq_mode':(None\
, ve_types.Instance(DaqMode)), 'functionality':(None, ve_types.Instanc\
e(Functionality)),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.ChannelParameters-class.html0000644000076500000240000001661311224565530026334 0ustar astrawstaff VisionEgg.Daq.ChannelParameters
Package VisionEgg :: Module Daq :: Class ChannelParameters
[frames] | no frames]

Class ChannelParameters

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     ChannelParameters

Instance Methods

Inherited from ClassWithParameters: __getstate__, __init__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.DaqMode-class.html0000644000076500000240000002264111224565530024250 0ustar astrawstaff VisionEgg.Daq.DaqMode
Package VisionEgg :: Module Daq :: Class DaqMode
[frames] | no frames]

Class DaqMode

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
      ChannelParameters --+
                          |
                         DaqMode

Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Device-class.html0000644000076500000240000001331311224565530024131 0ustar astrawstaff VisionEgg.Daq.Device
Package VisionEgg :: Module Daq :: Class Device
[frames] | no frames]

Class Device

source code

Instance Methods
 
__init__(self, channels=None) source code
 
add_channel(self, channel) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Digital-class.html0000644000076500000240000001756611224565530024325 0ustar astrawstaff VisionEgg.Daq.Digital
Package VisionEgg :: Module Daq :: Class Digital
[frames] | no frames]

Class Digital

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
      ChannelParameters --+    
                          |    
                 SignalType --+
                              |
                             Digital

Instance Methods

Inherited from SignalType: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from SignalType: constant_parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__, parameters_and_defaults

Properties

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Functionality-class.html0000644000076500000240000002272711224565530025573 0ustar astrawstaff VisionEgg.Daq.Functionality
Package VisionEgg :: Module Daq :: Class Functionality
[frames] | no frames]

Class Functionality

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
      ChannelParameters --+
                          |
                         Functionality

Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Immediate-class.html0000644000076500000240000001735411224565530024641 0ustar astrawstaff VisionEgg.Daq.Immediate
Package VisionEgg :: Module Daq :: Class Immediate
[frames] | no frames]

Class Immediate

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
      ChannelParameters --+    
                          |    
                    DaqMode --+
                              |
                             Immediate

Instance Methods

Inherited from DaqMode: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Input-class.html0000644000076500000240000002054411224565530024035 0ustar astrawstaff VisionEgg.Daq.Input
Package VisionEgg :: Module Daq :: Class Input
[frames] | no frames]

Class Input

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
      ChannelParameters --+    
                          |    
              Functionality --+
                              |
                             Input

Instance Methods
 
get_data(self) source code

Inherited from Functionality: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Output-class.html0000644000076500000240000002063611224565530024240 0ustar astrawstaff VisionEgg.Daq.Output
Package VisionEgg :: Module Daq :: Class Output
[frames] | no frames]

Class Output

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
      ChannelParameters --+    
                          |    
              Functionality --+
                              |
                             Output

Instance Methods
 
put_data(self, data) source code

Inherited from Functionality: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.SignalType-class.html0000644000076500000240000002512011224565530025010 0ustar astrawstaff VisionEgg.Daq.SignalType
Package VisionEgg :: Module Daq :: Class SignalType
[frames] | no frames]

Class SignalType

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
      ChannelParameters --+
                          |
                         SignalType

Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  constant_parameters_and_defaults = {'units':('Unknown units', ...

Inherited from ClassWithParameters: __safe_for_unpickling__, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

Class Variable Details

constant_parameters_and_defaults

Value:
{'units':('Unknown units', ve_types.String),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Daq.Trigger-class.html0000644000076500000240000001651711224565530024346 0ustar astrawstaff VisionEgg.Daq.Trigger
Package VisionEgg :: Module Daq :: Class Trigger
[frames] | no frames]

Class Trigger

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     Trigger

Instance Methods

Inherited from ClassWithParameters: __getstate__, __init__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqKeyboard-module.html0000644000076500000240000001331511224565530024576 0ustar astrawstaff VisionEgg.DaqKeyboard
Package VisionEgg :: Module DaqKeyboard
[frames] | no frames]

Module DaqKeyboard

source code


Data acquisition and triggering over the keyboard.

This module was programmed using information from the web site
http://www.pygame.org/docs/ref/pygame_key.html



Classes
  KeyboardInput
  KeyboardTriggerInController
Use the keyboard to trigger the presentation.
Variables
  __version__ = VisionEgg.release_name
visionegg-1.2.1/doc/reference/html/VisionEgg.DaqKeyboard-pysrc.html0000644000076500000240000014464411224565530024463 0ustar astrawstaff VisionEgg.DaqKeyboard
Package VisionEgg :: Module DaqKeyboard
[frames] | no frames]

Source Code for Module VisionEgg.DaqKeyboard

 1  # The Vision Egg: DaqKeyboard 
 2  # 
 3  # Author(s): Hubertus Becker <hubertus.becker@uni-tuebingen.de> 
 4  # Copyright: (C) 2005 by Hertie Institute for Clinical Brain Research, 
 5  #            Department of Cognitive Neurology, University of Tuebingen 
 6  # URL:       http://www.hubertus-becker.de/resources/visionegg/ 
 7  # 
 8  # This library is free software; you can redistribute it and/or modify 
 9  # it under the terms of the GNU Lesser General Public License as 
10  # published by the Free Software Foundation; either version 2.1 of 
11  # the License, or (at your option) any later version. 
12   
13  """ 
14  Data acquisition and triggering over the keyboard. 
15   
16  This module was programmed using information from the web site 
17  http://www.pygame.org/docs/ref/pygame_key.html 
18   
19  """ 
20   
21  #################################################################### 
22  # 
23  #        Import all the necessary packages 
24  # 
25  #################################################################### 
26   
27  import VisionEgg 
28  import VisionEgg.Core 
29  import VisionEgg.FlowControl 
30  import VisionEgg.ParameterTypes as ve_types 
31  import sys 
32  import pygame 
33   
34  __version__ = VisionEgg.release_name 
35   
36  #################################################################### 
37  # 
38  #        KeyboardInput 
39  # 
40  #################################################################### 
41   
42 -class KeyboardInput:
43
44 - def get_pygame_data(self):
45 """Get keyboard input (return values are in pygame.locals.* notation).""" 46 keys = pygame.key.get_pressed() 47 return [k for k, v in enumerate(keys) if v]
48
49 - def get_string_data(self):
50 """Get keyboard input (return values are converted to keyboard symbols (strings)).""" 51 pressed = self.get_pygame_data() 52 keys_pressed = [] 53 for k in pressed: # Convert integers to keyboard symbols (strings) 54 keys_pressed.append(pygame.key.name(k)) 55 return keys_pressed
56 57 get_data = get_string_data # Create alias
58 59 #################################################################### 60 # 61 # KeyboardTriggerInController 62 # 63 #################################################################### 64
65 -class KeyboardTriggerInController(VisionEgg.FlowControl.Controller):
66 """Use the keyboard to trigger the presentation.""" 67
68 - def __init__(self,key=pygame.locals.K_1):
69 VisionEgg.FlowControl.Controller.__init__( 70 self, 71 return_type=ve_types.Integer, 72 eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) 73 self.key = key
74
75 - def during_go_eval(self):
76 return 1
77
78 - def between_go_eval(self):
79 for event in pygame.event.get(): 80 # if (event.type == pygame.locals.KEYUP) or (event.type == pygame.locals.KEYDOWN): 81 if event.type == pygame.locals.KEYDOWN: 82 if event.key == self.key: 83 return 1 84 else: 85 return 0
86

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqKeyboard.KeyboardInput-class.html0000644000076500000240000001512111224565530027172 0ustar astrawstaff VisionEgg.DaqKeyboard.KeyboardInput
Package VisionEgg :: Module DaqKeyboard :: Class KeyboardInput
[frames] | no frames]

Class KeyboardInput

source code

Instance Methods
 
get_pygame_data(self)
Get keyboard input (return values are in pygame.locals.* notation).
source code
 
get_string_data(self)
Get keyboard input (return values are converted to keyboard symbols (strings)).
source code
 
get_data(self)
Get keyboard input (return values are converted to keyboard symbols (strings)).
source code
visionegg-1.2.1/doc/reference/html/VisionEgg.DaqKeyboard.KeyboardTriggerInController-class.html0000644000076500000240000003363711224565530032045 0ustar astrawstaff VisionEgg.DaqKeyboard.KeyboardTriggerInController
Package VisionEgg :: Module DaqKeyboard :: Class KeyboardTriggerInController
[frames] | no frames]

Class KeyboardTriggerInController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        KeyboardTriggerInController

Use the keyboard to trigger the presentation.



Instance Methods
 
__init__(self, key=pygame.locals.K_1)
Create instance of Controller.
source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, key=pygame.locals.K_1)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.Controller.__init__
(inherited documentation)

during_go_eval(self)

source code 
Called by Presentation. Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.during_go_eval
(inherited documentation)

between_go_eval(self)

source code 
Called by Presentation. Evaluate between runs of the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.between_go_eval
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqLPT-module.html0000644000076500000240000001656211224565530023504 0ustar astrawstaff VisionEgg.DaqLPT
Package VisionEgg :: Module DaqLPT
[frames] | no frames]

Module DaqLPT

source code


Data acquisition and triggering over the parallel port.

This module was programmed using information from "Interfacing the
Standard Parallel Port" by Craig Peacock,
http://www.senet.com.au/~cpeacock.

You may also be interested in http://www.lvr.com/files/ibmlpt.txt.

This module only uses the Standard Parallel Port (SPP) protocol, not
ECP or EPP.  You may have to set your computer's BIOS accordingly.

You may need to be root or otherwise have permission to access the
parallel port.

Example usage:

>>> from VisionEgg.DaqLPT import raw_lpt_module
>>> address = 0x378
>>> out_value = 0
>>> raw_lpt_module.out( address, out_value )
>>> in_value = raw_lpt_module.inp( address+1 )



Classes
  LPTInput
  LPTOutput
  LPTChannel
A data acquisition channel using the parallel port.
  LPTDevice
A single parallel port.
  LPTTriggerOutController
Use 8 bits of digital output for triggering and frame timing verification.
  LPTTriggerInController
Variables
  __version__ = VisionEgg.release_name
visionegg-1.2.1/doc/reference/html/VisionEgg.DaqLPT-pysrc.html0000644000076500000240000034150211224565530023352 0ustar astrawstaff VisionEgg.DaqLPT
Package VisionEgg :: Module DaqLPT
[frames] | no frames]

Source Code for Module VisionEgg.DaqLPT

  1  # The Vision Egg: DaqLPT 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Copyright (C) 2005 Hubertus Becker 
  5  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Data acquisition and triggering over the parallel port. 
 13   
 14  This module was programmed using information from "Interfacing the 
 15  Standard Parallel Port" by Craig Peacock, 
 16  http://www.senet.com.au/~cpeacock. 
 17   
 18  You may also be interested in http://www.lvr.com/files/ibmlpt.txt. 
 19   
 20  This module only uses the Standard Parallel Port (SPP) protocol, not 
 21  ECP or EPP.  You may have to set your computer's BIOS accordingly. 
 22   
 23  You may need to be root or otherwise have permission to access the 
 24  parallel port. 
 25   
 26  Example usage: 
 27   
 28  >>> from VisionEgg.DaqLPT import raw_lpt_module 
 29  >>> address = 0x378 
 30  >>> out_value = 0 
 31  >>> raw_lpt_module.out( address, out_value ) 
 32  >>> in_value = raw_lpt_module.inp( address+1 ) 
 33   
 34  """ 
 35   
 36  #################################################################### 
 37  # 
 38  #        Import all the necessary packages 
 39  # 
 40  #################################################################### 
 41   
 42  import VisionEgg 
 43  import VisionEgg.Core 
 44  import VisionEgg.FlowControl 
 45  import VisionEgg.Daq 
 46  import VisionEgg.ParameterTypes as ve_types 
 47  import sys 
 48   
 49  # See the raw LPT module for your platform for direct LPT access 
 50  # without VisionEgg DAQ overhead.  In particular, the inp and out 
 51  # functions are useful. 
 52   
 53  if sys.platform == 'win32': 
 54      try: 
 55          # Dincer Aydin's module http://www.geocities.com/dinceraydin 
 56          import winioport as raw_lpt_module 
 57      except ImportError: 
 58          # Andrew Straw's module http://www.its.caltech.edu/~astraw/coding.html 
 59          import dlportio as raw_lpt_module 
 60  elif sys.platform.startswith('linux'): 
 61      import VisionEgg._raw_lpt_linux as raw_lpt_module 
 62  elif sys.platform.startswith('irix'): 
 63  ### IRIX implementation not done, but possible 
 64      raise NotImplementedError("VisionEgg.DaqLPT not implemented on IRIX") 
 65  ##    import VisionEgg._raw_plp_irix 
 66  ##    raw_lpt_module = VisionEgg._raw_plp_irix 
 67  else: 
 68      raise RuntimeError("VisionEgg.DaqLPT not supported on this platform") 
 69   
 70  __version__ = VisionEgg.release_name 
 71   
72 -class LPTInput(VisionEgg.Daq.Input):
73 - def get_data(self):
74 """Get status bits 0-7 of the LPT port. 75 76 The status bits were not meant for high speed digital input. 77 Nevertheless, for sampling one or two digital inputs at slow 78 rates, they work fine. 79 80 Bits 4 and 5 (pins 13 and 12, respectively) should be first 81 choice to sample a digital voltage. The other bits have some 82 oddities. Bits 0 and 1 are designated reserved. Others are 83 "active low"; they show a logic 0 when +5v is applied. 84 85 bit3 = value & 0x08 86 bit4 = value & 0x10 87 bit5 = value & 0x20 88 bit6 = value & 0x40 89 """ 90 return raw_lpt_module.inp(self.channel.device.base_address+1)
91
92 -class LPTOutput(VisionEgg.Daq.Output):
93 - def put_data(self,data):
94 """Set output bits 0-7 (pins 2-9) on the LPT port.""" 95 raw_lpt_module.out(self.channel.device.base_address,data)
96 - def __del__(self):
97 """Set output bits low when closing.""" 98 raw_lpt_module.out(self.channel.device.base_address,0)
99
100 -class LPTChannel(VisionEgg.Daq.Channel):
101 """A data acquisition channel using the parallel port."""
102 - def __init__(self,**kw):
103 if not 'raw_lpt_module' in globals().keys(): 104 raise RuntimeError("LPT output not supported on this platform.") 105 VisionEgg.Daq.Channel.__init__(self,**kw) 106 signal_type = self.constant_parameters.signal_type 107 if not isinstance(signal_type,VisionEgg.Daq.Digital): 108 raise ValueError("Channel must be digital.") 109 daq_mode = self.constant_parameters.daq_mode 110 if not isinstance(daq_mode,VisionEgg.Daq.Immediate): 111 raise ValueError("Channel must be immediate mode.") 112 functionality = self.constant_parameters.functionality 113 if not isinstance(functionality,LPTInput): 114 if not isinstance(functionality,LPTOutput): 115 raise ValueError("Channel functionality must be instance of LPTInput or LPTOutput.")
116
117 -class LPTDevice(VisionEgg.Daq.Device):
118 """A single parallel port. (Line PrinTer port.) 119 120 Typically, LPT1 has a base address of 0x0378, and LPT2 has a base 121 address of 0x0278.""" 122
123 - def __init__(self,base_address=0x378,**kw):
124 if not 'raw_lpt_module' in globals().keys(): 125 raise RuntimeError("LPT output not supported on this platform.") 126 VisionEgg.Daq.Device.__init__(self,**kw) 127 for channel in self.channels: 128 if not isinstance(channel,LPTChannel): 129 raise ValueError("LPTDevice only has LPTChannels.") 130 self.base_address = base_address
131
132 - def add_channel(self,channel):
133 if not isinstance(channel,LPTChannel): 134 raise ValueError("LPTDevice only has LPTChannels.") 135 VisionEgg.Daq.Device.add_channel(self,channel)
136
137 -class LPTTriggerOutController(VisionEgg.FlowControl.Controller):
138 """Use 8 bits of digital output for triggering and frame timing verification. 139 140 Bit 0 (pin 2) goes high when the go loop begins and low when the 141 loop ends. Bits 1-7 (pins 3-9) count the frame_number (modulo 142 2^7) in binary. Looking at any one of these pins therefore 143 provides verification that your stimulus is not skipping 144 frames.""" 145
146 - def __init__(self,lpt_device=None):
147 if not 'raw_lpt_module' in globals().keys(): 148 raise RuntimeError("LPT output not supported on this platform.") 149 VisionEgg.FlowControl.Controller.__init__(self, 150 return_type=ve_types.NoneType, 151 eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) 152 # Initialize DAQ stuff: 153 self.trigger_out_channel = LPTChannel(signal_type = VisionEgg.Daq.Digital(), 154 daq_mode = VisionEgg.Daq.Immediate(), 155 functionality = LPTOutput()) 156 if lpt_device is None: 157 self.device = LPTDevice() 158 else: 159 if not isinstance(lpt_device,LPTDevice): 160 raise ValueError("lpt_device must be instance of LPTDevice.") 161 self.device = lpt_device 162 self.device.add_channel(self.trigger_out_channel) 163 164 self.total_frames = 0
165 - def during_go_eval(self):
166 self.total_frames = (self.total_frames + 1) % (2**7) 167 value = self.total_frames*2 + 1 168 self.trigger_out_channel.constant_parameters.functionality.put_data(value)
169 - def between_go_eval(self):
170 self.total_frames = (self.total_frames + 1) % (2**7) 171 value = self.total_frames*2 + 0 172 self.trigger_out_channel.constant_parameters.functionality.put_data(value)
173
174 -class LPTTriggerInController(VisionEgg.FlowControl.Controller):
175 - def __init__(self,lpt_device=None,pin=13):
176 if not 'raw_lpt_module' in globals().keys(): 177 raise RuntimeError("LPT input not supported on this platform.") 178 VisionEgg.FlowControl.Controller.__init__(self, 179 return_type=ve_types.Integer, 180 eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) 181 # Initialize DAQ stuff: 182 self.trigger_in_channel = LPTChannel(signal_type = VisionEgg.Daq.Digital(), 183 daq_mode = VisionEgg.Daq.Immediate(), 184 functionality = LPTInput()) 185 if lpt_device is None: 186 self.device = LPTDevice() 187 else: 188 if not isinstance(lpt_device,LPTDevice): 189 raise ValueError("lpt_device must be instance of LPTDevice.") 190 self.device = lpt_device 191 self.device.add_channel(self.trigger_in_channel) 192 if pin==15: 193 bit = 3 194 elif pin==13: 195 bit = 4 196 elif pin==12: 197 bit = 5 198 elif pin==10: 199 bit = 6 200 elif pin==11: 201 bit = 7 202 else: 203 raise ValueError("Only pins 10, 11, 12, 13 and 15 supported at this time.") 204 self.mask = 2**bit
205 - def during_go_eval(self):
206 return 1
207 - def between_go_eval(self):
208 value = self.trigger_in_channel.constant_parameters.functionality.get_data() 209 return (value & self.mask)
210

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqLPT.LPTChannel-class.html0000644000076500000240000002351211224565530025244 0ustar astrawstaff VisionEgg.DaqLPT.LPTChannel
Package VisionEgg :: Module DaqLPT :: Class LPTChannel
[frames] | no frames]

Class LPTChannel

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
            Daq.Channel --+
                          |
                         LPTChannel

A data acquisition channel using the parallel port.



Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code

Inherited from Daq.Channel: arm_trigger

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from Daq.Channel: constant_parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: Daq.Channel.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqLPT.LPTDevice-class.html0000644000076500000240000002027111224565530025072 0ustar astrawstaff VisionEgg.DaqLPT.LPTDevice
Package VisionEgg :: Module DaqLPT :: Class LPTDevice
[frames] | no frames]

Class LPTDevice

source code

Daq.Device --+
             |
            LPTDevice

A single parallel port. (Line PrinTer port.)

Typically, LPT1 has a base address of 0x0378, and LPT2 has a base
address of 0x0278.



Instance Methods
 
__init__(self, base_address=0x378, **kw) source code
 
add_channel(self, channel) source code
Method Details

__init__(self, base_address=0x378, **kw)
(Constructor)

source code 
Overrides: Daq.Device.__init__

add_channel(self, channel)

source code 
Overrides: Daq.Device.add_channel

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqLPT.LPTInput-class.html0000644000076500000240000002434411224565530024777 0ustar astrawstaff VisionEgg.DaqLPT.LPTInput
Package VisionEgg :: Module DaqLPT :: Class LPTInput
[frames] | no frames]

Class LPTInput

source code

         object --+                
                  |                
ClassWithParameters --+            
                      |            
  Daq.ChannelParameters --+        
                          |        
          Daq.Functionality --+    
                              |    
                      Daq.Input --+
                                  |
                                 LPTInput

Instance Methods
 
get_data(self)
Get status bits 0-7 of the LPT port.
source code

Inherited from Daq.Functionality: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

get_data(self)

source code 
Get status bits 0-7 of the LPT port.

The status bits were not meant for high speed digital input.
Nevertheless, for sampling one or two digital inputs at slow
rates, they work fine.

Bits 4 and 5 (pins 13 and 12, respectively) should be first
choice to sample a digital voltage.  The other bits have some
oddities. Bits 0 and 1 are designated reserved. Others are
"active low"; they show a logic 0 when +5v is applied.

bit3 = value & 0x08
bit4 = value & 0x10
bit5 = value & 0x20
bit6 = value & 0x40

Overrides: Daq.Input.get_data

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqLPT.LPTOutput-class.html0000644000076500000240000002504411224565530025176 0ustar astrawstaff VisionEgg.DaqLPT.LPTOutput
Package VisionEgg :: Module DaqLPT :: Class LPTOutput
[frames] | no frames]

Class LPTOutput

source code

         object --+                
                  |                
ClassWithParameters --+            
                      |            
  Daq.ChannelParameters --+        
                          |        
          Daq.Functionality --+    
                              |    
                     Daq.Output --+
                                  |
                                 LPTOutput

Instance Methods
 
put_data(self, data)
Set output bits 0-7 (pins 2-9) on the LPT port.
source code
 
__del__(self)
Set output bits low when closing.
source code

Inherited from Daq.Functionality: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

put_data(self, data)

source code 
Set output bits 0-7 (pins 2-9) on the LPT port.

Overrides: Daq.Output.put_data

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqLPT.LPTTriggerInController-class.html0000644000076500000240000003352011224565530027632 0ustar astrawstaff VisionEgg.DaqLPT.LPTTriggerInController
Package VisionEgg :: Module DaqLPT :: Class LPTTriggerInController
[frames] | no frames]

Class LPTTriggerInController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        LPTTriggerInController

Instance Methods
 
__init__(self, lpt_device=None, pin=13)
Create instance of Controller.
source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, lpt_device=None, pin=13)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.Controller.__init__
(inherited documentation)

during_go_eval(self)

source code 
Called by Presentation. Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.during_go_eval
(inherited documentation)

between_go_eval(self)

source code 
Called by Presentation. Evaluate between runs of the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.between_go_eval
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.DaqLPT.LPTTriggerOutController-class.html0000644000076500000240000003405411224565530030036 0ustar astrawstaff VisionEgg.DaqLPT.LPTTriggerOutController
Package VisionEgg :: Module DaqLPT :: Class LPTTriggerOutController
[frames] | no frames]

Class LPTTriggerOutController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        LPTTriggerOutController

Use 8 bits of digital output for triggering and frame timing verification.

Bit 0 (pin 2) goes high when the go loop begins and low when the
loop ends.  Bits 1-7 (pins 3-9) count the frame_number (modulo
2^7) in binary.  Looking at any one of these pins therefore
provides verification that your stimulus is not skipping
frames.



Instance Methods
 
__init__(self, lpt_device=None)
Create instance of Controller.
source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, lpt_device=None)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.Controller.__init__
(inherited documentation)

during_go_eval(self)

source code 
Called by Presentation. Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.during_go_eval
(inherited documentation)

between_go_eval(self)

source code 
Called by Presentation. Evaluate between runs of the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.between_go_eval
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.darwin_getrefresh-module.html0000644000076500000240000001112211224565531026105 0ustar astrawstaff VisionEgg.darwin_getrefresh
Package VisionEgg :: Module darwin_getrefresh
[frames] | no frames]

Module darwin_getrefresh

source code

Variables
  getrefresh = _darwin_getrefresh.getrefresh
visionegg-1.2.1/doc/reference/html/VisionEgg.darwin_getrefresh-pysrc.html0000644000076500000240000004126511224565531025773 0ustar astrawstaff VisionEgg.darwin_getrefresh
Package VisionEgg :: Module darwin_getrefresh
[frames] | no frames]

Source Code for Module VisionEgg.darwin_getrefresh

 1  # This file was created automatically by SWIG. 
 2  # Don't modify this file, modify the SWIG interface instead. 
 3  # This file is compatible with both classic and new-style classes. 
 4   
 5  import _darwin_getrefresh 
 6   
7 -def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
8 if (name == "this"): 9 if isinstance(value, class_type): 10 self.__dict__[name] = value.this 11 if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown 12 del value.thisown 13 return 14 method = class_type.__swig_setmethods__.get(name,None) 15 if method: return method(self,value) 16 if (not static) or hasattr(self,name) or (name == "thisown"): 17 self.__dict__[name] = value 18 else: 19 raise AttributeError("You cannot add attributes to %s" % self)
20
21 -def _swig_setattr(self,class_type,name,value):
22 return _swig_setattr_nondynamic(self,class_type,name,value,0)
23
24 -def _swig_getattr(self,class_type,name):
25 method = class_type.__swig_getmethods__.get(name,None) 26 if method: return method(self) 27 raise AttributeError,name
28 29 import types 30 try: 31 _object = types.ObjectType 32 _newclass = 1 33 except AttributeError:
34 - class _object : pass
35 _newclass = 0 36 del types 37 38 39 40 getrefresh = _darwin_getrefresh.getrefresh 41

visionegg-1.2.1/doc/reference/html/VisionEgg.Deprecated-module.html0000644000076500000240000001123011224565530024442 0ustar astrawstaff VisionEgg.Deprecated
Package VisionEgg :: Module Deprecated
[frames] | no frames]

Module Deprecated

source code


Bits of code which will be removed in the future.



Classes
  Message
DEPRECATED Handles message/warning/error printing, exception raising.
visionegg-1.2.1/doc/reference/html/VisionEgg.Deprecated-pysrc.html0000644000076500000240000011564611224565530024335 0ustar astrawstaff VisionEgg.Deprecated
Package VisionEgg :: Module Deprecated
[frames] | no frames]

Source Code for Module VisionEgg.Deprecated

  1  # The Vision Egg: Deprecated 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Copyright (C) 2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Bits of code which will be removed in the future. 
 13   
 14  """ 
 15   
 16  import VisionEgg 
 17  import sys, os 
 18  import logging                              # available in Python 2.3 
 19   
 20  #################################################################### 
 21  # 
 22  #        Error handling and assumption checking 
 23  # 
 24  #################################################################### 
 25   
26 -class Message:
27 """DEPRECATED Handles message/warning/error printing, exception raising.""" 28 29 # Levels are: 30 TRIVIAL = 0 31 NAG = 1 32 INFO = 2 33 DEPRECATION = 3 34 WARNING = 4 35 ERROR = 5 36 FATAL = 6 37
38 - def __init__(self):
39 ## script_name = sys.argv[0] 40 ## if not script_name: 41 ## script_name = "(interactive shell)" 42 self.pid = os.getpid()
43 ## self.logger.info("Script "+script_name+" started Vision Egg %s with process id %d."%(VisionEgg.release_name,self.pid)) 44
45 - def add(self,message,level=INFO,preserve_formatting=0,no_sys_stderr=0):
46 level_translate = { 47 # convert from old VisionEgg levels to new logging module levels 48 Message.TRIVIAL : logging.DEBUG, 49 Message.NAG : logging.DEBUG, 50 Message.INFO : logging.INFO, 51 Message.DEPRECATION : logging.WARNING, 52 Message.WARNING : logging.WARNING, 53 Message.ERROR : logging.ERROR, 54 Message.FATAL : logging.CRITICAL, 55 } 56 new_level = level_translate[ level ] 57 if not hasattr(self,"logger"): 58 self.logger = logging.getLogger('VisionEgg.Deprecated') 59 self.logger.log(new_level,message + '\n(sent using deprecated VisionEgg.Core.Message class)')
60
61 - def format_string(self,in_str):
62 # This probably a slow way to do things, but it works! 63 min_line_length = 70 64 in_list = in_str.split() 65 out_str = "" 66 cur_line = "" 67 for word in in_list: 68 cur_line = cur_line + word + " " 69 if len(cur_line) > min_line_length: 70 out_str = out_str + cur_line[:-1] + "\n" 71 cur_line = " " 72 if cur_line.strip(): 73 # only add another newline if the last line done is non-empty 74 out_str = out_str + cur_line + "\n" 75 return out_str
76
77 - def handle(self):
78 if not self._sent_initial_newline: 79 self.output_stream.write("\n",_no_sys_stderr=1) 80 self.output_stream.flush() 81 self._sent_initial_newline = 1 82 while len(self.message_queue) > 0: 83 my_str = "" 84 level,text,preserve_formatting,date_str,no_sys_stderr = self.message_queue.pop(0) 85 if level >= self.print_level: 86 my_str= my_str+date_str+" " 87 if self.pid: 88 my_str += "(%d) "%(self.pid,) 89 #my_str=my_str+self.prefix+" " 90 if level == Message.TRIVIAL: 91 my_str=my_str+"trivial" 92 elif level == Message.INFO: 93 my_str=my_str+"info" 94 elif level == Message.NAG: 95 my_str=my_str+"nag" 96 elif level == Message.DEPRECATION: 97 my_str=my_str+"DEPRECATION WARNING" 98 elif level == Message.WARNING: 99 my_str=my_str+"WARNING" 100 elif level == Message.ERROR: 101 my_str=my_str+"ERROR" 102 elif level == Message.FATAL: 103 my_str=my_str+"FATAL" 104 my_str += ": " 105 my_str += text 106 if not preserve_formatting: 107 my_str = self.format_string(my_str) 108 self.output_stream.write(my_str,_no_sys_stderr=no_sys_stderr) 109 self.output_stream.flush() 110 if level >= self.exception_level: 111 raise RuntimeError(text) 112 if level == Message.FATAL: 113 sys.exit(-1)
114

visionegg-1.2.1/doc/reference/html/VisionEgg.Deprecated.Message-class.html0000644000076500000240000002302011224565530025645 0ustar astrawstaff VisionEgg.Deprecated.Message
Package VisionEgg :: Module Deprecated :: Class Message
[frames] | no frames]

Class Message

source code

DEPRECATED Handles message/warning/error printing, exception raising.



Instance Methods
 
__init__(self) source code
 
add(self, message, level=INFO, preserve_formatting=0, no_sys_stderr=0) source code
 
format_string(self, in_str) source code
 
handle(self) source code
Class Variables
  TRIVIAL = 0
  NAG = 1
  INFO = 2
  DEPRECATION = 3
  WARNING = 4
  ERROR = 5
  FATAL = 6
visionegg-1.2.1/doc/reference/html/VisionEgg.Dots-module.html0000644000076500000240000001553711224565530023331 0ustar astrawstaff VisionEgg.Dots
Package VisionEgg :: Module Dots
[frames] | no frames]

Module Dots

source code


Random dot stimuli.



Classes
  DotArea2D
Random dots of constant velocity Every dot has the same velocity.
Functions
 
draw_dots(xs, ys, zs)
Python method for drawing dots.
source code
Function Details

draw_dots(xs, ys, zs)

source code 
Python method for drawing dots.  May be replaced by a faster C version.


visionegg-1.2.1/doc/reference/html/VisionEgg.Dots-pysrc.html0000644000076500000240000032277011224565530023204 0ustar astrawstaff VisionEgg.Dots
Package VisionEgg :: Module Dots
[frames] | no frames]

Source Code for Module VisionEgg.Dots

  1  # The Vision Egg: Dots 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Copyright (C) 2005,2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Random dot stimuli. 
 13   
 14  """ 
 15   
 16  #################################################################### 
 17  # 
 18  #        Import all the necessary packages 
 19  # 
 20  #################################################################### 
 21   
 22  import logging 
 23   
 24  import VisionEgg 
 25  import VisionEgg.Core 
 26  import VisionEgg.ParameterTypes as ve_types 
 27   
 28  import numpy.oldnumeric as Numeric, numpy.oldnumeric.random_array as RandomArray 
 29  import math, types, string 
 30   
 31  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
 32   
 33  ### C version of draw_dots() isn't (yet) as fast as Python version: 
 34  ##import VisionEgg._draw_in_c 
 35  ##draw_dots = VisionEgg._draw_in_c.draw_dots # draw in C for speed 
 36   
37 -def draw_dots(xs,ys,zs):
38 """Python method for drawing dots. May be replaced by a faster C version.""" 39 if not (len(xs) == len(ys) == len(zs)): 40 raise ValueError("All input arguments must be same length") 41 gl.glBegin(gl.GL_POINTS) 42 for i in xrange(len(xs)): 43 gl.glVertex3f(xs[i],ys[i],zs[i]) 44 gl.glEnd()
45
46 -class DotArea2D(VisionEgg.Core.Stimulus):
47 """Random dots of constant velocity 48 49 Every dot has the same velocity. Some fraction of the dots all 50 move in the one direction, while the rest move in random 51 directions. Dots wrap around edges. Each dot has a lifespan. 52 53 This is just one example of the endless variations on drawing random dots. 54 55 Parameters 56 ========== 57 anchor -- (String) 58 Default: center 59 anti_aliasing -- (Boolean) 60 Default: True 61 color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 62 Default: (1.0, 1.0, 1.0) 63 depth -- (Real) 64 Default: (determined at runtime) 65 dot_lifespan_sec -- (Real) 66 Default: 5.0 67 dot_size -- (Real) 68 Default: 4.0 69 on -- (Boolean) 70 Default: True 71 position -- (Sequence2 of Real) 72 Default: (320.0, 240.0) 73 signal_direction_deg -- (Real) 74 Default: 90.0 75 signal_fraction -- (Real) 76 Default: 0.5 77 size -- (Sequence2 of Real) 78 Default: (300.0, 300.0) 79 velocity_pixels_per_sec -- (Real) 80 Default: 10.0 81 82 Constant Parameters 83 =================== 84 num_dots -- (UnsignedInteger) 85 Default: 100 86 """ 87 88 parameters_and_defaults = { 89 'on' : ( True, 90 ve_types.Boolean ), 91 'position' : ( ( 320.0, 240.0 ), # in eye coordinates 92 ve_types.Sequence2(ve_types.Real) ), 93 'anchor' : ('center', 94 ve_types.String), 95 'size' : ( ( 300.0, 300.0 ), # in eye coordinates 96 ve_types.Sequence2(ve_types.Real) ), 97 'signal_fraction' : ( 0.5, 98 ve_types.Real ), 99 'signal_direction_deg' : ( 90.0, 100 ve_types.Real ), 101 'velocity_pixels_per_sec' : ( 10.0, 102 ve_types.Real ), 103 'dot_lifespan_sec' : ( 5.0, 104 ve_types.Real ), 105 'color' : ((1.0,1.0,1.0), 106 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 107 ve_types.Sequence4(ve_types.Real))), 108 'dot_size' : (4.0, # pixels 109 ve_types.Real), 110 'anti_aliasing' : ( True, 111 ve_types.Boolean ), 112 'depth' : ( None, # set for depth testing 113 ve_types.Real ), 114 'center' : (None, # DEPRECATED -- don't use 115 ve_types.Sequence2(ve_types.Real), 116 "", 117 VisionEgg.ParameterDefinition.DEPRECATED), 118 } 119 120 constant_parameters_and_defaults = { 121 'num_dots' : ( 100, 122 ve_types.UnsignedInteger ), 123 } 124 125 __slots__ = ( 126 'x_positions', 127 'y_positions', 128 'random_directions_radians', 129 'last_time_sec', 130 'start_times_sec', 131 '_gave_alpha_warning', 132 ) 133
134 - def __init__(self, **kw):
135 VisionEgg.Core.Stimulus.__init__(self,**kw) 136 # store positions normalized between 0 and 1 so that re-sizing is ok 137 num_dots = self.constant_parameters.num_dots # shorthand 138 self.x_positions = RandomArray.uniform(0.0,1.0,(num_dots,)) 139 self.y_positions = RandomArray.uniform(0.0,1.0,(num_dots,)) 140 self.random_directions_radians = RandomArray.uniform(0.0,2*math.pi,(num_dots,)) 141 self.last_time_sec = VisionEgg.time_func() 142 self.start_times_sec = None # setup variable, assign later 143 self._gave_alpha_warning = 0
144
145 - def draw(self):
146 # XXX This method is not speed-optimized. I just wrote it to 147 # get the job done. (Nonetheless, it seems faster than the C 148 # version commented out above.) 149 150 p = self.parameters # shorthand 151 if p.center is not None: 152 if not hasattr(VisionEgg.config,"_GAVE_CENTER_DEPRECATION"): 153 logger = logging.getLogger('VisionEgg.Dots') 154 logger.warning("Specifying DotArea2D by deprecated " 155 "'center' parameter deprecated. Use " 156 "'position' parameter instead. (Allows " 157 "use of 'anchor' parameter to set to " 158 "other values.)") 159 VisionEgg.config._GAVE_CENTER_DEPRECATION = 1 160 p.anchor = 'center' 161 p.position = p.center[0], p.center[1] # copy values (don't copy ref to tuple) 162 if p.on: 163 # calculate center 164 center = VisionEgg._get_center(p.position,p.anchor,p.size) 165 166 if p.anti_aliasing: 167 if len(p.color) == 4 and not self._gave_alpha_warning: 168 if p.color[3] != 1.0: 169 logger = logging.getLogger('VisionEgg.Dots') 170 logger.warning("The parameter anti_aliasing is " 171 "set to true in the DotArea2D " 172 "stimulus class, but the color " 173 "parameter specifies an alpha " 174 "value other than 1.0. To " 175 "acheive the best anti-aliasing, " 176 "ensure that the alpha value for " 177 "the color parameter is 1.0.") 178 self._gave_alpha_warning = 1 179 gl.glEnable( gl.GL_POINT_SMOOTH ) 180 # allow max_alpha value to control blending 181 gl.glEnable( gl.GL_BLEND ) 182 gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) 183 else: 184 gl.glDisable( gl.GL_BLEND ) 185 186 now_sec = VisionEgg.time_func() 187 if self.start_times_sec is not None: 188 # compute extinct dots and generate new positions 189 replace_indices = Numeric.nonzero( Numeric.greater( now_sec - self.start_times_sec, p.dot_lifespan_sec) ) 190 Numeric.put( self.start_times_sec, replace_indices, now_sec ) 191 192 new_x_positions = RandomArray.uniform(0.0,1.0, 193 (len(replace_indices),)) 194 Numeric.put( self.x_positions, replace_indices, new_x_positions ) 195 196 new_y_positions = RandomArray.uniform(0.0,1.0, 197 (len(replace_indices),)) 198 Numeric.put( self.y_positions, replace_indices, new_y_positions ) 199 200 new_random_directions_radians = RandomArray.uniform(0.0,2*math.pi, 201 (len(replace_indices),)) 202 Numeric.put( self.random_directions_radians, replace_indices, new_random_directions_radians ) 203 else: 204 # initialize dot extinction values to random (uniform) distribution 205 self.start_times_sec = RandomArray.uniform( now_sec - p.dot_lifespan_sec, now_sec, 206 (self.constant_parameters.num_dots,)) 207 208 signal_num_dots = int(round(p.signal_fraction * self.constant_parameters.num_dots)) 209 time_delta_sec = now_sec - self.last_time_sec 210 self.last_time_sec = now_sec # reset for next loop 211 x_increment_normalized = math.cos(p.signal_direction_deg/180.0*math.pi) * p.velocity_pixels_per_sec / p.size[0] * time_delta_sec 212 y_increment_normalized = -math.sin(p.signal_direction_deg/180.0*math.pi) * p.velocity_pixels_per_sec / p.size[1] * time_delta_sec 213 self.x_positions[:signal_num_dots] += x_increment_normalized 214 self.y_positions[:signal_num_dots] += y_increment_normalized 215 216 num_random_dots = self.constant_parameters.num_dots - signal_num_dots 217 random_x_increment_normalized = Numeric.cos(self.random_directions_radians[signal_num_dots:]) * p.velocity_pixels_per_sec / p.size[0] * time_delta_sec 218 random_y_increment_normalized = -Numeric.sin(self.random_directions_radians[signal_num_dots:]) * p.velocity_pixels_per_sec / p.size[1] * time_delta_sec 219 self.x_positions[signal_num_dots:] += random_x_increment_normalized 220 self.y_positions[signal_num_dots:] += random_y_increment_normalized 221 222 self.x_positions = Numeric.fmod( self.x_positions, 1.0 ) # wrap 223 self.y_positions = Numeric.fmod( self.y_positions, 1.0 ) 224 225 self.x_positions = Numeric.fmod( self.x_positions+1, 1.0 ) # wrap again for values < 1 226 self.y_positions = Numeric.fmod( self.y_positions+1, 1.0 ) 227 228 xs = (self.x_positions - 0.5) * p.size[0] + center[0] 229 ys = (self.y_positions - 0.5) * p.size[1] + center[1] 230 231 if len(p.color)==3: 232 gl.glColor3f(*p.color) 233 elif len(p.color)==4: 234 gl.glColor4f(*p.color) 235 gl.glPointSize(p.dot_size) 236 237 # Clear the modeview matrix 238 gl.glMatrixMode(gl.GL_MODELVIEW) 239 gl.glPushMatrix() 240 241 gl.glDisable(gl.GL_TEXTURE_2D) 242 243 if p.depth is None: 244 depth = 0.0 245 else: 246 gl.glEnable(gl.GL_DEPTH_TEST) 247 depth = p.depth 248 zs = (depth,)*len(xs) # make N tuple with repeat value of depth 249 draw_dots(xs,ys,zs) 250 if p.anti_aliasing: 251 gl.glDisable( gl.GL_POINT_SMOOTH ) # turn off 252 gl.glPopMatrix()
253

visionegg-1.2.1/doc/reference/html/VisionEgg.Dots.DotArea2D-class.html0000644000076500000240000004013011224565530024640 0ustar astrawstaff VisionEgg.Dots.DotArea2D
Package VisionEgg :: Module Dots :: Class DotArea2D
[frames] | no frames]

Class DotArea2D

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         DotArea2D

Random dots of constant velocity

Every dot has the same velocity. Some fraction of the dots all
move in the one direction, while the rest move in random
directions. Dots wrap around edges. Each dot has a lifespan.

This is just one example of the endless variations on drawing random dots.

Parameters
==========
anchor                  -- (String)
                           Default: center
anti_aliasing           -- (Boolean)
                           Default: True
color                   -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                           Default: (1.0, 1.0, 1.0)
depth                   -- (Real)
                           Default: (determined at runtime)
dot_lifespan_sec        -- (Real)
                           Default: 5.0
dot_size                -- (Real)
                           Default: 4.0
on                      -- (Boolean)
                           Default: True
position                -- (Sequence2 of Real)
                           Default: (320.0, 240.0)
signal_direction_deg    -- (Real)
                           Default: 90.0
signal_fraction         -- (Real)
                           Default: 0.5
size                    -- (Sequence2 of Real)
                           Default: (300.0, 300.0)
velocity_pixels_per_sec -- (Real)
                           Default: 10.0

Constant Parameters
===================
num_dots -- (UnsignedInteger)
            Default: 100



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'pos...
  constant_parameters_and_defaults = {'num_dots':(100, ve_types....

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'position':((320.0, 240.0), ve_types.S\
equence2(ve_types.Real)), 'anchor':('center', ve_types.String), 'size'\
:((300.0, 300.0), ve_types.Sequence2(ve_types.Real)), 'signal_fraction\
':(0.5, ve_types.Real), 'signal_direction_deg':(90.0, ve_types.Real), \
'velocity_pixels_per_sec':(10.0, ve_types.Real), 'dot_lifespan_sec':(5\
.0, ve_types.Real), 'color':((1.0, 1.0, 1.0), ve_types.AnyOf(ve_types.\
Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'dot_si\
ze':(4.0, ve_types.Real), 'anti_aliasing':(True, ve_types.Boolean), 'd\
...

constant_parameters_and_defaults

Value:
{'num_dots':(100, ve_types.UnsignedInteger),}

visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl-module.html0000644000076500000240000002372611224565530024667 0ustar astrawstaff VisionEgg.FlowControl
Package VisionEgg :: Module FlowControl
[frames] | no frames]

Module FlowControl

source code


Flow control for the Vision Egg.



Classes
  Presentation
Handles the timing and coordination of stimulus presentation.
  Controller
Control parameters.
  ConstantController
Set parameters to a constant value.
  EvalStringController
Set parameters using dynamically interpreted Python string.
  ExecStringController
Set parameters using potentially complex Python string.
  FunctionController
Set parameters using a Python function.
  EncapsulatedController
Set parameters by encapsulating another Controller.
Variables
  TIME_INDEPENDENT = 0x00
  TIME_SEC_ABSOLUTE = 0x01
  TIME_SEC_SINCE_GO = 0x02
  FRAMES_ABSOLUTE = 0x04
  FRAMES_SINCE_GO = 0x08
  NEVER = 0x00
  EVERY_FRAME = 0x01
  TRANSITIONS = 0x02
  ONCE = 0x04
  NOT_DURING_GO = 0x08
  NOT_BETWEEN_GO = 0x10
visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl-pysrc.html0000644000076500000240000157776211224565530024561 0ustar astrawstaff VisionEgg.FlowControl
Package VisionEgg :: Module FlowControl
[frames] | no frames]

Source Code for Module VisionEgg.FlowControl

   1  # The Vision Egg: FlowControl 
   2  # 
   3  # Copyright (C) 2001-2004 Andrew Straw. 
   4  # Copyright (C) 2008 California Institute of Technology 
   5  # 
   6  # URL: <http://www.visionegg.org/> 
   7  # 
   8  # Distributed under the terms of the GNU Lesser General Public License 
   9  # (LGPL). See LICENSE.TXT that came with this file. 
  10   
  11  """ 
  12  Flow control for the Vision Egg. 
  13   
  14  """ 
  15   
  16  import logging 
  17  import logging.handlers 
  18   
  19  import VisionEgg 
  20  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
  21  import VisionEgg.ParameterTypes as ve_types 
  22  import numpy.oldnumeric as Numeric, math, types 
  23  import pygame 
  24   
  25  #################################################################### 
  26  # 
  27  #        Presentation 
  28  # 
  29  #################################################################### 
  30   
31 -class Presentation(VisionEgg.ClassWithParameters):
32 """Handles the timing and coordination of stimulus presentation. 33 34 This class is the key to the real-time operation of the Vision 35 Egg. It contains the main 'go' loop, and maintains the association 36 between 'controllers', instances of the Controller class, and the 37 parameters they control. 38 39 During the main 'go' loop and at other specific times, the 40 parameters are updated via function calls to the controllers. 41 42 Between entries into the 'go' loop, a Vision Egg application 43 should call the method between_presentations as often as possible 44 to ensure parameter values are kept up to date and any 45 housekeeping done by controllers is done. 46 47 No OpenGL environment I know of can guarantee that a new frame is 48 drawn and the double buffers swapped before the monitor's next 49 vertical retrace sync pulse. Still, although one can worry 50 endlessly about this problem, it works. In other words, on a fast 51 computer with a fast graphics card running even a pre-emptive 52 multi-tasking operating system (see below for specific 53 information), a new frame is drawn before every monitor update. If 54 this did become a problem, the go() method could be re-implemented 55 in C, along with the functions it calls. This would probably 56 result in speed gains, but without skipping frames at 200 Hz, why 57 bother? 58 59 Parameters 60 ========== 61 check_events -- allow input event checking during 'go' loop? (Boolean) 62 Default: True 63 collect_timing_info -- log timing statistics during go loop? (Boolean) 64 Default: True 65 enter_go_loop -- test used by run_forever() to enter go loop (Boolean) 66 Default: False 67 go_duration -- Tuple to specify 'go' loop duration. Either (value,units) or ('forever',) (Sequence of AnyOf(Real or String)) 68 Default: (5.0, 'seconds') 69 handle_event_callbacks -- List of tuples to handle events. (event_type,event_callback_func) (Sequence of Sequence2 of AnyOf(Integer or Callable)) 70 Default: (determined at runtime) 71 override_t_abs_sec -- Override t_abs. Set only when reconstructing experiments. (units: seconds) (Real) 72 Default: (determined at runtime) 73 quit -- quit the run_forever loop? (Boolean) 74 Default: False 75 trigger_armed -- test trigger on go loop? (Boolean) 76 Default: True 77 trigger_go_if_armed -- trigger go loop? (Boolean) 78 Default: True 79 viewports -- list of Viewport instances to draw. Order is important. (Sequence of Instance of <class 'VisionEgg.ClassWithParameters'>) 80 Default: (determined at runtime) 81 warn_longest_frame_threshold -- threshold to print frame skipped warning (units: factor of inter-frame-interval) (Real) 82 Default: 2.0 83 warn_mean_fps_threshold -- threshold to print observered vs. expected frame rate warning (fraction units) (Real) 84 Default: 0.01 85 """ 86 parameters_and_defaults = { 87 'viewports' : (None, 88 # XXX should really require VisionEgg.Core.Viewport 89 # but that would lead to circular import problem 90 ve_types.Sequence(ve_types.Instance(VisionEgg.ClassWithParameters)), 91 'list of Viewport instances to draw. Order is important.'), 92 'collect_timing_info' : (True, 93 ve_types.Boolean, 94 'log timing statistics during go loop?'), 95 'go_duration' : ((5.0,'seconds'), 96 ve_types.Sequence(ve_types.AnyOf(ve_types.Real, 97 ve_types.String)), 98 "Tuple to specify 'go' loop duration. Either (value,units) or ('forever',)"), 99 'check_events' : (True, # May cause slight performance hit, but probably negligible 100 ve_types.Boolean, 101 "allow input event checking during 'go' loop?"), 102 'handle_event_callbacks' : (None, 103 ve_types.Sequence(ve_types.Sequence2(ve_types.AnyOf(ve_types.Integer,ve_types.Callable))), 104 "List of tuples to handle events. (event_type,event_callback_func)"), 105 'trigger_armed':(True, 106 ve_types.Boolean, 107 "test trigger on go loop?"), 108 'trigger_go_if_armed':(True, 109 ve_types.Boolean, 110 "trigger go loop?"), 111 'enter_go_loop':(False, 112 ve_types.Boolean, 113 "test used by run_forever() to enter go loop"), 114 'quit':(False, 115 ve_types.Boolean, 116 "quit the run_forever loop?"), 117 'warn_mean_fps_threshold':(0.01, # fraction (0.1 = 10%) 118 ve_types.Real, 119 "threshold to print observered vs. expected frame rate warning (fraction units)"), 120 'warn_longest_frame_threshold': (2.0, # fraction (set to 2.0 for no false positives) 121 ve_types.Real, 122 "threshold to print frame skipped warning (units: factor of inter-frame-interval)"), 123 'override_t_abs_sec':(None, # override t_abs (in seconds) -- set only when reconstructing experiments 124 ve_types.Real, 125 "Override t_abs. Set only when reconstructing experiments. (units: seconds)"), 126 } 127 128 __slots__ = ( 129 'controllers', 130 'num_frame_controllers', 131 'frame_draw_times', 132 'time_sec_absolute', 133 'frames_absolute', 134 'in_go_loop', 135 'frames_dropped_in_last_go_loop', 136 'last_go_loop_start_time_absolute_sec', 137 'time_sec_since_go', 138 'frames_since_go', 139 ) 140
141 - def __init__(self,**kw):
142 VisionEgg.ClassWithParameters.__init__(self,**kw) 143 144 if self.parameters.viewports is None: 145 self.parameters.viewports = [] 146 147 if self.parameters.handle_event_callbacks is None: 148 self.parameters.handle_event_callbacks = [] 149 150 self.controllers = [] 151 self.num_frame_controllers = 0 # reference counter for controllers that are called on frame by frame basis 152 153 # A list that optionally records when frames were drawn by go() method. 154 self.frame_draw_times = [] 155 156 self.time_sec_absolute=VisionEgg.time_func() 157 self.frames_absolute=0 158 159 self.in_go_loop = False 160 self.frames_dropped_in_last_go_loop = False 161 self.last_go_loop_start_time_absolute_sec = None
162
163 - def add_controller( self, class_with_parameters, parameter_name, controller ):
164 """Add a controller""" 165 # Check if type checking needed 166 if type(class_with_parameters) != types.NoneType and type(parameter_name) != types.NoneType: 167 # Check if return type of controller eval is same as parameter type 168 if class_with_parameters.is_constant_parameter(parameter_name): 169 raise TypeError("Attempt to control constant parameter '%s' of class %s."%(parameter_name,class_with_parameters)) 170 require_type = class_with_parameters.get_specified_type(parameter_name) 171 try: 172 ve_types.assert_type(controller.returns_type(),require_type) 173 except TypeError: 174 raise TypeError("Attempting to control parameter '%s' of type %s with controller that returns type %s"%( 175 parameter_name, 176 require_type, 177 controller.returns_type())) 178 if not hasattr(class_with_parameters.parameters,parameter_name): 179 raise AttributeError("%s has no instance '%s'"%parameter_name) 180 self.controllers.append( (class_with_parameters.parameters,parameter_name, controller) ) 181 else: # At least one of class_with_parameters or parameter_name is None. 182 # Make sure they both are None. 183 if not (type(class_with_parameters) == types.NoneType and type(parameter_name) == types.NoneType): 184 raise ValueError("Neither or both of class_with_parameters and parameter_name must be None.") 185 self.controllers.append( (None,None,controller) ) 186 if controller.temporal_variables & (FRAMES_SINCE_GO|FRAMES_ABSOLUTE): 187 self.num_frame_controllers = self.num_frame_controllers + 1
188
189 - def remove_controller( self, class_with_parameters, parameter_name, controller=None ):
190 """Remove one (or more--see below) controller(s). 191 192 If controller is None, all controllers affecting the 193 specified parameter are removed. 194 195 If class_with_parameters and paramter_name are None, the 196 controller is removed completely 197 198 If class_with_parameters, paramter_name, and controller are 199 all None, all controllers are removed. 200 201 """ 202 203 if class_with_parameters is None and parameter_name is None: 204 if not isinstance(controller,Controller) and controller != None: 205 206 raise TypeError( "When deleting a controller, specify an " 207 "instance of VisionEgg.FlowControl.Controller class!") 208 209 if controller == None: #Added by Tony, May30/2005 210 self.controllers = [] 211 212 i = 0 213 while i < len(self.controllers): 214 orig_parameters,orig_parameter_name,orig_controller = self.controllers[i] 215 if controller == orig_controller: 216 del self.controllers[i] 217 else: 218 i = i + 1 219 return 220 if controller is None: 221 # The controller function is not specified: 222 # Delete all controllers that control the parameter specified. 223 if class_with_parameters is None or parameter_name is None: 224 raise ValueError("Must specify parameter from which controller should be removed.") 225 i = 0 226 while i < len(self.controllers): 227 orig_parameters,orig_parameter_name,orig_controller = self.controllers[i] 228 if (orig_parameters == class_with_parameters.parameters and 229 orig_parameter_name == parameter_name): 230 controller = self.controllers[i][2] 231 if controller.temporal_variables & (FRAMES_SINCE_GO|FRAMES_ABSOLUTE): 232 self.num_frame_controllers = self.num_frame_controllers - 1 233 del self.controllers[i] 234 else: 235 i = i + 1 236 else: # controller is specified 237 # Delete only that specific controller 238 i = 0 239 while i < len(self.controllers): 240 orig_parameters,orig_parameter_name,orig_controller = self.controllers[i] 241 if (orig_parameters == class_with_parameters.parameters and 242 orig_parameter_name == parameter_name and 243 orig_controller == controller): 244 if controller.temporal_variables & (FRAMES_SINCE_GO|FRAMES_ABSOLUTE): 245 self.num_frame_controllers = self.num_frame_controllers - 1 246 else: 247 i = i + 1
248
249 - def __call_controllers(self, 250 go_started=None, 251 doing_transition=None):
252 done_once = [] # list of ONCE contollers to switch status of 253 for (parameters_instance, parameter_name, controller) in self.controllers: 254 evaluate = 0 255 if controller.eval_frequency & ONCE: 256 evaluate = 1 257 done_once.append(controller) 258 elif doing_transition and (controller.eval_frequency & TRANSITIONS): 259 evaluate = 1 260 elif controller.eval_frequency & EVERY_FRAME: 261 evaluate = 1 262 263 if evaluate: 264 if controller.temporal_variables & TIME_SEC_ABSOLUTE: 265 controller.time_sec_absolute = self.time_sec_absolute 266 if controller.temporal_variables & FRAMES_ABSOLUTE: 267 controller.frames_absolute = self.frames_absolute 268 269 if go_started: 270 if not (controller.eval_frequency & NOT_DURING_GO): 271 if controller.temporal_variables & TIME_SEC_SINCE_GO: 272 controller.time_sec_since_go = self.time_sec_since_go 273 if controller.temporal_variables & FRAMES_SINCE_GO: 274 controller.frames_since_go = self.frames_since_go 275 result = controller.during_go_eval() 276 if parameter_name is not None: 277 setattr(parameters_instance, parameter_name, result) 278 else: 279 if not (controller.eval_frequency & NOT_BETWEEN_GO): 280 if controller.temporal_variables & TIME_SEC_SINCE_GO: 281 controller.time_sec_since_go = None 282 if controller.temporal_variables & FRAMES_SINCE_GO: 283 controller.frames_since_go = None 284 result = controller.between_go_eval() 285 if parameter_name is not None: 286 setattr(parameters_instance, parameter_name, result) 287 288 for controller in done_once: 289 #Unset ONCE flag 290 controller.eval_frequency = controller.eval_frequency & ~ONCE 291 if isinstance(controller,EncapsulatedController): 292 controller.contained_controller.eval_frequency = controller.contained_controller.eval_frequency & ~ONCE
293
294 - def is_in_go_loop(self):
295 """Queries if the presentation is in a go loop. 296 297 This is useful to check the state of the Vision Egg 298 application from a remote client over Pyro.""" 299 return self.in_go_loop
300
302 return self.frames_dropped_in_last_go_loop
303
305 return self.last_go_loop_start_time_absolute_sec
306
307 - def go(self):
308 """Main control loop during stimulus presentation. 309 310 This is the heart of realtime control in the Vision Egg, and 311 contains the main loop during a stimulus presentation. This 312 coordinates the timing of calling the controllers. 313 314 In the main loop, the current time (in absolute seconds, 315 go-loop-start-relative seconds, and go-loop-start-relative 316 frames) is computed, the appropriate controllers are called 317 with this information, the screen is cleared, each viewport is 318 drawn to the back buffer (while the video card continues 319 painting the front buffer on the display), and the buffers are 320 swapped. 321 322 """ 323 import VisionEgg.Core # here to prevent circular import 324 self.in_go_loop = 1 325 326 swap_buffers = VisionEgg.Core.swap_buffers # shorthand 327 328 # Clear boolean indicator 329 self.frames_dropped_in_last_go_loop = False 330 331 # Create shorthand notation, which speeds the main loop 332 # slightly by not performing name lookup each time. 333 p = self.parameters 334 335 if p.collect_timing_info: 336 frame_timer = VisionEgg.Core.FrameTimer() 337 338 while (not p.trigger_armed) or (not p.trigger_go_if_armed): 339 self.between_presentations() 340 341 # Go! 342 343 self.time_sec_absolute=VisionEgg.time_func() 344 345 if p.override_t_abs_sec is not None: 346 raise NotImplementedError("Cannot override absolute time yet") 347 348 self.last_go_loop_start_time_absolute_sec = self.time_sec_absolute 349 self.time_sec_since_go = 0.0 350 self.frames_since_go = 0 351 352 synclync_connection = VisionEgg.config._SYNCLYNC_CONNECTION # create shorthand 353 if synclync_connection: 354 import synclync 355 synclync_connection.next_control_packet.action_flags += (synclync.SL_CLEAR_VSYNC_COUNT + 356 synclync.SL_CLEAR_NOTIFY_SWAPPED_COUNT + 357 synclync.SL_CLEAR_FRAMESKIP_COUNT) 358 synclync_hack_done_once = 0 359 360 # Tell transitional controllers a presentation is starting 361 self.__call_controllers( 362 go_started=1, 363 doing_transition=1) 364 365 # Do the main loop 366 start_time_absolute = self.time_sec_absolute 367 if p.go_duration[0] == 'forever': # forever 368 current_duration_value = 0 369 elif p.go_duration[1] == 'seconds': # duration units 370 current_duration_value = self.time_sec_since_go 371 elif p.go_duration[1] == 'frames': # duration units 372 current_duration_value = self.frames_since_go 373 else: 374 raise RuntimeError("Unknown duration unit '%s'"%p.go_duration[1]) 375 376 while (current_duration_value < p.go_duration[0]): 377 # Get list of screens 378 screens = [] 379 for viewport in p.viewports: 380 s = viewport.parameters.screen 381 if s not in screens: 382 screens.append(s) 383 384 # Clear the screen(s) 385 for screen in screens: 386 screen.clear() 387 388 # Update all the realtime parameters 389 self.__call_controllers( 390 go_started=1, 391 doing_transition=0) 392 393 # Draw each viewport 394 for viewport in p.viewports: 395 viewport.draw() 396 397 # Swap the buffers 398 if synclync_connection: 399 if not synclync_hack_done_once: 400 synclync_connection.next_control_packet.action_flags += (synclync.SL_NOTIFY_SWAPPED_BUFFERS + 401 synclync.SL_NOTIFY_IN_GO_LOOP) 402 synclync_connection.send_control_packet() 403 synclync_hack_done_once = 1 404 data_packet = synclync_connection.get_latest_data_packet() 405 swap_buffers() 406 407 # Set the time variables for the next frame 408 self.time_sec_absolute=VisionEgg.time_func() 409 last_time_sec_since_go = self.time_sec_since_go 410 self.time_sec_since_go = self.time_sec_absolute - start_time_absolute 411 self.frames_absolute += 1 412 self.frames_since_go += 1 413 414 if p.collect_timing_info: 415 frame_timer.tick() 416 417 # Make sure we use the right value to check if we're done 418 if p.go_duration[0] == 'forever': # forever 419 pass # current_duration_value already set to 0 420 elif p.go_duration[1] == 'seconds': 421 current_duration_value = self.time_sec_since_go 422 elif p.go_duration[1] == 'frames': 423 current_duration_value = self.frames_since_go 424 else: 425 raise RuntimeError("Unknown duration unit '%s'"%p.go_duration[1]) 426 427 # Check events if requested 428 if p.check_events: 429 for event in pygame.event.get(): 430 for event_type, event_callback in p.handle_event_callbacks: 431 if event.type is event_type: 432 event_callback(event) 433 434 # Tell transitional controllers a presentation has ended 435 self.__call_controllers( 436 go_started=0, 437 doing_transition=1) 438 439 # Tell SyncLync we're not in go loop anymore 440 if synclync_connection: 441 synclync_connection.send_control_packet() # nothing in action_flags -- finishes go loop 442 443 # Check to see if frame by frame control was desired 444 # but OpenGL not syncing to vertical retrace 445 try: 446 mean_frame_time_sec = frame_timer.get_average_ifi_sec() 447 calculated_fps = 1.0/mean_frame_time_sec 448 except: 449 # the above fails when no frames were drawn 450 mean_frame_time_sec = 0.0 451 calculated_fps = 0.0 452 453 if self.num_frame_controllers: # Frame by frame control desired 454 impossibly_fast_frame_rate = 210.0 455 if calculated_fps > impossibly_fast_frame_rate: # Let's assume no monitor can exceed impossibly_fast_frame_rate 456 logger = logging.getLogger('VisionEgg.FlowControl') 457 logger.error("Frame by frame control desired, but " 458 "average frame rate was %.2f frames per " 459 "second-- faster than any display device " 460 "(that I know of). Set your drivers to " 461 "sync buffer swapping to vertical " 462 "retrace. (platform/driver " 463 "dependent)"%(calculated_fps)) 464 # Warn if > warn_mean_fps_threshold error in frame rate 465 if abs(calculated_fps-VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ) / float(VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ) > self.parameters.warn_mean_fps_threshold: 466 logger = logging.getLogger('VisionEgg.FlowControl') 467 logger.warning("Calculated frames per second was %.3f, " 468 "while the VISIONEGG_MONITOR_REFRESH_HZ " 469 "variable is %s."%(calculated_fps, 470 VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ)) 471 frame_skip_fraction = self.parameters.warn_longest_frame_threshold 472 inter_frame_inteval = 1.0/VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ 473 474 if p.collect_timing_info: 475 longest_frame_draw_time_sec = frame_timer.get_longest_frame_duration_sec() 476 if longest_frame_draw_time_sec is not None: 477 logger = logging.getLogger('VisionEgg.FlowControl') 478 if longest_frame_draw_time_sec >= (frame_skip_fraction*inter_frame_inteval): 479 self.frames_dropped_in_last_go_loop = True 480 logger.warning("One or more frames took %.1f msec, " 481 "which is signficantly longer than the " 482 "expected inter frame interval of %.1f " 483 "msec for your frame rate (%.1f Hz)."%( 484 longest_frame_draw_time_sec*1000.0, 485 inter_frame_inteval*1000.0, 486 VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ)) 487 else: 488 logger.debug("Longest frame update was %.1f msec. " 489 "Your expected inter frame interval is " 490 "%f msec."%(longest_frame_draw_time_sec*1000.0, 491 inter_frame_inteval*1000.0)) 492 frame_timer.log_histogram() 493 494 self.in_go_loop = 0
495
496 - def export_movie_go(self, frames_per_sec=12.0, filename_suffix=".tif", filename_base="visionegg_movie", path="."):
497 """Emulates method 'go' but saves a movie.""" 498 import VisionEgg.Core # here to prevent circular import 499 import Image # Could import this at the beginning of the file, but it breaks sometimes! 500 import os # Could also import this, but this is the only place its needed 501 502 # Create shorthand notation, which speeds the main loop 503 # slightly by not performing name lookup each time. 504 p = self.parameters 505 506 # Switch function VisionEgg.time_func 507 self.time_sec_absolute=VisionEgg.time_func() # Set for real once 508 true_time_func = VisionEgg.time_func 509 def fake_time_func(): 510 return self.time_sec_absolute
511 VisionEgg.time_func = fake_time_func 512 513 logger = logging.getLogger('VisionEgg.FlowControl') 514 515 # Go! 516 517 self.time_sec_absolute=VisionEgg.time_func() 518 self.time_sec_since_go = 0.0 519 self.frames_since_go = 0 520 521 # Tell transitional controllers a presentation is starting 522 self.__call_controllers( 523 go_started=1, 524 doing_transition=1) 525 526 # Do the main loop 527 image_no = 1 528 if p.go_duration[0] == 'forever': # forever 529 current_duration_value = 0 530 elif p.go_duration[1] == 'seconds': # duration units 531 current_duration_value = self.time_sec_since_go 532 elif p.go_duration[1] == 'frames': # duration units 533 current_duration_value = self.frames_since_go 534 else: 535 raise RuntimeError("Unknown duration unit '%s'"%p.go_duration[1]) 536 while (current_duration_value < p.go_duration[0]): 537 # Get list of screens 538 screens = [] 539 for viewport in p.viewports: 540 s = viewport.parameters.screen 541 if s not in screens: 542 screens.append(s) 543 544 # Clear the screen(s) 545 for screen in screens: 546 screen.clear() 547 548 # Update all the realtime parameters 549 self.__call_controllers( 550 go_started=1, 551 doing_transition=0) 552 553 # Draw each viewport 554 for viewport in p.viewports: 555 viewport.draw() 556 557 # Swap the buffers 558 VisionEgg.Core.swap_buffers() 559 560 # Now save the contents of the framebuffer 561 fb_image = screen.get_framebuffer_as_image(buffer='front',format=gl.GL_RGB) 562 filename = "%s%04d%s"%(filename_base,image_no,filename_suffix) 563 savepath = os.path.join( path, filename ) 564 logger.info("Saving '%s'"%filename) 565 fb_image.save( savepath ) 566 image_no = image_no + 1 567 568 # Set the time variables for the next frame 569 self.time_sec_absolute += 1.0/frames_per_sec 570 self.time_sec_since_go += 1.0/frames_per_sec 571 self.frames_absolute += 1 572 self.frames_since_go += 1 573 574 # Make sure we use the right value to check if we're done 575 if p.go_duration[0] == 'forever': 576 pass # current_duration_value already set to 0 577 elif p.go_duration[1] == 'seconds': 578 current_duration_value = self.time_sec_since_go 579 elif p.go_duration[1] == 'frames': 580 current_duration_value = self.frames_since_go 581 else: 582 raise RuntimeError("Unknown duration unit '%s'"%p.go_duration[1]) 583 584 # Check events if requested 585 if p.check_events: 586 for event in pygame.event.get(): 587 for event_type, event_callback in p.handle_event_callbacks: 588 if event.type is event_type: 589 event_callback(event) 590 591 # Tell transitional controllers a presentation has ended 592 self.__call_controllers( 593 go_started=0, 594 doing_transition=1) 595 596 if len(screens) > 1: 597 logger.warning("Only saved movie from last screen.") 598 599 scp = screen.constant_parameters 600 if scp.red_bits is not None: 601 warn_about_movie_depth = 0 602 if scp.red_bits > 8: 603 warn_about_movie_depth = 1 604 elif scp.green_bits > 8: 605 warn_about_movie_depth = 1 606 elif scp.blue_bits > 8: 607 warn_about_movie_depth = 1 608 if warn_about_movie_depth: 609 logger.warning("Only saved 8 bit per pixel movie, even " 610 "though your framebuffer supports more!") 611 # Restore VisionEgg.time_func 612 VisionEgg.time_func = true_time_func
613
614 - def run_forever(self):
615 """Main control loop between go loops.""" 616 p = self.parameters 617 # enter with transitional contoller call 618 self.__call_controllers( 619 go_started=0, 620 doing_transition=1) 621 while not p.quit: 622 self.between_presentations() 623 if self.parameters.enter_go_loop: 624 self.parameters.enter_go_loop = False 625 self.go() 626 if p.check_events: 627 for event in pygame.event.get(): 628 for event_type, event_callback in p.handle_event_callbacks: 629 if event.type is event_type: 630 event_callback(event)
631
632 - def between_presentations(self):
633 """Maintain display while between stimulus presentations. 634 635 This function gets called as often as possible when in the 636 'run_forever' loop except when execution has shifted to the 637 'go' loop. 638 639 Other than the difference in the time variable passed to the 640 controllers, this routine is very similar to the inside of the 641 main loop in the go method. 642 """ 643 import VisionEgg.Core # here to prevent circular import 644 645 self.time_sec_absolute=VisionEgg.time_func() 646 647 self.__call_controllers( 648 go_started=0, 649 doing_transition=0) 650 651 viewports = self.parameters.viewports 652 653 # Get list of screens 654 screens = [] 655 for viewport in viewports: 656 s = viewport.parameters.screen 657 if s not in screens: 658 screens.append(s) 659 660 # Clear the screen(s) 661 for screen in screens: 662 screen.clear() 663 # Draw each viewport, including each stimulus 664 for viewport in viewports: 665 viewport.draw() 666 VisionEgg.Core.swap_buffers() 667 self.frames_absolute += 1
668 669 #################################################################### 670 # 671 # Controller 672 # 673 #################################################################### 674
675 -class Controller(object):
676 """Control parameters. 677 678 This abstract base class defines the interface to any controller. 679 680 Methods: 681 682 returns_type() -- Get the type of the value returned by the eval functions 683 during_go_eval() -- Evaluate controller during the main 'go' loop. 684 between_go_eval() -- Evaluate controller between runs of the main 'go' loop. 685 686 The during_go_eval() and between_go_eval() methods are called to 687 update a particular parameter such as the position of a stimulus 688 on the screen. These methods must return a value specified by the 689 returns_type() method. These methods are called at particular 690 intervals as specified by eval_frequency and with temporal 691 parameters specified by temporal_variables (see below for more 692 details). Also, see the documentation for the Presentation class. 693 694 Attributes: 695 696 return_type -- type of the value returned by the eval functions 697 eval_frequency -- when eval functions called (see above) 698 temporal_variables -- what time variables used (see above) 699 700 A Controller instance's attribute "eval_frequency" controls when a 701 controller is evaluated. This variable is a bitwise "or" (the | 702 operator) of the following flags: 703 704 EVERY_FRAME -- every frame 705 TRANSITIONS -- on enter and exit from go loop 706 ONCE -- at the next chance possible (see below) 707 NOT_DURING_GO -- as above, but never during go loop (see below) 708 NOT_BETWEEN_GO -- as above, but never between go loops (see below) 709 710 The ONCE flag is automatically unset after evaluation, 711 hence its name. As an example, if eval_frequency is set to 712 ONCE | TRANSITIONS, it will be evaluated 713 before drawing the next frame and then only before and after the 714 go loop. 715 716 NOT_DURING_GO and NOT_BETWEEN_GO modify other behavior. For 717 example, to evaluate a controller on every frame during go loops 718 but not between go loops: 719 720 eval_frequency = EVERY_FRAME | NOT_BETWEEN_GO 721 722 If none of the above flags is set, the value is: 723 724 NEVER -- this controller is never called 725 726 A Controller instance's attribute "temporal_variables" controls 727 what time variables are set for use. This variable is a bitwise 728 "or" of the following flags: 729 730 TIME_SEC_ABSOLUTE -- seconds, continuously increasing 731 TIME_SEC_SINCE_GO -- seconds, reset to 0.0 each go loop 732 FRAMES_ABSOLUTE -- frames, continuously increasing 733 FRAMES_SINCE_GO -- frames, reset to 0 each go loop 734 735 If none of these flags is set, the value is: 736 737 TIME_INDEPENDENT -- No temporal variables. 738 739 When the eval methods (during_go_eval and between_go_eval) are 740 called, attributes are set depending on the temporal variables 741 used: 742 743 temporal_variable attribute set 744 ----------------- ------------- 745 TIME_SEC_ABSOLUTE self.time_sec_absolute 746 TIME_SEC_SINCE_GO self.time_sec_since_go 747 FRAMES_ABSOLUTE self.frames_absolute 748 FRAMES_SINCE_GO self.frames_since_go 749 750 Other information: 751 752 Instances of Controller are called by instances of the 753 Presentation class. during_go_eval() is called during a go() 754 loop, and between_go_eval() is called by between_presentations() 755 (during run_forever(), for example). Before calling these 756 methods, attributes of the controller are set accoring to 757 \attribute{temporal_variables}. 758 759 """ 760 # temporal_variables flags: 761 TIME_INDEPENDENT = 0x00 762 TIME_SEC_ABSOLUTE = 0x01 763 TIME_SEC_SINCE_GO = 0x02 764 FRAMES_ABSOLUTE = 0x04 765 FRAMES_SINCE_GO = 0x08 766 767 # eval_frequency flags: 768 NEVER = 0x00 769 EVERY_FRAME = 0x01 770 TRANSITIONS = 0x02 771 ONCE = 0x04 772 NOT_DURING_GO = 0x08 773 NOT_BETWEEN_GO = 0x10 774 775 flag_dictionary = { 776 'TIME_INDEPENDENT' : TIME_INDEPENDENT, 777 'TIME_SEC_ABSOLUTE' : TIME_SEC_ABSOLUTE, 778 'TIME_SEC_SINCE_GO' : TIME_SEC_SINCE_GO, 779 'FRAMES_ABSOLUTE' : FRAMES_ABSOLUTE, 780 'FRAMES_SINCE_GO' : FRAMES_SINCE_GO, 781 782 'NEVER' : NEVER, 783 'EVERY_FRAME' : EVERY_FRAME, 784 'TRANSITIONS' : TRANSITIONS, 785 'ONCE' : ONCE, 786 'NOT_DURING_GO' : NOT_DURING_GO, 787 'NOT_BETWEEN_GO' : NOT_BETWEEN_GO} 788
789 - def __init__(self, 790 eval_frequency = EVERY_FRAME, 791 temporal_variables = TIME_SEC_SINCE_GO, 792 return_type = None):
793 """Create instance of Controller. 794 795 Arguments: 796 797 eval_frequency -- Int, bitwise "or" of flags 798 temporal_variables -- Int, bitwise "or" of flags 799 return_type -- Set to type() of the parameter under control 800 801 """ 802 if return_type is None: # Can be types.NoneType, but not None! 803 raise ValueError("Must set argument 'return_type' in Controller.") 804 if not ve_types.is_parameter_type_def(return_type): 805 if type(return_type) == types.TypeType: 806 raise TypeError("Argument 'return_type' in Controller must be a VisionEgg parameter type definition. Hint: use VisionEgg.ParameterTypes.get_type() to get the type of your value") 807 raise TypeError("Argument 'return_type' in Controller must be a VisionEgg parameter type definition") 808 self.return_type = return_type 809 810 self.temporal_variables = temporal_variables 811 self.eval_frequency = eval_frequency
812
813 - def evaluate_now(self):
814 """Call this after updating the values of a controller if it's not evaluated EVERY_FRAME.""" 815 self.eval_frequency = self.eval_frequency | ONCE
816
817 - def set_eval_frequency(self,eval_frequency):
818 self.eval_frequency = eval_frequency
819
820 - def returns_type(self):
821 """Called by Presentation. Get the return type of this controller.""" 822 return self.return_type
823
824 - def during_go_eval(self):
825 """Called by Presentation. Evaluate during the main 'go' loop. 826 827 Override this method in subclasses.""" 828 raise RuntimeError("%s: Definition of during_go_eval() in abstract base class Contoller must be overriden."%(str(self),))
829
830 - def between_go_eval(self):
831 """Called by Presentation. Evaluate between runs of the main 'go' loop. 832 833 Override this method in subclasses.""" 834 raise RuntimeError("%s: Definition of between_go_eval() in abstract base class Controller must be overriden."%(str(self),))
835
836 - def _test_self(self,go_started):
837 """Test whether a controller works. 838 839 This method performs everything the Presentation go() or 840 run_forever() methods do when calling controllers, except that 841 the temporal variables are set to -1 and that the return value 842 is not used to set parameters.""" 843 844 if self.temporal_variables & TIME_SEC_ABSOLUTE: 845 self.time_sec_absolute = -1.0 846 if self.temporal_variables & FRAMES_ABSOLUTE: 847 self.frames_absolute = -1 848 849 if go_started: 850 if not (self.eval_frequency & NOT_DURING_GO): 851 if self.temporal_variables & TIME_SEC_SINCE_GO: 852 self.time_sec_since_go = -1.0 853 if self.temporal_variables & FRAMES_SINCE_GO: 854 self.frames_since_go = -1 855 return self.during_go_eval() 856 else: 857 if not (self.eval_frequency & NOT_BETWEEN_GO): 858 if self.temporal_variables & TIME_SEC_SINCE_GO: 859 self.time_sec_since_go = None 860 if self.temporal_variables & FRAMES_SINCE_GO: 861 self.frames_since_go = None 862 return self.between_go_eval()
863
864 -class ConstantController(Controller):
865 """Set parameters to a constant value."""
866 - def __init__(self, 867 during_go_value = None, 868 between_go_value = None, 869 **kw 870 ):
871 kw.setdefault('return_type',ve_types.get_type(during_go_value)) 872 kw.setdefault('eval_frequency',ONCE | TRANSITIONS) 873 Controller.__init__(self,**kw) 874 if self.return_type is not types.NoneType and during_go_value is None: 875 raise ValueError("Must specify during_go_value") 876 if between_go_value is None: 877 between_go_value = during_go_value 878 ve_types.assert_type(ve_types.get_type(during_go_value),self.return_type) 879 ve_types.assert_type(ve_types.get_type(between_go_value),self.return_type) 880 self.during_go_value = during_go_value 881 self.between_go_value = between_go_value
882
883 - def set_during_go_value(self,during_go_value):
884 ve_types.assert_type(ve_types.get_type(during_go_value),self.return_type) 885 self.during_go_value = during_go_value
886 ## if ve_types.get_type(during_go_value) is not self.return_type: 887 ## raise TypeError("during_go_value must be %s"%str(self.return_type)) 888 ## else: 889 ## self.during_go_value = during_go_value 890
891 - def get_during_go_value(self):
892 return self.during_go_value
893
894 - def set_between_go_value(self,between_go_value):
895 ve_types.assert_type(ve_types.get_type(between_go_value),self.return_type) 896 self.between_go_value = between_go_value
897 ## if ve_types.get_type(between_go_value) is not self.return_type: 898 ## raise TypeError("between_go_value must be %s"%str(self.return_type)) 899 ## else: 900 ## self.between_go_value = between_go_value 901
902 - def get_between_go_value(self):
903 return self.between_go_value
904
905 - def during_go_eval(self):
906 """Called by Presentation. Overrides method in Controller base class.""" 907 return self.during_go_value
908
909 - def between_go_eval(self):
910 """Called by Presentation. Overrides method in Controller base class.""" 911 return self.between_go_value
912
913 -class EvalStringController(Controller):
914 """Set parameters using dynamically interpreted Python string. 915 916 The string, when evaluated as Python code, becomes the value used. 917 For example, the string "1.0" would set parameter values to 1.0. 918 919 To increase speed, the string is compiled to Python's bytecode 920 format. 921 922 The string can make use of temporal variables, which are made 923 available depending on the controller's temporal_variables 924 attribute. Note that only the absolute temporal variables are 925 available when the go loop is not running. 926 927 flag(s) present variable description 928 929 TIME_SEC_ABSOLUTE t_abs seconds, continuously increasing 930 TIME_SEC_SINCE_GO t seconds, reset to 0.0 each go loop 931 FRAMES_ABSOLUTE f_abs frames, continuously increasing 932 FRAMES_SINCE_GO f frames, reset to 0 each go loop 933 934 """
935 - def __init__(self, 936 during_go_eval_string = None, 937 between_go_eval_string = None, 938 **kw 939 ):
940 import VisionEgg.Core # here to prevent circular import 941 942 # Create a namespace for eval_strings to use 943 self.eval_globals = {} 944 945 if during_go_eval_string is None: 946 raise ValueError("'during_go_eval_string' is a required argument") 947 948 # Make Numeric and math modules available 949 self.eval_globals['Numeric'] = Numeric 950 self.eval_globals['math'] = math 951 # Make Numeric and math modules available without module name 952 for key in dir(Numeric): 953 self.eval_globals[key] = getattr(Numeric,key) 954 for key in dir(math): 955 self.eval_globals[key] = getattr(math,key) 956 957 self.during_go_eval_code = compile(during_go_eval_string,'<string>','eval') 958 self.during_go_eval_string = during_go_eval_string 959 not_between_go = 0 960 if between_go_eval_string is None: 961 not_between_go = 1 962 else: 963 self.between_go_eval_code = compile(between_go_eval_string,'<string>','eval') 964 self.between_go_eval_string = between_go_eval_string 965 966 # Check to make sure return_type is set 967 set_return_type = 0 968 if not kw.has_key('return_type'): 969 set_return_type = 1 970 kw['return_type'] = types.NoneType 971 972 # Call base class __init__ 973 Controller.__init__(self,**kw) 974 if not_between_go: 975 self.eval_frequency = self.eval_frequency|NOT_BETWEEN_GO 976 if set_return_type: 977 logger = logging.getLogger('VisionEgg.FlowControl') 978 if not (self.eval_frequency & NOT_DURING_GO): 979 logger.debug( 'Executing "%s" to test for return type.'%(during_go_eval_string,)) 980 self.return_type = ve_types.get_type(self._test_self(go_started=1)) 981 elif not (self.eval_frequency & NOT_BETWEEN_GO): 982 logger.debug('Executing "%s" to test for return type.'%(between_go_eval_string,)) 983 self.return_type = ve_types.get_type(self._test_self(go_started=0))
984
985 - def set_during_go_eval_string(self,during_go_eval_string):
986 self.during_go_eval_code = compile(during_go_eval_string,'<string>','eval') 987 self.during_go_eval_string = during_go_eval_string
988
989 - def get_during_go_eval_string(self):
990 return self.during_go_eval_string
991
992 - def set_between_go_eval_string(self,between_go_eval_string):
993 self.between_go_eval_code = compile(between_go_eval_string,'<string>','eval') 994 self.between_go_eval_string = between_go_eval_string 995 self.eval_frequency = self.eval_frequency & ~NOT_BETWEEN_GO
996
997 - def get_between_go_eval_string(self):
998 if hasattr(self,"between_go_eval_string"): 999 return self.between_go_eval_string 1000 else: 1001 return None
1002
1003 - def during_go_eval(self):
1004 """Called by Presentation. Overrides method in Controller base class.""" 1005 eval_locals = {} 1006 if self.temporal_variables & TIME_SEC_ABSOLUTE: 1007 eval_locals['t_abs'] = self.time_sec_absolute 1008 if self.temporal_variables & TIME_SEC_SINCE_GO: 1009 eval_locals['t'] = self.time_sec_since_go 1010 if self.temporal_variables & FRAMES_ABSOLUTE: 1011 eval_locals['f_abs'] = self.frames_absolute 1012 if self.temporal_variables & FRAMES_SINCE_GO: 1013 eval_locals['f'] = self.frames_since_go 1014 return eval(self.during_go_eval_code,self.eval_globals,eval_locals)
1015
1016 - def between_go_eval(self):
1017 """Called by Presentation. Overrides method in Controller base class.""" 1018 eval_locals = {} 1019 if self.temporal_variables & TIME_SEC_ABSOLUTE: 1020 eval_locals['t_abs'] = self.time_sec_absolute 1021 if self.temporal_variables & FRAMES_ABSOLUTE: 1022 eval_locals['f_abs'] = self.frames_absolute 1023 return eval(self.between_go_eval_code,self.eval_globals,eval_locals)
1024
1025 -class ExecStringController(Controller):
1026 """Set parameters using potentially complex Python string. 1027 1028 You can execute arbitrarily complex Python code with this 1029 controller. The return value must be contained within the 1030 variable "x". In other words, this string must assign the 1031 variable x, so setting the string to "x=1.0" would set the 1032 parameter under control to 1.0. 1033 1034 To increase speed, the string is compiled to Python's 1035 bytecode format. 1036 1037 The string can make use of temporal variables, which are made 1038 available depending on the controller's temporal_variables 1039 attribute. Note that only the absolute temporal variables are 1040 available when the go loop is not running. 1041 1042 flag(s) present variable description 1043 ----------------- -------- ---------------------------------- 1044 TIME_SEC_ABSOLUTE t_abs seconds, continuously increasing 1045 TIME_SEC_SINCE_GO t seconds, reset to 0.0 each go loop 1046 FRAMES_ABSOLUTE f_abs frames, continuously increasing 1047 FRAMES_SINCE_GO f frames, reset to 0 each go loop 1048 1049 """
1050 - def __init__(self, 1051 during_go_exec_string = None, 1052 between_go_exec_string = None, 1053 restricted_namespace = 1, 1054 **kw 1055 ):
1056 import VisionEgg.Core # here to prevent circular import 1057 1058 # Create a namespace for eval_strings to use 1059 self.eval_globals = {} 1060 1061 if during_go_exec_string is None: 1062 raise ValueError, "'during_go_exec_string' is a required argument" 1063 1064 self.restricted_namespace = restricted_namespace 1065 1066 if self.restricted_namespace: 1067 # Make Numeric and math modules available 1068 self.eval_globals['Numeric'] = Numeric 1069 self.eval_globals['math'] = math 1070 # Make Numeric and math modules available without module name 1071 for key in dir(Numeric): 1072 self.eval_globals[key] = getattr(Numeric,key) 1073 for key in dir(math): 1074 self.eval_globals[key] = getattr(math,key) 1075 1076 self.during_go_exec_code = compile(during_go_exec_string,'<string>','exec') 1077 self.during_go_exec_string = during_go_exec_string 1078 not_between_go = 0 1079 if between_go_exec_string is None: 1080 not_between_go = 1 1081 else: 1082 self.between_go_exec_code = compile(between_go_exec_string,'<string>','exec') 1083 self.between_go_exec_string = between_go_exec_string 1084 1085 # Check to make sure return_type is set 1086 set_return_type = 0 1087 if not kw.has_key('return_type'): 1088 set_return_type = 1 1089 kw['return_type'] = types.NoneType 1090 1091 # Call base class __init__ 1092 Controller.__init__(self,**kw) 1093 if not_between_go: 1094 self.eval_frequency = self.eval_frequency|NOT_BETWEEN_GO 1095 if set_return_type: 1096 logger = logging.getLogger('VisionEgg.FlowControl') 1097 if not (self.eval_frequency & NOT_DURING_GO): 1098 logger.debug('Executing "%s" to test for return type.'%(during_go_exec_string,)) 1099 self.return_type = ve_types.get_type(self._test_self(go_started=1)) 1100 elif not (self.eval_frequency & NOT_BETWEEN_GO): 1101 logger.debug('Executing "%s" to test for return type.'%(between_go_exec_string,)) 1102 self.return_type = ve_types.get_type(self._test_self(go_started=0))
1103
1104 - def set_during_go_exec_string(self,during_go_exec_string):
1105 self.during_go_exec_code = compile(during_go_exec_string,'<string>','exec') 1106 self.during_go_exec_string = during_go_exec_string
1107
1108 - def get_during_go_exec_string(self):
1109 return self.during_go_exec_string
1110
1111 - def set_between_go_exec_string(self,between_go_exec_string):
1112 self.between_go_exec_code = compile(between_go_exec_string,'<string>','exec') 1113 self.between_go_exec_string = between_go_exec_string 1114 self.eval_frequency = self.eval_frequency & ~NOT_BETWEEN_GO
1115
1116 - def get_between_go_exec_string(self):
1117 if hasattr(self,"between_go_exec_string"): 1118 return self.between_go_exec_string 1119 else: 1120 return None
1121
1122 - def during_go_eval(self):
1123 """Called by Presentation. Overrides method in Controller base class.""" 1124 eval_locals = {} 1125 if self.temporal_variables & TIME_SEC_ABSOLUTE: 1126 eval_locals['t_abs'] = self.time_sec_absolute 1127 if self.temporal_variables & TIME_SEC_SINCE_GO: 1128 eval_locals['t'] = self.time_sec_since_go 1129 if self.temporal_variables & FRAMES_ABSOLUTE: 1130 eval_locals['f_abs'] = self.frames_absolute 1131 if self.temporal_variables & FRAMES_SINCE_GO: 1132 eval_locals['f'] = self.frames_since_go 1133 if self.restricted_namespace: 1134 exec self.during_go_exec_code in self.eval_globals,eval_locals 1135 return eval_locals['x'] 1136 else: 1137 setup_locals_str = "\n" 1138 for local_variable_name in eval_locals.keys(): 1139 setup_locals_str = setup_locals_str + local_variable_name + "=" + repr(eval_locals[local_variable_name]) + "\n" 1140 exec setup_locals_str 1141 exec self.during_go_exec_code 1142 return x
1143
1144 - def between_go_eval(self):
1145 """Called by Presentation. Overrides method in Controller base class.""" 1146 eval_locals = {} 1147 if self.temporal_variables & TIME_SEC_ABSOLUTE: 1148 eval_locals['t_abs'] = self.time_sec_absolute 1149 if self.temporal_variables & FRAMES_ABSOLUTE: 1150 eval_locals['f_abs'] = self.frames_absolute 1151 if self.restricted_namespace: 1152 exec self.between_go_exec_code in self.eval_globals,eval_locals 1153 return eval_locals['x'] 1154 else: 1155 setup_locals_str = "\n" 1156 for local_variable_name in eval_locals.keys(): 1157 setup_locals_str = setup_locals_str + local_variable_name + "=" + repr(eval_locals[local_variable_name]) + "\n" 1158 exec setup_locals_str 1159 exec self.between_go_exec_code 1160 return x # x should be assigned by the exec string
1161
1162 -class FunctionController(Controller):
1163 """Set parameters using a Python function. 1164 1165 This is a very commonly used subclass of Controller, because it is 1166 very intuitive and requires a minimum of code to set up. Many of 1167 the Vision Egg demo programs create instances of 1168 FunctionController. 1169 1170 A number of parameters are passed to the function depending on the 1171 value of temporal_variables: 1172 1173 The function can make use of temporal variables, which are made 1174 available by passingkeyword argument(s) depending on the 1175 controller's temporal_variables attribute. Note that only the 1176 absolute temporal variables are available when the go loop is not 1177 running. 1178 1179 flag(s) present argument description 1180 ----------------- -------- ---------------------------------- 1181 TIME_SEC_ABSOLUTE t_abs seconds, continuously increasing 1182 TIME_SEC_SINCE_GO t seconds, reset to 0.0 each go loop 1183 FRAMES_ABSOLUTE f_abs frames, continuously increasing 1184 FRAMES_SINCE_GO f frames, reset to 0 each go loop 1185 1186 """
1187 - def __init__(self, 1188 during_go_func = None, 1189 between_go_func = None, 1190 **kw 1191 ):
1192 """Create an instance of FunctionController. 1193 1194 Arguments: 1195 1196 during_go_func -- function evaluted during go loop 1197 between_go_func -- function evaluted not during go loop 1198 1199 """ 1200 import VisionEgg.Core # here to prevent circular import 1201 1202 if during_go_func is None: 1203 raise ValueError("Must specify during_go_func") 1204 1205 # Set default value if not set 1206 kw.setdefault('temporal_variables',TIME_SEC_SINCE_GO) # default value 1207 1208 # Check to make sure return_type is set 1209 if not kw.has_key('return_type'): 1210 logger = logging.getLogger('VisionEgg.FlowControl') 1211 logger.debug('Evaluating %s to test for return type.'%(str(during_go_func),)) 1212 call_args = {} 1213 if kw['temporal_variables'] & TIME_SEC_ABSOLUTE: 1214 call_args['t_abs'] = VisionEgg.time_func() 1215 if kw['temporal_variables'] & TIME_SEC_SINCE_GO: 1216 call_args['t'] = 0.0 1217 if kw['temporal_variables'] & FRAMES_ABSOLUTE: 1218 call_args['f_abs'] = 0 1219 if kw['temporal_variables'] & FRAMES_SINCE_GO: 1220 call_args['f'] = 0 1221 # Call the function with time variables 1222 kw['return_type'] = ve_types.get_type(during_go_func(**call_args)) 1223 Controller.__init__(self,**kw) 1224 self.during_go_func = during_go_func 1225 self.between_go_func = between_go_func 1226 if between_go_func is None: 1227 self.eval_frequency = self.eval_frequency|NOT_BETWEEN_GO
1228
1229 - def during_go_eval(self):
1230 """Called by Presentation. Overrides method in Controller base class.""" 1231 call_args = {} 1232 if self.temporal_variables & TIME_SEC_ABSOLUTE: 1233 call_args['t_abs'] = self.time_sec_absolute 1234 if self.temporal_variables & TIME_SEC_SINCE_GO: 1235 call_args['t'] = self.time_sec_since_go 1236 if self.temporal_variables & FRAMES_ABSOLUTE: 1237 call_args['f_abs'] = self.frames_absolute 1238 if self.temporal_variables & FRAMES_SINCE_GO: 1239 call_args['f'] = self.frames_since_go 1240 return self.during_go_func(**call_args)
1241
1242 - def between_go_eval(self):
1243 """Called by Presentation. Overrides method in Controller base class.""" 1244 call_args = {} 1245 if self.temporal_variables & TIME_SEC_ABSOLUTE: 1246 call_args['t_abs'] = self.time_sec_absolute 1247 if self.temporal_variables & FRAMES_ABSOLUTE: 1248 call_args['f_abs'] = self.frames_absolute 1249 return self.between_go_func(**call_args)
1250
1251 -class EncapsulatedController(Controller):
1252 """Set parameters by encapsulating another Controller. 1253 1254 Allows a new instance of Controller to control the same parameter 1255 as an old instance. 1256 1257 You probably won't ever have to use this class directly. Both the 1258 VisionEgg.TCPController.TCPController and 1259 VisionEgg.PyroHelpers.PyroEncapsulatedController classes subclass 1260 this class. 1261 1262 """
1263 - def __init__(self,initial_controller):
1264 # Initialize base class without raising error for no return_type 1265 Controller.__init__(self,**{'return_type':types.NoneType}) 1266 self.contained_controller = initial_controller 1267 self.__sync_mimic()
1268
1269 - def __sync_mimic(self):
1270 self.return_type = self.contained_controller.return_type 1271 self.temporal_variables = self.contained_controller.temporal_variables 1272 self.eval_frequency = self.contained_controller.eval_frequency
1273
1274 - def set_new_controller(self,new_controller):
1275 """Call this to encapsulate a (new) controller.""" 1276 self.contained_controller = new_controller 1277 self.__sync_mimic()
1278
1279 - def during_go_eval(self):
1280 """Called by Presentation. Overrides method in Controller base class.""" 1281 import VisionEgg.Core # here to prevent circular import 1282 if self.temporal_variables & TIME_SEC_ABSOLUTE: 1283 self.contained_controller.time_sec_absolute = self.time_sec_absolute 1284 if self.temporal_variables & TIME_SEC_SINCE_GO: 1285 self.contained_controller.time_sec_since_go = self.time_sec_since_go 1286 if self.temporal_variables & FRAMES_ABSOLUTE: 1287 self.contained_controller.frames_absolute = self.frames_absolute 1288 if self.temporal_variables & FRAMES_SINCE_GO: 1289 self.contained_controller.frames_since_go = self.frames_since_go 1290 return self.contained_controller.during_go_eval()
1291
1292 - def between_go_eval(self):
1293 """Called by Presentation. Overrides method in Controller base class.""" 1294 import VisionEgg.Core # here to prevent circular import 1295 import VisionEgg.FlowControl 1296 if self.temporal_variables & TIME_SEC_ABSOLUTE: 1297 self.contained_controller.time_sec_absolute = self.time_sec_absolute 1298 if self.temporal_variables & FRAMES_ABSOLUTE: 1299 self.contained_controller.frames_absolute = self.frames_absolute 1300 return self.contained_controller.between_go_eval()
1301 1302 # Constants (These are a copy of the static class variables from the 1303 # Controller class into the module-level namespace. This is done for 1304 # convenience.) 1305 # temporal_variables flags: 1306 TIME_INDEPENDENT = Controller.TIME_INDEPENDENT 1307 TIME_SEC_ABSOLUTE = Controller.TIME_SEC_ABSOLUTE 1308 TIME_SEC_SINCE_GO = Controller.TIME_SEC_SINCE_GO 1309 FRAMES_ABSOLUTE = Controller.FRAMES_ABSOLUTE 1310 FRAMES_SINCE_GO = Controller.FRAMES_SINCE_GO 1311 # eval_frequency flags: 1312 NEVER = Controller.NEVER 1313 EVERY_FRAME = Controller.EVERY_FRAME 1314 TRANSITIONS = Controller.TRANSITIONS 1315 ONCE = Controller.ONCE 1316 NOT_DURING_GO = Controller.NOT_DURING_GO 1317 NOT_BETWEEN_GO = Controller.NOT_BETWEEN_GO 1318

visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl.ConstantController-class.html0000644000076500000240000004106011224565530030332 0ustar astrawstaff VisionEgg.FlowControl.ConstantController
Package VisionEgg :: Module FlowControl :: Class ConstantController
[frames] | no frames]

Class ConstantController

source code

object --+    
         |    
Controller --+
             |
            ConstantController

Set parameters to a constant value.



Instance Methods
 
__init__(self, during_go_value=None, between_go_value=None, **kw)
Create instance of Controller.
source code
 
set_during_go_value(self, during_go_value) source code
 
get_during_go_value(self) source code
 
set_between_go_value(self, between_go_value) source code
 
get_between_go_value(self) source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, during_go_value=None, between_go_value=None, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: Controller.__init__
(inherited documentation)

during_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.during_go_eval

between_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.between_go_eval

visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl.Controller-class.html0000644000076500000240000005471011224565530026626 0ustar astrawstaff VisionEgg.FlowControl.Controller
Package VisionEgg :: Module FlowControl :: Class Controller
[frames] | no frames]

Class Controller

source code

object --+
         |
        Controller

Control parameters.

This abstract base class defines the interface to any controller.

Methods:

returns_type() -- Get the type of the value returned by the eval functions
during_go_eval() -- Evaluate controller during the main 'go' loop.
between_go_eval() -- Evaluate controller between runs of the main 'go' loop.

The during_go_eval() and between_go_eval() methods are called to
update a particular parameter such as the position of a stimulus
on the screen.  These methods must return a value specified by the
returns_type() method.  These methods are called at particular
intervals as specified by eval_frequency and with temporal
parameters specified by temporal_variables (see below for more
details).  Also, see the documentation for the Presentation class.

Attributes:

return_type -- type of the value returned by the eval functions
eval_frequency -- when eval functions called (see above)
temporal_variables -- what time variables used (see above)

A Controller instance's attribute "eval_frequency" controls when a
controller is evaluated. This variable is a bitwise "or" (the |
operator) of the following flags:

EVERY_FRAME    -- every frame
TRANSITIONS    -- on enter and exit from go loop
ONCE           -- at the next chance possible (see below)
NOT_DURING_GO  -- as above, but never during go loop (see below)
NOT_BETWEEN_GO -- as above, but never between go loops (see below)

The ONCE flag is automatically unset after evaluation,
hence its name. As an example, if eval_frequency is set to
ONCE | TRANSITIONS, it will be evaluated
before drawing the next frame and then only before and after the
go loop.

NOT_DURING_GO and NOT_BETWEEN_GO modify other behavior. For
example, to evaluate a controller on every frame during go loops
but not between go loops:

eval_frequency = EVERY_FRAME | NOT_BETWEEN_GO

If none of the above flags is set, the value is:

NEVER          -- this controller is never called

A Controller instance's attribute "temporal_variables" controls
what time variables are set for use. This variable is a bitwise
"or" of the following flags:

TIME_SEC_ABSOLUTE -- seconds, continuously increasing
TIME_SEC_SINCE_GO -- seconds, reset to 0.0 each go loop
FRAMES_ABSOLUTE   -- frames, continuously increasing
FRAMES_SINCE_GO   -- frames, reset to 0 each go loop

If none of these flags is set, the value is:

TIME_INDEPENDENT -- No temporal variables.

When the eval methods (during_go_eval and between_go_eval) are
called, attributes are set depending on the temporal variables
used:

temporal_variable   attribute set
-----------------   -------------
TIME_SEC_ABSOLUTE   self.time_sec_absolute
TIME_SEC_SINCE_GO   self.time_sec_since_go
FRAMES_ABSOLUTE     self.frames_absolute
FRAMES_SINCE_GO     self.frames_since_go

Other information:

Instances of Controller are called by instances of the
Presentation class.  during_go_eval() is called during a go()
loop, and between_go_eval() is called by between_presentations()
(during run_forever(), for example).  Before calling these
methods, attributes of the controller are set accoring to
ttribute{temporal_variables}.



Instance Methods
 
__init__(self, eval_frequency=EVERY_FRAME, temporal_variables=TIME_SEC_SINCE_GO, return_type=None)
Create instance of Controller.
source code
 
evaluate_now(self)
Call this after updating the values of a controller if it's not evaluated EVERY_FRAME.
source code
 
set_eval_frequency(self, eval_frequency) source code
 
returns_type(self)
Called by Presentation.
source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  TIME_INDEPENDENT = 0x00
  TIME_SEC_ABSOLUTE = 0x01
  TIME_SEC_SINCE_GO = 0x02
  FRAMES_ABSOLUTE = 0x04
  FRAMES_SINCE_GO = 0x08
  NEVER = 0x00
  EVERY_FRAME = 0x01
  TRANSITIONS = 0x02
  ONCE = 0x04
  NOT_DURING_GO = 0x08
  NOT_BETWEEN_GO = 0x10
  flag_dictionary = {'TIME_INDEPENDENT': TIME_INDEPENDENT, 'TIME...
Properties

Inherited from object: __class__

Method Details

__init__(self, eval_frequency=EVERY_FRAME, temporal_variables=TIME_SEC_SINCE_GO, return_type=None)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: object.__init__

returns_type(self)

source code 
Called by Presentation. Get the return type of this controller.

during_go_eval(self)

source code 
Called by Presentation. Evaluate during the main 'go' loop.

Override this method in subclasses.

between_go_eval(self)

source code 
Called by Presentation. Evaluate between runs of the main 'go' loop.

Override this method in subclasses.


Class Variable Details

flag_dictionary

Value:
{'TIME_INDEPENDENT': TIME_INDEPENDENT, 'TIME_SEC_ABSOLUTE': TIME_SEC_A\
BSOLUTE, 'TIME_SEC_SINCE_GO': TIME_SEC_SINCE_GO, 'FRAMES_ABSOLUTE': FR\
AMES_ABSOLUTE, 'FRAMES_SINCE_GO': FRAMES_SINCE_GO, 'NEVER': NEVER, 'EV\
ERY_FRAME': EVERY_FRAME, 'TRANSITIONS': TRANSITIONS, 'ONCE': ONCE, 'NO\
T_DURING_GO': NOT_DURING_GO, 'NOT_BETWEEN_GO': NOT_BETWEEN_GO}

visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl.EncapsulatedController-class.html0000644000076500000240000003500311224565530031151 0ustar astrawstaff VisionEgg.FlowControl.EncapsulatedController
Package VisionEgg :: Module FlowControl :: Class EncapsulatedController
[frames] | no frames]

Class EncapsulatedController

source code

object --+    
         |    
Controller --+
             |
            EncapsulatedController

Set parameters by encapsulating another Controller.

Allows a new instance of Controller to control the same parameter
as an old instance.

You probably won't ever have to use this class directly.  Both the
VisionEgg.TCPController.TCPController and
VisionEgg.PyroHelpers.PyroEncapsulatedController classes subclass
this class.



Instance Methods
 
__init__(self, initial_controller)
Create instance of Controller.
source code
 
set_new_controller(self, new_controller)
Call this to encapsulate a (new) controller.
source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, initial_controller)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: Controller.__init__
(inherited documentation)

during_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.during_go_eval

between_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.between_go_eval

visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl.EvalStringController-class.html0000644000076500000240000004266711224565530030635 0ustar astrawstaff VisionEgg.FlowControl.EvalStringController
Package VisionEgg :: Module FlowControl :: Class EvalStringController
[frames] | no frames]

Class EvalStringController

source code

object --+    
         |    
Controller --+
             |
            EvalStringController

Set parameters using dynamically interpreted Python string.

The string, when evaluated as Python code, becomes the value used.
For example, the string "1.0" would set parameter values to 1.0.

To increase speed, the string is compiled to Python's bytecode
format.

The string can make use of temporal variables, which are made
available depending on the controller's temporal_variables
attribute. Note that only the absolute temporal variables are
available when the go loop is not running.

flag(s) present    variable  description

TIME_SEC_ABSOLUTE  t_abs     seconds, continuously increasing
TIME_SEC_SINCE_GO  t         seconds, reset to 0.0 each go loop
FRAMES_ABSOLUTE    f_abs     frames, continuously increasing
FRAMES_SINCE_GO    f         frames, reset to 0 each go loop



Instance Methods
 
__init__(self, during_go_eval_string=None, between_go_eval_string=None, **kw)
Create instance of Controller.
source code
 
set_during_go_eval_string(self, during_go_eval_string) source code
 
get_during_go_eval_string(self) source code
 
set_between_go_eval_string(self, between_go_eval_string) source code
 
get_between_go_eval_string(self) source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, during_go_eval_string=None, between_go_eval_string=None, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: Controller.__init__
(inherited documentation)

during_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.during_go_eval

between_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.between_go_eval

visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl.ExecStringController-class.html0000644000076500000240000004351711224565530030625 0ustar astrawstaff VisionEgg.FlowControl.ExecStringController
Package VisionEgg :: Module FlowControl :: Class ExecStringController
[frames] | no frames]

Class ExecStringController

source code

object --+    
         |    
Controller --+
             |
            ExecStringController

Set parameters using potentially complex Python string.

You can execute arbitrarily complex Python code with this
controller.  The return value must be contained within the
variable "x".  In other words, this string must assign the
variable x, so setting the string to "x=1.0" would set the
parameter under control to 1.0.

To increase speed, the string is compiled to Python's
bytecode format.

The string can make use of temporal variables, which are made
available depending on the controller's temporal_variables
attribute. Note that only the absolute temporal variables are
available when the go loop is not running.

flag(s) present    variable  description
-----------------  --------  ----------------------------------
TIME_SEC_ABSOLUTE  t_abs     seconds, continuously increasing
TIME_SEC_SINCE_GO  t         seconds, reset to 0.0 each go loop
FRAMES_ABSOLUTE    f_abs     frames, continuously increasing
FRAMES_SINCE_GO    f         frames, reset to 0 each go loop



Instance Methods
 
__init__(self, during_go_exec_string=None, between_go_exec_string=None, restricted_namespace=1, **kw)
Create instance of Controller.
source code
 
set_during_go_exec_string(self, during_go_exec_string) source code
 
get_during_go_exec_string(self) source code
 
set_between_go_exec_string(self, between_go_exec_string) source code
 
get_between_go_exec_string(self) source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, during_go_exec_string=None, between_go_exec_string=None, restricted_namespace=1, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: Controller.__init__
(inherited documentation)

during_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.during_go_eval

between_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.between_go_eval

visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl.FunctionController-class.html0000644000076500000240000003503011224565530030326 0ustar astrawstaff VisionEgg.FlowControl.FunctionController
Package VisionEgg :: Module FlowControl :: Class FunctionController
[frames] | no frames]

Class FunctionController

source code

object --+    
         |    
Controller --+
             |
            FunctionController

Set parameters using a Python function.

This is a very commonly used subclass of Controller, because it is
very intuitive and requires a minimum of code to set up.  Many of
the Vision Egg demo programs create instances of
FunctionController.

A number of parameters are passed to the function depending on the
value of temporal_variables:

The function can make use of temporal variables, which are made
available by passingkeyword argument(s) depending on the
controller's temporal_variables attribute. Note that only the
absolute temporal variables are available when the go loop is not
running.

flag(s) present    argument  description
-----------------  --------  ----------------------------------
TIME_SEC_ABSOLUTE  t_abs     seconds, continuously increasing
TIME_SEC_SINCE_GO  t         seconds, reset to 0.0 each go loop
FRAMES_ABSOLUTE    f_abs     frames, continuously increasing
FRAMES_SINCE_GO    f         frames, reset to 0 each go loop



Instance Methods
 
__init__(self, during_go_func=None, between_go_func=None, **kw)
Create an instance of FunctionController.
source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, during_go_func=None, between_go_func=None, **kw)
(Constructor)

source code 
Create an instance of FunctionController.

Arguments:

during_go_func -- function evaluted during go loop
between_go_func -- function evaluted not during go loop

Overrides: Controller.__init__

during_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.during_go_eval

between_go_eval(self)

source code 
Called by Presentation. Overrides method in Controller base class.

Overrides: Controller.between_go_eval

visionegg-1.2.1/doc/reference/html/VisionEgg.FlowControl.Presentation-class.html0000644000076500000240000006544111224565530027161 0ustar astrawstaff VisionEgg.FlowControl.Presentation
Package VisionEgg :: Module FlowControl :: Class Presentation
[frames] | no frames]

Class Presentation

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     Presentation

Handles the timing and coordination of stimulus presentation.

This class is the key to the real-time operation of the Vision
Egg. It contains the main 'go' loop, and maintains the association
between 'controllers', instances of the Controller class, and the
parameters they control.

During the main 'go' loop and at other specific times, the
parameters are updated via function calls to the controllers.

Between entries into the 'go' loop, a Vision Egg application
should call the method between_presentations as often as possible
to ensure parameter values are kept up to date and any
housekeeping done by controllers is done.

No OpenGL environment I know of can guarantee that a new frame is
drawn and the double buffers swapped before the monitor's next
vertical retrace sync pulse.  Still, although one can worry
endlessly about this problem, it works.  In other words, on a fast
computer with a fast graphics card running even a pre-emptive
multi-tasking operating system (see below for specific
information), a new frame is drawn before every monitor update. If
this did become a problem, the go() method could be re-implemented
in C, along with the functions it calls.  This would probably
result in speed gains, but without skipping frames at 200 Hz, why
bother?

Parameters
==========
check_events                 -- allow input event checking during 'go' loop? (Boolean)
                                Default: True
collect_timing_info          -- log timing statistics during go loop? (Boolean)
                                Default: True
enter_go_loop                -- test used by run_forever() to enter go loop (Boolean)
                                Default: False
go_duration                  -- Tuple to specify 'go' loop duration. Either (value,units) or ('forever',) (Sequence of AnyOf(Real or String))
                                Default: (5.0, 'seconds')
handle_event_callbacks       -- List of tuples to handle events. (event_type,event_callback_func) (Sequence of Sequence2 of AnyOf(Integer or Callable))
                                Default: (determined at runtime)
override_t_abs_sec           -- Override t_abs. Set only when reconstructing experiments. (units: seconds) (Real)
                                Default: (determined at runtime)
quit                         -- quit the run_forever loop? (Boolean)
                                Default: False
trigger_armed                -- test trigger on go loop? (Boolean)
                                Default: True
trigger_go_if_armed          -- trigger go loop? (Boolean)
                                Default: True
viewports                    -- list of Viewport instances to draw. Order is important. (Sequence of Instance of <class 'VisionEgg.ClassWithParameters'>)
                                Default: (determined at runtime)
warn_longest_frame_threshold -- threshold to print frame skipped warning (units: factor of inter-frame-interval) (Real)
                                Default: 2.0
warn_mean_fps_threshold      -- threshold to print observered vs. expected frame rate warning (fraction units) (Real)
                                Default: 0.01



Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code
 
add_controller(self, class_with_parameters, parameter_name, controller)
Add a controller
source code
 
remove_controller(self, class_with_parameters, parameter_name, controller=None)
Remove one (or more--see below) controller(s).
source code
 
is_in_go_loop(self)
Queries if the presentation is in a go loop.
source code
 
were_frames_dropped_in_last_go_loop(self) source code
 
get_last_go_loop_start_time_absolute_sec(self) source code
 
go(self)
Main control loop during stimulus presentation.
source code
 
export_movie_go(self, frames_per_sec=12.0, filename_suffix=".tif", filename_base="visionegg_movie", path=".")
Emulates method 'go' but saves a movie.
source code
 
run_forever(self)
Main control loop between go loops.
source code
 
between_presentations(self)
Maintain display while between stimulus presentations.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'viewports':(None, ve_types.Sequenc...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

remove_controller(self, class_with_parameters, parameter_name, controller=None)

source code 
Remove one (or more--see below) controller(s).

If controller is None, all controllers affecting the
specified parameter are removed.

If class_with_parameters and paramter_name are None, the
controller is removed completely

If class_with_parameters, paramter_name, and controller are
all None, all controllers are removed.

is_in_go_loop(self)

source code 
Queries if the presentation is in a go loop.

This is useful to check the state of the Vision Egg
application from a remote client over Pyro.

go(self)

source code 
Main control loop during stimulus presentation.

This is the heart of realtime control in the Vision Egg, and
contains the main loop during a stimulus presentation. This
coordinates the timing of calling the controllers.

In the main loop, the current time (in absolute seconds,
go-loop-start-relative seconds, and go-loop-start-relative
frames) is computed, the appropriate controllers are called
with this information, the screen is cleared, each viewport is
drawn to the back buffer (while the video card continues
painting the front buffer on the display), and the buffers are
swapped.

between_presentations(self)

source code 
Maintain display while between stimulus presentations.

This function gets called as often as possible when in the
'run_forever' loop except when execution has shifted to the
'go' loop.

Other than the difference in the time variable passed to the
controllers, this routine is very similar to the inside of the
main loop in the go method.


Class Variable Details

parameters_and_defaults

Value:
{'viewports':(None, ve_types.Sequence(ve_types.Instance(VisionEgg.Clas\
sWithParameters)), 'list of Viewport instances to draw. Order is impor\
tant.'), 'collect_timing_info':(True, ve_types.Boolean, 'log timing st\
atistics during go loop?'), 'go_duration':((5.0, 'seconds'), ve_types.\
Sequence(ve_types.AnyOf(ve_types.Real, ve_types.String)), "Tuple to sp\
ecify 'go' loop duration. Either (value,units) or ('forever',)"), 'che\
ck_events':(True, ve_types.Boolean, "allow input event checking during\
 'go' loop?"), 'handle_event_callbacks':(None, ve_types.Sequence(ve_ty\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.GL-module.html0000644000076500000240000001360411224565530022713 0ustar astrawstaff VisionEgg.GL
Package VisionEgg :: Module GL
[frames] | no frames]

Module GL

source code


Vision Egg GL module -- lump all OpenGL names in one namespace.



Functions
 
glLoadMatrixf(M) source code
Variables
  __version__ = OpenGL.__version__
  GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367
visionegg-1.2.1/doc/reference/html/VisionEgg.GL-pysrc.html0000644000076500000240000005057311224565530022574 0ustar astrawstaff VisionEgg.GL
Package VisionEgg :: Module GL
[frames] | no frames]

Source Code for Module VisionEgg.GL

 1  # The Vision Egg: GL 
 2  # 
 3  # Copyright (C) 2001-2003 Andrew Straw. 
 4  # Author: Andrew Straw <astraw@users.sourceforge.net> 
 5  # URL: <http://www.visionegg.org/> 
 6  # 
 7  # Distributed under the terms of the GNU Lesser General Public License 
 8  # (LGPL). See LICENSE.TXT that came with this file. 
 9  # 
10  # $Id$ 
11   
12  """ 
13  Vision Egg GL module -- lump all OpenGL names in one namespace. 
14   
15  """ 
16   
17  from OpenGL.GL import * # get everything from OpenGL.GL 
18  import OpenGL 
19  import numpy 
20  __version__ = OpenGL.__version__ 
21   
22  # tell py2exe we want these modules 
23  try: 
24      import OpenGL.GL.GL__init___ 
25  except: 
26      pass 
27  try: 
28      import OpenGL.GL.ARB.multitexture 
29  except: 
30      pass 
31  try: 
32      import OpenGL.GL.EXT.bgra 
33  except: 
34      pass 
35  try: 
36      import SGIS.texture_edge_clamp 
37  except: 
38      pass 
39   
40  # why doesn't PyOpenGL define this?! 
41  try: 
42      GL_UNSIGNED_INT_8_8_8_8_REV 
43  except NameError: 
44      GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367 
45   
46  if OpenGL.__version__[0] == '3': 
47      if (OpenGL.__version__.startswith('3.0.0a')) or (OpenGL.__version__ == '3.0.0b1'): 
48   
49          # A bug in early PyOpenGL 3.x had problems with some arrays 
50          _orig_glLoadMatrixf = glLoadMatrixf 
51 - def glLoadMatrixf(M):
52 M = numpy.array([ Mi for Mi in M ]) 53 return _orig_glLoadMatrixf(M)
54

visionegg-1.2.1/doc/reference/html/VisionEgg.gl_qt-module.html0000644000076500000240000001233411224565531023517 0ustar astrawstaff VisionEgg.gl_qt
Package VisionEgg :: Module gl_qt
[frames] | no frames]

Module gl_qt

source code

Variables
  gl_qt_renderer_create = _gl_qt.gl_qt_renderer_create
  gl_qt_renderer_delete = _gl_qt.gl_qt_renderer_delete
  gl_qt_renderer_update = _gl_qt.gl_qt_renderer_update
visionegg-1.2.1/doc/reference/html/VisionEgg.gl_qt-pysrc.html0000644000076500000240000004362011224565531023374 0ustar astrawstaff VisionEgg.gl_qt
Package VisionEgg :: Module gl_qt
[frames] | no frames]

Source Code for Module VisionEgg.gl_qt

 1  # This file was created automatically by SWIG. 
 2  # Don't modify this file, modify the SWIG interface instead. 
 3  # This file is compatible with both classic and new-style classes. 
 4   
 5  import _gl_qt 
 6   
7 -def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
8 if (name == "this"): 9 if isinstance(value, class_type): 10 self.__dict__[name] = value.this 11 if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown 12 del value.thisown 13 return 14 method = class_type.__swig_setmethods__.get(name,None) 15 if method: return method(self,value) 16 if (not static) or hasattr(self,name) or (name == "thisown"): 17 self.__dict__[name] = value 18 else: 19 raise AttributeError("You cannot add attributes to %s" % self)
20
21 -def _swig_setattr(self,class_type,name,value):
22 return _swig_setattr_nondynamic(self,class_type,name,value,0)
23
24 -def _swig_getattr(self,class_type,name):
25 method = class_type.__swig_getmethods__.get(name,None) 26 if method: return method(self) 27 raise AttributeError,name
28 29 import types 30 try: 31 _object = types.ObjectType 32 _newclass = 1 33 except AttributeError:
34 - class _object : pass
35 _newclass = 0 36 del types 37 38 39 40 gl_qt_renderer_create = _gl_qt.gl_qt_renderer_create 41 42 gl_qt_renderer_delete = _gl_qt.gl_qt_renderer_delete 43 44 gl_qt_renderer_update = _gl_qt.gl_qt_renderer_update 45

visionegg-1.2.1/doc/reference/html/VisionEgg.GLTrace-module.html0000644000076500000240000002544611224565530023701 0ustar astrawstaff VisionEgg.GLTrace
Package VisionEgg :: Module GLTrace
[frames] | no frames]

Module GLTrace

source code


Trace calls to OpenGL

With this module, you can trace all calls made to OpenGL through PyOpenGL.
To do this, substitute

import OpenGL.GL as gl

with

import VisionEgg.GLTrace as gl

in your code.

Also, trace another module's use of OpenGL by changing its reference
to OpenGL.GL to a reference to VisionEgg.GLTrace.



Classes
  Wrapper
Functions
 
arg_to_str(arg) source code
 
gl_trace_attach() source code
Variables
  gl_constants = {}
  raw_args_by_function = {'glColor': [0, 1, 2, 3], 'glColorf': [...
  bitmasks_by_function = {'glClear': [0],}
  bitmask_names_by_value = {gl.GL_COLOR_BUFFER_BIT: 'GL_COLOR_BU...
Variables Details

raw_args_by_function

Value:
{'glColor': [0, 1, 2, 3], 'glColorf': [0, 1, 2, 3], 'glDepthRange': [0\
, 1], 'glGenTextures': [0], 'glGetTexLevelParameteriv': [1], 'glOrtho'\
: [0, 1, 2, 3, 4, 5], 'glPixelStorei': [1], 'glReadPixels': [0, 1, 2, \
3], 'glRotate': [0, 1, 2, 3], 'glTexCoord2f': [0, 1], 'glTexImage1D': \
[1, 3, 4], 'glTexImage2D': [1, 3, 4, 5], 'glTexSubImage1D': [1, 2, 3],\
 'glTranslate': [0, 1, 2], 'glVertex2f': [0, 1], 'glVertex3f': [0, 1, \
2], 'glViewport': [0, 1, 2, 3],}

bitmask_names_by_value

Value:
{gl.GL_COLOR_BUFFER_BIT: 'GL_COLOR_BUFFER_BIT', gl.GL_DEPTH_BUFFER_BIT\
: 'GL_DEPTH_BUFFER_BIT',}

visionegg-1.2.1/doc/reference/html/VisionEgg.GLTrace-pysrc.html0000644000076500000240000012571011224565530023547 0ustar astrawstaff VisionEgg.GLTrace
Package VisionEgg :: Module GLTrace
[frames] | no frames]

Source Code for Module VisionEgg.GLTrace

  1  # The Vision Egg: GLTrace 
  2  # 
  3  # Copyright (C) 2001-2004 Andrew Straw 
  4  # Copyright (C) 2004,2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Trace calls to OpenGL 
 13   
 14  With this module, you can trace all calls made to OpenGL through PyOpenGL. 
 15  To do this, substitute 
 16   
 17  import OpenGL.GL as gl 
 18   
 19  with 
 20   
 21  import VisionEgg.GLTrace as gl 
 22   
 23  in your code. 
 24   
 25  Also, trace another module's use of OpenGL by changing its reference 
 26  to OpenGL.GL to a reference to VisionEgg.GLTrace. 
 27   
 28  """ 
 29   
 30  # Copyright (c) 2003 Andrew Straw.  Distributed under the terms of the 
 31  # GNU Lesser General Public License (LGPL). 
 32   
 33  #################################################################### 
 34  # 
 35  #        Import all the necessary packages 
 36  # 
 37  #################################################################### 
 38   
 39  import OpenGL.GL as gl 
 40   
 41  gl_constants = {} 
 42   
 43  # functions which we don't want to translate arguments to gl constant 
 44  raw_args_by_function = { 
 45      'glColor':[0,1,2,3], 
 46      'glColorf':[0,1,2,3], 
 47      'glDepthRange':[0,1], 
 48      'glGenTextures':[0], 
 49      'glGetTexLevelParameteriv':[1], 
 50      'glOrtho':[0,1,2,3,4,5], 
 51      'glPixelStorei':[1], 
 52      'glReadPixels':[0,1,2,3], 
 53      'glRotate':[0,1,2,3], 
 54      'glTexCoord2f':[0,1], 
 55      'glTexImage1D':[1,3,4], 
 56      'glTexImage2D':[1,3,4,5], 
 57      'glTexSubImage1D':[1,2,3], 
 58      'glTranslate':[0,1,2], 
 59      'glVertex2f':[0,1], 
 60      'glVertex3f':[0,1,2], 
 61      'glViewport':[0,1,2,3], 
 62      } 
 63   
 64  bitmasks_by_function = { 
 65      'glClear':[0], 
 66      } 
 67   
 68  bitmask_names_by_value = { 
 69      gl.GL_COLOR_BUFFER_BIT : 'GL_COLOR_BUFFER_BIT', 
 70      gl.GL_DEPTH_BUFFER_BIT : 'GL_DEPTH_BUFFER_BIT', 
 71      } 
 72   
73 -def arg_to_str( arg ):
74 if isinstance(arg, int): 75 if arg in gl_constants.keys(): 76 return gl_constants[arg] 77 elif type(arg) == str and len(arg) > 30: 78 return "'<string>'" 79 return repr(arg)
80
81 -class Wrapper:
82 - def __init__(self, function_name):
83 self.function_name = function_name 84 self.orig_func = getattr(gl,self.function_name)
85 - def run(self,*args,**kw):
86 if kw: kw_str = " AND KEYWORDS" 87 else: kw_str = "" 88 if 1: 89 ## if self.function_name in raw_args_by_function: 90 arg_str = [] 91 for i in range(len(args)): 92 if self.function_name in raw_args_by_function and i in raw_args_by_function[self.function_name]: 93 arg_str.append(str(args[i])) # don't convert to name of OpenGL constant 94 elif self.function_name in bitmasks_by_function and i in bitmasks_by_function[self.function_name]: 95 bitmask_strs = [] 96 value = args[i] 97 for bit_value in bitmask_names_by_value: 98 if value & bit_value: 99 value = value & ~bit_value 100 bitmask_strs.append( bitmask_names_by_value[bit_value] ) 101 if value != 0: 102 bitmask_strs.append( arg_to_str(args[i]) ) 103 arg_str.append( '|'.join(bitmask_strs) ) 104 else: 105 arg_str.append(arg_to_str(args[i])) # convert to name of OpenGL constant 106 arg_str = ','.join( arg_str ) 107 try: 108 result = self.orig_func(*args,**kw) 109 except: 110 print "%s(%s)%s"%(self.function_name,arg_str,kw_str) 111 raise 112 113 if result is not None: 114 result_str = "%s = "%(arg_to_str(result),) 115 else: 116 result_str = '' 117 print "%s%s(%s)%s"%(result_str,self.function_name,arg_str,kw_str) 118 return result
119
120 -def gl_trace_attach():
121 for attr_name in dir(gl): 122 if callable( getattr(gl,attr_name) ): 123 wrapper = Wrapper(attr_name) 124 globals()[attr_name] = wrapper.run 125 else: 126 attr = getattr(gl,attr_name) 127 globals()[attr_name] = attr 128 if not attr_name.startswith('__') and not attr_name.startswith('__'): 129 if type(getattr(gl,attr_name)) == int: 130 gl_constants[getattr(gl,attr_name)] = attr_name 131 if not hasattr(gl,'GL_CLAMP_TO_EDGE'): 132 # XXX This hack requires opengl >= 1.2. See Core.py for more info. 133 globals()['GL_CLAMP_TO_EDGE'] = 0x812F 134 if hasattr(gl,'glActiveTexture'): 135 # XXX Another, similar hack. 136 globals()['glActiveTextureARB'] = gl.glActiveTexture 137 globals()['glMultiTexCoord2fARB'] = gl.glMultiTexCoord2f 138 globals()['GL_TEXTURE0_ARB'] = gl.GL_TEXTURE0 139 globals()['GL_TEXTURE1_ARB'] = gl.GL_TEXTURE1
140 141 gl_trace_attach() # attach when imported 142

visionegg-1.2.1/doc/reference/html/VisionEgg.GLTrace.Wrapper-class.html0000644000076500000240000001333611224565530025133 0ustar astrawstaff VisionEgg.GLTrace.Wrapper
Package VisionEgg :: Module GLTrace :: Class Wrapper
[frames] | no frames]

Class Wrapper

source code

Instance Methods
 
__init__(self, function_name) source code
 
run(self, *args, **kw) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.Gratings-module.html0000644000076500000240000001403511224565530024166 0ustar astrawstaff VisionEgg.Gratings
Package VisionEgg :: Module Gratings
[frames] | no frames]

Module Gratings

source code


Grating stimuli.



Classes
  LuminanceGratingCommon
Base class with common code to all ways of drawing luminance gratings.
  AlphaGratingCommon
Base class with common code to all ways of drawing gratings in alpha.
  SinGrating2D
Sine wave grating stimulus This is a general-purpose, realtime sine-wave luminace grating generator.
  SinGrating3D
Sine wave grating stimulus texture mapped onto quad in 3D This is a general-purpose, realtime sine-wave luminace grating generator.
  NumSamplesTooLargeError
visionegg-1.2.1/doc/reference/html/VisionEgg.Gratings-pysrc.html0000644000076500000240000074510511224565530024052 0ustar astrawstaff VisionEgg.Gratings
Package VisionEgg :: Module Gratings
[frames] | no frames]

Source Code for Module VisionEgg.Gratings

  1  # The Vision Egg: Gratings 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Copyright (C) 2005,2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Grating stimuli. 
 13   
 14  """ 
 15   
 16  #################################################################### 
 17  # 
 18  #        Import all the necessary packages 
 19  # 
 20  #################################################################### 
 21   
 22  import logging                              # available in Python 2.3 
 23   
 24  import VisionEgg 
 25  import VisionEgg.Core 
 26  import VisionEgg.Textures 
 27  import VisionEgg.ParameterTypes as ve_types 
 28  import numpy 
 29  import math, types, string 
 30  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
 31  import _vegl 
 32   
33 -def _get_type_info( bitdepth ):
34 """Private helper function to calculate type info based on bit depth""" 35 if bitdepth == 8: 36 gl_type = gl.GL_UNSIGNED_BYTE 37 numpy_dtype = numpy.uint8 38 max_int_val = float((2**8)-1) 39 elif bitdepth == 12: 40 gl_type = gl.GL_SHORT 41 numpy_dtype = numpy.int16 42 max_int_val = float((2**15)-1) 43 elif bitdepth == 16: 44 gl_type = gl.GL_INT 45 numpy_dtype = numpy.int32 46 max_int_val = float((2.**31.)-1) # do as float to avoid overflow 47 else: 48 raise ValueError("supported bitdepths are 8, 12, and 16.") 49 return gl_type, numpy_dtype, max_int_val
50
51 -class LuminanceGratingCommon(VisionEgg.Core.Stimulus):
52 """Base class with common code to all ways of drawing luminance gratings. 53 54 Parameters 55 ========== 56 bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) 57 Default: 8 58 """ 59 60 parameters_and_defaults = VisionEgg.ParameterDefinition({ 61 'bit_depth':(8, 62 ve_types.UnsignedInteger, 63 'precision with which grating is calculated and sent to OpenGL'), 64 }) 65 66 __slots__ = ( 67 'gl_internal_format', 68 'format', 69 'gl_type', 70 'numpy_dtype', 71 'max_int_val', 72 'cached_bit_depth', 73 ) 74
76 """Calculate a number of parameters dependent on bit depth.""" 77 bit_depth_warning = False 78 p = self.parameters # shorthand 79 80 red_bits = gl.glGetIntegerv( gl.GL_RED_BITS ) 81 green_bits = gl.glGetIntegerv( gl.GL_GREEN_BITS ) 82 blue_bits = gl.glGetIntegerv( gl.GL_BLUE_BITS ) 83 min_bits = min( (red_bits,green_bits,blue_bits) ) 84 if min_bits < p.bit_depth: 85 logger = logging.getLogger('VisionEgg.Gratings') 86 logger.warning("Requested bit depth of %d in " 87 "LuminanceGratingCommon, which is " 88 "greater than your current OpenGL context " 89 "supports (%d)."% (p.bit_depth,min_bits)) 90 self.gl_internal_format = gl.GL_LUMINANCE 91 self.format = gl.GL_LUMINANCE 92 self.gl_type, self.numpy_dtype, self.max_int_val = _get_type_info( p.bit_depth ) 93 self.cached_bit_depth = p.bit_depth
94
95 -class AlphaGratingCommon(VisionEgg.Core.Stimulus):
96 """Base class with common code to all ways of drawing gratings in alpha. 97 98 This class is currently not used by any other classes. 99 100 Parameters 101 ========== 102 bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) 103 Default: 8 104 """ 105 106 parameters_and_defaults = VisionEgg.ParameterDefinition({ 107 'bit_depth':(8, 108 ve_types.UnsignedInteger, 109 'precision with which grating is calculated and sent to OpenGL'), 110 }) 111 112 __slots__ = ( 113 'gl_internal_format', 114 'format', 115 'gl_type', 116 'numpy_dtype', 117 'max_int_val', 118 'cached_bit_depth', 119 ) 120
122 """Calculate a number of parameters dependent on bit depth.""" 123 p = self.parameters # shorthand 124 alpha_bit_depth = gl.glGetIntegerv( gl.GL_ALPHA_BITS ) 125 if alpha_bit_depth < p.bit_depth: 126 logger = logging.getLogger('VisionEgg.Gratings') 127 logger.warning("Requested bit depth of %d, which is " 128 "greater than your current OpenGL context " 129 "supports (%d)."% (p.bit_depth,min_bits)) 130 self.gl_internal_format = gl.GL_ALPHA 131 self.format = gl.GL_ALPHA 132 self.gl_type, self.numpy_dtype, self.max_int_val = _get_type_info( p.bit_depth ) 133 self.cached_bit_depth = p.bit_depth
134
135 -class SinGrating2D(LuminanceGratingCommon):
136 """Sine wave grating stimulus 137 138 This is a general-purpose, realtime sine-wave luminace grating 139 generator. To acheive an arbitrary orientation, this class rotates 140 a textured quad. To draw a grating with sides that always remain 141 horizontal and vertical, draw a large grating in a small viewport. 142 (The viewport will clip anything beyond its edges.) 143 144 Parameters 145 ========== 146 anchor -- specifies how position parameter is interpreted (String) 147 Default: center 148 bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) 149 Inherited from LuminanceGratingCommon 150 Default: 8 151 color1 -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 152 Default: (1.0, 1.0, 1.0) 153 color2 -- optional color with which to perform interpolation with color1 in RGB space (AnyOf(Sequence3 of Real or Sequence4 of Real)) 154 Default: (determined at runtime) 155 contrast -- (Real) 156 Default: 1.0 157 depth -- (Real) 158 Default: (determined at runtime) 159 ignore_time -- (Boolean) 160 Default: False 161 mask -- optional masking function (Instance of <class 'VisionEgg.Textures.Mask2D'>) 162 Default: (determined at runtime) 163 max_alpha -- (Real) 164 Default: 1.0 165 num_samples -- (UnsignedInteger) 166 Default: 512 167 on -- draw stimulus? (Boolean) 168 Default: True 169 orientation -- (Real) 170 Default: 0.0 171 pedestal -- (Real) 172 Default: 0.5 173 phase_at_t0 -- (Real) 174 Default: 0.0 175 position -- (units: eye coordinates) (Sequence2 of Real) 176 Default: (320.0, 240.0) 177 recalculate_phase_tolerance -- (Real) 178 Default: (determined at runtime) 179 size -- defines coordinate size of grating (in eye coordinates) (Sequence2 of Real) 180 Default: (640.0, 480.0) 181 spatial_freq -- frequency defined relative to coordinates defined in size parameter (units: cycles/eye_coord_unit) (Real) 182 Default: 0.0078125 183 t0_time_sec_absolute -- (Real) 184 Default: (determined at runtime) 185 temporal_freq_hz -- (Real) 186 Default: 5.0 187 """ 188 189 parameters_and_defaults = VisionEgg.ParameterDefinition({ 190 'on':(True, 191 ve_types.Boolean, 192 "draw stimulus?"), 193 'mask':(None, # allows window onto otherwise (tilted) rectangular grating 194 ve_types.Instance(VisionEgg.Textures.Mask2D), 195 "optional masking function"), 196 'contrast':(1.0, 197 ve_types.Real), 198 'pedestal':(0.5, 199 ve_types.Real), 200 'position':((320.0,240.0), # in eye coordinates 201 ve_types.Sequence2(ve_types.Real), 202 "(units: eye coordinates)"), 203 'anchor':('center', 204 ve_types.String, 205 "specifies how position parameter is interpreted"), 206 'depth':(None, # if not None, turns on depth testing and allows for occlusion 207 ve_types.Real), 208 'size':((640.0,480.0), 209 ve_types.Sequence2(ve_types.Real), 210 "defines coordinate size of grating (in eye coordinates)", 211 ), 212 'spatial_freq':(1.0/128.0, # cycles/eye coord units 213 ve_types.Real, 214 "frequency defined relative to coordinates defined in size parameter (units: cycles/eye_coord_unit)", 215 ), 216 'temporal_freq_hz':(5.0, # hz 217 ve_types.Real), 218 't0_time_sec_absolute':(None, # Will be assigned during first call to draw() 219 ve_types.Real), 220 'ignore_time':(False, # ignore temporal frequency variable - allow control purely with phase_at_t0 221 ve_types.Boolean), 222 'phase_at_t0':(0.0, # degrees [0.0-360.0] 223 ve_types.Real), 224 'orientation':(0.0, # 0=right, 90=up 225 ve_types.Real), 226 'num_samples':(512, # number of spatial samples, should be a power of 2 227 ve_types.UnsignedInteger), 228 'max_alpha':(1.0, # controls "opacity": 1.0 = completely opaque, 0.0 = completely transparent 229 ve_types.Real), 230 'color1':((1.0, 1.0, 1.0), # alpha is ignored (if given) -- use max_alpha parameter 231 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 232 ve_types.Sequence4(ve_types.Real))), 233 'color2':(None, # perform interpolation with color1 in RGB space. 234 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 235 ve_types.Sequence4(ve_types.Real)), 236 "optional color with which to perform interpolation with color1 in RGB space"), 237 'recalculate_phase_tolerance':(None, # only recalculate texture when phase is changed by more than this amount, None for always recalculate. (Saves time.) 238 ve_types.Real), 239 }) 240 241 __slots__ = ( 242 '_texture_object_id', 243 '_last_phase', 244 ) 245
246 - def __init__(self,**kw):
247 LuminanceGratingCommon.__init__(self,**kw) 248 249 p = self.parameters # shorthand 250 251 self._texture_object_id = gl.glGenTextures(1) 252 if p.mask: 253 gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) 254 gl.glBindTexture(gl.GL_TEXTURE_1D,self._texture_object_id) 255 256 # Do error-checking on texture to make sure it will load 257 max_dim = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE) 258 if p.num_samples > max_dim: 259 raise NumSamplesTooLargeError("Grating num_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) 260 261 self.calculate_bit_depth_dependencies() 262 263 w = p.size[0] 264 inc = w/float(p.num_samples) 265 phase = 0.0 # this data won't get used - don't care about phase 266 self._last_phase = phase 267 floating_point_sin = numpy.sin(2.0*math.pi*p.spatial_freq*numpy.arange(0.0,w,inc,dtype=numpy.float)+(phase/180.0*math.pi))*0.5*p.contrast+p.pedestal 268 floating_point_sin = numpy.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 269 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() 270 271 # Because the MAX_TEXTURE_SIZE method is insensitive to the current 272 # state of the video system, another check must be done using 273 # "proxy textures". 274 gl.glTexImage1D(gl.GL_PROXY_TEXTURE_1D, # target 275 0, # level 276 self.gl_internal_format, # video RAM internal format 277 p.num_samples, # width 278 0, # border 279 self.format, # format of texel data 280 self.gl_type, # type of texel data 281 texel_data) # texel data (irrelevant for proxy) 282 if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_1D, # Need PyOpenGL >= 2.0 283 0, 284 gl.GL_TEXTURE_WIDTH) == 0: 285 raise NumSamplesTooLargeError("Grating num_samples is too wide for your video system!") 286 287 # If we got here, it worked and we can load the texture for real. 288 gl.glTexImage1D(gl.GL_TEXTURE_1D, # target 289 0, # level 290 self.gl_internal_format, # video RAM internal format 291 p.num_samples, # width 292 0, # border 293 self.format, # format of texel data 294 self.gl_type, # type of texel data 295 texel_data) # texel data 296 297 # Set texture object defaults 298 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_S,gl.GL_CLAMP_TO_EDGE) 299 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_T,gl.GL_CLAMP_TO_EDGE) 300 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MAG_FILTER,gl.GL_LINEAR) 301 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MIN_FILTER,gl.GL_LINEAR) 302 303 if p.color2 is not None: 304 if VisionEgg.Core.gl_renderer == 'ATi Rage 128 Pro OpenGL Engine' and VisionEgg.Core.gl_version == '1.1 ATI-1.2.22': 305 logger = logging.getLogger('VisionEgg.Gratings') 306 logger.warning("Your video card and driver have known " 307 "bugs which prevent them from rendering " 308 "color gratings properly.")
309
310 - def __del__(self):
311 gl.glDeleteTextures( [self._texture_object_id] )
312
313 - def draw(self):
314 p = self.parameters # shorthand 315 if p.on: 316 # calculate center 317 center = VisionEgg._get_center(p.position,p.anchor,p.size) 318 if p.mask: 319 gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) 320 gl.glBindTexture(gl.GL_TEXTURE_1D,self._texture_object_id) 321 322 gl.glEnable(gl.GL_TEXTURE_1D) 323 gl.glDisable(gl.GL_TEXTURE_2D) 324 if p.bit_depth != self.cached_bit_depth: 325 self.calculate_bit_depth_dependencies() 326 327 # Clear the modeview matrix 328 gl.glMatrixMode(gl.GL_MODELVIEW) 329 gl.glPushMatrix() 330 331 # Rotate about the center of the texture 332 gl.glTranslate(center[0], 333 center[1], 334 0) 335 gl.glRotate(p.orientation,0,0,1) 336 337 if p.depth is None: 338 gl.glDisable(gl.GL_DEPTH_TEST) 339 depth = 0.0 340 else: 341 gl.glEnable(gl.GL_DEPTH_TEST) 342 depth = p.depth 343 344 # allow max_alpha value to control blending 345 gl.glEnable( gl.GL_BLEND ) 346 gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) 347 348 if p.color2: 349 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_BLEND) 350 gl.glTexEnvfv(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_COLOR, p.color2) 351 ## alpha is ignored because the texture base internal format is luminance 352 else: 353 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) 354 355 if p.t0_time_sec_absolute is None and not p.ignore_time: 356 p.t0_time_sec_absolute = VisionEgg.time_func() 357 358 w = p.size[0] 359 inc = w/float(p.num_samples) 360 if p.ignore_time: 361 phase = p.phase_at_t0 362 else: 363 t_var = VisionEgg.time_func() - p.t0_time_sec_absolute 364 phase = t_var*p.temporal_freq_hz*-360.0 + p.phase_at_t0 365 if p.recalculate_phase_tolerance is None or abs(self._last_phase - phase) > p.recalculate_phase_tolerance: 366 self._last_phase = phase # we're re-drawing the phase at this angle 367 floating_point_sin = numpy.sin(2.0*math.pi*p.spatial_freq*numpy.arange(0.0,w,inc,dtype=numpy.float)+(phase/180.0*math.pi))*0.5*p.contrast+p.pedestal 368 floating_point_sin = numpy.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 369 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype) 370 # PyOpenGL 2.0.1.09 has a bug, so use our own wrapper 371 _vegl.veglTexSubImage1D(gl.GL_TEXTURE_1D, # target 372 0, # level 373 0, # x offset 374 p.num_samples, # width 375 self.format, # format of new texel data 376 self.gl_type, # type of new texel data 377 texel_data) # new texel data 378 if 0: 379 compare_array = numpy.empty(texel_data.shape,dtype=texel_data.dtype) 380 pixels = _vegl.veglGetTexImage(gl.GL_TEXTURE_1D, # target 381 0, # level 382 self.format, # format 383 self.gl_type, # type 384 compare_array) 385 assert numpy.allclose( compare_array, texel_data ) 386 387 h_w = p.size[0]/2.0 388 h_h = p.size[1]/2.0 389 390 l = -h_w 391 r = h_w 392 b = -h_h 393 t = h_h 394 395 # in the case of only color1, 396 # the texel data multiplies color1 to produce a color 397 398 # with color2, 399 # the texel data linearly interpolates between color1 and color2 400 401 gl.glColor4f(p.color1[0],p.color1[1],p.color1[2],p.max_alpha) 402 403 if p.mask: 404 p.mask.draw_masked_quad(0.0,1.0,0.0,1.0, # l,r,b,t for texture coordinates 405 l,r,b,t, # l,r,b,t in eye coordinates 406 depth ) # also in eye coordinates 407 else: 408 # draw unmasked quad 409 gl.glBegin(gl.GL_QUADS) 410 411 gl.glTexCoord2f(0.0,0.0) 412 gl.glVertex3f(l,b,depth) 413 414 gl.glTexCoord2f(1.0,0.0) 415 gl.glVertex3f(r,b,depth) 416 417 gl.glTexCoord2f(1.0,1.0) 418 gl.glVertex3f(r,t,depth) 419 420 gl.glTexCoord2f(0.0,1.0) 421 gl.glVertex3f(l,t,depth) 422 gl.glEnd() # GL_QUADS 423 424 gl.glDisable(gl.GL_TEXTURE_1D) 425 gl.glPopMatrix()
426
427 -class SinGrating3D(LuminanceGratingCommon):
428 """Sine wave grating stimulus texture mapped onto quad in 3D 429 430 This is a general-purpose, realtime sine-wave luminace grating 431 generator. This 3D version doesn't support an orientation 432 parameter. This could be implemented, but for now should be done 433 by orienting the quad in 3D. 434 435 Parameters 436 ========== 437 bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) 438 Inherited from LuminanceGratingCommon 439 Default: 8 440 color1 -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 441 Default: (1.0, 1.0, 1.0) 442 color2 -- optional color with which to perform interpolation with color1 in RGB space (AnyOf(Sequence3 of Real or Sequence4 of Real)) 443 Default: (determined at runtime) 444 contrast -- (Real) 445 Default: 1.0 446 depth -- (Real) 447 Default: (determined at runtime) 448 depth_test -- perform depth test? (Boolean) 449 Default: True 450 ignore_time -- (Boolean) 451 Default: False 452 lowerleft -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) 453 Default: (0.0, 0.0, -1.0) 454 lowerright -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) 455 Default: (1.0, 0.0, -1.0) 456 mask -- optional masking function (Instance of <class 'VisionEgg.Textures.Mask2D'>) 457 Default: (determined at runtime) 458 max_alpha -- (Real) 459 Default: 1.0 460 num_samples -- (UnsignedInteger) 461 Default: 512 462 on -- draw stimulus? (Boolean) 463 Default: True 464 pedestal -- (Real) 465 Default: 0.5 466 phase_at_t0 -- (Real) 467 Default: 0.0 468 recalculate_phase_tolerance -- (Real) 469 Default: (determined at runtime) 470 size -- defines coordinate size of grating (in eye coordinates) (Sequence2 of Real) 471 Default: (1.0, 1.0) 472 spatial_freq -- frequency defined relative to coordinates defined in size parameter (units; cycles/eye_coord_unit) (Real) 473 Default: 4.0 474 t0_time_sec_absolute -- (Real) 475 Default: (determined at runtime) 476 temporal_freq_hz -- (Real) 477 Default: 5.0 478 upperleft -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) 479 Default: (0.0, 1.0, -1.0) 480 upperright -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) 481 Default: (1.0, 1.0, -1.0) 482 """ 483 484 parameters_and_defaults = VisionEgg.ParameterDefinition({ 485 'on':(True, 486 ve_types.Boolean, 487 "draw stimulus?"), 488 'mask':(None, # allows window onto otherwise (tilted) rectangular grating 489 ve_types.Instance(VisionEgg.Textures.Mask2D), 490 "optional masking function"), 491 'contrast':(1.0, 492 ve_types.Real), 493 'pedestal':(0.5, 494 ve_types.Real), 495 'depth':(None, # if not None, turns on depth testing and allows for occlusion 496 ve_types.Real), 497 'size':((1.0,1.0), # in eye coordinates 498 ve_types.Sequence2(ve_types.Real), 499 "defines coordinate size of grating (in eye coordinates)"), 500 'spatial_freq':(4.0, # cycles/eye coord units 501 ve_types.Real, 502 "frequency defined relative to coordinates defined in size parameter (units; cycles/eye_coord_unit)"), 503 'temporal_freq_hz':(5.0, # hz 504 ve_types.Real), 505 't0_time_sec_absolute':(None, # Will be assigned during first call to draw() 506 ve_types.Real), 507 'ignore_time':(False, # ignore temporal frequency variable - allow control purely with phase_at_t0 508 ve_types.Boolean), 509 'phase_at_t0':(0.0, # degrees [0.0-360.0] 510 ve_types.Real), 511 'num_samples':(512, # number of spatial samples, should be a power of 2 512 ve_types.UnsignedInteger), 513 'max_alpha':(1.0, # controls "opacity": 1.0 = completely opaque, 0.0 = completely transparent 514 ve_types.Real), 515 'color1':((1.0, 1.0, 1.0), # alpha is ignored (if given) -- use max_alpha parameter 516 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 517 ve_types.Sequence4(ve_types.Real))), 518 'color2':(None, # perform interpolation with color1 in RGB space. 519 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 520 ve_types.Sequence4(ve_types.Real)), 521 "optional color with which to perform interpolation with color1 in RGB space"), 522 'recalculate_phase_tolerance':(None, # only recalculate texture when phase is changed by more than this amount, None for always recalculate. (Saves time.) 523 ve_types.Real), 524 'depth_test':(True, 525 ve_types.Boolean, 526 "perform depth test?"), 527 'lowerleft':((0.0,0.0,-1.0), # in eye coordinates 528 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 529 ve_types.Sequence4(ve_types.Real)), 530 "vertex position (units: eye coordinates)"), 531 'lowerright':((1.0,0.0,-1.0), # in eye coordinates 532 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 533 ve_types.Sequence4(ve_types.Real)), 534 "vertex position (units: eye coordinates)"), 535 'upperleft':((0.0,1.0,-1.0), # in eye coordinates 536 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 537 ve_types.Sequence4(ve_types.Real)), 538 "vertex position (units: eye coordinates)"), 539 'upperright':((1.0,1.0,-1.0), # in eye coordinates 540 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 541 ve_types.Sequence4(ve_types.Real)), 542 "vertex position (units: eye coordinates)"), 543 }) 544 545 __slots__ = ( 546 '_texture_object_id', 547 '_last_phase', 548 ) 549
550 - def __init__(self,**kw):
551 LuminanceGratingCommon.__init__(self,**kw) 552 553 p = self.parameters # shorthand 554 555 self._texture_object_id = gl.glGenTextures(1) 556 if p.mask: 557 gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) 558 gl.glBindTexture(gl.GL_TEXTURE_1D,self._texture_object_id) 559 560 # Do error-checking on texture to make sure it will load 561 max_dim = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE) 562 if p.num_samples > max_dim: 563 raise NumSamplesTooLargeError("Grating num_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) 564 565 self.calculate_bit_depth_dependencies() 566 567 w = p.size[0] 568 inc = w/float(p.num_samples) 569 phase = 0.0 # this data won't get used - don't care about phase 570 self._last_phase = phase 571 floating_point_sin = numpy.sin(2.0*math.pi*p.spatial_freq*numpy.arange(0.0,w,inc,dtype=numpy.float)+(phase/180.0*math.pi))*0.5*p.contrast+p.pedestal 572 floating_point_sin = numpy.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 573 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() 574 575 # Because the MAX_TEXTURE_SIZE method is insensitive to the current 576 # state of the video system, another check must be done using 577 # "proxy textures". 578 gl.glTexImage1D(gl.GL_PROXY_TEXTURE_1D, # target 579 0, # level 580 self.gl_internal_format, # video RAM internal format 581 p.num_samples, # width 582 0, # border 583 self.format, # format of texel data 584 self.gl_type, # type of texel data 585 texel_data) # texel data (irrelevant for proxy) 586 if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_1D, # Need PyOpenGL >= 2.0 587 0, 588 gl.GL_TEXTURE_WIDTH) == 0: 589 raise NumSamplesTooLargeError("Grating num_samples is too wide for your video system!") 590 591 # If we got here, it worked and we can load the texture for real. 592 gl.glTexImage1D(gl.GL_TEXTURE_1D, # target 593 0, # level 594 self.gl_internal_format, # video RAM internal format 595 p.num_samples, # width 596 0, # border 597 self.format, # format of texel data 598 self.gl_type, # type of texel data 599 texel_data) # texel data 600 601 # Set texture object defaults 602 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_S,gl.GL_CLAMP_TO_EDGE) 603 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_T,gl.GL_CLAMP_TO_EDGE) 604 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MAG_FILTER,gl.GL_LINEAR) 605 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MIN_FILTER,gl.GL_LINEAR) 606 607 if p.color2 is not None: 608 if VisionEgg.Core.gl_renderer == 'ATi Rage 128 Pro OpenGL Engine' and VisionEgg.Core.gl_version == '1.1 ATI-1.2.22': 609 logger = logging.getLogger('VisionEgg.Gratings') 610 logger.warning("Your video card and driver have known " 611 "bugs which prevent them from rendering " 612 "color gratings properly.")
613
614 - def __del__(self):
615 gl.glDeleteTextures( [self._texture_object_id] )
616
617 - def draw(self):
618 p = self.parameters # shorthand 619 if p.on: 620 if p.mask: 621 gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) 622 if p.depth_test: 623 gl.glEnable(gl.GL_DEPTH_TEST) 624 else: 625 gl.glDisable(gl.GL_DEPTH_TEST) 626 gl.glBindTexture(gl.GL_TEXTURE_1D,self._texture_object_id) 627 gl.glEnable(gl.GL_TEXTURE_1D) 628 gl.glDisable(gl.GL_TEXTURE_2D) 629 if p.bit_depth != self.cached_bit_depth: 630 self.calculate_bit_depth_dependencies() 631 632 # allow max_alpha value to control blending 633 gl.glEnable( gl.GL_BLEND ) 634 gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) 635 636 if p.color2: 637 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_BLEND) 638 gl.glTexEnvfv(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_COLOR, p.color2) 639 ## alpha is ignored because the texture base internal format is luminance 640 else: 641 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) 642 643 if p.t0_time_sec_absolute is None and not p.ignore_time: 644 p.t0_time_sec_absolute = VisionEgg.time_func() 645 646 w = p.size[0] 647 inc = w/float(p.num_samples) 648 if p.ignore_time: 649 phase = p.phase_at_t0 650 else: 651 t_var = VisionEgg.time_func() - p.t0_time_sec_absolute 652 phase = t_var*p.temporal_freq_hz*-360.0 + p.phase_at_t0 653 if p.recalculate_phase_tolerance is None or abs(self._last_phase - phase) > p.recalculate_phase_tolerance: 654 self._last_phase = phase # we're re-drawing the phase at this angle 655 floating_point_sin = numpy.sin(2.0*math.pi*p.spatial_freq*numpy.arange(0.0,w,inc,dtype=numpy.float)+(phase/180.0*math.pi))*0.5*p.contrast+p.pedestal 656 floating_point_sin = numpy.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 657 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() 658 659 gl.glTexSubImage1D(gl.GL_TEXTURE_1D, # target 660 0, # level 661 0, # x offset 662 p.num_samples, # width 663 self.format, # format of new texel data 664 self.gl_type, # type of new texel data 665 texel_data) # new texel data 666 667 # in the case of only color1, 668 # the texel data multiplies color1 to produce a color 669 670 # with color2, 671 # the texel data linearly interpolates between color1 and color2 672 673 gl.glColor4f(p.color1[0],p.color1[1],p.color1[2],p.max_alpha) 674 675 if p.mask: 676 p.mask.draw_masked_quad_3d(0.0,1.0,0.0,1.0, # for texture coordinates 677 p.lowerleft,p.lowerright,p.upperright,p.upperleft) 678 else: 679 # draw unmasked quad 680 gl.glBegin(gl.GL_QUADS) 681 682 gl.glTexCoord2f(0.0,0.0) 683 gl.glVertex3f(*p.lowerleft) 684 685 gl.glTexCoord2f(1.0,0.0) 686 gl.glVertex3f(*p.lowerright) 687 688 gl.glTexCoord2f(1.0,1.0) 689 gl.glVertex3f(*p.upperright) 690 691 gl.glTexCoord2f(0.0,1.0) 692 gl.glVertex3f(*p.upperleft) 693 gl.glEnd() # GL_QUADS 694 695 gl.glDisable(gl.GL_TEXTURE_1D)
696
697 -class NumSamplesTooLargeError( RuntimeError ):
698 pass
699

visionegg-1.2.1/doc/reference/html/VisionEgg.Gratings.AlphaGratingCommon-class.html0000644000076500000240000002436111224565530027522 0ustar astrawstaff VisionEgg.Gratings.AlphaGratingCommon
Package VisionEgg :: Module Gratings :: Class AlphaGratingCommon
[frames] | no frames]

Class AlphaGratingCommon

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         AlphaGratingCommon

Base class with common code to all ways of drawing gratings in alpha.

This class is currently not used by any other classes.

Parameters
==========
bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger)
             Default: 8



Instance Methods
 
calculate_bit_depth_dependencies(self)
Calculate a number of parameters dependent on bit depth.
source code

Inherited from Core.Stimulus: __init__, draw

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'bit_...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'bit_depth':(8, ve_types.UnsignedIntege\
r, 'precision with which grating is calculated and sent to OpenGL'),})

visionegg-1.2.1/doc/reference/html/VisionEgg.Gratings.LuminanceGratingCommon-class.html0000644000076500000240000002433211224565530030406 0ustar astrawstaff VisionEgg.Gratings.LuminanceGratingCommon
Package VisionEgg :: Module Gratings :: Class LuminanceGratingCommon
[frames] | no frames]

Class LuminanceGratingCommon

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         LuminanceGratingCommon

Base class with common code to all ways of drawing luminance gratings.

Parameters
==========
bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger)
             Default: 8



Instance Methods
 
calculate_bit_depth_dependencies(self)
Calculate a number of parameters dependent on bit depth.
source code

Inherited from Core.Stimulus: __init__, draw

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'bit_...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'bit_depth':(8, ve_types.UnsignedIntege\
r, 'precision with which grating is calculated and sent to OpenGL'),})

visionegg-1.2.1/doc/reference/html/VisionEgg.Gratings.NumSamplesTooLargeError-class.html0000644000076500000240000001461111224565530030540 0ustar astrawstaff VisionEgg.Gratings.NumSamplesTooLargeError
Package VisionEgg :: Module Gratings :: Class NumSamplesTooLargeError
[frames] | no frames]

Class NumSamplesTooLargeError

source code

              object --+                
                       |                
exceptions.BaseException --+            
                           |            
        exceptions.Exception --+        
                               |        
        exceptions.StandardError --+    
                                   |    
             exceptions.RuntimeError --+
                                       |
                                      NumSamplesTooLargeError

Instance Methods

Inherited from exceptions.RuntimeError: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__

Inherited from object: __hash__, __reduce_ex__

Properties

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.Gratings.SinGrating2D-class.html0000644000076500000240000004372311224565530026246 0ustar astrawstaff VisionEgg.Gratings.SinGrating2D
Package VisionEgg :: Module Gratings :: Class SinGrating2D
[frames] | no frames]

Class SinGrating2D

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
          Core.Stimulus --+    
                          |    
     LuminanceGratingCommon --+
                              |
                             SinGrating2D

Sine wave grating stimulus

This is a general-purpose, realtime sine-wave luminace grating
generator. To acheive an arbitrary orientation, this class rotates
a textured quad.  To draw a grating with sides that always remain
horizontal and vertical, draw a large grating in a small viewport.
(The viewport will clip anything beyond its edges.)

Parameters
==========
anchor                      -- specifies how position parameter is interpreted (String)
                               Default: center
bit_depth                   -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger)
                               Inherited from LuminanceGratingCommon
                               Default: 8
color1                      -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                               Default: (1.0, 1.0, 1.0)
color2                      -- optional color with which to perform interpolation with color1 in RGB space (AnyOf(Sequence3 of Real or Sequence4 of Real))
                               Default: (determined at runtime)
contrast                    -- (Real)
                               Default: 1.0
depth                       -- (Real)
                               Default: (determined at runtime)
ignore_time                 -- (Boolean)
                               Default: False
mask                        -- optional masking function (Instance of <class 'VisionEgg.Textures.Mask2D'>)
                               Default: (determined at runtime)
max_alpha                   -- (Real)
                               Default: 1.0
num_samples                 -- (UnsignedInteger)
                               Default: 512
on                          -- draw stimulus? (Boolean)
                               Default: True
orientation                 -- (Real)
                               Default: 0.0
pedestal                    -- (Real)
                               Default: 0.5
phase_at_t0                 -- (Real)
                               Default: 0.0
position                    -- (units: eye coordinates) (Sequence2 of Real)
                               Default: (320.0, 240.0)
recalculate_phase_tolerance -- (Real)
                               Default: (determined at runtime)
size                        -- defines coordinate size of grating (in eye coordinates) (Sequence2 of Real)
                               Default: (640.0, 480.0)
spatial_freq                -- frequency defined relative to coordinates defined in size parameter (units: cycles/eye_coord_unit) (Real)
                               Default: 0.0078125
t0_time_sec_absolute        -- (Real)
                               Default: (determined at runtime)
temporal_freq_hz            -- (Real)
                               Default: 5.0



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
__del__(self) source code
 
draw(self)
Draw the stimulus.
source code

Inherited from LuminanceGratingCommon: calculate_bit_depth_dependencies

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'on':...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'on':(True, ve_types.Boolean, "draw sti\
mulus?"), 'mask':(None, ve_types.Instance(VisionEgg.Textures.Mask2D), \
"optional masking function"), 'contrast':(1.0, ve_types.Real), 'pedest\
al':(0.5, ve_types.Real), 'position':((320.0, 240.0), ve_types.Sequenc\
e2(ve_types.Real), "(units: eye coordinates)"), 'anchor':('center', ve\
_types.String, "specifies how position parameter is interpreted"), 'de\
pth':(None, ve_types.Real), 'size':((640.0, 480.0), ve_types.Sequence2\
(ve_types.Real), "defines coordinate size of grating (in eye coordinat\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.Gratings.SinGrating3D-class.html0000644000076500000240000004451511224565530026247 0ustar astrawstaff VisionEgg.Gratings.SinGrating3D
Package VisionEgg :: Module Gratings :: Class SinGrating3D
[frames] | no frames]

Class SinGrating3D

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
          Core.Stimulus --+    
                          |    
     LuminanceGratingCommon --+
                              |
                             SinGrating3D

Sine wave grating stimulus texture mapped onto quad in 3D

This is a general-purpose, realtime sine-wave luminace grating
generator. This 3D version doesn't support an orientation
parameter.  This could be implemented, but for now should be done
by orienting the quad in 3D.

Parameters
==========
bit_depth                   -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger)
                               Inherited from LuminanceGratingCommon
                               Default: 8
color1                      -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                               Default: (1.0, 1.0, 1.0)
color2                      -- optional color with which to perform interpolation with color1 in RGB space (AnyOf(Sequence3 of Real or Sequence4 of Real))
                               Default: (determined at runtime)
contrast                    -- (Real)
                               Default: 1.0
depth                       -- (Real)
                               Default: (determined at runtime)
depth_test                  -- perform depth test? (Boolean)
                               Default: True
ignore_time                 -- (Boolean)
                               Default: False
lowerleft                   -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real))
                               Default: (0.0, 0.0, -1.0)
lowerright                  -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real))
                               Default: (1.0, 0.0, -1.0)
mask                        -- optional masking function (Instance of <class 'VisionEgg.Textures.Mask2D'>)
                               Default: (determined at runtime)
max_alpha                   -- (Real)
                               Default: 1.0
num_samples                 -- (UnsignedInteger)
                               Default: 512
on                          -- draw stimulus? (Boolean)
                               Default: True
pedestal                    -- (Real)
                               Default: 0.5
phase_at_t0                 -- (Real)
                               Default: 0.0
recalculate_phase_tolerance -- (Real)
                               Default: (determined at runtime)
size                        -- defines coordinate size of grating (in eye coordinates) (Sequence2 of Real)
                               Default: (1.0, 1.0)
spatial_freq                -- frequency defined relative to coordinates defined in size parameter (units; cycles/eye_coord_unit) (Real)
                               Default: 4.0
t0_time_sec_absolute        -- (Real)
                               Default: (determined at runtime)
temporal_freq_hz            -- (Real)
                               Default: 5.0
upperleft                   -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real))
                               Default: (0.0, 1.0, -1.0)
upperright                  -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real))
                               Default: (1.0, 1.0, -1.0)



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
__del__(self) source code
 
draw(self)
Draw the stimulus.
source code

Inherited from LuminanceGratingCommon: calculate_bit_depth_dependencies

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'on':...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'on':(True, ve_types.Boolean, "draw sti\
mulus?"), 'mask':(None, ve_types.Instance(VisionEgg.Textures.Mask2D), \
"optional masking function"), 'contrast':(1.0, ve_types.Real), 'pedest\
al':(0.5, ve_types.Real), 'depth':(None, ve_types.Real), 'size':((1.0,\
 1.0), ve_types.Sequence2(ve_types.Real), "defines coordinate size of \
grating (in eye coordinates)"), 'spatial_freq':(4.0, ve_types.Real, "f\
requency defined relative to coordinates defined in size parameter (un\
its; cycles/eye_coord_unit)"), 'temporal_freq_hz':(5.0, ve_types.Real)\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.GUI-module.html0000644000076500000240000002070111224565530023031 0ustar astrawstaff VisionEgg.GUI
Package VisionEgg :: Module GUI
[frames] | no frames]

Module GUI

source code


Graphical user interface classes and functions.



Classes
  AppWindow
A GUI Window that can be subclassed for a main application window
  ProgressBar
  GraphicsConfigurationWindow
Graphics Configuration Window
  InfoFrame
  ToplevelDialog
Base class for a dialog that runs on the top level.
  GetKeypressDialog
Open a dialog box which returns when a valid key is pressed.
Functions
 
showexception(exc_type, exc_value, traceback_str) source code
Variables
  Tkinter = _delay_import_error(x)
  tkMessageBox = _delay_import_error(x)
  tkFileDialog = _delay_import_error(x)
visionegg-1.2.1/doc/reference/html/VisionEgg.GUI-pysrc.html0000644000076500000240000134635611224565530022726 0ustar astrawstaff VisionEgg.GUI
Package VisionEgg :: Module GUI
[frames] | no frames]

Source Code for Module VisionEgg.GUI

  1  # The Vision Egg: GUI 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Copyright (C) 2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Graphical user interface classes and functions. 
 13   
 14  """ 
 15   
 16  import VisionEgg 
 17   
 18  #################################################################### 
 19  # 
 20  #        Import all the necessary packages 
 21  # 
 22  #################################################################### 
 23   
 24   
 25  import logging                              # available in Python 2.3 
 26   
 27  import VisionEgg 
 28  import os 
 29  import sys 
 30   
32 """Defer import errors until they cause problems."""
33 - def __init__(self,orig_traceback):
34 self.orig_traceback = orig_traceback
35 - def __getattr__(self,name):
36 raise self.orig_traceback # ImportError deferred from earlier failure
37 38 try: 39 import Tkinter 40 except ImportError, x: # don't fail on this until it becomes a problem... 41 Tkinter = _delay_import_error(x) 42 43 try: 44 import tkMessageBox 45 except ImportError, x: # don't fail on this until it becomes a problem... 46 tkMessageBox = _delay_import_error(x) 47 48 try: 49 import tkFileDialog 50 except ImportError, x: # don't fail on this until it becomes a problem... 51 tkFileDialog = _delay_import_error(x) 52
53 -def showexception(exc_type, exc_value, traceback_str):
54 # private subclass of Tkinter.Frame 55 class ShowExceptionFrame(Tkinter.Frame): 56 """A window that shows a string and has a quit button.""" 57 def __init__(self,master,exc_type, exc_value, traceback_str): 58 VisionEgg.config._Tkinter_used = True 59 Tkinter.Frame.__init__(self,master,borderwidth=20) 60 title="Vision Egg: exception caught" 61 first_str = "An unhandled exception was caught." 62 type_value_str = "%s: %s"%(str(exc_type),str(exc_value)) 63 64 frame = self 65 66 top = frame.winfo_toplevel() 67 top.title(title) 68 top.protocol("WM_DELETE_WINDOW",self.close_window) 69 70 Tkinter.Label(frame,text=first_str).pack() 71 Tkinter.Label(frame,text=type_value_str).pack() 72 if traceback_str: 73 Tkinter.Label(frame,text="Traceback (most recent call last):").pack() 74 Tkinter.Label(frame,text=traceback_str).pack() 75 76 b = Tkinter.Button(frame,text="OK",command=self.close_window) 77 b.pack() 78 b.focus_set() 79 b.grab_set() 80 b.bind('<Return>',self.close_window)
81 82 def close_window(self,dummy_arg=None): 83 self.quit() 84 # create instance of class 85 parent = Tkinter._default_root 86 if parent: 87 top = Tkinter.Toplevel(parent) 88 top.transient(parent) 89 else: 90 top = None 91 f = ShowExceptionFrame(top, exc_type, exc_value, traceback_str) 92 f.pack() 93 f.mainloop() 94 f.winfo_toplevel().destroy() 95
96 -class AppWindow(Tkinter.Frame):
97 """A GUI Window that can be subclassed for a main application window"""
98 - def __init__(self,master=None,idle_func=lambda: None,**cnf):
99 VisionEgg.config._Tkinter_used = True 100 Tkinter.Frame.__init__(self,master,**cnf) 101 self.winfo_toplevel().title('Vision Egg') 102 103 self.info_frame = InfoFrame(self) 104 self.info_frame.pack() 105 106 self.idle_func = idle_func 107 self.after(1,self.idle) # register idle function with Tkinter
108
109 - def idle(self):
110 self.idle_func() 111 self.after(1,self.idle) # (re)register idle function with Tkinter
112
113 -class ProgressBar(Tkinter.Frame):
114 - def __init__(self, master=None, orientation="horizontal", 115 min=0, max=100, width=100, height=18, 116 doLabel=1, fillColor="LightSteelBlue1", background="gray", 117 labelColor="black", labelFont="Helvetica", 118 labelText="", labelFormat="%d%%", 119 value=50, **cnf):
120 Tkinter.Frame.__init__(self,master) 121 # preserve various values 122 self.master=master 123 self.orientation=orientation 124 self.min=min 125 self.max=max 126 self.width=width 127 self.height=height 128 self.doLabel=doLabel 129 self.fillColor=fillColor 130 self.labelFont= labelFont 131 self.labelColor=labelColor 132 self.background=background 133 self.labelText=labelText 134 self.labelFormat=labelFormat 135 self.value=value 136 self.canvas=Tkinter.Canvas(self, height=height, width=width, bd=0, 137 highlightthickness=0, background=background) 138 self.scale=self.canvas.create_rectangle(0, 0, width, height, 139 fill=fillColor) 140 self.label=self.canvas.create_text(self.canvas.winfo_reqwidth() / 2, 141 height / 2, text=labelText, 142 anchor="c", fill=labelColor, 143 font=self.labelFont) 144 self.update() 145 self.canvas.pack(side='top', fill='x', expand='no')
146
147 - def updateProgress(self, newValue, newMax=None):
148 if newMax: 149 self.max = newMax 150 self.value = newValue 151 self.update()
152
153 - def update(self):
154 # Trim the values to be between min and max 155 value=self.value 156 if value > self.max: 157 value = self.max 158 if value < self.min: 159 value = self.min 160 # Adjust the rectangle 161 if self.orientation == "horizontal": 162 self.canvas.coords(self.scale, 0, 0, 163 float(value) / self.max * self.width, self.height) 164 else: 165 self.canvas.coords(self.scale, 0, 166 self.height - (float(value) / 167 self.max*self.height), 168 self.width, self.height) 169 # Now update the colors 170 self.canvas.itemconfig(self.scale, fill=self.fillColor) 171 self.canvas.itemconfig(self.label, fill=self.labelColor) 172 # And update the label 173 if self.doLabel: 174 if value: 175 if value >= 0: 176 pvalue = int((float(value) / float(self.max)) * 177 100.0) 178 else: 179 pvalue = 0 180 self.canvas.itemconfig(self.label, text=self.labelFormat 181 % pvalue) 182 else: 183 self.canvas.itemconfig(self.label, text='') 184 else: 185 self.canvas.itemconfig(self.label, text=self.labelFormat % 186 self.labelText) 187 self.canvas.update_idletasks()
188
189 -class GraphicsConfigurationWindow(Tkinter.Frame):
190 """Graphics Configuration Window"""
191 - def __init__(self,master=None,**cnf):
192 VisionEgg.config._Tkinter_used = True 193 Tkinter.Frame.__init__(self,master,**cnf) 194 self.winfo_toplevel().title('Vision Egg - Graphics configuration') 195 self.pack() 196 197 self.clicked_ok = 0 # So we can distinguish between clicking OK and closing the window 198 199 row = 0 200 Tkinter.Label(self, 201 text="Vision Egg - Graphics configuration", 202 font=("Helvetica",14,"bold")).grid(row=row,columnspan=2) 203 row += 1 204 205 ################## begin topframe ############################## 206 207 topframe = Tkinter.Frame(self) 208 topframe.grid(row=row,column=0,columnspan=2) 209 topframe_row = 0 210 211 Tkinter.Label(topframe, 212 text=self.format_string("The default value for these variables and the presence of this dialog window can be controlled via the Vision Egg config file. If this file exists in the Vision Egg user directory, that file is used. Otherwise, the configuration file found in the Vision Egg system directory is used."), 213 ).grid(row=topframe_row,column=1,columnspan=2,sticky=Tkinter.W) 214 topframe_row += 1 215 216 try: 217 import _imaging, _imagingtk 218 import ImageFile, ImageFileIO, BmpImagePlugin, JpegImagePlugin 219 import Image,ImageTk 220 im = Image.open(os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,'data','visionegg.bmp')) 221 self.tk_im=ImageTk.PhotoImage(im) 222 Tkinter.Label(topframe,image=self.tk_im).grid(row=0,rowspan=topframe_row,column=0) 223 except Exception,x: 224 logger = logging.getLogger('VisionEgg.GUI') 225 logger.info("No Vision Egg logo :( because of error while " 226 "trying to display image in " 227 "GUI.GraphicsConfigurationWindow: %s: " 228 "%s"%(str(x.__class__),str(x))) 229 230 ################## end topframe ############################## 231 232 row += 1 233 234 ################## begin file_frame ############################## 235 236 file_frame = Tkinter.Frame(self) 237 file_frame.grid(row=row,columnspan=2,sticky=Tkinter.W+Tkinter.E,pady=5) 238 239 # Script name and location 240 file_row = 0 241 Tkinter.Label(file_frame, 242 text="This script:").grid(row=file_row,column=0,sticky=Tkinter.E) 243 Tkinter.Label(file_frame, 244 text="%s"%(os.path.abspath(sys.argv[0]),)).grid(row=file_row,column=1,sticky=Tkinter.W) 245 file_row += 1 246 # Vision Egg system dir 247 Tkinter.Label(file_frame, 248 text="Vision Egg system directory:").grid(row=file_row,column=0,sticky=Tkinter.E) 249 Tkinter.Label(file_frame, 250 text="%s"%(os.path.abspath(VisionEgg.config.VISIONEGG_SYSTEM_DIR),)).grid(row=file_row,column=1,sticky=Tkinter.W) 251 file_row += 1 252 253 # Vision Egg user dir 254 Tkinter.Label(file_frame, 255 text="Vision Egg user directory:").grid(row=file_row,column=0,sticky=Tkinter.E) 256 Tkinter.Label(file_frame, 257 text="%s"%(os.path.abspath(VisionEgg.config.VISIONEGG_USER_DIR),)).grid(row=file_row,column=1,sticky=Tkinter.W) 258 file_row += 1 259 260 # Config file 261 Tkinter.Label(file_frame, 262 text="Config file location:").grid(row=file_row,column=0,sticky=Tkinter.E) 263 if VisionEgg.config.VISIONEGG_CONFIG_FILE: 264 Tkinter.Label(file_frame, 265 text="%s"%(os.path.abspath(VisionEgg.config.VISIONEGG_CONFIG_FILE),)).grid(row=file_row,column=1,sticky=Tkinter.W) 266 else: 267 Tkinter.Label(file_frame, 268 text="(None)").grid(row=file_row,column=1,sticky=Tkinter.W) 269 file_row += 1 270 271 # Log file location 272 Tkinter.Label(file_frame, 273 text="Log file location:").grid(row=file_row,column=0,sticky=Tkinter.E) 274 if VisionEgg.config.VISIONEGG_LOG_FILE: 275 Tkinter.Label(file_frame, 276 text="%s"%(os.path.abspath(VisionEgg.config.VISIONEGG_LOG_FILE),)).grid(row=file_row,column=1,sticky=Tkinter.W) 277 else: 278 Tkinter.Label(file_frame, 279 text="(stderr console)").grid(row=file_row,column=1,sticky=Tkinter.W) 280 281 ################## end file_frame ############################## 282 283 row += 1 284 285 ################## begin cf ############################## 286 287 cf = Tkinter.Frame(self) 288 cf.grid(row=row,column=0,padx=10) 289 290 cf_row = 0 291 # Fullscreen 292 self.fullscreen = Tkinter.BooleanVar() 293 self.fullscreen.set(VisionEgg.config.VISIONEGG_FULLSCREEN) 294 Tkinter.Checkbutton(cf, 295 text='Fullscreen', 296 variable=self.fullscreen, 297 relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) 298 299 cf_row += 1 300 self.synclync_present = Tkinter.BooleanVar() 301 self.synclync_present.set(VisionEgg.config.SYNCLYNC_PRESENT) 302 try: 303 import synclync 304 self.show_synclync_option = 1 305 except: 306 self.show_synclync_option = 0 307 308 if self.show_synclync_option: 309 Tkinter.Checkbutton(cf, 310 text='SyncLync device present', 311 variable=self.synclync_present, 312 relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) 313 314 315 cf_row += 1 316 # Maximum priority 317 self.maxpriority = Tkinter.BooleanVar() 318 self.maxpriority.set(VisionEgg.config.VISIONEGG_MAXPRIORITY) 319 320 Tkinter.Checkbutton(cf, 321 text='Maximum priority (use with caution)', 322 variable=self.maxpriority, 323 relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) 324 cf_row += 1 325 326 if sys.platform=='darwin': 327 # Only used on darwin platform 328 self.darwin_conventional = Tkinter.IntVar() 329 self.darwin_conventional.set(VisionEgg.config.VISIONEGG_DARWIN_MAXPRIORITY_CONVENTIONAL_NOT_REALTIME) 330 self.darwin_priority = Tkinter.StringVar() 331 self.darwin_priority.set(str(VisionEgg.config.VISIONEGG_DARWIN_CONVENTIONAL_PRIORITY)) 332 self.darwin_realtime_period_denom = Tkinter.StringVar() 333 self.darwin_realtime_period_denom.set(str(VisionEgg.config.VISIONEGG_DARWIN_REALTIME_PERIOD_DENOM)) 334 self.darwin_realtime_computation_denom = Tkinter.StringVar() 335 self.darwin_realtime_computation_denom.set(str(VisionEgg.config.VISIONEGG_DARWIN_REALTIME_COMPUTATION_DENOM)) 336 self.darwin_realtime_constraint_denom = Tkinter.StringVar() 337 self.darwin_realtime_constraint_denom.set(str(VisionEgg.config.VISIONEGG_DARWIN_REALTIME_CONSTRAINT_DENOM)) 338 self.darwin_realtime_preemptible = Tkinter.BooleanVar() 339 self.darwin_realtime_preemptible.set(not VisionEgg.config.VISIONEGG_DARWIN_REALTIME_PREEMPTIBLE) 340 Tkinter.Button(cf,text="Maximum priority options...", 341 command=self.darwin_maxpriority_tune).grid(row=cf_row,column=0) 342 cf_row += 1 343 344 # Sync swap 345 self.sync_swap = Tkinter.BooleanVar() 346 self.sync_swap.set(VisionEgg.config.VISIONEGG_SYNC_SWAP) 347 Tkinter.Checkbutton(cf, 348 text='Attempt vsync', 349 variable=self.sync_swap, 350 relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) 351 cf_row += 1 352 353 # Frameless window 354 self.frameless = Tkinter.BooleanVar() 355 self.frameless.set(VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW) 356 Tkinter.Checkbutton(cf, 357 text='No frame around window', 358 variable=self.frameless, 359 relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) 360 cf_row += 1 361 362 # Hide mouse 363 self.mouse_visible = Tkinter.BooleanVar() 364 self.mouse_visible.set(not VisionEgg.config.VISIONEGG_HIDE_MOUSE) 365 Tkinter.Checkbutton(cf, 366 text='Mouse cursor visible', 367 variable=self.mouse_visible, 368 relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) 369 cf_row += 1 370 371 # Stereo 372 self.stereo = Tkinter.BooleanVar() 373 self.stereo.set(VisionEgg.config.VISIONEGG_REQUEST_STEREO) 374 Tkinter.Checkbutton(cf, 375 text='Stereo', 376 variable=self.stereo, 377 relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) 378 cf_row += 1 379 380 if sys.platform == 'darwin': 381 if sys.version == '2.2 (#11, Jan 6 2002, 01:00:42) \n[GCC 2.95.2 19991024 (release)]': 382 if Tkinter.TkVersion == 8.4: 383 # The Tk in Bob Ippolito's kitchensink distro had 384 # a bug in Checkbutton 385 Tkinter.Label(cf,text="If you want to check any buttons\n(Mac OS X Tk 8.4a4 bug workaround):").grid(row=cf_row,column=0) 386 cf_row += 1 387 Tkinter.Button(cf,text="PRESS ME FIRST").grid(row=cf_row,column=0) 388 cf_row += 1 389 390 ################## end cf ############################## 391 392 ################## begin entry_frame ################### 393 394 entry_frame = Tkinter.Frame(self) 395 entry_frame.grid(row=row,column=1,padx=10,sticky="n") 396 row += 1 397 ef_row = 0 398 399 # frame rate 400 Tkinter.Label(entry_frame,text="What will your monitor refresh's rate be (Hz):").grid(row=ef_row,column=0,sticky=Tkinter.E) 401 self.frame_rate = Tkinter.StringVar() 402 self.frame_rate.set("%s"%str(VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ)) 403 Tkinter.Entry(entry_frame,textvariable=self.frame_rate).grid(row=ef_row,column=1,sticky=Tkinter.W) 404 ef_row += 1 405 406 # width 407 Tkinter.Label(entry_frame,text="Window width (pixels):").grid(row=ef_row,column=0,sticky=Tkinter.E) 408 self.width = Tkinter.StringVar() 409 self.width.set("%s"%str(VisionEgg.config.VISIONEGG_SCREEN_W)) 410 Tkinter.Entry(entry_frame,textvariable=self.width).grid(row=ef_row,column=1,sticky=Tkinter.W) 411 ef_row += 1 412 413 # height 414 Tkinter.Label(entry_frame,text="Window height (pixels):").grid(row=ef_row,column=0,sticky=Tkinter.E) 415 self.height = Tkinter.StringVar() 416 self.height.set("%s"%str(VisionEgg.config.VISIONEGG_SCREEN_H)) 417 Tkinter.Entry(entry_frame,textvariable=self.height).grid(row=ef_row,column=1,sticky=Tkinter.W) 418 ef_row += 1 419 420 # color depth 421 Tkinter.Label(entry_frame,text="Requested total color depth (bits per pixel):").grid(row=ef_row,column=0,sticky=Tkinter.E) 422 self.color_depth = Tkinter.StringVar() 423 self.color_depth.set(str(VisionEgg.config.VISIONEGG_PREFERRED_BPP)) 424 Tkinter.Entry(entry_frame,textvariable=self.color_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) 425 ef_row += 1 426 427 # red depth 428 Tkinter.Label(entry_frame,text="Requested red bits per pixel:").grid(row=ef_row,column=0,sticky=Tkinter.E) 429 self.red_depth = Tkinter.StringVar() 430 self.red_depth.set(str(VisionEgg.config.VISIONEGG_REQUEST_RED_BITS)) 431 Tkinter.Entry(entry_frame,textvariable=self.red_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) 432 ef_row += 1 433 434 # green depth 435 Tkinter.Label(entry_frame,text="Requested green bits per pixel:").grid(row=ef_row,column=0,sticky=Tkinter.E) 436 self.green_depth = Tkinter.StringVar() 437 self.green_depth.set(str(VisionEgg.config.VISIONEGG_REQUEST_GREEN_BITS)) 438 Tkinter.Entry(entry_frame,textvariable=self.green_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) 439 ef_row += 1 440 441 # blue depth 442 Tkinter.Label(entry_frame,text="Requested blue bits per pixel:").grid(row=ef_row,column=0,sticky=Tkinter.E) 443 self.blue_depth = Tkinter.StringVar() 444 self.blue_depth.set(str(VisionEgg.config.VISIONEGG_REQUEST_BLUE_BITS)) 445 Tkinter.Entry(entry_frame,textvariable=self.blue_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) 446 ef_row += 1 447 448 # alpha depth 449 Tkinter.Label(entry_frame,text="Requested alpha bits per pixel:").grid(row=ef_row,column=0,sticky=Tkinter.E) 450 self.alpha_depth = Tkinter.StringVar() 451 self.alpha_depth.set(str(VisionEgg.config.VISIONEGG_REQUEST_ALPHA_BITS)) 452 Tkinter.Entry(entry_frame,textvariable=self.alpha_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) 453 ef_row += 1 454 455 ################## end entry_frame ################### 456 457 ################## gamma_frame ################### 458 459 # gamma stuff 460 row += 1 461 gamma_frame = Tkinter.Frame(self) 462 gamma_frame.grid(row=row,columnspan=2,sticky="we") 463 self.gamma_source = Tkinter.StringVar() 464 self.gamma_source.set(str(VisionEgg.config.VISIONEGG_GAMMA_SOURCE).lower()) # can be 'none', 'invert', or 'file' 465 Tkinter.Label(gamma_frame, 466 text="Gamma:").grid(row=0,column=0) 467 Tkinter.Radiobutton(gamma_frame, 468 text="Native", 469 value="none", 470 variable = self.gamma_source).grid(row=0,column=1,padx=1) 471 Tkinter.Radiobutton(gamma_frame, 472 text="Quick", 473 value="invert", 474 variable = self.gamma_source).grid(row=0,column=2) 475 Tkinter.Label(gamma_frame, 476 text="R:").grid(row=0,column=3) 477 self.gamma_invert_red = Tkinter.DoubleVar() 478 self.gamma_invert_red.set( VisionEgg.config.VISIONEGG_GAMMA_INVERT_RED ) 479 Tkinter.Entry(gamma_frame, 480 textvariable=self.gamma_invert_red, 481 width=3).grid(row=0,column=4) 482 Tkinter.Label(gamma_frame, 483 text="G:").grid(row=0,column=5) 484 self.gamma_invert_green = Tkinter.DoubleVar() 485 self.gamma_invert_green.set( VisionEgg.config.VISIONEGG_GAMMA_INVERT_GREEN ) 486 Tkinter.Entry(gamma_frame, 487 textvariable=self.gamma_invert_green, 488 width=3).grid(row=0,column=6) 489 Tkinter.Label(gamma_frame, 490 text="B:").grid(row=0,column=7) 491 self.gamma_invert_blue = Tkinter.DoubleVar() 492 self.gamma_invert_blue.set( VisionEgg.config.VISIONEGG_GAMMA_INVERT_BLUE ) 493 Tkinter.Entry(gamma_frame, 494 textvariable=self.gamma_invert_blue, 495 width=3).grid(row=0,column=8) 496 Tkinter.Radiobutton(gamma_frame, 497 text="Custom:", 498 value="file", 499 variable = self.gamma_source).grid(row=0,column=9) 500 self.gamma_file = Tkinter.StringVar() 501 if os.path.isfile(VisionEgg.config.VISIONEGG_GAMMA_FILE): 502 self.gamma_file.set( VisionEgg.config.VISIONEGG_GAMMA_FILE ) 503 else: 504 self.gamma_file.set("") 505 Tkinter.Entry(gamma_frame, 506 textvariable=self.gamma_file, 507 width=15).grid(row=0,column=10) 508 Tkinter.Button(gamma_frame, 509 command=self.set_gamma_file, 510 text="Set...").grid(row=0,column=11) 511 512 ################## end gamma_frame ################### 513 514 row += 1 515 bf = Tkinter.Frame(self) 516 bf.grid(row=row,columnspan=2,sticky=Tkinter.W+Tkinter.E) 517 518 # Save settings to config file 519 b = Tkinter.Button(bf,text="Save current settings to config file",command=self.save) 520 b.grid(row=0,column=0,padx=20) 521 b.bind('<Return>',self.start) 522 523 # Start button 524 b2 = Tkinter.Button(bf,text="ok",command=self.start) 525 b2.grid(row=0,column=1,padx=20) 526 b2.focus_force() 527 b2.bind('<Return>',self.start) 528 529 # Raise our application on darwin 530 if sys.platform == 'darwin': 531 try: 532 # from Jack Jansen email 20 April 2003 533 # WMAvailable() returns true if you can use the window 534 # manager, and as a side #effect it raises the 535 # application to the foreground. 536 import MacOS 537 if not MacOS.WMAvailable(): 538 raise "Cannot reach the window manager" 539 except: 540 pass
541
542 - def set_gamma_file(self,dummy_arg=None):
543 filename = tkFileDialog.askopenfilename( 544 parent=self, 545 defaultextension=".ve_gamma", 546 filetypes=[('Configuration file','*.ve_gamma')], 547 initialdir=VisionEgg.config.VISIONEGG_USER_DIR) 548 if not filename: 549 return 550 self.gamma_file.set(filename)
551
552 - def format_string(self,in_str):
553 # This probably a slow way to do things, but it works! 554 min_line_length = 60 555 in_list = in_str.split() 556 out_str = "" 557 cur_line = "" 558 for word in in_list: 559 cur_line = cur_line + word + " " 560 if len(cur_line) > min_line_length: 561 out_str = out_str + cur_line[:-1] + "\n" 562 cur_line = " " 563 out_str = out_str + cur_line + "\n" 564 return out_str
565
566 - def darwin_maxpriority_tune(self):
567 class DarwinFineTuneDialog(ToplevelDialog): 568 def __init__(self,parent,**cnf): 569 # Bugs in Tk 8.4a4 for Darwin seem to prevent use of "grid" in this dialog 570 ToplevelDialog.__init__(self,**cnf) 571 self.title("Fine tune maximum priority") 572 f = Tkinter.Frame(self) 573 f.pack(expand=1,fill=Tkinter.BOTH,ipadx=2,ipady=2) 574 row = 0 575 Tkinter.Label(f, 576 text=parent.format_string( 577 578 """This information is used by the Vision Egg when 579 in "maximum priority" mode. These values fine 580 tune this behavior on the Mac OS X ("darwin") 581 platform. For conventional priority, the valid 582 values range from -20 (highest priority) to 20 583 (worst priority). In the realtime settings, the 584 numerical values represent a fraction of the total 585 cycles available on the computer. For more 586 information, please refer to 587 http://developer.apple.com/ techpubs/ macosx/ 588 Darwin/ General/ KernelProgramming/ scheduler/ 589 Using_Mach__pplications.html Hint: Try the 590 realtime task method with the framerate as the 591 denominator. """ 592 593 )).grid(row=row,columnspan=4,column=0) 594 row = 1 595 # Tkinter.Checkbutton(f,text="Use conventional priority",variable=parent.darwin_conventional).grid(row=row,column=0,columnspan=4) 596 row = 2 597 # Tkinter.Label(f,text="Conventional priority settings").grid(row=row,column=0,columnspan=2) 598 Tkinter.Radiobutton(f, 599 text="Conventional priority method", 600 variable=parent.darwin_conventional, 601 value=1).grid(row=row,column=0,columnspan=2) 602 row += 1 603 Tkinter.Label(f,text="Priority").grid(row=row,column=0,sticky=Tkinter.E) 604 Tkinter.Entry(f,textvariable=parent.darwin_priority).grid(row=row,column=1,sticky=Tkinter.W) 605 row = 2 606 Tkinter.Radiobutton(f, 607 text="Realtime task method", 608 variable=parent.darwin_conventional, 609 value=0).grid(row=row,column=2,columnspan=2) 610 # Tkinter.Label(f,text="Realtime settings").grid(row=row,column=2,columnspan=2) 611 row += 1 612 Tkinter.Label(f,text="Realtime period denominator").grid(row=row,column=2,sticky=Tkinter.E) 613 Tkinter.Entry(f,textvariable=parent.darwin_realtime_period_denom).grid(row=row,column=3,sticky=Tkinter.W) 614 row += 1 615 Tkinter.Label(f,text="Realtime computation denominator").grid(row=row,column=2,sticky=Tkinter.E) 616 Tkinter.Entry(f,textvariable=parent.darwin_realtime_computation_denom).grid(row=row,column=3,sticky=Tkinter.W) 617 row += 1 618 Tkinter.Label(f,text="Realtime constraint denominator").grid(row=row,column=2,sticky=Tkinter.E) 619 Tkinter.Entry(f,textvariable=parent.darwin_realtime_constraint_denom).grid(row=row,column=3,sticky=Tkinter.W) 620 row += 1 621 Tkinter.Checkbutton(f,text="Do not preempt",variable=parent.darwin_realtime_preemptible).grid(row=row,column=2,columnspan=2) 622 row += 1 623 Tkinter.Button(f, text="ok",command=self.ok).grid(row=row,column=0,columnspan=4) 624 self.wait_window(self)
625 626 def ok(self): 627 self.destroy()
628 629 DarwinFineTuneDialog(parent=self) 630
631 - def _set_config_values(self):
632 VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ = float(self.frame_rate.get()) 633 VisionEgg.config.VISIONEGG_FULLSCREEN = self.fullscreen.get() 634 VisionEgg.config.VISIONEGG_GAMMA_SOURCE = self.gamma_source.get() 635 VisionEgg.config.VISIONEGG_GAMMA_INVERT_RED = self.gamma_invert_red.get() 636 VisionEgg.config.VISIONEGG_GAMMA_INVERT_GREEN = self.gamma_invert_green.get() 637 VisionEgg.config.VISIONEGG_GAMMA_INVERT_BLUE = self.gamma_invert_blue.get() 638 VisionEgg.config.VISIONEGG_GAMMA_FILE = self.gamma_file.get() 639 VisionEgg.config.VISIONEGG_MAXPRIORITY = self.maxpriority.get() 640 VisionEgg.config.VISIONEGG_SYNC_SWAP = self.sync_swap.get() 641 VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW = self.frameless.get() 642 VisionEgg.config.VISIONEGG_HIDE_MOUSE = not self.mouse_visible.get() 643 VisionEgg.config.VISIONEGG_REQUEST_STEREO = self.stereo.get() 644 VisionEgg.config.VISIONEGG_SCREEN_W = int(self.width.get()) 645 VisionEgg.config.VISIONEGG_SCREEN_H = int(self.height.get()) 646 VisionEgg.config.VISIONEGG_PREFERRED_BPP = int(self.color_depth.get()) 647 VisionEgg.config.VISIONEGG_REQUEST_RED_BITS = int(self.red_depth.get()) 648 VisionEgg.config.VISIONEGG_REQUEST_GREEN_BITS = int(self.green_depth.get()) 649 VisionEgg.config.VISIONEGG_REQUEST_BLUE_BITS = int(self.blue_depth.get()) 650 VisionEgg.config.VISIONEGG_REQUEST_ALPHA_BITS = int(self.alpha_depth.get()) 651 652 if sys.platform=='darwin': 653 # Only used on darwin platform 654 VisionEgg.config.VISIONEGG_DARWIN_MAXPRIORITY_CONVENTIONAL_NOT_REALTIME = self.darwin_conventional.get() 655 VisionEgg.config.VISIONEGG_DARWIN_CONVENTIONAL_PRIORITY = int(self.darwin_priority.get()) 656 VisionEgg.config.VISIONEGG_DARWIN_REALTIME_PERIOD_DENOM = int(self.darwin_realtime_period_denom.get()) 657 VisionEgg.config.VISIONEGG_DARWIN_REALTIME_COMPUTATION_DENOM = int(self.darwin_realtime_computation_denom.get()) 658 VisionEgg.config.VISIONEGG_DARWIN_REALTIME_CONSTRAINT_DENOM = int(self.darwin_realtime_constraint_denom.get()) 659 VisionEgg.config.VISIONEGG_DARWIN_REALTIME_PREEMPTIBLE = int(not self.darwin_realtime_preemptible.get()) 660 661 if self.show_synclync_option: 662 VisionEgg.config.SYNCLYNC_PRESENT = self.synclync_present.get()
663
664 - def save(self,dummy_arg=None):
665 self._set_config_values() 666 try: 667 VisionEgg.Configuration.save_settings() 668 except IOError, x: 669 try: 670 import tkMessageBox 671 if str(x).find('Permission denied') != -1: 672 tkMessageBox.showerror(title="Permission denied", 673 message="Permission denied when trying to save settings.\n\nTry making a copy of the config file in the Vision Egg user directory %s and making sure you have write permission."%(os.path.abspath(VisionEgg.config.VISIONEGG_USER_DIR),)) 674 except: 675 raise x
676
677 - def start(self,dummy_arg=None):
678 self.clicked_ok = 1 679 self._set_config_values() 680 for child in self.children.values(): 681 child.destroy() 682 Tkinter.Tk.destroy(self.master) # OK, now close myself
683
684 -class InfoFrame(Tkinter.Frame):
685 - def __init__(self,master=None,**cnf):
686 VisionEgg.config._Tkinter_used = True 687 Tkinter.Frame.__init__(self,master,**cnf) 688 689 Tkinter.Label(self,text="Vision Egg information:").pack() 690 self.sub_frame = Tkinter.Frame(self,relief=Tkinter.GROOVE) 691 self.sub_frame.pack() 692 self.update()
693
694 - def update(self):
695 for child in self.sub_frame.children.values(): 696 child.destroy() 697 if VisionEgg.config.VISIONEGG_FULLSCREEN: 698 Tkinter.Label(self.sub_frame,text="fullscreen mode").pack() 699 else: 700 Tkinter.Label(self.sub_frame,text="window mode").pack()
701 ## if VisionEgg.config.VISIONEGG_TEXTURE_COMPRESSION: 702 ## Tkinter.Label(self.sub_frame,text="Texture compression on").pack() 703 ## else: 704 ## Tkinter.Label(self.sub_frame,text="Texture compression off").pack() 705 706 #Tkinter.Button(self.sub_frame,text="Update information",command=self.update).pack() 707
708 -class ToplevelDialog(Tkinter.Toplevel):
709 """Base class for a dialog that runs on the top level."""
710 - def __init__(self,**kw):
711 VisionEgg.config._Tkinter_used = True 712 Tkinter.Toplevel.__init__(self,**kw) 713 self.transient(self)
714
715 - def destroy(self):
716 Tkinter.Toplevel.destroy(self)
717
718 -class GetKeypressDialog(ToplevelDialog):
719 """Open a dialog box which returns when a valid key is pressed. 720 721 Arguments are: 722 master - a Tkinter widget (defaults to None) 723 title - a string for the title bar of the widget 724 text - a string to display as the text in the body of the dialog 725 key_list - a list of acceptable keys, e.g. ['q','1','2','<Return>'] 726 727 The following example will print whatever character was pressed: 728 d = GetKeypressDialog(key_list=['q','1','2','<Return>','<Escape>']) 729 print d.result 730 731 The implementation is somewhat obscure because a new Tk/Tcl 732 interpreter may be created if this Dialog is called with no 733 master widget."""
734 - def __init__(self, 735 title="Press a key", 736 text="Press a key", 737 key_list=[], 738 **kw):
739 740 ToplevelDialog.__init__(self,**kw) 741 self.title(title) 742 self.result = None 743 744 # The dialog box body 745 Tkinter.Label(self.frame, text=text).pack() 746 747 for key in key_list: 748 self.bind(key,self.keypress) 749 self.wait_window(self)
750
751 - def keypress(self,tkinter_event):
752 self.result = tkinter_event.keysym 753 self.destroy()
754

visionegg-1.2.1/doc/reference/html/VisionEgg.GUI.AppWindow-class.html0000644000076500000240000001403011224565530024556 0ustar astrawstaff VisionEgg.GUI.AppWindow
Package VisionEgg :: Module GUI :: Class AppWindow
[frames] | no frames]

Class AppWindow

source code

??-106 --+
         |
        AppWindow

A GUI Window that can be subclassed for a main application window



Instance Methods
 
__init__(self, master=None, idle_func=lambda: None, **cnf) source code
 
idle(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.GUI.GetKeypressDialog-class.html0000644000076500000240000002130411224565530026235 0ustar astrawstaff VisionEgg.GUI.GetKeypressDialog
Package VisionEgg :: Module GUI :: Class GetKeypressDialog
[frames] | no frames]

Class GetKeypressDialog

source code

    ??-109 --+    
             |    
ToplevelDialog --+
                 |
                GetKeypressDialog

Open a dialog box which returns when a valid key is pressed.

Arguments are:
master - a Tkinter widget (defaults to None)
title - a string for the title bar of the widget
text - a string to display as the text in the body of the dialog
key_list - a list of acceptable keys, e.g. ['q','1','2','<Return>']

The following example will print whatever character was pressed:
d = GetKeypressDialog(key_list=['q','1','2','<Return>','<Escape>'])
print d.result

The implementation is somewhat obscure because a new Tk/Tcl
interpreter may be created if this Dialog is called with no
master widget.



Instance Methods
 
__init__(self, title="Press a key", text="Press a key", key_list=[], **kw) source code
 
keypress(self, tkinter_event) source code

Inherited from ToplevelDialog: destroy

Method Details

__init__(self, title="Press a key", text="Press a key", key_list=[], **kw)
(Constructor)

source code 
Overrides: ToplevelDialog.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.GUI.GraphicsConfigurationWindow-class.html0000644000076500000240000002177211224565530030341 0ustar astrawstaff VisionEgg.GUI.GraphicsConfigurationWindow
Package VisionEgg :: Module GUI :: Class GraphicsConfigurationWindow
[frames] | no frames]

Class GraphicsConfigurationWindow

source code

??-105 --+
         |
        GraphicsConfigurationWindow

Graphics Configuration Window



Instance Methods
 
__init__(self, master=None, **cnf) source code
 
set_gamma_file(self, dummy_arg=None) source code
 
format_string(self, in_str) source code
 
darwin_maxpriority_tune(self) source code
 
save(self, dummy_arg=None) source code
 
start(self, dummy_arg=None) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.GUI.InfoFrame-class.html0000644000076500000240000001347611224565530024531 0ustar astrawstaff VisionEgg.GUI.InfoFrame
Package VisionEgg :: Module GUI :: Class InfoFrame
[frames] | no frames]

Class InfoFrame

source code

??-107 --+
         |
        InfoFrame

Instance Methods
 
__init__(self, master=None, **cnf) source code
 
update(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.GUI.ProgressBar-class.html0000644000076500000240000001775611224565530025121 0ustar astrawstaff VisionEgg.GUI.ProgressBar
Package VisionEgg :: Module GUI :: Class ProgressBar
[frames] | no frames]

Class ProgressBar

source code

??-110 --+
         |
        ProgressBar

Instance Methods
 
__init__(self, master=None, orientation="horizontal", min=0, max=100, width=100, height=18, doLabel=1, fillColor="LightSteelBlue1", background="gray", labelColor="black", labelFont="Helvetica", labelText="", labelFormat="%d%%", value=50, **cnf) source code
 
updateProgress(self, newValue, newMax=None) source code
 
update(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.GUI.ToplevelDialog-class.html0000644000076500000240000001355111224565530025567 0ustar astrawstaff VisionEgg.GUI.ToplevelDialog
Package VisionEgg :: Module GUI :: Class ToplevelDialog
[frames] | no frames]

Class ToplevelDialog

source code

??-109 --+
         |
        ToplevelDialog

Base class for a dialog that runs on the top level.



Instance Methods
 
__init__(self, **kw) source code
 
destroy(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.MoreStimuli-module.html0000644000076500000240000001301211224565530024653 0ustar astrawstaff VisionEgg.MoreStimuli
Package VisionEgg :: Module MoreStimuli
[frames] | no frames]

Module MoreStimuli

source code


Assorted stimuli.



Classes
  Target2D
Rectanglular stimulus.
  Rectangle3D
Solid color rectangle positioned explicitly by four vertices.
  Arrow
Arrow stimulus.
  FilledCircle
A circular stimulus, typically used as a fixation point.
visionegg-1.2.1/doc/reference/html/VisionEgg.MoreStimuli-pysrc.html0000644000076500000240000063162711224565530024550 0ustar astrawstaff VisionEgg.MoreStimuli
Package VisionEgg :: Module MoreStimuli
[frames] | no frames]

Source Code for Module VisionEgg.MoreStimuli

  1  # The Vision Egg: MoreStimuli 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  #           (C) 2005 by Hertie Institute for Clinical Brain Research, 
  5  #            Department of Cognitive Neurology, University of Tuebingen 
  6  #           (C) 2005,2008 California Institute of Technology 
  7  #           (C) 2006 Peter Jurica and Gijs Plomp 
  8  # 
  9  # URL: http://www.visionegg.org 
 10  # 
 11  # Distributed under the terms of the GNU Lesser General Public License 
 12  # (LGPL). See LICENSE.TXT that came with this file. 
 13   
 14  """ 
 15  Assorted stimuli. 
 16   
 17  """ 
 18   
 19  #################################################################### 
 20  # 
 21  #        Import all the necessary packages 
 22  # 
 23  #################################################################### 
 24   
 25  import logging 
 26   
 27  import VisionEgg 
 28  import VisionEgg.Core 
 29  import VisionEgg.ParameterTypes as ve_types 
 30   
 31  import numpy.oldnumeric as Numeric 
 32   
 33  import math 
 34   
 35  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
 36   
37 -class Target2D(VisionEgg.Core.Stimulus):
38 """Rectanglular stimulus. 39 40 Parameters 41 ========== 42 anchor -- specifies how position parameter is interpreted (String) 43 Default: center 44 anti_aliasing -- (Boolean) 45 Default: True 46 center -- DEPRECATED: don't use (Sequence2 of Real) 47 Default: (determined at runtime) 48 color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 49 Default: (1.0, 1.0, 1.0) 50 on -- draw stimulus? (Boolean) (Boolean) 51 Default: True 52 orientation -- (Real) 53 Default: 0.0 54 position -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) 55 Default: (320.0, 240.0) 56 size -- units: eye coordinates (Sequence2 of Real) 57 Default: (64.0, 16.0) 58 """ 59 60 parameters_and_defaults = { 61 'on':(True, 62 ve_types.Boolean, 63 "draw stimulus? (Boolean)"), 64 'color':((1.0,1.0,1.0), 65 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 66 ve_types.Sequence4(ve_types.Real))), 67 'anti_aliasing':(True, 68 ve_types.Boolean), 69 'orientation':(0.0, 70 ve_types.Real), 71 'position' : ( ( 320.0, 240.0 ), 72 ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), 73 ve_types.Sequence3(ve_types.Real), 74 ve_types.Sequence4(ve_types.Real)), 75 "units: eye coordinates"), 76 'anchor' : ('center', 77 ve_types.String, 78 "specifies how position parameter is interpreted"), 79 'size':((64.0,16.0), 80 ve_types.Sequence2(ve_types.Real), 81 "units: eye coordinates"), 82 'center' : (None, 83 ve_types.Sequence2(ve_types.Real), 84 "DEPRECATED: don't use"), 85 } 86 87 __slots__ = ( 88 '_gave_alpha_warning', 89 ) 90
91 - def __init__(self,**kw):
92 VisionEgg.Core.Stimulus.__init__(self,**kw) 93 self._gave_alpha_warning = 0
94
95 - def draw(self):
96 p = self.parameters # shorthand 97 if p.center is not None: 98 if not hasattr(VisionEgg.config,"_GAVE_CENTER_DEPRECATION"): 99 logger = logging.getLogger('VisionEgg.MoreStimuli') 100 logger.warning("Specifying Target2D by deprecated " 101 "'center' parameter deprecated. Use " 102 "'position' parameter instead. (Allows " 103 "use of 'anchor' parameter to set to " 104 "other values.)") 105 VisionEgg.config._GAVE_CENTER_DEPRECATION = 1 106 p.anchor = 'center' 107 p.position = p.center[0], p.center[1] # copy values (don't copy ref to tuple) 108 if p.on: 109 # calculate center 110 center = VisionEgg._get_center(p.position,p.anchor,p.size) 111 gl.glMatrixMode(gl.GL_MODELVIEW) 112 gl.glPushMatrix() 113 gl.glTranslate(center[0],center[1],0.0) 114 gl.glRotate(p.orientation,0.0,0.0,1.0) 115 116 if len(p.color)==3: 117 gl.glColor3f(*p.color) 118 elif len(p.color)==4: 119 gl.glColor4f(*p.color) 120 gl.glDisable(gl.GL_DEPTH_TEST) 121 gl.glDisable(gl.GL_TEXTURE_2D) 122 gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) 123 gl.glEnable(gl.GL_BLEND) 124 125 w = p.size[0]/2.0 126 h = p.size[1]/2.0 127 128 gl.glBegin(gl.GL_QUADS) 129 gl.glVertex3f(-w,-h, 0.0) 130 gl.glVertex3f( w,-h, 0.0) 131 gl.glVertex3f( w, h, 0.0) 132 gl.glVertex3f(-w, h, 0.0) 133 gl.glEnd() # GL_QUADS 134 135 if p.anti_aliasing: 136 if not self._gave_alpha_warning: 137 if len(p.color) > 3 and p.color[3] != 1.0: 138 logger = logging.getLogger('VisionEgg.MoreStimuli') 139 logger.warning("The parameter anti_aliasing is " 140 "set to true in the Target2D " 141 "stimulus class, but the color " 142 "parameter specifies an alpha " 143 "value other than 1.0. To " 144 "acheive anti-aliasing, ensure " 145 "that the alpha value for the " 146 "color parameter is 1.0.") 147 self._gave_alpha_warning = 1 148 149 # We've already drawn a filled polygon (aliased), now 150 # redraw the outline of the polygon (with 151 # anti-aliasing). (Using GL_POLYGON_SMOOTH results in 152 # artifactual lines where triangles were joined to 153 # create quad, at least on some OpenGL 154 # implementations.) 155 156 # Calculate coverage value for each pixel of outline 157 # and store as alpha 158 gl.glEnable(gl.GL_LINE_SMOOTH) 159 # Now specify how to use the alpha value 160 gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) 161 gl.glEnable(gl.GL_BLEND) 162 163 # Draw a second polygon in line mode, so the edges are anti-aliased 164 gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_LINE) 165 gl.glBegin(gl.GL_QUADS) 166 gl.glVertex3f(-w,-h, 0.0); 167 gl.glVertex3f( w,-h, 0.0); 168 gl.glVertex3f( w, h, 0.0); 169 gl.glVertex3f(-w, h, 0.0); 170 gl.glEnd() # GL_QUADS 171 172 # Set the polygon mode back to fill mode 173 gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_FILL) 174 gl.glDisable(gl.GL_LINE_SMOOTH) 175 gl.glPopMatrix()
176
177 -class Rectangle3D(VisionEgg.Core.Stimulus):
178 """Solid color rectangle positioned explicitly by four vertices. 179 180 Parameters 181 ========== 182 color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 183 Default: (1.0, 1.0, 1.0, 1.0) 184 on -- (Boolean) 185 Default: True 186 vertex1 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real)) 187 Default: (-10.0, 0.0, -10.0) 188 vertex2 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real)) 189 Default: (-10.0, 0.0, 10.0) 190 vertex3 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real)) 191 Default: (10.0, 0.0, 10.0) 192 vertex4 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real)) 193 Default: (10.0, 0.0, -10.0) 194 """ 195 196 parameters_and_defaults = { 197 'on':(True, 198 ve_types.Boolean), 199 'color':((1.0,1.0,1.0,1.0), 200 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 201 ve_types.Sequence4(ve_types.Real))), 202 'vertex1':(( -10.0, 0.0, -10.0), 203 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 204 ve_types.Sequence4(ve_types.Real)), 205 "units: eye coordinates"), 206 'vertex2':(( -10.0, 0.0, 10.0), 207 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 208 ve_types.Sequence4(ve_types.Real)), 209 "units: eye coordinates"), 210 'vertex3':(( 10.0, 0.0, 10.0), 211 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 212 ve_types.Sequence4(ve_types.Real)), 213 "units: eye coordinates"), 214 'vertex4':(( 10.0, 0.0, -10.0), 215 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 216 ve_types.Sequence4(ve_types.Real)), 217 "units: eye coordinates"), 218 } 219
220 - def __init__(self,**kw):
222
223 - def draw(self):
224 p = self.parameters # shorthand 225 if p.on: 226 if len(p.color)==3: 227 gl.glColor3f(*p.color) 228 elif len(p.color)==4: 229 gl.glColor4f(*p.color) 230 231 gl.glDisable(gl.GL_TEXTURE_2D) 232 gl.glDisable(gl.GL_DEPTH_TEST) 233 gl.glDisable(gl.GL_BLEND) 234 235 gl.glBegin(gl.GL_QUADS) 236 gl.glVertex(*p.vertex1) 237 gl.glVertex(*p.vertex2) 238 gl.glVertex(*p.vertex3) 239 gl.glVertex(*p.vertex4) 240 gl.glEnd() # GL_QUADS 241 242 gl.glDisable(gl.GL_TEXTURE_2D) 243 gl.glDisable(gl.GL_BLEND) 244 245 gl.glBegin(gl.GL_QUADS) 246 gl.glVertex(*p.vertex1) 247 gl.glVertex(*p.vertex2) 248 gl.glVertex(*p.vertex3) 249 gl.glVertex(*p.vertex4) 250 gl.glEnd() # GL_QUADS
251
252 -class Arrow(VisionEgg.Core.Stimulus):
253 """Arrow stimulus. 254 255 Parameters 256 ========== 257 anchor -- (String) 258 Default: center 259 anti_aliasing -- (Boolean) 260 Default: True 261 color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 262 Default: (1.0, 1.0, 1.0) 263 on -- (Boolean) 264 Default: True 265 orientation -- (Real) 266 Default: 0.0 267 position -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) 268 Default: (320.0, 240.0) 269 size -- (Sequence2 of Real) 270 Default: (64.0, 16.0) 271 """ 272 273 parameters_and_defaults = { 274 'on':(True, 275 ve_types.Boolean), 276 'color':((1.0,1.0,1.0), 277 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 278 ve_types.Sequence4(ve_types.Real))), 279 'anti_aliasing':(True, 280 ve_types.Boolean), 281 'orientation':(0.0, # 0.0 degrees = right, 90.0 degrees = up 282 ve_types.Real), 283 'position' : ( ( 320.0, 240.0 ), # In eye coordinates 284 ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), 285 ve_types.Sequence3(ve_types.Real), 286 ve_types.Sequence4(ve_types.Real)), 287 "units: eye coordinates"), 288 'anchor' : ('center', 289 ve_types.String), 290 'size':((64.0,16.0), # In eye coordinates 291 ve_types.Sequence2(ve_types.Real)), 292 } 293 294 __slots__ = VisionEgg.Core.Stimulus.__slots__ + ( 295 '_gave_alpha_warning', 296 ) 297
298 - def __init__(self,**kw):
299 VisionEgg.Core.Stimulus.__init__(self,**kw) 300 self._gave_alpha_warning = 0
301
302 - def draw(self):
303 p = self.parameters # Shorthand 304 if p.on: 305 # Calculate center 306 center = VisionEgg._get_center(p.position,p.anchor,p.size) 307 gl.glMatrixMode(gl.GL_MODELVIEW) 308 gl.glPushMatrix() 309 gl.glTranslate(center[0],center[1],0.0) 310 gl.glRotate(-p.orientation,0.0,0.0,1.0) 311 312 if len(p.color)==3: 313 gl.glColor3f(*p.color) 314 elif len(p.color)==4: 315 gl.glColor4f(*p.color) 316 gl.glDisable(gl.GL_DEPTH_TEST) 317 gl.glDisable(gl.GL_TEXTURE_2D) 318 gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) 319 gl.glEnable(gl.GL_BLEND) 320 321 w = p.size[0]/2.0 322 h = p.size[1]/2.0 323 324 gl.glBegin(gl.GL_QUADS) # Draw Rectangle 325 gl.glVertex3f( 0.25*w, h, 0.0) 326 gl.glVertex3f(-w, h, 0.0) 327 gl.glVertex3f(-w,-h, 0.0) 328 gl.glVertex3f( 0.25*w, -h, 0.0) 329 gl.glEnd() # GL_QUADS 330 331 gl.glBegin(gl.GL_TRIANGLES) # Draw Triangle 332 gl.glVertex3f( 1.00*w, 0.0*h, 0.0) # Top 333 gl.glVertex3f( 0.25*w,-3.0*h, 0.0) 334 gl.glVertex3f( 0.25*w, 3.0*h, 0.0) 335 gl.glEnd() # GL_QUADS 336 337 if p.anti_aliasing: 338 if not self._gave_alpha_warning: 339 if len(p.color) > 3 and p.color[3] != 1.0: 340 logger = logging.getLogger('VisionEgg.Arrow') 341 logger.warning("The parameter anti_aliasing is " 342 "set to true in the Arrow " 343 "stimulus class, but the color " 344 "parameter specifies an alpha " 345 "value other than 1.0. To " 346 "acheive anti-aliasing, ensure " 347 "that the alpha value for the " 348 "color parameter is 1.0.") 349 self._gave_alpha_warning = 1 350 351 # We've already drawn a filled polygon (aliased), now redraw 352 # the outline of the polygon (with anti-aliasing). (Using 353 # GL_POLYGON_SMOOTH results in artifactual lines where 354 # triangles were joined to create quad, at least on some OpenGL 355 # implementations.) 356 357 # Calculate coverage value for each pixel of outline 358 # and store as alpha 359 gl.glEnable(gl.GL_LINE_SMOOTH) 360 # Now specify how to use the alpha value 361 gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) 362 gl.glEnable(gl.GL_BLEND) 363 364 # Draw a second polygon in line mode, so the edges are anti-aliased 365 gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_LINE) 366 gl.glBegin(gl.GL_QUADS) 367 368 gl.glVertex3f( 0.25*w, h, 0.0) # Draw Rectangle 369 gl.glVertex3f(-w, h, 0.0) 370 gl.glVertex3f(-w,-h, 0.0) 371 gl.glVertex3f( 0.25*w, -h, 0.0) 372 gl.glVertex3f( 1.00*w, 0.0*h, 0.0) # Draw Triangle 373 gl.glVertex3f( 0.25*w,-3.0*h, 0.0) 374 gl.glVertex3f( 0.25*w, 3.0*h, 0.0) 375 gl.glEnd() # GL_QUADS 376 377 # Set the polygon mode back to fill mode 378 gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_FILL) 379 gl.glDisable(gl.GL_LINE_SMOOTH) 380 gl.glPopMatrix()
381
382 -class FilledCircle(VisionEgg.Core.Stimulus):
383 """ A circular stimulus, typically used as a fixation point. 384 385 (Note, this implementation almost certainly could be made faster 386 using display lists.) 387 388 Parameters 389 ========== 390 anchor -- how position parameter is used (String) 391 Default: center 392 anti_aliasing -- (Boolean) 393 Default: True 394 color -- color (AnyOf(Sequence3 of Real or Sequence4 of Real)) 395 Default: (1.0, 1.0, 1.0) 396 num_triangles -- number of triangles used to draw circle (Integer) 397 Default: 51 398 on -- draw? (Boolean) 399 Default: True 400 position -- position in eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) 401 Default: (320.0, 240.0) 402 radius -- radius in eye coordinates (Real) 403 Default: 2.0 404 """ 405 406 parameters_and_defaults = VisionEgg.ParameterDefinition({ 407 'on':(True, 408 ve_types.Boolean, 409 'draw?'), 410 'color':((1.0,1.0,1.0), 411 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 412 ve_types.Sequence4(ve_types.Real)), 413 'color'), 414 'anti_aliasing':(True, 415 ve_types.Boolean), 416 'position' : ( ( 320.0, 240.0 ), # in eye coordinates 417 ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), 418 ve_types.Sequence3(ve_types.Real), 419 ve_types.Sequence4(ve_types.Real)), 420 'position in eye coordinates'), 421 'anchor' : ('center', 422 ve_types.String, 423 'how position parameter is used'), 424 'radius':(2.0, 425 ve_types.Real, 426 'radius in eye coordinates'), 427 'num_triangles':(51, 428 ve_types.Integer, 429 'number of triangles used to draw circle'), 430 }) 431 __slots__ = VisionEgg.Core.Stimulus.__slots__ + ( 432 '_gave_alpha_warning', 433 ) 434
435 - def __init__(self,**kw):
436 VisionEgg.Core.Stimulus.__init__(self,**kw) 437 self._gave_alpha_warning = 0
438
439 - def draw(self):
440 p = self.parameters # shorthand 441 if p.on: 442 # calculate center 443 center = VisionEgg._get_center(p.position,p.anchor,(p.radius, p.radius)) 444 gl.glDisable(gl.GL_DEPTH_TEST) 445 gl.glDisable(gl.GL_TEXTURE_2D) 446 gl.glDisable(gl.GL_BLEND) 447 448 if len(p.color)==3: 449 gl.glColor3f(*p.color) 450 elif len(p.color)==4: 451 gl.glColor4f(*p.color) 452 453 # Build filled circle from points 454 # gl.glBegin(gl.GL_POINTS) 455 # radius = int(math.ceil(p.radius)) 456 # for i in range(-radius, radius): 457 # for j in range(-radius, radius): 458 # if(i * i + j * j < radius * radius): 459 # gl.glVertex3f(p.position[0] + i, p.position[1] + j, 0.0) 460 # gl.glEnd() # GL_POINTS 461 462 # Build filled circle from triangles (this is typically faster 463 # then the commented code above with the points) 464 gl.glBegin(gl.GL_TRIANGLE_FAN) 465 gl.glVertex3f(p.position[0], p.position[1], 0.0) 466 angles = Numeric.arange(p.num_triangles)/float(p.num_triangles)*2.0*math.pi 467 verts = Numeric.zeros( (p.num_triangles,2), Numeric.Float ) 468 verts[:,0] = p.position[0] + p.radius * Numeric.cos(angles) 469 verts[:,1] = p.position[1] + p.radius * Numeric.sin(angles) 470 for i in range(verts.shape[0]): 471 gl.glVertex2fv(verts[i]) 472 gl.glVertex2fv(verts[0]) 473 474 gl.glEnd() # GL_TRIANGLE_FAN 475 if p.anti_aliasing: 476 if not self._gave_alpha_warning: 477 if len(p.color) > 3 and p.color[3] != 1.0: 478 logger = logging.getLogger('VisionEgg.Arrow') 479 logger.warning("The parameter anti_aliasing is " 480 "set to true in the Arrow " 481 "stimulus class, but the color " 482 "parameter specifies an alpha " 483 "value other than 1.0. To " 484 "acheive anti-aliasing, ensure " 485 "that the alpha value for the " 486 "color parameter is 1.0.") 487 self._gave_alpha_warning = 1 488 489 # We've already drawn a filled polygon (aliased), now redraw 490 # the outline of the polygon (with anti-aliasing). (Using 491 # GL_POLYGON_SMOOTH results in artifactual lines where 492 # triangles were joined to create quad, at least on some OpenGL 493 # implementations.) 494 495 # Calculate coverage value for each pixel of outline 496 # and store as alpha 497 gl.glEnable(gl.GL_LINE_SMOOTH) 498 # Now specify how to use the alpha value 499 gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) 500 gl.glEnable(gl.GL_BLEND) 501 502 # Draw a second polygon in line mode, so the edges are anti-aliased 503 gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_LINE) 504 gl.glBegin(gl.GL_TRIANGLE_FAN) 505 gl.glVertex3f(p.position[0], p.position[1], 0.0) 506 angles = Numeric.arange(p.num_triangles)/float(p.num_triangles)*2.0*math.pi 507 verts = Numeric.zeros( (p.num_triangles,2), Numeric.Float ) 508 verts[:,0] = p.position[0] + p.radius * Numeric.cos(angles) 509 verts[:,1] = p.position[1] + p.radius * Numeric.sin(angles) 510 for i in range(verts.shape[0]): 511 gl.glVertex2fv(verts[i]) 512 gl.glVertex2fv(verts[0]) 513 gl.glEnd() # GL_TRIANGLE_FAN 514 515 # Set the polygon mode back to fill mode 516 gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_FILL) 517 gl.glDisable(gl.GL_LINE_SMOOTH)
518

visionegg-1.2.1/doc/reference/html/VisionEgg.MoreStimuli.Arrow-class.html0000644000076500000240000003452511224565530025600 0ustar astrawstaff VisionEgg.MoreStimuli.Arrow
Package VisionEgg :: Module MoreStimuli :: Class Arrow
[frames] | no frames]

Class Arrow

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         Arrow

Arrow stimulus.

Parameters
==========
anchor        -- (String)
                 Default: center
anti_aliasing -- (Boolean)
                 Default: True
color         -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                 Default: (1.0, 1.0, 1.0)
on            -- (Boolean)
                 Default: True
orientation   -- (Real)
                 Default: 0.0
position      -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real))
                 Default: (320.0, 240.0)
size          -- (Sequence2 of Real)
                 Default: (64.0, 16.0)



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'col...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'color':((1.0, 1.0, 1.0), ve_types.Any\
Of(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real\
))), 'anti_aliasing':(True, ve_types.Boolean), 'orientation':(0.0, ve_\
types.Real), 'position':((320.0, 240.0), ve_types.AnyOf(ve_types.Seque\
nce2(ve_types.Real), ve_types.Sequence3(ve_types.Real), ve_types.Seque\
nce4(ve_types.Real)), "units: eye coordinates"), 'anchor':('center', v\
e_types.String), 'size':((64.0, 16.0), ve_types.Sequence2(ve_types.Rea\
l)),}

visionegg-1.2.1/doc/reference/html/VisionEgg.MoreStimuli.FilledCircle-class.html0000644000076500000240000003556311224565530027032 0ustar astrawstaff VisionEgg.MoreStimuli.FilledCircle
Package VisionEgg :: Module MoreStimuli :: Class FilledCircle
[frames] | no frames]

Class FilledCircle

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         FilledCircle

A circular stimulus, typically used as a fixation point.

(Note, this implementation almost certainly could be made faster
using display lists.)

Parameters
==========
anchor        -- how position parameter is used (String)
                 Default: center
anti_aliasing -- (Boolean)
                 Default: True
color         -- color (AnyOf(Sequence3 of Real or Sequence4 of Real))
                 Default: (1.0, 1.0, 1.0)
num_triangles -- number of triangles used to draw circle (Integer)
                 Default: 51
on            -- draw? (Boolean)
                 Default: True
position      -- position in eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real))
                 Default: (320.0, 240.0)
radius        -- radius in eye coordinates (Real)
                 Default: 2.0



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = VisionEgg.ParameterDefinition({'on':...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
VisionEgg.ParameterDefinition({'on':(True, ve_types.Boolean, 'draw?'),\
 'color':((1.0, 1.0, 1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.\
Real), ve_types.Sequence4(ve_types.Real)), 'color'), 'anti_aliasing':(\
True, ve_types.Boolean), 'position':((320.0, 240.0), ve_types.AnyOf(ve\
_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real), ve\
_types.Sequence4(ve_types.Real)), 'position in eye coordinates'), 'anc\
hor':('center', ve_types.String, 'how position parameter is used'), 'r\
adius':(2.0, ve_types.Real, 'radius in eye coordinates'), 'num_triangl\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.MoreStimuli.Rectangle3D-class.html0000644000076500000240000003545311224565530026602 0ustar astrawstaff VisionEgg.MoreStimuli.Rectangle3D
Package VisionEgg :: Module MoreStimuli :: Class Rectangle3D
[frames] | no frames]

Class Rectangle3D

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         Rectangle3D

Solid color rectangle positioned explicitly by four vertices.

Parameters
==========
color   -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
           Default: (1.0, 1.0, 1.0, 1.0)
on      -- (Boolean)
           Default: True
vertex1 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real))
           Default: (-10.0, 0.0, -10.0)
vertex2 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real))
           Default: (-10.0, 0.0, 10.0)
vertex3 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real))
           Default: (10.0, 0.0, 10.0)
vertex4 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real))
           Default: (10.0, 0.0, -10.0)



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'col...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'color':((1.0, 1.0, 1.0, 1.0), ve_type\
s.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types\
.Real))), 'vertex1':((-10.0, 0.0,-10.0), ve_types.AnyOf(ve_types.Seque\
nce3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye c\
oordinates"), 'vertex2':((-10.0, 0.0, 10.0), ve_types.AnyOf(ve_types.S\
equence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: e\
ye coordinates"), 'vertex3':((10.0, 0.0, 10.0), ve_types.AnyOf(ve_type\
s.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.MoreStimuli.Target2D-class.html0000644000076500000240000003556511224565530026127 0ustar astrawstaff VisionEgg.MoreStimuli.Target2D
Package VisionEgg :: Module MoreStimuli :: Class Target2D
[frames] | no frames]

Class Target2D

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         Target2D

Rectanglular stimulus.

Parameters
==========
anchor        -- specifies how position parameter is interpreted (String)
                 Default: center
anti_aliasing -- (Boolean)
                 Default: True
center        -- DEPRECATED: don't use (Sequence2 of Real)
                 Default: (determined at runtime)
color         -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                 Default: (1.0, 1.0, 1.0)
on            -- draw stimulus? (Boolean) (Boolean)
                 Default: True
orientation   -- (Real)
                 Default: 0.0
position      -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real))
                 Default: (320.0, 240.0)
size          -- units: eye coordinates (Sequence2 of Real)
                 Default: (64.0, 16.0)



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean, "draw...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean, "draw stimulus? (Boolean)"), 'color':((\
1.0, 1.0, 1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_t\
ypes.Sequence4(ve_types.Real))), 'anti_aliasing':(True, ve_types.Boole\
an), 'orientation':(0.0, ve_types.Real), 'position':((320.0, 240.0), v\
e_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve\
_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye coordina\
tes"), 'anchor':('center', ve_types.String, "specifies how position pa\
rameter is interpreted"), 'size':((64.0, 16.0), ve_types.Sequence2(ve_\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterDefinition-class.html0000644000076500000240000001643511224565530026167 0ustar astrawstaff VisionEgg.ParameterDefinition
Package VisionEgg :: Class ParameterDefinition
[frames] | no frames]

Class ParameterDefinition

source code

object --+    
         |    
      dict --+
             |
            ParameterDefinition

Define parameters used in ClassWithParameters
    



Instance Methods

Inherited from dict: __cmp__, __contains__, __delitem__, __eq__, __ge__, __getattribute__, __getitem__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __ne__, __new__, __repr__, __setitem__, clear, copy, fromkeys, get, has_key, items, iteritems, iterkeys, itervalues, keys, pop, popitem, setdefault, update, values

Inherited from object: __delattr__, __reduce__, __reduce_ex__, __setattr__, __str__

Class Variables
  DEPRECATED = 1
  OPENGL_ENUM = 2
Properties

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.Parameters-class.html0000644000076500000240000000776711224565530024351 0ustar astrawstaff VisionEgg.Parameters
Package VisionEgg :: Class Parameters
[frames] | no frames]

Class Parameters

source code

Parameter container.

Simple empty class to act something like a C struct.



visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes-module.html0000644000076500000240000003677011224565530025367 0ustar astrawstaff VisionEgg.ParameterTypes
Package VisionEgg :: Module ParameterTypes
[frames] | no frames]

Module ParameterTypes

source code


Type checking for the Vision Egg.



Classes
  ParameterTypeDef
Base class for all parameter type definitions
  AnyOf
  NoneMC
metaclass for NoneType
  NoneType
  BooleanMC
metaclass for Boolean
  Boolean
  CallableMC
metaclass for Callable
  Callable
  AnyClassMC
metaclass for AnyClass
  AnyClass
parameter is a class
  SubClass
parameter is derived from base_class
  Instance
parameter is an instance of class_type
  IntegerMC
metaclass for Integer
  Integer
  UnsignedIntegerMC
metaclass for UnsignedInteger
  UnsignedInteger
  RealMC
metaclass for Real
  Real
  Sequence
A tuple, list or Numeric array
  Sequence2
  Sequence3
  Sequence4
  Sequence4x4
  StringMC
metaclass for String
  String
  UnicodeMC
metaclass for Unicode
  Unicode
Functions
 
get_all_classes_list(klass) source code
 
is_parameter_type_def(item_type) source code
 
get_type(value)
Take a value and return best guess of ParameterTypeDef it is.
source code
 
assert_type(check_type, require_type) source code
Variables
  array_types = [numpy.ndarray]
visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes-pysrc.html0000644000076500000240000047236611224565530025247 0ustar astrawstaff VisionEgg.ParameterTypes
Package VisionEgg :: Module ParameterTypes
[frames] | no frames]

Source Code for Module VisionEgg.ParameterTypes

  1  # The Vision Egg: ParameterTypes 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw 
  4  # Copyright (C) 2005,2008 California Insitute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Type checking for the Vision Egg. 
 13   
 14  """ 
 15   
 16  import VisionEgg 
 17   
 18  import types, warnings 
 19  import numpy 
 20  import numpy.oldnumeric as numpyNumeric 
 21   
 22  array_types = [numpy.ndarray] 
 23  # Allow use of numarray and original Numeric Texture data without requiring either 
 24  try: 
 25      import numarray 
 26      array_types.append( numarray.numarraycore.NumArray ) 
 27  except ImportError: 
 28      pass 
 29  try: 
 30      import Numeric as orig_Numeric 
 31      array_types.append( orig_Numeric.ArrayType ) 
 32  except ImportError: 
 33      pass 
 34   
35 -class ParameterTypeDef(object):
36 """Base class for all parameter type definitions"""
37 - def verify(value):
38 # override this method with type-checking code 39 raise RuntimeError('must override base class method verify')
40 verify = staticmethod(verify)
41
42 -def get_all_classes_list(klass):
43 #assert(type(klass) == types.ClassType) 44 result = [klass] 45 for base_klass in klass.__bases__: 46 result.extend(get_all_classes_list(base_klass)) 47 return result
48
49 -def is_parameter_type_def(item_type):
50 if type(item_type) == types.ClassType: 51 if Sequence in get_all_classes_list(item_type): 52 raise TypeError("Sequence definition must be an instance (with a contained type).") 53 else: 54 return ParameterTypeDef in get_all_classes_list(item_type) 55 elif isinstance(item_type,ParameterTypeDef): 56 return True 57 elif issubclass(item_type,ParameterTypeDef): # for new style classes 58 return True 59 elif item_type == types.NoneType: 60 warnings.warn("types.NoneType will stop being a supported type "+\ 61 "argument. Please call "+\ 62 "VisionEgg.ParameterTypes.get_type(None) to get the "+\ 63 "supported value",DeprecationWarning,stacklevel=2) 64 return True 65 else: 66 return False
67
68 -class AnyOf(ParameterTypeDef):
69 - def __init__(self,*item_types):
70 for item_type in item_types: 71 if not is_parameter_type_def(item_type): 72 raise TypeError("%s is not a valid type definition") 73 self.item_types = item_types
74 - def __str__(self):
75 return 'AnyOf(%s)'%(' or '.join(map(str,self.item_types)))
76 - def verify(self,is_any_of):
77 for item_type in self.item_types: 78 if item_type.verify(is_any_of): 79 return True 80 return False
81 - def get_item_types(self):
82 return self.item_types
83
84 -class NoneMC(type):
85 """metaclass for NoneType"""
86 - def __str__(self):
87 return 'None'
88
89 -class NoneType(ParameterTypeDef):
90 __metaclass__ = NoneMC
91 - def verify(is_none):
92 return is_none is None
93 verify = staticmethod(verify)
94
95 -class BooleanMC(type):
96 """metaclass for Boolean"""
97 - def __str__(self):
98 return 'Boolean'
99
100 -class Boolean(ParameterTypeDef):
101 __metaclass__ = BooleanMC
102 - def verify(is_boolean):
103 if isinstance(is_boolean,(bool,int,numpy.integer)): 104 return True 105 else: 106 return False
107 verify = staticmethod(verify)
108
109 -class CallableMC(type):
110 """metaclass for Callable"""
111 - def __str__(self):
112 return 'Callable'
113
114 -class Callable(ParameterTypeDef):
115 __metaclass__ = CallableMC
116 - def verify(is_callable):
117 return callable(is_callable)
118 verify = staticmethod(verify)
119
120 -class AnyClassMC(type):
121 """metaclass for AnyClass"""
122 - def __str__(self):
123 return 'AnyClass'
124
125 -class AnyClass(ParameterTypeDef):
126 """parameter is a class""" 127 __metaclass__ = AnyClassMC
128 - def verify(is_class):
129 return type(is_class) == types.ClassType
130 verify = staticmethod(verify)
131
132 -class SubClass(ParameterTypeDef):
133 """parameter is derived from base_class"""
134 - def __init__(self,base_class):
135 if type(base_class) != types.ClassType: 136 raise TypeError("base_class must be ClassType") 137 self.base_class = base_class
138 - def verify(self,is_class):
139 if type(self.base_class) != types.ClassType: 140 return False 141 return self.base_class in get_all_classes_list(is_class)
142 - def __str__(self):
143 return 'SubClass of %s'%str(self.base_class)
144
145 -class Instance(ParameterTypeDef):
146 """parameter is an instance of class_type"""
147 - def __init__(self,class_type):
148 if type(class_type) not in (types.ClassType, types.TypeType): 149 raise TypeError("expected a class type") 150 self.class_type = class_type
151 - def __str__(self):
152 contained_string = str(self.class_type) 153 return 'Instance of %s'%contained_string
154 - def verify(self,is_instance):
155 return isinstance(is_instance,self.class_type)
156
157 -class IntegerMC(type):
158 """metaclass for Integer"""
159 - def __str__(self):
160 return 'Integer'
161
162 -class Integer(ParameterTypeDef):
163 __metaclass__ = IntegerMC
164 - def verify(is_integer):
165 return isinstance(is_integer,(int,numpy.integer))
166 verify = staticmethod(verify)
167
168 -class UnsignedIntegerMC(IntegerMC):
169 """metaclass for UnsignedInteger"""
170 - def __str__(self):
171 return 'UnsignedInteger'
172
173 -class UnsignedInteger(Integer):
174 __metaclass__ = UnsignedIntegerMC
175 - def verify(is_unsigned_integer):
176 if not Integer.verify(is_unsigned_integer): 177 return False 178 return is_unsigned_integer >= 0
179 verify = staticmethod(verify)
180
181 -class RealMC(type):
182 """metaclass for Real"""
183 - def __str__(self):
184 return 'Real'
185
186 -class Real(ParameterTypeDef):
187 __metaclass__ = RealMC
188 - def verify(is_real):
189 if isinstance(is_real, (int, float, numpy.floating, numpy.integer)): 190 return True 191 elif type(is_real) in array_types: 192 # scalars can be Numeric arrays 193 if len(is_real.shape)==0: 194 try: 195 float(is_real) 196 return True 197 except: 198 return False 199 return False
200 verify = staticmethod(verify)
201
202 -class Sequence(ParameterTypeDef):
203 """A tuple, list or Numeric array"""
204 - def __init__(self,item_type):
205 if not is_parameter_type_def(item_type): 206 raise TypeError("%s is not a valid type definition"%item_type) 207 self.item_type = item_type
208 - def __str__(self):
209 contained_string = str(self.item_type) 210 return 'Sequence of %s'%contained_string
211 - def verify(self,is_sequence):
212 try: 213 len(is_sequence) 214 except TypeError: 215 return False 216 for i in xrange(len(is_sequence)): 217 if not self.item_type.verify(is_sequence[i]): 218 return False 219 return True
220
221 -class Sequence2(Sequence):
222 - def __str__(self):
223 contained_string = str(self.item_type) 224 return 'Sequence2 of %s'%contained_string
225 - def verify(self,is_sequence2):
226 if not Sequence.verify(self,is_sequence2): 227 return False 228 if not len(is_sequence2) == 2: 229 return False 230 return True
231
232 -class Sequence3(Sequence):
233 - def __str__(self):
234 contained_string = str(self.item_type) 235 return 'Sequence3 of %s'%contained_string
236 - def verify(self,is_sequence3):
237 if not Sequence.verify(self,is_sequence3): 238 return False 239 if not len(is_sequence3) == 3: 240 return False 241 return True
242
243 -class Sequence4(Sequence):
244 - def __str__(self):
245 contained_string = str(self.item_type) 246 return 'Sequence4 of %s'%contained_string
247 - def verify(self,is_sequence4):
248 if not Sequence.verify(self,is_sequence4): 249 return False 250 if not len(is_sequence4) == 4: 251 return False 252 return True
253
254 -class Sequence4x4(Sequence4):
255 - def __str__(self):
256 contained_string = str(self.item_type) 257 return 'Sequence4x4 of %s'%contained_string
258 - def verify(self,is_sequence4x4):
259 try: 260 len(is_sequence4x4) 261 except TypeError: 262 return False 263 if not len(is_sequence4x4) == 4: 264 return False 265 for i in range(4): 266 if not Sequence4.verify(self,is_sequence4x4[i]): 267 return False 268 return True
269
270 -class StringMC(type):
271 """metaclass for String"""
272 - def __str__(self):
273 return 'String'
274
275 -class String(ParameterTypeDef):
276 __metaclass__ = StringMC
277 - def verify(is_string):
278 if isinstance(is_string,str): 279 return True 280 else: 281 return False
282 verify = staticmethod(verify)
283
284 -class UnicodeMC(type):
285 """metaclass for Unicode"""
286 - def __str__(self):
287 return 'Unicode'
288
289 -class Unicode(ParameterTypeDef):
290 __metaclass__ = UnicodeMC
291 - def verify(is_unicode):
292 if isinstance(is_unicode,unicode): 293 return True 294 else: 295 return False
296 verify = staticmethod(verify)
297
298 -def get_type(value):
299 """Take a value and return best guess of ParameterTypeDef it is.""" 300 py_type = type(value) 301 302 if isinstance(value,bool): 303 return Boolean 304 elif value is None: 305 return NoneType 306 elif isinstance(value,(int,numpy.integer)): 307 if py_type >= 0: 308 return UnsignedInteger 309 else: 310 return Integer 311 elif isinstance(value,(float,numpy.floating)): 312 return Real 313 elif py_type == types.InstanceType: 314 # hmm, impossible to figure out appropriate class of all possible base classes 315 return Instance(value.__class__) 316 elif callable(value): 317 return Callable 318 else: 319 try: 320 len(value) 321 except TypeError: 322 is_sequence = False 323 else: 324 is_sequence = True 325 if is_sequence: 326 if len(value) == 4: 327 # see if it's a 4x4 sequence 328 is_sequence4x4 = True 329 for i in range(4): 330 try: 331 len(value[i]) 332 except TypeError: 333 is_sequence4x4 = False 334 if is_sequence4x4: 335 sequence4x4_type = get_type(value[0][0]) # XXX assume all same types 336 return Sequence4x4(sequence4x4_type) 337 if type(value) == str: 338 return String 339 lcd_type = get_type(value[0]) # lowest common denominator type 340 for i in range(len(value)): 341 this_type = get_type(value[i]) 342 if lcd_type != this_type: 343 # find lowest common denominator type 344 if lcd_type.verify( this_type ): 345 continue # covered by lowest common denominator 346 elif this_type.verify( lcd_type ): 347 lcd_type = this_type # new lowest common denominator 348 else: 349 lcd_type = AnyOf( lcd_type, this_type ) # make new lowest common denominator 350 sequence_type = lcd_type 351 if len(value) == 2: 352 return Sequence2(sequence_type) 353 elif len(value) == 3: 354 return Sequence3(sequence_type) 355 elif len(value) == 4: 356 return Sequence4(sequence_type) 357 else: 358 return Sequence(sequence_type) 359 # finally, one last check: 360 if isinstance(value, object): 361 # new style class 362 # hmm, impossible to figure out appropriate class of all possible base classes 363 return Instance(value.__class__) 364 else: 365 raise TypeError("Unable to determine type for '%s'"%value)
366
367 -def assert_type(check_type,require_type):
368 if not is_parameter_type_def(check_type): 369 raise ValueError("require a ParameterTypeDef as argument (not %s)"%check_type) 370 if not is_parameter_type_def(require_type): 371 raise ValueError("require a ParameterTypeDef as argument (not %s)"%require_type) 372 if check_type == require_type: 373 return 374 375 if check_type in (Integer,UnsignedInteger) and require_type == Boolean: 376 return # let integers pass as booleans 377 # XXX doesn't check if Instance is actually instance of proper class 378 if isinstance(check_type,ParameterTypeDef): 379 check_class = check_type.__class__ 380 else: 381 check_class = check_type 382 383 if isinstance(require_type,ParameterTypeDef): 384 if isinstance(require_type,AnyOf): 385 passed = False 386 for ok_type in require_type.get_item_types(): 387 try: 388 assert_type(check_type, ok_type ) 389 return # it's ok 390 except: 391 pass 392 else: 393 require_class = require_type.__class__ 394 else: 395 require_class = require_type 396 397 if require_class in get_all_classes_list(check_class): 398 return 399 400 if issubclass(require_class,Real): 401 if issubclass(check_class,Boolean): 402 return 403 elif issubclass(check_class,Integer): 404 return 405 406 if issubclass(require_class,Integer): 407 if issubclass(check_class,Boolean): 408 return 409 410 raise TypeError("%s not of type %s"%(check_type,require_type))
411

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.AnyClass-class.html0000644000076500000240000002076711224565530026722 0ustar astrawstaff VisionEgg.ParameterTypes.AnyClass
Package VisionEgg :: Module ParameterTypes :: Class AnyClass
[frames] | no frames]

Class AnyClass

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  AnyClass

parameter is a class



Nested Classes
  __metaclass__
metaclass for AnyClass
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_class) source code
Properties

Inherited from object: __class__

Method Details

verify(is_class)
Static Method

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.AnyClassMC-class.html0000644000076500000240000001775211224565530027142 0ustar astrawstaff VisionEgg.ParameterTypes.AnyClassMC
Package VisionEgg :: Module ParameterTypes :: Class AnyClassMC
[frames] | no frames]

Type AnyClassMC

source code

object --+    
         |    
      type --+
             |
            AnyClassMC

metaclass for AnyClass



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.AnyOf-class.html0000644000076500000240000002626111224565530026214 0ustar astrawstaff VisionEgg.ParameterTypes.AnyOf
Package VisionEgg :: Module ParameterTypes :: Class AnyOf
[frames] | no frames]

Class AnyOf

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  AnyOf

Instance Methods
 
__init__(self, *item_types)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__str__(self)
str(x)
source code
 
verify(self, is_any_of) source code
 
get_item_types(self) source code

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Properties

Inherited from object: __class__

Method Details

__init__(self, *item_types)
(Constructor)

source code 
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

verify(self, is_any_of)

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Boolean-class.html0000644000076500000240000002065311224565530026556 0ustar astrawstaff VisionEgg.ParameterTypes.Boolean
Package VisionEgg :: Module ParameterTypes :: Class Boolean
[frames] | no frames]

Class Boolean

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  Boolean

Nested Classes
  __metaclass__
metaclass for Boolean
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_boolean) source code
Properties

Inherited from object: __class__

Method Details

verify(is_boolean)
Static Method

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.BooleanMC-class.html0000644000076500000240000001774011224565530027001 0ustar astrawstaff VisionEgg.ParameterTypes.BooleanMC
Package VisionEgg :: Module ParameterTypes :: Class BooleanMC
[frames] | no frames]

Type BooleanMC

source code

object --+    
         |    
      type --+
             |
            BooleanMC

metaclass for Boolean



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Callable-class.html0000644000076500000240000002067011224565530026675 0ustar astrawstaff VisionEgg.ParameterTypes.Callable
Package VisionEgg :: Module ParameterTypes :: Class Callable
[frames] | no frames]

Class Callable

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  Callable

Nested Classes
  __metaclass__
metaclass for Callable
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_callable) source code
Properties

Inherited from object: __class__

Method Details

verify(is_callable)
Static Method

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.CallableMC-class.html0000644000076500000240000001775211224565530027124 0ustar astrawstaff VisionEgg.ParameterTypes.CallableMC
Package VisionEgg :: Module ParameterTypes :: Class CallableMC
[frames] | no frames]

Type CallableMC

source code

object --+    
         |    
      type --+
             |
            CallableMC

metaclass for Callable



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Instance-class.html0000644000076500000240000002524211224565530026742 0ustar astrawstaff VisionEgg.ParameterTypes.Instance
Package VisionEgg :: Module ParameterTypes :: Class Instance
[frames] | no frames]

Class Instance

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  Instance

parameter is an instance of class_type



Instance Methods
 
__init__(self, class_type)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__str__(self)
str(x)
source code
 
verify(self, is_instance) source code

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Properties

Inherited from object: __class__

Method Details

__init__(self, class_type)
(Constructor)

source code 
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

verify(self, is_instance)

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Integer-class.html0000644000076500000240000002065311224565530026574 0ustar astrawstaff VisionEgg.ParameterTypes.Integer
Package VisionEgg :: Module ParameterTypes :: Class Integer
[frames] | no frames]

Class Integer

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  Integer

Nested Classes
  __metaclass__
metaclass for Integer
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_integer) source code
Properties

Inherited from object: __class__

Method Details

verify(is_integer)
Static Method

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.IntegerMC-class.html0000644000076500000240000001774011224565530027017 0ustar astrawstaff VisionEgg.ParameterTypes.IntegerMC
Package VisionEgg :: Module ParameterTypes :: Class IntegerMC
[frames] | no frames]

Type IntegerMC

source code

object --+    
         |    
      type --+
             |
            IntegerMC

metaclass for Integer



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.NoneMC-class.html0000644000076500000240000001770611224565530026323 0ustar astrawstaff VisionEgg.ParameterTypes.NoneMC
Package VisionEgg :: Module ParameterTypes :: Class NoneMC
[frames] | no frames]

Type NoneMC

source code

object --+    
         |    
      type --+
             |
            NoneMC

metaclass for NoneType



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.NoneType-class.html0000644000076500000240000002065411224565530026741 0ustar astrawstaff VisionEgg.ParameterTypes.NoneType
Package VisionEgg :: Module ParameterTypes :: Class NoneType
[frames] | no frames]

Class NoneType

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  NoneType

Nested Classes
  __metaclass__
metaclass for NoneType
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_none) source code
Properties

Inherited from object: __class__

Method Details

verify(is_none)
Static Method

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.ParameterTypeDef-class.html0000644000076500000240000001514311224565530030376 0ustar astrawstaff VisionEgg.ParameterTypes.ParameterTypeDef
Package VisionEgg :: Module ParameterTypes :: Class ParameterTypeDef
[frames] | no frames]

Class ParameterTypeDef

source code

object --+
         |
        ParameterTypeDef

Base class for all parameter type definitions



Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(value) source code
Properties

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Real-class.html0000644000076500000240000002060411224565530026056 0ustar astrawstaff VisionEgg.ParameterTypes.Real
Package VisionEgg :: Module ParameterTypes :: Class Real
[frames] | no frames]

Class Real

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  Real

Nested Classes
  __metaclass__
metaclass for Real
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_real) source code
Properties

Inherited from object: __class__

Method Details

verify(is_real)
Static Method

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.RealMC-class.html0000644000076500000240000001770211224565530026303 0ustar astrawstaff VisionEgg.ParameterTypes.RealMC
Package VisionEgg :: Module ParameterTypes :: Class RealMC
[frames] | no frames]

Type RealMC

source code

object --+    
         |    
      type --+
             |
            RealMC

metaclass for Real



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Sequence-class.html0000644000076500000240000002523011224565530026743 0ustar astrawstaff VisionEgg.ParameterTypes.Sequence
Package VisionEgg :: Module ParameterTypes :: Class Sequence
[frames] | no frames]

Class Sequence

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  Sequence

A tuple, list or Numeric array



Instance Methods
 
__init__(self, item_type)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__str__(self)
str(x)
source code
 
verify(self, is_sequence) source code

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Properties

Inherited from object: __class__

Method Details

__init__(self, item_type)
(Constructor)

source code 
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

verify(self, is_sequence)

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Sequence2-class.html0000644000076500000240000002237311224565530027032 0ustar astrawstaff VisionEgg.ParameterTypes.Sequence2
Package VisionEgg :: Module ParameterTypes :: Class Sequence2
[frames] | no frames]

Class Sequence2

source code

      object --+        
               |        
ParameterTypeDef --+    
                   |    
            Sequence --+
                       |
                      Sequence2

Instance Methods
 
__str__(self)
str(x)
source code
 
verify(self, is_sequence2) source code

Inherited from Sequence: __init__

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Properties

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: Sequence.__str__

verify(self, is_sequence2)

source code 
Overrides: Sequence.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Sequence3-class.html0000644000076500000240000002237311224565530027033 0ustar astrawstaff VisionEgg.ParameterTypes.Sequence3
Package VisionEgg :: Module ParameterTypes :: Class Sequence3
[frames] | no frames]

Class Sequence3

source code

      object --+        
               |        
ParameterTypeDef --+    
                   |    
            Sequence --+
                       |
                      Sequence3

Instance Methods
 
__str__(self)
str(x)
source code
 
verify(self, is_sequence3) source code

Inherited from Sequence: __init__

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Properties

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: Sequence.__str__

verify(self, is_sequence3)

source code 
Overrides: Sequence.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Sequence4-class.html0000644000076500000240000002237311224565530027034 0ustar astrawstaff VisionEgg.ParameterTypes.Sequence4
Package VisionEgg :: Module ParameterTypes :: Class Sequence4
[frames] | no frames]

Class Sequence4

source code

      object --+        
               |        
ParameterTypeDef --+    
                   |    
            Sequence --+
                       |
                      Sequence4

Instance Methods
 
__str__(self)
str(x)
source code
 
verify(self, is_sequence4) source code

Inherited from Sequence: __init__

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Properties

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: Sequence.__str__

verify(self, is_sequence4)

source code 
Overrides: Sequence.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Sequence4x4-class.html0000644000076500000240000002265511224565530027313 0ustar astrawstaff VisionEgg.ParameterTypes.Sequence4x4
Package VisionEgg :: Module ParameterTypes :: Class Sequence4x4
[frames] | no frames]

Class Sequence4x4

source code

      object --+            
               |            
ParameterTypeDef --+        
                   |        
            Sequence --+    
                       |    
               Sequence4 --+
                           |
                          Sequence4x4

Instance Methods
 
__str__(self)
str(x)
source code
 
verify(self, is_sequence4x4) source code

Inherited from Sequence: __init__

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Properties

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: Sequence4.__str__

verify(self, is_sequence4x4)

source code 
Overrides: Sequence4.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.String-class.html0000644000076500000240000002063611224565530026446 0ustar astrawstaff VisionEgg.ParameterTypes.String
Package VisionEgg :: Module ParameterTypes :: Class String
[frames] | no frames]

Class String

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  String

Nested Classes
  __metaclass__
metaclass for String
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_string) source code
Properties

Inherited from object: __class__

Method Details

verify(is_string)
Static Method

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.StringMC-class.html0000644000076500000240000001772611224565530026674 0ustar astrawstaff VisionEgg.ParameterTypes.StringMC
Package VisionEgg :: Module ParameterTypes :: Class StringMC
[frames] | no frames]

Type StringMC

source code

object --+    
         |    
      type --+
             |
            StringMC

metaclass for String



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.SubClass-class.html0000644000076500000240000002523211224565530026714 0ustar astrawstaff VisionEgg.ParameterTypes.SubClass
Package VisionEgg :: Module ParameterTypes :: Class SubClass
[frames] | no frames]

Class SubClass

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  SubClass

parameter is derived from base_class



Instance Methods
 
__init__(self, base_class)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
verify(self, is_class) source code
 
__str__(self)
str(x)
source code

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Properties

Inherited from object: __class__

Method Details

__init__(self, base_class)
(Constructor)

source code 
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

verify(self, is_class)

source code 
Overrides: ParameterTypeDef.verify

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.Unicode-class.html0000644000076500000240000002065311224565530026565 0ustar astrawstaff VisionEgg.ParameterTypes.Unicode
Package VisionEgg :: Module ParameterTypes :: Class Unicode
[frames] | no frames]

Class Unicode

source code

      object --+    
               |    
ParameterTypeDef --+
                   |
                  Unicode

Nested Classes
  __metaclass__
metaclass for Unicode
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_unicode) source code
Properties

Inherited from object: __class__

Method Details

verify(is_unicode)
Static Method

source code 
Overrides: ParameterTypeDef.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.UnicodeMC-class.html0000644000076500000240000001774011224565530027010 0ustar astrawstaff VisionEgg.ParameterTypes.UnicodeMC
Package VisionEgg :: Module ParameterTypes :: Class UnicodeMC
[frames] | no frames]

Type UnicodeMC

source code

object --+    
         |    
      type --+
             |
            UnicodeMC

metaclass for Unicode



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.UnsignedInteger-class.html0000644000076500000240000002120311224565530030261 0ustar astrawstaff VisionEgg.ParameterTypes.UnsignedInteger
Package VisionEgg :: Module ParameterTypes :: Class UnsignedInteger
[frames] | no frames]

Class UnsignedInteger

source code

      object --+        
               |        
ParameterTypeDef --+    
                   |    
             Integer --+
                       |
                      UnsignedInteger

Nested Classes
  __metaclass__
metaclass for UnsignedInteger
Instance Methods

Inherited from object: __delattr__, __getattribute__, __hash__, __init__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Static Methods
 
verify(is_unsigned_integer) source code
Properties

Inherited from object: __class__

Method Details

verify(is_unsigned_integer)
Static Method

source code 
Overrides: Integer.verify

visionegg-1.2.1/doc/reference/html/VisionEgg.ParameterTypes.UnsignedIntegerMC-class.html0000644000076500000240000002025411224565530030506 0ustar astrawstaff VisionEgg.ParameterTypes.UnsignedIntegerMC
Package VisionEgg :: Module ParameterTypes :: Class UnsignedIntegerMC
[frames] | no frames]

Type UnsignedIntegerMC

source code

object --+        
         |        
      type --+    
             |    
     IntegerMC --+
                 |
                UnsignedIntegerMC

metaclass for UnsignedInteger



Instance Methods
 
__str__(self)
str(x)
source code

Inherited from type: __call__, __cmp__, __delattr__, __getattribute__, __hash__, __new__, __repr__, __setattr__, __subclasses__, mro

Inherited from object: __init__, __reduce__, __reduce_ex__

Properties

Inherited from type: __base__, __bases__, __basicsize__, __dictoffset__, __flags__, __itemsize__, __mro__, __name__, __weakrefoffset__

Inherited from object: __class__

Method Details

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: IntegerMC.__str__

visionegg-1.2.1/doc/reference/html/VisionEgg.PlatformDependent-module.html0000644000076500000240000002531411224565530026025 0ustar astrawstaff VisionEgg.PlatformDependent
Package VisionEgg :: Module PlatformDependent
[frames] | no frames]

Module PlatformDependent

source code


Implementations of functions which vary by platform.



Functions
 
set_priority(*args, **kw)
Set the priority of the Vision Egg application.
source code
 
linux_but_unknown_drivers()
Warn that platform is linux, but drivers not known.
source code
 
sync_swap_with_vbl_pre_gl_init()
Try to synchronize buffer swapping and vertical retrace before starting OpenGL.
source code
 
sync_swap_with_vbl_post_gl_init()
Try to synchronize buffer swapping and vertical retrace after starting OpenGL.
source code
 
query_refresh_rate(screen) source code
 
attempt_to_load_multitexturing()
Attempt to load multitexturing functions and constants.
source code
Function Details

set_priority(*args, **kw)

source code 
Set the priority of the Vision Egg application.

Defaults to maximum priority, but can be changed via keyword
arguments.

Raises an exception on failure.

attempt_to_load_multitexturing()

source code 
Attempt to load multitexturing functions and constants.

Inserts the results into the gl module, which makes them globally
available.


visionegg-1.2.1/doc/reference/html/VisionEgg.PlatformDependent-pysrc.html0000644000076500000240000021673511224565530025711 0ustar astrawstaff VisionEgg.PlatformDependent
Package VisionEgg :: Module PlatformDependent
[frames] | no frames]

Source Code for Module VisionEgg.PlatformDependent

  1  # The Vision Egg: PlatformDependent 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Copyright (C) 2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Implementations of functions which vary by platform. 
 13   
 14  """ 
 15   
 16  #################################################################### 
 17  # 
 18  #        Import all the necessary packages 
 19  # 
 20  #################################################################### 
 21   
 22  import logging 
 23   
 24  import sys, os 
 25  import VisionEgg 
 26  import VisionEgg.Core 
 27   
 28  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
 29   
30 -def set_priority(*args,**kw):
31 """Set the priority of the Vision Egg application. 32 33 Defaults to maximum priority, but can be changed via keyword 34 arguments. 35 36 Raises an exception on failure. 37 """ 38 39 # potential keywords 40 parse_me = ["darwin_realtime_period_denom", 41 "darwin_realtime_computation_denom", 42 "darwin_realtime_constraint_denom", 43 "darwin_realtime_preemptible", 44 "darwin_maxpriority_conventional_not_realtime", 45 "darwin_conventional_priority", 46 "darwin_pthread_priority"] 47 48 logger = logging.getLogger('VisionEgg.PlatformDependent') 49 params = {} 50 51 # set variable in local namespace 52 for word in parse_me: 53 # set the value from VisionEgg.config 54 config_name = "VISIONEGG_"+word.upper() 55 if hasattr(VisionEgg.config,config_name): 56 value = getattr(VisionEgg.config,config_name) 57 else: 58 value = None 59 # override default value if present in keyword arguments 60 if word in kw.keys(): 61 value = kw[word] 62 if value is not None: 63 params[word] = value 64 65 if sys.platform == 'darwin': 66 67 # Everything to support realtime in Apple Mac OS X is based on 68 # the following two things: 69 # 70 # 1) http://developer.apple.com/techpubs/macosx/Darwin/General/KernelProgramming/scheduler/Using_Mach__pplications.html 71 # 72 # 2) The Mac OS X port of the Esound daemon. 73 74 import darwin_maxpriority 75 76 if params['darwin_maxpriority_conventional_not_realtime']: 77 process = darwin_maxpriority.PRIO_PROCESS 78 policy = darwin_maxpriority.SCHED_RR 79 80 logger.info("Setting max priority mode for darwin platform " 81 "using conventional priority %d."%( 82 params['darwin_conventional_priority'],)) 83 84 # set the priority of the current process 85 darwin_maxpriority.setpriority(process,0,params['darwin_conventional_priority']) 86 87 # This sets the pthread priority, which only prioritizes 88 # threads in the process. Might as well do it, but it 89 # shouldn't matter unless we're running multi-threaded. 90 darwin_pthread_priority = params['darwin_pthread_priority'] 91 if darwin_pthread_priority == "max": # should otherwise be an int 92 darwin_pthread_priority = darwin_maxpriority.sched_get_priority_max(policy) 93 94 if darwin_maxpriority.set_self_pthread_priority(policy, 95 darwin_pthread_priority) == -1: 96 raise RuntimeError("set_self_pthread failed.") 97 98 else: 99 bus_speed = darwin_maxpriority.get_bus_speed() 100 logger.info("Setting max priority mode for darwin platform " 101 "using realtime threads. ( period = %d / %d, " 102 "computation = %d / %d, constraint = %d / %d, " 103 "preemptible = %d )" % ( 104 bus_speed, params['darwin_realtime_period_denom'], 105 bus_speed, params['darwin_realtime_computation_denom'], 106 bus_speed, params['darwin_realtime_constraint_denom'], 107 params['darwin_realtime_preemptible'] )) 108 period = bus_speed / params['darwin_realtime_period_denom'] 109 computation = bus_speed / params['darwin_realtime_computation_denom'] 110 constraint = bus_speed / params['darwin_realtime_constraint_denom'] 111 preemptible = params['darwin_realtime_preemptible'] 112 113 darwin_maxpriority.set_self_thread_time_constraint_policy( period, computation, constraint, preemptible ) 114 elif sys.platform == 'win32': 115 import win32_maxpriority 116 logger.info("Setting priority for win32 platform to " 117 "HIGH_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST. " 118 "(This is Microsoft's maximum recommended priority, " 119 "but you could still raise it higher.)") 120 win32_maxpriority.set_self_process_priority_class( 121 win32_maxpriority.HIGH_PRIORITY_CLASS ) 122 win32_maxpriority.set_self_thread_priority( 123 win32_maxpriority.THREAD_PRIORITY_HIGHEST) 124 125 elif sys.platform.startswith('irix') or sys.platform.startswith('linux') or sys.platform.startswith('posix'): 126 import posix_maxpriority 127 policy = posix_maxpriority.SCHED_FIFO 128 max_priority = posix_maxpriority.sched_get_priority_max( policy ) 129 logger.info("Setting priority for POSIX-compatible platform to " 130 "policy SCHED_FIFO and priority to " 131 "%d"%max_priority) 132 posix_maxpriority.set_self_policy_priority( policy, max_priority ) # Fails if you don't have permission (try running as root) 133 posix_maxpriority.stop_memory_paging() 134 else: 135 raise RuntimeError("Cannot change priority. Unknown platform '%s'"%sys.platform)
136
138 """Warn that platform is linux, but drivers not known.""" 139 # If you've added support for other drivers to sync with VBLANK under 140 # linux, please let me know how! 141 logger = logging.getLogger('VisionEgg.PlatformDependent') 142 logger.warning("Could not sync buffer swapping to vblank because " 143 "you are running linux but not known/supported " 144 "drivers (only nVidia and recent Mesa DRI Radeon " 145 "currently supported).")
146
148 """Try to synchronize buffer swapping and vertical retrace before starting OpenGL.""" 149 success = 0 150 if sys.platform.startswith("linux"): 151 # Unfotunately, cannot check do glGetString(GL_VENDOR) to 152 # check if drivers are nVidia because we have to do that requires 153 # OpenGL context started, but this variable must be set 154 # before OpenGL context started! 155 156 # Assume drivers are nVidia or recent ATI 157 VisionEgg.Core.add_gl_assumption("__SPECIAL__","linux_nvidia_or_new_ATI",linux_but_unknown_drivers) 158 # Set for nVidia linux 159 os.environ["__GL_SYNC_TO_VBLANK"] = "1" 160 # Set for recent linux Mesa DRI Radeon 161 os.environ["LIBGL_SYNC_REFRESH"] = "1" 162 success = 1 163 elif sys.platform.startswith("irix"): 164 # I think this is set using the GLX swap_control SGI 165 # extension. A C extension could be to be written to change 166 # this value. (It probably cannot be set through an OpenGL 167 # extension or an SDL/pygame feature.) 168 logger = logging.getLogger('VisionEgg.PlatformDependent') 169 logger.info("IRIX platform detected, assuming retrace sync.") 170 return success
171
172 -def sync_swap_with_vbl_post_gl_init():
173 """Try to synchronize buffer swapping and vertical retrace after starting OpenGL.""" 174 success = 0 175 try: 176 if sys.platform == "win32": 177 import OpenGL.WGL.EXT.swap_control 178 if OpenGL.WGL.EXT.swap_control.wglInitSwapControlARB(): # Returns 1 if it's working 179 OpenGL.WGL.EXT.swap_control.wglSwapIntervalEXT(1) # Swap only at frame syncs 180 if OpenGL.WGL.EXT.swap_control.wglGetSwapIntervalEXT() == 1: 181 success = 1 182 elif sys.platform == "darwin": 183 try: 184 import _darwin_sync_swap 185 _darwin_sync_swap.sync_swap() 186 success = 1 187 except Exception,x: 188 logger = logging.getLogger('VisionEgg.PlatformDependent') 189 logger.warning("Failed trying to synchronize buffer " 190 "swapping on darwin: %s: %s"%(str(x.__class__),str(x))) 191 except: 192 pass 193 194 return success
195
196 -def query_refresh_rate(screen):
197 if sys.platform == 'win32': 198 import win32_getrefresh 199 return win32_getrefresh.getrefresh() 200 elif sys.platform == 'darwin': 201 import darwin_getrefresh 202 return darwin_getrefresh.getrefresh() 203 else: 204 raise NotImplementedError("Platform dependent code to query frame rate not implemented on this platform.")
205
207 """Attempt to load multitexturing functions and constants. 208 209 Inserts the results into the gl module, which makes them globally 210 available.""" 211 logger = logging.getLogger('VisionEgg.PlatformDependent') 212 try: 213 import ctypes 214 if sys.platform.startswith('linux'): 215 libGL = ctypes.cdll.LoadLibrary('/usr/lib/libGL.so') 216 elif sys.platform == 'win32': 217 libGL = ctypes.cdll.LoadLibrary('opengl32.dll') 218 else: 219 raise NotImplementedError("ctypes support not added for this platform") 220 221 # make sure libGL has the appropriate functions 222 libGL.glGetString.restype = ctypes.c_char_p 223 vers = libGL.glGetString( ctypes.c_int( gl.GL_VERSION ) ) 224 logger.debug("ctypes loaded OpenGL %s"%vers) 225 226 gl.glActiveTexture = libGL.glActiveTexture 227 gl.glActiveTexture.argtypes = [ctypes.c_int] 228 229 gl.glMultiTexCoord2f = libGL.glMultiTexCoord2f 230 gl.glMultiTexCoord2f.argtypes = [ctypes.c_int, ctypes.c_float, ctypes.c_float] 231 232 # assign constants found by looking at gl.h 233 gl.GL_TEXTURE0 = 0x84C0 234 gl.GL_TEXTURE1 = 0x84C1 235 236 logger.debug("ctypes loaded OpenGL library and multitexture names " 237 "are present. Workaround appears successful. ") 238 except Exception, x: 239 logger.debug("ctypes loading of OpenGL library failed %s: " 240 "%s"%(x.__class__, str(x))) 241 242 if VisionEgg.Core.init_gl_extension('ARB','multitexture'): 243 # copy from extenstion 244 gl.glActiveTexture = gl.glActiveTextureARB 245 gl.glMultiTexCoord2f = gl.glMultiTexCoord2fARB 246 gl.GL_TEXTURE0 = gl.GL_TEXTURE0_ARB 247 gl.GL_TEXTURE1 = gl.GL_TEXTURE1_ARB 248 logger.debug("loaded multitexturing ARB extension") 249 else: 250 logger.warning("multitexturing not available after trying " 251 "ctypes and the OpenGL ARB extension. Some " 252 "features will not be available")
253

visionegg-1.2.1/doc/reference/html/VisionEgg.posix_maxpriority-module.html0000644000076500000240000001653011224565531026224 0ustar astrawstaff VisionEgg.posix_maxpriority
Package VisionEgg :: Module posix_maxpriority
[frames] | no frames]

Module posix_maxpriority

source code

Variables
  SCHED_RR = _posix_maxpriority.SCHED_RR
  SCHED_FIFO = _posix_maxpriority.SCHED_FIFO
  set_self_policy_priority = _posix_maxpriority.set_self_policy_...
  stop_memory_paging = _posix_maxpriority.stop_memory_paging
  sched_get_priority_max = _posix_maxpriority.sched_get_priority...
Variables Details

set_self_policy_priority

Value:
_posix_maxpriority.set_self_policy_priority

sched_get_priority_max

Value:
_posix_maxpriority.sched_get_priority_max

visionegg-1.2.1/doc/reference/html/VisionEgg.posix_maxpriority-pysrc.html0000644000076500000240000004672411224565531026107 0ustar astrawstaff VisionEgg.posix_maxpriority
Package VisionEgg :: Module posix_maxpriority
[frames] | no frames]

Source Code for Module VisionEgg.posix_maxpriority

 1  # This file was created automatically by SWIG. 
 2  # Don't modify this file, modify the SWIG interface instead. 
 3  # This file is compatible with both classic and new-style classes. 
 4   
 5  import _posix_maxpriority 
 6   
7 -def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
8 if (name == "this"): 9 if isinstance(value, class_type): 10 self.__dict__[name] = value.this 11 if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown 12 del value.thisown 13 return 14 method = class_type.__swig_setmethods__.get(name,None) 15 if method: return method(self,value) 16 if (not static) or hasattr(self,name) or (name == "thisown"): 17 self.__dict__[name] = value 18 else: 19 raise AttributeError("You cannot add attributes to %s" % self)
20
21 -def _swig_setattr(self,class_type,name,value):
22 return _swig_setattr_nondynamic(self,class_type,name,value,0)
23
24 -def _swig_getattr(self,class_type,name):
25 method = class_type.__swig_getmethods__.get(name,None) 26 if method: return method(self) 27 raise AttributeError,name
28 29 import types 30 try: 31 _object = types.ObjectType 32 _newclass = 1 33 except AttributeError:
34 - class _object : pass
35 _newclass = 0 36 del types 37 38 39 SCHED_RR = _posix_maxpriority.SCHED_RR 40 SCHED_FIFO = _posix_maxpriority.SCHED_FIFO 41 42 set_self_policy_priority = _posix_maxpriority.set_self_policy_priority 43 44 stop_memory_paging = _posix_maxpriority.stop_memory_paging 45 46 sched_get_priority_max = _posix_maxpriority.sched_get_priority_max 47

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps-module.html0000644000076500000240000002105711224565530024167 0ustar astrawstaff VisionEgg.PyroApps
Package VisionEgg :: Package PyroApps
[frames] | no frames]

Package PyroApps

source code


VisionEgg subpackage providing support for demo applications based on Pyro



Submodules

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps-pysrc.html0000644000076500000240000001433511224565530024043 0ustar astrawstaff VisionEgg.PyroApps
Package VisionEgg :: Package PyroApps
[frames] | no frames]

Source Code for Package VisionEgg.PyroApps

 1  # 
 2  # The Vision Egg: PyroApps 
 3  # 
 4  # Copyright (C) 2001-2003 Andrew Straw. 
 5  # Author: Andrew Straw <astraw@users.sourceforge.net> 
 6  # URL: <http://www.visionegg.org/> 
 7  # 
 8  # Distributed under the terms of the GNU Lesser General Public License 
 9  # (LGPL). See LICENSE.TXT that came with this file. 
10  # 
11  # $Id$ 
12   
13  """ 
14  VisionEgg subpackage providing support for demo applications based on Pyro 
15   
16  """ 
17   

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.AST_ext-module.html0000644000076500000240000002133411224565530025473 0ustar astrawstaff VisionEgg.PyroApps.AST_ext
Package VisionEgg :: Package PyroApps :: Module AST_ext
[frames] | no frames]

Module AST_ext

source code

Classes
  AST_Visitor
Functions
 
gen_assign_val_subtree(assign_val, assign_val_type) source code
 
modify_AST(myAST, assign_name, assign_val) source code
 
extract_from_AST(myAST, assign_name) source code
Variables
  name_sequence = [292, 293, 294, 295, 297, 298, 299, 300, 301, ...
Variables Details

name_sequence

Value:
[292, 293, 294, 295, 297, 298, 299, 300, 301, 302, 303, 304, 305]

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.AST_ext-pysrc.html0000644000076500000240000015565111224565530025360 0ustar astrawstaff VisionEgg.PyroApps.AST_ext
Package VisionEgg :: Package PyroApps :: Module AST_ext
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.AST_ext

  1  ## Automatically adapted for numpy.oldnumeric Jun 18, 2007 by alter_code1.py 
  2   
  3  # The Vision Egg: AST_ext 
  4  # 
  5  # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd 
  6  # 
  7  # Authors: Imran S. Ali, Lachlan Dowd 
  8  # URL: <http://www.visionegg.org/> 
  9  # 
 10  # Distributed under the terms of the GNU Lesser General Public License 
 11  # (LGPL). See LICENSE.TXT that came with this file. 
 12  # 
 13  # $Id$ 
 14   
 15  # This "AST extensions" module works for Python 2.2.1 
 16  # Because the structure of code trees changes with different Python versions, this module may not work with some 
 17  # previous Python releases, or future releases. 
 18   
 19  import pprint 
 20  import parser 
 21  import symbol 
 22  import token 
 23  import tokenize 
 24  import sys 
 25   
 26  # Hopefully, the node ID numbers in the name sequence is all that 
 27  # needs to be changed in order to get this module working with 
 28  # different Python release versions. 
 29   
 30  name_sequence = [292, 293, 294, 295, 297, 298, 299, 300, 301, 302, 
 31  303, 304, 305] 
 32   
 33  # Method for generating an AST sub tree (in list form) suitable for a 
34 -def gen_assign_val_subtree(assign_val, assign_val_type):
35 name_sequence.reverse() 36 sublist = [] 37 if assign_val_type == 2: 38 sublist = [2, '%(assign_val)d' % vars()] 39 elif assign_val_type == 1: 40 sublist = [2, '%(assign_val)f' % vars()] 41 elif assign_val_type == 3: 42 sublist = [3, '"%(assign_val)s"' % vars()] 43 for val in name_sequence[0:len(name_sequence) - 1]: 44 sublist = [val, sublist] 45 name_sequence.reverse() 46 return sublist
47 48
49 -class AST_Visitor:
50 - def __init__(self, modifying_AST):
51 # Flags: 52 53 # Checking assignment name (ie. "x = ..." where we are 54 # checking if 'x' == 'assign_name'): 55 self.checking_assign_name = 0 56 57 # Setting assignment value (we are changing a found occurrence 58 # of "assign_name = x" to "assign_name = assign_val"): 59 self.setting_assign_val = 0 60 61 # Index of where the AST visitor is currently at in the 62 # 'name_sequence' defined earlier: 63 self.name_seq_index = 0 64 65 # AST visitor expects a subtree associated with 66 # assignment/"=": 67 self.expecting_equals = 0 68 69 # Extracting assignment value (we are extracting the 'x' from 70 # a found occurrence of "assign_name = x"): 71 self.extracting_assign_val = 0 72 73 # Extracted assignment value: 74 self.extracted_val = "not found" 75 76 # Are we modifying an AST? Otherwise we're extracting 77 # information from an AST: 78 self.modifying_AST = modifying_AST
79
80 - def traverse(self, AST_sublist, assign_name, assign_val_subtree):
81 82 # If we have a single element (terminating leaf node): 83 if type(AST_sublist) != list: 84 return AST_sublist 85 86 # If we have a sub tree of the form [x, [....]]: 87 elif len(AST_sublist) == 2: 88 89 # If we are somewhere in the 'name_sequence' defined 90 # earlier: [292, [293, [294, [295, [297, [298, [299, [300, 91 # [301, [302, [303, [304, [305, ... 92 93 if self.name_seq_index > 0: 94 # If we are at the end of the 'name_sequence': 95 if self.name_seq_index == len(name_sequence) - 1 and AST_sublist[0] == name_sequence[self.name_seq_index]: 96 if len(AST_sublist[1]) == 3: 97 if self.extracting_assign_val == 1: 98 extracted_val = AST_sublist[1][1] 99 self.extracted_val = extracted_val 100 self.extracting_assign_val = 0 101 else: 102 # Enter new mode: AST visitor will check 103 # the name associated with the 104 # 'name_sequence' to see if it will match 105 # 'assign_name': 106 self.checking_assign_name = 1 107 self.name_seq_index = 0 108 109 else: 110 expected_val = name_sequence[self.name_seq_index] 111 if AST_sublist[0] == expected_val: 112 # Update position in 'name_sequence': 113 self.name_seq_index = self.name_seq_index + 1 114 else: 115 self.name_seq_index = 0 116 return AST_sublist[0:1] + [self.traverse(AST_sublist[1], assign_name, assign_val_subtree)] 117 118 # Else we are in some arbitrary sequence: 119 # [a, [b, [c, [d, [e, [... 120 else: 121 # If we are at the start of the 'name_sequence': 122 if AST_sublist[0] == 292: 123 if self.setting_assign_val == 1: 124 AST_sublist[1] = assign_val_subtree 125 self.setting_assign_val = 0 126 else: 127 # Enter new mode: AST visitor will check to 128 # see if we are progressing through the 129 # 'name_sequence' defined earlier: 130 self.name_seq_index = 1 131 return AST_sublist[0:1] + [self.traverse(AST_sublist[1], assign_name, assign_val_subtree)] 132 else: 133 return AST_sublist[0:1] + [self.traverse(AST_sublist[1], assign_name, assign_val_subtree)] 134 135 # If we have a sub tree with 3 parent nodes: 136 elif len(AST_sublist) == 3: 137 138 # If the second parent node is a single element 139 # (terminating leaf node): 140 if type(AST_sublist[1]) != list: 141 # If the current AST visitor mode is set to checking 142 # for equality with "assign_name" (ie. "x = ..." where 143 # we are checking if 'x' == 'assign_name'):: 144 if self.checking_assign_name == 1: 145 # If 'x' == 'assign_name' (see above): 146 if AST_sublist[1] == assign_name: 147 # Enter new mode: AST visitor will check to 148 # see if the current sub tree is associated 149 # with assignment/"=": 150 self.expecting_equals = 1 151 self.checking_assign_name = 0 152 153 # If the current AST visitor mode is set to check if 154 # the current sub tree is associated with 155 # assignment/"=": 156 elif self.expecting_equals == 1: 157 # If the current AST sub tree is associated with 158 # assignment/"=": 159 if AST_sublist[1] == '=': 160 if self.modifying_AST == 1: 161 # Enter new mode: AST visitor will change 162 # the assignment value to 163 # "assign_val_subtree": 164 self.setting_assign_val = 1 165 elif self.modifying_AST == 0: 166 # Enter new mode: AST visitor will extract 167 # the assignment value of "assign_name": 168 self.extracting_assign_val = 1 169 self.expecting_equals = 0 170 171 return AST_sublist[0:2] 172 173 # If we are somewhere within the 'name_sequence': 174 if self.name_seq_index > 0 or self.name_seq_index < len(name_sequence) - 1: 175 # If the AST visitor is extracting the value of "assign_name": 176 if self.extracting_assign_val == 1: 177 self.extracted_val = "compound" 178 self.extracting_assign_val = 0 179 180 181 # For all other types of sub trees, AST visitor will traverse 182 # in a depth first search pattern: 183 sub_list = [] 184 for x in AST_sublist: 185 sub_list = sub_list + [self.traverse(x, assign_name, assign_val_subtree)] 186 return sub_list
187
188 -def modify_AST(myAST, assign_name, assign_val):
189 myAST_Visitor = AST_Visitor(1) 190 old_AST_list = myAST.tolist(1) 191 assign_val_type = 0 192 if isinstance(assign_val, int): 193 assign_val_type = 2 194 elif isinstance(assign_val, float): 195 assign_val_type = 1 196 elif type(assign_val) == str: 197 assign_val_type = 3 198 new_AST_list = myAST_Visitor.traverse(old_AST_list, assign_name, gen_assign_val_subtree(assign_val, assign_val_type)) 199 myNewAST = parser.sequence2ast(new_AST_list) 200 return myNewAST
201 202 # Extract the assigned value of a variable from an AST. Retains the type.
203 -def extract_from_AST(myAST, assign_name):
204 myAST_Visitor = AST_Visitor(0) 205 old_AST_list = myAST.tolist(1) 206 new_AST_list = myAST_Visitor.traverse(old_AST_list, assign_name, 0) 207 return myAST_Visitor.extracted_val
208

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.AST_ext.AST_Visitor-class.html0000644000076500000240000001373311224565530027464 0ustar astrawstaff VisionEgg.PyroApps.AST_ext.AST_Visitor
Package VisionEgg :: Package PyroApps :: Module AST_ext :: Class AST_Visitor
[frames] | no frames]

Class AST_Visitor

source code

Instance Methods
 
__init__(self, modifying_AST) source code
 
traverse(self, AST_sublist, assign_name, assign_val_subtree) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ColorCalGUI-module.html0000644000076500000240000001627411224565530026236 0ustar astrawstaff VisionEgg.PyroApps.ColorCalGUI
Package VisionEgg :: Package PyroApps :: Module ColorCalGUI
[frames] | no frames]

Module ColorCalGUI

source code

Handle luminance and color calibration stimulus (client-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  ColorCalMetaParameters
  ColorCalControlFrame
Functions
 
get_control_list() source code
Variables
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ColorCalGUI-pysrc.html0000644000076500000240000022561711224565530026114 0ustar astrawstaff VisionEgg.PyroApps.ColorCalGUI
Package VisionEgg :: Package PyroApps :: Module ColorCalGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.ColorCalGUI

 1  #!/usr/bin/env python 
 2  # 
 3  # The Vision Egg: ColorCalGUI 
 4  # 
 5  # Copyright (C) 2001-2003 Andrew Straw. 
 6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
 7  # URL: <http://www.visionegg.org/> 
 8  # 
 9  # Distributed under the terms of the GNU Lesser General Public License 
10  # (LGPL). See LICENSE.TXT that came with this file. 
11  # 
12  # $Id$ 
13   
14  """Handle luminance and color calibration stimulus (client-side)""" 
15   
16  import VisionEgg, string 
17  __version__ = VisionEgg.release_name 
18  __cvs__ = string.split('$Revision$')[1] 
19  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
21   
22  import sys, os 
23  import Tkinter 
24  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
25   
27 return [("color_cal_server",ColorCalControlFrame,ColorCalControlFrame.title)]
28
30 - def __init__(self):
31 self.color = (1.0, 1.0, 1.0, 0.0)
32
33 -class ColorCalControlFrame(client_utils.StimulusControlFrame):
34 title = "Color Calibration"
35 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
36 client_utils.StimulusControlFrame.__init__(self, 37 master, 38 suppress_go_buttons, 39 ColorCalControlFrame.title, 40 ColorCalMetaParameters, 41 **kw) 42 43 param_frame = self.param_frame # shorthand for self.param_frame created in base class 44 45 # Allow columns to expand 46 param_frame.columnconfigure(0,weight=1) 47 param_frame.columnconfigure(1,weight=1) 48 49 pf_row = 0 50 Tkinter.Label(param_frame,text="Red:").grid(row=pf_row,column=0) 51 self.red_tk_var = Tkinter.DoubleVar() 52 self.red_tk_var.set(self.meta_params.color[0]) 53 self.make_callback_entry(textvariable=self.red_tk_var).grid(row=pf_row,column=1) 54 55 pf_row += 1 56 Tkinter.Label(param_frame,text="Green:").grid(row=pf_row,column=0) 57 self.green_tk_var = Tkinter.DoubleVar() 58 self.green_tk_var.set(self.meta_params.color[1]) 59 self.make_callback_entry(textvariable=self.green_tk_var).grid(row=pf_row,column=1) 60 61 pf_row += 1 62 Tkinter.Label(param_frame,text="Blue:").grid(row=pf_row,column=0) 63 self.blue_tk_var = Tkinter.DoubleVar() 64 self.blue_tk_var.set(self.meta_params.color[2]) 65 self.make_callback_entry(textvariable=self.blue_tk_var).grid(row=pf_row,column=1)
66
67 - def get_shortname(self):
68 return "color_cal"
69
70 - def update_tk_vars(self):
71 self.red_tk_var.set( self.meta_params.color[0] ) 72 self.green_tk_var.set( self.meta_params.color[1] ) 73 self.blue_tk_var.set( self.meta_params.color[2] )
74
75 - def send_values(self,dummy_arg=None):
76 self.meta_params.color = ( self.red_tk_var.get(), 77 self.green_tk_var.get(), 78 self.blue_tk_var.get(), 79 0.0 ) 80 81 if self.connected: 82 self.meta_controller.set_parameters( self.meta_params )
83
84 - def get_duration_sec(self):
85 return 0.0
86 87 if __name__=='__main__': 88 frame = ColorCalControlFrame() 89 frame.pack(expand=1,fill=Tkinter.BOTH) 90 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 91 frame.mainloop() 92

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html0000644000076500000240000005720211224565530032063 0ustar astrawstaff VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame
Package VisionEgg :: Package PyroApps :: Module ColorCalGUI :: Class ColorCalControlFrame
[frames] | no frames]

Class ColorCalControlFrame

source code

      Tkinter.Misc --+                
                     |                
    Tkinter.BaseWidget --+            
                         |            
          Tkinter.Pack --+            
                         |            
         Tkinter.Place --+            
                         |            
          Tkinter.Grid --+            
                         |            
            Tkinter.Widget --+        
                             |        
                 Tkinter.Frame --+    
                                 |    
EPhysGUIUtils.StimulusControlFrame --+
                                     |
                                    ColorCalControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, **kw) source code
 
get_shortname(self)
Used as basename for saving parameter files and other ID purposes
source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code

Inherited from EPhysGUIUtils.StimulusControlFrame: connect, get_loopable_variable_names, get_matlab_string, get_parameters_as_m_strings, get_parameters_as_py_strings, get_parameters_dict, go, make_callback_entry, quit_server, set_loopable_variable, set_param_dict, set_parameters_dict, standalone_connect

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables
  title = "Color Calibration"

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, **kw)
(Constructor)

source code 
Overrides: EPhysGUIUtils.StimulusControlFrame.__init__

get_shortname(self)

source code 
Used as basename for saving parameter files and other ID purposes

Overrides: EPhysGUIUtils.StimulusControlFrame.get_shortname
(inherited documentation)

update_tk_vars(self)

source code 
Update Tkinter variables with (new) values from meta_params

Overrides: EPhysGUIUtils.StimulusControlFrame.update_tk_vars
(inherited documentation)

send_values(self, dummy_arg=None)

source code 
Update meta_params variables with values from Tkinter fields

Overrides: EPhysGUIUtils.StimulusControlFrame.send_values
(inherited documentation)

get_duration_sec(self)

source code 
Calculate total duration in go loop

Overrides: EPhysGUIUtils.StimulusControlFrame.get_duration_sec
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ColorCalGUI.ColorCalMetaParameters-class.html0000644000076500000240000001227111224565530032377 0ustar astrawstaff VisionEgg.PyroApps.ColorCalGUI.ColorCalMetaParameters
Package VisionEgg :: Package PyroApps :: Module ColorCalGUI :: Class ColorCalMetaParameters
[frames] | no frames]

Class ColorCalMetaParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ColorCalServer-module.html0000644000076500000240000002031011224565530027042 0ustar astrawstaff VisionEgg.PyroApps.ColorCalServer
Package VisionEgg :: Package PyroApps :: Module ColorCalServer
[frames] | no frames]

Module ColorCalServer

source code

Handle luminance and color calibration stimulus (server-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  ColorCalMetaController
Functions
 
get_meta_controller_class() source code
 
make_stimuli() source code
 
get_meta_controller_stimkey() source code
Variables
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ColorCalServer-pysrc.html0000644000076500000240000022172711224565530026734 0ustar astrawstaff VisionEgg.PyroApps.ColorCalServer
Package VisionEgg :: Package PyroApps :: Module ColorCalServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.ColorCalServer

 1  #!/usr/bin/env python 
 2  # 
 3  # The Vision Egg: ColorCalServer 
 4  # 
 5  # Copyright (C) 2001-2003 Andrew Straw. 
 6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
 7  # URL: <http://www.visionegg.org/> 
 8  # 
 9  # Distributed under the terms of the GNU Lesser General Public License 
10  # (LGPL). See LICENSE.TXT that came with this file. 
11  # 
12  # $Id$ 
13   
14  """Handle luminance and color calibration stimulus (server-side)""" 
15   
16  import VisionEgg, string 
17  __version__ = VisionEgg.release_name 
18  __cvs__ = string.split('$Revision$')[1] 
19  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
21   
22  import sys, os, math 
23  import VisionEgg.Core 
24  import VisionEgg.FlowControl 
25  import VisionEgg.PyroHelpers 
26  import Pyro.core 
27  import pygame, pygame.locals 
28   
29  from VisionEgg.PyroApps.ColorCalGUI import ColorCalMetaParameters 
30   
31 -class ColorCalMetaController( Pyro.core.ObjBase ):
32 - def __init__(self,screen,presentation,stimuli):
33 Pyro.core.ObjBase.__init__(self) 34 self.meta_params = ColorCalMetaParameters() 35 if not isinstance(screen,VisionEgg.Core.Screen): 36 raise ValueError("Expecting instance of VisionEgg.Core.Screen") 37 if not isinstance(presentation,VisionEgg.FlowControl.Presentation): 38 raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") 39 40 self.screen = screen 41 self.p = presentation 42 43 self.update() # set stimulus parameters to initial defaults
44
45 - def get_parameters(self):
46 return self.meta_params
47
48 - def set_parameters(self, new_parameters):
49 if isinstance(new_parameters, ColorCalMetaParameters): 50 self.meta_params = new_parameters 51 else: 52 raise ValueError("Argument to set_parameters must be instance of ColorCalMetaParameters") 53 self.update()
54
55 - def update(self):
56 self.screen.parameters.bgcolor = self.meta_params.color
57
58 - def go(self):
59 pass
60
61 - def quit_server(self):
62 self.p.parameters.quit = 1
63 66
67 -def make_stimuli():
68 return []
69
71 return "color_cal_server"
72 73 # Don't do anything unless this script is being run 74 if __name__ == '__main__': 75 76 pyro_server = VisionEgg.PyroHelpers.PyroServer() 77 78 screen = VisionEgg.Core.Screen.create_default() 79 80 # get Vision Egg stimulus ready to go 81 p = VisionEgg.FlowControl.Presentation() 82 83 stimuli = make_stimuli() 84 85 # now hand over control of grating and mask to FlatGratingExperimentMetaController 86 meta_controller = ColorCalMetaController(screen,p,stimuli) 87 pyro_server.connect(meta_controller,get_meta_controller_stimkey()) 88 89 # get listener controller and register it 90 p.add_controller(None,None, pyro_server.create_listener_controller()) 91 92 # enter endless loop 93 p.run_forever() 94

././@LongLink0000000000000000000000000000014700000000000011710 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.ht0000644000076500000240000002531011224565530032706 0ustar astrawstaff VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController
Package VisionEgg :: Package PyroApps :: Module ColorCalServer :: Class ColorCalMetaController
[frames] | no frames]

Class ColorCalMetaController

source code

Pyro.core.ObjBase --+
                    |
                   ColorCalMetaController

Instance Methods
 
__init__(self, screen, presentation, stimuli) source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, screen, presentation, stimuli)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.DropinGUI-module.html0000644000076500000240000001354011224565530025764 0ustar astrawstaff VisionEgg.PyroApps.DropinGUI
Package VisionEgg :: Package PyroApps :: Module DropinGUI
[frames] | no frames]

Module DropinGUI

source code

Classes
  DropinMetaParameters
  DropinControlFrame
Functions
 
get_control_list() source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.DropinGUI-pysrc.html0000644000076500000240000022035711224565530025645 0ustar astrawstaff VisionEgg.PyroApps.DropinGUI
Package VisionEgg :: Package PyroApps :: Module DropinGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.DropinGUI

  1  # The Vision Egg: DropinGUI 
  2  # 
  3  # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd, Andrew Straw 
  4  # Copyright (C) 2004 California Institute of Technology 
  5  # 
  6  # Authors: Imran S. Ali, Lachlan Dowd, Andrew Straw 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  import VisionEgg, string 
 15  import sys, os 
 16  import Tkinter 
 17  import tkMessageBox 
 18  import VisionEgg.PyroApps.VarTypes as VarTypes 
 19  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
 20   
21 -def get_control_list():
22 return [("dropin_server",DropinControlFrame,DropinControlFrame.title)]
23
25 - def __init__(self):
26 self.vars_list = []
27
28 -class DropinControlFrame(client_utils.StimulusControlFrame):
29 title = "Vision Egg Script" 30
31 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
32 client_utils.StimulusControlFrame.__init__(self, 33 master, 34 suppress_go_buttons, 35 DropinControlFrame.title, 36 DropinMetaParameters, 37 **kw) 38 39 param_frame = self.param_frame # shorthand for self.param_frame created in base class 40 param_frame.columnconfigure(0,weight=1) 41 param_frame.columnconfigure(1,weight=1) 42 self.vars_list = [] 43 self.error_names = []
44
45 - def get_shortname(self):
46 return "dropin"
47
48 - def update_tk_vars(self):
49 pass
50 51
52 - def send_values(self,dummy_arg=None):
53 54 self.meta_params.vars_list = [] 55 self.error_names = [] 56 57 if self.vars_list is None: 58 return 0 59 60 for var in self.vars_list: 61 if len(var) == 3: 62 var_type = var[0] 63 var_name = var[1] 64 var_val_holder = var[2] 65 var_val = var_val_holder.get() 66 try: 67 if var_val == "compound": 68 pass 69 else: 70 if VarTypes.getType(var_type) == "float": 71 var_typed_val = float(var_val) 72 elif VarTypes.getType(var_type) == "integer": 73 var_typed_val = int(float(var_val)) 74 elif VarTypes.getType(var_type) == "string": 75 var_typed_val = var_val 76 else: 77 raise ValueError() 78 self.meta_params.vars_list.append([var_name, var_typed_val]) 79 except ValueError: 80 self.error_names.append(var_name) 81 82 83 84 if len(self.error_names) == 0: 85 self.meta_controller.set_parameters( self.meta_params ) 86 return 1 87 else: 88 all_error_names = "Invalid value(s) for the following variable(s):\n" 89 for error_name in self.error_names: 90 all_error_names = all_error_names + error_name + "\n" 91 tkMessageBox.showerror("Invalid value(s)", all_error_names) 92 return 0
93
94 - def get_duration_sec(self):
95 # XXX not implemented yet 96 return -1
97 98 # Creates the variable Entry and Label widgets:
99 - def gen_var_widgets(self, demoscript_filename, vars_list):
100 self.vars_list = vars_list 101 param_frame = self.param_frame # shorthand for self.param_frame created in base class 102 if demoscript_filename is None: 103 label = "No demo file loaded" 104 else: 105 label = demoscript_filename 106 Tkinter.Label(param_frame, 107 text=label, 108 font=("Helvetica",8,"bold")).grid(row=0,columnspan=2) 109 row_num = 1 110 111 if self.vars_list is None: 112 return 113 for var in self.vars_list: 114 var_label = Tkinter.Label(param_frame,text=var[1]).grid(row=row_num,column=0) 115 # Create a Tkinter string variable holder: 116 var_val_holder = Tkinter.StringVar() 117 # Set to its value: 118 var_val_holder.set(var[2]) 119 # Create (indirectly) Entry widgets: 120 # Render variables which were "not found" as non-modifiable for user: 121 if var[2] == "not found": 122 self.make_callback_entry(textvariable=var_val_holder, state="disabled").grid(row=row_num,column=1) 123 del var[2] 124 else: 125 self.make_callback_entry(textvariable=var_val_holder).grid(row=row_num,column=1) 126 var[2] = var_val_holder 127 row_num = row_num + 1
128 129 if __name__=='__main__': 130 frame = DropinControlFrame() 131 frame.pack(expand=1,fill=Tkinter.BOTH) 132 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 133 frame.mainloop() 134

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html0000644000076500000240000006052311224565530031355 0ustar astrawstaff VisionEgg.PyroApps.DropinGUI.DropinControlFrame
Package VisionEgg :: Package PyroApps :: Module DropinGUI :: Class DropinControlFrame
[frames] | no frames]

Class DropinControlFrame

source code

      Tkinter.Misc --+                
                     |                
    Tkinter.BaseWidget --+            
                         |            
          Tkinter.Pack --+            
                         |            
         Tkinter.Place --+            
                         |            
          Tkinter.Grid --+            
                         |            
            Tkinter.Widget --+        
                             |        
                 Tkinter.Frame --+    
                                 |    
EPhysGUIUtils.StimulusControlFrame --+
                                     |
                                    DropinControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, **kw) source code
 
get_shortname(self)
Used as basename for saving parameter files and other ID purposes
source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code
 
gen_var_widgets(self, demoscript_filename, vars_list) source code

Inherited from EPhysGUIUtils.StimulusControlFrame: connect, get_loopable_variable_names, get_matlab_string, get_parameters_as_m_strings, get_parameters_as_py_strings, get_parameters_dict, go, make_callback_entry, quit_server, set_loopable_variable, set_param_dict, set_parameters_dict, standalone_connect

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables
  title = "Vision Egg Script"

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, **kw)
(Constructor)

source code 
Overrides: EPhysGUIUtils.StimulusControlFrame.__init__

get_shortname(self)

source code 
Used as basename for saving parameter files and other ID purposes

Overrides: EPhysGUIUtils.StimulusControlFrame.get_shortname
(inherited documentation)

update_tk_vars(self)

source code 
Update Tkinter variables with (new) values from meta_params

Overrides: EPhysGUIUtils.StimulusControlFrame.update_tk_vars
(inherited documentation)

send_values(self, dummy_arg=None)

source code 
Update meta_params variables with values from Tkinter fields

Overrides: EPhysGUIUtils.StimulusControlFrame.send_values
(inherited documentation)

get_duration_sec(self)

source code 
Calculate total duration in go loop

Overrides: EPhysGUIUtils.StimulusControlFrame.get_duration_sec
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.DropinGUI.DropinMetaParameters-class.html0000644000076500000240000001224111224565530031666 0ustar astrawstaff VisionEgg.PyroApps.DropinGUI.DropinMetaParameters
Package VisionEgg :: Package PyroApps :: Module DropinGUI :: Class DropinMetaParameters
[frames] | no frames]

Class DropinMetaParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.DropinServer-module.html0000644000076500000240000001555611224565530026617 0ustar astrawstaff VisionEgg.PyroApps.DropinServer
Package VisionEgg :: Package PyroApps :: Module DropinServer
[frames] | no frames]

Module DropinServer

source code

Classes
  DropinMetaController
Functions
 
get_meta_controller_class() source code
 
make_stimuli() source code
 
get_meta_controller_stimkey() source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.DropinServer-pysrc.html0000644000076500000240000014050311224565530026461 0ustar astrawstaff VisionEgg.PyroApps.DropinServer
Package VisionEgg :: Package PyroApps :: Module DropinServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.DropinServer

 1  # The Vision Egg: DropinServer 
 2  # 
 3  # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd, Andrew Straw 
 4  # Copyright (C) 2004 California Institute of Technology 
 5  # 
 6  # Authors: Imran S. Ali, Lachlan Dowd, Andrew Straw 
 7  # URL: <http://www.visionegg.org/> 
 8  # 
 9  # Distributed under the terms of the GNU Lesser General Public License 
10  # (LGPL). See LICENSE.TXT that came with this file. 
11  # 
12  # $Id$ 
13   
14  import VisionEgg, string 
15   
16  import sys, os, math 
17  import VisionEgg.Core 
18  import VisionEgg.FlowControl 
19  import VisionEgg.Textures 
20  import VisionEgg.SphereMap 
21  import VisionEgg.PyroHelpers 
22  import Pyro.core 
23   
24  from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController 
25  from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters 
26  from VisionEgg.PyroApps.DropinGUI import DropinMetaParameters 
27   
28 -class DropinMetaController( Pyro.core.ObjBase ):
29 - def __init__(self,screen,presentation,stimuli):
30 Pyro.core.ObjBase.__init__(self) 31 self.meta_params = DropinMetaParameters() 32 self.p = presentation 33 print 'DropinMetaController presentation',self.p
34
35 - def get_parameters(self):
36 return self.meta_params
37
38 - def set_parameters(self, new_parameters):
39 self.meta_params = new_parameters 40 self.update()
41
42 - def update(self):
43 pass
44
45 - def go(self):
46 self.p.parameters.enter_go_loop = 1
47
48 - def quit_server(self):
49 self.p.parameters.quit = 1
50 53
54 -def make_stimuli():
55 pass
56
58 return "dropin_server"
59

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html0000644000076500000240000002522211224565530032533 0ustar astrawstaff VisionEgg.PyroApps.DropinServer.DropinMetaController
Package VisionEgg :: Package PyroApps :: Module DropinServer :: Class DropinMetaController
[frames] | no frames]

Class DropinMetaController

source code

Pyro.core.ObjBase --+
                    |
                   DropinMetaController

Instance Methods
 
__init__(self, screen, presentation, stimuli) source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, screen, presentation, stimuli)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI-module.html0000644000076500000240000002564111224565530025566 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI
Package VisionEgg :: Package PyroApps :: Module EPhysGUI
[frames] | no frames]

Module EPhysGUI

source code

Classes
  ContainedObjectBase
Base class to encapsulate objects, provides useful methods when used in GUI
  ScrollListFrame
  Loop
  LoopContainedObject
Container for Loop class
  LoopParamDialog
  GammaFrame
  ImageSequenceLauncher
  AppWindow
  BarButton
Functions
 
get_server(hostname="", port=7766) source code
Variables
  __version__ = '1.1.dev'
  __cvs__ = '$Revision: 1455 $'.split() [1]
  __date__ = ' '.join('$Date: 2008-06-07 08:42:14 -0700 (Sat, 07...
  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
  client_list = []
Variables Details

__date__

Value:
' '.join('$Date: 2008-06-07 08:42:14 -0700 (Sat, 07 Jun 2008) $'.split\
() [1: 3])

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI-pysrc.html0000644000076500000240000304745311224565530025451 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI
Package VisionEgg :: Package PyroApps :: Module EPhysGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.EPhysGUI

   1  #!/usr/bin/env python 
   2  # 
   3  # The Vision Egg: EPhysGUI 
   4  # 
   5  # Copyright (C) 2001-2004 Andrew Straw. 
   6  # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd 
   7  # Copyright (C) 2004, 2008 California Institute of Technology 
   8  # 
   9  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  10  # URL: <http://www.visionegg.org/> 
  11  # 
  12  # Distributed under the terms of the GNU Lesser General Public License 
  13  # (LGPL). See LICENSE.TXT that came with this file. 
  14  # 
  15  # $Id: EPhysGUI.py 1455 2008-06-07 15:42:14Z astraw $ 
  16   
  17  import VisionEgg 
  18  __version__ = VisionEgg.release_name 
  19  __cvs__ = '$Revision: 1455 $'.split()[1] 
  20  __date__ = ' '.join('$Date: 2008-06-07 08:42:14 -0700 (Sat, 07 Jun 2008) $'.split()[1:3]) 
  21  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
  22   
  23  import sys, socket, re, time, string, types, os 
  24  import parser, symbol, token, compiler 
  25  import pickle, random, math, threading 
  26  import Tkinter, tkMessageBox, tkSimpleDialog, tkFileDialog 
  27  import StringIO 
  28  import Pyro 
  29  import numpy 
  30   
  31  import VisionEgg 
  32  import VisionEgg.PyroClient 
  33  import VisionEgg.PyroApps.ScreenPositionGUI 
  34  import VisionEgg.GUI 
  35  import VisionEgg.ParameterTypes as ve_types 
  36   
  37  # Add your client modules here 
  38  import VisionEgg.PyroApps.TargetGUI 
  39  import VisionEgg.PyroApps.MouseTargetGUI 
  40  import VisionEgg.PyroApps.FlatGratingGUI 
  41  import VisionEgg.PyroApps.SphereGratingGUI 
  42  import VisionEgg.PyroApps.SpinningDrumGUI 
  43  import VisionEgg.PyroApps.GridGUI 
  44  import VisionEgg.PyroApps.ColorCalGUI 
  45   
  46  import VisionEgg.PyroApps.DropinGUI 
  47  import VisionEgg.PyroApps.AST_ext as AST_ext 
  48  import VisionEgg.PyroApps.VarTypes as VarTypes 
  49   
  50  client_list = [] 
  51  client_list.extend( VisionEgg.PyroApps.TargetGUI.get_control_list() ) 
  52  client_list.extend( VisionEgg.PyroApps.MouseTargetGUI.get_control_list() ) 
  53  client_list.extend( VisionEgg.PyroApps.FlatGratingGUI.get_control_list() ) 
  54  client_list.extend( VisionEgg.PyroApps.SphereGratingGUI.get_control_list() ) 
  55  client_list.extend( VisionEgg.PyroApps.SpinningDrumGUI.get_control_list() ) 
  56  client_list.extend( VisionEgg.PyroApps.GridGUI.get_control_list() ) 
  57  client_list.extend( VisionEgg.PyroApps.ColorCalGUI.get_control_list() ) 
  58  client_list.extend( VisionEgg.PyroApps.DropinGUI.get_control_list() ) 
  59   
61 """Base class to encapsulate objects, provides useful methods when used in GUI"""
62 - def __init__(self):
63 raise RuntimeError("Abstract base class!")
64 - def get_str_30(self):
65 return "**** this is a generic str_30 ****"
66 - def get_contained(self):
67 return self.contained
68 header = "unknown parameters"
69
70 -class ScrollListFrame(Tkinter.Frame):
71 - def __init__(self,master=None,list_of_contained_objects=None,contained_objectbject_maker=None, 72 container_class=ContainedObjectBase, 73 **cnf):
74 Tkinter.Frame.__init__(self, master, **cnf) 75 if list_of_contained_objects is None: 76 self.list = [] 77 else: 78 self.list = list_of_contained_objects 79 self.container_class = container_class 80 81 # allow column to expand 82 self.columnconfigure(0,weight=1) 83 84 # The frame that has the list and the vscroll 85 self.frame = Tkinter.Frame(self,borderwidth=2) 86 self.frame.grid(row=0,sticky="nwes") 87 88 # allow column to expand 89 self.frame.columnconfigure(0,weight=1) 90 91 self.frame.vscroll = Tkinter.Scrollbar(self.frame,orient=Tkinter.VERTICAL) 92 self.frame.hscroll = Tkinter.Scrollbar(self.frame,orient=Tkinter.HORIZONTAL) 93 self.frame.title = Tkinter.Listbox( 94 self.frame, 95 relief=Tkinter.FLAT, 96 font=('courier',10,'bold'), 97 height=1, 98 # selectbackground='#eed5b7', 99 # selectborderwidth=0, 100 # selectmode=None, 101 exportselection=0) 102 self.frame.title.insert(Tkinter.END, self.container_class.header) 103 self.frame.list = Tkinter.Listbox( 104 self.frame, 105 relief=Tkinter.SUNKEN, 106 font=('courier',10,'normal'), 107 width=40, height=10, 108 selectbackground='#eed5b7', 109 selectborderwidth=0, 110 selectmode=Tkinter.BROWSE, 111 xscroll=self.frame.hscroll.set, 112 yscroll=self.frame.vscroll.set, 113 exportselection=0) 114 115 self.frame.hscroll['command'] = self.delegate_hscroll 116 self.frame.hscroll.grid(row=3,column=0,sticky='we') 117 self.frame.vscroll['command'] = self.frame.list.yview 118 self.frame.vscroll.grid(row=2,column=1,sticky='ns') 119 self.frame.title.grid(row=1,column=0,ipady=0,pady=0,sticky='we') 120 self.frame.list.grid(row=2,column=0,sticky='nwes') 121 self.frame.list.bind('<Double-Button-1>',self.edit_selected) 122 123 # The buttons on bottom 124 self.bar = Tkinter.Frame(self,borderwidth=2) 125 self.bar.grid(row=1,sticky="we") 126 self.bar.add = Tkinter.Button(self.bar,text='Add...',command=self.add_new) 127 self.bar.add.grid(row=0,column=0,sticky='we') 128 self.bar.edit = Tkinter.Button(self.bar,text='Edit...',command=self.edit_selected) 129 self.bar.edit.grid(row=0,column=1,sticky='we') 130 self.bar.remove = Tkinter.Button(self.bar,text='Remove',command=self.remove_selected) 131 self.bar.remove.grid(row=0,column=2,sticky='we') 132 self.bar.move_up = Tkinter.Button(self.bar,text='Up',command=self.move_selected_up) 133 self.bar.move_up.grid(row=0,column=3,sticky='we') 134 self.bar.move_down = Tkinter.Button(self.bar,text='Down',command=self.move_selected_down) 135 self.bar.move_down.grid(row=0,column=4,sticky='we') 136 self.bar.tk_menuBar(self.bar.add,self.bar.remove) 137 #Lachie- My bar for setting parent 138 self.bar.merge = Tkinter.Button(self.bar,text='Merge/Unmerge',command=self.make_merge) 139 self.bar.merge.grid(row=0,column=5,sticky='we') 140 self.bar.tk_menuBar(self.bar.add,self.bar.remove) 141 self.update_now()
142
143 - def list2D_coordinates(self, main_index, main_list):
144 # This is a function for finding the 2-d 145 # list coordinates of an element which may be inside a 146 # list-nested-list. 147 # eg. if x = [[e, e, e], [e], [e, e]] 148 # Then the coordinates of the element at index 4 is: (2, 0) 149 # 150 # Initialization: 151 i = -1 152 j = -1 153 element_count = 0 154 # Main body: 155 for nested_list in main_list: 156 j = -1 157 i = i + 1 158 for element in nested_list: 159 j = j + 1 160 element_count = element_count + 1 161 if (element_count - 1) == main_index: 162 return [i, j] 163 # Unsuccessful exit: 164 return [-1, -1]
165
166 - def delegate_hscroll(self,*args,**kw):
167 self.frame.title.xview(*args,**kw) 168 self.frame.list.xview(*args,**kw)
169
170 - def get_list_uncontained(self):
171 results = [] 172 for contained_object_item in self.list: 173 #results.append( contained_object_item.get_contained() ) 174 results.append( contained_object_item ) 175 return results
176
177 - def update_now(self):
178 self.frame.list.delete(0,Tkinter.END) 179 max_len = 0 180 for loop_container in self.list: 181 for loop in loop_container: 182 item_str_30 = loop.get_str_30() 183 max_len = max(max_len,len(item_str_30)) 184 self.frame.list.insert(Tkinter.END,item_str_30) 185 self.frame.list.insert(Tkinter.END,"") 186 self.frame.title.delete(0,Tkinter.END) 187 self.frame.title.insert(Tkinter.END, self.container_class.header.ljust(max_len))
188
189 - def add_new(self):
190 contained_object = self.make_contained_object(self.container_class) 191 if contained_object: 192 self.list.append( [contained_object] ) 193 self.update_now()
194
195 - def edit_selected(self,dummy_arg=None):
196 selected = self.get_selected() 197 # Get 2-D list coordinates of selected object of class "LoopContainedObject": 198 loop_coordinates = self.list2D_coordinates(selected, self.list) 199 main_list_index = loop_coordinates[0] 200 loop_list_index = loop_coordinates[1] 201 if selected is not None: 202 if len(self.list[main_list_index]) == 1: 203 orig_contained_object = self.list[main_list_index][loop_list_index] 204 modified_contained_object = self.edit_contained_object( orig_contained_object ) 205 if modified_contained_object is not None: # "Cancel" press results in None 206 self.list[main_list_index][loop_list_index] = modified_contained_object 207 self.update_now() 208 else: 209 tkMessageBox.showerror("Cannot edit this variable", "This variable needs to be isolated/unmerged")
210
211 - def remove_selected(self):
212 selected = self.get_selected() 213 # Get 2-D list coordinates of selected object of class "LoopContainedObject": 214 loop_coordinates = self.list2D_coordinates(selected, self.list) 215 main_list_index = loop_coordinates[0] 216 loop_list_index = loop_coordinates[1] 217 if selected is not None: 218 del self.list[main_list_index][loop_list_index] 219 if self.list[main_list_index] == []: 220 del self.list[main_list_index] 221 self.update_now()
222
223 - def move_selected_up(self,dummy_arg=None):
224 selected = self.get_selected() 225 # Get 2-D list coordinates of selected object of class "LoopContainedObject": 226 loop_coordinates = self.list2D_coordinates(selected, self.list) 227 main_list_index = loop_coordinates[0] 228 loop_list_index = loop_coordinates[1] 229 new_selected_index = selected 230 if selected is not None: 231 # If the selected variable is first in its "loop_list": 232 if loop_list_index == 0: 233 # If not the first "loop_list": 234 if main_list_index != 0: 235 # Then we move up the entire "loop_list": 236 selected_loop_list = self.list[main_list_index] 237 del self.list[main_list_index] 238 new_main_list_index = main_list_index - 1 239 self.list.insert(new_main_list_index, selected_loop_list) 240 new_selected_index = selected - len(self.list[main_list_index]) 241 self.update_now() 242 243 # Else we just move up a variable within a "loop_list": 244 else: 245 selected_loop_container = self.list[main_list_index][loop_list_index] 246 del self.list[main_list_index][loop_list_index] 247 new_loop_list_index = loop_list_index - 1 248 self.list[main_list_index].insert(new_loop_list_index, selected_loop_container) 249 new_selected_index = selected - 1 250 self.update_now() 251 252 new_selected_index = self.map_to_listbox_index(new_selected_index) 253 self.frame.list.selection_set(new_selected_index)
254
255 - def move_selected_down(self,dummy_arg=None):
256 selected = self.get_selected() 257 # Get 2-D list coordinates of selected object of class "LoopContainedObject": 258 loop_coordinates = self.list2D_coordinates(selected, self.list) 259 main_list_index = loop_coordinates[0] 260 loop_list_index = loop_coordinates[1] 261 new_selected_index = selected 262 if selected is not None: 263 # If the selected variable is last in its "loop_list": 264 if loop_list_index == (len(self.list[main_list_index]) - 1): 265 # If not the last "loop_list": 266 if main_list_index != (len(self.list) - 1): 267 # Then we move down the entire "loop_list": 268 selected_loop_list = self.list[main_list_index] 269 del self.list[main_list_index] 270 new_main_list_index = main_list_index + 1 271 self.list.insert(new_main_list_index, selected_loop_list) 272 new_selected_index = selected + len(self.list[main_list_index]) 273 self.update_now() 274 275 # Else we just move down a variable within a "loop_list": 276 #elif loop_list_index != (len(self.list[main_list_index]) - 1): 277 else: 278 selected_loop_container = self.list[main_list_index][loop_list_index] 279 del self.list[main_list_index][loop_list_index] 280 new_loop_list_index = loop_list_index + 1 281 self.list[main_list_index].insert(new_loop_list_index, selected_loop_container) 282 new_selected_index = selected + 1 283 self.update_now() 284 #else: 285 #tkMessageBox.showerror("Cannot move this variable down", "Select unmerge instead") 286 287 new_selected_index = self.map_to_listbox_index(new_selected_index) 288 self.frame.list.selection_set(new_selected_index)
289 290 291 292 293 294 295
296 - def make_merge(self):
297 # Notes: 298 # "self.list" is a list of lists, each of which, a 299 # "loop_list", contains "LoopContainedObject" class objects: 300 # eg. [[a], [b, c], [d]] 301 selected = self.get_selected() 302 303 merge_error = 0 304 merge_error_msg = "" 305 306 # The purpose of this function is to "merge" selected objects of class 307 # "LoopContainedObject" into a preceding list: 308 # eg. [[a], [b, c], [d]] => [[a], [b, c, d]]] 309 # where selected 'd' was "merged" into preceding list. 310 # Note, this function can also perform the reverse, provided that the 311 # the selected object of class "LoopContainedObject" is the LAST one 312 # in its "loop_list". 313 # Supported cases: 314 # [[a], [b*, c], [d]] => [[a, b, c], [d]] merge 315 # [[a], [b, c*], [d]] => [[a], [b], [c, d]] unmerge 316 # Unsupported cases: 317 # [[a], [b, c*, d], [e]] => cannot unmerge! 318 319 # Get 2-D list coordinates of selected object of class "LoopContainedObject": 320 loop_coordinates = self.list2D_coordinates(selected, self.list) 321 main_list_index = loop_coordinates[0] 322 loop_list_index = loop_coordinates[1] 323 324 # Checking that an item is actually selected: 325 if selected is not None: 326 327 selected_loop_list = self.list[main_list_index] 328 selected_loop_container = selected_loop_list[loop_list_index] 329 preceding_loop_container = self.list[main_list_index - 1][0] 330 331 # Trying to perform merge? 332 if loop_list_index == 0: 333 334 # Ensure selected "LoopContainerObject" is not in first "loop_list": 335 if main_list_index > 0: 336 337 # Can only carry out merge if "Loop" object sequence lengths are 338 # the same length within a "loop_list": 339 if len(selected_loop_container.contained.parameters.sequence) == len(preceding_loop_container.contained.parameters.sequence): 340 341 # Perform the merge. All variables that are currently merged with the selected variable, 342 # are merged with the new variable(s) as well. 343 i = 0 344 max_index = len(selected_loop_list) 345 while i < max_index: 346 dummy_loop_container = selected_loop_list[0] 347 del self.list[main_list_index][0] 348 self.list[main_list_index - 1].append(dummy_loop_container) 349 i = i + 1 350 351 # Remove the selected "loop_list" if it is now empty: 352 if self.list[main_list_index] == []: 353 del self.list[main_list_index] 354 355 else: 356 merge_error = 1 357 merge_error_msg = "Cannot merge variables with different sequence lengths" 358 359 else: 360 merge_error = 3 361 #merge_error_msg = "Variable is at the top level" 362 363 # Trying to perform an "unmerge": 364 else: 365 366 # Ensure selected "LoopContainerObject" is last object in its "loop_list": 367 if loop_list_index == (len(selected_loop_list) - 1): 368 369 # Perform the unmerge: 370 del self.list[main_list_index][loop_list_index] 371 self.list.insert((main_list_index + 1), [selected_loop_container]) 372 373 else: 374 merge_error = 2 375 merge_error_msg = "Unmerge lowest variable in this cluster first" 376 377 if merge_error == 1: 378 tkMessageBox.showerror("Cannot perform merge", merge_error_msg) 379 elif merge_error == 2: 380 tkMessageBox.showerror("Cannot perform unmerge", merge_error_msg) 381 elif merge_error == 3: 382 # non critical errors 383 pass 384 else: 385 #debugger: 386 #print len(self.list) 387 #print "" 388 #for x in self.list: 389 # print len(x) 390 #print "--------------" 391 self.update_now()
392 393 394
395 - def make_contained_object(self, container_class):
396 """Factory function for ContainedObjectBase""" 397 if container_class == LoopContainedObject: 398 return self.make_loop_contained_object() 399 params = {} 400 p = container_class.contained_class.parameters_and_defaults 401 keys = p.keys() 402 keys.sort() 403 for pname in keys: 404 if p[pname][1] == ve_types.String: 405 params[pname] = tkSimpleDialog.askstring(pname,pname,initialvalue=p[pname][0]) 406 elif p[pname][1] == ve_types.Integer: 407 params[pname] = tkSimpleDialog.askinteger(pname,pname,initialvalue=p[pname][0]) 408 elif p[pname][1] == ve_types.Real: 409 params[pname] = tkSimpleDialog.askfloat(pname,pname,initialvalue=p[pname][0]) 410 elif p[pname][1] == ve_types.Sequence: 411 params[pname] = eval("["+tkSimpleDialog.askstring(pname,pname,initialvalue="1,2,3")+"]") 412 if type(params[pname]) is not types.ListType: 413 raise ValueError("You must enter a list in the form of '[1,2,3]'") 414 else: 415 raise NotImplementedError("Don't know about type %s"%(p[pname][1],)) 416 if params[pname] is None: 417 raise RuntimeError("Input cancelled") 418 contained = container_class.contained_class(**params) # call constructor 419 return container_class(contained)
420
421 - def edit_contained_object(self, contained_object):
422 if not isinstance(contained_object,LoopContainedObject): 423 raise NotImplementedError("") 424 orig_contained = contained_object.get_contained() 425 d = LoopParamDialog(self, title="Loop Parameters", orig_values=orig_contained ) 426 if d.result: 427 return LoopContainedObject(d.result) 428 else: 429 return
430
431 - def make_loop_contained_object(self):
432 d = LoopParamDialog(self, title="Loop Parameters" ) 433 if d.result: 434 return LoopContainedObject(d.result) 435 else: 436 return
437 438 # Returns index of selected item ignoring blank listbox entries: 439 # eg. if listbox had: 440 # 441 # 0 a 442 # 1 b 443 # 2 444 # 3 c 445 # 4 d 446 # 447 # Then the index of element 'c' would be 2
448 - def get_selected(self):
449 items = self.frame.list.curselection() 450 try: 451 items = map(int, items) 452 453 except ValueError: pass 454 if len(items) > 0: 455 selected_item_index = items[0] 456 if self.frame.list.get(selected_item_index) != "": 457 blankentrycount = 0 458 i = 0 459 while i < selected_item_index: 460 if self.frame.list.get(i) == "": 461 blankentrycount = blankentrycount + 1 462 i = i + 1 463 return (selected_item_index - blankentrycount) 464 465 return None
466 467 468 # Performs reverse of above: 469 # eg. if listbox had: 470 # 471 # 0 a 472 # 1 b 473 # 2 474 # 3 c 475 # 4 d 476 # 477 # Then "mapping" of given index 2 would result in return value of 3
478 - def map_to_listbox_index(self, index):
479 validentrycount = 0 480 i = 0 481 while i < self.frame.list.size(): 482 if self.frame.list.get(i) != "": 483 validentrycount = validentrycount + 1 484 if validentrycount == (index + 1): 485 return i 486 i = i + 1 487 return -1
488 ################################################### 489
490 -class Loop(VisionEgg.ClassWithParameters):
491 parameters_and_defaults = {'variable':('<repeat>', 492 ve_types.String), 493 'sequence':([1, 1, 1], 494 ve_types.Sequence(ve_types.Real)), 495 'rest_duration_sec':(1.0, 496 ve_types.Real)} 497 __slots__ = ( 498 'num_done', 499 ) 500 501
502 - def __init__(self,**kw):
503 VisionEgg.ClassWithParameters.__init__(self,**kw) 504 self.num_done = 0
505 - def is_done(self):
506 return self.num_done >= len(self.parameters.sequence)
507 - def get_current(self):
508 return self.parameters.sequence[self.num_done]
509 - def advance(self):
510 self.num_done += 1
511 - def reset(self):
512 self.num_done = 0
513
514 -class LoopContainedObject(ContainedObjectBase):
515 """Container for Loop class""" 516 contained_class = Loop 517 header = " variable rest N values"
518 - def __init__(self,contained):
519 self.contained = contained
520 - def get_str_30(self):
521 p = self.contained.parameters 522 seq_str = "" 523 for val in p.sequence: 524 seq_str += str(val) + " " 525 name_str = p.variable 526 if len(name_str) > 15: 527 name_str = name_str[:15] 528 return "% 15s % 4s % 4d % 4s"%(name_str, str(p.rest_duration_sec), len(p.sequence), seq_str)
529
530 -class LoopParamDialog(tkSimpleDialog.Dialog):
531 - def __init__(self,*args,**kw):
532 #intercept orig_values argument 533 if kw.has_key('orig_values'): 534 self.orig_values = kw['orig_values'] 535 del kw['orig_values'] 536 else: 537 self.orig_values = None 538 return tkSimpleDialog.Dialog.__init__(self, *args, **kw )
539
540 - def body(self,master):
541 Tkinter.Label(master, 542 text="Add sequence of automatic variable values", 543 font=("Helvetica",12,"bold"),).grid(row=0,column=0,columnspan=2) 544 545 var_frame = Tkinter.Frame(master, 546 relief=Tkinter.GROOVE, 547 borderwidth=2) 548 var_frame.grid(row=1,column=0) 549 550 sequence_frame = Tkinter.Frame(master) 551 sequence_frame.grid(row=1,column=1) 552 553 rest_dur_frame = Tkinter.Frame(master) 554 rest_dur_frame.grid(row=2,column=0,columnspan=2) 555 556 # loopable variable frame stuff 557 global loopable_variables 558 num_cols = int(math.ceil(len(loopable_variables)/10.0)) # 10 variables per column 559 560 var_frame_row = 0 561 Tkinter.Label(var_frame, 562 text="Select a variable", 563 font=("Helvetica",12,"bold"),).grid(row=var_frame_row, 564 column=0, 565 columnspan=num_cols) 566 567 self.var_name = Tkinter.StringVar() 568 self.var_name.set("<repeat>") 569 var_names = loopable_variables[:] # copy 570 var_names.sort() 571 572 var_frame_row += 1 573 Tkinter.Radiobutton( var_frame, 574 text="Repeat (Average)", 575 variable=self.var_name, 576 value="<repeat>", 577 anchor=Tkinter.W).grid(row=var_frame_row, 578 column=0, 579 sticky="w") 580 var_frame_row += 1 581 for var_name in var_names: 582 use_row = var_frame_row%10+1 583 Tkinter.Radiobutton( var_frame, 584 text=var_name, 585 variable=self.var_name, 586 value=var_name, 587 anchor=Tkinter.W).grid(row=use_row, 588 column=int(math.floor(var_frame_row/10.)), 589 sticky="w") 590 var_frame_row += 1 591 592 # sequence entry frame 593 seq_row = 0 594 Tkinter.Label(sequence_frame, 595 text="Sequence values", 596 font=("Helvetica",12,"bold"),).grid(row=seq_row,column=0,columnspan=2) 597 598 seq_row += 1 599 self.sequence_type = Tkinter.StringVar() 600 self.sequence_type.set("manual") 601 602 Tkinter.Radiobutton( sequence_frame, 603 text="Manual:", 604 variable=self.sequence_type, 605 value="manual", 606 anchor=Tkinter.W).grid(row=seq_row,column=0,sticky="w") 607 608 self.sequence_manual_string = Tkinter.StringVar() 609 self.sequence_manual_string.set("[1,2,3]") 610 Tkinter.Entry(sequence_frame, 611 textvariable=self.sequence_manual_string).grid(row=seq_row,column=1) 612 613 seq_row += 1 614 Tkinter.Radiobutton( sequence_frame, 615 text="Linear:", 616 variable=self.sequence_type, 617 value="linear", 618 anchor=Tkinter.W).grid(row=seq_row,column=0,sticky="w") 619 620 self.lin_start_tk = Tkinter.DoubleVar() 621 self.lin_start_tk.set(1.0) 622 self.lin_stop_tk = Tkinter.DoubleVar() 623 self.lin_stop_tk.set(100.0) 624 self.lin_n_tk = Tkinter.IntVar() 625 self.lin_n_tk.set(3) 626 627 lin_frame = Tkinter.Frame( sequence_frame) 628 lin_frame.grid(row=seq_row,column=1) 629 Tkinter.Label(lin_frame,text="start:").grid(row=0,column=0) 630 Tkinter.Entry(lin_frame,textvariable=self.lin_start_tk,width=6).grid(row=0,column=1) 631 Tkinter.Label(lin_frame,text=" stop:").grid(row=0,column=2) 632 Tkinter.Entry(lin_frame,textvariable=self.lin_stop_tk,width=6).grid(row=0,column=3) 633 Tkinter.Label(lin_frame,text=" N:").grid(row=0,column=4) 634 Tkinter.Entry(lin_frame,textvariable=self.lin_n_tk,width=6).grid(row=0,column=5) 635 636 seq_row += 1 637 Tkinter.Radiobutton( sequence_frame, 638 text="Log:", 639 variable=self.sequence_type, 640 value="log", 641 anchor=Tkinter.W).grid(row=seq_row,column=0,sticky="w") 642 643 self.log_start_tk = Tkinter.DoubleVar() 644 self.log_start_tk.set(-1.0) 645 self.log_stop_tk = Tkinter.DoubleVar() 646 self.log_stop_tk.set(2.0) 647 self.log_n_tk = Tkinter.IntVar() 648 self.log_n_tk.set(5) 649 650 log_frame = Tkinter.Frame( sequence_frame) 651 log_frame.grid(row=seq_row,column=1) 652 Tkinter.Label(log_frame,text="start: 10^").grid(row=0,column=0) 653 Tkinter.Entry(log_frame,textvariable=self.log_start_tk,width=6).grid(row=0,column=1) 654 Tkinter.Label(log_frame,text=" stop: 10^").grid(row=0,column=2) 655 Tkinter.Entry(log_frame,textvariable=self.log_stop_tk,width=6).grid(row=0,column=3) 656 Tkinter.Label(log_frame,text=" N:").grid(row=0,column=4) 657 Tkinter.Entry(log_frame,textvariable=self.log_n_tk,width=6).grid(row=0,column=5) 658 659 seq_row += 1 660 Tkinter.Radiobutton( sequence_frame, 661 text="Log:", 662 variable=self.sequence_type, 663 value="logb", 664 anchor=Tkinter.W).grid(row=seq_row,column=0,sticky="w") 665 666 self.logb_start_tk = Tkinter.DoubleVar() 667 self.logb_start_tk.set(0.1) 668 self.logb_stop_tk = Tkinter.DoubleVar() 669 self.logb_stop_tk.set(100.0) 670 self.logb_n_tk = Tkinter.IntVar() 671 self.logb_n_tk.set(5) 672 673 logb_frame = Tkinter.Frame( sequence_frame) 674 logb_frame.grid(row=seq_row,column=1) 675 Tkinter.Label(logb_frame,text="start:").grid(row=0,column=0) 676 Tkinter.Entry(logb_frame,textvariable=self.logb_start_tk,width=6).grid(row=0,column=1) 677 Tkinter.Label(logb_frame,text=" stop:").grid(row=0,column=2) 678 Tkinter.Entry(logb_frame,textvariable=self.logb_stop_tk,width=6).grid(row=0,column=3) 679 Tkinter.Label(logb_frame,text=" N:").grid(row=0,column=4) 680 Tkinter.Entry(logb_frame,textvariable=self.logb_n_tk,width=6).grid(row=0,column=5) 681 682 # rest duration frame 683 Tkinter.Label(rest_dur_frame, 684 text="Other sequence parameters", 685 font=("Helvetica",12,"bold"),).grid(row=0,column=0,columnspan=2) 686 687 Tkinter.Label(rest_dur_frame, 688 text="Interval duration (seconds)").grid(row=1,column=0) 689 self.rest_dur = Tkinter.DoubleVar() 690 self.rest_dur.set(0.5) 691 Tkinter.Entry(rest_dur_frame, 692 textvariable=self.rest_dur, 693 width=10).grid(row=1,column=1) 694 695 self.shuffle_tk_var = Tkinter.BooleanVar() 696 self.shuffle_tk_var.set(0) 697 Tkinter.Checkbutton( rest_dur_frame, 698 text="Shuffle sequence order", 699 variable=self.shuffle_tk_var).grid(row=2,column=0,columnspan=2) 700 701 if self.orig_values is not None: 702 self.var_name.set( self.orig_values.parameters.variable ) 703 704 self.sequence_manual_string.set( str(self.orig_values.parameters.sequence) ) 705 706 self.rest_dur.set( self.orig_values.parameters.rest_duration_sec )
707 708
709 - def validate(self):
710 if self.sequence_type.get() == "manual": 711 try: 712 seq = eval(self.sequence_manual_string.get()) 713 except Exception, x: 714 tkMessageBox.showwarning("Invalid sequence parameters", 715 "Manual sequence entry: %s"%(str(x),), 716 parent=self) 717 return 0 718 if type(seq) != types.ListType: 719 tkMessageBox.showwarning("Invalid sequence parameters", 720 "Manual sequence entry: Not a list", 721 parent=self) 722 return 0 723 elif self.sequence_type.get() == "linear": 724 start = self.lin_start_tk.get() 725 stop = self.lin_stop_tk.get() 726 n = self.lin_n_tk.get() 727 if n < 2: 728 tkMessageBox.showwarning("Invalid sequence parameters", 729 "Must have n >= 2.", 730 parent=self) 731 return 0 732 733 incr = (stop-start)/float(n-1) 734 seq = range(n) 735 for i in range(n): 736 seq[i] = i*incr + start 737 elif self.sequence_type.get() == "log": 738 start = self.log_start_tk.get() 739 stop = self.log_stop_tk.get() 740 n = self.log_n_tk.get() 741 if n < 2: 742 tkMessageBox.showwarning("Invalid sequence parameters", 743 "Must have n >= 2.", 744 parent=self) 745 return 0 746 747 incr = (stop-start)/float(n-1) 748 seq = range(n) 749 for i in range(n): 750 seq[i] = 10.0**( i*incr + start ) 751 elif self.sequence_type.get() == "logb": 752 start = self.logb_start_tk.get() 753 stop = self.logb_stop_tk.get() 754 start = math.log10(start) 755 stop = math.log10(stop) 756 n = self.logb_n_tk.get() 757 if n < 2: 758 tkMessageBox.showwarning("Invalid sequence parameters", 759 "Must have n >= 2.", 760 parent=self) 761 return 0 762 incr = (stop-start)/float(n-1) 763 seq = range(n) 764 for i in range(n): 765 seq[i] = 10.0**( i*incr + start ) 766 else: 767 tkMessageBox.showwarning("Invalid sequence parameters", 768 "Invalid sequence type.", 769 parent=self) 770 return 0 771 rest_dur_sec = self.rest_dur.get() 772 773 if self.shuffle_tk_var.get(): 774 random.shuffle(seq) 775 776 self.result = Loop(variable=self.var_name.get(), 777 sequence=seq, 778 rest_duration_sec=rest_dur_sec) 779 return 1
780
781 - def destroy(self):
782 # clear tk variables 783 self.var_name = None 784 self.sequence_type = None 785 self.sequence_manual_string = None 786 self.rest_dur = None 787 # call master's destroy method 788 tkSimpleDialog.Dialog.destroy(self)
789
790 -def get_server(hostname="",port=7766):
791 class ConnectWindow(Tkinter.Frame): 792 def __init__(self,master=None,hostname="",port=7766,**kw): 793 # Allow VisionEgg Tkinter exception window 794 VisionEgg.config._Tkinter_used = True 795 796 Tkinter.Frame.__init__(self,master, **kw) 797 self.winfo_toplevel().title("EPhysGUI Connect - Vision Egg") 798 current_row = 0 799 Tkinter.Message(self,\ 800 text='Welcome to the "EPhys GUI" of the Vision Egg!\n\n'+\ 801 'Please enter the hostname '+\ 802 'and port number '+\ 803 'of the computer on which you have the '+\ 804 '"EPhys server" running.').grid(row=current_row,column=0,columnspan=2) 805 hostname = 'localhost' 806 807 self.hostname_tk = Tkinter.StringVar() 808 self.hostname_tk.set(hostname) 809 current_row += 1 810 Tkinter.Label(self,text="Hostname:").grid(row=current_row, column=0) 811 Tkinter.Entry(self,textvariable=self.hostname_tk).grid(row=current_row, column=1) 812 813 self.port_tk = Tkinter.IntVar() 814 self.port_tk.set(port) 815 current_row += 1 816 Tkinter.Label(self,text="Port:").grid(row=current_row, column=0) 817 Tkinter.Entry(self,textvariable=self.port_tk).grid(row=current_row, column=1) 818 819 current_row += 1 820 bf = Tkinter.Frame(self) 821 bf.grid(row=current_row,column=0,columnspan=2) 822 ok=Tkinter.Button(bf,text="OK",command=self.ok) 823 ok.grid(row=0,column=0) 824 ok.focus_force() 825 ok.bind('<Return>',self.ok) 826 Tkinter.Button(bf,text="Cancel",command=self.quit).grid(row=0,column=1) 827 self.result = None
828 829 def ok(self,dummy_arg=None): 830 self.result = (self.hostname_tk.get(),self.port_tk.get()) 831 self.destroy() 832 self.quit() 833 834 connect_win = ConnectWindow(hostname=hostname,port=port) 835 connect_win.pack() 836 connect_win.mainloop() 837 return connect_win.result 838
839 -class GammaFrame(Tkinter.Frame):
840 - def __init__(self, 841 master=None, 842 ephys_server=None,**kw):
843 Tkinter.Frame.__init__(self,master,**kw) 844 self.winfo_toplevel().title("Gamma - Vision Egg") 845 self.ephys_server = ephys_server 846 847 self.columnconfigure(0,weight=1) 848 849 row = 0 850 Tkinter.Label(self, 851 font=("Helvetica",12,"bold"), 852 text="Load Gamma Table").grid(row=row) 853 854 row += 1 855 Tkinter.Button(self, 856 text="Set from .ve_gamma file...", 857 command=self.set_from_file).grid(row=row,sticky="w") 858 859 row += 1 860 Tkinter.Button(self, 861 text="Set to monitor default (linear gamma table)", 862 command=self.set_monitor_default).grid(row=row,sticky="w") 863 864 row += 1 865 invert_frame = Tkinter.Frame(self) 866 invert_frame.grid(row=row,sticky="we") 867 868 Tkinter.Button(invert_frame, 869 text="Linearize luminance for gammas", 870 command=self.linearize).grid(row=0,column=0) 871 872 Tkinter.Label(invert_frame, 873 text="Red:").grid(row=0,column=1) 874 875 self.red_gamma = Tkinter.DoubleVar() 876 self.red_gamma.set(2.2) 877 878 Tkinter.Entry(invert_frame, 879 textvariable=self.red_gamma, 880 width=5).grid(row=0,column=2) 881 882 Tkinter.Label(invert_frame, 883 text="Green:").grid(row=0,column=3) 884 885 self.green_gamma = Tkinter.DoubleVar() 886 self.green_gamma.set(2.2) 887 888 Tkinter.Entry(invert_frame, 889 textvariable=self.green_gamma, 890 width=5).grid(row=0,column=4) 891 892 Tkinter.Label(invert_frame, 893 text="Blue:").grid(row=0,column=5) 894 895 self.blue_gamma = Tkinter.DoubleVar() 896 self.blue_gamma.set(2.2) 897 898 Tkinter.Entry(invert_frame, 899 textvariable=self.blue_gamma, 900 width=5).grid(row=0,column=6) 901 902 row += 1 903 self.success_label = Tkinter.Label(self) 904 self.success_label.grid(row=row)
905
906 - def get_corrected_gamma_table(self,gamma):
907 # c is a constant scale factor. It is always 1.0 when 908 # luminance is normalized to range [0.0,1.0] and input units 909 # in range [0.0,1.0], as is OpenGL standard. 910 c = 1.0 911 inc = 1.0/255 912 target_luminances = numpy.arange(0.0,1.0+inc,inc) 913 output_ramp = numpy.zeros(target_luminances.shape,dtype=numpy.int32) 914 for i in range(len(target_luminances)): 915 L = target_luminances[i] 916 if L == 0.0: 917 v_88fp = 0 918 else: 919 v = math.exp( (math.log(L) - math.log(c)) /gamma) 920 v_88fp = int(round((v*255) * 256)) # convert to from [0.0,1.0] floating point to [0.0,255.0] 8.8 fixed point 921 output_ramp[i] = v_88fp # 8.8 fixed point format 922 return list(output_ramp) # convert to Python list
923
924 - def linearize(self, dummy_arg=None):
925 self.success_label.configure(text="Setting...") 926 try: 927 red = self.get_corrected_gamma_table(self.red_gamma.get()) 928 green = self.get_corrected_gamma_table(self.green_gamma.get()) 929 blue = self.get_corrected_gamma_table(self.blue_gamma.get()) 930 except: 931 self.success_label.configure(text="Calculation error") 932 raise 933 try: 934 if self.ephys_server.set_gamma_ramp(red,green,blue): 935 self.success_label.configure(text="Success") 936 else: 937 self.success_label.configure(text="Failed: Invalid gamma values?") 938 except Exception,x: 939 self.success_label.configure(text="Failed: %s: %s"%(x.__class__,str(x))) 940 raise
941
942 - def set_monitor_default(self, dummy_arg=None):
943 self.success_label.configure(text="Setting...") 944 try: 945 red = self.get_corrected_gamma_table(1.0) # linear gamma table 946 except: 947 self.success_label.configure(text="Calculation error") 948 raise 949 green = red 950 blue = red 951 try: 952 if self.ephys_server.set_gamma_ramp(red,green,blue): 953 self.success_label.configure(text="Success") 954 else: 955 self.success_label.configure(text="Failed: Invalid gamma values?") 956 except Exception,x: 957 self.success_label.configure(text="Failed: %s: %s"%(x.__class__,str(x))) 958 raise
959
960 - def set_from_file(self):
961 self.success_label.configure(text="Setting...") 962 filename = tkFileDialog.askopenfilename( 963 parent=self, 964 defaultextension=".ve_gamma", 965 filetypes=[('Configuration file','*.ve_gamma')], 966 initialdir=VisionEgg.config.VISIONEGG_USER_DIR) 967 if not filename: 968 self.success_label.configure(text="No file given") 969 return 970 fd = open(filename,"r") 971 gamma_values = [] 972 for line in fd.readlines(): 973 line = line.strip() # remove leading/trailing whitespace 974 if line.startswith("#"): # comment, ignore 975 continue 976 try: 977 gamma_values.append( map(int, line.split() ) ) 978 except Exception, x: 979 self.success_label.configure(text="File error") 980 raise 981 if len(gamma_values[-1]) != 3: 982 self.success_label.configure(text="File error") 983 raise RuntimeError("expected 3 values per gamma entry") 984 if len(gamma_values) != 256: 985 self.success_label.configure(text="File error") 986 raise RuntimeError("expected 256 gamma entries") 987 red, green, blue = zip(*gamma_values) 988 try: 989 if self.ephys_server.set_gamma_ramp(red,green,blue): 990 self.success_label.configure(text="Success") 991 else: 992 self.success_label.configure(text="Failed: Invalid gamma values?") 993 except Exception,x: 994 self.success_label.configure(text="Failed: %s: %s"%(x.__class__,str(x))) 995 raise
996
997 -class ImageSequenceLauncher(Tkinter.Toplevel):
998 - def __init__(self,master=None,ephys_server=None,**cnf):
999 Tkinter.Toplevel.__init__(self,master,**cnf) 1000 if ephys_server is None: 1001 raise ValueError("Must specify ephys_server") 1002 self.ephys_server = ephys_server 1003 1004 self.columnconfigure(1,weight=1) 1005 1006 row = 0 1007 Tkinter.Label(self,text="Frames per second").grid(row=row,column=0) 1008 self.fps_var = Tkinter.DoubleVar() 1009 self.fps_var.set(12.0) 1010 Tkinter.Entry(self,textvariable=self.fps_var).grid(row=row,column=1,sticky="we") 1011 row += 1 1012 Tkinter.Label(self,text="Filename base").grid(row=row,column=0) 1013 self.filename_base = Tkinter.StringVar() 1014 self.filename_base.set("im") 1015 Tkinter.Entry(self,textvariable=self.filename_base).grid(row=row,column=1,sticky="we") 1016 row += 1 1017 Tkinter.Label(self,text="Filename suffix").grid(row=row,column=0) 1018 self.filename_suffix = Tkinter.StringVar() 1019 self.filename_suffix.set(".tif") 1020 Tkinter.Entry(self,textvariable=self.filename_suffix).grid(row=row,column=1,sticky="we") 1021 row += 1 1022 Tkinter.Label(self,text="Save directory on server").grid(row=row,column=0) 1023 self.server_save_dir = Tkinter.StringVar() 1024 server_dir = self.ephys_server.get_cwd() 1025 self.server_save_dir.set(server_dir) 1026 Tkinter.Entry(self,textvariable=self.server_save_dir).grid(row=row,column=1,sticky="we") 1027 row += 1 1028 Tkinter.Button(self,text="Save movie",command=self.do_it).grid(row=row,column=0,columnspan=2) 1029 self.focus_set() 1030 self.grab_set()
1031 - def do_it(self):
1032 fps = self.fps_var.get() 1033 filename_base = self.filename_base.get() 1034 filename_suffix = self.filename_suffix.get() 1035 server_save_dir = self.server_save_dir.get() 1036 self.ephys_server.save_image_sequence(fps=fps, 1037 filename_base=filename_base, 1038 filename_suffix=filename_suffix, 1039 save_dir=server_save_dir) 1040 self.destroy()
1041
1042 -class AppWindow(Tkinter.Frame):
1043 - def __init__(self, 1044 master=None, 1045 client_list=None, 1046 server_hostname='', 1047 server_port=7766, 1048 **cnf):
1049 1050 if hasattr(VisionEgg, '_exception_hook_keeper'): 1051 # Keep original exception handler 1052 self._orig_report_callback_exception = Tkinter.Tk.report_callback_exception 1053 self._tk = Tkinter.Tk 1054 # Use Vision Egg exception handler 1055 Tkinter.Tk.report_callback_exception = VisionEgg._exception_hook_keeper.handle_exception 1056 1057 # Allow VisionEgg Tkinter exception window 1058 VisionEgg.config._Tkinter_used = True 1059 1060 # create myself 1061 Tkinter.Frame.__init__(self,master, **cnf) 1062 self.winfo_toplevel().title("EPhysGUI - Vision Egg") 1063 1064 self.client_list = client_list 1065 1066 self.server_hostname = server_hostname 1067 self.server_port = server_port 1068 1069 self.pyro_client = VisionEgg.PyroClient.PyroClient(self.server_hostname,self.server_port) 1070 self.ephys_server = self.pyro_client.get("ephys_server") 1071 self.ephys_server.first_connection() 1072 1073 self.stim_onset_cal_tk_var = Tkinter.BooleanVar() 1074 self.stim_onset_cal_tk_var.set(0) 1075 1076 self.autosave_dir = Tkinter.StringVar() 1077 self.autosave_dir.set( os.path.abspath(os.curdir) ) 1078 1079 self.autosave_basename = Tkinter.StringVar() 1080 1081 # create menu bar 1082 self.bar = Tkinter.Menu(tearoff=0) 1083 top = self.winfo_toplevel() 1084 top.configure(menu=self.bar) 1085 1086 self.bar.file_menu = Tkinter.Menu(self.bar, name="file_menu") 1087 self.bar.add_cascade(label="File",menu=self.bar.file_menu) 1088 1089 self.bar.file_menu.add_command(label='Save image sequence...', command=self.save_image_sequence) 1090 self.bar.file_menu.add_command(label='Save configuration file...', command=self.save_config) 1091 self.bar.file_menu.add_command(label='Load configuration file...', command=self.load_config) 1092 self.bar.file_menu.add_command(label='Load auto-saved .py parameter file...', command=self.load_params) 1093 self.bar.file_menu.add_separator() 1094 self.bar.file_menu.add_command(label='Load Vision Egg script...', command=self.load_demoscript) 1095 self.bar.file_menu.add_separator() 1096 1097 self.quit_server_too = Tkinter.BooleanVar() 1098 self.quit_server_too.set(1) 1099 self.bar.file_menu.add_checkbutton(label='Quit server too', 1100 variable=self.quit_server_too) 1101 self.bar.file_menu.add_command(label='Quit', 1102 command=self.quit, 1103 ) 1104 1105 stimkey = self.ephys_server.get_stimkey() 1106 self.stimulus_tk_var = Tkinter.StringVar() 1107 self.stimulus_tk_var.set( stimkey ) 1108 1109 self.bar.stimuli_menu = Tkinter.Menu(self.bar, name="stimuli_menu") 1110 self.bar.add_cascade(label="Stimuli",menu=self.bar.stimuli_menu) 1111 for maybe_stimkey, maybe_control_frame, maybe_title in self.client_list: 1112 if maybe_title != "Vision Egg Script": 1113 self.bar.stimuli_menu.add_radiobutton(label=maybe_title, 1114 command=self.change_stimulus, 1115 variable=self.stimulus_tk_var, 1116 value=maybe_stimkey) 1117 1118 self.bar.calibration_menu = Tkinter.Menu(self.bar, name="calibration_menu") 1119 self.bar.add_cascade(label="Configure/Calibrate", 1120 menu=self.bar.calibration_menu) 1121 1122 self.bar.calibration_menu.add_command(label='3D Perspective...', command=self.launch_screen_pos) 1123 self.bar.calibration_menu.add_command(label='Stimulus onset timing...', command=self.launch_stim_onset_cal) 1124 self.bar.calibration_menu.add_command(label='Load gamma table...', command=self.launch_gamma_panel) 1125 self.notify_on_dropped_frames = Tkinter.BooleanVar() 1126 self.notify_on_dropped_frames.set(1) 1127 self.bar.calibration_menu.add_checkbutton(label='Warn on frame skip', 1128 variable=self.notify_on_dropped_frames) 1129 1130 self.override_t_abs_sec = Tkinter.StringVar() # Tkinter DoubleVar loses precision 1131 self.override_t_abs_sec.set("0.0") 1132 1133 self.override_t_abs_on = Tkinter.BooleanVar() 1134 self.override_t_abs_on.set(0) 1135 self.bar.calibration_menu.add_checkbutton(label='Override server absolute time (CAUTION)', 1136 variable=self.override_t_abs_on) 1137 1138 row = 0 1139 1140 # options for self.stim_frame in grid layout manager 1141 self.stim_frame_cnf = {'row':row, 1142 'column':0, 1143 'columnspan':2, 1144 'sticky':'nwes'} 1145 1146 row += 1 1147 Tkinter.Label(self, 1148 text="Sequence information", 1149 font=("Helvetica",12,"bold")).grid(row=row,column=0) 1150 row += 1 1151 # options for self.loop_frame in grid layout manager 1152 self.loop_frame_cnf = {'row':row, 1153 'column':0, 1154 'sticky':'nwes'} 1155 1156 row -= 1 1157 Tkinter.Label(self, 1158 text="Parameter Save Options", 1159 font=("Helvetica",12,"bold")).grid(row=row,column=1) 1160 row += 1 1161 self.auto_save_frame = Tkinter.Frame(self) 1162 asf = self.auto_save_frame # shorthand 1163 asf.grid(row=row,column=1,sticky="nwes") 1164 asf.columnconfigure(1,weight=1) 1165 1166 asf.grid_row = 0 1167 self.autosave = Tkinter.BooleanVar() 1168 self.autosave.set(1) 1169 self.auto_save_button = Tkinter.Checkbutton(asf, 1170 text="Auto save trial parameters", 1171 variable=self.autosave) 1172 self.auto_save_button.grid(row=asf.grid_row,column=0,columnspan=2) 1173 1174 self.param_file_type_tk_var = Tkinter.StringVar() 1175 self.param_file_type_tk_var.set("Python format") 1176 filetype_bar = Tkinter.Menubutton(asf, 1177 textvariable=self.param_file_type_tk_var, 1178 relief=Tkinter.RAISED) 1179 filetype_bar.grid(row=asf.grid_row,column=2) 1180 filetype_bar.menu = Tkinter.Menu(filetype_bar,tearoff=0) 1181 filetype_bar.menu.add_radiobutton(label="Python format", 1182 value="Python format", 1183 variable=self.param_file_type_tk_var) 1184 filetype_bar.menu.add_radiobutton(label="Matlab format", 1185 value="Matlab format", 1186 variable=self.param_file_type_tk_var) 1187 filetype_bar['menu'] = filetype_bar.menu 1188 1189 asf.grid_row += 1 1190 Tkinter.Label(asf, 1191 text="Parameter file directory:").grid(row=asf.grid_row,column=0,sticky="e") 1192 Tkinter.Entry(asf, 1193 textvariable=self.autosave_dir).grid(row=asf.grid_row,column=1,sticky="we") 1194 Tkinter.Button(asf, 1195 text="Set...",command=self.set_autosave_dir).grid(row=asf.grid_row,column=2) 1196 asf.grid_row += 1 1197 Tkinter.Label(asf, 1198 text="Parameter file basename:").grid(row=asf.grid_row,column=0,sticky="e") 1199 Tkinter.Entry(asf, 1200 textvariable=self.autosave_basename).grid(row=asf.grid_row,column=1,sticky="we") 1201 Tkinter.Button(asf, 1202 text="Reset",command=self.reset_autosave_basename).grid(row=asf.grid_row,column=2) 1203 1204 row += 1 1205 Tkinter.Button(self, text='Do single trial', command=self.do_single_trial).grid(row=row,column=0) 1206 Tkinter.Button(self, text='Do sequence', command=self.do_loops).grid(row=row,column=1) 1207 1208 row += 1 1209 self.progress = VisionEgg.GUI.ProgressBar(self, 1210 width=300, 1211 relief="sunken", 1212 doLabel=0, 1213 labelFormat="%s") 1214 self.progress.labelText = "Starting..." 1215 self.progress.updateProgress(0) 1216 self.progress.grid(row=row,column=0,columnspan=2)#,sticky='we') 1217 1218 # Allow rows and columns to expand 1219 for i in range(2): 1220 self.columnconfigure(i,weight=1) 1221 for i in range(row+1): 1222 self.rowconfigure(i,weight=1) 1223 1224 self.switch_to_stimkey( stimkey ) 1225 1226 self.config_dir = None 1227 self.demoscript_filename = None 1228 self.vars_list = None
1229
1230 - def __del__( self ):
1231 if hasattr(self,'_orig_report_callback_exception'): 1232 self._tk.report_callback_exception = self._orig_report_callback_exception
1233
1234 - def switch_to_stimkey( self, stimkey ):
1235 success = 0 1236 for maybe_stimkey, maybe_control_frame, maybe_title in self.client_list: 1237 if stimkey == maybe_stimkey: 1238 control_frame_klass = maybe_control_frame 1239 success = 1 1240 1241 if not success: 1242 raise RuntimeError("Could not find valid client for server stimkey %s"%stimkey) 1243 1244 if hasattr(self, 'stim_frame'): 1245 # clear old frame 1246 self.stim_frame.destroy() 1247 del self.stim_frame 1248 1249 self.stim_frame = control_frame_klass(self,suppress_go_buttons=1) 1250 if stimkey == "dropin_server": 1251 self.stim_frame.gen_var_widgets(self.demoscript_filename, self.vars_list) 1252 self.stim_frame.connect(self.server_hostname,self.server_port) 1253 self.stim_frame.grid( **self.stim_frame_cnf ) 1254 1255 global loopable_variables 1256 loopable_variables = self.stim_frame.get_loopable_variable_names() 1257 if hasattr(self, 'loop_frame'): 1258 # clear old frame 1259 self.loop_frame.destroy() 1260 del self.loop_frame 1261 self.loop_frame = ScrollListFrame(master=self, 1262 container_class=LoopContainedObject) 1263 self.loop_frame.grid( **self.loop_frame_cnf ) 1264 1265 self.autosave_basename.set( self.stim_frame.get_shortname() ) 1266 1267 self.stimulus_tk_var.set( self.stim_frame.get_shortname() ) # set menuitem 1268 1269 self.progress.labelText = "Ready" 1270 self.progress.updateProgress(0)
1271
1272 - def change_stimulus(self, dummy_arg=None, new_stimkey=None ):
1273 # if new_stimkey is None, get from the tk variable 1274 if new_stimkey is None: 1275 new_stimkey = self.stimulus_tk_var.get() 1276 1277 found = 0 1278 for maybe_stimkey, maybe_control_frame, maybe_title in self.client_list: 1279 if new_stimkey == maybe_stimkey: 1280 new_control_frame_klass = maybe_control_frame 1281 new_stimkey = maybe_stimkey 1282 found = 1 1283 break 1284 1285 if not found: 1286 raise RuntimeError("Don't know about stimkey %s"%new_stimkey) 1287 1288 if new_control_frame_klass != self.stim_frame.__class__ or new_stimkey == "dropin_server": 1289 # make wait cursor 1290 root = self.winfo_toplevel() 1291 old_cursor = root["cursor"] 1292 root["cursor"] = "watch" 1293 root.update() 1294 try: 1295 1296 self.progress.labelText = "Changing stimulus..." 1297 self.progress.updateProgress(0) 1298 1299 self.ephys_server.set_next_stimkey( new_stimkey ) 1300 1301 # new stimulus type 1302 self.stim_frame.quit_server() # disconnect 1303 1304 # in case of loaded Vision Egg script, quit_server() 1305 # sends a signal to stop the "wait" loop, WITHOUT 1306 # raising a flag to run the script 1307 1308 self.ephys_server.get_stimkey() # wait for server to load 1309 1310 self.switch_to_stimkey( new_stimkey) 1311 finally: 1312 #restore cursor 1313 root["cursor"] = old_cursor 1314 root.update()
1315
1316 - def save_image_sequence(self):
1317 ImageSequenceLauncher(self,ephys_server=self.ephys_server)
1318
1319 - def save_config(self):
1320 self.stim_frame.send_values() # copy values from Tkinter to self.stim_frame.meta_params and send to server 1321 if self.config_dir is not None: 1322 initialdir = self.config_dir 1323 else: 1324 initialdir = VisionEgg.config.VISIONEGG_USER_DIR 1325 filename = tkFileDialog.asksaveasfilename( 1326 parent=self, 1327 defaultextension=".ve_cfg", 1328 filetypes=[('Configuration file','*.ve_cfg')], 1329 initialdir=initialdir) 1330 if not filename: 1331 return 1332 fd = open(filename,"wb") 1333 save_dict = {'stim_type':self.stim_frame.get_shortname(), 1334 'loop_list':self.loop_frame.list, 1335 'stim_frame_dict':self.stim_frame.get_parameters_dict(), 1336 'autosave':self.autosave.get(), 1337 'autosave_dir':self.autosave_dir.get(), 1338 'autosave_basename':self.autosave_basename.get()} 1339 pickle.dump( save_dict, fd ) 1340 self.config_dir = os.path.split(filename)[0] # get dir
1341
1342 - def load_config(self):
1343 if self.config_dir is not None: 1344 initialdir = self.config_dir 1345 else: 1346 initialdir = VisionEgg.config.VISIONEGG_USER_DIR 1347 filename = tkFileDialog.askopenfilename( 1348 parent=self, 1349 defaultextension=".ve_cfg", 1350 filetypes=[('Configuration file','*.ve_cfg')], 1351 initialdir=initialdir, 1352 ) 1353 if not filename: 1354 return 1355 self.config_dir = os.path.split(filename)[0] # get dir 1356 fd = open(filename,"rb") 1357 file_contents = fd.read() 1358 file_contents = file_contents.replace('\r\n','\n') # deal with Windows newlines 1359 memory_file = StringIO.StringIO(file_contents) 1360 load_dict = pickle.load(memory_file) 1361 if load_dict['stim_type'] != self.stim_frame.get_shortname(): 1362 self.change_stimulus(new_stimkey=load_dict['stim_type']+"_server") 1363 self.loop_frame.list = load_dict['loop_list'] 1364 self.loop_frame.update_now() 1365 self.stim_frame.set_parameters_dict( load_dict['stim_frame_dict'] ) 1366 self.autosave.set(load_dict['autosave']) 1367 self.autosave_dir.set(load_dict['autosave_dir']) 1368 self.autosave_basename.set(load_dict['autosave_basename']) 1369 1370 self.stim_frame.update_tk_vars()
1371
1372 - def load_params(self,orig_load_dict={}):
1373 filename = tkFileDialog.askopenfilename( 1374 parent=self, 1375 defaultextension=".py", 1376 filetypes=[('Auto-saved parameter file','*.py')]) 1377 if not filename: 1378 return 1379 locals = {} 1380 load_dict = orig_load_dict.copy() # make copy of default values 1381 execfile(filename,locals,load_dict) # execute the file 1382 if load_dict['stim_type'] != self.stim_frame.get_shortname(): 1383 self.change_stimulus(new_stimkey=load_dict['stim_type']+"_server") 1384 self.loop_frame.list = [] # clear loop list 1385 self.loop_frame.update_now() 1386 new_params = {} 1387 exception_info = [] 1388 for param_name in dir(self.stim_frame.meta_params): 1389 if param_name[:2] != "__": 1390 try: 1391 new_params[param_name] = load_dict[param_name] 1392 except Exception, x: 1393 exception_info.append(sys.exc_info()) # don't die on exception 1394 else: 1395 del load_dict[param_name] 1396 for exc_type, exc_value, exc_traceback in exception_info: 1397 # ignore actual traceback 1398 VisionEgg.GUI.showexception(exc_type,exc_value,"") 1399 self.stim_frame.set_parameters_dict( new_params ) 1400 self.autosave_basename.set(load_dict['stim_type']) 1401 1402 try: 1403 override_t_abs_sec = load_dict['go_loop_start_time_abs_sec'] 1404 except Exception, x: 1405 tkMessageBox.showwarning("No absolute time parameter", 1406 "No absolute time parameter when loading file", 1407 parent=self) 1408 else: 1409 if not self.override_t_abs_on.get(): 1410 self.override_t_abs_on.set(1) 1411 tkMessageBox.showwarning("Overriding absolute time parameter", 1412 "Overriding absolute time parameter on server. "+\ 1413 "Remember to turn this option off (in Configure "+\ 1414 "/ Calibrate menu) when done.", 1415 parent=self) 1416 self.override_t_abs_sec.set(repr(override_t_abs_sec)) # make string 1417 1418 self.stim_frame.update_tk_vars() 1419 return load_dict # return unused variables
1420
1421 - def load_demoscript(self):
1422 self.demoscript_filename = tkFileDialog.askopenfilename( 1423 parent=self, 1424 defaultextension=".py", 1425 filetypes=[('Vision Egg Demo Script','*.py')]) 1426 1427 if not self.demoscript_filename: 1428 return 1429 else: 1430 # make wait cursor 1431 root = self.winfo_toplevel() 1432 old_cursor = root["cursor"] 1433 root["cursor"] = "watch" 1434 root.update() 1435 try: 1436 fd1 = open(self.demoscript_filename, 'r') 1437 demoscript = "" 1438 1439 # List of all variables. 1440 # Each variable is a tuple of the form [x, y, z] where: 1441 # x: variable type ID, 1442 # y: variable name, 1443 # z: variable value. 1444 self.vars_list = [] 1445 1446 lines = fd1.read().splitlines() 1447 keep_lines = [] 1448 while len(lines): 1449 myString = lines.pop(0) 1450 if myString.find("get_default_screen()") != -1: 1451 append_flag = 0 1452 elif myString.find("watch_exceptions()") != -1: 1453 append_flag = 0 1454 elif myString.find("start_default_logging()") != -1: 1455 append_flag = 0 1456 elif myString.find("#%f") == 0: 1457 self.vars_list.append([VarTypes.getID("float"), myString.replace("#%f", "").split()[0]]) 1458 append_flag = 0 1459 elif myString.find("#%i") == 0: 1460 self.vars_list.append([VarTypes.getID("integer"), myString.replace("#%i", "").split()[0]]) 1461 append_flag = 0 1462 elif myString.find("#%s") == 0: 1463 self.vars_list.append([VarTypes.getID("string"), myString.replace("#%s", "").split()[0]]) 1464 append_flag = 0 1465 else: 1466 append_flag = 1 1467 1468 if append_flag == 1: 1469 keep_lines.append( myString ) 1470 1471 fd1.close() 1472 demoscript = '\n'.join(keep_lines) 1473 1474 # Client side AST. Only used to extract default values 1475 # of elected variables: 1476 try: 1477 AST = parser.suite(demoscript) 1478 1479 for var in self.vars_list: 1480 var_val = AST_ext.extract_from_AST(AST, var[1]) 1481 if var[0] == VarTypes.getID("string"): 1482 var_val = var_val[1:len(var_val) - 1] 1483 var.append(var_val) 1484 1485 del AST # save memory 1486 1487 # unfortunately, sending an AST object over a Pyro 1488 # connection has its complications... so we don't 1489 # do it 1490 self.ephys_server.build_AST(demoscript) 1491 1492 self.change_stimulus(new_stimkey="dropin_server") 1493 1494 except (parser.ParserError, SyntaxError): 1495 tkMessageBox.showerror("Error", "Invalid demo script!") 1496 err_fd = file('/home/astraw/tmp/err.py',mode='w') 1497 err_fd.write(demoscript) 1498 finally: 1499 #restore cursor 1500 root["cursor"] = old_cursor 1501 root.update()
1502
1503 - def launch_screen_pos(self, dummy_arg=None):
1504 dialog = Tkinter.Toplevel(self) 1505 frame = VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame(dialog, 1506 auto_connect=1, 1507 server_hostname=self.server_hostname, 1508 server_port=self.server_port) 1509 frame.winfo_toplevel().title("3D Calibration - Vision Egg") 1510 frame.pack(expand=1,fill=Tkinter.BOTH)
1511
1512 - def launch_stim_onset_cal(self, dummy_arg=None):
1513 dialog = Tkinter.Toplevel(self) 1514 frame = Tkinter.Frame(dialog) 1515 frame.winfo_toplevel().title("Timing Calibration - Vision Egg") 1516 Tkinter.Label(frame, 1517 font=("Helvetica",12,"bold"), 1518 text="Stimulus onset timing").grid(row=0,column=0) 1519 Tkinter.Label(frame, 1520 text="Use a light detector to verify the onset of a trial." 1521 ).grid(row=1,column=0) 1522 Tkinter.Checkbutton( frame, 1523 text="Black box (always) with white box (during trial)", 1524 variable=self.stim_onset_cal_tk_var, 1525 command=self.update_stim_onset_cal).grid(row=2,column=0) 1526 1527 x,y,width,height = self.ephys_server.get_stim_onset_cal_location() 1528 1529 location_frame = Tkinter.Frame(frame) 1530 location_frame.grid(row=3,column=0) 1531 self.stim_onset_x = Tkinter.DoubleVar() 1532 self.stim_onset_x.set(x) 1533 self.stim_onset_y = Tkinter.DoubleVar() 1534 self.stim_onset_y.set(y) 1535 self.stim_onset_width = Tkinter.DoubleVar() 1536 self.stim_onset_width.set(width) 1537 self.stim_onset_height = Tkinter.DoubleVar() 1538 self.stim_onset_height.set(height) 1539 1540 Tkinter.Label( location_frame, text="Center X:").grid(row=0,column=0) 1541 Tkinter.Entry( location_frame, textvariable=self.stim_onset_x,width=5).grid(row=0,column=1) 1542 Tkinter.Label( location_frame, text="Center Y:").grid(row=0,column=2) 1543 Tkinter.Entry( location_frame, textvariable=self.stim_onset_y,width=5).grid(row=0,column=3) 1544 Tkinter.Label( location_frame, text="Width:").grid(row=1,column=0) 1545 Tkinter.Entry( location_frame, textvariable=self.stim_onset_width,width=5).grid(row=1,column=1) 1546 Tkinter.Label( location_frame, text="Height:").grid(row=1,column=2) 1547 Tkinter.Entry( location_frame, textvariable=self.stim_onset_height,width=5).grid(row=1,column=3) 1548 1549 Tkinter.Button( frame, 1550 text="update position and size", 1551 command=self.set_stim_onset_cal_position).grid(row=4,column=0) 1552 self.set_stim_onset_cal_position() # call it once to send server our initial values 1553 frame.pack(expand=1,fill=Tkinter.BOTH)
1554
1555 - def launch_gamma_panel(self, dummy_arg=None):
1556 dialog = Tkinter.Toplevel(self) 1557 frame = GammaFrame(dialog, 1558 self.ephys_server) 1559 frame.pack(expand=1,fill=Tkinter.BOTH)
1560
1561 - def set_autosave_dir(self):
1562 self.autosave_dir.set( os.path.abspath( tkFileDialog.askdirectory() ) )
1563
1564 - def reset_autosave_basename(self):
1565 self.autosave_basename.set( self.stim_frame.get_shortname() )
1566
1567 - def update_stim_onset_cal(self, dummy_arg=None):
1568 on = self.stim_onset_cal_tk_var.get() 1569 self.ephys_server.set_stim_onset_cal(on)
1570
1571 - def set_stim_onset_cal_position(self, dummy_arg=None):
1572 x = self.stim_onset_x.get() 1573 y = self.stim_onset_y.get() 1574 width = self.stim_onset_width.get() 1575 height = self.stim_onset_height.get() 1576 self.ephys_server.set_stim_onset_cal_location(center=(x,y),size=(width,height))
1577 1578
1579 - def do_loops(self):
1580 super_loop_list = self.loop_frame.get_list_uncontained() 1581 # "super_loop_list" is a list of lists, each of which, a 1582 # "loop_list", contains "loop" class objects 1583 # eg. [[a], [b, c], [d]] 1584 # Need to test that "get_list_uncontained()" is returning a list of lists! 1585 global need_rest_period 1586 need_rest_period = 0 1587 1588 if not len(super_loop_list): 1589 return 1590 1591 ############################################################ 1592 def process_loops(depth): # recursive processing of loops 1593 1594 class LoopInfoFrame(Tkinter.Frame): 1595 def __init__(self, master=None, **kw): 1596 Tkinter.Frame.__init__(self,master,**kw) 1597 Tkinter.Label(self, 1598 text="Doing sequence").grid(row=0,column=0) 1599 self.status_tk_var = Tkinter.StringVar() 1600 Tkinter.Label(self, 1601 textvariable = self.status_tk_var).grid(row=1, column=0) 1602 self.cancel_asap = 0 1603 Tkinter.Button(self, 1604 text="Cancel",command=self.cancel).grid(row=2,column=0) 1605 self.focus_set() 1606 self.grab_set()
1607 def cancel(self, dummy_arg=None): 1608 self.cancel_asap = 1
1609 1610 global need_rest_period 1611 1612 global loop_info_frame 1613 if depth == 0: # only make one LoopInfoFrame (when depth is 0, ie. first time) 1614 top = Tkinter.Toplevel(self) 1615 loop_info_frame = LoopInfoFrame(top) 1616 loop_info_frame.pack() 1617 1618 loop_list = super_loop_list[depth] 1619 #print "current depth" 1620 #print depth 1621 #print "Loop?" 1622 #print loop 1623 max_depth = len(super_loop_list)-1 1624 #print "max_depth" 1625 #print max_depth 1626 1627 loop = loop_list[0].get_contained() 1628 # "loop_list" is, for example: [a, b, c] 1629 # ie. each element is an object of class "loop". 1630 # If one element is done, then all other elements are effectively done, the way we've structured the lists to 1631 # be (they all have same 'N' value). 1632 1633 while not loop.is_done() and not loop_info_frame.cancel_asap: 1634 for loop_element in loop_list: 1635 if loop_element.get_contained().parameters.variable != "<repeat>": 1636 self.stim_frame.set_loopable_variable(loop_element.get_contained().parameters.variable,loop_element.get_contained().get_current()) 1637 if depth < max_depth: 1638 process_loops(depth+1) 1639 elif depth == max_depth: # deepest level -- do the trial 1640 if need_rest_period: 1641 self.progress.labelText = "Resting" 1642 self.sleep_with_progress(loop.parameters.rest_duration_sec) 1643 self.do_single_trial() 1644 need_rest_period = 1 1645 else: 1646 raise RuntimeError("Called with max_depth==-1:") 1647 for loop_element in loop_list: 1648 loop_element.get_contained().advance() 1649 for loop_element in loop_list: 1650 loop_element.get_contained().reset() 1651 if depth == 0: # destroy LoopInfoFrame 1652 top.destroy() 1653 1654 ############################################################ 1655 process_loops(0) # start recursion on top level 1656
1657 - def do_single_trial(self):
1658 # Get filename to save parameters 1659 if not self.autosave.get(): 1660 file_stream = None # not saving file 1661 else: 1662 duration_sec = self.stim_frame.get_duration_sec() 1663 (year,month,day,hour24,min,sec) = time.localtime(time.time()+duration_sec)[:6] 1664 trial_time_str = "%04d%02d%02d_%02d%02d%02d"%(year,month,day,hour24,min,sec) 1665 if self.param_file_type_tk_var.get() == "Python format": 1666 # Figure out filename to save parameters in 1667 filename = self.autosave_basename.get() + trial_time_str + "_params.py" 1668 fullpath_filename = os.path.join( self.autosave_dir.get(), filename) 1669 file_stream = open(fullpath_filename,"w") 1670 elif self.param_file_type_tk_var.get() == "Matlab format": 1671 # Figure out filename to save results in 1672 filename = self.autosave_basename.get() + trial_time_str + "_params.m" 1673 fullpath_filename = os.path.join( self.autosave_dir.get(), filename) 1674 file_stream = open(fullpath_filename,"w") 1675 else: 1676 raise ValueError('Unknown file format: "%s"'%(self.param_file_type_tk_var.get(),)) 1677 1678 # this class is broken into parts so it can be subclassed more easily 1679 self.do_single_trial_pre(file_stream) 1680 self.do_single_trial_work() 1681 self.do_single_trial_post(file_stream) 1682 1683 # Close parameter save file 1684 if self.autosave.get(): 1685 file_stream.close()
1686
1687 - def do_single_trial_pre(self, file_stream):
1688 # Ensure that we have the most up-to-date values 1689 self.stim_frame.send_values() # copy values from Tkinter to self.stim_frame.meta_params and send to server 1690 1691 # if file_stream is None, open default file 1692 if self.autosave.get(): 1693 duration_sec = self.stim_frame.get_duration_sec() 1694 (year,month,day,hour24,min,sec) = time.localtime(time.time()+duration_sec)[:6] 1695 if self.param_file_type_tk_var.get() == "Python format": 1696 file_stream.write("stim_type = '%s'\n"%self.stim_frame.get_shortname()) 1697 file_stream.write("finished_time = %04d%02d%02d%02d%02d%02d\n"%(year,month,day,hour24,min,sec)) 1698 parameter_list = self.stim_frame.get_parameters_as_py_strings() 1699 for parameter_name, parameter_value in parameter_list: 1700 file_stream.write("%s = %s\n"%(parameter_name, parameter_value)) 1701 elif self.param_file_type_tk_var.get() == "Matlab format": 1702 file_stream.write("stim_type = '%s';\n"%self.stim_frame.get_shortname()) 1703 file_stream.write("finished_time = %04d%02d%02d%02d%02d%02d;\n"%(year,month,day,hour24,min,sec)) 1704 parameter_list = self.stim_frame.get_parameters_as_m_strings() 1705 for parameter_name, parameter_value in parameter_list: 1706 file_stream.write("%s = %s;\n"%(parameter_name, parameter_value)) 1707 else: 1708 raise RuntimeError("Unknown parameter file type") # Should never get here
1709
1710 - def do_single_trial_work(self):
1711 # make wait cursor 1712 root = self.winfo_toplevel() 1713 self.old_cursor = root["cursor"] 1714 root["cursor"] = "watch" 1715 root.update() 1716 try: 1717 1718 self.progress.labelText = "Doing trial..." 1719 self.progress.updateProgress(0) 1720 1721 duration_sec = self.stim_frame.get_duration_sec() 1722 if duration_sec > 0: 1723 if self.override_t_abs_on.get(): 1724 new_t_abs_str = self.override_t_abs_sec.get() 1725 self.ephys_server.set_override_t_abs_sec( new_t_abs_str ) 1726 1727 self.stim_frame.go() # start server going, but this return control immediately 1728 self.sleep_with_progress(duration_sec) 1729 while self.ephys_server.is_in_go_loop(): # make sure go loop is really done 1730 time.sleep(0.1) # wait 100 msec for end of go loop and try again 1731 1732 if self.notify_on_dropped_frames.get(): 1733 if self.ephys_server.were_frames_dropped_in_last_go_loop(): 1734 tkMessageBox.showwarning("Dropped frame(s)", 1735 "During the last trial, at least 1 frame was dropped.", 1736 parent=self) 1737 else: 1738 if self.stim_frame.send_values(): 1739 self.ephys_server.run_demoscript() 1740 self.stim_frame.quit_server() 1741 finally: 1742 root["cursor"] = self.old_cursor 1743 root.update() 1744 1745 # restore status bar 1746 self.progress.labelText = "Ready" 1747 self.progress.updateProgress(0)
1748
1749 - def do_single_trial_post(self, file_stream):
1750 # if file_stream is None, open default file 1751 if self.autosave.get(): 1752 frames_dropped = self.ephys_server.were_frames_dropped_in_last_go_loop() 1753 go_loop_start_time = self.ephys_server.get_last_go_loop_start_time_absolute_sec() 1754 if self.param_file_type_tk_var.get() == "Python format": 1755 file_stream.write("frames_dropped = %s # boolean\n"%str(frames_dropped)) 1756 file_stream.write("go_loop_start_time_abs_sec = %s\n"%repr(go_loop_start_time)) 1757 elif self.param_file_type_tk_var.get() == "Matlab format": 1758 file_stream.write("frames_dropped = %s; %% boolean\n"%str(frames_dropped)) 1759 file_stream.write("go_loop_start_time_abs_sec = %s;\n"%repr(go_loop_start_time)) 1760 else: 1761 raise RuntimeError("Unknown parameter file type") # Should never get here
1762
1763 - def sleep_with_progress(self, duration_sec):
1764 if duration_sec == 0.0: 1765 return # don't do anything 1766 start_time = time.time() 1767 stop_time = start_time + duration_sec 1768 percent_done = 0 1769 while percent_done < 100: 1770 if sys.platform != 'darwin': # Mac OS X Tk bug... sigh... 1771 self.progress.updateProgress(percent_done) 1772 time.sleep(0.01) # wait 10 msec 1773 percent_done = (time.time() - start_time)/duration_sec*100
1774
1775 - def quit(self):
1776 if self.quit_server_too.get(): 1777 self.ephys_server.set_quit_status(1) 1778 # call parent class 1779 Tkinter.Frame.quit(self)
1780
1781 - def destroy(self):
1782 try: 1783 if self.quit_server_too.get(): 1784 self.ephys_server.set_quit_status(1) 1785 except: 1786 pass 1787 Tkinter.Frame.destroy(self)
1788
1789 -class BarButton(Tkinter.Menubutton):
1790 # Taken from Guido van Rossum's Tkinter svkill demo
1791 - def __init__(self, master=None, **cnf):
1792 Tkinter.Menubutton.__init__(self, master, **cnf) 1793 self.pack(side=Tkinter.LEFT) 1794 self.menu = Tkinter.Menu(self, name='menu', tearoff=0) 1795 self['menu'] = self.menu
1796 1797 if __name__ == '__main__': 1798 hostname = os.getenv("ephys_server_hostname","") 1799 port = int(os.getenv("ephys_server_port","7766")) 1800 result = get_server(hostname=hostname,port=port) 1801 if result: 1802 hostname,port = result 1803 app_window = AppWindow(client_list=client_list, 1804 server_hostname=hostname, 1805 server_port=port) 1806 1807 app_window.winfo_toplevel().wm_iconbitmap() 1808 app_window.pack(expand=1,fill=Tkinter.BOTH) 1809 app_window.mainloop() 1810

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html0000644000076500000240000010045111224565530027306 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.AppWindow
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class AppWindow
[frames] | no frames]

Class AppWindow

source code

  Tkinter.Misc --+            
                 |            
Tkinter.BaseWidget --+        
                     |        
      Tkinter.Pack --+        
                     |        
     Tkinter.Place --+        
                     |        
      Tkinter.Grid --+        
                     |        
        Tkinter.Widget --+    
                         |    
             Tkinter.Frame --+
                             |
                            AppWindow

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, client_list=None, server_hostname='', server_port=7766, **cnf)
Construct a frame widget with the parent MASTER.
source code
 
__del__(self) source code
 
switch_to_stimkey(self, stimkey) source code
 
change_stimulus(self, dummy_arg=None, new_stimkey=None) source code
 
save_image_sequence(self) source code
 
save_config(self) source code
 
load_config(self) source code
 
load_params(self, orig_load_dict={}) source code
 
load_demoscript(self) source code
 
launch_screen_pos(self, dummy_arg=None) source code
 
launch_stim_onset_cal(self, dummy_arg=None) source code
 
launch_gamma_panel(self, dummy_arg=None) source code
 
set_autosave_dir(self) source code
 
reset_autosave_basename(self) source code
 
update_stim_onset_cal(self, dummy_arg=None) source code
 
set_stim_onset_cal_position(self, dummy_arg=None) source code
 
do_loops(self) source code
 
do_single_trial(self) source code
 
do_single_trial_pre(self, file_stream) source code
 
do_single_trial_work(self) source code
 
do_single_trial_post(self, file_stream) source code
 
sleep_with_progress(self, duration_sec) source code
 
quit(self)
Quit the Tcl interpreter.
source code
 
destroy(self)
Destroy this and all descendants widgets.
source code

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, client_list=None, server_hostname='', server_port=7766, **cnf)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: Tkinter.Frame.__init__
(inherited documentation)

quit(self)

source code 
Quit the Tcl interpreter. All widgets will be destroyed.

Overrides: Tkinter.Misc.quit
(inherited documentation)

destroy(self)

source code 
Destroy this and all descendants widgets.

Overrides: Tkinter.BaseWidget.destroy
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.BarButton-class.html0000644000076500000240000003352211224565530027302 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.BarButton
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class BarButton
[frames] | no frames]

Class BarButton

source code

  Tkinter.Misc --+            
                 |            
Tkinter.BaseWidget --+        
                     |        
      Tkinter.Pack --+        
                     |        
     Tkinter.Place --+        
                     |        
      Tkinter.Grid --+        
                     |        
        Tkinter.Widget --+    
                         |    
        Tkinter.Menubutton --+
                             |
                            BarButton

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, **cnf)
Construct a widget with the parent widget MASTER, a name WIDGETNAME and appropriate options.
source code

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, **cnf)
(Constructor)

source code 
Construct a widget with the parent widget MASTER, a name WIDGETNAME
and appropriate options.

Overrides: Tkinter.Menubutton.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase-class.html0000644000076500000240000001641011224565530031225 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class ContainedObjectBase
[frames] | no frames]

Class ContainedObjectBase

source code

Base class to encapsulate objects, provides useful methods when used in GUI



Instance Methods
 
__init__(self) source code
 
get_str_30(self) source code
 
get_contained(self) source code
Class Variables
  header = "unknown parameters"
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.GammaFrame-class.html0000644000076500000240000004212011224565530027371 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.GammaFrame
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class GammaFrame
[frames] | no frames]

Class GammaFrame

source code

  Tkinter.Misc --+            
                 |            
Tkinter.BaseWidget --+        
                     |        
      Tkinter.Pack --+        
                     |        
     Tkinter.Place --+        
                     |        
      Tkinter.Grid --+        
                     |        
        Tkinter.Widget --+    
                         |    
             Tkinter.Frame --+
                             |
                            GammaFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, ephys_server=None, **kw)
Construct a frame widget with the parent MASTER.
source code
 
get_corrected_gamma_table(self, gamma) source code
 
linearize(self, dummy_arg=None) source code
 
set_monitor_default(self, dummy_arg=None) source code
 
set_from_file(self) source code

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, ephys_server=None, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: Tkinter.Frame.__init__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher-class.html0000644000076500000240000003741211224565530031601 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class ImageSequenceLauncher
[frames] | no frames]

Class ImageSequenceLauncher

source code

  Tkinter.Misc --+        
                 |        
Tkinter.BaseWidget --+    
                     |    
        Tkinter.Wm --+    
                     |    
      Tkinter.Toplevel --+
                         |
                        ImageSequenceLauncher

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, ephys_server=None, **cnf)
Construct a toplevel widget with the parent MASTER.
source code
 
do_it(self) source code

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Wm: aspect, attributes, client, colormapwindows, command, deiconify, focusmodel, frame, geometry, grid, group, iconbitmap, iconify, iconmask, iconname, iconposition, iconwindow, maxsize, minsize, overrideredirect, positionfrom, protocol, resizable, sizefrom, state, title, transient, withdraw, wm_aspect, wm_attributes, wm_client, wm_colormapwindows, wm_command, wm_deiconify, wm_focusmodel, wm_frame, wm_geometry, wm_grid, wm_group, wm_iconbitmap, wm_iconify, wm_iconmask, wm_iconname, wm_iconposition, wm_iconwindow, wm_maxsize, wm_minsize, wm_overrideredirect, wm_positionfrom, wm_protocol, wm_resizable, wm_sizefrom, wm_state, wm_title, wm_transient, wm_withdraw

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, ephys_server=None, **cnf)
(Constructor)

source code 
Construct a toplevel widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, menu, relief, screen, takefocus,
use, visual, width.

Overrides: Tkinter.Toplevel.__init__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.Loop-class.html0000644000076500000240000003267511224565530026323 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.Loop
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class Loop
[frames] | no frames]

Class Loop

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     Loop

Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code
 
is_done(self) source code
 
get_current(self) source code
 
advance(self) source code
 
reset(self) source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'variable':('<repeat>', ve_types.St...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'variable':('<repeat>', ve_types.String), 'sequence':([1, 1, 1], ve_t\
ypes.Sequence(ve_types.Real)), 'rest_duration_sec':(1.0, ve_types.Real\
)}

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.LoopContainedObject-class.html0000644000076500000240000002363611224565530031274 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.LoopContainedObject
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class LoopContainedObject
[frames] | no frames]

Class LoopContainedObject

source code

ContainedObjectBase --+
                      |
                     LoopContainedObject

Container for Loop class



Nested Classes
  contained_class
Instance Methods
 
__init__(self, contained) source code
 
get_str_30(self) source code

Inherited from ContainedObjectBase: get_contained

Class Variables
  header = " variable rest N values"
Method Details

__init__(self, contained)
(Constructor)

source code 
Overrides: ContainedObjectBase.__init__

get_str_30(self)

source code 
Overrides: ContainedObjectBase.get_str_30

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.LoopParamDialog-class.html0000644000076500000240000004726411224565530030424 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.LoopParamDialog
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class LoopParamDialog
[frames] | no frames]

Class LoopParamDialog

source code

  Tkinter.Misc --+            
                 |            
Tkinter.BaseWidget --+        
                     |        
        Tkinter.Wm --+        
                     |        
      Tkinter.Toplevel --+    
                         |    
     tkSimpleDialog.Dialog --+
                             |
                            LoopParamDialog

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, *args, **kw)
Initialize a dialog.
source code
 
body(self, master)
create dialog body.
source code
 
validate(self)
validate the data This method is called automatically to validate the data before the dialog is destroyed.
source code
 
destroy(self)
Destroy the window
source code

Inherited from tkSimpleDialog.Dialog: apply, buttonbox, cancel, ok

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Wm: aspect, attributes, client, colormapwindows, command, deiconify, focusmodel, frame, geometry, grid, group, iconbitmap, iconify, iconmask, iconname, iconposition, iconwindow, maxsize, minsize, overrideredirect, positionfrom, protocol, resizable, sizefrom, state, title, transient, withdraw, wm_aspect, wm_attributes, wm_client, wm_colormapwindows, wm_command, wm_deiconify, wm_focusmodel, wm_frame, wm_geometry, wm_grid, wm_group, wm_iconbitmap, wm_iconify, wm_iconmask, wm_iconname, wm_iconposition, wm_iconwindow, wm_maxsize, wm_minsize, wm_overrideredirect, wm_positionfrom, wm_protocol, wm_resizable, wm_sizefrom, wm_state, wm_title, wm_transient, wm_withdraw

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, *args, **kw)
(Constructor)

source code 
Initialize a dialog.

Arguments:

    parent -- a parent window (the application window)

    title -- the dialog title

Overrides: tkSimpleDialog.Dialog.__init__
(inherited documentation)

body(self, master)

source code 
create dialog body.

return widget that should have initial focus.
This method should be overridden, and is called
by the __init__ method.

Overrides: tkSimpleDialog.Dialog.body
(inherited documentation)

validate(self)

source code 
validate the data

This method is called automatically to validate the data before the
dialog is destroyed. By default, it always validates OK.

Overrides: tkSimpleDialog.Dialog.validate
(inherited documentation)

destroy(self)

source code 
Destroy the window

Overrides: tkSimpleDialog.Dialog.destroy
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html0000644000076500000240000006263611224565530030457 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUI.ScrollListFrame
Package VisionEgg :: Package PyroApps :: Module EPhysGUI :: Class ScrollListFrame
[frames] | no frames]

Class ScrollListFrame

source code

  Tkinter.Misc --+            
                 |            
Tkinter.BaseWidget --+        
                     |        
      Tkinter.Pack --+        
                     |        
     Tkinter.Place --+        
                     |        
      Tkinter.Grid --+        
                     |        
        Tkinter.Widget --+    
                         |    
             Tkinter.Frame --+
                             |
                            ScrollListFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, list_of_contained_objects=None, contained_objectbject_maker=None, container_class=ContainedObjectBase, **cnf)
Construct a frame widget with the parent MASTER.
source code
 
list2D_coordinates(self, main_index, main_list) source code
 
delegate_hscroll(self, *args, **kw) source code
 
get_list_uncontained(self) source code
 
update_now(self) source code
 
add_new(self) source code
 
edit_selected(self, dummy_arg=None) source code
 
remove_selected(self) source code
 
move_selected_up(self, dummy_arg=None) source code
 
move_selected_down(self, dummy_arg=None) source code
 
make_merge(self) source code
 
make_contained_object(self, container_class)
Factory function for ContainedObjectBase
source code
 
edit_contained_object(self, contained_object) source code
 
make_loop_contained_object(self) source code
 
get_selected(self) source code
 
map_to_listbox_index(self, index) source code

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, list_of_contained_objects=None, contained_objectbject_maker=None, container_class=ContainedObjectBase, **cnf)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: Tkinter.Frame.__init__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUIUtils-module.html0000644000076500000240000001442311224565530026603 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUIUtils
Package VisionEgg :: Package PyroApps :: Module EPhysGUIUtils
[frames] | no frames]

Module EPhysGUIUtils

source code

Classes
  StimulusControlFrame
Variables
  __version__ = VisionEgg.release_name
  __cvs__ = '$Revision$'.split() [1]
  __date__ = ' '.join('$Date$'.split() [1: 3])
  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUIUtils-pysrc.html0000644000076500000240000042440411224565530026462 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUIUtils
Package VisionEgg :: Package PyroApps :: Module EPhysGUIUtils
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.EPhysGUIUtils

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: EPhysGUIUtils 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  import sys, os, time, types, socket 
 15  import Tkinter 
 16  import Pyro.core 
 17   
 18  import VisionEgg.PyroClient 
 19   
 20  __version__ = VisionEgg.release_name 
 21  __cvs__ = '$Revision$'.split()[1] 
 22  __date__ = ' '.join('$Date$'.split()[1:3]) 
 23  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 24   
25 -class StimulusControlFrame(Tkinter.Frame):
26 - def __init__(self, 27 master=None, 28 suppress_go_buttons=0, 29 title="Stimulus Control", 30 meta_params_class=None, 31 **kw):
32 Tkinter.Frame.__init__(self,master,**kw) 33 self.pyro_client = None 34 self.entry_width = 10 35 self.connected = 0 36 if meta_params_class is not None: 37 self.meta_params = meta_params_class() 38 self.loopable_variables = {} 39 40 Tkinter.Label(self, 41 text=title, 42 font=("Helvetica",12,"bold")).pack(expand=Tkinter.YES, 43 fill=Tkinter.X) 44 45 if not suppress_go_buttons: 46 connected_frame = Tkinter.Frame(self) 47 connected_frame.pack(expand=Tkinter.YES, 48 fill=Tkinter.X) 49 50 self.connected_text = Tkinter.StringVar() 51 self.connected_text.set("Server status: Not connected") 52 self.server_hostname = Tkinter.StringVar() 53 self.server_hostname.set( socket.getfqdn('') ) 54 self.server_port = Tkinter.IntVar() 55 self.server_port.set( 7766 ) 56 57 Tkinter.Label(connected_frame, 58 text="Server hostname").grid(row=0, 59 column=0) 60 Tkinter.Entry(connected_frame, 61 textvariable=self.server_hostname).grid(row=0, 62 column=1, 63 columnspan=2) 64 Tkinter.Label(connected_frame, 65 textvariable=self.connected_text).grid(row=1, 66 column=0) 67 Tkinter.Button(connected_frame, 68 text="Connect", 69 command=self.standalone_connect).grid(row=1, 70 column=1) 71 Tkinter.Button(connected_frame, 72 text="Quit server", 73 command=self.quit_server).grid(row=1, 74 column=2) 75 76 self.param_frame = Tkinter.Frame(self) 77 self.param_frame.pack(expand=Tkinter.YES,fill=Tkinter.BOTH) 78 79 if not suppress_go_buttons: 80 Tkinter.Button(self,text="Begin Trial",command=self.go).pack()#expand=Tkinter.YES,fill=Tkinter.BOTH)
81
82 - def make_callback_entry(self, master=None, **kw):
83 if 'width' not in kw.keys(): 84 kw['width'] = self.entry_width 85 if master==None: 86 master=self.param_frame 87 e = Tkinter.Entry(master,**kw) 88 e.bind('<Return>',self.send_values) 89 e.bind('<Tab>',self.send_values) 90 return e
91
92 - def get_shortname(self):
93 """Used as basename for saving parameter files and other ID purposes""" 94 raise NotImplementedError("Must be overriden by derived class")
95
96 - def set_param_dict(self,new_param_dict):
97 orig_params = dir(self.meta_params) 98 for new_param_name in new_param_dict.keys(): 99 if new_param_name[:2] != '__' and new_param_name[-2:] != '__': 100 if new_param_name not in orig_params: 101 raise ValueError('Gave parameter "%s", which I do not know about.'%(new_param_name,)) 102 setattr(self.meta_params,new_param_name,new_param_dict[new_param_name]) 103 self.update_tk_vars() 104 self.update() # update screen with new tk_var value
105
106 - def update_tk_vars(self):
107 """Update Tkinter variables with (new) values from meta_params""" 108 raise NotImplementedError("Must be overriden by derived class")
109
110 - def get_parameters_dict(self):
111 result = {} 112 for param_name in dir(self.meta_params): 113 if param_name[:2] != '__' and param_name[-2:] != '__': 114 result[param_name] = getattr(self.meta_params,param_name) 115 return result
116
118 """Return parameter values as Python-executable strings""" 119 result = [] 120 for param_name in dir(self.meta_params): 121 if param_name[:2] != '__' and param_name[-2:] != '__': 122 value = getattr(self.meta_params,param_name) 123 value_string = repr(value) 124 result.append((param_name,value_string)) 125 return result
126
128 """Return parameter values as Matlab-executable strings""" 129 result = [] 130 for param_name in dir(self.meta_params): 131 if param_name[:2] != '__' and param_name[-2:] != '__': 132 value = getattr(self.meta_params,param_name) 133 value_string = self.get_matlab_string(value) 134 result.append((param_name,value_string)) 135 return result
136
137 - def get_matlab_string(self, value):
138 # I'm no Matlab whiz, so you may have to modify this!! 139 if type(value) in [types.IntType, types.FloatType]: 140 return str(value) 141 elif type(value) in [types.ListType, types.TupleType]: 142 s = "[ " 143 for v in value: 144 s += str(v) + " " 145 s += "]" 146 return s 147 elif type(value) == types.StringType: 148 s = "'%s'"%value 149 return s 150 else: 151 raise NotImplementedError("No support for converting %s to Matlab format."%str(type(value)))
152
153 - def set_parameters_dict(self, dict):
154 for key in dict.keys(): 155 if not key in dir(self.meta_params): 156 raise RuntimeError("Parameter %s not in %s"%(key, str(self.meta_params))) 157 setattr(self.meta_params,key,dict[key])
158
160 return self.loopable_variables.keys()
161
162 - def set_loopable_variable(self,easy_name,value):
163 meta_param_var_name,tk_var = self.loopable_variables[easy_name] 164 setattr(self.meta_params,meta_param_var_name,value) 165 tk_var.set(value) 166 self.update() # update screen with new tk_var value
167
168 - def send_values(self,dummy_arg=None):
169 """Update meta_params variables with values from Tkinter fields""" 170 raise NotImplementedError("Must be overriden by derived class")
171
172 - def get_duration_sec(self):
173 """Calculate total duration in go loop""" 174 raise NotImplementedError("Must be overriden by derived class")
175
176 - def go(self,dummy_arg=None):
177 self.send_values() 178 if not self.connected: 179 raise RuntimeError("must be connected to run trial") 180 181 root = self.winfo_toplevel() 182 old_cursor = root["cursor"] 183 184 root["cursor"] = "watch" 185 root.update() 186 self.meta_controller.go() 187 root["cursor"] = old_cursor 188 root.update()
189
190 - def standalone_connect(self):
191 self.connect(self.server_hostname.get(),self.server_port.get())
192
193 - def connect(self,server_hostname,server_port):
194 self.pyro_client = VisionEgg.PyroClient.PyroClient(server_hostname,server_port) 195 196 shortname = self.get_shortname() 197 meta_controller_name = shortname + "_server" 198 timeout_seconds = 60.0 199 retry_interval_seconds = 0.1 200 start_time = time.time() 201 if hasattr(self,"meta_controller"): 202 del self.meta_controller # get rid of old meta_controller 203 204 # get new meta_controller 205 while not hasattr(self,"meta_controller"): 206 try: 207 self.meta_controller = self.pyro_client.get(meta_controller_name) 208 except Pyro.errors.NamingError, x: 209 if str(x) == "name not found": 210 if (time.time()-start_time) >= timeout_seconds: 211 raise # Couldn't find experiment controller on Pyro network 212 time.sleep(retry_interval_seconds) 213 else: 214 raise # unknown error 215 216 # attribute error: check: stimkey == short_name + "_server" 217 self.meta_params = self.meta_controller.get_parameters() 218 219 self.connected = 1 220 if hasattr(self,'connected_text'): # EPhysGUI client suppresses this 221 self.connected_text.set("Server status: Connected")
222
223 - def quit_server(self,dummy=None):
224 self.meta_controller.quit_server() 225 self.connected = 0 226 if hasattr(self,'connected_text'): # EPhysGUI client suppresses this label 227 self.connected_text.set("Server status: Not connected")
228 229 if __name__=='__main__': 230 frame = StimulusControlFrame() 231 frame.pack(expand=Tkinter.YES,fill=Tkinter.BOTH) 232 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 233 frame.mainloop() 234

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html0000644000076500000240000006671011224565530032571 0ustar astrawstaff VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame
Package VisionEgg :: Package PyroApps :: Module EPhysGUIUtils :: Class StimulusControlFrame
[frames] | no frames]

Class StimulusControlFrame

source code

  Tkinter.Misc --+            
                 |            
Tkinter.BaseWidget --+        
                     |        
      Tkinter.Pack --+        
                     |        
     Tkinter.Place --+        
                     |        
      Tkinter.Grid --+        
                     |        
        Tkinter.Widget --+    
                         |    
             Tkinter.Frame --+
                             |
                            StimulusControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, title="Stimulus Control", meta_params_class=None, **kw)
Construct a frame widget with the parent MASTER.
source code
 
make_callback_entry(self, master=None, **kw) source code
 
get_shortname(self)
Used as basename for saving parameter files and other ID purposes
source code
 
set_param_dict(self, new_param_dict) source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
get_parameters_dict(self) source code
 
get_parameters_as_py_strings(self)
Return parameter values as Python-executable strings
source code
 
get_parameters_as_m_strings(self)
Return parameter values as Matlab-executable strings
source code
 
get_matlab_string(self, value) source code
 
set_parameters_dict(self, dict) source code
 
get_loopable_variable_names(self) source code
 
set_loopable_variable(self, easy_name, value) source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code
 
go(self, dummy_arg=None) source code
 
standalone_connect(self) source code
 
connect(self, server_hostname, server_port) source code
 
quit_server(self, dummy=None) source code

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, title="Stimulus Control", meta_params_class=None, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: Tkinter.Frame.__init__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysServer-module.html0000644000076500000240000002247211224565530026407 0ustar astrawstaff VisionEgg.PyroApps.EPhysServer
Package VisionEgg :: Package PyroApps :: Module EPhysServer
[frames] | no frames]

Module EPhysServer

source code

Classes
  EPhysServer
Functions
 
start_server(server_modules, server_class=EPhysServer) source code
Variables
  __version__ = '1.1.dev'
  __cvs__ = '$Revision$'.split() [1]
  __date__ = ' '.join('$Date$'.split() [1: 3])
  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
  server_modules = [VisionEgg.PyroApps.TargetServer, VisionEgg.P...
Variables Details

server_modules

Value:
[VisionEgg.PyroApps.TargetServer, VisionEgg.PyroApps.MouseTargetServer\
, VisionEgg.PyroApps.FlatGratingServer, VisionEgg.PyroApps.SphereGrati\
ngServer, VisionEgg.PyroApps.SpinningDrumServer, VisionEgg.PyroApps.Gr\
idServer, VisionEgg.PyroApps.ColorCalServer, VisionEgg.PyroApps.Dropin\
Server]

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysServer-pysrc.html0000644000076500000240000051577311224565530026275 0ustar astrawstaff VisionEgg.PyroApps.EPhysServer
Package VisionEgg :: Package PyroApps :: Module EPhysServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.EPhysServer

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: EPhysServer 
  4  # 
  5  # Copyright (C) 2001-2004 Andrew Straw, 
  6  # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd 
  7  # Copyright (C) 2004 California Institute of Technology 
  8  # 
  9  # Author: Andrew Straw <astraw@users.sourceforge.net> 
 10  # URL: <http://www.visionegg.org/> 
 11  # 
 12  # Distributed under the terms of the GNU Lesser General Public License 
 13  # (LGPL). See LICENSE.TXT that came with this file. 
 14  # 
 15  # $Id$ 
 16   
 17  import VisionEgg 
 18  __version__ = VisionEgg.release_name 
 19  __cvs__ = '$Revision$'.split()[1] 
 20  __date__ = ' '.join('$Date$'.split()[1:3]) 
 21  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 22   
 23  import sys, os, math 
 24  import parser, symbol, token, compiler 
 25  import tkMessageBox 
 26  import pygame.display 
 27  import VisionEgg.Core 
 28  import VisionEgg.FlowControl 
 29  import VisionEgg.SphereMap 
 30  import VisionEgg.Text 
 31  import VisionEgg.Textures 
 32  import VisionEgg.PyroHelpers 
 33  import Pyro, Pyro.core 
 34   
 35  # AST extensions: 
 36  import VisionEgg.PyroApps.AST_ext as AST_ext 
 37   
 38  # Add your stimulus modules here 
 39  import VisionEgg.PyroApps.TargetServer 
 40  import VisionEgg.PyroApps.MouseTargetServer 
 41  import VisionEgg.PyroApps.FlatGratingServer 
 42  import VisionEgg.PyroApps.SphereGratingServer 
 43  import VisionEgg.PyroApps.SpinningDrumServer 
 44  import VisionEgg.PyroApps.GridServer 
 45  import VisionEgg.PyroApps.ColorCalServer 
 46  import VisionEgg.PyroApps.DropinServer 
 47   
 48  server_modules = [ VisionEgg.PyroApps.TargetServer, 
 49                     VisionEgg.PyroApps.MouseTargetServer, 
 50                     VisionEgg.PyroApps.FlatGratingServer, 
 51                     VisionEgg.PyroApps.SphereGratingServer, 
 52                     VisionEgg.PyroApps.SpinningDrumServer, 
 53                     VisionEgg.PyroApps.GridServer, 
 54                     VisionEgg.PyroApps.ColorCalServer, 
 55                     VisionEgg.PyroApps.DropinServer 
 56                     ] 
 57   
 58  # 3D screen positioning parameters 
 59  from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController 
 60  from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters 
 61   
62 -class EPhysServer( Pyro.core.ObjBase ):
63 - def __init__(self, presentation, server_modules ):
64 Pyro.core.ObjBase.__init__(self) 65 self.stimdict = {} 66 self.stimkey = server_modules[0].get_meta_controller_stimkey() # first stimulus will be this 67 self.quit_status = False 68 self.exec_demoscript_flag = False 69 self.presentation = presentation 70 # target for stimulus onset calibration 71 self.onset_cal_bg = VisionEgg.MoreStimuli.Target2D(color=(0.0,0.0,0.0,1.0), 72 position=(30.0,30.0), 73 anchor='center', 74 size=(50.0,50.0)) 75 self.onset_cal_fg = VisionEgg.MoreStimuli.Target2D(on=0, 76 color=(1.0,1.0,1.0,1.0), 77 position=(30.0,30.0), 78 anchor='center', 79 size=(50.0,50.0)) 80 self.presentation.add_controller(self.onset_cal_fg,'on',VisionEgg.FlowControl.ConstantController(during_go_value=1, 81 between_go_value=0)) 82 # get screen (hack) 83 self.onset_cal_screen = self.presentation.parameters.viewports[0].parameters.screen 84 self.onset_cal_viewport = VisionEgg.Core.Viewport(screen=self.onset_cal_screen, 85 stimuli=[self.onset_cal_bg, 86 self.onset_cal_fg] 87 ) 88 89 for server_module in server_modules: 90 stimkey = server_module.get_meta_controller_stimkey() 91 klass = server_module.get_meta_controller_class() 92 make_stimuli = server_module.make_stimuli 93 self.stimdict[stimkey] = (klass, make_stimuli)
94
95 - def __del__(self):
96 self.presentation.remove_controller(self.onset_cal_fg,'on') 97 Pyro.core.ObjBase.__del__(self)
98
99 - def get_quit_status(self):
100 return self.quit_status
101
102 - def set_quit_status(self,quit_status):
103 self.quit_status = quit_status 104 self.presentation.parameters.quit = quit_status
105
106 - def first_connection(self):
107 # break out of initial run_forever loop 108 self.presentation.parameters.quit = True
109
110 - def set_stim_onset_cal(self, on):
111 if on: 112 if self.onset_cal_viewport not in self.presentation.parameters.viewports: 113 self.presentation.parameters.viewports.append(self.onset_cal_viewport) 114 else: 115 if self.onset_cal_viewport in self.presentation.parameters.viewports: 116 self.presentation.parameters.viewports.remove(self.onset_cal_viewport)
117
118 - def set_stim_onset_cal_location(self, center, size):
119 self.onset_cal_bg.parameters.position = center 120 self.onset_cal_fg.parameters.position = center 121 self.onset_cal_bg.parameters.size = size 122 self.onset_cal_fg.parameters.size = size[0]-2,size[1]-2
123
125 x,y = self.onset_cal_bg.parameters.position 126 width,height = self.onset_cal_bg.parameters.size 127 return x,y,width,height
128
129 - def set_gamma_ramp(self, red, blue, green):
130 return pygame.display.set_gamma_ramp(red,green,blue)
131
132 - def is_in_go_loop(self):
133 return self.presentation.is_in_go_loop()
134
136 return self.presentation.were_frames_dropped_in_last_go_loop()
137
139 return self.presentation.get_last_go_loop_start_time_absolute_sec()
140
141 - def set_override_t_abs_sec(self, value_sec_string):
142 value_sec = float(value_sec_string) # Pyro loses precision 143 self.presentation.parameters.override_t_abs_sec = value_sec
144
146 if self.stimkey: 147 klass, make_stimuli = self.stimdict[self.stimkey] 148 stimuli = make_stimuli() 149 return self.stimkey, klass, stimuli 150 else: 151 raise RuntimeError("No stimkey")
152
153 - def get_stimkey(self):
154 return self.stimkey
155
156 - def set_next_stimkey(self,stimkey):
157 self.stimkey = stimkey
158
159 - def get_cwd(self):
160 return os.path.abspath(os.curdir)
161
162 - def save_image_sequence(self,fps=12.0,filename_base="im",filename_suffix=".tif",save_dir="."):
163 try: 164 self.presentation.export_movie_go(frames_per_sec=fps, 165 filename_base=filename_base, 166 filename_suffix=filename_suffix, 167 path=save_dir 168 ) 169 except Exception,x: 170 # do this because Pyro doesn't (by default) print a traceback 171 import traceback 172 traceback.print_exc() 173 raise
174
175 - def build_AST(self, source):
176 AST = parser.suite(source) 177 self.AST = AST
178
179 - def exec_AST(self, screen, dropin_meta_params):
180 181 if dropin_meta_params.vars_list is not None: 182 for var in dropin_meta_params.vars_list: 183 self.AST = AST_ext.modify_AST(self.AST, var[0], var[1]) 184 185 code_module = self.AST.compile() 186 exec code_module in locals() 187 self.script_dropped_frames = p.were_frames_dropped_in_last_go_loop() 188 self.presentation.last_go_loop_start_time_absolute_sec = p.last_go_loop_start_time_absolute_sec # evil hack... 189 self.exec_demoscript_flag = False
190
191 - def run_demoscript(self):
192 self.exec_demoscript_flag = True
193
194 -def start_server( server_modules, server_class=EPhysServer ):
195 196 loadNewExpr = True 197 pyro_server = VisionEgg.PyroHelpers.PyroServer() 198 199 # get Vision Egg stimulus ready to go 200 screen = VisionEgg.Core.Screen.create_default() 201 202 temp = ScreenPositionParameters() 203 204 projection = VisionEgg.Core.PerspectiveProjection(temp.left, 205 temp.right, 206 temp.bottom, 207 temp.top, 208 temp.near, 209 temp.far) 210 perspective_viewport = VisionEgg.Core.Viewport(screen=screen, 211 projection=projection) 212 overlay2D_viewport = VisionEgg.Core.Viewport(screen=screen) 213 p = VisionEgg.FlowControl.Presentation(viewports=[perspective_viewport, overlay2D_viewport]) # 2D overlay on top 214 print 'main Presentation',p 215 216 wait_text = VisionEgg.Text.Text( 217 text = "Starting up...", 218 position = (screen.size[0]/2.0,5), 219 anchor='bottom', 220 color = (1.0,0.0,0.0,0.0)) 221 222 overlay2D_viewport.parameters.stimuli = [wait_text] 223 p.between_presentations() # draw wait_text 224 225 # now hand over control of projection to ScreenPositionMetaController 226 projection_controller = ScreenPositionMetaController(p,projection) 227 pyro_server.connect(projection_controller,"projection_controller") 228 229 ephys_server = server_class(p, server_modules) 230 pyro_server.connect(ephys_server,"ephys_server") 231 hostname,port = pyro_server.get_hostname_and_port() 232 233 wait_text.parameters.text = "Waiting for connection at %s port %d"%(hostname,port) 234 235 # get listener controller and register it 236 p.add_controller(None,None, pyro_server.create_listener_controller()) 237 238 p.run_forever() # run until we get first connnection, which breaks out immmediately 239 240 wait_text.parameters.text = "Loading new experiment, please wait." 241 242 while not ephys_server.get_quit_status(): 243 # this flow control configuration SEEMS to be stable for 244 # contiguously loaded scripts more rigorous testing would be 245 # appreciated 246 if loadNewExpr: 247 wait_text.parameters.text = "Loading new experiment, please wait." 248 perspective_viewport.parameters.stimuli = [] 249 overlay2D_viewport.parameters.stimuli = [wait_text] 250 p.between_presentations() # draw wait_text 251 pyro_name, meta_controller_class, stimulus_list = ephys_server.get_next_stimulus_meta_controller() 252 stimulus_meta_controller = meta_controller_class(screen, p, stimulus_list) # instantiate meta_controller 253 pyro_server.connect(stimulus_meta_controller, pyro_name) 254 255 if ephys_server.get_stimkey() == "dropin_server": 256 wait_text.parameters.text = "Vision Egg script mode" 257 258 p.parameters.enter_go_loop = False 259 p.parameters.quit = False 260 p.run_forever() 261 262 # At this point quit signal was sent by client to either: 263 264 # 1) Execute the script (ie. "exec_demoscript_flag" has 265 # been set) 266 267 # 2) Load a DIFFERENT script ("loadNewExpr" should be set 268 # to False in this event) 269 270 # 3) Load a BUILT IN experiment ("loadNewExpr" should be 271 # set to True in this event) 272 273 if ephys_server.exec_demoscript_flag: 274 dropin_meta_params = stimulus_meta_controller.get_parameters() 275 ephys_server.exec_AST(screen, dropin_meta_params) 276 277 if ephys_server.get_stimkey() == "dropin_server": 278 # Either: 279 # 1) Same script (just finished executing) 280 # 2) Loading a new script 281 loadNewExpr = False 282 else: 283 # 3) load a BUILT IN experiment 284 pyro_server.disconnect(stimulus_meta_controller) 285 del stimulus_meta_controller # we have to do this explicitly because Pyro keeps a copy of the reference 286 loadNewExpr = True 287 else: 288 overlay2D_viewport.parameters.stimuli = [] # clear wait_text 289 for stim in stimulus_list: 290 if stim[0] == '3d_perspective': 291 perspective_viewport.parameters.stimuli.append(stim[1]) 292 elif stim[0] == '3d_perspective_with_set_viewport_callback': 293 key, stimulus, callback_function = stim 294 callback_function(perspective_viewport) 295 perspective_viewport.parameters.stimuli.append(stimulus) 296 elif stim[0] == '2d_overlay': 297 overlay2D_viewport.parameters.stimuli.append(stim[1]) 298 else: 299 raise RuntimeError("Unknown viewport id %s"%stim[0]) 300 301 # enter loop 302 p.parameters.enter_go_loop = False 303 p.parameters.quit = False 304 p.run_forever() 305 306 # At this point quit signal was sent by client to either: 307 308 # 1) Load a script ("loadNewExpr" should be set to 1 in 309 # this event) 310 311 # 2) Load a BUILT IN experiment ("loadNewExpr" should be 312 # set to 1 in this event) 313 314 pyro_server.disconnect(stimulus_meta_controller) 315 del stimulus_meta_controller # we have to do this explicitly because Pyro keeps a copy of the reference
316 317 if __name__ == '__main__': 318 start_server( server_modules ) 319

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html0000644000076500000240000005316211224565530030445 0ustar astrawstaff VisionEgg.PyroApps.EPhysServer.EPhysServer
Package VisionEgg :: Package PyroApps :: Module EPhysServer :: Class EPhysServer
[frames] | no frames]

Class EPhysServer

source code

Pyro.core.ObjBase --+
                    |
                   EPhysServer

Instance Methods
 
__init__(self, presentation, server_modules) source code
 
__del__(self) source code
 
get_quit_status(self) source code
 
set_quit_status(self, quit_status) source code
 
first_connection(self) source code
 
set_stim_onset_cal(self, on) source code
 
set_stim_onset_cal_location(self, center, size) source code
 
get_stim_onset_cal_location(self) source code
 
set_gamma_ramp(self, red, blue, green) source code
 
is_in_go_loop(self) source code
 
were_frames_dropped_in_last_go_loop(self) source code
 
get_last_go_loop_start_time_absolute_sec(self) source code
 
set_override_t_abs_sec(self, value_sec_string) source code
 
get_next_stimulus_meta_controller(self) source code
 
get_stimkey(self) source code
 
set_next_stimkey(self, stimkey) source code
 
get_cwd(self) source code
 
save_image_sequence(self, fps=12.0, filename_base="im", filename_suffix=".tif", save_dir=".") source code
 
build_AST(self, source) source code
 
exec_AST(self, screen, dropin_meta_params) source code
 
run_demoscript(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, presentation, server_modules)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI-module.html0000644000076500000240000001631311224565530026734 0ustar astrawstaff VisionEgg.PyroApps.FlatGratingGUI
Package VisionEgg :: Package PyroApps :: Module FlatGratingGUI
[frames] | no frames]

Module FlatGratingGUI

source code

Handle sinusoidal gratings (client-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  FlatGratingMetaParameters
  FlatGratingControlFrame
Functions
 
get_control_list() source code
Variables
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI-pysrc.html0000644000076500000240000034652711224565530026624 0ustar astrawstaff VisionEgg.PyroApps.FlatGratingGUI
Package VisionEgg :: Package PyroApps :: Module FlatGratingGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.FlatGratingGUI

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: FlatGratingGUI 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  """Handle sinusoidal gratings (client-side)""" 
 15   
 16  import VisionEgg, string 
 17  __version__ = VisionEgg.release_name 
 18  __cvs__ = string.split('$Revision$')[1] 
 19  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 21   
 22  import sys, os 
 23  import Tkinter 
 24  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
 25   
26 -def get_control_list():
27 return [("flat_grating_server",FlatGratingControlFrame,FlatGratingControlFrame.title)]
28
30 - def __init__(self):
31 self.contrast = 1.0 32 self.orient = 0.0 33 self.sf = 0.01 # cycles per pixel 34 self.tf = 1.0 35 self.size_x = 200.0 36 self.size_y = 200.0 37 self.center_x = 320.0 38 self.center_y = 240.0 39 self.pre_stim_sec = 1.0 40 self.stim_sec = 2.0 41 self.post_stim_sec = 1.0
42
43 -class FlatGratingControlFrame(client_utils.StimulusControlFrame):
44 title = "Grating (2D) Experiment"
45 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
46 client_utils.StimulusControlFrame.__init__(self, 47 master, 48 suppress_go_buttons, 49 FlatGratingControlFrame.title, 50 FlatGratingMetaParameters, 51 **kw) 52 53 param_frame = self.param_frame # shorthand for self.param_frame created in base class 54 55 # Allow columns to expand 56 param_frame.columnconfigure(0,weight=1) 57 param_frame.columnconfigure(1,weight=1) 58 59 pf_row = 0 60 Tkinter.Label(param_frame,text="Contrast:").grid(row=pf_row,column=0) 61 self.contrast_tk_var = Tkinter.DoubleVar() 62 self.contrast_tk_var.set(self.meta_params.contrast) 63 self.make_callback_entry(textvariable=self.contrast_tk_var).grid(row=pf_row,column=1) 64 self.loopable_variables["Contrast"] = ("contrast",self.contrast_tk_var) 65 66 pf_row += 1 67 Tkinter.Label(param_frame,text="Orientation (deg):").grid(row=pf_row,column=0) 68 self.orient_tk_var = Tkinter.DoubleVar() 69 self.orient_tk_var.set(self.meta_params.orient) 70 self.make_callback_entry(textvariable=self.orient_tk_var).grid(row=pf_row,column=1) 71 self.loopable_variables["Orientation"] = ("orient",self.orient_tk_var) 72 73 pf_row += 1 74 Tkinter.Label(param_frame,text="Spatial frequency (Cpp):").grid(row=pf_row,column=0) 75 self.sf_tk_var = Tkinter.DoubleVar() 76 self.sf_tk_var.set(self.meta_params.sf) 77 self.make_callback_entry(textvariable=self.sf_tk_var).grid(row=pf_row,column=1) 78 self.loopable_variables["Spatial frequency"] = ("sf",self.sf_tk_var) 79 80 pf_row += 1 81 Tkinter.Label(param_frame,text="Temporal frequency (Hz):").grid(row=pf_row,column=0) 82 self.tf_tk_var = Tkinter.DoubleVar() 83 self.tf_tk_var.set(self.meta_params.tf) 84 self.make_callback_entry(textvariable=self.tf_tk_var).grid(row=pf_row,column=1) 85 self.loopable_variables["Temporal frequency"] = ("tf",self.tf_tk_var) 86 87 pf_row += 1 88 Tkinter.Label(param_frame,text="Size X (pixels):").grid(row=pf_row,column=0) 89 self.size_x_tk_var = Tkinter.DoubleVar() 90 self.size_x_tk_var.set(self.meta_params.size_x) 91 self.make_callback_entry(textvariable=self.size_x_tk_var).grid(row=pf_row,column=1) 92 self.loopable_variables["Size X"] = ("size_x",self.size_x_tk_var) 93 94 pf_row += 1 95 Tkinter.Label(param_frame,text="Size Y (pixels):").grid(row=pf_row,column=0) 96 self.size_y_tk_var = Tkinter.DoubleVar() 97 self.size_y_tk_var.set(self.meta_params.size_y) 98 self.make_callback_entry(textvariable=self.size_y_tk_var).grid(row=pf_row,column=1) 99 self.loopable_variables["Size Y"] = ("size_y",self.size_y_tk_var) 100 101 pf_row += 1 102 Tkinter.Label(param_frame,text="Center X (pixels):").grid(row=pf_row,column=0) 103 self.center_x_tk_var = Tkinter.DoubleVar() 104 self.center_x_tk_var.set(self.meta_params.center_x) 105 self.make_callback_entry(textvariable=self.center_x_tk_var).grid(row=pf_row,column=1) 106 self.loopable_variables["Center X"] = ("center_x",self.center_x_tk_var) 107 108 pf_row += 1 109 Tkinter.Label(param_frame,text="Center Y (pixels):").grid(row=pf_row,column=0) 110 self.center_y_tk_var = Tkinter.DoubleVar() 111 self.center_y_tk_var.set(self.meta_params.center_y) 112 self.make_callback_entry(textvariable=self.center_y_tk_var).grid(row=pf_row,column=1) 113 self.loopable_variables["Center Y"] = ("center_y",self.center_y_tk_var) 114 115 pf_row += 1 116 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0) 117 self.prestim_dur_tk_var = Tkinter.DoubleVar() 118 self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) 119 self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=1) 120 121 pf_row += 1 122 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0) 123 self.stim_dur_tk_var = Tkinter.DoubleVar() 124 self.stim_dur_tk_var.set(self.meta_params.stim_sec) 125 self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=1) 126 127 pf_row += 1 128 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0) 129 self.poststim_dur_tk_var = Tkinter.DoubleVar() 130 self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) 131 self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=1)
132
133 - def get_shortname(self):
134 return "flat_grating"
135
136 - def update_tk_vars(self):
137 self.contrast_tk_var.set( self.meta_params.contrast ) 138 self.orient_tk_var.set( self.meta_params.orient ) 139 self.sf_tk_var.set( self.meta_params.sf ) 140 self.tf_tk_var.set( self.meta_params.tf ) 141 self.size_x_tk_var.set( self.meta_params.size_x ) 142 self.size_y_tk_var.set( self.meta_params.size_y ) 143 self.center_x_tk_var.set( self.meta_params.center_x ) 144 self.center_y_tk_var.set( self.meta_params.center_y ) 145 self.prestim_dur_tk_var.set( self.meta_params.pre_stim_sec ) 146 self.stim_dur_tk_var.set( self.meta_params.stim_sec ) 147 self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec )
148
149 - def send_values(self,dummy_arg=None):
150 self.meta_params.contrast = self.contrast_tk_var.get() 151 self.meta_params.orient = self.orient_tk_var.get() 152 self.meta_params.sf = self.sf_tk_var.get() 153 self.meta_params.tf = self.tf_tk_var.get() 154 self.meta_params.size_x = self.size_x_tk_var.get() 155 self.meta_params.size_y = self.size_y_tk_var.get() 156 self.meta_params.center_x = self.center_x_tk_var.get() 157 self.meta_params.center_y = self.center_y_tk_var.get() 158 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 159 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 160 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 161 if self.connected: 162 self.meta_controller.set_parameters( self.meta_params )
163
164 - def get_duration_sec(self):
165 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 166 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 167 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 168 return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec
169 170 if __name__=='__main__': 171 frame = FlatGratingControlFrame() 172 frame.pack(expand=1,fill=Tkinter.BOTH) 173 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 174 frame.mainloop() 175

././@LongLink0000000000000000000000000000015000000000000011702 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.h0000644000076500000240000006013011224565530032550 0ustar astrawstaff VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame
Package VisionEgg :: Package PyroApps :: Module FlatGratingGUI :: Class FlatGratingControlFrame
[frames] | no frames]

Class FlatGratingControlFrame

source code

      Tkinter.Misc --+                
                     |                
    Tkinter.BaseWidget --+            
                         |            
          Tkinter.Pack --+            
                         |            
         Tkinter.Place --+            
                         |            
          Tkinter.Grid --+            
                         |            
            Tkinter.Widget --+        
                             |        
                 Tkinter.Frame --+    
                                 |    
EPhysGUIUtils.StimulusControlFrame --+
                                     |
                                    FlatGratingControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, **kw)
Construct a frame widget with the parent MASTER.
source code
 
get_shortname(self)
Used as basename for saving parameter files and other ID purposes
source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code

Inherited from EPhysGUIUtils.StimulusControlFrame: connect, get_loopable_variable_names, get_matlab_string, get_parameters_as_m_strings, get_parameters_as_py_strings, get_parameters_dict, go, make_callback_entry, quit_server, set_loopable_variable, set_param_dict, set_parameters_dict, standalone_connect

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables
  title = "Grating (2D) Experiment"

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: EPhysGUIUtils.StimulusControlFrame.__init__

get_shortname(self)

source code 
Used as basename for saving parameter files and other ID purposes

Overrides: EPhysGUIUtils.StimulusControlFrame.get_shortname
(inherited documentation)

update_tk_vars(self)

source code 
Update Tkinter variables with (new) values from meta_params

Overrides: EPhysGUIUtils.StimulusControlFrame.update_tk_vars
(inherited documentation)

send_values(self, dummy_arg=None)

source code 
Update meta_params variables with values from Tkinter fields

Overrides: EPhysGUIUtils.StimulusControlFrame.send_values
(inherited documentation)

get_duration_sec(self)

source code 
Calculate total duration in go loop

Overrides: EPhysGUIUtils.StimulusControlFrame.get_duration_sec
(inherited documentation)

././@LongLink0000000000000000000000000000015200000000000011704 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters-class0000644000076500000240000001233511224565530032645 0ustar astrawstaff VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters
Package VisionEgg :: Package PyroApps :: Module FlatGratingGUI :: Class FlatGratingMetaParameters
[frames] | no frames]

Class FlatGratingMetaParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingServer-module.html0000644000076500000240000002035011224565530027552 0ustar astrawstaff VisionEgg.PyroApps.FlatGratingServer
Package VisionEgg :: Package PyroApps :: Module FlatGratingServer
[frames] | no frames]

Module FlatGratingServer

source code

Handle sinusoidal gratings (server-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  FlatGratingExperimentMetaController
Functions
 
get_meta_controller_class() source code
 
make_stimuli() source code
 
get_meta_controller_stimkey() source code
Variables
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingServer-pysrc.html0000644000076500000240000027652411224565530027445 0ustar astrawstaff VisionEgg.PyroApps.FlatGratingServer
Package VisionEgg :: Package PyroApps :: Module FlatGratingServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.FlatGratingServer

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: FlatGratingServer 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  """Handle sinusoidal gratings (server-side)""" 
 15   
 16  import VisionEgg, string 
 17  __version__ = VisionEgg.release_name 
 18  __cvs__ = string.split('$Revision$')[1] 
 19  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 21   
 22  import sys, os, math 
 23  import VisionEgg.Core 
 24  import VisionEgg.FlowControl 
 25  import VisionEgg.Gratings 
 26  import VisionEgg.PyroHelpers 
 27  import Pyro.core 
 28   
 29  from VisionEgg.PyroApps.FlatGratingGUI import FlatGratingMetaParameters 
 30   
31 -class FlatGratingExperimentMetaController( Pyro.core.ObjBase ):
32 - def __init__(self,screen,presentation,stimuli):
33 34 # get stimulus 35 assert( stimuli[0][0] == '2d_overlay') 36 grating = stimuli[0][1] 37 38 Pyro.core.ObjBase.__init__(self) 39 self.meta_params = FlatGratingMetaParameters() 40 if not isinstance(screen,VisionEgg.Core.Screen): 41 raise ValueError("Expecting instance of VisionEgg.Core.Screen") 42 if not isinstance(presentation,VisionEgg.FlowControl.Presentation): 43 raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") 44 if not isinstance(grating,VisionEgg.Gratings.SinGrating2D): 45 raise ValueError("Expecting instance of VisionEgg.Gratings.SinGrating2D") 46 self.p = presentation 47 self.stim = grating 48 49 screen.parameters.bgcolor = (0.5, 0.5, 0.5, 0.0) 50 51 self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController( 52 during_go_func=self.on_function_during_go, 53 between_go_func=self.on_function_between_go))
54
55 - def __del__(self):
56 self.p.remove_controller(self.stim,'on') 57 Pyro.core.ObjBase.__del__(self) # call base class
58
59 - def on_function_during_go(self,t):
60 """Compute when the grating is on""" 61 if t <= self.meta_params.pre_stim_sec: 62 return 0 # not on yet 63 elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): 64 return 1 # on 65 else: 66 return 0 # off again
67
68 - def on_function_between_go(self):
69 """Compute when the grating is off""" 70 return 0 # off again
71
72 - def get_parameters(self):
73 return self.meta_params
74
75 - def set_parameters(self, new_parameters):
76 if isinstance(new_parameters, FlatGratingMetaParameters): 77 self.meta_params = new_parameters 78 else: 79 raise ValueError("Argument to set_parameters must be instance of FlatGratingMetaParameters") 80 self.update()
81
82 - def update(self):
83 stim_params = self.stim.parameters # shorthand 84 meta_params = self.meta_params # shorthand 85 stim_params.contrast = meta_params.contrast 86 stim_params.orientation = meta_params.orient 87 stim_params.spatial_freq = meta_params.sf 88 stim_params.temporal_freq_hz = meta_params.tf 89 stim_params.size = (meta_params.size_x, meta_params.size_y) 90 stim_params.position = (meta_params.center_x, meta_params.center_y) 91 self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds')
92
93 - def go(self):
94 self.p.parameters.enter_go_loop = 1
95
96 - def quit_server(self):
97 self.p.parameters.quit = 1
98 101
102 -def make_stimuli():
103 stimulus = VisionEgg.Gratings.SinGrating2D( spatial_freq=1.0/100.0, # wavelength = 100 pixels 104 temporal_freq_hz = 1.0, 105 anchor='center', 106 ) 107 return [('2d_overlay',stimulus)]
108
110 return "flat_grating_server"
111 112 # Don't do anything unless this script is being run 113 if __name__ == '__main__': 114 115 pyro_server = VisionEgg.PyroHelpers.PyroServer() 116 117 screen = VisionEgg.Core.Screen.create_default() 118 119 # get Vision Egg stimulus ready to go 120 stimuli = make_stimuli() 121 stimulus = stimuli[0][1] 122 viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus]) 123 p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) 124 125 # now hand over control of grating and mask to FlatGratingExperimentMetaController 126 meta_controller = FlatGratingExperimentMetaController(screen,p,stimuli) 127 pyro_server.connect(meta_controller,get_meta_controller_stimkey()) 128 129 # get listener controller and register it 130 p.add_controller(None,None, pyro_server.create_listener_controller()) 131 132 # enter endless loop 133 p.run_forever() 134

././@LongLink0000000000000000000000000000016700000000000011712 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaCon0000644000076500000240000003220111224565530033033 0ustar astrawstaff VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController
Package VisionEgg :: Package PyroApps :: Module FlatGratingServer :: Class FlatGratingExperimentMetaController
[frames] | no frames]

Class FlatGratingExperimentMetaController

source code

Pyro.core.ObjBase --+
                    |
                   FlatGratingExperimentMetaController

Instance Methods
 
__init__(self, screen, presentation, stimuli) source code
 
__del__(self) source code
 
on_function_during_go(self, t)
Compute when the grating is on
source code
 
on_function_between_go(self)
Compute when the grating is off
source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, screen, presentation, stimuli)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.GridGUI-module.html0000644000076500000240000001675011224565530025424 0ustar astrawstaff VisionEgg.PyroApps.GridGUI
Package VisionEgg :: Package PyroApps :: Module GridGUI
[frames] | no frames]

Module GridGUI

source code

Classes
  GridMetaParameters
  GridControlFrame
Functions
 
get_control_list() source code
Variables
  __version__ = '1.1.dev'
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.GridGUI-pysrc.html0000644000076500000240000017164411224565531025304 0ustar astrawstaff VisionEgg.PyroApps.GridGUI
Package VisionEgg :: Package PyroApps :: Module GridGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.GridGUI

 1  #!/usr/bin/env python 
 2  # 
 3  # The Vision Egg: GridGUI 
 4  # 
 5  # Copyright (C) 2001-2003 Andrew Straw. 
 6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
 7  # URL: <http://www.visionegg.org/> 
 8  # 
 9  # Distributed under the terms of the GNU Lesser General Public License 
10  # (LGPL). See LICENSE.TXT that came with this file. 
11  # 
12  # $Id$ 
13   
14  import VisionEgg, string 
15  __version__ = VisionEgg.release_name 
16  __cvs__ = string.split('$Revision$')[1] 
17  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
18  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
19   
20  import sys, os 
21  import Tkinter 
22  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
23   
25 return [("grid_server",GridControlFrame,GridControlFrame.title)]
26
28 - def __init__(self):
29 pass
30
31 -class GridControlFrame(client_utils.StimulusControlFrame):
32 title = "Grid for 3D calibration"
33 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
34 client_utils.StimulusControlFrame.__init__(self, 35 master, 36 suppress_go_buttons, 37 GridControlFrame.title, 38 GridMetaParameters, 39 **kw) 40 Tkinter.Label( self.param_frame, 41 text="No variables to control" ).grid()
42
43 - def get_shortname(self):
44 """Used as basename for saving parameter files""" 45 return "grid"
46
47 - def update_tk_vars(self):
48 pass
49
50 - def send_values(self,dummy_arg=None):
51 pass 52 if self.connected: 53 self.meta_controller.set_parameters( self.meta_params )
54
55 - def get_duration_sec(self):
56 return 0.0
57 58 if __name__=='__main__': 59 frame = GridControlFrame() 60 frame.pack(expand=1,fill=Tkinter.BOTH) 61 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 62 frame.mainloop() 63

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html0000644000076500000240000005731411224565531030446 0ustar astrawstaff VisionEgg.PyroApps.GridGUI.GridControlFrame
Package VisionEgg :: Package PyroApps :: Module GridGUI :: Class GridControlFrame
[frames] | no frames]

Class GridControlFrame

source code

      Tkinter.Misc --+                
                     |                
    Tkinter.BaseWidget --+            
                         |            
          Tkinter.Pack --+            
                         |            
         Tkinter.Place --+            
                         |            
          Tkinter.Grid --+            
                         |            
            Tkinter.Widget --+        
                             |        
                 Tkinter.Frame --+    
                                 |    
EPhysGUIUtils.StimulusControlFrame --+
                                     |
                                    GridControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, **kw)
Construct a frame widget with the parent MASTER.
source code
 
get_shortname(self)
Used as basename for saving parameter files
source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code

Inherited from EPhysGUIUtils.StimulusControlFrame: connect, get_loopable_variable_names, get_matlab_string, get_parameters_as_m_strings, get_parameters_as_py_strings, get_parameters_dict, go, make_callback_entry, quit_server, set_loopable_variable, set_param_dict, set_parameters_dict, standalone_connect

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables
  title = "Grid for 3D calibration"

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: EPhysGUIUtils.StimulusControlFrame.__init__

get_shortname(self)

source code 
Used as basename for saving parameter files

Overrides: EPhysGUIUtils.StimulusControlFrame.get_shortname

update_tk_vars(self)

source code 
Update Tkinter variables with (new) values from meta_params

Overrides: EPhysGUIUtils.StimulusControlFrame.update_tk_vars
(inherited documentation)

send_values(self, dummy_arg=None)

source code 
Update meta_params variables with values from Tkinter fields

Overrides: EPhysGUIUtils.StimulusControlFrame.send_values
(inherited documentation)

get_duration_sec(self)

source code 
Calculate total duration in go loop

Overrides: EPhysGUIUtils.StimulusControlFrame.get_duration_sec
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.GridGUI.GridMetaParameters-class.html0000644000076500000240000001221111224565531030750 0ustar astrawstaff VisionEgg.PyroApps.GridGUI.GridMetaParameters
Package VisionEgg :: Package PyroApps :: Module GridGUI :: Class GridMetaParameters
[frames] | no frames]

Class GridMetaParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.GridServer-module.html0000644000076500000240000002077011224565531026244 0ustar astrawstaff VisionEgg.PyroApps.GridServer
Package VisionEgg :: Package PyroApps :: Module GridServer
[frames] | no frames]

Module GridServer

source code

Classes
  GridMetaController
Functions
 
get_meta_controller_class() source code
 
make_stimuli() source code
 
get_meta_controller_stimkey() source code
Variables
  __version__ = '1.1.dev'
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.GridServer-pysrc.html0000644000076500000240000025214111224565531026116 0ustar astrawstaff VisionEgg.PyroApps.GridServer
Package VisionEgg :: Package PyroApps :: Module GridServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.GridServer

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: GridServer 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  import VisionEgg, string 
 15  __version__ = VisionEgg.release_name 
 16  __cvs__ = string.split('$Revision$')[1] 
 17  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 18  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 19   
 20  import sys, os, math 
 21  import VisionEgg.Core 
 22  import VisionEgg.FlowControl 
 23  import VisionEgg.Textures 
 24  import VisionEgg.SphereMap 
 25  import VisionEgg.PyroHelpers 
 26  import Pyro.core 
 27   
 28  from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController 
 29  from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters 
 30  from VisionEgg.PyroApps.GridGUI import GridMetaParameters 
 31   
32 -class GridMetaController( Pyro.core.ObjBase ):
33 - def __init__(self,screen,presentation,stimuli):
34 35 # get the instance of Stimulus that was created 36 assert( stimuli[0][0] == '3d_perspective_with_set_viewport_callback' ) 37 grid = stimuli[0][1] 38 39 Pyro.core.ObjBase.__init__(self) 40 self.meta_params = GridMetaParameters() 41 if not isinstance(screen,VisionEgg.Core.Screen): 42 raise ValueError("Expecting instance of VisionEgg.Core.Screen") 43 if not isinstance(presentation,VisionEgg.FlowControl.Presentation): 44 raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") 45 if not isinstance(grid,VisionEgg.SphereMap.AzElGrid): 46 raise ValueError("Expecting instance of VisionEgg.SphereMap.SphereMap") 47 self.p = presentation 48 self.stim = grid 49 50 screen.parameters.bgcolor = (1.0, 1.0, 1.0, 0.0)
51
52 - def get_parameters(self):
53 return self.meta_params
54
55 - def set_parameters(self, new_parameters):
56 if isinstance(new_parameters, GridMetaParameters): 57 self.meta_params = new_parameters 58 else: 59 raise ValueError("Argument to set_parameters must be instance of GridMetaParameters") 60 self.update()
61
62 - def update(self):
63 self.p.parameters.go_duration = ( 0.0, 'seconds')
64
65 - def go(self):
66 self.p.parameters.enter_go_loop = 1
67
68 - def quit_server(self):
69 self.p.parameters.quit = 1
70
72 return GridMetaController
73
74 -def make_stimuli():
75 stimulus = VisionEgg.SphereMap.AzElGrid() 76 def set_az_el_grid_viewport(viewport): 77 stimulus.parameters.my_viewport = viewport
78 return [('3d_perspective_with_set_viewport_callback',stimulus,set_az_el_grid_viewport)] # return ordered list of tuples 79
81 return "grid_server"
82 83 # Don't do anything unless this script is being run 84 if __name__ == '__main__': 85 86 pyro_server = VisionEgg.PyroHelpers.PyroServer() 87 88 screen = VisionEgg.Core.Screen.create_default() 89 90 # get Vision Egg stimulus ready to go 91 stimuli = make_stimuli() 92 stimulus = stimuli[0][1] 93 temp = ScreenPositionParameters() 94 95 projection = VisionEgg.Core.PerspectiveProjection(temp.left, 96 temp.right, 97 temp.bottom, 98 temp.top, 99 temp.near, 100 temp.far) 101 viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus],projection=projection) 102 p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) 103 104 # now hand over control of projection to ScreenPositionMetaController 105 projection_controller = ScreenPositionMetaController(p,projection) 106 pyro_server.connect(projection_controller,"projection_controller") 107 108 # now hand over control of drum to GridMetaController 109 meta_controller = GridMetaController(screen,p,stimuli) 110 pyro_server.connect(meta_controller,get_meta_controller_stimkey()) 111 112 # get listener controller and register it 113 p.add_controller(None,None, pyro_server.create_listener_controller()) 114 115 # enter endless loop 116 p.run_forever() 117

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.GridServer.GridMetaController-class.html0000644000076500000240000002513411224565531031622 0ustar astrawstaff VisionEgg.PyroApps.GridServer.GridMetaController
Package VisionEgg :: Package PyroApps :: Module GridServer :: Class GridMetaController
[frames] | no frames]

Class GridMetaController

source code

Pyro.core.ObjBase --+
                    |
                   GridMetaController

Instance Methods
 
__init__(self, screen, presentation, stimuli) source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, screen, presentation, stimuli)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI-module.html0000644000076500000240000001633611224565531026777 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetGUI
Package VisionEgg :: Package PyroApps :: Module MouseTargetGUI
[frames] | no frames]

Module MouseTargetGUI

source code

Handle mouse controlled small target stimulus (client-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  MouseTargetMetaParameters
  MouseTargetControlFrame
Functions
 
get_control_list() source code
Variables
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI-pysrc.html0000644000076500000240000023717111224565531026654 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetGUI
Package VisionEgg :: Package PyroApps :: Module MouseTargetGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.MouseTargetGUI

 1  #!/usr/bin/env python 
 2  # 
 3  # The Vision Egg: MouseTargetGUI 
 4  # 
 5  # Copyright (C) 2001-2003 Andrew Straw. 
 6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
 7  # URL: <http://www.visionegg.org/> 
 8  # 
 9  # Distributed under the terms of the GNU Lesser General Public License 
10  # (LGPL). See LICENSE.TXT that came with this file. 
11  # 
12  # $Id$ 
13   
14  """Handle mouse controlled small target stimulus (client-side)""" 
15   
16  import VisionEgg, string 
17  __version__ = VisionEgg.release_name 
18  __cvs__ = string.split('$Revision$')[1] 
19  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
21   
22  import sys, os 
23  import Tkinter 
24  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
25   
27 return [("mouse_target_server",MouseTargetControlFrame,MouseTargetControlFrame.title)]
28
30 - def __init__(self):
31 # colors 32 self.color = (0.0, 0.0, 0.0, 1.0) 33 self.bgcolor = (1.0, 1.0, 1.0, 0.0)
34
35 -class MouseTargetControlFrame(client_utils.StimulusControlFrame):
36 title = "Mouse Controlled Moving Target"
37 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
38 client_utils.StimulusControlFrame.__init__(self, 39 master, 40 suppress_go_buttons, 41 MouseTargetControlFrame.title, 42 MouseTargetMetaParameters, 43 **kw) 44 45 param_frame = self.param_frame # shorthand for self.param_frame created in base class 46 47 # Allow columns to expand 48 param_frame.columnconfigure(0,weight=1) 49 param_frame.columnconfigure(1,weight=1) 50 51 pf_row = 0 52 Tkinter.Label(param_frame,text="Color:").grid(row=pf_row,column=0) 53 self.color_tk_var = Tkinter.StringVar() 54 self.color_tk_var.set("black on white") 55 bar = Tkinter.Menubutton(param_frame, textvariable=self.color_tk_var, relief=Tkinter.RAISED) 56 bar.grid(row=pf_row, column=2, sticky=Tkinter.W+Tkinter.E, pady=2, padx=2) 57 bar.menu = Tkinter.Menu(bar,tearoff=0) 58 bar.menu.add_radiobutton(label="white on black", 59 value="white on black", 60 variable=self.color_tk_var, 61 command=self.send_values) 62 bar.menu.add_radiobutton(label="black on white", 63 value="black on white", 64 variable=self.color_tk_var, 65 command=self.send_values) 66 bar['menu'] = bar.menu
67
68 - def get_shortname(self):
69 return "mouse_target"
70
71 - def update_tk_vars(self):
72 if self.meta_params.color == (0.0,0.0,0.0,1.0) and self.meta_params.bgcolor == (1.0,1.0,1.0,0.0): 73 self.color_tk_var.set( "black on white" ) 74 elif self.meta_params.color == (1.0,1.0,1.0,1.0) and self.meta_params.bgcolor == (0.0,0.0,0.0,0.0): 75 self.color_tk_var.set( "white on black" ) 76 else: 77 raise RuntimeError("Cannot set tk variable for color")
78
79 - def send_values(self,dummy_arg=None):
80 if self.color_tk_var.get() == "black on white": 81 self.meta_params.color = (0.0,0.0,0.0,1.0) 82 self.meta_params.bgcolor = (1.0,1.0,1.0,0.0) 83 elif self.color_tk_var.get() == "white on black": 84 self.meta_params.color = (1.0,1.0,1.0,1.0) 85 self.meta_params.bgcolor = (0.0,0.0,0.0,0.0) 86 87 if self.connected: 88 self.meta_controller.set_parameters( self.meta_params )
89
90 - def get_duration_sec(self):
91 return 0.0
92 93 if __name__=='__main__': 94 frame = MouseTargetControlFrame() 95 frame.pack(expand=1,fill=Tkinter.BOTH) 96 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 97 frame.mainloop() 98

././@LongLink0000000000000000000000000000015000000000000011702 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.h0000644000076500000240000006014611224565531032652 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame
Package VisionEgg :: Package PyroApps :: Module MouseTargetGUI :: Class MouseTargetControlFrame
[frames] | no frames]

Class MouseTargetControlFrame

source code

      Tkinter.Misc --+                
                     |                
    Tkinter.BaseWidget --+            
                         |            
          Tkinter.Pack --+            
                         |            
         Tkinter.Place --+            
                         |            
          Tkinter.Grid --+            
                         |            
            Tkinter.Widget --+        
                             |        
                 Tkinter.Frame --+    
                                 |    
EPhysGUIUtils.StimulusControlFrame --+
                                     |
                                    MouseTargetControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, **kw)
Construct a frame widget with the parent MASTER.
source code
 
get_shortname(self)
Used as basename for saving parameter files and other ID purposes
source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code

Inherited from EPhysGUIUtils.StimulusControlFrame: connect, get_loopable_variable_names, get_matlab_string, get_parameters_as_m_strings, get_parameters_as_py_strings, get_parameters_dict, go, make_callback_entry, quit_server, set_loopable_variable, set_param_dict, set_parameters_dict, standalone_connect

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables
  title = "Mouse Controlled Moving Target"

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: EPhysGUIUtils.StimulusControlFrame.__init__

get_shortname(self)

source code 
Used as basename for saving parameter files and other ID purposes

Overrides: EPhysGUIUtils.StimulusControlFrame.get_shortname
(inherited documentation)

update_tk_vars(self)

source code 
Update Tkinter variables with (new) values from meta_params

Overrides: EPhysGUIUtils.StimulusControlFrame.update_tk_vars
(inherited documentation)

send_values(self, dummy_arg=None)

source code 
Update meta_params variables with values from Tkinter fields

Overrides: EPhysGUIUtils.StimulusControlFrame.send_values
(inherited documentation)

get_duration_sec(self)

source code 
Calculate total duration in go loop

Overrides: EPhysGUIUtils.StimulusControlFrame.get_duration_sec
(inherited documentation)

././@LongLink0000000000000000000000000000015200000000000011704 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters-class0000644000076500000240000001233511224565531032740 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters
Package VisionEgg :: Package PyroApps :: Module MouseTargetGUI :: Class MouseTargetMetaParameters
[frames] | no frames]

Class MouseTargetMetaParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer-module.html0000644000076500000240000003765011224565531027623 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetServer
Package VisionEgg :: Package PyroApps :: Module MouseTargetServer
[frames] | no frames]

Module MouseTargetServer

source code

Handle mouse-controlled small targets (server-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  MouseTargetExperimentMetaController
  MousePositionController
  TargetPositionController
  TargetOrientationController
Functions
 
keydown(event) source code
 
keyup(event) source code
 
get_meta_controller_class() source code
 
make_stimuli() source code
 
get_meta_controller_stimkey() source code
 
cross_product(b, c)
Cross product between vectors, represented as tuples of length 3.
source code
 
mag(b)
Magnitude of a vector.
source code
 
get_target_size(t=None) source code
Variables
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
  mouse_position = 320.0, 240.0
  last_mouse_position = 0.0, 0.0
  target_w = 50.0
  target_h = 10.0
  up = 0
  down = 0
  left = 0
  right = 0
  handle_event_callbacks = [(pygame.locals.KEYDOWN, keydown), (p...
Variables Details

handle_event_callbacks

Value:
[(pygame.locals.KEYDOWN, keydown), (pygame.locals.KEYUP, keyup)]

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer-pysrc.html0000644000076500000240000054126711224565531027502 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetServer
Package VisionEgg :: Package PyroApps :: Module MouseTargetServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.MouseTargetServer

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: MouseTargetServer 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  """Handle mouse-controlled small targets (server-side)""" 
 15   
 16  import VisionEgg, string 
 17  import VisionEgg.ParameterTypes as ve_types 
 18   
 19  __version__ = VisionEgg.release_name 
 20  __cvs__ = string.split('$Revision$')[1] 
 21  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 22  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 23   
 24  import sys, os, math 
 25  import VisionEgg.Core 
 26  import VisionEgg.FlowControl 
 27  import VisionEgg.MoreStimuli 
 28  import VisionEgg.PyroHelpers 
 29  import Pyro.core 
 30  import pygame, pygame.locals 
 31   
 32  from VisionEgg.PyroApps.MouseTargetGUI import MouseTargetMetaParameters 
 33   
 34  # Variables to store the mouse position 
 35  mouse_position = (320.0, 240.0) 
 36  last_mouse_position = (0.0,0.0) 
 37   
 38  # target size global variables 
 39  target_w = 50.0 
 40  target_h = 10.0 
 41   
 42  # key state global variables 
 43  up = 0 
 44  down = 0 
 45  left = 0 
 46  right = 0 
 47   
48 -def keydown(event):
49 global up, down, left, right 50 if event.key == pygame.locals.K_UP: 51 up = 1 52 elif event.key == pygame.locals.K_DOWN: 53 down = 1 54 elif event.key == pygame.locals.K_RIGHT: 55 right = 1 56 elif event.key == pygame.locals.K_LEFT: 57 left = 1
58
59 -def keyup(event):
60 global up, down, left, right 61 if event.key == pygame.locals.K_UP: 62 up = 0 63 elif event.key == pygame.locals.K_DOWN: 64 down = 0 65 elif event.key == pygame.locals.K_RIGHT: 66 right = 0 67 elif event.key == pygame.locals.K_LEFT: 68 left = 0
69 70 handle_event_callbacks = [(pygame.locals.KEYDOWN, keydown), 71 (pygame.locals.KEYUP, keyup)] 72
73 -class MouseTargetExperimentMetaController( Pyro.core.ObjBase ):
74 - def __init__(self,screen,presentation,stimuli):
75 global screen_global 76 screen_global = screen 77 # get stimulus 78 assert( stimuli[0][0] == '2d_overlay') 79 target = stimuli[0][1] 80 81 Pyro.core.ObjBase.__init__(self) 82 self.meta_params = MouseTargetMetaParameters() 83 if not isinstance(screen,VisionEgg.Core.Screen): 84 raise ValueError("Expecting instance of VisionEgg.Core.Screen") 85 if not isinstance(presentation,VisionEgg.FlowControl.Presentation): 86 raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") 87 if not isinstance(target,VisionEgg.MoreStimuli.Target2D): 88 raise ValueError("Expecting instance of VisionEgg.MoreStimuli.Target2D") 89 90 self.screen = screen 91 self.p = presentation 92 self.stim = target 93 94 self.p.add_controller(target,'position', TargetPositionController()) 95 self.p.add_controller(target,'size', VisionEgg.FlowControl.FunctionController(during_go_func=get_target_size, 96 between_go_func=get_target_size) ) 97 self.p.add_controller(target,'orientation', TargetOrientationController() ) 98 self.mouse_position_controller = MousePositionController() 99 self.p.add_controller(None,None,self.mouse_position_controller) 100 self.orig_event_handlers = self.p.parameters.handle_event_callbacks 101 self.p.parameters.handle_event_callbacks = handle_event_callbacks 102 103 self.update() # set stimulus parameters to initial defaults
104
105 - def __del__(self):
106 self.p.parameters.handle_event_callbacks = self.orig_event_handlers 107 self.p.remove_controller(None,None,self.mouse_position_controller) 108 self.p.remove_controller(self.stim,'position') 109 self.p.remove_controller(self.stim,'size') 110 self.p.remove_controller(self.stim,'orientation')
111
112 - def get_parameters(self):
113 return self.meta_params
114
115 - def set_parameters(self, new_parameters):
116 if isinstance(new_parameters, MouseTargetMetaParameters): 117 self.meta_params = new_parameters 118 else: 119 raise ValueError("Argument to set_parameters must be instance of MouseTargetMetaParameters") 120 self.update()
121
122 - def update(self):
123 stim_params = self.stim.parameters # shorthand 124 meta_params = self.meta_params # shorthand 125 126 # colors 127 stim_params.color = meta_params.color 128 self.screen.parameters.bgcolor = meta_params.bgcolor
129
130 - def go(self):
131 pass
132 #self.p.parameters.enter_go_loop = 1 133
134 - def quit_server(self):
135 self.p.parameters.quit = 1
136 139
140 -def make_stimuli():
141 stimulus = VisionEgg.MoreStimuli.Target2D(anchor='center') 142 return [('2d_overlay',stimulus)]
143
145 return "mouse_target_server"
146 147 ######################## 148 # Define controllers # 149 ######################## 150
151 -class MousePositionController( VisionEgg.FlowControl.Controller ):
152 - def __init__(self):
153 global mouse_position 154 VisionEgg.FlowControl.Controller.__init__(self, 155 return_type=ve_types.get_type(None), 156 eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) 157 self.between_go_eval = self.during_go_eval
158
159 - def during_go_eval(self,t=None):
160 # Convert pygame mouse position to OpenGL position 161 global mouse_position, last_mouse_position, screen_global 162 just_current_pos = mouse_position 163 (x,y) = pygame.mouse.get_pos() 164 y = screen_global.size[1]-y 165 mouse_position = (x,y) 166 if just_current_pos != mouse_position: 167 last_mouse_position = just_current_pos 168 return None
169
170 -class TargetPositionController( VisionEgg.FlowControl.Controller ):
171 - def __init__(self):
172 global mouse_position 173 VisionEgg.FlowControl.Controller.__init__(self, 174 return_type=ve_types.Sequence2(ve_types.Real), 175 eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) 176 self.between_go_eval = self.during_go_eval
177
178 - def during_go_eval(self,t=None):
179 global mouse_position 180 return mouse_position
181
182 -def cross_product(b,c):
183 """Cross product between vectors, represented as tuples of length 3.""" 184 det_i = b[1]*c[2] - b[2]*c[1] 185 det_j = b[0]*c[2] - b[2]*c[0] 186 det_k = b[0]*c[1] - b[1]*c[0] 187 return (det_i,-det_j,det_k)
188
189 -def mag(b):
190 """Magnitude of a vector.""" 191 return b[0]**2.0 + b[1]**2.0 + b[2]**2.0
192
193 -class TargetOrientationController( VisionEgg.FlowControl.Controller ):
194 - def __init__(self):
195 VisionEgg.FlowControl.Controller.__init__(self, 196 return_type=ve_types.Real, 197 eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) 198 self.c = (0.0,0.0,1.0) 199 self.last_orientation = 0.0 200 self.between_go_eval = self.during_go_eval
201
202 - def during_go_eval(self):
203 global mouse_position, last_mouse_position 204 205 b = (float(last_mouse_position[0]-mouse_position[0]), 206 float(last_mouse_position[1]-mouse_position[1]), 207 0.0) 208 209 if mag(b) > 1.0: # Must mouse 1 pixel before changing orientation (supposed to reject noise) 210 # find cross product b x c. assume b and c are 3-vecs, b has 211 # 3rd component 0. 212 orientation_vector = cross_product(b,self.c) 213 self.last_orientation = math.atan2(orientation_vector[1],orientation_vector[0])/math.pi*180.0 214 return self.last_orientation
215
216 -def get_target_size(t=None):
217 global target_w, target_h 218 global up, down, left, right 219 220 amount = 0.02 221 222 if up: 223 target_w = target_w+(amount*target_w) 224 elif down: 225 target_w = target_w-(amount*target_w) 226 elif right: 227 target_h = target_h+(amount*target_h) 228 elif left: 229 target_h = target_h-(amount*target_h) 230 target_w = max(target_w,0.0) 231 target_h = max(target_h,0.0) 232 233 return (target_w, target_h)
234 235 # Don't do anything unless this script is being run 236 if __name__ == '__main__': 237 238 pyro_server = VisionEgg.PyroHelpers.PyroServer() 239 240 screen = VisionEgg.Core.Screen.create_default() 241 242 # get Vision Egg stimulus ready to go 243 stimuli = make_stimuli() 244 stimulus = stimuli[0][1] 245 viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus]) 246 p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) 247 248 # now hand over control of grating and mask to FlatGratingExperimentMetaController 249 meta_controller = MouseTargetExperimentMetaController(screen,p,stimuli) 250 pyro_server.connect(meta_controller,get_meta_controller_stimkey()) 251 252 # get listener controller and register it 253 p.add_controller(None,None, pyro_server.create_listener_controller()) 254 255 # enter endless loop 256 p.run_forever() 257

././@LongLink0000000000000000000000000000015300000000000011705 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.MousePositionController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.MousePositionController-clas0000644000076500000240000003054711224565531033173 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetServer.MousePositionController
Package VisionEgg :: Package PyroApps :: Module MouseTargetServer :: Class MousePositionController
[frames] | no frames]

Class MousePositionController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        MousePositionController

Instance Methods
 
__init__(self)
Create instance of Controller.
source code
 
during_go_eval(self, t=None)
Called by Presentation.
source code

Inherited from FlowControl.Controller: between_go_eval, evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.Controller.__init__
(inherited documentation)

during_go_eval(self, t=None)

source code 
Called by Presentation. Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.during_go_eval
(inherited documentation)

././@LongLink0000000000000000000000000000016700000000000011712 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaCon0000644000076500000240000002711711224565531033140 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController
Package VisionEgg :: Package PyroApps :: Module MouseTargetServer :: Class MouseTargetExperimentMetaController
[frames] | no frames]

Class MouseTargetExperimentMetaController

source code

Pyro.core.ObjBase --+
                    |
                   MouseTargetExperimentMetaController

Instance Methods
 
__init__(self, screen, presentation, stimuli) source code
 
__del__(self) source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, screen, presentation, stimuli)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

././@LongLink0000000000000000000000000000015700000000000011711 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController-0000644000076500000240000003035311224565531033150 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController
Package VisionEgg :: Package PyroApps :: Module MouseTargetServer :: Class TargetOrientationController
[frames] | no frames]

Class TargetOrientationController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        TargetOrientationController

Instance Methods
 
__init__(self)
Create instance of Controller.
source code
 
during_go_eval(self)
Called by Presentation.
source code

Inherited from FlowControl.Controller: between_go_eval, evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.Controller.__init__
(inherited documentation)

during_go_eval(self)

source code 
Called by Presentation. Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.during_go_eval
(inherited documentation)

././@LongLink0000000000000000000000000000015400000000000011706 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.TargetPositionController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.TargetPositionController-cla0000644000076500000240000003056311224565531033144 0ustar astrawstaff VisionEgg.PyroApps.MouseTargetServer.TargetPositionController
Package VisionEgg :: Package PyroApps :: Module MouseTargetServer :: Class TargetPositionController
[frames] | no frames]

Class TargetPositionController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        TargetPositionController

Instance Methods
 
__init__(self)
Create instance of Controller.
source code
 
during_go_eval(self, t=None)
Called by Presentation.
source code

Inherited from FlowControl.Controller: between_go_eval, evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.Controller.__init__
(inherited documentation)

during_go_eval(self, t=None)

source code 
Called by Presentation. Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.during_go_eval
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI-module.html0000644000076500000240000001544111224565531027500 0ustar astrawstaff VisionEgg.PyroApps.ScreenPositionGUI
Package VisionEgg :: Package PyroApps :: Module ScreenPositionGUI
[frames] | no frames]

Module ScreenPositionGUI

source code

Handle 3D perspective projection (client-side)




Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  ScreenPositionParameters
  CallbackEntry
  ScreenPositionControlFrame
Variables
  __version__ = VisionEgg.release_name
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI-pysrc.html0000644000076500000240000122605211224565531027356 0ustar astrawstaff VisionEgg.PyroApps.ScreenPositionGUI
Package VisionEgg :: Package PyroApps :: Module ScreenPositionGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.ScreenPositionGUI

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: ScreenPositionGUI 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  """Handle 3D perspective projection (client-side)""" 
 15   
 16  import sys, os, pickle, math, string 
 17  import Tkinter, tkFileDialog 
 18  import Pyro.core 
 19  import VisionEgg.PyroClient 
 20  import StringIO 
 21   
 22  __version__ = VisionEgg.release_name 
 23  __cvs__ = string.split('$Revision$')[1] 
 24  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 25  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 26   
28 - def __init__(self):
29 30 # frustum (initial values - view portion of unit sphere) 31 self.left = -0.2 32 self.right = 0.2 33 self.top = 0.2 34 self.bottom = -0.2 35 self.near = 0.2 36 self.far = 20.0 37 38 # position/orientation 39 self.eye = (0.0, 0.0, 0.0) # observer position 40 self.center = (0.0, 0.0, -1.0) # center of gaze 41 self.up = (0.0, 1.0, 0.0) # up vector
42
43 -class CallbackEntry(Tkinter.Entry):
44 - def __init__(self,master=None,callback=None,**kw):
45 Tkinter.Entry.__init__(self,master, **kw) 46 self.bind('<Return>',callback) 47 self.bind('<Tab>',callback)
48
49 -class ScreenPositionControlFrame(Tkinter.Frame):
50 - def __init__(self, master=None, auto_connect=0, server_hostname='', server_port=7766, **kw):
51 Tkinter.Frame.__init__(self,master,**kw) 52 self.pyro_client = None 53 self.entry_width = 10 54 self.connected = 0 55 self.meta_params = ScreenPositionParameters() 56 self.loopable_variables = {} 57 58 row = 0 59 Tkinter.Label(self, 60 text="3D Perspective Calibration", 61 font=("Helvetica",12,"bold")).grid(row=row,column=0,columnspan=2) 62 63 row += 1 64 Tkinter.Label(self, 65 text="This dialog allows you to enter acheive "+\ 66 "the proper perspective distortion for 3D scenes." 67 ).grid(row=row,column=0,columnspan=2) 68 69 if not auto_connect: 70 row += 1 71 # let columns expand 72 connected_frame = Tkinter.Frame(self) 73 connected_frame.grid(row=row,column=0,columnspan=2,sticky=Tkinter.W+Tkinter.E) 74 connected_frame.columnconfigure(0,weight=1) 75 connected_frame.columnconfigure(1,weight=1) 76 connected_frame.columnconfigure(2,weight=1) 77 78 self.connected_label = Tkinter.Label(connected_frame,text="Server status: Not connected") 79 self.connected_label.grid(row=0,column=0) 80 Tkinter.Button(connected_frame,text="Connect",command=self.connect).grid(row=0,column=1) 81 Tkinter.Button(connected_frame,text="Quit server",command=self.quit_server).grid(row=0,column=2) 82 83 row += 1 84 param_frame = Tkinter.Frame(self) 85 param_frame.grid(row=row,column=0,sticky=Tkinter.N) 86 param_frame.columnconfigure(0,weight=1) 87 param_frame.columnconfigure(1,weight=1) 88 89 pf_row = 0 90 frustum_frame = Tkinter.Frame(param_frame) 91 frustum_frame.grid(row=pf_row,column=0,columnspan=2,ipady=5) 92 93 ff_row = 0 94 Tkinter.Label(frustum_frame, 95 text="Viewing volume size", 96 font=("Helvetica",12,"bold")).grid(row=ff_row,column=0,columnspan=3,ipady=5) 97 98 ff_row += 1 99 Tkinter.Label(frustum_frame,text="Left:").grid(row=ff_row,column=0) 100 self.left_tk_var = Tkinter.DoubleVar() 101 self.left_tk_var.set(self.meta_params.left) 102 CallbackEntry(frustum_frame, 103 self.send_values, 104 width=self.entry_width, 105 textvariable=self.left_tk_var).grid(row=ff_row,column=1) 106 107 ff_row += 1 108 Tkinter.Label(frustum_frame,text="Right:").grid(row=ff_row,column=0) 109 self.right_tk_var = Tkinter.DoubleVar() 110 self.right_tk_var.set(self.meta_params.right) 111 CallbackEntry(frustum_frame, 112 self.send_values, 113 width=self.entry_width, 114 textvariable=self.right_tk_var).grid(row=ff_row,column=1) 115 116 ff_row += 1 117 Tkinter.Label(frustum_frame,text="Top:").grid(row=ff_row,column=0) 118 self.top_tk_var = Tkinter.DoubleVar() 119 self.top_tk_var.set(self.meta_params.top) 120 CallbackEntry(frustum_frame, 121 self.send_values, 122 width=self.entry_width, 123 textvariable=self.top_tk_var).grid(row=ff_row,column=1) 124 125 ff_row += 1 126 Tkinter.Label(frustum_frame,text="Bottom:").grid(row=ff_row,column=0) 127 self.bottom_tk_var = Tkinter.DoubleVar() 128 self.bottom_tk_var.set(self.meta_params.bottom) 129 CallbackEntry(frustum_frame, 130 self.send_values, 131 width=self.entry_width, 132 textvariable=self.bottom_tk_var).grid(row=ff_row,column=1) 133 134 ff_row += 1 135 Tkinter.Label(frustum_frame,text="Near:").grid(row=ff_row,column=0) 136 self.near_tk_var = Tkinter.DoubleVar() 137 self.near_tk_var.set(self.meta_params.near) 138 CallbackEntry(frustum_frame, 139 self.send_values, 140 width=self.entry_width, 141 textvariable=self.near_tk_var).grid(row=ff_row,column=1) 142 143 ff_row += 1 144 Tkinter.Label(frustum_frame,text="Far:").grid(row=ff_row,column=0) 145 self.far_tk_var = Tkinter.DoubleVar() 146 self.far_tk_var.set(self.meta_params.far) 147 CallbackEntry(frustum_frame, 148 self.send_values, 149 width=self.entry_width, 150 textvariable=self.far_tk_var).grid(row=ff_row,column=1) 151 152 # quick frustum frame 153 qf_frame = Tkinter.Frame(frustum_frame) 154 qf_frame.grid(row=1,column=2,rowspan=ff_row) 155 156 qf_row = 0 157 Tkinter.Button(qf_frame,text="Taller",command=self.frustum_taller).grid(row=qf_row,column=0,columnspan=2) 158 qf_row += 1 159 Tkinter.Button(qf_frame,text="Narrower",command=self.frustum_narrower).grid(row=qf_row,column=0) 160 Tkinter.Button(qf_frame,text="Wider",command=self.frustum_wider).grid(row=qf_row,column=1) 161 qf_row += 1 162 Tkinter.Button(qf_frame,text="Shorter",command=self.frustum_shorter).grid(row=qf_row,column=0,columnspan=2) 163 164 qf_row = 0 165 Tkinter.Button(qf_frame,text="Up",command=self.frustum_up).grid(row=qf_row,column=2,columnspan=2) 166 qf_row += 1 167 Tkinter.Button(qf_frame,text="Left",command=self.frustum_left).grid(row=qf_row,column=2) 168 Tkinter.Button(qf_frame,text="Right",command=self.frustum_right).grid(row=qf_row,column=3) 169 qf_row += 1 170 Tkinter.Button(qf_frame,text="Down",command=self.frustum_down).grid(row=qf_row,column=2,columnspan=2) 171 172 pf_row += 1 173 lookat_frame = Tkinter.Frame(param_frame) 174 lookat_frame.grid(row=pf_row,column=0,columnspan=2,ipady=5) 175 176 la_row = 0 177 Tkinter.Label(lookat_frame, 178 text="Viewing volume orientation", 179 font=("Helvetica",12,"bold")).grid(row=la_row,column=0,columnspan=3,ipady=5) 180 181 la_row += 1 182 Tkinter.Label(lookat_frame,text="eye X:").grid(row=la_row,column=0) 183 self.eye_x_tk_var = Tkinter.DoubleVar() 184 self.eye_x_tk_var.set(self.meta_params.eye[0]) 185 CallbackEntry(lookat_frame, 186 self.send_values, 187 width=self.entry_width, 188 textvariable=self.eye_x_tk_var).grid(row=la_row,column=1) 189 190 la_row += 1 191 Tkinter.Label(lookat_frame,text="eye Y:").grid(row=la_row,column=0) 192 self.eye_y_tk_var = Tkinter.DoubleVar() 193 self.eye_y_tk_var.set(self.meta_params.eye[1]) 194 CallbackEntry(lookat_frame, 195 self.send_values, 196 width=self.entry_width, 197 textvariable=self.eye_y_tk_var).grid(row=la_row,column=1) 198 199 la_row += 1 200 Tkinter.Label(lookat_frame,text="eye Z:").grid(row=la_row,column=0) 201 self.eye_z_tk_var = Tkinter.DoubleVar() 202 self.eye_z_tk_var.set(self.meta_params.eye[2]) 203 CallbackEntry(lookat_frame, 204 self.send_values, 205 width=self.entry_width, 206 textvariable=self.eye_z_tk_var).grid(row=la_row,column=1) 207 208 la_row += 1 209 Tkinter.Label(lookat_frame,text="look at X:").grid(row=la_row,column=0) 210 self.center_x_tk_var = Tkinter.DoubleVar() 211 self.center_x_tk_var.set(self.meta_params.center[0]) 212 CallbackEntry(lookat_frame, 213 self.send_values, 214 width=self.entry_width, 215 textvariable=self.center_x_tk_var).grid(row=la_row,column=1) 216 217 quick_la_frame = Tkinter.Frame(lookat_frame) 218 quick_la_frame.grid(row=la_row,column=2,rowspan=3) 219 qla_row = 0 220 Tkinter.Button(quick_la_frame,text="Look at az -",command=self.az_decrease).grid(row=qla_row,column=0) 221 Tkinter.Button(quick_la_frame,text="Look at az +",command=self.az_increase).grid(row=qla_row,column=1) 222 self.look_at_az_str = Tkinter.StringVar() 223 Tkinter.Label(quick_la_frame,textvariable=self.look_at_az_str).grid(row=qla_row,column=2) 224 225 qla_row += 1 226 Tkinter.Button(quick_la_frame,text="Look at el -",command=self.el_decrease).grid(row=qla_row,column=0) 227 Tkinter.Button(quick_la_frame,text="Look at el +",command=self.el_increase).grid(row=qla_row,column=1) 228 self.look_at_el_str = Tkinter.StringVar() 229 Tkinter.Label(quick_la_frame,textvariable=self.look_at_el_str).grid(row=qla_row,column=2) 230 231 az,el = self.get_az_el(self.meta_params.center) 232 self.look_at_az_str.set("%.1f"%az) 233 self.look_at_el_str.set("%.1f"%el) 234 235 la_row += 1 236 Tkinter.Label(lookat_frame,text="look at Y:").grid(row=la_row,column=0) 237 self.center_y_tk_var = Tkinter.DoubleVar() 238 self.center_y_tk_var.set(self.meta_params.center[1]) 239 CallbackEntry(lookat_frame, 240 self.send_values, 241 width=self.entry_width, 242 textvariable=self.center_y_tk_var).grid(row=la_row,column=1) 243 244 la_row += 1 245 Tkinter.Label(lookat_frame,text="look at Z:").grid(row=la_row,column=0) 246 self.center_z_tk_var = Tkinter.DoubleVar() 247 self.center_z_tk_var.set(self.meta_params.center[2]) 248 CallbackEntry(lookat_frame, 249 self.send_values, 250 width=self.entry_width, 251 textvariable=self.center_z_tk_var).grid(row=la_row,column=1) 252 253 la_row += 1 254 Tkinter.Label(lookat_frame,text="up X:").grid(row=la_row,column=0) 255 self.up_x_tk_var = Tkinter.DoubleVar() 256 self.up_x_tk_var.set(self.meta_params.up[0]) 257 CallbackEntry(lookat_frame, 258 self.send_values, 259 width=self.entry_width, 260 textvariable=self.up_x_tk_var).grid(row=la_row,column=1) 261 262 quick_up_frame = Tkinter.Frame(lookat_frame) 263 quick_up_frame.grid(row=la_row,column=2,rowspan=3) 264 qup_row = 0 265 Tkinter.Button(quick_up_frame,text="Up az -",command=self.up_az_decrease).grid(row=qup_row,column=0) 266 Tkinter.Button(quick_up_frame,text="Up az +",command=self.up_az_increase).grid(row=qup_row,column=1) 267 self.up_az_str = Tkinter.StringVar() 268 Tkinter.Label(quick_up_frame,textvariable=self.up_az_str).grid(row=qup_row,column=2) 269 qup_row += 1 270 Tkinter.Button(quick_up_frame,text="Up el -",command=self.up_el_decrease).grid(row=qup_row,column=0) 271 Tkinter.Button(quick_up_frame,text="Up el +",command=self.up_el_increase).grid(row=qup_row,column=1) 272 self.up_el_str = Tkinter.StringVar() 273 Tkinter.Label(quick_up_frame,textvariable=self.up_el_str).grid(row=qup_row,column=2) 274 275 az,el = self.get_az_el(self.meta_params.up) 276 self.up_az_str.set("%.1f"%az) 277 self.up_el_str.set("%.1f"%el) 278 279 la_row += 1 280 Tkinter.Label(lookat_frame,text="up Y:").grid(row=la_row,column=0) 281 self.up_y_tk_var = Tkinter.DoubleVar() 282 self.up_y_tk_var.set(self.meta_params.up[1]) 283 CallbackEntry(lookat_frame, 284 self.send_values, 285 width=self.entry_width, 286 textvariable=self.up_y_tk_var).grid(row=la_row,column=1) 287 288 la_row += 1 289 Tkinter.Label(lookat_frame,text="up Z:").grid(row=la_row,column=0) 290 self.up_z_tk_var = Tkinter.DoubleVar() 291 self.up_z_tk_var.set(self.meta_params.up[2]) 292 CallbackEntry(lookat_frame, 293 self.send_values, 294 width=self.entry_width, 295 textvariable=self.up_z_tk_var).grid(row=la_row,column=1) 296 297 row += 1 298 button_row_frame = Tkinter.Frame(self) 299 button_row_frame.grid(row=row,column=0,ipady=5) 300 Tkinter.Label(button_row_frame, 301 text="File operations", 302 font=("Helvetica",12,"bold")).grid(row=0,column=0,columnspan=2,ipady=5) 303 Tkinter.Button(button_row_frame,text="Save...",command=self.save).grid(row=1,column=0) 304 Tkinter.Button(button_row_frame,text="Load...",command=self.load).grid(row=1,column=1) 305 306 if auto_connect: 307 self.connect(server_hostname,server_port)
308
309 - def frustum_narrower(self,dummy_arg=None): # callback
310 self.left_tk_var.set(self.meta_params.left*(1.0/1.05)) 311 self.right_tk_var.set(self.meta_params.right*(1.0/1.05)) 312 self.send_values()
313
314 - def frustum_wider(self,dummy_arg=None): # callback
315 self.left_tk_var.set(self.meta_params.left*1.05) 316 self.right_tk_var.set(self.meta_params.right*1.05) 317 self.send_values() 318
319 - def frustum_shorter(self,dummy_arg=None): # callback
320 self.bottom_tk_var.set(self.meta_params.bottom*(1.0/1.05)) 321 self.top_tk_var.set(self.meta_params.top*(1.0/1.05)) 322 self.send_values() 323
324 - def frustum_taller(self,dummy_arg=None): # callback
325 self.bottom_tk_var.set(self.meta_params.bottom*1.05) 326 self.top_tk_var.set(self.meta_params.top*1.05) 327 self.send_values() 328
329 - def frustum_left(self,dummy_arg=None): # callback
330 self.left_tk_var.set(self.meta_params.left*1.025) 331 self.right_tk_var.set(self.meta_params.right*(1.0/1.025)) 332 self.send_values() 333
334 - def frustum_right(self,dummy_arg=None): # callback
335 self.left_tk_var.set(self.meta_params.left*(1.0/1.025)) 336 self.right_tk_var.set(self.meta_params.right*1.025) 337 self.send_values() 338
339 - def frustum_down(self,dummy_arg=None): # callback
340 self.bottom_tk_var.set(self.meta_params.bottom*1.025) 341 self.top_tk_var.set(self.meta_params.top*(1.0/1.025)) 342 self.send_values() 343
344 - def frustum_up(self,dummy_arg=None): # callback
345 self.bottom_tk_var.set(self.meta_params.bottom*(1.0/1.025)) 346 self.top_tk_var.set(self.meta_params.top*1.025) 347 self.send_values() 348
349 - def get_az_el(self,xyz_tuple):
350 x,y,z = xyz_tuple 351 r = math.sqrt(x*x + y*y + z*z) 352 theta = math.acos(-y/r) 353 rh = r * math.sin(theta) 354 phi = math.atan2(-z,x) 355 az = -(phi * 180.0/math.pi - 90.0) 356 el = theta * 180.0/math.pi - 90.0 357 return az,el
358
359 - def get_xyz(self,az_el):
360 az,el = az_el 361 theta = (el + 90.0) / 180.0 * math.pi 362 phi = (az + 90.0) / 180.0 * math.pi 363 y = -math.cos(theta) 364 rh = math.sin(theta) 365 x = -rh * math.cos(phi) 366 z = -rh * math.sin(phi) 367 return x,y,z
368
369 - def az_increase(self,dummy_arg=None): # callback
370 az,el = self.get_az_el(self.meta_params.center) 371 az = az + 5.0 372 self.look_at_az_str.set("%.1f"%az) 373 x,y,z = self.get_xyz((az,el)) 374 self.center_x_tk_var.set("%.4f"%x) 375 self.center_y_tk_var.set("%.4f"%y) 376 self.center_z_tk_var.set("%.4f"%z) 377 self.send_values() 378
379 - def az_decrease(self,dummy_arg=None): # callback
380 az,el = self.get_az_el(self.meta_params.center) 381 az = az - 5.0 382 self.look_at_az_str.set("%.1f"%az) 383 x,y,z = self.get_xyz((az,el)) 384 self.center_x_tk_var.set("%.4f"%x) 385 self.center_y_tk_var.set("%.4f"%y) 386 self.center_z_tk_var.set("%.4f"%z) 387 self.send_values() 388
389 - def el_increase(self,dummy_arg=None): # callback
390 az,el = self.get_az_el(self.meta_params.center) 391 el = el + 5.0 392 el = min(el,90.0) 393 self.look_at_el_str.set("%.1f"%el) 394 x,y,z = self.get_xyz((az,el)) 395 self.center_x_tk_var.set("%.4f"%x) 396 self.center_y_tk_var.set("%.4f"%y) 397 self.center_z_tk_var.set("%.4f"%z) 398 self.send_values() 399
400 - def el_decrease(self,dummy_arg=None): # callback
401 az,el = self.get_az_el(self.meta_params.center) 402 el = el - 5.0 403 el = max(el,-90.0) 404 self.look_at_el_str.set("%.1f"%el) 405 x,y,z = self.get_xyz((az,el)) 406 self.center_x_tk_var.set("%.4f"%x) 407 self.center_y_tk_var.set("%.4f"%y) 408 self.center_z_tk_var.set("%.4f"%z) 409 self.send_values() 410
411 - def up_az_increase(self,dummy_arg=None): # callback
412 az,el = self.get_az_el(self.meta_params.up) 413 az = az + 5.0 414 self.up_az_str.set("%.1f"%az) 415 x,y,z = self.get_xyz((az,el)) 416 self.up_x_tk_var.set("%.4f"%x) 417 self.up_y_tk_var.set("%.4f"%y) 418 self.up_z_tk_var.set("%.4f"%z) 419 self.send_values() 420
421 - def up_az_decrease(self,dummy_arg=None): # callback
422 az,el = self.get_az_el(self.meta_params.up) 423 az = az - 5.0 424 self.up_az_str.set("%.1f"%az) 425 x,y,z = self.get_xyz((az,el)) 426 self.up_x_tk_var.set("%.4f"%x) 427 self.up_y_tk_var.set("%.4f"%y) 428 self.up_z_tk_var.set("%.4f"%z) 429 self.send_values() 430
431 - def up_el_increase(self,dummy_arg=None): # callback
432 az,el = self.get_az_el(self.meta_params.up) 433 el = el + 5.0 434 el = min(el,90.0) 435 self.up_el_str.set("%.1f"%el) 436 x,y,z = self.get_xyz((az,el)) 437 self.up_x_tk_var.set("%.4f"%x) 438 self.up_y_tk_var.set("%.4f"%y) 439 self.up_z_tk_var.set("%.4f"%z) 440 self.send_values() 441
442 - def up_el_decrease(self,dummy_arg=None): # callback
443 az,el = self.get_az_el(self.meta_params.up) 444 el = el - 5.0 445 el = max(el,-90.0) 446 self.up_el_str.set("%.1f"%el) 447 x,y,z = self.get_xyz((az,el)) 448 self.up_x_tk_var.set("%.4f"%x) 449 self.up_y_tk_var.set("%.4f"%y) 450 self.up_z_tk_var.set("%.4f"%z) 451 self.send_values() 452
453 - def save(self):
454 filename = tkFileDialog.asksaveasfilename(defaultextension=".ve_3dproj",filetypes=[('Projection file','*.ve_3dproj')]) 455 fd = open(filename,"wb") 456 save_dict = self.get_param_dict() 457 pickle.dump( save_dict, fd )
458
459 - def load(self):
460 filename = tkFileDialog.askopenfilename(defaultextension=".ve_3dproj",filetypes=[('Projection file','*.ve_3dproj')]) 461 if not filename: 462 return 463 fd = open(filename,"rb") 464 file_contents = fd.read() 465 file_contents = file_contents.replace('\r\n','\n') # deal with Windows newlines 466 memory_file = StringIO.StringIO(file_contents) 467 load_dict = pickle.load(memory_file) 468 self.set_param_dict( load_dict ) 469 self.send_values()
470
471 - def get_shortname(self):
472 """Used as basename for saving parameter files""" 473 return "screen_position"
474
475 - def get_param_dict(self):
476 result = {} 477 for param_name in dir(self.meta_params): 478 if param_name[:2] != '__' and param_name[-2:] != '__': 479 result[param_name] = getattr(self.meta_params,param_name) 480 return result
481
482 - def get_type(self):
483 return "screenPositionGUI"
484
485 - def set_param_dict(self,new_param_dict):
486 orig_params = dir(self.meta_params) 487 for new_param_name in new_param_dict.keys(): 488 if new_param_name[:2] != '__' and new_param_name[-2:] != '__': 489 if new_param_name not in orig_params: 490 raise ValueError('Gave parameter "%s", which I do not know about.'%(new_param_name,)) 491 setattr(self.meta_params,new_param_name,new_param_dict[new_param_name]) 492 self.left_tk_var.set( self.meta_params.left ) 493 self.right_tk_var.set( self.meta_params.right ) 494 self.top_tk_var.set( self.meta_params.top ) 495 self.bottom_tk_var.set( self.meta_params.bottom ) 496 self.near_tk_var.set( self.meta_params.near ) 497 self.far_tk_var.set( self.meta_params.far ) 498 self.eye_x_tk_var.set( self.meta_params.eye[0] ) 499 self.eye_y_tk_var.set( self.meta_params.eye[1] ) 500 self.eye_z_tk_var.set( self.meta_params.eye[2] ) 501 self.center_x_tk_var.set( self.meta_params.center[0] ) 502 self.center_y_tk_var.set( self.meta_params.center[1] ) 503 self.center_z_tk_var.set( self.meta_params.center[2] ) 504 self.up_x_tk_var.set( self.meta_params.up[0] ) 505 self.up_y_tk_var.set( self.meta_params.up[1] ) 506 self.up_z_tk_var.set( self.meta_params.up[2] )
507
509 result = [] 510 for param_name in dir(self.meta_params): 511 if param_name[:2] != '__' and param_name[-2:] != '__': 512 value = getattr(self.meta_params,param_name) 513 value_string = str(value) 514 result.append((param_name,value_string)) 515 return result
516
518 return self.loopable_variables.keys()
519
520 - def set_loopable_variable(self,easy_name,value):
521 meta_param_var_name,tk_var = self.loopable_variables[easy_name] 522 setattr(self.meta_params,meta_param_var_name,value) 523 tk_var.set(value) 524 self.update() # update screen with new tk_var value
525
526 - def send_values(self,dummy_arg=None):
527 self.meta_params.left = self.left_tk_var.get() 528 self.meta_params.right = self.right_tk_var.get() 529 self.meta_params.top = self.top_tk_var.get() 530 self.meta_params.bottom = self.bottom_tk_var.get() 531 self.meta_params.near = self.near_tk_var.get() 532 self.meta_params.far = self.far_tk_var.get() 533 self.meta_params.eye = (self.eye_x_tk_var.get(), 534 self.eye_y_tk_var.get(), 535 self.eye_z_tk_var.get()) 536 self.meta_params.center = (self.center_x_tk_var.get(), 537 self.center_y_tk_var.get(), 538 self.center_z_tk_var.get()) 539 self.meta_params.up = (self.up_x_tk_var.get(), 540 self.up_y_tk_var.get(), 541 self.up_z_tk_var.get()) 542 543 if self.connected: 544 self.projection_controller.set_parameters( self.meta_params )
545
546 - def connect(self,server_hostname='',server_port=7766):
547 self.pyro_client = VisionEgg.PyroClient.PyroClient(server_hostname,server_port) 548 549 self.projection_controller = self.pyro_client.get("projection_controller") 550 551 self.connected = 1 552 if hasattr(self, 'connected_label'): 553 self.connected_label.config(text="Server status: Connected") 554 self.send_values() # send values only when running this way, otherwise get values 555 else: 556 self.meta_params = self.projection_controller.get_parameters() 557 self.set_param_dict( {} ) # updates screen values to self.meta_params
558
559 - def quit_server(self,dummy=None):
560 self.projection_controller.quit_server() 561 self.connected = 0 562 self.connected_label.config(text="Server status: Not connected")
563 564 if __name__=='__main__': 565 frame = ScreenPositionControlFrame() 566 frame.pack(expand=1,fill=Tkinter.BOTH) 567 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 568 frame.mainloop() 569

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI.CallbackEntry-class.html0000644000076500000240000003637711224565531032050 0ustar astrawstaff VisionEgg.PyroApps.ScreenPositionGUI.CallbackEntry
Package VisionEgg :: Package PyroApps :: Module ScreenPositionGUI :: Class CallbackEntry
[frames] | no frames]

Class CallbackEntry

source code

  Tkinter.Misc --+            
                 |            
Tkinter.BaseWidget --+        
                     |        
      Tkinter.Pack --+        
                     |        
     Tkinter.Place --+        
                     |        
      Tkinter.Grid --+        
                     |        
        Tkinter.Widget --+    
                         |    
             Tkinter.Entry --+
                             |
                            CallbackEntry

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, callback=None, **kw)
Construct an entry widget with the parent MASTER.
source code

Inherited from Tkinter.Entry: delete, get, icursor, index, insert, scan_dragto, scan_mark, select_adjust, select_clear, select_from, select_present, select_range, select_to, selection_adjust, selection_clear, selection_from, selection_present, selection_range, selection_to, xview, xview_moveto, xview_scroll

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, callback=None, **kw)
(Constructor)

source code 
Construct an entry widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, cursor,
exportselection, fg, font, foreground, highlightbackground,
highlightcolor, highlightthickness, insertbackground,
insertborderwidth, insertofftime, insertontime, insertwidth,
invalidcommand, invcmd, justify, relief, selectbackground,
selectborderwidth, selectforeground, show, state, takefocus,
textvariable, validate, validatecommand, vcmd, width,
xscrollcommand.

Overrides: Tkinter.Entry.__init__
(inherited documentation)

././@LongLink0000000000000000000000000000015600000000000011710 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-c0000644000076500000240000011246711224565531032757 0ustar astrawstaff VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame
Package VisionEgg :: Package PyroApps :: Module ScreenPositionGUI :: Class ScreenPositionControlFrame
[frames] | no frames]

Class ScreenPositionControlFrame

source code

  Tkinter.Misc --+            
                 |            
Tkinter.BaseWidget --+        
                     |        
      Tkinter.Pack --+        
                     |        
     Tkinter.Place --+        
                     |        
      Tkinter.Grid --+        
                     |        
        Tkinter.Widget --+    
                         |    
             Tkinter.Frame --+
                             |
                            ScreenPositionControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, auto_connect=0, server_hostname='', server_port=7766, **kw)
Construct a frame widget with the parent MASTER.
source code
 
frustum_narrower(self, dummy_arg=None) source code
 
frustum_wider(self, dummy_arg=None) source code
 
frustum_shorter(self, dummy_arg=None) source code
 
frustum_taller(self, dummy_arg=None) source code
 
frustum_left(self, dummy_arg=None) source code
 
frustum_right(self, dummy_arg=None) source code
 
frustum_down(self, dummy_arg=None) source code
 
frustum_up(self, dummy_arg=None) source code
 
get_az_el(self, xyz_tuple) source code
 
get_xyz(self, az_el) source code
 
az_increase(self, dummy_arg=None) source code
 
az_decrease(self, dummy_arg=None) source code
 
el_increase(self, dummy_arg=None) source code
 
el_decrease(self, dummy_arg=None) source code
 
up_az_increase(self, dummy_arg=None) source code
 
up_az_decrease(self, dummy_arg=None) source code
 
up_el_increase(self, dummy_arg=None) source code
 
up_el_decrease(self, dummy_arg=None) source code
 
save(self) source code
 
load(self) source code
 
get_shortname(self)
Used as basename for saving parameter files
source code
 
get_param_dict(self) source code
 
get_type(self) source code
 
set_param_dict(self, new_param_dict) source code
 
get_parameters_as_strings(self) source code
 
get_loopable_variable_names(self) source code
 
set_loopable_variable(self, easy_name, value) source code
 
send_values(self, dummy_arg=None) source code
 
connect(self, server_hostname='', server_port=7766) source code
 
quit_server(self, dummy=None) source code

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, auto_connect=0, server_hostname='', server_port=7766, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: Tkinter.Frame.__init__
(inherited documentation)

././@LongLink0000000000000000000000000000015400000000000011706 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters-cla0000644000076500000240000001235111224565531032773 0ustar astrawstaff VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters
Package VisionEgg :: Package PyroApps :: Module ScreenPositionGUI :: Class ScreenPositionParameters
[frames] | no frames]

Class ScreenPositionParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionServer-module.html0000644000076500000240000001445711224565531030330 0ustar astrawstaff VisionEgg.PyroApps.ScreenPositionServer
Package VisionEgg :: Package PyroApps :: Module ScreenPositionServer
[frames] | no frames]

Module ScreenPositionServer

source code

Handle 3D perspective projection (server-side)




Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  ScreenPositionMetaController
Encapsulates all parameters controlling screen position
Variables
  __version__ = VisionEgg.release_name
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionServer-pysrc.html0000644000076500000240000024652711224565531030210 0ustar astrawstaff VisionEgg.PyroApps.ScreenPositionServer
Package VisionEgg :: Package PyroApps :: Module ScreenPositionServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.ScreenPositionServer

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: ScreenPositionServer 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  """Handle 3D perspective projection (server-side)""" 
 15   
 16  import Pyro.core 
 17   
 18  import sys, os, string 
 19  import VisionEgg.Core 
 20  import VisionEgg.FlowControl 
 21  import VisionEgg.SphereMap 
 22  import VisionEgg.Textures 
 23  import VisionEgg.PyroHelpers 
 24   
 25  from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters 
 26   
 27  __version__ = VisionEgg.release_name 
 28  __cvs__ = string.split('$Revision$')[1] 
 29  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 30  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 31   
32 -class ScreenPositionMetaController( Pyro.core.ObjBase ):
33 """Encapsulates all parameters controlling screen position"""
34 - def __init__(self,presentation,projection):
35 Pyro.core.ObjBase.__init__(self) 36 self.meta_params = ScreenPositionParameters() 37 if not isinstance(presentation,VisionEgg.FlowControl.Presentation): 38 raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") 39 if not isinstance(projection,VisionEgg.Core.PerspectiveProjection): 40 raise ValueError("Expecting instance of VisionEgg.Core.PerspectiveProjection") 41 self.p = presentation 42 self.proj = projection
43
44 - def get_parameters(self):
45 return self.meta_params
46
47 - def set_parameters(self, new_parameters):
48 if isinstance(new_parameters, ScreenPositionParameters): 49 self.meta_params = new_parameters 50 else: 51 raise ValueError("Argument to set_parameters must be instance of ScreenPositionParameters") 52 self.update()
53
54 - def update(self):
55 left = self.meta_params.left 56 right = self.meta_params.right 57 bottom = self.meta_params.bottom 58 top = self.meta_params.top 59 near = self.meta_params.near 60 far = self.meta_params.far 61 62 eye = (self.meta_params.eye[0], 63 self.meta_params.eye[1], 64 self.meta_params.eye[2]) 65 66 center = (self.meta_params.center[0], 67 self.meta_params.center[1], 68 self.meta_params.center[2]) 69 70 up = (self.meta_params.up[0], 71 self.meta_params.up[1], 72 self.meta_params.up[2]) 73 74 temp = VisionEgg.Core.PerspectiveProjection(left,right,bottom,top,near,far) 75 temp.look_at(eye,center,up) 76 self.proj.parameters.matrix = temp.get_matrix()
77
78 - def go(self):
79 self.p.parameters.enter_go_loop = 1
80
81 - def quit_server(self):
82 self.p.parameters.quit = 1
83 84 # Don't do anything unless this script is being run 85 if __name__ == '__main__': 86 87 pyro_server = VisionEgg.PyroHelpers.PyroServer() 88 89 # get Vision Egg stimulus ready to go 90 screen = VisionEgg.Core.Screen.create_default() 91 filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data/az_el.png") 92 texture = VisionEgg.Textures.Texture(filename) 93 sphere_map = VisionEgg.SphereMap.SphereMap(texture=texture, 94 shrink_texture_ok=1, 95 stacks=100, 96 slices=100) 97 temp = ScreenPositionParameters() 98 99 projection = VisionEgg.Core.PerspectiveProjection(temp.left, 100 temp.right, 101 temp.bottom, 102 temp.top, 103 temp.near, 104 temp.far) 105 viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[sphere_map],projection=projection) 106 p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) 107 108 # now hand over control of stimulus to GratingExperimentMetaController 109 projection_controller = ScreenPositionMetaController(p,projection) 110 pyro_server.connect(projection_controller,"projection_controller") 111 112 # get listener controller and register it 113 p.add_controller(None,None, pyro_server.create_listener_controller()) 114 115 # enter endless loop 116 p.run_forever() 117

././@LongLink0000000000000000000000000000016300000000000011706 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaControl0000644000076500000240000002556611224565531033220 0ustar astrawstaff VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController
Package VisionEgg :: Package PyroApps :: Module ScreenPositionServer :: Class ScreenPositionMetaController
[frames] | no frames]

Class ScreenPositionMetaController

source code

Pyro.core.ObjBase --+
                    |
                   ScreenPositionMetaController

Encapsulates all parameters controlling screen position



Instance Methods
 
__init__(self, presentation, projection) source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, presentation, projection)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI-module.html0000644000076500000240000001637111224565531027301 0ustar astrawstaff VisionEgg.PyroApps.SphereGratingGUI
Package VisionEgg :: Package PyroApps :: Module SphereGratingGUI
[frames] | no frames]

Module SphereGratingGUI

source code

Handle perspective-distorted sinusoidal gratings (client-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  SphereGratingMetaParameters
  SphereGratingControlFrame
Functions
 
get_control_list() source code
Variables
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI-pysrc.html0000644000076500000240000036144311224565531027157 0ustar astrawstaff VisionEgg.PyroApps.SphereGratingGUI
Package VisionEgg :: Package PyroApps :: Module SphereGratingGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.SphereGratingGUI

  1  #!/usr/bin/env python 
  2  """Handle perspective-distorted sinusoidal gratings (client-side)""" 
  3   
  4  # Copyright (c) 2002-2003 Andrew Straw.  Distributed under the terms 
  5  # of the GNU Lesser General Public License (LGPL). 
  6   
  7  import VisionEgg, string 
  8  __version__ = VisionEgg.release_name 
  9  __cvs__ = string.split('$Revision$')[1] 
 10  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 11  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 12   
 13  import sys, os 
 14  import Tkinter 
 15  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
 16   
17 -def get_control_list():
18 return [("sphere_grating_server",SphereGratingControlFrame,SphereGratingControlFrame.title)]
19
21 - def __init__(self):
22 self.contrast = 1.0 23 self.orient = 0.0 24 self.sf = 0.1 # cycles per degree 25 self.tf = 1.0 26 self.pre_stim_sec = 1.0 27 self.stim_sec = 2.0 28 self.post_stim_sec = 1.0 29 self.window_func = 'gaussian' 30 self.window_radius = 10.0 31 self.window_az = 0.0 32 self.window_el = 0.0
33
34 -class SphereGratingControlFrame(client_utils.StimulusControlFrame):
35 title = "Grating (Perspective-distorted) Experiment"
36 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
37 client_utils.StimulusControlFrame.__init__(self, 38 master, 39 suppress_go_buttons, 40 SphereGratingControlFrame.title, 41 SphereGratingMetaParameters, 42 **kw) 43 44 param_frame = self.param_frame # shorthand for self.param_frame created in base class 45 46 # Allow columns to expand 47 param_frame.columnconfigure(0,weight=1) 48 param_frame.columnconfigure(1,weight=1) 49 50 pf_row = 0 51 Tkinter.Label(param_frame,text="Contrast:").grid(row=pf_row,column=0) 52 self.contrast_tk_var = Tkinter.DoubleVar() 53 self.contrast_tk_var.set(self.meta_params.contrast) 54 self.make_callback_entry(textvariable=self.contrast_tk_var).grid(row=pf_row,column=1) 55 self.loopable_variables["Contrast"] = ("contrast",self.contrast_tk_var) 56 57 pf_row += 1 58 Tkinter.Label(param_frame,text="Orientation (deg):").grid(row=pf_row,column=0) 59 self.orient_tk_var = Tkinter.DoubleVar() 60 self.orient_tk_var.set(self.meta_params.orient) 61 self.make_callback_entry(textvariable=self.orient_tk_var).grid(row=pf_row,column=1) 62 self.loopable_variables["Orientation"] = ("orient",self.orient_tk_var) 63 64 pf_row += 1 65 Tkinter.Label(param_frame,text="Spatial frequency (Cpd):").grid(row=pf_row,column=0) 66 self.sf_tk_var = Tkinter.DoubleVar() 67 self.sf_tk_var.set(self.meta_params.sf) 68 self.make_callback_entry(textvariable=self.sf_tk_var).grid(row=pf_row,column=1) 69 self.loopable_variables["Spatial frequency"] = ("sf",self.sf_tk_var) 70 71 pf_row += 1 72 Tkinter.Label(param_frame,text="Temporal frequency (Hz):").grid(row=pf_row,column=0) 73 self.tf_tk_var = Tkinter.DoubleVar() 74 self.tf_tk_var.set(self.meta_params.tf) 75 self.make_callback_entry(textvariable=self.tf_tk_var).grid(row=pf_row,column=1) 76 self.loopable_variables["Temporal frequency"] = ("tf",self.tf_tk_var) 77 78 pf_row += 1 79 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0) 80 self.prestim_dur_tk_var = Tkinter.DoubleVar() 81 self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) 82 self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=1) 83 84 pf_row += 1 85 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0) 86 self.stim_dur_tk_var = Tkinter.DoubleVar() 87 self.stim_dur_tk_var.set(self.meta_params.stim_sec) 88 self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=1) 89 90 pf_row += 1 91 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0) 92 self.poststim_dur_tk_var = Tkinter.DoubleVar() 93 self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) 94 self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=1) 95 96 pf_row += 1 97 Tkinter.Label(param_frame,text="Window function:").grid(row=pf_row,column=0) 98 self.window_func_tk_var = Tkinter.StringVar() 99 self.window_func_tk_var.set(self.meta_params.window_func) 100 bar = Tkinter.Menubutton(param_frame, textvariable=self.window_func_tk_var, relief=Tkinter.RAISED) 101 bar.grid(row=pf_row, column=1, sticky=Tkinter.W+Tkinter.E, pady=2, padx=2) 102 bar.menu = Tkinter.Menu(bar,tearoff=0) 103 bar.menu.add_radiobutton(label='circle', 104 value='circle', 105 variable=self.window_func_tk_var, 106 command=self.send_values) 107 bar.menu.add_radiobutton(label='gaussian', 108 value='gaussian', 109 variable=self.window_func_tk_var, 110 command=self.send_values) 111 bar['menu'] = bar.menu 112 113 pf_row += 1 114 Tkinter.Label(param_frame,text="Window radius/sigma (deg):").grid(row=pf_row,column=0) 115 self.window_radius_tk_var = Tkinter.DoubleVar() 116 self.window_radius_tk_var.set(self.meta_params.window_radius) 117 self.make_callback_entry(textvariable=self.window_radius_tk_var).grid(row=pf_row,column=1) 118 119 pf_row += 1 120 Tkinter.Label(param_frame,text="Window azimuth (deg):").grid(row=pf_row,column=0) 121 self.window_az_tk_var = Tkinter.DoubleVar() 122 self.window_az_tk_var.set(self.meta_params.window_az) 123 self.make_callback_entry(textvariable=self.window_az_tk_var).grid(row=pf_row,column=1) 124 self.loopable_variables["Window azimuth"] = ("window_az",self.window_az_tk_var) 125 126 pf_row += 1 127 Tkinter.Label(param_frame,text="Window elevation (deg):").grid(row=pf_row,column=0) 128 self.window_el_tk_var = Tkinter.DoubleVar() 129 self.window_el_tk_var.set(self.meta_params.window_el) 130 self.make_callback_entry(textvariable=self.window_el_tk_var).grid(row=pf_row,column=1) 131 self.loopable_variables["Window elevation"] = ("window_el",self.window_el_tk_var)
132
133 - def get_shortname(self):
134 return "sphere_grating"
135
136 - def update_tk_vars(self):
137 self.contrast_tk_var.set( self.meta_params.contrast ) 138 self.orient_tk_var.set( self.meta_params.orient ) 139 self.sf_tk_var.set( self.meta_params.sf ) 140 self.tf_tk_var.set( self.meta_params.tf ) 141 self.prestim_dur_tk_var.set( self.meta_params.pre_stim_sec ) 142 self.stim_dur_tk_var.set( self.meta_params.stim_sec ) 143 self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec ) 144 self.window_func_tk_var.set( self.meta_params.window_func ) 145 self.window_radius_tk_var.set( self.meta_params.window_radius ) 146 self.window_az_tk_var.set( self.meta_params.window_az ) 147 self.window_el_tk_var.set( self.meta_params.window_el )
148
149 - def send_values(self,dummy_arg=None):
150 self.meta_params.contrast = self.contrast_tk_var.get() 151 self.meta_params.orient = self.orient_tk_var.get() 152 self.meta_params.sf = self.sf_tk_var.get() 153 self.meta_params.tf = self.tf_tk_var.get() 154 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 155 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 156 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 157 self.meta_params.window_func = self.window_func_tk_var.get() 158 self.meta_params.window_radius = self.window_radius_tk_var.get() 159 self.meta_params.window_az = self.window_az_tk_var.get() 160 self.meta_params.window_el = self.window_el_tk_var.get() 161 if self.connected: 162 self.meta_controller.set_parameters( self.meta_params )
163
164 - def get_duration_sec(self):
165 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 166 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 167 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 168 return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec
169 170 if __name__=='__main__': 171 frame = SphereGratingControlFrame() 172 frame.pack(expand=1,fill=Tkinter.BOTH) 173 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 174 frame.mainloop() 175

././@LongLink0000000000000000000000000000015400000000000011706 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-cla0000644000076500000240000006032011224565531032656 0ustar astrawstaff VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame
Package VisionEgg :: Package PyroApps :: Module SphereGratingGUI :: Class SphereGratingControlFrame
[frames] | no frames]

Class SphereGratingControlFrame

source code

      Tkinter.Misc --+                
                     |                
    Tkinter.BaseWidget --+            
                         |            
          Tkinter.Pack --+            
                         |            
         Tkinter.Place --+            
                         |            
          Tkinter.Grid --+            
                         |            
            Tkinter.Widget --+        
                             |        
                 Tkinter.Frame --+    
                                 |    
EPhysGUIUtils.StimulusControlFrame --+
                                     |
                                    SphereGratingControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, **kw)
Construct a frame widget with the parent MASTER.
source code
 
get_shortname(self)
Used as basename for saving parameter files and other ID purposes
source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code

Inherited from EPhysGUIUtils.StimulusControlFrame: connect, get_loopable_variable_names, get_matlab_string, get_parameters_as_m_strings, get_parameters_as_py_strings, get_parameters_dict, go, make_callback_entry, quit_server, set_loopable_variable, set_param_dict, set_parameters_dict, standalone_connect

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables
  title = "Grating (Perspective-distorted) Experiment"

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: EPhysGUIUtils.StimulusControlFrame.__init__

get_shortname(self)

source code 
Used as basename for saving parameter files and other ID purposes

Overrides: EPhysGUIUtils.StimulusControlFrame.get_shortname
(inherited documentation)

update_tk_vars(self)

source code 
Update Tkinter variables with (new) values from meta_params

Overrides: EPhysGUIUtils.StimulusControlFrame.update_tk_vars
(inherited documentation)

send_values(self, dummy_arg=None)

source code 
Update meta_params variables with values from Tkinter fields

Overrides: EPhysGUIUtils.StimulusControlFrame.send_values
(inherited documentation)

get_duration_sec(self)

source code 
Calculate total duration in go loop

Overrides: EPhysGUIUtils.StimulusControlFrame.get_duration_sec
(inherited documentation)

././@LongLink0000000000000000000000000000015600000000000011710 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters-c0000644000076500000240000001236511224565531032666 0ustar astrawstaff VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters
Package VisionEgg :: Package PyroApps :: Module SphereGratingGUI :: Class SphereGratingMetaParameters
[frames] | no frames]

Class SphereGratingMetaParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingServer-module.html0000644000076500000240000002042411224565531030115 0ustar astrawstaff VisionEgg.PyroApps.SphereGratingServer
Package VisionEgg :: Package PyroApps :: Module SphereGratingServer
[frames] | no frames]

Module SphereGratingServer

source code

Handle perspective-distorted sinusoidal gratings (server-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  SphereGratingExperimentMetaController
Functions
 
get_meta_controller_class() source code
 
make_stimuli() source code
 
get_meta_controller_stimkey() source code
Variables
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingServer-pysrc.html0000644000076500000240000032743311224565531030002 0ustar astrawstaff VisionEgg.PyroApps.SphereGratingServer
Package VisionEgg :: Package PyroApps :: Module SphereGratingServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.SphereGratingServer

  1  #!/usr/bin/env python 
  2  """Handle perspective-distorted sinusoidal gratings (server-side)""" 
  3   
  4  # Copyright (c) 2002-2003 Andrew Straw.  Distributed under the terms 
  5  # of the GNU Lesser General Public License (LGPL). 
  6   
  7  import VisionEgg, string 
  8  __version__ = VisionEgg.release_name 
  9  __cvs__ = string.split('$Revision$')[1] 
 10  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 11  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 12   
 13  import sys, os, math 
 14  import VisionEgg.Core 
 15  import VisionEgg.FlowControl 
 16  import VisionEgg.SphereMap 
 17  import VisionEgg.PyroHelpers 
 18  import Pyro.core 
 19   
 20  from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController 
 21  from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters 
 22  from VisionEgg.PyroApps.SphereGratingGUI import SphereGratingMetaParameters 
 23   
24 -class SphereGratingExperimentMetaController( Pyro.core.ObjBase ):
25 - def __init__(self,screen,presentation,stimuli):
26 27 # get stimuli 28 assert( stimuli[0][0] == '3d_perspective') 29 assert( stimuli[1][0] == '3d_perspective') 30 sphere_grating = stimuli[0][1] 31 sphere_window = stimuli[1][1] 32 33 Pyro.core.ObjBase.__init__(self) 34 self.meta_params = SphereGratingMetaParameters() 35 if not isinstance(screen,VisionEgg.Core.Screen): 36 raise ValueError("Expecting instance of VisionEgg.Core.Screen") 37 if not isinstance(presentation,VisionEgg.FlowControl.Presentation): 38 raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") 39 if not isinstance(sphere_grating,VisionEgg.SphereMap.SphereGrating): 40 raise ValueError("Expecting instance of VisionEgg.SphereMap.SphereGrating") 41 if not isinstance(sphere_window,VisionEgg.SphereMap.SphereWindow): 42 raise ValueError("Expecting instance of VisionEgg.SphereMap.SphereWindow") 43 self.p = presentation 44 self.stim = sphere_grating 45 self.window = sphere_window 46 47 screen.parameters.bgcolor = (0.5, 0.5, 0.5, 0.0) 48 49 self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController( 50 during_go_func=self.on_function_during_go, 51 between_go_func=self.on_function_between_go))
52
53 - def __del__(self):
54 self.p.remove_controller(self.stim,'on') 55 Pyro.core.ObjBase.__del__(self) # call base class
56
57 - def on_function_during_go(self,t):
58 """Compute when the grating is on""" 59 if t <= self.meta_params.pre_stim_sec: 60 return 0 # not on yet 61 elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): 62 return 1 # on 63 else: 64 return 0 # off again
65
66 - def on_function_between_go(self):
67 """Compute when the grating is off""" 68 return 0 # off again
69
70 - def get_parameters(self):
71 return self.meta_params
72
73 - def set_parameters(self, new_parameters):
74 if isinstance(new_parameters, SphereGratingMetaParameters): 75 self.meta_params = new_parameters 76 else: 77 raise ValueError("Argument to set_parameters must be instance of SphereGratingMetaParameters") 78 # self.meta_params = new_parameters 79 self.update()
80
81 - def update(self):
82 stim_params = self.stim.parameters # shorthand 83 window_params = self.window.parameters # shorthand 84 meta_params = self.meta_params # shorthand 85 stim_params.contrast = meta_params.contrast 86 stim_params.orientation = meta_params.orient 87 stim_params.spatial_freq_cpd = meta_params.sf 88 stim_params.temporal_freq_hz = meta_params.tf 89 stim_params.grating_center_azimuth = meta_params.window_az 90 stim_params.grating_center_elevation = meta_params.window_el 91 self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds') 92 window_params.window_shape = meta_params.window_func 93 window_params.window_shape_radius_parameter = meta_params.window_radius 94 window_params.window_center_azimuth = meta_params.window_az 95 window_params.window_center_elevation = meta_params.window_el
96
97 - def go(self):
98 self.p.parameters.enter_go_loop = 1
99
100 - def quit_server(self):
101 self.p.parameters.quit = 1
102 105
106 -def make_stimuli():
107 stimulus = VisionEgg.SphereMap.SphereGrating(radius=1.0, 108 spatial_freq_cpd=1.0/9.0, 109 temporal_freq_hz = 1.0) 110 mask = VisionEgg.SphereMap.SphereWindow(radius=0.95) 111 return [('3d_perspective',stimulus),('3d_perspective',mask)]
112
114 return "sphere_grating_server"
115 116 # Don't do anything unless this script is being run 117 if __name__ == '__main__': 118 119 pyro_server = VisionEgg.PyroHelpers.PyroServer() 120 121 screen = VisionEgg.Core.Screen.create_default() 122 123 # get Vision Egg stimulus ready to go 124 stimuli = make_stimuli() 125 stimulus = stimuli[0][1] 126 mask = stimuli[1][1] 127 128 temp = ScreenPositionParameters() 129 130 left = temp.left 131 right = temp.right 132 bottom = temp.bottom 133 top = temp.top 134 near = temp.near 135 far = temp.far 136 projection = VisionEgg.Core.PerspectiveProjection(left, 137 right, 138 bottom, 139 top, 140 near, 141 far) 142 viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus,mask],projection=projection) 143 p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) 144 145 # now hand over control of projection to ScreenPositionMetaController 146 projection_controller = ScreenPositionMetaController(p,projection) 147 pyro_server.connect(projection_controller,"projection_controller") 148 149 # now hand over control of grating and mask to SphereGratingExperimentMetaController 150 meta_controller = SphereGratingExperimentMetaController(screen,p,stimuli) 151 pyro_server.connect(meta_controller,get_meta_controller_stimkey()) 152 153 # get listener controller and register it 154 p.add_controller(None,None, pyro_server.create_listener_controller()) 155 156 # enter endless loop 157 p.run_forever() 158

././@LongLink0000000000000000000000000000017300000000000011707 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMet0000644000076500000240000003230311224565531033136 0ustar astrawstaff VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController
Package VisionEgg :: Package PyroApps :: Module SphereGratingServer :: Class SphereGratingExperimentMetaController
[frames] | no frames]

Class SphereGratingExperimentMetaController

source code

Pyro.core.ObjBase --+
                    |
                   SphereGratingExperimentMetaController

Instance Methods
 
__init__(self, screen, presentation, stimuli) source code
 
__del__(self) source code
 
on_function_during_go(self, t)
Compute when the grating is on
source code
 
on_function_between_go(self)
Compute when the grating is off
source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, screen, presentation, stimuli)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI-module.html0000644000076500000240000001711011224565531027144 0ustar astrawstaff VisionEgg.PyroApps.SpinningDrumGUI
Package VisionEgg :: Package PyroApps :: Module SpinningDrumGUI
[frames] | no frames]

Module SpinningDrumGUI

source code

Classes
  SpinningDrumMetaParameters
  SpinningDrumControlFrame
Functions
 
get_control_list() source code
Variables
  __version__ = '1.1.dev'
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI-pysrc.html0000644000076500000240000026627611224565531027042 0ustar astrawstaff VisionEgg.PyroApps.SpinningDrumGUI
Package VisionEgg :: Package PyroApps :: Module SpinningDrumGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.SpinningDrumGUI

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: SpinningDrumGUI 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  import VisionEgg, string 
 15  __version__ = VisionEgg.release_name 
 16  __cvs__ = string.split('$Revision$')[1] 
 17  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 18  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 19   
 20  import sys, os 
 21  import Tkinter 
 22  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
 23   
24 -def get_control_list():
25 return [("spinning_drum_server",SpinningDrumControlFrame,SpinningDrumControlFrame.title)]
26
28 - def __init__(self):
29 self.contrast = 1.0 30 self.velocity_dps = 100.0 31 self.startpos_deg = 0.0 32 self.pre_stim_sec = 1.0 33 self.stim_sec = 5.0 34 self.post_stim_sec = 1.0
35
36 -class SpinningDrumControlFrame(client_utils.StimulusControlFrame):
37 title = "Spinning Drum Experiment"
38 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
39 client_utils.StimulusControlFrame.__init__(self, 40 master, 41 suppress_go_buttons, 42 SpinningDrumControlFrame.title, 43 SpinningDrumMetaParameters, 44 **kw) 45 46 param_frame = self.param_frame # shorthand for self.param_frame created in base class 47 48 # Allow columns to expand 49 param_frame.columnconfigure(0,weight=1) 50 param_frame.columnconfigure(1,weight=1) 51 52 pf_row = 0 53 Tkinter.Label(param_frame,text="Contrast:").grid(row=pf_row,column=0) 54 self.contrast_tk_var = Tkinter.DoubleVar() 55 self.contrast_tk_var.set(self.meta_params.contrast) 56 self.make_callback_entry(textvariable=self.contrast_tk_var).grid(row=pf_row,column=1) 57 self.loopable_variables["Contrast"] = ("contrast",self.contrast_tk_var) 58 59 pf_row += 1 60 Tkinter.Label(param_frame,text="Velocity (dps):").grid(row=pf_row,column=0) 61 self.velocity_tk_var = Tkinter.DoubleVar() 62 self.velocity_tk_var.set(self.meta_params.velocity_dps) 63 self.make_callback_entry(textvariable=self.velocity_tk_var).grid(row=pf_row,column=1) 64 self.loopable_variables["Velocity"] = ("velocity_dps",self.velocity_tk_var) 65 66 pf_row += 1 67 Tkinter.Label(param_frame,text="Start position (deg):").grid(row=pf_row,column=0) 68 self.startpos_tk_var = Tkinter.DoubleVar() 69 self.startpos_tk_var.set(self.meta_params.startpos_deg) 70 self.make_callback_entry(textvariable=self.startpos_tk_var).grid(row=pf_row,column=1) 71 self.loopable_variables["Start position"] = ("startpos_deg",self.startpos_tk_var) 72 73 pf_row += 1 74 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0) 75 self.prestim_dur_tk_var = Tkinter.DoubleVar() 76 self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) 77 self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=1) 78 79 pf_row += 1 80 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0) 81 self.stim_dur_tk_var = Tkinter.DoubleVar() 82 self.stim_dur_tk_var.set(self.meta_params.stim_sec) 83 self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=1) 84 85 pf_row += 1 86 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0) 87 self.poststim_dur_tk_var = Tkinter.DoubleVar() 88 self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) 89 self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=1)
90
91 - def get_shortname(self):
92 """Used as basename for saving parameter files""" 93 return "spinning_drum"
94
95 - def update_tk_vars(self):
96 self.contrast_tk_var.set( self.meta_params.contrast ) 97 self.velocity_tk_var.set( self.meta_params.velocity_dps ) 98 self.startpos_tk_var.set( self.meta_params.startpos_deg ) 99 self.stim_dur_tk_var.set( self.meta_params.stim_sec ) 100 self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec )
101
102 - def send_values(self,dummy_arg=None):
103 self.meta_params.contrast = self.contrast_tk_var.get() 104 self.meta_params.velocity_dps = self.velocity_tk_var.get() 105 self.meta_params.startpos_deg = self.startpos_tk_var.get() 106 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 107 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 108 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 109 if self.connected: 110 self.meta_controller.set_parameters( self.meta_params )
111
112 - def get_duration_sec(self):
113 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 114 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 115 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 116 return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec
117 118 if __name__=='__main__': 119 frame = SpinningDrumControlFrame() 120 frame.pack(expand=1,fill=Tkinter.BOTH) 121 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 122 frame.mainloop() 123

././@LongLink0000000000000000000000000000015200000000000011704 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class0000644000076500000240000006002611224565531032755 0ustar astrawstaff VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame
Package VisionEgg :: Package PyroApps :: Module SpinningDrumGUI :: Class SpinningDrumControlFrame
[frames] | no frames]

Class SpinningDrumControlFrame

source code

      Tkinter.Misc --+                
                     |                
    Tkinter.BaseWidget --+            
                         |            
          Tkinter.Pack --+            
                         |            
         Tkinter.Place --+            
                         |            
          Tkinter.Grid --+            
                         |            
            Tkinter.Widget --+        
                             |        
                 Tkinter.Frame --+    
                                 |    
EPhysGUIUtils.StimulusControlFrame --+
                                     |
                                    SpinningDrumControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, **kw)
Construct a frame widget with the parent MASTER.
source code
 
get_shortname(self)
Used as basename for saving parameter files
source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code

Inherited from EPhysGUIUtils.StimulusControlFrame: connect, get_loopable_variable_names, get_matlab_string, get_parameters_as_m_strings, get_parameters_as_py_strings, get_parameters_dict, go, make_callback_entry, quit_server, set_loopable_variable, set_param_dict, set_parameters_dict, standalone_connect

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables
  title = "Spinning Drum Experiment"

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: EPhysGUIUtils.StimulusControlFrame.__init__

get_shortname(self)

source code 
Used as basename for saving parameter files

Overrides: EPhysGUIUtils.StimulusControlFrame.get_shortname

update_tk_vars(self)

source code 
Update Tkinter variables with (new) values from meta_params

Overrides: EPhysGUIUtils.StimulusControlFrame.update_tk_vars
(inherited documentation)

send_values(self, dummy_arg=None)

source code 
Update meta_params variables with values from Tkinter fields

Overrides: EPhysGUIUtils.StimulusControlFrame.send_values
(inherited documentation)

get_duration_sec(self)

source code 
Calculate total duration in go loop

Overrides: EPhysGUIUtils.StimulusControlFrame.get_duration_sec
(inherited documentation)

././@LongLink0000000000000000000000000000015400000000000011706 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters-cla0000644000076500000240000001235111224565531032724 0ustar astrawstaff VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters
Package VisionEgg :: Package PyroApps :: Module SpinningDrumGUI :: Class SpinningDrumMetaParameters
[frames] | no frames]

Class SpinningDrumMetaParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumServer-module.html0000644000076500000240000002114411224565531027770 0ustar astrawstaff VisionEgg.PyroApps.SpinningDrumServer
Package VisionEgg :: Package PyroApps :: Module SpinningDrumServer
[frames] | no frames]

Module SpinningDrumServer

source code

Classes
  SpinningDrumExperimentMetaController
Functions
 
get_meta_controller_class() source code
 
make_stimuli() source code
 
get_meta_controller_stimkey() source code
Variables
  __version__ = '1.1.dev'
  __cvs__ = string.split('$Revision$') [1]
  __date__ = string.join(string.split('$Date$') [1: 3], ' ')
  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>'
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumServer-pysrc.html0000644000076500000240000032730211224565531027650 0ustar astrawstaff VisionEgg.PyroApps.SpinningDrumServer
Package VisionEgg :: Package PyroApps :: Module SpinningDrumServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.SpinningDrumServer

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: SpinningDrumServer 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  import VisionEgg, string 
 15  __version__ = VisionEgg.release_name 
 16  __cvs__ = string.split('$Revision$')[1] 
 17  __date__ = string.join(string.split('$Date$')[1:3], ' ') 
 18  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 19   
 20  import sys, os, math 
 21  import VisionEgg.Core 
 22  import VisionEgg.FlowControl 
 23  import VisionEgg.Textures 
 24  import VisionEgg.PyroHelpers 
 25  import Pyro.core 
 26   
 27  from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController 
 28  from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters 
 29  from VisionEgg.PyroApps.SpinningDrumGUI import SpinningDrumMetaParameters 
 30   
31 -class SpinningDrumExperimentMetaController( Pyro.core.ObjBase ):
32 - def __init__(self,screen,presentation,stimuli):
33 34 # get the instance of Stimulus that was created 35 assert( stimuli[0][0] == '3d_perspective' ) 36 spinning_drum = stimuli[0][1] 37 38 Pyro.core.ObjBase.__init__(self) 39 self.meta_params = SpinningDrumMetaParameters() 40 if not isinstance(screen,VisionEgg.Core.Screen): 41 raise ValueError("Expecting instance of VisionEgg.Core.Screen") 42 if not isinstance(presentation,VisionEgg.FlowControl.Presentation): 43 raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") 44 if not isinstance(spinning_drum,VisionEgg.Textures.SpinningDrum): 45 raise ValueError("Expecting instance of VisionEgg.Textures.SpinningDrum") 46 self.p = presentation 47 self.stim = spinning_drum 48 49 screen.parameters.bgcolor = (0.5, 0.5, 0.5, 0.0) 50 51 self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController( 52 during_go_func=self.on_function_during_go, 53 between_go_func=self.on_function_between_go)) 54 55 self.p.add_controller(self.stim,'angular_position',VisionEgg.FlowControl.FunctionController( 56 during_go_func=self.angular_position_during_go, 57 between_go_func=self.angular_position_between_go))
58
59 - def __del__(self):
60 self.p.remove_controller(self.stim,'on') 61 self.p.remove_controller(self.stim,'angular_position') 62 Pyro.core.ObjBase.__del__(self) # call base class
63
64 - def on_function_during_go(self,t):
65 if t <= self.meta_params.pre_stim_sec: 66 return 0 # not on yet 67 elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): 68 return 1 # on 69 else: 70 return 0 # off again
71
72 - def on_function_between_go(self):
73 return 0 # off
74
75 - def angular_position_during_go(self,t):
76 adjusted_t = t - self.meta_params.pre_stim_sec 77 return (adjusted_t * self.meta_params.velocity_dps) + self.meta_params.startpos_deg
78
80 return 0.0 # doesn't matter -- stimulus off
81
82 - def get_parameters(self):
83 return self.meta_params
84
85 - def set_parameters(self, new_parameters):
86 if isinstance(new_parameters, SpinningDrumMetaParameters): 87 self.meta_params = new_parameters 88 else: 89 raise ValueError("Argument to set_parameters must be instance of SpinningDrumMetaParameters") 90 self.update()
91
92 - def update(self):
93 stim_params = self.stim.parameters # shorthand 94 meta_params = self.meta_params # shorthand 95 stim_params.contrast = meta_params.contrast 96 self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds')
97
98 - def go(self):
99 self.p.parameters.enter_go_loop = 1
100
101 - def quit_server(self):
102 self.p.parameters.quit = 1
103 106
107 -def make_stimuli():
108 filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data/panorama.jpg") 109 texture = VisionEgg.Textures.Texture(filename) 110 stimulus = VisionEgg.Textures.SpinningDrum(texture=texture) # could add shrink_texture_ok=1 111 return [('3d_perspective',stimulus)] # return ordered list of tuples
112
114 return "spinning_drum_server"
115 116 # Don't do anything unless this script is being run 117 if __name__ == '__main__': 118 119 pyro_server = VisionEgg.PyroHelpers.PyroServer() 120 121 screen = VisionEgg.Core.Screen.create_default() 122 123 # get Vision Egg stimulus ready to go 124 stimuli = make_stimuli() 125 stimulus = stimuli[0][1] 126 temp = ScreenPositionParameters() 127 128 projection = VisionEgg.Core.PerspectiveProjection(temp.left, 129 temp.right, 130 temp.bottom, 131 temp.top, 132 temp.near, 133 temp.far) 134 viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus],projection=projection) 135 p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) 136 137 # now hand over control of projection to ScreenPositionMetaController 138 projection_controller = ScreenPositionMetaController(p,projection) 139 pyro_server.connect(projection_controller,"projection_controller") 140 141 # now hand over control of drum to SpinningDrumExperimentMetaController 142 meta_controller = SpinningDrumExperimentMetaController(screen,p,stimuli) 143 pyro_server.connect(meta_controller,get_meta_controller_stimkey()) 144 145 # get listener controller and register it 146 p.add_controller(None,None, pyro_server.create_listener_controller()) 147 148 # enter endless loop 149 p.run_forever() 150

././@LongLink0000000000000000000000000000017100000000000011705 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaC0000644000076500000240000003511011224565531033127 0ustar astrawstaff VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController
Package VisionEgg :: Package PyroApps :: Module SpinningDrumServer :: Class SpinningDrumExperimentMetaController
[frames] | no frames]

Class SpinningDrumExperimentMetaController

source code

Pyro.core.ObjBase --+
                    |
                   SpinningDrumExperimentMetaController

Instance Methods
 
__init__(self, screen, presentation, stimuli) source code
 
__del__(self) source code
 
on_function_during_go(self, t) source code
 
on_function_between_go(self) source code
 
angular_position_during_go(self, t) source code
 
angular_position_between_go(self) source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, screen, presentation, stimuli)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.TargetGUI-module.html0000644000076500000240000001615111224565531025761 0ustar astrawstaff VisionEgg.PyroApps.TargetGUI
Package VisionEgg :: Package PyroApps :: Module TargetGUI
[frames] | no frames]

Module TargetGUI

source code

Handle small target stimulus (client-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  TargetMetaParameters
  TargetControlFrame
Functions
 
get_control_list() source code
Variables
  __cvs__ = '$Revision$'.split() [1]
  __date__ = ' '.join('$Date$'.split() [1: 3])
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.TargetGUI-pysrc.html0000644000076500000240000042200011224565531025626 0ustar astrawstaff VisionEgg.PyroApps.TargetGUI
Package VisionEgg :: Package PyroApps :: Module TargetGUI
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.TargetGUI

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: TargetGUI 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  """Handle small target stimulus (client-side)""" 
 15   
 16  import VisionEgg 
 17  __version__ = VisionEgg.release_name 
 18  __cvs__ = '$Revision$'.split()[1] 
 19  __date__ = ' '.join('$Date$'.split()[1:3]) 
 20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 21   
 22  import sys, os, math 
 23  import Tkinter 
 24  import VisionEgg.PyroApps.EPhysGUIUtils as client_utils 
 25   
26 -def get_control_list():
27 return [("target_server",TargetControlFrame,TargetControlFrame.title)]
28
30 - def __init__(self):
31 # colors 32 self.color = (0.0, 0.0, 0.0, 1.0) 33 self.bgcolor = (1.0, 1.0, 1.0, 0.0) 34 35 # motion parameters 36 self.start_x = 10.0 37 self.start_y = 50.0 38 self.velocity_pps = 100.0 # pixels per second 39 self.direction_deg = 0.0 40 41 # size and orientation 42 self.width = 10.0 43 self.height = 30.0 44 self.orientation_deg = 0.0 45 46 self.pre_stim_sec = 1.0 47 self.stim_sec = 2.0 48 self.post_stim_sec = 1.0
49
50 -class TargetControlFrame(client_utils.StimulusControlFrame):
51 title = "Moving Target Experiment"
52 - def __init__(self, master=None, suppress_go_buttons=0,**kw):
53 client_utils.StimulusControlFrame.__init__(self, 54 master, 55 suppress_go_buttons, 56 TargetControlFrame.title, 57 TargetMetaParameters, 58 **kw) 59 60 param_frame = self.param_frame # shorthand for self.param_frame created in base class 61 62 pf_row = 0 63 Tkinter.Label(param_frame,text="Start X (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) 64 self.start_x_tk_var = Tkinter.DoubleVar() 65 self.start_x_tk_var.set(self.meta_params.start_x) 66 self.make_callback_entry(textvariable=self.start_x_tk_var).grid(row=pf_row,column=2) 67 self.loopable_variables["Start X"] = ("start_x",self.start_x_tk_var) 68 69 pf_row += 1 70 Tkinter.Label(param_frame,text="Start Y (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) 71 self.start_y_tk_var = Tkinter.DoubleVar() 72 self.start_y_tk_var.set(self.meta_params.start_y) 73 self.make_callback_entry(textvariable=self.start_y_tk_var).grid(row=pf_row,column=2) 74 self.loopable_variables["Start Y"] = ("start_y",self.start_y_tk_var) 75 76 pf_row += 1 77 Tkinter.Label(param_frame,text="Velocity (pixels/sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) 78 self.velocity_tk_var = Tkinter.DoubleVar() 79 self.velocity_tk_var.set(self.meta_params.velocity_pps) 80 self.make_callback_entry(textvariable=self.velocity_tk_var).grid(row=pf_row,column=2) 81 self.loopable_variables["Velocity"] = ("velocity_pps",self.velocity_tk_var) 82 83 pf_row += 1 84 Tkinter.Label(param_frame,text="Direction (degrees):").grid(row=pf_row,column=0,sticky=Tkinter.E) 85 self.direction_tk_var = Tkinter.DoubleVar() 86 self.direction_tk_var.set(self.meta_params.direction_deg) 87 self.make_callback_entry(textvariable=self.direction_tk_var).grid(row=pf_row,column=2) 88 self.loopable_variables["Direction"] = ("direction_deg",self.direction_tk_var) 89 90 pf_row += 1 91 Tkinter.Label(param_frame,text="Color:").grid(row=pf_row,column=0,sticky=Tkinter.E) 92 self.color_tk_var = Tkinter.StringVar() 93 self.color_tk_var.set("black on white") 94 bar = Tkinter.Menubutton(param_frame, textvariable=self.color_tk_var, relief=Tkinter.RAISED) 95 bar.grid(row=pf_row, column=2, sticky=Tkinter.W+Tkinter.E, pady=2, padx=2) 96 bar.menu = Tkinter.Menu(bar,tearoff=0) 97 bar.menu.add_radiobutton(label="white on black", 98 value="white on black", 99 variable=self.color_tk_var, 100 command=self.send_values) 101 bar.menu.add_radiobutton(label="black on white", 102 value="black on white", 103 variable=self.color_tk_var, 104 command=self.send_values) 105 bar['menu'] = bar.menu 106 107 pf_row += 1 108 Tkinter.Label(param_frame,text="Orientation (degrees):").grid(row=pf_row,column=0,sticky=Tkinter.E) 109 self.ortho_tk_var = Tkinter.StringVar() 110 self.ortho_tk_var.set("ortho") 111 112 manual = Tkinter.Radiobutton( param_frame, text="Manual", 113 variable=self.ortho_tk_var, value="manual") 114 manual.grid(row=pf_row,column=1) 115 116 self.orient_tk_var = Tkinter.DoubleVar() 117 self.orient_tk_var.set(self.meta_params.orientation_deg) 118 119 manual_entry = Tkinter.Entry( param_frame, 120 textvariable=self.orient_tk_var, 121 width=self.entry_width ) 122 manual_entry.grid(row=pf_row,column=2) 123 124 ortho = Tkinter.Radiobutton( param_frame, text="Orthogonal to motion", 125 variable=self.ortho_tk_var, value="ortho") 126 ortho.grid(row=pf_row,column=3) 127 self.loopable_variables["Orientation"] = ("orientation_deg",self.orient_tk_var) 128 129 pf_row += 1 130 Tkinter.Label(param_frame,text="Width (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) 131 self.width_tk_var = Tkinter.DoubleVar() 132 self.width_tk_var.set(self.meta_params.width) 133 self.make_callback_entry(textvariable=self.width_tk_var).grid(row=pf_row,column=2) 134 self.loopable_variables["Width"] = ("width",self.width_tk_var) 135 136 pf_row += 1 137 Tkinter.Label(param_frame,text="Height (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) 138 self.height_tk_var = Tkinter.DoubleVar() 139 self.height_tk_var.set(self.meta_params.height) 140 self.make_callback_entry(textvariable=self.height_tk_var).grid(row=pf_row,column=2) 141 self.loopable_variables["Height"] = ("height",self.height_tk_var) 142 143 pf_row += 1 144 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) 145 self.prestim_dur_tk_var = Tkinter.DoubleVar() 146 self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) 147 self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=2) 148 149 pf_row += 1 150 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) 151 self.stim_dur_tk_var = Tkinter.DoubleVar() 152 self.stim_dur_tk_var.set(self.meta_params.stim_sec) 153 self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=2) 154 self.loopable_variables["Duration"] = ("stim_sec",self.stim_dur_tk_var) 155 156 pf_row += 1 157 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) 158 self.poststim_dur_tk_var = Tkinter.DoubleVar() 159 self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) 160 self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=2)
161
162 - def get_shortname(self):
163 return "target"
164
165 - def update_tk_vars(self):
166 self.start_x_tk_var.set( self.meta_params.start_x ) 167 self.start_y_tk_var.set( self.meta_params.start_y ) 168 self.velocity_tk_var.set( self.meta_params.velocity_pps ) 169 self.direction_tk_var.set( self.meta_params.direction_deg ) 170 self.orient_tk_var.set( self.meta_params.orientation_deg ) 171 self.width_tk_var.set( self.meta_params.width ) 172 self.height_tk_var.set( self.meta_params.height ) 173 self.prestim_dur_tk_var.set( self.meta_params.pre_stim_sec ) 174 self.stim_dur_tk_var.set( self.meta_params.stim_sec ) 175 self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec ) 176 177 if self.meta_params.color == (0.0,0.0,0.0,1.0) and self.meta_params.bgcolor == (1.0,1.0,1.0,0.0): 178 self.color_tk_var.set( "black on white" ) 179 elif self.meta_params.color == (1.0,1.0,1.0,1.0) and self.meta_params.bgcolor == (0.0,0.0,0.0,0.0): 180 self.color_tk_var.set( "white on black" ) 181 else: 182 raise RuntimeError("Cannot set tk variable for color")
183
184 - def send_values(self,dummy_arg=None):
185 self.meta_params.start_x = self.start_x_tk_var.get() 186 self.meta_params.start_y = self.start_y_tk_var.get() 187 self.meta_params.velocity_pps = self.velocity_tk_var.get() 188 self.meta_params.direction_deg = self.direction_tk_var.get() 189 if self.color_tk_var.get() == "black on white": 190 self.meta_params.color = (0.0,0.0,0.0,1.0) 191 self.meta_params.bgcolor = (1.0,1.0,1.0,0.0) 192 elif self.color_tk_var.get() == "white on black": 193 self.meta_params.color = (1.0,1.0,1.0,1.0) 194 self.meta_params.bgcolor = (0.0,0.0,0.0,0.0) 195 196 if self.ortho_tk_var.get() == "ortho": 197 self.meta_params.orientation_deg = math.fmod(self.meta_params.direction_deg,360.0) 198 else: # it's "manual" 199 self.meta_params.orientation_deg = self.orient_tk_var.get() 200 self.meta_params.width = self.width_tk_var.get() 201 self.meta_params.height = self.height_tk_var.get() 202 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 203 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 204 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 205 if self.connected: 206 self.meta_controller.set_parameters( self.meta_params )
207
208 - def get_duration_sec(self):
209 self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() 210 self.meta_params.stim_sec = self.stim_dur_tk_var.get() 211 self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() 212 return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec
213 214 if __name__=='__main__': 215 frame = TargetControlFrame() 216 frame.pack(expand=Tkinter.YES,fill=Tkinter.BOTH) 217 frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) 218 frame.mainloop() 219

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html0000644000076500000240000005761511224565531031354 0ustar astrawstaff VisionEgg.PyroApps.TargetGUI.TargetControlFrame
Package VisionEgg :: Package PyroApps :: Module TargetGUI :: Class TargetControlFrame
[frames] | no frames]

Class TargetControlFrame

source code

      Tkinter.Misc --+                
                     |                
    Tkinter.BaseWidget --+            
                         |            
          Tkinter.Pack --+            
                         |            
         Tkinter.Place --+            
                         |            
          Tkinter.Grid --+            
                         |            
            Tkinter.Widget --+        
                             |        
                 Tkinter.Frame --+    
                                 |    
EPhysGUIUtils.StimulusControlFrame --+
                                     |
                                    TargetControlFrame

Nested Classes

Inherited from Tkinter.Misc: getdouble, getint

Instance Methods
 
__init__(self, master=None, suppress_go_buttons=0, **kw)
Construct a frame widget with the parent MASTER.
source code
 
get_shortname(self)
Used as basename for saving parameter files and other ID purposes
source code
 
update_tk_vars(self)
Update Tkinter variables with (new) values from meta_params
source code
 
send_values(self, dummy_arg=None)
Update meta_params variables with values from Tkinter fields
source code
 
get_duration_sec(self)
Calculate total duration in go loop
source code

Inherited from EPhysGUIUtils.StimulusControlFrame: connect, get_loopable_variable_names, get_matlab_string, get_parameters_as_m_strings, get_parameters_as_py_strings, get_parameters_dict, go, make_callback_entry, quit_server, set_loopable_variable, set_param_dict, set_parameters_dict, standalone_connect

Inherited from Tkinter.BaseWidget: destroy

Inherited from Tkinter.Misc: __getitem__, __setitem__, __str__, after, after_cancel, after_idle, bbox, bell, bind, bind_all, bind_class, bindtags, cget, clipboard_append, clipboard_clear, clipboard_get, colormodel, columnconfigure, config, configure, deletecommand, event_add, event_delete, event_generate, event_info, focus, focus_displayof, focus_force, focus_get, focus_lastfor, focus_set, getboolean, getvar, grab_current, grab_release, grab_set, grab_set_global, grab_status, grid_bbox, grid_columnconfigure, grid_location, grid_propagate, grid_rowconfigure, grid_size, grid_slaves, image_names, image_types, keys, lift, lower, mainloop, nametowidget, option_add, option_clear, option_get, option_readfile, pack_propagate, pack_slaves, place_slaves, propagate, quit, register, rowconfigure, selection_clear, selection_get, selection_handle, selection_own, selection_own_get, send, setvar, size, slaves, tk_bisque, tk_focusFollowsMouse, tk_focusNext, tk_focusPrev, tk_menuBar, tk_setPalette, tk_strictMotif, tkraise, unbind, unbind_all, unbind_class, update, update_idletasks, wait_variable, wait_visibility, wait_window, waitvar, winfo_atom, winfo_atomname, winfo_cells, winfo_children, winfo_class, winfo_colormapfull, winfo_containing, winfo_depth, winfo_exists, winfo_fpixels, winfo_geometry, winfo_height, winfo_id, winfo_interps, winfo_ismapped, winfo_manager, winfo_name, winfo_parent, winfo_pathname, winfo_pixels, winfo_pointerx, winfo_pointerxy, winfo_pointery, winfo_reqheight, winfo_reqwidth, winfo_rgb, winfo_rootx, winfo_rooty, winfo_screen, winfo_screencells, winfo_screendepth, winfo_screenheight, winfo_screenmmheight, winfo_screenmmwidth, winfo_screenvisual, winfo_screenwidth, winfo_server, winfo_toplevel, winfo_viewable, winfo_visual, winfo_visualid, winfo_visualsavailable, winfo_vrootheight, winfo_vrootwidth, winfo_vrootx, winfo_vrooty, winfo_width, winfo_x, winfo_y

Inherited from Tkinter.Pack: forget, info, pack, pack_configure, pack_forget, pack_info

Inherited from Tkinter.Place: place, place_configure, place_forget, place_info

Inherited from Tkinter.Grid: grid, grid_configure, grid_forget, grid_info, grid_remove, location

Class Variables
  title = "Moving Target Experiment"

Inherited from Tkinter.Misc: _noarg_

Method Details

__init__(self, master=None, suppress_go_buttons=0, **kw)
(Constructor)

source code 
Construct a frame widget with the parent MASTER.

Valid resource names: background, bd, bg, borderwidth, class,
colormap, container, cursor, height, highlightbackground,
highlightcolor, highlightthickness, relief, takefocus, visual, width.

Overrides: EPhysGUIUtils.StimulusControlFrame.__init__

get_shortname(self)

source code 
Used as basename for saving parameter files and other ID purposes

Overrides: EPhysGUIUtils.StimulusControlFrame.get_shortname
(inherited documentation)

update_tk_vars(self)

source code 
Update Tkinter variables with (new) values from meta_params

Overrides: EPhysGUIUtils.StimulusControlFrame.update_tk_vars
(inherited documentation)

send_values(self, dummy_arg=None)

source code 
Update meta_params variables with values from Tkinter fields

Overrides: EPhysGUIUtils.StimulusControlFrame.send_values
(inherited documentation)

get_duration_sec(self)

source code 
Calculate total duration in go loop

Overrides: EPhysGUIUtils.StimulusControlFrame.get_duration_sec
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.TargetGUI.TargetMetaParameters-class.html0000644000076500000240000001224111224565531031655 0ustar astrawstaff VisionEgg.PyroApps.TargetGUI.TargetMetaParameters
Package VisionEgg :: Package PyroApps :: Module TargetGUI :: Class TargetMetaParameters
[frames] | no frames]

Class TargetMetaParameters

source code

Instance Methods
 
__init__(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.TargetServer-module.html0000644000076500000240000002021411224565531026576 0ustar astrawstaff VisionEgg.PyroApps.TargetServer
Package VisionEgg :: Package PyroApps :: Module TargetServer
[frames] | no frames]

Module TargetServer

source code

Handle small targets gratings (server-side)




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  TargetExperimentMetaController
Functions
 
get_meta_controller_class() source code
 
make_stimuli() source code
 
get_meta_controller_stimkey() source code
Variables
  __cvs__ = '$Revision$'.split() [1]
  __date__ = ' '.join('$Date$'.split() [1: 3])
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.TargetServer-pysrc.html0000644000076500000240000031477411224565531026472 0ustar astrawstaff VisionEgg.PyroApps.TargetServer
Package VisionEgg :: Package PyroApps :: Module TargetServer
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.TargetServer

  1  #!/usr/bin/env python 
  2  # 
  3  # The Vision Egg: TargetServer 
  4  # 
  5  # Copyright (C) 2001-2003 Andrew Straw. 
  6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  7  # URL: <http://www.visionegg.org/> 
  8  # 
  9  # Distributed under the terms of the GNU Lesser General Public License 
 10  # (LGPL). See LICENSE.TXT that came with this file. 
 11  # 
 12  # $Id$ 
 13   
 14  """Handle small targets gratings (server-side)""" 
 15   
 16  import VisionEgg 
 17  __version__ = VisionEgg.release_name 
 18  __cvs__ = '$Revision$'.split()[1] 
 19  __date__ = ' '.join('$Date$'.split()[1:3]) 
 20  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 21   
 22  import sys, os, math 
 23  import VisionEgg.Core 
 24  import VisionEgg.FlowControl 
 25  import VisionEgg.MoreStimuli 
 26  import VisionEgg.PyroHelpers 
 27  import Pyro.core 
 28   
 29  from VisionEgg.PyroApps.TargetGUI import TargetMetaParameters 
 30   
31 -class TargetExperimentMetaController( Pyro.core.ObjBase ):
32 - def __init__(self,screen,presentation,stimuli):
33 Pyro.core.ObjBase.__init__(self) 34 35 # get stimulus 36 assert( stimuli[0][0] == '2d_overlay') 37 target = stimuli[0][1] 38 39 self.meta_params = TargetMetaParameters() 40 if not isinstance(screen,VisionEgg.Core.Screen): 41 raise ValueError("Expecting instance of VisionEgg.Core.Screen") 42 if not isinstance(presentation,VisionEgg.FlowControl.Presentation): 43 raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") 44 if not isinstance(target,VisionEgg.MoreStimuli.Target2D): 45 raise ValueError("Expecting instance of VisionEgg.MoreStimuli.Target2D") 46 47 self.screen = screen 48 self.p = presentation 49 self.stim = target 50 51 self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController( 52 during_go_func=self.on_function_during_go, 53 between_go_func=self.on_function_between_go)) 54 55 self.p.add_controller(self.stim,'position',VisionEgg.FlowControl.FunctionController( 56 during_go_func=self.center_during_go, 57 between_go_func=self.center_between_go)) 58 59 self.update() # set stimulus parameters to initial defaults
60
61 - def __del__(self):
62 self.p.remove_controller(self.stim,'on') 63 self.p.remove_controller(self.stim,'position') 64 Pyro.core.ObjBase.__del__(self) # call base class
65
66 - def on_function_during_go(self,t):
67 if t <= self.meta_params.pre_stim_sec: 68 return 0 # not on yet 69 elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): 70 return 1 # on 71 else: 72 return 0 # off again
73
74 - def on_function_between_go(self):
75 return 0
76
77 - def center_during_go(self,t):
78 t_adjusted = t - self.meta_params.pre_stim_sec 79 distance = self.meta_params.velocity_pps * t_adjusted 80 x_offset = math.cos(self.meta_params.direction_deg / 180.0 * math.pi)*distance 81 y_offset = math.sin(self.meta_params.direction_deg / 180.0 * math.pi)*distance 82 83 return (self.meta_params.start_x + x_offset, 84 self.meta_params.start_y + y_offset)
85
86 - def center_between_go(self):
87 return (0.0, 0.0) # doesn't matter -- it's off
88
89 - def get_parameters(self):
90 return self.meta_params
91
92 - def set_parameters(self, new_parameters):
93 if isinstance(new_parameters, TargetMetaParameters): 94 self.meta_params = new_parameters 95 else: 96 raise ValueError("Argument to set_parameters must be instance of TargetMetaParameters") 97 self.update()
98
99 - def update(self):
100 stim_params = self.stim.parameters # shorthand 101 meta_params = self.meta_params # shorthand 102 103 # colors 104 stim_params.color = meta_params.color 105 self.screen.parameters.bgcolor = meta_params.bgcolor 106 107 # size and orientation 108 stim_params.size = (meta_params.width, meta_params.height) 109 stim_params.orientation = meta_params.orientation_deg 110 111 self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds')
112
113 - def go(self):
114 self.p.parameters.enter_go_loop = 1
115
116 - def quit_server(self):
117 self.p.parameters.quit = 1
118 121
122 -def make_stimuli():
123 stimulus = VisionEgg.MoreStimuli.Target2D(anchor='center') 124 return [('2d_overlay',stimulus)]
125
127 return "target_server"
128 129 # Don't do anything unless this script is being run 130 if __name__ == '__main__': 131 132 pyro_server = VisionEgg.PyroHelpers.PyroServer() 133 134 screen = VisionEgg.Core.Screen.create_default() 135 136 # get Vision Egg stimulus ready to go 137 stimuli = make_stimuli() 138 stimulus = stimuli[0][1] 139 viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus]) 140 p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) 141 142 # now hand over control of grating and mask to FlatGratingExperimentMetaController 143 meta_controller = TargetExperimentMetaController(screen,p,stimuli) 144 pyro_server.connect(meta_controller,get_meta_controller_stimkey()) 145 146 # get listener controller and register it 147 p.add_controller(None,None, pyro_server.create_listener_controller()) 148 149 # enter endless loop 150 p.run_forever() 151

././@LongLink0000000000000000000000000000015500000000000011707 Lustar rootwheelvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.htmlvisionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-cl0000644000076500000240000003445611224565531033122 0ustar astrawstaff VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController
Package VisionEgg :: Package PyroApps :: Module TargetServer :: Class TargetExperimentMetaController
[frames] | no frames]

Class TargetExperimentMetaController

source code

Pyro.core.ObjBase --+
                    |
                   TargetExperimentMetaController

Instance Methods
 
__init__(self, screen, presentation, stimuli) source code
 
__del__(self) source code
 
on_function_during_go(self, t) source code
 
on_function_between_go(self) source code
 
center_during_go(self, t) source code
 
center_between_go(self) source code
 
get_parameters(self) source code
 
set_parameters(self, new_parameters) source code
 
update(self) source code
 
go(self) source code
 
quit_server(self) source code

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Method Details

__init__(self, screen, presentation, stimuli)
(Constructor)

source code 
Overrides: Pyro.core.ObjBase.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.VarTypes-module.html0000644000076500000240000001307711224565531025747 0ustar astrawstaff VisionEgg.PyroApps.VarTypes
Package VisionEgg :: Package PyroApps :: Module VarTypes
[frames] | no frames]

Module VarTypes

source code

Functions
 
getID(var_type) source code
 
getType(ID) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroApps.VarTypes-pysrc.html0000644000076500000240000002440511224565531025617 0ustar astrawstaff VisionEgg.PyroApps.VarTypes
Package VisionEgg :: Package PyroApps :: Module VarTypes
[frames] | no frames]

Source Code for Module VisionEgg.PyroApps.VarTypes

 1  # The Vision Egg: VarTypes 
 2  # 
 3  # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd 
 4  # 
 5  # Author: Imran S. Ali, Lachlan Dowd 
 6  # URL: <http://www.visionegg.org/> 
 7  # 
 8  # Distributed under the terms of the GNU Lesser General Public License 
 9  # (LGPL). See LICENSE.TXT that came with this file. 
10  # 
11  # $Id$ 
12   
13  # Add your supported supported demo script "variable types" here:  
14   
15 -def getID(var_type):
16 if var_type == "float": 17 return 1 18 elif var_type == "int" or var_type == "integer": 19 return 2 20 elif var_type == "string" or var_type == "str": 21 return 3 22 else: 23 return -1
24
25 -def getType(ID):
26 if ID == 1: 27 return "float" 28 elif ID == 2: 29 return "integer" 30 elif ID == 3: 31 return "string" 32 else: 33 return "undefined type"
34

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroClient-module.html0000644000076500000240000001347411224565531024507 0ustar astrawstaff VisionEgg.PyroClient
Package VisionEgg :: Module PyroClient
[frames] | no frames]

Module PyroClient

source code


Python Remote Objects support - Client side.




Version: 1.1.dev

Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  PyroClient
Simplifies getting PyroControllers from a remote computer.
Variables
  __cvs__ = '$Revision$'.split() [1]
  __date__ = ' '.join('$Date$'.split() [1: 3])
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroClient-pysrc.html0000644000076500000240000006240311224565531024356 0ustar astrawstaff VisionEgg.PyroClient
Package VisionEgg :: Module PyroClient
[frames] | no frames]

Source Code for Module VisionEgg.PyroClient

 1  # The Vision Egg: PyroClient 
 2  # 
 3  # Copyright (C) 2001-2003 Andrew Straw. 
 4  # Copyright (C) 2008 California Insitute of Technology 
 5  # Author: Andrew Straw <astraw@users.sourceforge.net> 
 6  # URL: <http://www.visionegg.org/> 
 7  # 
 8  # Distributed under the terms of the GNU Lesser General Public License 
 9  # (LGPL). See LICENSE.TXT that came with this file. 
10  # 
11  # $Id$ 
12   
13  """ 
14  Python Remote Objects support - Client side. 
15   
16  """ 
17   
18  import socket 
19  import VisionEgg 
20   
21  import logging                              # available in Python 2.3 
22   
23  __version__ = VisionEgg.release_name 
24  __cvs__ = '$Revision$'.split()[1] 
25  __date__ = ' '.join('$Date$'.split()[1:3]) 
26  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
27   
28  import Pyro.core 
29   
30 -class PyroClient:
31 """Simplifies getting PyroControllers from a remote computer."""
32 - def __init__(self,server_hostname='',server_port=7766):
33 """Initialize Pyro client.""" 34 Pyro.core.initClient() 35 try: 36 self.server_hostname = socket.getfqdn(server_hostname) 37 except Exception, x: 38 logger = logging.getLogger('VisionEgg.PyroClient') 39 logger.warning("while getting fully qualified domain name: %s: %s"% 40 (str(x.__class__),str(x))) 41 self.server_hostname = server_hostname 42 self.server_port = server_port
43
44 - def get(self,name):
45 """Return a remote Pyro object being served by Pyro server.""" 46 URI = "PYROLOC://%s:%d/%s" % (self.server_hostname, self.server_port, name) 47 return Pyro.core.getProxyForURI(URI)
48

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroClient.PyroClient-class.html0000644000076500000240000001407611224565531026415 0ustar astrawstaff VisionEgg.PyroClient.PyroClient
Package VisionEgg :: Module PyroClient :: Class PyroClient
[frames] | no frames]

Class PyroClient

source code

Simplifies getting PyroControllers from a remote computer.



Instance Methods
 
__init__(self, server_hostname='', server_port=7766)
Initialize Pyro client.
source code
 
get(self, name)
Return a remote Pyro object being served by Pyro server.
source code
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers-module.html0000644000076500000240000002201311224565531024660 0ustar astrawstaff VisionEgg.PyroHelpers
Package VisionEgg :: Module PyroHelpers
[frames] | no frames]

Module PyroHelpers

source code


Python Remote Objects support.

Use this class if you don't want to deal with TCP directly and Python
is the program on both ends of the network.

The module provides some Vision Egg specific code for Pyro.  Pyro
allows you to call python objects on remote machines just like they
are on the local machine.  This makes the task of writing a two
computer Vision Egg application quite easy, because one can mostly
ignore the network-based intermediate stage.

PyroControllers are run on the computer performing the presentation.
The PyroServer class also runs on this computer, and allows these
controllers to be changed from a computer running PyroClient. To
listen to the network PyroListenerController must be instantiated by
the PyroServer -- this checks for any requests coming over the
network, but only at times specified because it is a subclass of
VisionEgg.FlowControl.Controller.

Just like TCPControllers, don't use this class for realtime control
unless you think your network is that fast and reliable.  It's great
for setting up parameters in advance and sending a trigger pulse,
though!




Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  PyroServer
Set up a Pyro server for your PyroControllers and PyroGoClass.
  PyroConstantController
  PyroEvalStringController
  PyroExecStringController
  PyroEncapsulatedController
Create the instance of Controller on client, and send it to server.
  PyroLocalDictController
Contain several dictionary entries, set controller accordingly.
  PyroListenController
Handle connection from remote machine, control PyroControllers.
Variables
  __version__ = VisionEgg.release_name
  __cvs__ = '$Revision$'.split() [1]
  __date__ = ' '.join('$Date$'.split() [1: 3])
visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers-pysrc.html0000644000076500000240000047375411224565531024561 0ustar astrawstaff VisionEgg.PyroHelpers
Package VisionEgg :: Module PyroHelpers
[frames] | no frames]

Source Code for Module VisionEgg.PyroHelpers

  1  # The Vision Egg: PyroHelpers 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  5  # URL: <http://www.visionegg.org/> 
  6  # 
  7  # Distributed under the terms of the GNU Lesser General Public License 
  8  # (LGPL). See LICENSE.TXT that came with this file. 
  9  # 
 10  # $Id$ 
 11   
 12  """ 
 13  Python Remote Objects support. 
 14   
 15  Use this class if you don't want to deal with TCP directly and Python 
 16  is the program on both ends of the network. 
 17   
 18  The module provides some Vision Egg specific code for Pyro.  Pyro 
 19  allows you to call python objects on remote machines just like they 
 20  are on the local machine.  This makes the task of writing a two 
 21  computer Vision Egg application quite easy, because one can mostly 
 22  ignore the network-based intermediate stage. 
 23   
 24  PyroControllers are run on the computer performing the presentation. 
 25  The PyroServer class also runs on this computer, and allows these 
 26  controllers to be changed from a computer running PyroClient. To 
 27  listen to the network PyroListenerController must be instantiated by 
 28  the PyroServer -- this checks for any requests coming over the 
 29  network, but only at times specified because it is a subclass of 
 30  VisionEgg.FlowControl.Controller. 
 31   
 32  Just like TCPControllers, don't use this class for realtime control 
 33  unless you think your network is that fast and reliable.  It's great 
 34  for setting up parameters in advance and sending a trigger pulse, 
 35  though!""" 
 36   
 37  import VisionEgg 
 38  import VisionEgg.Core 
 39  import VisionEgg.FlowControl 
 40  import VisionEgg.ParameterTypes as ve_types 
 41   
 42  __version__ = VisionEgg.release_name 
 43  __cvs__ = '$Revision$'.split()[1] 
 44  __date__ = ' '.join('$Date$'.split()[1:3]) 
 45  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 46   
 47  import Pyro.core 
 48  import Pyro.errors 
 49   
 50  Pyro.config.PYRO_MULTITHREADED = 0 # No multithreading! 
 51   
52 -class PyroServer:
53 """Set up a Pyro server for your PyroControllers and PyroGoClass. 54 55 This class is analagous to VisionEgg.TCPController.TCPServer. 56 57 """
58 - def __init__(self):
59 # Start Pyro 60 Pyro.core.initServer() 61 self.daemon = Pyro.core.Daemon() 62 self.ok_to_run = 1
63
64 - def get_hostname_and_port(self):
65 return self.daemon.hostname, self.daemon.port
66
67 - def connect(self,object,name):
68 """Serve an object under a name""" 69 URI=self.daemon.connect(object,name) 70 return URI
71
72 - def disconnect(self,object):
73 if Pyro.core.constants.VERSION >= '3.2': 74 self.daemon.disconnect(object) 75 else: 76 # workaround bug in Pyro pre-3.2 77 del self.daemon.implementations[object.GUID()] 78 object.setDaemon(None)
79
81 if hasattr(self,'listen_controller'): 82 raise RuntimeError("Only one pyro listen controller allowed per server!") 83 self.listen_controller = PyroListenController(self) 84 return self.listen_controller
85
86 - def handleRequests(self, timeout=0):
87 """Only use this if you don't use the PyroListenerController. 88 89 A timeout of 0 specifies return immediately.""" 90 self.daemon.handleRequests(timeout)
91
92 -class PyroConstantController(VisionEgg.FlowControl.ConstantController,Pyro.core.ObjBase):
93 - def __init__(self, **kw):
94 VisionEgg.FlowControl.ConstantController.__init__(self,**kw) 95 Pyro.core.ObjBase.__init__(self)
96
97 -class PyroEvalStringController(VisionEgg.FlowControl.EvalStringController,Pyro.core.ObjBase):
98 - def __init__(self, **kw):
99 VisionEgg.FlowControl.EvalStringController.__init__(self,**kw) 100 Pyro.core.ObjBase.__init__(self)
101
102 -class PyroExecStringController(VisionEgg.FlowControl.ExecStringController,Pyro.core.ObjBase):
103 - def __init__(self, **kw):
104 VisionEgg.FlowControl.ExecStringController.__init__(self,**kw) 105 Pyro.core.ObjBase.__init__(self)
106
107 -class PyroEncapsulatedController(VisionEgg.FlowControl.EncapsulatedController,Pyro.core.ObjBase):
108 """Create the instance of Controller on client, and send it to server. 109 110 This class is analagous to VisionEgg.TCPController.TCPController. 111 """
112 - def __init__(self,initial_controller=None,**kw):
113 VisionEgg.FlowControl.EncapsulatedController.__init__(self,initial_controller) 114 Pyro.core.ObjBase.__init__(self)
115
116 -class PyroLocalDictController(VisionEgg.FlowControl.EncapsulatedController,Pyro.core.ObjBase):
117 """Contain several dictionary entries, set controller accordingly. 118 """
119 - def __init__(self, dict=None, key=None, **kw):
120 if dict is None: 121 self.dict = {} 122 initial_controller = VisionEgg.FlowControl.ConstantController(during_go_value=0, 123 between_go_value=0, 124 eval_frequency=VisionEgg.FlowControl.Controller.NEVER) 125 else: 126 self.dict = dict 127 if key is None: 128 if len(self.dict.keys()): 129 key = self.dict.keys()[0] 130 initial_controller = self.dict[key] 131 else: 132 initial_controller = VisionEgg.FlowControl.ConstantController(during_go_value=0, 133 between_go_value=0, 134 eval_frequency=VisionEgg.FlowControl.Controller.NEVER) 135 else: 136 initial_controller = dict[key] 137 VisionEgg.FlowControl.EncapsulatedController.__init__(self,initial_controller) 138 Pyro.core.ObjBase.__init__(self)
139 - def use_controller(self,key):
140 self.set_new_controller(self.dict[key])
141 - def add_controller(self,key,new_controller):
142 self.dict[key] = new_controller
143
144 -class PyroListenController(VisionEgg.FlowControl.Controller):
145 """Handle connection from remote machine, control PyroControllers. 146 147 This meta controller handles a Pyro daemon, which checks the TCP 148 socket for new input and acts accordingly. 149 150 This class is analagous to VisionEgg.TCPController.SocketListenController. 151 152 """ 153
154 - def __init__(self,server=None,**kw):
155 """Called by PyroServer. Creates a PyroListenerController instance.""" 156 if not isinstance(server,PyroServer): 157 raise ValueError("Must specify a Pyro Server.") 158 if 'eval_frequency' not in kw.keys(): 159 kw['eval_frequency'] = VisionEgg.FlowControl.Controller.EVERY_FRAME 160 if 'return_type' not in kw.keys(): 161 kw['return_type'] = ve_types.get_type(None) 162 VisionEgg.FlowControl.Controller.__init__(self,**kw) 163 self.server=server
164
165 - def during_go_eval(self):
166 # setting timeout = 0 means return ASAP 167 self.server.daemon.handleRequests(timeout=0)
168
169 - def between_go_eval(self):
170 # setting timeout = 0 means return ASAP 171 self.server.daemon.handleRequests(timeout=0)
172

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers.PyroConstantController-class.html0000644000076500000240000002747711224565531031231 0ustar astrawstaff VisionEgg.PyroHelpers.PyroConstantController
Package VisionEgg :: Module PyroHelpers :: Class PyroConstantController
[frames] | no frames]

Class PyroConstantController

source code

                object --+        
                         |        
    FlowControl.Controller --+    
                             |    
FlowControl.ConstantController --+
                                 |
             Pyro.core.ObjBase --+
                                 |
                                PyroConstantController

Instance Methods
 
__init__(self, **kw)
Create instance of Controller.
source code

Inherited from FlowControl.ConstantController: between_go_eval, during_go_eval, get_between_go_value, get_during_go_value, set_between_go_value, set_during_go_value

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.ConstantController.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers.PyroEncapsulatedController-class.html0000644000076500000240000002765411224565531032045 0ustar astrawstaff VisionEgg.PyroHelpers.PyroEncapsulatedController
Package VisionEgg :: Module PyroHelpers :: Class PyroEncapsulatedController
[frames] | no frames]

Class PyroEncapsulatedController

source code

                    object --+        
                             |        
        FlowControl.Controller --+    
                                 |    
FlowControl.EncapsulatedController --+
                                     |
                 Pyro.core.ObjBase --+
                                     |
                                    PyroEncapsulatedController

Create the instance of Controller on client, and send it to server.

This class is analagous to VisionEgg.TCPController.TCPController.



Instance Methods
 
__init__(self, initial_controller=None, **kw)
Create instance of Controller.
source code

Inherited from FlowControl.EncapsulatedController: between_go_eval, during_go_eval, set_new_controller

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, initial_controller=None, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.EncapsulatedController.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers.PyroEvalStringController-class.html0000644000076500000240000002765111224565531031510 0ustar astrawstaff VisionEgg.PyroHelpers.PyroEvalStringController
Package VisionEgg :: Module PyroHelpers :: Class PyroEvalStringController
[frames] | no frames]

Class PyroEvalStringController

source code

                  object --+        
                           |        
      FlowControl.Controller --+    
                               |    
FlowControl.EvalStringController --+
                                   |
               Pyro.core.ObjBase --+
                                   |
                                  PyroEvalStringController

Instance Methods
 
__init__(self, **kw)
Create instance of Controller.
source code

Inherited from FlowControl.EvalStringController: between_go_eval, during_go_eval, get_between_go_eval_string, get_during_go_eval_string, set_between_go_eval_string, set_during_go_eval_string

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.EvalStringController.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers.PyroExecStringController-class.html0000644000076500000240000002765111224565531031505 0ustar astrawstaff VisionEgg.PyroHelpers.PyroExecStringController
Package VisionEgg :: Module PyroHelpers :: Class PyroExecStringController
[frames] | no frames]

Class PyroExecStringController

source code

                  object --+        
                           |        
      FlowControl.Controller --+    
                               |    
FlowControl.ExecStringController --+
                                   |
               Pyro.core.ObjBase --+
                                   |
                                  PyroExecStringController

Instance Methods
 
__init__(self, **kw)
Create instance of Controller.
source code

Inherited from FlowControl.ExecStringController: between_go_eval, during_go_eval, get_between_go_exec_string, get_during_go_exec_string, set_between_go_exec_string, set_during_go_exec_string

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.ExecStringController.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers.PyroListenController-class.html0000644000076500000240000003355011224565531030663 0ustar astrawstaff VisionEgg.PyroHelpers.PyroListenController
Package VisionEgg :: Module PyroHelpers :: Class PyroListenController
[frames] | no frames]

Class PyroListenController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        PyroListenController

Handle connection from remote machine, control PyroControllers.

This meta controller handles a Pyro daemon, which checks the TCP
socket for new input and acts accordingly.

This class is analagous to VisionEgg.TCPController.SocketListenController.



Instance Methods
 
__init__(self, server=None, **kw)
Called by PyroServer.
source code
 
during_go_eval(self)
Called by Presentation.
source code
 
between_go_eval(self)
Called by Presentation.
source code

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, server=None, **kw)
(Constructor)

source code 
Called by PyroServer. Creates a PyroListenerController instance.

Overrides: FlowControl.Controller.__init__

during_go_eval(self)

source code 
Called by Presentation. Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.during_go_eval
(inherited documentation)

between_go_eval(self)

source code 
Called by Presentation. Evaluate between runs of the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.between_go_eval
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers.PyroLocalDictController-class.html0000644000076500000240000003271411224565531031264 0ustar astrawstaff VisionEgg.PyroHelpers.PyroLocalDictController
Package VisionEgg :: Module PyroHelpers :: Class PyroLocalDictController
[frames] | no frames]

Class PyroLocalDictController

source code

                    object --+        
                             |        
        FlowControl.Controller --+    
                                 |    
FlowControl.EncapsulatedController --+
                                     |
                 Pyro.core.ObjBase --+
                                     |
                                    PyroLocalDictController

Contain several dictionary entries, set controller accordingly.
    



Instance Methods
 
__init__(self, dict=None, key=None, **kw)
Create instance of Controller.
source code
 
use_controller(self, key) source code
 
add_controller(self, key, new_controller) source code

Inherited from FlowControl.EncapsulatedController: between_go_eval, during_go_eval, set_new_controller

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Inherited from Pyro.core.ObjBase: GUID, Pyro_dyncall, delegateTo, getAttrProxy, getDaemon, getLocalStorage, getProxy, remote_retrieve_code, remote_supply_code, setCodeValidator, setGUID, setPyroDaemon

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, dict=None, key=None, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.EncapsulatedController.__init__

visionegg-1.2.1/doc/reference/html/VisionEgg.PyroHelpers.PyroServer-class.html0000644000076500000240000002400711224565531026624 0ustar astrawstaff VisionEgg.PyroHelpers.PyroServer
Package VisionEgg :: Module PyroHelpers :: Class PyroServer
[frames] | no frames]

Class PyroServer

source code

Set up a Pyro server for your PyroControllers and PyroGoClass.

This class is analagous to VisionEgg.TCPController.TCPServer.



Instance Methods
 
__init__(self) source code
 
get_hostname_and_port(self) source code
 
connect(self, object, name)
Serve an object under a name
source code
 
disconnect(self, object) source code
 
create_listener_controller(self) source code
 
handleRequests(self, timeout=0)
Only use this if you don't use the PyroListenerController.
source code
Method Details

handleRequests(self, timeout=0)

source code 
Only use this if you don't use the PyroListenerController.

A timeout of 0 specifies return immediately.


visionegg-1.2.1/doc/reference/html/VisionEgg.qtlowlevel-module.html0000644000076500000240000012363311224565531024614 0ustar astrawstaff VisionEgg.qtlowlevel
Package VisionEgg :: Module qtlowlevel
[frames] | no frames]

Module qtlowlevel

source code

Classes
  Rect
  QTNewMoviePropertyElement
  qtlowlevelError
Functions
 
FOUR_CHAR_CODE(code) source code
 
GetErrorString(value) source code
 
CheckOSStatus(value) source code
Variables
  QTMLClient = ctypes.CDLL(r'C:\Program Files\QuickTime\QTSystem...
  OSErr = ctypes.c_short
  OSStatus = ctypes.c_int
  ItemCount = ctypes.c_uint
  FourCharCode = ctypes.c_int
  OSType = ctypes.c_int
  QTPropertyClass = ctypes.c_int
  QTPropertyID = ctypes.c_int
  ByteCount = ctypes.c_uint
  QTPropertyValuePtr = ctypes.c_void_p
  QTVisualContextRef = ctypes.c_void_p
  Movie = ctypes.c_void_p
  kQTPropertyClass_DataLocation = FOUR_CHAR_CODE('dloc')
  kQTDataLocationPropertyID_DataReference = FOUR_CHAR_CODE('dref')
  kQTDataLocationPropertyID_CFStringNativePath = FOUR_CHAR_CODE(...
  kQTDataLocationPropertyID_CFStringPosixPath = FOUR_CHAR_CODE('...
  kQTDataLocationPropertyID_CFStringHFSPath = FOUR_CHAR_CODE('cf...
  kQTDataLocationPropertyID_CFStringWindowsPath = FOUR_CHAR_CODE...
  kQTDataLocationPropertyID_CFURL = FOUR_CHAR_CODE('cfur')
  kQTDataLocationPropertyID_QTDataHandler = FOUR_CHAR_CODE('qtdh')
  kQTDataLocationPropertyID_Scrap = FOUR_CHAR_CODE('scrp')
  kQTDataLocationPropertyID_LegacyMovieResourceHandle = FOUR_CHA...
  kQTDataLocationPropertyID_MovieUserProc = FOUR_CHAR_CODE('uspr')
  kQTDataLocationPropertyID_ResourceFork = FOUR_CHAR_CODE('rfrk')
  kQTDataLocationPropertyID_DataFork = FOUR_CHAR_CODE('dfrk')
  kQTPropertyClass_Context = FOUR_CHAR_CODE('ctxt')
  kQTContextPropertyID_AudioContext = FOUR_CHAR_CODE('audi')
  kQTContextPropertyID_VisualContext = FOUR_CHAR_CODE('visu')
  kQTPropertyClass_MovieResourceLocator = FOUR_CHAR_CODE('rloc')
  kQTMovieResourceLocatorPropertyID_LegacyResID = FOUR_CHAR_CODE...
  kQTMovieResourceLocatorPropertyID_LegacyResName = FOUR_CHAR_CO...
  kQTMovieResourceLocatorPropertyID_FileOffset = FOUR_CHAR_CODE(...
  kQTMovieResourceLocatorPropertyID_Callback = FOUR_CHAR_CODE('c...
  kQTPropertyClass_MovieInstantiation = FOUR_CHAR_CODE('mins')
  kQTMovieInstantiationPropertyID_DontResolveDataRefs = FOUR_CHA...
  kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs = FO...
  kQTMovieInstantiationPropertyID_DontAutoAlternates = FOUR_CHAR...
  kQTMovieInstantiationPropertyID_DontUpdateForeBackPointers = F...
  kQTMovieInstantiationPropertyID_AsyncOK = FOUR_CHAR_CODE('asok')
  kQTMovieInstantiationPropertyID_IdleImportOK = FOUR_CHAR_CODE(...
  kQTMovieInstantiationPropertyID_DontAutoUpdateClock = FOUR_CHA...
  kQTMovieInstantiationPropertyID_ResultDataLocationChanged = FO...
  kQTPropertyClass_NewMovieProperty = FOUR_CHAR_CODE('mprp')
  kQTNewMoviePropertyID_DefaultDataRef = FOUR_CHAR_CODE('ddrf')
  kQTNewMoviePropertyID_Active = FOUR_CHAR_CODE('actv')
  kQTNewMoviePropertyID_DontInteractWithUser = FOUR_CHAR_CODE('i...
  noErr = 0
  paramErr = -50
  movieToolboxUninitialized = -2020
  NewMovieFromFile = QTMLClient.NewMovieFromFile
  NewMovieFromProperties = QTMLClient.NewMovieFromProperties
  InitializeQTML = QTMLClient.InitializeQTML
  EnterMovies = QTMLClient.EnterMovies
  QTGetCFConstant = QTMLClient.QTGetCFConstant
  GetMovieBox = QTMLClient.GetMovieBox
  SetMovieBox = QTMLClient.SetMovieBox
  StartMovie = QTMLClient.StartMovie
  MoviesTask = QTMLClient.MoviesTask
  IsMovieDone = QTMLClient.IsMovieDone
  GoToBeginningOfMovie = QTMLClient.GoToBeginningOfMovie
  FSSpec = ctypes.c_void_p
  CFStringRef = ctypes.c_void_p
  CFStringEncoding = ctypes.c_uint
  CFAllocatorRef = ctypes.c_void_p
  CFIndex = ctypes.c_int
  CFStringCreateWithCharacters = QTMLClient.CFStringCreateWithCh...
  CFStringCreateWithCString = QTMLClient.CFStringCreateWithCString
  CFStringGetCString = QTMLClient.CFStringGetCString
  CFStringGetCStringPtr = QTMLClient.CFStringGetCStringPtr
  NativePathNameToFSSpec = QTMLClient.NativePathNameToFSSpec
  OpenMovieFile = QTMLClient.OpenMovieFile
  kCFAllocatorDefault = 0
  kCFStringEncodingMacRoman = 0
Variables Details

QTMLClient

Value:
ctypes.CDLL(r'C:\Program Files\QuickTime\QTSystem\QTMLClient.dll')

kQTDataLocationPropertyID_CFStringNativePath

Value:
FOUR_CHAR_CODE('cfnp')

kQTDataLocationPropertyID_CFStringPosixPath

Value:
FOUR_CHAR_CODE('cfpp')

kQTDataLocationPropertyID_CFStringHFSPath

Value:
FOUR_CHAR_CODE('cfhp')

kQTDataLocationPropertyID_CFStringWindowsPath

Value:
FOUR_CHAR_CODE('cfwp')

kQTDataLocationPropertyID_LegacyMovieResourceHandle

Value:
FOUR_CHAR_CODE('rezh')

kQTMovieResourceLocatorPropertyID_LegacyResID

Value:
FOUR_CHAR_CODE('rezi')

kQTMovieResourceLocatorPropertyID_LegacyResName

Value:
FOUR_CHAR_CODE('rezn')

kQTMovieResourceLocatorPropertyID_FileOffset

Value:
FOUR_CHAR_CODE('foff')

kQTMovieResourceLocatorPropertyID_Callback

Value:
FOUR_CHAR_CODE('calb')

kQTMovieInstantiationPropertyID_DontResolveDataRefs

Value:
FOUR_CHAR_CODE('rdrn')

kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs

Value:
FOUR_CHAR_CODE('aurn')

kQTMovieInstantiationPropertyID_DontAutoAlternates

Value:
FOUR_CHAR_CODE('aaln')

kQTMovieInstantiationPropertyID_DontUpdateForeBackPointers

Value:
FOUR_CHAR_CODE('fbpn')

kQTMovieInstantiationPropertyID_IdleImportOK

Value:
FOUR_CHAR_CODE('imok')

kQTMovieInstantiationPropertyID_DontAutoUpdateClock

Value:
FOUR_CHAR_CODE('aucl')

kQTMovieInstantiationPropertyID_ResultDataLocationChanged

Value:
FOUR_CHAR_CODE('dlch')

kQTNewMoviePropertyID_DontInteractWithUser

Value:
FOUR_CHAR_CODE('intn')

CFStringCreateWithCharacters

Value:
QTMLClient.CFStringCreateWithCharacters

visionegg-1.2.1/doc/reference/html/VisionEgg.qtlowlevel-pysrc.html0000644000076500000240000026702611224565531024474 0ustar astrawstaff VisionEgg.qtlowlevel
Package VisionEgg :: Module qtlowlevel
[frames] | no frames]

Source Code for Module VisionEgg.qtlowlevel

  1  import os, sys 
  2  import ctypes 
  3   
  4  if os.name=='nt': 
  5      QTMLClient = ctypes.CDLL(r'C:\Program Files\QuickTime\QTSystem\QTMLClient.dll') 
  6  elif sys.platform.startswith('darwin'): 
  7      # There was once a functional Mac QuickTime implementation, but it 
  8      # used a combination of the Python stdlib's quicktime module and 
  9      # some C extensions based on the Carbon QuickTime interface. Given 
 10      # the inevitable long-term ultimate demise of Carbon, it would be 
 11      # foolish to spend much time on the Carbon implementation. On the 
 12      # other hand, the newer implementation will require someone who 
 13      # knows or learns the new QTKit bindings, which come included with PyObjC. 
 14      raise NotImplementedError('QuickTime support is not implemented for Mac OS X.') 
 15   
 16  # OSErr SInt16 MacTypes.h 
 17  # OSStatus SInt32 MacTypes.h 
 18  # ItemCount UInt32 MacTypes.h 
 19  # FourCharCode SInt32 MacTypes.h 
 20  # OSType FourCharCode MacTypes.h 
 21  # QTNewMoviePropertyElement struct Movies.h 
 22  # QTPropertyClass OSType Movies.h 
 23  # QTPropertyID OSType Movies.h 
 24  # ByteCount UInt32 MacTypes.h 
 25  # QTPropertyValuePtr void* Movies.h 
 26  # Movie 
 27   
 28  OSErr = ctypes.c_short 
 29  OSStatus = ctypes.c_int 
 30  ItemCount = ctypes.c_uint 
 31  FourCharCode = ctypes.c_int 
 32  OSType = FourCharCode 
 33  QTPropertyClass = OSType 
 34  QTPropertyID = OSType 
 35  ByteCount = ctypes.c_uint 
 36  QTPropertyValuePtr = ctypes.c_void_p 
 37  QTVisualContextRef = ctypes.c_void_p 
38 -class Rect(ctypes.Structure):
39 _fields_ = [("top", ctypes.c_short), 40 ("left", ctypes.c_short), 41 ("bottom",ctypes.c_short), 42 ("right", ctypes.c_short)]
43 44 Movie = ctypes.c_void_p # not done 45
46 -class QTNewMoviePropertyElement(ctypes.Structure):
47 _fields_ = [("propClass",QTPropertyClass), 48 ("propID",QTPropertyID), 49 ("propValueSize",ByteCount), 50 ("propValueAddress",QTPropertyValuePtr), 51 ("propStatus",OSStatus)]
52
53 -def FOUR_CHAR_CODE(code):
54 assert isinstance(code,str) 55 assert len(code)==4 56 val = 0 57 for i in range(4): 58 c = code[i] 59 ordc = ord(c) 60 addval = ordc << (3-i)*8 61 #print '%d: %s %x %x'%(i,c,ordc,addval) 62 val += addval 63 #print '%x\n'%val 64 return val
65 66 if 1: 67 kQTPropertyClass_DataLocation = FOUR_CHAR_CODE('dloc') 68 kQTDataLocationPropertyID_DataReference = FOUR_CHAR_CODE('dref') # DataReferenceRecord (for semantics of NewMovieFromDataRef) 69 kQTDataLocationPropertyID_CFStringNativePath = FOUR_CHAR_CODE('cfnp') 70 kQTDataLocationPropertyID_CFStringPosixPath = FOUR_CHAR_CODE('cfpp') 71 kQTDataLocationPropertyID_CFStringHFSPath = FOUR_CHAR_CODE('cfhp') 72 kQTDataLocationPropertyID_CFStringWindowsPath = FOUR_CHAR_CODE('cfwp') 73 kQTDataLocationPropertyID_CFURL = FOUR_CHAR_CODE('cfur') 74 kQTDataLocationPropertyID_QTDataHandler = FOUR_CHAR_CODE('qtdh') # for semantics of NewMovieFromStorageOffset 75 kQTDataLocationPropertyID_Scrap = FOUR_CHAR_CODE('scrp') 76 kQTDataLocationPropertyID_LegacyMovieResourceHandle = FOUR_CHAR_CODE('rezh') # QTNewMovieUserProcInfo * (for semantics of NewMovieFromHandle) 77 kQTDataLocationPropertyID_MovieUserProc = FOUR_CHAR_CODE('uspr') # for semantics of NewMovieFromUserProc 78 kQTDataLocationPropertyID_ResourceFork = FOUR_CHAR_CODE('rfrk') # for semantics of NewMovieFromFile 79 kQTDataLocationPropertyID_DataFork = FOUR_CHAR_CODE('dfrk') # for semantics of NewMovieFromDataFork64 80 kQTPropertyClass_Context = FOUR_CHAR_CODE('ctxt') # Media Contexts 81 kQTContextPropertyID_AudioContext = FOUR_CHAR_CODE('audi') 82 kQTContextPropertyID_VisualContext = FOUR_CHAR_CODE('visu') 83 kQTPropertyClass_MovieResourceLocator = FOUR_CHAR_CODE('rloc') 84 kQTMovieResourceLocatorPropertyID_LegacyResID = FOUR_CHAR_CODE('rezi') # (input/result property) 85 kQTMovieResourceLocatorPropertyID_LegacyResName = FOUR_CHAR_CODE('rezn') # (result property) 86 kQTMovieResourceLocatorPropertyID_FileOffset = FOUR_CHAR_CODE('foff') # NewMovieFromDataFork[64] 87 kQTMovieResourceLocatorPropertyID_Callback = FOUR_CHAR_CODE('calb') # NewMovieFromUserProc(getProcrefcon) 88 # Uses kQTMovieDefaultDataRefPropertyID for default dataref 89 kQTPropertyClass_MovieInstantiation = FOUR_CHAR_CODE('mins') 90 kQTMovieInstantiationPropertyID_DontResolveDataRefs = FOUR_CHAR_CODE('rdrn') 91 kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs = FOUR_CHAR_CODE('aurn') 92 kQTMovieInstantiationPropertyID_DontAutoAlternates = FOUR_CHAR_CODE('aaln') 93 kQTMovieInstantiationPropertyID_DontUpdateForeBackPointers = FOUR_CHAR_CODE('fbpn') 94 kQTMovieInstantiationPropertyID_AsyncOK = FOUR_CHAR_CODE('asok') 95 kQTMovieInstantiationPropertyID_IdleImportOK = FOUR_CHAR_CODE('imok') 96 kQTMovieInstantiationPropertyID_DontAutoUpdateClock = FOUR_CHAR_CODE('aucl') 97 kQTMovieInstantiationPropertyID_ResultDataLocationChanged = FOUR_CHAR_CODE('dlch') # (result property) 98 kQTPropertyClass_NewMovieProperty = FOUR_CHAR_CODE('mprp') 99 kQTNewMoviePropertyID_DefaultDataRef = FOUR_CHAR_CODE('ddrf') # DataReferenceRecord 100 kQTNewMoviePropertyID_Active = FOUR_CHAR_CODE('actv') 101 kQTNewMoviePropertyID_DontInteractWithUser = FOUR_CHAR_CODE('intn') 102
103 -class qtlowlevelError(RuntimeError):
104 pass
105 106 noErr = 0 107 paramErr = -50 108 movieToolboxUninitialized = -2020
109 -def GetErrorString(value):
110 if value == paramErr: 111 return 'paramErr' 112 elif value == movieToolboxUninitialized: 113 return 'movieToolboxUninitialized' 114 elif value != noErr: 115 return 'error value: %d'%value 116 else: 117 return 'noErr'
118
119 -def CheckOSStatus(value):
120 if value != noErr: 121 raise qtlowlevelError(GetErrorString(value)) 122 return value
123 124 NewMovieFromFile = QTMLClient.NewMovieFromFile 125 126 NewMovieFromProperties = QTMLClient.NewMovieFromProperties 127 #NewMovieFromProperties.restype = OSStatus 128 NewMovieFromProperties.restype = CheckOSStatus 129 NewMovieFromProperties.argtypes = [ItemCount, 130 ctypes.POINTER(QTNewMoviePropertyElement), 131 ItemCount, 132 ctypes.POINTER(QTNewMoviePropertyElement), 133 ctypes.POINTER(Movie)] 134 135 InitializeQTML = QTMLClient.InitializeQTML 136 EnterMovies = QTMLClient.EnterMovies 137 138 QTGetCFConstant = QTMLClient.QTGetCFConstant 139 140 GetMovieBox = QTMLClient.GetMovieBox 141 GetMovieBox.argtypes = [Movie, 142 ctypes.POINTER(Rect)] 143 SetMovieBox = QTMLClient.SetMovieBox 144 SetMovieBox.argtypes = [Movie, 145 ctypes.POINTER(Rect)] 146 147 StartMovie = QTMLClient.StartMovie 148 StartMovie.argtypes = [Movie] 149 150 MoviesTask = QTMLClient.MoviesTask 151 MoviesTask.argtypes = [Movie,ctypes.c_long] 152 153 IsMovieDone = QTMLClient.IsMovieDone 154 IsMovieDone.argtypes = [Movie] 155 156 GoToBeginningOfMovie = QTMLClient.GoToBeginningOfMovie 157 GoToBeginningOfMovie.argtypes = [Movie] 158 159 FSSpec = ctypes.c_void_p 160 CFStringRef = ctypes.c_void_p 161 CFStringEncoding = ctypes.c_uint 162 CFAllocatorRef = ctypes.c_void_p 163 CFIndex = ctypes.c_int 164 if 1: 165 CFStringCreateWithCharacters = QTMLClient.CFStringCreateWithCharacters 166 CFStringCreateWithCharacters.restype = CFStringRef 167 CFStringCreateWithCharacters.argtypes = [CFAllocatorRef, 168 ctypes.c_wchar_p, 169 CFIndex] 170 171 CFStringCreateWithCString = QTMLClient.CFStringCreateWithCString 172 CFStringCreateWithCString.restype = CFStringRef 173 CFStringCreateWithCString.argtypes = [CFAllocatorRef, 174 ctypes.c_char_p, 175 CFStringEncoding] 176 177 CFStringGetCString = QTMLClient.CFStringGetCString 178 CFStringGetCStringPtr = QTMLClient.CFStringGetCStringPtr 179 CFStringGetCStringPtr.restype = ctypes.c_char_p 180 181 NativePathNameToFSSpec = QTMLClient.NativePathNameToFSSpec 182 NativePathNameToFSSpec.restype = OSErr 183 NativePathNameToFSSpec.argtypes = [ctypes.c_char_p, 184 ctypes.POINTER(FSSpec), 185 ctypes.c_long] 186 187 OpenMovieFile = QTMLClient.OpenMovieFile 188 189 if 1: 190 kCFAllocatorDefault = 0 191 kCFStringEncodingMacRoman = 0 # CoreFoundation/CFString.h 192

visionegg-1.2.1/doc/reference/html/VisionEgg.qtlowlevel.qtlowlevelError-class.html0000644000076500000240000001454311224565531027642 0ustar astrawstaff VisionEgg.qtlowlevel.qtlowlevelError
Package VisionEgg :: Module qtlowlevel :: Class qtlowlevelError
[frames] | no frames]

Class qtlowlevelError

source code

              object --+                
                       |                
exceptions.BaseException --+            
                           |            
        exceptions.Exception --+        
                               |        
        exceptions.StandardError --+    
                                   |    
             exceptions.RuntimeError --+
                                       |
                                      qtlowlevelError

Instance Methods

Inherited from exceptions.RuntimeError: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__

Inherited from object: __hash__, __reduce_ex__

Properties

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.qtlowlevel.QTNewMoviePropertyElement-class.html0000644000076500000240000001445211224565531031506 0ustar astrawstaff VisionEgg.qtlowlevel.QTNewMoviePropertyElement
Package VisionEgg :: Module qtlowlevel :: Class QTNewMoviePropertyElement
[frames] | no frames]

Class QTNewMoviePropertyElement

source code

ctypes.Structure --+
                   |
                  QTNewMoviePropertyElement

Class Variables
  _fields_ = [("propClass", QTPropertyClass), ("propID", QTPrope...
Class Variable Details

_fields_

Value:
[("propClass", QTPropertyClass), ("propID", QTPropertyID), ("propValue\
Size", ByteCount), ("propValueAddress", QTPropertyValuePtr), ("propSta\
tus", OSStatus)]

visionegg-1.2.1/doc/reference/html/VisionEgg.qtlowlevel.Rect-class.html0000644000076500000240000001372611224565531025331 0ustar astrawstaff VisionEgg.qtlowlevel.Rect
Package VisionEgg :: Module qtlowlevel :: Class Rect
[frames] | no frames]

Class Rect

source code

ctypes.Structure --+
                   |
                  Rect

Class Variables
  _fields_ = [("top", ctypes.c_short), ("left", ctypes.c_short),...
Class Variable Details

_fields_

Value:
[("top", ctypes.c_short), ("left", ctypes.c_short), ("bottom", ctypes.\
c_short), ("right", ctypes.c_short)]

visionegg-1.2.1/doc/reference/html/VisionEgg.qtmovie-module.html0000644000076500000240000001374011224565531024077 0ustar astrawstaff VisionEgg.qtmovie
Package VisionEgg :: Module qtmovie
[frames] | no frames]

Module qtmovie

source code

high level QuickTime Movie wrapper



Classes
  Rect
  Movie
An encapsulated QuickTime Movie
Functions
 
new_movie_from_filename(filename, MAX_PATH=255)
create a Movie from filename
source code
visionegg-1.2.1/doc/reference/html/VisionEgg.qtmovie-pysrc.html0000644000076500000240000013540211224565531023752 0ustar astrawstaff VisionEgg.qtmovie
Package VisionEgg :: Module qtmovie
[frames] | no frames]

Source Code for Module VisionEgg.qtmovie

 1  """high level QuickTime Movie wrapper""" 
 2  import qtlowlevel 
 3  import ctypes 
 4   
 5  qtlowlevel.InitializeQTML(0) 
 6  qtlowlevel.EnterMovies() 
 7   
8 -def new_movie_from_filename(filename, MAX_PATH=255):
9 """create a Movie from filename""" 10 movieProps = (qtlowlevel.QTNewMoviePropertyElement * 5)() 11 filename = unicode(filename) 12 13 movieFilePathRef = qtlowlevel.CFStringRef() 14 movieFilePathRef.value = qtlowlevel.CFStringCreateWithCharacters(qtlowlevel.kCFAllocatorDefault, 15 filename, 16 len(filename)) 17 18 moviePropCount = 0 19 20 movieProps[moviePropCount].propClass = qtlowlevel.kQTPropertyClass_DataLocation 21 movieProps[moviePropCount].propID = qtlowlevel.kQTDataLocationPropertyID_CFStringWindowsPath 22 movieProps[moviePropCount].propValueSize = ctypes.sizeof(ctypes.c_void_p) 23 movieProps[moviePropCount].propValueAddress = ctypes.cast(ctypes.byref(movieFilePathRef),ctypes.c_void_p) 24 movieProps[moviePropCount].propStatus = 0 25 26 moviePropCount += 1 27 28 boolTrue = ctypes.c_ubyte(1) 29 movieProps[moviePropCount].propClass = qtlowlevel.kQTPropertyClass_MovieInstantiation 30 movieProps[moviePropCount].propID = qtlowlevel.kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs 31 movieProps[moviePropCount].propValueSize = ctypes.sizeof(boolTrue) 32 movieProps[moviePropCount].propValueAddress = ctypes.cast(ctypes.pointer(boolTrue),ctypes.c_void_p) 33 movieProps[moviePropCount].propStatus = 0 34 35 moviePropCount += 1 36 37 movieProps[moviePropCount].propClass = qtlowlevel.kQTPropertyClass_NewMovieProperty 38 movieProps[moviePropCount].propID = qtlowlevel.kQTNewMoviePropertyID_Active 39 movieProps[moviePropCount].propValueSize = ctypes.sizeof(boolTrue) 40 movieProps[moviePropCount].propValueAddress = ctypes.cast(ctypes.pointer(boolTrue),ctypes.c_void_p) 41 movieProps[moviePropCount].propStatus = 0 42 43 moviePropCount += 1 44 45 movieProps[moviePropCount].propClass = qtlowlevel.kQTPropertyClass_NewMovieProperty 46 movieProps[moviePropCount].propID = qtlowlevel.kQTNewMoviePropertyID_DontInteractWithUser 47 movieProps[moviePropCount].propValueSize = ctypes.sizeof(boolTrue) 48 movieProps[moviePropCount].propValueAddress = ctypes.cast(ctypes.pointer(boolTrue),ctypes.c_void_p) 49 movieProps[moviePropCount].propStatus = 0 50 51 moviePropCount += 1 52 53 theMovie = qtlowlevel.Movie() 54 qtlowlevel.NewMovieFromProperties( moviePropCount, movieProps, 0, None, ctypes.byref(theMovie)) 55 return Movie(theMovie)
56
57 -class Rect:
58 - def __init__(self,top=0,left=0,bottom=0,right=0):
59 self.top = top 60 self.left = left 61 self.bottom = bottom 62 self.right = right
63
64 -class Movie:
65 """An encapsulated QuickTime Movie"""
66 - def __init__(self,theMovie):
67 self.theMovie = theMovie
68 - def GetMovieBox(self):
69 movieBounds = qtlowlevel.Rect() 70 qtlowlevel.GetMovieBox(self.theMovie, ctypes.byref(movieBounds)) 71 return Rect(top=movieBounds.top, 72 left=movieBounds.left, 73 bottom=movieBounds.bottom, 74 right=movieBounds.right)
75
76 - def SetMovieBox(self,bounds):
77 if not isinstance(bounds,Rect): 78 raise ValueError('bounds argument must be instance of VisionEgg.qtmovie.Rect') 79 b = qtlowlevel.Rect() 80 (b.top, b.left, b.bottom, b.right) = (bounds.top, bounds.left, 81 bounds.bottom, bounds.right) 82 qtlowlevel.SetMovieBox(self.theMovie, ctypes.byref(b))
83 - def StartMovie(self):
84 qtlowlevel.StartMovie(self.theMovie)
85
86 - def MoviesTask(self,value):
87 qtlowlevel.MoviesTask(self.theMovie, value)
88
89 - def IsMovieDone(self):
90 return qtlowlevel.IsMovieDone(self.theMovie)
91
92 - def GoToBeginningOfMovie(self):
93 qtlowlevel.GoToBeginningOfMovie(self.theMovie)
94

visionegg-1.2.1/doc/reference/html/VisionEgg.qtmovie.Movie-class.html0000644000076500000240000002174311224565531024777 0ustar astrawstaff VisionEgg.qtmovie.Movie
Package VisionEgg :: Module qtmovie :: Class Movie
[frames] | no frames]

Class Movie

source code

An encapsulated QuickTime Movie



Instance Methods
 
__init__(self, theMovie) source code
 
GetMovieBox(self) source code
 
SetMovieBox(self, bounds) source code
 
StartMovie(self) source code
 
MoviesTask(self, value) source code
 
IsMovieDone(self) source code
 
GoToBeginningOfMovie(self) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.qtmovie.Rect-class.html0000644000076500000240000001246411224565531024615 0ustar astrawstaff VisionEgg.qtmovie.Rect
Package VisionEgg :: Module qtmovie :: Class Rect
[frames] | no frames]

Class Rect

source code

Instance Methods
 
__init__(self, top=0, left=0, bottom=0, right=0) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.QuickTime-module.html0000644000076500000240000001500511224565531024302 0ustar astrawstaff VisionEgg.QuickTime
Package VisionEgg :: Module QuickTime
[frames] | no frames]

Module QuickTime

source code


QuickTime movies in the Vision Egg.




Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  MovieTexture
Functions
 
new_movie_from_filename(filename, MAX_PATH=255)
create a Movie from filename
source code
Variables
  __version__ = VisionEgg.release_name
visionegg-1.2.1/doc/reference/html/VisionEgg.QuickTime-pysrc.html0000644000076500000240000012432311224565531024161 0ustar astrawstaff VisionEgg.QuickTime
Package VisionEgg :: Module QuickTime
[frames] | no frames]

Source Code for Module VisionEgg.QuickTime

  1  # The Vision Egg: QuickTime 
  2  # 
  3  # Copyright (C) 2001-2003, 2006 Andrew Straw. 
  4  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  5  # URL: <http://www.visionegg.org/> 
  6  # 
  7  # Distributed under the terms of the GNU Lesser General Public License 
  8  # (LGPL). See LICENSE.TXT that came with this file. 
  9   
 10  """ 
 11  QuickTime movies in the Vision Egg. 
 12   
 13  """ 
 14   
 15  import VisionEgg 
 16  import VisionEgg.gl_qt # C implementation of GL/QT interface 
 17  import VisionEgg.qtmovie as qtmovie 
 18  import VisionEgg.Textures 
 19   
 20  import numpy.oldnumeric as Numeric 
 21  import os 
 22   
 23  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
 24   
 25  __version__ = VisionEgg.release_name 
 26  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 27   
 28  ####################################################### 
 29   
 30  new_movie_from_filename = qtmovie.new_movie_from_filename 
 31       
32 -class MovieTexture(VisionEgg.Textures.Texture):
33 34 __slots__ = ( 35 'movie', 36 'size', 37 'scale', 38 'gl_qt_renderer', 39 ) 40
41 - def __init__(self, 42 movie=None, 43 texture_size=None, # be default will be big enough for full movie, otherwise 2-tuple 44 ):
45 if not isinstance(movie,qtmovie.Movie): 46 if isinstance(movie,str) or isinstance(movie,unicode): 47 movie = new_movie_from_filename(filename=movie) 48 self.movie = movie 49 bounds = self.movie.GetMovieBox() 50 height = bounds.bottom-bounds.top 51 width = bounds.right-bounds.left 52 self.movie.SetMovieBox(qtmovie.Rect(top=0,left=0,bottom=height,right=width)) 53 self.size = (width,height) 54 self.scale = 1.0
55
56 - def make_half_size(self):
57 self.size = self.size[0]/2, self.size[1]/2 58 self.scale = self.scale/2
59
60 - def unload(self):
61 raise NotImplementedError('')
62
63 - def get_texels_as_image(self):
64 raise NotImplementedError('')
65
66 - def load(self, texture_object, 67 build_mipmaps=False, 68 rescale_original_to_fill_texture_object = False, 69 internal_format=gl.GL_RGB, 70 ):
71 if build_mipmaps: 72 raise ValueError('cannot build mipmaps for QuickTime movies') 73 if rescale_original_to_fill_texture_object: 74 raise NotImplementedError('') 75 width,height = self.size 76 tex_shape = VisionEgg.Textures.next_power_of_2(max(width,height)) 77 # fractional coverage 78 self.buf_lf = 0.0 79 self.buf_rf = float(width)/tex_shape 80 self.buf_bf = 0.0 81 self.buf_tf = float(height)/tex_shape 82 83 # absolute (texel units) coverage 84 self._buf_l = 0 85 self._buf_r = width 86 self._buf_b = 0 87 self._buf_t = height 88 89 buffer = Numeric.zeros( (tex_shape,tex_shape), Numeric.UInt8 ) 90 texture_object.put_new_image( buffer, 91 internal_format=gl.GL_RGB, 92 mipmap_level=0 ) 93 self.texture_object = texture_object 94 95 self.gl_qt_renderer = VisionEgg.gl_qt.gl_qt_renderer_create(self.movie,tex_shape,self.scale)
96
97 - def update(self):
98 # only call this when my texture unit is active 99 VisionEgg.gl_qt.gl_qt_renderer_update(self.gl_qt_renderer)
100
101 - def __del__(self):
102 VisionEgg.gl_qt.gl_qt_renderer_delete(self.gl_qt_renderer)
103

visionegg-1.2.1/doc/reference/html/VisionEgg.QuickTime.MovieTexture-class.html0000644000076500000240000004476611224565531026601 0ustar astrawstaff VisionEgg.QuickTime.MovieTexture
Package VisionEgg :: Module QuickTime :: Class MovieTexture
[frames] | no frames]

Class MovieTexture

source code

      object --+    
               |    
Textures.Texture --+
                   |
                  MovieTexture

Instance Methods
 
__init__(self, movie=None, texture_size=None)
Creates instance of Texture object.
source code
 
make_half_size(self) source code
 
unload(self)
Unload texture data from video texture memory.
source code
 
get_texels_as_image(self)
Return texel data as PIL image
source code
 
load(self, texture_object, build_mipmaps=False, rescale_original_to_fill_texture_object=False, internal_format=gl.GL_RGB)
Load texture data to video texture memory.
source code
 
update(self)
Update texture data This method does nothing, but may be overriden in classes that need to update their texture data whenever drawn.
source code
 
__del__(self) source code

Inherited from Textures.Texture: get_pixels_as_image, get_texture_object

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Properties

Inherited from object: __class__

Method Details

__init__(self, movie=None, texture_size=None)
(Constructor)

source code 
Creates instance of Texture object.

texels -- Texture data. If not specified, a blank white
          texture is created.
size -- If a tuple, force size of texture data if possible,
        raising an exception if not. If None, has no effect.

Overrides: Textures.Texture.__init__
(inherited documentation)

make_half_size(self)

source code 
Overrides: Textures.Texture.make_half_size

unload(self)

source code 
Unload texture data from video texture memory.

This only removes data from the video texture memory if there
are no other references to the TextureObject instance.  To
ensure this, all references to the texture_object argument
passed to the load() method should be deleted.

Overrides: Textures.Texture.unload
(inherited documentation)

get_texels_as_image(self)

source code 
Return texel data as PIL image

Overrides: Textures.Texture.get_texels_as_image
(inherited documentation)

load(self, texture_object, build_mipmaps=False, rescale_original_to_fill_texture_object=False, internal_format=gl.GL_RGB)

source code 
Load texture data to video texture memory.

This will cause the texture data to become resident in OpenGL
video texture memory, enabling fast drawing.

The texture_object argument is used to specify an instance of
the TextureObject class, which is a wrapper for the OpenGL
texture object holding the resident texture.

To remove a texture from OpenGL's resident textures:       TextureObject passed as the texture_object argument and 2)
call the unload() method

Overrides: Textures.Texture.load
(inherited documentation)

update(self)

source code 
Update texture data

This method does nothing, but may be overriden in classes that
need to update their texture data whenever drawn.

It it called by the draw() method of any stimuli using
textures when its texture object is active, so it can safely
use put_sub_image() to manipulate its own texture data.

Overrides: Textures.Texture.update
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ResponseControl-module.html0000644000076500000240000001336211224565531025552 0ustar astrawstaff VisionEgg.ResponseControl
Package VisionEgg :: Module ResponseControl
[frames] | no frames]

Module ResponseControl

source code


Response control during a presentation is running.



Classes
  ResponseController
This abstract base class defines the interface to any ResponseController.
  KeyboardResponseController
Use the keyboard to collect responses during a presentation is running.
Variables
  __version__ = VisionEgg.release_name
visionegg-1.2.1/doc/reference/html/VisionEgg.ResponseControl-pysrc.html0000644000076500000240000022661211224565531025431 0ustar astrawstaff VisionEgg.ResponseControl
Package VisionEgg :: Module ResponseControl
[frames] | no frames]

Source Code for Module VisionEgg.ResponseControl

  1  # The Vision Egg: ResponseControl 
  2  # 
  3  # Author(s): Hubertus Becker <hubertus.becker@uni-tuebingen.de> 
  4  # Copyright: (C) 2005 by Hertie Institute for Clinical Brain Research, 
  5  #            Department of Cognitive Neurology, University of Tuebingen 
  6  # URL:       http://www.hubertus-becker.de/resources/visionegg/ 
  7  # 
  8  # This library is free software; you can redistribute it and/or modify 
  9  # it under the terms of the GNU Lesser General Public License as 
 10  # published by the Free Software Foundation; either version 2.1 of 
 11  # the License, or (at your option) any later version. 
 12   
 13  """ 
 14  Response control during a presentation is running. 
 15   
 16  """ 
 17   
 18  #################################################################### 
 19  # 
 20  #        Import all the necessary packages 
 21  # 
 22  #################################################################### 
 23   
 24  import logging 
 25  import logging.handlers 
 26   
 27  import VisionEgg 
 28  import VisionEgg.Core 
 29  import VisionEgg.FlowControl 
 30  import VisionEgg.DaqKeyboard 
 31  import VisionEgg.ParameterTypes as ve_types 
 32  import pygame 
 33   
 34  __version__ = VisionEgg.release_name 
 35   
 36  #################################################################### 
 37  # 
 38  #        ResponseController 
 39  # 
 40  #################################################################### 
 41   
42 -class ResponseController(VisionEgg.FlowControl.Controller):
43 """This abstract base class defines the interface to any ResponseController. 44 45 This module provides an interface to collect responses during a 46 presentation is running. To interface with real data acquisition devices, 47 use a module that subclasses the classes defined here. 48 49 """ 50
51 - def _reset(self):
52 self.responses = [] 53 self.responses_since_go = [] 54 self.time_responses_since_go = [] 55 self.first_responses_since_go = [] 56 self.time_first_responses_since_go = None 57 self.status_first_responses_since_go = False 58 self.last_responses_since_go = [] 59 self.time_last_responses_since_go = None
60
61 - def __init__(self, **kw):
62 self._reset()
63
64 - def get_responses(self):
65 """Returns the responses in the current frame.""" 66 return self.responses
67 68 get_data = get_responses # For backward compatibility 69
70 - def get_responses_since_go(self):
71 """Returns all responses since the main 'go' loop has been 72 started.""" 73 return self.responses_since_go
74
76 """Returns the time stamps for all responses since the main 'go' 77 loop has been started.""" 78 return self.time_responses_since_go
79
80 - def get_first_response_since_go(self, index=0):
81 """Returns the first response since the main 'go' loop has been 82 started.""" 83 if self.first_responses_since_go == []: 84 return [] 85 else: 86 return self.first_responses_since_go[index]
87
89 """Returns the first responses since the main 'go' loop has been 90 started.""" 91 return self.first_responses_since_go
92
94 """Returns the time stamp for first responses since the main 'go' 95 loop has been started.""" 96 return self.time_first_responses_since_go
97 98 get_time_first_responses_since_go = get_time_first_response_since_go 99
100 - def get_last_response_since_go(self, index=0):
101 """Returns the last response since the main 'go' loop has been 102 started.""" 103 if self.last_responses_since_go == []: 104 return [] 105 else: 106 return self.last_responses_since_go[index]
107
109 """Returns the last responses since the main 'go' loop has been 110 started.""" 111 return self.last_responses_since_go
112
114 """Returns the time stamp for last response since the main 'go' 115 loop has been started.""" 116 return self.time_last_responses_since_go
117 118 get_time_last_responses_since_go = get_time_last_response_since_go 119
120 - def between_go_eval(self):
121 """Evaluate between runs of the main 'go' loop. 122 123 Override this method in subclasses.""" 124 raise RuntimeError("%s: Definition of between_go_eval() in abstract base class ResponseController must be overriden."%(str(self),))
125
126 - def during_go_eval(self):
127 """Evaluate during the main 'go' loop. 128 129 Override this method in subclasses.""" 130 raise RuntimeError("%s: Definition of during_go_eval() in abstract base class ResponseController must be overriden."%(str(self),))
131 132 133 #################################################################### 134 # 135 # KeyboardResponseController 136 # 137 #################################################################### 138 139 #class KeyboardResponseController(VisionEgg.ReponseController):
140 -class KeyboardResponseController(ResponseController):
141 """Use the keyboard to collect responses during a presentation is running.""" 142
143 - def __init__(self):
144 VisionEgg.FlowControl.Controller.__init__(self, 145 return_type=ve_types.get_type(None), 146 eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME, 147 temporal_variables=VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO 148 ) 149 self.input = VisionEgg.DaqKeyboard.KeyboardInput()
150
151 - def between_go_eval(self):
152 return None # Ignore keyboard
153
154 - def during_go_eval(self):
155 if self.time_sec_since_go <= 0.01: # Reset it every presentation 156 self._reset() 157 # self.responses = self.input.get_pygame_data() 158 self.responses = self.input.get_string_data() 159 if len(self.responses) > 0: 160 self.responses_since_go.append(self.responses) 161 self.time_responses_since_go.append(self.time_sec_since_go) 162 if self.status_first_responses_since_go == False: 163 self.time_first_responses_since_go = self.time_sec_since_go 164 self.first_responses_since_go = self.responses 165 self.status_first_responses_since_go = True 166 self.time_last_responses_since_go = self.time_sec_since_go 167 self.last_responses_since_go = self.responses 168 return None
169

visionegg-1.2.1/doc/reference/html/VisionEgg.ResponseControl.KeyboardResponseController-class.html0000644000076500000240000003666011224565531032722 0ustar astrawstaff VisionEgg.ResponseControl.KeyboardResponseController
Package VisionEgg :: Module ResponseControl :: Class KeyboardResponseController
[frames] | no frames]

Class KeyboardResponseController

source code

            object --+        
                     |        
FlowControl.Controller --+    
                         |    
        ResponseController --+
                             |
                            KeyboardResponseController

Use the keyboard to collect responses during a presentation is running.



Instance Methods
 
__init__(self) source code
 
between_go_eval(self)
Evaluate between runs of the main 'go' loop.
source code
 
during_go_eval(self)
Evaluate during the main 'go' loop.
source code

Inherited from ResponseController: get_data, get_first_response_since_go, get_first_responses_since_go, get_last_response_since_go, get_last_responses_since_go, get_responses, get_responses_since_go, get_time_first_response_since_go, get_time_first_responses_since_go, get_time_last_response_since_go, get_time_last_responses_since_go, get_time_responses_since_go

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self)
(Constructor)

source code 
Overrides: ResponseController.__init__

between_go_eval(self)

source code 
Evaluate between runs of the main 'go' loop.

Override this method in subclasses.

Overrides: ResponseController.between_go_eval
(inherited documentation)

during_go_eval(self)

source code 
Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: ResponseController.during_go_eval
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.ResponseControl.ResponseController-class.html0000644000076500000240000005643611224565531031244 0ustar astrawstaff VisionEgg.ResponseControl.ResponseController
Package VisionEgg :: Module ResponseControl :: Class ResponseController
[frames] | no frames]

Class ResponseController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        ResponseController

This abstract base class defines the interface to any ResponseController.

This module provides an interface to collect responses during a
presentation is running. To interface with real data acquisition devices,
use a module that subclasses the classes defined here.



Instance Methods
 
__init__(self, **kw)
Create instance of Controller.
source code
 
get_responses(self)
Returns the responses in the current frame.
source code
 
get_data(self)
Returns the responses in the current frame.
source code
 
get_responses_since_go(self)
Returns all responses since the main 'go' loop has been started.
source code
 
get_time_responses_since_go(self)
Returns the time stamps for all responses since the main 'go' loop has been started.
source code
 
get_first_response_since_go(self, index=0)
Returns the first response since the main 'go' loop has been started.
source code
 
get_first_responses_since_go(self)
Returns the first responses since the main 'go' loop has been started.
source code
 
get_time_first_response_since_go(self)
Returns the time stamp for first responses since the main 'go' loop has been started.
source code
 
get_time_first_responses_since_go(self)
Returns the time stamp for first responses since the main 'go' loop has been started.
source code
 
get_last_response_since_go(self, index=0)
Returns the last response since the main 'go' loop has been started.
source code
 
get_last_responses_since_go(self)
Returns the last responses since the main 'go' loop has been started.
source code
 
get_time_last_response_since_go(self)
Returns the time stamp for last response since the main 'go' loop has been started.
source code
 
get_time_last_responses_since_go(self)
Returns the time stamp for last response since the main 'go' loop has been started.
source code
 
between_go_eval(self)
Evaluate between runs of the main 'go' loop.
source code
 
during_go_eval(self)
Evaluate during the main 'go' loop.
source code

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create instance of Controller.

Arguments:

eval_frequency -- Int, bitwise "or" of flags
temporal_variables -- Int, bitwise "or" of flags
return_type -- Set to type() of the parameter under control

Overrides: FlowControl.Controller.__init__
(inherited documentation)

between_go_eval(self)

source code 
Evaluate between runs of the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.between_go_eval

during_go_eval(self)

source code 
Evaluate during the main 'go' loop.

Override this method in subclasses.

Overrides: FlowControl.Controller.during_go_eval

visionegg-1.2.1/doc/reference/html/VisionEgg.SphereMap-module.html0000644000076500000240000001435611224565531024303 0ustar astrawstaff VisionEgg.SphereMap
Package VisionEgg :: Module SphereMap
[frames] | no frames]

Module SphereMap

source code


Stimuli on spheres, including texture maps.



Classes
  AzElGrid
Spherical grid of iso-azimuth and iso-elevation lines.
  SphereMap
Mercator mapping of rectangular texture onto sphere.
  SphereGrating
Map 2D sinusoidal grating onto sphere.
  SphereWindow
This draws an opaque sphere with a single window in it.
Variables
  __version__ = VisionEgg.release_name
visionegg-1.2.1/doc/reference/html/VisionEgg.SphereMap-pysrc.html0000644000076500000240000146245511224565531024166 0ustar astrawstaff VisionEgg.SphereMap
Package VisionEgg :: Module SphereMap
[frames] | no frames]

Source Code for Module VisionEgg.SphereMap

   1  # The Vision Egg: SphereMap 
   2  # 
   3  # Copyright (C) 2001-2004 Andrew Straw. 
   4  # Copyright (C) 2005-2008 California Institute of Technology 
   5  # 
   6  # Author: Andrew Straw <astraw@users.sourceforge.net> 
   7  # URL: <http://www.visionegg.org/> 
   8  # 
   9  # Distributed under the terms of the GNU Lesser General Public License 
  10  # (LGPL). See LICENSE.TXT that came with this file. 
  11   
  12  """ 
  13  Stimuli on spheres, including texture maps. 
  14   
  15  """ 
  16   
  17  import math, types 
  18   
  19  import logging 
  20   
  21  import VisionEgg.Core 
  22  import VisionEgg.Textures 
  23  import VisionEgg.Text 
  24  import VisionEgg.Gratings 
  25  import VisionEgg.ThreeDeeMath 
  26  import VisionEgg.ParameterTypes as ve_types 
  27   
  28  import numpy 
  29  import numpy.oldnumeric as Numeric 
  30  import Image 
  31   
  32  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
  33   
  34  __version__ = VisionEgg.release_name 
  35   
36 -class AzElGrid(VisionEgg.Core.Stimulus):
37 """Spherical grid of iso-azimuth and iso-elevation lines. 38 39 Parameters 40 ========== 41 anti_aliasing -- (Boolean) 42 Default: True 43 center_azimuth -- (Real) 44 Default: 0.0 45 center_elevation -- (Real) 46 Default: 0.0 47 major_line_color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 48 Default: (0.0, 0.0, 0.0) 49 major_line_width -- (Real) 50 Default: 2.0 51 minor_line_color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 52 Default: (0.0, 0.0, 1.0) 53 minor_line_width -- (Real) 54 Default: 1.0 55 my_viewport -- (Instance of <class 'VisionEgg.Core.Viewport'>) 56 Default: (determined at runtime) 57 on -- (Boolean) 58 Default: True 59 text_offset -- (Sequence2 of Real) 60 Default: (3, -2) 61 62 Constant Parameters 63 =================== 64 az_major_spacing -- (Real) 65 Default: 30.0 66 az_minor_spacing -- (Real) 67 Default: 10.0 68 el_major_spacing -- (Real) 69 Default: 30.0 70 el_minor_spacing -- (Real) 71 Default: 10.0 72 font_size -- (UnsignedInteger) 73 Default: 24 74 num_samples_per_circle -- (UnsignedInteger) 75 Default: 100 76 radius -- (Real) 77 Default: 1.0 78 text_anchor -- (String) 79 Default: lowerleft 80 text_color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 81 Default: (0.0, 0.0, 0.0) 82 use_text -- (Boolean) 83 Default: True 84 """ 85 86 parameters_and_defaults = { 87 'on':(True, 88 ve_types.Boolean), 89 'center_azimuth':(0.0, # 0=right, 90=right 90 ve_types.Real), 91 'center_elevation':(0.0, # 0=right, 90=up 92 ve_types.Real), 93 'minor_line_width':(1.0, 94 ve_types.Real), 95 'major_line_width':(2.0, 96 ve_types.Real), 97 'minor_line_color':((0.0,0.0,1.0), 98 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 99 ve_types.Sequence4(ve_types.Real))), 100 'major_line_color':((0.0,0.0,0.0), 101 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 102 ve_types.Sequence4(ve_types.Real))), 103 'my_viewport':(None, # viewport I'm in 104 ve_types.Instance(VisionEgg.Core.Viewport)), 105 'text_offset':((3,-2), # offset (x,y) to nudge text labels 106 ve_types.Sequence2(ve_types.Real)), 107 'anti_aliasing' : ( True, 108 ve_types.Boolean ), 109 } 110 111 constant_parameters_and_defaults = { 112 'use_text':(True, 113 ve_types.Boolean), 114 'radius':(1.0, 115 ve_types.Real), 116 'az_minor_spacing':(10.0, 117 ve_types.Real), 118 'az_major_spacing':(30.0, 119 ve_types.Real), 120 'el_minor_spacing':(10.0, 121 ve_types.Real), 122 'el_major_spacing':(30.0, 123 ve_types.Real), 124 'num_samples_per_circle':(100, 125 ve_types.UnsignedInteger), 126 'font_size':(24, 127 ve_types.UnsignedInteger), 128 'text_color':((0.0,0.0,0.0), 129 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 130 ve_types.Sequence4(ve_types.Real))), 131 'text_anchor':('lowerleft', 132 ve_types.String), 133 } 134 135 __slots__ = ( 136 'cached_minor_lines_display_list', 137 'cached_major_lines_display_list', 138 'text_viewport', 139 'text_viewport_orig', 140 '_gave_alpha_warning', 141 'labels', 142 'labels_xyz', 143 ) 144
145 - def __init__(self,**kw):
146 VisionEgg.Core.Stimulus.__init__(self,**kw) 147 self.cached_minor_lines_display_list = gl.glGenLists(1) # Allocate a new display list 148 self.cached_major_lines_display_list = gl.glGenLists(1) # Allocate a new display list 149 self.__rebuild_display_lists() 150 self.text_viewport = None # not set yet 151 self._gave_alpha_warning = False
152
153 - def __rebuild_display_lists(self):
154 def get_xyz(theta,phi,radius): 155 # theta normally between 0 and pi (north pole to south pole) 156 # phi between -pi and pi 157 y = radius * math.cos( theta ) 158 w = radius * math.sin( theta ) 159 x = w * math.cos( phi ) 160 z = w * math.sin( phi ) 161 return x,y,z
162 def draw_half_great_circle(az): 163 for i in range(cp.num_samples_per_circle/2): 164 # let theta exceed 1 pi to draw 2nd half of circle 165 theta_start = i/float(cp.num_samples_per_circle)*2*math.pi 166 theta_stop = (i+1)/float(cp.num_samples_per_circle)*2*math.pi 167 phi_start = phi_stop = (az-90.0)/180.0*math.pi 168 x_start,y_start,z_start = get_xyz(theta_start,phi_start,cp.radius) 169 x_stop,y_stop,z_stop = get_xyz(theta_stop,phi_stop,cp.radius) 170 gl.glVertex3f(x_start, y_start, z_start) 171 gl.glVertex3f(x_stop, y_stop, z_stop)
172 def draw_iso_elevation_circle(el): 173 # el from -90 = pi to el 90 = 0 174 theta_start = theta_stop = -(el-90) / 180.0 * math.pi 175 for i in range(cp.num_samples_per_circle): 176 phi_start = i/float(cp.num_samples_per_circle)*2*math.pi 177 phi_stop = (i+1)/float(cp.num_samples_per_circle)*2*math.pi 178 x_start,y_start,z_start = get_xyz(theta_start,phi_start,cp.radius) 179 x_stop,y_stop,z_stop = get_xyz(theta_stop,phi_stop,cp.radius) 180 gl.glVertex3f(x_start, y_start, z_start) 181 gl.glVertex3f(x_stop, y_stop, z_stop) 182 183 cp = self.constant_parameters 184 # Weird range construction to be sure to include zero. 185 azs_major = numpy.concatenate(( 186 numpy.arange(0.0,180.0,cp.az_major_spacing), 187 -numpy.arange(0.0,180.0,cp.az_major_spacing)[1:])) 188 azs_minor = numpy.concatenate(( 189 numpy.arange(0.0,180.0,cp.az_minor_spacing), 190 -numpy.arange(0.0,180.0,cp.az_minor_spacing)[1:])) 191 els_major = numpy.concatenate(( 192 numpy.arange(0.0,90.0,cp.el_major_spacing), 193 -numpy.arange(0.0,90.0,cp.el_major_spacing)[1:])) 194 els_minor = numpy.concatenate(( 195 numpy.arange(0.0,90.0,cp.el_minor_spacing), 196 -numpy.arange(0.0,90.0,cp.el_minor_spacing)[1:])) 197 198 gl.glNewList(self.cached_minor_lines_display_list,gl.GL_COMPILE) 199 gl.glBegin(gl.GL_LINES) 200 # az minor 201 for az in azs_minor: 202 if az in azs_major: 203 continue # draw only once as major 204 draw_half_great_circle(az) 205 for el in els_minor: 206 if el in els_major: 207 continue # draw only once as major 208 draw_iso_elevation_circle(el) 209 gl.glEnd() 210 gl.glEndList() 211 212 gl.glNewList(self.cached_major_lines_display_list,gl.GL_COMPILE) 213 gl.glBegin(gl.GL_LINES) 214 for az in azs_major: 215 draw_half_great_circle(az) 216 for el in els_major: 217 draw_iso_elevation_circle(el) 218 gl.glEnd() 219 gl.glEndList() 220 221 if cp.use_text: 222 self.labels = [] 223 self.labels_xyz = [] 224 els_major = list(els_major)+[90.0] # make sure we have north pole 225 for el in els_major: 226 for az in azs_major: 227 theta = -(el-90) / 180.0 * math.pi 228 phi = (az-90.0)/180.0*math.pi 229 x,y,z = get_xyz(theta,phi,cp.radius) 230 self.labels_xyz.append((x,y,z)) 231 self.labels.append( 232 VisionEgg.Text.Text( text = '%.0f, %.0f'%(az,el), 233 font_size = cp.font_size, 234 color = cp.text_color, 235 anchor = cp.text_anchor, 236 ) 237 ) 238 if (el == -90) or (el == 90): 239 self.labels[-1].parameters.text = 'x, %.0f'%(el,) 240 break # only one label at the poles 241 242 self.labels_xyz = Numeric.array(self.labels_xyz) 243
244 - def draw(self):
245 p = self.parameters 246 cp = self.constant_parameters 247 if p.on: 248 # Set OpenGL state variables 249 gl.glDisable( gl.GL_DEPTH_TEST ) 250 gl.glDisable( gl.GL_TEXTURE_2D ) # Make sure textures are not drawn 251 gl.glMatrixMode(gl.GL_MODELVIEW) 252 gl.glPushMatrix() 253 gl.glRotatef(p.center_azimuth,0.0,-1.0,0.0) 254 gl.glRotatef(p.center_elevation,1.0,0.0,0.0) 255 256 if p.anti_aliasing: 257 if len(p.minor_line_color) == 4 and not self._gave_alpha_warning: 258 if p.minor_line_color[3] != 1.0: 259 logger = logging.getLogger('VisionEgg.SphereMap') 260 logger.warning("The parameter anti_aliasing is " 261 "set to true in the AzElGrid " 262 "stimulus class, but the color " 263 "parameter specifies an alpha " 264 "value other than 1.0. To " 265 "acheive the best anti-aliasing, " 266 "ensure that the alpha value for " 267 "the color parameter is 1.0.") 268 self._gave_alpha_warning = 1 269 if len(p.major_line_color) == 4 and not self._gave_alpha_warning: 270 if p.major_line_color[3] != 1.0: 271 logger = logging.getLogger('VisionEgg.SphereMap') 272 logger.warning("The parameter anti_aliasing is " 273 "set to true in the AzElGrid " 274 "stimulus class, but the color " 275 "parameter specifies an alpha " 276 "value other than 1.0. To " 277 "acheive the best anti-aliasing, " 278 "ensure that the alpha value for " 279 "the color parameter is 1.0.") 280 self._gave_alpha_warning = 1 281 gl.glEnable( gl.GL_LINE_SMOOTH ) 282 # allow max_alpha value to control blending 283 gl.glEnable( gl.GL_BLEND ) 284 gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) 285 else: 286 gl.glDisable( gl.GL_BLEND ) 287 288 if len(p.minor_line_color)==3: 289 gl.glColor3f(*p.minor_line_color) 290 elif len(p.minor_line_color)==4: 291 gl.glColor4f(*p.minor_line_color) 292 gl.glLineWidth(p.minor_line_width) 293 gl.glCallList(self.cached_minor_lines_display_list) 294 295 if len(p.major_line_color)==3: 296 gl.glColor3f(*p.major_line_color) 297 elif len(p.major_line_color)==4: 298 gl.glColor4f(*p.major_line_color) 299 gl.glLineWidth(p.major_line_width) 300 gl.glCallList(self.cached_major_lines_display_list) 301 302 if p.anti_aliasing: 303 gl.glDisable( gl.GL_LINE_SMOOTH ) # turn off 304 305 if cp.use_text: 306 my_view = p.my_viewport 307 if (my_view is None) or (not my_view._is_drawing): 308 raise ValueError('use_text is True, but my_viewport not (properly) assigned') 309 310 if self.text_viewport is None or self.text_viewport_orig != my_view: 311 # make viewport for text (uses default orthographic projection) 312 vp = my_view.parameters 313 self.text_viewport = VisionEgg.Core.Viewport(screen=vp.screen, 314 position=vp.position, 315 size=vp.size, 316 anchor=vp.anchor, 317 ) 318 lowerleft = VisionEgg._get_lowerleft(vp.position,vp.anchor,vp.size) 319 self.text_viewport.parameters.projection.stateless_translate(-lowerleft[0],-lowerleft[1],0) 320 self.text_viewport_orig = p.my_viewport # in case my_viewport changes, change text_viewport 321 322 # draw text labels 323 my_proj = my_view.parameters.projection 324 325 xyz = self.labels_xyz 326 327 t = VisionEgg.ThreeDeeMath.TransformMatrix() 328 t.rotate( p.center_azimuth,0.0,-1.0,0.0 ) # acheive same transforms as the lines 329 t.rotate( p.center_elevation,1.0,0.0,0.0 ) 330 331 xyz = t.transform_vertices(self.labels_xyz) 332 333 clip = my_proj.eye_2_clip(xyz) 334 try: 335 # this is much faster when no OverflowError... 336 window_coords = my_view.clip_2_window(clip) 337 all_at_once = True 338 except OverflowError: 339 all_at_once = False 340 draw_labels = [] 341 for i in range(len(self.labels)): 342 if clip[i,3] < 0: continue # this vertex is not on screen 343 label = self.labels[i] 344 if all_at_once: 345 this_pos = window_coords[i,:2] 346 else: 347 try: 348 window_coords = my_view.clip_2_window(clip[i,:]) 349 except OverflowError: 350 continue # not much we can do with this vertex, either 351 this_pos = window_coords[:2] 352 label.parameters.position = (this_pos[0] + p.text_offset[0], 353 this_pos[1] + p.text_offset[1]) 354 draw_labels.append(label) 355 self.text_viewport.parameters.stimuli = draw_labels 356 self.text_viewport.draw() 357 my_view.make_current() # restore viewport 358 gl.glPopMatrix()
359
360 -class SphereMap(VisionEgg.Textures.TextureStimulusBaseClass):
361 """Mercator mapping of rectangular texture onto sphere. 362 363 Parameters 364 ========== 365 center_azimuth -- (Real) 366 Default: 0.0 367 center_elevation -- (Real) 368 Default: 0.0 369 contrast -- (Real) 370 Default: 1.0 371 on -- (Boolean) 372 Default: True 373 radius -- (Real) 374 Default: 1.0 375 slices -- (UnsignedInteger) 376 Default: 30 377 stacks -- (UnsignedInteger) 378 Default: 30 379 texture -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>) 380 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 381 Default: (determined at runtime) 382 texture_mag_filter -- OpenGL filter enum (Integer) 383 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 384 Default: GL_LINEAR (9729) 385 texture_min_filter -- OpenGL filter enum (Integer) 386 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 387 Default: (GL enum determined at runtime) 388 texture_wrap_s -- OpenGL texture wrap enum (Integer) 389 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 390 Default: (GL enum determined at runtime) 391 texture_wrap_t -- OpenGL texture wrap enum (Integer) 392 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 393 Default: (GL enum determined at runtime) 394 395 Constant Parameters 396 =================== 397 internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) 398 Default: GL_RGB (6407) 399 mipmaps_enabled -- Are mipmaps enabled? (Boolean) 400 Default: True 401 shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) 402 Default: False 403 """ 404 405 parameters_and_defaults = { 406 'on':(True, 407 ve_types.Boolean), 408 'contrast':(1.0, 409 ve_types.Real), 410 'center_azimuth':(0.0, # 0=right, 90=right 411 ve_types.Real), 412 'center_elevation':(0.0, # 0=right, 90=up 413 ve_types.Real), 414 415 # Changing these parameters will cause re-computation of display list (may cause frame skip) 416 'radius':(1.0, 417 ve_types.Real), 418 'slices':(30, 419 ve_types.UnsignedInteger), 420 'stacks':(30, 421 ve_types.UnsignedInteger)} 422 423 __slots__ = ( 424 'cached_display_list', 425 '_cached_radius', 426 '_cached_slices', 427 '_cached_stacks', 428 ) 429
430 - def __init__(self,**kw):
431 VisionEgg.Textures.TextureStimulusBaseClass.__init__(self,**kw) 432 self.cached_display_list = gl.glGenLists(1) # Allocate a new display list 433 self.__rebuild_display_list()
434
435 - def __rebuild_display_list(self):
436 p = self.parameters 437 438 s_gain = p.texture.buf_rf - p.texture.buf_lf 439 t_gain = p.texture.buf_bf - p.texture.buf_tf 440 441 s_offs = p.texture.buf_lf 442 t_offs = p.texture.buf_tf 443 444 gl.glNewList(self.cached_display_list,gl.GL_COMPILE) 445 gl.glBegin(gl.GL_QUADS) 446 447 for stack in range(p.stacks): 448 stack_upper_frac = float(stack+1)/p.stacks 449 stack_lower_frac = float(stack)/p.stacks 450 theta_upper = stack_upper_frac * math.pi 451 theta_lower = stack_lower_frac * math.pi 452 y_upper = p.radius * math.cos( theta_upper ) 453 w_upper = p.radius * math.sin( theta_upper ) 454 y_lower = p.radius * math.cos( theta_lower ) 455 w_lower = p.radius * math.sin( theta_lower ) 456 for slice in range(p.slices): 457 slice_start_frac = float(slice)/p.slices 458 slice_stop_frac = float(slice+1)/p.slices 459 phi_start = slice_start_frac * 2 * math.pi 460 phi_stop = slice_stop_frac * 2 * math.pi 461 x_start_upper = w_upper * math.cos(phi_start) 462 x_start_lower = w_lower * math.cos(phi_start) 463 x_stop_upper = w_upper * math.cos(phi_stop) 464 x_stop_lower = w_lower * math.cos(phi_stop) 465 z_start_upper = w_upper * math.sin(phi_start) 466 z_start_lower = w_lower * math.sin(phi_start) 467 z_stop_upper = w_upper * math.sin(phi_stop) 468 z_stop_lower = w_lower * math.sin(phi_stop) 469 470 tex_l = slice_start_frac*s_gain+s_offs 471 tex_r = slice_stop_frac*s_gain+s_offs 472 tex_b = stack_lower_frac*t_gain+t_offs 473 tex_t = stack_upper_frac*t_gain+t_offs 474 475 gl.glTexCoord2f(tex_l,tex_t) 476 gl.glVertex3f(x_start_upper, y_upper, z_start_upper) 477 478 gl.glTexCoord2f(tex_r,tex_t) 479 gl.glVertex3f(x_stop_upper, y_upper, z_stop_upper) 480 481 gl.glTexCoord2f(tex_r,tex_b) 482 gl.glVertex3f(x_stop_lower, y_lower, z_stop_lower) 483 484 gl.glTexCoord2f(tex_l,tex_b) 485 gl.glVertex3f(x_start_lower, y_lower, z_start_lower) 486 487 gl.glEnd() 488 gl.glEndList() 489 self._cached_radius = p.radius 490 self._cached_slices = p.slices 491 self._cached_stacks = p.stacks
492
493 - def draw(self):
494 """Redraw the scene on every frame. 495 """ 496 p = self.parameters 497 498 if self._cached_radius != p.radius or self._cached_slices != p.slices or self._cached_stacks != p.stacks: 499 self.__rebuild_display_list() 500 501 if p.on: 502 # Set OpenGL state variables 503 gl.glEnable( gl.GL_DEPTH_TEST ) 504 gl.glEnable( gl.GL_TEXTURE_2D ) # Make sure textures are drawn 505 gl.glEnable( gl.GL_BLEND ) # Contrast control implemented through blending 506 507 # All of the contrast control stuff is somewhat arcane and 508 # not very clear from reading the code, so here is how it 509 # works in English. (Not that it makes it any more clear!) 510 # 511 # In the final "textured fragment" (before being blended 512 # to the framebuffer), the color values are equal to those 513 # of the texture (with the exception of pixels around the 514 # edges which have their amplitudes reduced due to 515 # anti-aliasing and are intermediate between the color of 516 # the texture and mid-gray), and the alpha value is set to 517 # the contrast. Blending occurs, and by choosing the 518 # appropriate values for glBlendFunc, adds the product of 519 # fragment alpha (contrast) and fragment color to the 520 # product of one minus fragment alpha (contrast) and what 521 # was already in the framebuffer. 522 523 gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) 524 525 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_DECAL) 526 527 # clear modelview matrix 528 gl.glMatrixMode(gl.GL_MODELVIEW) 529 gl.glPushMatrix() 530 gl.glColor4f(0.5,0.5,0.5,p.contrast) # Set the polygons' fragment color (implements contrast) 531 532 if not self.constant_parameters.mipmaps_enabled: 533 if p.texture_min_filter in VisionEgg.Textures.TextureStimulusBaseClass._mipmap_modes: 534 raise RuntimeError("Specified a mipmap mode in texture_min_filter, but mipmaps not enabled.") 535 self.texture_object.set_min_filter( p.texture_min_filter ) 536 self.texture_object.set_mag_filter( p.texture_mag_filter ) 537 self.texture_object.set_wrap_mode_s( p.texture_wrap_s ) 538 self.texture_object.set_wrap_mode_t( p.texture_wrap_t ) 539 540 # center the texture map 541 gl.glRotatef(p.center_azimuth,0.0,-1.0,0.0) 542 gl.glRotatef(p.center_elevation,1.0,0.0,0.0) 543 544 gl.glCallList(self.cached_display_list) 545 gl.glPopMatrix()
546
547 -class SphereGrating(VisionEgg.Gratings.LuminanceGratingCommon):
548 """Map 2D sinusoidal grating onto sphere. 549 550 Parameters 551 ========== 552 bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) 553 Inherited from VisionEgg.Gratings.LuminanceGratingCommon 554 Default: 8 555 check_texture_size -- (Boolean) 556 Default: True 557 contrast -- (Real) 558 Default: 1.0 559 grating_center_azimuth -- (Real) 560 Default: 0.0 561 grating_center_elevation -- (Real) 562 Default: 0.0 563 ignore_time -- (Boolean) 564 Default: False 565 lowpass_cutoff_cycles_per_texel -- helps prevent spatial aliasing (Real) 566 Default: 0.5 567 min_filter -- OpenGL filter enum (Integer) 568 Default: GL_LINEAR (9729) 569 num_samples -- (UnsignedInteger) 570 Default: 1024 571 on -- (Boolean) 572 Default: True 573 orientation -- (Real) 574 Default: 0.0 575 phase_at_t0 -- (Real) 576 Default: 0.0 577 radius -- (Real) 578 Default: 1.0 579 slices -- (UnsignedInteger) 580 Default: 30 581 spatial_freq_cpd -- (Real) 582 Default: 0.0277777777778 583 stacks -- (UnsignedInteger) 584 Default: 30 585 t0_time_sec_absolute -- (Real) 586 Default: (determined at runtime) 587 temporal_freq_hz -- (Real) 588 Default: 5.0 589 """ 590 591 parameters_and_defaults = { 592 'on':(True, 593 ve_types.Boolean), 594 'contrast':(1.0, 595 ve_types.Real), 596 'spatial_freq_cpd':(1.0/36.0, # cycles/degree 597 ve_types.Real), 598 'temporal_freq_hz':(5.0, # hz 599 ve_types.Real), 600 't0_time_sec_absolute':(None, 601 ve_types.Real), 602 'ignore_time':(False, # ignore temporal frequency variable - allow control purely with phase_at_t0 603 ve_types.Boolean), 604 'phase_at_t0':(0.0, # degrees 605 ve_types.Real), 606 'orientation':(0.0, # 0=right, 90=up 607 ve_types.Real), 608 'grating_center_azimuth':(0.0, # 0=right, 90=down 609 ve_types.Real), 610 'grating_center_elevation':(0.0, # 0=right, 90=down 611 ve_types.Real), 612 'check_texture_size':(True, # slows down drawing but catches errors 613 ve_types.Boolean), 614 'lowpass_cutoff_cycles_per_texel':(0.5, 615 ve_types.Real, 616 'helps prevent spatial aliasing'), 617 'min_filter':(gl.GL_LINEAR, 618 ve_types.Integer, 619 "OpenGL filter enum", 620 VisionEgg.ParameterDefinition.OPENGL_ENUM), 621 # changing this parameters causes re-drawing of the texture object and may cause frame skipping 622 'num_samples':(1024, # number of spatial samples, should be a power of 2 623 ve_types.UnsignedInteger), 624 # Changing these parameters will cause re-computation of display list (may cause frame skip) 625 'radius':(1.0, 626 ve_types.Real), 627 'slices':(30, 628 ve_types.UnsignedInteger), 629 'stacks':(30, 630 ve_types.UnsignedInteger), 631 } 632 633 __slots__ = ( 634 'texture_object_id', 635 'cached_display_list_id', 636 '_cached_num_samples', 637 '_cached_radius', 638 '_cached_slices', 639 '_cached_stacks', 640 ) 641
642 - def __init__(self,**kw):
643 VisionEgg.Gratings.LuminanceGratingCommon.__init__(self,**kw) 644 645 if self.parameters.t0_time_sec_absolute is None: 646 self.parameters.t0_time_sec_absolute = VisionEgg.time_func() 647 648 self.texture_object_id = gl.glGenTextures(1) # Allocate a new texture object 649 self.__rebuild_texture_object() 650 651 self.cached_display_list_id = gl.glGenLists(1) # Allocate a new display list 652 self.__rebuild_display_list()
653
654 - def __rebuild_texture_object(self):
655 gl.glBindTexture(gl.GL_TEXTURE_1D,self.texture_object_id) 656 p = self.parameters # shorthand 657 658 # Do error-checking on texture to make sure it will load 659 max_dim = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE) 660 if p.num_samples > max_dim: 661 raise VisionEgg.Gratings.NumSamplesTooLargeError("Grating num_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) 662 663 self.calculate_bit_depth_dependencies() 664 665 l = 0.0 666 r = 360.0 667 668 mipmap_level = 0 669 this_mipmap_level_num_samples = p.num_samples 670 while this_mipmap_level_num_samples >= 1: 671 inc = 360.0/float(this_mipmap_level_num_samples) # degrees per pixel 672 cycles_per_texel = p.spatial_freq_cpd * inc 673 if cycles_per_texel < p.lowpass_cutoff_cycles_per_texel: # sharp cutoff lowpass filter 674 # below cutoff frequency - draw sine wave 675 if p.ignore_time: 676 phase = p.phase_at_t0 677 else: 678 t_var = VisionEgg.time_func() - p.t0_time_sec_absolute 679 phase = t_var*p.temporal_freq_hz*360.0 + p.phase_at_t0 680 floating_point_sin = Numeric.sin(2.0*math.pi*p.spatial_freq_cpd*Numeric.arange(l,r,inc,'d')-(phase/180.0*math.pi))*0.5*p.contrast+0.5 681 floating_point_sin = Numeric.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 682 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() 683 else: 684 # above cutoff frequency - blank 685 texel_data = (self.max_int_val*0.5)*Numeric.ones((this_mipmap_level_num_samples,),self.numpy_dtype) 686 687 if p.check_texture_size: 688 # Because the MAX_TEXTURE_SIZE method is insensitive to the current 689 # state of the video system, another check must be done using 690 # "proxy textures". 691 gl.glTexImage1D(gl.GL_PROXY_TEXTURE_1D, # target 692 mipmap_level, # level 693 self.gl_internal_format, # video RAM internal format: RGB 694 this_mipmap_level_num_samples, # width 695 0, # border 696 self.format, # format of image data 697 self.gl_type, # type of image data 698 texel_data) # texel data 699 if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_1D,0,gl.GL_TEXTURE_WIDTH) == 0: 700 raise NumSamplesTooLargeError("Grating num_samples is too wide for your video system!") 701 702 # If we got here, it worked and we can load the texture for real. 703 gl.glTexImage1D(gl.GL_TEXTURE_1D, # target 704 mipmap_level, # level 705 self.gl_internal_format, # video RAM internal format: RGB 706 this_mipmap_level_num_samples, # width 707 0, # border 708 self.format, # format of image data 709 self.gl_type, # type of image data 710 texel_data) # texel data 711 712 # prepare for next mipmap level 713 this_mipmap_level_num_samples = this_mipmap_level_num_samples/2 # integer division 714 mipmap_level += 1 715 716 # Set some texture object defaults 717 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_S,gl.GL_REPEAT) 718 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_T,gl.GL_REPEAT) 719 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MAG_FILTER,gl.GL_LINEAR) 720 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MIN_FILTER,p.min_filter) 721 self._cached_num_samples = p.num_samples
722
723 - def __rebuild_display_list(self):
724 gl.glNewList(self.cached_display_list_id,gl.GL_COMPILE) 725 726 p = self.parameters 727 gl.glBegin(gl.GL_QUADS) 728 729 for stack in range(p.stacks): 730 stack_upper_frac = float(stack+1)/p.stacks 731 stack_lower_frac = float(stack)/p.stacks 732 theta_upper = stack_upper_frac * math.pi 733 theta_lower = stack_lower_frac * math.pi 734 y_upper = p.radius * math.cos( theta_upper ) 735 w_upper = p.radius * math.sin( theta_upper ) 736 y_lower = p.radius * math.cos( theta_lower ) 737 w_lower = p.radius * math.sin( theta_lower ) 738 for slice in range(p.slices): 739 slice_start_frac = float(slice)/p.slices 740 slice_stop_frac = float(slice+1)/p.slices 741 phi_start = slice_start_frac * 2 * math.pi 742 phi_stop = slice_stop_frac * 2 * math.pi 743 x_start_upper = w_upper * math.cos(phi_start) 744 x_start_lower = w_lower * math.cos(phi_start) 745 x_stop_upper = w_upper * math.cos(phi_stop) 746 x_stop_lower = w_lower * math.cos(phi_stop) 747 z_start_upper = w_upper * math.sin(phi_start) 748 z_start_lower = w_lower * math.sin(phi_start) 749 z_stop_upper = w_upper * math.sin(phi_stop) 750 z_stop_lower = w_lower * math.sin(phi_stop) 751 752 tex_l = slice_start_frac 753 tex_r = slice_stop_frac 754 tex_b = 0.0#stack_lower_frac 755 tex_t = 1.0#stack_upper_frac 756 757 gl.glTexCoord2f(tex_l,tex_t) 758 gl.glVertex3f(x_start_upper, y_upper, z_start_upper) 759 760 gl.glTexCoord2f(tex_r,tex_t) 761 gl.glVertex3f(x_stop_upper, y_upper, z_stop_upper) 762 763 gl.glTexCoord2f(tex_r,tex_b) 764 gl.glVertex3f(x_stop_lower, y_lower, z_stop_lower) 765 766 gl.glTexCoord2f(tex_l,tex_b) 767 gl.glVertex3f(x_start_lower, y_lower, z_start_lower) 768 769 gl.glEnd() 770 gl.glEndList() 771 self._cached_radius = p.radius 772 self._cached_slices = p.slices 773 self._cached_stacks = p.stacks
774
775 - def draw(self):
776 """Redraw the scene on every frame. 777 """ 778 p = self.parameters 779 780 if self._cached_radius != p.radius or self._cached_slices != p.slices or self._cached_stacks != p.stacks: 781 self.__rebuild_display_list() 782 783 if self._cached_num_samples != p.num_samples: 784 self.__rebuild_texture_object() 785 786 if p.on: 787 if p.bit_depth != self.cached_bit_depth: 788 self.calculate_bit_depth_dependencies() 789 # Set OpenGL state variables 790 gl.glEnable( gl.GL_DEPTH_TEST ) 791 gl.glEnable( gl.GL_TEXTURE_1D ) # Make sure textures are drawn 792 gl.glDisable( gl.GL_TEXTURE_2D ) 793 gl.glDisable( gl.GL_BLEND ) 794 795 gl.glBindTexture(gl.GL_TEXTURE_1D,self.texture_object_id) 796 gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MIN_FILTER,p.min_filter) 797 798 l = 0.0 799 r = 360.0 800 801 mipmap_level = 0 802 this_mipmap_level_num_samples = p.num_samples 803 while this_mipmap_level_num_samples >= 1: 804 inc = 360.0/float(this_mipmap_level_num_samples)# degrees per pixel 805 cycles_per_texel = p.spatial_freq_cpd * inc 806 if cycles_per_texel < p.lowpass_cutoff_cycles_per_texel: # sharp cutoff lowpass filter 807 if p.ignore_time: 808 phase = p.phase_at_t0 809 else: 810 t_var = VisionEgg.time_func() - p.t0_time_sec_absolute 811 phase = t_var*p.temporal_freq_hz*360.0 + p.phase_at_t0 812 floating_point_sin = Numeric.sin(2.0*math.pi*p.spatial_freq_cpd*Numeric.arange(l,r,inc,'d')-(phase/180.0*math.pi))*0.5*p.contrast+0.5 813 floating_point_sin = Numeric.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 814 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() 815 else: 816 blank = 0.5*Numeric.ones((this_mipmap_level_num_samples,),'d') 817 texel_data = (blank*self.max_int_val).astype(self.numpy_dtype).tostring() 818 819 gl.glTexSubImage1D(gl.GL_TEXTURE_1D, # target 820 mipmap_level, # level 821 0, # x offset 822 this_mipmap_level_num_samples, # width 823 self.format, # data format 824 self.gl_type, # data type 825 texel_data) 826 827 # prepare for next mipmap level 828 this_mipmap_level_num_samples = this_mipmap_level_num_samples/2 # integer division 829 mipmap_level += 1 830 831 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_REPLACE) 832 833 # clear modelview matrix 834 gl.glMatrixMode(gl.GL_MODELVIEW) 835 gl.glPushMatrix() 836 # center the grating 837 gl.glRotatef(p.grating_center_azimuth,0.0,-1.0,0.0) 838 gl.glRotatef(p.grating_center_elevation,1.0,0.0,0.0) 839 840 # do the orientation 841 gl.glRotatef(p.orientation,0.0,0.0,1.0) 842 843 gl.glCallList(self.cached_display_list_id) 844 845 gl.glDisable( gl.GL_TEXTURE_1D ) 846 gl.glPopMatrix()
847
848 -class SphereWindow(VisionEgg.Gratings.LuminanceGratingCommon):
849 """This draws an opaque sphere with a single window in it. 850 851 This is useful when you need to have a viewport on a 3D scene. 852 853 Parameters 854 ========== 855 bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) 856 Inherited from VisionEgg.Gratings.LuminanceGratingCommon 857 Default: 8 858 num_s_samples -- (UnsignedInteger) 859 Default: 512 860 num_t_samples -- (UnsignedInteger) 861 Default: 512 862 on -- (Boolean) 863 Default: True 864 opaque_color -- (Sequence4 of Real) 865 Default: (0.5, 0.5, 0.5, 0.0) 866 radius -- (Real) 867 Default: 1.0 868 slices -- (UnsignedInteger) 869 Default: 30 870 stacks -- (UnsignedInteger) 871 Default: 30 872 window_center_azimuth -- (Real) 873 Default: 0.0 874 window_center_elevation -- (Real) 875 Default: 0.0 876 window_shape -- can be 'circle', 'gaussian', or 'lat-long rectangle' (String) 877 Default: gaussian 878 window_shape_parameter2 -- (currently only used for) height of lat-long rectangle (in degrees) (Real) 879 Default: 30.0 880 window_shape_radius_parameter -- radius of circle, sigma of gaussian, width of lat-long rectangle (in degrees) (Real) 881 Default: 36.0 882 """ 883 884 parameters_and_defaults = { 885 'on':(True, 886 ve_types.Boolean), 887 'window_center_elevation':(0.0, 888 ve_types.Real), 889 'window_center_azimuth':(0.0, 890 ve_types.Real), 891 'opaque_color':((0.5,0.5,0.5,0.0), 892 ve_types.Sequence4(ve_types.Real)), 893 # changing these parameters causes re-drawing of the texture object and may cause frame skipping 894 'window_shape':('gaussian', # can be 'circle' or 'gaussian' 895 ve_types.String, 896 "can be 'circle', 'gaussian', or 'lat-long rectangle'", 897 ), 898 'window_shape_radius_parameter':(36.0, 899 ve_types.Real, 900 'radius of circle, sigma of gaussian, width of lat-long rectangle (in degrees)', 901 ), 902 'window_shape_parameter2':(30.0, 903 ve_types.Real, 904 '(currently only used for) height of lat-long rectangle (in degrees)', 905 ), 906 'num_s_samples':(512, # number of horizontal spatial samples, should be a power of 2 907 ve_types.UnsignedInteger), 908 'num_t_samples':(512, # number of vertical spatial samples, should be a power of 2 909 ve_types.UnsignedInteger), 910 # Changing these parameters will cause re-computation of display list (may cause frame skip) 911 'radius':(1.0, # XXX could modify code below to use scaling, thus avoiding need for recomputation 912 ve_types.Real), 913 'slices':(30, 914 ve_types.UnsignedInteger), 915 'stacks':(30, 916 ve_types.UnsignedInteger), 917 } 918 919 __slots__ = ( 920 'texture_object_id', 921 'windowed_display_list_id', 922 'opaque_display_list_id', 923 '_cached_window_shape', 924 '_cached_shape_radius_parameter', 925 '_cached_shape_parameter2', 926 '_cached_num_s_samples', 927 '_cached_num_t_samples', 928 '_cached_radius', 929 '_cached_slices', 930 '_cached_stacks', 931 '_texture_s_is_azimuth', 932 ) 933
934 - def __init__(self, **kw):
935 VisionEgg.Gratings.LuminanceGratingCommon.__init__(self, **kw ) 936 937 p = self.parameters 938 939 # set self._texture_s_is_azimuth in advance 940 if p.window_shape == 'lat-long rectangle': 941 self._texture_s_is_azimuth = True 942 else: 943 self._texture_s_is_azimuth = False 944 945 self.texture_object_id = gl.glGenTextures(1) 946 self.__rebuild_texture_object() 947 948 self.windowed_display_list_id = gl.glGenLists(1) # Allocate a new display list 949 self.opaque_display_list_id = gl.glGenLists(1) # Allocate a new display list 950 self.__rebuild_display_lists()
951
952 - def __rebuild_texture_object(self):
953 gl.glBindTexture(gl.GL_TEXTURE_2D,self.texture_object_id) 954 p = self.parameters 955 956 # Do error-checking on texture to make sure it will load 957 max_dim = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE) 958 if p.num_s_samples > max_dim: 959 raise VisionEgg.Gratings.NumSamplesTooLargeError("SphereWindow num_s_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) 960 if p.num_t_samples > max_dim: 961 raise VisionEgg.Gratings.NumSamplesTooLargeError("SphereWindow num_t_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) 962 963 self.calculate_bit_depth_dependencies() 964 self.gl_internal_format = gl.GL_ALPHA # change from luminance to alpha 965 self.format = gl.GL_ALPHA 966 967 # texture coordinates are Mercator: (determined when building display list) 968 # s: x within sphere 969 # t: z within sphere 970 971 if p.window_shape == 'circle': 972 if self._texture_s_is_azimuth: 973 self.__rebuild_display_lists() 974 975 # XXX this is aliased 976 s_axis = (Numeric.arange(p.num_s_samples)/float(p.num_s_samples)-0.5)**2 977 t_axis = (Numeric.arange(p.num_t_samples)/float(p.num_t_samples)-0.5)**2 978 mask = s_axis[Numeric.NewAxis,:] + t_axis[:,Numeric.NewAxis] 979 angle_deg = min(180,p.window_shape_radius_parameter) # clip angle 980 cartesian_radius = 0.5*math.sin(p.window_shape_radius_parameter/180.0*math.pi) 981 floating_point_window = Numeric.less(mask,cartesian_radius**2) 982 elif p.window_shape == 'gaussian': 983 if self._texture_s_is_azimuth: 984 self.__rebuild_display_lists() 985 986 MIN_EXP = -745.0 987 MAX_EXP = 709.0 988 989 s = Numeric.arange(0.0,p.num_s_samples,1.0,'f')/p.num_s_samples 990 t = Numeric.arange(0.0,p.num_t_samples,1.0,'f')/p.num_t_samples 991 sigma_normalized = p.window_shape_radius_parameter / 90.0 * 0.5 992 993 check_s = -((s-0.5)**2/(2.0*sigma_normalized**2)) 994 try: 995 # some platforms raise OverflowError when doing this on small numbers 996 val_s = Numeric.exp( check_s ) 997 except OverflowError: 998 check_s = Numeric.clip(check_s,MIN_EXP,MAX_EXP) 999 val_s = Numeric.exp( check_s ) 1000 1001 check_t = -((t-0.5)**2/(2.0*sigma_normalized**2)) 1002 try: 1003 val_t = Numeric.exp( check_t ) 1004 except OverflowError: 1005 check_t = Numeric.clip(check_t,MIN_EXP,MAX_EXP) 1006 val_t = Numeric.exp( check_t ) 1007 floating_point_window = Numeric.outerproduct(val_t,val_s) 1008 elif p.window_shape == 'lat-long rectangle': 1009 if not self._texture_s_is_azimuth: 1010 self.__rebuild_display_lists() 1011 1012 # s coordinate represents -90 to +90 degrees (azimuth). 1013 s_axis = (Numeric.arange(p.num_s_samples)/float(p.num_s_samples)-0.5)*180 1014 s_axis = Numeric.less( abs(s_axis), p.window_shape_radius_parameter*0.5 ) 1015 1016 # t coordinate represents height. 1017 # Convert angle to height. 1018 angle_deg = min(90,p.window_shape_parameter2*0.5) # clip angle 1019 desired_height = math.sin(angle_deg/180.0*math.pi)*0.5 1020 t_axis = Numeric.arange(p.num_t_samples)/float(p.num_t_samples)-0.5 1021 t_axis = Numeric.less(abs(t_axis),desired_height) 1022 floating_point_window = Numeric.outerproduct(t_axis,s_axis) 1023 else: 1024 raise RuntimeError('Unknown window_shape "%s"'%(p.window_shape,)) 1025 texel_data = (floating_point_window * self.max_int_val).astype(self.numpy_dtype).tostring() 1026 1027 # Because the MAX_TEXTURE_SIZE method is insensitive to the current 1028 # state of the video system, another check must be done using 1029 # "proxy textures". 1030 gl.glTexImage2D(gl.GL_PROXY_TEXTURE_2D, # target 1031 0, # mipmap_level 1032 self.gl_internal_format, # video RAM internal format 1033 p.num_s_samples, # width 1034 p.num_t_samples, # height 1035 0, # border 1036 self.format, # format of image data 1037 self.gl_type, # type of image data 1038 texel_data) # texel data 1039 if (gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_2D, # Need PyOpenGL >= 2.0 1040 0, 1041 gl.GL_TEXTURE_WIDTH) == 0) or ( 1042 gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_2D, 1043 0, 1044 gl.GL_TEXTURE_HEIGHT) == 0): 1045 raise VisionEgg.Gratings.NumSamplesTooLargeError("SphereWindow num_s_samples or num_t_samples is too large for your video system!") 1046 1047 gl.glTexImage2D(gl.GL_TEXTURE_2D, # target 1048 0, # mipmap_level 1049 self.gl_internal_format, # video RAM internal format 1050 p.num_s_samples, # width 1051 p.num_t_samples, # height 1052 0, # border 1053 self.format, # format of image data 1054 self.gl_type, # type of image data 1055 texel_data) # texel data 1056 1057 # Set some texture object defaults 1058 gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_WRAP_S,gl.GL_CLAMP_TO_EDGE) 1059 gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_WRAP_T,gl.GL_CLAMP_TO_EDGE) 1060 gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_MAG_FILTER,gl.GL_LINEAR) 1061 gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_MIN_FILTER,gl.GL_LINEAR) 1062 1063 self._cached_window_shape = p.window_shape 1064 self._cached_shape_radius_parameter = p.window_shape_radius_parameter 1065 self._cached_shape_parameter2 = p.window_shape_parameter2 1066 self._cached_num_s_samples = p.num_s_samples 1067 self._cached_num_t_samples = p.num_t_samples
1068
1069 - def __rebuild_display_lists(self):
1070 gl.glMatrixMode(gl.GL_MODELVIEW) 1071 gl.glPushMatrix() 1072 1073 p = self.parameters 1074 1075 if p.window_shape == 'lat-long rectangle': 1076 self._texture_s_is_azimuth = True 1077 else: 1078 self._texture_s_is_azimuth = False 1079 1080 gl.glNewList(self.windowed_display_list_id,gl.GL_COMPILE) 1081 1082 gl.glBegin(gl.GL_QUADS) 1083 1084 for stack in range(p.stacks): 1085 stack_upper_frac = float(stack+1)/p.stacks 1086 stack_lower_frac = float(stack)/p.stacks 1087 theta_upper = stack_upper_frac * math.pi 1088 theta_lower = stack_lower_frac * math.pi 1089 y_upper = p.radius * math.cos( theta_upper ) 1090 w_upper = p.radius * math.sin( theta_upper ) 1091 y_lower = p.radius * math.cos( theta_lower ) 1092 w_lower = p.radius * math.sin( theta_lower ) 1093 for slice in range(p.slices/2,p.slices): # only do half of sphere (other half has no window) 1094 slice_start_frac = float(slice)/p.slices 1095 slice_stop_frac = float(slice+1)/p.slices 1096 phi_start = slice_start_frac * 2 * math.pi 1097 phi_stop = slice_stop_frac * 2 * math.pi 1098 x_start_upper = w_upper * math.cos(phi_start) 1099 x_start_lower = w_lower * math.cos(phi_start) 1100 x_stop_upper = w_upper * math.cos(phi_stop) 1101 x_stop_lower = w_lower * math.cos(phi_stop) 1102 z_start_upper = w_upper * math.sin(phi_start) 1103 z_start_lower = w_lower * math.sin(phi_start) 1104 z_stop_upper = w_upper * math.sin(phi_stop) 1105 z_stop_lower = w_lower * math.sin(phi_stop) 1106 1107 o = 0.5 1108 g = 0.5 / p.radius 1109 1110 if self._texture_s_is_azimuth: 1111 tex_s_start = slice_start_frac*2-1 1112 tex_s_stop = slice_stop_frac*2-1 1113 else: 1114 tex_s_start = x_start_upper*g+o 1115 tex_s_stop = x_stop_upper*g+o 1116 1117 gl.glTexCoord2f(tex_s_start,y_upper*g+o) 1118 gl.glVertex3f(x_start_upper, y_upper, z_start_upper) 1119 1120 gl.glTexCoord2f(tex_s_stop,y_upper*g+o) 1121 gl.glVertex3f(x_stop_upper, y_upper, z_stop_upper) 1122 1123 gl.glTexCoord2f(tex_s_stop,y_lower*g+o) 1124 gl.glVertex3f(x_stop_lower, y_lower, z_stop_lower) 1125 1126 gl.glTexCoord2f(tex_s_start,y_lower*g+o) 1127 gl.glVertex3f(x_start_lower, y_lower, z_start_lower) 1128 1129 gl.glEnd() 1130 gl.glEndList() 1131 1132 gl.glNewList(self.opaque_display_list_id,gl.GL_COMPILE) 1133 1134 gl.glBegin(gl.GL_QUADS) 1135 1136 for stack in range(p.stacks): 1137 stack_upper_frac = float(stack+1)/p.stacks 1138 stack_lower_frac = float(stack)/p.stacks 1139 theta_upper = stack_upper_frac * math.pi 1140 theta_lower = stack_lower_frac * math.pi 1141 y_upper = p.radius * math.cos( theta_upper ) 1142 w_upper = p.radius * math.sin( theta_upper ) 1143 y_lower = p.radius * math.cos( theta_lower ) 1144 w_lower = p.radius * math.sin( theta_lower ) 1145 for slice in range(p.slices/2): # half of sphere with no window 1146 slice_start_frac = float(slice)/p.slices 1147 slice_stop_frac = float(slice+1)/p.slices 1148 phi_start = slice_start_frac * 2 * math.pi 1149 phi_stop = slice_stop_frac * 2 * math.pi 1150 x_start_upper = w_upper * math.cos(phi_start) 1151 x_start_lower = w_lower * math.cos(phi_start) 1152 x_stop_upper = w_upper * math.cos(phi_stop) 1153 x_stop_lower = w_lower * math.cos(phi_stop) 1154 z_start_upper = w_upper * math.sin(phi_start) 1155 z_start_lower = w_lower * math.sin(phi_start) 1156 z_stop_upper = w_upper * math.sin(phi_stop) 1157 z_stop_lower = w_lower * math.sin(phi_stop) 1158 1159 gl.glVertex3f(x_start_upper, y_upper, z_start_upper) 1160 1161 gl.glVertex3f(x_stop_upper, y_upper, z_stop_upper) 1162 1163 gl.glVertex3f(x_stop_lower, y_lower, z_stop_lower) 1164 1165 gl.glVertex3f(x_start_lower, y_lower, z_start_lower) 1166 1167 gl.glEnd() 1168 gl.glEndList() 1169 self._cached_radius = p.radius 1170 self._cached_slices = p.slices 1171 self._cached_stacks = p.stacks 1172 gl.glPopMatrix()
1173
1174 - def draw(self):
1175 """Redraw the scene on every frame. 1176 """ 1177 p = self.parameters 1178 1179 if self._cached_radius != p.radius or self._cached_slices != p.slices or self._cached_stacks != p.stacks: 1180 self.__rebuild_display_lists() 1181 1182 if self._cached_window_shape != p.window_shape or self._cached_shape_radius_parameter != p.window_shape_radius_parameter: 1183 self.__rebuild_texture_object() 1184 1185 if p.window_shape == 'lat-long rectangle' and self._cached_shape_parameter2 != p.window_shape_parameter2: 1186 self.__rebuild_texture_object() 1187 1188 if self._cached_num_s_samples != p.num_s_samples or self._cached_num_t_samples != p.num_t_samples: 1189 self.__rebuild_texture_object() 1190 1191 if p.on: 1192 #gl.glPolygonMode( gl.GL_FRONT_AND_BACK, gl.GL_LINE ) 1193 if p.bit_depth != self.cached_bit_depth: 1194 self.calculate_bit_depth_dependencies() 1195 self.gl_internal_format = gl.GL_ALPHA # change from luminance to alpha 1196 self.format = gl.GL_ALPHA 1197 # Set OpenGL state variables 1198 gl.glEnable( gl.GL_DEPTH_TEST ) 1199 gl.glEnable( gl.GL_TEXTURE_2D ) 1200 gl.glEnable( gl.GL_BLEND ) 1201 1202 gl.glBlendFunc( gl.GL_ONE_MINUS_SRC_ALPHA, gl.GL_SRC_ALPHA ) # alpha 1.0 = transparent 1203 1204 gl.glBindTexture(gl.GL_TEXTURE_2D,self.texture_object_id) 1205 gl.glColor4f( *p.opaque_color ) 1206 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_REPLACE) 1207 1208 # clear modelview matrix 1209 gl.glMatrixMode(gl.GL_MODELVIEW) 1210 gl.glPushMatrix() 1211 1212 # do the window position 1213 gl.glRotatef(p.window_center_azimuth,0.0,-1.0,0.0) 1214 gl.glRotatef(p.window_center_elevation,1.0,0.0,0.0) 1215 1216 gl.glCallList(self.windowed_display_list_id) 1217 gl.glCallList(self.opaque_display_list_id) 1218 gl.glPopMatrix()
1219

visionegg-1.2.1/doc/reference/html/VisionEgg.SphereMap.AzElGrid-class.html0000644000076500000240000004350311224565531025557 0ustar astrawstaff VisionEgg.SphereMap.AzElGrid
Package VisionEgg :: Module SphereMap :: Class AzElGrid
[frames] | no frames]

Class AzElGrid

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         AzElGrid

Spherical grid of iso-azimuth and iso-elevation lines.

Parameters
==========
anti_aliasing    -- (Boolean)
                    Default: True
center_azimuth   -- (Real)
                    Default: 0.0
center_elevation -- (Real)
                    Default: 0.0
major_line_color -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                    Default: (0.0, 0.0, 0.0)
major_line_width -- (Real)
                    Default: 2.0
minor_line_color -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                    Default: (0.0, 0.0, 1.0)
minor_line_width -- (Real)
                    Default: 1.0
my_viewport      -- (Instance of <class 'VisionEgg.Core.Viewport'>)
                    Default: (determined at runtime)
on               -- (Boolean)
                    Default: True
text_offset      -- (Sequence2 of Real)
                    Default: (3, -2)

Constant Parameters
===================
az_major_spacing       -- (Real)
                          Default: 30.0
az_minor_spacing       -- (Real)
                          Default: 10.0
el_major_spacing       -- (Real)
                          Default: 30.0
el_minor_spacing       -- (Real)
                          Default: 10.0
font_size              -- (UnsignedInteger)
                          Default: 24
num_samples_per_circle -- (UnsignedInteger)
                          Default: 100
radius                 -- (Real)
                          Default: 1.0
text_anchor            -- (String)
                          Default: lowerleft
text_color             -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                          Default: (0.0, 0.0, 0.0)
use_text               -- (Boolean)
                          Default: True



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'cen...
  constant_parameters_and_defaults = {'use_text':(True, ve_types...

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'center_azimuth':(0.0, ve_types.Real),\
 'center_elevation':(0.0, ve_types.Real), 'minor_line_width':(1.0, ve_\
types.Real), 'major_line_width':(2.0, ve_types.Real), 'minor_line_colo\
r':((0.0, 0.0, 1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real),\
 ve_types.Sequence4(ve_types.Real))), 'major_line_color':((0.0, 0.0, 0\
.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequen\
ce4(ve_types.Real))), 'my_viewport':(None, ve_types.Instance(VisionEgg\
.Core.Viewport)), 'text_offset':((3,-2), ve_types.Sequence2(ve_types.R\
...

constant_parameters_and_defaults

Value:
{'use_text':(True, ve_types.Boolean), 'radius':(1.0, ve_types.Real), '\
az_minor_spacing':(10.0, ve_types.Real), 'az_major_spacing':(30.0, ve_\
types.Real), 'el_minor_spacing':(10.0, ve_types.Real), 'el_major_spaci\
ng':(30.0, ve_types.Real), 'num_samples_per_circle':(100, ve_types.Uns\
ignedInteger), 'font_size':(24, ve_types.UnsignedInteger), 'text_color\
':((0.0, 0.0, 0.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), \
ve_types.Sequence4(ve_types.Real))), 'text_anchor':('lowerleft', ve_ty\
pes.String),}

visionegg-1.2.1/doc/reference/html/VisionEgg.SphereMap.SphereGrating-class.html0000644000076500000240000004054011224565531026656 0ustar astrawstaff VisionEgg.SphereMap.SphereGrating
Package VisionEgg :: Module SphereMap :: Class SphereGrating
[frames] | no frames]

Class SphereGrating

source code

             object --+            
                      |            
    ClassWithParameters --+        
                          |        
              Core.Stimulus --+    
                              |    
Gratings.LuminanceGratingCommon --+
                                  |
                                 SphereGrating

Map 2D sinusoidal grating onto sphere.

Parameters
==========
bit_depth                       -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger)
                                   Inherited from VisionEgg.Gratings.LuminanceGratingCommon
                                   Default: 8
check_texture_size              -- (Boolean)
                                   Default: True
contrast                        -- (Real)
                                   Default: 1.0
grating_center_azimuth          -- (Real)
                                   Default: 0.0
grating_center_elevation        -- (Real)
                                   Default: 0.0
ignore_time                     -- (Boolean)
                                   Default: False
lowpass_cutoff_cycles_per_texel -- helps prevent spatial aliasing (Real)
                                   Default: 0.5
min_filter                      -- OpenGL filter enum (Integer)
                                   Default: GL_LINEAR (9729)
num_samples                     -- (UnsignedInteger)
                                   Default: 1024
on                              -- (Boolean)
                                   Default: True
orientation                     -- (Real)
                                   Default: 0.0
phase_at_t0                     -- (Real)
                                   Default: 0.0
radius                          -- (Real)
                                   Default: 1.0
slices                          -- (UnsignedInteger)
                                   Default: 30
spatial_freq_cpd                -- (Real)
                                   Default: 0.0277777777778
stacks                          -- (UnsignedInteger)
                                   Default: 30
t0_time_sec_absolute            -- (Real)
                                   Default: (determined at runtime)
temporal_freq_hz                -- (Real)
                                   Default: 5.0



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Redraw the scene on every frame.
source code

Inherited from Gratings.LuminanceGratingCommon: calculate_bit_depth_dependencies

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'con...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Redraw the scene on every frame.
        

Overrides: Core.Stimulus.draw

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'contrast':(1.0, ve_types.Real), 'spat\
ial_freq_cpd':(1.0/ 36.0, ve_types.Real), 'temporal_freq_hz':(5.0, ve_\
types.Real), 't0_time_sec_absolute':(None, ve_types.Real), 'ignore_tim\
e':(False, ve_types.Boolean), 'phase_at_t0':(0.0, ve_types.Real), 'ori\
entation':(0.0, ve_types.Real), 'grating_center_azimuth':(0.0, ve_type\
s.Real), 'grating_center_elevation':(0.0, ve_types.Real), 'check_textu\
re_size':(True, ve_types.Boolean), 'lowpass_cutoff_cycles_per_texel':(\
0.5, ve_types.Real, 'helps prevent spatial aliasing'), 'min_filter':(g\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.SphereMap.SphereMap-class.html0000644000076500000240000003557611224565531026015 0ustar astrawstaff VisionEgg.SphereMap.SphereMap
Package VisionEgg :: Module SphereMap :: Class SphereMap
[frames] | no frames]

Class SphereMap

source code

               object --+            
                        |            
      ClassWithParameters --+        
                            |        
                Core.Stimulus --+    
                                |    
Textures.TextureStimulusBaseClass --+
                                    |
                                   SphereMap

Mercator mapping of rectangular texture onto sphere.

Parameters
==========
center_azimuth     -- (Real)
                      Default: 0.0
center_elevation   -- (Real)
                      Default: 0.0
contrast           -- (Real)
                      Default: 1.0
on                 -- (Boolean)
                      Default: True
radius             -- (Real)
                      Default: 1.0
slices             -- (UnsignedInteger)
                      Default: 30
stacks             -- (UnsignedInteger)
                      Default: 30
texture            -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>)
                      Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                      Default: (determined at runtime)
texture_mag_filter -- OpenGL filter enum (Integer)
                      Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                      Default: GL_LINEAR (9729)
texture_min_filter -- OpenGL filter enum (Integer)
                      Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)
texture_wrap_s     -- OpenGL texture wrap enum (Integer)
                      Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)
texture_wrap_t     -- OpenGL texture wrap enum (Integer)
                      Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)

Constant Parameters
===================
internal_format   -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer)
                     Default: GL_RGB (6407)
mipmaps_enabled   -- Are mipmaps enabled? (Boolean)
                     Default: True
shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean)
                     Default: False



Instance Methods
 
__init__(self, **kw) source code
 
draw(self)
Redraw the scene on every frame.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'con...

Inherited from Textures.TextureStimulusBaseClass: constant_parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Overrides: Textures.TextureStimulusBaseClass.__init__

draw(self)

source code 
Redraw the scene on every frame.
        

Overrides: Core.Stimulus.draw

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'contrast':(1.0, ve_types.Real), 'cent\
er_azimuth':(0.0, ve_types.Real), 'center_elevation':(0.0, ve_types.Re\
al), 'radius':(1.0, ve_types.Real), 'slices':(30, ve_types.UnsignedInt\
eger), 'stacks':(30, ve_types.UnsignedInteger)}

visionegg-1.2.1/doc/reference/html/VisionEgg.SphereMap.SphereWindow-class.html0000644000076500000240000004011511224565531026530 0ustar astrawstaff VisionEgg.SphereMap.SphereWindow
Package VisionEgg :: Module SphereMap :: Class SphereWindow
[frames] | no frames]

Class SphereWindow

source code

             object --+            
                      |            
    ClassWithParameters --+        
                          |        
              Core.Stimulus --+    
                              |    
Gratings.LuminanceGratingCommon --+
                                  |
                                 SphereWindow

This draws an opaque sphere with a single window in it.

This is useful when you need to have a viewport on a 3D scene.

Parameters
==========
bit_depth                     -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger)
                                 Inherited from VisionEgg.Gratings.LuminanceGratingCommon
                                 Default: 8
num_s_samples                 -- (UnsignedInteger)
                                 Default: 512
num_t_samples                 -- (UnsignedInteger)
                                 Default: 512
on                            -- (Boolean)
                                 Default: True
opaque_color                  -- (Sequence4 of Real)
                                 Default: (0.5, 0.5, 0.5, 0.0)
radius                        -- (Real)
                                 Default: 1.0
slices                        -- (UnsignedInteger)
                                 Default: 30
stacks                        -- (UnsignedInteger)
                                 Default: 30
window_center_azimuth         -- (Real)
                                 Default: 0.0
window_center_elevation       -- (Real)
                                 Default: 0.0
window_shape                  -- can be 'circle', 'gaussian', or 'lat-long rectangle' (String)
                                 Default: gaussian
window_shape_parameter2       -- (currently only used for) height of lat-long rectangle (in degrees) (Real)
                                 Default: 30.0
window_shape_radius_parameter -- radius of circle, sigma of gaussian, width of lat-long rectangle (in degrees) (Real)
                                 Default: 36.0



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Redraw the scene on every frame.
source code

Inherited from Gratings.LuminanceGratingCommon: calculate_bit_depth_dependencies

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'win...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Redraw the scene on every frame.
        

Overrides: Core.Stimulus.draw

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'window_center_elevation':(0.0, ve_typ\
es.Real), 'window_center_azimuth':(0.0, ve_types.Real), 'opaque_color'\
:((0.5, 0.5, 0.5, 0.0), ve_types.Sequence4(ve_types.Real)), 'window_sh\
ape':('gaussian', ve_types.String, "can be 'circle', 'gaussian', or 'l\
at-long rectangle'",), 'window_shape_radius_parameter':(36.0, ve_types\
.Real, 'radius of circle, sigma of gaussian, width of lat-long rectang\
le (in degrees)',), 'window_shape_parameter2':(30.0, ve_types.Real, '(\
currently only used for) height of lat-long rectangle (in degrees)',),\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.TCPController-module.html0000644000076500000240000002050111224565531025076 0ustar astrawstaff VisionEgg.TCPController
Package VisionEgg :: Module TCPController
[frames] | no frames]

Module TCPController

source code


Allows control of parameter values over the network.

Don't use for realtime control unless you think your network is that
fast and reliable. Also, this code has not been optimized for speed,
and I think it is unwise to attempt to change the value of controllers
in realtime.  In other words, do not design an experiment where, on a
remote computer, you have determined that a certain amount of time has
passed, and you require a certain new controller value NOW.  In this
case, it would be better to use parameter=eval_str() with an if
statement involving time.

To control parameters over a network, start a server with an instance
of TCPServer.  The server spawns an instance of SocketListenController
for each connected socket.  (Most commonly you will only want
connection over a single socket.)  The instance of
SocketListenController handles all communication for that connection
and serves as a container and (meta) controller for instances of
TCPController.

This module contains ABSOLUTELY NO SECURITY FEATURES, and could easily
allow arbitrary execution of code on your computer. For this reason,
if you use this module, I recommend operating behind a firewall. This
could be an inexpensive "routing switch" used for cable modems, which
would provide the added benefit that your local network would be
isolated.  This would elimate all traffic not to or from computers on
the switch and therefore reduce/eliminate packet collisions, decrease
latency, and providing a network performance and reliability. To
address security concerns, you could also write code that implements
IP address checking or other security features.




Author: Andrew Straw <astraw@users.sourceforge.net>

Classes
  TCPServer
TCP server creates SocketListenController upon connection.
  SocketListenController
Handle connection from remote machine, control TCPControllers.
  TCPController
Control a parameter from a network (TCP) connection.
Variables
  __version__ = VisionEgg.release_name
  __cvs__ = '$Revision$'.split() [1]
  __date__ = ' '.join('$Date$'.split() [1: 3])
visionegg-1.2.1/doc/reference/html/VisionEgg.TCPController-pysrc.html0000644000076500000240000112420111224565531024754 0ustar astrawstaff VisionEgg.TCPController
Package VisionEgg :: Module TCPController
[frames] | no frames]

Source Code for Module VisionEgg.TCPController

  1  # The Vision Egg: TCPController 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Author: Andrew Straw <astraw@users.sourceforge.net> 
  5  # URL: <http://www.visionegg.org/> 
  6  # 
  7  # Distributed under the terms of the GNU Lesser General Public License 
  8  # (LGPL). See LICENSE.TXT that came with this file. 
  9  # 
 10  # $Id$ 
 11   
 12  """ 
 13  Allows control of parameter values over the network. 
 14   
 15  Don't use for realtime control unless you think your network is that 
 16  fast and reliable. Also, this code has not been optimized for speed, 
 17  and I think it is unwise to attempt to change the value of controllers 
 18  in realtime.  In other words, do not design an experiment where, on a 
 19  remote computer, you have determined that a certain amount of time has 
 20  passed, and you require a certain new controller value NOW.  In this 
 21  case, it would be better to use parameter=eval_str() with an if 
 22  statement involving time. 
 23   
 24  To control parameters over a network, start a server with an instance 
 25  of TCPServer.  The server spawns an instance of SocketListenController 
 26  for each connected socket.  (Most commonly you will only want 
 27  connection over a single socket.)  The instance of 
 28  SocketListenController handles all communication for that connection 
 29  and serves as a container and (meta) controller for instances of 
 30  TCPController. 
 31   
 32  This module contains ABSOLUTELY NO SECURITY FEATURES, and could easily 
 33  allow arbitrary execution of code on your computer. For this reason, 
 34  if you use this module, I recommend operating behind a firewall. This 
 35  could be an inexpensive "routing switch" used for cable modems, which 
 36  would provide the added benefit that your local network would be 
 37  isolated.  This would elimate all traffic not to or from computers on 
 38  the switch and therefore reduce/eliminate packet collisions, decrease 
 39  latency, and providing a network performance and reliability. To 
 40  address security concerns, you could also write code that implements 
 41  IP address checking or other security features. 
 42   
 43  """ 
 44   
 45  import VisionEgg 
 46  import VisionEgg.Core 
 47  import VisionEgg.FlowControl 
 48  import VisionEgg.ParameterTypes as ve_types 
 49  import socket, select, re, string, types 
 50  import numpy.oldnumeric as Numeric, math # for eval 
 51   
 52  try: 
 53      import Tkinter 
 54  except: 
 55      pass 
 56   
 57  import logging 
 58   
 59  __version__ = VisionEgg.release_name 
 60  __cvs__ = '$Revision$'.split()[1] 
 61  __date__ = ' '.join('$Date$'.split()[1:3]) 
 62  __author__ = 'Andrew Straw <astraw@users.sourceforge.net>' 
 63   
64 -class TCPServer:
65 """TCP server creates SocketListenController upon connection. 66 67 This class is analagous to VisionEgg.PyroHelpers.PyroServer. 68 69 """
70 - def __init__(self, 71 hostname="", 72 port=7834, 73 single_socket_but_reconnect_ok=0, 74 dialog_ok=1, 75 confirm_address_with_gui=1):
76 """Bind to hostname and port, but don't listen yet. 77 78 """ 79 server_address = (socket.getfqdn(hostname),port) 80 self.dialog_ok = dialog_ok 81 self.single_socket_but_reconnect_ok = single_socket_but_reconnect_ok 82 self.buffer = "" 83 self.server_socket=None 84 if not globals().has_key("Tkinter") or (VisionEgg.config.VISIONEGG_TKINTER_OK==0): 85 self.dialog_ok = 0 86 87 class GetServerAddressWindow(Tkinter.Frame): 88 def __init__(self,server_address,**kw): 89 try: 90 Tkinter.Frame.__init__(self,**kw) 91 except AttributeError,x: 92 tk=Tkinter.Tk() # restart Tk and see if that helps 93 Tkinter.Frame.__init__(self,tk,**kw) 94 self.winfo_toplevel().title("Vision Egg: TCP Server get address") 95 self.server_address = server_address 96 hostname,port = self.server_address 97 self.clicked_ok = 0 98 self.hostname = Tkinter.StringVar() 99 self.hostname.set(hostname) 100 self.port = Tkinter.StringVar() 101 self.port.set(port) 102 row = 0 103 Tkinter.Label(self, 104 text="Please enter the hostname and port you would like to listen for connections on.", 105 ).grid(row=row,columnspan=2) 106 row += 1 107 Tkinter.Label(self, 108 text="Hostname (blank means localhost):", 109 ).grid(row=row,column=0,sticky=Tkinter.E) 110 Tkinter.Entry(self,textvariable=self.hostname).grid(row=row,column=1,sticky=Tkinter.W+Tkinter.E,padx=10) 111 row += 1 112 Tkinter.Label(self, 113 text="Port:", 114 ).grid(row=row,column=0,sticky=Tkinter.E) 115 Tkinter.Entry(self,textvariable=self.port).grid(row=row,column=1,sticky=Tkinter.W+Tkinter.E,padx=10) 116 row += 1 117 b = Tkinter.Button(self, 118 text="Bind port and listen for connections", 119 command=self.click_ok) 120 b.grid(row=row,columnspan=2) 121 b.focus_force() 122 b.bind('<Return>',self.click_ok)
123 def click_ok(self,dummy_arg=None): 124 hostname = self.hostname.get() 125 try: 126 port = int(self.port.get()) 127 except: 128 port = self.port.get() 129 self.server_address = (hostname,port) 130 self.clicked_ok = 1 131 self.winfo_toplevel().destroy()
132 133 bound = 0 134 if not bound: 135 # while not bound: # don't loop until the code is cleaner 136 if confirm_address_with_gui and self.dialog_ok: 137 window = GetServerAddressWindow(server_address) 138 window.pack() 139 window.mainloop() 140 if not window.clicked_ok: 141 return # User wants to quit 142 server_address = window.server_address 143 self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 144 self.server_socket.bind(server_address) 145 bound = 1 146
147 - def create_listener_once_connected(self,eval_frequency=None):
148 """Wait for connection and spawn instance of SocketListenController.""" 149 if eval_frequency is None: 150 # Don't listen to socket during go loop -- especially don't want to skip frames then 151 eval_frequency = VisionEgg.FlowControl.Controller.EVERY_FRAME | VisionEgg.FlowControl.Controller.NOT_DURING_GO 152 host,port = self.server_socket.getsockname() 153 fqdn = socket.getfqdn(host) 154 logger = logging.getLogger('VisionEgg.TCPController') 155 logger.info("Awaiting connection to TCP Server at '%s', port %d"%(fqdn,port)) 156 self.server_socket.listen(1) 157 if self.dialog_ok: 158 # Make a Tkinter dialog box 159 class WaitingDialog(Tkinter.Frame): 160 def __init__(self,server_socket=None,**kw): 161 Tkinter.Frame.__init__(self,**kw) 162 self.winfo_toplevel().title('Vision Egg TCP Server') 163 self.server_socket = server_socket 164 host,port = self.server_socket.getsockname() 165 fqdn = socket.getfqdn(host) 166 spacer = Tkinter.Frame(self,borderwidth=30) 167 spacer.pack() 168 Tkinter.Label(spacer,text= 169 """Awaiting connection to TCP Server at "%s", port %d"""%(fqdn,port) 170 ).pack() 171 b = Tkinter.Button(self,text="Cancel",command=self.stop_listening) 172 b.pack(side=Tkinter.BOTTOM) 173 b.focus_force() 174 b.bind('<Return>',self.stop_listening) 175 self.winfo_toplevel().protocol("WM_DELETE_WINDOW", self.stop_listening) 176 self.server_socket.setblocking(0) 177 self.after(1,self.idle_func)
178 def stop_listening(self,dummy=None): 179 raise SystemExit 180 def idle_func(self): 181 try: 182 # This line raises an exception unless there's an incoming connection 183 self.accepted = self.server_socket.accept() 184 self.quit() 185 except socket.error, x: 186 self.after(1,self.idle_func) 187 dialog = WaitingDialog(server_socket = self.server_socket) 188 dialog.pack() 189 dialog.mainloop() 190 client, client_address = dialog.accepted 191 dialog.winfo_toplevel().destroy() 192 else: 193 client, client_address = self.server_socket.accept() 194 if self.single_socket_but_reconnect_ok: 195 return SocketListenController(client, 196 disconnect_ok = 1, 197 server_socket = self.server_socket) 198 else: 199 return SocketListenController(client) 200
201 -class SocketListenController(VisionEgg.FlowControl.Controller):
202 r"""Handle connection from remote machine, control TCPControllers. 203 204 This meta controller handles a TCP socket to control zero to many 205 instances of TCPController. As a subclass of Controller, it gets 206 called at specified moments in time via the Presentation 207 class. When called in this way, it checks for any strings from the 208 TCP socket. It parses this information into a command or fails 209 and sends an error. 210 211 This class is analagous to VisionEgg.PyroHelpers.PyroListenController. 212 213 TCP commands (sent over network socket) 214 ======================================= 215 216 close -- close the connection 217 exit -- close the connection 218 quit -- quit the server program 219 help -- print help message 220 <name> -- show the value of the controller of <name> 221 <name>=const(<args>) -- assign a new ConstantController to <name> 222 <name>=eval_str(<args>) -- assign a new EvalStringController to <name> 223 <name>=exec_str(<args>) -- assign a new ExecStringController to <name> 224 <name>=exec_str(*<args>) -- assign a new unrestricted namespace ExecStringController to <name> 225 226 TCP commands are always on a single line. (Newlines in string 227 literals can be specified by using "\n" without the quotes.) 228 229 The assignment commands share common behavior: 230 231 <name> -- value passed as argument "tcp_name" to method create_tcp_controller 232 <args> -- during_go [, between_go [, eval_frequency [, temporal_variables [, return_type ]]]] 233 234 The <args> string is parsed by the Python's eval() function. If 235 you don't want to explicitly set an argument early in the argument 236 list, but you need to set one late in the list, use "None". If 237 not set, the optional arguments default to: 238 239 eval_frequency = EVERY_FRAME 240 temporal_variables = TIME_SEC_SINCE_GO 241 return_type = (evaluates during_go function to find) 242 between_go = (see below, depends on assignment type) 243 244 The only difference between the assignment commands are in the 245 first two arguments. For "const(...)", the first two arguments 246 are constant values, for "eval_str(...)" they are strings that 247 evaluate to a single variable, and for "exec_str(...)", they are 248 strings that set the variable "x" in their local namespace, which 249 is then returned. (An unrestricted namespace is available with 250 "exec_str(*...)".) If the argument between_go is set to None or 251 is not defined, the behavior depends on the assignment command. 252 If this is a <name>=const(...) assignment, between_go_value is set 253 to during_go_value. If this is a <name>=eval_str(...) or 254 <name>=exec_str(...) assignment, the correct value cannot be 255 guessed, and therefore the between_go_eval function will never be 256 called (the eval_frequency flag NOT_BETWEEN_GO is set). 257 258 Because the default value for temporal_variables is 259 TIME_SEC_SINCE_GO, the variable "t" may be safely used in the 260 during_go string for the eval_str or exec_str assignment commands. 261 See the documentation for VisionEgg.FlowControl.EvalStringController for 262 more information. 263 264 Example commands from TCP port (try with telnet): 265 266 <name>=const(1.0) 267 <name>=eval_str("t*360.0") 268 <name>=exec_str("x=t*360.0") 269 270 <name>=const(0.,1.,EVERY_FRAME) 271 <name>=const(1,None,ONCE) 272 273 <name>=const(1.0,0.0,EVERY_FRAME,TIME_INDEPENDENT,types.FloatType) 274 <name>=eval_str("t*360.0","t_abs*360.0",None,TIME_SEC_ABSOLUTE|TIME_SEC_SINCE_GO) 275 <name>=eval_str("t_abs*360.0","t_abs*360.0",EVERY_FRAME,TIME_SEC_ABSOLUTE,types.FloatType) 276 <name>=exec_str("x=t*360.0","x=0.0",EVERY_FRAME,TIME_SEC_SINCE_GO) 277 <name>=exec_str("print 'Time since go=%f'%(t,)\nx=t*360.0","x=0.0",EVERY_FRAME,TIME_SEC_SINCE_GO) 278 279 """ 280 281 help_string = r""" TCP commands (sent over network socket): 282 283 close -- close the connection 284 exit -- close the connection 285 quit -- quit the server program 286 help -- print this message 287 <name> -- show the value of the controller of <name> 288 <name>=const(<args>) -- assign a new ConstantController to <name> 289 <name>=eval_str(<args>) -- assign a new EvalStringController to <name> 290 <name>=exec_str(<args>) -- assign a new ExecStringController to <name> 291 <name>=exec_str(*<args>) -- assign a new unrestricted namespace ExecStringController to <name> 292 293 TCP commands are always on a single line. (Newlines in string 294 literals can be specified by using "\n" without the quotes.) 295 296 The assignment commands share common behavior: 297 298 <name> -- value passed as argument "tcp_name" to method create_tcp_controller 299 <args> -- during_go [, between_go [, eval_frequency [, temporal_variables [, return_type ]]]] 300 """ 301 302 _re_line = re.compile(r"^(.*)\n",re.MULTILINE) 303 _re_x_finder = re.compile(r'\A|\Wx\s?=[^=]') 304 # The real newlines have already been parsed by the time the buffer gets to these statements: 305 _re_const = re.compile(r'^const\(\s?(.*)\s?\)$',re.DOTALL) 306 _re_eval_str = re.compile(r'^eval_str\(\s?(.*)\s?\)$',re.DOTALL) 307 _re_exec_str = re.compile(r'^exec_str\(\s?(\*)?\s?(.*)\s?\)$',re.DOTALL) 308 _parse_args_globals = {'types':types} 309 _parse_args_locals = VisionEgg.FlowControl.Controller.flag_dictionary
310 - def __init__(self, 311 socket, 312 disconnect_ok = 0, 313 server_socket = None, # Only needed if reconnecting ok 314 temporal_variables = VisionEgg.FlowControl.Controller.TIME_INDEPENDENT, 315 eval_frequency = VisionEgg.FlowControl.Controller.EVERY_FRAME):
316 """Instantiated by TCPServer.""" 317 VisionEgg.FlowControl.Controller.__init__(self, 318 return_type = types.NoneType, 319 temporal_variables = temporal_variables, 320 eval_frequency = eval_frequency) 321 self.socket = socket 322 self.disconnect_ok = disconnect_ok 323 if self.disconnect_ok and server_socket is None: 324 # Warning -- no ability to accept further incoming sockets... 325 pass 326 self.server_socket = server_socket 327 328 logger = logging.getLogger('VisionEgg.TCPController') 329 logger.info("Handling connection from %s"%(self.socket.getsockname(),)) 330 self.socket.setblocking(0) # don't block on this socket 331 332 self.socket.send("Hello. This is %s version %s.\n"%(self.__class__,__version__)) 333 self.socket.send(SocketListenController.help_string+"\n") 334 self.socket.send("Begin sending commands now.\n") 335 336 self.buffer = "" 337 338 self.last_command = {} 339 340 self.names = {} # ( controller, name_re, parser, require_type )
341
342 - def send_raw_text(self,text):
343 """Send text over the TCP socket.""" 344 self.socket.send(text)
345
346 - def __check_socket(self):
347 if self.socket is not None: # Normal, connected behavior 348 # First, update the buffer 349 ready_to_read, temp, temp2 = select.select([self.socket],[],[],0) 350 new_info = 0 351 while len(ready_to_read): 352 try: 353 new = self.socket.recv(1024) # When disconnected, this fails on Win32 354 except socket.error, x: 355 if not self.disconnect_ok: 356 raise 357 else: 358 self.socket.close() 359 self.socket = None 360 if self.server_socket is not None: 361 self.server_socket.setblocking(0) 362 return 363 if len(new) == 0: # When disconnected, this happens on unix 364 # Disconnected 365 self.socket.close() # close socket 366 self.socket = None 367 if not self.disconnect_ok: 368 raise RuntimeError("Socket disconnected!") 369 else: 370 if self.server_socket is not None: 371 self.server_socket.setblocking(0) 372 return # don't do any more 373 #assert(ready_to_read[0] == self.socket) 374 self.buffer += new 375 new_info = 1 376 ready_to_read, temp, temp2 = select.select([self.socket],[],[],0) 377 378 # Second, convert the buffer to command_queue entries 379 if new_info: 380 # Handle variations on newlines: 381 self.buffer = string.replace(self.buffer,chr(0x0D),"") # no CR 382 self.buffer = string.replace(self.buffer,chr(0x0A),"\n") # LF = newline 383 # Handle each line for which we have a tcp_name 384 for tcp_name in self.names.keys(): 385 (controller, name_re_str, parser, require_type) = self.names[tcp_name] 386 387 # If the following line makes a match, it 388 # sticks the result in self.last_command[tcp_name] by calling the parser function. 389 self.buffer = name_re_str.sub(parser,self.buffer) 390 # Now act based on the command parsed 391 command = self.last_command[tcp_name] 392 if command is not None: 393 self.__do_assignment_command(tcp_name,command,require_type) 394 self.last_command[tcp_name] = None 395 # Clear any complete lines for which we don't have a tcp_name 396 self.buffer = SocketListenController._re_line.sub(self.__unprocessed_line,self.buffer) 397 elif self.server_socket is not None: 398 # Not connected on self.socket, check self.server_socket for new connection 399 try: 400 # This line raises an exception unless there's an incoming connection (if server is not blocking, which it shouldn't be) 401 (client, client_address) = self.server_socket.accept() 402 self.socket = client 403 self.socket.send("Hello. This is %s version %s.\n"%(self.__class__,__version__)) 404 self.socket.send(SocketListenController.help_string+"\n") 405 self.socket.send("Begin sending commands now.\n") 406 for tcp_name in self.names.keys(): 407 (controller, name_re_str, parser, require_type) = self.names[tcp_name] 408 self.socket.send('"%s" controllable with this connection.\n'%tcp_name) 409 except socket.error, x: 410 pass
411
412 - def __unprocessed_line(self,match):
413 text = match.group(1) 414 text = string.strip(text).lower() 415 if text=="quit": # this a hack, really (should be a controller in charge of Presentation.parameters.quit) 416 raise SystemExit 417 elif text=="close" or text=="exit": 418 self.socket = None # close socket 419 if not self.disconnect_ok: 420 raise RuntimeError("Socket disconnected!") 421 else: 422 if self.server_socket is not None: 423 self.server_socket.setblocking(0) 424 return "" 425 elif text=="help": 426 self.socket.send(SocketListenController.help_string+"\n") 427 return "" 428 elif text in self.names.keys(): 429 (controller, name_re_str, parser, require_type) = self.names[text] 430 self.socket.send(text+"="+str(controller)+"\n") 431 return "" 432 self.socket.send("Error: Invalid command line \""+text+"\"\n") 433 logger = logging.getLogger('VisionEgg.TCPController') 434 logger.warning('Invalid command line: "%s"'%(text,)) 435 return ''
436
437 - def create_tcp_controller(self, 438 tcp_name=None, 439 initial_controller=None, 440 require_type=None):
441 """Create new instance of TCPController. 442 443 Arguments: 444 445 tcp_name -- String to reference new TCPController over TCP 446 447 Optional arguments: 448 449 initial_controller -- Initial value of TCPController instance 450 require_type -- force this as TCPController instance's return_type 451 """ 452 class Parser: 453 def __init__(self,tcp_name,most_recent_command): 454 self.tcp_name = tcp_name 455 self.most_recent_command = most_recent_command
456 457 def parse_func(self,match): 458 # Could make this into a lambda function 459 self.most_recent_command[self.tcp_name] = match.groups()[-1] 460 return ""
461 if tcp_name is None: 462 raise ValueError("Must specify tcp_name") 463 if tcp_name in self.names.keys(): 464 raise ValueError('tcp_name "%s" already in use.'%tcp_name) 465 if string.count(tcp_name,' '): 466 raise ValueError('tcp_name "%s" cannot have spaces.'%tcp_name) 467 if tcp_name == "quit": 468 raise ValueError('tcp_name "%s" conflicts with reserved word.'%tcp_name) 469 if initial_controller is None: 470 # create default controller 471 initial_controller = VisionEgg.FlowControl.ConstantController( 472 during_go_value=1.0, 473 between_go_value=0.0) 474 else: 475 if not isinstance(initial_controller,VisionEgg.FlowControl.Controller): 476 print initial_controller 477 raise ValueError('initial_controller not an instance of VisionEgg.FlowControl.Controller') 478 if require_type is None: 479 require_type = initial_controller.returns_type() 480 # Create initial None value for self.last_command dict 481 self.last_command[tcp_name] = None 482 # Create values for self.names dict tuple ( controller, name_re, most_recent_command, parser ) 483 controller = TCPController( 484 tcp_name=tcp_name, 485 initial_controller=initial_controller 486 ) 487 name_re_str = re.compile("^"+tcp_name+r"\s*=\s*(.*)\s*\n$",re.MULTILINE) 488 parser = Parser(tcp_name,self.last_command).parse_func 489 self.names[tcp_name] = (controller, name_re_str, parser, require_type) 490 self.socket.send('"%s" controllable with this connection.\n'%tcp_name) 491 return controller 492
493 - def __get_five_args(self,arg_string):
494 args = eval("("+arg_string+",)",SocketListenController._parse_args_globals,SocketListenController._parse_args_locals) 495 num_args = len(args) 496 if num_args == 0: 497 args = (None,None,None,None,None) 498 elif num_args == 1: 499 args = (args[0],None,None,None,None) 500 elif num_args == 2: 501 args = (args[0],args[1],None,None,None) 502 elif num_args == 3: 503 args = (args[0],args[1],args[2],None,None) 504 elif num_args == 4: 505 args = (args[0],args[1],args[2],args[3],None) 506 elif num_args > 5: 507 raise ValueError("Too many arguments!") 508 if args[0] is None: 509 raise ValueError("First argument must be set.") 510 return args
511
512 - def __process_common_args(self,kw_args,match_groups):
513 if match_groups[2] is not None: 514 kw_args['eval_frequency'] = match_groups[2] 515 if match_groups[3] is not None: 516 kw_args['temporal_variables'] = match_groups[3] 517 if match_groups[4] is not None: 518 kw_args['return_type'] = match_groups[4]
519
520 - def __do_assignment_command(self,tcp_name,command,require_type):
521 new_contained_controller = None 522 match = SocketListenController._re_const.match(command) 523 if match is not None: 524 try: 525 match_groups = self.__get_five_args(match.group(1)) 526 kw_args = {} 527 kw_args['during_go_value'] = match_groups[0] 528 if match_groups[1] is not None: 529 kw_args['between_go_value'] = match_groups[1] 530 self.__process_common_args(kw_args,match_groups) 531 kw_args.setdefault('return_type',require_type) 532 new_contained_controller = VisionEgg.FlowControl.ConstantController(**kw_args) 533 new_type = new_contained_controller.returns_type() 534 ve_types.assert_type( new_type, require_type) 535 except Exception, x: 536 import traceback 537 traceback.print_exc() 538 self.socket.send("Error %s parsing const for %s: %s\n"%(x.__class__,tcp_name,x)) 539 logger = logging.getLogger('VisionEgg.TCPController') 540 logger.info("%s parsing const for %s: %s"%(x.__class__,tcp_name,x)) 541 else: 542 match = SocketListenController._re_eval_str.match(command) 543 if match is not None: 544 try: 545 match_groups = self.__get_five_args(match.group(1)) 546 kw_args = {} 547 kw_args['during_go_eval_string'] = string.replace(match_groups[0],r"\n","\n") 548 if match_groups[1] is not None: 549 kw_args['between_go_eval_string'] = string.replace(match_groups[1],r"\n","\n") 550 self.__process_common_args(kw_args,match_groups) 551 kw_args.setdefault('return_type',require_type) 552 new_contained_controller = VisionEgg.FlowControl.EvalStringController(**kw_args) 553 if not (new_contained_controller.eval_frequency & VisionEgg.FlowControl.Controller.NOT_DURING_GO): 554 logger = logging.getLogger('VisionEgg.TCPController') 555 logger.debug('Executing "%s" as safety check.'%(kw_args['during_go_eval_string'],)) 556 new_contained_controller._test_self(1) 557 if not (new_contained_controller.eval_frequency & VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO): 558 logger = logging.getLogger('VisionEgg.TCPController') 559 logger.debug('Executing "%s" as safety check.'%(kw_args['between_go_eval_string'],)) 560 new_contained_controller._test_self(0) 561 new_type = new_contained_controller.returns_type() 562 ve_types.assert_type( new_type, require_type) 563 except Exception, x: 564 new_contained_controller = None 565 self.socket.send("Error %s parsing eval_str for %s: %s\n"%(x.__class__,tcp_name,x)) 566 logger = logging.getLogger('VisionEgg.TCPController') 567 logger.info("%s parsing eval_str for %s: %s"%(x.__class__,tcp_name,x)) 568 else: 569 match = SocketListenController._re_exec_str.match(command) 570 if match is not None: 571 try: 572 kw_args = {} 573 match_groups = match.groups() 574 if match_groups[0] == '*': 575 kw_args['restricted_namespace'] = 0 576 else: 577 kw_args['restricted_namespace'] = 1 578 match_groups = self.__get_five_args(match_groups[1]) 579 tmp = string.replace(match_groups[0],r"\n","\n") 580 if not SocketListenController._re_x_finder.match(tmp): 581 raise ValueError("x is not defined for during_go_exec_string") 582 kw_args['during_go_exec_string'] = tmp 583 if match_groups[1] is not None: 584 tmp = string.replace(match_groups[1],r"\n","\n") 585 if not SocketListenController._re_x_finder.match(tmp): 586 raise ValueError("x is not defined for between_go_exec_string") 587 kw_args['between_go_exec_string'] = tmp 588 self.__process_common_args(kw_args,match_groups) 589 kw_args.setdefault('return_type',require_type) 590 new_contained_controller = VisionEgg.FlowControl.ExecStringController(**kw_args) 591 if not (new_contained_controller.eval_frequency & VisionEgg.FlowControl.Controller.NOT_DURING_GO): 592 logger = logging.getLogger('VisionEgg.TCPController') 593 logger.debug('Executing "%s" as safety check.'%(kw_args['during_go_exec_string'],)) 594 new_contained_controller._test_self(1) 595 if not (new_contained_controller.eval_frequency & VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO): 596 logger = logging.getLogger('VisionEgg.TCPController') 597 logger.debug('Executing "%s" as safety check.'%(kw_args['between_go_exec_string'],)) 598 new_contained_controller._test_self(0) 599 new_type = new_contained_controller.returns_type() 600 ve_types.assert_type( new_type, require_type) 601 except Exception, x: 602 new_contained_controller = None 603 self.socket.send("Error %s parsing exec_str for %s: %s\n"%(x.__class__,tcp_name,x)) 604 logger = logging.getLogger('VisionEgg.TCPController') 605 logger.debug("%s parsing exec_str for %s: %s"%(x.__class__,tcp_name,x)) 606 else: 607 self.socket.send("Error: Invalid assignment command for %s: %s\n"%(tcp_name,command)) 608 logger = logging.getLogger('VisionEgg.TCPController') 609 logger.info("Invalid assignment command for %s: %s"%(tcp_name,command)) 610 # create controller based on last command_queue 611 if new_contained_controller is not None: 612 (controller, name_re_str, parser, require_type) = self.names[tcp_name] 613 controller.set_new_controller(new_contained_controller)
614
615 - def during_go_eval(self):
616 """Check socket and act accordingly. Called by instance of Presentation. 617 618 Overrides base class Controller method.""" 619 self.__check_socket() 620 return None
621
622 - def between_go_eval(self):
623 """Check socket and act accordingly. Called by instance of Presentation. 624 625 Overrides base class Controller method.""" 626 self.__check_socket() 627 return None
628
629 -class TCPController(VisionEgg.FlowControl.EncapsulatedController):
630 """Control a parameter from a network (TCP) connection. 631 632 Subclass of Controller to allow control of Parameters via the 633 network. 634 635 This class is analagous to VisionEgg.PyroHelpers.PyroEncapsulatedController. 636 """ 637 # Contains another controller...
638 - def __init__(self, tcp_name, initial_controller):
639 """Instantiated by SocketListenController. 640 641 Users should create instance by using method 642 create_tcp_controller of class SocketListenController.""" 643 VisionEgg.FlowControl.EncapsulatedController.__init__(self,initial_controller) 644 self.tcp_name = tcp_name
645
646 - def __str__(self):
647 value = "" 648 my_class = self.contained_controller.__class__ 649 if my_class == VisionEgg.FlowControl.ConstantController: 650 value += "const( " 651 value += str(self.contained_controller.get_during_go_value()) + ", " 652 value += str(self.contained_controller.get_between_go_value()) + ", " 653 elif my_class == VisionEgg.FlowControl.EvalStringController: 654 value += "eval_str( " 655 str_val = self.contained_controller.get_during_go_eval_string() 656 if str_val is None: 657 value += "None, " 658 else: 659 value += '"' + string.replace(str_val,"\n",r"\n") + '", ' 660 str_val = self.contained_controller.get_between_go_eval_string() 661 if str_val is None: 662 value += "None, " 663 else: 664 value += '"' + string.replace(str_val,"\n",r"\n") + '", ' 665 elif my_class == VisionEgg.FlowControl.ExecStringController: 666 value += "exec_str(" 667 if self.contained_controller.restricted_namespace: 668 value += " " 669 else: # unrestricted 670 value += "* " 671 str_val = self.contained_controller.get_during_go_exec_string() 672 if str_val is None: 673 value += "None, " 674 else: 675 value += '"' + string.replace(str_val,"\n",r"\n") + '", ' 676 str_val = self.contained_controller.get_between_go_exec_string() 677 if str_val is None: 678 value += "None, " 679 else: 680 value += '"' + string.replace(str_val,"\n",r"\n") + '", ' 681 never = 1 682 ef = self.contained_controller.eval_frequency 683 if ef & VisionEgg.FlowControl.Controller.EVERY_FRAME: 684 value += "EVERY_FRAME | " 685 never = 0 686 if ef & VisionEgg.FlowControl.Controller.TRANSITIONS: 687 value += "TRANSITIONS | " 688 never = 0 689 if ef & VisionEgg.FlowControl.Controller.ONCE: 690 value += "ONCE | " 691 never = 0 692 if ef & VisionEgg.FlowControl.Controller.NOT_DURING_GO: 693 value += "NOT_DURING_GO | " 694 never = 0 695 if ef & VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO: 696 value += "NOT_BETWEEN_GO | " 697 never = 0 698 if never: 699 value += "NEVER" 700 else: 701 value = value[:-3] # get rid of trailing "| " 702 value += ", " 703 time_indep = 1 704 tv = self.contained_controller.temporal_variables 705 if tv & VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE: 706 value += "TIME_SEC_ABSOLUTE | " 707 time_indep = 0 708 if tv & VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO: 709 value += "TIME_SEC_SINCE_GO | " 710 time_indep = 0 711 if tv & VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE: 712 value += "FRAMES_ABSOLUTE | " 713 time_indep = 0 714 if tv & VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO: 715 value += "FRAMES_SINCE_GO | " 716 time_indep = 0 717 if time_indep: 718 value += "TIME_INDEPENDENT" 719 else: 720 value = value[:-3] # get rid of trailing "| " 721 value += ", " 722 my_type = self.contained_controller.returns_type() 723 if my_type == types.ClassType: 724 value += str(my_type) 725 else: 726 for t in dir(types): 727 if my_type == getattr(types,t): 728 value += "types."+t 729 break 730 value += " )" 731 return value
732

visionegg-1.2.1/doc/reference/html/VisionEgg.TCPController.SocketListenController-class.html0000644000076500000240000005600211224565531031375 0ustar astrawstaff VisionEgg.TCPController.SocketListenController
Package VisionEgg :: Module TCPController :: Class SocketListenController
[frames] | no frames]

Class SocketListenController

source code

            object --+    
                     |    
FlowControl.Controller --+
                         |
                        SocketListenController

Handle connection from remote machine, control TCPControllers.

This meta controller handles a TCP socket to control zero to many
instances of TCPController.  As a subclass of Controller, it gets
called at specified moments in time via the Presentation
class. When called in this way, it checks for any strings from the
TCP socket.  It parses this information into a command or fails
and sends an error.

This class is analagous to VisionEgg.PyroHelpers.PyroListenController.

TCP commands (sent over network socket)
=======================================

close -- close the connection
exit -- close the connection
quit -- quit the server program
help -- print help message
<name> -- show the value of the controller of <name>
<name>=const(<args>) -- assign a new ConstantController to <name>
<name>=eval_str(<args>) -- assign a new EvalStringController to <name>
<name>=exec_str(<args>) -- assign a new ExecStringController to <name>
<name>=exec_str(*<args>) -- assign a new unrestricted namespace ExecStringController to <name>

TCP commands are always on a single line.  (Newlines in string
literals can be specified by using "\n" without the quotes.)

The assignment commands share common behavior:

<name> -- value passed as argument "tcp_name" to method create_tcp_controller
<args> -- during_go [, between_go [, eval_frequency [, temporal_variables [, return_type ]]]]

The <args> string is parsed by the Python's eval() function.  If
you don't want to explicitly set an argument early in the argument
list, but you need to set one late in the list, use "None".  If
not set, the optional arguments default to:

eval_frequency = EVERY_FRAME
temporal_variables = TIME_SEC_SINCE_GO
return_type = (evaluates during_go function to find)
between_go = (see below, depends on assignment type)

The only difference between the assignment commands are in the
first two arguments.  For "const(...)", the first two arguments
are constant values, for "eval_str(...)" they are strings that
evaluate to a single variable, and for "exec_str(...)", they are
strings that set the variable "x" in their local namespace, which
is then returned.  (An unrestricted namespace is available with
"exec_str(*...)".)  If the argument between_go is set to None or
is not defined, the behavior depends on the assignment command.
If this is a <name>=const(...) assignment, between_go_value is set
to during_go_value.  If this is a <name>=eval_str(...) or
<name>=exec_str(...) assignment, the correct value cannot be
guessed, and therefore the between_go_eval function will never be
called (the eval_frequency flag NOT_BETWEEN_GO is set).

Because the default value for temporal_variables is
TIME_SEC_SINCE_GO, the variable "t" may be safely used in the
during_go string for the eval_str or exec_str assignment commands.
See the documentation for VisionEgg.FlowControl.EvalStringController for
more information.

Example commands from TCP port (try with telnet):

<name>=const(1.0)
<name>=eval_str("t*360.0")
<name>=exec_str("x=t*360.0")

<name>=const(0.,1.,EVERY_FRAME)
<name>=const(1,None,ONCE)

<name>=const(1.0,0.0,EVERY_FRAME,TIME_INDEPENDENT,types.FloatType)
<name>=eval_str("t*360.0","t_abs*360.0",None,TIME_SEC_ABSOLUTE|TIME_SEC_SINCE_GO)
<name>=eval_str("t_abs*360.0","t_abs*360.0",EVERY_FRAME,TIME_SEC_ABSOLUTE,types.FloatType)
<name>=exec_str("x=t*360.0","x=0.0",EVERY_FRAME,TIME_SEC_SINCE_GO)
<name>=exec_str("print 'Time since go=%f'%(t,)\nx=t*360.0","x=0.0",EVERY_FRAME,TIME_SEC_SINCE_GO)



Instance Methods
 
__init__(self, socket, disconnect_ok=0, server_socket=None, temporal_variables=VisionEgg.FlowControl.Controller.TIME_INDEPENDENT, eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME)
Instantiated by TCPServer.
source code
 
send_raw_text(self, text)
Send text over the TCP socket.
source code
 
create_tcp_controller(self, tcp_name=None, initial_controller=None, require_type=None)
Create new instance of TCPController.
source code
 
during_go_eval(self)
Check socket and act accordingly.
source code
 
between_go_eval(self)
Check socket and act accordingly.
source code

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  help_string = r""" TCP commands (sent over network socke...

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, socket, disconnect_ok=0, server_socket=None, temporal_variables=VisionEgg.FlowControl.Controller.TIME_INDEPENDENT, eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME)
(Constructor)

source code 
Instantiated by TCPServer.

Overrides: FlowControl.Controller.__init__

create_tcp_controller(self, tcp_name=None, initial_controller=None, require_type=None)

source code 
Create new instance of TCPController.

Arguments:

tcp_name -- String to reference new TCPController over TCP

Optional arguments:

initial_controller -- Initial value of TCPController instance
require_type -- force this as TCPController instance's return_type

during_go_eval(self)

source code 
Check socket and act accordingly. Called by instance of Presentation.

Overrides base class Controller method.

Overrides: FlowControl.Controller.during_go_eval

between_go_eval(self)

source code 
Check socket and act accordingly. Called by instance of Presentation.

Overrides base class Controller method.

Overrides: FlowControl.Controller.between_go_eval

Class Variable Details

help_string

Value:
r"""    TCP commands (sent over network socket):

    close -- close the connection
    exit -- close the connection
    quit -- quit the server program
    help -- print this message
    <name> -- show the value of the controller of <name>
    <name>=const(<args>) -- assign a new ConstantController to <name>
...

visionegg-1.2.1/doc/reference/html/VisionEgg.TCPController.TCPController-class.html0000644000076500000240000003123711224565531027417 0ustar astrawstaff VisionEgg.TCPController.TCPController
Package VisionEgg :: Module TCPController :: Class TCPController
[frames] | no frames]

Class TCPController

source code

                    object --+        
                             |        
        FlowControl.Controller --+    
                                 |    
FlowControl.EncapsulatedController --+
                                     |
                                    TCPController

Control a parameter from a network (TCP) connection.

Subclass of Controller to allow control of Parameters via the
network.

This class is analagous to VisionEgg.PyroHelpers.PyroEncapsulatedController.



Instance Methods
 
__init__(self, tcp_name, initial_controller)
Instantiated by SocketListenController.
source code
 
__str__(self)
str(x)
source code

Inherited from FlowControl.EncapsulatedController: between_go_eval, during_go_eval, set_new_controller

Inherited from FlowControl.Controller: evaluate_now, returns_type, set_eval_frequency

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__

Class Variables

Inherited from FlowControl.Controller: EVERY_FRAME, FRAMES_ABSOLUTE, FRAMES_SINCE_GO, NEVER, NOT_BETWEEN_GO, NOT_DURING_GO, ONCE, TIME_INDEPENDENT, TIME_SEC_ABSOLUTE, TIME_SEC_SINCE_GO, TRANSITIONS, flag_dictionary

Properties

Inherited from object: __class__

Method Details

__init__(self, tcp_name, initial_controller)
(Constructor)

source code 
Instantiated by SocketListenController.

Users should create instance by using method
create_tcp_controller of class SocketListenController.

Overrides: FlowControl.EncapsulatedController.__init__

__str__(self)
(Informal representation operator)

source code 
str(x)

Overrides: object.__str__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.TCPController.TCPServer-class.html0000644000076500000240000001517611224565531026546 0ustar astrawstaff VisionEgg.TCPController.TCPServer
Package VisionEgg :: Module TCPController :: Class TCPServer
[frames] | no frames]

Class TCPServer

source code

TCP server creates SocketListenController upon connection.

This class is analagous to VisionEgg.PyroHelpers.PyroServer.



Instance Methods
 
__init__(self, hostname="", port=7834, single_socket_but_reconnect_ok=0, dialog_ok=1, confirm_address_with_gui=1)
Bind to hostname and port, but don't listen yet.
source code
 
create_listener_once_connected(self, eval_frequency=None)
Wait for connection and spawn instance of SocketListenController.
source code
visionegg-1.2.1/doc/reference/html/VisionEgg.Text-module.html0000644000076500000240000001401111224565531023327 0ustar astrawstaff VisionEgg.Text
Package VisionEgg :: Module Text
[frames] | no frames]

Module Text

source code


Text stimuli.



Classes
  Text
Single line of text rendered using pygame/SDL true type fonts.
  GlutTextBase
DEPRECATED.
  BitmapText
DEPRECATED.
  StrokeText
DEPRECATED.
Variables
  have_glut = False
visionegg-1.2.1/doc/reference/html/VisionEgg.Text-pysrc.html0000644000076500000240000044110311224565531023210 0ustar astrawstaff VisionEgg.Text
Package VisionEgg :: Module Text
[frames] | no frames]

Source Code for Module VisionEgg.Text

  1  # The Vision Egg: Text 
  2  # 
  3  # Copyright (C) 2001-2003 Andrew Straw. 
  4  # Copyright (C) 2005,2008 California Institute of Technology 
  5  # 
  6  # URL: <http://www.visionegg.org/> 
  7  # 
  8  # Distributed under the terms of the GNU Lesser General Public License 
  9  # (LGPL). See LICENSE.TXT that came with this file. 
 10   
 11  """ 
 12  Text stimuli. 
 13   
 14  """ 
 15   
 16  #################################################################### 
 17  # 
 18  #        Import all the necessary packages 
 19  # 
 20  #################################################################### 
 21   
 22  import logging 
 23  import logging.handlers 
 24   
 25  import VisionEgg.Core 
 26  import VisionEgg.Textures 
 27  import VisionEgg.ParameterTypes as ve_types 
 28   
 29  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
 30   
 31  import pygame 
 32   
 33  try: 
 34      import OpenGL.GLUT as glut 
 35      have_glut = True 
 36  except: 
 37      have_glut = False 
 38   
 39  _font_objects = {} # global variable to cache pygame font objects 
 40   
41 -class Text(VisionEgg.Textures.TextureStimulus):
42 """Single line of text rendered using pygame/SDL true type fonts. 43 44 Parameters 45 ========== 46 anchor -- specifies how position parameter is interpreted (String) 47 Inherited from VisionEgg.Textures.TextureStimulus 48 Default: lowerleft 49 angle -- units: degrees, 0=right, 90=up (Real) 50 Inherited from VisionEgg.Textures.TextureStimulus 51 Default: 0.0 52 color -- texture environment color. alpha ignored (if given) for max_alpha parameter (AnyOf(Sequence3 of Real or Sequence4 of Real)) 53 Inherited from VisionEgg.Textures.TextureStimulus 54 Default: (1.0, 1.0, 1.0) 55 depth_test -- perform depth test? (Boolean) 56 Inherited from VisionEgg.Textures.TextureStimulus 57 Default: False 58 ignore_size_parameter -- (Boolean) 59 Default: True 60 mask -- optional masking function (Instance of <class 'VisionEgg.Textures.Mask2D'>) 61 Inherited from VisionEgg.Textures.TextureStimulus 62 Default: (determined at runtime) 63 max_alpha -- controls opacity. 1.0=copletely opaque, 0.0=completely transparent (Real) 64 Inherited from VisionEgg.Textures.TextureStimulus 65 Default: 1.0 66 on -- draw stimulus? (Boolean) 67 Inherited from VisionEgg.Textures.TextureStimulus 68 Default: True 69 position -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) 70 Inherited from VisionEgg.Textures.TextureStimulus 71 Default: (0.0, 0.0) 72 size -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real) 73 Inherited from VisionEgg.Textures.TextureStimulus 74 Default: (determined at runtime) 75 text -- (AnyOf(String or Unicode)) 76 Default: the string to display 77 texture -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>) 78 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 79 Default: (determined at runtime) 80 texture_mag_filter -- OpenGL filter enum (Integer) 81 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 82 Default: GL_LINEAR (9729) 83 texture_min_filter -- OpenGL filter enum (Integer) 84 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 85 Default: (GL enum determined at runtime) 86 texture_wrap_s -- OpenGL texture wrap enum (Integer) 87 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 88 Default: (GL enum determined at runtime) 89 texture_wrap_t -- OpenGL texture wrap enum (Integer) 90 Inherited from VisionEgg.Textures.TextureStimulusBaseClass 91 Default: (GL enum determined at runtime) 92 93 Constant Parameters 94 =================== 95 font_name -- (AnyOf(String or Unicode)) 96 Default: (determined at runtime) 97 font_size -- (UnsignedInteger) 98 Default: 30 99 internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) 100 Inherited from VisionEgg.Textures.TextureStimulus 101 Default: GL_RGB (6407) 102 mipmaps_enabled -- Are mipmaps enabled? (Boolean) 103 Inherited from VisionEgg.Textures.TextureStimulus 104 Default: True 105 shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) 106 Inherited from VisionEgg.Textures.TextureStimulus 107 Default: False 108 """ 109 110 parameters_and_defaults = { 111 'text': ( 'the string to display', #changing this redraws texture, may cause slowdown 112 ve_types.AnyOf(ve_types.String,ve_types.Unicode)), 113 'ignore_size_parameter':(True, # when true, draws text at 100% size 114 ve_types.Boolean), 115 } 116 117 constant_parameters_and_defaults = { 118 'font_size':(30, 119 ve_types.UnsignedInteger), 120 'font_name':(None, # None = use default font 121 ve_types.AnyOf(ve_types.String,ve_types.Unicode)), 122 } 123 124 __slots__ = ( 125 'font', 126 '_text', 127 ) 128
129 - def __init__(self,**kw):
130 if not pygame.font: 131 raise RuntimeError("no pygame font module") 132 if not pygame.font.get_init(): 133 pygame.font.init() 134 if not pygame.font.get_init(): 135 raise RuntimeError("pygame doesn't init") 136 # override some defaults 137 if 'internal_format' not in kw.keys(): 138 kw['internal_format'] = gl.GL_RGBA 139 if 'mipmaps_enabled' not in kw.keys(): 140 kw['mipmaps_enabled'] = 0 141 if 'texture_min_filter' not in kw.keys(): 142 kw['texture_min_filter'] = gl.GL_LINEAR 143 VisionEgg.Textures.TextureStimulus.__init__(self,**kw) 144 cp = self.constant_parameters 145 fontobject_args = (cp.font_name,cp.font_size) 146 if fontobject_args not in _font_objects: 147 # make global cache of font objects 148 fontobject = pygame.font.Font(*fontobject_args) 149 _font_objects[fontobject_args] = fontobject 150 # get font object from global cache 151 self.font = _font_objects[fontobject_args] 152 self._render_text()
153
154 - def _render_text(self):
155 p = self.parameters 156 rendered_surf = self.font.render(p.text, 1, (255,255,255)) # pygame.Surface object 157 158 # we could use put_new_image for speed (or put_sub_image for more) 159 p.texture = VisionEgg.Textures.Texture(rendered_surf) 160 self._reload_texture() 161 self._text = p.text # cache string so we know when to re-render 162 if p.ignore_size_parameter: 163 p.size = p.texture.size
164
165 - def draw(self):
166 p = self.parameters 167 if p.texture != self._using_texture: # self._using_texture is from TextureStimulusBaseClass 168 raise RuntimeError("my texture has been modified, but it shouldn't be") 169 if p.text != self._text: # new text 170 self._render_text() 171 if p.ignore_size_parameter: 172 p.size = p.texture.size 173 VisionEgg.Textures.TextureStimulus.draw(self) # call base class
174 175 if have_glut: 176
177 - class GlutTextBase(VisionEgg.Core.Stimulus):
178 """DEPRECATED. Base class: don't instantiate this class directly. 179 180 Base class that defines the common interface between the 181 other glut-based text stimuli. 182 183 Parameters 184 ========== 185 color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 186 Default: (1.0, 1.0, 1.0) 187 lowerleft -- (Sequence2 of Real) 188 Default: (320, 240) 189 on -- (Boolean) 190 Default: True 191 text -- (String) 192 Default: the string to display 193 """ 194 195 parameters_and_defaults = { 196 'on':(True, 197 ve_types.Boolean), 198 'color':((1.0,1.0,1.0), 199 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 200 ve_types.Sequence4(ve_types.Real))), 201 'lowerleft':((320,240), 202 ve_types.Sequence2(ve_types.Real)), 203 'text':('the string to display', 204 ve_types.String)} 205
206 - def __init__(self,**kw):
207 if not hasattr(VisionEgg.config,"_GAVE_GLUT_TEXT_DEPRECATION"): 208 logger = logging.getLogger('VisionEgg.Text') 209 logger.warning("Using GlutTextBase class. This will be " 210 "removed in a future release. Use " 211 "VisionEgg.Text.Text instead.") 212 VisionEgg.config._GAVE_GLUT_TEXT_DEPRECATION = 1 213 VisionEgg.Core.Stimulus.__init__(self,**kw)
214
215 - class BitmapText(GlutTextBase):
216 """DEPRECATED. Bitmap fonts from GLUT. 217 218 Parameters 219 ========== 220 color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 221 Inherited from GlutTextBase 222 Default: (1.0, 1.0, 1.0) 223 font -- (Integer) 224 Default: 5 225 lowerleft -- (Sequence2 of Real) 226 Inherited from GlutTextBase 227 Default: (320, 240) 228 on -- (Boolean) 229 Inherited from GlutTextBase 230 Default: True 231 text -- (String) 232 Inherited from GlutTextBase 233 Default: the string to display 234 """ 235 236 parameters_and_defaults = { 237 'font':(glut.GLUT_BITMAP_TIMES_ROMAN_24, 238 ve_types.Integer), 239 } 240
241 - def __init__(self,**kw):
242 GlutTextBase.__init__(self,**kw)
243
244 - def draw(self):
245 if self.parameters.on: 246 gl.glDisable(gl.GL_TEXTURE_2D) 247 gl.glDisable(gl.GL_BLEND) 248 gl.glDisable(gl.GL_DEPTH_TEST) 249 250 gl.glMatrixMode(gl.GL_MODELVIEW) 251 gl.glPushMatrix() 252 gl.glTranslate(self.parameters.lowerleft[0],self.parameters.lowerleft[1],0.0) 253 254 c = self.parameters.color 255 256 if len(c)==3: 257 gl.glColor3f(*c) 258 elif len(c)==4: 259 gl.glColor4f(*c) 260 gl.glDisable(gl.GL_TEXTURE_2D) 261 262 gl.glRasterPos3f(0.0,0.0,0.0) 263 for char in self.parameters.text: 264 glut.glutBitmapCharacter(self.parameters.font,ord(char)) 265 gl.glPopMatrix()
266
267 - class StrokeText(GlutTextBase):
268 """DEPRECATED. Text rendered by GLUT using stroke fonts. 269 270 Parameters 271 ========== 272 anti_aliasing -- (Boolean) 273 Default: True 274 color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) 275 Inherited from GlutTextBase 276 Default: (1.0, 1.0, 1.0) 277 font -- (Integer) 278 Default: 0 279 linewidth -- (Real) 280 Default: 3.0 281 lowerleft -- (Sequence2 of Real) 282 Inherited from GlutTextBase 283 Default: (320, 240) 284 on -- (Boolean) 285 Inherited from GlutTextBase 286 Default: True 287 orientation -- (Real) 288 Default: 0.0 289 text -- (String) 290 Inherited from GlutTextBase 291 Default: the string to display 292 """ 293 294 parameters_and_defaults = { 295 'font':(glut.GLUT_STROKE_ROMAN, 296 ve_types.Integer), 297 'orientation':(0.0, 298 ve_types.Real), 299 'linewidth':(3.0, # pixels 300 ve_types.Real), 301 'anti_aliasing':(True, 302 ve_types.Boolean), 303 } 304
305 - def __init__(self,**kw):
306 raise NotImplementedError("There's something broken with StrokeText, and I haven't figured it out yet!") 307 GlutTextBase.__init__(self,**kw)
308
309 - def draw(self):
310 if self.parameters.on: 311 gl.glDisable(gl.GL_TEXTURE_2D) 312 gl.glDisable(gl.GL_DEPTH_TEST) 313 314 gl.glMatrixMode(gl.GL_MODELVIEW) 315 gl.glPushMatrix() 316 gl.glTranslate(self.parameters.lowerleft[0],self.parameters.lowerleft[1],0.0) 317 gl.glRotate(self.parameters.orientation,0.0,0.0,1.0) 318 319 c = self.parameters.color 320 if len(c)==3: 321 gl.glColor3f(*c) 322 elif len(c)==4: 323 gl.glColor4f(*c) 324 325 gl.glLineWidth(self.parameters.linewidth) 326 327 if self.parameters.anti_aliasing: 328 gl.glEnable(gl.GL_BLEND) 329 gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) 330 gl.glEnable(gl.GL_LINE_SMOOTH) 331 else: 332 gl.glDisable(gl.GL_BLEND) 333 334 ## # This code successfully draws a box... 335 ## gl.glBegin(gl.GL_QUADS) 336 ## gl.glVertex2f(0.0,0.0) 337 ## gl.glVertex2f(0.0,0.1) 338 ## gl.glVertex2f(0.1,0.1) 339 ## gl.glVertex2f(0.1,0.0) 340 ## gl.glEnd() 341 342 # But this code does not draw the string!?! 343 for char in self.parameters.text: 344 glut.glutStrokeCharacter(self.parameters.font,ord(char)) 345 gl.glPopMatrix()
346

visionegg-1.2.1/doc/reference/html/VisionEgg.Text.BitmapText-class.html0000644000076500000240000003135111224565531025235 0ustar astrawstaff VisionEgg.Text.BitmapText
Package VisionEgg :: Module Text :: Class BitmapText
[frames] | no frames]

Class BitmapText

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
          Core.Stimulus --+    
                          |    
               GlutTextBase --+
                              |
                             BitmapText

DEPRECATED. Bitmap fonts from GLUT.

Parameters
==========
color     -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
             Inherited from GlutTextBase
             Default: (1.0, 1.0, 1.0)
font      -- (Integer)
             Default: 5
lowerleft -- (Sequence2 of Real)
             Inherited from GlutTextBase
             Default: (320, 240)
on        -- (Boolean)
             Inherited from GlutTextBase
             Default: True
text      -- (String)
             Inherited from GlutTextBase
             Default: the string to display



Instance Methods
 
__init__(self, **kw) source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'font':(glut.GLUT_BITMAP_TIMES_ROMA...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Overrides: GlutTextBase.__init__

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'font':(glut.GLUT_BITMAP_TIMES_ROMAN_24, ve_types.Integer),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Text.GlutTextBase-class.html0000644000076500000240000003006011224565531025523 0ustar astrawstaff VisionEgg.Text.GlutTextBase
Package VisionEgg :: Module Text :: Class GlutTextBase
[frames] | no frames]

Class GlutTextBase

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         GlutTextBase

DEPRECATED. Base class: don't instantiate this class directly.

Base class that defines the common interface between the
other glut-based text stimuli.

Parameters
==========
color     -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
             Default: (1.0, 1.0, 1.0)
lowerleft -- (Sequence2 of Real)
             Default: (320, 240)
on        -- (Boolean)
             Default: True
text      -- (String)
             Default: the string to display



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code

Inherited from Core.Stimulus: draw

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'col...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'color':((1.0, 1.0, 1.0), ve_types.Any\
Of(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real\
))), 'lowerleft':((320, 240), ve_types.Sequence2(ve_types.Real)), 'tex\
t':('the string to display', ve_types.String)}

visionegg-1.2.1/doc/reference/html/VisionEgg.Text.StrokeText-class.html0000644000076500000240000003307411224565531025274 0ustar astrawstaff VisionEgg.Text.StrokeText
Package VisionEgg :: Module Text :: Class StrokeText
[frames] | no frames]

Class StrokeText

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
          Core.Stimulus --+    
                          |    
               GlutTextBase --+
                              |
                             StrokeText

DEPRECATED. Text rendered by GLUT using stroke fonts.

Parameters
==========
anti_aliasing -- (Boolean)
                 Default: True
color         -- (AnyOf(Sequence3 of Real or Sequence4 of Real))
                 Inherited from GlutTextBase
                 Default: (1.0, 1.0, 1.0)
font          -- (Integer)
                 Default: 0
linewidth     -- (Real)
                 Default: 3.0
lowerleft     -- (Sequence2 of Real)
                 Inherited from GlutTextBase
                 Default: (320, 240)
on            -- (Boolean)
                 Inherited from GlutTextBase
                 Default: True
orientation   -- (Real)
                 Default: 0.0
text          -- (String)
                 Inherited from GlutTextBase
                 Default: the string to display



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'font':(glut.GLUT_STROKE_ROMAN, ve_...

Inherited from ClassWithParameters: __safe_for_unpickling__, constant_parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: GlutTextBase.__init__

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'font':(glut.GLUT_STROKE_ROMAN, ve_types.Integer), 'orientation':(0.0\
, ve_types.Real), 'linewidth':(3.0, ve_types.Real), 'anti_aliasing':(T\
rue, ve_types.Boolean),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Text.Text-class.html0000644000076500000240000004234211224565531024102 0ustar astrawstaff VisionEgg.Text.Text
Package VisionEgg :: Module Text :: Class Text
[frames] | no frames]

Class Text

source code

               object --+                
                        |                
      ClassWithParameters --+            
                            |            
                Core.Stimulus --+        
                                |        
Textures.TextureStimulusBaseClass --+    
                                    |    
             Textures.TextureStimulus --+
                                        |
                                       Text

Single line of text rendered using pygame/SDL true type fonts.

Parameters
==========
anchor                -- specifies how position parameter is interpreted (String)
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: lowerleft
angle                 -- units: degrees, 0=right, 90=up (Real)
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: 0.0
color                 -- texture environment color. alpha ignored (if given) for max_alpha parameter (AnyOf(Sequence3 of Real or Sequence4 of Real))
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: (1.0, 1.0, 1.0)
depth_test            -- perform depth test? (Boolean)
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: False
ignore_size_parameter -- (Boolean)
                         Default: True
mask                  -- optional masking function (Instance of <class 'VisionEgg.Textures.Mask2D'>)
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: (determined at runtime)
max_alpha             -- controls opacity. 1.0=copletely opaque, 0.0=completely transparent (Real)
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: 1.0
on                    -- draw stimulus? (Boolean)
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: True
position              -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real))
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: (0.0, 0.0)
size                  -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real)
                         Inherited from VisionEgg.Textures.TextureStimulus
                         Default: (determined at runtime)
text                  -- (AnyOf(String or Unicode))
                         Default: the string to display
texture               -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>)
                         Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                         Default: (determined at runtime)
texture_mag_filter    -- OpenGL filter enum (Integer)
                         Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                         Default: GL_LINEAR (9729)
texture_min_filter    -- OpenGL filter enum (Integer)
                         Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                         Default: (GL enum determined at runtime)
texture_wrap_s        -- OpenGL texture wrap enum (Integer)
                         Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                         Default: (GL enum determined at runtime)
texture_wrap_t        -- OpenGL texture wrap enum (Integer)
                         Inherited from VisionEgg.Textures.TextureStimulusBaseClass
                         Default: (GL enum determined at runtime)

Constant Parameters
===================
font_name         -- (AnyOf(String or Unicode))
                     Default: (determined at runtime)
font_size         -- (UnsignedInteger)
                     Default: 30
internal_format   -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer)
                     Inherited from VisionEgg.Textures.TextureStimulus
                     Default: GL_RGB (6407)
mipmaps_enabled   -- Are mipmaps enabled? (Boolean)
                     Inherited from VisionEgg.Textures.TextureStimulus
                     Default: True
shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean)
                     Inherited from VisionEgg.Textures.TextureStimulus
                     Default: False



Instance Methods
 
__init__(self, **kw) source code
 
draw(self) source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'text':('the string to display', ve...
  constant_parameters_and_defaults = {'font_size':(30, ve_types....

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Overrides: Textures.TextureStimulusBaseClass.__init__

Class Variable Details

parameters_and_defaults

Value:
{'text':('the string to display', ve_types.AnyOf(ve_types.String, ve_t\
ypes.Unicode)), 'ignore_size_parameter':(True, ve_types.Boolean),}

constant_parameters_and_defaults

Value:
{'font_size':(30, ve_types.UnsignedInteger), 'font_name':(None, ve_typ\
es.AnyOf(ve_types.String, ve_types.Unicode)),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures-module.html0000644000076500000240000002510111224565531024230 0ustar astrawstaff VisionEgg.Textures
Package VisionEgg :: Module Textures
[frames] | no frames]

Module Textures

source code


Texture (images mapped onto polygons) stimuli.



Classes
  Texture
A 2 dimensional texture.
  TextureFromFile
DEPRECATED.
  TextureObject
Texture data in OpenGL.
  TextureStimulusBaseClass
Parameters common to all stimuli that use textures.
  Mask2D
A mask for windowing a portion of a texture.
  TextureStimulus
A textured rectangle.
  TextureStimulus3D
A textured rectangle placed arbitrarily in 3 space.
  SpinningDrum
Panoramic image texture mapped onto flat rectangle or 3D cylinder.
  FixationCross
Cross useful for fixation point.
  TextureTooLargeError
Functions
 
convert_to_numpy_if_array(A) source code
 
next_power_of_2(f) source code
 
is_power_of_2(f) source code
Variables
  shrink_filter = Image.BICUBIC
  array_types = [numpy.ndarray]
visionegg-1.2.1/doc/reference/html/VisionEgg.Textures-pysrc.html0000644000076500000240000232665211224565531024124 0ustar astrawstaff VisionEgg.Textures
Package VisionEgg :: Module Textures
[frames] | no frames]

Source Code for Module VisionEgg.Textures

   1  # The Vision Egg: Textures 
   2  # 
   3  # Copyright (C) 2001-2004 Andrew Straw 
   4  # Copyright (C) 2004-2008 California Institute of Technology 
   5  # 
   6  # URL: <http://www.visionegg.org/> 
   7  # 
   8  # Distributed under the terms of the GNU Lesser General Public License 
   9  # (LGPL). See LICENSE.TXT that came with this file. 
  10   
  11  """ 
  12  Texture (images mapped onto polygons) stimuli. 
  13   
  14  """ 
  15   
  16  #################################################################### 
  17  # 
  18  #        Import all the necessary packages 
  19  # 
  20  #################################################################### 
  21   
  22  import logging                              # available in Python 2.3 
  23   
  24  import VisionEgg 
  25  import VisionEgg.Core 
  26  import VisionEgg.ParameterTypes as ve_types 
  27   
  28  import Image, ImageDraw                         # Python Imaging Library packages 
  29  import pygame.surface, pygame.image             # pygame 
  30  import math, types, os 
  31  import numpy 
  32  import numpy.oldnumeric as numpyNumeric, numpy.oldnumeric.mlab as MLab 
  33   
  34  import VisionEgg.GL as gl # get all OpenGL stuff in one namespace 
  35  import OpenGL.GLU as glu 
  36   
  37  # These modules are part of PIL and get loaded as needed by Image. 
  38  # They are listed here so that Gordon McMillan's Installer properly 
  39  # locates them.  You will not hurt anything other than your ability to 
  40  # make executables using Intaller if you remove these lines. 
  41  import _imaging 
  42  import ImageFile, ImageFileIO, BmpImagePlugin, JpegImagePlugin, PngImagePlugin 
  43   
  44  if Image.VERSION >= '1.1.3': 
  45      shrink_filter = Image.ANTIALIAS # Added in PIL 1.1.3 
  46  else: 
  47      shrink_filter = Image.BICUBIC # Fallback filtering 
  48   
  49  array_types = [numpy.ndarray] 
  50  # Allow use of numarray and original Numeric texels without requiring either 
  51  try: 
  52      import numarray 
  53      array_types.append( numarray.numarraycore.NumArray ) 
  54  except ImportError: 
  55      pass 
  56  try: 
  57      import Numeric as orig_Numeric 
  58      array_types.append( orig_Numeric.ArrayType ) 
  59  except ImportError: 
  60      pass 
  61   
63 if type(A) in array_types: 64 # with late release Numeric and numarray this is a view of the data 65 return numpy.asarray(A) 66 else: 67 return A
68 69 #################################################################### 70 # 71 # XXX ToDo: 72 73 # The main remaining feature to add to this module is automatic 74 # management of texture objects. This would allow many small images 75 # (e.g. a bit of text) to live in one large texture object. This 76 # would be much faster when many small textures are drawn in rapid 77 # succession. (Apparently this might not be such a big improvement on 78 # OS X. (See http://crystal.sourceforge.net/phpwiki/index.php?MacXGL) 79 80 # Here's a sample from Apple's TextureRange demo which is supposed 81 # to speed up texture transfers. 82 # glBindTextures( target, &texID); 83 # glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); 84 # glTexImage2D(target, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,image_ptr); 85 # Update the texture with: 86 # glTexSubImage2D(target, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,image_ptr); 87 88 #################################################################### 89 90 #################################################################### 91 # 92 # Textures 93 # 94 #################################################################### 95
96 -def next_power_of_2(f):
97 return int(math.pow(2.0,math.ceil(math.log(f)/math.log(2.0))))
98
99 -def is_power_of_2(f):
100 return f == next_power_of_2(f)
101
102 -class Texture(object):
103 """A 2 dimensional texture. 104 105 The pixel data can come from an image file, an image file stream, 106 an instance of Image from the Python Imaging Library, a numpy 107 array, or None. 108 109 If the data is a numpy array, floating point numbers are assumed 110 to be in the range 0.0 to 1.0, and integers are assumed to be in 111 the range 0 to 255. The first index is the row (y position), the 112 second index is the column (x position), and if it's RGB or RGBA 113 data, the third index specifies the color band. Thus, if the 114 texel data was 640 pixels wide by 480 pixels tall, the array would 115 have shape (480,640) for luminance information, (480,640,3) for 116 RGB information, and (480,640,4) for RGBA information. 117 118 The 2D texture data is not sent to OpenGL (video texture memory) 119 until the load() method is called. The unload() method may be 120 used to remove the data from OpenGL. 121 122 A reference to the original image data is maintained.""" 123 124 __slots__ = ('texels', 125 'texture_object', 126 'size', 127 '_filename', 128 '_file_stream', 129 'buf_lf', 130 'buf_rf', 131 'buf_bf', 132 'buf_tf', 133 '_buf_l', 134 '_buf_r', 135 '_buf_b', 136 '_buf_t', 137 ) 138
139 - def __init__(self,texels=None,size=None):
140 """Creates instance of Texture object. 141 142 texels -- Texture data. If not specified, a blank white 143 texture is created. 144 size -- If a tuple, force size of texture data if possible, 145 raising an exception if not. If None, has no effect. 146 """ 147 148 if texels is None: # no texel data: make default 149 if size is None: 150 size = (256,256) # an arbitrary default size 151 texels = Image.new("RGB",size,(255,255,255)) # white 152 153 if type(texels) == types.FileType: 154 texels = Image.open(texels) # Attempt to open as an image file 155 elif type(texels) in (types.StringType,types.UnicodeType): 156 # is this string a filename or raw image data? 157 if os.path.isfile(texels): 158 # cache filename and file stream for later use (if possible) 159 self._filename = texels 160 self._file_stream = open(texels,"rb") 161 texels = Image.open(texels) # Attempt to open as an image stream 162 163 texels = convert_to_numpy_if_array(texels) 164 165 if isinstance(texels, Image.Image): # PIL Image 166 if texels.mode == 'P': # convert from paletted 167 texels = texels.convert('RGBX') 168 self.size = texels.size 169 elif isinstance(texels, pygame.surface.Surface): # pygame surface 170 self.size = texels.get_size() 171 elif isinstance(texels,numpy.ndarray): # numpy array 172 if len(texels.shape) == 3: 173 if texels.shape[2] not in [3,4]: 174 raise ValueError("Only luminance (rank 2), and RGB, RGBA (rank 3) arrays allowed") 175 elif len(texels.shape) != 2: 176 raise ValueError("Only luminance (rank 2), and RGB, RGBA (rank 3) arrays allowed") 177 self.size = ( texels.shape[1], texels.shape[0] ) 178 else: 179 raise TypeError("texel data could not be recognized. (Use a PIL Image, numpy array, or pygame surface.)") 180 181 self.texels = texels 182 self.texture_object = None 183 184 if size is not None and size != self.size: 185 raise ValueError("size was specified, but data could not be rescaled")
186
187 - def update(self):
188 """Update texture data 189 190 This method does nothing, but may be overriden in classes that 191 need to update their texture data whenever drawn. 192 193 It it called by the draw() method of any stimuli using 194 textures when its texture object is active, so it can safely 195 use put_sub_image() to manipulate its own texture data. 196 """ 197 pass
198
199 - def make_half_size(self):
200 if self.texture_object is not None: 201 raise RuntimeError("make_half_size() only available BEFORE texture loaded to OpenGL.") 202 203 if isinstance(self.texels,Image.Image): 204 w = self.size[0]/2 205 h = self.size[1]/2 206 small_texels = self.texels.resize((w,h),shrink_filter) 207 self.texels = small_texels 208 self.size = (w,h) 209 else: 210 raise NotImplementedError("Texture too large, but rescaling only implemented for PIL images.")
211
212 - def unload(self):
213 """Unload texture data from video texture memory. 214 215 This only removes data from the video texture memory if there 216 are no other references to the TextureObject instance. To 217 ensure this, all references to the texture_object argument 218 passed to the load() method should be deleted.""" 219 220 self.texture_object = None
221
222 - def get_texels_as_image(self):
223 """Return texel data as PIL image""" 224 if isinstance(self.texels,numpy.ndarray): 225 if len(self.texels.shape) == 2: 226 a = self.texels 227 if a.dtype == numpy.uint8: 228 mode = "L" 229 elif a.dtype == numpy.float32: 230 mode = "F" 231 else: 232 raise ValueError("unsupported image mode") 233 return Image.fromstring(mode, (a.shape[1], a.shape[0]), a.tostring()) 234 else: 235 raise NotImplementedError("Currently only luminance data can be converted to images") 236 elif isinstance(self.texels, Image.Image): 237 return self.texels 238 else: 239 raise NotImplementedError("Don't know how to convert texel data to PIL image")
240
241 - def get_pixels_as_image(self):
242 logger = logging.getLogger('VisionEgg.Textures') 243 logger.warning("Using deprecated method get_pixels_as_image(). " 244 "Use get_texels_as_image() instead.") 245 return self.get_texels_as_image()
246
247 - def load(self, 248 texture_object, 249 build_mipmaps = True, 250 rescale_original_to_fill_texture_object = False, 251 internal_format=gl.GL_RGB):
252 """Load texture data to video texture memory. 253 254 This will cause the texture data to become resident in OpenGL 255 video texture memory, enabling fast drawing. 256 257 The texture_object argument is used to specify an instance of 258 the TextureObject class, which is a wrapper for the OpenGL 259 texture object holding the resident texture. 260 261 To remove a texture from OpenGL's resident textures: TextureObject passed as the texture_object argument and 2) 262 call the unload() method""" 263 264 assert( isinstance( texture_object, TextureObject )) 265 assert( texture_object.dimensions == 2 ) 266 267 width, height = self.size 268 269 width_pow2 = next_power_of_2(width) 270 height_pow2 = next_power_of_2(height) 271 272 if rescale_original_to_fill_texture_object: 273 if not isinstance(self.texels,Image.Image): 274 raise NotImplementedError("Automatic rescaling not implemented for this texel data type.") 275 276 # fractional coverage 277 self.buf_lf = 0.0 278 self.buf_rf = float(width)/width_pow2 279 self.buf_bf = 0.0 280 self.buf_tf = float(height)/height_pow2 281 282 # absolute (texel units) coverage 283 self._buf_l = 0 284 self._buf_r = width 285 self._buf_b = 0 286 self._buf_t = height 287 288 if width != width_pow2 or height != height_pow2: 289 if isinstance(self.texels,numpy.ndarray): 290 if len(self.texels.shape) == 2: 291 buffer = numpy.zeros( (height_pow2,width_pow2), dtype=self.texels.dtype ) 292 buffer[0:height,0:width] = self.texels 293 elif len(self.texels.shape) == 3: 294 buffer = numpy.zeros( (height_pow2,width_pow2,self.texels.shape[2]), dtype=self.texels.dtype ) 295 buffer[0:height,0:width,:] = self.texels 296 else: 297 raise RuntimeError("Unexpected shape for self.texels") 298 299 elif isinstance(self.texels, Image.Image): # PIL Image 300 if rescale_original_to_fill_texture_object: 301 # reset coverage values 302 self.buf_lf = 0.0 303 self.buf_rf = 1.0 304 self.buf_bf = 0.0 305 self.buf_tf = 1.0 306 307 self._buf_l = 0 308 self._buf_r = width_pow2 309 self._buf_t = 0 310 self._buf_b = height_pow2 311 312 buffer = self.texels.resize((width_pow2,height_pow2),shrink_filter) 313 314 self.size = (width_pow2, height_pow2) 315 else: 316 buffer = Image.new(self.texels.mode,(width_pow2, height_pow2)) 317 buffer.paste( self.texels, (0,height_pow2-height,width,height_pow2)) 318 elif isinstance(self.texels, pygame.surface.Surface): # pygame surface 319 buffer = pygame.surface.Surface( (width_pow2, height_pow2), 320 self.texels.get_flags(), 321 self.texels.get_bitsize() ) 322 buffer.blit( self.texels, (0,height_pow2-height) ) 323 else: 324 raise RuntimeError("texel data not recognized - changed?") 325 else: 326 buffer = self.texels 327 328 # Put data in texture object 329 if not build_mipmaps: 330 texture_object.put_new_image( buffer, internal_format=internal_format, mipmap_level=0 ) 331 else: 332 if 0: 333 # Build mipmaps with GLU (faster, but currently broken) 334 texture_object.put_new_image_build_mipmaps( buffer, internal_format=internal_format ) 335 else: 336 # Build mipmaps in PIL 337 texture_object.put_new_image( buffer, internal_format=internal_format, mipmap_level=0 ) 338 if not isinstance(self.texels, Image.Image): # PIL Image 339 raise NotImplementedError( 340 "Building of mipmaps not implemented for this texel "+\ 341 "data type. (Use PIL Images or set parameter "+\ 342 "mipmaps_enabled = False.)") 343 this_width, this_height = self.size 344 biggest_dim = max(this_width,this_height) 345 mipmap_level = 1 346 while biggest_dim > 1: 347 this_width = this_width/2.0 348 this_height = this_height/2.0 349 350 width_pix = int(math.ceil(this_width)) 351 height_pix = int(math.ceil(this_height)) 352 shrunk = self.texels.resize((width_pix,height_pix),shrink_filter) 353 354 width_pow2 = next_power_of_2(width_pix) 355 height_pow2 = next_power_of_2(height_pix) 356 357 im = Image.new(shrunk.mode,(width_pow2,height_pow2)) 358 im.paste(shrunk,(0,height_pow2-height_pix,width_pix,height_pow2)) 359 360 texture_object.put_new_image( im, 361 mipmap_level=mipmap_level, 362 internal_format = internal_format, 363 check_opengl_errors = False, # no point -- we've already seen biggest texture work, we're just making mipmap 364 ) 365 366 mipmap_level += 1 367 biggest_dim = max(this_width,this_height) 368 369 # Keep reference to texture_object 370 self.texture_object = texture_object
371
372 - def get_texture_object(self):
373 return self.texture_object
374
375 -class TextureFromFile( Texture ):
376 """DEPRECATED."""
377 - def __init__(self, filename ):
378 logger = logging.getLogger('VisionEgg.Textures') 379 logger.warning("class TextureFromFile deprecated, use class " 380 "Texture instead.") 381 Texture.__init__(self, filename)
382
383 -class TextureObject(object):
384 """Texture data in OpenGL. Potentially resident in video texture memory. 385 386 This class encapsulates the state variables in OpenGL texture objects. Do not 387 change attribute values directly. Use the methods provided instead.""" 388 389 __slots__ = ( 390 'min_filter', 391 'mag_filter', 392 'wrap_mode_r', # if dimensions > 2 393 'wrap_mode_s', 394 'wrap_mode_t', # if dimensions > 1 395 'border_color', 396 'target', 397 'dimensions', 398 'gl_id', 399 '__gl_module__', 400 ) 401 402 _cube_map_side_names = ['positive_x', 'negative_x', 403 'positive_y', 'negative_y', 404 'positive_z', 'negative_z'] 405
406 - def __init__(self, 407 dimensions = 2):
408 if dimensions not in [1,2,3,'cube']: 409 raise ValueError("TextureObject dimensions must be 1,2,3, or 'cube'") 410 # default OpenGL values for these values 411 self.min_filter = gl.GL_NEAREST_MIPMAP_LINEAR 412 self.mag_filter = gl.GL_LINEAR 413 self.wrap_mode_s = gl.GL_REPEAT 414 if dimensions != 1: 415 self.wrap_mode_t = gl.GL_REPEAT 416 if dimensions == 3: 417 self.wrap_mode_r = gl.GL_REPEAT 418 self.border_color = (0, 0, 0, 0) 419 420 if dimensions == 1: 421 self.target = gl.GL_TEXTURE_1D 422 elif dimensions == 2: 423 self.target = gl.GL_TEXTURE_2D 424 elif dimensions == 3: 425 self.target = gl.GL_TEXTURE_3D 426 elif dimensions == 'cube': 427 self.target = gl.GL_TEXTURE_CUBE 428 429 self.dimensions = dimensions 430 self.gl_id = gl.glGenTextures(1) 431 self.__gl_module__ = gl # keep so we there's no error in __del__
432
433 - def __del__(self):
434 self.__gl_module__.glDeleteTextures(self.gl_id)
435
436 - def is_resident(self):
437 return gl.glAreTexturesResident( self.gl_id )
438
439 - def set_priority(self, priority):
440 gl.glPrioritizeTextures( [self.gl_id], [priority] )
441
442 - def set_min_filter(self, filter):
443 gl.glBindTexture(self.target, self.gl_id) 444 gl.glTexParameteri( self.target, gl.GL_TEXTURE_MIN_FILTER,filter) 445 self.min_filter = filter
446
447 - def set_mag_filter(self, filter):
448 gl.glBindTexture( self.target, self.gl_id) 449 gl.glTexParameteri( self.target, gl.GL_TEXTURE_MAG_FILTER, filter) 450 self.mag_filter = filter
451
452 - def set_wrap_mode_s(self, wrap_mode):
453 """Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER""" 454 gl.glBindTexture( self.target, self.gl_id) 455 gl.glTexParameteri( self.target, gl.GL_TEXTURE_WRAP_S, wrap_mode) 456 self.wrap_mode_s = wrap_mode
457
458 - def set_wrap_mode_t(self, wrap_mode):
459 """Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER""" 460 gl.glBindTexture( self.target, self.gl_id) 461 gl.glTexParameteri( self.target, gl.GL_TEXTURE_WRAP_T, wrap_mode) 462 self.wrap_mode_t = wrap_mode
463
464 - def set_wrap_mode_r(self, wrap_mode):
465 """Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER""" 466 gl.glBindTexture( self.target, self.gl_id) 467 gl.glTexParameteri( self.target, gl.GL_TEXTURE_WRAP_R, wrap_mode) 468 self.wrap_mode_r = wrap_mode
469
470 - def set_border_color(self, border_color):
471 """Set to a sequence of 4 floats in the range 0.0 to 1.0""" 472 gl.glBindTexture( self.target, self.gl_id) 473 gl.glTexParameteriv( self.target, gl.GL_TEXTURE_BORDER_COLOR, border_color) 474 self.border_color = border_color
475
476 - def put_new_image(self, 477 texel_data, 478 mipmap_level = 0, 479 border = 0, 480 check_opengl_errors = True, 481 internal_format = gl.GL_RGB, 482 data_format = None, # automatic guess unless set explicitly 483 data_type = None, # automatic guess unless set explicitly 484 cube_side = None, 485 ):
486 487 """Put numpy array or PIL Image into OpenGL as texture data. 488 489 The texel_data parameter contains the texture data. If it is 490 a numpy array, it must be 1D, 2D, or 3D data in grayscale or 491 color (RGB or RGBA). Remember that OpenGL begins its textures 492 from the lower left corner, so texel_data[0,:] = 1.0 would set 493 the bottom line of the texture to white, while texel_data[:,0] 494 = 1.0 would set the left line of the texture to white. 495 496 The mipmap_level parameter specifies which of the texture 497 object's mipmap arrays you are filling. 498 499 The border parameter specifies the width of the border. 500 501 The check_opengl_errors parameter turns on (more 502 comprehensible) error messages when something goes wrong. It 503 also slows down performance a little bit. 504 505 The internal_format parameter specifies the format in which 506 the image data is stored on the video card. See the OpenGL 507 specification for all possible values. 508 509 If the data_format parameter is None (the default), an attempt 510 is made to guess data_format according to the following 511 description. For numpy arrays: If texel_data.shape is equal 512 to the dimensions of the texture object, texel_data is assumed 513 to contain luminance (grayscale) information and data_format 514 is set to GL_LUMINANCE. If texel_data.shape is equal to one 515 plus the dimensions of the texture object, texel_data is 516 assumed to contain color information. If texel_data.shape[-1] 517 is 3, this is assumed to be RGB data and data_format is set to 518 GL_RGB. If, texel_data.shape[-1] is 4, this is assumed to be 519 RGBA data and data_format is set to GL_RGBA. For PIL images: 520 the "mode" attribute is queried. 521 522 If the data_type parameter is None (the default), it is set to 523 GL_UNSIGNED_BYTE. For numpy arrays: texel_data is (re)cast 524 to UInt8 and, if it is a floating point type, values are 525 assumed to be in the range 0.0-1.0 and are scaled to the range 526 0-255. If the data_type parameter is not None, the texel_data 527 is not rescaled or recast. Currently only GL_UNSIGNED_BYTE is 528 supported. For PIL images: texel_data is used as unsigned 529 bytes. This is the usual format for common computer graphics 530 files.""" 531 532 texel_data = convert_to_numpy_if_array(texel_data) 533 if isinstance(texel_data,numpy.ndarray): 534 if self.dimensions != 'cube': 535 assert(cube_side == None) 536 data_dimensions = len(texel_data.shape) 537 assert((data_dimensions == self.dimensions) or (data_dimensions == self.dimensions+1)) 538 else: 539 assert(cube_side in TextureObject._cube_map_side_names) 540 elif isinstance(texel_data,Image.Image): 541 assert( self.dimensions == 2 ) 542 elif isinstance(texel_data,pygame.surface.Surface): 543 assert( self.dimensions == 2 ) 544 else: 545 raise TypeError("Expecting numpy array, PIL image, or pygame surface") 546 547 # make myself the active texture 548 gl.glBindTexture(self.target, self.gl_id) 549 550 # Determine the data_format, data_type and rescale the data if needed 551 if data_format is None: # guess the format of the data 552 if isinstance(texel_data,numpy.ndarray): 553 if len(texel_data.shape) == self.dimensions: 554 data_format = gl.GL_LUMINANCE 555 elif len(texel_data.shape) == (self.dimensions+1): 556 if texel_data.shape[-1] == 3: 557 data_format = gl.GL_RGB 558 elif texel_data.shape[-1] == 4: 559 data_format = gl.GL_RGBA 560 else: 561 raise RuntimeError("Couldn't determine a format for your texel_data.") 562 else: 563 raise RuntimeError("Couldn't determine a format for your texel_data.") 564 elif isinstance(texel_data,Image.Image): 565 if texel_data.mode == 'L': 566 data_format = gl.GL_LUMINANCE 567 elif texel_data.mode == 'RGB': 568 data_format = gl.GL_RGB 569 elif texel_data.mode in ('RGBA','RGBX'): 570 data_format = gl.GL_RGBA 571 elif texel_data.mode == 'P': 572 raise NotImplementedError("Paletted images are not supported.") 573 else: 574 raise RuntimeError("Couldn't determine format for your texel_data. (PIL mode = '%s')"%texel_data.mode) 575 elif isinstance(texel_data,pygame.surface.Surface): 576 if texel_data.get_alpha(): 577 data_format = gl.GL_RGBA 578 else: 579 data_format = gl.GL_RGB 580 581 if data_type is None: # guess the data type 582 data_type = gl.GL_UNSIGNED_BYTE 583 if isinstance(texel_data,numpy.ndarray): 584 if texel_data.dtype == numpy.float: 585 texel_data = texel_data*255.0 586 587 if data_type == gl.GL_UNSIGNED_BYTE: 588 if isinstance(texel_data,numpy.ndarray): 589 texel_data = texel_data.astype(numpy.uint8) # (re)cast if necessary 590 else: 591 raise NotImplementedError("Only data_type GL_UNSIGNED_BYTE currently supported") 592 593 # determine size and make sure its power of 2 594 if self.dimensions == 1: 595 # must be numpy array 596 width = texel_data.shape[0] 597 if not is_power_of_2(width): raise ValueError("texel_data does not have all dimensions == n^2") 598 else: 599 if isinstance(texel_data,numpy.ndarray): 600 width = texel_data.shape[1] 601 height = texel_data.shape[0] 602 elif isinstance(texel_data,Image.Image): 603 width, height = texel_data.size 604 elif isinstance(texel_data,pygame.surface.Surface): 605 width, height = texel_data.get_size() 606 if not is_power_of_2(width): raise ValueError("texel_data does not have all dimensions == n^2") 607 if not is_power_of_2(height): raise ValueError("texel_data does not have all dimensions == n^2") 608 if self.dimensions == 3: 609 # must be numpy array 610 depth = texel_data.shape[2] 611 if not is_power_of_2(depth): raise ValueError("texel_data does not have all dimensions == n^2") 612 613 if self.dimensions in [2,'cube']: 614 if isinstance(texel_data,numpy.ndarray): 615 raw_data = texel_data.tostring() 616 elif isinstance(texel_data,Image.Image): 617 raw_data = texel_data.tostring('raw',texel_data.mode,0,-1) 618 elif isinstance(texel_data,pygame.surface.Surface): 619 if texel_data.get_alpha(): 620 raw_data = pygame.image.tostring(texel_data,'RGBA',1) 621 else: 622 raw_data = pygame.image.tostring(texel_data,'RGB',1) 623 624 # check for OpenGL errors 625 if check_opengl_errors: 626 max_dim = gl.glGetIntegerv( gl.GL_MAX_TEXTURE_SIZE ) 627 if width > max_dim: 628 raise TextureTooLargeError("texel_data is too wide for your video system.") 629 if self.dimensions == 1: 630 gl.glTexImage1Dub(gl.GL_PROXY_TEXTURE_1D, 631 mipmap_level, 632 internal_format, 633 border, 634 data_format, 635 texel_data) 636 if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_1D,mipmap_level,gl.GL_TEXTURE_WIDTH) == 0: 637 raise TextureTooLargeError("texel_data is too wide for your video system.") 638 elif self.dimensions in [2,'cube']: 639 if height > max_dim: 640 raise TextureTooLargeError("texel_data is too tall for your video system.") 641 if self.dimensions == 2: 642 target = gl.GL_PROXY_TEXTURE_2D 643 else: 644 target = gl.GL_PROXY_CUBE_MAP 645 gl.glTexImage2D(target, 646 mipmap_level, 647 internal_format, 648 width, 649 height, 650 border, 651 data_format, 652 data_type, 653 raw_data) 654 if gl.glGetTexLevelParameteriv(target, # Need PyOpenGL >= 2.0 655 mipmap_level, 656 gl.GL_TEXTURE_WIDTH) == 0: 657 raise TextureTooLargeError("texel_data is too wide for your video system.") 658 if gl.glGetTexLevelParameteriv(target,mipmap_level,gl.GL_TEXTURE_HEIGHT) == 0: 659 raise TextureTooLargeError("texel_data is too tall for your video system.") 660 elif self.dimensions == 3: 661 if max(height,depth) > max_dim: 662 raise TextureTooLargeError("texel_data is too large for your video system.") 663 gl.glTexImage3Dub(gl.GL_PROXY_TEXTURE_3D, 664 mipmap_level, 665 internal_format, 666 border, 667 data_format, 668 texel_data) 669 if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_3D,mipmap_level,gl.GL_TEXTURE_WIDTH) == 0: 670 raise TextureTooLargeError("texel_data is too wide for your video system.") 671 if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_3D,mipmap_level,gl.GL_TEXTURE_HEIGHT) == 0: 672 raise TextureTooLargeError("texel_data is too tall for your video system.") 673 if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_3D,mipmap_level,gl.GL_TEXTURE_DEPTH) == 0: 674 raise TextureTooLargeError("texel_data is too deep for your video system.") 675 else: 676 raise RuntimeError("Unknown number of dimensions.") 677 678 # No OpenGL error, put the texture in! 679 if self.dimensions == 1: 680 gl.glTexImage1Dub(gl.GL_TEXTURE_1D, 681 mipmap_level, 682 internal_format, 683 border, 684 data_format, 685 texel_data) 686 elif self.dimensions in [2,'cube']: 687 if self.dimensions == 2: 688 target = gl.GL_TEXTURE_2D 689 else: 690 target_name = 'GL_CUBE_MAP_'+cube_side.upper() 691 target = getattr(gl,target_name) 692 gl.glTexImage2D(target, 693 mipmap_level, 694 internal_format, 695 width, 696 height, 697 border, 698 data_format, 699 data_type, 700 raw_data) 701 elif self.dimensions == 3: 702 gl.glTexImage3Dub(gl.GL_TEXTURE_3D, 703 mipmap_level, 704 internal_format, 705 border, 706 data_format, 707 texel_data) 708 else: 709 raise RuntimeError("Unknown number of dimensions.")
710
711 - def put_new_image_build_mipmaps(self, 712 texel_data, 713 internal_format = gl.GL_RGB, 714 data_format = None, # automatic guess unless set explicitly 715 data_type = None, # automatic guess unless set explicitly 716 cube_side = None, 717 ):
718 719 """Similar to put_new_image(), but builds mipmaps.""" 720 721 if self.dimensions != 2: 722 raise ValueError("can only handle 2D texel data for automatic mipmap building") 723 texel_data = convert_to_numpy_if_array(texel_data) 724 if isinstance(texel_data,numpy.ndarray): 725 assert(cube_side == None) 726 data_dimensions = len(texel_data.shape) 727 assert((data_dimensions == self.dimensions) or (data_dimensions == self.dimensions+1)) 728 elif isinstance(texel_data,Image.Image): 729 assert( self.dimensions == 2 ) 730 elif isinstance(texel_data,pygame.surface.Surface): 731 assert( self.dimensions == 2 ) 732 else: 733 raise TypeError("Expecting numpy array, PIL image, or pygame surface") 734 735 # make myself the active texture 736 gl.glBindTexture(self.target, self.gl_id) 737 738 # Determine the data_format, data_type and rescale the data if needed 739 if data_format is None: # guess the format of the data 740 if isinstance(texel_data,numpy.ndarray): 741 if len(texel_data.shape) == self.dimensions: 742 data_format = gl.GL_LUMINANCE 743 elif len(texel_data.shape) == (self.dimensions+1): 744 if texel_data.shape[-1] == 3: 745 data_format = gl.GL_RGB 746 elif texel_data.shape[-1] == 4: 747 data_format = gl.GL_RGBA 748 else: 749 raise RuntimeError("Couldn't determine a format for your texel_data.") 750 else: 751 raise RuntimeError("Couldn't determine a format for your texel_data.") 752 elif isinstance(texel_data,Image.Image): 753 if texel_data.mode == 'L': 754 data_format = gl.GL_LUMINANCE 755 elif texel_data.mode == 'RGB': 756 data_format = gl.GL_RGB 757 elif texel_data.mode in ['RGBA','RGBX']: 758 data_format = gl.GL_RGBA 759 elif texel_data.mode == 'P': 760 raise NotImplementedError("Paletted images are not supported.") 761 else: 762 raise RuntimeError("Couldn't determine format for your texel_data. (PIL mode = '%s')"%texel_data.mode) 763 elif isinstance(texel_data,pygame.surface.Surface): 764 if texel_data.get_alpha(): 765 data_format = gl.GL_RGBA 766 else: 767 data_format = gl.GL_RGB 768 769 if data_type is None: # guess the data type 770 data_type = gl.GL_UNSIGNED_BYTE 771 if isinstance(texel_data,numpy.ndarray): 772 if texel_data.dtype == numpy.float: 773 texel_data = texel_data*255.0 774 775 if data_type == gl.GL_UNSIGNED_BYTE: 776 if isinstance(texel_data,numpy.ndarray): 777 texel_data = texel_data.astype(numpy.uint8) # (re)cast if necessary 778 else: 779 raise NotImplementedError("Only data_type GL_UNSIGNED_BYTE currently supported") 780 781 if isinstance(texel_data,numpy.ndarray): 782 width = texel_data.shape[1] 783 height = texel_data.shape[0] 784 elif isinstance(texel_data,Image.Image): 785 width, height = texel_data.size 786 elif isinstance(texel_data,pygame.surface.Surface): 787 width, height = texel_data.get_size() 788 if not is_power_of_2(width): raise ValueError("texel_data does not have all dimensions == n^2") 789 if not is_power_of_2(height): raise ValueError("texel_data does not have all dimensions == n^2") 790 791 if isinstance(texel_data,numpy.ndarray): 792 raw_data = texel_data.tostring() 793 elif isinstance(texel_data,Image.Image): 794 raw_data = texel_data.tostring('raw',texel_data.mode,0,-1) 795 elif isinstance(texel_data,pygame.surface.Surface): 796 if texel_data.get_alpha(): 797 raw_data = pygame.image.tostring(texel_data,'RGBA',1) 798 else: 799 raw_data = pygame.image.tostring(texel_data,'RGB',1) 800 801 args = (self.target, 802 internal_format, 803 width, # XXX should be width_pow2? 804 height,# XXX should be height_pow2? 805 data_format, 806 data_type) 807 #raw_data) 808 print 'args',args 809 810 glu.gluBuild2DMipmaps(self.target, 811 internal_format, 812 width, # XXX should be width_pow2? 813 height,# XXX should be height_pow2? 814 data_format, 815 data_type, 816 raw_data)
817
818 - def put_sub_image(self, 819 texel_data, 820 mipmap_level = 0, 821 offset_tuple = None, 822 data_format = None, # automatic guess unless set explicitly 823 data_type = None, # automatic guess unless set explicitly 824 cube_side = None, 825 ):
826 827 """Replace all or part of a texture object. 828 829 This is faster that put_new_image(), and can be used to 830 rapidly update textures. 831 832 The offset_tuple parameter determines the lower left corner 833 (for 2D textures) of your data in pixel units. For example, 834 (0,0) would be no offset and thus the new data would be placed 835 in the lower left of the texture. 836 837 For an explanation of most parameters, see the 838 put_new_image() method.""" 839 840 texel_data = convert_to_numpy_if_array(texel_data) 841 if isinstance(texel_data,numpy.ndarray): 842 if self.dimensions != 'cube': 843 assert(cube_side == None) 844 data_dimensions = len(texel_data.shape) 845 assert((data_dimensions == self.dimensions) or (data_dimensions == self.dimensions+1)) 846 else: 847 assert(cube_side in TextureObject._cube_map_side_names) 848 elif isinstance(texel_data,Image.Image): 849 assert( self.dimensions == 2 ) 850 elif isinstance(texel_data,pygame.surface.Surface): 851 assert( self.dimensions == 2 ) 852 else: 853 raise TypeError("Expecting numpy array, PIL image, or pygame surface") 854 855 # make myself the active texture 856 gl.glBindTexture(self.target, self.gl_id) 857 858 # Determine the data_format, data_type and rescale the data if needed 859 data = texel_data 860 861 if data_format is None: # guess the format of the data 862 if isinstance(texel_data,numpy.ndarray): 863 if len(data.shape) == self.dimensions: 864 data_format = gl.GL_LUMINANCE 865 elif len(data.shape) == (self.dimensions+1): 866 if data.shape[-1] == 3: 867 data_format = gl.GL_RGB 868 elif data.shape[-1] == 4: 869 data_format = gl.GL_RGBA 870 else: 871 raise RuntimeError("Couldn't determine a format for your texel_data.") 872 else: 873 raise RuntimeError("Couldn't determine a format for your texel_data.") 874 elif isinstance(texel_data,Image.Image): 875 if data.mode == 'L': 876 data_format = gl.GL_LUMINANCE 877 elif data.mode == 'RGB': 878 data_format = gl.GL_RGB 879 elif data.mode in ['RGBA','RGBX']: 880 data_format = gl.GL_RGBA 881 elif data.mode == 'P': 882 raise NotImplementedError("Paletted images are not supported.") 883 else: 884 raise RuntimeError("Couldn't determine format for your texel_data. (PIL mode = '%s')"%data.mode) 885 elif isinstance(texel_data,pygame.surface.Surface): 886 if data.get_alpha(): 887 data_format = gl.GL_RGBA 888 else: 889 data_format = gl.GL_RGB 890 891 if data_type is None: # guess the data type 892 data_type = gl.GL_UNSIGNED_BYTE 893 if isinstance(data,numpy.ndarray): 894 if data.dtype == numpy.float: 895 data = data*255.0 896 897 if data_type == gl.GL_UNSIGNED_BYTE: 898 if isinstance(data,numpy.ndarray): 899 data = data.astype(numpy.uint8) # (re)cast if necessary 900 else: 901 raise NotImplementedError("Only data_type GL_UNSIGNED_BYTE currently supported") 902 903 if self.dimensions == 1: 904 if offset_tuple is None: 905 x_offset = 0 906 else: 907 x_offset = offset_tuple[0] 908 width = data.shape[0] 909 raw_data = data.astype(numpy.uint8).tostring() 910 gl.glTexSubImage1D(gl.GL_TEXTURE_1D, 911 mipmap_level, 912 x_offset, 913 width, 914 data_format, 915 data_type, 916 raw_data) 917 elif self.dimensions in [2,'cube']: 918 if self.dimensions == 2: 919 target = gl.GL_TEXTURE_2D 920 else: 921 target_name = 'GL_CUBE_MAP_'+cube_side.upper() 922 target = getattr(gl,target_name) 923 if offset_tuple is None: 924 x_offset = y_offset = 0 925 else: 926 x_offset, y_offset = offset_tuple 927 if isinstance(data,numpy.ndarray): 928 width = data.shape[1] 929 height = data.shape[0] 930 raw_data = data.astype(numpy.uint8).tostring() 931 elif isinstance(texel_data,Image.Image): 932 width = data.size[0] 933 height = data.size[1] 934 raw_data = data.tostring('raw',data.mode,0,-1) 935 elif isinstance(texel_data,pygame.surface.Surface): 936 width, height = texel_data.get_size() 937 if data.get_alpha(): 938 raw_data = pygame.image.tostring(texel_data,'RGBA',1) 939 else: 940 raw_data = pygame.image.tostring(texel_data,'RGB',1) 941 gl.glTexSubImage2D(target, 942 mipmap_level, 943 x_offset, 944 y_offset, 945 width, 946 height, 947 data_format, 948 data_type, 949 raw_data) 950 elif self.dimensions == 3: 951 raise RuntimeError("Cannot put_sub_image on 3D texture_object.") 952 else: 953 raise RuntimeError("Unknown number of dimensions.")
954
955 - def put_new_framebuffer(self, 956 buffer='back', 957 mipmap_level = 0, 958 border = 0, 959 framebuffer_lowerleft = None, 960 size = None, 961 internal_format = gl.GL_RGB, 962 cube_side = None, 963 ):
964 965 """Replace texture object with the framebuffer contents. 966 967 The framebuffer_lowerleft parameter determines the lower left 968 corner of the framebuffer region from which to copy texel data 969 in pixel units. For example, (0,0) would be no offset and 970 thus the new data would be placed from the lower left of the 971 framebuffer. 972 973 For an explanation of most parameters, see the 974 put_new_image() method.""" 975 976 if self.dimensions != 2: 977 raise RuntimeError("put_new_framebuffer only supported for 2D textures.") 978 979 if buffer == 'front': 980 gl.glReadBuffer( gl.GL_FRONT ) 981 elif buffer == 'back': 982 gl.glReadBuffer( gl.GL_BACK ) 983 else: 984 raise ValueError('No support for "%s" framebuffer'%buffer) 985 986 # make myself the active texture 987 gl.glBindTexture(self.target, self.gl_id) 988 989 if framebuffer_lowerleft is None: 990 framebuffer_lowerleft = (0,0) 991 x,y = framebuffer_lowerleft 992 993 if size is None: 994 raise ValueError("Must specify size for put_new_framebuffer(): cannot guess") 995 996 # determine size and make sure its power of 2 997 width, height = size 998 if not is_power_of_2(width): raise ValueError("texel_data does not have all dimensions == n^2") 999 if not is_power_of_2(height): raise ValueError("texel_data does not have all dimensions == n^2") 1000 1001 target = gl.GL_TEXTURE_2D 1002 gl.glCopyTexImage2D(target, 1003 mipmap_level, 1004 internal_format, 1005 x, 1006 y, 1007 width, 1008 height, 1009 border)
1010 1011 #################################################################### 1012 # 1013 # Stimulus - TextureStimulus 1014 # 1015 #################################################################### 1016
1017 -class TextureStimulusBaseClass(VisionEgg.Core.Stimulus):
1018 """Parameters common to all stimuli that use textures. 1019 1020 Don't instantiate this class directly. 1021 1022 Parameters 1023 ========== 1024 texture -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>) 1025 Default: (determined at runtime) 1026 texture_mag_filter -- OpenGL filter enum (Integer) 1027 Default: GL_LINEAR (9729) 1028 texture_min_filter -- OpenGL filter enum (Integer) 1029 Default: (GL enum determined at runtime) 1030 texture_wrap_s -- OpenGL texture wrap enum (Integer) 1031 Default: (GL enum determined at runtime) 1032 texture_wrap_t -- OpenGL texture wrap enum (Integer) 1033 Default: (GL enum determined at runtime) 1034 1035 Constant Parameters 1036 =================== 1037 internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) 1038 Default: GL_RGB (6407) 1039 mipmaps_enabled -- Are mipmaps enabled? (Boolean) 1040 Default: True 1041 shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) 1042 Default: False 1043 """ 1044 1045 parameters_and_defaults = { 1046 'texture':(None, 1047 ve_types.Instance(Texture), 1048 "source of texture data"), 1049 'texture_mag_filter':(gl.GL_LINEAR, 1050 ve_types.Integer, 1051 "OpenGL filter enum", 1052 VisionEgg.ParameterDefinition.OPENGL_ENUM), 1053 'texture_min_filter':(None, # defaults to gl.GL_LINEAR_MIPMAP_LINEAR (unless mipmaps_enabled False, then gl.GL_LINEAR) 1054 ve_types.Integer, 1055 "OpenGL filter enum", 1056 VisionEgg.ParameterDefinition.OPENGL_ENUM), 1057 'texture_wrap_s':(None, # set to gl.GL_CLAMP_TO_EDGE below 1058 ve_types.Integer, 1059 "OpenGL texture wrap enum", 1060 VisionEgg.ParameterDefinition.OPENGL_ENUM), 1061 'texture_wrap_t':(None, # set to gl.GL_CLAMP_TO_EDGE below 1062 ve_types.Integer, 1063 "OpenGL texture wrap enum", 1064 VisionEgg.ParameterDefinition.OPENGL_ENUM), 1065 } 1066 1067 constant_parameters_and_defaults = { 1068 'internal_format':(gl.GL_RGB,#None, 1069 ve_types.Integer, 1070 "format with which OpenGL uses texture data (OpenGL data type enum)", 1071 VisionEgg.ParameterDefinition.OPENGL_ENUM), 1072 'mipmaps_enabled':(True, 1073 ve_types.Boolean, 1074 "Are mipmaps enabled?"), 1075 'shrink_texture_ok':(False, 1076 ve_types.Boolean, 1077 "Allow automatic shrinking of texture if too big?"), 1078 } 1079 1080 __slots__ = ( 1081 'texture_object', 1082 '_using_texture', 1083 ) 1084 1085 _mipmap_modes = [gl.GL_LINEAR_MIPMAP_LINEAR,gl.GL_LINEAR_MIPMAP_NEAREST, 1086 gl.GL_NEAREST_MIPMAP_LINEAR,gl.GL_NEAREST_MIPMAP_NEAREST] 1087
1088 - def __init__(self,**kw):
1089 VisionEgg.Core.Stimulus.__init__(self,**kw) 1090 1091 if self.parameters.texture is None: 1092 # generate default texture 1093 self.parameters.texture = Texture() 1094 1095 if self.parameters.texture_min_filter is None: 1096 # generate default texture minimization filter 1097 if self.constant_parameters.mipmaps_enabled: 1098 self.parameters.texture_min_filter = gl.GL_LINEAR_MIPMAP_LINEAR 1099 else: 1100 self.parameters.texture_min_filter = gl.GL_LINEAR 1101 1102 if not self.constant_parameters.mipmaps_enabled: 1103 if self.parameters.texture_min_filter in TextureStimulusBaseClass._mipmap_modes: 1104 raise ValueError("texture_min_filter cannot be a mipmap type if mipmaps not enabled.") 1105 # We have to set these parameters here because we may have 1106 # re-assigned gl.GL_CLAMP_TO_EDGE. This allows us to use 1107 # symbol gl.GL_CLAMP_TO_EDGE even if our version of OpenGL 1108 # doesn't support it. 1109 if self.parameters.texture_wrap_s is None: 1110 self.parameters.texture_wrap_s = gl.GL_CLAMP_TO_EDGE 1111 if self.parameters.texture_wrap_t is None: 1112 self.parameters.texture_wrap_t = gl.GL_CLAMP_TO_EDGE 1113 1114 # Create an OpenGL texture object this instance "owns" 1115 self.texture_object = TextureObject(dimensions=2) 1116 1117 self._reload_texture()
1118
1119 - def _reload_texture(self):
1120 """(Re)load texture to OpenGL""" 1121 p = self.parameters 1122 self._using_texture = p.texture 1123 1124 if not self.constant_parameters.shrink_texture_ok: 1125 # send texture to OpenGL 1126 p.texture.load( self.texture_object, 1127 internal_format = self.constant_parameters.internal_format, 1128 build_mipmaps = self.constant_parameters.mipmaps_enabled ) 1129 else: 1130 max_dim = gl.glGetIntegerv( gl.GL_MAX_TEXTURE_SIZE ) 1131 resized = 0 1132 while max(p.texture.size) > max_dim: 1133 p.texture.make_half_size() 1134 resized = 1 1135 loaded_ok = 0 1136 while not loaded_ok: 1137 try: 1138 # send texture to OpenGL 1139 p.texture.load( self.texture_object, 1140 internal_format = self.constant_parameters.internal_format, 1141 build_mipmaps = self.constant_parameters.mipmaps_enabled ) 1142 except TextureTooLargeError: 1143 p.texture.make_half_size() 1144 resized = 1 1145 else: 1146 loaded_ok = 1 1147 if resized: 1148 logger = logging.getLogger('VisionEgg.Textures') 1149 logger.warning("Resized texture in %s to %d x %d"%( 1150 str(self),p.texture.size[0],p.texture.size[1]))
1151
1152 -class Mask2D(VisionEgg.ClassWithParameters):
1153 """A mask for windowing a portion of a texture. 1154 1155 Thanks to the author, Jon Peirce, of the AlphaStim class from the 1156 PsychoPy package from which the idea to do this came. 1157 1158 Constant Parameters 1159 =================== 1160 function -- 'gaussian' or 'circle' (String) 1161 Default: gaussian 1162 num_samples -- size of mask texture data (units: number of texels) (Sequence2 of Real) 1163 Default: (256, 256) 1164 radius_parameter -- radius for circle, sigma for gaussian (Real) 1165 Default: 25.0 1166 """ 1167 1168 # All of these parameters are constant -- if you need a new mask, create a new instance 1169 constant_parameters_and_defaults = { 1170 'function':('gaussian', # can be 'gaussian' or 'circle' 1171 ve_types.String, 1172 "'gaussian' or 'circle'"), 1173 'radius_parameter':(25.0, # radius for circle, sigma for gaussian, same units as num_samples 1174 ve_types.Real, 1175 "radius for circle, sigma for gaussian"), 1176 'num_samples':((256,256), # size of mask data in texels 1177 ve_types.Sequence2(ve_types.Real), 1178 "size of mask texture data (units: number of texels)"), 1179 }
1180 - def __init__(self,**kw):
1181 VisionEgg.ClassWithParameters.__init__(self,**kw) 1182 1183 cp = self.constant_parameters # shorthand 1184 width,height = cp.num_samples 1185 if width != next_power_of_2(width): 1186 raise RuntimeError("Mask must have width num_samples power of 2") 1187 if height != next_power_of_2(height): 1188 raise RuntimeError("Mask must have height num_samples power of 2") 1189 1190 gl.glActiveTextureARB(gl.GL_TEXTURE1_ARB) # Need PyOpenGL >= 2.0 1191 self.texture_object = TextureObject(dimensions=2) 1192 1193 if cp.function == "gaussian": 1194 xx = numpyNumeric.outerproduct(numpyNumeric.ones((1,cp.num_samples[1])), 1195 numpyNumeric.arange(0,cp.num_samples[0],1.0)-cp.num_samples[0]/2) 1196 yy = numpyNumeric.outerproduct(numpyNumeric.arange(0,cp.num_samples[1],1.0)-cp.num_samples[1]/2, 1197 numpyNumeric.ones((1,cp.num_samples[0]))) 1198 dist_from_center = numpyNumeric.sqrt(xx**2 + yy**2) 1199 sigma = cp.radius_parameter 1200 data = numpyNumeric.exp( -dist_from_center**2.0 / (2.0*sigma**2.0) ) 1201 elif cp.function == "circle": 1202 data = numpyNumeric.zeros(cp.num_samples,numpyNumeric.Float) 1203 # perform anti-aliasing in circle computation by computing 1204 # at several slightly different locations and averaging 1205 oversamples = 4 1206 x_offsets = numpyNumeric.arange(0.0,1.0,1.0/oversamples) 1207 x_offsets = x_offsets - MLab.mean(x_offsets) 1208 y_offsets = x_offsets 1209 for x_offset in x_offsets: 1210 for y_offset in y_offsets: 1211 xx = numpyNumeric.outerproduct(numpyNumeric.ones((1,cp.num_samples[1])), 1212 numpyNumeric.arange(0,cp.num_samples[0],1.0)-cp.num_samples[0]/2+0.5)+x_offset 1213 yy = numpyNumeric.outerproduct(numpyNumeric.arange(0,cp.num_samples[1],1.0)-cp.num_samples[1]/2+0.5, 1214 numpyNumeric.ones((1,cp.num_samples[0])))+y_offset 1215 dist_from_center = numpyNumeric.sqrt(xx**2 + yy**2) 1216 data += dist_from_center <= cp.radius_parameter 1217 data = data / float( len(x_offsets)*len(y_offsets) ) 1218 else: 1219 raise RuntimeError("Don't know about window function %s"%self.constant_parameters.function) 1220 1221 self.texture_object.put_new_image(data, 1222 data_format=gl.GL_ALPHA, 1223 internal_format=gl.GL_ALPHA) 1224 self.texture_object.set_min_filter(gl.GL_LINEAR) # turn off mipmaps for mask 1225 self.texture_object.set_wrap_mode_s(gl.GL_CLAMP_TO_EDGE) 1226 self.texture_object.set_wrap_mode_t(gl.GL_CLAMP_TO_EDGE) 1227 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) 1228 1229 # reset active texture unit to 0 1230 gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB)
1231
1232 - def draw_masked_quad_3d(self,lt,rt,bt,tt,v1,v2,v3,v4):
1233 # The *t parameters are the texture coordinates. 1234 1235 # By the time this method is called, GL_TEXTURE0_ARB should be 1236 # loaded as the texture object to be masked. 1237 1238 gl.glActiveTextureARB(gl.GL_TEXTURE1_ARB) # bind 2nd texture unit to mask texture 1239 gl.glBindTexture(gl.GL_TEXTURE_2D, self.texture_object.gl_id) 1240 gl.glEnable(gl.GL_TEXTURE_2D) 1241 1242 # The normal TEXTURE2D object is the 1st (TEXTURE0) texture unit 1243 gl.glBegin(gl.GL_QUADS) 1244 1245 gl.glMultiTexCoord2fARB(gl.GL_TEXTURE0_ARB,lt,bt) 1246 gl.glMultiTexCoord2fARB(gl.GL_TEXTURE1_ARB,0.0,0.0) 1247 gl.glVertex3f(*v1) 1248 1249 gl.glMultiTexCoord2fARB(gl.GL_TEXTURE0_ARB,rt,bt) 1250 gl.glMultiTexCoord2fARB(gl.GL_TEXTURE1_ARB,1.0,0.0) 1251 gl.glVertex3f(*v2) 1252 1253 gl.glMultiTexCoord2fARB(gl.GL_TEXTURE0_ARB,rt,tt) 1254 gl.glMultiTexCoord2fARB(gl.GL_TEXTURE1_ARB,1.0,1.0) 1255 gl.glVertex3f(*v3) 1256 1257 gl.glMultiTexCoord2fARB(gl.GL_TEXTURE0_ARB,lt,tt) 1258 gl.glMultiTexCoord2fARB(gl.GL_TEXTURE1_ARB,0.0,1.0) 1259 gl.glVertex3f(*v4) 1260 1261 gl.glEnd() # GL_QUADS 1262 gl.glDisable(gl.GL_TEXTURE_2D) # turn off texturing in this texture unit 1263 gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) # return to 1st texture unit
1264
1265 - def draw_masked_quad(self,lt,rt,bt,tt,le,re,be,te,depth):
1266 # The *t parameters are the texture coordinates. The *e 1267 # parameters are the eye coordinates for the vertices of the 1268 # quad. 1269 v1 = (le,be,depth) 1270 v2 = (re,be,depth) 1271 v3 = (re,te,depth) 1272 v4 = (le,te,depth) 1273 self.draw_masked_quad_3d(lt,rt,bt,tt,v1,v2,v3,v4)
1274
1275 -class TextureStimulus(TextureStimulusBaseClass):
1276 """A textured rectangle. 1277 1278 This is mainly for 2D use (z coordinate fixed to 0.0 and w 1279 coordinated fixed to 1.0 if not given). 1280 1281 1282 Parameters 1283 ========== 1284 anchor -- specifies how position parameter is interpreted (String) 1285 Default: lowerleft 1286 angle -- units: degrees, 0=right, 90=up (Real) 1287 Default: 0.0 1288 color -- texture environment color. alpha ignored (if given) for max_alpha parameter (AnyOf(Sequence3 of Real or Sequence4 of Real)) 1289 Default: (1.0, 1.0, 1.0) 1290 depth_test -- perform depth test? (Boolean) 1291 Default: False 1292 mask -- optional masking function (Instance of <class 'VisionEgg.Textures.Mask2D'>) 1293 Default: (determined at runtime) 1294 max_alpha -- controls opacity. 1.0=copletely opaque, 0.0=completely transparent (Real) 1295 Default: 1.0 1296 on -- draw stimulus? (Boolean) 1297 Default: True 1298 position -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) 1299 Default: (0.0, 0.0) 1300 size -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real) 1301 Default: (determined at runtime) 1302 texture -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>) 1303 Inherited from TextureStimulusBaseClass 1304 Default: (determined at runtime) 1305 texture_mag_filter -- OpenGL filter enum (Integer) 1306 Inherited from TextureStimulusBaseClass 1307 Default: GL_LINEAR (9729) 1308 texture_min_filter -- OpenGL filter enum (Integer) 1309 Inherited from TextureStimulusBaseClass 1310 Default: (GL enum determined at runtime) 1311 texture_wrap_s -- OpenGL texture wrap enum (Integer) 1312 Inherited from TextureStimulusBaseClass 1313 Default: (GL enum determined at runtime) 1314 texture_wrap_t -- OpenGL texture wrap enum (Integer) 1315 Inherited from TextureStimulusBaseClass 1316 Default: (GL enum determined at runtime) 1317 1318 Constant Parameters 1319 =================== 1320 internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) 1321 Default: GL_RGB (6407) 1322 mipmaps_enabled -- Are mipmaps enabled? (Boolean) 1323 Default: True 1324 shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) 1325 Default: False 1326 """ 1327 1328 parameters_and_defaults = { 1329 'on':(True, 1330 ve_types.Boolean, 1331 "draw stimulus?"), 1332 'mask':(None, # texture mask 1333 ve_types.Instance(Mask2D), 1334 "optional masking function"), 1335 'position':((0.0,0.0), # in eye coordinates 1336 ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), 1337 ve_types.Sequence3(ve_types.Real), 1338 ve_types.Sequence4(ve_types.Real)), 1339 "units: eye coordinates"), 1340 'anchor':('lowerleft', 1341 ve_types.String, 1342 "specifies how position parameter is interpreted"), 1343 'lowerleft':(None, # DEPRECATED -- don't use 1344 ve_types.Sequence2(ve_types.Real), 1345 "", 1346 VisionEgg.ParameterDefinition.DEPRECATED), 1347 'angle':(0.0, # in degrees 1348 ve_types.Real, 1349 "units: degrees, 0=right, 90=up"), 1350 'size':(None, 1351 ve_types.Sequence2(ve_types.Real), 1352 "defaults to texture data size (units: eye coordinates)"), 1353 'max_alpha':(1.0, # controls "opacity": 1.0 = completely opaque, 0.0 = completely transparent 1354 ve_types.Real, 1355 "controls opacity. 1.0=copletely opaque, 0.0=completely transparent"), 1356 'color':((1.0,1.0,1.0), # texture environment color. alpha is ignored (if given) -- use max_alpha parameter 1357 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 1358 ve_types.Sequence4(ve_types.Real)), 1359 "texture environment color. alpha ignored (if given) for max_alpha parameter"), 1360 'depth_test':(False, 1361 ve_types.Boolean, 1362 "perform depth test?"), 1363 } 1364
1365 - def draw(self):
1366 p = self.parameters 1367 if p.texture != self._using_texture: # self._using_texture is from TextureStimulusBaseClass 1368 self._reload_texture() 1369 if p.lowerleft != None: 1370 if not hasattr(VisionEgg.config,"_GAVE_LOWERLEFT_DEPRECATION"): 1371 logger = logging.getLogger('VisionEgg.Textures') 1372 logger.warning("Specifying texture by 'lowerleft' " 1373 "deprecated parameter deprecated. Use " 1374 "'position' parameter instead. (Allows " 1375 "use of 'anchor' parameter to set to " 1376 "other values.)") 1377 VisionEgg.config._GAVE_LOWERLEFT_DEPRECATION = 1 1378 p.anchor = 'lowerleft' 1379 p.position = p.lowerleft[0], p.lowerleft[1] # copy values (don't copy ref to tuple) 1380 if p.on: 1381 tex = p.texture 1382 1383 if p.size is None: 1384 # Note: 'size' attribute is not supposed to be part of the API, 1385 # so this is naughty. 1386 size = tex.size 1387 else: 1388 size = p.size 1389 1390 # calculate lowerleft corner 1391 lowerleft = VisionEgg._get_lowerleft(p.position,p.anchor,size) 1392 1393 # Clear the modelview matrix 1394 gl.glMatrixMode(gl.GL_MODELVIEW) 1395 gl.glPushMatrix() 1396 try: 1397 if p.depth_test: 1398 gl.glEnable(gl.GL_DEPTH_TEST) 1399 else: 1400 gl.glDisable(gl.GL_DEPTH_TEST) 1401 gl.glEnable( gl.GL_TEXTURE_2D ) 1402 1403 # allow max_alpha value to control blending 1404 gl.glEnable( gl.GL_BLEND ) 1405 gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) 1406 1407 if not self.constant_parameters.mipmaps_enabled: 1408 if p.texture_min_filter in TextureStimulusBaseClass._mipmap_modes: 1409 raise RuntimeError("Specified a mipmap mode in texture_min_filter, but mipmaps not enabled.") 1410 self.texture_object.set_min_filter( p.texture_min_filter ) 1411 self.texture_object.set_mag_filter( p.texture_mag_filter ) 1412 self.texture_object.set_wrap_mode_s( p.texture_wrap_s ) 1413 self.texture_object.set_wrap_mode_t( p.texture_wrap_t ) 1414 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) 1415 1416 translate_vector = p.position 1417 if len(translate_vector) == 2: 1418 translate_vector = translate_vector[0], translate_vector[1], 0 1419 gl.glTranslate(*translate_vector) 1420 gl.glRotate(p.angle,0,0,1) 1421 1422 gl.glColor4f(p.color[0],p.color[1],p.color[2],p.max_alpha) 1423 1424 # draw only if all values are finite 1425 if numpy.alltrue( numpy.isfinite( numpy.concatenate((lowerleft,p.position)) ) ): 1426 l = lowerleft[0] - p.position[0] 1427 r = l + size[0] 1428 b = lowerleft[1] - p.position[1] 1429 t = b + size[1] 1430 1431 tex.update() 1432 1433 if p.mask: 1434 p.mask.draw_masked_quad(tex.buf_lf,tex.buf_rf,tex.buf_bf,tex.buf_tf, # l,r,b,t for texture coordinates 1435 l,r,b,t,0.0) # l,r,b,t in eye coordinates 1436 else: 1437 gl.glBegin(gl.GL_QUADS) 1438 gl.glTexCoord2f(tex.buf_lf,tex.buf_bf) 1439 gl.glVertex2f(l,b) 1440 1441 gl.glTexCoord2f(tex.buf_rf,tex.buf_bf) 1442 gl.glVertex2f(r,b) 1443 1444 gl.glTexCoord2f(tex.buf_rf,tex.buf_tf) 1445 gl.glVertex2f(r,t) 1446 1447 gl.glTexCoord2f(tex.buf_lf,tex.buf_tf) 1448 gl.glVertex2f(l,t) 1449 gl.glEnd() # GL_QUADS 1450 finally: 1451 gl.glPopMatrix()
1452
1453 -class TextureStimulus3D(TextureStimulusBaseClass):
1454 """A textured rectangle placed arbitrarily in 3 space. 1455 1456 Parameters 1457 ========== 1458 depth_test -- perform depth test? (Boolean) 1459 Default: True 1460 lowerleft -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) 1461 Default: (0.0, 0.0, -1.0) 1462 lowerright -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) 1463 Default: (1.0, 0.0, -1.0) 1464 on -- (Boolean) 1465 Default: True 1466 texture -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>) 1467 Inherited from TextureStimulusBaseClass 1468 Default: (determined at runtime) 1469 texture_mag_filter -- OpenGL filter enum (Integer) 1470 Inherited from TextureStimulusBaseClass 1471 Default: GL_LINEAR (9729) 1472 texture_min_filter -- OpenGL filter enum (Integer) 1473 Inherited from TextureStimulusBaseClass 1474 Default: (GL enum determined at runtime) 1475 texture_wrap_s -- OpenGL texture wrap enum (Integer) 1476 Inherited from TextureStimulusBaseClass 1477 Default: (GL enum determined at runtime) 1478 texture_wrap_t -- OpenGL texture wrap enum (Integer) 1479 Inherited from TextureStimulusBaseClass 1480 Default: (GL enum determined at runtime) 1481 upperleft -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) 1482 Default: (0.0, 1.0, -1.0) 1483 upperright -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) 1484 Default: (1.0, 1.0, -1.0) 1485 1486 Constant Parameters 1487 =================== 1488 internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) 1489 Default: GL_RGB (6407) 1490 mipmaps_enabled -- Are mipmaps enabled? (Boolean) 1491 Default: True 1492 shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) 1493 Default: False 1494 """ 1495 1496 parameters_and_defaults = {'on':(True, 1497 ve_types.Boolean), 1498 'lowerleft':((0.0,0.0,-1.0), # in eye coordinates 1499 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 1500 ve_types.Sequence4(ve_types.Real)), 1501 "vertex position (units: eye coordinates)"), 1502 'lowerright':((1.0,0.0,-1.0), # in eye coordinates 1503 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 1504 ve_types.Sequence4(ve_types.Real)), 1505 "vertex position (units: eye coordinates)"), 1506 'upperleft':((0.0,1.0,-1.0), # in eye coordinates 1507 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 1508 ve_types.Sequence4(ve_types.Real)), 1509 "vertex position (units: eye coordinates)"), 1510 'upperright':((1.0,1.0,-1.0), # in eye coordinates 1511 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 1512 ve_types.Sequence4(ve_types.Real)), 1513 "vertex position (units: eye coordinates)"), 1514 'depth_test':(True, 1515 ve_types.Boolean, 1516 "perform depth test?"), 1517 } 1518
1519 - def draw(self):
1520 p = self.parameters 1521 if p.texture != self._using_texture: # self._using_texture is from TextureStimulusBaseClass 1522 self._reload_texture() 1523 if p.on: 1524 if p.depth_test: 1525 gl.glEnable(gl.GL_DEPTH_TEST) 1526 else: 1527 gl.glDisable(gl.GL_DEPTH_TEST) 1528 1529 gl.glEnable(gl.GL_TEXTURE_2D) 1530 gl.glBindTexture(gl.GL_TEXTURE_2D,self.texture_object.gl_id) 1531 1532 if not self.constant_parameters.mipmaps_enabled: 1533 if p.texture_min_filter in TextureStimulusBaseClass._mipmap_modes: 1534 raise RuntimeError("Specified a mipmap mode in texture_min_filter, but mipmaps not enabled.") 1535 self.texture_object.set_min_filter( p.texture_min_filter ) 1536 self.texture_object.set_mag_filter( p.texture_mag_filter ) 1537 self.texture_object.set_wrap_mode_s( p.texture_wrap_s ) 1538 self.texture_object.set_wrap_mode_t( p.texture_wrap_t ) 1539 1540 # allow max_alpha value to control blending 1541 gl.glEnable( gl.GL_BLEND ) 1542 gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) 1543 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) 1544 1545 tex = self.parameters.texture 1546 tex.update() 1547 1548 gl.glBegin(gl.GL_QUADS) 1549 gl.glTexCoord2f(tex.buf_lf,tex.buf_bf) 1550 gl.glVertex(*p.lowerleft) 1551 1552 gl.glTexCoord2f(tex.buf_rf,tex.buf_bf) 1553 gl.glVertex(*p.lowerright) 1554 1555 gl.glTexCoord2f(tex.buf_rf,tex.buf_tf) 1556 gl.glVertex(*p.upperright) 1557 1558 gl.glTexCoord2f(tex.buf_lf,tex.buf_tf) 1559 gl.glVertex(*p.upperleft) 1560 gl.glEnd() # GL_QUADS
1561 1562 #################################################################### 1563 # 1564 # Stimulus - Spinning Drum 1565 # 1566 #################################################################### 1567
1568 -class SpinningDrum(TextureStimulusBaseClass):
1569 """Panoramic image texture mapped onto flat rectangle or 3D cylinder. 1570 1571 1572 Parameters 1573 ========== 1574 anchor -- only used when flat: same as anchor parameter of TextureStimulus (String) 1575 Default: center 1576 angular_position -- may be best to clamp in range [0.0,360.0] (Real) 1577 Default: 0.0 1578 contrast -- (Real) 1579 Default: 1.0 1580 drum_center_azimuth -- changes orientation of drum in space (Real) 1581 Default: 0.0 1582 drum_center_elevation -- changes orientation of drum in space (Real) 1583 Default: 0.0 1584 flat -- toggles flat vs. cylinder (Boolean) 1585 Default: False 1586 flat_size -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real) 1587 Default: (determined at runtime) 1588 flip_image -- toggles normal vs. horizonally flipped image (Boolean) 1589 Default: False 1590 height -- height of cyliner, automatically set by texel aspect ratio if < 0. (Real) 1591 Default: -1 1592 num_sides -- (UnsignedInteger) 1593 Default: 50 1594 on -- (Boolean) 1595 Default: True 1596 orientation -- 0=right, 90=up (Real) 1597 Default: 0.0 1598 position -- 3D: position of drum center, 2D (flat): same as position parameter for TextureStimulus (AnyOf(Sequence2 of Real or Sequence3 of Real)) 1599 Default: (0.0, 0.0, 0.0) 1600 radius -- radius if cylinder (not used if flat) (Real) 1601 Default: 1.0 1602 texture -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>) 1603 Inherited from TextureStimulusBaseClass 1604 Default: (determined at runtime) 1605 texture_mag_filter -- OpenGL filter enum (Integer) 1606 Inherited from TextureStimulusBaseClass 1607 Default: GL_LINEAR (9729) 1608 texture_min_filter -- OpenGL filter enum (Integer) 1609 Inherited from TextureStimulusBaseClass 1610 Default: (GL enum determined at runtime) 1611 texture_wrap_s -- OpenGL texture wrap enum (Integer) 1612 Inherited from TextureStimulusBaseClass 1613 Default: (GL enum determined at runtime) 1614 texture_wrap_t -- OpenGL texture wrap enum (Integer) 1615 Inherited from TextureStimulusBaseClass 1616 Default: (GL enum determined at runtime) 1617 1618 Constant Parameters 1619 =================== 1620 internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) 1621 Default: GL_RGB (6407) 1622 mipmaps_enabled -- Are mipmaps enabled? (Boolean) 1623 Default: True 1624 shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) 1625 Default: False 1626 """ 1627 1628 parameters_and_defaults = { 1629 'on':(True, 1630 ve_types.Boolean), 1631 'height':(-1, 1632 ve_types.Real, 1633 'height of cyliner, automatically set by texel aspect ratio if < 0.', 1634 ), 1635 'num_sides':(50, 1636 ve_types.UnsignedInteger), 1637 'angular_position':(0.0, # may be best to clamp [0.0,360.0] 1638 ve_types.Real, 1639 'may be best to clamp in range [0.0,360.0]'), 1640 'contrast':(1.0, 1641 ve_types.Real), 1642 'flat':(False, 1643 ve_types.Boolean, 1644 'toggles flat vs. cylinder'), 1645 'flat_size':(None, 1646 ve_types.Sequence2(ve_types.Real), 1647 "defaults to texture data size (units: eye coordinates)"), 1648 'flip_image':(False, 1649 ve_types.Boolean, 1650 'toggles normal vs. horizonally flipped image'), 1651 'radius':(1.0, 1652 ve_types.Real, 1653 'radius if cylinder (not used if flat)'), 1654 'position':( (0.0,0.0,0.0), 1655 ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), 1656 ve_types.Sequence3(ve_types.Real)), 1657 '3D: position of drum center, 2D (flat): same as position parameter for TextureStimulus'), 1658 'anchor':( 'center', 1659 ve_types.String, 1660 'only used when flat: same as anchor parameter of TextureStimulus', 1661 ), 1662 'drum_center_azimuth':(0.0, 1663 ve_types.Real, 1664 'changes orientation of drum in space', 1665 ), 1666 'drum_center_elevation':(0.0, 1667 ve_types.Real, 1668 'changes orientation of drum in space'), 1669 'orientation':(0.0, 1670 ve_types.Real, 1671 '0=right, 90=up'), 1672 } 1673 1674 __slots__ = ( 1675 'cached_display_list_normal', 1676 'cached_display_list_mirror', 1677 'cached_display_list_num_sides', 1678 'cached_display_list_radius', 1679 'cached_display_list_height', 1680 'texture_stimulus', 1681 ) 1682
1683 - def __init__(self,**kw):
1684 TextureStimulusBaseClass.__init__(self,**kw) 1685 self.cached_display_list_normal = gl.glGenLists(1) # Allocate a new display list 1686 self.cached_display_list_mirror = gl.glGenLists(1) # Allocate a new display list 1687 self.rebuild_display_list()
1688
1689 - def draw(self):
1690 """Redraw the stimulus on every frame. 1691 """ 1692 p = self.parameters 1693 if p.texture != self._using_texture: # self._using_texture is from TextureStimulusBaseClass 1694 self._reload_texture() 1695 self.rebuild_display_list() 1696 if p.on: 1697 # Set OpenGL state variables 1698 gl.glEnable( gl.GL_DEPTH_TEST ) 1699 gl.glEnable( gl.GL_TEXTURE_2D ) # Make sure textures are drawn 1700 gl.glEnable( gl.GL_BLEND ) # Contrast control implemented through blending 1701 1702 # All of the contrast control stuff is somewhat arcane and 1703 # not very clear from reading the code, so here is how it 1704 # works in English. (Not that it makes it any more clear!) 1705 # 1706 # In the final "textured fragment" (before being blended 1707 # to the framebuffer), the color values are equal to those 1708 # of the texture (with the exception of texels around the 1709 # edges which have their amplitudes reduced due to 1710 # anti-aliasing and are intermediate between the color of 1711 # the texture and mid-gray), and the alpha value is set to 1712 # the contrast. Blending occurs, and by choosing the 1713 # appropriate values for glBlendFunc, adds the product of 1714 # fragment alpha (contrast) and fragment color to the 1715 # product of one minus fragment alpha (contrast) and what 1716 # was already in the framebuffer. 1717 1718 gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) 1719 1720 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_DECAL) 1721 1722 # clear modelview matrix 1723 gl.glMatrixMode(gl.GL_MODELVIEW) 1724 gl.glPushMatrix() 1725 try: 1726 gl.glColor4f(0.5,0.5,0.5,p.contrast) # Set the polygons' fragment color (implements contrast) 1727 1728 if not self.constant_parameters.mipmaps_enabled: 1729 if p.texture_min_filter in TextureStimulusBaseClass._mipmap_modes: 1730 raise RuntimeError("Specified a mipmap mode in texture_min_filter, but mipmaps not enabled.") 1731 self.texture_object.set_min_filter( p.texture_min_filter ) 1732 self.texture_object.set_mag_filter( p.texture_mag_filter ) 1733 self.texture_object.set_wrap_mode_s( p.texture_wrap_s ) 1734 self.texture_object.set_wrap_mode_t( p.texture_wrap_t ) 1735 1736 if p.flat: # draw as flat texture on a rectange 1737 lowerleft = VisionEgg._get_lowerleft(p.position,p.anchor,p.texture.size) 1738 1739 translate_vector = p.position 1740 if len(translate_vector) == 2: 1741 translate_vector = translate_vector[0], translate_vector[1], 0 1742 gl.glTranslate(*translate_vector) 1743 gl.glRotatef(p.orientation,0,0,1) 1744 1745 if p.flip_image: 1746 raise NotImplementedError("flip_image not yet supported for flat spinning drums.") 1747 w,h = p.texture.size 1748 1749 # calculate texture coordinates based on current angle 1750 tex_phase = p.angular_position/360.0 + 0.5 # offset to match non-flat 1751 tex_phase = tex_phase % 1.0 # make 0 <= tex_phase < 1.0 1752 1753 TINY = 1.0e-10 1754 tex = p.texture 1755 tex.update() 1756 1757 if p.flat_size is None: 1758 size = tex.size 1759 else: 1760 size = p.flat_size 1761 1762 l = lowerleft[0] - p.position[0] 1763 r = l + size[0] 1764 b = lowerleft[1] - p.position[1] 1765 t = b + size[1] 1766 1767 #tex_phase = 0.0 1768 if tex_phase < TINY: # it's effectively zero 1769 1770 gl.glBegin(gl.GL_QUADS) 1771 gl.glTexCoord2f(tex.buf_lf,tex.buf_bf) 1772 gl.glVertex2f(l,b) 1773 1774 gl.glTexCoord2f(tex.buf_rf,tex.buf_bf) 1775 gl.glVertex2f(r,b) 1776 1777 gl.glTexCoord2f(tex.buf_rf,tex.buf_tf) 1778 gl.glVertex2f(r,t) 1779 1780 gl.glTexCoord2f(tex.buf_lf,tex.buf_tf) 1781 gl.glVertex2f(l,t) 1782 gl.glEnd() # GL_QUADS 1783 1784 else: 1785 # Convert tex_phase into texture buffer fraction 1786 buf_break_f = ( (tex.buf_rf - tex.buf_lf) * (1.0-tex_phase) ) + tex.buf_lf 1787 1788 # Convert tex_phase into object coords value 1789 quad_x_break = (r-l) * tex_phase + l 1790 ## quad_x_break = w * tex_phase 1791 1792 gl.glBegin(gl.GL_QUADS) 1793 1794 # First quad 1795 1796 gl.glTexCoord2f(buf_break_f,tex.buf_bf) 1797 gl.glVertex2f(l,b) 1798 1799 gl.glTexCoord2f(tex.buf_rf,tex.buf_bf) 1800 gl.glVertex2f(quad_x_break,b) 1801 1802 gl.glTexCoord2f(tex.buf_rf,tex.buf_tf) 1803 gl.glVertex2f(quad_x_break,t) 1804 1805 gl.glTexCoord2f(buf_break_f,tex.buf_tf) 1806 gl.glVertex2f(l,t) 1807 1808 # Second quad 1809 1810 gl.glTexCoord2f(tex.buf_lf,tex.buf_bf) 1811 gl.glVertex2f(quad_x_break,b) 1812 1813 gl.glTexCoord2f(buf_break_f,tex.buf_bf) 1814 gl.glVertex2f(r,b) 1815 1816 gl.glTexCoord2f(buf_break_f,tex.buf_tf) 1817 gl.glVertex2f(r,t) 1818 1819 gl.glTexCoord2f(tex.buf_lf,tex.buf_tf) 1820 gl.glVertex2f(quad_x_break,t) 1821 gl.glEnd() # GL_QUADS 1822 1823 else: # draw as cylinder 1824 gl.glTranslatef(p.position[0],p.position[1],p.position[2]) 1825 1826 # center the drum on new coordinates 1827 gl.glRotatef(p.drum_center_azimuth,0,-1,0) 1828 gl.glRotatef(p.drum_center_elevation,1,0,0) 1829 1830 # do the orientation 1831 gl.glRotatef(p.orientation,0,0,1) 1832 1833 # turn the coordinate system so we don't have to deal with 1834 # figuring out where to draw the texture relative to drum 1835 gl.glRotatef(p.angular_position,0,-1,0) 1836 1837 if ((p.num_sides != self.cached_display_list_num_sides) or 1838 (p.radius != self.cached_display_list_radius) or 1839 (p.height != self.cached_display_list_height)): 1840 self.rebuild_display_list() 1841 1842 if not p.flip_image: 1843 gl.glCallList(self.cached_display_list_normal) 1844 else: 1845 gl.glCallList(self.cached_display_list_mirror) 1846 finally: 1847 gl.glMatrixMode(gl.GL_MODELVIEW) 1848 gl.glPopMatrix()
1849
1850 - def rebuild_display_list(self):
1851 # (Re)build the display list 1852 # 1853 # A "display list" is a series of OpenGL commands that is 1854 # cached in a list for rapid re-drawing of the same object. 1855 # 1856 # This draws a display list for an approximation of a cylinder. 1857 # The cylinder has "num_sides" sides. The following code 1858 # generates a list of vertices and the texture coordinates 1859 # to be used by those vertices. 1860 r = self.parameters.radius # in OpenGL (arbitrary) units 1861 circum = 2.0*math.pi*r 1862 tex = self.parameters.texture 1863 if self.parameters.height < 0: 1864 h = circum/float(tex.size[0])*float(tex.size[1])/2.0 1865 else: 1866 h = self.parameters.height 1867 1868 num_sides = self.parameters.num_sides 1869 self.cached_display_list_num_sides = num_sides 1870 self.cached_display_list_radius = r 1871 self.cached_display_list_height = self.parameters.height 1872 1873 deltaTheta = 2.0*math.pi / num_sides 1874 for direction in ['normal','mirror']: 1875 if direction == 'normal': 1876 gl.glNewList(self.cached_display_list_normal,gl.GL_COMPILE) 1877 else: 1878 gl.glNewList(self.cached_display_list_mirror,gl.GL_COMPILE) 1879 gl.glBegin(gl.GL_QUADS) 1880 for i in range(num_sides): 1881 # angle of sides 1882 theta1 = i*deltaTheta 1883 theta2 = (i+1)*deltaTheta 1884 # fraction of texture 1885 if direction == 'normal': 1886 frac1 = (tex.buf_lf + (float(i)/num_sides*tex.size[0]))/float(tex.size[0]) 1887 frac2 = (tex.buf_lf + (float(i+1)/num_sides*tex.size[0]))/float(tex.size[0]) 1888 else: 1889 j = num_sides-i-1 1890 frac1 = (tex.buf_lf + (float(j+1)/num_sides*tex.size[0]))/float(tex.size[0]) 1891 frac2 = (tex.buf_lf + (float(j)/num_sides*tex.size[0]))/float(tex.size[0]) 1892 # location of sides 1893 x1 = r*math.cos(theta1) 1894 z1 = r*math.sin(theta1) 1895 x2 = r*math.cos(theta2) 1896 z2 = r*math.sin(theta2) 1897 1898 #Bottom left of quad 1899 gl.glTexCoord2f(frac1, tex.buf_bf) 1900 gl.glVertex4f( x1, -h, z1, 1.0 ) 1901 1902 #Bottom right of quad 1903 gl.glTexCoord2f(frac2, tex.buf_bf) 1904 gl.glVertex4f( x2, -h, z2, 1.0 ) 1905 #Top right of quad 1906 gl.glTexCoord2f(frac2, tex.buf_tf); 1907 gl.glVertex4f( x2, h, z2, 1.0 ) 1908 #Top left of quad 1909 gl.glTexCoord2f(frac1, tex.buf_tf) 1910 gl.glVertex4f( x1, h, z1, 1.0 ) 1911 gl.glEnd() 1912 gl.glEndList()
1913
1914 -class FixationCross(VisionEgg.Core.Stimulus):
1915 """Cross useful for fixation point. 1916 1917 Parameters 1918 ========== 1919 on -- (Boolean) 1920 Default: True 1921 position -- (Sequence2 of Real) 1922 Default: (320, 240) 1923 size -- (Sequence2 of Real) 1924 Default: (64, 64) 1925 1926 Constant Parameters 1927 =================== 1928 texture_size -- (Sequence2 of Real) 1929 Default: (64, 64) 1930 """ 1931 1932 parameters_and_defaults = { 1933 'on':(True, 1934 ve_types.Boolean), 1935 'position':((320,240), 1936 ve_types.Sequence2(ve_types.Real)), 1937 'size':((64,64), 1938 ve_types.Sequence2(ve_types.Real)), 1939 } 1940 constant_parameters_and_defaults = { 1941 'texture_size':((64,64), 1942 ve_types.Sequence2(ve_types.Real)), 1943 } 1944 1945 __slots__ = ( 1946 'texture_stimulus', 1947 ) 1948
1949 - def __init__(self,**kw):
1950 VisionEgg.Core.Stimulus.__init__(self,**kw) 1951 s = self.constant_parameters.texture_size 1952 mid_x = s[0]/2.0 1953 mid_y = s[1]/2.0 1954 texels = Image.new("RGBX",s,(0,0,0,0)) 1955 texels_draw = ImageDraw.Draw(texels) 1956 texels_draw.rectangle( (mid_x-1, 0, mid_x+1, s[1]), fill=(0,0,0,255) ) 1957 texels_draw.rectangle( (0, mid_y-1, s[0], mid_y+1), fill=(0,0,0,255) ) 1958 texels_draw.line( (mid_x, 0, mid_x, s[1]), fill=(255,255,255,255) ) 1959 texels_draw.line( (0, mid_y, s[0], mid_y), fill=(255,255,255,255) ) 1960 self.texture_stimulus = TextureStimulus( texture = Texture(texels), 1961 position = self.parameters.position, 1962 anchor = 'center', 1963 size = self.parameters.size, 1964 internal_format = gl.GL_RGBA, 1965 mipmaps_enabled = False, 1966 texture_min_filter = gl.GL_NEAREST, 1967 texture_mag_filter = gl.GL_NEAREST, 1968 )
1969 - def draw(self):
1970 contained = self.texture_stimulus.parameters #shorthand 1971 my = self.parameters #shorthand 1972 contained.position = my.position 1973 contained.size = my.size 1974 contained.on = my.on 1975 self.texture_stimulus.draw()
1976
1977 -class TextureTooLargeError( RuntimeError ):
1978 pass
1979

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.FixationCross-class.html0000644000076500000240000003360411224565531026651 0ustar astrawstaff VisionEgg.Textures.FixationCross
Package VisionEgg :: Module Textures :: Class FixationCross
[frames] | no frames]

Class FixationCross

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         FixationCross

Cross useful for fixation point.

Parameters
==========
on       -- (Boolean)
            Default: True
position -- (Sequence2 of Real)
            Default: (320, 240)
size     -- (Sequence2 of Real)
            Default: (64, 64)

Constant Parameters
===================
texture_size -- (Sequence2 of Real)
                Default: (64, 64)



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code
 
draw(self)
Draw the stimulus.
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'pos...
  constant_parameters_and_defaults = {'texture_size':((64, 64), ...

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'position':((320, 240), ve_types.Seque\
nce2(ve_types.Real)), 'size':((64, 64), ve_types.Sequence2(ve_types.Re\
al)),}

constant_parameters_and_defaults

Value:
{'texture_size':((64, 64), ve_types.Sequence2(ve_types.Real)),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.Mask2D-class.html0000644000076500000240000003354211224565531025140 0ustar astrawstaff VisionEgg.Textures.Mask2D
Package VisionEgg :: Module Textures :: Class Mask2D
[frames] | no frames]

Class Mask2D

source code

         object --+    
                  |    
ClassWithParameters --+
                      |
                     Mask2D

A mask for windowing a portion of a texture.

Thanks to the author, Jon Peirce, of the AlphaStim class from the
PsychoPy package from which the idea to do this came.

Constant Parameters
===================
function         -- 'gaussian' or 'circle' (String)
                    Default: gaussian
num_samples      -- size of mask texture data (units: number of texels) (Sequence2 of Real)
                    Default: (256, 256)
radius_parameter -- radius for circle, sigma for gaussian (Real)
                    Default: 25.0



Instance Methods
 
__init__(self, **kw)
Create self.parameters and set values.
source code
 
draw_masked_quad_3d(self, lt, rt, bt, tt, v1, v2, v3, v4) source code
 
draw_masked_quad(self, lt, rt, bt, tt, le, re, be, te, depth) source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  constant_parameters_and_defaults = {'function':('gaussian', ve...

Inherited from ClassWithParameters: __safe_for_unpickling__, parameters_and_defaults

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Create self.parameters and set values.

Overrides: ClassWithParameters.__init__
(inherited documentation)

Class Variable Details

constant_parameters_and_defaults

Value:
{'function':('gaussian', ve_types.String, "'gaussian' or 'circle'"), '\
radius_parameter':(25.0, ve_types.Real, "radius for circle, sigma for \
gaussian"), 'num_samples':((256, 256), ve_types.Sequence2(ve_types.Rea\
l), "size of mask texture data (units: number of texels)"),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.SpinningDrum-class.html0000644000076500000240000004314111224565531026470 0ustar astrawstaff VisionEgg.Textures.SpinningDrum
Package VisionEgg :: Module Textures :: Class SpinningDrum
[frames] | no frames]

Class SpinningDrum

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
          Core.Stimulus --+    
                          |    
   TextureStimulusBaseClass --+
                              |
                             SpinningDrum

Panoramic image texture mapped onto flat rectangle or 3D cylinder.


Parameters
==========
anchor                -- only used when flat: same as anchor parameter of TextureStimulus (String)
                         Default: center
angular_position      -- may be best to clamp in range [0.0,360.0] (Real)
                         Default: 0.0
contrast              -- (Real)
                         Default: 1.0
drum_center_azimuth   -- changes orientation of drum in space (Real)
                         Default: 0.0
drum_center_elevation -- changes orientation of drum in space (Real)
                         Default: 0.0
flat                  -- toggles flat vs. cylinder (Boolean)
                         Default: False
flat_size             -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real)
                         Default: (determined at runtime)
flip_image            -- toggles normal vs. horizonally flipped image (Boolean)
                         Default: False
height                -- height of cyliner, automatically set by texel aspect ratio if < 0. (Real)
                         Default: -1
num_sides             -- (UnsignedInteger)
                         Default: 50
on                    -- (Boolean)
                         Default: True
orientation           -- 0=right, 90=up (Real)
                         Default: 0.0
position              -- 3D: position of drum center, 2D (flat): same as position parameter for TextureStimulus (AnyOf(Sequence2 of Real or Sequence3 of Real))
                         Default: (0.0, 0.0, 0.0)
radius                -- radius if cylinder (not used if flat) (Real)
                         Default: 1.0
texture               -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>)
                         Inherited from TextureStimulusBaseClass
                         Default: (determined at runtime)
texture_mag_filter    -- OpenGL filter enum (Integer)
                         Inherited from TextureStimulusBaseClass
                         Default: GL_LINEAR (9729)
texture_min_filter    -- OpenGL filter enum (Integer)
                         Inherited from TextureStimulusBaseClass
                         Default: (GL enum determined at runtime)
texture_wrap_s        -- OpenGL texture wrap enum (Integer)
                         Inherited from TextureStimulusBaseClass
                         Default: (GL enum determined at runtime)
texture_wrap_t        -- OpenGL texture wrap enum (Integer)
                         Inherited from TextureStimulusBaseClass
                         Default: (GL enum determined at runtime)

Constant Parameters
===================
internal_format   -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer)
                     Default: GL_RGB (6407)
mipmaps_enabled   -- Are mipmaps enabled? (Boolean)
                     Default: True
shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean)
                     Default: False



Instance Methods
 
__init__(self, **kw) source code
 
draw(self)
Redraw the stimulus on every frame.
source code
 
rebuild_display_list(self) source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'hei...

Inherited from TextureStimulusBaseClass: constant_parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Overrides: TextureStimulusBaseClass.__init__

draw(self)

source code 
Redraw the stimulus on every frame.
        

Overrides: Core.Stimulus.draw

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'height':(-1, ve_types.Real, 'height o\
f cyliner, automatically set by texel aspect ratio if < 0.',), 'num_si\
des':(50, ve_types.UnsignedInteger), 'angular_position':(0.0, ve_types\
.Real, 'may be best to clamp in range [0.0,360.0]'), 'contrast':(1.0, \
ve_types.Real), 'flat':(False, ve_types.Boolean, 'toggles flat vs. cyl\
inder'), 'flat_size':(None, ve_types.Sequence2(ve_types.Real), "defaul\
ts to texture data size (units: eye coordinates)"), 'flip_image':(Fals\
e, ve_types.Boolean, 'toggles normal vs. horizonally flipped image'), \
...

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.Texture-class.html0000644000076500000240000004220011224565531025506 0ustar astrawstaff VisionEgg.Textures.Texture
Package VisionEgg :: Module Textures :: Class Texture
[frames] | no frames]

Class Texture

source code

object --+
         |
        Texture

A 2 dimensional texture.

The pixel data can come from an image file, an image file stream,
an instance of Image from the Python Imaging Library, a numpy
array, or None.

If the data is a numpy array, floating point numbers are assumed
to be in the range 0.0 to 1.0, and integers are assumed to be in
the range 0 to 255.  The first index is the row (y position), the
second index is the column (x position), and if it's RGB or RGBA
data, the third index specifies the color band.  Thus, if the
texel data was 640 pixels wide by 480 pixels tall, the array would
have shape (480,640) for luminance information, (480,640,3) for
RGB information, and (480,640,4) for RGBA information.

The 2D texture data is not sent to OpenGL (video texture memory)
until the load() method is called.  The unload() method may be
used to remove the data from OpenGL.

A reference to the original image data is maintained.



Instance Methods
 
__init__(self, texels=None, size=None)
Creates instance of Texture object.
source code
 
update(self)
Update texture data This method does nothing, but may be overriden in classes that need to update their texture data whenever drawn.
source code
 
make_half_size(self) source code
 
unload(self)
Unload texture data from video texture memory.
source code
 
get_texels_as_image(self)
Return texel data as PIL image
source code
 
get_pixels_as_image(self) source code
 
load(self, texture_object, build_mipmaps=True, rescale_original_to_fill_texture_object=False, internal_format=gl.GL_RGB)
Load texture data to video texture memory.
source code
 
get_texture_object(self) source code

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Properties

Inherited from object: __class__

Method Details

__init__(self, texels=None, size=None)
(Constructor)

source code 
Creates instance of Texture object.

texels -- Texture data. If not specified, a blank white
          texture is created.
size -- If a tuple, force size of texture data if possible,
        raising an exception if not. If None, has no effect.

Overrides: object.__init__

update(self)

source code 
Update texture data

This method does nothing, but may be overriden in classes that
need to update their texture data whenever drawn.

It it called by the draw() method of any stimuli using
textures when its texture object is active, so it can safely
use put_sub_image() to manipulate its own texture data.

unload(self)

source code 
Unload texture data from video texture memory.

This only removes data from the video texture memory if there
are no other references to the TextureObject instance.  To
ensure this, all references to the texture_object argument
passed to the load() method should be deleted.

load(self, texture_object, build_mipmaps=True, rescale_original_to_fill_texture_object=False, internal_format=gl.GL_RGB)

source code 
Load texture data to video texture memory.

This will cause the texture data to become resident in OpenGL
video texture memory, enabling fast drawing.

The texture_object argument is used to specify an instance of
the TextureObject class, which is a wrapper for the OpenGL
texture object holding the resident texture.

To remove a texture from OpenGL's resident textures:       TextureObject passed as the texture_object argument and 2)
call the unload() method


visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.TextureFromFile-class.html0000644000076500000240000002126111224565531027136 0ustar astrawstaff VisionEgg.Textures.TextureFromFile
Package VisionEgg :: Module Textures :: Class TextureFromFile
[frames] | no frames]

Class TextureFromFile

source code

object --+    
         |    
   Texture --+
             |
            TextureFromFile

DEPRECATED.



Instance Methods
 
__init__(self, filename)
Creates instance of Texture object.
source code

Inherited from Texture: get_pixels_as_image, get_texels_as_image, get_texture_object, load, make_half_size, unload, update

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Properties

Inherited from object: __class__

Method Details

__init__(self, filename)
(Constructor)

source code 
Creates instance of Texture object.

texels -- Texture data. If not specified, a blank white
          texture is created.
size -- If a tuple, force size of texture data if possible,
        raising an exception if not. If None, has no effect.

Overrides: Texture.__init__
(inherited documentation)

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.TextureObject-class.html0000644000076500000240000006445011224565531026650 0ustar astrawstaff VisionEgg.Textures.TextureObject
Package VisionEgg :: Module Textures :: Class TextureObject
[frames] | no frames]

Class TextureObject

source code

object --+
         |
        TextureObject

Texture data in OpenGL. Potentially resident in video texture memory.

This class encapsulates the state variables in OpenGL texture objects.  Do not
change attribute values directly.  Use the methods provided instead.



Instance Methods
 
__init__(self, dimensions=2)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
__del__(self) source code
 
is_resident(self) source code
 
set_priority(self, priority) source code
 
set_min_filter(self, filter) source code
 
set_mag_filter(self, filter) source code
 
set_wrap_mode_s(self, wrap_mode)
Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER
source code
 
set_wrap_mode_t(self, wrap_mode)
Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER
source code
 
set_wrap_mode_r(self, wrap_mode)
Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER
source code
 
set_border_color(self, border_color)
Set to a sequence of 4 floats in the range 0.0 to 1.0
source code
 
put_new_image(self, texel_data, mipmap_level=0, border=0, check_opengl_errors=True, internal_format=gl.GL_RGB, data_format=None, data_type=None, cube_side=None)
Put numpy array or PIL Image into OpenGL as texture data.
source code
 
put_new_image_build_mipmaps(self, texel_data, internal_format=gl.GL_RGB, data_format=None, data_type=None, cube_side=None)
Similar to put_new_image(), but builds mipmaps.
source code
 
put_sub_image(self, texel_data, mipmap_level=0, offset_tuple=None, data_format=None, data_type=None, cube_side=None)
Replace all or part of a texture object.
source code
 
put_new_framebuffer(self, buffer='back', mipmap_level=0, border=0, framebuffer_lowerleft=None, size=None, internal_format=gl.GL_RGB, cube_side=None)
Replace texture object with the framebuffer contents.
source code

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Properties

Inherited from object: __class__

Method Details

__init__(self, dimensions=2)
(Constructor)

source code 
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

put_new_image(self, texel_data, mipmap_level=0, border=0, check_opengl_errors=True, internal_format=gl.GL_RGB, data_format=None, data_type=None, cube_side=None)

source code 
Put numpy array or PIL Image into OpenGL as texture data.

The texel_data parameter contains the texture data.  If it is
a numpy array, it must be 1D, 2D, or 3D data in grayscale or
color (RGB or RGBA).  Remember that OpenGL begins its textures
from the lower left corner, so texel_data[0,:] = 1.0 would set
the bottom line of the texture to white, while texel_data[:,0]
= 1.0 would set the left line of the texture to white.

The mipmap_level parameter specifies which of the texture
object's mipmap arrays you are filling.

The border parameter specifies the width of the border.

The check_opengl_errors parameter turns on (more
comprehensible) error messages when something goes wrong.  It
also slows down performance a little bit.

The internal_format parameter specifies the format in which
the image data is stored on the video card.  See the OpenGL
specification for all possible values.

If the data_format parameter is None (the default), an attempt
is made to guess data_format according to the following
description. For numpy arrays: If texel_data.shape is equal
to the dimensions of the texture object, texel_data is assumed
to contain luminance (grayscale) information and data_format
is set to GL_LUMINANCE.  If texel_data.shape is equal to one
plus the dimensions of the texture object, texel_data is
assumed to contain color information.  If texel_data.shape[-1]
is 3, this is assumed to be RGB data and data_format is set to
GL_RGB.  If, texel_data.shape[-1] is 4, this is assumed to be
RGBA data and data_format is set to GL_RGBA. For PIL images:
the "mode" attribute is queried.

If the data_type parameter is None (the default), it is set to
GL_UNSIGNED_BYTE. For numpy arrays: texel_data is (re)cast
to UInt8 and, if it is a floating point type, values are
assumed to be in the range 0.0-1.0 and are scaled to the range
0-255.  If the data_type parameter is not None, the texel_data
is not rescaled or recast.  Currently only GL_UNSIGNED_BYTE is
supported. For PIL images: texel_data is used as unsigned
bytes.  This is the usual format for common computer graphics
files.

put_sub_image(self, texel_data, mipmap_level=0, offset_tuple=None, data_format=None, data_type=None, cube_side=None)

source code 
Replace all or part of a texture object.

This is faster that put_new_image(), and can be used to
rapidly update textures.

The offset_tuple parameter determines the lower left corner
(for 2D textures) of your data in pixel units.  For example,
(0,0) would be no offset and thus the new data would be placed
in the lower left of the texture.

For an explanation of most parameters, see the
put_new_image() method.

put_new_framebuffer(self, buffer='back', mipmap_level=0, border=0, framebuffer_lowerleft=None, size=None, internal_format=gl.GL_RGB, cube_side=None)

source code 
Replace texture object with the framebuffer contents.

The framebuffer_lowerleft parameter determines the lower left
corner of the framebuffer region from which to copy texel data
in pixel units.  For example, (0,0) would be no offset and
thus the new data would be placed from the lower left of the
framebuffer.

For an explanation of most parameters, see the
put_new_image() method.


visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.TextureStimulus-class.html0000644000076500000240000003705611224565531027271 0ustar astrawstaff VisionEgg.Textures.TextureStimulus
Package VisionEgg :: Module Textures :: Class TextureStimulus
[frames] | no frames]

Class TextureStimulus

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
          Core.Stimulus --+    
                          |    
   TextureStimulusBaseClass --+
                              |
                             TextureStimulus

A textured rectangle.

This is mainly for 2D use (z coordinate fixed to 0.0 and w
coordinated fixed to 1.0 if not given).


Parameters
==========
anchor             -- specifies how position parameter is interpreted (String)
                      Default: lowerleft
angle              -- units: degrees, 0=right, 90=up (Real)
                      Default: 0.0
color              -- texture environment color. alpha ignored (if given) for max_alpha parameter (AnyOf(Sequence3 of Real or Sequence4 of Real))
                      Default: (1.0, 1.0, 1.0)
depth_test         -- perform depth test? (Boolean)
                      Default: False
mask               -- optional masking function (Instance of <class 'VisionEgg.Textures.Mask2D'>)
                      Default: (determined at runtime)
max_alpha          -- controls opacity. 1.0=copletely opaque, 0.0=completely transparent (Real)
                      Default: 1.0
on                 -- draw stimulus? (Boolean)
                      Default: True
position           -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real))
                      Default: (0.0, 0.0)
size               -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real)
                      Default: (determined at runtime)
texture            -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>)
                      Inherited from TextureStimulusBaseClass
                      Default: (determined at runtime)
texture_mag_filter -- OpenGL filter enum (Integer)
                      Inherited from TextureStimulusBaseClass
                      Default: GL_LINEAR (9729)
texture_min_filter -- OpenGL filter enum (Integer)
                      Inherited from TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)
texture_wrap_s     -- OpenGL texture wrap enum (Integer)
                      Inherited from TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)
texture_wrap_t     -- OpenGL texture wrap enum (Integer)
                      Inherited from TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)

Constant Parameters
===================
internal_format   -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer)
                     Default: GL_RGB (6407)
mipmaps_enabled   -- Are mipmaps enabled? (Boolean)
                     Default: True
shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean)
                     Default: False



Instance Methods
 
draw(self)
Draw the stimulus.
source code

Inherited from TextureStimulusBaseClass: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean, "draw...

Inherited from TextureStimulusBaseClass: constant_parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean, "draw stimulus?"), 'mask':(None, ve_typ\
es.Instance(Mask2D), "optional masking function"), 'position':((0.0, 0\
.0), ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequen\
ce3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye co\
ordinates"), 'anchor':('lowerleft', ve_types.String, "specifies how po\
sition parameter is interpreted"), 'lowerleft':(None, ve_types.Sequenc\
e2(ve_types.Real), "", VisionEgg.ParameterDefinition.DEPRECATED), 'ang\
le':(0.0, ve_types.Real, "units: degrees, 0=right, 90=up"), 'size':(No\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.TextureStimulus3D-class.html0000644000076500000240000003607011224565531027453 0ustar astrawstaff VisionEgg.Textures.TextureStimulus3D
Package VisionEgg :: Module Textures :: Class TextureStimulus3D
[frames] | no frames]

Class TextureStimulus3D

source code

         object --+            
                  |            
ClassWithParameters --+        
                      |        
          Core.Stimulus --+    
                          |    
   TextureStimulusBaseClass --+
                              |
                             TextureStimulus3D

A textured rectangle placed arbitrarily in 3 space.

Parameters
==========
depth_test         -- perform depth test? (Boolean)
                      Default: True
lowerleft          -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real))
                      Default: (0.0, 0.0, -1.0)
lowerright         -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real))
                      Default: (1.0, 0.0, -1.0)
on                 -- (Boolean)
                      Default: True
texture            -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>)
                      Inherited from TextureStimulusBaseClass
                      Default: (determined at runtime)
texture_mag_filter -- OpenGL filter enum (Integer)
                      Inherited from TextureStimulusBaseClass
                      Default: GL_LINEAR (9729)
texture_min_filter -- OpenGL filter enum (Integer)
                      Inherited from TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)
texture_wrap_s     -- OpenGL texture wrap enum (Integer)
                      Inherited from TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)
texture_wrap_t     -- OpenGL texture wrap enum (Integer)
                      Inherited from TextureStimulusBaseClass
                      Default: (GL enum determined at runtime)
upperleft          -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real))
                      Default: (0.0, 1.0, -1.0)
upperright         -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real))
                      Default: (1.0, 1.0, -1.0)

Constant Parameters
===================
internal_format   -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer)
                     Default: GL_RGB (6407)
mipmaps_enabled   -- Are mipmaps enabled? (Boolean)
                     Default: True
shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean)
                     Default: False



Instance Methods
 
draw(self)
Draw the stimulus.
source code

Inherited from TextureStimulusBaseClass: __init__

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'low...

Inherited from TextureStimulusBaseClass: constant_parameters_and_defaults

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

draw(self)

source code 
Draw the stimulus. (Called by Viewport instance.)

This method is called every frame.  This method actually
performs the OpenGL calls to draw the stimulus.

Overrides: Core.Stimulus.draw
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'lowerleft':((0.0, 0.0,-1.0), ve_types\
.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.\
Real)), "vertex position (units: eye coordinates)"), 'lowerright':((1.\
0, 0.0,-1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_typ\
es.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates\
)"), 'upperleft':((0.0, 1.0,-1.0), ve_types.AnyOf(ve_types.Sequence3(v\
e_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (u\
nits: eye coordinates)"), 'upperright':((1.0, 1.0,-1.0), ve_types.AnyO\
...

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.TextureStimulusBaseClass-class.html0000644000076500000240000003667011224565531031053 0ustar astrawstaff VisionEgg.Textures.TextureStimulusBaseClass
Package VisionEgg :: Module Textures :: Class TextureStimulusBaseClass
[frames] | no frames]

Class TextureStimulusBaseClass

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         TextureStimulusBaseClass

Parameters common to all stimuli that use textures.

Don't instantiate this class directly.

Parameters
==========
texture            -- source of texture data (Instance of <class 'VisionEgg.Textures.Texture'>)
                      Default: (determined at runtime)
texture_mag_filter -- OpenGL filter enum (Integer)
                      Default: GL_LINEAR (9729)
texture_min_filter -- OpenGL filter enum (Integer)
                      Default: (GL enum determined at runtime)
texture_wrap_s     -- OpenGL texture wrap enum (Integer)
                      Default: (GL enum determined at runtime)
texture_wrap_t     -- OpenGL texture wrap enum (Integer)
                      Default: (GL enum determined at runtime)

Constant Parameters
===================
internal_format   -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer)
                     Default: GL_RGB (6407)
mipmaps_enabled   -- Are mipmaps enabled? (Boolean)
                     Default: True
shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean)
                     Default: False



Instance Methods
 
__init__(self, **kw)
Instantiate and get ready to draw.
source code

Inherited from Core.Stimulus: draw

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'texture':(None, ve_types.Instance(...
  constant_parameters_and_defaults = {'internal_format':(gl.GL_R...

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Instantiate and get ready to draw.

Set parameter values and create anything needed to draw the
stimulus including OpenGL state variables such display lists
and texture objects.

Overrides: Core.Stimulus.__init__
(inherited documentation)

Class Variable Details

parameters_and_defaults

Value:
{'texture':(None, ve_types.Instance(Texture), "source of texture data"\
), 'texture_mag_filter':(gl.GL_LINEAR, ve_types.Integer, "OpenGL filte\
r enum", VisionEgg.ParameterDefinition.OPENGL_ENUM), 'texture_min_filt\
er':(None, ve_types.Integer, "OpenGL filter enum", VisionEgg.Parameter\
Definition.OPENGL_ENUM), 'texture_wrap_s':(None, ve_types.Integer, "Op\
enGL texture wrap enum", VisionEgg.ParameterDefinition.OPENGL_ENUM), '\
texture_wrap_t':(None, ve_types.Integer, "OpenGL texture wrap enum", V\
isionEgg.ParameterDefinition.OPENGL_ENUM),}

constant_parameters_and_defaults

Value:
{'internal_format':(gl.GL_RGB, ve_types.Integer, "format with which Op\
enGL uses texture data (OpenGL data type enum)", VisionEgg.ParameterDe\
finition.OPENGL_ENUM), 'mipmaps_enabled':(True, ve_types.Boolean, "Are\
 mipmaps enabled?"), 'shrink_texture_ok':(False, ve_types.Boolean, "Al\
low automatic shrinking of texture if too big?"),}

visionegg-1.2.1/doc/reference/html/VisionEgg.Textures.TextureTooLargeError-class.html0000644000076500000240000001456711224565531030174 0ustar astrawstaff VisionEgg.Textures.TextureTooLargeError
Package VisionEgg :: Module Textures :: Class TextureTooLargeError
[frames] | no frames]

Class TextureTooLargeError

source code

              object --+                
                       |                
exceptions.BaseException --+            
                           |            
        exceptions.Exception --+        
                               |        
        exceptions.StandardError --+    
                                   |    
             exceptions.RuntimeError --+
                                       |
                                      TextureTooLargeError

Instance Methods

Inherited from exceptions.RuntimeError: __init__, __new__

Inherited from exceptions.BaseException: __delattr__, __getattribute__, __getitem__, __getslice__, __reduce__, __repr__, __setattr__, __setstate__, __str__

Inherited from object: __hash__, __reduce_ex__

Properties

Inherited from exceptions.BaseException: args, message

Inherited from object: __class__

visionegg-1.2.1/doc/reference/html/VisionEgg.ThreeDeeMath-module.html0000644000076500000240000001460411224565531024712 0ustar astrawstaff VisionEgg.ThreeDeeMath
Package VisionEgg :: Module ThreeDeeMath
[frames] | no frames]

Module ThreeDeeMath

source code


Vertex and matrix operations - simulate OpenGL transforms.



Classes
  TransformMatrix
Functions
 
make_homogeneous_coord_rows(v)
Convert vertex (or row-wise vertices) into homogeneous coordinates.
source code
 
normalize_homogeneous_rows(v) source code
visionegg-1.2.1/doc/reference/html/VisionEgg.ThreeDeeMath-pysrc.html0000644000076500000240000011220711224565531024563 0ustar astrawstaff VisionEgg.ThreeDeeMath
Package VisionEgg :: Module ThreeDeeMath
[frames] | no frames]

Source Code for Module VisionEgg.ThreeDeeMath

 1  # The Vision Egg: ThreeDeeMath 
 2  # 
 3  # Copyright (C) 2001-2003 Andrew Straw. 
 4  # Copyright (C) 2008 California Institute of Technology 
 5  # 
 6  # URL: <http://www.visionegg.org/> 
 7  # 
 8  # Distributed under the terms of the GNU Lesser General Public License 
 9  # (LGPL). See LICENSE.TXT that came with this file. 
10   
11  """ 
12  Vertex and matrix operations - simulate OpenGL transforms. 
13   
14  """ 
15   
16  import math 
17  import numpy 
18  import numpy.oldnumeric as Numeric, numpy.oldnumeric.mlab as MLab 
19   
21 """Convert vertex (or row-wise vertices) into homogeneous coordinates.""" 22 v = Numeric.array(v,typecode=Numeric.Float) # copy 23 if len(v.shape) == 1: 24 v = v[Numeric.NewAxis,:] # make a rank-2 array 25 if v.shape[1] == 3: 26 ws = Numeric.ones((v.shape[0],1),typecode=Numeric.Float) 27 v = Numeric.concatenate( (v,ws), axis=1 ) 28 return v
29
31 v = Numeric.asarray(v) 32 homog = make_homogeneous_coord_rows(v) 33 r = (homog/homog[:,3,Numeric.NewAxis])[:,:3] 34 if len(homog.shape) > len(v.shape): 35 r = Numeric.reshape(r,(3,)) 36 return r
37
38 -class TransformMatrix:
39 - def __init__(self,matrix=None):
40 if matrix is None: 41 self.matrix = MLab.eye(4,typecode=Numeric.Float) 42 else: 43 self.matrix = matrix
44
45 - def __make_normalized_vert3(self, x, y, z ):
46 mag = math.sqrt( x**2 + y**2 + z**2 ) 47 return Numeric.array((x,y,z))/mag
48
49 - def rotate(self, angle_degrees, axis_x, axis_y, axis_z ):
50 """Follows the right hand rule. 51 52 I visualize the right hand rule most easily as follows: 53 Naturally, using your right hand, wrap it around the axis of 54 rotation. Your fingers now point in the direction of rotation. 55 56 """ 57 angleRadians = angle_degrees / 180.0 * math.pi 58 u = self.__make_normalized_vert3(axis_x, axis_y, axis_z ) 59 u=-u #follow right hand rule 60 S = Numeric.zeros( (3,3), Numeric.Float ) 61 S[0,1] = -u[2] 62 S[0,2] = u[1] 63 S[1,0] = u[2] 64 S[1,2] = -u[0] 65 S[2,0] = -u[1] 66 S[2,1] = u[0] 67 U = Numeric.outerproduct(u,u) 68 R = U + math.cos(angleRadians)*(MLab.eye(3)-U) + math.sin(angleRadians)*S 69 R = Numeric.concatenate( (R,Numeric.zeros( (3,1), Numeric.Float)), axis=1) 70 R = Numeric.concatenate( (R,Numeric.zeros( (1,4), Numeric.Float)), axis=0) 71 R[3,3] = 1.0 72 self.matrix = numpy.dot(R,self.matrix)
73
74 - def translate(self, x, y, z):
75 T = MLab.eye(4,typecode=Numeric.Float) 76 T[3,0] = x 77 T[3,1] = y 78 T[3,2] = z 79 self.matrix = numpy.dot(T,self.matrix)
80
81 - def scale(self, x, y, z):
82 T = MLab.eye(4,typecode=Numeric.Float) 83 T[0,0] = x 84 T[1,1] = y 85 T[2,2] = z 86 self.matrix = numpy.dot(T,self.matrix)
87
88 - def get_matrix(self):
89 return self.matrix
90
91 - def transform_vertices(self,verts):
92 v = Numeric.asarray(verts) 93 homog = make_homogeneous_coord_rows(v) 94 r = numpy.dot(homog,self.matrix) 95 if len(homog.shape) > len(v.shape): 96 r = Numeric.reshape(r,(4,)) 97 return r
98

visionegg-1.2.1/doc/reference/html/VisionEgg.ThreeDeeMath.TransformMatrix-class.html0000644000076500000240000002452511224565531027674 0ustar astrawstaff VisionEgg.ThreeDeeMath.TransformMatrix
Package VisionEgg :: Module ThreeDeeMath :: Class TransformMatrix
[frames] | no frames]

Class TransformMatrix

source code

Instance Methods
 
__init__(self, matrix=None) source code
 
rotate(self, angle_degrees, axis_x, axis_y, axis_z)
Follows the right hand rule.
source code
 
translate(self, x, y, z) source code
 
scale(self, x, y, z) source code
 
get_matrix(self) source code
 
transform_vertices(self, verts) source code
Method Details

rotate(self, angle_degrees, axis_x, axis_y, axis_z)

source code 
Follows the right hand rule.

I visualize the right hand rule most easily as follows:
Naturally, using your right hand, wrap it around the axis of
rotation. Your fingers now point in the direction of rotation.


visionegg-1.2.1/doc/reference/html/VisionEgg.win32_getrefresh-module.html0000644000076500000240000001111311224565531025563 0ustar astrawstaff VisionEgg.win32_getrefresh
Package VisionEgg :: Module win32_getrefresh
[frames] | no frames]

Module win32_getrefresh

source code

Variables
  getrefresh = _win32_getrefresh.getrefresh
visionegg-1.2.1/doc/reference/html/VisionEgg.win32_getrefresh-pysrc.html0000644000076500000240000004125211224565531025445 0ustar astrawstaff VisionEgg.win32_getrefresh
Package VisionEgg :: Module win32_getrefresh
[frames] | no frames]

Source Code for Module VisionEgg.win32_getrefresh

 1  # This file was created automatically by SWIG. 
 2  # Don't modify this file, modify the SWIG interface instead. 
 3  # This file is compatible with both classic and new-style classes. 
 4   
 5  import _win32_getrefresh 
 6   
7 -def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
8 if (name == "this"): 9 if isinstance(value, class_type): 10 self.__dict__[name] = value.this 11 if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown 12 del value.thisown 13 return 14 method = class_type.__swig_setmethods__.get(name,None) 15 if method: return method(self,value) 16 if (not static) or hasattr(self,name) or (name == "thisown"): 17 self.__dict__[name] = value 18 else: 19 raise AttributeError("You cannot add attributes to %s" % self)
20
21 -def _swig_setattr(self,class_type,name,value):
22 return _swig_setattr_nondynamic(self,class_type,name,value,0)
23
24 -def _swig_getattr(self,class_type,name):
25 method = class_type.__swig_getmethods__.get(name,None) 26 if method: return method(self) 27 raise AttributeError,name
28 29 import types 30 try: 31 _object = types.ObjectType 32 _newclass = 1 33 except AttributeError:
34 - class _object : pass
35 _newclass = 0 36 del types 37 38 39 40 getrefresh = _win32_getrefresh.getrefresh 41

visionegg-1.2.1/doc/reference/html/VisionEgg.win32_maxpriority-module.html0000644000076500000240000003362611224565531026031 0ustar astrawstaff VisionEgg.win32_maxpriority
Package VisionEgg :: Module win32_maxpriority
[frames] | no frames]

Module win32_maxpriority

source code

Variables
  IDLE_PRIORITY_CLASS = _win32_maxpriority.IDLE_PRIORITY_CLASS
  NORMAL_PRIORITY_CLASS = _win32_maxpriority.NORMAL_PRIORITY_CLASS
  HIGH_PRIORITY_CLASS = _win32_maxpriority.HIGH_PRIORITY_CLASS
  REALTIME_PRIORITY_CLASS = _win32_maxpriority.REALTIME_PRIORITY...
  THREAD_PRIORITY_IDLE = _win32_maxpriority.THREAD_PRIORITY_IDLE
  THREAD_PRIORITY_LOWEST = _win32_maxpriority.THREAD_PRIORITY_LO...
  THREAD_PRIORITY_BELOW_NORMAL = _win32_maxpriority.THREAD_PRIOR...
  THREAD_PRIORITY_NORMAL = _win32_maxpriority.THREAD_PRIORITY_NO...
  THREAD_PRIORITY_ABOVE_NORMAL = _win32_maxpriority.THREAD_PRIOR...
  THREAD_PRIORITY_HIGHEST = _win32_maxpriority.THREAD_PRIORITY_H...
  THREAD_PRIORITY_TIME_CRITICAL = _win32_maxpriority.THREAD_PRIO...
  set_self_process_priority_class = _win32_maxpriority.set_self_...
  set_self_thread_priority = _win32_maxpriority.set_self_thread_...
Variables Details

REALTIME_PRIORITY_CLASS

Value:
_win32_maxpriority.REALTIME_PRIORITY_CLASS

THREAD_PRIORITY_LOWEST

Value:
_win32_maxpriority.THREAD_PRIORITY_LOWEST

THREAD_PRIORITY_BELOW_NORMAL

Value:
_win32_maxpriority.THREAD_PRIORITY_BELOW_NORMAL

THREAD_PRIORITY_NORMAL

Value:
_win32_maxpriority.THREAD_PRIORITY_NORMAL

THREAD_PRIORITY_ABOVE_NORMAL

Value:
_win32_maxpriority.THREAD_PRIORITY_ABOVE_NORMAL

THREAD_PRIORITY_HIGHEST

Value:
_win32_maxpriority.THREAD_PRIORITY_HIGHEST

THREAD_PRIORITY_TIME_CRITICAL

Value:
_win32_maxpriority.THREAD_PRIORITY_TIME_CRITICAL

set_self_process_priority_class

Value:
_win32_maxpriority.set_self_process_priority_class

set_self_thread_priority

Value:
_win32_maxpriority.set_self_thread_priority

visionegg-1.2.1/doc/reference/html/VisionEgg.win32_maxpriority-pysrc.html0000644000076500000240000006324011224565531025677 0ustar astrawstaff VisionEgg.win32_maxpriority
Package VisionEgg :: Module win32_maxpriority
[frames] | no frames]

Source Code for Module VisionEgg.win32_maxpriority

 1  # This file was created automatically by SWIG. 
 2  # Don't modify this file, modify the SWIG interface instead. 
 3  # This file is compatible with both classic and new-style classes. 
 4   
 5  import _win32_maxpriority 
 6   
7 -def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
8 if (name == "this"): 9 if isinstance(value, class_type): 10 self.__dict__[name] = value.this 11 if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown 12 del value.thisown 13 return 14 method = class_type.__swig_setmethods__.get(name,None) 15 if method: return method(self,value) 16 if (not static) or hasattr(self,name) or (name == "thisown"): 17 self.__dict__[name] = value 18 else: 19 raise AttributeError("You cannot add attributes to %s" % self)
20
21 -def _swig_setattr(self,class_type,name,value):
22 return _swig_setattr_nondynamic(self,class_type,name,value,0)
23
24 -def _swig_getattr(self,class_type,name):
25 method = class_type.__swig_getmethods__.get(name,None) 26 if method: return method(self) 27 raise AttributeError,name
28 29 import types 30 try: 31 _object = types.ObjectType 32 _newclass = 1 33 except AttributeError:
34 - class _object : pass
35 _newclass = 0 36 del types 37 38 39 IDLE_PRIORITY_CLASS = _win32_maxpriority.IDLE_PRIORITY_CLASS 40 NORMAL_PRIORITY_CLASS = _win32_maxpriority.NORMAL_PRIORITY_CLASS 41 HIGH_PRIORITY_CLASS = _win32_maxpriority.HIGH_PRIORITY_CLASS 42 REALTIME_PRIORITY_CLASS = _win32_maxpriority.REALTIME_PRIORITY_CLASS 43 THREAD_PRIORITY_IDLE = _win32_maxpriority.THREAD_PRIORITY_IDLE 44 THREAD_PRIORITY_LOWEST = _win32_maxpriority.THREAD_PRIORITY_LOWEST 45 THREAD_PRIORITY_BELOW_NORMAL = _win32_maxpriority.THREAD_PRIORITY_BELOW_NORMAL 46 THREAD_PRIORITY_NORMAL = _win32_maxpriority.THREAD_PRIORITY_NORMAL 47 THREAD_PRIORITY_ABOVE_NORMAL = _win32_maxpriority.THREAD_PRIORITY_ABOVE_NORMAL 48 THREAD_PRIORITY_HIGHEST = _win32_maxpriority.THREAD_PRIORITY_HIGHEST 49 THREAD_PRIORITY_TIME_CRITICAL = _win32_maxpriority.THREAD_PRIORITY_TIME_CRITICAL 50 51 set_self_process_priority_class = _win32_maxpriority.set_self_process_priority_class 52 53 set_self_thread_priority = _win32_maxpriority.set_self_thread_priority 54

visionegg-1.2.1/doc/reference/html/VisionEgg.WrappedText-module.html0000644000076500000240000001323511224565531024661 0ustar astrawstaff VisionEgg.WrappedText
Package VisionEgg :: Module WrappedText
[frames] | no frames]

Module WrappedText

source code

Module containing the Multi-line text stimulus class WrappedText, as well
as a simple example of its use.



Classes
  WrappedText
Multi-line text stimulus.
Functions
 
main()
Launch VisionEgg and demo the WrappedText object
source code
visionegg-1.2.1/doc/reference/html/VisionEgg.WrappedText-pysrc.html0000644000076500000240000025753511224565531024551 0ustar astrawstaff VisionEgg.WrappedText
Package VisionEgg :: Module WrappedText
[frames] | no frames]

Source Code for Module VisionEgg.WrappedText

  1  #!/usr/bin/env python 
  2  """Module containing the Multi-line text stimulus class WrappedText, as well 
  3  as a simple example of its use.""" 
  4  # Copyright (c) 2007 Eamon Caddigan, University of Illinois 
  5  # License: LGPL (see LICENSE.txt distributed with this file) 
  6  # Created on 2007-11-15 
  7  #  
  8  # TODO: (more of a wishlist) 
  9  #   * anchor parameter 
 10  #   * angle parameter (I dunno, maybe you want some paragraphs tilted) 
 11  #   * more robust line length calculation 
 12  #   * wholesale replacement of this module with *real* formatted text (e.g., 
 13  #     ghostscript). The kerning of pygame's text is atrocious. 
 14   
 15  import VisionEgg.Core 
 16  import VisionEgg.Text 
 17  import VisionEgg.Textures 
 18  import VisionEgg.ParameterTypes as ve_types 
 19  import textwrap 
 20   
21 -class WrappedText(VisionEgg.Core.Stimulus):
22 """Multi-line text stimulus. No fancy formatting, but line breaks ('\\n') 23 are preserved, and text is wrapped to fit within the stimulus 24 boundaries.""" 25 26 parameters_and_defaults = { 27 'on':(True, ve_types.Boolean), 28 'position':((0.0,0.0), 29 ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), 30 ve_types.Sequence3(ve_types.Real), 31 ve_types.Sequence4(ve_types.Real))), 32 'size':(None, ve_types.Sequence2(ve_types.Real), 33 """Defaults to the size of the screen."""), 34 'text':('hello', ve_types.AnyOf(ve_types.String,ve_types.Unicode)), 35 'color':((1.0,1.0,1.0), 36 ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), 37 ve_types.Sequence4(ve_types.Real))) 38 } 39 40 constant_parameters_and_defaults = { 41 'font_name':(None, ve_types.AnyOf(ve_types.String,ve_types.Unicode), 42 "Name of font to use. If None, use the default font"), 43 'font_size':(30, ve_types.UnsignedInteger) 44 } 45
46 - def __init__(self, **kw):
47 """Initialize the object, perform the initial line-splitting""" 48 VisionEgg.Core.Stimulus.__init__(self, **kw) 49 50 if self.parameters.size is None: 51 self.parameters.size = (VisionEgg.config.VISIONEGG_SCREEN_W, 52 VisionEgg.config.VISIONEGG_SCREEN_H) 53 54 self._splitText()
55
56 - def _splitText(self):
57 """Split a single string into multiple lines of text, storing each as a 58 VisionEgg.Text.Text instance""" 59 p = self.parameters 60 cp = self.constant_parameters 61 62 self._text = p.text 63 64 textAreaWidth = None 65 maxLineLength = len(self._text) 66 minLineLength = 1 67 lineLength = maxLineLength 68 while ((textAreaWidth > p.size[0]) or 69 ((maxLineLength-minLineLength) > 1)) and (maxLineLength > 1): 70 nextPosition = p.position 71 self._textLines = [] 72 73 try: 74 textLineList = [] 75 for text in self._text.split("\n"): 76 if text == "": 77 textLineList.append("") 78 else: 79 textLineList.extend(textwrap.wrap(text, lineLength)) 80 81 textAreaWidth = None 82 for textLine in textLineList: 83 if textLine != "": 84 line = VisionEgg.Text.Text(text=textLine, 85 position = nextPosition, 86 anchor = "upperleft", 87 ignore_size_parameter = True, 88 color = p.color, 89 font_name = cp.font_name, 90 font_size = cp.font_size) 91 textAreaWidth = max(textAreaWidth, line.parameters.size[0]) 92 self._textLines.append(line) 93 94 nextPosition = (nextPosition[0], 95 nextPosition[1]-line.parameters.size[1]) 96 97 # Stop adding lines if the text area's height has been reached 98 if (p.position[1] - nextPosition[1]) > p.size[1]: 99 break 100 101 except VisionEgg.Textures.TextureTooLargeError: 102 textAreaWidth = p.size[0]+1 103 104 if textAreaWidth > p.size[0]: 105 maxLineLength = lineLength 106 else: 107 minLineLength = lineLength 108 lineLength = (maxLineLength+minLineLength)/2
109
110 - def draw(self):
111 """Draw the lines of text on the screen""" 112 p = self.parameters 113 114 if p.on: 115 if p.text != self._text: 116 self._splitText() 117 118 for line in self._textLines: 119 line.parameters.color = p.color 120 line.draw()
121
122 -def main():
123 """Launch VisionEgg and demo the WrappedText object""" 124 import VisionEgg 125 VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() 126 import VisionEgg.FlowControl 127 128 screen = VisionEgg.Core.get_default_screen() 129 130 message="""Hello. 131 132 This is a demonstration of the WrappedText object, which was created to allow users of VisionEgg to include large blocks of text in their programs. While this stimulus has many limitations, it should be useful for presenting on-screen instructions in experiments. 133 134 While you are welcome to modify this file to extend its functionality, I hope you consider sharing any such modifications with the VisionEgg community. 135 136 Eamon Caddigan,\nUniversity of Illinois\n15 November 2007""" 137 138 wt = WrappedText(text=message, position=(50,screen.size[1]-50), 139 size=(screen.size[0]-100, screen.size[1]-100)) 140 141 viewport = VisionEgg.Core.Viewport(screen=screen, stimuli=[wt]) 142 143 # Frame-based presentation duration makes it easier to use pdb 144 p = VisionEgg.FlowControl.Presentation(viewports=[viewport], 145 go_duration=(VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ*30,'frames')) 146 p.go() 147 148 screen.close() # Called explicitly to behave better in interactive shells
149 150 if __name__ == "__main__": 151 main() 152

visionegg-1.2.1/doc/reference/html/VisionEgg.WrappedText.WrappedText-class.html0000644000076500000240000003530011224565531026744 0ustar astrawstaff VisionEgg.WrappedText.WrappedText
Package VisionEgg :: Module WrappedText :: Class WrappedText
[frames] | no frames]

Class WrappedText

source code

         object --+        
                  |        
ClassWithParameters --+    
                      |    
          Core.Stimulus --+
                          |
                         WrappedText

Multi-line text stimulus. No fancy formatting, but line breaks ('\n')
are preserved, and text is wrapped to fit within the stimulus
boundaries.



Instance Methods
 
__init__(self, **kw)
Initialize the object, perform the initial line-splitting
source code
 
draw(self)
Draw the lines of text on the screen
source code

Inherited from ClassWithParameters: __getstate__, __setstate__, get_specified_type, is_constant_parameter, set, verify_parameters

Inherited from object: __delattr__, __getattribute__, __hash__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __str__

Class Variables
  parameters_and_defaults = {'on':(True, ve_types.Boolean), 'pos...
  constant_parameters_and_defaults = {'font_name':(None, ve_type...

Inherited from ClassWithParameters: __safe_for_unpickling__

Properties

Inherited from object: __class__

Method Details

__init__(self, **kw)
(Constructor)

source code 
Initialize the object, perform the initial line-splitting

Overrides: Core.Stimulus.__init__

draw(self)

source code 
Draw the lines of text on the screen

Overrides: Core.Stimulus.draw

Class Variable Details

parameters_and_defaults

Value:
{'on':(True, ve_types.Boolean), 'position':((0.0, 0.0), ve_types.AnyOf\
(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real),\
 ve_types.Sequence4(ve_types.Real))), 'size':(None, ve_types.Sequence2\
(ve_types.Real), """Defaults to the size of the screen."""), 'text':('\
hello', ve_types.AnyOf(ve_types.String, ve_types.Unicode)), 'color':((\
1.0, 1.0, 1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_t\
ypes.Sequence4(ve_types.Real)))}

constant_parameters_and_defaults

Value:
{'font_name':(None, ve_types.AnyOf(ve_types.String, ve_types.Unicode),\
 "Name of font to use. If None, use the default font"), 'font_size':(3\
0, ve_types.UnsignedInteger)}

visionegg-1.2.1/doc/reference/make_epy.sh0000755000076500000240000000353711224565531017541 0ustar astrawstaff#!/bin/sh if test ! -n "$PYTHON"; then echo "Specify which python with the PYTHON environment variable" exit 1 fi $PYTHON epydoc --name "Vision Egg" --url "http://www.visionegg.org" --no-private \ --docformat plaintext --parse-only \ VisionEgg \ VisionEgg.Configuration \ VisionEgg.Core \ VisionEgg.Daq \ VisionEgg.DaqLPT \ VisionEgg.Deprecated \ VisionEgg.Dots \ VisionEgg.FlowControl \ VisionEgg.GUI \ VisionEgg.Gratings \ VisionEgg.MoreStimuli \ VisionEgg.ParameterTypes \ VisionEgg.PlatformDependent \ VisionEgg.PyroClient \ VisionEgg.PyroHelpers \ VisionEgg.QuickTime \ VisionEgg.SphereMap \ VisionEgg.TCPController \ VisionEgg.Text \ VisionEgg.Textures \ VisionEgg.ThreeDeeMath \ VisionEgg.darwin_getrefresh \ VisionEgg.darwin_maxpriority \ VisionEgg.gl_qt \ VisionEgg.posix_maxpriority \ VisionEgg.win32_getrefresh \ VisionEgg.win32_maxpriority #VisionEgg.GL \ #VisionEgg.GLTrace \ #VisionEgg.PyroApps \ #VisionEgg.PyroApps.ColorCalGUI \ #VisionEgg.PyroApps.ColorCalServer \ #VisionEgg.PyroApps.EPhysGUI \ #VisionEgg.PyroApps.EPhysGUIUtils \ #$PYTHON pydoc.py -w VisionEgg.PyroApps.EPhysServer #$PYTHON pydoc.py -w VisionEgg.PyroApps.FlatGratingGUI #$PYTHON pydoc.py -w VisionEgg.PyroApps.FlatGratingServer #$PYTHON pydoc.py -w VisionEgg.PyroApps.GridGUI #$PYTHON pydoc.py -w VisionEgg.PyroApps.GridServer #$PYTHON pydoc.py -w VisionEgg.PyroApps.MouseTargetGUI #$PYTHON pydoc.py -w VisionEgg.PyroApps.MouseTargetServer #$PYTHON pydoc.py -w VisionEgg.PyroApps.ScreenPositionGUI #$PYTHON pydoc.py -w VisionEgg.PyroApps.ScreenPositionServer #$PYTHON pydoc.py -w VisionEgg.PyroApps.SphereGratingGUI #$PYTHON pydoc.py -w VisionEgg.PyroApps.SphereGratingServer #$PYTHON pydoc.py -w VisionEgg.PyroApps.SpinningDrumGUI #$PYTHON pydoc.py -w VisionEgg.PyroApps.SpinningDrumServer #$PYTHON pydoc.py -w VisionEgg.PyroApps.TargetGUI #$PYTHON pydoc.py -w VisionEgg.PyroApps.TargetServer visionegg-1.2.1/doc/visionegg/0000755000076500000240000000000011231315557015433 5ustar astrawstaffvisionegg-1.2.1/doc/visionegg/about.html0000644000076500000240000001137111224565531017437 0ustar astrawstaff About this document ...

About this document ...

The Vision Egg Programmer's Manual, June 7, 2008, Release 1.1

This document was generated using the LaTeX2HTML translator.

LaTeX2HTML is Copyright © 1993, 1994, 1995, 1996, 1997, Nikos Drakos, Computer Based Learning Unit, University of Leeds, and Copyright © 1997, 1998, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The application of LaTeX2HTML to the Python documentation has been heavily tailored by Fred L. Drake, Jr. Original navigation icons were contributed by Christopher Petrilli.

visionegg-1.2.1/doc/visionegg/contents.html0000644000076500000240000001215411224565531020162 0ustar astrawstaff Contents

Contents

visionegg-1.2.1/doc/visionegg/controllers.html0000644000076500000240000001516011224565531020673 0ustar astrawstaff 3. Controlling stimulus parameters in realtime


3. Controlling stimulus parameters in realtime

When using the Presentation class, you have a powerful method of updating parameters in realtime available to you. ``Controllers'' are instances of the class Controller. A controller is called at pre-defined intervals and updates the value of some stimulus parameter. For example, in the ``target'' demo script, the ``center'' parameter of a Target2D stimulus is updated on every frame by a function which computes position based upon the current time. You can also control parameters without using controllers by simply changing the values as your program executes.

Instances of Controller are called by instances of the Presentation class. After creating an instance of Controller, it must be ``registered'' by calling the add_controller method of Presentation, during which the stimulus parameter under control is specified. The Presentation takes care of calling the controller from this point. Specifically, the during_go_eval() is called during a go() loop, and between_go_eval() is called by between_presentations() (during run_forever(), for example.) These ``eval'' methods return a value which becomes the new value of the parameter being controller.

The frequency with which during_go_eval() and between_go_eval() are evaluated is determined by the eval_frequency attribute of the controller. The default eval_frequency is every frame.

The temporal_variables attribute of the controller specifies what temporal variables the ``eval'' methods have available to base calculations on. The default value is TIME_SEC_SINCE_GO, so when during_go_eval() is called, the instance will have an attribute time_sec_since_go set to the time since the onset of the go() loop.

For more information, see the documentation for the Controller and Presentation classes in the VisionEgg.Core module.

visionegg-1.2.1/doc/visionegg/front.html0000644000076500000240000001222511224565531017454 0ustar astrawstaff Front Matter


Front Matter

Copyright © 2001-2008 Andrew Straw All rights reserved.

Abstract:

The Vision Egg was designed to perform two primary tasks. The first task is the drawing of computer graphics using OpenGL. The optional second task is to handle the flow control of your program to coordinate events on your computer in a precisely timed way.

These are challenging tasks, and the Vision Egg does much of the work for you. However, to make full use of the Vision Egg, you should understand the basics. This is an overview of the main components of the VisionEgg itself.

Note before starting: The Vision Egg is fundamentally object oriented in nature, and this document assumes you are familiar with terms such as ''class'' and ''instance''. If you are not, please find some information on the topic of object oriented programming. As you write scipts, you will also need to consult the Python, Numeric, pygame, or other documentation.

visionegg-1.2.1/doc/visionegg/hierarchy.html0000644000076500000240000001571511224565531020311 0ustar astrawstaff 2. Hierarchy of graphical objects


2. Hierarchy of graphical objects

Currently, the Vision Egg supports only a single screen (window). However, it is designed to run simultaneously in multiple screens, so once this capability is available (perhaps in pyglet), the following priciples will continue to apply.

Each screen contains a list of least one ``viewport''. A viewport is defined to occupy a rectangular region of the screen and define how and where objects are drawn. The default viewport created with each screen fills the entire screen. In the Vision Egg Viewport class, the screen position and size are specified in addition to the projection. The projection, specified by the Projection class, transforms 3D ``eye coordinates'' into ``clip coordinates'' according to, for example, an orthographic or perspective projection. (Eye coordinates are the 3D coordinates of objects referenced from the observers eye in arbitrary units. Clip coordinates are used to compute the final position of the 3D object on the 2D screen.) The default Projection created with a Viewport is an orthographic projection that maps eye coordinates in a one to one manner to pixel coordinates, allowing specification of object position in absolute pixels. For more information, consult section 2.11, ``Coordinate Transformations'' of the OpenGL Specification.

Multiple instances of the Viewport class may occupy the same region of the screen. This could be used, for example, to overlay objects with different projections such as in the targetBackground demo. The order of the list of viewports is important, with the first in the list being drawn first and later viewports are drawn on top of earlier viewports.

An instance of the Viewport class keeps an ordered list of the objects it draws. Objects to be drawn on top of other objects should be drawn last and therefore placed last in the list.

The objects a viewport drawns are all instances of the Stimulus class. The name ``Stimulus'' is perhaps a slightly inaccurate because instances of this class only define how to draw a set of graphics primitives. So for example, there are SinGrating2D and TextureStimulus subclasses of the Stimulus class.

The Vision Egg draws objects in a hierarchical manner. First, the screen(s) calls each of its viewports in turn. Each viewport calls each of its stimuli in turn. In this way, the occlusion of objects can be controlled by drawing order without employing more advanced concepts such as depth testing (which is also possible).

visionegg-1.2.1/doc/visionegg/index.html0000644000076500000240000001252711224565531017440 0ustar astrawstaff The Vision Egg Programmer's Manual

The Vision Egg Programmer's Manual

Andrew Straw

Release 1.1
June 7, 2008



visionegg-1.2.1/doc/visionegg/node3.html0000644000076500000240000002167311224565531017343 0ustar astrawstaff 1. Coordinating events


1. Coordinating events

There are several ways to organize the sequence of your experiments using the Vision Egg. You can write your own custom flow control and event handling, using the Vision Egg solely for drawing graphics. This is often useful in psychophysics experiments where interaction with a subject is interleaved with presentation of stimuli.

Alternatively, you can make use of the classes in VisionEgg.FlowControl. For example, Presentation is a class that maintains an association between the parameters of stimuli and their control functions, calls these functions, and initiates drawing of the stimuli. There are several ways to use the Presentation class described below. This mode of operation is useful for electrophysiology experiments.

1.1 Custom flow control and event handling

By writing your own custom flow control code, you have much more flexibility in designing experiments, but also less of the work involved has been done for you. Perhaps the best place to start is simply to look at some examples. See the demonstration scripts dots_simple_loop.py, mouseTarget_user_loop.py, and multi_stim.py. Each of these programs has its own main loop which performs the same role as the Presentation class's go and run_forever methods, which are described further in this chapter.

1.2 Using the Presentation class: Running a single trial

Most of the Vision Egg demonstration scripts run a single trial and then quit. From a programming perspective, this is the easiest way to get started. The timing and control of events within a single trial is performed by a ``go loop'', which is entered by calling the go() method of the Presentation class.

A cycle of the go loop consists of updating any relevant stimulus parameters, clearing the framebuffer, and calling the stimuli to draw themselves. The buffers are swapped and the cycle begins again, usually after waiting for the vertical blanking interval (see the section in this manual on double buffering). When waiting for the vertical blanking interval (``sync swap buffers'') is enabled, cycles through the ``go loop'' never occur faster than the frame rate. If the go loop is burdened with lots of calculations or if the operating system takes the CPU away from the Vision Egg, the cycle through the go loop is not completed before the video card begins drawing the next frame and therefore a frame is skipped.

A go loop can run indefinitly or have its duration limited to a duration measured in seconds or in number of frames drawn. (Measuring duration based on frames drawn is only meaningful when buffer swapping is synchronized with the vertical blanking interval and frame skipping would be particularly undesirable in this case.)

1.3 Using the Presentation class: Continuous operation

Often, the visual stimulus needs to continue running between trials. At a minimum this could be used to keep the display constant and to prevent the Vision Egg from quitting, but could also be used to maintain a moving pattern on the display between trials. In addition, it may be necessary to trigger a go loop with a minimum of latency after the receipt of some signal, such as a digital input on the parallel port.

To use the Vision Egg in this manner, the run_forever() method of Presentation is called, which begins a loop that performs the same tasks as a go loop with the exception that functions controlling stimulus parameters are informed that it is a ``between go loops'' state. At any point this run_forever loop can create a go loop, which returns control back to the run_forever loop when done. Alternatively, if the controlling functions for stimulus parameters operate between go loops, the entire experiment could be run without entering a go loop. (This could also be acheived by starting a go loop with a duration parameter set to ``forever''.)

visionegg-1.2.1/doc/visionegg/node6.html0000644000076500000240000002426511224565531017346 0ustar astrawstaff 4. Other general information


4. Other general information

4.1 Double buffering

The Vision Egg operates in double buffered mode. This means that the contents of the ``front'' framebuffer are read by the video card to produce the on-screen display. Meanwhile, clearing and drawing operations always occur on the back framebuffer, which becomes the front buffer on a buffer swap (also called flip). This way, an incomplete frame is never drawn to the screen. However, if the buffers are swapped while the display is only part-way through the front buffer, the top and bottom parts of the display will contain frames drawn at different times and thus lead to a tearing artifact. For this reason the default behavior of the Vision Egg is to synchronize buffer swapping with the vertical blanking period, ensuring that tearing does not happen. (Synchronizing buffer swapping is not available for some video drivers on the linux platform, and may frequently be overriden in the Displays control panel in Windows.)

4.2 File layout

Several directories are created in a Vision Egg installation. The files used when a Python script imports any Vision Egg module are in the standard Python ``site-packages'' directory. Next, the Vision Egg system directory contains data files such as sample images used by the demo scripts and a site-wide configuration file. A user-specific configuration file is looked for is the VisionEgg home directory. On your system, you can determine the exact location of these directories by running the ``check-config.py'' script, which is distributed with the Vision Egg. If you have installed the Vision Egg from source, you will also have the source directory.

4.3 Priority control

The Vision Egg can take advantage of operating system dependent methods of setting the priority of an application. The performance and features vary from platform to platform. The options available from OS specific system calls are available in the Vision Egg. Before trying something new, do not attempt to increase your script's priority, because this may result in locking up the computer.

4.4 The log file: Warnings and errors

The Vision Egg uses the standard Python logging package to log information including warnings and errors to two locations by default: the standard error stream (as standard for Python scripts) and to a file called ``VisionEgg.log'' in the current directory. The standard error stream is typically printed on the console, which may only be visible when running your script from the command line. If your script (or modules it imports) raise a SyntaxError, the Vision Egg will be unable to start and therefore unable to copy the exception traceback to the log file, and viewing the standard error is the only way to see what went wrong. Therefore, if your log file does not display an error but your script is not executing, run it from the command line. Also, on Mac OS X, the standard error output is only visible through the Console.app available in ``/Applications/Utilities''.

You can increase the verbosity of the output by doing something like ``VisionEgg.logger.setLevel( VisionEgg.logging.DEBUG )'' in your script.

4.5 Configuration options

A number of options that control behavior of the Vision Egg are available. These options are first determined when the VisionEgg.Configuration module is loaded (by the base module VisionEgg, for example). This module first loads variables from the ``VisionEgg.cfg'' file and then checks for environment variables that override these values.

The values set by VisionEgg.Configuration may be overriden at any time by re-assigning the appropriate variable. For example:

import VisionEgg

# Turn off GUI window when calling create_default_screen()
VisionEgg.config.VISIONEGG_GUI_INIT = 0

4.6 For more information

A significant amount of documentation is contained within the source code as ''docstrings'' -- special comments within the code. These docstrings are often the best source of information for a particular class or function. In particular, the fundamentally important classes in the VisionEgg.Core module are well documented. You can either browse the source code itself, look at the library reference compiled from the source, or use a utility such as PyDoc to compile your own reference from the source.

The Vision Egg mailing list is another source of valuble information. Sign up and browse the archives through the Vision Egg website.

For installation instructions, the Vision Egg website provides the most up-to-date, platform-specific information.

To create your own stimuli you need to know OpenGL. To learn more about OpenGL, you may want to begin with ``The Red Book'' (The OpenGL Programming Guide, The Official Guide to Learning). The OpenGL specification is also useful (available online).

visionegg-1.2.1/doc/visionegg/visionegg.css0000644000076500000240000002306311224565531020144 0ustar astrawstaff/* * The first part of this is the standard CSS generated by LaTeX2HTML, * with the "empty" declarations removed. */ /* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ .math { font-family: "Century Schoolbook", serif; } .math i { font-family: "Century Schoolbook", serif; font-weight: bold } .boldmath { font-family: "Century Schoolbook", serif; font-weight: bold } /* * Implement both fixed-size and relative sizes. * * I think these can be safely removed, as it doesn't appear that * LaTeX2HTML ever generates these, even though these are carried * over from the LaTeX2HTML stylesheet. */ small.xtiny { font-size : xx-small; } small.tiny { font-size : x-small; } small.scriptsize { font-size : smaller; } small.footnotesize { font-size : small; } big.xlarge { font-size : large; } big.xxlarge { font-size : x-large; } big.huge { font-size : larger; } big.xhuge { font-size : xx-large; } /* * Document-specific styles come next; * these are added for the Python documentation. * * Note that the size specifications for the H* elements are because * Netscape on Solaris otherwise doesn't get it right; they all end up * the normal text size. */ body { color: #000000; background-color: #ffffff; } a:link:active { color: #ff0000; } a:link:hover { background-color: #bbeeff; } a:visited:hover { background-color: #bbeeff; } a:visited { color: #551a8b; } a:link { color: #0000bb; } h1, h2, h3, h4, h5, h6 { font-family: avantgarde, sans-serif; font-weight: bold; } h1 { font-size: 180%; } h2 { font-size: 150%; } h3, h4 { font-size: 120%; } /* These are section titles used in navigation links, so make sure we * match the section header font here, even it not the weight. */ .sectref { font-family: avantgarde, sans-serif; } /* And the label before the titles in navigation: */ .navlabel { font-size: 85%; } /* LaTeX2HTML insists on inserting
elements into headers which * are marked with \label. This little bit of CSS magic ensures that * these elements don't cause spurious whitespace to be added. */ h1>br, h2>br, h3>br, h4>br, h5>br, h6>br { display: none; } code, tt { font-family: "lucida typewriter", lucidatypewriter, monospace; } var { font-family: times, serif; font-style: italic; font-weight: normal; } .Unix { font-variant: small-caps; } .typelabel { font-family: lucida, sans-serif; } .navigation td { background-color: #99ccff; font-weight: bold; font-family: avantgarde, sans-serif; font-size: 110%; } div.warning { background-color: #fffaf0; border: thin solid black; padding: 1em; margin-left: 2em; margin-right: 2em; } div.warning .label { font-family: sans-serif; font-size: 110%; margin-right: 0.5em; } div.note { background-color: #fffaf0; border: thin solid black; padding: 1em; margin-left: 2em; margin-right: 2em; } div.note .label { margin-right: 0.5em; font-family: sans-serif; } address { font-size: 80%; } .release-info { font-style: italic; font-size: 80%; } .titlegraphic { vertical-align: top; } .verbatim pre { color: #00008b; font-family: "lucida typewriter", lucidatypewriter, monospace; font-size: 90%; } .verbatim { margin-left: 2em; } .verbatim .footer { padding: 0.05in; font-size: 85%; background-color: #99ccff; margin-right: 0.5in; } .grammar { background-color: #99ccff; margin-right: 0.5in; padding: 0.05in; } .grammar-footer { padding: 0.05in; font-size: 85%; } .grammartoken { font-family: "lucida typewriter", lucidatypewriter, monospace; } .productions { background-color: #bbeeff; } .productions a:active { color: #ff0000; } .productions a:link:hover { background-color: #99ccff; } .productions a:visited:hover { background-color: #99ccff; } .productions a:visited { color: #551a8b; } .productions a:link { color: #0000bb; } .productions table { vertical-align: baseline; empty-cells: show; } .productions > table td, .productions > table th { padding: 2px; } .productions > table td:first-child, .productions > table td:last-child { font-family: "lucida typewriter", lucidatypewriter, monospace; } /* same as the second selector above, but expressed differently for Opera */ .productions > table td:first-child + td + td { font-family: "lucida typewriter", lucidatypewriter, monospace; vertical-align: baseline; } .productions > table td:first-child + td { padding-left: 1em; padding-right: 1em; } .productions > table tr { vertical-align: baseline; } .email { font-family: avantgarde, sans-serif; } .mailheader { font-family: avantgarde, sans-serif; } .mimetype { font-family: avantgarde, sans-serif; } .newsgroup { font-family: avantgarde, sans-serif; } .url { font-family: avantgarde, sans-serif; } .file { font-family: avantgarde, sans-serif; } .guilabel { font-family: avantgarde, sans-serif; } .realtable { border-collapse: collapse; border-color: black; border-style: solid; border-width: 0px 0px 2px 0px; empty-cells: show; margin-left: auto; margin-right: auto; padding-left: 0.4em; padding-right: 0.4em; } .realtable tbody { vertical-align: baseline; } .realtable tfoot { display: table-footer-group; } .realtable thead { background-color: #99ccff; border-width: 0px 0px 2px 1px; display: table-header-group; font-family: avantgarde, sans-serif; font-weight: bold; vertical-align: baseline; } .realtable thead :first-child { border-width: 0px 0px 2px 0px; } .realtable thead th { border-width: 0px 0px 2px 1px } .realtable td, .realtable th { border-color: black; border-style: solid; border-width: 0px 0px 1px 1px; padding-left: 0.4em; padding-right: 0.4em; } .realtable td:first-child, .realtable th:first-child { border-left-width: 0px; vertical-align: baseline; } .center { text-align: center; } .left { text-align: left; } .right { text-align: right; } .refcount-info { font-style: italic; } .refcount-info .value { font-weight: bold; color: #006600; } /* * Some decoration for the "See also:" blocks, in part inspired by some of * the styling on Lars Marius Garshol's XSA pages. * (The blue in the navigation bars is #99CCFF.) */ .seealso { background-color: #fffaf0; border: thin solid black; padding: 0pt 1em 4pt 1em; } .seealso > .heading { font-size: 110%; font-weight: bold; } /* * Class 'availability' is used for module availability statements at * the top of modules. */ .availability .platform { font-weight: bold; } /* * Additional styles for the distutils package. */ .du-command { font-family: monospace; } .du-option { font-family: avantgarde, sans-serif; } .du-filevar { font-family: avantgarde, sans-serif; font-style: italic; } .du-xxx:before { content: "** "; font-weight: bold; } .du-xxx:after { content: " **"; font-weight: bold; } /* * Some specialization for printed output. */ @media print { .online-navigation { display: none; } } visionegg-1.2.1/doc/visionegg/visionegg.html0000644000076500000240000001252711224565531020323 0ustar astrawstaff The Vision Egg Programmer's Manual

The Vision Egg Programmer's Manual

Andrew Straw

Release 1.1
June 7, 2008



visionegg-1.2.1/doc/visionegg.pdf0000644000076500000240000031554211224565531016141 0ustar astrawstaff%PDF-1.4 %ÔĊĜ 3 0 obj << /Length 264 /Filter /FlateDecode >> stream xÚMOÁN0 ½ç+|£•h°S'iŽ C%$`—i‡j-e˘íDÇ´ßÇ!B‰òĴgż÷b”Cà\„¤pe>Ġ—˘µF(‚fÇħżÛ#tÂԀ:×ߙ ĜU‚#lĠ˟Ûbġ}hÔŬ£a0Ĵ}ċ šw SjSZpÎi+LğĴùèóÂĝ*{;ž§9Ġ›aHĊórrÂl‰O;Mŭr“[ÌÎİûÔΑż´cojI³@^²ÓJIÈ £ÚV>Ċ½öcߞ×HÒ´ ùż° Ölœ µš°LÊûı[úÜ`vMâíwúT˘’"Ĵ5ц­,b> endobj 1 0 obj << /Font << /F24 4 0 R /F25 5 0 R /F27 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 10 0 obj << /Length 162 /Filter /FlateDecode >> stream xÚUŽ1‚0…w~ĊírwP*#\íĤFŠš5…hü÷Š5——÷._ŜğıKҚ-”ş,¸×‚e°„3 X\o’P<ùxäέ 7Ú% Î"sïiMù¤GħĥԄÚ"™ŝ ëÜd€bDRo™IĊEui‚—lÄ#ĉġö’~ħêşh>ßġ_ï{î#ċ=&K—ĵê÷8( endstream endobj 9 0 obj << /Type /Page /Contents 10 0 R /Resources 8 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 8 0 obj << /Font << /F27 6 0 R /F14 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 14 0 obj << /Length 846 /Filter /FlateDecode >> stream xÚmUKoÛ0 ÷Wĝ(M귓Ŭ: ŬĥC°ËşƒbˉVÛ2$ıEŝŭH‘n“!'S$E‘?Òw7wym×Û*Ğ˘]e›z]TeTĊşĴ·Ñ~‹û½óV6>ŝ³ûz÷˜ĠgŝĞ,-…UVŻË͆.ìŽ*^eU-~ĊU"´ÓfÄs%2ĵĈi"¤£CĞœ>ŒŞ%oH;)Û;Á‡ †<&ĞiOl‘îÙ­U/½½û”$™uq*üğIÚñ+‹kkeœ–âUœšéÈ£14{eI{°r:ê†3žşQ­Òt½-KŞüǤĈOß ,İ8¤fòìIíTcĈ–dN ¤ĝ†òá|”cÛ+öZA]ı‰3H— È[qCâ=™Ù’ûd ä=p³Ü1ĥĠ£ô\aĵÄ@ž“ŭ: u†Ĉ•˘5z—OúLV5ÚİŝDG݇Zİ맸*Ċú-P½²â7²Ê³THËBs”}ŻĈCèOž%Ô[ó­ˆ#z„P8gžZk”#Ġ07G’ħ‹ÛÄ2ûL' Ŭ e–‹Ï„ŝf6.Áé Äè?Èg ÄAğıïIš—êÎèĊĜnPÄ-I îhĉžaÇVYçñ@öÒeq8RŽ@ħ2ËWrxƒ…p5/Z-üBK÷_ÄA.ÍFB˜‘)sÍġ½šz|Ĝ-şËÖsÉßMàc½{¸£ĵ*½´:˙ç{Ë>mŜ+`˘LäÙyNd2ûżŞñd6Vƒ-/q˜‰Ù*DzSµPë 7kM3cLÒKçàÄ&ê jíĠŽvùƒîµÄ* X8ŝˆLĵ²ƒ#Ñj˘Y²ĉ)ˊĤ‡·P`ġ™lzÄĈ7 el4pôKGfĉJA³„šÑĝÀ#XĦ=,G%p_.QŬÓ#.`陇ĵÀÀ=Ĉe5é†t†_e˜Ż`z^ÔËn ğw•$âŜ‘%䝕xµI:×èÉ‡İŻÓĊŝ":LH²Çmoè0ŞċÏĜ“nî=…iíϓ?š‘ƒ~‡fZŬiÂ~q MSĴ Ûpu.üˆ–ß<ìnŝèmĝ endstream endobj 13 0 obj << /Type /Page /Contents 14 0 R /Resources 12 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 12 0 obj << /Font << /F30 15 0 R /F27 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 18 0 obj << /Length 8 /Filter /FlateDecode >> stream xÚ endstream endobj 17 0 obj << /Type /Page /Contents 18 0 R /Resources 16 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 16 0 obj << /ProcSet [ /PDF ] >> endobj 34 0 obj << /Length 1060 /Filter /FlateDecode >> stream xÚíXM—›6ŬûW°4 ĞúD"ËL“““E’6Îé"͂ñ034Meܜù÷}ÀF60N{²HâĥumŬwuy<_/~yÉeÄ%ÑF³h}I*H˘y”J„H˘ġMôqyġöÍúĊ›ġûĝÓúġâĊzÁ" /NqC4ÓÑfğ $•%JĥĞŸ{Ô `Ğîy³Ğ QJ҄'ÍĤƒ˙i÷cñŠQJ—WÖş›˘Êê˘ş‹W\Ñe3µü'fŞwÇ|˜V„А. èxÔ<'%Ħ,=&v´£I h)–Yş`Û]ıìzôŬĤ¤ÑC@ôWû]m·R*lÌĠòK÷ycĞÚÙ²ûU7^/Ŝê½şŻîaħl= …kN$Ĉr*žG͇ÁuB¸`a$^)8ÔùÂ4OĤMB%1TŸg’vÚ$ˆA“p4ɇ]·Ô÷y÷ĉËw`¸‘l…v)³ŬîYĵp+ŭŻŞŝ7Ywiŝ¤Ä_×ÈÊ ­iĠİ] ÁĦ`“ ˘Ó2ċĨó2Ċ;iAˆ˙l‚+ÈEµ·û]·fr×A'~ÉÌÁÏá>ˆâû>x>R$†³òÉ"9ÀIżŜÊÄħH*à \ÌÌrsß$úG<żÛîz粇ûb“ae°×ċ›ÓÊə!F›€éHòGÔV$[<ñ^Ĥ!{5&ׄĤĉi™¸q™p½ŬH˘Lo!=8tJ^“JŻĊmÓ:X·MœrB ¸è€¨yj½C~z*2E˜çċÏv:"Ĥï´~µûk_ŝcN—ûVŽÛ܍tNÌ@ġMj#]gš'Ċ€•JLÈê'è›Y6ž´Œ9̘óltÀNÛ1h#ߋ½,ĵ‰ÊìÑîëç(E´Të jž KÀJ„T.Vĝ?™ĤĦĦô¤ĦD ··8// °“†ò4”ïëŜıÂş˘~ g“1X môÓĜÜĦĉé0 Ġ)Ġ!Ÿ‹;@oÏKL촏ƒ>’裵 J{×?OàeŽÀħI5Sáîĝ‰‚s֝ö –Nú#ŭ˘ĉ™s%ˆa*¤~İbcfI4ṳ̈sÀN›1hċ;ÙŞqÇŬŜ fGûĵ?5„BŸ3¤6Öv¨yVœ’š#Z—Œr–e̔e —=ϳÌ;mÄ eßĝ4“¨ĊÁbk]ŜOSKĦ@)ZˆšçÖgHîbŽŻ3ÎßÁc~èi;µ?~˘Ñ |ŭĴ#`Zû҂ĥ‘„ħ…Feô~ñžˆ fêġ> endstream endobj 33 0 obj << /Type /Page /Contents 34 0 R /Resources 32 0 R /MediaBox [0 0 612 792] /Parent 7 0 R /Annots [ 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R ] >> endobj 19 0 obj << /Type /Annot /Border [0 0 0] /Rect [72 526.69 175.252 535.582] /Subtype /Link /A << /S /GoTo /D (page001) >> >> endobj 20 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 514.605 272.427 523.557] /Subtype /Link /A << /S /GoTo /D (page001) >> >> endobj 21 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 502.65 316.839 511.601] /Subtype /Link /A << /S /GoTo /D (page001) >> >> endobj 22 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 490.695 316.839 499.646] /Subtype /Link /A << /S /GoTo /D (page002) >> >> endobj 23 0 obj << /Type /Annot /Border [0 0 0] /Rect [72 468.907 218.878 477.798] /Subtype /Link /A << /S /GoTo /D (page003) >> >> endobj 24 0 obj << /Type /Annot /Border [0 0 0] /Rect [72 446.989 276.69 455.88] /Subtype /Link /A << /S /GoTo /D (page005) >> >> endobj 25 0 obj << /Type /Annot /Border [0 0 0] /Rect [72 425.071 202.081 433.963] /Subtype /Link /A << /S /GoTo /D (page007) >> >> endobj 26 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 412.986 181.29 421.938] /Subtype /Link /A << /S /GoTo /D (page007) >> >> endobj 27 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 401.031 155.745 409.982] /Subtype /Link /A << /S /GoTo /D (page007) >> >> endobj 28 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 389.076 174.007 398.027] /Subtype /Link /A << /S /GoTo /D (page007) >> >> endobj 29 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 377.121 245.179 386.072] /Subtype /Link /A << /S /GoTo /D (page007) >> >> endobj 30 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 365.166 200.029 374.117] /Subtype /Link /A << /S /GoTo /D (page008) >> >> endobj 31 0 obj << /Type /Annot /Border [0 0 0] /Rect [86.944 355.228 199.033 362.162] /Subtype /Link /A << /S /GoTo /D (page008) >> >> endobj 32 0 obj << /Font << /F24 4 0 R /F30 15 0 R /F27 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 43 0 obj << /Length 100 /Filter /FlateDecode >> stream xÚŒ1 €0û{Ċ–ÚÄäŒ1i-҉×+ELaċ÷²ĊÀ0ìMşÌ gtVħëħeJĞĈ^t„Vmxŝ(:_xaĦ™Ħfb‹ ‚c9 ËʆìHĠyÖĞD…^3•› endstream endobj 42 0 obj << /Type /Page /Contents 43 0 R /Resources 41 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 41 0 obj << /Font << /F24 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 46 0 obj << /Length 2637 /Filter /FlateDecode >> stream xÚ­YߏÛ6~ßżÂo'YU"ġóŜÚ Á]ŜċÚm‡Ĥ²MŻu‘%G”²ġŭġ÷ g(KĥS¤@°Xˆ’áÌpĉúCĵŠŻrµÊ(LuĥÚ~ŭ-Zí@˙~…e™­^ÜĴ*É |›ĠO˙zĝîéᛷ*Y•a™İlġ´_% uY2|“XŻžvĞ_ƒ×ûöŬӛ׿=}˙Í[]Ĵâ$ÔIĤh~œ…)Ĥ=*f‘âé˙üÇšúĉéá\¸,-Bü˙YáTĉEÓn;GI²ÂVa–"]×ġğş­†ş}^?ŞĵÌZGÁ§µJÓ–ĊVù씏*QŽÑ#D*ˆFŒžĤ7àP$AċÖ›OëĵúŞ!˘^ÖqTgËS†Žż]żŽ‹àyU[˙OÖ‡‰ÑÇÑ´[ş=SÏŬĜsËżŸL_Ž8Z>Ӆ‘~YgQPÛşkyàÍós¸~LbügCnäyÛJ&ĵôġ`·ëèX/-é Œ°LSVv´Cw\?ê$ŜG‘ĉİԏ‚m×}×`Ġî¸1ÓQ;0é€ÁĤ^ÇAûü ”l: ş³ğùYhgá†íӜyÒŠuÄ]_Ñ/Ÿç:ê­ĊùÓBÁ~µċŝBûÁëњŭ(‚×wÏ}²çíĦ;`À³W(*îĜÄñ4ëv€clĥĠ[ì¸ùŻÙ2ŬΖ5ĤZĞH4·ğ^~êĊ–Ġ…µóâ8ÔÇħİéy˜)9Ċ· Óe¸ĜŠÌÒfP8ûÙù‡.Ä?8Vȟé<ş$=1Ùm†/;-h*kċiĴBDƒrv­â2Ám˘ìDùĊY–üómÓ½ĵ×ı½ħJ´ü*SGY–D'ËÓÖl„êxjÌĞ;ûfQ•‰gn·ÛŬò$Œ£ÌOvöÀ•Óċc’&aеĵtpš–BĠÀ­câß `´LĈÌn[{›°1‹1­_n¸qŞúêh`)YÎÊN½e…Ŭ/YV÷ܜ. ­Ú­s<ûʛ´i&A•½f³îx=o’ç°h=@pg`t—ND|ù hL^ĝ¨Ëx ž¨|6x‚8 žÄ­/ğ°żµ°*TX”úËMœ”ħŸìÍG‡2vÛ×#GŜ˜F‚îÇtŽÚ²/è4u‘,Ġuìvfy;ĆÙġÜÇjğĉ‚Iƒ@O1ĤkşçóŬ0Êİ’y…ċtŞR²rĈëÇ8Š˘àµDlÊ}ħcħİqtÄĜW’Iħaí[}bc•‡–<ùÉĴ —XĜ=‘Ô‚–O-“ µçÉčM˘ıÎÎ87V˘‰t L9ŽÛƒ´şŜ\Ĝ²úêMŬԃHW‹°yŭÜNr^)Úm݃ m4 úveVj[Áa(íäî˜jfKB”…ÑZVHˆ1²ÓĉĵXüĜáÙ# D(ôfìäwòż÷aCu­÷÷€[ŞKĝ|iô™XU˘„Íġ%˘ĵÒ˙ñ÷SˆQĵĵ™KH~ ÀùBĞ//!”R‹hÈċ66Ȑ( İşİşÉQ²`K†9oĉÑċûùûNĞĝJÜO\=gkËnY0žvŝ9 =ԖĖ;=jöEâÀTĊFasİ._‰\İú‰ß$ΞĤ1ôŬğ=‚„[”û›•ÍÌ'‹ïĜ˙R¸f‚1‘N} )ԃ9Z#xĜáÊ4‘+€Ñ–p Ċ¨ċku:9×Ê|mœyPŒĈ\÷ĠŬÔĉ•{˜Ğ[:\V8ĠY˜í•3ò•Żk0Ĉ ü²ÑTÏġ–£u\Ĝ4UûAÜ]ñCĞa ıĥup:ĠÂTkĤ7$%ıa A˜wĴÚÑ3³vŬ¸idùR}Ĝ.é8΃sdÄĴċéÀV*Su‘cq:f=;^žçŽ#¸‹‹bÏí–0^4َàSymgŠ-îžğİî´%E‘ 'Û9X^,+£ĦïĈçƒïfŠTKŻêƒ{"ö|—O%nK*`ş=Ì"r¨ÁzDg}+î.gkFÎċ{uTÄİŬÙċî.^aR;7FhÎ#ı> endobj 35 0 obj << /D [45 0 R /XYZ 72 744.907 null] >> endobj 48 0 obj << /D [45 0 R /XYZ 540 602.678 null] >> endobj 44 0 obj << /Font << /F24 4 0 R /F38 47 0 R /F27 6 0 R /F39 49 0 R >> /ProcSet [ /PDF /Text ] >> endobj 53 0 obj << /Length 1264 /Filter /FlateDecode >> stream xÚV͒œ6ÏSp„Ş]YH@nħËJ.I*“\l´ ™QÄ„7~ûtĞĊìÌzk/>Pj5R˙~Ŭ­·ûŬ›²ÊDĊÊJËlÈj™Ġĵe•Ĵ³}Ÿ}Ì+‹{Á9Ï˙Yœ?÷²nòp²Dü9ÛĊú`‚›%òċo’VµŻ·ÎYĠfŞ•)ÔOġ€&Qb{ŠĵȊµâYÁ“ÇSPŭäHUϊ!t‚§>|/´Â‰ sĵ’ÚíUĨDqUBq;ÍD\J'ĤBÔ kÀIJEráĤžàE…ħ˜aÜ<ZİҁKâŽxiŒh|r¸9Ŭ˘j9n¤—ˆş<ŠH(­˜°xĈ´Ĥƒp.ĈڇĦ…T먚aPTŽ}yOSċZĵĤÊ á! <ӝìU¤{â>|O5˜9$ġ—aJêùրJ=îjŜóöâMC55 µiú†$Û bçɌ{ ÛÍ-ˆáŭ­ èú5üVşıE/ĵáŻĈ‰Ì*À-̸ ‰1ä˘Ìߝ̙̄w¸€j(äwÓ4÷ı=îmQr0TĈô,›…˙4³ endstream endobj 52 0 obj << /Type /Page /Contents 53 0 R /Resources 51 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 36 0 obj << /D [52 0 R /XYZ 72 744.907 null] >> endobj 51 0 obj << /Font << /F24 4 0 R /F27 6 0 R /F39 49 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 2241 /Filter /FlateDecode >> stream xڕ˒Û6ò>_Ħ#UċaH}t;ŜÔn9ğVeqIĜP$CPÏ~ŭö İaR³5hv7ú üño"ĝ‹7…ÚqfIİ/żŝm˙i…U•ožë²IóĈfóùáŸßïû ÒMVıÊ7ğ&­T˜TĠ&‡1“Íî°ù5x÷ñíÏğ÷˙ÚŝĥûéğIı‰Ó0Is…ĝ0Mró¨’0£ïŝ½UQ ÑŜïŝ˜ ˜geż˙W@•†EYÄÈQEe‚·0/JĉĝњaGêó6‰‚çí£*Ê ;òxÂ=FèÏĥ֍lï˙cêÑñħT1ÓÂcœäÈä¤-DZ¸ƒiÇĉy›gÁ›ícgÁx60‰âà—mÖÙĊµ ŜŸN,$İúżŽĉN"Ê[Üä³`"aw¸¤:ê@ĉĞR’J¨pL}BÁrÉ-I}rËÉm%â<ĴâüuᐄÑ-qÜb6%ÄŠÀKyDŬÚĞRS”M²PW%ğeÒKwĊ›7òz<ë‘q/TÒĉÍO‘˘*H~eş,2KWÄDûT\*_F+)|7@ \ÚÖ ËÍŜ~#÷kx9#NMDß²y2Sе829Êè}i£û€3NHVF½w]7Á­˜¸É‘—ŽC*L‹ùLûÄ è8•D\8Żh\¨0Ž óÖğé Ûm“,’(Jğşo§`òİ7íçùç*VÛ£ܚ(ħ´5Ù–DĈġÜ_UašĈŻÄ´ ËL-2?Ó½èga4ï~„!Mœ,Y6>w²1Şt`5ĴzVxÔŬµ90‰½`bĥA…lj$v€-;[UÉ]Ş@ÇÌħÎÄSß)òyĥ…ƒ£Á{Dä;2èkŽîJ]*|§BŜ˜ûdhc¸™ñ{]˙~ş+ĥÄÀ\:Ì·İâDE²  &œ™òDIúÜi+^´hn­w´RXìQt;ŠÊ)çˆ7¸ÑÇÁŬ†ÙŜpÌÂtê%W(P“D_BDHœ-ĊÇ´|]żŒ£‡Ĉ\“·D'Ÿ"W™Ë˙$@Š,LËä5İ: “ĵ¸ û;Ĉ„1t£Ê2é5r6.ULXx.aĵ[ùçû%½‚¨DCŝiŽDŝ H{³Dn…ƒ Ú̅%lÏÁ÷™„û2lf‚@ò;KH’ĴZ­Ñ/̏ ÌqJ°}£ks¸Ç^u·=E"”*™‰ ÍŬí­šŬv<⠟kş›Âdž:‘ì‘ÇuÏP ›ÌÉâŸGĵÌ_ŬşkɲkĈׄ¤ò'PAË9˜aù´¤F d"Òír~;İk°}>ñi„‹:´żU~g>¨F .IpÉĜ›ZCĊE´8x!)ˆü;@ĵ?‘ĵĦ vEĝtUr§A ×9C5ΌBêÈéa„A?Ĝ‹wÚäċpAú,D9á/:ù"g[ĞñzX½ú¤aŜ„ĥŭ) šÈ—f,R°÷TÑİWĉaYL ÛÎ|݃ù ר q¸ à{Rôò ŭ‰ĉXğË×ùÜLîü<%ÁpÊËeš§Ì÷l¸Jó£nL釗³“  k^ž!?³ <ûDzÄ ßzÓ´ >X(Ĝ F=`q'€—)Ç-<F˜<ż3÷£0öÜWÀfĦÀ=C+\éMiJŜ½t$…çš$ıŬHĝŞ‚âŠGú·m(ü²ĵâWŒémgOt ™ž339=~½˜’Ûĝ³Û+‰Ġ2toµ5 ŬA`·~Ü÷Ö˘RM䨯X ìşĞäaaĠQ?7Ġĝ[oĴüxĜN ĵĈçÇ~ŞÜ eÒ au€Mßf7N4éÜCö|“˘zÖÄ*Ñ9g÷áGĜµGí JïŬ›vR•Ż|t‡Ûa˜ĉñ&Ċ.^ÑÏé÷“kE endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 37 0 obj << /D [55 0 R /XYZ 72 744.907 null] >> endobj 57 0 obj << /D [55 0 R /XYZ 540 602.678 null] >> endobj 54 0 obj << /Font << /F24 4 0 R /F38 47 0 R /F27 6 0 R /F39 49 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 98 /Filter /FlateDecode >> stream xÚŒ!€0ŭ½b%˜ÒGĦ–Dá\SA@ñ} Y1Éd²79Ĝ2‡žÑ‰aßcğ(e‹½èkÚ0àù£ â‡Â+-4*53 ‚ ž=ôĝ.„s Ŭ‘*ݳFš”^Ĥŭ endstream endobj 59 0 obj << /Type /Page /Contents 60 0 R /Resources 58 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 61 0 obj << /D [59 0 R /XYZ 72 744.907 null] >> endobj 58 0 obj << /Font << /F24 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj << /Length 2322 /Filter /FlateDecode >> stream xÚ­YY6~ï_ĦG3ĵÇÉlÏfìn6cì"ÈäAmÓŬÂڒGÇtúßoIɒ[}eŒFC"E²V}uĝëË(üħÌÌ0J”Ùĉpġû4ÛÂüÏ%Îéì>Ĵ:dR[xî³ÏW˙úq}ġG.3Gœĉ:[ï2é8Îež’‰l½Í~_|ĝéŭ/ëë_—Ĵŝᣰ“DHÍqŭŠÊlĥâ‚hÊòġOż^_âĞëġĠ×1{ZY˙oeKbĴaHiEĴ”#ÚĜÄ_UĥuµßċírĊ]4mqX2şèö]gŽyùÁ·NsE‰LfÜ8€ʊ;bm:²öùñQfnF*Z aB+C¤Qqï|ı\ a]ĝÂ.Úğt€p£´!Z ”a/µo|ÙĉmQ•3Ԍ"Ôñ~ñfŸ7Í;8\ıĊCĠE*wù’ÓĊ·%S YÈX-ıZÜûz×íR˙ÚĈŻĠ.ÎuÇ-,TÔ $e\5($áôĵĜç7û &ƒäÄx2âTRL[!ğÙ%˕†KĝÂıèŻ èÀPĈ%yíKQ6m^n|‡Sx˘:KPŒf™3ÄŬkëDdFħÊsZšX{ŸÎ?mŒü$F69Ìm³m|kżÚú/”ò²˙T” ż¨}ڙ—Û¨"F£Ÿê(\JË­‹Rr×ëwżd ¸h†w‹ŸQĝlŞCšAkO–ğaK¸R(™ävñͣޏƒ?óqïßጠ×|"/xI-:]Üú6ŜÎoŭĦЇ4›ş8ĥi˙dßĈ£N{›Iä37H“bt‚’ĵêüos÷GÁ‹†ûéÀòp_܊¤×mTeüèQ­Ñ[ê‡ĝi‡üĊŻ7i*O_şr<3|ĵż+6wñĤ:ğtg<­)úebq“7‘(úɤ!ĜÙĠ5((~G—"Ñ2’@ĝmÉÀ*ÑÑy0ż2€YUi*ZjŒ}Ç÷x{×ĈA‚%>1ï´0 ÏĤ“Hï›ğĵĵĥDîĠ`”O[óô÷uu |ÄA´´ ì Ş+ʊ· n ¤ü4rw€éħa(A¸•Żòl-„Dż4‚ ;8/ĵ£ÀÂÙ ¸‰œÇmĈuˆ^Żnmí¸Áâ‹÷ğà '€Ġ„½0ÂëĊgÏUäqV+Áú kßx跀áZ‹Cפ·ŸèÈu¸Û˘†ŭ694KNOTi4<Ħ4ÑßĈvû83”!d&…%ŒÉóô”0¤ "›&r‚jb!o‘ÂǒZ6ÏZ ƒ¨ïzŝú‰Í*^Ĉĵè•6ÀÀٙʷ]=è,Jp İ›•zŠÑí4›ĉ@…]ıí_Ox  âĉ£ßĦüLPHıXÏŜg–k^+dBġ‹Ûü˜`ùDrÜ™hfz[Ñü$×8ÒâxWW‡~IѤ ı¨ág!óXA”Ei ‘ûܡ4–ZU÷„I:€7H™‘Qr0J£Y&!ÛċôğŒ’SCë$JĉŬV3$Á§!ÉáqOhúoùŝ UŝÙ̅‚÷İÄ1b€M|L×Ùèö.縭ž!†XÊxÜWĠ1ŬYʔÎŬŽj‡“o|{ï}ùXƒRBİ .riâ1ìċ[ƒJÊyšÚĊċn-"‹€,fê?ásŽHî^Ô2B€ 5—ö{fÊMN˘Ò%ÏÁNóŒà€ ' Ĉu'O> `–'‡Żğ‘8 ™‘‰[0œ¤žA¨]Uûo?-$8ĈÙqĴ·Ċ—QĈNÂ+AÂxƒ@*M×)³ Z Ö²Żùš8¨}ÛĠeܒÇİ!£Kh ĉL­šZKŸĝbè!ġí³ż!-,íû³1C/‡ŻpâLfK—q²˜XYÇòHA¨_;_nP3q ŜôÖÖsƒ£–8'^ (!cİŻµû>$ĉĉx”Ôîôpd"—  p‰Š ͗qÄÒ!œÏ£0hEpŭ">ሒ—DHE(s/+O@Y­ Ŝ]‚&Ô ˘·+OOJ´ÂħCvİ…éÒܢвŸżIf<¤-’MR~lPİ3ÀÌ=V‰u?`wšóĉ¤zBÙI˘Àŭ$ĊRTÚĠKaÑf4"‘#sjÛş¸ÁĤO ÂıïC‰C“·×­ß…^·ogtÄ`5{Z)‚ސ’_@+3öÔ2ÖĦJžĥ$`*´$Rg#ŠfjZ4ŻgV@‰9$ċŝp„ÂBi6Œ3÷*Áà­û]0ħZáQœĜä2ßòşÀÖ`3ç/PĵʧŒƒÇBŸÑ8àeR'p=*iš¸àŝraO:ßÇQôž“éĦOÄL8ŝ3aÙ´żŠ3O´?Ĉġ¸ŭɅ=!|S˜šmş}Loâ·ŞDk§*Y;̌­=l‡Tĝ Ĥןŝq=—Ì@ȁ$FÀ­0ñV#ŸĤéĈBJˆGADIĤÏ×fˆ:ÊŞ 9aĞbJôÓ??\ÏĊH1R_€ĴÀĈĵš’ŭûżŜE•‡Ž›ÀÌ—sŭ)¨†•|)ŻUB^Á˙"·ÓZAà’Oı­O¤†ĵB]„ĤËÖrJóċÈOyz‘L>Ö'AµÏ$Ĝħ€HgîÔ ‹=Í}êvžıeh²§çPf@’ ›§ŝwžóàÖc£™ïBGÎ41€H?05~3—B™‹‘ö4!›TTMi¨ĈÇT•†Üé2’bñ ĤT£MžYVšj¸Ĉ§&u[%ñ'§Ĝ›l`ĝ Úï§3‰ĞÄvˆ|mgBR6îL¤0, FdVLˑáw-ÄâPaĉ‡oE Û!€<ıádLŸ÷ĝ²­6Ŭah°…İ]ÒĵÂĞ;ŭĝ|\CPgÏçóò Ç^Ûﳄž~p mŒ¨QÚç¸^Ijˆ:ġЍ\ßŜ’¨³ÇÔĴH·eĞm·é£•yı6ÏYíó?y+!!ÏGl&ŒŸ°UOé˙ĝÒ²c endstream endobj 63 0 obj << /Type /Page /Contents 64 0 R /Resources 62 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 38 0 obj << /D [63 0 R /XYZ 72 744.907 null] >> endobj 65 0 obj << /D [63 0 R /XYZ 540 572.79 null] >> endobj 62 0 obj << /Font << /F24 4 0 R /F38 47 0 R /F27 6 0 R /F39 49 0 R /F41 66 0 R >> /ProcSet [ /PDF /Text ] >> endobj 69 0 obj << /Length 98 /Filter /FlateDecode >> stream xÚŒ!€0ŭ½b%˜Òċ –Dá\SA@ñ} Y1Éd²79Ĝ2‡žÑyÒcğ(e‹½èkÚ0àù£ ^†Â+-4*53{„z|žs Ŭ‘*ݳFš”^¸˙ endstream endobj 68 0 obj << /Type /Page /Contents 69 0 R /Resources 67 0 R /MediaBox [0 0 612 792] /Parent 50 0 R >> endobj 70 0 obj << /D [68 0 R /XYZ 72 744.907 null] >> endobj 67 0 obj << /Font << /F24 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 73 0 obj << /Length 2444 /Filter /FlateDecode >> stream xڕYI“Û¸÷Ż-TU‹}™ÛLĈ]“İJìĝÌa<4 µPM2 ZV~}ŜjiĥË)—KÀ6ĵċûó]ĵŠà_ĵ*“UGažĞf÷ÇŸÑŞúoĞ(Ĵëbu¤]ûUVTÛ­>ŜŭóîçÇğ’lU‡u‘ĞÇí*Ğ“0­ëUżYœÛĠÁ_ŭéğ­˙|ü퇇´ZĊY˜fE‚û‹°ÎëĠ&I"Jx÷ûÓÖğwwŸ/•+ò*„˙˙ŻrI–U£´$­2.J¢ĴXŜ{·Óz“”UĴ{ĈQ :&˜~ğN£Àâzì•3ĥg3€ñ…›¸ŠˆóĤH,ğ³0^oâ(Š‚_ìô´N˘ Ó̗&Ӗ˜£8QÏÂıĵg)„8>îAZ˙YQ`FT‡ĉy`zPN<3²Ü‚üNŽŠì5´ĠƒnšEÁŜĥ:\oÒ¨!FŽïµêeèvÊù‘0jlïtïdƒŬŜ,J’t;ÀdLÚjŻŻċ³t5ÈĦAĞVÔ<Ħ;q A’³˜{œ_LĞ-5´Š`IŽ&Ġ3p%ݘô>tÚ̓Á²$Öô5ú‚­œäoY–9‡ŝ’`ÀWŽĦ]ċÁŻıŻxŠGĞ80ۛ³×>™ÈħŠœĊ5ò(vnXĝ(£‰ĥï„rPƒÛxÉÉÁNÏğ6ŝ._)Ċêż™)P%œĊËËk ` Ÿ<ëÔ£é:&cŜ+Ş,ı¤´0¸ĵ ”ç<›ıĜ (Â̇X+; İ"€4+›d:ç#ÒŒÑs —<€Ê`éN!ä…c y%fÄĜgŞfbĞ™ĠÔ9^yÒ;…Žŝb˜CJîı:sYƒqj0.°¤Œ´Çùxê¸ĠŜüW ó›\CÚMd ;·ğ)1ëLƒŠXuŞ‘Ŝ1;@ş”%c[ î<t?Nâĵ<òċG³OaSkéZ€Ü[Ǥ8ċOSŝœ­™ı½ŞpîÚÜEÑ+ÂoŒ§”é7( o­ga÷BòĠUÌEöŽKO•Œ”é§Ż<„€v `/*pôA˙8éƒŝö;ĉŻé[Kcˆt `€…i–ġŒ,AĈcŠN!š8ĦOíä%ÄK/Ğ …S@Á şqv0H j‡(£€+Zž ú´Ê?W™ á}£ƒ&AÍB(ĞJ†0¸#éĵ˜iôĴ;}ÍüÉíÊSö^Ĥ™=Àt ¤>˜"ş™Ŝ[9L71 Gî,Ġi˜“WŽC+AaÔĉyb ÄğY?tOž?Í áÍxÁÍ2‡7ív)‡ĵÙYû‚…ˆÂ èT\Î İ­°ó|°ĥ£”.\h^”Áûž×Nv˜ßĜ=T!™İ’-aoz}%ı80 y•q.RÛáŬ£^@—)›d)ßZ–Ô÷\|36ŠQÛìtó²ñ 蠓D/ìċğĊ8ͲfÂQ#¸ÁpÑwü€H¤[]‰şŠlXżR.TÁßĥĵƒ|„KÒl݉0.̞™.%ê)'•qF8t‘ih´Ô{3ĜÏÂèF‰ËŞÎLx| ßS­SİÖä­gċם¸vû6ñ@xĞ\s6m8pŠŸgŞċF uYH„÷—Ÿ/½0˜ËŒ[ ½żeĜÓ½†ê׎—ÇĞ`ÔŬŸŻÄg°áèc`/¤yġtĤ‘ΰp³liR#ŠÁ†­zòê{6ĴlĦ#M…=ÌĜ>óŭyéĝ<#D™žqdz–fŝ!—.”;ó~˙‘7^+ Ï>„1’<ża1ˆÄ`’p“•Ûl%ù”Ui³[d—N !aŒ /Oŭcê(/ħ4·Ĵċ„Ép (~ X8ï4DÍ"@ê²§Bñ—u)óŸEÀTM7Ğo3ŜÀ/¸NÂà— âˌ"§MjâʀZ|3Ÿ™d#_:B'ûÌî ?‚âPù›)ŝôƒ…tä=~0h€~GÎĤI<ߤ żb˙fˆħïÑĞ!ò`?@HžaĴ€ÏòL@TIèƒWĝÉħEH0=%ô“ÚtS+§ŭó~ûpهKb+e…?í·KQìۖ<~° ŬĵĴÀŻY^y³+Sç Üö<ĤOòtğ<I+‡ÁÙ5w„£iQÌñŻ1Â(¸q @ò2HôÇ+(‚/İ7.0hî[yĠwĝ•‹Ô[P$µìĵ°ĥziAŒÏ¤ ˙ÓŸ|ĝ&Á-e=cqX#Ës_&r‡£Xi5&ÂJ2ÜÊߐô$Ú|kħ,Ü+ò¤Š.EYK@²ċH•ÒXùü,ñ3á~Ï9SÑKŒ_]3x“^ğ:ġ‘Œc˘ÀhÒN™QD*ùÔ\_$eZea™¤`ż~N ż#·żÎà"Ë|ŜKŸ‡Ê‚@GaVß@"™d6iÀèI ÍÔK/É8añÂapĴqH•òo‰jŝVċÁùûW%àwԚùSîc ‚£ÁöÔûâ 3н„*×Ċƒ=>21 H>çq,Ÿ:`Äß#*ùVĊÙĞBPċÚ ½–ŝR‘ûĵ(o˙P‘ÖĠwŝ%OĦIñ*KÂ8–ĥUzI˙żıê endstream endobj 72 0 obj << /Type /Page /Contents 73 0 R /Resources 71 0 R /MediaBox [0 0 612 792] /Parent 75 0 R >> endobj 39 0 obj << /D [72 0 R /XYZ 72 744.907 null] >> endobj 74 0 obj << /D [72 0 R /XYZ 540 602.678 null] >> endobj 71 0 obj << /Font << /F24 4 0 R /F38 47 0 R /F27 6 0 R /F39 49 0 R >> /ProcSet [ /PDF /Text ] >> endobj 76 0 obj << /S /GoTo /D (page001) >> endobj 78 0 obj (1 Coordinating events ) endobj 79 0 obj << /S /GoTo /D (page001) >> endobj 81 0 obj (1.1 Custom flow control and event handling) endobj 82 0 obj << /S /GoTo /D (page001) >> endobj 84 0 obj (1.2 Using the Presentation class: Running a single trial) endobj 85 0 obj << /S /GoTo /D (page002) >> endobj 87 0 obj (1.3 Using the Presentation class: Continuous operation) endobj 88 0 obj << /S /GoTo /D (page003) >> endobj 90 0 obj (2 Hierarchy of graphical objects ) endobj 91 0 obj << /S /GoTo /D (page005) >> endobj 93 0 obj (3 Controlling stimulus parameters in realtime ) endobj 94 0 obj << /S /GoTo /D (page007) >> endobj 96 0 obj (4 Other general information ) endobj 97 0 obj << /S /GoTo /D (page007) >> endobj 99 0 obj (4.1 Double buffering) endobj 100 0 obj << /S /GoTo /D (page007) >> endobj 102 0 obj (4.2 File layout) endobj 103 0 obj << /S /GoTo /D (page007) >> endobj 105 0 obj (4.3 Priority control) endobj 106 0 obj << /S /GoTo /D (page007) >> endobj 108 0 obj (4.4 The log file: Warnings and errors) endobj 109 0 obj << /S /GoTo /D (page008) >> endobj 111 0 obj (4.5 Configuration options) endobj 112 0 obj << /S /GoTo /D (page008) >> endobj 114 0 obj (4.6 For more information) endobj 117 0 obj << /Length 1839 /Filter /FlateDecode >> stream xڍ]Û¸ñ}…ÈÀZÑ÷Ç}Hî’Ċéċzq‚—C@K´M„]RşíŝûÎpF²ìu}ħf†äÌpé7ÛğWï’rU‡u‘Ğí~U&Ğ2ŽÂ(-WÛvġ[àĞNz“Fi ~³ 7Lë8ŝƒ?²Ġ{>1‰½5Q†£$ 1]'ú–Öµêe¸ŜdeĵÖÎ0\ŝ.Úöá#ŝyÁ, ÜĴ„mY-k3§ñBŭĜêgZŭC9µÓrŭûöoĞhµ‰°Îsş÷p´f<כ$H?šŜ-Cq:AĴ“(ĝcäPZ /OV=}ż$Iúêġé¤U#‡_}”Vƒ’–²p–\†E’‘ä­8Ċכ2­ƒFô¨ħR8I˜×¨ÌP6ZßîŒS3­™ŭrĜïxSkÀ]:ÓÉá8£Z}[ƒÌoy]À•è˙öpµ9¤]çy:9ĵ—xyÒB‰òˆ˜‘Í-Ë.ù€§·oPŜ§6Y”Çh›KC>›ÑDé-Ħ›­â,L³"ÁĜAi&52 óġ&Ž"ïĥ/Q”€Hòžfe˜“÷ 3[ĉJʰNYé×°?I‚~ìvIRof¤M<<2Ċ@ˍék4‘wòH‘˘ŒċS{ÚFĦ„³‘ ÑayNjX 1Š`{”NŜ…ĤŜŬş¨­¤í ßZŸŽ²?Ğ⠑֗†Xzïó`Ô½“’9_Z0΢°ˆr`àvĤ1=Ҙ3ڈġH ŭap"ò€x„ĝĝKŭâÜTĊ“˜YżċiXÖĠ´kHR{_*âݘ‰î¤%Ĉ 7‡Ù'eÏ@˜ċI˜V›Ĥ †g3CáĠä2ĞeHŠj‡¸Hŝo%Z³?p"à20×ĵĠ—Md3ï€Ôeóċù!‹X!”5}'ûáğÚpbĠApIħŞ•³ŽN.OëQş›µkë—Ç‹}ˆ'T Zżôa™‡eRżpá˙buu1ñÌB$I½NO˂uÒ KÏ´wPœUô_+7Â9uè}iô{ĤëAŭ·ĉF8 ’¸Ë8ğ̕İ1WÁ~ïP˘áRĥˆ¸fĞTpğ"Û%V6à]…yĊVŬÉXPż€ĵu_°@vÌ}û/´g;ڞ ³ß鑀'Ġ·ĉ‰aI5Bka@Ëä×VîĊ¨‡ŻP{ì1S1Cĉ'äġµïïğóÇÇ?ż}xĝ rż>ŝü¸%ÎOtЎoĤ›cÂĉĠTÍ ĉïÖiD6„ Ŝ_ċRŭ~^È!3Sa/΅xz7cŽAżˆ$:3N°ŻÖPj[ӌ˜JS ‰"_ˋġ^pYġĈĊ–J0ċ8wĊ9íoÌ“¸Á‚ŭ§>ÑKÖò$%41 TqònN2~(I½D $š[PÏ §‘c|uɧ&•gXiJΝàcğÉ6@ J„LéĝIĜA5£Ln4$ó`Ò~ìdÀŠ>2§ĊI(i÷ĎÖġ…E+ĵ—4zI^qڐkġr}ġµž·Û_œCbC,Ŝ¨MVŜŻŞÙuÓCŝlĜ*x’Z4…“lñşi˜ŭĵš‚U“à\?vĵ³Ëʓ“jCTgiEW=ivS]MœÔû{*IژoDö] ĜŬhµ³Â>bċ^Zٟıu'}¸Ĉ my˜D³ï^ Ž^íşö¸‡Y‚›#kâèûËóOĤaĉBî-ǟ‡D2ώKĊeU—c=İú'-/ĉ3Äŭ|–ĈP`£Œ ‚ pQx-yçáŜɸ€YƒßİUî4/,Ò‡¸>Bu˘µñ4qm X†J&}…mŽê<›³6󳆐›fĵ˜DÁ:4‰$wʸ²şhlŞw˜|s% Š}fğû+ë˙/y„@ġŬÚ¸ğbŞJ˜g3˜M =‹…œ@ ´ĉĈ—N_à'…Fċ÷u…avĊ]`Š1„ĉCÄÁĝ0j5ï! —~şĊ‹Y}ëéaN²x²”¨°Ì™Bbgè);ĵżGóOŝ™Ó—²w~Ŝ8(fŒ–ûqġQŸTYĞOpŜ@•à–TѰ>ï!eŝĊšƒ]ç #8 Q§Áùčà½AílÚH OuĝG+'dzxÉb!ôìÛ)
ÜĊċ¸ í ‡Š“ûQÏoÎè;/yÓ¤ğ{ğ½û÷6˘UŒ–äY˜ċŞéî~û=Zµ@™a ό'żİ[eĥ½úx÷ğ7ŝ˙–ìò˙–, 8!ŭ*´TžTÁGq$9܀·Ún@:È^ÒkV˙ùĝƒ˙“ıŬ endstream endobj 116 0 obj << /Type /Page /Contents 117 0 R /Resources 115 0 R /MediaBox [0 0 612 792] /Parent 75 0 R >> endobj 40 0 obj << /D [116 0 R /XYZ 72 744.907 null] >> endobj 115 0 obj << /Font << /F27 6 0 R /F24 4 0 R /F39 49 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 0 obj [500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444] endobj 120 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 121 0 obj [667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944] endobj 122 0 obj [500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500] endobj 123 0 obj [1000] endobj 124 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000] endobj 125 0 obj [278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500] endobj 126 0 obj [500 500 167 333 556 222 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 191 278 278 355 556 556 889 667 222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500] endobj 127 0 obj << /Length1 756 /Length2 643 /Length3 0 /Length 1166 /Filter /FlateDecode >> stream xÚSU ÖuLÉOJuËÏ+Ñ5Ô3´Rpö Ž44P0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22°25çRUpÎ/¨,ÊLÏ(QpÖ)2WpÌM-ÊLNÌSM,ÉHÍš‘œ˜£œŸœ™ZRİ§à˜“£ÒQĴ”ZœZT–š˘Çeh¨’™\˘”šž™Çr‘g^Z‚9D8´&U–ZT t”‚‘š @'ĤäçċT*¤¤ĤqéûċíJş„ŽB7Ü­4'Ç/1d<8”0äs3s*Ħ*òs JKR‹|óSR‹ò•†§B盚’Yš‹.ëY’˜“™ì˜—ž“Ş kh˘g`l ‘È,vËĴHM È,IÎPHKÌ)N‹§ĉ ;|`‡è‡;{…„{jC,˜™WRYŞ`€P ĉ"ĝÀP*ÊĴPˆ6300*B+Í2×ĵäü”Ìĵt#S3…Ģ˘ÄJ.` òLŞ 2óRR+R+€.Ö×ËË/jQM­BZ~(Z ô“3‹’sR“AħV’ċÂôŽ“S~Eµ‘‚xCC3ssÓZ…ÉEEİy%à ?-İİİÉ\7Żċ'[·dMßÖĥ²Îuñ…UĴúœ?OĴ}y“ŭ@ĎşÙ™)µÁĤóÓK–ĵZĝhkßañì‹^ÉÖS…‹ĥHöúġÄ}Y$ĵfkׂeL÷ëŬŻlîšĈûO[ŭ•çá°sZI[í/z<ĞSYçĉċú<óR^8E-Ŝ÷ŭŜ5n!­ IZJRĉ7W°ßeŻĵûü²ü§ġӏÛ&ż;{ËÇ3@ĵĜ­KŭbšwҗÄoO¸bÓÊ.^Ô|ĉxʋGċ)ü{öGWĵ‘íPjWŭx$xYĊ×:éêë§ ĜĊ/uĵî]ĝµĈŸ“kżĴÓÑğ·¤ßßàOÖGĉÄcŒßR'´ŭĤ‰¤Ü3fÚôl‡äéĴ'Ħ×ĥ˙Á.µ´îDzÄì9Û§Èşĵİ*\Ûö{¨xo­ž÷ĥ‘ï—ì>Ì}m·¨Ħ°ŭ•›Îŭ?çsúaë2ò-ŬúmڎŒ×úâOߚœıvÁ}Ɇ\Éı5ħÛızŭŬŝħġ|zŻûhıà-NfĦ]ö¸8Ž<Ĥb˙ûÒ-÷~}övÙĥTl{êú³—żşGËOj7ĵ0Wħ`gGs÷ŭ³7—ĉ¸›|{Ù[²ŭÓʐğV7_Y[T˙í~îQn%ċ=[şŠ =iş2!Ô/ċyğŭgË9[2zçuhĤĠ\{ġ^ġÁñKWüµ÷/á›9Yġg˜¨H‹“âVî|Şġ,WâÍŠÑúáıĝAĈĊvcġ|,M³Ë‡NÔ܋<+ġшk…WìÚ°ùñ_mĜ¤ŸÓ\÷ññ^ùv.XfqvMÖğÛWkŬš´ìNĜĜ:/?ò´ŸäÑ?1ÉêoBĵ2„]Ĥ­ÜËŬ~êÛßĊ§“~Ĝêżĉá‡g‹nxğUŭçOş Ѹ9ġ endstream endobj 128 0 obj << /Type /FontDescriptor /FontName /WCJTWI+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 85 /XHeight 431 /CharSet (/circlecopyrt) /FontFile 127 0 R >> endobj 129 0 obj << /Length1 1612 /Length2 12306 /Length3 0 /Length 13128 /Filter /FlateDecode >> stream xÚ­xeT]Ŭ’-înA܂ğ…àîÁġwww‡ ÁŬ‚ğğ;w‡àöĝÛ·oûúŭé×?ö{UĠš5Ğf­5ÎÙ$ Êô‚F6 1kGzf&€œ™•“ƒĴµ ½ÈÄ adG  ĥÍlĴE€Ž €È 2°°˜ııı(Â6ĥnöf&ĤŽj%5:ş/˙²ü0pû§çc§ƒ™‰5€òĊdick²vü€ĝoTŽĤ €ħ™% ,Ż !)' —SˆƒĴAö@K€‚“™!@ĈÌdí˘ÛĜ,˙ħÚX™ŭUš– p°š}lı‚l˙r}Ĝ‚ì­Ì>Ŝf{ µGmfֆ–NFĝ°ÛüMÈÖŜĉ#Âê÷Ĥ`àè`hofëĝÈŞ "öžŽĤ@Çżr;˜}¸6Ĉ‘F6†N•ô·ïĉë4³v8‚\˙Êe™9ĜZŬ>r€ÙڛŭMÉÁÌÚä_ ìA&@{#KƒÌö_ŬùW€˙R=ÖÖÒíïŬ6Gŭ'3G13ËGNCǏÜ&fÖŒ Фµħ €™év#'ÛúœAö7ˆúŻ™Ħù 4²ħĥtŒċl?R¨˙g*3üï‰üż ñ˙ŠÀ˙+òŝ˙‰ûïŭ—Cü˙{ž˙ZÌÉÒRhġ1˙¸`7Œ @×c ´˙żÂVf–n˙͆Tŭƒä˙GÒĝÑ Ak“A˜˜ŝa4s3s)˜9šŒ–úÛbm²·4³}(úw3ôÌLL˙ĉûnjfhaŭWëÙ˙áYŭ;ù‘ŝĤÎ((£Ĥ&/A÷ïwêßQ Ú;~w³ŭ öÈÚŭçâ/ !!W€ŭÇ ¤gaċp|$äbföúo²ŭ üݵ,ÑŜÌ ġQ2ó߅˙ÇóŻ•ÎżÁˆZÚŭ5+ʎ@k£ñúO_nC'{ûU˙>ñ˙sŭ÷ ƒ@ C„ċCŜ@ó”´TÇêOYc"Z=]̐AĥEußós}+m:}RB7ıËô_Ş‚ê'xŜšŬĉm_wh÷†şp,İ:“@ç9Ÿ½ÈhşsÑ×)[9éöüu‹SOÔ"=.ĉd6 49˜T÷ĥĈ•t _`'ZYíá.îi|ɜs}ħÈïlQĵ “kc°ÛêÁ0ŞóŽO(ŜßQġ ôw^AwïeĈÀS:C!SFĝÚehŞ”y„ÑÀ¤6 \µ\ĵĞuxèfS“‡[É<)˜äĴX·Èĵ$@§ĥŭµ—hÚ-WÇıœ™ˆàü1Á=ġêD!ê‰Żáóx@Ïġ”yÀdl-ÑÀ-Ä%uC¨GµU%íS7JÖìà¤b[Q­K#Ì.ŭ`˜S9Šp“­…ğö˘´)è8#Ô:&ħïnǸżµkÚ˘êDĈ(KÇ: WáĝWÈöQG°ŝJ¤w\f  áRSnT‚ĴàDÑ­Ġû<Âı‡€<ÄîŽ9B] ħ"ċc}‘J[£Ìì÷û„ĦŽ‚fÔfS‚ùÀ QroîHĦäħd(8³é#!Zïǽ?][c¤”ùı;ġá"LÍĉ|Ïi?•ĉ[ Zİç÷3ĥR–ŜüşWg­Šĉ)I"‰Ş*°{YF™HċóÁ‰Ô n}BE³f§ßÉ~˜%ġħï‡ĥxÖħx@tG1Aˆâkû‰w6U‡hGĴédF‚?ˆ$v>SeçC1ĠŽħɲï0pXw’w}@”ú£Ù;œëAAâ‡wbÌçkc4‰ï@vĠ&´'â;ôf£D¸ÏPßéïß.ƒ~à­EŽİ™ò“Pcf`هçQ‘mMëÑ>\²‘NV­z@´£C@|Zqç^ó†ċg3ıíRù„ìŬìòİ|'K:Âĵ€ú ˘~Âr½äD¨Ž *ŝ´j爇@:{ۍžÔ{â(ġà3(o‰älvİ@Î 9t·rÜTëásS+ĞswÛiB"B5– :Ò{pïkĈFŬ—• ‹ߘÖ?#Öû}<ĥĦW'!Zf‡Ç„àá²²tˆ×C?kŠÓˆ’ -Ò~xĤş´(µšžövŞÎ‘8ÒbLñX=œÑ¤•™äÚd¤OG3l;Œ÷ÓH8­‹Âƒ&³ràG2°N˜îŝt7i{޵A9Ï.vqÑYxù …ĉèc@Év[WÇ÷tT0ôßWµŞàEjCäJÖ֖n­}düdï5† kwŒSÌ"`ѰwbŜ 5Ôİ— íşmı9˘ ĥOĉĉ²ÍC}mĀĠ[È+‡Ñl§Uz֒E.Ó:Ċ^~½/‘0Ȍ§Ä$á0ħÊ#tĝ’H}²§ZfëtÎnkk8½0£ċ|0†9¤R§:`›ÂJÛNp%!ÔE!ż<£=Ŝ÷ĝ×ĊC‹êĴ‘€RcŬA‡:ê—uEhhLŜߙZç|Í<%ĠsïP &ÒJ8Ŭ6†ßŠ·.pOŭÑ.6\&^qġŒèċ"Aĵ‘ßMíäÜĠ:\žİ"ÙÈH½† ì^¤ĵß3Ÿœ™q‚x§0(Žë tn—,ÛLĦ1>=KCûô†\O€?*X@eğKU¨f #zœˆ‘8oI ıŽ)ÒÊ÷4ŭÑ UË}m4ςÓ0x†ĥl3‰äĝÓór6’–Ej+îŸ K‹×)J4ˆĦġ&C—}ëŭmá÷tgkófŸğWçOż ³{ˆp‰­0†‡§" ô³RÔ&ş Pŝ˙N£ħé?Û=ŞBt“h³ÔáQ+edÂuO[ÌŻ)ĉÖq;H™ŽtgġÇĵŞ5ĉ;Â6rX¨J‰%\êô@mpu›7#›ùİÊNĠ+p™+ïOÄÉOĠĊu9O·² =ŸAJ-“!êş?ğG&8rq és=dŒŒÓZÖŝċE$a^ïĉò}ŬĦ× ëŽè¸‡Ëô|k5ŝàVî74ÊĦ•Š@BË!kGŬx=öIö&2Œ|ż/òv!ç} d¸żœîWÓŸFÒ;ġSĜü˜µJ)š1›èz$çv’v"–u›ĉ&͊¸UÑ͕ĥŭM ™½Mû…!6”Îñ`^x/ı+w†{ÀĞöÖĦĝMNĝWFSY&İħq;T‚ k[{ QžOµ:ŽÙO5V^J8H?v:Ì<@Mœx`fùŬŬc¤mÊĨu¨­‡ġcdèo6:Ŝ8᝔'S½ÇzIyώħ9§äŞ^<îŽŜ×zµAżÛs>rİÚÄ `²ëó÷ßPŻÓNœ~ C”¤}MzkPB…à§cq 8O?ZÌ丳Tıä˘uĉ}5œÉÖípÑ$ö~•’˙^­S0ÀCbNÏħŭiìĤP­ğN³ ĊPÂ"Ċv`C›ş­‰,Óµ!9]AÒSK–ˆİë ='£•J/4Ó³£Ï‘Ŭĉğñ‰ÎhɆ0I[&>Ÿ‘:—NùoeBŒz˜[„ê™ëSGJNpFŸôŠu EÓu1[ŞGliáµù>—·‚?Ù/Ž;è:m‹< Ĥ9j_ÂÂö~Ì)äÛğzhmĥ?żĥÙĉ#Ş(fï:ú,Ñ"ĉ‡QġQàW T’†ĵ4djÛè9ÇBuÚĥpgÑq¸19 ıĈĊž clöżfŞKk jݰà€l{..Ÿ×ŭDj =´e¸ÄÈîÇiŞOmy˘á8_b‹owÜ÷k:­3ì7˘Ĥ óFÍ#-cˆ“ÌïŽsÂFë+=ÂÏÖ>µ˙Q cm?)'ì0Ž'rYoá&j7Ĥ¨<Ğ%; „ŒŽaLÛiá„ÀÎÑPn„öOŞïŠ­œnNáI.Ñ&L´•Aó÷Ĥlá>8Àj³yz<ĵ”óÀĥ”TÒĊu @àD’ċ>Ï.Ŭıß ÛS<ƒA›̔Eƒ½ÑjşY†‰éjê§İĈvE™™²ç˘=„q{ƒħbıá#ÔrġĥĦ|â )µÒĈßĊW1gÎ.Ĥµ_gß{H ½ċÍiÖܢòßÙĴ<)eRpD6i€Ž6›ħ]RşħvÒú;cÊèJœ€ì§DèċìôÊ£éßáùÙı‰ ërċ…Ù0½dĞLwż½‘&ÔeZ3D/Es-ÖÚɚ=tç§_b–ĜP”yıġ2LU\b_o9£-„ı~Àµä)KúÒĵeN†9^ukğSsánƒˆÖ6<}"$ËĴdGhcb‡NZĈ¸âƒêÑVı‡ċK[ï,bŜËÏBxíÚg.Où[WüÔ*Ólq†Kr,)]Ĉċ£+Ŭ—-òĴQ*ĜĜ‡eL=kדcbec찍×IÛÙyŞü™ĤÚÛ*MúĴì§ƒÌ!i+p@̋s‡„{k–tÑÉîĦÇmnŝä,ĴQ×§Mù"—_wzy RĈÚ˙:ÔŒ`¤|öĞëñÊVZ+6ÉüÓ-ÉTنÙxs–§ĝo"µx?£ş"KŬUşÙ²!À5ùJ˘W½oÑgRÌÍ_¨ú*×·Ì07ïo= ħŽĞ£İNß`%MżhHÒüBä˙Ì5ò͌†Yó”ž˙}ĥ!1µd\ĵcŞ·jnê òÑjÊYĤûİËvÊ·[’’ê(-1$àjÄwĤ[Ô[ÍMç9[Ñ9M,HşLŞ<µ‡6À,¤*LİĝàYyÉoĤ£àwÜW‘àì;Ì‹"™M™ĵœ†}ÎÀ{UÎ\Ż#9âö“޸.”x›ĝïUñó4E#ÍŜ? şŬzĝE2ŝĞ¤Û%ğĊœÔTퟆ€ġJ?Ĉ4AMF=áTĦ#¨Qġ|ÏÍ,ċŝù鞙—¸ ĴkŬ²Àk‘TAa’½ÉM†ì./ûèW´_Ñ6UÄŬ%d´ñÌiy+oó–>;:T˘T+eş77O˙5HÄÇlsĈîŒĵK"Òî™É˜!Ĵ¨+]v^#†OJŠœşWinĊ—˘ŻĦÈÏáÒ[`1Çħ•̸8ĠĊ˜’ˆ0–P§*E7’w!I)˘ĴáÍ8<|Ö̏AǨP–9?·äSyš´ˆÄğ`‰…Ĉáf:ÙF?KMĴTqnĉԁÔñRÛÛ+BŬâdş"—<Ŭ·ñƒà°ZèGġ°–*ĝ: Ĵ úb`+’gŬûLcż2Î ’îĦï=Ż]Ÿ0O}#gïÌbŝċ‡†à^֙ :Ĉ=ğ*’•t²{=ïĈìĴhĉ§¸à÷܋’šĴİP‚[ûÑMĴÜġ˘+ġ´èáŬż`ĴoŠüpċj™‹šd/QċŬáÏíjşy1(o˜:M¨Î̵X÷ı ^Ĥ7ŬĈÏç\a<È&ıâäöYnúM\½b8FßÔşjgÑ^ˆJ-%J;k kċÖÑ/Ĥg´ŠßĤ³½Ħ9@[Êg­~s,µ°Ĉ ·.ż´Ĉ¸Q4Ò£7"íÍ/Mrf•$´Ž<\Jwĵĵ A€GZ1Bk2ĤRpŬĉĦúgy]ó7@ĊĞ=ĥÒ)Áó5ĞL{…ĉ*àËq§Hp _Ğĝ6½Ô×dЇ+”Ž}4c˙œèĦ·/EÍc!vFJĴŠX âÔHy!o,Zşò×î§ ŒƒM÷ŜŬdïÄüúÉşžYg=Ú]?‘Êħ¨ÚáĠN¸ġÊèó÷‘w"ÈÚ ŞŜ˘ x½w!Ŭ4ŭ b.ÛÎtġf‘'À’˘ap}˜yMż÷59{˜ž ı žeD~ÏHǜ‹<3‘ğl 'R´29ĤÖ7Ż ’=TİĴßGŝJùtž !Ú,y"GĦ£QV4lĉş›ZÛmŬ:EŸŞŞ¸4Fiú²¸³×: ĥ튽pàÔꜝ¨ƒ3SÔ[Ÿ ÇĞ!1SŽ Ċ–fô"·´ht{à퓷¸·Ù1ç•ÑàhÀ:èÀ.z›–;§ÎÖcûLOÖ͝sĜÀš4àxuÛd‚ßœ7ŒEU•ân.ATp>׉ċ¤8}9O”‰˘Fŝ­ËöfŞżŜ0î[>5ċˆ<4…ßQbCġÍ1iC·´eΒYYċk[ëôVÛ7—Şħq˙ɞ°9’*/NJN×H›xƒsSƒĵùÏ9(€íÓ²Š4qQ…P–÷§‚DLx}°ğʋ: u.Hş–ĴJQwŠŭÀl„xĈ!°Ş°’*î÷_ʲ['(<Žŭ|"ŭĴƒ½µhG=X–ìD^šú²“¤ï5:œ™BĤÁĦ•“žú.°F;­˜wPtħœ^‡ÚÖ7FÍCvżq%ìxÁ@üòÓm³*/ •ĴÒâÁĴġm…`'*ĥ‘ĵ~àĊµŝÚ) ‡Ôû£%ŝċ‹ZŠ>\'Y¸Ô„JèÁÄÛ"IĊ9H-\wöK2ž7üˆ! MlËϽ}üĉ\(‚Bò೏ÚSD8DôIʒTµÛ|!wq(…9–ÒYAÄÜzħ½: ž•˜ †à_o÷€LċÜrA9Ġ°˜˜Ġ6`jL{°O%íCŻÖ½Ëùħ/Bä2ĊÎf÷ÙBa!ĜHN[ô>ŻŽò:mŽ0;Ĵĝ‹{4l%Û)Íè5¸¨ µqœĞĠLDş[~…6^Ü}²gf ÄmfÍoĤۖڅ›ÜË}X, ډ1ĞDKĜUY§=ġ!üMÁ\H)ò×ÒÜó 6ĤĉFĞ–#˘ÓO—ĥpoÍü^lßY^ġHg6llÊbşİÎ\{qö݇¸hc&AÂáψ·'ż“ñ 1ħ*QÛá…×Íù²·x4SU…ñï2_MÚ\xÔ?ÉûıVSôž{X2^Ë‹Cl°£ ċaásû%jrÍÁ¤'kV:dËĦ'Œ[ˆ¤3ŽĤ[$x˘.÷b·o{_ĵœF_ÀixĦŞ?"9ĝuĉj…½ç @(YŬòîgñĥ£NŞô6œ•Ž=KŜŞ˙ôħŻÌ>qh,ƒñ°ĥÊ7 ñş.tJ" ú-3÷ ŜUĵPĈR“@mj%JTƒêÊżt—‡Ĵ×j$ñRïĴ€…otj5ĕ6²?Ŝĝû êğ CĤùğ‚#ı„—à³ÁO\֕ )À.›”锨Q;dÌàNǀıÛÖ/7Ö|ÚObVn¨ j_ġĥRM\éÊ@Ž*Μä?Żúw™ŬâÏĤj>7â=żóĊrċÇ–W)ÎÊuòCp1ž>•‰Ü0ͽÜ&ġ“×Q%ŭôëdSb³ò)_ƒUtΙ×Ï$2„ûċ7ĈĴıìĊXāÎIÔAaĉÔuw }3³]hĥżÚӅŜ8 ĝónv°x1ŻĵxÁ=×îĈĦ–ğYsúĴyŒ0ĈĈîI•Ŭ*òŭ<Öàó!cͧĤĝqu5H¤µİb2Ž Ç_~?Ħ#­żjßSğ$&ʅCEíB˜§˜wüâ\ĝäœÌü]‹i—lǤ;sÈÜZÙ9ÇËĵ1´ġSıMs+ċĈ÷]N}͇܀C‡‰Ë-ןİ~U/}/΍DM­Ŭ†5{¤âĜİF1û AŽx#Ğ÷1­&öy$lfûCl˘PQâ‹Îġ"TRbbÀÇ[¨(t°\ƒ–"wc@u_K‰Ŝ0"a2°-7’›˙hlTjĜzJÉï|&Ëǃ Ddšꅄ“‹JğŒĝ?“ġeCŸT+óï™Sü^ĥqü?àSDŞ ÎN@í‡OĞı|-ÚÒd2€[v €ŬÉï·žŸDX߈;ğo>ëšrCLžWiÑ+1˘X(ğOgj²ŸpUIžĠêEÇx3Ϛ3ğ˘èQ¸5XçŒpfĜqEÉ·û‰œlşD+%:ìûĠk°6ÁÛ\ 4†ŜüğÏY„.`µÁáÍ})\VRQû£ĊZa’VħKÌê“ —:V˘*C:”Ĵ5Ò'Äü”ޏĦ—ŭ"ÔVë˘Ê#XJ ċú; éôöÊÙGN_Ş%bĤĞ7ôˆxä½r^[ó~ ÷ŝ™eü”Xdybĉ¸ü~}[ŞYßà16p­Ž<ƒrk½ĥÌ&ÎfÑTnĠXI6~Épn”TËvÚ\@‹!„‰’€HLÄïí’ûV½dqÖ1:–; Ĉy²—˘öŻ'ÜĴyŞ× íe-MŝAƒŬmŽYĵĠžÔölĥ@ŒŬµÂSÄ*İSe+OMP6C˘ĤĠĈ-Iħ€oŝ^ġ-ĵ£È×ßWĈĜ€sŻheÇÚr´ÓɜglıYħĥIR4$*ĝçYӞ™/^¨`ôô[÷1~\j , $Q Ek˙7Y"˙kÍ/"7à%Ûá­vIŬNj¸0ĝ€÷ öˆHqUpÊĊ<ò n,û ÉÛo’YÀœ—M Ñó#VżŝÂŞñOKkŝ° ÛJ˜°ž ”‘ïĵj/áïßîsÒK¤Ë3Ç.ĥÑÁücÎï[goĤ^kñ=>­rµBĵ­/ĝOW§y8‡…ôâÛܛùûĤ†œ@lpİ"{O|1r4œòİÈÙşZ*›ÍSBş}ĉĊœ›gżt@ċš—ĉx6·À(YMÌ)á‚–Ġ3[ËpADŞFşiĉ‚hġ9YĤžÈ֟Uü‚lÊäĈ“Žä@Žq•=—Ìƒˆ§Ë3µ}sb„˨fŞÓ—7Üës$kL‚ŽşƒĴŒÇuPN‘ĠŭIáo ˜U“%Y÷8š–k]:[,ĵt³íÛi=&‘ôïšÓÁ_µ/™ġ?Èĥ7½ŬÉİÂNpŽ>Št/öO,Ş‘ĊıXbrÉò—¸Şĵcèù錔ÈgïGFI­ sĜĊSÁ‡°ŭ4ôŭ¤˘t.Ħ ,#¸aL<K  ĵ˘ˆ]Êċn*·ŬÁ£¤½Ë'’AñŻ"]ĝÌ+ uŞċœï•=‚ ndÊÇ9žŻŒ-÷‡ĝĜn÷=…>(e—ı¤nGü³~ÚûB{;ásħìE-yŜ¨€F73>Ĥ›Ĉ⨍^%2uî‘DĞş\Ÿn߂Én4Ÿ:—˜ ġÜ$oÑŻ…ċ? ù(í/Ü<-T3ìĤFYÑ#"áğ[.˘Zˆˆ#ñ=I`žcÎĉïGÂ!l7 ëb4nÂ.ßÇt%!áèòêĝIĞn;_żĠÌ|ı 1ù)_é.Ċ;înBĴ­^Ŭ%0j|‚?†Ô$÷ŬŬûà@‹7­Ġñ:ÎÂ(U—ƒ ~fşTSè‰"žŒàg ŝò[IÙx:”3-ġç܀ù"Z·†œ„(ŞD4ĊŒĜE6V‰²\ސç™D!n׳76‡ğħaĴ‰únıD9šXZİGSC:ömevcğh÷ğ˙şuñE0ICíÇŻ1iVÙv”"_Má2Ħ8x.DFÚ"ÊyOJ3_fCäώñbzĊì–Á. Úĵ. pËbñuV‹ġ@½f1ÖĦXĤĠFÛùeYä °m]˜t0µ$Ûħ’/oÛD™ÈçPÓgĵ 9/3ÔP™’˙ü„ÑĦ_{ŻEÂóm ÎTI°†LÜgd¸‚×§#ZR¨C… ×7ÑsAJŭŽ\9=ò›`⨗ä‘#ĥ%ĥQŞeTOPZs£˘ka£ċIcÔ.•ˆ>·è(!›Ü]ƒ_ékµÂ|Iànd˘úÏ'ŞI<„ÊĉŸñ´F‡ĵ›§{V{Ġ1j%ÄûĦ½Ó8vçŻkF|ÙCr›2r•_ù‡•Ŝ°â˘ësFíÑjV⠘3q˘‰ùííy#$gF"ĝ"nBìMFà§SqŭX¨š#Ğĵâg˘fäwöĠïƒ^>ËÂú²òÔ ñ$û!W‘hm™À1;—Ê-!.üzÈPÄ$s]ÇX>HxIsQ+Ĉ;Œ;ìŻ`€3âı4s£MË'è’#·é†<1lˆáßbÇòŒĦïö\êÀ-Ġß?ĵÈ·ĜÇŻ/kO¤cúîúşϗ%ò^ú›¤x\â%;Ê Í¤“wìF&7ċMz%ĝ0CeRBŸD4˜ï ߟàyU\d!m;Zj(W6 !­Â™ˆê êp6ˆIsYâ&QÏ#ùù+˘˙ŭ ԃ1ŒɁx§hÀ v°™%Ñĝı?N0-F#³ĉ“çvğ qŠúÒmÚd˘L‘Ú[ĵg.”FÊíc„¸`͐ĝKV2Ò&LûXäı+Aïö°[L7§‡½µÑÖ½5pك?Ĥ/Êá(ıÖÄnȅ!ċÚÊ֑ÂT?…¸… ܎WËXÀĴœ Ahlïġ˙üö‡-䎐i˘7FóOi”ŜéñyèP˘’ġ2Ĵĵޞ)nĞ!xYCıƒ'D¤´°şà3-'ÛĞ^ĜeĊ}0ëŒÙIÄŭ3İK?Ë £Ç;r-s2LÔñëİío6Š(ܟİl˜÷ßü”Qۋ½ß.ÚóîJ¨vZÌ ëŠQT̒ĊÓ8 ĥĤBöġ­;ĠBUK’\6°XÑĵq\£cyäˆ-FübìÈË ¸ér°.;Ĵ£ ֟qJµeCecx‰ÊiÁ=“ÙíĦáÇ:NXq ɜš6ı`| è+ƒ•>š§W'l…Ĵê½FßLYµö×#ÙmU;żìġ­ŬÀKPFÑ䢉ŬÇvƒŒĞ7<Ż#MP)ôMc„ꨊ ?÷ƒ½3BYrr+N,ž˘OzĉC”ĈÊż·‡hS’ß*ž é›û'ÉnïƒzÏİ5ŭĴU²YïŞÀʟKßd0™Ê„:Ŭ³ŻeERwh è Ï22™Ĝ–ŒM{"pÀV3Fò%1dàŬY‚ïe½Á·9ħÙds;We”?;Ĥğ<ËpWùĜéo*ħ-Ï?Ÿ{eT6ŞĴ›ÛnWMd`2\Ä)òIŞ>Üħvĵï֏ĴÌAħ„ĠVÓ ġĜ) Ÿĝ­”ò µŭ .!Q~L”.b³…DX­7¨Îó:Nżiâ1ÀösŭÖrÒ4÷ =žIÜUGô Ŝ':ĥ£i`oԙŬcĜùŞ PŬzr,Ì[f?IÌf >j ƒŻD5JŻŠĴvşè(m°œÖ i˙Œ]4'§dÖSƒdĦ÷iċ…ğ_ *‘€Ú½HŒġğĉ˜5A;›ï5äÀY=§,Ġñ°s_ú&éâfŜ÷ 3‰Şĥ‡ëR„_GĞ'{9ÜPEҞcÄ X2l-/“.͐ñœ·´`‰ZÒĵ”ŭ}I+À?ĵ;ÈÛŞ~µ&8gàÄ÷ĦKĉžŻe¸syɨwìĞ]Hm2}"˘ù&iÓ&Ù/§ŝÊVċgŸInT Ğs\ÊL%FE¤Í?‘AıSËóûĝŽ'6¤WEĈĦЉıŭ„„í¤|şˆ9¤8òÇzû&\e"Żc…É•lÓĦ€Ç $Uô9kàƒ ŬħJû÷Ş"úEžN˜ğuêsÁ*iĥá*ô1Ž}H‘A_ˆ@ƒı­6ŭ‚£âŒx%É\™<ìʋC‡ĞxmÀ/ÑGìCñŞ^üĵŠ&ÚmYAÚŻ|nĠĊ‡ĝġÉwɟó²¸ĊӜş„28৙ŠĥÄĞf³iâÖY‚lŜ[§LA%³L觎vXĠy|ŭ'ÄûQbö’îı’ÇÉvUbLO Ġ  k|… o$½U§é³ğ^Lù˜BĞ:Wı'wİ뀊<ĜŻ/ŒPôĵá+..¨ëKnÌWœ¸j2ş”¸CKe`ÁżÒ{ƒYÙ{Z|=ÔŬE÷),ïIvâ— `{()¸BD2…´ż…¸ĊĜ.ġáôöNß`i%O”z‘żŽv疗¤huĊ$Â'Ż ú%q1µS£“ÇŒĜĊĠ%PĜĉ0k‹*>‰•OÙ†c°4>6’CΉ&N~Á–ĠñÔ×c2…ï·ŞcRŒżüŒïú„ë?6ˆWĦOv’ġşc‰Ç²îœK {KŞ<Ħ rĦĵJıJ%i›êS•î²ç9°S0ĵĦÈ÷µ2!Jwp‹(>NÀzV.EÜÛ9Zû @ğ|a@àb¸Ĉbom‰žĊŞ7§£&ëÚĉQBrĴk˜Rċ'6+ħ‰½ċAÙÌŝ~+íqc*L‹Çób^k·aċžéŒ’ħÑyCjĊ·#À‡‡=“\6|Ç߃R3É\‡, Û^́h ™͙mN$”‹Ïà˘ğdíż Ç !4ı³ŒYoŭŻïwo8SE9Yü·ĞĤÊŜ?yŒ·ÑpÑè×´›]˙\\.“ġGŜyk•ûDë/ˆ`½÷L#­8ZNżÁkt qßa6Y…€ĤÊİĴïŽjHöntló{^Ĵ7óLż]#zh[§F7…¨Í³ĵÌW&“}²ˆÖÍKn{AÂÏɝ˙IH3ÔµÍԏH‹Œ‰ÓŻîîʚqŭ6´ŭ#…ÂZ·oŜYO%5§ÂĞÉ|ĠXó~šì1ġ —ŒÌÏġÌ^ĤpüĦıĜÑízTŸĵÓ~AeLע”7)X×MĉOĜÏ nò·N0²^rwïŽ%VHWp£Îe?Á+²ó˜—pF ıÀŝĝ1ovÌ#>ùQQo$˘ú—òfûÌ>gG9Á½¤‰ċ‘èStħ¤t´>îŞË‚Àó…÷YB~CċĦíĥÀ Qx İ<ù(ĠÎÖ²ŸBœ˜”ò'…â‘”•)ş8 S£İL.ÉgR’ĊħÖRg÷ħ˘SN×O_ħnÔ 3ìcĞ·c‚H3dĉ)éúíG›şÓk1Öív¸üÎĦY–"bġ„|ž§ÓÚN\̽u>›`Ñ­~‚>‡êñW\—²ö°@ħ†à8Êá›ú^"TħԈ_ÍŽYšrúIŽ)NB(œù.Šdıs[IâHĈés)°ÙÖĵÈwWğ^|ĵƒIኤ0Áoa^zᆠ¨2š ägôUÜ=MV?,Ž%÷ĝĥYü'OÌÔĥiE&ZM€RV%j™ĵš>¤żB;%^äş*ÎÏEafġ™ĦÎMœ™6–İ–“U…YJ[}2Ï2ù {’>˙TùâÍĊ, œ ™ Gĝgf‰êĜ'ĤĊÎżp>ËĤfEÓ>˜ŝa[·`7<£üġż^86’ż½ŝ!œBıç+’ÏúVe VRµvĈ²ÏĴŠp`gO‰sŸ ën”yc¤@­œöa„ŝ•֝ҖÍH’ĵÈ~ÄwżK/˃ĉF)gCè."փ!ÙLl^n°ŻÓġ=ıKŞaV/…cYNQé˘ Ùb1ŻĤëúŸƒc$ßŬÖ'ŠÂKìrĞòµd£Uʀ“.í§½ÈG„Á ítuWJyÑJJ>ŜĤ|÷m„ŬDIïÑÓoîá•B. ħ'ħ*…½E ĵÖûÚú£l/lä˘Ŭ-Y)ÛÙ΁ì>ŬK7b×G3ÏŝÑb—é͍úK’•éXOÇOEcù+ż Èî~ŭÑÑÙë0B¤Dé“-œ#CİîEıĉ+ĥĜ ê^¸FŝÑé àäï^2[-&B9ÂèC>>dŜÒ˘ Ĥ í#Ùv A×(­ĥıfŜ‹ôÖç‹ħĵ/óĜcDcˆ&œ~”F[“„eĤyt‰dG&BɕֳÉ9UlŬ”ëñ4fŜ?œq0…н½> Ŝ²¨óFó1T ÎW$ïQsÚ°y‚2mŻ`<Š'ϸW‚>u—Á?[+Şj’üĝ˘äs›í\+ŻÚ“Újt%)³2ì*=Eĵ˙–ÜŭüS䷝)C!hžT+ŭşîНJuŭ=üŬQ1"˙%Wċ]š•¨ġM1rñq•ÑŞI9=Ċ"öaëµàŒU™sşİ R ³3@j—!} ñ˙şÈ endstream endobj 130 0 obj << /Type /FontDescriptor /FontName /ALWWOH+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/C/D/E/F/G/I/N/O/P/S/T/U/V/a/b/c/d/e/equal/f/g/h/i/j/l/m/n/numbersign/o/p/parenleft/parenright/period/r/s/t/two/u/underscore/v/w/x/y/zero) /FontFile 129 0 R >> endobj 131 0 obj << /Length1 1608 /Length2 4787 /Length3 0 /Length 5591 /Filter /FlateDecode >> stream xÚ­TeX”ëÖF ”†—fèĦKZş”Fš`d˜f†AD@)i¤;¤%$¤é @@BòŬçœ}ŭ_çìïu½+ž{ŬkŬëy8Xô ĝ!H;¨*ċ Iş0;7Œ-B›_ ‡8§‡2j‹…!*ĥX¨4`…*P{@XKII‘qÊH”ĉ脸î›€xyùŝôüJìĵŝÁÄÀ'îÇ G˘\ ,âż>h…X'(àƒCe=}3 ]5€[M×Pƒ" h[8 ïf‡ÙÚ0{(H4˙ì‘ìWk–"°0(¨= w êiEŭ ñ((Ú†ÁàŝpDÛ"°¸`‘ awƒü"€ó; BĦ‘¸ \ ĤÄ`1öh àŞêШŝÁëd‹ŭU…¤.‚´wûĠÒïĊÚ ġÄŝŞe 0 në…ЍCĦażi¸a`Ç?h¨£-‡b08öŻéüÙ'oŬÛ˘PpŻß§‘ż³ŝĊ†Ċ@ád`a\M{,ĥ# A&ĝkQ4H,ô‡â†úgÌŠŝ= î_;‘°… p/u ÔEbq%î˙NeżOäżAâżEàżEŜ˙MÜżjôo—ĝ½Ï…Vuƒum]p Çà^   üzcŝ_­ îġ²˙šhŭƒáÑÀÚâĈ ˆpÄI!$ ô‡†Q…yB!ú0Ĵ½à` ÇÍè·ß˘á0§ċï1ü`1ħżÄ `öΈ_C—ú‚" eŽ“ç7oAu{Úêĵ}MgéTÇzĦpÄŝчò/†’ÒáKˆü"B¸Ë&$H‰Jùŝ‡zżÀÚ:ĥX4Ìx€kZüğġ|Z–ı‹°GB~í‰ÖÁ­ÖżżÂönh4NÑß·×ò?íßK…zBíÉĤ'‘ö2A_Ĥ$a+¨3şúU´·‚ ş‚QùU†9YŝeÈż—a‹RĊ6§ċÁĠƒÒçġ^_PgĞši-/+ żY>#d´şxĴŬldÂɘ´ye#7]œg˜ġ$jétn<ƒÀúM˘†ĝϔħ³WZĈLĜ-ÚuÎxkŽĉ;ŠOŜëÌŻÀ30\ ÜxÂüOÖRÖäfŞf(}ÍúÇ×L2"omWjô9*^jûˆĞîËÎ}cüìÙĥùrĈ@˙8µ,}zuwĴÂâT4ûİRpşM5ùĦqĜŜĤ¤DÈİBͳ€PÖïÇn™?žß´ĴŜ™Ž°ÙU‹Á+UÏ8ö)Aİä\"by8H[š²=úѨȊldôŬË,ÏË_š™ÂĨ‘` 7o–`7-E>QÔ+D1&ôvXŭ5’êuÎ3úhHP3Ĵ·—ŭIğtġâA’WßŜ§1…|œŭX6Ġ.é>ë,]ĊÁ÷˜=†Hîf™Ù’ċ‰4áóXf‰¨™ z(‹t‡êJ|âiYW°c¸ó ÈċóŬžĦ4£w´ä].¸?àqT5ܝĠžÓᖕ´1ÚÖX­;ópAy ĉ³é7šı(™¸§Í_™î&ŬôÄ\…ƒWrÒ­Íġ¤Ì$y9â˽OrÌĜÍF~ĴŬÍÙcdó'öŭ¤(Q,ĥa7Ĝ—h;~&FĠMw“t³Ĥ´‘ “ÚèôïíÉÏ+,”#żÊ×Ŝ GY?Uo•Ç´@’b|ŝ‚Xġ5Ôâš{&„WĵIÊdo;Âíġ!˘ĞsqÒ¨E% [Ż™ù)ì>­Ñ'ÇvrċmäIND:Ùgáġœ9ÏŬ™jY³°ï:# #·yşƒ!âÉŜ@;zDÁĈ@&4Í@ï•òšÈNĞ>;YħÎpŒċŝKÁ˜/BKA‡³ñEÖÁm”oí hG>0uŜhX_Ê+¤Ŭ]†ßqßċBžŭh{P„NOì‹òHbo´ĵ3Šé¨Ëˆ>Ü™˘DoëĉnĞ[ö•0*VKR;GCßÙr.żċ{T0¤~²“1.!ı‰Ú@bùd,X–Ë£ÙoGùh9ĴÎɈµ$…K„ÉV0ZÓ8óö<[ì]óèŜ&C÷1+˘ZŽĠ1Z\ŞŬa;—5(ÚŞ ½$ÊWġdK̰Í­A×âíĤĤšéÙ½bü‘ì2HġdvÓ{ŻtƒùóŻOž4Ğ9rë:úžLÚĥ:úyŒ+“Ù¤‰`ŞħŻ•‹ûÒ˘w­]²§2Ŝ3R­E‰½ÜŜy­%ŒCo'<Ŝöôît}tßH˘”\ë<9[ĵżœp#ŝàS4E`Ï½ÄŻĜȌ9=JVu,·{ĵç­ŬSP˙ùËÉaĉdšYHÚ#Ѩ.–jÖЈ “* µÑའ§ġg×FÁ­ìŽ ċ…­[íHfc狷!ŒêEŬ­9_ùÇŜtà‘Ò>Ŝ–¸Šw÷ĤÖz58—ŝ]3ÌĈ˙8Ν&˲۰qĊXG˜ìşú³êĵùA¸Œwp—>Ğ ¤}ԟD“—„yċžÜżûÀĴOÙYapĦ*”şušĴš(ë€o˙ħı5ëä8†½úѓA §’…GÛ%Ÿ,”KAšè’– ȂĠÑ·?çÁQw§ Ŝŭ<¨üÍl6‹]E^´ÈIàíœXĞiĊ“·îúĞşĤÖÚÑ×(ï˘ċ$MQĵÓ÷ġĥŭ{Z7]I¸ÛRšKŠQK€›Íqc§˙ŒjBŝZ8¨´˜„z…Àó҇g͞6•d1|˙‘ö£`€EÜġıĦ@œċ‹­”aÄë9:Ç$żK;_h4/“|• ĦŸċm(ÜÏ­kĵá$tˆç‰ĉw63È,l¸îoş$™ú{Ċ3hĉ Òš¤5ͨ–Àü›ċ ÂŒlI#ÛHoQ³}GşƒUz ĞâSrö̘ 5`ŝyü†Qrï”(Ògz~¸ŜTµ@Ì ßÜÍ/—ÂàS9M9éĞú/EĊ8³ÔIÂħÌ*ñ•sËÀZ·§X<>‘ˆ ,=!U˘!BĜÉđ9q˜Ç ÔêÙV>y•ŽÓ:›rİ­,qBĝĝV,Ş™èğZéŸÒFDäžUh~8żċ™T„)*ġżTrJ=8hné˂ŭ²‡QñLVĦ÷„ŸcsDÖê{Üopí²ıÀb9Ógù­”]jnĥ€™ÈbžU/5•ZˆVĥ–˜=l›kcb3Œ´(ĥ(xìíK5‰ç) ‰%!qÚhNNĝyf…_üĈ˙àtĦ.´@VİóÉ'g[fC°*‹3s…ô“˘µi¨‡ÜÛg°<˘R!SŠÄŝto²1²ŭ›&z6}—TôJ-sY@|œT\J8öb½~N›Ž^4.ú~5 6NÂĊ·M˘2µ€ŒOĴ/ëOĴKğA³Ŭó­xÓ9ñÓ£0݈4 o·„HİIĝêBò 2€““žĜTšI¨ĜJZÑ·ÍjP­Â5˙^ia`WaĝFŭÎÇ=PÚâµ4XĞĠÚTDë•Ô"ÙlY{jυÎb—H%h‹ö1ÁŞTŬ×ĉ³LiċA­&%²Ŝ“Ç7?,şMXçîĵÔA’u`g}lĝĦ„á3;“´×:vîS £HwƒĠHh3σFħK×£î›Ü^ĞŸıSĝı y5Eˆ‰nÏ4Ĝc˙!KğÌġÄן¤Àe½,Ĝ“Wì<áAv#-]ÉFdż”ö™ÌĈê=×P˜ĴG~ytíñrÉ%3Š'{Yށğät-nî~'šÖŒ+ı­&ĉ·ĥ~9…RÑ*fAÂŻ?}+eĜQaC˜}u;éُÉ7_ÜS‚Ê TÀ'iĠ:e9¸'TÉ,˜÷ĝ†ĝCĜÁÖs ‡˘>áñŽJÏkmOËQúx*j)ş…½TÚ>hvï¤2ċî˜.ìߖÇÛı¨ŝ?]qí endstream endobj 132 0 obj << /Type /FontDescriptor /FontName /HBQSLH+NimbusSanL-Bold /Flags 4 /FontBBox [-173 -307 1003 949] /Ascent 722 /CapHeight 722 /Descent -217 /ItalicAngle 0 /StemV 141 /XHeight 532 /CharSet (/E/F/H/N/O/R/T/U/W) /FontFile 131 0 R >> endobj 133 0 obj << /Length1 1166 /Length2 7666 /Length3 0 /Length 8437 /Filter /FlateDecode >> stream xÚuveT\Ùş-Ü]E€@°B‚ğÜŬ ( ˘Eáî ¸C‚%XpNp·`Á5\sé>·OżÓçħìµĉüö'sÍ5ĈffÔá”ĥqħ+¸@áœ<\Ü"uˆ³•ğ›ŞÊİ ĥs<‚ü lff]Ü ü_ô#!ë Á!.P9ü‘×µw¨\ĵÜnn!~žÇ57ß_."MWˆ³‹7@ ğ:A ”œ‹µğ3 ×q‡Áœ `m°›‹ğĞ5ĜM`ûĜÙWÈşÀĵ\!vöpОĥÁ vvŽżaaa€•×_ @ìħƒž?.`'Ĝ•S(‚Ħ`×ÇĤmŝˆĠ´ÉÛ@àŒ `µ‡a"@ Ì~ĸÜlı `8Ċc£òPYç?¸a˙Ħ™Älŭ8”Ÿş9B]< >˙ÛB 6ŽdêA!ŻŬÁŻäŝ7ĝÂŝ³üÜĵÜÂÜĵkĜÓÚĝGI]/ĝO’çµñóıÀĥ '7°ÄüĝÂöq!À¸Ğ;ĜÏç˙%ŝs‡Í°XV`ğÇcĝ;û# ĥŭ×^ w…xL¸ı¸ıyÜ<˙^™=¨ ÔÉëïpu34”–Ñ2Tf˙çì˙Ž’‘qyLÉÉ#ĝÀÉ+Ä˙è”ÇŒÂü|˙Ìĝo-ŝÒáOTùß>ı˙Nù jëŝ×8:ŝ5ìêöèMëŸ6~ĝÏüê.pˆ5Àú·uLıùı]óĝâù?-ġü˙iĴÖPpwrúSÖÉxÔ   ĝC'ë…ƒœ!N^˙Ç˙ 4˙Ëŭ˙Ÿ<Żà 'ˆµ4ÔÎéß2AÜ ž`MÜÚŝ_vùKe›?ï!XÓĊ òÇMpòóüƒÓµ‡X;BÁnngñ'†Úü£¤<ÔÚĊµèÀ] rµù7míîêú(ϟôĝí_{[Ècƒ`°'Ĝ{~ĈĊZ4ÔĦ&´ġŞJšĈƒss„ŻK@ïâ·;ŭKìX'äu.”NuJÇš—ïυRrä4í%>™ ŞĦ"‡ż‘ôp–i & #FQŠ˘>àŞSÁ=Ĉd;áî˘NxC™–·+ëĠĞô“ĦìˆYBv˜X'܅,àé•ñöÎk'4teX;3/„Éo‚4”œüµDžL |‘vŽHQnożfQ6Ĉi8¸$İh#ĥœžé–Á˜ WĆ×[Ñ•Š|nç½ħ/mħ½İ€+ó™Á9z 1 ³öÛġoĉ[Ùŭ‰ž$ġ|ŒµÇq}ğHL•şŜĜ˙IŒ‘Ô5Ş}GZOFpĵĦúÌ ÎbzZó‚KAʗ´ZĞĤ×cSgA?%o²Ó˘^Ó}Ùxİ×öË@:a½ëğv ¤ÙoħMÌÓóRħ­I”ßq 4ÀĜq)ĉž4Ù =%ĠÔV@(VĊä $?m4ğf éÙ™´êvzžĴ)šZ½Ü‘˜ä“³ ÄâݏçĉZÀ3zçŻ3 lH’m+ŬñWşĜ0Í—·€ƒħ8†z˘h݊°0à{2Äb:Ÿ ¸}ÒWĜşQÇoèòB…OSĠ2qˌ `p'[§•F´‘Ŭgú$Ù:Èĥ<^ ûËĤtó%{£ ÷V]hWñßû|ĉšğìDRŞœÑO4ġfMݳ‚ĠI%H(’ŜGA|$ŒÎÛĤóKGmı™½ Ê֊ùQ 0i ÜŜ:ÊıŒñéÎŞá·eŜ84ĈŒRlŭïô³;ÙŬZŠÌ™}¨"¸†TĠ\X§X—úoѨDĉ9íOċ=è‘G'ˆšµ/ĠFU’™³ó>U$ċ7ɔD9bRMàmH…Ñ6ċFġGÜYŬçDžĞ›|5˜£ĥh…AÒ=4½,³î&TĤ8ÁÌĊ§{ĞEĊJG˘ÖŜœQ‹Ï91Ğ?6ü™#Ż% %ԁiy˙·M(U@­i•<œ"™„­ˆ³ù˜ß,FpóDSdy¸Ät8Ċ‡ïġ݊ ,úéĉÈ öú}ô`şħ‘-ۙñwĈö魏‘9xĝœ“ħµl² Ĥ͆(‘Ĵ…ĵٔ­ëÈZÛ”ÙK˙ümë{ÂÈü`Ja@ĉ¨…èĈŻ•h$á¸q%ù‰‡ĝYr@°Iœ†jy£ıî*1Ï^f[ËÚŞÎĊ"Ğ}ç–E˘µÚöCo‰MŬċç§ó´XŽ+R•‹Â!ÀÊlŽoÁD€fH*.?žÈe¸-ôĞ´ĦkNŝR´u6ëꇽ˜vËĝÙŻú=ôŝ™;…unIş î:u=>rŸˆ0Z’D ŠÏċÛNE8yövĈñ%“Ï_ĵáDïïµ?kÁd€ 5c&ÉİY³7TĈDú1ÈâsĊŬİßD5#§yÁtž_&&ĉ]èl0˘îħ nQT)ñ‰2"ú#–£É˙2Î"ßbÊNĵsHU~Ċwd?ô!TòÚĝ#+äċSÇÉ@.éZ×Ĥ§ÓB_¸0ĠèXŒĞ„9_‰É•Ö)uoİís2à#³İ\ U"Jü—¤/Ç͆?׌ByoÈêĊ`mOŽmƒ¨DEôžĜÄlz!Ù˙>O4²Ĝt–MĤ75;Ûɗğ6/ÎVŭ>Şäŝ‰$ÇQ‡*5p„ż;kŝžxÖòŜ*&9jÛ- nÏşoÚKE*\sĊùÙĤ£ÁÌŭ Û·]h[ÏáĊ ĴŞ ż-öU |}ñí )Oà0….ĝnmˆ \˘ôĜakìŝŽ-^•Û²=ıùáÌŞ6 ê<{aK8˝qÎ@âE‹N½2X úq^P7Vqù: =/ÂHä‰Q›ƒ´S>T¤Q=9ÏH.ŞB"f8K>‘?›ïS­q8ĦVħ ]ıkx âw9j;ĥ4~ğ¤HÚ ŽŞÁ&ï\ÔqìĜï•Rë-™F.Wg2W\;”°ú?oİmù$ĴäcD,ŝŽrÙ!r$<‰íUáŭrÏ­r™ßŬU^÷L›>ٗÈĊĦ˘˜q³ïùĈë6ëğÁÙm]˜£}ç™ yeyúó`Ï!Ľ-ñג­Ĝ¤ÄÌMħlÜŬŝp'ëäo\UL˜§Ë†á{ƒżÙHğIPĥ}ĝR$PUs:=ˆ ‰8$áB*ĝUÁ+!÷ëh–nÍ>ĝĵ äŝ àéĊœœuÒÚŜ !ey@C'„Ĵ 5èÓrΤZ8wÎwŜ÷›oĉüċ•‹È`Ĝ·?lߎzF­VVDî ëN}÷A5çjä[ _G• ÀÊ_GWŬíy,S—^òónĞXœĵÊĊŠpûi.äc#…홸 ùéôwbĦä­×lŸ:÷Q׎˘ÓWQL§–9I"`ҙ޳s€ŭuħo÷VxlTâê˘ħV4Ì_û´/Ş‘mŬF͓ÌĠñŸĉQÉç+İjq‰Ù“g^QŞĜ녚ŬŬòOBsıߑÁ%î~ğYÜaSKiÌq„ŬAħ¤Ġys(Ô(†F*ċĞR‡•óghd~]IF/²u`s˙tßy‡Ĝs4ĠwÑĦ£ïy0s.Ö-•öĉ҈•î‹l†ÓéQP›úĉ¤B˜N˜lw(#LévµKâ\cˆC I݁µ†-{áşÌX.sˆÈ ìƒDìŽĈ+0O£d*L7ŞZŠ…>‚ĵÑ ×Šö_+˘ìk–"ÖdŻo]gVhêKoy}kÛĠ'çîSŜ$w3Û$ĠĉâıÛA0$ЇÜ …]tĠ‘{•ë|Ò_v½#„ä–FżYğa(`Y9'™ ĈêқeĊäçĠme–ìŜ5›,/$Ëà|üIüûûyÍĠKĈXĴµoÑi èÓĴgĈßqĠżĴ4…³F.M ÷yĵ­âe.V˘ŭ2L̛0 ŭ¨AäfX>ӌ”Ŝğ_]Á#Hû£ÌàŞnÄô¨Q‰e̵-qk\eI3vÄĥ뚌9ùaL–A˜°1gCoÈĠK(n(Ê<|Ş(y8j)ÑхL0j:żż<2!żŻzù‰ŜöËQÀâg;çò6uŻ)ó½÷3ä%ûˆ2EŜkĝ âí0ìE =ĊN3Ĵcş[5)}pı‹Ħ…Ï“ĠTrݎ9iĵŞÀ<öLޝ7ĉÙÙñÊNċçÇ£Hû—mĊ›ò h$XUĉs­²Ŭ%äfìĝÚPµĠ[â*k²~•à‹“Wr›­„˘jjûò‹e§­ÑĊ™T?%m;ë)4 2ŸÙŬ|6]ı :N(ĉjŽgE@­Ž¸y žBŒÜíÁ%ÓáG]ŽŭYJ\yù#ìsÂ3¨pŒ+8hT—á>t}”‰ŬƒîTôv,Ÿ‹@ëWYúlWSCYُh‘Ş.ĊpáûÙSĵñĦ4–;°gaOŸÓn2#2ıĠĦiCĜ+™ĥJP”ËŞ]ÑĤùRnCRŻè{İĤ•N•™TF3úJ‡™‹Úo;Ì7‰½ 9ÛÁ]³6çž8²KE%šFĴsìµH¨óĊ˘W‚ĥyĥŸĥZÖ:ÒwŬa çbZP€žÉġïġdj@‹À„úò…ƒĉÈŻ·>ċˆÓ˘ëEhê÷H/~j$-sˆZ‚²“1îçğ$ċ÷ÛJħ

½Z+ċ’&„ê=ĦüĠğ7BìċïżF£v:ËÔÓKÀÉóX÷×ŜvRPñf!˘ CITÖÂé*1’ÌÉo1üR½§ŠS™ËĈZIĜĦ¸ħâ(h“V'û˜0Pµİœ|GáĉPrÖo/Qş&ôŞşÊ ä7?ĠÀ…‹ô˙kò×ÙzĤĤûÓpôgËj°çÁUcâĴùèb|e¨ĝ€zwĈâñşOQyqMÌġĠÓâĤÂí£klâcuÉì6Ħ×R&'Ó[×Ï< cu˘êŒ êŽYIâ/ó C ³ŜéúÙàóDқ{rÜŜúşħ×À2mE Kó²ÏVDpi&Ğ îiòX UıZú0ŸU,Íúk7MÓòOÊ[ Ħ ĵx3˜Û'Z5rÇ}Á•Ó˛äYù!.¨o äoÇt S&Ċ^ [aÇD6]dżğ*´§˘2“àG(&û’—@]],°î˘güêŞ&­YŒI¤DguLVA:êkà+ë[Vï7÷?¨(À€˘–… =ë•ĉrٚh˘K´İֆâ:üÄIü*îĊ_Íí=íQ[KujÇMÍ3ٵŒH bĊĴ‚d6 *Wr4\-ß{¨8/ċ$áŞHdçSçÈ| qv‚ùhĴ\ñÉ öz,Ŭ³×ÔÚyŜĊĝ‡£$aĤ…÷ ”·J4݈2ŭ~[NŞnM*ǁB—ú0AŒtéA‘êŬÌ.÷rO‡@ymħ},ùï vçF ½ógNƒ$Ï5zş†5Š”ÖĴ›r•äF˜ˆezLäBà rJ$™q~QD0%‰ı^pE]İbO5~³ı Hl[!¸rIB†љħŠâ~ò¸%ÄF0r5ġò™½JšÎÍŻ[zUÙwÈÌj?YäÙ%ßQ /c`iSf4êÍ,Ĥ\?b§—y/ĝçòΖ}B> ääż}už2È­‡ğtġÇä9ĥÀÂBu, ܅.5~&'/dħĝwt_Ġ>hz ÷3“¤ĠħĦU†žĴS—ĊT„p|l H“Ĉ³ĤıħWcƒżâV Ú/Ÿ Ěn&â‚s‡÷Ĝ_kˆtڟĦ°NİÁùİ…–î@‹Šv–¸_>yŝdà‹áiJ½›É7pMŬ§ü*ÀžšC£ŽŬïúÁmòğÛ[R|ŠÔĴ (ċ}q$­#Ŝ÷š\~ş@ĦŝĤìS†~ñ}8/jĈ*éW֏§U~ġÇĞÖ&”ĥ•nĉô­·áĉ²0`Ĉ%Re°ĵCTô`ž °µ€ïU<80|DYĊ–1kÀÁ"A‰kġ›8²+ƒ´+a"ĊOXéä}!< ö‘ä‹ù› #şˆûƒ5Ì;QoĊ Ċċqúîİó‘ĉC/µ{Ÿl˘–o_§ċ“żĝy½ċĴDĦÁÁÚ$ĞùĈı§ävïßf²Ôiĝ M?IştŸoi{£P}@×Éó҈60óL³fY‚CĈ!KéLÍŝŭÙ]~ş~`âÄŝV,‘ÊĞĵ Ž#u[{!çœáŸ&“ ӇƒN¨|Š›`×j ŸŝiD6o½ˆéìe^­ĉĝÎ ĦÂn e|…ħç ÁLíë‡èz˜!ï8Ф@ӈ8(.:ğŭ4Ú7‘iÉ腖9ĠMîI/ş ÑÈòÄ;·ŜZÁ9]½óŻ{Ğ]Ħ›>Èâ]=ë%Şó–AĠ$ëï¤ÊÍä“ût+>öC½ĥ蓽âZ`ÍohD!ĉ-y×d‘:´ùàŒ_Œż,#ÚÏO~˜_f$ͧĵ×˙À–ò ĥ›fG`œ]í1Öç^ż =öĈ¨HNAġßa~Ğ9ĉ¤ŬĜ¤Óß1eÀçĴE{,}*ĝÄҎ™äóuġÓ$S:ñĊíd —›31ç™ àÓbÒñIÊpJ,Ë>o-ĥĦŭ.oYxóĴbV§,V EقhŻpI' Ϙ5Ğŭ÷ĈĜŜK…á]8’T%Ŭ´}ž“Äü2ÓÌ9íW³ŜĤ„VZˆ·²K ¤;;k nI~£f“­Ğ›Ì ’EŻMı•˜ğÄlÛ£Ëó„“?WÍmı úÓ;ĤÇí"–^ġ{_ˆmŜ9ŭY+òŸ^¤éJ阋 ›@µçĝÎq¤ĝ@^šŽ@!‘ş ä§ҖëöµF9ż˜$ĉí§e°¤f’KpĵĈ§úşïJµ˘W—NQÓéħßeĥmML\ÚíÂ³ì%bôö?šf Iëó,Ĝ.›BEŸ³ä•<–(zŬ~ŒÔl*;ž2щhÛ@q × Û-'A;(!Ùü&Éħ>Š?ûÂĈLßց<äŻ[ܤéœn›é€ı¨Œhn —Ĥ‘Ö3ġßGeĉIoÚ~JLh ÁlD·*ĵWÂe{!…‡K/ŬÙáÑìw{„­˙[ŽÉ܋q “TÈîj½mFĜ†:@Ż[?Çï_­×Ó%^b;‘ÑÄXS+ĠĊ ÏpP$È^'S ô1Ŝ”;XAïBħĦ­†ċş/Ѹ‚mŻV{„k(J•. Cw˘ìéo ÷{EàĴîôʰEBq3zaíפ´Tü ô÷'zJ^jl˜*×Ê% ! 4ĦkÁğÌäÊÛ£^4îS}ÓwéÇB[ÜċÏ|Û/7)ĝ…²z•ž…ùĝ\Ӕ2$­]…—D³?Ĵ°¤G§pġa£bˆŝ_ı†6ċjµú–ĵ‡ zħá­ÏeBÏ7>£‹ïú"JW˘̋v14‚ı“HnŸÏmfÁ…ıHËĠ"i8=żZ—)•.‡ ‘‘Ï’Ndë’/3ïĈ@éħf\ÈwfNÔDĤĤĵ)ĉdŭc9×ñdĥñƒlċ³ŒÛ£cĝó§j££ÎQS•?Y¸vXOÄêÒ4™ĊÄLXŬ#p8‚´0 î ôĉĦU´ĵ÷SqZö·Ĝ²ñ„]•I°¨üğO`gNa‹;ÍNkġhb´WĴHĥ *9°ŠjöCħĵל’ÂË%ûÓ ÷pv—=X$ĵÂ{l§‚,•!WÚTBħI˘Cş Ö'[!NRŸé­èÛ=:ŝŞZy(œžÒ[6ĈJŽAÀwB¤ğÓzNyŒŜĈ²œf·;)ÓŬĞĤrú}EĈ’ñšÔ‘¨lÓ Ŭş Ìjj·n]˜G8â-ëü$Í_n¨=µŒc³5›³dŒZŬĦöaüĈ%´˜s‹t.İë~]'³ÚRZŜ<ĉÈÛzÀôSċÙ%ÏŻä”³–ñMÇñ½dŸ_ß½Ĉé,*í'|ÒĞ‚EŒĞÖ’î¸@~èôŝ!‚•[*Bú…áéİVôĠrbqlĵwí,瀪ñOTzŸ€ˆ'o²°ï*@>bHjê k/0~pAx'ŻBÀöžuw5|t(¤‰ĥK&ÏR\/B….Ÿ”J4!i×!2âċ/;Ö§óh;ö¸DÁ9aY܍Ĉ'Ħħ,Ç}8ÌĠ<IĜöÙó"*ŞÀÑ=eödáíş‡ĥùJdàoÙ󴿸ĝ·)„Ċ?qTvxĈúVÛ˘ÌàŜĦ…’L×ĦuhñŒg ”\=Eùİ4Ŭ6ż•ë"ĜMoy=ÈħÁ)Ÿ,ÁD9şċŸsü,ÊXħÚ°[‰Ô˜r?ñ?¨*Àħqk~¨Öñbœžò¸ANßĝ†VUŒ-¨éĦ1~·”lı§i˜§·m)CâeWJ½è¨“ZVyBİ5òš$*çgŬštÑü(ˆ²Â Ğĵl:N‘i,l˘eS'ŭ˜Q hêd#,ŸH„m‡ğ-†œ´ŸGŞP˙tĴÄKˆŻg¤Ġ²)Ĝ|›Zż}r£´2UĤünŻÑÖW—œ„=µ¸XÓëgÒó $œiĞ1xUkQ³>†fÁş[vħÎ]í^ó\Ġ†TŝÍS£F:eô(—s’ß—F²żœËo䎺ŸÉġh“½Ħèô Ëê'^îŽŜŞo(êiĝ.ĝ½H,%°1`֔(ÍıÉż? Š+k½p‰lNKûú“[ÀڐlşĤK)+Oĵq(ƒëɉ ŝ¨nŽĞâ]+T¨ĈÎŻ _íOîßşµ^ïbĞ2pĞJ›È<ƒÏĴ2Ĥš8Ñ[f0ZBTzI•"DSÓÇ6sNÊ4ë6”Ĵß÷Xéñ[ĜĠ¸ìMcO·óÖP¤·ögğŜÍàŠUG°GşŠÒMëÍf³é}#=.Y'Qé›Ŝ0MÜ|ƒIÎGÎ&EıQžêċŸ 2t6 ÏUgéû:Ğ­;9ŽúšäĜ¨:Î˙fÏ)s’@ŻĤ ) Òİ6át*E‹?ŒH“ ŝtíŠïœĴ) ~%~2ú}·Ž,\pŝIp–x~[awi16òf“cu†´Á V™„¤5Î×ûµ+£~1%JġĥIġôEä)›ïçŸsĉżû…o9%ÛDî*Ö0TT”]'Ŝ=s[!6H̙2 Í5t:äP£aEcsrĝş Šŭ ,³sÍd@gù•€µ€¨êž“kúôùöŭhnĠ‹Ŝ˜AĥÓXĦË2|$@uˆû€ÍpóÓDLúŜWÔ(Ajñ{÷YevI‡T\:÷b9äıĴÓŭMàŒ%‰x³ĈċìŸá/ñûrĠ¸£é„Í^%šĤÍ~LZ˜B҈hwÁK$½g q„ò  ò7? Ž‡#Z{S/²}ŻFOtvG‹Ĝôv ŻeŸ{°T|ğxx~S”°€§u9ĥ)1êÖ`tgۓ.“íĊ SŽAĜ³Î{à ÉŻnlÒS ”§=‘Q‘Wl ôRY„íòëë>x‰“£d6•I(ĜêĈuAK ‘רG".s–yĵgYĠ½‚’lOƒ‹!âż3ħQôğiĵş#Ž›‘³ cóT/²£ŻG^½‹Û MLúZŠP\27˘Ħ”Ĵ°Ú2IÈŜôaöPR!…u4$ {×[RôüŝúÖòԚÏ'Ëéğ{ÍR&`ô³ÙÂûüŻĵÍ]|rÂ[î0ËĉîéÂîŞìtğŞ(¤,úĉZfW(Òxàû6” Ĥŝó#ü'#ĉMœĈßşq8ċôĥ|cS}v,@ݏΠĞS{6„\CGôĉ°â}F{š8Èpíhq“ Âŭ­OEÄl„X°Ü öŒ`ô]¸ÂĞŜŞÚòWΘց5~4ŻlÈèò’-H§$E8ĉ‹Pòĝ~°AšÂĠô,ĥ‘?zË82Uġ.ÄÇċNÁO½HŝĈ&|m½½…ç*,ä™ä7mĵILŬAB#܏jD?ĵŠmÓSl†9_ڕ¸0ZT¤; -&˲ǘŭ¸iH^ŞÉŽEs˜+†ù|͙'÷?p1r1 endstream endobj 134 0 obj << /Type /FontDescriptor /FontName /XABQXJ+NimbusSanL-Regu /Flags 4 /FontBBox [-174 -285 1001 953] /Ascent 712 /CapHeight 712 /Descent -213 /ItalicAngle 0 /StemV 85 /XHeight 523 /CharSet (/A/C/D/E/F/H/M/N/O/P/R/S/T/U/V/W/a/b/c/colon/d/e/eight/f/fi/five/fl/four/g/h/i/j/l/m/n/o/one/p/period/quoteright/r/s/seven/six/t/three/two/u/v/w/y) /FontFile 133 0 R >> endobj 135 0 obj << /Length1 1199 /Length2 2803 /Length3 0 /Length 3558 /Filter /FlateDecode >> stream xÚmSy<”û÷'Œ İì[<Üd„YìKÈ4YşĥŒ%[Œ™gĈ̘Ċ’,!²k‘%’PŒ]¸]ÙBÊU´ÙKu/²´ ’ï¨[ŭnż^ÏÏçsŜçĵÏ9ïs>ʊöX 3Ġ4§R˜(8Ò°%ú°XĊZôeY1qd€èà Êʎ$&ü <@qL•‚Á19>Ž~,ÀG4‘ iˆÔ7ÔFrÎH­oŽTş!`O'Rö ¤“I„ĦâY …‰eÑhdHpT2 "§Â_gPiat’Ż€99¸¨Şİİ˙°  Ÿ°o€$_ °‡sÉTÚf6…HéœÂ ›öDÜA‰ıÙ6óc2i†ˆ968ƒ§€L„*§ĜƒÂjà&şİ†DñœĈÂżÒ0€B Ħ„˙"’(„/íX4„…Ä­0˙pL6_ è 5‘H} ÀPĵb3µc ü˘6Í8 !"œFD™Fˆ ç gà‚A€Igá˙ĝï ŠBž ĝ€œ‘ü`ç˜Aâ×ğ ŽI'…îH8‰›ß÷“'g¸*…öŬ' {Gkµ_ġ˙ŬĤrh5Pzú€†Ĥ6€Bqú4Ñú™ġğß´ĝbµÇ‘ŝ­ùƒÒŠB¤_[âhù­­`Îàì*û²ÚŞÀùmİL`?ÖÈ݃älç‡úċzŭ˙ċ’ŭœœE&QöU€£ °6U!sÎĤ2$ü˙‹Â’ÈażˆûÙÑüú ŝûŝÊnFñ%ƒ€JóĞ‘Ä0'…‚{ï÷uwÉMĝò@A{*ƒ´ùÄ9!:¨Ÿ0G?>€2œĦ|@ ᧤)x*Dñ°LΊâè„ï†MÏ˘Ó9:}™'ö۝H│Ħ :2HĊĊù×Ċ5ŻÔ˜É†hLöiuê:-m°´Ħİdîà[:lÊdµ ?ègĉcì{ŭLŞÜylx¸3dĤê… [àü"˘'EĥX&ÊÌŻí³5z³vÙ)s:E*Ğ`ĉ@X·ċkĊò%We“÷D°ñTñ¨]+n/§ƒì ²òċE•vӃŞĞ1 v–äȆÇ=­¤LB–àĦĥĈUı 6Î/‹Vĥˆx vĦ·éD=Ž·€2ëŜĝÈş–éĥŜkÓ\ġcß ÖôŠtiyÒĈÔûŻıÀR_Ç´˘ĠrÄjX/çbœ(Wê(Ž`/´—>-ĵ× ŞŒšÜ#?ĵ֞Md¤Oœ3PŭÊ\G¤Ĵ:W}fĞè,¸&6ĞşÄ£Dê‚üûĴHü~ĊüğĉwÒïìf\wŽ´ĝKX[9eڞ÷Ċܑ]6BÊÚ\ħb³JŞéŭòć§´ô™†‘ĵï° µĊÙ8îùĈh˙İçàüĤĉğ Ç1×jwJjîûì}DûȌéç‹÷O şú§ÍoçŭĊ+1Uo^qo_ñ•˜3ñÌ5ŭäZĞèÈ,w$î_d’Ê[]îğÊsEiR}<­ş—Ŭn^ü+ÁüÒGPjĴÄŜ³C§{ËBžğ˜Şt^Qïs žr³ “Ó|'#žÙĴa"˘.ÜżvߟżPIfv-g‡êM×ZĊöú‹„3‡LÙ'Kġ¸/ĴE_ÚĤ Rĥ’jxn∊ÛûH_¨ËĈjĤğ`َB°…äŝvY[ΨŻÛY/yihŜDy_’äQ,"7xġŞ˘Í¨…=ù­iz¨™ş_ğğÑòêìèX´ĠmŸċGuŒÏ2£ĝáŝ$ŒĝyğŜŽÈ|vúÂûĜ7a.a—?v*AIú S-ħêŝOSÊûċ+EIôŒˆž—žàŻÖʓħÈgİC%IĉddŻ[úÉĜÌ£ş Ĵwv4:aTàAï|3Ìĥa’üĜšâ‘S>¨ G1JÈBO.qïΆ,ËÙÌèIÛĊêĝc%ó9ûë§*ïÛûA÷׌߷sİﳀU¤“HĞŞìXŸ×ĝ_$qĵŜ‡ŠKlÄĊ·ıŞĥ ŝÙ(bġt¸mÉÛ BzV#žâ}Ó2·£bWë@Oêôö„x–Ĝ9M^+È2†3vĜĤŬ[⌛Q-nĠ7]zQfŸ=íHûM,·á-İ,İż„i^°*Ö+ġ5ëıM<ïğ#şÌúcL({ĥI:˨áüB½\ği)‹IJYĜÓ²pññ–sêèġPlQžÎ'²×` )*MÀ½à$ÜKĞĈсt·‚Àˆ ğĈ^CŒâ‰™PIğäϳâħ)ZU[Ç~Z§Ñt³ÎĦVœĦêúbƒœWvö™ÉqFÍöCŝ>!Eˆ@Ï+çNX ŽşĴM§–ÔŬË*m‹6xÙüİĈ&¸şĠd˙DA1aÄİ”°Fv }˘½+d֕9]TÁvÔĦÔ} DÂWNï htKûxŞJĝY4ş§È|gÄdß?‚Hï>>ëÙñOŽŬÈş5˘²U—œ ĵĞ|ÙáË™lk½–T·ž0ñCŒÎƒÊş;/xEŠŻ3Î?Œ0Ĥ,Š?½_•7]‡4²ŝ4İs–ö<7*uµzİL£â˜rúĴĞî~„!ĤvîİáiŻ’0ċfññġíÉ! Û3ábuŝòQ)z#`;#,³ò‚U˙›{of(: ì“]Ò< ħ\ mİżO@íÙ²wĝ u†ŞŽêŽŻ ħ­$߂ï~Û%_Jäżù²@­QèèûjñN‹g âT瀍Öĝ]–ìÛíĊsËCİOÒ¸'œr󌇗Ŝ…ym-×6Çâ\Jï÷ˆŞÄfÛ5 zooìx-(*퇴qç[•á}ŸŬjhĊŸİ^Ÿt@™ìp&ìÓésÇY—Ċt?â{³ÌO}²žô,_ż–„K^–dİ}H@0ŭZĴËŬ­#\VÎâk¤fß­ÒħŒ.$_Šú˜Ŭn÷ĵoiÖĞ äsŝt˙[şħAÎŞjǧŭmÓë/YŽvm6îdDÉĈ´JlmÒnîuêç°!oŻ|D·şâúšP^xŸÄ쒖 V)…ÓĊ‹óĵ–AÇċCĥċ+Ö·R,0›áá+?ibJ5•Ùû^,ÑĈu'Éúé˙o_ñ5 endstream endobj 136 0 obj << /Type /FontDescriptor /FontName /UGRPTL+NimbusSanL-ReguItal /Flags 4 /FontBBox [-178 -284 1108 953] /Ascent 712 /CapHeight 712 /Descent -213 /ItalicAngle -12 /StemV 88 /XHeight 523 /CharSet (/R/a/e/l/one/period/s) /FontFile 135 0 R >> endobj 137 0 obj << /Length1 1626 /Length2 10082 /Length3 0 /Length 10902 /Filter /FlateDecode >> stream xÚ­veTœë’.îîNÁƒK ¸ğğk  w îîÜŬ]ƒ‡àî@ËŜgfÎĴsçŝ™{~ôZß[úT=Uµš–JUƒEÌb”†8¸²p°²(ƒìÍŬ\Ô!öÊ~E% %&çAĦ•pšı‚ ’fÀ %@hàäpóó£$ ŽžÎ kWƒ–ş#3óûJŝ2˜{ŝ§ĉÍÓdí {ûp‚!Žö@×·˙kG àjXÀ@€„ŠŞžœ² €AFY t:›Şnĉ`@dtp2Ĵ Î? ˆƒ%èŻÒ\Xßb‰ıÌ.Ž@ ›èĝ—ê=Àèlrqyû€\ÖÎfo=p…@`7ËżĵÉ­ rt†ĵYĜżéŜ‚İB\\],œAŽ€·ĴŞ’Ò˙ÀéjcĉúWn›ħz³´„X¸ŭUÒßş·0oZW3ƒ ÀèáúW.s Àäâ6ó|ËŭÌÑô7 7ƒġ?ĵ8­Íœ-Á@—·0oħ˙êÎ?ëü·êÍÁž{Cŝĥú/ W ĜŠ…ƒó-§…ë[nk Û_³"ç`p°˙CnéĉĝŸ:w óß bĝkfß@˜YBÀžK  ›2Äġ-%€áÇ2뿏äĊ˙‚˙-ôŝ˙‘ûŻŭ·%ŝ˙Ŭç -í+›Ùż À?n àíȘ9Ŝî @×Ħq³˙ż\ÌìA`Ï˙—ÓżZë˙VĥüWœĞÙ[KÄĴßhage˙‡ä" òZŞ‚\-lVfà·~ŭ-×r°:ƒAÀ7^˙n)€…ƒŭ_tš6 ;‡żàù‡ è`ùŻß¨ú<›ĵŞĴ¸’ó˙p\˙6T}WMOÇ7l˙QŠÄòż…‡xĵY8xù,\Üoğ÷ˆŸ—Ŭ÷Hùw Ž•Ì\Aƒ·şÙ9ŝŝ?~˙|ŭK) ˆċ_c£ájĉ`ù6i˙%ĝKmáĉìüFßË˙Vġ˙žy h²²ħ²MÍHs­!Ìš4èëဠv,İ×,Ì÷݆tû†mòW˜>} fm˜úĝÒêıpìĝĵ+Ï´7ÒCĤïNžç‘ùÒ0öĉcŻÓµ`Ŝ `3.AO;щòĝ¸§Ï˽·5ĦĤn\ü„@>ĠÎċŒtqÇèOžï÷îÖ³EJ],~VNMÁñ ]ÂáŬ-ŭÀè`÷|ï.)sv,2­€;:]¤żS6݈V…w a(gÉ'jüÏÍÇîbóĝ0[íÉf5‡nĠGpP¸ħLßäCB†…Ë%÷ĈĴ?Ħáù{WĤÔÉÇO^0ˆFÖşŞ9Mf°¨wŸ—pÀúÉV[‘¨ħş 5ny;£Wñ1İ.2QBn´´S¤ƒ9ks‡}†—ú °AĜ~Ä?:x²˘Gc.aJDUËO]Ég,cÓà5)ê÷ìg*zLßXŻÂġ6–Aĝx8´Ùŭğä>çúîhl½>Ö5'ıŞpN^”°|š ‹È3ÚÏpqŝœU%ŞWΞw\ĜáŭÔĈ+MŞŒR]µ§6µ=4Ô‹ >Ĉş¨­™ñ(“{ë™B>aFˆÜïä²J.Ù²rÇË·fA^FKñTéÓVÚê_ùdöbHd4£„ıp‹‹TÒ¨büĤ%@Š]UfÄSÁj&ĈĞ;“²ı×ôy᎗ĥ:Ĥ‘_ĵpݧ›|#|2ï Q~v#ÉTKa Ŝ/1Ìŭ(öÜyĜ“ĉ.Ú**ñà5ÔAo‰¤?ìV‰û~š~Œ@Q†êÖÛb•/’‡ oƒŸÀu˘iôlq)›Ê&s³‚ öƒV°äá˜^gd•/ëH†‚ġġû§VŞŜd)OôY2ŭ„Ŝ~-[žUɕó BR€Ü“ċ6GzÇFa~Rnô²Şò_ñi>ŜêL˘ ­˜ŝÛĝ™sÜĞUÄt܋‰Qou,'ÊĈ~“ö8 0(j’Âŭ“7ëíݧzġ'l_a§0Ŝcx+:`R?.Ş^gF·7€ş5ċ’úlĊ?’ÍDn²›·s˜͕âİ‘×SjϙòdY×J·‹OİD0Í´l*˘+~ÇFñœòFI“˘3ÇRž ü½—3×, ÄJ-+½ï?ŭ‘^<ŭעÖ\FُYJ "yúoĴµ`Bı˜)­‘óNê—fj’…´$ꭐ~ĵr}Gà„$0‡Ŝş ~•+ äÉǁ{Ìdl˘§íUo?Íïaݏ%…ŝ üašïĝ9ŸŬLŬ#ş·`GĤÑÓc­_ò•ì‹—ï·ċJ•ä_4²÷Ŝ£ayó‘ôÙnpL™b‚Ñm[¤úv&½<¤'ì(AEŻ[7kVĥ8éĴß7E$ĉµçM²ttè1r¨ŠêzġĵP8YrÑDŒ„,ò9ÊòĤKĵá7u’¤6ĠÎYCyFW´ ¸µ9NÖi)bÙô§/]ÀNG°Rñ“_O”œ½˙Ŭ8Rwéúxh“a‰Oĵž _´´²Ĵ#ûıе߷$kĵOŭg&´­ _ÒуSÀ(0úëôÒÑĜqJäŬe}1˙µš† ħ•ÁefñùĉÁ…ƒâÄLJ•dŭŻħ>ïz:|µfmû—ùsµúí _³Í͓4rFô޽äÙGBŒ(F0pÓĦÏcĞ~ÊċáûĝRî"#ĈzĴNékö8R݉JúÔ§Áú%$kñ´FİċiŬw §/ıpUl "J>NڈE{<#:nŠà8x ֏Ò}W³8ı=¤¸ì÷w dŠ×ù†íV!C…ÉSÚàµĈAVçZ%݌…˜ŠÔz”dÇ@ĊNRáŭžÊğO—ÌVs¤J…ÉŒ2"pċSVšĠî×ÈF[T´QhTó|ߪ‚R‰sŜm‚ëu|/|:¸##A ܤxÈVĞÂ!2 x@í¤ŸÈıZŻgSÉhÁy™Óĉ?*ĠRĦ)ĤyÊÈÀç̚{[E·ğ%%²Ĝd5Èbİ­ža~^ ĉŠ+ ߂(´ßYJŠe;“Ö%Œ·xyÊî cE –äêoÁŒÛó‘ÄLâA6BoNßĝUQŸŒşÓŸ}ü.ċÑşÛ ! pûbXÌÑGiœI…÷{íÏÊħ.)ä#ûHVq*aéö3Ó…¤Á<FP}0£Œ–ÉT@8é$Ĝ6xŜÍKß#_Zšµĵ~JzŻMa—3œÂħÜŞV¨àdâoê³§j´Î•QfaL¨Iôá)û{ ½^âùÉϟnm]jçu?$àZİIŒˆkƒaI˜˘hÏğÇÉ5héÉiı)gÊdċö½żwùŻ”8İÌmÁĊĴÚ÷e~F’ĥ0İEŸĤ‹%2_|J<nĴÍóVYS u£^Á$-Ä.$Öa­ŝ>‘+Jßİ/]jLmyPKj˘²ö’œ‚ïNehÜÂ>˜Üeë?\ŬïŽŜZĴÄq|ôş1™oŠów›uîşRLÌU^ôĉ¤Ş,€2¤zxÁĝjŬm_ÇŞŻî#YC¨Żô8Äė—6,òŞÑè=[ÙëëĴlˆîǝş grJBagÇ;ǀ¸2\êÎJ( XTÌf“‰A×Ħò³ñ“~=Y×NêêĦ[ŒöŭşWb4u":”U,ÈĠİ&Ĵ³£ŽèPÀ½èĈµEuÊjPr²Y9ÜKĜ<:Á#ħQêjÇÓàuûgsİ˙{qùOkUx£gúêŝŠáZ/G9É ;§şXL­ĈÙÔT[‰ ë“sşŬ4^R |Dƒ_QkE“b’E?ô*ò| ĝoòQ„N‰ „|\£T`* •÷ìıti;5]9#½–˜îLÙĴñÒ/žż fa~}·ŠW†Iî׊+½y*PpùžÍäÓá^Ä}ĵ~ıґ·Áĵ4Ĝ&ASúÈ­ÂñR£qÒäġÁ3–pX…|Ġ'öÉ]Í!äJñ‹•„¤ê-ŒäŻ*G ’ä3 ŬJà9.˘G€8–…öÄU˘Ì£8ÛIŽšÌ²c“ MŸĵħw Óĵéc żî'm@e{ĜáwéOĜ~ɋŝ–O·„6ËEùF·@¨ıMÊ˘&úÜ_‡é îĴÖTvÓyù]2œ-šö ûb{é‰x_ÛízËĊ5@ĝx”Ŭ”#ä„ŜëßЧÑlĉ:ˆħ9³”H‰$† °šSĴħħ‰qz nD×– áԖÍwiYĈŜSŸŻ}6ï0@CF²Ë_ó˙ †ÂĈüAotèMyğĥ"òé{ÓíúBTB;†ŸËÜ&'ŒKy•?tċáx>ŜC²N Îh¸ßî¤ħéħ:JşÈ ħcֆÉIc¨Sĥ0?OnäĊCŻċÓTµtĥOŜfMÚÌ œ<öş³ Çgíİ[*Ê-xĤĉ.‡+.$*~×ïC›S[rŠê!(4…ġAı"íĠ„v]úŠíĤ~Ž–=ċLßns¸Džö?•iĥ …:>|#ßW͔ñcû)6òYá˜Ħ4™Ú'"NȑÏ.0PN)÷†ÚË"vL6ÄÈŞĉ€^²½÷Ät'Ë8Ë7”‚ùvûJşç„Zä&Üíw ÚN7ž —Bj×dJħ ޤÑ6RšQZxŬ3ôÊ ċD1pYÚGĦrĦÑ=†ĉ7Ɋ•éwT\òGfcé›gŒ*ot°Û{kËĠ&ï3›oşŜ× ĈîóŒéN!Ġñò ġ}VœrĊ[’@Ŭ 0Œ[ŽÁp  WĦç›ëˆ%5JM³/İrsĝfÊj\*ĈÚqÌÄaĜהógSpĵâ™2£úż3şµ) twÓÖ§ô£B6œB˙ ³•ò²ñ(ĠT–Bû­FĊ˘gù=íħĉÊԔîëĦmŒuò6ƒÀ¤e˙B²D”ú_wnÓÒ%'ÚĤħڀIZÖ£êeá ĉH2œ½£Ŝgx~Ÿ@}ôa\mWD Pg4@ÔÓìSö)Ŭ2"Ĉğ;½ïSħÍ)ĝşew–ëÄÏnehOÈ ĵtñhœË3ÓÏıéı •ë)âê£Ġ˜ììQħuĥ£çİÁÉĴL|á„ÜÉÊ%¨F›Á+à(ĞçµáşÏĈ;†żZ×_ Œ…Ü´‘f%ž·ZÒÎ(5(Ñ-Hâr}ú›(ZàĴTqôÚ()ۣ̈́Ëfé’Ċǟav™p˜ŽËœYޏœÀWˆŒĈ˜´Sk֞ êҗ|û×Ç×?ŭÁÙ?ŝÜ °ûD·˙90Ĵ@ŒsósB‘ä˘{ôċwW²×nš_"ċrj§M]•Éċƒ‰VÄuĠÒü=ÄoŬEOj¨|=PÜeżD1§Ŝ>1Á˙§'IŠİkQ=Ħĝ#ż·ôco‡AWċÈ´ó­ÌE§7ŜЁı‹*F“ĤzÀ5A£´Ï#Ÿ)³>UÄoĊĝoŬA\ê<Ù°û˘¸_ĞlĠ íÉÎşd ³3À×ħ#ÚĴí^ŜÌ+!wç)ß@“ ɲ³8(t7c3ùtŬéĵĝ+‘áoN”y=~˜Ù1§x`•ċ”6dîbŒĦ‚âœ]„B€ŭ§ĴÎo(›Ħ!ÚN˜ĤŠfäp4GG¤%ٚß?Cŭ…µ¤Te` O¤ûW Ô¨›z²PTĠĵó\ KĤ(•š<•˜ÓjÇ{ĞäÉOÁŸ1ق)˜3Ï0 żw}ò×ßŻè O Ŝ¤Ûĥ*#ߘâ4µĠJĦ†UBÒäÍ]–j3–OĤᘸÜÎ÷^ ú*L8ôHˆ{Tĝ@nnîI ‚:s.ħǝw²Ÿ‡3kĊ¤ÖD¤NġÓÊŜ2ÊüÛPYÏìûyÍjç$Ċ):Ö0I3[ş7µÚ‘ûÚ nÉ+;Ò)g„˜[ŬV½°vĴY6’²ŭ)Ż}8ƒƒžéB˘İh=7>9ÄÀRµSžÔP¤Oµužëƒ-×ŬŞç'ŝÍAUœ)œ¸˙gqXšç‹ĥ{G”ìġqşİĴYçeğ#öħFQNÙ½(ÍĊ4êÜC|`‘=f‰ıŸ‰Ñ/¸ßÌg£żĞ~>" ÔKM ĴĊ, M´ *!;v%›Ìdĵ¤Ä>B$ô)’šf?úѲ*AÇĦĜŝŽ–ñ7§Ż P¸áµ:|(l+ƒOSÖ ûa€`Ó>mV6J*0‚ĞY4Y8ùö¨xñ–ùĝ!ĉĞ}^ú<((@b­+‘ lLœÎ9ñġQ’üXŞÑ=ĞrğéK=o£ĥÛx䰞T1öŽÜ™kvj˘¨²CA³Ñ˜!­Ï |½ÁâÊ)êIêÀ÷w‰…L-GnHô´Óıöw:żo=éĵtüŠnÔwl‡:ġUkv)˜úŸ×WÈċ~G£ÜsQŠ÷Ÿ`d¤_wÊRdœwŜûĠĜşò~ġîè 1qOüÇ7]SĴ>í`ûì•îê(ÓŝkDkDÄÒN>ÔO‘Zc:Ğ{"ıß-uq oÖl‹s€TCĝĕžT~Şf¸ÊÓ İé{·Ò|L§C~G ˀӃıx¨°ê Ĵˆ‘ïš÷Hl{vÍñXñ6:ŒÛĦáÊJÔŜNŬ=>éş5ž7´á˜‹WͲĴĞiy™nC¸-iġwšñ6•‘Áö÷@‘…/·Ë*Ğ]]ÔÏàQċ<&; ˘G4ĵx{Q9Z ¨‚`U„鑸,­µÏ:ÉAn–tÚ+ZU{Ġ‡²ûĜïéüĊó Ġğ‘JyîÓ7ĞĊÉQu·íJz§ÊĴ°VôoğK~MĴo×ÒŝŜ›³IšjÏñг/ç›àÚö$Ğèŭ1ÓŬkÂÔ¨GËs„}‚úg6L*\DĞ×1£ ÷ÏO^2é"ƒêÍĵŽmşÍ ‚ ħ0‚·’°Ê!7 –G¸2k,QË.CÊ*++B(ĠDò§İáî7ky á3pĠë&a’ (ƒ_0³}*ħìÇê´ĊÓñÀCkĞO(˙ÛùQfÔĴ£Ïí.-ü¸ĉ–pcŒĉFì$€ĉżĞó¤m,ùçÒ?–”•ĥÊN̽KŻ>Ĵh‚oM´öŬˆd÷ƒ`~ĥEöà0ü‘…ŸU8ŸŬC›áÚ>oĤE Èh,œw=[Û"gzù×Ld;\%Ġ˙}È1YN³H,oxˆEĝİZÔs ·,šYc˝ˆg?ŻÁs˘„ğ oı¨ú@%66>ÇğóÔĦ]É aİZ gOEü˔€Ĉ˜@́Ğg^³5ùşˆ &Öù—üÁ+Í4ÔĴëVħıĵe'ĉÚ~LĦ÷üÁcOŒÁŸc›|c:bñe=]ÚlËİ#3ev˘‘UxĠ>¤ÙĦfKĜŽ"ŞĠZYgĵRœa“ĥF˘pžP(†·NìyGâ *'nĊEn'>ĉ"öŬ2ĞsÚ6Öhò• £&&êİ6×j)*úĊ2ĦÒġ?¨Úġ9‘ F'‹ŒRe–Ÿ~5‘/'×QÖS6zWÚy¤%ç(ğ·¸.,sñ6ĥÏü#ÀĠUƒü ے•şj¨È˘OîZEì‹Ê&PJDŝÎk’”kû( ġ…ÑÉ}T]É'żÂ;Ó"seŸéìáç ĉžġıôĉƒ —/sHn˜úA3e™żNœAÔ.'ƒf ”?úVÓ½lÌn( ½Á>N´ ½Áïˆ_ŸŠ÷Óí=oü˙t0˜‚ŽÊNÉÖP áĥ'%Q+<ĦŸö EI‰ĝµà˘ŭñ—Útƒ< yyêd5½ë~`)KĠ`Â\œK`ĊVÉG*vGĨĈ[=ÜġĵCĵ(Íħ>cÀ ĥy­rDS™ÂpĥÎı۞iç&ż&­ë’pŞä÷„¸áĞNàÖ7U ?`Tšú³œ+ ’1ϙ˘.èsPʘñä闤ÖÛZdî*ÓXċ08k†â“Ĝ2„݁ûŸÀfLO’˘U_0ż~.'AlĝöYӔS=DÇğĴFA.Dt.ÁòO틎Òé,Ö ġR˙˜Ô} !Ċƒ`}3¨(çĠ“ 1ĜjΉñ †’żÄĉ40(’Š%ñċşĠ‡–ò£ İVîîᢖFÀùcÁ´62 ˙(ßú0ÉÈÂĴd+əçġ;ĦvݨZZì%˙¨’WµäiÜqİżÒڀsGeƒ™ÌŽè\í+¸X+‰>YğüÉEb@áäŜE]¨"ZeâO^ïk¨&/˜{„ˆ†çIOÑOhŬ™+Öz‹Cz'AƒHm”4Ó:P³#Żuoܧm‹×ò]v !hÓw*vĤâü§Op·§Ş!ÇB›Ċ:GZ‚‹jĊ6]ôHPvÜ5c™ĵŜWġÈ ñ߸üÎpħ\8…‘–ñôĉ~dEÔAïžË Kŭv¤*YġĈÂĠŻ8> Œ˜Žñ!4x dऔ_k˘ny½z~hĜ‡-íŭ˘[ (=žÍg{8°ŭ%ŞÇeU)_/ßfŭ¸ÚHĠšh‰ÚV³ĜœÚÖÁÈIŽ*c†y²´U•NĜtKM$˜vÈĠ Ï'ë͞ „˙YMÉ)P.*1Ok—À­…÷­…ĦY˙ĵÍìŠàÚÍħ‹Y\"i¸Ğ$İ–>Y†Puµ(rmŭzŒĴ]vëCŞż — Ġ2³ÜONèéZânY;·:I%- *û„5p8üXyë,~½‚ħùíúюt¸“­ ġ4ÇSä°ÖÏ:rıH`gż"ĉëŻĞŜJŬhĤߌ9ûûükôğˆÊR†?`iżdŒpİ–eúkUöö(–ÄċÖ³\œÜ,D“6ÍSôŒ´?|ñŜŭĤÒsÌ&ġ-Ô9Ġ½?j]œÄòŜ”Í[+ ˜L(:ŻÛ żZ ò0W$ĥ:ÍX.ûâ3&†\ï˘Wxa\J| \½ù^ñwE7Á DFá\ĜÖ-Ş™°ŝz`Şf)pAŠdžCğ„™Ñüž‡Èŝ|ó|´{“dáĊeAP:%­oĉy¤ĵ=4£­¨ÒMÒjŬ€‰’–İ|ŞıŜ0Ĥc‘m…³eïäİìšĊÚP-˙ì´'Ážö< !'÷•ÑPòx£Ñ+݃$ÂÍ>ç¸ë:÷6›—êA'Vï]ÌġloôA°äq‘ûœşÚ7X™dÊ tŞ\yxXÚè5_:l7o”_$…kPs/É£+j{|× ŬhàÏà8Îí)Š3ĊUàAż”+¨‚‹¤ùÛ÷tĉÑÀË'3Ĥ„†0Ħ|ÄÑ­ŭ#À‡½³ôs·Šşê’›ĥŬv&1ĤŝJïR­-,ôÊžÇ$R~;WŸ“ÀÇïır1V:à)‰h&36Iút2WAm_aŒÜ\"¤´xİdĝJ]Ÿ˜ĠĞlŸ—ÖéSdn¸1ŭŠŞ†A8n›Hĵ:Ż~˘ñ~DX°ĝ×–"¨Ĥ ǽ˜G³²ŝÛQşİQJÀ.°çw49^<Â#ÖĴQùÔĜ}Zı˘WkŝîeÓÈĉu;Ŭ7VoÖ#%İn>ÀGa%Ş÷)^÷Ŝ]&%‚'ĝ:(xêmqÎuıG–£Ċ¸W*ğë³ö‡iQµġ›Ŭĥ+5 ßıùïŽl5˙úĤÈıφĤ”’/8íÌqށ>‰ĤÚ42•Íb0^ \>˜Ħ“è]Ñ%›V$˘42äĤ˙ìĉġVŜö¤Ëdĵ‘<Ȑ³ŭ%äÛıf¤ÀOŠżEɧgÓú³%w>T—ΈYD!î4;gpwMBH‘ĵ;aËĈ@P\€ŭk8ε˘Yyet{ŽŭJ)Ĥ9|ÒÔaJgôHo@Í)'ÔŻĥvoĜĊŞıúÔlyÁİ<”7z]pVŜÓ-c¸"mÈjßü9‘$Ö)'fĵ–ıߗQ53zıË<&ŭ$—0÷Ş$Ñ3ßoĊJt+ÂO°B˜’rRž^ÎÉ%FĈ1ĦĥZ‡œŬ†¨x|ıX4héĴŜĴ|'¸§ŭà”ó+hxċM•­ÍmF5MTú¨\ʤL$œAŝµâIXR•-CŞ=qD&™—ûbĜJµwÁi =hħĜï ì›ìjôú‚ÎtßBžŻ~Œseës×%îï*iħ*‰&Œx íVn³Ñ7Ĝc! ë¨M-œX›[(!Ä+ċÜĉ`°D7oĜñŝo÷ÇÏäCvâb}sİJĤ9aġ\Òì<˜™›N^ĉ‚üġ_™ĉ-š‡"ċÌA·>xӝ_†O·ĝy•'FKÜ" lêóDšş0ŬĤL] N½3ë PŻS\²³ğÉ̈VËŻ &Fħ³ÍZĴYêsÙ˘S²Ô7JC’SÍ0>ä;­d֘’ŬÒáı(˘RÔ>Y·EDĉG~§;×4Ai¨ÁÄ<ñGaW4ĉç@ׇbíqRħ'şkÓâ6\7ùöj/ĉ½„dĠ|‘˙0‘– endstream endobj 138 0 obj << /Type /FontDescriptor /FontName /JPHBMW+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 /CapHeight 690 /Descent -209 /ItalicAngle 0 /StemV 140 /XHeight 461 /CharSet (/A/C/H/O/a/b/c/d/e/f/five/four/g/h/i/j/l/m/n/o/one/p/r/s/seven/t/three/two/u/v/y) /FontFile 137 0 R >> endobj 139 0 obj << /Length1 1630 /Length2 16838 /Length3 0 /Length 17689 /Filter /FlateDecode >> stream xÚĴĥctíĥ&³ÂŠ“JV’ŠmÛĥmT’ÛĥmÛĥm£‚Šm;_½{÷éÓ|ŬşÏ5Ĉ3uM\óžc‘Ê+Ñ MD6Ž4 ´ôœY kC'E µ,CšFÑÄÌ WÏGB"dobàh´6p4ᨙ„MŒŒŒ8€ÖÍŜÂÌÜ@˘¨FAEEŭŸš\†n˙aùé`af ŭûálb´µ6ħqü ñ¨dbp47˜ZX™„ää5$dĊäb²*1{+€ĵ“Ħ•…@ÚÂÈÄĈÁ„` ´Xŭ[mŒ-ŝíö/–€Àà`kbdñ7ÌÄĠÈÄö5ÀÖÄŜÚÂÁáï7ÀÂ`fo`ĝwŽ@€…‘•“ñ?üĠ›˙U­=݇ġ_Û_0y ƒ£ƒ‘½…­#àoVyaÑ×éhnàĝOn‹żfôݧ1È韖ŝeû ó×êh`ap4quü'—Ħ ÀĜÂÁÖÊÀíoîż`ĥö˙*ÉÁÂĈì?+ Ĝ›˜Ĝ[™88ü…ù‹ŭÏtŝ³OÀ˙Ò½­­•Ûż˘˙òúŸ5X8:˜X™ÒÂ10ŝÍiäĝ7·™… Ŭ?ğ"ac 0˙[oìdû6gû ˆüŸĦĝ[„1ĈÊ `lb G' tü›@ŝÇ2íÉ˙ ˙·üßBï˙ı˙•£˙ċ˙żç˙ -êde%k`ŭwŝ}cŒ àïHŝ94Vö˙żk +·˙SÔġV3ùwı˙0 Gƒżc°1ûK =-ŭż•˘&ĈòŽFĉSĞż3û—^ĊĈĜÄŜÊÂĈä/·˙+€†žŝżĜ”Í-Œ~ÙüCËżM&6Ĉ˙µƒżtŭĞ~:Mau AŞ˙́ŭ—£üßEpTv³ŭ[Û˙èFhü?…`Vv #;ß÷÷· FfŻ˙MÊ1ü§,càhoá úÛ7=żş˙ż˙”tŝ ŒˆĝŸĠQr4°1ŝğm˙SñÙÈÉŜŝ/É˙:ğŝù_{obâjb·ĥ 4â ´LÍHsĴĊÌžÖêïe²-iP.Ì÷­öĝ¤†nsTèż×Ñ6Ns~ĥı-Ú~ìKRŒöbX‘ġ$›\ĉáySôċ£l’v°QĝÓé– ¤İEz\-J˙dW=Ĝ™TPÔ-~‡ú1ŬÁdsġDáKìœï‹öóÑÑÛ(>½ıµĥàôŒ4áĝé‘lpldx¨ç²o—*;–„ˁ4Â×.—OSÂ#’˙ V ^âvÀ@ù@Jé§ùž…IA°¨+NmËcÁħÂòxaúŸQşùsù lEzùG´ñ"ƒŞ(Z2ÂĞç"Û &Q8G­xЈŜŝ•˜Úñ¤ ëƒÖĦŸNÔúĝŜ9LĦŻ5W91ĴËşnéNğ¤HM’‘€MŒñѨôŭ¨˙—L(yá(ŽîğFÈĞ'z$ġZR5µ\nm:ż" ĠQ~P˘1ġ zżˆ"0Ê}%èÉY—FDÄU'5ȇ3ŸGWò™4Wóò’ü ö>™5Ĉ²żƒżl\î”yQížüÖâ‹âAT˙ĉ4Ĉ~§ ˆ ídŻŻˆÈ|ğY˘lçıcLJË_bċëŬY\mħġ"ôN,y BĤı [=…}ş²n;Šx=ê2FnĜHñÜ:+—=wŭ‰ŻÁCzîoa _­D²Âz’ Ú5ħeĦ–yN$eĤvıa\˘ĴÒaŞsO‰(}Ԗqw´ Œyüŝ²’÷ċž÷T)Äaĉvƒ—ɔÁ#ŜŒZËQ'¨kĤ’YHO ‚Œ@ċÙûLÜ#GҋFĞ1YÒŻÒşŬ<ŸÙŸ3B˙Qt´´ŭ“Ġžü-YIš#S9X·"){ydPJ…·ŬqI×ÍÖQF,ŝëmMȤГ¤ƒ6û÷ÚöÙu3`]@sÍ?ċĦ:`mYÈTíH†ô˜CmD$,@ˆ \Ó Ô—Cì1ŜöÀ’“_ÚpÉ#0‹ÜWşI=PHucĴ]@²ê­šĜôAmĞèý`dìÌİ\!·ˆ˘ëĞ'e@_UnÎĴ/TżĉWĠân‰ıUş.ŠlÒÁhşÎÉPXÏA%„ï̳˘ÉĵîïCÏwqP­Ŝhwñċ€Êġ¸m=ÑÌoaĜ+œ:y“u{ˆÎĉp°`…pĵ(qİ]7ù6ĦLHò4˜'Ùî  dĵ?ËO˘ ÷ĠSĞe,Rš;ñĦN0–,‚&¨ĉSŽ+ßmfhˆüŞ-~yZ5vMÚÑŞ:yIÖPáfˆNÀ¸ßöÒcĉ)›.3˜Aä1‡KügU$Öiìoêú¨DYúÔmE·Ôu³Ïċ:NĤ-•¨¨‘ Íë2G,çR=gnéIHÚÂijç3S¤5ħ~Ç@ŞÚµ&IsĈ^ Ö×LfÑ)bh"\[[²êµ ‹h–ÚûE2òcL÷Šħ3 N×6ġx&Ü´ì0Ŭċ*D?oÁ+0 Í-cŝĤtà%_GĝÂëNSÁ[ż3òU۔÷§‰éZŒ0~Í2Ëá…Ĝw;nÛêÀBL›nîĉŭy=*š%‚^ç A›\EŠuc.Ùq‘ùm÷+i''AV!ráZH°îdİ÷Ÿ;Ĉ=­”d´ĝÎsL\›ÓueÏ8[3Ŭ×Ü?’*Yĥ%ċ×:|™2ïŻWıOŬĠ°—Uxô\gé6…9“ŸÍ„Û…ŻY@ ´A²h$I˙’'UR¨HĞk„ŝ>Ls—]Ï uŸ c,/AZĴ8Î>v(ß5n“a{äÜGƒĤj°YŻ´ Ğ*Ŭi߄Ŝê –Ċv)§ŠQ¸ßs„-ƒ|•wä=×â ²)] eĈ_ Ïğƒż¤S4Ç'Ü5I$S"ó@ Ĵĥ0/~êĝŸ-Żĉn+³d¨eÎoCÉŞ3ëż°]3ır ĈğDşz.¤B†/^úÉ(0n{% •ĠûP hُ1 ?09 !˘™xÏĉÔğ³€1ĦPÁ1%˜ĥ°qoĞ‹Ĝ b7ÄVB_ ÓëÂVm8;°ĜQ‰ŝ é„ †á÷ˆGĦˆjl5–xix…áÇdP$äı÷ö‚ ¸ÂŽj‚Û˙dÖËİ’•­ßyšĝ‡nŞŭıÇq‘ ħü=×Ċ°§aEûĉ7NAëİUüĉıù[„ı[1—Óm@ĥGğħmşÉëJÙ3Ö߆‚ÇBF1…½ôI[ï·L{¤Ÿ¨¨İC˙(F)ëÜŜŻ´Y/LżŒœ¸ÖfŻRğ}£%OĵríX5Ͳ›Š8lÜdUêU ċŬ ;Ĵ6¸[ Îù‰‰Ĝ͢ììÌ<>:ÛwÀ‚tĜùŜ+†Ò9Óŝâ czx żH`ú&… ›R‡šÏı'Ĥŝ˘9#œÛp^?§E݇Ĵoĵğ(IĉĦì²eŠXœ|˙àŻ€Ç;[7¤§„J/Oñ5pï;lŝ²QŻŜ’Ħ[4NèMÍˆŻ …"aŬnĊ6VÔ{ĦLë$Z1/Lϧ›ÛġRé·ò²W·oċëâWróıMÏĞé)x£™JÌUiÉ ?nAWüĴJO$”×ÍEħ„qFË>…6„ +ëŜGa&ßBPi‹)òìWg˙Ċ#A†ÙÈŜ;"91`oû'†eùÀ™‹ÂM_Âä^—ˆ¨šĉòêċIk¸ĈÎH\ÖXĤe@İMvúÌî3/à˙³µ^ĠwÊ/ûZaĜQ“'OÛ,´yqù„Én‚Šĝ-qQ7%+ ?kI˵¸:u=r̔êT°­ıµKsĵHj K:˙jç^â{k†4äÛSèd8¤ÄSÌ@ÖĤŜĤH‘ĠAù¸Íâ Œg‘'xAú'ٖ ĠêŒ~ ËħX{‘GaÇX& fÈ6Z*Žk™˘ħœng/½6Ìİ(I†°n€uIÁVşvĉn–¸3Ĝo·Ác‘nîâŜFC5yĊTzäüs .1½ÄÜóïB”s;Ħ…Ì`átôĝcmJ^…öAıXlŒj^'’ëĥÓM‡vœulUAX0Ż&óxâ]ñ`ÓJŞ5Vü§ŝPJE ôt(MOĈ2à;>ĵħÍHu2Òìoá)½]–MĠ¸z5ZWÍyĉ^ ;½ ì¤sbԙ•rĊȂ=mJCċˆĊ".tĝìÄ"š³„9D‡):í]­çò³ÖLĤ­e#KSš+­ÖŜ¸(c9ÈQÊïŬÊÜ×D Ù@\\Â/ß=„é˘{$yasHëäjo¸|LÁ™"ÜQÒnrÉ%çò†ÚF!KĞ£Äžë —’@Ï{›ù1XƒŠ ı֌ŬÙyèÑoïb;ñDP`Iħú‘Ĉ,VÔߙċËüÎóĈéڄlOĴNÖFS5:äxzT'ÇħKX•q[QÖ1 :áùhşİ*.¤žÍ1֙Ċ­Ñw—hߐ˘9Â|G†7.„£C?ˆ Ŭç^0:1ğe’~zàĞe3Úëœħž{HŠÓĤ4Gpí9šdÜç˛G ó-D-Ĉ@Wö dqmÄä }Ù3ÑĝwÏx¤{ñ‹u[é úmPÏ/˜ Ê7³Pä™d} öFŭ£e LZ.J ˆŽ'ù{3•í„D?Š Í uowŸœ~ĝ08< ‚ò,F“~F¨xfÔh—Ĥç_Z„Ù;Aü˜şċÎü–›hc¤4*<žuL!7Jz—6g>ħ~ŝPmš›²mŠê*§oWb ħißÉAô?‰w~§'OŠŬ {#¸ħ~]Ĥ0¸ =Š ­%èÁkzĤJŭjˆ½o),a³&F‹°Pû([qËÖ\7.¤Îèĝ”´÷ĵÂGPb'jŽżŻn,àò(šâŞ1ï!SY4Úcƒpt%Ŝ^şÙÏ֋&VCPGĈŠŜTuzç·k}Ż_Ĝ.]R­³tcfüôhùbeOG0TnżvTMuwoQ9½Á˙Vé•ç‡#M9%óÈŞÌ$ĈvéN‰„wgƒĝݳ>3‰páj5ĦĜn”ÓŸ0ñÇ)pœ4ë/%÷%žż­½ˆË^Ġ ŜG·mdòŬÜlŽ+¸|Âù”ûûP5Rµšt¸X„TŻlÙ´nŞŬvŞy ÂŜJ§aŝıv˙aħŭ§2,ÄÊ×-2F@ÇN̽mŸĜ°[ ĵ³{i?V´& ı²÷BŒEİĵu^>gM,rˆšċšù†”ƒËÛ0›}ĝ‡•ݐ@³ËaÌĴ:—*Ż,!”’ĝğòv5ò­Œ|i‘ݳ.Cšb‡'0ûXĦäğü!cöÌÍD™°#QŞ’Œöï~ZƒbhÁšiZ)b5•OkÌMİQXmĴGá&Lı*^×ŬA°ÈoSûDóùÓ#şZik*aŒ½]ô×YĠŸìĉIeŜù˜qk‚Ĥ^u"‚’ grÌ˙Zè\%“%Ï_{Ce3{b<êäHŻá9(Ö$xÓ½ßtÓĥ|¸˘iK—Ħ{°ÖqóT„MTÊ=îyĤCŭdˆj;ÔéżÛ-fœĥ§{4kÈ{$&oĞž}h³§İ_~@;ìabڀóbb&0t/P1§Nħ ÒÀŸ'öşÑ qĜkBN³—‹Sëcu^÷úP[ĤRàjĉAáóAİ$HŻ4yĜó¨ív²û“†äşœ |ƒqBü'š>Ċ" Ċ^a ½ĥä˜J‘s.¤ ZxŻ%wéÎLšX£ şR¸û#ï•ŭ-mŞ;f’Dµ§*Ì}a›ġFYlNĊ+ċL Ĵ ĉY%˘Ï§Ûgô*ç%l²`Sí§ôGċÍ\,2§ñĊiŝŬÂÈŝ%;} y xñ³!ÚT&VŽíGĤ<ÌKÛ\"lÉıÍ5[ĝl²ÛLsCÙ`.òú£Ĉˆ;êݍĊq0yÛrcëjİ 5Ŭı~ĉÒË ^;†ˆô°öÊÔ^„]²èÔĴ/jßH7Çŝ}FySIÁô8´$—*†ÓÔ"œmˆ½‰ñ.ìÈïÏbߕg7`şJߌ`í`ì*â·ħ#“\7öBE{òŻm¨Ó·ÛEAô½ZDMü)oÚŻ@cáú›µ;IğS Ú`ÎNò½/A9>p.wÏĦçĊ –Ĝ…z#³ ċĵ)]|G£qOÇÚ~Üż"5~ĦÛŞÉV†9Ġ‰„˘†ËÑYä9E€­hĊ+µñÀEŸ&7á0!ù=ëĊħêĵïÜâ\Ëe-ÑsAŒLħFçï w‚=ܚQ‚˨óşm“ˆù}HUMWÔ2Zĝz"Ql [ôxù2 á5\£ÛÚŜчcyö²Ç˙$bÍıĈÍà:—XQ—zé€Êbe´!üĝR.Œê“Úv⁘YäT.vĝ HBS'E€qûRI´9vd¨d‘¸óçO h%žÎıħ<×À½áï`Jç8E¨G½`FÀâĤŭ}p½làr}ˉÊ+­”ġ˜¤2ւjĊ’GħÚÍè†nmeÛZâDŝ'à;ĜXK- ²c–ךH÷ŞÛ5_ŞğıšâĠ%nJ.qBLÄ 6­Ít™ÚC)Iĵ²Ñ°’/‰]àOÖ'KXGÊ4Ò·D“ġO~ĜnàħAW<ögŠŽá€[×zœkû>`ŻÊá"ÊÒqŜ5Á­–ÂzEA$­Ü%;úŞÂÌUŭFġätĝ<„ê5*³.EĞ ì—ê;ßÏO›a[°˜+ÌcŬĞ8³‰’j>2µsÍ_ÖÓY­ÏĤ“.jĊJ‹ÖƒÓ97%âH璘Ħ=× [ÒDĴ ÜÂŜ³’YíÌÎÏğ‡x·) ħóÇŒ|\eO^™G,ĊE˜Ĉ3şßñpżIäLD.ğÛĝ¸ƒ“ħgµRî “È hĦ”×ĴÒÜ5ۉÔN Ŝ@hƒ ·‘ü’†×tÌñŜq$Ħ+ğ-H\–Ĝ_ŝˆ˙qĥç.AĞ@Wòhb…żx9ŭucħĝóގ_û&;K ;lżĠżhÎâlŝóhi…NğĊİw·6½lÑ„‘Ġwò$IˆK)èœá”\÷‘P~ƒrë•ÊVášĉâ5<1‰żŬO‚ŽÚ,ĉÊ4µı9·X[äĥŜ˘êˆZÑğˆÙxÔßÄ[CÙŬ³;}RŞOËdh³OÔòŠfŬBù݆7ğcNSu™XĜ:žÖŬ‡ĊŠDáöDŠĈ–áó‹‰5Íió3v1˘D—ŞG7€·ì­ƒüóçŝŞâN1òBA?ôB?& ?kÈĈ'!{„>tĜÈs5FmêĞ:˘ ÷„Aêĵ½‡ĵċŝú ÑŻ°ŬğʕêÇoà/!@QŬ9ÀZo£#X|á¸*Ż1x£òÎ=ÏPn|Oïî˜´SŞmyÄʆġpi´eL 8+ĤÏKOC<}qo”v58W”{ö'ĴĈĉw!.Od-ݽ$î–xDFÁš€qü~ÙwzġŭŠé„¤@6B5idËÀ‘[3[4\ĉçċpġF“P÷&‡ċ5- h‚ßŝÌ|´|#‰q³ê‹żĠI3ùSvÁ%\;ÂpÖş?^I™adoiĴȈWÂkûÚ?y6ùÒ¸‡t ÜÍÔâġu‡avìT-$ı1Ô7鈆¨Š@zN¨ñ= ˆĦ.UŸyj¨ÁL k@¨Ü‘*}IUé: ›¸owĥÜ<8Rü„ŝ³àŬ´{²ìöf™h…Ñfp…]2+6Mż-I\û˜g. ‚.ú6/ĈĥŞeUہҗ~·İl{ğûè68vpûAF£DïĝÏċ(—ĤJŜ‰Â‡D”ߍAòYĤÛó²fÚĠì·ıP–}D ~Ç6#!0½˜­Ĉ8ZŬÈ:;Uӌ¤Ġµ%µG 4î>eäb?v£òdHŭÙ!&š‘AN~(Ñú‡Ûv<¨Y ‘JUa0vèOİŒó…ˆÀ8Ùäè[b‹˘£R³ /hżÊ— Ç!Ŝ£†eŝ[â t3Ġu²#”Ѱ–²[q&Ş*„óÜȂ O…Rĝ&Fħo…4|[Ùñ"‰œÄ†îÛ}Rşżê‰G]#ƒ#bu•–“)‚êĉ= ¤ÑOB~1 äġµÏĵäqÍ4ĞÛÓkM~ Z⧅xìĝ G–uÇjë, *H÷9‘ġJ”§îqXŬßš5]˘ôìmU SözĠSlìt“tÏÙG˙1pž›u’Y¸Q‘Òûµ™µ8 ‹uìÎÂÖ °÷ŭ8HnPž·çĜŝg׆‘³ ıÌ{[Ġ}ı…ŬçNIJ’]ä‹àOÚ}Ċ~žh6íĞ3¸Í/P˜ÄĵoÓ3ÀdÇC6̗"D"9ùÜğËRE\ÔÔĞ÷?£.BkŜéúé0́opܔäġnÑ>ÎĦ×çÓf²ö‘?&À܈ŽAmšór)v °y}ñ-UÇK4/]tUĤ\4ÇgÔϨ•[‹eÈÀš0 ĵ)ÌWFâĜ„.ʘçÒ:ŻÑôz—×àŸuòòż?KĤċ·j^R÷SAĥĤ· Çú@nßd*ˆÛŬֆ›|Eu³ˆ>8!óñ<Ħ ŭ¤uċ=R¨üĴŸ&\š ?X£:êÔü£›*~ĦhŠ˜œ“9-Gû–úҋgZämċŠÒRÊ5N‰”aċвíâġĦ½!()Ú9lúıAŒO¸`ĝ3Ï$Zg §îöD+ê‰&0r²ĉžİ9Ŝ4RŜ{.)ÌBz,)`ĵ•\‡“ïôŞïxaaMšş9Ôs ĥ2Aí ÑLAJĠfd„Úñ•€4‰G\ÇKÈ?ñ脗"Ĉ'àèsÓì[‡/WŽû÷Ží‘nE¨,ˆ˜J*:Ğ£Dz˘–ó§ĵ8ĵB E&“NŬ¨Ñŭ´1{ş2=ŭĊœ”ÜĠÌ}$oüÙM,oH%+…ċI6ŬQR\‰y­!$ĦÚ [vşáÉ˙Y 9m§à=g²Lžl²ħQEEox‹“şSÍ9XJ§8ÁÜÊÍܵëNrΝRÛÇUBíĉA Ġì|X~è­y—7£%™ÇlÛHg§"ÓM‡”ŸÀñ Ú·Ŝ&Hıú(^RùĞ߃ûéTZĈu µĠĵŒPïŽo½Ê3´œĈş!"wÏĜ(iĨä*Ù dñ3#ŻLƒìÇ>s”†¸áMY²“{Ĵ7è¸Ŭ]87ìuÙBâcn™¨IĤÈŠÚħta9êìĤ âx#x—)Ŭà“"$‘‡mŬ?çŞw„ßàĠqÇŞàßĥnĞNŭìĈĈ‘—Òɝ·èBa5ÓMo8ÒżĜ†ĞnS„äĉÏ|]l ŠËÖ -{@ôǁ›çŝJĴ’uÌ2×Ğjn°ĴĤ6™‘ÀİçŝîâażóŜ#Ùï<›é³q˜–0#oraâ€rG„67²ËôœŜiöHazwD1-ĦüĞĵbxñ╝ħTnrʔJD)pϛHÊu÷¸<|ˆ<‡*Ìäğ6,(żğU—q8Š˙„¨ŞŬ XiĜ!—[§ù-·X£"e1)ž£ù\ò5~‹y|¸)­ ˜Ñ×ô}‹ÈıĴÀ°¤?˙¤<2‹\:3XQp,ûEQ;: 3VégĴƒSĤúùŠM*ĞfĊcž“pAëäa4Ŝ·rŬNéÔâ2ıW÷ÄqC˙‡˘Ħ ž´$*‰×Oa[ÄÁžÔP€Ñ촞"ġBn÷˜r7‘ß­Á š‘G…~$ÏÇ9N×ĠÂQŜ\‰>fÊ{T +exR"‚ePv2éŞ<ç‡à‘ GžG5Ê3>>>ššúñ§G‚8°r£żÔĉÚċ$ĊŬ,@~Ëlĥ‚ĵ&eß4ìŸpB#8 =f­ĉĤ(x%­3›vŬ hŽydüĜqë%r„$e{]êûlÓğ‘zhŽšuı‰•1†W}…À3™—„g–†–뿝ÛBF1˘Ë] MB}…•RÑò ôlê\@%hG|Ċ`\¸êïVe –>°oŒ{í-yv˙şğTPáar=ż£ÏìŞ§šfbRšĵrÉ0adSGËŬJ½Zs gÒb}ìkí•ġCâH&9Ïxûŝ#ÏrP›Ġñ °M+<§’“™kŻ”­Ĉµë —š$w ´2}\‚°yĉ@mp~ĵßȐè¨n"4´[›B÷Êċhl‡³•<‹>Ÿ: =.0Ċ*ĞçŬóç…³sĵš´Ô5ÒZɕ‚ê< @óCϟg§ÓsŸm¨‹kÌڋ·—SZ ÑJġŜ‰çŽjĝQÖċÎĴ֒ôO $½à`µĥn3Yŭٔĝ¨vzßúâƒÙ-იXGˆ9x*Ħݤ\À‘Œ9FĦ2š÷÷uH`ĜY|÷5 4Ĉ“HŒiwms~²ßDZ,É—RħÈâ{ż¤ Gs“ŭ,Tż Ĥáû9^_Òs%_^˙ûƒi²ĊÎP§ °d*êc:aÚ ĉxÄŜhóSvÏè„ż2DVêIYn€°(1…*FĉCnŞ·6ğıywU‰+2rzŬ)=\X^gAµüí–ZĤ@p#–É#-›Ñĉ½ÔUàâ•Ż§£kĜ‘Jv˜ÌÂnô’ŸòñrlѰ ĉèï{ú:I † ê~T“áF ,Wĉ×C]" Ĝ”ĥCUWĦMpıÈá1ԛMA_ñ-"í4€BĤ:׌e:ĘwXğߍ(U*X@ (s*‡ 3ˆï6uW5µ1†s]Ĉ’½G d›SäüDƒâBÈµò‹t7é8<ÓF~шbîŜr{_Y™o[Š”ž2ê΂ġVVU$_ÊrŜ™Ú˜΃ä:Ú(Hĵ˘ÖÇ£Yˆħ½Oq¤Ó†#s*FƒŜh—o&ÏÌxż•8AB‘BP{û “ÚêĐËPı$3íş,şÓ¤ìlêrŭšĉÄ2h,†Ç ÖÙğ:è12•9€x‹Gas;?· I“MÑĝ~Ášµ1ò W·Phóڋ™3Ġ+nèz-h„2yy´áQO)Ŭ.zßqmħç]ÛĠµŸ xjLö6Ğó£!ş({#!´j&¨¨ż…¤f„­ÄŞ&/]W¸wĴSO1R4èǗ }ï³kùıbUv/ôKZâŞFŸ?—ϘNç@ŞNĞ\ÜÖş éj& ­ÑF ›ŬHòvkéS•İ×\ı ™İÖŭŒM‹³\¨ħ´: ĦÍü&.ëû¤¨/ŠżVy`(Jùuŭ|Ï[b1ò;Ü7ô‘=~ATĤ£ä‰2™Z(ĊŝH#%·\;Ë+b),ĵú…ížQ)Ô°Xd;Ÿàt8.ĴŻnÀoAê •4Rbb ä¤ïȅl@ڍĴ,×w3ztŭ,şJŭl˜ié€áá}>uúwŸYÖp; ˜²pÈßlĞ·böëÛĝÏyv°âTÑ ĉöJèżoŜY ‰G ÔqÂû;ıŽhËÈñH°"˜ĦMb+ wU_î–xBB—ĜuOhóĈà’öħNŸ5(şÔĞ+8îúŭö?Şâ}xv˜Ĝè¨s˘›(™Ĵ|ñÒx@TZáĞËaW3CXĝ$ĝöûí÷CNfWpİ VÄŻX’&fş­FuĦ'†<óğzxk{V.ċ£ê\µ#ù†‰!`*ûeú/Ŭ ğù­Fä†Ï[1"ٙœĥ&g² ÎEN³­Ĉ4À§)`9ğÚÇÑË­…1ŬDz…¸úBż‡EŭZħäB7°ĴÁŞċÎA:ÖĜٸɨ•¨èJÑEQu#3”TŞŒ'?aÈ]™18ñÊÖŝÖN6ELRžÙ–cQ·Òh@K7û‹ê& ´j/J#êĦùîŭ1˜‡LË7_\š`q<Ë5*†ÛPĴŞ>S~qígzaŭۋŸü—­ÇB†xĥ² £.…Ĥ'ĞDYÀš²Ğ˘ÓùšĦï 6úÌètĜĝžĵ_g@T˜nD‡êò.6ìŻıíœÇî:ѴǨÏħĞşÀç22żS˘H:ôŞôşßN t„…ŝöĵ+\×ìÜúdÙ)²¸ğĜH)ß2ÈŞ ŭ4ĵ•ż€8ğùé”!:ĠCeħÀ½Û<Ñ9Ü<‚Á| [ˆôKµ,:€šžôRƒ†™_<ž›{Ġ€ñ“`[-<…ÜÓE5£Çˆ$~tŠâ0ß}§ñĜ4sh&_ëMDÉuH˙³ù8 Ĉ#íğ“ż˙ ^/g²‚@Ċİ´q6dˆƒpfàxu ~ä­h½‰Eĝĉ ħì]PòĞ2U4GÑ>€aħĜğ֘“kP[¤ÔB!ŭĊœĜÖêħĤöm:‘ßJì›Ċ†X;=ù˜xüG”ĉ66ôž‰gĞd’ó'Ĝé+ĥΛ͖ Do?.˙&ùùL=âW6xq/Ŭï ³Ëj…?‡tÛ÷qtAŜûñûÛBx\qıBE(îÄĠċOÁžùÀ, dMèÓ·>_RQíKÙ&ȏÇŜ\2NwÓÏ[S=Y <À’žŻ) K0…Q-=->€L$¸bÑJ̅öüÛ ]1k; !W¨3c~‘ŻûíöQŻßÉ 7×ɅĞê1šcĊTµ4§ŭ7 İÖzχ?˜˜ó6„l]ĵħ>óÁqIJ8ĠŽ4Ż2çïBżƒp‘!=Ì?ŞDÀuœ Š—¸N3‡ŠğҊ˘\­˜6ŒUì÷/$5ġñÙ(Aĝ6t;[ÙñŬ‘ePŭı¤­Â Pdy‡ĤiÁvTµ’PA‘x7鄌(?¤öjĵdÍżAÄĤy@â5ځƒĉNlÓAÇe‹ADġqolîĝµßk ĞĞ/v ßqkqċÇŬ{Z €üj£ş ĥprdé˜êš·ôĵ_Û£E;JÓ‡Ô;İÈq–dPÑĞħ™üú3DìÈĦÑ>XsáÌjB|},Ä÷•â& |͜öÁİ(¤zy \7nċ§úçŸÍ—,eġ 9…{ËŜoÉh†X v¤?_…¨ÔşECtL<ò‰€DsêU0C1ËÜÂp7ŞĵXŜ­€Oĵb`‚^^ŝŞÔÍà/K÷I.ŠB?ĵġ§V´vy݉³ğuĤÍâÚŬÍ:ËvÂñ§Ú8Ġ‰ 'D­O°ƒĊŝôoÒôŞßE?^ëDOΠÉÄç_ě*5%Ó'0›ö̂ìHûK;e.ÈâËtó>-I£1rQò–dŬġnŻF·W_tvıĜ…ú.Ñ>çşâê3>xç´)–‚úĜ²ílsÚ9Ĵ6ŭü…yqÔú <*›ĝ’žjPÀÄœŭ‹câfïÇ$cm@75Ï´tBvêŝ-qOxû”PI wr͑­Bİ´rÖµT:ÁF˜;ÖRžĞlŬažĵġ:ޤ[–ÍŒ ÚFâšĥ¸'ĴĤ¸Ií‰l̐ü³A ŒIŠN$8fٝĞ;sĤÎ~œé,ş­Ó;#v‹·O¸Zĵà§ß|1ĵï˘ïEyU;0ÈĞTħ4?Úp.ŬÍŝ\’4żÚ}ËĠu}`•ŜĴgşl{ÑO-0x­Ë{êҒ²¤cž ۊ’H”퍀ÌÑĉ?ŭ”ŒVGŞÄ¸of/úÑ5Ġ*FŒ~N 'ύpp´úSšŻx?½–³TŸü'fΟòˆAżÛWE]K\şħLìHBÍñôjô×ĈÀàEï£ÇÌĝE Ó<ÌE·RƒJñïĝÏ]ˆîdĞrf=öÉsÓğH‚ı^5Gğ¤óêVĊ²{"Ëŝԛ^kh*œ¤ħWşŻJĴZ›á?”o i[“œê SŜ2g癅­·+\£eŜ!Ŝ÷c)cq0ĴÉúômDœäú…ROcOX¤îgÚĊnŭâŒVßJnktF òìóˆîNŬDĠġĥ šĤŻb˘9)Á˙éO6ú.X×X&]ą!@úíöq)¸Œe“Ûxƒ ĵWğî->6ìdĵŬ²ñˆ”Ĥ•…w~¸MSÖİ#?‘ (2Rj†âúGš 4oSÎMɃ3fj…܇`&ÛĵƒL·ŝpMFğj·uÑoöƒmċùêŻŬƒÈĝ#Ħg HhÀj>@Z E¤Ÿ½‘jż_ûï8ù•"vFXÁÌw80*§ĵŸ²|vż?bçÔV 7ǎı²}ŠĥµzŝÎáĴ·hŜmßÜ\÷[½›yF™˙À Ĥ˜­Ù$‡ÊbƒĦj|ÎŬïĝ*)''‹û@ )ÜàĉXç pĈ^dîĤ‹ÌkŝIxĠ\’žáQÌ?Ĉ² ŬôÄx¨TšÈ§Š^˘S"bÊ ]JÚùëO£*R-À˟1*ÌGÌY×sî1•ÊŜYb•tPQNBÓĴ;–­‰òržœĥ?hlj½˙—éVÇ#1À2Ò[T%³£;"Óédp‡úf­Ho–_ğpC…Ì­Ġ^äĝɚĈ ‡h›@}ŠŬş×=ùͳŭ› CŞ9˙ŻžİßĈ&ÄÎ>dÑĝžVNT¸›`ê Âm µùÜÑÙŝœPK$Ô Ħ-8 *y§ á;ú!òOĉ‚ WhÚgĠ4kÂvÀ@1?´EÀïvœÑ[÷ù›A·`•ŞM`TACÎÂĴšÙ}ŒK‡:Ù~î9¸`lš!$3àŬä„b5š5ôuÁˆ#4?µoôZ‹AͨÂ×yHw=³ĝZĉ^âÈG-žxŸ°y0LßħuŠÒC„sû²–şŠ,öÙ|Nîjru#–3ĜôċÈ!¸(ĵŠ ˆWǁĦkĝ·¸ Y3òĵq†ĴġFßĠ?Îd96k÷5ÑFċ˜8ÍüËüç鳎DBĠg0ÎíChS'ÊéPÎ/µJ½iY6™tŬ'Ü1 ˘ÍäċVÈPÔ0X‰% !ŝ„şv15“ġéĦÌÂ;Nê9ڊŽîÚĥji27ĉò–êÓW_Ž_WĞChş†qĜ&úŬGÀ§žBÑŒr"˜#3Ù:Ġğ—<óĊ‹zœSŜr{\†ÄĤ_òŽĥÉ”RR¤ÉĞt!fF[}U<ğşÏ¤(mŬ˙Ĵ^İ^Ġlqö1öK Ì2vƒxDïÍ^ĠÊ{'ż'M¸ŭvĥqÌ=ŜŬş/5Osà}•ƒ¨[ÀPŜĜAúóŜ¸YDàCÇMŠjW‰;ċñZS3bâösILJÎŜÍq\–m ôĵ¸˙hğĝ£Wt*DïwÉÈĉ0Ñé¤ùÑs\k2´#˘İ{•2X׆tâq‹>ÈwÛĠ͕>.‰ĝA"îWì_‹ÓñR!A*MÁ& /›|ĤD1~=[ú$ĦŠÁ•´·Ï+hŠežf>&2q:†( ԉfS¨BğâÍrášĴÍh“5ôö¸[| 3êQ_…%Ĵ°ÁûĴżÒ=~Ú˘ÔInüÈx\ò‡xFOîj ~Ĝ üú~֕óµ:Ö\ĵHĴ§q’˜Ĵòk\ĤñAĴ‹ŭŜ{n ìO•jˆE‡Ò@*êï™iĥ ÒĦÔ049ğ8rZI‘öR5ei<ì}ÄÑŻD26–Dzğ|$ ßóK‰×‡$Ü<ħş{ŬÖ§tôÒĉˋTž0şCeW#$ö+…qÍ΄úşù­ô$dЇÍħòÚ6’÷²v„ÍĞx³u\wDYÎíR L~’cdŜġ‚×Îħşc}„ÁD…ŽqŠÜ)Ċ¨ÑP5ٓ„ó}ü.Û1•ĞxßĠžÄt„”MÁz{gÁiÄácµs1)˘*|aÁ"w%~ħeû‰qÂ,Şç/#ÇBc"6Ĉc™VŒöLyNF:ó|5ˆô4LŒ›ìçI"²,ÍqMşÏ_ÌSµ'Dzx.[ÑżK…O‡(ìúìBWo^tù ú“xşX­ êҎçzYWXşÓ÷ցÒî’@ÚïŸl1y/’‘{ …XtĈB"3EÀ/óp dTŜZvİ&û6ˆ6óŞä ÖàŸÌ È ‰Cžœ 1ÓL·IĞßZ½…şà|ßâĜ‰{–-ni ÉÒ[*[´Ĥdħ#sZpÈ·KÌfğ.3êçÓWe;_ž >„ ·6²ĵ€ĞGeKç ĊèL&‘ĵQÌ]'óĦ]b÷Ĵ›’Ċ…C§|“ñ8J³ìÂòÁ½Úf¤°M|ˆùs8ñˆqEžl5I Œż-SïŽó=wa¸_`ŭÔ[T­oqßרX@ÂàŬVkEŭñ3;Ó MBc…Ĉi‹Ü AJŻ7ĠĊw{-Ú­BSL_€•\ûħÏ LÀêshÄŜ ħΕ”›˜ï\¨QíÔéŽħĵĥ GQhtÄ BShùŭÈK‰ĜLëkŬ˂Pî;KúÎ}ÏÔϞÊĴ½{MÔg ÈVé>Dj;$ÍL]ħè>á‚ùr3qyĦÓĉ~Q)Hgìz½”Ĥ[ïí×DĤŝ{?ĉ ÍĵÜx,&ħsñ}~BŬŝáF4Ħé´ë¨?ŝ u]h‡à)xEC´$>pŭùò‚)’=–ßÀäΧ^ÍĊ ßĤßëİGÑM‘]–!ştÉi&Ál"ŝ EàBKZR Ò tżDlsĉWbïé“yvÜ^Ĵ蝞À÷ĦvŜĈßw <3bÛ|eÉa-G›hOt(5´Šnˆµ›lCÑĵ£jĈ²~jZlF3?Ĥy’ž}p€{ ıU|´§y²6ŝĝ¨g“ß­86?_-žÙz'I·ésíßx­Ïs ôg\oİ@ _Ĥƒ‘ÛUNI÷·“mĈ½Ĝ×(c]d#—eXñ€9w¨‹\="ĊEDJ†ŞT‚’:u7ı BBÉŽ6Ŭ‘'ŸS'b–ÍLrwó€]ö-„¨·o™Ş(işbÂW4u<żt›ċ`£ÛIŸéHĴÙ1ŜÇfú!Ĥ¨@`Ñŭ VžC'ċµP@BŜ7AşRUÒÛçBkAŽ-î̏`Ż,ŝۅYŠèJì,ä[¸Jğ6ŭÑqRÓ͋bG\X{vOtiÎK:x‰°EĥBŝĥw*Dr/₢;‚ħÀ5w½ŭXⰏÂ’ 7Ž7ËñÖşé?~üK­ïä˘wҝ§<ßîW…Êv~Œ\ù‚Ŭwħ4Bġ†Êa|ü°_ħšnßè ĥŠĉfŠ’eĜp›˜uÁrm&‰G$}Y×H^žİx„2¤ ™ îżÑ0ìğ˜É›.Hn6íšúĝê‰?.Ĵĝ%"ó%2ËĜ7ċÔÁ,MĦ”Ġ[À ùô;@}K½ÎíÓ ċË~žıħ9\ñTerw şž‘Rü!­Ġ˜Díè°ık]Ô÷íoYRÓ5ìéĜ^\YċÑO\pÔV7Ĵ ‰S û­)ëNSNĉ´ĤìJù a#`‹›˙]Ĥ ÏââĉgÏUÍhá2j¸çx}C°*ĵ—ÄÓòIµÚĉ>F"¸ùrÜ/ôéH­8aÂÀ^ò9šhAvôƒŜY7ÔTY7ìBċŒİ½ôE‰FİÌŞ`E8İmÛz ŽÊĦ9Î*R J{ŻĤüġÎ]|½¨0Ċ'ù)Óhcâg&Èf2˜ËIöCÜyJmû fè^aíœ[‡ó“=üÈ֐Ĉ–fïİ1e €Ú2˜d`Ğ‘9bĵ†ĠĤ˙hËöĴĈ#-ĠÖҔj5ˆ™7OJ£,ċʝişOÏ&5–Í}ëÙtġÂCŝşU_2H0 ğ-ŬÉLÉážä˙Pôҝï@!ß|éĝ,ŸÈÖFż­2šho›°_›îÚUÌ5¨€Ömqè Ñ.DíĝH|–÷Z0ïĜ/ô-”G†UİI$ż>Ö×£Ğİvı·9UkK`ĵkÀŒŬµAíDçü뒯ï˙vĠµsµïQb›&ûçùîïöd,Ŭ—#EL#f0ñ‰Á€ĥĥï[uĜ‚њɠìHÒgÔÏ\ıAéDaRE¤gîakžR•ço˙H…Ô\- İyXöñ6šèÈǎӌei‚ˆ25ġÑиòıEQÚ~#ŝ]HJ~K¤3 ›ġ‰£ ›fċ^R⢘·´ŬVJmÁ% ’íŠĵĦ 0ç/İ1 ':ÔL#ħM2Œĵużż3ùĊ>&i5\/ĜŸ‹mJċJ¤í]”Éú]„?<ÖtĜK.˙9Nךì”ôŬT&dQˆRħ”Bv“¤?Òç+ùÏS*ԓöÀL2ôğ@òˆŒk%r¨íPŽ~Ôç*ÚçDœ‹š 0l \ށ-ÚŠ’já‚TPtıg5*‰Şİ÷)7‡ò³'U‰˜c˙ħiŠ]Ê+v~ݧ˙WT/5QÀ3wÓÈĊaVsW4~(Q*?ëÂHcĞÒ ÔŜdċÏÍїç6³^hıĈ<ç: endstream endobj 140 0 obj << /Type /FontDescriptor /FontName /ZEDXYB+NimbusRomNo9L-Regu /Flags 4 /FontBBox [-168 -281 1000 924] /Ascent 678 /CapHeight 651 /Descent -216 /ItalicAngle 0 /StemV 85 /XHeight 450 /CharSet (/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/b/c/colon/comma/d/e/eight/emdash/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/o/one/p/parenleft/parenright/period/q/quotedblleft/quotedblright/quoteright/r/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) /FontFile 139 0 R >> endobj 141 0 obj << /Length1 1647 /Length2 7792 /Length3 0 /Length 8633 /Filter /FlateDecode >> stream xÚ­UeXl—&¤ğÉ!KBş¤ğ;‡†˜JJADFBş¤$D”N$¤cÑwżïÛëŬŬ?ğߏ™kžs?ç>ç<÷9gĜ™ġ ùa É'Ä/( ğ;x! `î:0 ->³—:Ò¸DñÙٕà {$}bILAŽ€' @X $!!ÏP‚yĝÁÁÎ.H§ħ)ïż,żŻüŝÜy"ÀÎPÇŬoĉá‚"ï(ŝώ† é8! €’žışŽ*€SUÇ  ‚‚àwEèy9@À@€‚"@\'ù렎àß!ĝï¸{Âßı| ß/Àw#wż`ÀnEŜ½C/Çß Üٝ`ò€în¸ßawdz0„ƒ=€ğ¨zOTŝÊébüƒ0§ğ›Ž0 ×ï’ŝ`w4w(Ò E _äïX €#áħ÷ğ‹}Gĉ˙I †:˙+^älw„€ˆ;š;î߯óŻ:˙z{ˆßoĜŸ[˙ÌŒD€ NüĝBÂw1ÈğĜÎ`(Àï~Q‡:ÁB‚Ù½<ŝyƒàˆówÏpŬ%aïƒBüŽ '|ò.$€ó˙Ĥ2˙żOäƒÄ˙˙-òŝ˙ÄŭğF˙eˆ˙żóüwj/DÇŜŭŝÚ3€ğEcÜí€à÷²Ĝżĝß\íŬÁż˙Íùï·MAeŭŸœ‡˙ ĦuSˆOH”_ô/3Ħö9ꁑ@€“=äîñŝĜĦŽ 8 Ŭ‰üç}ïœ˙†ı€nßjˆŝ ŽŻáN·?Şê¨+ñü/ÛöÏe½ğ@ùy€˙ÉTĉĝÏo*EE˜/ÀŸOHLÀ',.x7Œw(!,òìû‡Hè_gm{$ì °äÜ}˙óŻ“ġßh”Ħ@˜ï>2DÚCïZß0 żSüÏ6¸Ğüç?Cù‚€ĝ_f`@İp×ôׯUÔÙŭ#O,ğ;…0ûQok ò‚+`AéQËevW•(ŝş1ɛfżOÛ×ë܃÷!;RA{ıôÏXışòÈ8ZÄy6BlŜ½Ú1}áż?­µtÏBLdceDßÀĤè ›aĴċw˙”+˜Ġ;/˜’íă8˜V󒪕´ĵ*{‡#iëôäaï@_ÇV×:ϛ—xìRŜ÷ˆ8ž{Ħ“³0.ó£ÖŞ/›ÊèŭŠĈĝJ¤+ŭíyó4Îb›Œċ{ÌK³Ûù-RšZëր$LV˙O4x7ÚQxhĠ{5bïŠŭ³Ov6›“‹ÍŒ(ĥ™ĝpY‰@ëúyĉù—Ÿ•~á\j1ŝ™pĆûQ°Ií"yĝÓ3† *ġ‡êò‡ĝèIÏòÍ?•?4Ğxzş˙ÒǜĤ¨ä–"Ğ˘Wïdze“w½žĈ*bÊžşÒ2(ĜĝLERUŸŝ6ù:x×W#Ž(Ñ1ÙĜGŠC6"dŸç˘vÌ/#kAN•žèTôç3D›G5e?ZGN£"6Ó/û>9üȊÁە-cÄ`ĞtËqämÏ#MĜ=ż†×&h3W?ìżUĊ¸çÖ"΍Fħ\–ü³ÛOĊìħç$ĵCp•…´ŝÖRŒÁ{_ŝ%ĝCçt"BSÚ-K§˘¨¸Çù*#ŠöòŒüeì9ù(-şìC&?çHˆK…–Î~ÌāG‚)Ĥ–“„FVËċ™ZP—ïNZWMÎ/Dù—ϝÉ: .„öÙÛ}#5Ë|qĞâ7ÂÑJé6Qž.KìAËKÔWŠ ÜÄá—è$tlÉm›şÜíLÎZž]¸IQŻl$dŒVT¤´Ë^TÈ äL\#ÁҝĞíËà×éVötĝċb–y“ˆw¸½^d0Ÿ‘Ao#- ß÷œ½Ê½ŸSoĊ-Vü û{ŒşŞX‰Ù5³ĤÍ >Ĥñ\(°ŬgĴ틢I÷ßÑ~#bġp@!{ÓFͰK|–eM÷`ıóÁ$ N:ıùV6İ|ŜgÜÏ*ÍJ Cĵ2z³Žkò|oìÚĜqßċğ²e`5Ĵt9ƒ•F{Ġ•{b]=Í[–Ÿtï ™ÚtpîöÒşâÛD_ó¸ä#£×!ñ”ÒSWv]SŠCJ,{]FO—ÈECOŒĞñ}FCw¤Iš:Sħ—>²tĥ°İç…—aħÈ+Èíyż.+ŝÀòġ+…únoI !Ê·ásmxoŽxħZèÖ´>iféj£z&fĴ‘qxħ‡a÷÷üzñi“6§=¤°U‹‘ÎeĵЏ3’T“ġÀôŜ°v|vŒhɓèC:}yá£ËwÊ`ü}I^"ên0PĤÂy€â&'Ħu żÒ;g‰ET¨‹wħG}RĜVÚÓµ“ƒKxĵôalC_ĥR6^Şìħq$’ˆk2 ˜Ĥ}44c"“ÀġŬ;OÑ÷)ĦxŸ Ŭ™aÀĠ:anh˜şN0QúR íĊ‡UdÚûñĥ€™Ë:ĤÓ;_—éà%ˆ!aX1²–[kċ8ˆÀoĴoÏÑuuu)dĠ7ż,ÉĵĜ·H'A6œB“Ŝ°’#XŞÒ8Í˙…† qhP;ĦômĤU9}ŭ{ڃ†â 9W"ıžPó—Îñ'Yô鎇VĞ™÷nĤ—Mzßô ˆ˘ĉÖ4·$Ĥ kĜ)ßèZĉ纪°Ç7r„›­ HÜï•ĞÀĥî™SPğĵ>WĞ{–£‚CĴ²ŝžVnʸz‘A˜ÒZ‚M+„„^§ğ?ħ š$ŝ‡ÍIÛR|ħiAŭLn{YL ż:…¨h/Ôc şİ½#&¨ŭ[,(zWAÈwċëhü}%Ҟuĥêç_ϛc‚Iòm@dƒu‡U%ĉÁötékeä½ËbúYğoŸ5tCµüI›8‘•xÄ^óËAÈxï: —_ÉF~e)şBùêöËü€ÖœEÀIšSĞžÚˆ´i7ŸÌĵ-Íñ-†<’C3<ÓTy–.Q‰8?Dc/xöPû˘9ÒXĤ<ĊíÏìĊúÜ8³âœ ʉfmÊWr³ËÙG,;èĠ,ü?m_ŸbHIFö,š‹O™‹ë˙ĝLvHç>™;G1kÎSÑ·cĊԏê„XĴĞ2’ žŒĵÖÓaşÉ7P˘%²ĵşş˜–=L,ÙmŒlY˙~`áaP·dŽŽ}"_oŽË‘ċ›ÀêÀh‹t‡ôQNŒdÑÑBRƒ§X~ÛBû5ŸĥӎittäšW~’Iƒ|˜ÄN¨‚ϧ³c{Œ˙ċGa¤ÉúEBĝ—ĥÉıV!P‹öwħI̓7ı}3Ÿ³³jkë].]/ÊwK¨â†ĤÇÊUBVcé”8 êz3t9ŞMŒÒ!ĥ)0E‹˜,Ġ‡rövìgHI§”$ĊŠS°“¸…›żK›ew3òPLV}ċÄ Ħ“k|Vѧĝ="„^V#L/ĝš{ hİĉÜżC{ƒŞ—b"ÉDOÚ|½¸{DĊ„vÈ£FÊÄOŬjjŸùÑ[‹h÷3ď^z”C”ÁZĥâdµ…h½ħĈ )YĴħÉc²ş"KÎk;§ÚlÓJĝı½'Ê Š=ŒœœJwk1Ñĉż¨Ĵ⚕~PŠ7š¤Ù_g“—ĝò%CáÜŭzà“/ٖ“ĥ£1ĠmUj=\]9QŒ>2ïE.Şôz|:;Ù0ƒÁŒ,_¨½o§Bcêžh˘ìì€B'?ß@_ìç°(Ž@#ĈV^˘Ĝ×áP1ĠÛÌDrËoÇo’<ä2Aĉ–M)F8vEe;eGöl “Í·ÛCËEÛÉĤĥ–m“^(›‰IÊ­BÙD­ ç–²ĵZCôQ*–éö²™-1(vġ d}M€{ĥ%ëN˙‚O“µwSëĥ^lS’½ï£!ġUe‹–NĦ‡^m`Í ùœd VUÀŭ‡ÒM›<%ıèÚО^*)nZ§M˘Úk É7û]Á‡A‘¨#Ħeîô5üĝTÜ­Ŝ>HŜşK"ÓÙWĠñ´é–lM„Dä³ïuSğıO$ë°Â‘‚]7‚Ŭ¤óġ˜'OÚ™3ÖY´Ïè^İZôbÔ.ö ú’Í.‡Ŝç£Ht—k§p½×ŞûXŭŜ›ëŒ–-Î%‘@q\Ԍ+È3ĉ("Ž£(51ñ‘b˙ÚHg§¤aò/zÛŝw!]~2m°Ï`Ĥŭ şK‘’Ìe§ĴoA^Wċ„.mFĝà/ĝ­ô*¨Î)]~ŝÑaú-ÍrjäkBj˘hğˆġC* mwۋjÛW2tJ à}I°VEfwJ!:—7\mB£,ċ‡?ş²~ĵîg4ĠUtRŬ $Ò<ëhbÔÔ´Äw9fn…ğà,T'p‡2É~%5J–r“Zżĵ·ë5£‚Ĝâы Z…%‹í7‡‘[ÍV“ynŜ.é²ŻoŽwiÇâjTÏžĉeG­ŝâİd×ѰÂ6iYL›86“ŽıêLJq3+Ëıf|To(ÖĈhÀ°5ŸÈ, ÜJä&èŒw•oĞWk·—²À—H%ç˜nŞ,BuĈˆG+“k"Óq=fövl:ÁÖPĜ•P¨ĞöŬNœ_ =ÍCĉñ‰R7a £ˆ|&öaAš'³ħ1²‡˙ò ‡ÑáZ˜ĠTʈħˆ">…¨Ĵsbîá{Úo1ÉÊàñ(ÚÌMšMaɓ÷èҔûÌ4#o—ß@"L³^é¨Ĝ˙8˜™[ÈÓ£aüV†H^@şrÀ˜q”Öüb[W•ù²B{l™=İBSaf8\6YöpGžŝ— U*Yʑhki‰M_ıd‹·×Ŭ×2V(Şh1a%\ÍuXöÂ/üŒOAîU­"ÙÉÏÊÛ_v­rÏd˜<,-TšH·³C˜v3:íq¸ñ·K ­*!y{lĝâ[Żżżd´•Ä‘~f! G÷˘ÈŸŭ“ÀSôPŒ=ĴYÍFÖóÁĝè™ï²†‡f'XäIfĞï\iĤĉ]VD%ĵÒ'ʐ;ía)ù'’­Ĥ&ĉ:?ês‡Ü‡ú|QŭܑnĴjKP~9•xJżOf*HiZ0ĝEÏâĠEĠğ–U+IëÛöQMŠI˜q* lžü$XŸ­I* ŠĞ<9B ĞÂ|ٜxó*vXĦÓşFßçâ‘Û°Ċġ½pN|)ĵOqÜ}‚‡ş­3@a8Ĵaóżq0h× USXZÁ\Ğ€8ŭL:{7E+{TːàìЍ—ĥçUr`tìĥV(FÓhè*—f2FHœ#ó½|KĉôqÁ· ٙóh˜x}œ tíŬ#ş‚²ûT[PÒù%Ĵ`RÜÜ@݁èT' è14˘ĝiĴÁ,Ĥ()$Ŭŝ“z[żbC!YßÀó‚t~'–Ó…Oµ·#/³*oMo Ó²Žd€$•F\;†—Ġ8’ĠÀ[âÂÌ6Ê5ÎÀ <íêğ58ßTġM14Nêġ’ÚLÈ ;˜ŽyĜ4ĠŜž8תžbó ˙2^ɜÑ5TžzÜĥi•|CG1¨óċoW÷úœÀ ƒÍ/쟴#†ŭ.š‹h‹Sg’u”e cë7D!’ò£˘T”™6àö†k—D•ì7ÊßìBg?Yšëê-6ĥú*W=sİ[ %Sw‰ŸıPıEé­Ĝ @’˜÷Ö*Ä^WĴ³ĜĠB1F#0½F#{ĝ‹Óm[ÍnáÑ+†ı˙- ùçÒ<†­Ê‰–ÇK²lÎŜ$Gœ' +À†{âÁžkµħëĠxœż”Q#+fĦż^6Χu~İşL0ğ!ŸÍ …ÔGeiu÷YûÒ-šùa~Ñż^Ë3’KK÷Äò~$iŜJġîׅŬı İ9ËĊpÈߍS5n ²óĤzϟ^  -^íGi£ġ°1쌕Ş2aÀt‡žĝ­ċDvŒJ—Ü҄33s ÏĈŝĝĴÂ}LgXż†˜1š[(™ñy dıCeëGŭ-|˙ĤôŬVı‰‚üžíkŜa³œŞşĜeËNÏ]5ħ>éRhÛ,ĈċO}z_u?ĞbLi¤mñµ6*}ï H~Ż‘Š<ÑFdoNmzƒ˙ âÁÇĜĠç…Y…öƒŠï“Eğ<ÜŸ„ËË;àèJŜ´/s'ÜU2c2÷bەylżĦŜ…ƒ!]‰UCt§&êÇ´sdJôo礲%cû2Îß˙É4ÁĞ9*WXŸwċ7yûT΀@Z­˙úÂÑ=)i׏ŞsRŬê"Ş Ö9Á4Š·Y¤-á˘îâÈäF%}FD3£äN9ŒMÍáùóTĜĈ…OYql(žÙs‡bï•ÄÁĝ/Ĥ×Ԝ+ĵ,N–s>qvÂkl"·OVÑ|ğO˜R’Hĉ’ *•½•…"+ÙRäYÒçµ·İİ4J„Cu5DŽ8}‹Ç7 Jbuq·i’{z>rO·B]™Rĝ0/àÓèöòûÜ/ì}Áík(&RO$Ĉ0<( Ä1\qg}œGö‘›rĦzè0[vĞ\ċġ­ĥ/QnĈ#_ÄfvZëÙû&֑ÑzkĴıöeŒVÇ\.&ÜûĞ‚ñç;BÇîT§ġñx~op—e•WYÒĤ§‚"ÏŞÎÇiÌJŸ}25ŭ<#I"$ú‘lmäG ÛÇı<|'{|Ëë Gğ>W`Ġ•/àÜ`Oj=ìˆ(!ċž0ISäB÷’›·imzŒuƒFzn·…RkĦŻğŒO—!ğYc€ô7Èġ¨:íż™^ċezĦݧPˆMuF+ g`I f–m‚_%#³ îš M= 2)Ż8Ñd:;˙ĝ+ĝ?ß*˜2(aİ‹òiì,cXDÊù³pı¸ĈG} ¨C³:Ğ+ y˘ÇeYú ’T.™[…-b0E·ġFŻ|cÂEÊGêġàˆòÓŞ4—6ĵŜqä£aw{ˆ„iĴoĴùß§(şJg)jħ‰t§emÔ}W°V ĈeÊ^=à\‡Ĝ6à|>íÂlT‹^vô ĦlùIKŠéd†L›ĉ‚Àŝ şÑÙÇ=›7bĥOĜyĴbĴÀV  ÌŞ[êVµŬ|-ì4錧óIV„ ”‚â>FxOÄ.öo+ ?J1E1s7÷Óâh/͏“M<+l}×ó5"›;@uŠE~AN=İ\oMhB‰/g•ŭAú(áµLX+ĝĥè5eËGĵœÎŸĴÓ3,yÚb›ôĦ,~+œçú݊K-ú}ñ赞ó\z­ÏPÓ})•ÚI° éƒ|²úü ĴaZápŽĦ+1NĜl×Ŭİ)ê5ÚY=Ì@f™7Dô°ĝtù%ċš½VX…ŻÙ‚íqÁ窒¨,`ğšJ£İ1U~ĵŽT)â{ñ½:,× ğ}3ï °âËíÉ{?–}z\ŠĥhĦ†Öí÷ĜH ‘sûdĠ×Ġœ ì˘^WŬLôW³ÏԚŜğÚ7•ĜjĈ Íb~\4}†˙2R ğ&vF}Xô 1PıZ@ÉjWı Ŝo6Ğ„„‘ğOVĈì‰Ħ}Ò=VıˆKĝĥíȘ˙òĠĈÊio@T<²xíd\…U1•ÛĜ\Ħ°IÚC^Á>ȄŠ"]“šZ™ ¤̸ñbrB}×ß|.&ñš/´|/ŜpPĝúU ĊŜ½Ü`‹í·–[P„Ċ˙Ä;ü¸ùëü}£§û80—_§$O˘Ż=•ó1Xĉžġù’?ŭŜBփrö¨Â–[ïc'eĦŠKvPÌQgĊ7†<ˆòġ%ˆ-û`–ú5uàƒ%=_jÊW„Ÿ=ÁîNNú9kÊI:Ñ /öÜϓ´5ŜĊìt/ĤҊ`ğ]~XĜÒoQWšœE’yĉÑĊ‰£û“Hĵż ; YÛ&ĊÔFµ G–ûi̸j¸ë[Ñè$;ÀéávLÉöRŬrÊqŻżŸĥiÊʧòĊ½j^†²{½6˘ßĝéż.JäĴĠ*1t0ġüÉ}¸':îÛO’òÌÖGI"ÁC6e^‡z Ÿ%ß譆Í<˘µzOĊ‡MÚġúyNfÎċT ٧ˍĉâpĴ 4-^>Y9Í\8›4ĥžZ~븋üğÏ×ıze0‹ş*ÈÏyş1"ċô`Ŭĝ.:éÖQóN==î˜ŬĈDĥ“šJĉĵ 0#Ô+Í= )½Ŝîuú >‘RâSö-”Íd…&×#“Ĥ_P53™†[ŭìx/½Gq§¸V &mZ´Ÿ9ÏÄâĉF§Ŝ‘ Œ8Sş™cQx6y§zLİĦ ˆžè€§™ËúRWAôx°R§òžŜ7Ŝ86‹°ŸßÙrÎ3ì ò|ñ–ċ6sµĴġÁ|;mÈE·ĞÏàÀ̐EöêGš"dĠġԉŝE6AÖÏ[â0  ß ċx•‘°š’".5ıµŜşÒız³ÍwÏùµ's~¸n˜²Û÷<ŒÒĉ\Œ²?f×À”Úúċ.]WIù|p‡M²/ġÛ:,Â2%­&6¸kpÏíéíB0ùĵĜ"7¨áAœƒÉ$ˀgÓV’ï­ŝv¨£'²Ép+%½ß>äÛE×pJ #…PNt,ż.ı–ęϷç™,ğı†9_WsòŬ: ^7ûút¸ñv€iPà—Z@^cíîÒ'¨yŜ˘ÜlßĜeè4~Ü"Zħ;­gĤğòIñĠ“×ïo‹F#ˆßû֜×bS#tÊĦkψtgëí²•ç p݊9œPĤĉÎHr n’FEF]pÂúçċÚPÒÇy€ìeż/ ›Š:e7ê2Êl×ÁiuÔn÷w_Çüp9`Ä endstream endobj 142 0 obj << /Type /FontDescriptor /FontName /SGNIET+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 669 /CapHeight 669 /Descent -193 /ItalicAngle -15 /StemV 78 /XHeight 441 /CharSet (/a/b/c/e/f/g/i/l/m/n/o/p/q/r/s/t/u/v/y) /FontFile 141 0 R >> endobj 118 0 obj << /Type /Encoding /Differences [2/fi/fl 35/numbersign 39/quoteright/parenleft/parenright 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight 58/colon 61/equal 65/A/B/C/D/E/F/G/H/I/J 76/L/M/N/O/P 82/R/S/T/U/V/W/X/Y 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 147/quotedblleft/quotedblright 151/emdash] >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WCJTWI+CMSY10 /FontDescriptor 128 0 R /FirstChar 13 /LastChar 13 /Widths 123 0 R >> endobj 49 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ALWWOH+NimbusMonL-Regu /FontDescriptor 130 0 R /FirstChar 35 /LastChar 121 /Widths 120 0 R /Encoding 118 0 R >> endobj 47 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HBQSLH+NimbusSanL-Bold /FontDescriptor 132 0 R /FirstChar 69 /LastChar 87 /Widths 121 0 R /Encoding 118 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XABQXJ+NimbusSanL-Regu /FontDescriptor 134 0 R /FirstChar 2 /LastChar 121 /Widths 126 0 R /Encoding 118 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /UGRPTL+NimbusSanL-ReguItal /FontDescriptor 136 0 R /FirstChar 46 /LastChar 115 /Widths 125 0 R /Encoding 118 0 R >> endobj 15 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JPHBMW+NimbusRomNo9L-Medi /FontDescriptor 138 0 R /FirstChar 49 /LastChar 121 /Widths 122 0 R /Encoding 118 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZEDXYB+NimbusRomNo9L-Regu /FontDescriptor 140 0 R /FirstChar 2 /LastChar 151 /Widths 124 0 R /Encoding 118 0 R >> endobj 66 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SGNIET+NimbusRomNo9L-ReguItal /FontDescriptor 142 0 R /FirstChar 97 /LastChar 121 /Widths 119 0 R /Encoding 118 0 R >> endobj 7 0 obj << /Type /Pages /Count 6 /Parent 143 0 R /Kids [2 0 R 9 0 R 13 0 R 17 0 R 33 0 R 42 0 R] >> endobj 50 0 obj << /Type /Pages /Count 6 /Parent 143 0 R /Kids [45 0 R 52 0 R 55 0 R 59 0 R 63 0 R 68 0 R] >> endobj 75 0 obj << /Type /Pages /Count 2 /Parent 143 0 R /Kids [72 0 R 116 0 R] >> endobj 143 0 obj << /Type /Pages /Count 14 /Kids [7 0 R 50 0 R 75 0 R] >> endobj 144 0 obj << /Type /Outlines /First 77 0 R /Last 95 0 R /Count 4 >> endobj 113 0 obj << /Title 114 0 R /A 112 0 R /Parent 95 0 R /Prev 110 0 R >> endobj 110 0 obj << /Title 111 0 R /A 109 0 R /Parent 95 0 R /Prev 107 0 R /Next 113 0 R >> endobj 107 0 obj << /Title 108 0 R /A 106 0 R /Parent 95 0 R /Prev 104 0 R /Next 110 0 R >> endobj 104 0 obj << /Title 105 0 R /A 103 0 R /Parent 95 0 R /Prev 101 0 R /Next 107 0 R >> endobj 101 0 obj << /Title 102 0 R /A 100 0 R /Parent 95 0 R /Prev 98 0 R /Next 104 0 R >> endobj 98 0 obj << /Title 99 0 R /A 97 0 R /Parent 95 0 R /Next 101 0 R >> endobj 95 0 obj << /Title 96 0 R /A 94 0 R /Parent 144 0 R /Prev 92 0 R /First 98 0 R /Last 113 0 R /Count -6 >> endobj 92 0 obj << /Title 93 0 R /A 91 0 R /Parent 144 0 R /Prev 89 0 R /Next 95 0 R >> endobj 89 0 obj << /Title 90 0 R /A 88 0 R /Parent 144 0 R /Prev 77 0 R /Next 92 0 R >> endobj 86 0 obj << /Title 87 0 R /A 85 0 R /Parent 77 0 R /Prev 83 0 R >> endobj 83 0 obj << /Title 84 0 R /A 82 0 R /Parent 77 0 R /Prev 80 0 R /Next 86 0 R >> endobj 80 0 obj << /Title 81 0 R /A 79 0 R /Parent 77 0 R /Next 83 0 R >> endobj 77 0 obj << /Title 78 0 R /A 76 0 R /Parent 144 0 R /Next 89 0 R /First 80 0 R /Last 86 0 R /Count -3 >> endobj 145 0 obj << /Names [(label-controllers) 65 0 R (label-coordinating events) 48 0 R (label-hierarchy) 57 0 R (label-other info) 74 0 R (page001) 35 0 R (page002) 36 0 R] /Limits [(label-controllers) (page002)] >> endobj 146 0 obj << /Names [(page003) 37 0 R (page004) 61 0 R (page005) 38 0 R (page006) 70 0 R (page007) 39 0 R (page008) 40 0 R] /Limits [(page003) (page008)] >> endobj 147 0 obj << /Kids [145 0 R 146 0 R] /Limits [(label-controllers) (page008)] >> endobj 148 0 obj << /Dests 147 0 R >> endobj 149 0 obj << /Type /Catalog /Pages 143 0 R /Outlines 144 0 R /Names 148 0 R /PageMode /UseOutlines >> endobj 150 0 obj << /Producer (pdfTeX-1.40.3) /Author (Andrew Straw) /Title (The Vision Egg Programmer's Manual) /Creator (TeX) /CreationDate (D:20080607085359-07'00') /ModDate (D:20080607085359-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 151 0000000000 65535 f 0000000462 00000 n 0000000358 00000 n 0000000015 00000 n 0000098707 00000 n 0000098875 00000 n 0000099221 00000 n 0000099569 00000 n 0000000899 00000 n 0000000794 00000 n 0000000552 00000 n 0000098226 00000 n 0000002012 00000 n 0000001905 00000 n 0000000979 00000 n 0000099048 00000 n 0000002288 00000 n 0000002181 00000 n 0000002093 00000 n 0000003678 00000 n 0000003809 00000 n 0000003945 00000 n 0000004080 00000 n 0000004216 00000 n 0000004348 00000 n 0000004478 00000 n 0000004610 00000 n 0000004745 00000 n 0000004881 00000 n 0000005017 00000 n 0000005153 00000 n 0000005289 00000 n 0000005425 00000 n 0000003468 00000 n 0000002328 00000 n 0000008698 00000 n 0000010365 00000 n 0000012941 00000 n 0000016076 00000 n 0000019344 00000 n 0000022841 00000 n 0000005804 00000 n 0000005697 00000 n 0000005517 00000 n 0000008809 00000 n 0000008590 00000 n 0000005873 00000 n 0000098538 00000 n 0000008753 00000 n 0000098368 00000 n 0000099676 00000 n 0000010420 00000 n 0000010257 00000 n 0000008913 00000 n 0000013052 00000 n 0000012833 00000 n 0000010512 00000 n 0000012996 00000 n 0000013497 00000 n 0000013334 00000 n 0000013156 00000 n 0000013442 00000 n 0000016186 00000 n 0000015968 00000 n 0000013566 00000 n 0000016131 00000 n 0000099392 00000 n 0000016643 00000 n 0000016480 00000 n 0000016302 00000 n 0000016588 00000 n 0000019455 00000 n 0000019236 00000 n 0000016712 00000 n 0000019399 00000 n 0000099786 00000 n 0000019559 00000 n 0000101062 00000 n 0000019603 00000 n 0000019644 00000 n 0000100988 00000 n 0000019688 00000 n 0000019749 00000 n 0000100901 00000 n 0000019793 00000 n 0000019868 00000 n 0000100827 00000 n 0000019912 00000 n 0000019985 00000 n 0000100739 00000 n 0000020029 00000 n 0000020081 00000 n 0000100651 00000 n 0000020125 00000 n 0000020190 00000 n 0000100538 00000 n 0000020234 00000 n 0000020281 00000 n 0000100463 00000 n 0000020325 00000 n 0000020364 00000 n 0000100372 00000 n 0000020409 00000 n 0000020444 00000 n 0000100280 00000 n 0000020489 00000 n 0000020529 00000 n 0000100188 00000 n 0000020574 00000 n 0000020631 00000 n 0000100096 00000 n 0000020676 00000 n 0000020721 00000 n 0000100018 00000 n 0000020766 00000 n 0000022897 00000 n 0000022730 00000 n 0000020810 00000 n 0000097857 00000 n 0000022990 00000 n 0000023109 00000 n 0000023476 00000 n 0000023571 00000 n 0000023883 00000 n 0000023907 00000 n 0000024483 00000 n 0000024783 00000 n 0000025255 00000 n 0000026539 00000 n 0000026772 00000 n 0000040021 00000 n 0000040384 00000 n 0000046095 00000 n 0000046342 00000 n 0000054899 00000 n 0000055273 00000 n 0000058951 00000 n 0000059206 00000 n 0000070229 00000 n 0000070541 00000 n 0000088351 00000 n 0000088829 00000 n 0000097582 00000 n 0000099869 00000 n 0000099943 00000 n 0000101174 00000 n 0000101393 00000 n 0000101557 00000 n 0000101644 00000 n 0000101682 00000 n 0000101791 00000 n trailer << /Size 151 /Root 149 0 R /Info 150 0 R /ID [<5FE0C9F36073DD0E325380B899FDBCA1> <5FE0C9F36073DD0E325380B899FDBCA1>] >> startxref 102132 %%EOF visionegg-1.2.1/doc/visionegg.tex0000644000076500000240000003612711231311627016160 0ustar astrawstaff\documentclass{manual} \title{The Vision Egg Programmer's Manual} \author{Andrew Straw} \date{\today} % update before release! \release{1.2.1} % software release, not documentation \setreleaseinfo{} % empty for final release \setshortversion{1.2.1} % major.minor only for software \makeindex % tell \index to actually write the % .idx file \makemodindex % ... and the module index as well. \begin{document} \maketitle \ifhtml \chapter*{Front Matter\label{front}} \fi Copyright \copyright{} 2001-2008 Andrew Straw All rights reserved. \begin{abstract} \noindent The Vision Egg was designed to perform two primary tasks. The first task is the drawing of computer graphics using OpenGL. The optional second task is to handle the flow control of your program to coordinate events on your computer in a precisely timed way. These are challenging tasks, and the Vision Egg does much of the work for you. However, to make full use of the Vision Egg, you should understand the basics. This is an overview of the main components of the VisionEgg itself. Note before starting: The Vision Egg is fundamentally object oriented in nature, and this document assumes you are familiar with terms such as ''class'' and ''instance''. If you are not, please find some information on the topic of object oriented programming. As you write scipts, you will also need to consult the Python, Numeric, pygame, or other documentation. \end{abstract} \tableofcontents \chapter{Coordinating events \label{coordinating events}} There are several ways to organize the sequence of your experiments using the Vision Egg. You can write your own custom flow control and event handling, using the Vision Egg solely for drawing graphics. This is often useful in psychophysics experiments where interaction with a subject is interleaved with presentation of stimuli. Alternatively, you can make use of the classes in \module{VisionEgg.FlowControl}. For example, \class{Presentation} is a class that maintains an association between the parameters of stimuli and their control functions, calls these functions, and initiates drawing of the stimuli. There are several ways to use the \class{Presentation} class described below. This mode of operation is useful for electrophysiology experiments. \section{Custom flow control and event handling} By writing your own custom flow control code, you have much more flexibility in designing experiments, but also less of the work involved has been done for you. Perhaps the best place to start is simply to look at some examples. See the demonstration scripts dots_simple_loop.py, mouseTarget_user_loop.py, and multi_stim.py. Each of these programs has its own main loop which performs the same role as the \class{Presentation} class's \method{go} and \method{run_forever} methods, which are described further in this chapter. \section{Using the Presentation class: Running a single trial} Most of the Vision Egg demonstration scripts run a single trial and then quit. From a programming perspective, this is the easiest way to get started. The timing and control of events within a single trial is performed by a ``go loop'', which is entered by calling the \method{go()} method of the \class{Presentation} class. A cycle of the go loop consists of updating any relevant stimulus parameters, clearing the framebuffer, and calling the stimuli to draw themselves. The buffers are swapped and the cycle begins again, usually after waiting for the vertical blanking interval (see the section in this manual on double buffering). When waiting for the vertical blanking interval (``sync swap buffers'') is enabled, cycles through the ``go loop'' never occur faster than the frame rate. If the go loop is burdened with lots of calculations or if the operating system takes the CPU away from the Vision Egg, the cycle through the go loop is not completed before the video card begins drawing the next frame and therefore a frame is skipped. A go loop can run indefinitly or have its duration limited to a duration measured in seconds or in number of frames drawn. (Measuring duration based on frames drawn is only meaningful when buffer swapping is synchronized with the vertical blanking interval and frame skipping would be particularly undesirable in this case.) \section{Using the Presentation class: Continuous operation} Often, the visual stimulus needs to continue running between trials. At a minimum this could be used to keep the display constant and to prevent the Vision Egg from quitting, but could also be used to maintain a moving pattern on the display between trials. In addition, it may be necessary to trigger a go loop with a minimum of latency after the receipt of some signal, such as a digital input on the parallel port. To use the Vision Egg in this manner, the \method{run_forever()} method of \class{Presentation} is called, which begins a loop that performs the same tasks as a go loop with the exception that functions controlling stimulus parameters are informed that it is a ``between go loops'' state. At any point this \method{run_forever} loop can create a go loop, which returns control back to the \method{run_forever} loop when done. Alternatively, if the controlling functions for stimulus parameters operate between go loops, the entire experiment could be run without entering a go loop. (This could also be acheived by starting a go loop with a duration parameter set to ``forever''.) \chapter{Hierarchy of graphical objects \label{hierarchy}} Currently, the Vision Egg supports only a single screen (window). However, it is designed to run simultaneously in multiple screens, so once this capability is available (perhaps in pyglet), the following priciples will continue to apply. Each screen contains a list of least one ``viewport''. A viewport is defined to occupy a rectangular region of the screen and define how and where objects are drawn. The default viewport created with each screen fills the entire screen. In the Vision Egg \class{Viewport} class, the screen position and size are specified in addition to the projection. The projection, specified by the \class{Projection} class, transforms 3D ``eye coordinates'' into ``clip coordinates'' according to, for example, an orthographic or perspective projection. (Eye coordinates are the 3D coordinates of objects referenced from the observers eye in arbitrary units. Clip coordinates are used to compute the final position of the 3D object on the 2D screen.) The default \class{Projection} created with a \class{Viewport} is an orthographic projection that maps eye coordinates in a one to one manner to pixel coordinates, allowing specification of object position in absolute pixels. For more information, consult section 2.11, ``Coordinate Transformations'' of the OpenGL Specification. Multiple instances of the \class{Viewport} class may occupy the same region of the screen. This could be used, for example, to overlay objects with different projections such as in the targetBackground demo. The order of the list of viewports is important, with the first in the list being drawn first and later viewports are drawn on top of earlier viewports. An instance of the \class{Viewport} class keeps an ordered list of the objects it draws. Objects to be drawn on top of other objects should be drawn last and therefore placed last in the list. The objects a viewport drawns are all instances of the \class{Stimulus} class. The name ``Stimulus'' is perhaps a slightly inaccurate because instances of this class only define how to draw a set of graphics primitives. So for example, there are \class{SinGrating2D} and \class{TextureStimulus} subclasses of the \class{Stimulus} class. The Vision Egg draws objects in a hierarchical manner. First, the screen(s) calls each of its viewports in turn. Each viewport calls each of its stimuli in turn. In this way, the occlusion of objects can be controlled by drawing order without employing more advanced concepts such as depth testing (which is also possible). \chapter{Controlling stimulus parameters in realtime \label{controllers}} When using the \class{Presentation} class, you have a powerful method of updating parameters in realtime available to you. ``Controllers'' are instances of the class \class{Controller}. A controller is called at pre-defined intervals and updates the value of some stimulus parameter. For example, in the ``target'' demo script, the ``center'' parameter of a \class{Target2D} stimulus is updated on every frame by a function which computes position based upon the current time. You can also control parameters without using controllers by simply changing the values as your program executes. Instances of \class{Controller} are called by instances of the \class{Presentation} class. After creating an instance of \class{Controller}, it must be ``registered'' by calling the \method{add_controller} method of \class{Presentation}, during which the stimulus parameter under control is specified. The \class{Presentation} takes care of calling the controller from this point. Specifically, the \method{during_go_eval()} is called during a \method{go()} loop, and \method{between_go_eval()} is called by \method{between_presentations()} (during \method{run_forever()}, for example.) These ``eval'' methods return a value which becomes the new value of the parameter being controller. The frequency with which \method{during_go_eval()} and \method{between_go_eval()} are evaluated is determined by the \var{eval_frequency} attribute of the controller. The default \var{eval_frequency} is every frame. The \var{temporal_variables} attribute of the controller specifies what temporal variables the ``eval'' methods have available to base calculations on. The default value is TIME_SEC_SINCE_GO, so when \method{during_go_eval()} is called, the instance will have an attribute \var{time_sec_since_go} set to the time since the onset of the \method{go()} loop. For more information, see the documentation for the \class{Controller} and \class{Presentation} classes in the \module{VisionEgg.Core} module. \chapter{Other general information \label{other info}} \section{Double buffering} The Vision Egg operates in double buffered mode. This means that the contents of the ``front'' framebuffer are read by the video card to produce the on-screen display. Meanwhile, clearing and drawing operations always occur on the back framebuffer, which becomes the front buffer on a buffer swap (also called flip). This way, an incomplete frame is never drawn to the screen. However, if the buffers are swapped while the display is only part-way through the front buffer, the top and bottom parts of the display will contain frames drawn at different times and thus lead to a tearing artifact. For this reason the default behavior of the Vision Egg is to synchronize buffer swapping with the vertical blanking period, ensuring that tearing does not happen. (Synchronizing buffer swapping is not available for some video drivers on the linux platform, and may frequently be overriden in the Displays control panel in Windows.) \section{File layout} Several directories are created in a Vision Egg installation. The files used when a Python script imports any Vision Egg module are in the standard Python ``site-packages'' directory. Next, the Vision Egg system directory contains data files such as sample images used by the demo scripts and a site-wide configuration file. A user-specific configuration file is looked for is the VisionEgg home directory. On your system, you can determine the exact location of these directories by running the ``check-config.py'' script, which is distributed with the Vision Egg. If you have installed the Vision Egg from source, you will also have the source directory. \section{Priority control} The Vision Egg can take advantage of operating system dependent methods of setting the priority of an application. The performance and features vary from platform to platform. The options available from OS specific system calls are available in the Vision Egg. Before trying something new, do not attempt to increase your script's priority, because this may result in locking up the computer. \section{The log file: Warnings and errors} The Vision Egg uses the standard Python logging package to log information including warnings and errors to two locations by default: the standard error stream (as standard for Python scripts) and to a file called ``VisionEgg.log'' in the current directory. The standard error stream is typically printed on the console, which may only be visible when running your script from the command line. If your script (or modules it imports) raise a \exception{SyntaxError}, the Vision Egg will be unable to start and therefore unable to copy the exception traceback to the log file, and viewing the standard error is the only way to see what went wrong. Therefore, if your log file does not display an error but your script is not executing, run it from the command line. Also, on Mac OS X, the standard error output is only visible through the Console.app available in ``/Applications/Utilities''. You can increase the verbosity of the output by doing something like ``VisionEgg.logger.setLevel( VisionEgg.logging.DEBUG )'' in your script. \section{Configuration options} A number of options that control behavior of the Vision Egg are available. These options are first determined when the \module{VisionEgg.Configuration} module is loaded (by the base module \module{VisionEgg}, for example). This module first loads variables from the ``VisionEgg.cfg'' file and then checks for environment variables that override these values. The values set by \module{VisionEgg.Configuration} may be overriden at any time by re-assigning the appropriate variable. For example: \begin{verbatim} import VisionEgg # Turn off GUI window when calling create_default_screen() VisionEgg.config.VISIONEGG_GUI_INIT = 0 \end{verbatim} \section{For more information} A significant amount of documentation is contained within the source code as ''docstrings'' --- special comments within the code. These docstrings are often the best source of information for a particular class or function. In particular, the fundamentally important classes in the \module{VisionEgg.Core} module are well documented. You can either browse the source code itself, look at the library reference compiled from the source, or use a utility such as PyDoc to compile your own reference from the source. The Vision Egg mailing list is another source of valuble information. Sign up and browse the archives through the Vision Egg website. For installation instructions, the Vision Egg website provides the most up-to-date, platform-specific information. To create your own stimuli you need to know OpenGL. To learn more about OpenGL, you may want to begin with ``The Red Book'' (The OpenGL Programming Guide, The Official Guide to Learning). The OpenGL specification is also useful (available online). % %begin{latexonly} % \renewcommand{\indexname}{Module Index} % %end{latexonly} % \input{modvisionegg.ind} % Module Index % %begin{latexonly} % \renewcommand{\indexname}{Index} % %end{latexonly} % \input{visionegg.ind} % Index \end{document} visionegg-1.2.1/LICENSE.txt0000644000076500000240000006406111224565527014534 0ustar astrawstaffThe Vision Egg is licensed under the GNU LGPL Version 2.1, which is included below. The file VisionEgg/win32_vretrace_orig.h is copyright by Thiadmer Riemersma and licensed under a Creative Commons Attribution-Share Alike 3.0 Unported license. GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 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. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! visionegg-1.2.1/makepimp.py0000755000076500000240000000401311224565531015053 0ustar astrawstaff#!/usr/bin/env python import imp import os import sys import distutils.util import tarfile import gzip import md5 from plistlib import Plist debug = True HTTPBASE = 'http://osdn.dl.sourceforge.net/sourceforge/visionegg/' UPLOADCMD = 'echo "upload %s" when you want' PLISTDIR = "." plat = distutils.util.get_platform() def runsetup(commands, setup='setup.py'): cmd = '%s %s %s' % (sys.executable, setup, commands) return os.popen(cmd) def main(httpbase=HTTPBASE, upload=True): plist = Plist.fromFile(os.path.join(PLISTDIR, plat+'.plist')) print 'Querying package information' spl = runsetup('--name --version --url --description').read().split('\n')[:-1] name, version, url = spl[:3] description = '\n'.join(spl[3:]) print 'Building dumb distribution for %s-%s' % (name, version) runsetup('bdist_dumb').read() hash = md5.md5() fn = '%s-%s.%s.tar.gz' % (name, version, plat) print 'Calculating MD5 hash for', fn f = file(os.path.join('dist', fn), 'rb') while 1: s = f.read(1024) if not s: break hash.update(s) f.close() hash = hash.hexdigest() if upload: print 'Uploading', fn os.system(UPLOADCMD % os.path.join('dist', fn)) for pkg in plist.Packages: if pkg.Name == name and pkg.Flavor == 'binary': print 'Existing package metadata found' break else: print 'Creating new package metadata' pkg = { 'Flavor':'binary', 'Install-test':'\nimport %s\n\t\t\t' % (name,), 'Prerequisites':[], } plist.Packages.append(pkg) pkg['Name'] = name pkg['Version'] = version pkg['MD5Sum'] = hash pkg['Download-URL'] = httpbase + fn if url: pkg['Home-page'] = url if description and not pkg.get('Description', None): pkg['Description'] = '\n%s\n\t\t\t' % (description,) print 'Writing out new plist' plist.write(os.path.join(PLISTDIR, plat+'.plist')) if __name__=='__main__': main() visionegg-1.2.1/MANIFEST.in0000644000076500000240000000151311224565527014440 0ustar astrawstaffinclude LICENSE.txt include CHANGELOG.txt include README.txt include README-DEMOS.txt include MANIFEST.in include VisionEgg/*.pyx include VisionEgg/*.c include VisionEgg/*.m include VisionEgg/*.h include doc/reference/html/* include doc/reference/epydoc include doc/reference/make_epy.sh include doc/visionegg/* include doc/visionegg.tex include doc/visionegg.pdf include doc/index.html include doc/BUILD.txt include demo/*.py include demo/*.pyw include demo/README.txt include demo/daq/*.py include demo/tcp/*.py include demo/GUI/*.py include demo/Pyro/*.py include test/*.py include VisionEgg/data/panorama.jpg include VisionEgg/data/spiral.png include VisionEgg/data/az_el.png include VisionEgg/data/visionegg.bmp include VisionEgg/data/visionegg.tif include VisionEgg/data/water.mov include VisionEgg/VisionEgg.cfg include check-config.py visionegg-1.2.1/PKG-INFO0000644000076500000240000000412111231315557013767 0ustar astrawstaffMetadata-Version: 1.0 Name: visionegg Version: 1.2.1 Summary: 2D/3D visual stimulus generation Home-page: http://www.visionegg.org/ Author: Andrew Straw Author-email: astraw@users.sourceforge.net License: LGPL Description: The Vision Egg is a programming library (with demo applications) that uses standard, inexpensive computer graphics cards to produce visual stimuli for vision research experiments. For more information, visit the website at www.visionegg.org Any feedback, questions, or comments, should go to the mailing list at visionegg@freelists.org The Vision Egg is Copyright (c) by its authors and is distributed under the GNU Lesser General Public License (LGPL). This software comes with absolutely no warranties, either expressed or implied. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Environment :: MacOS X Classifier: Environment :: Other Environment Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) Classifier: Natural Language :: English Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: POSIX :: IRIX Classifier: Programming Language :: Python Classifier: Programming Language :: C Classifier: Topic :: Multimedia :: Graphics Classifier: Topic :: Multimedia :: Graphics :: 3D Rendering Classifier: Topic :: Multimedia :: Graphics :: Presentation Classifier: Topic :: Multimedia :: Video :: Display Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Scientific/Engineering :: Human Machine Interfaces Classifier: Topic :: Scientific/Engineering :: Medical Science Apps. Classifier: Topic :: Scientific/Engineering :: Visualization Classifier: Topic :: Software Development :: Libraries visionegg-1.2.1/pyz_support.py0000644000076500000240000000027611224565531015672 0ustar astrawstaff# This allows .pyz files to be loaded # (Used in McMillan Installer applications.) import os import sys home = os.path.dirname(sys.executable) os.chdir(home) sys.path.append('common.pyz') visionegg-1.2.1/README-BINARY-DEMOS.txt0000644000076500000240000001055311224565527016233 0ustar astrawstaffWELCOME Thanks for checking out the Vision Egg! For more information or to download the library, the website is http://www.visionegg.org/ This directory contains Windows binary executable versions of several demonstration scripts included with version 0.9.9 of the Vision Egg library. These programs are not meant to be used for experiments, but rather to demonstrate particular features of the Vision Egg. The complete source code of these programs can be downloaded from the Vision Egg website. Contents: --------- check-config.exe -- Check configuration alpha_texture.exe -- Textures with alpha (transparency). color_grating.exe -- Colored sine wave grating in circular mask convert3d_to_2d.exe -- Convert 3D position to 2D position displayText.exe -- Display text strings dots.exe -- Random dot stimulus dots_simple_loop.exe -- Draw dots, using your own event loop ephys_gui.exe -- Client GUI application for electrophysiology experiments ephys_server.exe -- Server application for electrophysiology experiments flames_pygame.exe -- Flames demo from pygame code repository flames_visionegg.exe -- a Vision Egg implementation of pygame flames gabor.exe -- Sinusoidal grating in a gaussian mask gamma.exe -- Test whether your video drivers support setting gamma ramps grating.exe -- Sinusoidal grating calculated in realtime gratings_multi.exe -- Sinusoidal gratings calculated in realtime image_sequence_fast.exe -- Display a sequence of images using a pseudo-blit routine image_sequence_slow.exe -- Display a sequence of images lib3ds-demo.exe -- Demonstrate the loading of .3ds file using the lib3ds library makeMovie.exe -- Save movie of a black target moving across a white background makeMovie2.exe -- Draw dots and save movie using your own event loop mouseTarget.exe -- Control a target with the mouse, get SDL/pygame events mouseTarget_user_loop.exe -- Control a target with the mouse, using your own event loop. mouse_gabor_2d.exe -- sinusoidal grating in gaussian window mouse_gabor_perspective.exe -- Perspective-distorted sinusoidal grating in gaussian window movingPOV.exe -- 2 viewports, one with a changing perspective mpeg.exe -- play MPEG movies in the Vision Egg multi_stim.exe -- multiple stimulus demo plaid.exe -- Multiple sinusoidal gratings (with mask) sphereMap.exe -- Mapping of texture onto sphere target.exe -- A moving target targetBackground.exe -- Moving target over a spinning drum texture.exe -- Load a texture from a file textureDrum.exe -- A texture-mapped spinning drum visual_jitter.exe -- Retinal slip demonstration simpleServer.exe -- Very simple usage of Pyro (server) simpleClient.exe -- Very simple usage of Pyro (client) gratingPyroServer.exe -- Grating control with low-level Controllers (server) gratingPyroGUI.exe -- Grating control with low-level Controllers (GUI client) metaPyroServer.exe -- Grating control with high-level meta-controller (server) metaPyroGUI.exe -- Grating control with high-level meta-controller (GUI client) simple_lpt_out.exe -- very simple example of using the parallel port trigger_in.exe -- Use an external device to trigger the Vision Egg. trigger_out.exe -- Use the Vision Egg to trigger an external device. drumDemoGUI.exe -- Spinning drum with a graphical user interface (old). gratingTCP.exe -- Start a Vision Egg TCPServer to control a grating gratingGUI.exe -- Python GUI to control gratingTCP conform.exe -- Check VisionEgg operation (unit tests) opengl_info.exe -- Check OpenGL information (doesn't use Vision Egg) display_dc_restoration.exe -- incomplete DC restoration test for displays (Brainard et al., 2002) display_voltage_regulation.exe -- high-voltage regulation test for displays (Brainard et al., 2002) LEGAL MATTERS The Vision Egg is copyright (c) Andrew D. Straw, 2001-2003. It is distributed under the terms of the GNU LGPL (Lesser General Public License.) See LICENSE.txt for more information. This software is provided "as is" without any warranty of any kind, either expressed or implied. This binary demo distribution is only possible because of the open source nature of the Vision Egg's dependencies. The source code for any of the software used is available from its respective website. I would like to thank all of the developers for their great work. These packages include Python, SDL, Numeric Python, PyOpenGL, pygame, the Python Imaging Library, Pyro, SDL, Dincer Aydin's winioport, Gordon McMillan's Python Installer, and Tcl/Tk. visionegg-1.2.1/README-DEMOS.txt0000644000076500000240000000464711224565527015260 0ustar astrawstaffWelcome to the Vision Egg! RUN THE CONFIGURATION CHECK (BEFORE AND/OR AFTER INSTALLATION) Check for pre-requisites on your system by running check-config.py. This can be run before or after installation of the Vision Egg, and also displays useful information about the Vision Egg, if already installed. DEMO SCRIPTS For demos, see the 'demo' directory and the subdirectories therein. The current reigning champion of all the demos is the combination of the multi_stim demo. This demonstrates a large fraction of what the Vision Egg is capable of. If will probably push your hardware, maybe even breaking on older systems. DOCUMENTATION The Programmer's Manual and API Reference are available in doc/index.html To get started, please look at the tutorials (on the website), demo programs (in the "demo" directory). The ultimate authority is the source code. OUTPUT LOGGING The output of the Vision Egg is logged using the standard Python logging package. The default log is a file named "VisionEgg.log". If unspecified, or if there are problems opening the log file, the log will be printed to the system's standard error console. I recommend examining the log after running Vision Egg scripts. You can increase the verbosity of the output by doing something like "VisionEgg.logger.setLevel( VisionEgg.logging.DEBUG )" in your script. WHEN SOMETHING GOES WRONG Exceptions are normally logged to the same log file as the rest of the Vision Egg (see above). However, in some cases (a SyntaxError, for example), the Vision Egg cannot load, and the exception is only printed to the console (terminal window). In this case, you will have to look at the console. On Windows, the console is normally open during the execution of a python program, but disappers once python terminates. If you run the script from the command line, however, the console window is not closed, and you can scroll back. On Mac OS X, a Terminal window displays this information (when the script ends in .py, but not .pyw). On other flavors of Unix, you probably know (and may even love) the console! LICENSE The Vision Egg is copyright (c) Andrew D. Straw, 2001-2003. It is distributed under the terms of the GNU LGPL (Lesser General Public License.) See LICENSE.txt for more information. This software is provided "as is" without any warranty of any kind, either expressed or implied. MAILING LIST Sign up for the mailing list at http://www.visionegg.org/mailinglist.htmlvisionegg-1.2.1/README.txt0000644000076500000240000000263311224565527014404 0ustar astrawstaffWelcome to the Vision Egg! INSTALLATION To install from source, type this from a command line (as root, if necessary) from the Vision Egg base directory: python setup.py install However, the above assumes all of the prerequisites are working. For blow-by-blow accounts of how I got the prerequisites for the Vision Egg installed on all the supported platforms, check out the website at http://www.visionegg.org/ RUN THE CONFIGURATION CHECK (BEFORE AND/OR AFTER INSTALLATION) Check for pre-requisites on your system by running check-config.py. This can be run before or after installation of the Vision Egg, and also displays useful information about the Vision Egg, if already installed. DEMOS, DOCUMENTATION, ETC. The demos are no longer installed, but they are included with the source code and the demo packages. See the README-DEMOS.txt file in those packages. The documentation start page is doc/index.html LICENSE The Vision Egg is Copyright (c) 2001-2008 by the Vision Egg Authors. It is distributed under the terms of the GNU LGPL (Lesser General Public License.) See LICENSE.txt for more information. This software is provided "as is" without any warranty of any kind, either expressed or implied. CREDITS (SOURCE CODE INCLUDED WITH THE VISION EGG DISTRIBUTION) See http://visionegg.org/Miscellaneous/CreditsAndThanks for more. MAILING LIST Sign up for the mailing list at http://visionegg.org/Miscellaneous visionegg-1.2.1/setup.cfg0000644000076500000240000000007311231315557014515 0ustar astrawstaff[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 visionegg-1.2.1/setup.py0000755000076500000240000003143611231311544014410 0ustar astrawstaff#!/usr/bin/env python """Setup script for the Vision Egg distribution. """ # Copyright (C) 2001-2003 Andrew Straw # Copyright (C) 2004-2008 California Institute of Technology # Distributed under the terms of the GNU Lesser General Public License # (LGPL). name = "visionegg" version = "1.2.1" # setuptools will add ".dev", keep in sync # with VisionEgg/__init__.py and doc/visionegg.tex. author = "Andrew Straw" author_email = "astraw@users.sourceforge.net" home_page = "http://www.visionegg.org/" license = "LGPL" # Lesser GNU Public License description = "2D/3D visual stimulus generation" long_description = \ """The Vision Egg is a programming library (with demo applications) that uses standard, inexpensive computer graphics cards to produce visual stimuli for vision research experiments. For more information, visit the website at www.visionegg.org Any feedback, questions, or comments, should go to the mailing list at visionegg@freelists.org The Vision Egg is Copyright (c) by its authors and is distributed under the GNU Lesser General Public License (LGPL). This software comes with absolutely no warranties, either expressed or implied. """ classifiers = [ 'Development Status :: 5 - Production/Stable', 'Environment :: Win32 (MS Windows)', 'Environment :: X11 Applications', 'Environment :: MacOS X', 'Environment :: Other Environment', 'Intended Audience :: Developers', 'Intended Audience :: Science/Research', 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', 'Natural Language :: English', 'Operating System :: Microsoft :: Windows', 'Operating System :: MacOS :: MacOS X', 'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: IRIX', 'Programming Language :: Python', 'Programming Language :: C', 'Topic :: Multimedia :: Graphics', 'Topic :: Multimedia :: Graphics :: 3D Rendering', 'Topic :: Multimedia :: Graphics :: Presentation', 'Topic :: Multimedia :: Video :: Display', 'Topic :: Scientific/Engineering', 'Topic :: Scientific/Engineering :: Human Machine Interfaces', 'Topic :: Scientific/Engineering :: Medical Science Apps.', 'Topic :: Scientific/Engineering :: Visualization', 'Topic :: Software Development :: Libraries', ] from setuptools import setup, Extension from setuptools.command.build_ext import build_ext from distutils.errors import CCompilerError import distutils.command.sdist from distutils import dir_util import sys, os.path, glob, traceback import numpy packages = [ 'VisionEgg', 'VisionEgg.PyroApps', ] ext_package = 'VisionEgg' ext_modules = [] # filled in later # Fill out ext_modules skip_c_compilation = 0 if not skip_c_compilation: if sys.platform == 'darwin': gl_extra_link_args = ['-framework','OpenGL'] else: gl_extra_link_args = [] if sys.platform == 'win32': gl_libraries = ['opengl32']#,'glu32'] elif sys.platform.startswith('linux'): gl_libraries = ['GL'] else: gl_libraries = [] if sys.platform == 'win32': qt_include_dirs = [r'C:\Program Files\QuickTime SDK\CIncludes'] qt_library_dirs = [r'C:\Program Files\QuickTime SDK\Libraries'] qt_libraries = ['qtmlClient'] if 1: # from http://lab.msdn.microsoft.com/express/visualc/usingpsdk/default.aspx winlibs = "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib" winliblist = [fname[:-4] for fname in winlibs.split()] qt_libraries = qt_libraries+winliblist qt_extra_link_args = [] elif sys.platform == 'darwin': qt_include_dirs = [] qt_library_dirs = [] qt_libraries = [] qt_extra_link_args = ['-framework','QuickTime', '-framework','Carbon', ] else: qt_include_dirs = [] qt_library_dirs = [] qt_libraries = [] qt_extra_link_args = [] if sys.platform == 'darwin': darwin_maxpriority_sources = ['VisionEgg/darwin_maxpriority.pyx'] ext_modules.append(Extension(name='darwin_maxpriority', sources=darwin_maxpriority_sources)) # VBL synchronization stuff ext_modules.append(Extension(name='_darwin_sync_swap', sources=['VisionEgg/_darwin_sync_swap.m'], extra_link_args=['-framework','OpenGL'])) # getfresh ext_modules.append(Extension(name='_darwin_getrefresh', sources=['VisionEgg/darwin_getrefresh.m', 'VisionEgg/darwin_getrefresh_wrap.c'], extra_link_args=['-framework','Cocoa'])) elif sys.platform == 'win32': ext_modules.append(Extension(name='_win32_maxpriority', sources=[os.path.join('VisionEgg','win32_maxpriority.c'), os.path.join('VisionEgg','win32_maxpriority_wrap.c')])) ext_modules.append(Extension(name='_win32_getrefresh', sources=[os.path.join('VisionEgg','win32_getrefresh.c'), os.path.join('VisionEgg','win32_getrefresh_wrap.c')], libraries=['User32'], )) vretrace_source = 'win32_vretrace.pyx' ext_modules.append(Extension(name='win32_vretrace', sources=[os.path.join('VisionEgg',vretrace_source), os.path.join('VisionEgg','win32_load_driver.c')], libraries=['User32'], )) elif sys.platform.startswith('linux') or sys.platform.startswith('irix'): ext_modules.append(Extension(name='_posix_maxpriority', sources=['VisionEgg/posix_maxpriority.c', 'VisionEgg/posix_maxpriority_wrap.c'])) if sys.platform.startswith('linux'): ext_modules.append(Extension(name='_raw_lpt_linux',sources=['VisionEgg/_raw_lpt_linux.c'])) else: # sys.platform.startswith('irix') ext_modules.append(Extension(name='_raw_plp_irix',sources=['VisionEgg/_raw_plp_irix.c'])) if sys.platform == 'darwin' or sys.platform== 'win32': # QuickTime support ext_modules.append(Extension(name='_gl_qt', sources=['VisionEgg/gl_qt.c', 'VisionEgg/gl_qt_wrap.c', 'VisionEgg/movieconvert.c', ], include_dirs=qt_include_dirs, library_dirs=qt_library_dirs, libraries=qt_libraries+gl_libraries, extra_link_args=(qt_extra_link_args+ gl_extra_link_args), )) # _vegl ext_modules.append(Extension(name='_vegl', sources=['VisionEgg/_vegl.pyx',], libraries=gl_libraries, extra_link_args=gl_extra_link_args )) # C extensions for drawing GL stuff include_prefix = os.path.join( sys.prefix, 'include', 'python%s'%sys.version[:3] ) numpy_include_dir = numpy.get_include() ext_modules.append(Extension(name='_draw_in_c', sources=['VisionEgg/_draw_in_c.c'], include_dirs=[numpy_include_dir], libraries=gl_libraries, extra_link_args=gl_extra_link_args )) if 0: data_files = [] data_base_dir = 'VisionEgg' # This becomes VISIONEGG_SYSTEM_DIR data_dir = os.path.join(data_base_dir,'data') test_dir = os.path.join(data_base_dir,'test') data_files.append( (data_dir,[os.path.join('data','water.mov')]) ) data_files.append( (data_dir,[os.path.join('data','panorama.jpg')]) ) data_files.append( (data_dir,[os.path.join('data','spiral.png')]) ) data_files.append( (data_dir,[os.path.join('data','az_el.png')]) ) data_files.append( (data_dir,[os.path.join('data','visionegg.bmp')]) ) data_files.append( (data_dir,[os.path.join('data','visionegg.tif')]) ) for filename in os.listdir('test'): if filename.endswith('.py'): data_files.append( (test_dir,[os.path.join('test',filename)]) ) data_files.append( (data_base_dir,['check-config.py','VisionEgg.cfg','README.txt','LICENSE.txt']) ) else: opj = os.path.join package_data = {'VisionEgg':[opj('data','water.mov'), opj('data','panorama.jpg'), opj('data','spiral.png'), opj('data','az_el.png'), opj('data','visionegg.bmp'), opj('data','visionegg.tif'), 'VisionEgg.cfg', ]} global extension_build_failed extension_build_failed = 0 class sdist_demo( distutils.command.sdist.sdist ): description = 'build demos and documentation' def get_file_list (self): distutils.command.sdist.sdist.get_file_list(self) new_files = [] for orig_file in self.filelist.files: if orig_file.startswith('demo') or orig_file.startswith('doc') or orig_file.startswith('test'): new_files.append(orig_file) elif orig_file in ['check-config.py', #'VisionEgg.cfg', # location changed.. XXX FIXME 'CHANGELOG.txt', 'README-DEMOS.txt', 'LICENSE.txt', ]: new_files.append(orig_file) self.filelist.files = new_files def make_distribution (self): # call sdist make_distribution after changing our name base_fullname = self.distribution.get_fullname() fullname = base_fullname + "-demo" def get_fullname(): return fullname self.distribution.get_fullname = get_fullname # override this method distutils.command.sdist.sdist.make_distribution(self) # call super class ve_build_ext( build_ext ): # This class allows C extension building to fail. # No extension is essential to the Vision Egg. def build_extension(self, ext): try: build_ext.build_extension(self, ext) except CCompilerError, x: print ('*'*70+'\n')*3 print """WARNING: The %s extension module to the Vision Egg could not be compiled. The Vision Egg should run, but the features present in that file will not be available. Above is the ouput showing how the compilation failed."""%ext.name if sys.platform == 'win32': print print """I see you are using Windows. The default compiler for this platform is the Microsoft Visual Studio C compiler. However, a free alternative compiler called mingw can be used instead.""" print print ('*'*70+'\n')*3 global extension_build_failed if not extension_build_failed: extension_build_failed = 1 def main(): # make sure older versions of distutils work extras_kws = {} if (hasattr(distutils.core, 'setup_keywords') and 'classifiers' in distutils.core.setup_keywords): extras_kws['classifiers'] = classifiers # Call setup - normal distutils behavior setup( name=name, version=version, description=description, author=author, author_email=author_email, url=home_page, license=license, packages=packages, ext_package=ext_package, ext_modules=ext_modules, package_data=package_data, long_description=long_description, cmdclass={'build_ext':ve_build_ext, 'sdist_demo':sdist_demo, }, **extras_kws ) if extension_build_failed: print ('*'*70+'\n')*3 print """WARNING: Building of some extensions failed. Please see the messages above for details.\n""" print ('*'*70+'\n')*3 if __name__ == "__main__": main() visionegg-1.2.1/swig_src/0000755000076500000240000000000011231315557014514 5ustar astrawstaffvisionegg-1.2.1/swig_src/darwin_getrefresh.i0000644000076500000240000000074011224565531020372 0ustar astrawstaff%module darwin_getrefresh %{ PyObject *PyErr_DarwinGetRefreshError; %} %init %{ /* New exception */ PyErr_DarwinGetRefreshError = PyErr_NewException( "VisionEgg.DarwinGetRefreshError", NULL, NULL ); // New reference Py_INCREF(PyErr_DarwinGetRefreshError); %} %exception { $action if (darwin_getrefresh_err_occurred()) { PyErr_SetString(PyErr_DarwinGetRefreshError, (const char *)darwin_getrefresh_err_message()); return NULL; } } double getrefresh( void ); visionegg-1.2.1/swig_src/darwin_getrefresh.m0000644000076500000240000000332011224565531020373 0ustar astrawstaff#include #import int darwin_getrefresh_error = 0; const char * darwin_getrefresh_error_str= NULL; int darwin_getrefresh_err_occurred( void ) { return darwin_getrefresh_error; } const char * darwin_getrefresh_err_message( void ) { return darwin_getrefresh_error_str; } void darwin_getrefresh_set_error(const char * errmsg) { darwin_getrefresh_error = 1; darwin_getrefresh_error_str = errmsg; } double getrefresh( void ) { // This is based on SDL12 http://www.libsdl.org/ CFDictionaryRef mode = NULL; CFNumberRef refreshRateCFNumber = NULL; double refreshRate; mode = CGDisplayCurrentMode(kCGDirectMainDisplay); if ( NULL == mode ) { darwin_getrefresh_set_error("Cannot get display mode"); goto ERROR; } refreshRateCFNumber = CFDictionaryGetValue (mode, kCGDisplayRefreshRate); if ( NULL == refreshRateCFNumber ) { darwin_getrefresh_set_error("Mode has no refresh rate"); goto ERROR; } if ( 0 == CFNumberGetValue (refreshRateCFNumber, kCFNumberDoubleType, &refreshRate) ) { // From CGDirectDisplay.h: (Mac OS X 10.2.6, Dec 2002 Developer Tools: // // Some display systems may not conventional video vertical and // horizontal sweep in painting. These displays report a // kCGDisplayRefreshRate of 0 in the CFDictionaryRef returned by // CGDisplayCurrentMode(). On such displays, this function // returns at once. darwin_getrefresh_set_error("Error getting refresh rate - no conventional video sweep?"); goto ERROR; } if ( 0 == refreshRate ) { darwin_getrefresh_set_error("Error getting refresh rate - no conventional video sweep?"); goto ERROR; } return refreshRate; ERROR: return 0; } visionegg-1.2.1/swig_src/gl_qt.c0000644000076500000240000001577311224565531016004 0ustar astrawstaff/* * Copyright (c) 2003, 2006 Andrew Straw. Distributed under the terms * of the GNU Lesser General Public License (LGPL). * * Author: Andrew Straw * */ #include "Python.h" #if defined(MS_WINDOWS) # include #endif #include #include #if defined(__APPLE__) # include # include # include #else # include # include #endif #include "gl_qt.h" int gl_qt_error = 0; const char * gl_qt_error_str= NULL; static char mac_err_str[256]; const char * MAC_OSERR_TO_STR ( int OSErr ) { // XXX could make this lookup the error using mac Estr resources snprintf(mac_err_str,256,"Mac OS error %d",OSErr); return mac_err_str; } int gl_qt_err_occurred( void ) { return gl_qt_error; } const char * gl_qt_err_message( void ) { return gl_qt_error_str; } void gl_qt_set_error(const char * errmsg) { gl_qt_error = 1; gl_qt_error_str = errmsg; } gl_qt_renderer* gl_qt_renderer_create( Movie theMovie, short tex_shape, float tex_scale ) { gl_qt_renderer * render_info = NULL; short gMovieWidth, gMovieHeight; int wOffScreenDepth; long sizeTexture; // Movie Rect gMovieRect = {0, 0, 0, 0}; Rect rectNewMovie; MatrixRecord movieMatrix; /// XXX todo: should check tex_shape is power of 2 render_info = malloc(sizeof(gl_qt_renderer)); if (render_info == NULL) { gl_qt_set_error("memory allocation failure (render_info)"); return NULL; } render_info->gl_texel_data = NULL; render_info->qt_pixel_data = NULL; render_info->offscreen_gworld = NULL; render_info->my_movie = theMovie; GetMovieBox(render_info->my_movie, &gMovieRect); gMovieRect.bottom = gMovieRect.bottom-gMovieRect.top; gMovieRect.top = 0; gMovieRect.right = gMovieRect.right-gMovieRect.left; gMovieRect.left = 0; SetMovieBox(render_info->my_movie, &gMovieRect); gMovieWidth = (short) (gMovieRect.right - gMovieRect.left); gMovieHeight = (short) (gMovieRect.bottom - gMovieRect.top); render_info->tex_shape=tex_shape; // on both sides (square) wOffScreenDepth=32; // if packed pixel implemented, this could be reduced // allocate RGB 888 texture buffer sizeTexture = 3 * tex_shape * tex_shape; // size of texture in bytes render_info->gl_texel_data = (GLubyte *)malloc(sizeTexture); if (render_info->gl_texel_data == NULL) { gl_qt_set_error("memory allocation failure (render_info->gl_texel_data)"); goto fail; } if (tex_scale == 0.0) { // auto-scale if (gMovieWidth > gMovieHeight) { tex_scale = (float)tex_shape / (float) gMovieWidth; } else { tex_scale = (float)tex_shape / (float) gMovieHeight; } } render_info->tex_width = (short) ((float)gMovieWidth * tex_scale); render_info->tex_height = (short) ((float)gMovieHeight * tex_scale); if ((render_info->tex_width > tex_shape) || (render_info->tex_height > tex_shape)) { gl_qt_set_error("movie too big for assigned texture shape"); goto fail; } SetIdentityMatrix (&movieMatrix); ScaleMatrix(&movieMatrix, X2Fix(tex_scale), // XXX where is X2Fix defined? X2Fix(tex_scale), X2Fix(0.0), X2Fix(0.0)); SetMovieMatrix(render_info->my_movie, &movieMatrix); rectNewMovie.top = 0; rectNewMovie.left = 0; rectNewMovie.bottom = render_info->tex_height; rectNewMovie.right = render_info->tex_width; render_info->row_stride = render_info->tex_width * wOffScreenDepth / 8; render_info->qt_pixel_data = (unsigned char *) malloc(render_info->row_stride * render_info->tex_height); if (render_info->qt_pixel_data == NULL) { gl_qt_set_error("memory allocation failure (render_info->qt_pixel_data)"); goto fail; } memset(render_info->qt_pixel_data, 0, render_info->row_stride * render_info->tex_height); QTNewGWorldFromPtr (&(render_info->offscreen_gworld), k32ARGBPixelFormat, &rectNewMovie, NULL, NULL, 0, render_info->qt_pixel_data, render_info->row_stride); if (render_info->offscreen_gworld == NULL) { gl_qt_set_error("error allocating offscreen GWorld"); goto fail; } SetMovieGWorld(render_info->my_movie, (CGrafPtr)render_info->offscreen_gworld, NULL); render_info->offscreen_pixmap = GetGWorldPixMap(render_info->offscreen_gworld); if (!render_info->offscreen_pixmap) { gl_qt_set_error("Could not GetGWorldPixMap"); goto fail; } if (!LockPixels(render_info->offscreen_pixmap)) { gl_qt_set_error("Could not LockPixels"); goto fail; } render_info->qt_pixel_data = (unsigned char *) GetPixBaseAddr(render_info->offscreen_pixmap); //render_info->row_stride = (unsigned long) GetPixRowBytes(render_info->offscreen_pixmap); return render_info; fail: if (render_info->gl_texel_data != NULL) { free(render_info->gl_texel_data); } if (render_info->qt_pixel_data != NULL) { free(render_info->qt_pixel_data); } if (render_info->offscreen_gworld != NULL) { DisposeGWorld(render_info->offscreen_gworld); } if (render_info != NULL) { free(render_info); } return NULL; } void gl_qt_renderer_delete( gl_qt_renderer * render_info ) { int free_warning = 0; if (render_info->offscreen_gworld != NULL) DisposeGWorld(render_info->offscreen_gworld); else free_warning = 1; if (render_info->gl_texel_data != NULL) free(render_info->gl_texel_data); else free_warning = 1; if (render_info->qt_pixel_data != NULL) free(render_info->qt_pixel_data); else free_warning = 1; if (render_info != NULL) free(render_info); else free_warning = 1; if (free_warning) { gl_qt_set_error("gl_qt_renderer_delete() called, but something was already deleted!"); } } void gl_qt_renderer_update(gl_qt_renderer * render_info) { // Despite the swizzeling, this is faster (on my PowerBook G4 ATI // Rage 128 OS X 10.2.6, anyway) than sending the data as GL_ABGR // direct to OpenGL. // Also, this way we can flip the image 'right side up' (according // to OpenGL) for free. // Step 1 - 'swizzle' data (convert ABGR to RGB) register int i,j; register unsigned char * pos; register unsigned char * pTextile; register int row; GLenum error; const char *this_msg; row = render_info->tex_height; for (j = 0; j < render_info->tex_height; j++) { row--; pTextile = render_info->gl_texel_data + row*render_info->tex_width*3; // pTextile = render_info->gl_texel_data + row*render_info->tex_shape*3; for (i = 0; i < render_info->tex_width; i++) { pos = (unsigned char *)(render_info->qt_pixel_data + (j * render_info->row_stride) + (i * 4)); *(pTextile++) = *(pos + 1); *(pTextile++) = *(pos + 2); *(pTextile++) = *(pos + 3); } } // Step 2 - send to OpenGL active 2D texture object glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, render_info->tex_width, render_info->tex_height, GL_RGB, GL_UNSIGNED_BYTE, render_info->gl_texel_data); error = glGetError(); if (GL_NO_ERROR != error) { //this_msg = gluErrorString(error); this_msg = "unknown error"; gl_qt_set_error(this_msg); } } visionegg-1.2.1/swig_src/gl_qt.h0000644000076500000240000000150311224565531015773 0ustar astrawstaff#ifndef _QUICKTIME_C_H_ #define _QUICKTIME_C_H_ #if defined(__APPLE__) # include # include #else # include # include #endif typedef struct { Movie my_movie; // OpenGL info GLubyte * gl_texel_data; short tex_shape; short tex_height; short tex_width; // QuickTime offscreen info unsigned char * qt_pixel_data; unsigned long row_stride; GWorldPtr offscreen_gworld; PixMapHandle offscreen_pixmap; } gl_qt_renderer; /* Error checking */ int gl_qt_err_occurred(void); const char * gl_qt_err_message(void); /* Standard functions */ gl_qt_renderer* gl_qt_renderer_create( Movie theMovie, short tex_shape, float tex_scale ); // tex_scale = 0.0 is auto void gl_qt_renderer_delete( gl_qt_renderer *); void gl_qt_renderer_update( gl_qt_renderer *); #endif visionegg-1.2.1/swig_src/gl_qt.i0000644000076500000240000000144211224565531015776 0ustar astrawstaff%module gl_qt %{ #if defined(MS_WINDOWS) # include #endif #include "gl_qt.h" #include "movieconvert.h" PyObject *PyErr_GL_QTError; /* Errors generated by OpenGL/QuickTime code */ %} %init %{ /* New exception for GL_QT code */ PyErr_GL_QTError = PyErr_NewException( "VisionEgg.QuickTime.GL_QTError", NULL, NULL ); // New reference Py_INCREF(PyErr_GL_QTError); %} %exception { $action if (gl_qt_err_occurred()) { PyErr_SetString(PyErr_GL_QTError, gl_qt_err_message()); return NULL; } } %typemap(in) Movie theMovie { MovieObj_Convert($input,&$1); }; gl_qt_renderer* gl_qt_renderer_create( Movie theMovie, short tex_shape, float tex_scale ); // tex_scale = 0.0 is auto void gl_qt_renderer_delete( gl_qt_renderer *); void gl_qt_renderer_update( gl_qt_renderer *); visionegg-1.2.1/swig_src/make.py0000755000076500000240000000525611224565531016017 0ustar astrawstaff#!/usr/bin/env python import os, shutil, sys, stat # This works on swig == 1.3.17 (And not on swig == 1.3.13). # Check for swig version if possible try: import commands except: print "Unable to check for proper SWIG version because the commands module did not load." swig_command = "swig" if len(sys.argv) > 1: swig_command = sys.argv[1] if 'commands' in globals().keys(): status, output = commands.getstatusoutput(swig_command + " -version") if status != 0: print "WARNING: Error checking SWIG version" else: swig_version = output.split('\n')[1] if swig_version.find('SWIG Version 1.3.17') != 0: if swig_version.find('SWIG Version 1.3.24') != 0: raise RuntimeError( "Wrong SWIG version: %s" % (swig_version,) ) else: print "WARNING: Error checking SWIG version" swig_src_dir = os.path.split(sys.argv[0])[0] if swig_src_dir: # the above returns '' if we're in it on Python2.1 os.chdir(swig_src_dir) interfaces = ["darwin_getrefresh", "gl_qt", "posix_maxpriority", "win32_getrefresh", "win32_maxpriority", ] product_suffixes = ["_wrap.c", ".py"] other_source_suffixes = [".m", ".c", ".h"] for i in interfaces: interface_filename = i+".i" products = map(i.__add__,product_suffixes) other_sources = map(i.__add__,other_source_suffixes) mod_time = os.stat(interface_filename)[stat.ST_MTIME] must_rebuild = False found_any = False for product in products: if os.path.exists(product): found_any = True if os.stat(product)[stat.ST_MTIME] < mod_time: must_rebuild = True if not found_any: must_rebuild = True if must_rebuild: sys_string = "%s -python %s"%(swig_command,interface_filename) print sys_string if 'commands' in globals().keys(): status, output = commands.getstatusoutput(sys_string) if status != 0: print "ERROR:", output raise RuntimeError("SWIG error") else: print "WARNING: Cannot verify success of operation" os.system(sys_string) else: pass copy_files = products + other_sources for filename in copy_files: if not os.path.exists(filename): continue new_filename = "../VisionEgg/"+filename if not os.path.exists(new_filename) or os.stat(new_filename)[stat.ST_MTIME] < os.stat(filename)[stat.ST_MTIME]: shutil.copy2(filename,new_filename) # copy2 preserves attributes print "copied %s to ../VisionEgg/"%filename visionegg-1.2.1/swig_src/posix_maxpriority.c0000644000076500000240000000074411224565531020477 0ustar astrawstaff#include #include #include int set_self_policy_priority( int policy, int priority ); int stop_memory_paging( void ); int set_self_policy_priority( int policy, int priority ) { struct sched_param params; params.sched_priority = priority; return sched_setscheduler(0,policy,¶ms); } int stop_memory_paging( void ) { #if defined(MCL_CURRENT) && defined(MCL_FUTURE) return mlockall( MCL_CURRENT | MCL_FUTURE ); #else return 0; #endif } visionegg-1.2.1/swig_src/posix_maxpriority.i0000644000076500000240000000110411224565531020474 0ustar astrawstaff%module posix_maxpriority %{ #include #include #include %} /* policies */ %constant int SCHED_RR = SCHED_RR; %constant int SCHED_FIFO = SCHED_FIFO; /* define errno handler */ %exception { errno = 0; $action if (errno) { PyErr_SetFromErrno(PyExc_OSError); goto fail; // this line supported on swig 1.3.17 } } /* in posix_maxpriority.c */ extern int set_self_policy_priority( int policy, int priority ); extern int stop_memory_paging(); /* in system libraries */ extern int sched_get_priority_max( int policy ); %exception; visionegg-1.2.1/swig_src/win32_getrefresh.c0000644000076500000240000000035511224565531020044 0ustar astrawstaff#include double getrefresh() { DEVMODE DevMode; DevMode.dmDriverExtra = 0; if (EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&DevMode)) { return (double)DevMode.dmDisplayFrequency; } else { return 0; } } visionegg-1.2.1/swig_src/win32_getrefresh.i0000644000076500000240000000006611224565531020051 0ustar astrawstaff%module win32_getrefresh extern double getrefresh(); visionegg-1.2.1/swig_src/win32_maxpriority.c0000644000076500000240000000064311224565531020275 0ustar astrawstaff#include // winbase.h is all we really want, but it doesn't include all the headers it needs #include unsigned short set_self_process_priority_class( int priority_class ) { return (unsigned short)SetPriorityClass( GetCurrentProcess(), priority_class ); } unsigned short set_self_thread_priority( int priority ) { return (unsigned short)SetThreadPriority( GetCurrentThread(), priority ); } visionegg-1.2.1/swig_src/win32_maxpriority.i0000644000076500000240000001005711224565531020303 0ustar astrawstaff%module win32_maxpriority %{ #include // winbase.h is all we really want, but it doesn't include all the headers it needs #include %} /* Priority classes */ %constant int IDLE_PRIORITY_CLASS = IDLE_PRIORITY_CLASS; %constant int NORMAL_PRIORITY_CLASS = NORMAL_PRIORITY_CLASS; %constant int HIGH_PRIORITY_CLASS = HIGH_PRIORITY_CLASS; %constant int REALTIME_PRIORITY_CLASS = REALTIME_PRIORITY_CLASS; /* Thread priorities */ %constant int THREAD_PRIORITY_IDLE = THREAD_PRIORITY_IDLE; %constant int THREAD_PRIORITY_LOWEST = THREAD_PRIORITY_LOWEST; %constant int THREAD_PRIORITY_BELOW_NORMAL = THREAD_PRIORITY_BELOW_NORMAL; %constant int THREAD_PRIORITY_NORMAL = THREAD_PRIORITY_NORMAL; %constant int THREAD_PRIORITY_ABOVE_NORMAL = THREAD_PRIORITY_ABOVE_NORMAL; %constant int THREAD_PRIORITY_HIGHEST = THREAD_PRIORITY_HIGHEST; %constant int THREAD_PRIORITY_TIME_CRITICAL = THREAD_PRIORITY_TIME_CRITICAL; /* The actual priority "base priority" is determined according to this table. B Process Priority Class Thread Priority Level 1 IDLE_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_IDLE 1 HIGH_PRIORITY_CLASS THREAD_PRIORITY_IDLE 2 IDLE_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 3 IDLE_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 4 IDLE_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 4 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 5 IDLE_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 5 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 5 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 6 IDLE_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 6 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 6 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 7 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 7 Background NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 7 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 8 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 8 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 8 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 8 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 9 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 9 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 9 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 10 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 10 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 11 Foreground NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 11 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 11 HIGH_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 12 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 12 HIGH_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 13 HIGH_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 14 HIGH_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 15 HIGH_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL 15 IDLE_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL 15 BELOW_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL 15 NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL 15 ABOVE_NORMAL_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL 16 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE 17 REALTIME_PRIORITY_CLASS -7 18 REALTIME_PRIORITY_CLASS -6 19 REALTIME_PRIORITY_CLASS -5 20 REALTIME_PRIORITY_CLASS -4 21 REALTIME_PRIORITY_CLASS -3 22 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_LOWEST 23 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_BELOW_NORMAL 24 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_NORMAL 25 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_ABOVE_NORMAL 26 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_HIGHEST 27 REALTIME_PRIORITY_CLASS 3 28 REALTIME_PRIORITY_CLASS 4 29 REALTIME_PRIORITY_CLASS 5 30 REALTIME_PRIORITY_CLASS 6 31 REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL */ /* in win32_maxpriority.c */ // Should raise exception (after calling Win32 GetLastError) if these return zero extern unsigned short set_self_process_priority_class( int priority_class ); extern unsigned short set_self_thread_priority( int priority ); visionegg-1.2.1/test/0000755000076500000240000000000011231315557013653 5ustar astrawstaffvisionegg-1.2.1/test/conform.py0000644000076500000240000006106711224565531015703 0ustar astrawstaff#!/usr/bin/env python import unittest import VisionEgg import VisionEgg.Core import VisionEgg.FlowControl import OpenGL.GL as gl # for some specific test cases: import VisionEgg.ParameterTypes import VisionEgg.Dots import VisionEgg.Gratings import VisionEgg.MoreStimuli import VisionEgg.SphereMap import VisionEgg.Textures import Numeric import Image import ImageDraw import os import time # Use Python's bool constants if available, make aliases if not try: True except NameError: True = 1==1 False = 1==0 # Define "sum" if it's not available as Python function try: sum except NameError: import operator def sum( values ): return reduce(operator.add, values ) # start logging to file try: import logging import logging.handlers except ImportError: import VisionEgg.py_logging as logging log_fname = 'conform.log' log_handler_logfile = logging.FileHandler( log_fname ) print "saving log file to",log_fname log_handler_logfile.setFormatter( VisionEgg.log_formatter ) VisionEgg.logger.addHandler( log_handler_logfile ) class VETestCase(unittest.TestCase): def setUp(self): kw_params = {'size' : (512,512), 'fullscreen' : False, 'preferred_bpp' : 32, 'maxpriority' : False, 'hide_mouse' : False, 'frameless' : False, 'bgcolor' : (0.0, 0.0, 1.0), 'sync_swap' : True, } try: self.screen = VisionEgg.Core.Screen( **kw_params ) except Exception, x: try: kw_params['preferred_bpp'] = 24 self.screen = VisionEgg.Core.Screen( **kw_params ) except Exception, x: kw_params['preferred_bpp'] = 0 self.screen = VisionEgg.Core.Screen( **kw_params ) self.screen.clear() VisionEgg.Core.swap_buffers() self.ortho_viewport = VisionEgg.Core.Viewport( screen = self.screen ) def tearDown(self): VisionEgg.Core.swap_buffers() # just for a brief flash... del self.screen def pickle_test(self, pickleable): import pickle a = pickleable a_pickle = pickle.dumps(a) a_test = pickle.loads(a_pickle) for attr_name in dir(a): if hasattr(a,attr_name): attr_orig = getattr(a,attr_name) attr_test = getattr(a_test,attr_name) self.failUnless(type(attr_orig) == type(attr_test)) if hasattr(attr_orig,'__dict__'): for k in attr_orig.__dict__.keys(): self.failUnless(type(attr_orig.__dict__[k]) == type(attr_test.__dict__[k])) def test_feedback_mode(self): l = 250 r = 300 b = 200 t = 350 stimulus = VisionEgg.MoreStimuli.Target2D( position=(l,b), anchor='lowerleft', size=(r-l,t-b), ) self.ortho_viewport.parameters.stimuli = [ stimulus ] gl.glFeedbackBuffer(1000,gl.GL_3D) gl.glRenderMode( gl.GL_FEEDBACK ) self.ortho_viewport.draw() feedback_buffer = gl.glRenderMode( gl.GL_RENDER ) sent_verts = [(l,b,0), (r,b,0), (r,t,0), (l,t,0)] recv_verts = feedback_buffer[0][1] self.failUnless( len(sent_verts) == len(recv_verts), 'feedback received wrong number of verts') for s,r in zip(sent_verts,recv_verts): s=Numeric.asarray(s) r=Numeric.asarray(r) diff = abs(s-r) err = sum(diff) self.failUnless( err < 1e-10, 'verts changed') def test_ve3d_simple(self): import VisionEgg.ThreeDeeMath as ve3d l = 250 r = 300 b = 200 t = 350 sent_verts = [(l,b,0), (r,b,0), (r,t,0), (l,t,0)] recv_verts = self.ortho_viewport.eye_2_window(sent_verts) for s,r in zip(sent_verts,recv_verts): s=Numeric.asarray(s[:2]) # only testing 2D r=Numeric.asarray(r[:2]) # only testing 2D diff = abs(s-r) err = sum(diff) self.failUnless( err < 1e-10, 'verts changed') def test_ve3d_transforms1(self): import VisionEgg.ThreeDeeMath as ve3d gl.glMatrixMode(gl.GL_PROJECTION) # identity M = ve3d.TransformMatrix() ve3d_m = M.matrix gl.glLoadIdentity() gl_m = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) self.failUnless( Numeric.allclose(ve3d_m, gl_m), 'identity matrix different') # translate args=(10,20,30) M = ve3d.TransformMatrix() M.translate(*args) ve3d_m = M.matrix gl.glLoadIdentity() gl.glTranslatef(*args) gl_m = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) self.failUnless( Numeric.allclose(ve3d_m, gl_m), 'translation matrix different') # rotate args=(-22.5,10,20,-30) M = ve3d.TransformMatrix() M.rotate(*args) ve3d_m = M.matrix gl.glLoadIdentity() gl.glRotatef(*args) gl_m = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) self.failUnless( Numeric.allclose(ve3d_m, gl_m), 'rotation matrix different') # scale args=(1,10.5,123.2) M = ve3d.TransformMatrix() M.scale(*args) ve3d_m = M.matrix gl.glLoadIdentity() gl.glScalef(*args) gl_m = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) self.failUnless( Numeric.allclose(ve3d_m, gl_m), 'scale matrix different') def test_ve3d_transforms2(self): import VisionEgg.ThreeDeeMath as ve3d translate1 = (1,2,3) rotate = (45, 2, 5, 10) scale = (.1, 2.0, 4.0) translate2 = (-10,25,300) gl.glMatrixMode(gl.GL_PROJECTION) gl.glLoadIdentity() gl.glTranslatef(*translate1) gl.glRotatef(*rotate) gl.glScalef(*scale) gl.glTranslatef(*translate2) gl_m = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) M = ve3d.TransformMatrix() M.translate(*translate1) M.rotate(*rotate) M.scale(*scale) M.translate(*translate2) ve3d_m = M.matrix diff = abs(gl_m-ve3d_m) err = sum(diff) self.failUnless( err < 1e-10, 'matrices different') def test_ve3d_mixed_transforms(self): import VisionEgg.ThreeDeeMath as ve3d l = 250 r = 300 b = 200 t = 350 stimulus = VisionEgg.MoreStimuli.Target2D( position=(l,b), anchor='lowerleft', size=(r-l,t-b), ) # M mimics the projection matrix (modelview matrix is effectively identity) M = self.ortho_viewport.parameters.projection.get_matrix().copy() M = ve3d.TransformMatrix(M) M.translate(10,20,0) self.ortho_viewport.parameters.projection.translate(10,20,0) self.ortho_viewport.parameters.stimuli = [ stimulus ] gl.glFeedbackBuffer(1000,gl.GL_3D) gl.glRenderMode( gl.GL_FEEDBACK ) self.ortho_viewport.draw() feedback_buffer = gl.glRenderMode( gl.GL_RENDER ) sent_verts = [(l,b,0), (r,b,0), (r,t,0), (l,t,0)] gl_recv_verts = feedback_buffer[0][1] clip_coords = M.transform_vertices( sent_verts ) norm_device = ve3d.normalize_homogeneous_rows(clip_coords) ve3d_recv_verts = self.ortho_viewport.norm_device_2_window(norm_device) # check x and y coords for g,v in zip(gl_recv_verts,ve3d_recv_verts): g=Numeric.asarray(g[:2]) v=Numeric.asarray(v[:2]) diff = abs(g-v) err = sum(diff) self.failUnless( err < 1e-10, 'VisionEgg.ThreeDeeMath calculated window position wrong') # check z coord for g,v in zip(gl_recv_verts,ve3d_recv_verts): err = abs(g[2]-v[2]) self.failUnless( err < 1e-10, 'VisionEgg.ThreeDeeMath calculated window depth wrong') def test_ClassWithParameters_pickle_ability(self): self.pickle_test( VisionEgg.ClassWithParameters() ) def test_parameter_types_simple(self): ve_types = VisionEgg.ParameterTypes b = ve_types.Boolean ui = ve_types.UnsignedInteger i = ve_types.Integer r = ve_types.Real ve_types.assert_type(b,ui) ve_types.assert_type(b,i) ve_types.assert_type(b,r) ve_types.assert_type(ui,i) ve_types.assert_type(ui,r) ve_types.assert_type(i,r) def test_parameter_types_sequence(self): ve_types = VisionEgg.ParameterTypes sr = ve_types.Sequence( ve_types.Real ) s4r = ve_types.Sequence4( ve_types.Real ) s3r = ve_types.Sequence3( ve_types.Real ) s2r = ve_types.Sequence2( ve_types.Real ) ve_types.assert_type(s4r,sr) ve_types.assert_type(s3r,sr) ve_types.assert_type(s2r,sr) s4i = ve_types.Sequence4( ve_types.Integer ) s3i = ve_types.Sequence3( ve_types.Integer ) s2i = ve_types.Sequence2( ve_types.Integer ) ve_types.assert_type(s4i,sr) ve_types.assert_type(s3i,sr) ve_types.assert_type(s2i,sr) def test_parameter_types_instance(self): ve_types = VisionEgg.ParameterTypes istim = ve_types.Instance( VisionEgg.Core.Stimulus ) itext = ve_types.Instance( VisionEgg.Text.Text ) ve_types.assert_type(itext,istim) class A: # classic classes pass class B(A): pass ia = ve_types.Instance( A ) ib = ve_types.Instance( B ) ve_types.assert_type(ib, ia) class An(object): # new style classes pass class Bn(An): pass ian = ve_types.Instance( An ) ibn = ve_types.Instance( Bn ) ve_types.assert_type(ibn, ian) def test_presentation_go(self): p = VisionEgg.FlowControl.Presentation(go_duration=(5,'frames')) p.go() def test_presentation_go_twice(self): p = VisionEgg.FlowControl.Presentation(go_duration=(5,'frames')) p.go() p.go() # check to make sure it works a second time def test_presentation_go_duration(self): p = VisionEgg.FlowControl.Presentation(go_duration=(1,'frames')) p.go() p.parameters.go_duration = (2,'frames') p.go() p.parameters.go_duration = (3,'frames') p.go() p.parameters.go_duration = (0,'frames') p.go() p.parameters.go_duration = (0.05,'seconds') p.go() def test_presentation_go_not(self): p = VisionEgg.FlowControl.Presentation(go_duration=(0,'frames')) p.go() # make sure it works with 0 duration def test_presentation_frame_drop_test(self): p = VisionEgg.FlowControl.Presentation(go_duration=(0,'frames')) p.go() # make sure it works with 0 duration p.were_frames_dropped_in_last_go_loop() self.failUnless(not p.were_frames_dropped_in_last_go_loop(),'frame drop test false positive') orig_framerate_setting = VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ fake_hz = 200.0 VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ = fake_hz skip_frame = VisionEgg.FlowControl.FunctionController( during_go_func = lambda t: time.sleep(2.0/fake_hz)) p.add_controller(None,None,skip_frame) p.parameters.go_duration = 3,'frames' orig_threshold = p.parameters.warn_longest_frame_threshold p.parameters.warn_longest_frame_threshold = 1.1 p.go() p.remove_controller(None,None,skip_frame) VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ = orig_framerate_setting p.parameters.warn_longest_frame_threshold = orig_threshold self.failUnless(p.were_frames_dropped_in_last_go_loop(),'missed simulated dropped frame') def test_core_screen_query_refresh_rate(self): fps = self.screen.query_refresh_rate() def test_core_screen_measure_refresh_rate(self): fps = self.screen.measure_refresh_rate() def test_core_refresh_rates_match(self): fps1 = self.screen.query_refresh_rate() # measure frame rate over a longish period for accuracy fps2 = self.screen.measure_refresh_rate(average_over_seconds=1.0) percent_diff = abs(fps1-fps2)/max(fps1,fps2)*100.0 self.failUnless(percent_diff < 5.0,'measured (%.1f fps) and queried (%.1f fps) frame rates different (swap buffers may not be synced to vsync)'%(fps2,fps1)) def test_core_fixation_spot(self): stimulus = VisionEgg.Core.FixationSpot() self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_dots_dotarea2d(self): stimulus = VisionEgg.Dots.DotArea2D() self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_gratings_singrating2d(self): stimulus = VisionEgg.Gratings.SinGrating2D() self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_gratings_singrating2d_2colors(self): stimulus = VisionEgg.Gratings.SinGrating2D(color1=(1,0,0), color2=(0,0,1)) self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_gratings_singrating2d_mask(self): mask = VisionEgg.Textures.Mask2D() stimulus = VisionEgg.Gratings.SinGrating2D(mask=mask) self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_spheremap_azelgrid(self): stimulus = VisionEgg.SphereMap.AzElGrid(my_viewport=self.ortho_viewport) self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_spheremap_spheremap(self): filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data","az_el.png") texture = VisionEgg.Textures.Texture(filename) stimulus = VisionEgg.SphereMap.SphereMap(texture=texture, shrink_texture_ok=True) self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_spheremap_spherewindow(self): stimulus = VisionEgg.SphereMap.SphereWindow() self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_texture_pil(self): width, height = self.screen.size orig = Image.new("RGB",(width,height),(255,0,0)) orig_draw = ImageDraw.Draw(orig) # white cross orig_draw.line( (0,0,width,height), fill=(255,255,255) ) orig_draw.line( (0,height,width,0), fill=(255,255,255) ) # blue vertical line orig_draw.line( (10,0,10,height), fill=(0,0,255) ) texture = VisionEgg.Textures.Texture(orig) result = texture.get_texels_as_image() self.failUnless(result.tostring()==orig.tostring(),'exact texture reproduction with PIL textures failed') def test_texture_stimulus_3d(self): stimulus = VisionEgg.Textures.TextureStimulus3D() self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_textures_spinning_drum(self): stimulus1 = VisionEgg.Textures.SpinningDrum() stimulus2 = VisionEgg.Textures.SpinningDrum() self.ortho_viewport.parameters.stimuli = [ stimulus1, stimulus2 ] self.ortho_viewport.draw() def test_textures_spinning_drum_flat(self): stimulus = VisionEgg.Textures.SpinningDrum(flat=1, anchor='center', ) self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_textures_fixation_cross(self): stimulus = VisionEgg.Textures.FixationCross() self.ortho_viewport.parameters.stimuli = [ stimulus ] self.ortho_viewport.draw() def test_texture_stimulus_pil_rgb(self): width, height = self.screen.size orig = Image.new("RGB",(width,height),(0,255,0)) orig_draw = ImageDraw.Draw(orig) # white cross orig_draw.line( (0,0,width,height), fill=(255,255,255) ) orig_draw.line( (0,height,width,0), fill=(255,255,255) ) # blue vertical line orig_draw.line( (10,0,10,height), fill=(0,0,255) ) texture_stimulus = VisionEgg.Textures.TextureStimulus( texture = VisionEgg.Textures.Texture(orig), internal_format = gl.GL_RGB, position = (0,0), anchor = 'lowerleft', texture_min_filter = gl.GL_NEAREST, # XXX shouldn't have to do this! texture_mag_filter = gl.GL_NEAREST, # XXX shouldn't have to do this! ) self.ortho_viewport.parameters.stimuli = [ texture_stimulus ] self.ortho_viewport.draw() result = self.screen.get_framebuffer_as_image(format=gl.GL_RGB) self.failUnless(result.tostring()==orig.tostring(),'exact texture stimulus reproduction with PIL RGB textures failed') def test_texture_stimulus_pil_rgba(self): width, height = self.screen.size # Note: all alpha should be 255 (=OpenGL 1.0) for this test to # work because otherwise the test image gets blended with # whatever OpenGL has in the background orig = Image.new("RGBA",(width,height),(0,255,0,255)) # green, full alpha background orig_draw = ImageDraw.Draw(orig) # white cross orig_draw.line( (0,0,width,height), fill=(255,255,255,255) ) orig_draw.line( (0,height,width,0), fill=(255,255,255,255) ) # blue vertical line orig_draw.line( (10,0,10,height), fill=(0,0,255,255) ) # this breaks test (alpha != 255) # orig_draw.line( (20,0,20,height), fill=(0,0,255,127) ) # orig_draw.line( (30,0,30,height), fill=(255,0,0,127) ) texture_stimulus = VisionEgg.Textures.TextureStimulus( texture = VisionEgg.Textures.Texture(orig), internal_format = gl.GL_RGBA, position = (0,0), anchor = 'lowerleft', texture_min_filter = gl.GL_NEAREST, # XXX shouldn't have to do this! texture_mag_filter = gl.GL_NEAREST, # XXX shouldn't have to do this! ) self.ortho_viewport.parameters.stimuli = [ texture_stimulus ] self.ortho_viewport.draw() result = self.screen.get_framebuffer_as_image(format=gl.GL_RGBA) self.failUnless(result.tostring()==orig.tostring(),'exact texture stimulus reproduction with PIL RGBA textures failed') def test_texture_stimulus_numpy_rgb(self): width, height = self.screen.size orig = Numeric.zeros((height,width,3),Numeric.UnsignedInt8) # sprinkle a few test pixels orig[ 4, 4, :]=255 orig[ 6, 6, 0]=255 orig[ 8, 8, 1]=127 # more text pixels as border orig[ :, 0,:]=255 orig[ :,-1,:]=255 orig[ 0, :,:]=255 orig[-1, :,:]=255 texture_stimulus = VisionEgg.Textures.TextureStimulus( texture = VisionEgg.Textures.Texture(orig), internal_format = gl.GL_RGB, position = (0,0), anchor = 'lowerleft', mipmaps_enabled = False, # not (yet?) supported for Numeric arrays ) self.ortho_viewport.parameters.stimuli = [ texture_stimulus ] self.ortho_viewport.draw() result = self.screen.get_framebuffer_as_array(format=gl.GL_RGB) orig_test = orig.astype(Numeric.Int) # allow signed addition result_test = result.astype(Numeric.Int) # allow signed addition abs_diff = sum(abs(Numeric.ravel(orig_test) - Numeric.ravel(result_test))) self.failUnless(abs_diff == 0,'exact texture reproduction with Numeric RGB textures failed') def test_texture_stimulus_numpy_rgba(self): width, height = self.screen.size orig = Numeric.zeros((height,width,4),Numeric.UnsignedInt8) # Note: all alpha should be 255 (=OpenGL 1.0) for this test to # work because otherwise the test image gets blended with # whatever OpenGL has in the background # set alpha all on orig[ :, :, 3]=255 # sprinkle a few test pixels orig[ 4, 4, :]=255 orig[ 6, 6, 0]=255 orig[ 8, 8, 1]=127 # alpha breaks the test: #orig[ 2, 2, 3]=0 #orig[ 9, 9, 0]=255 #orig[ 9, 9, 3]=127 # more text pixels as border orig[ :, 0,:]=255 orig[ :,-1,:]=255 orig[ 0, :,:]=255 orig[-1, :,:]=255 texture_stimulus = VisionEgg.Textures.TextureStimulus( texture = VisionEgg.Textures.Texture(orig), internal_format = gl.GL_RGBA, position = (0,0), anchor = 'lowerleft', mipmaps_enabled = False, # not (yet?) supported for Numeric arrays ) self.ortho_viewport.parameters.stimuli = [ texture_stimulus ] self.ortho_viewport.draw() result = self.screen.get_framebuffer_as_array(format=gl.GL_RGBA) orig_test = orig.astype(Numeric.Int) # allow signed addition result_test = result.astype(Numeric.Int) # allow signed addition abs_diff = sum(abs(Numeric.ravel(orig_test) - Numeric.ravel(result_test))) self.failUnless(abs_diff == 0,'exact texture reproduction with Numeric RGBA textures failed') def suite(): ve_test_suite = unittest.TestSuite() ve_test_suite.addTest( VETestCase("test_feedback_mode") ) ve_test_suite.addTest( VETestCase("test_ve3d_simple") ) ve_test_suite.addTest( VETestCase("test_ve3d_transforms1") ) ve_test_suite.addTest( VETestCase("test_ve3d_transforms2") ) ve_test_suite.addTest( VETestCase("test_ve3d_mixed_transforms") ) ve_test_suite.addTest( VETestCase("test_ClassWithParameters_pickle_ability") ) ve_test_suite.addTest( VETestCase("test_parameter_types_simple") ) ve_test_suite.addTest( VETestCase("test_parameter_types_sequence") ) ve_test_suite.addTest( VETestCase("test_parameter_types_instance") ) ve_test_suite.addTest( VETestCase("test_presentation_go") ) ve_test_suite.addTest( VETestCase("test_presentation_go_twice") ) ve_test_suite.addTest( VETestCase("test_presentation_go_duration") ) ve_test_suite.addTest( VETestCase("test_presentation_go_not") ) ve_test_suite.addTest( VETestCase("test_presentation_frame_drop_test") ) ve_test_suite.addTest( VETestCase("test_core_refresh_rates_match") ) ve_test_suite.addTest( VETestCase("test_core_screen_query_refresh_rate") ) ve_test_suite.addTest( VETestCase("test_core_screen_measure_refresh_rate") ) ve_test_suite.addTest( VETestCase("test_core_fixation_spot") ) ve_test_suite.addTest( VETestCase("test_dots_dotarea2d") ) ve_test_suite.addTest( VETestCase("test_gratings_singrating2d") ) ve_test_suite.addTest( VETestCase("test_gratings_singrating2d_mask") ) ve_test_suite.addTest( VETestCase("test_gratings_singrating2d_2colors") ) ve_test_suite.addTest( VETestCase("test_spheremap_azelgrid") ) ve_test_suite.addTest( VETestCase("test_spheremap_spheremap") ) ve_test_suite.addTest( VETestCase("test_spheremap_spherewindow") ) ve_test_suite.addTest( VETestCase("test_texture_pil") ) ve_test_suite.addTest( VETestCase("test_texture_stimulus_3d") ) ve_test_suite.addTest( VETestCase("test_textures_spinning_drum") ) ve_test_suite.addTest( VETestCase("test_textures_spinning_drum_flat") ) ve_test_suite.addTest( VETestCase("test_textures_fixation_cross") ) ve_test_suite.addTest( VETestCase("test_texture_stimulus_numpy_rgb") ) ve_test_suite.addTest( VETestCase("test_texture_stimulus_numpy_rgba") ) ve_test_suite.addTest( VETestCase("test_texture_stimulus_pil_rgb") ) ve_test_suite.addTest( VETestCase("test_texture_stimulus_pil_rgba") ) return ve_test_suite runner = unittest.TextTestRunner() runner.run(suite()) visionegg-1.2.1/test/display_dc_restoration.py0000755000076500000240000001153411224565531021001 0ustar astrawstaff#!/usr/bin/env python """Test for incomplete DC restoration.""" description = \ """From Brainard, Pelli, Robson (2002): There are at least six causes for the failure of pixel independence. ... [See display_voltage_regulation.py for test 3.] 4. Incomplete DC restoration. Unfortunately, the video amplifier in most CRT monitors is not DC coupled. Instead it is AC coupled most of the time, and momentarily DC couple to make zero volts produce black at the end of the vertical blanking interval. (DC, "direct current,") refers to zero temporal frequency; AC, "alternating current," refers to all high frequencies.) This is called "DC restoration," which is slightly cheaper to design and build than a fully DC coupled video circuit. If the AC time constant were much longer than a frame, the DC restoration would be equivalent to DC coupling, but, in practice, the AC time constant is typically short relative to the duration of a frame, so that the same video voltage will produce different screen luminances depending on the average voltage since the last blanking interval. As for failure 3, this effect is negligible at the top of the screen and maximal at the bottom. However, this effect can be distinguished from failure 3 by using silent substitution. To test, say, the green primary, use a green test spot, and switch the background (the rest of the screen) back and forth between green and blue. The green and blue backgrounds are indistinguishable to the high-voltage power supply (it serves all three guns) but are distinct to the video amplifiers (one per gun). Brainard, D.H., Pelli, D.G., & Robson, T. (2002). Display Characterization. In: J. Hornak (Ed.) Encyclopedia of Imaging Science and Technology (pp. 172-188): Wiley. """ import VisionEgg from VisionEgg.Core import * from VisionEgg.MoreStimuli import * import pygame import pygame.locals # Use Python's bool constants if available, make aliases if not try: True except NameError: True = 1==1 False = 1==0 bpps = [32, 24, 16, 0] sizes = [ (640,480), (800,600), (1024,768), (1280,1024) ] for bpp in bpps: success = False for size in sizes: print 'trying to initialize fullscreen %d x %d, %d bpp'%( size[0], size[1], bpp) try: screen = VisionEgg.Core.Screen( size = size, fullscreen = True, preferred_bpp = bpp, maxpriority = False, hide_mouse = True, sync_swap = True, ) success = True except: pass if success: break # we don't need to try other resolutions if success: break if not success: raise RuntimeError('ERROR: could not initialize fullscreen mode.') if not screen.constant_parameters.sync_swap: raise RuntimeError('This test requires sync_swap to work') screen.set(bgcolor = (0.0,0.0,0.0)) # black (RGB) bar = Target2D( size = (screen.size[0]/10, screen.size[1]), position = (screen.size[0]/2, screen.size[1]/2), anchor = 'center', ) viewport = Viewport( screen = screen, stimuli = [bar], ) current_channel = 'green' quit_now = False toggle = False # flip bit while not quit_now: toggle = not toggle for event in pygame.event.get(): if event.type == pygame.locals.QUIT: quit_now = True elif event.type == pygame.locals.KEYDOWN: if event.key == pygame.locals.K_ESCAPE: quit_now = True elif event.type == pygame.locals.KEYDOWN: if event.key == pygame.locals.K_r: current_channel = 'red' elif event.key == pygame.locals.K_g: current_channel = 'green' elif event.key == pygame.locals.K_b: current_channel = 'blue' if current_channel == 'red': bar.parameters.color = (1.0,0.0,0.0) if toggle: screen.parameters.bgcolor = (0.0,1.0,0.0) else: screen.parameters.bgcolor = bar.parameters.color elif current_channel == 'green': bar.parameters.color = (0.0,1.0,0.0) if toggle: screen.parameters.bgcolor = (0.0,0.0,1.0) else: screen.parameters.bgcolor = bar.parameters.color elif current_channel == 'blue': bar.parameters.color = (0.0,0.0,1.0) if toggle: screen.parameters.bgcolor = (1.0,0.0,0.0) else: screen.parameters.bgcolor = bar.parameters.color screen.clear() viewport.draw() swap_buffers() visionegg-1.2.1/test/display_voltage_regulation.py0000644000076500000240000000746211224565531021656 0ustar astrawstaff#!/usr/bin/env python """Test for poor high-voltage regulation.""" description = \ """From Brainard, Pelli, Robson (2002): There are at least six causes for the failure of pixel independence. ... 3. Poor high-voltage regulation. The electron beam current is accelerated by a high voltage (15 to 50 kV) power supply, and on cheaper monitors, the voltage may slowly drop when the average beam current is high. This has the effect of making the intensity of each pixel dependent on the average intensity of all the pixels that preceded it. (The high-voltage supply will generally recuperate between frames.) You can test for such long-distance effects by displaying a steady white bar in the center of your display surrounded by a uniform field of variable luminance. Changing the surround from white to black ideally would have no effect on the luminance of the bar. To try this informally without a photometer, create a cardboard shield with a hole smaller than the bar to occlude a flickering surround, and observe whether the bar is steady. This effect depends on position. The effect is negligible at the top of the screen and maximal at the bottom. A single high-voltage supply generally provides the current for all three channels (R, G, and B), so that the effect on a particular test spot is independent of the channel used for background modulation. When the high voltage is very poorly regulated, the whole screen image expands as the image is made brighter, because as the increased current pulls the high voltage down, the electrons take longer to reach the screen and deflect more. [See display_dc_restoration.py for test 4.] Brainard, D.H., Pelli, D.G., & Robson, T. (2002). Display Characterization. In: J. Hornak (Ed.) Encyclopedia of Imaging Science and Technology (pp. 172-188): Wiley. """ import VisionEgg from VisionEgg.Core import * from VisionEgg.MoreStimuli import * import pygame from pygame.locals import * # Use Python's bool constants if available, make aliases if not try: True except NameError: True = 1==1 False = 1==0 bpps = [32, 24, 16, 0] sizes = [ (640,480), (800,600), (1024,768), (1280,1024) ] for bpp in bpps: success = False for size in sizes: print 'trying to initialize fullscreen %d x %d, %d bpp'%( size[0], size[1], bpp) try: screen = VisionEgg.Core.Screen( size = size, fullscreen = True, preferred_bpp = bpp, maxpriority = False, hide_mouse = True, sync_swap = True, ) success = True except: pass if success: break # we don't need to try other resolutions if success: break if not success: raise RuntimeError('ERROR: could not initialize fullscreen mode.') if not screen.constant_parameters.sync_swap: raise RuntimeError('This test requires sync_swap to work') screen.set(bgcolor = (0.0,0.0,0.0)) # black (RGB) bar = Target2D( size = (screen.size[0]/10, screen.size[1]), position = (screen.size[0]/2, screen.size[1]/2), anchor = 'center', ) viewport = Viewport( screen = screen, stimuli = [bar], ) black = True while not pygame.event.peek((QUIT,KEYDOWN,MOUSEBUTTONDOWN)): black = not black if black: screen.parameters.bgcolor = (0.0,0.0,0.0) # black (RGB) else: screen.parameters.bgcolor = (1.0,1.0,1.0) # white (RGB) screen.clear() viewport.draw() swap_buffers() visionegg-1.2.1/test/font_torture.py0000644000076500000240000000212411224565531016757 0ustar astrawstaff# test suggested by Mason Smith on VE mailing list import VisionEgg from VisionEgg.Core import * from VisionEgg.Text import * import pygame import pygame.locals bpps = [32, 24, 16, 0] sizes = [ (640,480), (800,600), (1024,768), (1280,1024) ] for bpp in bpps: success = False for size in sizes: print 'trying to initialize window %d x %d, %d bpp'%( size[0], size[1], bpp) try: screen = VisionEgg.Core.Screen( size = size, fullscreen = False, preferred_bpp = bpp, maxpriority = False, hide_mouse = True, sync_swap = True, ) success = True except: pass if success: break # we don't need to try other resolutions if success: break stims = [] for i in range(2000): print i t = Text() stims.append( t ) visionegg-1.2.1/test/opengl_info.py0000755000076500000240000001327211224565531016535 0ustar astrawstaff#!/usr/bin/env python # # This is the python source code for a utility which checks # lots of things about the current OpenGL system. # # It is part of the Vision Egg package, but does not require # the Vision Egg to be installed. # # Copyright (c) 2001-2003 Andrew Straw. Distributed under the terms # of the GNU General Public License (GPL). __cvs__ = '$Revision$'.split()[1] __date__ = ' '.join('$Date$'.split()[1:3]) __author__ = 'Andrew Straw ' import time, sys, string import pygame from pygame.locals import * from OpenGL.GL import * # PyOpenGL packages from Numeric import * def capitalize_word(word): result = word if word[0] in string.lowercase: result = string.upper(word[0]) + word[1:] return result ARB_exts = ['matrix_palette','multisample','multitexture','point_parameters', 'texture_border_clamp','texture_compression','texture_cube_map', 'texture_env_add','texture_env_combine','texture_env_crossbar', 'texture_env_dot3','transpose_matrix','vertex_blend'] EXT_exts = ['abgr','bgra','blend_color','blend_minmax','blend_subtract', 'clip_volume_hint','compiled_vertex_array','draw_range_elements', 'fog_coord','multi_draw_arrays','packed_pixels', 'paletted_texture','point_parameters','rescale_normal', 'secondary_color','separate_specular_color','shared_texture_palette', 'stencil_wrap','texture_compression_s3tc','texture3D','texture_cube_map', 'texture_edge_clamp','texture_env_add','texture_env_combine', 'texture_env_dot3','texture_filter_anisotropic','texture_lod_bias', 'texture_object','vertex_array','vertex_weighting'] if sys.platform == 'win32': time_func = time.clock else: time_func = time.time ### Setup graphics width = 640 height = 480 size = (width,height) if sys.platform == "darwin": # bug in Mac OS X version of pygame pygame.init() pygame.display.init() pygame.display.set_caption("OpenGL Test") try_bpps = [0,32,24] # bits per pixel (32 = 8 bits red, 8 green, 8 blue, 8 alpha) flags = OPENGL | DOUBLEBUF found_mode = 0 for bpp in try_bpps: modeList = pygame.display.list_modes( bpp, flags ) if modeList == -1: # equal to -1 if any resolution will work found_mode = 1 else: if len(modeList) == 0: # any resolution is OK found_mode = 1 else: if size in modeList: found_mode = 1 else: size = modeList[0] print "WARNING: Using %dx%d video mode instead of requested size."%(size[0],size[1]) if found_mode: break if found_mode == 0: print "WARNING: Could not find acceptable video mode! Trying anyway..." print "Initializing graphics at %d x %d ( %d bpp )."%(size[0],size[1],bpp) pygame.display.set_mode((width,height), flags, bpp ) print ### Get OpenGL info print "OpenGL information returned from OpenGL drivers:" print " GL_VENDOR =",glGetString(GL_VENDOR) print " GL_RENDERER =",glGetString(GL_RENDERER) print " GL_VERSION = ",glGetString(GL_VERSION) print " GL_EXTENSIONS =" for extension in string.split(glGetString(GL_EXTENSIONS)): print " ",extension print ### Get WGL info if this is win32 if sys.platform == 'win32': from OpenGL.WGL.EXT.extensions_string import * if wglInitExtensionsStringEXT(): # Returns 1 if it's working print " WGL_EXTENSIONS =" for extension in string.split(wglGetExtensionsStringEXT()): print " ",extension print ### Buffer information print "Buffer information" print " GL_AUX_BUFFERS =",glGetIntegerv( GL_AUX_BUFFERS ) print " GL_RGBA_MODE =",glGetBooleanv( GL_RGBA_MODE ) print " GL_DOUBLEBUFFER = ",glGetBooleanv( GL_DOUBLEBUFFER ) print " GL_STEREO = ",glGetBooleanv( GL_STEREO ) print " GL_RED_BITS =",glGetIntegerv( GL_RED_BITS ) print " GL_GREEN_BITS =",glGetIntegerv( GL_GREEN_BITS ) print " GL_BLUE_BITS =",glGetIntegerv( GL_BLUE_BITS ) print " GL_ALPHA_BITS =",glGetIntegerv( GL_ALPHA_BITS ) print " GL_ACCUM_RED_BITS =",glGetIntegerv( GL_ACCUM_RED_BITS ) print " GL_ACCUM_GREEN_BITS =",glGetIntegerv( GL_ACCUM_GREEN_BITS ) print " GL_ACCUM_BLUE_BITS =",glGetIntegerv( GL_ACCUM_BLUE_BITS ) print " GL_ACCUM_ALPHA_BITS =",glGetIntegerv( GL_ACCUM_ALPHA_BITS ) print ### Test OpenGL extensions print "Testing PyOpenGL extension support" for ext in ARB_exts: print " GL_ARB_%s:"%ext, module_name = "OpenGL.GL.ARB.%s"%ext try: mod = __import__(module_name,globals(),locals(),[]) components = string.split(module_name, '.') # make mod refer to deepest module for comp in components[1:]: mod = getattr(mod, comp) init_name = "glInit%sARB"%string.join(map(capitalize_word,string.split(ext,'_')),'') init_func = getattr(mod,init_name) if init_func(): print "OK" else: print "Failed" except Exception, x: print "Failed (exception raised):",x for ext in EXT_exts: print " GL_EXT_%s:"%ext, module_name = "OpenGL.GL.EXT.%s"%ext try: mod = __import__(module_name,globals(),locals(),[]) components = string.split(module_name, '.') # make mod refer to deepest module for comp in components[1:]: mod = getattr(mod, comp) init_name = "glInit%sEXT"%string.join(map(capitalize_word,string.split(ext,'_')),'') init_func = getattr(mod,init_name) if init_func(): print "OK" else: print "Failed" except Exception, x: print "Failed (exception raised):",x print print "Texture information" max_dim = glGetIntegerv(GL_MAX_TEXTURE_SIZE) print " GL_MAX_TEXTURE_SIZE is", max_dim visionegg-1.2.1/test/reopen_screen.py0000644000076500000240000000315511224565531017061 0ustar astrawstaff#!/usr/bin/env python # Test for bug reported by Jeremy Hill in which re-opening the screen # would cause a segfault. import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() from VisionEgg.Core import Screen, Viewport, swap_buffers import pygame from pygame.locals import QUIT,KEYDOWN,MOUSEBUTTONDOWN from VisionEgg.Text import Text from VisionEgg.Dots import DotArea2D def run(): screen = Screen() screen.parameters.bgcolor = (0.0,0.0,0.0) # black (RGB) dots = DotArea2D( position = ( screen.size[0]/2.0, screen.size[1]/2.0 ), size = ( 300.0 , 300.0 ), signal_fraction = 0.1, signal_direction_deg = 180.0, velocity_pixels_per_sec = 10.0, dot_lifespan_sec = 5.0, dot_size = 3.0, num_dots = 100) text = Text( text = "Vision Egg dot_simple_loop demo.", position = (screen.size[0]/2,2), anchor = 'bottom', color = (1.0,1.0,1.0)) viewport = Viewport( screen=screen, stimuli=[dots,text] ) # The main loop below is an alternative to using the # VisionEgg.FlowControl.Presentation class. quit_now = 0 while not quit_now: for event in pygame.event.get(): if event.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN): quit_now = 1 screen.clear() viewport.draw() swap_buffers() screen.close() print "run 1" run() print "run 2" run() print "done" visionegg-1.2.1/test/unittests.py0000644000076500000240000000044011224565531016266 0ustar astrawstaff# run with nose import VisionEgg from VisionEgg.Text import Text def test_dav_obscure_bug(): # Test a bug reported by Dav Clark. Ported from # http://www.freelists.org/archives/visionegg/08-2008/msg00000.html s = VisionEgg.Core.Screen() t = Text() t.set(text='test') visionegg-1.2.1/update_docstrings.py0000755000076500000240000002137111224565531016777 0ustar astrawstaff#!/usr/bin/env python import os import sys import md5 import re import VisionEgg import VisionEgg.Core import VisionEgg.Daq import VisionEgg.DaqKeyboard import VisionEgg.Dots import VisionEgg.FlowControl import VisionEgg.Gratings import VisionEgg.MoreStimuli import VisionEgg.ResponseControl import VisionEgg.SphereMap import VisionEgg.Text import VisionEgg.Textures mods = [VisionEgg, VisionEgg.Core, VisionEgg.Daq, VisionEgg.DaqKeyboard, VisionEgg.Dots, VisionEgg.FlowControl, VisionEgg.Gratings, VisionEgg.MoreStimuli, VisionEgg.ResponseControl, VisionEgg.SphereMap, VisionEgg.Text, VisionEgg.Textures, ] mod_name_to_file = {} file_buffers = {} file_hashes = {} for mod in mods: orig_file = mod.__file__ if orig_file.endswith('pyc'): orig_file = orig_file[:-1] cur_file = os.path.join('VisionEgg',os.path.split(orig_file)[1]) mod_name_to_file[mod.__name__] = cur_file def get_str(xx,const=0): class_by_key = {} done_parameters_and_defaults = [] classes = VisionEgg.recursive_base_class_finder( xx ) # Fill self.parameters with parameter names and set to default values for klass in classes: if klass == object: continue # base class of new style classes - ignore if const: pd = klass.constant_parameters_and_defaults else: pd = klass.parameters_and_defaults if pd not in done_parameters_and_defaults: for parameter_name in pd.keys(): class_by_key[parameter_name] = klass done_parameters_and_defaults.append(pd) ks = class_by_key.keys() ks.sort() if len(ks): out_strs = [] if not const: out_strs.append('Parameters\n') out_strs.append('==========\n') else: out_strs.append('Constant Parameters\n') out_strs.append('===================\n') # pass 1: max_len = 0 for param_name in ks: max_len = max(max_len, len(param_name)) for param_name in ks: klass = class_by_key[param_name] if const: p = klass.constant_parameters_and_defaults else: p = klass.parameters_and_defaults if len(p[param_name]) > 3: if p[param_name][3] == VisionEgg.ParameterDefinition.DEPRECATED: continue type_str = param_name default = p[param_name][0] ve_type = p[param_name][1] if len(p[param_name]) > 2: description = p[param_name][2] + ' ' else: description = '' out_strs.append( '%s -- %s(%s)\n'%(param_name.ljust(max_len), description, str(ve_type)) ) if xx != klass: if klass.__module__ != xx.__module__: mod_name = '%s.'%klass.__module__ else: mod_name = '' out_strs.append( ' '*(max_len+4)+'Inherited from %s%s\n'%(mod_name,klass.__name__,)) tmp = str(default).split('\n') if default is None: tmp = ['(determined at runtime)'] if len(p[param_name]) > 3: if p[param_name][3] == VisionEgg.ParameterDefinition.OPENGL_ENUM: if default is None: gl_name = '(GL enum determined at runtime)' else: gl_name = str(default) tmp = [gl_name] out_strs.append( ' '*(max_len+4)+'Default: '+tmp[0]+'\n') if len(tmp) > 1: for i in range(1,len(tmp)): out_strs.append( ' '*(max_len+13)+tmp[i]+'\n') return out_strs xl = [] for mod in mods: orig_file = mod.__file__ if orig_file.endswith('pyc'): orig_file = orig_file[:-1] orig_fd = file(orig_file,"r") orig_hash = md5.new() orig_hash.update( orig_fd.read() ) fname = mod_name_to_file[ mod.__name__ ] cur_fd = file(fname,"r") cur_hash = md5.new() cur_hash.update( cur_fd.read() ) digest = cur_hash.digest() if orig_hash.digest() != digest: raise RuntimeError('%s is different in VisionEgg and site-packages'%fname) for x in mod.__dict__.keys(): xx = getattr(mod,x) xl.append(xx) file_hashes[fname] = digest for xx in xl: found=0 if type(xx) == type(VisionEgg.ClassWithParameters): if issubclass(xx,VisionEgg.ClassWithParameters): if not xx.__module__ in mod_name_to_file.keys(): print xx,'not in modules -- skipping' continue fname = mod_name_to_file[xx.__module__] if file_buffers.has_key(fname): buf = file_buffers[fname] else: fd = file(fname,'r') buf = fd.readlines() fd.close() del fd search_str = re.compile( r'^class %s\W'%xx.__name__ ) print 'searching for %s in %s'%(xx.__name__,fname) for line_no, line in enumerate(buf): if search_str.match(line): #print xx.__name__,fname,line_no+1,line found=1 break if not found: if xx.__name__ in ['StrokeText','GlutTextBase','BitmapText']: print 'skipping %s - not found, probably because no glut'%xx.__name__ continue raise RuntimeError("didn't find source for %s"%xx.__name__) doc_find = re.compile(r'"""') doc_start = line_no+1 if not doc_find.search(buf[doc_start]): print xx.__name__,fname,doc_start,": not doc string" continue doc_one_liner_find = re.compile(r'""".*"""') if doc_one_liner_find.search(buf[doc_start]): doc_stop = doc_start del_doc_stop = doc_stop+1 doc_lines = buf[doc_start:del_doc_stop] del buf[doc_start:del_doc_stop] else: doc_stop = doc_start+1 doc_found = 0 while not doc_found: if doc_find.search(buf[doc_stop]): doc_found=1 doc_stop += 1 del_doc_stop = doc_stop doc_lines = buf[doc_start:del_doc_stop-1] del buf[doc_start:del_doc_stop] trimmed_doc_lines = [] for doc_line in doc_lines: doc_line = doc_line.replace('"""','') if doc_line.startswith(' '): trimmed_doc_lines.append(doc_line[4:]) else: trimmed_doc_lines.append(doc_line) doc_lines = trimmed_doc_lines # trim old parameter definitions from docstring idx = len(doc_lines)-1 while idx >= 0: if doc_lines[idx] == 'Constant Parameters\n': doc_lines = doc_lines[:idx] break idx -= 1 idx = len(doc_lines)-1 while idx >= 0: if doc_lines[idx] == 'Parameters\n': doc_lines = doc_lines[:idx] break idx -= 1 # insert new parameter defintion ## params_lines = get_str(xx.parameters_and_defaults,const=0) ## const_lines = get_str(xx.constant_parameters_and_defaults,const=1) params_lines = get_str(xx,const=0) const_lines = get_str(xx,const=1) new_lines = doc_lines#['"""'+''.join(doc_lines)] new_lines[0] = '"""'+new_lines[0] if params_lines is not None: if new_lines[-1].strip() != '': new_lines.append('\n') new_lines.extend(params_lines) if const_lines is not None: if new_lines[-1].strip() != '': new_lines.append('\n') new_lines.extend(const_lines) new_lines.append('"""\n') final_new_lines = [] for new_line in new_lines: tmp = new_line.strip() if tmp == '': final_new_lines.append('\n') else: final_new_lines.append( ' '+new_line ) new_lines = final_new_lines buf[line_no+1:line_no+1] = new_lines # insert new docstring file_buffers[fname] = buf # reassign new buffer for fname, buf in file_buffers.iteritems(): buf = ''.join(buf) new_hash = md5.new() new_hash.update(buf) if new_hash.digest() != file_hashes[fname]: print 'saving',fname fd = file(fname,'w') fd.write(buf) fd.close() print 'done' visionegg-1.2.1/upload_to_pypi.sh0000755000076500000240000000010111224565531016253 0ustar astrawstaffpython setup.py register sdist --formats gztar,zip upload --sign visionegg-1.2.1/vc7.bat0000755000076500000240000000135711224565531014075 0ustar astrawstaffrem Modified from http://www.vrplumber.com/programming/mstoolkit/ rem vc7.bat, copied to the command path for the machine @echo off Set PATH=C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin;%PATH% Set INCLUDE=C:\Program Files\Microsoft Visual C++ Toolkit 2003\include;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\include;%INCLUDE% Set LIB=C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib;C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib;C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib;%LIB% echo Visit http://msdn.microsoft.com/visualc/using/documentation/default.aspx for echo complete compiler documentation.visionegg-1.2.1/VisionEgg/0000755000076500000240000000000011231315556014565 5ustar astrawstaffvisionegg-1.2.1/VisionEgg/__init__.py0000644000076500000240000005415211231311610016670 0ustar astrawstaff# The Vision Egg # # Copyright (C) 2001-2004 Andrew Straw # Copyright (C) 2004-2009 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # """ The Vision Egg package. The Vision Egg is a programming library (with demo applications) that uses standard, inexpensive computer graphics cards to produce visual stimuli for vision research experiments. Today's consumer computer graphics cards, thanks to the demands of computer gamers, are capable of drawing and updating computer graphics suitable for producing research-quality visual stimuli. The Vision Egg allows the vision scientist (or anyone else) to program these cards using OpenGL, the standard in computer graphics programming. Potentially difficult tasks, such as initializing graphics, getting precise timing information, controlling stimulus parameters in real-time, and synchronizing with data acquisition are greatly eased by routines within the Vision Egg. See the 'Core' module for the fundamental Vision Egg classes. """ release_name = '1.2.1' # keep in sync with ../setup.py __version__ = release_name import VisionEgg.Configuration import VisionEgg.ParameterTypes as ve_types import os, sys, time, types # standard python modules import numpy import numpy.oldnumeric as Numeric import warnings import traceback import StringIO import logging # available in Python 2.3 import logging.handlers if not hasattr(Numeric,'UInt8'): Numeric.UInt8 = 'b' if not hasattr(Numeric,'Float32'): Numeric.UInt8 = 'f' # Make sure we don't have an old version of the VisionEgg installed. # (There used to be a module named VisionEgg.VisionEgg. If it still # exists, it will randomly crash things.) if not hasattr(sys,'frozen'): # don't do this if frozen: try: __import__('VisionEgg.VisionEgg') except ImportError: pass # It's OK, the old version isn't there else: # If we can import it, report error raise RuntimeError('Outdated "VisionEgg.py" and/or "VisionEgg.pyc" found. Please delete from your VisionEgg package directory.') ############# Get config defaults ############# config = VisionEgg.Configuration.Config() ############# Logging ############# logger = logging.getLogger('VisionEgg') logger.setLevel( logging.INFO ) log_formatter = logging.Formatter('%(asctime)s (%(process)d) %(levelname)s: %(message)s') _default_logging_started = False def start_default_logging(maxBytes=100000): """Create and add log handlers""" global _default_logging_started if _default_logging_started: return # default logging already started if config.VISIONEGG_LOG_TO_STDERR: log_handler_stderr = logging.StreamHandler() log_handler_stderr.setFormatter( log_formatter ) logger.addHandler( log_handler_stderr ) if config.VISIONEGG_LOG_FILE: if hasattr(logging, 'handlers'): log_handler_logfile = logging.handlers.RotatingFileHandler( config.VISIONEGG_LOG_FILE, maxBytes=maxBytes ) else: log_handler_logfile = logging.FileHandler( config.VISIONEGG_LOG_FILE ) log_handler_logfile.setFormatter( log_formatter ) logger.addHandler( log_handler_logfile ) script_name = sys.argv[0] if not script_name: script_name = "(interactive shell)" logger.info("Script "+script_name+" started Vision Egg %s with process id %d."%(VisionEgg.release_name,os.getpid())) _default_logging_started = True ############# Default exception handler ############# if not sys.argv[0]: # Interactive mode config.VISIONEGG_GUI_ON_ERROR = 0 class _ExceptionHookKeeper: def handle_exception(self, exc_type, exc_value, exc_traceback): global config traceback_stream = StringIO.StringIO() traceback.print_exception(exc_type,exc_value,exc_traceback,None,traceback_stream) traceback_stream.seek(0) try: # don't send to stderr here (original exception handler does it) logger.removeHandler( log_handler_stderr ) removed_stderr = True except: removed_stderr = False logger.critical(traceback_stream.read()) if removed_stderr: logger.addHandler( log_handler_stderr ) if config is not None: if config.VISIONEGG_GUI_ON_ERROR and config.VISIONEGG_TKINTER_OK: # Should really check if any GUI windows are open and only do this then # close any open screens if hasattr(config,'_open_screens'): for screen in config._open_screens: screen.close() traceback_stream = StringIO.StringIO() traceback.print_tb(exc_traceback,None,traceback_stream) traceback_stream.seek(0) pygame_bug_workaround = False # do we need to workaround pygame bug? if hasattr(config,"_pygame_started"): if config._pygame_started: pygame_bug_workaround = True if sys.platform.startswith('linux'): # doesn't affect linux for some reason pygame_bug_workaround = False if not pygame_bug_workaround: if hasattr(config,'_Tkinter_used'): if config._Tkinter_used: import GUI GUI.showexception(exc_type, exc_value, traceback_stream.getvalue()) # continue on with normal exception processing: __keep_config__ = config # bizarre that the exception handler changes our values... self.orig_hook(exc_type, exc_value, exc_traceback) config = __keep_config__ # but we work around it! def __init__(self): self._sys = sys # preserve ref to sys module self.orig_hook = self._sys.excepthook # keep copy sys.excepthook = self.handle_exception def __del__(self): self._sys.excepthook = self.orig_hook # restore original def watch_exceptions(): """Catch exceptions, log them, and optionally open GUI.""" global _exception_hook_keeper _exception_hook_keeper = _ExceptionHookKeeper() def stop_watching_exceptions(): """Stop catching exceptions, returning to previous state.""" global _exception_hook_keeper del _exception_hook_keeper if config.VISIONEGG_ALWAYS_START_LOGGING: start_default_logging() watch_exceptions() if len(config._delayed_configuration_log_warnings) != 0: logger = logging.getLogger('VisionEgg.Configuration') for msg in config._delayed_configuration_log_warnings: logger.warning( msg ) ############ A base class finder utility function ########### def recursive_base_class_finder(klass): """A function to find all base classes.""" result = [klass] for base_class in klass.__bases__: for base_base_class in recursive_base_class_finder(base_class): result.append(base_base_class) # Make only a single copy of each class found result2 = [] for r in result: if r not in result2: result2.append(r) return result2 ############# Setup timing functions ############# if sys.platform == "win32": # on win32, time.clock() theoretically has better resolution than time.time() true_time_func = time.clock else: true_time_func = time.time # XXX Possible To-Do: # On MacOSX use AudioGetCurrentHostTime() and # AudioConvertHostTimeToNanos() # config._FRAMECOUNT_ABSOLUTE = 0 # initialize global variable def time_func_locked_to_frames(): return config._FRAMECOUNT_ABSOLUTE / float(config.VISIONEGG_MONITOR_REFRESH_HZ) time_func = true_time_func # name of time function Vision Egg programs should use def set_time_func_to_true_time(): time_func = true_time_func def set_time_func_to_frame_locked(): time_func = time_func_locked_to_frames def timing_func(): """DEPRECATED. Use time_func instead""" warnings.warn("timing_func() has been changed to time_func(). " "This warning will only be issued once, but each call to " "timing_func() will be slower than if you called time_func() " "directly", DeprecationWarning, stacklevel=2) return time_func() #################################################################### # # Parameters # #################################################################### class Parameters: """Parameter container. Simple empty class to act something like a C struct.""" pass class ParameterDefinition( dict ): """Define parameters used in ClassWithParameters """ DEPRECATED = 1 OPENGL_ENUM = 2 class ClassWithParameters( object ): """Base class for any class that uses parameters. Any class that uses parameters potentially modifiable in realtime should be a subclass of ClassWithParameters. This class enforces type checking and sets default values. Any subclass of ClassWithParameters can define two class (not instance) attributes, "parameters_and_defaults" and "constant_parameters_and_defaults". These are dictionaries where the key is a string containing the name of the parameter and the the value is a tuple of length 2 containing the default value and the type. For example, an acceptable dictionary would be {"parameter1" : (1.0, ve_types.Real)} See the ParameterTypes module for more information about types. """ parameters_and_defaults = ParameterDefinition({}) # empty for base class constant_parameters_and_defaults = ParameterDefinition({}) # empty for base class __slots__ = ('parameters','constant_parameters') # limit access only to specified attributes def __getstate__(self): """support for being pickled""" result = {} classes = recursive_base_class_finder(self.__class__) for klass in classes: if hasattr(klass,'__slots__'): for attr in klass.__slots__: if hasattr(self,attr): result[attr] = getattr(self,attr) return result def __setstate__(self,dict): """support for being unpickled""" for attr in dict.keys(): setattr(self,attr,dict[attr]) __safe_for_unpickling__ = True # tell python 2.2 we know what we're doing def __init__(self,**kw): """Create self.parameters and set values.""" self.constant_parameters = Parameters() # create self.constant_parameters self.parameters = Parameters() # create self.parameters # Get a list of all classes this instance is derived from classes = recursive_base_class_finder(self.__class__) done_constant_parameters_and_defaults = [] done_parameters_and_defaults = [] done_kw = [] # Fill self.parameters with parameter names and set to default values for klass in classes: if klass == object: continue # base class of new style classes - ignore # Create self.parameters and set values to keyword argument if found, # otherwise to default value. # # If a class didn't override base class's parameters_and_defaults dictionary, don't deal with it twice if hasattr(klass, 'parameters_and_defaults') and klass.parameters_and_defaults not in done_parameters_and_defaults: for parameter_name in klass.parameters_and_defaults.keys(): # Make sure this parameter key/value pair doesn't exist already if hasattr(self.parameters,parameter_name): raise ValueError("More than one definition of parameter '%s'"%parameter_name) # Get default value and the type value,tipe = klass.parameters_and_defaults[parameter_name][:2] # Check tipe is valid if not ve_types.is_parameter_type_def(tipe): raise ValueError("In definition of parameter '%s', %s is not a valid type declaration."%(parameter_name,tipe)) # Was a non-default value passed for this parameter? if kw.has_key(parameter_name): value = kw[parameter_name] done_kw.append(parameter_name) # Allow None to pass as acceptable value -- lets __init__ set own defaults if value is not None: # Check anything other than None if not tipe.verify(value): print 'parameter_name',parameter_name print 'value',value print 'type value',type(value) print 'isinstance(value, numpy.ndarray)',isinstance(value, numpy.ndarray) print 'tipe',tipe if not isinstance(value, numpy.ndarray): value_str = str(value) else: if Numeric.multiply.reduce(value.shape) < 10: value_str = str(value) # print array if it's smallish else: value_str = "(array data)" # don't pring if it's big raise TypeError("Parameter '%s' value %s is type %s (not type %s) in %s"%(parameter_name,value_str,type(value),tipe,self)) setattr(self.parameters,parameter_name,value) done_parameters_and_defaults.append(klass.parameters_and_defaults) # Same thing as above for self.constant_parameters: # # Create self.constant_parameters and set values to keyword argument if found, # otherwise to default value. # # If a class didn't override base class's parameters_and_defaults dictionary, don't deal with it twice if hasattr(klass, 'constant_parameters_and_defaults') and klass.constant_parameters_and_defaults not in done_constant_parameters_and_defaults: for parameter_name in klass.constant_parameters_and_defaults.keys(): # Make sure this parameter key/value pair doesn't exist already if hasattr(self.parameters,parameter_name): raise ValueError("Definition of '%s' as variable parameter and constant parameter."%parameter_name) if hasattr(self.constant_parameters,parameter_name): raise ValueError("More than one definition of constant parameter '%s'"%parameter_name) # Get default value and the type value,tipe = klass.constant_parameters_and_defaults[parameter_name][:2] if not ve_types.is_parameter_type_def(tipe): raise ValueError("In definition of constant parameter '%s', %s is not a valid type declaration."%(parameter_name,tipe)) # Was a non-default value passed for this parameter? if kw.has_key(parameter_name): value = kw[parameter_name] done_kw.append(parameter_name) # Allow None to pass as acceptable value -- lets __init__ set own default if type(value) != type(None): # Check anything other than None if not tipe.verify(value): if type(value) != Numeric.ArrayType: value_str = str(value) else: if Numeric.multiply.reduce(value.shape) < 10: value_str = str(value) # print array if it's smallish else: value_str = "(array data)" # don't pring if it's big raise TypeError("Constant parameter '%s' value %s is type %s (not type %s) in %s"%(parameter_name,value_str,type(value),tipe,self)) setattr(self.constant_parameters,parameter_name,value) done_constant_parameters_and_defaults.append(klass.constant_parameters_and_defaults) # Set self.parameters to the value in "kw" for kw_parameter_name in kw.keys(): if kw_parameter_name not in done_kw: raise ValueError("parameter '%s' passed as keyword argument, but not specified by %s (or subclasses) as potential parameter"%(kw_parameter_name,self.__class__)) def is_constant_parameter(self,parameter_name): # Get a list of all classes this instance is derived from classes = recursive_base_class_finder(self.__class__) for klass in classes: if klass == object: continue # base class of new style classes - ignore if klass.constant_parameters_and_defaults.has_key(parameter_name): return True # The for loop only completes if parameter_name is not in any subclass return False def get_specified_type(self,parameter_name): # Get a list of all classes this instance is derived from classes = recursive_base_class_finder(self.__class__) for klass in classes: if klass == object: continue # base class of new style classes - ignore if klass.parameters_and_defaults.has_key(parameter_name): return klass.parameters_and_defaults[parameter_name][1] # The for loop only completes if parameter_name is not in any subclass raise AttributeError("%s has no parameter named '%s'"%(self.__class__,parameter_name)) def verify_parameters(self): """Perform type check on all parameters""" for parameter_name in dir(self.parameters): if parameter_name.startswith('__'): continue require_type = self.get_specified_type(parameter_name) this_type = ve_types.get_type(getattr(self.parameters,parameter_name)) ve_types.assert_type(this_type,require_type) def set(self,**kw): """Set a parameter with type-checked value This is the slow but safe way to set parameters. It is recommended to use this method in all but speed-critical portions of code. """ # Note that we don't overload __setattr__ because that would always slow # down assignment, not just when it was convenient. # # (We could make a checked_parameters attribute though.) for parameter_name in kw.keys(): setattr(self.parameters,parameter_name,kw[parameter_name]) require_type = self.get_specified_type(parameter_name) value = kw[parameter_name] this_type = ve_types.get_type(value) ve_types.assert_type(this_type,require_type) setattr(self.parameters,parameter_name,value) def get_type(value): warnings.warn("VisionEgg.get_type() has been moved to "+\ "VisionEgg.ParameterTypes.get_type()", DeprecationWarning, stacklevel=2) return ve_types.get_type(value) def assert_type(*args): warnings.warn("VisionEgg.assert_type() has been moved to "+\ "VisionEgg.ParameterTypes.assert_type()", DeprecationWarning, stacklevel=2) return ve_types.assert_type(*args) def _get_lowerleft(position,anchor,size): """Private helper function size is (width, height) """ if anchor == 'lowerleft': lowerleft = position else: if len(position) > 2: z = position[2] else: z = 0.0 if len(position) > 3: w = position[3] else: w = 1.0 if z != 0.0: warnings.warn( "z coordinate (other than 0.0) specificed where anchor not 'lowerleft' -- cannot compute") if w != 1.0: warnings.warn("w coordinate (other than 1.0) specificed where anchor not 'lowerleft' -- cannot compute") if anchor == 'center': lowerleft = (position[0] - size[0]/2.0, position[1] - size[1]/2.0) elif anchor == 'lowerright': lowerleft = (position[0] - size[0],position[1]) elif anchor == 'upperright': lowerleft = (position[0] - size[0],position[1] - size[1]) elif anchor == 'upperleft': lowerleft = (position[0],position[1] - size[1]) elif anchor == 'left': lowerleft = (position[0],position[1] - size[1]/2.0) elif anchor == 'right': lowerleft = (position[0] - size[0],position[1] - size[1]/2.0) elif anchor == 'bottom': lowerleft = (position[0] - size[0]/2.0,position[1]) elif anchor == 'top': lowerleft = (position[0] - size[0]/2.0,position[1] - size[1]) else: raise ValueError("No anchor position %s"%anchor) return lowerleft def _get_center(position,anchor,size): """Private helper function""" if anchor == 'center': center = position else: if len(position) > 2: z = position[2] else: z = 0.0 if len(position) > 3: w = position[3] else: w = 1.0 if z != 0.0: raise ValueError("z coordinate (other than 0.0) specificed where anchor not 'center' -- cannot compute") if w != 1.0: raise ValueError("w coordinate (other than 1.0) specificed where anchor not 'center' -- cannot compute") if anchor == 'lowerleft': center = (position[0] + size[0]/2.0, position[1] + size[1]/2.0) elif anchor == 'lowerright': center = (position[0] - size[0]/2.0, position[1] + size[1]/2.0) elif anchor == 'upperright': center = (position[0] - size[0]/2.0, position[1] - size[1]/2.0) elif anchor == 'upperleft': center = (position[0] + size[0]/2.0, position[1] - size[1]/2.0) elif anchor == 'left': center = (position[0] + size[0]/2.0, position[1]) elif anchor == 'right': center = (position[0] - size[0]/2.0, position[1]) elif anchor == 'bottom': center = (position[0],position[1] + size[1]/2.0) elif anchor == 'top': center = (position[0],position[1] - size[1]/2.0) else: raise ValueError("No anchor position %s"%anchor) return center visionegg-1.2.1/VisionEgg/_darwin_sync_swap.m0000644000076500000240000000211111224565530020450 0ustar astrawstaff#include "Python.h" /* * This is the Objective C source code for synchronizing frame buffer * swapping with vertical retrace pulse on the darwin platform. * * Copyright (c) 2002 Andrew Straw. Distributed under the terms of * the GNU Lesser General Public License (LGPL). * * $Revision$ * $Date$ * Author = Andrew Straw * */ #include #include #define TRY(E) if(! (E)) return NULL static char sync_swap__doc__[] = "Synchronize framebuffer swapping with vertical retrace sync pulse."; static PyObject *sync_swap(PyObject * self, PyObject * args) { CGLContextObj context; long params[] = { 1 ? 1 : 0}; context = CGLGetCurrentContext(); CGLSetParameter(context, kCGLCPSwapInterval, params); Py_INCREF(Py_None); return Py_None; } static PyMethodDef _darwin_sync_swap_methods[] = { { "sync_swap", sync_swap, METH_VARARGS, sync_swap__doc__}, { NULL, NULL} /* sentinel */ }; DL_EXPORT(void) init_darwin_sync_swap(void) { Py_InitModule("_darwin_sync_swap", _darwin_sync_swap_methods); return; } visionegg-1.2.1/VisionEgg/_draw_in_c.c0000644000076500000240000000366511224565530017030 0ustar astrawstaff/* * Copyright (c) 2003 Andrew Straw. Distributed under the terms of * the GNU Lesser General Public License (LGPL). * * $Revision$ * $Date$ * Author: Andrew Straw * */ #include "Python.h" #include "numpy/oldnumeric.h" #if defined(MS_WINDOWS) # include #endif #include "vegl.h" static char draw_dots__doc__[] = "VisionEgg._draw_in_c._draw_dots(x,y,z) -> None"; static PyObject * draw_dots(PyObject *self, PyObject *args) { PyObject *input1, *input2, *input3; PyArrayObject *x=NULL; PyArrayObject *y=NULL; PyArrayObject *z=NULL; int i, n; if (!PyArg_ParseTuple(args, "OOO", &input1, &input2, &input3)) return NULL; x = (PyArrayObject *) PyArray_ContiguousFromObject(input1, PyArray_DOUBLE, 1, 1); if (x == NULL) goto fail; y = (PyArrayObject *) PyArray_ContiguousFromObject(input2, PyArray_DOUBLE, 1, 1); if (y == NULL) goto fail; z = (PyArrayObject *) PyArray_ContiguousFromObject(input3, PyArray_DOUBLE, 1, 1); if (z == NULL) goto fail; n = x->dimensions[0]; if (n != y->dimensions[0]) { PyErr_SetString(PyExc_ValueError,"All three arguments must be same length"); goto fail; } if (n != z->dimensions[0]) { PyErr_SetString(PyExc_ValueError,"All three arguments must be same length"); goto fail; } glBegin(GL_POINTS); for (i = 0; i < n; i++) { glVertex3f( *(double *)(x->data + i*x->strides[0]), *(double *)(y->data + i*y->strides[0]), *(double *)(z->data + i*z->strides[0])); } glEnd(); Py_DECREF(x); Py_DECREF(y); Py_DECREF(z); Py_INCREF(Py_None); return Py_None; fail: Py_XDECREF(x); Py_XDECREF(y); Py_XDECREF(z); return NULL; } static PyMethodDef _draw_in_c_methods[] = { { "draw_dots", draw_dots, METH_VARARGS, draw_dots__doc__}, { NULL, NULL} /* sentinel */ }; DL_EXPORT(void) init_draw_in_c(void) { Py_InitModule("_draw_in_c", _draw_in_c_methods); import_array(); return; } visionegg-1.2.1/VisionEgg/_lib3ds.c0000644000076500000240000003441411224565530016257 0ustar astrawstaff/* * This is the C source code for interfacing with the Vision Egg with * the lib3ds library * * Copyright (C) 2002 Andrew Straw * Copyright (C) 2005 California Institute of Technology * * Distributed under the terms of the GNU Lesser General Public * License (LGPL). * * $Id$ * Author = Andrew Straw * */ #include "Python.h" #include #include #include #include #include #include #include #include #include #include #if defined(MS_WINDOWS) # include #endif #include "vegl.h" #define PY_CHECK(X,LINENO) if (!(X)) { fprintf(stderr,"Python exception _lib3ds.c line %d\n",LINENO); goto error; } #define L3DCK(X,LINENO) if (!(X)) { fprintf(stderr,"_lib3ds error on line %d",LINENO); goto error; } #define MAX_WARN_STR 255 #define _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL(X) if (m->X.name[0]) { snprintf(warn_str,MAX_WARN_STR,"Ignoring data in %s because .3ds file support is incomplete. (" #X " \"%s\" for material \"%s\" was not loaded)",filename,&m->X.name[0],&m->name[0]); if (!warn_python(warn_str)) {goto error;} } static PyObject *g_logger_warning = NULL; // forward declarations static PyObject* render_node(Lib3dsFile *file, PyObject *tex_dict, Lib3dsNode *node); static PyObject* get_logger_warning( void ); int warn_python(char *text); ////////////////////////////////////////////// static char draw__doc__[] = "Draw a model loaded from a .3ds file.\n"; static PyObject *draw(PyObject *self, PyObject *args) { PyObject *py_c_file; Lib3dsFile *file=NULL; PyObject *tex_dict=NULL; float scale_x, scale_y, scale_z; float pos_x, pos_y, pos_z; float orient_angle; float orient_x,orient_y,orient_z; PY_CHECK(PyArg_ParseTuple(args,"OOffffffffff", &py_c_file, &tex_dict, &scale_x,&scale_y,&scale_z, &pos_x,&pos_y,&pos_z, &orient_angle, &orient_x,&orient_y,&orient_z ),__LINE__); if (!PyCObject_Check(py_c_file)) { PyErr_SetString(PyExc_ValueError,"Must pass PyCObject as 1st argument"); return NULL; } if (!PyDict_Check(tex_dict)) { PyErr_SetString(PyExc_ValueError,"Must pass PyDict as 2nd argument"); return NULL; } file = (Lib3dsFile*)PyCObject_AsVoidPtr(py_c_file); glEnable(GL_TEXTURE_2D); //glShadeModel(GL_SMOOTH); //glEnable(GL_LIGHTING); //glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); //glEnable(GL_CULL_FACE); //glCullFace(GL_BACK); //glClear(GL_DEPTH_BUFFER_BIT); if (!file) { return NULL; } glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(pos_x,pos_y,pos_z); glRotatef(orient_angle,orient_x,orient_y,orient_z); glRotatef(-90, 1.0,0,0); glScalef(scale_x,scale_y,scale_z); // added to prevent other things from messing up the texture colouring. glColor3f(1.0, 1.0, 1.0); { Lib3dsNode *p; for (p=file->nodes; p!=0; p=p->next) { PY_CHECK(render_node(file,tex_dict,p),__LINE__); } } glPopMatrix(); //glDisable(GL_LIGHTING); Py_INCREF(Py_None); return Py_None; error: return NULL; } ////////////////////////////////////////////// static PyObject *get_logger_warning( void ) { PyObject *loggingModule = NULL; PyObject *logging_getLogger = NULL; PyObject *logger = NULL; PyObject *logger_warning = NULL; // Now get VisionEgg.Core.message to pass message loggingModule = PyImport_ImportModule("logging"); // New ref if (!loggingModule) { loggingModule = PyImport_ImportModule("VisionEgg.py_logging"); } PY_CHECK(loggingModule,__LINE__); logging_getLogger = PyObject_GetAttrString(loggingModule,"getLogger"); // new ref PY_CHECK(logging_getLogger,__LINE__); logger = PyObject_CallObject(logging_getLogger,Py_BuildValue("(s)","VisionEgg._lib3ds")); // new ref PY_CHECK(logger,__LINE__); logger_warning = PyObject_GetAttrString(logger,"warning"); // new ref PY_CHECK(logger_warning,__LINE__); g_logger_warning = logger_warning; Py_DECREF(logger); Py_DECREF(logging_getLogger); Py_DECREF(loggingModule); return g_logger_warning; error: Py_XDECREF(logger); Py_XDECREF(logging_getLogger); Py_XDECREF(loggingModule); return NULL; } int warn_python(char *text) { PyObject* temp = NULL; if (!g_logger_warning) { // make sure can write to the log g_logger_warning = get_logger_warning(); PY_CHECK(g_logger_warning,__LINE__); } temp = PyObject_CallObject(g_logger_warning,Py_BuildValue("(s)",text)); // new ref PY_CHECK(temp,__LINE__); Py_XDECREF(temp); return 1; error: Py_XDECREF(temp); return 0; } static char c_init__doc__[] = "C helper for Model3DS.__init__.\n"; static PyObject *c_init(PyObject *dummy_self, PyObject *args) { char * filename=NULL; char * warn_str=NULL; Lib3dsFile *file=NULL; Lib3dsMaterial* m; Lib3dsLight *light; Lib3dsNode* new_node=NULL; Lib3dsNode* last_node=NULL; Lib3dsMesh* mesh; Lib3dsTextureMap texmap; PyObject *self=NULL; PyObject *self_draw=NULL; PyObject *self_dict=NULL; PyObject *py_c_file=NULL; PyObject *tex_dict=NULL; PyObject *tex_dict_value=NULL; warn_str = (char *)malloc(MAX_WARN_STR*sizeof(char)); if (!warn_str) { PyErr_SetString(PyExc_SystemError,"malloc failed in _lib3ds.c"); goto error; } PY_CHECK(PyArg_ParseTuple(args,"Os", &self, &filename),__LINE__); self_dict = PyObject_GetAttrString( self, "__dict__" ); // new ref PY_CHECK(self_dict,__LINE__); file=lib3ds_file_load(filename); if (!file) { PyErr_SetString(PyExc_RuntimeError,"lib3ds_file_load failed"); return NULL; } lib3ds_file_eval(file,0); // gFile = file; // Now do self._lib3ds_file = file // XXX should build destructor before here py_c_file = PyCObject_FromVoidPtr((void*)file,NULL); // new ref PY_CHECK(py_c_file,__LINE__); PY_CHECK(!PyDict_SetItemString(self_dict,"_lib3ds_file",py_c_file),__LINE__); // Get a list of the texture files to load tex_dict = PyDict_New(); // new ref PY_CHECK(tex_dict,__LINE__); for (m=file->materials; m!=0; m=m->next ) { texmap = m->texture1_map; if (texmap.name[0]) { //printf("c_init texture1_map %s: %s\n",&m->name[0],&texmap.name[0]); tex_dict_value = Py_BuildValue("i",-1); // new ref PY_CHECK(tex_dict_value,__LINE__); PY_CHECK(!PyDict_SetItemString(tex_dict,&texmap.name[0],tex_dict_value),__LINE__); Py_DECREF(tex_dict_value); } // we don't handle these yet, at least let the user know... _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( texture1_mask); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( texture2_map); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( texture2_mask); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( opacity_map); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( opacity_mask); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( bump_map); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( bump_mask); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( specular_map); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( specular_mask); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( shininess_map); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( shininess_mask); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( self_illum_map); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( self_illum_mask); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( reflection_map); _LIB3DS_WARN_IF_MATERIAL_TEX_IS_NOT_NULL( reflection_mask); } for (light=file->lights; light; light=light->next) { snprintf(warn_str,MAX_WARN_STR,"Ignoring data in %s because .3ds file support is incompelte. (Light \"%s\" not used because light support not implemented.)",filename,&light->name[0]); if (!warn_python(warn_str)) { goto error; } } Py_XDECREF(py_c_file); // If no nodes, warn and make one for each mesh if (file->nodes == 0) { if (file->meshes == 0) { if (!warn_python(".3ds file has no nodes and no meshes, not drawing anything.")) { goto error; } } for (mesh=file->meshes; mesh!=0; mesh=mesh->next) { snprintf(warn_str,MAX_WARN_STR,".3ds file has no nodes, making one for mesh \"%s\"",&mesh->name[0]); if (!warn_python(warn_str)) { goto error; } new_node = lib3ds_node_new_object(); strncpy(&new_node->name[0],&mesh->name[0],64); if (file->nodes == 0) { file->nodes = new_node; } else { last_node->next = new_node; } last_node = new_node; //file->nodes->name = &file->meshes->name[0]; } } free((void*)warn_str); return tex_dict; error: free((void*)warn_str); Py_XDECREF(tex_dict); Py_XDECREF(tex_dict_value); Py_XDECREF(self_dict); Py_XDECREF(self_draw); Py_XDECREF(py_c_file); return NULL; } ///////////////////////////////////////////// static PyObject* render_node(Lib3dsFile *file, PyObject *tex_dict, Lib3dsNode *node) { PyObject *tex_dict_value=NULL; /* Lib3dsRgba a; Lib3dsRgba d; Lib3dsRgba s; */ ASSERT(file); { Lib3dsNode *p; for (p=node->childs; p!=0; p=p->next) { PY_CHECK(render_node(file,tex_dict,p),__LINE__); } } if (node->type==LIB3DS_OBJECT_NODE) { if (strcmp(node->name,"$$$DUMMY")==0) { L3DCK(0,__LINE__); } if (!node->user.d) { Lib3dsMesh *mesh; mesh=lib3ds_file_mesh_by_name(file, node->name); ASSERT(mesh); if (!mesh) { L3DCK(0,__LINE__); } node->user.d=glGenLists(1); glNewList(node->user.d, GL_COMPILE); { unsigned p; Lib3dsVector *normalL=malloc(3*sizeof(Lib3dsVector)*mesh->faces); { Lib3dsMatrix M; lib3ds_matrix_copy(M, mesh->matrix); lib3ds_matrix_inv(M); glMultMatrixf(&M[0][0]); } lib3ds_mesh_calculate_normals(mesh, normalL); for (p=0; pfaces; ++p) { Lib3dsFace *f=&mesh->faceL[p]; Lib3dsMaterial *mat=0; if (f->material[0]) { mat=lib3ds_file_material_by_name(file, f->material); } if (mat) { /* ///////////////////// static GLfloat a[4]={0,0,0,1}; float s; glMaterialfv(GL_FRONT, GL_AMBIENT, a); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat->diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat->specular); s = (float)pow(2, 10.0*mat->shininess); if (s>128.0) { s=128.0; } glMaterialf(GL_FRONT, GL_SHININESS, s); ///////////////////// */ if (mat->texture1_map.name[0]) { // use texture tex_dict_value = PyDict_GetItemString(tex_dict,&mat->texture1_map.name[0]); // borrowed ref PY_CHECK(tex_dict_value,__LINE__); if (!PyLong_Check(tex_dict_value)) { PyErr_SetString(PyExc_ValueError,"dictionary value must be int"); goto error; } glBindTexture( GL_TEXTURE_2D, PyInt_AsLong(tex_dict_value) ); } else { // no texture... } } else { /* //////////////////////// a[0]=0.2f; a[1]=0.2f; a[2]=0.2f; a[3]=1.0f; d[0]=0.8f; d[1]=0.8f; d[2]=0.8f; d[3]=1.0f; s[0]=0.0f; s[1]=0.0f; s[2]=0.0f; s[3]=1.0f; glMaterialfv(GL_FRONT, GL_AMBIENT, a); glMaterialfv(GL_FRONT, GL_DIFFUSE, d); glMaterialfv(GL_FRONT, GL_SPECULAR, s); //////////////////////// */ } { int i; glBegin(GL_TRIANGLES); glNormal3fv(f->normal); for (i=0; i<3; ++i) { glNormal3fv(normalL[3*p+i]); if (mesh->texels) { glTexCoord2fv(mesh->texelL[f->points[i]]); } glVertex3fv(mesh->pointL[f->points[i]].pos); } glEnd(); } } free(normalL); } glEndList(); } if (node->user.d) { Lib3dsObjectData *d; glPushMatrix(); d=&node->data.object; glMultMatrixf(&node->matrix[0][0]); glTranslatef(-d->pivot[0], -d->pivot[1], -d->pivot[2]); glCallList(node->user.d); glPopMatrix(); } } Py_INCREF(Py_None); return Py_None; error: return NULL; } ////////////////////////////////////////////// static char dump_materials__doc__[] = "Print the materials of a .3ds file.\n"; static PyObject *dump_materials(PyObject *self, PyObject *args) { PyObject *py_c_file; Lib3dsFile *file=NULL; PY_CHECK(PyArg_ParseTuple(args,"O", &py_c_file),__LINE__); if (!PyCObject_Check(py_c_file)) { PyErr_SetString(PyExc_ValueError,"Must pass PyCObject"); return NULL; } file = (Lib3dsFile*)PyCObject_AsVoidPtr(py_c_file); lib3ds_file_dump_materials(file); Py_INCREF(Py_None); return Py_None; error: return NULL; } ////////////////////////////////////////////// static char dump_nodes__doc__[] = "Print the nodes of a .3ds file.\n"; static PyObject *dump_nodes(PyObject *self, PyObject *args) { PyObject *py_c_file; Lib3dsFile *file=NULL; PY_CHECK(PyArg_ParseTuple(args,"O", &py_c_file),__LINE__); if (!PyCObject_Check(py_c_file)) { PyErr_SetString(PyExc_ValueError,"Must pass PyCObject"); return NULL; } file = (Lib3dsFile*)PyCObject_AsVoidPtr(py_c_file); lib3ds_file_dump_nodes(file); Py_INCREF(Py_None); return Py_None; error: return NULL; } ////////////////////////////////////////////// static char dump_meshes__doc__[] = "Print the meshes of a .3ds file.\n"; static PyObject *dump_meshes(PyObject *self, PyObject *args) { PyObject *py_c_file; Lib3dsFile *file=NULL; PY_CHECK(PyArg_ParseTuple(args,"O", &py_c_file),__LINE__); if (!PyCObject_Check(py_c_file)) { PyErr_SetString(PyExc_ValueError,"Must pass PyCObject"); return NULL; } file = (Lib3dsFile*)PyCObject_AsVoidPtr(py_c_file); lib3ds_file_dump_meshes(file); Py_INCREF(Py_None); return Py_None; error: return NULL; } ////////////////////////////////////////////// static PyMethodDef lib3ds_c_methods[] = { { "c_init", (PyCFunction)c_init, METH_VARARGS, c_init__doc__}, { "draw", (PyCFunction)draw, METH_VARARGS, draw__doc__}, { "dump_materials", (PyCFunction)dump_materials, METH_VARARGS, dump_materials__doc__}, { "dump_nodes", (PyCFunction)dump_nodes, METH_VARARGS, dump_nodes__doc__}, { "dump_meshes", (PyCFunction)dump_meshes, METH_VARARGS, dump_meshes__doc__}, { NULL, NULL, 0, NULL} /* sentinel */ }; DL_EXPORT(void) init_lib3ds(void) { Py_InitModule("_lib3ds", lib3ds_c_methods); return; } visionegg-1.2.1/VisionEgg/_raw_lpt_linux.c0000644000076500000240000001070511224565530017763 0ustar astrawstaff#include "Python.h" /* * Copyright (c) 2001-2003 Andrew Straw. Distributed under the terms of * the GNU Lesser General Public License (LGPL). * * $Revision$ * $Date$ * Author: Andrew Straw * */ /* * NOTE: If I had to re-implement this, I would use SWIG! * */ #include // for ioperm (glibc) (use unistd.h for libc5) and inb #define TRY(E) if(! (E)) return NULL #define MAX_BASE_ADDRESSES 4 static long int ok_base_addresses[MAX_BASE_ADDRESSES]; static long int not_ok_base_addresses[MAX_BASE_ADDRESSES]; static unsigned short num_ok_base_addresses; static unsigned short num_not_ok_base_addresses; static short c_ok(long int base_address) { unsigned short i; for (i=0; i= 0) { // it's OK ok_base_addresses[num_ok_base_addresses] = base_address; if (num_ok_base_addresses < MAX_BASE_ADDRESSES) { num_ok_base_addresses++; } return 1; } else { not_ok_base_addresses[num_not_ok_base_addresses] = base_address; if (num_not_ok_base_addresses < MAX_BASE_ADDRESSES) { num_not_ok_base_addresses++; } if (raise_ex) { PyErr_SetString(PyExc_IOError,"Cannot open LPT. (Do you have permission?)"); } return 0; } } else { if (ok==0 && raise_ex) { PyErr_SetString(PyExc_IOError,"Cannot open LPT. (Do you have permission?)"); } return ok; } } static char base_address_ok__doc__[] = "VisionEgg._raw_lpt_linux.base_address_ok(base_address) -> bool"; static PyObject *base_address_ok(PyObject * self, PyObject * args) { long int base_address; short ok; TRY(PyArg_ParseTuple(args,"l",&base_address)); ok = c_ok(base_address); if (ok==-1) { return PyInt_FromLong((long)c_check(base_address,0)); } else { return PyInt_FromLong((long)ok); } } static char inp__doc__[] = "inp(base_address) -> value\n" "Get status bits 0-7 of the LPT port.\n" "\n" "For LPT0, base_address should be 0x379\n" "\n" "The status bits were not meant for high speed data input\n" "Nevertheless, for sampling one or two digital inputs, they\n" "work fine.\n" "\n" "Bits 4 and 5 (pins 13 and 12, respectively) should be first\n" "choice to sample a digital voltage. The other bits have some\n" "oddities. Bits 0 and 1 are designated reserved. Others are\n" "'active low'; they show a logic 0 when +5v is applied.\n" "\n" "bit4 = value & 0x10\n" "bit5 = value & 0x20\n"; static PyObject *inp(PyObject * self, PyObject * args) { long int base_address; unsigned short i; short ok; TRY(PyArg_ParseTuple(args,"l",&base_address)); // Fast check on port ok = 0; for (i=0; i * */ #include #include #define TRY(E) if(! (E)) return NULL #define ERRSTR "Parallel port possible but not implemented on IRIX." static char base_address_ok__doc__[] = "VisionEgg._raw_plp_irix.base_address_ok(base_address) -> bool"; static PyObject *base_address_ok(PyObject * self, PyObject * args) { long int base_address; TRY(PyArg_ParseTuple(args,"l",&base_address)); PyErr_SetString(PyExc_NotImplementedError,ERRSTR); return NULL; } static char inp__doc__[] = "VisionEgg._raw_plp_irix.inp(base_address) -> value"; static PyObject *inp(PyObject * self, PyObject * args) { long int base_address; TRY(PyArg_ParseTuple(args,"l",&base_address)); PyErr_SetString(PyExc_NotImplementedError,ERRSTR); return NULL; } static char out__doc__[] = "VisionEgg._raw_plp_irix.out(base_address, value) -> None"; static PyObject *out(PyObject * self, PyObject * args) { long int base_address; short int value; TRY(PyArg_ParseTuple(args,"lh",&base_address,&value)); PyErr_SetString(PyExc_NotImplementedError,ERRSTR); return NULL; } static PyMethodDef _raw_plp_irix_methods[] = { { "base_address_ok", base_address_ok, METH_VARARGS, base_address_ok__doc__}, { "inp", inp, METH_VARARGS, inp__doc__}, { "out", out, METH_VARARGS, out__doc__}, { NULL, NULL} /* sentinel */ }; DL_EXPORT(void) init_raw_plp_irix(void) { Py_InitModule("_raw_plp_irix", _raw_plp_irix_methods); return; } visionegg-1.2.1/VisionEgg/_vegl.c0000644000076500000240000003044011224565530016027 0ustar astrawstaff/* Generated by Pyrex 0.9.5.1a on Sun Jan 20 20:09:41 2008 */ #include "Python.h" #include "structmember.h" #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif __PYX_EXTERN_C double pow(double, double); #include "vegl.h" typedef struct {PyObject **p; char *s;} __Pyx_InternTabEntry; /*proto*/ typedef struct {PyObject **p; char *s; long n;} __Pyx_StringTabEntry; /*proto*/ static PyObject *__pyx_m; static PyObject *__pyx_b; static int __pyx_lineno; static char *__pyx_filename; static char **__pyx_f; static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/ static int __Pyx_InternStrings(__Pyx_InternTabEntry *t); /*proto*/ static void __Pyx_AddTraceback(char *funcname); /*proto*/ /* Declarations from _vegl */ typedef struct { int two; int nd; char typekind; int itemsize; int flags; Py_intptr_t (*shape); Py_intptr_t (*strides); void (*data); } __pyx_t_5_vegl_PyArrayInterface; /* Implementation of _vegl */ static PyObject *__pyx_n_numpy; static PyObject *__pyx_n_veglGetTexImage; static PyObject *__pyx_n_veglTexSubImage1D; static PyObject *__pyx_n___array_struct__; static PyObject *__pyx_f_5_vegl_veglGetTexImage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_5_vegl_veglGetTexImage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_target = 0; PyObject *__pyx_v_level = 0; PyObject *__pyx_v_format = 0; PyObject *__pyx_v_type = 0; PyObject *__pyx_v_buf = 0; __pyx_t_5_vegl_PyArrayInterface (*__pyx_v_inter); PyObject *__pyx_v_hold_onto_until_done_with_array; PyObject *__pyx_r; PyObject *__pyx_1 = 0; int __pyx_2; int __pyx_3; int __pyx_4; int __pyx_5; static char *__pyx_argnames[] = {"target","level","format","type","buf",0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OOOOO", __pyx_argnames, &__pyx_v_target, &__pyx_v_level, &__pyx_v_format, &__pyx_v_type, &__pyx_v_buf)) return 0; Py_INCREF(__pyx_v_target); Py_INCREF(__pyx_v_level); Py_INCREF(__pyx_v_format); Py_INCREF(__pyx_v_type); Py_INCREF(__pyx_v_buf); __pyx_v_hold_onto_until_done_with_array = Py_None; Py_INCREF(Py_None); /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":30 */ __pyx_1 = PyObject_GetAttr(__pyx_v_buf, __pyx_n___array_struct__); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; goto __pyx_L1;} Py_DECREF(__pyx_v_hold_onto_until_done_with_array); __pyx_v_hold_onto_until_done_with_array = __pyx_1; __pyx_1 = 0; /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":31 */ __pyx_v_inter = ((__pyx_t_5_vegl_PyArrayInterface (*))PyCObject_AsVoidPtr(__pyx_v_hold_onto_until_done_with_array)); /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":32 */ if (!(__pyx_v_inter->two == 2)) { PyErr_SetNone(PyExc_AssertionError); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;} } /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":34 */ __pyx_2 = PyInt_AsLong(__pyx_v_target); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} __pyx_3 = PyInt_AsLong(__pyx_v_level); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} __pyx_4 = PyInt_AsLong(__pyx_v_format); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} __pyx_5 = PyInt_AsLong(__pyx_v_type); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; goto __pyx_L1;} glGetTexImage(__pyx_2,__pyx_3,__pyx_4,__pyx_5,__pyx_v_inter->data); __pyx_r = Py_None; Py_INCREF(Py_None); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_1); __Pyx_AddTraceback("_vegl.veglGetTexImage"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_hold_onto_until_done_with_array); Py_DECREF(__pyx_v_target); Py_DECREF(__pyx_v_level); Py_DECREF(__pyx_v_format); Py_DECREF(__pyx_v_type); Py_DECREF(__pyx_v_buf); return __pyx_r; } static PyObject *__pyx_f_5_vegl_veglTexSubImage1D(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_5_vegl_veglTexSubImage1D(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_target = 0; PyObject *__pyx_v_level = 0; PyObject *__pyx_v_xoffset = 0; PyObject *__pyx_v_width = 0; PyObject *__pyx_v_format = 0; PyObject *__pyx_v_type = 0; PyObject *__pyx_v_data = 0; __pyx_t_5_vegl_PyArrayInterface (*__pyx_v_inter); PyObject *__pyx_v_hold_onto_until_done_with_array; PyObject *__pyx_r; PyObject *__pyx_1 = 0; int __pyx_2; int __pyx_3; int __pyx_4; int __pyx_5; int __pyx_6; int __pyx_7; static char *__pyx_argnames[] = {"target","level","xoffset","width","format","type","data",0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OOOOOOO", __pyx_argnames, &__pyx_v_target, &__pyx_v_level, &__pyx_v_xoffset, &__pyx_v_width, &__pyx_v_format, &__pyx_v_type, &__pyx_v_data)) return 0; Py_INCREF(__pyx_v_target); Py_INCREF(__pyx_v_level); Py_INCREF(__pyx_v_xoffset); Py_INCREF(__pyx_v_width); Py_INCREF(__pyx_v_format); Py_INCREF(__pyx_v_type); Py_INCREF(__pyx_v_data); __pyx_v_hold_onto_until_done_with_array = Py_None; Py_INCREF(Py_None); /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":40 */ __pyx_1 = PyObject_GetAttr(__pyx_v_data, __pyx_n___array_struct__); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; goto __pyx_L1;} Py_DECREF(__pyx_v_hold_onto_until_done_with_array); __pyx_v_hold_onto_until_done_with_array = __pyx_1; __pyx_1 = 0; /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":41 */ __pyx_v_inter = ((__pyx_t_5_vegl_PyArrayInterface (*))PyCObject_AsVoidPtr(__pyx_v_hold_onto_until_done_with_array)); /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":42 */ if (!(__pyx_v_inter->two == 2)) { PyErr_SetNone(PyExc_AssertionError); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; goto __pyx_L1;} } /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":44 */ __pyx_2 = PyInt_AsLong(__pyx_v_target); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;} __pyx_3 = PyInt_AsLong(__pyx_v_level); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;} __pyx_4 = PyInt_AsLong(__pyx_v_xoffset); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;} __pyx_5 = PyInt_AsLong(__pyx_v_width); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;} __pyx_6 = PyInt_AsLong(__pyx_v_format); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;} __pyx_7 = PyInt_AsLong(__pyx_v_type); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;} glTexSubImage1D(__pyx_2,__pyx_3,__pyx_4,__pyx_5,__pyx_6,__pyx_7,__pyx_v_inter->data); __pyx_r = Py_None; Py_INCREF(Py_None); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_1); __Pyx_AddTraceback("_vegl.veglTexSubImage1D"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_hold_onto_until_done_with_array); Py_DECREF(__pyx_v_target); Py_DECREF(__pyx_v_level); Py_DECREF(__pyx_v_xoffset); Py_DECREF(__pyx_v_width); Py_DECREF(__pyx_v_format); Py_DECREF(__pyx_v_type); Py_DECREF(__pyx_v_data); return __pyx_r; } static __Pyx_InternTabEntry __pyx_intern_tab[] = { {&__pyx_n___array_struct__, "__array_struct__"}, {&__pyx_n_numpy, "numpy"}, {&__pyx_n_veglGetTexImage, "veglGetTexImage"}, {&__pyx_n_veglTexSubImage1D, "veglTexSubImage1D"}, {0, 0} }; static struct PyMethodDef __pyx_methods[] = { {"veglGetTexImage", (PyCFunction)__pyx_f_5_vegl_veglGetTexImage, METH_VARARGS|METH_KEYWORDS, 0}, {"veglTexSubImage1D", (PyCFunction)__pyx_f_5_vegl_veglTexSubImage1D, METH_VARARGS|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; static void __pyx_init_filenames(void); /*proto*/ PyMODINIT_FUNC init_vegl(void); /*proto*/ PyMODINIT_FUNC init_vegl(void) { PyObject *__pyx_1 = 0; __pyx_init_filenames(); __pyx_m = Py_InitModule4("_vegl", __pyx_methods, 0, 0, PYTHON_API_VERSION); if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;}; __pyx_b = PyImport_AddModule("__builtin__"); if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;}; if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;}; if (__Pyx_InternStrings(__pyx_intern_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;}; /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":2 */ __pyx_1 = __Pyx_Import(__pyx_n_numpy, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;} if (PyObject_SetAttr(__pyx_m, __pyx_n_numpy, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; /* "/home/astraw/src/ve/visionegg-devel.root/trunk/visionegg/VisionEgg/_vegl.pyx":36 */ return; __pyx_L1:; Py_XDECREF(__pyx_1); __Pyx_AddTraceback("_vegl"); } static char *__pyx_filenames[] = { "_vegl.pyx", }; /* Runtime support code */ static void __pyx_init_filenames(void) { __pyx_f = __pyx_filenames; } static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) { PyObject *__import__ = 0; PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; __import__ = PyObject_GetAttrString(__pyx_b, "__import__"); if (!__import__) goto bad; if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; module = PyObject_CallFunction(__import__, "OOOO", name, global_dict, empty_dict, list); bad: Py_XDECREF(empty_list); Py_XDECREF(__import__); Py_XDECREF(empty_dict); return module; } static int __Pyx_InternStrings(__Pyx_InternTabEntry *t) { while (t->p) { *t->p = PyString_InternFromString(t->s); if (!*t->p) return -1; ++t; } return 0; } #include "compile.h" #include "frameobject.h" #include "traceback.h" static void __Pyx_AddTraceback(char *funcname) { PyObject *py_srcfile = 0; PyObject *py_funcname = 0; PyObject *py_globals = 0; PyObject *empty_tuple = 0; PyObject *empty_string = 0; PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; py_srcfile = PyString_FromString(__pyx_filename); if (!py_srcfile) goto bad; py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; empty_tuple = PyTuple_New(0); if (!empty_tuple) goto bad; empty_string = PyString_FromString(""); if (!empty_string) goto bad; py_code = PyCode_New( 0, /*int argcount,*/ 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ empty_string, /*PyObject *code,*/ empty_tuple, /*PyObject *consts,*/ empty_tuple, /*PyObject *names,*/ empty_tuple, /*PyObject *varnames,*/ empty_tuple, /*PyObject *freevars,*/ empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ __pyx_lineno, /*int firstlineno,*/ empty_string /*PyObject *lnotab*/ ); if (!py_code) goto bad; py_frame = PyFrame_New( PyThreadState_Get(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = __pyx_lineno; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); Py_XDECREF(empty_tuple); Py_XDECREF(empty_string); Py_XDECREF(py_code); Py_XDECREF(py_frame); } visionegg-1.2.1/VisionEgg/_vegl.pyx0000644000076500000240000000335311224565530016430 0ustar astrawstaff#emacs, this is -*-Python-*- mode import numpy ctypedef int GLenum ctypedef int GLint ctypedef int GLsizei cdef extern from "vegl.h": void glGetTexImage( int, int, int, int, void* ) void glTexSubImage1D( GLenum, GLint, GLint, GLsizei, GLenum, GLenum, void* ) cdef extern from "Python.h": ctypedef int Py_intptr_t void* PyCObject_AsVoidPtr(object) # numpy's __array_struct__ interface: ctypedef struct PyArrayInterface: int two # contains the integer 2 as a sanity check int nd # number of dimensions char typekind # kind in array --- character code of typestr int itemsize # size of each element int flags # flags indicating how the data should be interpreted Py_intptr_t *shape # A length-nd array of shape information Py_intptr_t *strides # A length-nd array of stride information void *data # A pointer to the first element of the array def veglGetTexImage(target, level, format, type, buf): cdef PyArrayInterface* inter hold_onto_until_done_with_array = buf.__array_struct__ inter = PyCObject_AsVoidPtr( hold_onto_until_done_with_array ) assert inter.two == 2 glGetTexImage(target, level, format, type, inter.data ) def veglTexSubImage1D( target, level, xoffset, width, format, type, data ): # PyOpenGL 2.0.1.09 has a bug, so use our own wrapper cdef PyArrayInterface* inter hold_onto_until_done_with_array = data.__array_struct__ inter = PyCObject_AsVoidPtr( hold_onto_until_done_with_array ) assert inter.two == 2 glTexSubImage1D( target, level, xoffset, width, format, type, inter.data) visionegg-1.2.1/VisionEgg/Configuration.py0000644000076500000240000002401711224565527017761 0ustar astrawstaff# The Vision Egg: Configuration # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Load config values from environment, config file, or defaults. Applications should not import this module directly. Instead, 'import VisionEgg' will result in an attribute 'VisionEgg.config', which has the configuration options as attributes. This module searches for configuration options from the following places: environment variables, configuration file, generic defaults. Environment variables take precedence over the configuration file, which takes precedence over the generic defaults. This module also determines the location of the Vision Egg directories. The VISIONEGG_SYSTEM_DIR directory is by default the 'VisionEgg' directory in Python's site-packages. VISIONEGG_USER_DIR is by default 'VisionEgg' in the directory specified by the environment variable HOME, if it exists, and os.curdir otherwise. You can create a configuration file that contains defaults for your system. This should be a text file with key/value pairs. Blank lines and anything after the pound symbol ('#') will be treated as a comment. Each key/value pairs should be on its own line and in the format 'KEY=VALUE'. By default the file 'VisionEgg.cfg' from the VISIONEGG_USER_DIR or VISIONEGG_SYSTEM_DIR as specified above. However, You can specify a different filename and directory by setting the environment variable VISIONEGG_CONFIG_FILE. """ # Warning: This code is a bit of a hack import VisionEgg import re, os, errno, sys # standard python packages import ConfigParser #################################################################### # # Default configuration variables # #################################################################### defaults= { 'VISIONEGG_ALWAYS_START_LOGGING': 0, 'VISIONEGG_DOUBLE_BUFFER': 1, 'VISIONEGG_FRAMELESS_WINDOW': 0, 'VISIONEGG_FULLSCREEN': 0, 'VISIONEGG_GUI_INIT': 1, 'VISIONEGG_GAMMA_INVERT_RED': 2.1, # only used in 'invert' mode 'VISIONEGG_GAMMA_INVERT_GREEN': 2.1, # only used in 'invert' mode 'VISIONEGG_GAMMA_INVERT_BLUE': 2.1, # only used in 'invert' mode 'VISIONEGG_GAMMA_FILE': 'custom.ve_gamma', # only used in 'file' mode 'VISIONEGG_GAMMA_SOURCE': 'none', #also 'invert' or 'file' 'VISIONEGG_GUI_ON_ERROR': 1, 'VISIONEGG_HIDE_MOUSE': 1, 'VISIONEGG_LOG_FILE': 'VisionEgg.log', 'VISIONEGG_LOG_TO_STDERR': 1, 'VISIONEGG_MAXPRIORITY': 0, 'VISIONEGG_MONITOR_REFRESH_HZ': 60.0, 'VISIONEGG_MULTISAMPLE_SAMPLES': 0, 'VISIONEGG_PREFERRED_BPP': 32, 'VISIONEGG_REQUEST_ALPHA_BITS': 8, 'VISIONEGG_REQUEST_BLUE_BITS': 8, 'VISIONEGG_REQUEST_GREEN_BITS': 8, 'VISIONEGG_REQUEST_RED_BITS': 8, 'VISIONEGG_REQUEST_STEREO': 0, 'VISIONEGG_SCREEN_W': 640, 'VISIONEGG_SCREEN_H': 480, 'VISIONEGG_SYNC_SWAP': 1, 'VISIONEGG_TKINTER_OK': 1, 'SYNCLYNC_PRESENT': 0, } if sys.platform.startswith('linux'): defaults['VISIONEGG_PREFERRED_BPP']=24 extra_darwin_defaults = { 'VISIONEGG_DARWIN_MAXPRIORITY_CONVENTIONAL_NOT_REALTIME' : 1, 'VISIONEGG_DARWIN_CONVENTIONAL_PRIORITY' : -20, # -20 is best priority 'VISIONEGG_DARWIN_REALTIME_PERIOD_DENOM' : 120, 'VISIONEGG_DARWIN_REALTIME_COMPUTATION_DENOM' : 2400, 'VISIONEGG_DARWIN_REALTIME_CONSTRAINT_DENOM' : 1200, 'VISIONEGG_DARWIN_REALTIME_PREEMPTIBLE' : 0, 'VISIONEGG_DARWIN_PTHREAD_PRIORITY' : 'max', } class Config: """Holds global Vision Egg configuration information.""" def __init__(self): """Load global Vision Egg configuration information.""" cfg = ConfigParser.ConfigParser() if sys.executable == sys.argv[0]: # Windows binary self.VISIONEGG_SYSTEM_DIR = os.curdir self.VISIONEGG_USER_DIR = os.curdir else: # non-standard VisionEgg installations try: self.VISIONEGG_SYSTEM_DIR = os.environ['VISIONEGG_SYSTEM_DIR'] except KeyError: self.VISIONEGG_SYSTEM_DIR = os.path.split(__file__)[0] user_dir = os.path.expanduser("~") self.VISIONEGG_USER_DIR = os.path.join(user_dir,"VisionEgg") # See if there's an environment variable for the config file if 'VISIONEGG_CONFIG_FILE' in os.environ.keys(): configFile = os.environ['VISIONEGG_CONFIG_FILE'] else: # Is there one in VISIONEGG_USER_DIR? configFile = os.path.join(self.VISIONEGG_USER_DIR,"VisionEgg.cfg") if not os.path.isfile(configFile): configFile = os.path.join(self.VISIONEGG_SYSTEM_DIR,"VisionEgg.cfg") if not os.path.isfile(configFile): configFile = None # No file, use defaults specified in environment variables then here if configFile: cfg.read(configFile) else: # pretend we have a config file cfg.add_section('General') for key in defaults.keys(): cfg.set('General',key,str(defaults[key])) if sys.platform == 'darwin': cfg.add_section('darwin') for key in extra_darwin_defaults.keys(): cfg.set('darwin',key,str(extra_darwin_defaults[key])) # Do the general stuff first # Set the default values for name in defaults.keys(): if name in os.environ.keys(): value = os.environ[name] else: value = defaults[name] if isinstance(defaults[name], int): if value == 'False': value = 0 elif value == 'True': value = 1 setattr(self,name,int(value)) elif isinstance(defaults[name], float): setattr(self,name,float(value)) else: setattr(self,name,value) # Get the values from the configFile general_options = cfg.options('General') self._delayed_configuration_log_warnings = [] # chick and egg problem # set defaults from config file for option in general_options: name = option.upper() if name not in defaults.keys(): self._delayed_configuration_log_warnings.append( "While reading %s: The variable \"%s\" is not (anymore) a Vision Egg variable."%(os.path.abspath(configFile),option)) continue value = cfg.get('General',option) if name in os.environ.keys(): value = os.environ[name] if isinstance(defaults[name], int): if value == 'False': value = 0 elif value == 'True': value = 1 setattr(self,name,int(value)) elif isinstance(defaults[name], float): setattr(self,name,float(value)) else: setattr(self,name,value) # Do platform specific stuff # Set the default values platform_name = sys.platform extra_name = "extra_%s_defaults"%(platform_name,) if extra_name in globals().keys(): extra_defaults = globals()[extra_name] for name in extra_defaults.keys(): setattr(self,name,extra_defaults[name]) # Get the values from the configFile platform_options = cfg.options(platform_name) for option in platform_options: name = option.upper() if name not in extra_defaults.keys(): raise KeyError("No Vision Egg configuration variable \"%s\""%option) value = cfg.get(platform_name,option) if name in os.environ.keys(): value = os.environ[name] if isinstance(extra_defaults[name], int): if value == 'False': value = 0 elif value == 'True': value = 1 setattr(self,name,int(value)) elif isinstance(extra_defaults[name], float): setattr(self,name,float(value)) else: setattr(self,name,value) if(configFile): self.VISIONEGG_CONFIG_FILE = os.path.abspath(configFile) else: self.VISIONEGG_CONFIG_FILE = None def save_settings(): """Save the current values to the config file, overwriting what is there.""" dont_save = ['VISIONEGG_CONFIG_FILE', 'VISIONEGG_SYSTEM_DIR', 'VISIONEGG_USER_DIR', ] if not VisionEgg.config.VISIONEGG_CONFIG_FILE: raise RuntimeError("No config file in use.") re_setting_finder = re.compile(r"^\s?((?:VISIONEGG_[A-Z_]*)|(?:SYNCLYNC_[A-Z_]*))\s?=\s?(\S*)\s?$",re.IGNORECASE) orig_file = open(VisionEgg.config.VISIONEGG_CONFIG_FILE,"r") orig_lines = orig_file.readlines() line_ending = orig_lines[0][-2:] if line_ending[0] not in ['\r','\n','\l']: line_ending = line_ending[1] out_file_lines = [] saved_config_vars = [] for line in orig_lines: out_line = line # The output is the same as the input unless there's a match match = re_setting_finder.match(line) if match: name = match.group(1).upper() if name in VisionEgg.config.__dict__.keys(): if name not in dont_save: # Change the output line out_line = ("%s = %s"%(name,getattr(VisionEgg.config,name,))) + line_ending saved_config_vars.append(name) out_file_lines.append(out_line) # Close and reopen orig_file in write mode orig_file.close() orig_file = open(VisionEgg.config.VISIONEGG_CONFIG_FILE,"w") for line in out_file_lines: orig_file.write(line) visionegg-1.2.1/VisionEgg/Core.py0000644000076500000240000023515011224565527016044 0ustar astrawstaff# The Vision Egg: Core # # Copyright (C) 2001-2004 Andrew Straw # Copyright (C) 2004-2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Core Vision Egg functionality. This module contains the architectural foundations of the Vision Egg. """ #################################################################### # # Import all the necessary packages # #################################################################### import sys, types, math, time, os # standard Python modules import StringIO import logging # available in Python 2.3 import VisionEgg # Vision Egg base module (__init__.py) import VisionEgg.PlatformDependent # platform dependent Vision Egg C code import VisionEgg.ParameterTypes as ve_types # Vision Egg type checking import VisionEgg.GLTrace # Allows tracing of all OpenGL calls import VisionEgg.ThreeDeeMath # OpenGL math simulation import pygame # pygame handles OpenGL window setup import pygame.locals import pygame.display import VisionEgg.GL as gl # get all OpenGL stuff in one namespace import numpy import numpy as np # Define "sum" if it's not available as Python function try: sum except NameError: import operator def sum( values ): return reduce(operator.add, values ) def swap_buffers(): VisionEgg.config._FRAMECOUNT_ABSOLUTE += 1 return pygame.display.flip() class PygameKeeper(object): """global object that calls any cleanup functions when quitting pygame""" def __init__(self): self.to_call_on_quit = [] def register_func_to_call_on_quit(self,func): if func not in self.to_call_on_quit: self.to_call_on_quit.append(func) def unregister_func_to_call_on_quit(self,func): idx = self.to_call_on_quit.index(func) del self.to_call_on_quit[idx] def quit(self): for func in self.to_call_on_quit: func() pygame.quit() pygame_keeper = PygameKeeper() #################################################################### # # Screen # #################################################################### class Screen(VisionEgg.ClassWithParameters): """An OpenGL window, possibly displayed across multiple displays. A Screen instance is an OpenGL window for the Vision Egg to draw in. For an instance of Screen to do anything useful, it must contain one or more instances of the Viewport class and one or more instances of the Stimulus class. Currently, only one OpenGL window is supported by the library with which the Vision Egg initializes graphics (pygame/SDL). However, this need not limit display to a single physical display device. Many video drivers, for example, allow applications to treat two separate monitors as one large array of contiguous pixels. By sizing a window such that it occupies both monitors and creating separate viewports for the portion of the window on each monitor, a multiple screen effect can be created. Public read-only variables ========================== size -- Tuple of 2 integers specifying width and height Parameters ========== bgcolor -- background color (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (0.5, 0.5, 0.5, 0.0) Constant Parameters =================== alpha_bits -- number of bits per pixel for alpha channel. Can be set with VISIONEGG_REQUEST_ALPHA_BITS (UnsignedInteger) Default: (determined at runtime) blue_bits -- number of bits per pixel for blue channel. Can be set with VISIONEGG_REQUEST_BLUE_BITS (UnsignedInteger) Default: (determined at runtime) double_buffer -- use double buffering? Can be set with VISIONEGG_DOUBLE_BUFFER (Boolean) Default: (determined at runtime) frameless -- remove standard window frame? Can be set with VISIONEGG_FRAMELESS_WINDOW (Boolean) Default: (determined at runtime) fullscreen -- use full screen? Can be set with VISIONEGG_FULLSCREEN (Boolean) Default: (determined at runtime) green_bits -- number of bits per pixel for green channel. Can be set with VISIONEGG_REQUEST_GREEN_BITS (UnsignedInteger) Default: (determined at runtime) hide_mouse -- hide the mouse cursor? Can be set with VISIONEGG_HIDE_MOUSE (Boolean) Default: (determined at runtime) is_stereo -- allocate stereo framebuffers? Can be set with VISIONEGG_REQUEST_STEREO (Boolean) Default: (determined at runtime) maxpriority -- raise priority? (platform dependent) Can be set with VISIONEGG_MAXPRIORITY (Boolean) Default: (determined at runtime) multisample_samples -- preferred number of multisamples for FSAA (UnsignedInteger) Default: (determined at runtime) preferred_bpp -- preferred bits per pixel (bit depth) Can be set with VISIONEGG_PREFERRED_BPP (UnsignedInteger) Default: (determined at runtime) red_bits -- number of bits per pixel for red channel. Can be set with VISIONEGG_REQUEST_RED_BITS (UnsignedInteger) Default: (determined at runtime) size -- size (units: pixels) Can be set with VISIONEGG_SCREEN_W and VISIONEGG_SCREEN_H (Sequence2 of Real) Default: (determined at runtime) sync_swap -- synchronize buffer swaps to vertical sync? Can be set with VISIONEGG_SYNC_SWAP (Boolean) Default: (determined at runtime) """ parameters_and_defaults = VisionEgg.ParameterDefinition({ 'bgcolor':((0.5,0.5,0.5,0.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), 'background color',), }) constant_parameters_and_defaults = VisionEgg.ParameterDefinition({ 'size':(None, ve_types.Sequence2(ve_types.Real), 'size (units: pixels) Can be set with VISIONEGG_SCREEN_W and VISIONEGG_SCREEN_H'), 'fullscreen':(None, ve_types.Boolean, 'use full screen? Can be set with VISIONEGG_FULLSCREEN'), 'double_buffer':(None, ve_types.Boolean, 'use double buffering? Can be set with VISIONEGG_DOUBLE_BUFFER'), 'preferred_bpp':(None, ve_types.UnsignedInteger, 'preferred bits per pixel (bit depth) Can be set with VISIONEGG_PREFERRED_BPP'), 'maxpriority':(None, ve_types.Boolean, 'raise priority? (platform dependent) Can be set with VISIONEGG_MAXPRIORITY'), 'hide_mouse':(None, ve_types.Boolean, 'hide the mouse cursor? Can be set with VISIONEGG_HIDE_MOUSE'), 'frameless':(None, ve_types.Boolean, 'remove standard window frame? Can be set with VISIONEGG_FRAMELESS_WINDOW'), 'sync_swap':(None, ve_types.Boolean, 'synchronize buffer swaps to vertical sync? Can be set with VISIONEGG_SYNC_SWAP'), 'red_bits':(None, ve_types.UnsignedInteger, 'number of bits per pixel for red channel. Can be set with VISIONEGG_REQUEST_RED_BITS'), 'green_bits':(None, ve_types.UnsignedInteger, 'number of bits per pixel for green channel. Can be set with VISIONEGG_REQUEST_GREEN_BITS'), 'blue_bits':(None, ve_types.UnsignedInteger, 'number of bits per pixel for blue channel. Can be set with VISIONEGG_REQUEST_BLUE_BITS'), 'alpha_bits':(None, ve_types.UnsignedInteger, 'number of bits per pixel for alpha channel. Can be set with VISIONEGG_REQUEST_ALPHA_BITS'), 'is_stereo':(None, ve_types.Boolean, 'allocate stereo framebuffers? Can be set with VISIONEGG_REQUEST_STEREO'), 'multisample_samples':(None, # support added by Mark Halko ve_types.UnsignedInteger, 'preferred number of multisamples for FSAA'), }) __slots__ = ( '__cursor_visible_func__', '__pygame_quit__', '_put_pixels_texture_stimulus', '_pixel_coord_projection', ) def __init__(self,**kw): logger = logging.getLogger('VisionEgg.Core') VisionEgg.ClassWithParameters.__init__(self,**kw) cp = self.constant_parameters # shorthand if cp.size is None: cp.size = (VisionEgg.config.VISIONEGG_SCREEN_W, VisionEgg.config.VISIONEGG_SCREEN_H) if cp.double_buffer is None: cp.double_buffer = VisionEgg.config.VISIONEGG_DOUBLE_BUFFER if cp.fullscreen is None: cp.fullscreen = VisionEgg.config.VISIONEGG_FULLSCREEN if cp.preferred_bpp is None: cp.preferred_bpp = VisionEgg.config.VISIONEGG_PREFERRED_BPP if cp.maxpriority is None: cp.maxpriority = VisionEgg.config.VISIONEGG_MAXPRIORITY if cp.hide_mouse is None: cp.hide_mouse = VisionEgg.config.VISIONEGG_HIDE_MOUSE if cp.frameless is None: cp.frameless = VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW if cp.sync_swap is None: cp.sync_swap = VisionEgg.config.VISIONEGG_SYNC_SWAP if cp.red_bits is None: cp.red_bits = VisionEgg.config.VISIONEGG_REQUEST_RED_BITS if cp.green_bits is None: cp.green_bits = VisionEgg.config.VISIONEGG_REQUEST_GREEN_BITS if cp.blue_bits is None: cp.blue_bits = VisionEgg.config.VISIONEGG_REQUEST_BLUE_BITS if cp.alpha_bits is None: cp.alpha_bits = VisionEgg.config.VISIONEGG_REQUEST_ALPHA_BITS if cp.is_stereo is None: cp.is_stereo = VisionEgg.config.VISIONEGG_REQUEST_STEREO if cp.multisample_samples is None: cp.multisample_samples = VisionEgg.config.VISIONEGG_MULTISAMPLE_SAMPLES if VisionEgg.config.SYNCLYNC_PRESENT: global synclync # import into global namespace import synclync try: VisionEgg.config._SYNCLYNC_CONNECTION = synclync.SyncLyncConnection() except synclync.SyncLyncError, x: logger.warning( "Could not connect to SyncLync device (SyncLyncError: %s)."%str(x)) VisionEgg.config._SYNCLYNC_CONNECTION = None else: logger.info( "Connected to SyncLync device" ) else: VisionEgg.config._SYNCLYNC_CONNECTION = None # Attempt to synchronize buffer swapping with vertical sync if cp.sync_swap: sync_success = VisionEgg.PlatformDependent.sync_swap_with_vbl_pre_gl_init() # Initialize pygame stuff # if sys.platform == "darwin": # bug in Mac OS X version of pygame # pygame.init() pygame.display.init() if hasattr(pygame.display,"gl_set_attribute"): pygame.display.gl_set_attribute(pygame.locals.GL_RED_SIZE,cp.red_bits) pygame.display.gl_set_attribute(pygame.locals.GL_GREEN_SIZE,cp.green_bits) pygame.display.gl_set_attribute(pygame.locals.GL_BLUE_SIZE,cp.blue_bits) pygame.display.gl_set_attribute(pygame.locals.GL_ALPHA_SIZE,cp.alpha_bits) pygame.display.gl_set_attribute(pygame.locals.GL_STEREO,cp.is_stereo) #Request FSAA if cp.multisample_samples > 0 : pygame.display.gl_set_attribute(pygame.locals.GL_MULTISAMPLEBUFFERS,1) pygame.display.gl_set_attribute(pygame.locals.GL_MULTISAMPLESAMPLES,cp.multisample_samples) else: logger.debug("Could not request or query exact bit depths, " "alpha or stereo because you need " "pygame release 1.4.9 or greater. This is " "only of concern if you use a stimulus that " "needs this. In that case, the stimulus " "should check for the desired feature(s).") if not hasattr(pygame.display,"set_gamma_ramp"): logger.debug("set_gamma_ramp function not available " "because you need pygame release 1.5 or " "greater. This is only of concern if you " "need this feature.") pygame.display.set_caption("Vision Egg") flags = pygame.locals.OPENGL if cp.double_buffer: flags = flags | pygame.locals.DOUBLEBUF if cp.fullscreen: flags = flags | pygame.locals.FULLSCREEN if cp.frameless: flags = flags | pygame.locals.NOFRAME try_bpp = cp.preferred_bpp append_str = "" if cp.fullscreen: screen_mode = "fullscreen" else: screen_mode = "window" if hasattr(pygame.display,"gl_set_attribute"): append_str = " (%d %d %d %d RGBA)."%(cp.red_bits, cp.green_bits, cp.blue_bits, cp.alpha_bits) logger.info("Requesting %s %d x %d %d bpp%s"% (screen_mode,self.size[0],self.size[1], try_bpp,append_str)) pygame.display.set_mode(self.size, flags, try_bpp ) # set a global variable so we know workaround avoid pygame bug VisionEgg.config._pygame_started = 1 try: if sys.platform != 'darwin': pygame.display.set_icon(pygame.transform.scale(pygame.image.load( os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR, 'data','visionegg.bmp')).convert(),(32,32))) else: import AppKit # requires PyObjC, which is required by pygame osx im = AppKit.NSImage.alloc() im.initWithContentsOfFile_( os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR, 'data','visionegg.tif')) AppKit.NSApplication.setApplicationIconImage_(AppKit.NSApp(),im) except Exception,x: logger.info("Error while trying to set_icon: %s: %s"% (str(x.__class__),str(x))) global gl_vendor, gl_renderer, gl_version gl_vendor = gl.glGetString(gl.GL_VENDOR) gl_renderer = gl.glGetString(gl.GL_RENDERER) gl_version = gl.glGetString(gl.GL_VERSION) logger.info("OpenGL %s, %s, %s (PyOpenGL %s)"% (gl_version, gl_renderer, gl_vendor, gl.__version__)) if gl_renderer == "GDI Generic" and gl_vendor == "Microsoft Corporation": logger.warning("Using default Microsoft Windows OpenGL " "drivers. Please (re-)install the latest " "video drivers from your video card " "manufacturer to get hardware accelerated " "performance.") if gl_renderer == "Mesa GLX Indirect" and gl_vendor == "VA Linux Systems, Inc.": logger.warning("Using default Mesa GLX drivers. Please " "(re-)install the latest video drivers from " "your video card manufacturer or DRI " "project to get hardware accelarated " "performance.") # Set values to unknown and fill based on OpenGL values cp.red_bits = None cp.green_bits = None cp.blue_bits = None cp.alpha_bits = None cp.is_stereo = None got_bpp = pygame.display.Info().bitsize append_str = '' if hasattr(pygame.display,"gl_get_attribute"): # Fill in values as known cp.red_bits = pygame.display.gl_get_attribute(pygame.locals.GL_RED_SIZE) cp.green_bits = pygame.display.gl_get_attribute(pygame.locals.GL_GREEN_SIZE) cp.blue_bits = pygame.display.gl_get_attribute(pygame.locals.GL_BLUE_SIZE) cp.alpha_bits = pygame.display.gl_get_attribute(pygame.locals.GL_ALPHA_SIZE) cp.is_stereo = pygame.display.gl_get_attribute(pygame.locals.GL_STEREO) if cp.is_stereo: stereo_string = ' stereo' else: stereo_string = '' append_str = " (%d %d %d %d RGBA%s)"%( cp.red_bits,cp.green_bits,cp.blue_bits,cp.alpha_bits, stereo_string) logger.info("Video system reports %d bpp%s."%(got_bpp,append_str)) if got_bpp < try_bpp: logger.warning("Video system reports %d bits per pixel, " "while your program requested %d. Can you " "adjust your video drivers?"%(got_bpp, try_bpp)) # Save the address of these functions so they can be called # when closing the screen. self.__cursor_visible_func__ = pygame.mouse.set_visible self.__pygame_quit__ = pygame_keeper.quit #Check FSAA requests if cp.multisample_samples>0 : if hasattr(pygame.display,"gl_set_attribute"): got_ms_buf = pygame.display.gl_get_attribute(pygame.locals.GL_MULTISAMPLEBUFFERS) got_ms_samp = pygame.display.gl_get_attribute(pygame.locals.GL_MULTISAMPLESAMPLES) if got_ms_samp < cp.multisample_samples : logger.warning("Video system reports %d multisample samples, " "while you requested %d. FSAA requires " "SDL > 1.2.6, check that it is installed."%(got_ms_samp, cp.multisample_samples)) # Attempt to synchronize buffer swapping with vertical sync again if cp.sync_swap: if not sync_success: if not VisionEgg.PlatformDependent.sync_swap_with_vbl_post_gl_init(): cp.sync_swap = False logger.warning("Unable to detect or automatically " "synchronize buffer swapping with " "vertical retrace. May be possible " "by manually adjusting video " "drivers. (Look for 'Enable " "Vertical Sync' or similar.) If " "buffer swapping is not " "synchronized, frame by frame " "control will not be possible. " "Because of this, you will probably " "get a warning about calculated " "frames per second different than " "specified.") # Check previously made OpenGL assumptions now that we have OpenGL window post_gl_init() if cp.hide_mouse: self.__cursor_visible_func__(0) # Attempt to set maximum priority (This may not be the best # place in the code to do it because it's an application-level # thing, not a screen-level thing, but it fits reasonably well # here for now.) if cp.maxpriority: VisionEgg.PlatformDependent.set_priority() # defaults to max priority if hasattr(VisionEgg.config,'_open_screens'): VisionEgg.config._open_screens.append(self) else: VisionEgg.config._open_screens = [self] # Use Python descriptors (introduced in Python 2.2) to link size # attribute to constant_parameters.size. def get_size(self): return self.constant_parameters.size def set_size(self, value): raise RuntimeError("Attempting to set read-only value") size = property(get_size,set_size) def get_framebuffer_as_image(self, buffer='back', format=gl.GL_RGB, position=(0,0), anchor='lowerleft', size=None, # if None, use full screen ): """get pixel values from framebuffer to PIL image""" import Image # Could import this at the beginning of the file, but it breaks sometimes. fb_array = self.get_framebuffer_as_array(buffer=buffer, format=format, position=position, anchor=anchor, size=size, ) size = fb_array.shape[1], fb_array.shape[0] if format == gl.GL_RGB: pil_mode = 'RGB' elif format == gl.GL_RGBA: pil_mode = 'RGBA' fb_image = Image.fromstring(pil_mode,size,fb_array.tostring()) fb_image = fb_image.transpose( Image.FLIP_TOP_BOTTOM ) return fb_image def get_framebuffer_as_array(self, buffer='back', format=gl.GL_RGB, position=(0,0), anchor='lowerleft', size=None, # if None, use full screen ): """get pixel values from framebuffer to numpy array"""# (SLOW)""" if size is None: size = self.size lowerleft = VisionEgg._get_lowerleft(position,anchor,size) if buffer == 'front': gl.glReadBuffer( gl.GL_FRONT ) elif buffer == 'back': gl.glReadBuffer( gl.GL_BACK ) else: raise ValueError('No support for "%s" framebuffer'%buffer) framebuffer_pixels = gl.glReadPixels(lowerleft[0],lowerleft[1], size[0],size[1], gl.GL_RGBA, gl.GL_UNSIGNED_BYTE) raw_format = 'RGBA' fb_array = np.fromstring(framebuffer_pixels,np.uint8) fb_array = np.reshape(fb_array,(size[1],size[0],4)) # These work, but I don't know why. There must be something I # don't understand about byte ordering! if format == gl.GL_RGB: if raw_format == 'BGRA': fb_array = fb_array[:,:,1:] elif raw_format == 'RGBA': fb_array = fb_array[:,:,:3] elif format == gl.GL_RGBA: if raw_format == 'BGRA': B = fb_array[:,:,0,np.newaxis] G = fb_array[:,:,1,np.newaxis] R = fb_array[:,:,2,np.newaxis] A = fb_array[:,:,3,np.newaxis] fb_array = np.concatenate( (R,G,B,A), axis=2) elif raw_format == 'RGBA': pass else: raise NotImplementedError("Only RGB and RGBA formats currently supported") return fb_array def put_pixels(self, pixels=None, position=(0,0), anchor='lowerleft', scale_x=1.0, # "zoom" the pixels scale_y=1.0, # "zoom" the pixels texture_min_filter=gl.GL_NEAREST, # only used if scale < 1.0 texture_mag_filter=gl.GL_NEAREST, # only used if scale > 1.0 internal_format=gl.GL_RGB, # pixel data converted to this format in texture (gl.GL_RGBA also useful) ): """Put pixel values to screen. Pixel values become texture data using the VisionEgg.Textures module. Any source of texture data accepted by that module is accepted here. This function could be sped up by allocating a fixed OpenGL texture object. """ import VisionEgg.Textures # import here to avoid import loop make_new_texture_object = 0 if not hasattr(self, "_put_pixels_texture_stimulus"): make_new_texture_object = 1 else: if internal_format != self._put_pixels_texture_stimulus.constant_parameters.internal_format: make_new_texture_object = 1 if make_new_texture_object: # For speed, don't do this on anything other than 1st run texture = VisionEgg.Textures.Texture(pixels) on_screen_size = (texture.size[0]*scale_x, texture.size[1]*scale_y) t = VisionEgg.Textures.TextureStimulus(texture=texture, position=position, anchor=anchor, size=on_screen_size, mipmaps_enabled=0, texture_min_filter=texture_min_filter, texture_mag_filter=texture_mag_filter, internal_format = internal_format, ) self._put_pixels_texture_stimulus = t # rename self._pixel_coord_projection = OrthographicProjection(left=0, right=self.size[0], bottom=0, top=self.size[1], z_clip_near=0.0, z_clip_far=1.0) else: # We've run once before and therefore already have a # texture stimulus. (XXX In the future, make use of # already assigned texture object and use put_sub_image # for speed.) self._put_pixels_texture_stimulus.parameters.texture = VisionEgg.Textures.Texture(pixels) self._pixel_coord_projection.push_and_set_gl_projection() # Save projection self._put_pixels_texture_stimulus.draw() # Draw pixels as texture gl.glMatrixMode(gl.GL_PROJECTION) # Restore projection gl.glPopMatrix() def query_refresh_rate(self): return VisionEgg.PlatformDependent.query_refresh_rate(self) def measure_refresh_rate(self,average_over_seconds=0.1): """Measure the refresh rate. Assumes swap buffers synced.""" start_time = VisionEgg.time_func() duration_sec = 0.0 num_frames = 0 while duration_sec < average_over_seconds: swap_buffers() now = VisionEgg.time_func() num_frames += 1 duration_sec = now - start_time if duration_sec > 0.0: fps = num_frames / duration_sec else: fps = 0.0 return fps def clear(self): """Called by Presentation instance. Clear the screen.""" c = self.parameters.bgcolor # Shorthand if len(c) == 4: gl.glClearColor(*c) else: gl.glClearColor(c[0],c[1],c[2],0.0) # set alpha to 0.0 unless specified gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) def make_current(self): """Called by Viewport instance. Makes screen active for drawing. Can not be implemented until multiple screens are possible.""" pass def set_gamma_ramp(self,*args,**kw): """Set the gamma_ramp, if supported. Call pygame.display.set_gamma_ramp, if available. Returns True on success, False otherwise.""" if not hasattr(pygame.display,"set_gamma_ramp"): logger = logging.getLogger('VisionEgg.Core') logger.error("Need pygame 1.5 or greater for set_gamma_ramp function") return False if pygame.display.set_gamma_ramp(*args,**kw): return True else: return False def close(self): """Close the screen. You can call this to close the screen. Not necessary during normal operation because it gets automatically deleted.""" # Close pygame if possible if hasattr(VisionEgg.config,'_open_screens'): if self in VisionEgg.config._open_screens: VisionEgg.config._open_screens.remove(self) if len(VisionEgg.config._open_screens) == 0: # no more open screens if hasattr(self,"__cursor_visible_func__"): self.__cursor_visible_func__(1) pygame_keeper.quit() # No access to the cursor visible function anymore if hasattr(self,"__cursor_visible_func__"): del self.__cursor_visible_func__ def __del__(self): # Make sure mouse is visible after screen closed. if hasattr(self,"__cursor_visible_func__"): try: self.__cursor_visible_func__(1) self.__pygame_quit__() except pygame.error, x: if str(x) != 'video system not initialized': raise def create_default(): """Alternative constructor using configuration variables. Most of the time you can create and instance of Screen using this method. If your script needs explicit control of the Screen parameters, initialize with the normal constructor. Uses VisionEgg.config.VISIONEGG_GUI_INIT to determine how the default screen parameters should are determined. If this value is 0, the values from VisionEgg.cfg are used. If this value is 1, a GUI panel is opened and allows manual settings of the screen parameters. """ global VisionEgg # Allow "VisionEgg.config" instead of just "config" if VisionEgg.config.VISIONEGG_GUI_INIT: import VisionEgg.GUI # Could import in beginning, but no need if not using GUI window = VisionEgg.GUI.GraphicsConfigurationWindow() window.mainloop() # All this does is adjust VisionEgg.config if not window.clicked_ok: sys.exit() # User wants to quit screen = None try: screen = Screen(size=(VisionEgg.config.VISIONEGG_SCREEN_W, VisionEgg.config.VISIONEGG_SCREEN_H), fullscreen=VisionEgg.config.VISIONEGG_FULLSCREEN, preferred_bpp=VisionEgg.config.VISIONEGG_PREFERRED_BPP, bgcolor=(0.5,0.5,0.5,0.0), maxpriority=VisionEgg.config.VISIONEGG_MAXPRIORITY, frameless=VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW, hide_mouse=VisionEgg.config.VISIONEGG_HIDE_MOUSE) finally: if screen is None: # Opening screen failed. Let's do any cleanup that Screen.__init__ missed. try: pygame.mouse.set_visible(1) # make sure mouse is visible pygame_keeper.quit() # close screen except pygame.error, x: if str(x) != 'video system not initialized': raise if screen is None: raise RuntimeError("Screen open failed. Check your error log for a traceback.") gamma_source = VisionEgg.config.VISIONEGG_GAMMA_SOURCE.lower() if gamma_source != 'none': if gamma_source == 'invert': native_red = VisionEgg.config.VISIONEGG_GAMMA_INVERT_RED native_green = VisionEgg.config.VISIONEGG_GAMMA_INVERT_GREEN native_blue = VisionEgg.config.VISIONEGG_GAMMA_INVERT_BLUE red = screen._create_inverted_gamma_ramp( native_red ) green = screen._create_inverted_gamma_ramp( native_green ) blue = screen._create_inverted_gamma_ramp( native_blue ) gamma_set_string = "linearized gamma lookup tables to correct "+\ "monitor with native gammas (%f, %f, %f) RGB"%( native_red, native_green, native_blue) elif gamma_source == 'file': filename = VisionEgg.config.VISIONEGG_GAMMA_FILE red, green, blue = screen._open_gamma_file(filename) gamma_set_string = "set gamma lookup tables from data in file %s"%os.path.abspath(filename) else: raise ValueError("Unknown gamma source: '%s'"%gamma_source) logger = logging.getLogger('VisionEgg.Core') if not screen.set_gamma_ramp(red,green,blue): logger.warning( "Setting gamma ramps failed." ) else: logger.info( "Gamma set sucessfully: %s"%gamma_set_string ) return screen create_default = staticmethod(create_default) def _create_inverted_gamma_ramp(self, gamma): # c is a constant scale factor. It is always 1.0 when # luminance is normalized to range [0.0,1.0] and input units # in range [0.0,1.0], as is OpenGL standard. c = 1.0 inc = 1.0/255 target_luminances = np.arange(0.0,1.0+inc,inc) output_ramp = np.zeros(target_luminances.shape,dtype=np.int) for i in range(len(target_luminances)): L = target_luminances[i] if L == 0.0: v_88fp = 0 else: v = math.exp( (math.log(L) - math.log(c)) /gamma) v_88fp = int(round((v*255) * 256)) # convert to from [0.0,1.0] floating point to [0.0,255.0] 8.8 fixed point output_ramp[i] = v_88fp # 8.8 fixed point format return list(output_ramp) # convert to Python list def _open_gamma_file(self, filename): fd = open(filename,"r") gamma_values = [] for line in fd.readlines(): line = line.strip() # remove leading/trailing whitespace if line.startswith("#"): # comment, ignore continue gamma_values.append( map(int, line.split() ) ) if len(gamma_values[-1]) != 3: raise ValueError("expected 3 values per gamma entry") if len(gamma_values) != 256: raise ValueError("expected 256 gamma entries") red, green, blue = zip(*gamma_values) return red,green,blue def get_default_screen(): """Make an instance of Screen using a GUI window or from config file.""" return Screen.create_default() #################################################################### # # Projection and derived classes # #################################################################### class ProjectionBaseClass(VisionEgg.ClassWithParameters): """Base class for 4x4 linear matrix transformation This is an abstract base class which should be subclassed for actual use. Parameters ========== matrix -- matrix specifying projection (Sequence4x4 of Real) Default: [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] """ # WARNING: This implementation should really get cleaned up and # NOT use OpenGL except when purposefully setting matrices. parameters_and_defaults = VisionEgg.ParameterDefinition({ 'matrix':( numpy.eye(4), # 4x4 identity matrix ve_types.Sequence4x4(ve_types.Real), 'matrix specifying projection'), }) __slots__ = ( 'projection_type', ) def __init__(self,**kw): VisionEgg.ClassWithParameters.__init__(self,**kw) self.projection_type = None # derived class must override def _get_matrix_type(self): if self.projection_type == gl.GL_PROJECTION: return gl.GL_PROJECTION_MATRIX elif self.projection_type == gl.GL_MODELVIEW: return gl.GL_MODELVIEW_MATRIX def apply_to_gl(self): """Set the OpenGL projection matrix.""" gl.glMatrixMode(self.projection_type) gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 def set_gl_modelview(self): """Set the OpenGL modelview matrix.""" gl.glMatrixMode(gl.GL_MODELVIEW) gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 def set_gl_projection(self): """Set the OpenGL projection matrix.""" gl.glMatrixMode(gl.GL_PROJECTION) gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 def push_and_set_gl_projection(self): """Set the OpenGL projection matrix, pushing current projection matrix to stack.""" gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix gl.glPushMatrix() gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 def translate(self,x,y,z): """Compose a translation and set the OpenGL projection matrix.""" gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 gl.glTranslatef(x,y,z) self.parameters.matrix = gl.glGetFloatv(self._get_matrix_type()) def stateless_translate(self,x,y,z): """Compose a translation without changing OpenGL state.""" M = VisionEgg.ThreeDeeMath.TransformMatrix(self.parameters.matrix) M.translate(x,y,z) self.parameters.matrix = M.get_matrix() def rotate(self,angle_degrees,x,y,z): """Compose a rotation and set the OpenGL projection matrix.""" gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 gl.glRotatef(angle_degrees,x,y,z) self.parameters.matrix = gl.glGetFloatv(self._get_matrix_type()) def stateless_rotate(self,angle_degrees,x,y,z): """Compose a rotation without changing OpenGL state.""" M = VisionEgg.ThreeDeeMath.TransformMatrix(self.parameters.matrix) M.rotate(angle_degrees,x,y,z) self.parameters.matrix = M.get_matrix() def scale(self,x,y,z): """Compose a rotation and set the OpenGL projection matrix.""" gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 gl.glScalef(x,y,z) self.parameters.matrix = gl.glGetFloatv(self._get_matrix_type()) def stateless_scale(self,x,y,z): """Compose a rotation without changing OpenGL state.""" M = VisionEgg.ThreeDeeMath.TransformMatrix(self.parameters.matrix) M.scale(x,y,z) self.parameters.matrix = M.get_matrix() def get_matrix(self): return self.parameters.matrix def look_at(self, eye, center, up ): # Basically the same as gluLookAt def normalize(vec): numpy_vec = numpy.asarray(vec) mag = math.sqrt(numpy.sum(numpy_vec**2)) return numpy_vec / mag def cross(vec1,vec2): return ( vec1[1]*vec2[2] - vec1[2]*vec2[1], vec1[2]*vec2[0] - vec1[0]*vec2[2], vec1[0]*vec2[1] - vec1[1]*vec2[0] ) forward = numpy.array(( center[0] - eye[0], center[1] - eye[1], center[2] - eye[2]),'f') forward = normalize(forward) side = cross(forward,up) side = normalize(side) new_up = cross(side,forward) # recompute up # XXX I might have to transpose this matrix m = np.array([[side[0], new_up[0], -forward[0], 0.0], [side[1], new_up[1], -forward[1], 0.0], [side[2], new_up[2], -forward[2], 0.0], [ 0.0, 0.0, 0.0, 1.0]]) # XXX This should get optimized -- don't do it in OpenGL gl.glMatrixMode(self.projection_type) # Set OpenGL matrix state to modify the projection matrix gl.glPushMatrix() # save current matrix try: gl.glLoadMatrixf(self.parameters.matrix) # Need PyOpenGL >= 2.0 gl.glMultMatrixf(m) gl.glTranslatef(-eye[0],-eye[1],-eye[2]) self.parameters.matrix = gl.glGetFloatv(self._get_matrix_type()) finally: gl.glPopMatrix() # save current matrix def eye_2_clip(self,eye_coords_vertex): """Transform eye coordinates to clip coordinates""" m = np.array(self.parameters.matrix) v = np.array(eye_coords_vertex) homog = VisionEgg.ThreeDeeMath.make_homogeneous_coord_rows(v) r = numpy.dot(homog,m) if len(homog.shape) > len(v.shape): r = np.reshape(r,(4,)) return r def clip_2_norm_device(self,clip_coords_vertex): """Transform clip coordinates to normalized device coordinates""" v = numpy.array(clip_coords_vertex) homog = VisionEgg.ThreeDeeMath.make_homogeneous_coord_rows(v) err=numpy.seterr(all='ignore') r = (homog/homog[:,3,numpy.newaxis])[:,:3] numpy.seterr(**err) if len(homog.shape) > len(v.shape): r = np.reshape(r,(3,)) return r def eye_2_norm_device(self,eye_coords_vertex): """Transform eye coordinates to normalized device coordinates""" return self.clip_2_norm_device(self.eye_2_clip(eye_coords_vertex)) def apply_to_vertex(self,vertex): """Perform multiplication on vertex to get transformed result""" M = VisionEgg.ThreeDeeMath.TransformMatrix(matrix=self.parameters.matrix) r = M.transform_vertices([vertex]) return r[0] def apply_to_vertices(self,vertices): """Perform multiplication on vertex to get transformed result""" M = VisionEgg.ThreeDeeMath.TransformMatrix(matrix=self.parameters.matrix) r = M.transform_vertices(vertices) return r class Projection(ProjectionBaseClass): """for use of OpenGL PROJECTION_MATRIX Converts eye coordinates to clip coordinates. Parameters ========== matrix -- matrix specifying projection (Sequence4x4 of Real) Default: [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] """ def __init__(self,*args,**kw): ProjectionBaseClass.__init__(self,*args,**kw) self.projection_type = gl.GL_PROJECTION class ModelView(ProjectionBaseClass): """for use of OpenGL MODELVIEW_MATRIX Converts object coordinates to eye coordinates. Parameters ========== matrix -- matrix specifying projection (Sequence4x4 of Real) Default: [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] """ def __init__(self,*args,**kw): ProjectionBaseClass.__init__(self,*args,**kw) self.projection_type = gl.GL_MODELVIEW class OrthographicProjection(Projection): """An orthographic projection. Parameters ========== matrix -- matrix specifying projection (Sequence4x4 of Real) Default: [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] """ def __init__(self,left=0.0,right=640.0,bottom=0.0,top=480.0,z_clip_near=0.0,z_clip_far=1.0): """Create an orthographic projection. Defaults to map x eye coordinates in the range [0,640], y eye coordinates [0,480] and clip coordinates [0,1] to [0,1]. Therefore, if the viewport is 640 x 480, eye coordinates correspond 1:1 with window (pixel) coordinates. Only points between these clipping planes will be displayed. """ # using numpy (from the OpenGL spec): matrix = np.array([[ 2./(right-left), 0., 0., -(right+left)/(right-left)], [ 0., 2./(top-bottom), 0., -(top+bottom)/(top-bottom)], [ 0., 0., -2./(z_clip_far-z_clip_near), -(z_clip_far+z_clip_near)/(z_clip_far-z_clip_near)], [ 0., 0., 0., 1.0]]) matrix = np.transpose(matrix) # convert to OpenGL format ## same as above, but use OpenGL #gl.glMatrixMode(gl.GL_PROJECTION) #gl.glPushMatrix() # save current matrix #gl.glLoadIdentity() #gl.glOrtho(left,right,bottom,top,z_clip_near,z_clip_far) #matrix = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) #gl.glPopMatrix() # restore original matrix Projection.__init__(self,**{'matrix':matrix}) class OrthographicProjectionNoZClip(Projection): """An orthographic projection without Z clipping. Parameters ========== matrix -- matrix specifying projection (Sequence4x4 of Real) Default: [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] """ def __init__(self,left=0.0,right=640.0,bottom=0.0,top=480.0): """Create an orthographic projection without Z clipping. Defaults to map x eye coordinates in the range [0,640] and y eye coordinates [0,480] -> [0,1]. Therefore, if the viewport is 640 x 480, eye coordinates correspond 1:1 with window (pixel) coordinates. """ # using numpy (from the OpenGL spec): matrix = np.array([[ 2./(right-left), 0, 0, -(right+left)/(right-left)], [ 0, 2./(top-bottom), 0, -(top+bottom)/(top-bottom)], [ 0, 0, -1, -1.], [ 0, 0, 0, 1]]) matrix = np.transpose(matrix) # convert to OpenGL format Projection.__init__(self,**{'matrix':matrix}) class SimplePerspectiveProjection(Projection): """A simplified perspective projection. Parameters ========== matrix -- matrix specifying projection (Sequence4x4 of Real) Default: [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] """ def __init__(self,fov_x=45.0,z_clip_near = 0.1,z_clip_far=10000.0,aspect_ratio=4.0/3.0): matrix = self._compute_matrix(fov_x,z_clip_near,z_clip_far,aspect_ratio) Projection.__init__(self,**{'matrix':matrix}) def _compute_matrix(self,fov_x=45.0,z_clip_near = 0.1,z_clip_far=10000.0,aspect_ratio=4.0/3.0): """Compute a 4x4 projection matrix that performs a perspective distortion.""" fov_y = fov_x / aspect_ratio # This is a translation of what gluPerspective does: #glu.gluPerspective(fov_y,aspect_ratio,z_clip_near,z_clip_far) radians = fov_y / 2.0 * math.pi / 180.0 delta_z = z_clip_far - z_clip_near sine = math.sin(radians) if (delta_z == 0.0) or (sine == 0.0) or (aspect_ratio == 0.0): raise ValueError("Invalid parameters passed to SimpleProjection.__init__()") cotangent = math.cos(radians) / sine matrix = np.zeros((4,4)) matrix[0][0] = cotangent/aspect_ratio matrix[1][1] = cotangent matrix[2][2] = -(z_clip_far + z_clip_near) / delta_z matrix[2][3] = -1.0 # XXX this matrix[3][2] = -2.0 * z_clip_near * z_clip_far / delta_z # XXX and this might cause the matrix to need to be transposed matrix[3][3] = 0.0 return matrix class PerspectiveProjection(Projection): """A perspective projection. Parameters ========== matrix -- matrix specifying projection (Sequence4x4 of Real) Default: [[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] """ def __init__(self,left,right,bottom,top,near,far): # XXX right now this is done in OpenGL, we should do it ourselves gl.glMatrixMode(gl.GL_PROJECTION) # Set OpenGL matrix state to modify the projection matrix gl.glPushMatrix() gl.glLoadIdentity() # Clear the projection matrix gl.glFrustum(left,right,bottom,top,near,far) # Let GL create a matrix and compose it matrix = gl.glGetFloatv(gl.GL_PROJECTION_MATRIX) gl.glPopMatrix() if matrix is None: # OpenGL wasn't started raise RuntimeError("OpenGL matrix operations can only take place once OpenGL context started.") matrix = np.asarray(matrix) # make sure it's numpy array Projection.__init__(self,**{'matrix':matrix}) #################################################################### # # Stimulus - Base class # #################################################################### class Stimulus(VisionEgg.ClassWithParameters): """Base class for a stimulus. Any stimulus element should be a subclass of this Stimulus class. The draw() method contains the code executed before every buffer swap in order to render the stimulus to the frame buffer. It should execute as quickly as possible. The init_gl() method must be called before the first call to draw() so that any internal data, OpenGL display lists, and OpenGL:texture objects can be established. To illustrate the concept of the Stimulus class, here is a description of several methods of drawing two spots. If your experiment displays two spots simultaneously, you could create two instances of (a single subclass of) Stimulus, varying parameters so each draws at a different location. Another possibility is to create one instance of a subclass that draws two spots. Another, somewhat obscure, possibility is to create a single instance and add it to two different viewports. (Something that will not work would be adding the same instance two times to the same viewport. It would also get drawn twice, although at exactly the same location.) OpenGL is a 'state machine', meaning that it has internal parameters whose values vary and affect how it operates. Because of this inherent uncertainty, there are only limited assumptions about the state of OpenGL that an instance of Stimulus should expect when its draw() method is called. Because the Vision Egg loops through stimuli this also imposes some important behaviors: First, the framebuffer will contain the results of any drawing operations performed since the last buffer swap by other instances of (subclasses of) Stimulus. Therefore, the order in which stimuli are present in the stimuli list of an instance of Viewport may be important. Additionally, if there are overlapping viewports, the order in which viewports are added to an instance of Screen is important. Second, previously established OpenGL display lists and OpenGL texture objects will be available. The __init__() method should establish these things. Third, there are several OpenGL state variables which are commonly set by subclasses of Stimulus, and which cannot be assumed to have any particular value at the time draw() is called. These state variables are: blending mode and function, texture state and environment, the matrix mode (modelview or projection), the modelview matrix, depth mode and settings. Therefore, if the draw() method depends on specific values for any of these states, it must specify its own values to OpenGL. Finally, a well-behaved Stimulus subclass resets any OpenGL state values other than those listed above to their initial state before draw() and init_gl() were called. In other words, before your stimulus changes the state of an OpenGL variable, use glGetBoolean, glGetInteger, glGetFloat, or a similar function to query its value and restore it later. For example, upon calling the draw() method, the projection matrix will be that which was set by the viewport. If the draw() method alters the projection matrix, it must be restored. The glPushMatrix() and glPopMatrix() commands provide an easy way to do this. The default projection of Viewport maps eye coordinates in a 1:1 fashion to window coordinates (in other words, it sets eye coordinates to use pixel units from the lower left corner of the viewport). Therefore the default parameters for a stimulus should specify pixel coordinates if possible (such as for a 2D stimulus). Assuming a window size of 640 by 480 for the default parameters is a pretty safe way to do things. Also, be sure to check for any assumptions made about the system in the __init__ method. For example, if your stimulus needs alpha in the framebuffer, check the value of glGetIntegerv(GL_ALPHA_BITS) and raise an exception if it is not available. """ def __init__(self,**kw): """Instantiate and get ready to draw. Set parameter values and create anything needed to draw the stimulus including OpenGL state variables such display lists and texture objects. """ VisionEgg.ClassWithParameters.__init__(self,**kw) def draw(self): """Draw the stimulus. (Called by Viewport instance.) This method is called every frame. This method actually performs the OpenGL calls to draw the stimulus. """ pass #################################################################### # # Viewport # #################################################################### class Viewport(VisionEgg.ClassWithParameters): """Connects stimuli to a screen. A viewport defines a (possibly clipped region) of the screen on which stimuli are drawn. A screen may have multiple viewports. The viewports may be overlapping. A viewport may have multiple stimuli. A single stimulus may be drawn simultaneously by several viewports, although this is typically useful only for 3D stimuli to represent different views of the same object. The coordinates of the stimulus are converted to screen coordinates via several steps, the most important of which is the projection, which is defined by an instance of the Projection class. By default, a viewport has a projection and viewport transformation which maps eye coordinates to window coordinates in 1:1 manner. In other words, eye coordinates specify pixel location in the viewport window. For example, if the viewport was 640 pixels wide and 480 pixels high, the default projection would take eye coordinate (320,240,0,1) and map it to normalized device coordinates of (0.5,0.5,0.0). The default viewport transformation would transform this to window coordinates of (320,240,0.5). For cases where pixel units are not natural to describe coordinates of a stimulus, the application should specify the a projection other than the default. This is usually the case for 3D stimuli. For details of the projection and clipping process, see the section 'Coordinate Transformations' in the book/online document 'The OpenGL Graphics System: A Specification' Parameters ========== anchor -- How position parameter is interpreted (String) Default: lowerleft camera_matrix -- extrinsic camera parameter matrix (position and orientation) (Instance of ) Default: (determined at runtime) depth_range -- depth range (in object units) for rendering (Sequence2 of Real) Default: (0, 1) position -- Position (in pixel units) within the screen (Sequence2 of Real) Default: (0, 0) projection -- intrinsic camera parameter matrix (field of view, focal length, aspect ratio) (Instance of ) Default: (determined at runtime) screen -- The screen in which this viewport is drawn (Instance of ) Default: (determined at runtime) size -- Size (in pixel units) (Sequence2 of Real) Default: (determined at runtime) stimuli -- sequence of stimuli to draw in screen (Sequence of Instance of ) Default: (determined at runtime) """ parameters_and_defaults = VisionEgg.ParameterDefinition({ 'screen':(None, ve_types.Instance(Screen), 'The screen in which this viewport is drawn'), 'position':((0,0), ve_types.Sequence2(ve_types.Real), 'Position (in pixel units) within the screen'), 'anchor':('lowerleft', ve_types.String, 'How position parameter is interpreted'), 'depth_range':((0,1), ve_types.Sequence2(ve_types.Real), 'depth range (in object units) for rendering'), 'size':(None, # will use screen.size if not specified ve_types.Sequence2(ve_types.Real), 'Size (in pixel units)'), 'projection':(None, ve_types.Instance(Projection), 'intrinsic camera parameter matrix (field of view, focal length, aspect ratio)'), 'auto_pixel_projection':(None, ve_types.Boolean, 'reset the projection when the size changes to maintain pixel coordinates'), 'camera_matrix':(None, ve_types.Instance(ModelView), 'extrinsic camera parameter matrix (position and orientation)'), 'stimuli':(None, ve_types.Sequence(ve_types.Instance(Stimulus)), 'sequence of stimuli to draw in screen'), 'lowerleft':(None, # DEPRECATED -- don't use ve_types.Sequence2(ve_types.Real), 'position (in pixel units) of lower-left viewport corner', VisionEgg.ParameterDefinition.DEPRECATED), }) __slots__ = ( '_is_drawing', '_cached_size', ) def __init__(self,**kw): """Create a new instance. Required arguments: screen Optional arguments (specify parameter value other than default): position -- defaults to (0,0), position relative to screen by anchor (see below) anchor -- defaults to 'lowerleft' size -- defaults to screen.size projection -- defaults to self.make_new_pixel_coord_projection() stimuli -- defaults to empty list """ VisionEgg.ClassWithParameters.__init__(self,**kw) if self.parameters.screen is None: raise ValueError("Must specify screen when creating an instance of Viewport.") p = self.parameters # shorthand if p.size is None: p.size = p.screen.constant_parameters.size self._cached_size = None if p.projection is None: # Default projection maps eye coordinates 1:1 on window (pixel) coordinates p.projection = self.make_new_pixel_coord_projection() if p.auto_pixel_projection is None: # default to maintaining pixel coordinates p.auto_pixel_projection = True self._cached_size = p.size else: # If the user *did* specify a projection, it is likely # that they want that to be maintained. if p.auto_pixel_projection is None: # default to not maintaining p.auto_pixel_projection = False if p.camera_matrix is None: p.camera_matrix = ModelView() if p.stimuli is None: p.stimuli = [] self._is_drawing = False def make_new_pixel_coord_projection(self): """Create instance of Projection mapping eye coordinates 1:1 with pixel coordinates.""" return OrthographicProjectionNoZClip(left=0,right=self.parameters.size[0], bottom=0,top=self.parameters.size[1]) def make_current(self): p = self.parameters # shorthand p.screen.make_current() if p.auto_pixel_projection and self._cached_size != p.size: p.projection = self.make_new_pixel_coord_projection() self._cached_size = p.size if p.lowerleft != None: if not hasattr(Viewport,"_gave_lowerleft_warning"): logger = logging.getLogger('VisionEgg.Core') logger.warning("lowerleft parameter of Viewport class " "will stop being supported. Use " "'position' instead with anchor set to " "'lowerleft'.") Viewport._gave_lowerleft_warning = True p.anchor = 'lowerleft' p.position = p.lowerleft[0], p.lowerleft[1] # copy values (don't copy ref to tuple) lowerleft = VisionEgg._get_lowerleft(p.position,p.anchor,p.size) gl.glViewport(int(lowerleft[0]), int(lowerleft[1]), int(p.size[0]), int(p.size[1])) gl.glDepthRange(p.depth_range[0],p.depth_range[1]) p.projection.apply_to_gl() p.camera_matrix.apply_to_gl() def draw(self): """Set the viewport and draw stimuli.""" self.make_current() self._is_drawing = True for stimulus in self.parameters.stimuli: stimulus.draw() self._is_drawing = False def norm_device_2_window(self,norm_device_vertex): """Transform normalized device coordinates to window coordinates""" v = np.asarray(norm_device_vertex) homog = VisionEgg.ThreeDeeMath.make_homogeneous_coord_rows(v) xd = homog[:,0,np.newaxis] yd = homog[:,1,np.newaxis] zd = homog[:,2,np.newaxis] p = self.parameters # shorthand lowerleft = VisionEgg._get_lowerleft(p.position,p.anchor,p.size) x,y = lowerleft w,h = p.size n,f = p.depth_range # clamp n and f n = min(1.0,max(0.0,n)) f = min(1.0,max(0.0,f)) ox = x + w/2.0 oy = y + h/2.0 px = w py = h xw = (px/2.0)*xd + ox yw = (py/2.0)*yd + oy zw = ((f-n)/2.0)*zd + (n+f)/2.0 # XXX I think zw (or zd) is clamped in OpenGL, but I can't # find it in any spec! #zw = np.clip(zw,0.0,1.0) # clamp r = np.concatenate((xw,yw,zw),axis=1) if len(homog.shape) > len(v.shape): r = np.reshape(r,(3,)) return r def clip_2_window(self,eye_coords_vertex): """Transform clip coordinates to window coordinates""" my_proj = self.parameters.projection return self.norm_device_2_window( my_proj.clip_2_norm_device( eye_coords_vertex ) ) def eye_2_window(self,eye_coords_vertex): """Transform eye coordinates to window coordinates""" my_proj = self.parameters.projection return self.norm_device_2_window( my_proj.eye_2_norm_device( eye_coords_vertex ) ) #################################################################### # # FixationSpot # #################################################################### class FixationSpot(Stimulus): """A rectangle stimulus, typically used as a fixation spot. Parameters ========== anchor -- how position parameter is used (String) Default: center color -- color (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) on -- draw? (Boolean) Default: True position -- position in eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) Default: (320.0, 240.0) size -- size in eye coordinates (Sequence2 of Real) Default: (4.0, 4.0) """ parameters_and_defaults = VisionEgg.ParameterDefinition({ 'on':(True, ve_types.Boolean, 'draw?'), 'color':((1.0,1.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), 'color'), 'position' : ( ( 320.0, 240.0 ), # in eye coordinates ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), 'position in eye coordinates'), 'anchor' : ('center', ve_types.String, 'how position parameter is used'), 'size':((4.0,4.0), # horiz and vertical size ve_types.Sequence2(ve_types.Real), 'size in eye coordinates'), 'center' : (None, # DEPRECATED -- don't use ve_types.Sequence2(ve_types.Real), 'position in eye coordinates', VisionEgg.ParameterDefinition.DEPRECATED), }) def __init__(self,**kw): Stimulus.__init__(self,**kw) def draw(self): p = self.parameters # shorthand if p.center is not None: if not hasattr(VisionEgg.config,"_GAVE_CENTER_DEPRECATION"): logger = logging.getLogger('VisionEgg.Core') logger.warning("Specifying FixationSpot by deprecated " "'center' parameter deprecated. Use " "'position' parameter instead. (Allows " "use of 'anchor' parameter to set to " "other values.)") VisionEgg.config._GAVE_CENTER_DEPRECATION = 1 p.anchor = 'center' p.position = p.center[0], p.center[1] # copy values (don't copy ref to tuple) if p.on: # calculate center center = VisionEgg._get_center(p.position,p.anchor,p.size) gl.glDisable(gl.GL_DEPTH_TEST) gl.glDisable(gl.GL_TEXTURE_2D) gl.glDisable(gl.GL_BLEND) if len(p.color)==3: gl.glColor3f(*p.color) elif len(p.color)==4: gl.glColor4f(*p.color) # This could go in a display list to speed it up, but then # size wouldn't be dynamically adjustable this way. Could # still use one of the matrices to make it change size. x_size = self.parameters.size[0]/2.0 y_size = self.parameters.size[1]/2.0 x,y = center[0],center[1] x1 = x-x_size; x2 = x+x_size y1 = y-y_size; y2 = y+y_size gl.glBegin(gl.GL_QUADS) gl.glVertex2f(x1,y1) gl.glVertex2f(x2,y1) gl.glVertex2f(x2,y2) gl.glVertex2f(x1,y2) gl.glEnd() # GL_QUADS #################################################################### # # Frame timing information # #################################################################### class FrameTimer: """Time inter frame intervals and compute frames per second.""" def __init__(self, bin_start_msec=2, bin_stop_msec=28, bin_width_msec=2, running_average_num_frames=0,save_all_frametimes=False): """Create instance of FrameTimer.""" self.bins = np.arange( bin_start_msec, bin_stop_msec, bin_width_msec ) self.bin_width_msec = float(bin_width_msec) self.timing_histogram = np.zeros(self.bins.shape) self._true_time_last_frame = None # no frames yet self.longest_frame_draw_time_sec = None self.first_tick_sec = None self.total_frames = 0 self.running_average_num_frames = running_average_num_frames if self.running_average_num_frames: self.last_n_frame_times_sec = [None]*self.running_average_num_frames self.save_all_frametimes = save_all_frametimes if self.save_all_frametimes: self.all_frametimes = [] def tick(self): """Declare a frame has just been drawn.""" true_time_now = VisionEgg.true_time_func() if self._true_time_last_frame != None: this_frame_draw_time_sec = true_time_now - self._true_time_last_frame index = int(math.ceil(this_frame_draw_time_sec*1000.0/self.bin_width_msec))-1 if index > (len(self.timing_histogram)-1): index = -1 self.timing_histogram[index] += 1 self.longest_frame_draw_time_sec = max(self.longest_frame_draw_time_sec,this_frame_draw_time_sec) if self.running_average_num_frames: self.last_n_frame_times_sec.append(true_time_now) self.last_n_frame_times_sec.pop(0) else: self.first_tick_sec = true_time_now self._true_time_last_frame = true_time_now # set for next frame if self.save_all_frametimes: self.all_frametimes.append( true_time_now ) def get_all_frametimes(self): if self.save_all_frametimes: return self.all_frametimes else: raise ValueError("must set save_all_frametimes") def get_longest_frame_duration_sec(self): return self.longest_frame_draw_time_sec def get_running_average_ifi_sec(self): if self.running_average_num_frames: frame_times = [] for frame_time in self.last_n_frame_times_sec: if frame_time is not None: frame_times.append( frame_time ) if len(frame_times) >= 2: return (frame_times[-1] - frame_times[0]) / len(frame_times) else: raise RuntimeError("running_average_num_frames not set when creating FrameTimer instance") def get_average_ifi_sec(self): if self._true_time_last_frame is None: raise RuntimeError("No frames were drawn, can't calculate average IFI") return (self._true_time_last_frame - self.first_tick_sec) / sum( self.timing_histogram ) def print_histogram(self): logger = logging.getLogger('VisionEgg.Core') logger.warning("print_histogram() method of FrameTimer is " "deprecated will stop being supported. Use " "log_histogram() instead.") self.log_histogram() def log_histogram(self): """Send histogram to logger.""" buffer = StringIO.StringIO() n_frames = sum( self.timing_histogram )+1 if n_frames < 2: print >> buffer, '%d frames were drawn.'%n_frames return average_ifi_sec = self.get_average_ifi_sec() print >> buffer, '%d frames were drawn.'%int(n_frames) print >> buffer, 'Mean IFI was %.2f msec (%.2f fps), longest IFI was %.2f msec.'%( average_ifi_sec*1000.0,1.0/average_ifi_sec,self.longest_frame_draw_time_sec*1000.0) h = hist = self.timing_histogram # shorthand maxhist = float(max(h)) if maxhist == 0: print >> buffer, "No frames were drawn." return lines = min(10,int(math.ceil(maxhist))) hist = hist/maxhist*float(lines) # normalize to number of lines print >> buffer, "histogram:" for line in range(lines): val = float(lines)-1.0-float(line) timing_string = "%6d "%(round(maxhist*val/lines),) q = np.greater(hist,val) for qi in q: s = ' ' if qi: s = '*' timing_string += "%4s "%(s,) print >> buffer, timing_string timing_string = " Time: " timing_string += "%4d "%(0,) for bin in self.bins[:-1]: timing_string += "%4d "%(bin,) timing_string += "+(msec)\n" timing_string += "Total: " for hi in h: if hi <= 999: num_str = str(int(hi)).center(5) else: num_str = " +++ " timing_string += num_str print >> buffer, timing_string buffer.seek(0) logger = logging.getLogger('VisionEgg.Core') logger.info(buffer.read()) #################################################################### # # Error handling and assumption checking # #################################################################### import VisionEgg.Deprecated Message = VisionEgg.Deprecated.Message message = VisionEgg.Deprecated.Message() # create instance of Message class for everything to use gl_assumptions = [] def add_gl_assumption(gl_variable,required_value,failure_callback): """Save assumptions for later checking once OpenGL context created.""" if type(failure_callback) != types.FunctionType: raise ValueError("failure_callback must be a function!") gl_assumptions.append((gl_variable,required_value,failure_callback)) def init_gl_extension(prefix,name): global gl # interpreter knows when we're up to something funny with GLTrace logger = logging.getLogger('VisionEgg.Core') if gl is VisionEgg.GLTrace: watched = True gl = VisionEgg.GLTrace.gl # manipulate original module for now else: watched = False module_name = "OpenGL.GL.%(prefix)s.%(name)s"%locals() try: exec "import "+module_name except ImportError: logger.warning("Could not import %s -- some features will be " "missing."%(module_name,)) return False module = eval(module_name) init_function_name = "glInit"+name.title().replace('_','')+prefix init_function = getattr(module,init_function_name) if not init_function(): logger.warning("Could not initialize %s -- some features will " "be missing."%(module_name,)) return False for attr_name in dir(module): # put attributes from module into "gl" module dictionary # (Namespace overlap as you'd get OpenGL apps written in C) attr = getattr(module,attr_name) # reject unwanted attributes if attr_name.startswith('__'): continue elif attr_name == init_function_name: continue elif attr_name == 'gl': continue elif type(attr) == type(VisionEgg): # module type continue gl_attr_name = attr_name setattr(gl,gl_attr_name,attr) if watched: VisionEgg.GLTrace.gl_trace_attach() # (re)scan namespace gl = VisionEgg.GLTrace # reinstall GLTrace return True # success! def post_gl_init(): """Called by Screen instance. Requires OpenGL context to be created.""" global gl_vendor, gl_renderer, gl_version # set above logger = logging.getLogger('VisionEgg.Core') if gl_version < '1.3': if not init_gl_extension('ARB','multitexture'): logger.warning("multitexturing not available. Some features " "will not be available") else: if not hasattr(gl,'glActiveTexture'): logger.debug("PyOpenGL bug: OpenGL multitexturing not available " "even though OpenGL is 1.3 or greater. " "Attempting ctypes-based workaround.") VisionEgg.PlatformDependent.attempt_to_load_multitexturing() if hasattr(gl,'glActiveTexture'): # the above worked or PyOpenGL fixed # OpenGL 1.3 has this extension built-in, # but doing this allows use of ARB names. gl.glActiveTextureARB = gl.glActiveTexture gl.glMultiTexCoord2fARB = gl.glMultiTexCoord2f gl.GL_TEXTURE0_ARB = gl.GL_TEXTURE0 gl.GL_TEXTURE1_ARB = gl.GL_TEXTURE1 if gl_version < '1.2': if init_gl_extension('EXT','bgra'): # make sure gl.GL_BRGA is defined gl.GL_BGRA = gl.GL_BGRA_EXT for gl_variable,required_value,failure_callback in gl_assumptions: # Code required for each variable to be checked if gl_variable == "__SPECIAL__": if required_value == "linux_nvidia_or_new_ATI": ok = 0 # Test for nVidia if "nvidia" == gl_vendor.split()[0].lower(): ok = 1 # yes it is if gl_renderer.startswith('Mesa DRI Radeon'): date = gl_renderer.split()[3] if date > "20021216": # not sure about exact date ok=1 if not ok: failure_callback() else: raise RuntimeError, "Unknown gl_assumption: %s == %s"%(gl_variable,required_value) elif gl_variable.upper() == "GL_VERSION": value_str = gl_version.split()[0] value_ints = map(int,value_str.split('.')) value = float( str(value_ints[0]) + "." + ''.join(map(str,value_ints[1:]))) if value < required_value: failure_callback() else: raise RuntimeError, "Unknown gl_assumption" # Do we have gl.GL_CLAMP_TO_EDGE ? try: gl.GL_CLAMP_TO_EDGE except AttributeError: if gl_version >= '1.2': # If OpenGL version >= 1.2, this should be defined # It seems to be a PyOpenGL bug that it's not. logger.debug("GL_CLAMP_TO_EDGE is not defined. " "Because you have OpenGL version 1.2 or " "greater, this is probably a bug in " "PyOpenGL. Assigning GL_CLAMP_TO_EDGE to " "the value that is usually used.") gl.GL_CLAMP_TO_EDGE = 0x812F else: try: init_gl_extension('SGIS','texture_edge_clamp') gl.GL_CLAMP_TO_EDGE = gl.GL_CLAMP_TO_EDGE_SGIS except: logger.warning("GL_CLAMP_TO_EDGE is not " "available. OpenGL version is " "less than 1.2, and the " "texture_edge_clamp_SGIS extension " "failed to load. It may be impossible to " "get exact 1:1 reproduction of " "textures. Using GL_CLAMP instead of " "GL_CLAMP_TO_EDGE.") gl.GL_CLAMP_TO_EDGE = gl.GL_CLAMP ######################################################################### # # Moved to FlowControl.py -- here only for backwards compatibility # ######################################################################### import VisionEgg.FlowControl Presentation = VisionEgg.FlowControl.Presentation Controller = VisionEgg.FlowControl.Controller ConstantController = VisionEgg.FlowControl.ConstantController EvalStringController = VisionEgg.FlowControl.EvalStringController ExecStringController = VisionEgg.FlowControl.ExecStringController FunctionController = VisionEgg.FlowControl.FunctionController EncapsulatedController = VisionEgg.FlowControl.EncapsulatedController visionegg-1.2.1/VisionEgg/Daq.py0000644000076500000240000000752411224565527015663 0ustar astrawstaff# The Vision Egg: Daq # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Definition of data acquisition and triggering interfaces. This module provides an interface to abstract data acquisition devices. To interface with real data acquisition devices, use a module that subclasses the classes defined here. *WARNING* This module has not been extensively tested or used, and should be considered unstable. """ import VisionEgg import VisionEgg.ParameterTypes as ve_types __version__ = VisionEgg.release_name class Trigger(VisionEgg.ClassWithParameters): pass class ChannelParameters(VisionEgg.ClassWithParameters): pass class SignalType(ChannelParameters): constant_parameters_and_defaults = { 'units':('Unknown units', ve_types.String), } def __init__(self,**kw): if self.__class__ == SignalType: raise RuntimeError("Trying to instantiate abstract base class.") else: ChannelParameters.__init__(self,**kw) class Analog(SignalType): constant_parameters_and_defaults = { 'gain':(1.0, ve_types.Real), 'offset':(0.0, ve_types.Real)} class Digital(SignalType): pass class DaqMode(ChannelParameters): def __init__(self,**kw): if self.__class__ == DaqMode: raise RuntimeError("Trying to instantiate abstract base class.") else: ChannelParameters.__init__(self,**kw) class Buffered(DaqMode): parameters_and_defaults = { 'sample_rate_hz':(5000.0, ve_types.Real), 'duration_sec':(5.0, ve_types.Real), 'trigger':(None, ve_types.Instance(Trigger)), } class Immediate(DaqMode): pass class Functionality(ChannelParameters): def __init__(self,**kw): if self.__class__ == Functionality: raise RuntimeError("Trying to instantiate abstract base class.") else: ChannelParameters.__init__(self,**kw) class Input(Functionality): def get_data(self): raise RuntimeError("Must override get_data method with daq implementation!") class Output(Functionality): def put_data(self,data): raise RuntimeError("Must override put_data method with daq implementation!") class Channel(VisionEgg.ClassWithParameters): constant_parameters_and_defaults = { 'signal_type' : (None, ve_types.Instance(SignalType)), 'daq_mode' : (None, ve_types.Instance(DaqMode)), 'functionality' : (None, ve_types.Instance(Functionality)), } def __init__(self,**kw): VisionEgg.ClassWithParameters.__init__(self,**kw) self.constant_parameters.signal_type.channel = self self.constant_parameters.daq_mode.channel = self self.constant_parameters.functionality.channel = self self.device = None # Not set yet def arm_trigger(self): raise NotImpelemetedError("This method must be overridden.") class Device: def __init__(self, channels = None): self.channels = [] if channels is not None: if type(channels) is not types.ListType: raise ValueError("channels must be a list of channels") for channel in channels: self.add_channel( channel ) def add_channel(self,channel): # override this method if you need to do error checking if isinstance(channel,Channel): self.channels.append(channel) else: raise ValueError("%s not instance of VisionEgg.Daq.Channel"%channel) channel.device = self visionegg-1.2.1/VisionEgg/DaqKeyboard.py0000644000076500000240000000542111224565527017336 0ustar astrawstaff# The Vision Egg: DaqKeyboard # # Author(s): Hubertus Becker # Copyright: (C) 2005 by Hertie Institute for Clinical Brain Research, # Department of Cognitive Neurology, University of Tuebingen # URL: http://www.hubertus-becker.de/resources/visionegg/ # # This library is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. """ Data acquisition and triggering over the keyboard. This module was programmed using information from the web site http://www.pygame.org/docs/ref/pygame_key.html """ #################################################################### # # Import all the necessary packages # #################################################################### import VisionEgg import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.ParameterTypes as ve_types import sys import pygame __version__ = VisionEgg.release_name #################################################################### # # KeyboardInput # #################################################################### class KeyboardInput: def get_pygame_data(self): """Get keyboard input (return values are in pygame.locals.* notation).""" keys = pygame.key.get_pressed() return [k for k, v in enumerate(keys) if v] def get_string_data(self): """Get keyboard input (return values are converted to keyboard symbols (strings)).""" pressed = self.get_pygame_data() keys_pressed = [] for k in pressed: # Convert integers to keyboard symbols (strings) keys_pressed.append(pygame.key.name(k)) return keys_pressed get_data = get_string_data # Create alias #################################################################### # # KeyboardTriggerInController # #################################################################### class KeyboardTriggerInController(VisionEgg.FlowControl.Controller): """Use the keyboard to trigger the presentation.""" def __init__(self,key=pygame.locals.K_1): VisionEgg.FlowControl.Controller.__init__( self, return_type=ve_types.Integer, eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) self.key = key def during_go_eval(self): return 1 def between_go_eval(self): for event in pygame.event.get(): # if (event.type == pygame.locals.KEYUP) or (event.type == pygame.locals.KEYDOWN): if event.type == pygame.locals.KEYDOWN: if event.key == self.key: return 1 else: return 0 visionegg-1.2.1/VisionEgg/DaqLPT.py0000644000076500000240000002054011224565527016234 0ustar astrawstaff# The Vision Egg: DaqLPT # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2005 Hubertus Becker # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Data acquisition and triggering over the parallel port. This module was programmed using information from "Interfacing the Standard Parallel Port" by Craig Peacock, http://www.senet.com.au/~cpeacock. You may also be interested in http://www.lvr.com/files/ibmlpt.txt. This module only uses the Standard Parallel Port (SPP) protocol, not ECP or EPP. You may have to set your computer's BIOS accordingly. You may need to be root or otherwise have permission to access the parallel port. Example usage: >>> from VisionEgg.DaqLPT import raw_lpt_module >>> address = 0x378 >>> out_value = 0 >>> raw_lpt_module.out( address, out_value ) >>> in_value = raw_lpt_module.inp( address+1 ) """ #################################################################### # # Import all the necessary packages # #################################################################### import VisionEgg import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.Daq import VisionEgg.ParameterTypes as ve_types import sys # See the raw LPT module for your platform for direct LPT access # without VisionEgg DAQ overhead. In particular, the inp and out # functions are useful. if sys.platform == 'win32': try: # Dincer Aydin's module http://www.geocities.com/dinceraydin import winioport as raw_lpt_module except ImportError: # Andrew Straw's module http://www.its.caltech.edu/~astraw/coding.html import dlportio as raw_lpt_module elif sys.platform.startswith('linux'): import VisionEgg._raw_lpt_linux as raw_lpt_module elif sys.platform.startswith('irix'): ### IRIX implementation not done, but possible raise NotImplementedError("VisionEgg.DaqLPT not implemented on IRIX") ## import VisionEgg._raw_plp_irix ## raw_lpt_module = VisionEgg._raw_plp_irix else: raise RuntimeError("VisionEgg.DaqLPT not supported on this platform") __version__ = VisionEgg.release_name class LPTInput(VisionEgg.Daq.Input): def get_data(self): """Get status bits 0-7 of the LPT port. The status bits were not meant for high speed digital input. Nevertheless, for sampling one or two digital inputs at slow rates, they work fine. Bits 4 and 5 (pins 13 and 12, respectively) should be first choice to sample a digital voltage. The other bits have some oddities. Bits 0 and 1 are designated reserved. Others are "active low"; they show a logic 0 when +5v is applied. bit3 = value & 0x08 bit4 = value & 0x10 bit5 = value & 0x20 bit6 = value & 0x40 """ return raw_lpt_module.inp(self.channel.device.base_address+1) class LPTOutput(VisionEgg.Daq.Output): def put_data(self,data): """Set output bits 0-7 (pins 2-9) on the LPT port.""" raw_lpt_module.out(self.channel.device.base_address,data) def __del__(self): """Set output bits low when closing.""" raw_lpt_module.out(self.channel.device.base_address,0) class LPTChannel(VisionEgg.Daq.Channel): """A data acquisition channel using the parallel port.""" def __init__(self,**kw): if not 'raw_lpt_module' in globals().keys(): raise RuntimeError("LPT output not supported on this platform.") VisionEgg.Daq.Channel.__init__(self,**kw) signal_type = self.constant_parameters.signal_type if not isinstance(signal_type,VisionEgg.Daq.Digital): raise ValueError("Channel must be digital.") daq_mode = self.constant_parameters.daq_mode if not isinstance(daq_mode,VisionEgg.Daq.Immediate): raise ValueError("Channel must be immediate mode.") functionality = self.constant_parameters.functionality if not isinstance(functionality,LPTInput): if not isinstance(functionality,LPTOutput): raise ValueError("Channel functionality must be instance of LPTInput or LPTOutput.") class LPTDevice(VisionEgg.Daq.Device): """A single parallel port. (Line PrinTer port.) Typically, LPT1 has a base address of 0x0378, and LPT2 has a base address of 0x0278.""" def __init__(self,base_address=0x378,**kw): if not 'raw_lpt_module' in globals().keys(): raise RuntimeError("LPT output not supported on this platform.") VisionEgg.Daq.Device.__init__(self,**kw) for channel in self.channels: if not isinstance(channel,LPTChannel): raise ValueError("LPTDevice only has LPTChannels.") self.base_address = base_address def add_channel(self,channel): if not isinstance(channel,LPTChannel): raise ValueError("LPTDevice only has LPTChannels.") VisionEgg.Daq.Device.add_channel(self,channel) class LPTTriggerOutController(VisionEgg.FlowControl.Controller): """Use 8 bits of digital output for triggering and frame timing verification. Bit 0 (pin 2) goes high when the go loop begins and low when the loop ends. Bits 1-7 (pins 3-9) count the frame_number (modulo 2^7) in binary. Looking at any one of these pins therefore provides verification that your stimulus is not skipping frames.""" def __init__(self,lpt_device=None): if not 'raw_lpt_module' in globals().keys(): raise RuntimeError("LPT output not supported on this platform.") VisionEgg.FlowControl.Controller.__init__(self, return_type=ve_types.NoneType, eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) # Initialize DAQ stuff: self.trigger_out_channel = LPTChannel(signal_type = VisionEgg.Daq.Digital(), daq_mode = VisionEgg.Daq.Immediate(), functionality = LPTOutput()) if lpt_device is None: self.device = LPTDevice() else: if not isinstance(lpt_device,LPTDevice): raise ValueError("lpt_device must be instance of LPTDevice.") self.device = lpt_device self.device.add_channel(self.trigger_out_channel) self.total_frames = 0 def during_go_eval(self): self.total_frames = (self.total_frames + 1) % (2**7) value = self.total_frames*2 + 1 self.trigger_out_channel.constant_parameters.functionality.put_data(value) def between_go_eval(self): self.total_frames = (self.total_frames + 1) % (2**7) value = self.total_frames*2 + 0 self.trigger_out_channel.constant_parameters.functionality.put_data(value) class LPTTriggerInController(VisionEgg.FlowControl.Controller): def __init__(self,lpt_device=None,pin=13): if not 'raw_lpt_module' in globals().keys(): raise RuntimeError("LPT input not supported on this platform.") VisionEgg.FlowControl.Controller.__init__(self, return_type=ve_types.Integer, eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) # Initialize DAQ stuff: self.trigger_in_channel = LPTChannel(signal_type = VisionEgg.Daq.Digital(), daq_mode = VisionEgg.Daq.Immediate(), functionality = LPTInput()) if lpt_device is None: self.device = LPTDevice() else: if not isinstance(lpt_device,LPTDevice): raise ValueError("lpt_device must be instance of LPTDevice.") self.device = lpt_device self.device.add_channel(self.trigger_in_channel) if pin==15: bit = 3 elif pin==13: bit = 4 elif pin==12: bit = 5 elif pin==10: bit = 6 elif pin==11: bit = 7 else: raise ValueError("Only pins 10, 11, 12, 13 and 15 supported at this time.") self.mask = 2**bit def during_go_eval(self): return 1 def between_go_eval(self): value = self.trigger_in_channel.constant_parameters.functionality.get_data() return (value & self.mask) visionegg-1.2.1/VisionEgg/darwin_getrefresh.m0000644000076500000240000000333011224565530020445 0ustar astrawstaff#include #import int darwin_getrefresh_error = 0; const char * darwin_getrefresh_error_str= NULL; int darwin_getrefresh_err_occurred( void ) { return darwin_getrefresh_error; } const char * darwin_getrefresh_err_message( void ) { return darwin_getrefresh_error_str; } void darwin_getrefresh_set_error(const char * errmsg) { darwin_getrefresh_error = 1; darwin_getrefresh_error_str = errmsg; } double getrefresh( void ) { // This is based on SDL12 http://www.libsdl.org/ CFDictionaryRef mode = NULL; CFNumberRef refreshRateCFNumber = NULL; double refreshRate; mode = CGDisplayCurrentMode(kCGDirectMainDisplay); if ( NULL == mode ) { darwin_getrefresh_set_error("Cannot get display mode"); goto ERROR; } refreshRateCFNumber = CFDictionaryGetValue (mode, kCGDisplayRefreshRate); if ( NULL == refreshRateCFNumber ) { darwin_getrefresh_set_error("Mode has no refresh rate"); goto ERROR; } if ( 0 == CFNumberGetValue (refreshRateCFNumber, kCFNumberDoubleType, &refreshRate) ) { // From CGDirectDisplay.h: (Mac OS X 10.2.6, Dec 2002 Developer Tools: // // Some display systems may not conventional video vertical and // horizontal sweep in painting. These displays report a // kCGDisplayRefreshRate of 0 in the CFDictionaryRef returned by // CGDisplayCurrentMode(). On such displays, this function // returns at once. darwin_getrefresh_set_error("Error getting refresh rate - no conventional video sweep?"); goto ERROR; } if ( 0 == refreshRate ) { // darwin_getrefresh_set_error("Error getting refresh rate - no conventional video sweep?"); goto ERROR; } return refreshRate; ERROR: return 0; } visionegg-1.2.1/VisionEgg/darwin_getrefresh.py0000644000076500000240000000236311224565530020646 0ustar astrawstaff# This file was created automatically by SWIG. # Don't modify this file, modify the SWIG interface instead. # This file is compatible with both classic and new-style classes. import _darwin_getrefresh def _swig_setattr_nondynamic(self,class_type,name,value,static=1): if (name == "this"): if isinstance(value, class_type): self.__dict__[name] = value.this if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown del value.thisown return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) if (not static) or hasattr(self,name) or (name == "thisown"): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self,class_type,name,value): return _swig_setattr_nondynamic(self,class_type,name,value,0) def _swig_getattr(self,class_type,name): method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) raise AttributeError,name import types try: _object = types.ObjectType _newclass = 1 except AttributeError: class _object : pass _newclass = 0 del types getrefresh = _darwin_getrefresh.getrefresh visionegg-1.2.1/VisionEgg/darwin_getrefresh_wrap.c0000644000076500000240000014162311224565530021474 0ustar astrawstaff/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.24 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #ifndef SWIG_TEMPLATE_DISAMBIGUATOR # if defined(__SUNPRO_CC) # define SWIG_TEMPLATE_DISAMBIGUATOR template # else # define SWIG_TEMPLATE_DISAMBIGUATOR # endif #endif #include /*********************************************************************** * swigrun.swg * * This file contains generic CAPI SWIG runtime support for pointer * type checking. * ************************************************************************/ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "1" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE #define SWIG_QUOTE_STRING(x) #x #define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) #define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else #define SWIG_TYPE_TABLE_NAME #endif #include #ifndef SWIGINLINE #if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline #else # define SWIGINLINE #endif #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the swig runtime code. In 99.9% of the cases, swig just needs to declare them as 'static'. But only do this if is strictly necessary, ie, if you have problems with your compiler or so. */ #ifndef SWIGRUNTIME #define SWIGRUNTIME static #endif #ifndef SWIGRUNTIMEINLINE #define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *); typedef struct swig_type_info *(*swig_dycast_func)(void **); typedef struct swig_type_info { const char *name; swig_converter_func converter; const char *str; void *clientdata; swig_dycast_func dcast; struct swig_type_info *next; struct swig_type_info *prev; } swig_type_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return *f1 - *f2; } return (l1 - f1) - (l2 - f2); } /* Check type equivalence in a name list like ||... */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te) == 0; if (*ne) ++ne; } return equiv; } /* Register a type mapping with the type-checking */ SWIGRUNTIME swig_type_info * SWIG_TypeRegisterTL(swig_type_info **tl, swig_type_info *ti) { swig_type_info *tc, *head, *ret, *next; /* Check to see if this type has already been registered */ tc = *tl; while (tc) { /* check simple type equivalence */ int typeequiv = (strcmp(tc->name, ti->name) == 0); /* check full type equivalence, resolving typedefs */ if (!typeequiv) { /* only if tc is not a typedef (no '|' on it) */ if (tc->str && ti->str && !strstr(tc->str,"|")) { typeequiv = SWIG_TypeEquiv(ti->str,tc->str); } } if (typeequiv) { /* Already exists in the table. Just add additional types to the list */ if (ti->clientdata) tc->clientdata = ti->clientdata; head = tc; next = tc->next; goto l1; } tc = tc->prev; } head = ti; next = 0; /* Place in list */ ti->prev = *tl; *tl = ti; /* Build linked lists */ l1: ret = head; tc = ti + 1; /* Patch up the rest of the links */ while (tc->name) { head->next = tc; tc->prev = head; head = tc; tc++; } if (next) next->prev = head; head->next = next; return ret; } /* Check the typename */ SWIGRUNTIME swig_type_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { swig_type_info *s; if (!ty) return 0; /* Void pointer */ s = ty->next; /* First element always just a name */ do { if (strcmp(s->name,c) == 0) { if (s == ty->next) return s; /* Move s to the top of the linked list */ s->prev->next = s->next; if (s->next) { s->next->prev = s->prev; } /* Insert s as second element in the list */ s->next = ty->next; if (ty->next) ty->next->prev = s; ty->next = s; s->prev = ty; return s; } s = s->next; } while (s && (s != ty->next)); return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_type_info *ty, void *ptr) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Search for a swig_type_info structure */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryTL(swig_type_info *tl, const char *name) { swig_type_info *ty = tl; while (ty) { if (ty->str && (SWIG_TypeEquiv(ty->str,name))) return ty; if (ty->name && (strcmp(name,ty->name) == 0)) return ty; ty = ty->prev; } return 0; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientDataTL(swig_type_info *tl, swig_type_info *ti, void *clientdata) { swig_type_info *tc, *equiv; if (ti->clientdata) return; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; equiv = ti->next; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0)) SWIG_TypeClientDataTL(tl,tc,clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static char hex[17] = "0123456789abcdef"; unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; register unsigned char uu; for (; u != eu; ++u) { uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { register unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register int d = *(c++); register unsigned char uu = 0; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* This function will propagate the clientdata field of type to any new swig_type_info structures that have been added into the list of equivalent types. It is like calling SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientDataTL(swig_type_info *tl, swig_type_info *type) { swig_type_info *equiv = type->next; swig_type_info *tc; if (!type->clientdata) return; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0) && !tc->clientdata) SWIG_TypeClientDataTL(tl,tc, type->clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /*********************************************************************** * common.swg * * This file contains generic SWIG runtime support for pointer * type checking as well as a few commonly used macros to control * external linkage. * * Author : David Beazley (beazley@cs.uchicago.edu) * * Copyright (c) 1999-2000, The University of Chicago * * This file may be freely redistributed without license or fee provided * this copyright message remains intact. ************************************************************************/ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if !defined(STATIC_LINKED) # define SWIGEXPORT(a) __declspec(dllexport) a # else # define SWIGEXPORT(a) a # endif #else # define SWIGEXPORT(a) a #endif #ifdef __cplusplus extern "C" { #endif /*************************************************************************/ /* The static type info list */ static swig_type_info *swig_type_list = 0; static swig_type_info **swig_type_list_handle = &swig_type_list; /* Register a type mapping with the type-checking */ static swig_type_info * SWIG_TypeRegister(swig_type_info *ti) { return SWIG_TypeRegisterTL(swig_type_list_handle, ti); } /* Search for a swig_type_info structure */ static swig_type_info * SWIG_TypeQuery(const char *name) { return SWIG_TypeQueryTL(*swig_type_list_handle, name); } /* Set the clientdata field for a type */ static void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientDataTL(*swig_type_list_handle, ti, clientdata); } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ static void SWIG_PropagateClientData(swig_type_info *type) { SWIG_PropagateClientDataTL(*swig_type_list_handle, type); } #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * SWIG API. Portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * for internal method declarations * ----------------------------------------------------------------------------- */ #ifndef SWIGINTERN #define SWIGINTERN static #endif #ifndef SWIGINTERNSHORT #ifdef __cplusplus #define SWIGINTERNSHORT static inline #else /* C case */ #define SWIGINTERNSHORT static #endif /* __cplusplus */ #endif /* Exception handling in wrappers */ #define SWIG_fail goto fail #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_append_errmsg(msg) SWIG_Python_AddErrMesg(msg,0) #define SWIG_preppend_errmsg(msg) SWIG_Python_AddErrMesg(msg,1) #define SWIG_type_error(type,obj) SWIG_Python_TypeError(type,obj) #define SWIG_null_ref(type) SWIG_Python_NullRef(type) /* Contract support */ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { PyErr_SetString(PyExc_RuntimeError, (char *) msg ); goto fail; } else /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_INT 1 #define SWIG_PY_FLOAT 2 #define SWIG_PY_STRING 3 #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Alloc. memory flags * ----------------------------------------------------------------------------- */ #define SWIG_OLDOBJ 1 #define SWIG_NEWOBJ SWIG_OLDOBJ + 1 #define SWIG_PYSTR SWIG_NEWOBJ + 1 #ifdef __cplusplus } #endif /*********************************************************************** * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * Author : David Beazley (beazley@cs.uchicago.edu) ************************************************************************/ /* Common SWIG API */ #define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Python_ConvertPtr(obj, pp, type, flags) #define SWIG_NewPointerObj(p, type, flags) SWIG_Python_NewPointerObj(p, type, flags) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) /* Python-specific SWIG API */ #define SWIG_ConvertPacked(obj, ptr, sz, ty, flags) SWIG_Python_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Use SWIG_NO_COBJECT_TYPES to force the use of strings to represent C/C++ pointers in the python side. Very useful for debugging, but not always safe. */ #if !defined(SWIG_NO_COBJECT_TYPES) && !defined(SWIG_COBJECT_TYPES) # define SWIG_COBJECT_TYPES #endif /* Flags for pointer conversion */ #define SWIG_POINTER_EXCEPTION 0x1 #define SWIG_POINTER_DISOWN 0x2 #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Create a new pointer string * ----------------------------------------------------------------------------- */ #ifndef SWIG_BUFFER_SIZE #define SWIG_BUFFER_SIZE 1024 #endif #if defined(SWIG_COBJECT_TYPES) #if !defined(SWIG_COBJECT_PYTHON) /* ----------------------------------------------------------------------------- * Implements a simple Swig Object type, and use it instead of PyCObject * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *ptr; const char *desc; } PySwigObject; /* Declarations for objects of type PySwigObject */ SWIGRUNTIME int PySwigObject_print(PySwigObject *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result))) { fputs("", fp); return 0; } else { return 1; } } SWIGRUNTIME PyObject * PySwigObject_repr(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromFormat("", result) : 0; } SWIGRUNTIME PyObject * PySwigObject_str(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromString(result) : 0; } SWIGRUNTIME PyObject * PySwigObject_long(PySwigObject *v) { return PyLong_FromUnsignedLong((unsigned long) v->ptr); } SWIGRUNTIME PyObject * PySwigObject_oct(PySwigObject *v) { char buf[100]; unsigned long x = (unsigned long)v->ptr; if (x == 0) strcpy(buf, "0"); else PyOS_snprintf(buf, sizeof(buf), "0%lo", x); return PyString_FromString(buf); } SWIGRUNTIME PyObject * PySwigObject_hex(PySwigObject *v) { char buf[100]; PyOS_snprintf(buf, sizeof(buf), "0x%lx", (unsigned long)v->ptr); return PyString_FromString(buf); } SWIGRUNTIME int PySwigObject_compare(PySwigObject *v, PySwigObject *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : (i > j) ? 1 : 0; } } SWIGRUNTIME void PySwigObject_dealloc(PySwigObject *self) { PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigObject_GetType() { static char PySwigObject_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods PySwigObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ (binaryfunc)0, /*nb_divide*/ (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ (coercion)0, /*nb_coerce*/ (unaryfunc)PySwigObject_long, /*nb_int*/ (unaryfunc)PySwigObject_long, /*nb_long*/ (unaryfunc)0, /*nb_float*/ (unaryfunc)PySwigObject_oct, /*nb_oct*/ (unaryfunc)PySwigObject_hex, /*nb_hex*/ #if PY_VERSION_HEX >= 0x02000000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #endif }; static int type_init = 0; static PyTypeObject PySwigObject_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigObject", /*tp_name*/ sizeof(PySwigObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigObject_dealloc, /*tp_dealloc*/ (printfunc)PySwigObject_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigObject_compare, /*tp_compare*/ (reprfunc)PySwigObject_repr, /*tp_repr*/ &PySwigObject_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigObject_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigObject_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigObject_Type = tmp; type_init = 1; } return &PySwigObject_Type; } SWIGRUNTIME PyObject * PySwigObject_FromVoidPtrAndDesc(void *ptr, const char *desc) { PySwigObject *self = PyObject_NEW(PySwigObject, PySwigObject_GetType()); if (self == NULL) return NULL; self->ptr = ptr; self->desc = desc; return (PyObject *)self; } SWIGRUNTIMEINLINE void * PySwigObject_AsVoidPtr(PyObject *self) { return ((PySwigObject *)self)->ptr; } SWIGRUNTIMEINLINE const char * PySwigObject_GetDesc(PyObject *self) { return ((PySwigObject *)self)->desc; } SWIGRUNTIMEINLINE int PySwigObject_Check(PyObject *op) { return ((op)->ob_type == PySwigObject_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; const char *desc; size_t size; } PySwigPacked; SWIGRUNTIME int PySwigPacked_print(PySwigPacked *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->desc,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * PySwigPacked_repr(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return PyString_FromFormat("", result, v->desc); } else { return PyString_FromFormat("", v->desc); } } SWIGRUNTIME PyObject * PySwigPacked_str(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return PyString_FromFormat("%s%s", result, v->desc); } else { return PyString_FromFormat("%s", v->desc); } } SWIGRUNTIME int PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : (i > j) ? 1 : 0; return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } } SWIGRUNTIME void PySwigPacked_dealloc(PySwigPacked *self) { free(self->pack); PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigPacked_GetType() { static char PySwigPacked_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static int type_init = 0; static PyTypeObject PySwigPacked_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigPacked", /*tp_name*/ sizeof(PySwigPacked), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigPacked_dealloc, /*tp_dealloc*/ (printfunc)PySwigPacked_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigPacked_compare, /*tp_compare*/ (reprfunc)PySwigPacked_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigPacked_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigPacked_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigPacked_Type = tmp; type_init = 1; } return &PySwigPacked_Type; } SWIGRUNTIME PyObject * PySwigPacked_FromDataAndDesc(void *ptr, size_t size, const char *desc) { PySwigPacked *self = PyObject_NEW(PySwigPacked, PySwigPacked_GetType()); if (self == NULL) { return NULL; } else { void *pack = malloc(size); memcpy(pack, ptr, size); self->pack = pack; self->desc = desc; self->size = size; return (PyObject *) self; } } SWIGRUNTIMEINLINE const char * PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { PySwigPacked *self = (PySwigPacked *)obj; if (self->size != size) return 0; memcpy(ptr, self->pack, size); return self->desc; } SWIGRUNTIMEINLINE const char * PySwigPacked_GetDesc(PyObject *self) { return ((PySwigPacked *)self)->desc; } SWIGRUNTIMEINLINE int PySwigPacked_Check(PyObject *op) { return ((op)->ob_type == PySwigPacked_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); } #else /* ----------------------------------------------------------------------------- * Use the old Python PyCObject instead of PySwigObject * ----------------------------------------------------------------------------- */ #define PySwigObject_GetDesc(obj) PyCObject_GetDesc(obj) #define PySwigObject_Check(obj) PyCObject_Check(obj) #define PySwigObject_AsVoidPtr(obj) PyCObject_AsVoidPtr(obj) #define PySwigObject_FromVoidPtrAndDesc(p, d) PyCObject_FromVoidPtrAndDesc(p, d, NULL) #endif #endif /* ----------------------------------------------------------------------------- * errors manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (PySwigObject_Check(obj)) { const char *otype = (const char *) PySwigObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'PySwigObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? PyString_AsString(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_DECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } SWIGRUNTIMEINLINE void SWIG_Python_NullRef(const char *type) { if (type) { PyErr_Format(PyExc_TypeError, "null reference of type '%s' was received",type); } else { PyErr_Format(PyExc_TypeError, "null reference was received"); } } SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, PyString_AsString(old_str)); } else { PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); } Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; sprintf(mesg, "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; static PyObject *SWIG_this = 0; int newref = 0; PyObject *pyobj = 0; void *vptr; if (!obj) return 0; if (obj == Py_None) { *ptr = 0; return 0; } #ifdef SWIG_COBJECT_TYPES if (!(PySwigObject_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PySwigObject_Check(obj)) { Py_DECREF(obj); goto type_error; } } vptr = PySwigObject_AsVoidPtr(obj); c = (const char *) PySwigObject_GetDesc(obj); if (newref) { Py_DECREF(obj); } goto type_check; #else if (!(PyString_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PyString_Check(obj)) { Py_DECREF(obj); goto type_error; } } c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackVoidPtr(c, &vptr, ty->name); if (newref) { Py_DECREF(obj); } if (!c) goto type_error; #endif type_check: if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; *ptr = SWIG_TypeCast(tc,vptr); } else { *ptr = vptr; } if ((pyobj) && (flags & SWIG_POINTER_DISOWN)) { PyObject_SetAttrString(pyobj,(char*)"thisown",Py_False); } return 0; type_error: PyErr_Clear(); if (pyobj && !obj) { obj = pyobj; if (PyCFunction_Check(obj)) { /* here we get the method pointer for callbacks */ char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); c = doc ? strstr(doc, "swig_ptr: ") : 0; if (c) { c = SWIG_UnpackVoidPtr(c + 10, &vptr, ty->name); if (!c) goto type_error; goto type_check; } } } if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ pointer", obj); } } return -1; } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } } return result; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) c = PySwigPacked_UnpackData(obj, ptr, sz); #else if ((!obj) || (!PyString_Check(obj))) goto type_error; c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackDataName(c, ptr, sz, ty->name); #endif if (!c) goto type_error; if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return 0; type_error: PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ packed data", obj); } } return -1; } /* Create a new array object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int own) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #ifdef SWIG_COBJECT_TYPES robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackVoidPtr(result, ptr, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif if (!robj || (robj == Py_None)) return robj; if (type->clientdata) { PyObject *inst; PyObject *args = Py_BuildValue((char*)"(O)", robj); Py_DECREF(robj); inst = PyObject_CallObject((PyObject *) type->clientdata, args); Py_DECREF(args); if (inst) { if (own) { PyObject_SetAttrString(inst,(char*)"thisown",Py_True); } robj = inst; } } return robj; } SWIGRUNTIME PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) robj = PySwigPacked_FromDataAndDesc((void *) ptr, sz, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackDataName(result, ptr, sz, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif return robj; } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_type_info ** SWIG_Python_GetTypeListHandle() { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } } #endif return (swig_type_info **) type_pointer; } /* Search for a swig_type_info structure */ SWIGRUNTIMEINLINE swig_type_info * SWIG_Python_GetTypeList() { swig_type_info **tlh = SWIG_Python_GetTypeListHandle(); return tlh ? *tlh : (swig_type_info*)0; } #define SWIG_Runtime_GetTypeList SWIG_Python_GetTypeList #ifdef __cplusplus } #endif /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_char swig_types[0] #define SWIGTYPE_size_t swig_types[1] #define SWIGTYPE_ptrdiff_t swig_types[2] static swig_type_info *swig_types[4]; /* -------- TYPES TABLE (END) -------- */ /*----------------------------------------------- @(target):= _darwin_getrefresh.so ------------------------------------------------*/ #define SWIG_init init_darwin_getrefresh #define SWIG_name "_darwin_getrefresh" PyObject *PyErr_DarwinGetRefreshError; /*@/usr/share/swig1.3/python/pymacros.swg,66,SWIG_define@*/ #define SWIG_From_double PyFloat_FromDouble /*@@*/ #ifdef __cplusplus extern "C" { #endif static PyObject *_wrap_getrefresh(PyObject *self, PyObject *args) { PyObject *resultobj; double result; if(!PyArg_ParseTuple(args,(char *)":getrefresh")) goto fail; { result = (double)getrefresh(); if (darwin_getrefresh_err_occurred()) { PyErr_SetString(PyErr_DarwinGetRefreshError, (const char *)darwin_getrefresh_err_message()); return NULL; } } { resultobj = SWIG_From_double((double)(result)); } return resultobj; fail: return NULL; } static PyMethodDef SwigMethods[] = { { (char *)"getrefresh", _wrap_getrefresh, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_char[] = {{"_p_char", 0, "char *", 0, 0, 0, 0},{"_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__size_t[] = {{"_size_t", 0, "size_t", 0, 0, 0, 0},{"_size_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__ptrdiff_t[] = {{"_ptrdiff_t", 0, "ptrdiff_t", 0, 0, 0, 0},{"_ptrdiff_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info *swig_types_initial[] = { _swigt__p_char, _swigt__size_t, _swigt__ptrdiff_t, 0 }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; static PyObject * swig_varlink_repr(swig_varlinkobject *v) { v = v; return PyString_FromString(""); } static int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) { swig_globalvar *var; flags = flags; fprintf(fp,"Swig global variables { "); for (var = v->vars; var; var=var->next) { fprintf(fp,"%s", var->name); if (var->next) fprintf(fp,", "); } fprintf(fp," }\n"); return 0; } static PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->get_attr)(); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return NULL; } static int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->set_attr)(p); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return 1; } static PyTypeObject varlinktype = { PyObject_HEAD_INIT(0) 0, /* Number of items in variable part (ob_size) */ (char *)"swigvarlink", /* Type name (tp_name) */ sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ 0, /* Itemsize (tp_itemsize) */ 0, /* Deallocator (tp_dealloc) */ (printfunc) swig_varlink_print, /* Print (tp_print) */ (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ 0, /* tp_doc */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; /* Create a variable linking object for use later */ static PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = 0; result = PyMem_NEW(swig_varlinkobject,1); varlinktype.ob_type = &PyType_Type; /* Patch varlinktype into a PyType */ result->ob_type = &varlinktype; result->vars = 0; result->ob_refcnt = 0; Py_XINCREF((PyObject *) result); return ((PyObject*) result); } static void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v; swig_globalvar *gv; v= (swig_varlinkobject *) p; gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); gv->name = (char *) malloc(strlen(name)+1); strcpy(gv->name,name); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; v->vars = gv; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ static void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_PY_INT: obj = PyInt_FromLong(constants[i].lvalue); break; case SWIG_PY_FLOAT: obj = PyFloat_FromDouble(constants[i].dvalue); break; case SWIG_PY_STRING: if (constants[i].pvalue) { obj = PyString_FromString((char *) constants[i].pvalue); } else { Py_INCREF(Py_None); obj = Py_None; } break; case SWIG_PY_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d,constants[i].name,obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ static void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { char *c = methods[i].ml_doc; if (c && (c = strstr(c, "swig_ptr: "))) { int j; swig_const_info *ci = 0; char *name = c + 10; for (j = 0; const_table[j].type; j++) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); char *buff = ndoc; void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue: (void *)(ci->lvalue); strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } /* -----------------------------------------------------------------------------* * Initialize type list * -----------------------------------------------------------------------------*/ #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ static int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return -1; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return -1; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return -1; } if (PyDict_SetItemString(dict, name, o)) return -1; Py_DECREF(o); return 0; } #endif static swig_type_info ** SWIG_Python_SetTypeListHandle(swig_type_info **type_list_handle) { static PyMethodDef swig_empty_runtime_method_table[] = { { NULL, NULL, 0, NULL } };/* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); PyObject *pointer = PyCObject_FromVoidPtr((void *) type_list_handle, NULL); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } return type_list_handle; } static swig_type_info ** SWIG_Python_LookupTypePointer(swig_type_info **type_list_handle) { swig_type_info **type_pointer; /* first check if module already created */ type_pointer = SWIG_Python_GetTypeListHandle(); if (type_pointer) { return type_pointer; } else { /* create a new module and variable */ return SWIG_Python_SetTypeListHandle(type_list_handle); } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void *) SWIG_ReturnGlobalTypeList(void *); #endif #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void) SWIG_init(void) { static PyObject *SWIG_globals = 0; static int typeinit = 0; PyObject *m, *d; int i; if (!SWIG_globals) SWIG_globals = SWIG_newvarlink(); /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_types_initial); m = Py_InitModule((char *) SWIG_name, SwigMethods); d = PyModule_GetDict(m); if (!typeinit) { #ifdef SWIG_LINK_RUNTIME swig_type_list_handle = (swig_type_info **) SWIG_ReturnGlobalTypeList(swig_type_list_handle); #else # ifndef SWIG_STATIC_RUNTIME swig_type_list_handle = SWIG_Python_LookupTypePointer(swig_type_list_handle); # endif #endif for (i = 0; swig_types_initial[i]; i++) { swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); } typeinit = 1; } SWIG_InstallConstants(d,swig_const_table); /* New exception */ PyErr_DarwinGetRefreshError = PyErr_NewException( "VisionEgg.DarwinGetRefreshError", NULL, NULL ); // New reference Py_INCREF(PyErr_DarwinGetRefreshError); } visionegg-1.2.1/VisionEgg/darwin_maxpriority.c0000644000076500000240000005450511224565530020676 0ustar astrawstaff/* Generated by Pyrex 0.9.3 on Mon Jan 2 16:34:18 2006 */ #include "Python.h" #include "structmember.h" #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #include "darwinsys_compat.h" #include "stdlib.h" #include "errno.h" #include "sys/sysctl.h" #include "mach/mach.h" #include "sched.h" #include "pthread.h" #include "sys/resource.h" typedef struct {PyObject **p; char *s;} __Pyx_InternTabEntry; /*proto*/ typedef struct {PyObject **p; char *s; long n;} __Pyx_StringTabEntry; /*proto*/ static PyObject *__Pyx_UnpackItem(PyObject *, int); /*proto*/ static int __Pyx_EndUnpack(PyObject *, int); /*proto*/ static int __Pyx_PrintItem(PyObject *); /*proto*/ static int __Pyx_PrintNewline(void); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static void __Pyx_ReRaise(void); /*proto*/ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/ static PyObject *__Pyx_GetExcValue(void); /*proto*/ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, char *name); /*proto*/ static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ static int __Pyx_GetStarArgs(PyObject **args, PyObject **kwds, char *kwd_list[], int nargs, PyObject **args2, PyObject **kwds2); /*proto*/ static void __Pyx_WriteUnraisable(char *name); /*proto*/ static void __Pyx_AddTraceback(char *funcname); /*proto*/ static PyTypeObject *__Pyx_ImportType(char *module_name, char *class_name, long size); /*proto*/ static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/ static int __Pyx_GetVtable(PyObject *dict, void *vtabptr); /*proto*/ static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name, char *modname); /*proto*/ static int __Pyx_InternStrings(__Pyx_InternTabEntry *t); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static PyObject *__pyx_m; static PyObject *__pyx_b; static int __pyx_lineno; static char *__pyx_filename; staticforward char **__pyx_f; /* Declarations from darwinsys */ /* Declarations from darwin_maxpriority */ /* Implementation of darwin_maxpriority */ static PyObject *__pyx_n_darwinsys; static PyObject *__pyx_n_PRIO_PROCESS; static PyObject *__pyx_n_SCHED_OTHER; static PyObject *__pyx_n_SCHED_RR; static PyObject *__pyx_n_SCHED_FIFO; static PyObject *__pyx_n_get_bus_speed; static PyObject *__pyx_n_set_self_thread_time_constraint_policy; static PyObject *__pyx_n_set_self_pthread_priority; static PyObject *__pyx_n_getpriority; static PyObject *__pyx_n_sched_get_priority_max; static PyObject *__pyx_n_setpriority; static PyObject *__pyx_f_18darwin_maxpriority_get_bus_speed(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_18darwin_maxpriority_get_bus_speed(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { int __pyx_v_bus_speed; int (__pyx_v_mlib[2]); size_t __pyx_v_len; PyObject *__pyx_r; PyObject *__pyx_1 = 0; static char *__pyx_argnames[] = {0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "", __pyx_argnames)) return 0; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":73 */ (__pyx_v_mlib[0]) = CTL_HW; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":74 */ (__pyx_v_mlib[1]) = HW_BUS_FREQ; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":76 */ __pyx_v_len = (sizeof(__pyx_v_bus_speed)); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":77 */ sysctl(__pyx_v_mlib,2,(&__pyx_v_bus_speed),(&__pyx_v_len),0,0); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":79 */ __pyx_1 = PyInt_FromLong(__pyx_v_bus_speed); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; goto __pyx_L1;} __pyx_r = __pyx_1; __pyx_1 = 0; goto __pyx_L0; __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_1); __Pyx_AddTraceback("darwin_maxpriority.get_bus_speed"); __pyx_r = 0; __pyx_L0:; return __pyx_r; } static PyObject *__pyx_f_18darwin_maxpriority_set_self_thread_time_constraint_policy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_18darwin_maxpriority_set_self_thread_time_constraint_policy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_period = 0; PyObject *__pyx_v_computation = 0; PyObject *__pyx_v_constraint = 0; PyObject *__pyx_v_preemptible = 0; thread_time_constraint_policy_data_t __pyx_v_ttcpolicy; PyObject *__pyx_r; uint32_t __pyx_1; boolean_t __pyx_2; PyObject *__pyx_3 = 0; static char *__pyx_argnames[] = {"period","computation","constraint","preemptible",0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OOOO", __pyx_argnames, &__pyx_v_period, &__pyx_v_computation, &__pyx_v_constraint, &__pyx_v_preemptible)) return 0; Py_INCREF(__pyx_v_period); Py_INCREF(__pyx_v_computation); Py_INCREF(__pyx_v_constraint); Py_INCREF(__pyx_v_preemptible); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":88 */ __pyx_1 = PyInt_AsLong(__pyx_v_period); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; goto __pyx_L1;} __pyx_v_ttcpolicy.period = __pyx_1; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":89 */ __pyx_1 = PyInt_AsLong(__pyx_v_computation); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; goto __pyx_L1;} __pyx_v_ttcpolicy.computation = __pyx_1; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":90 */ __pyx_1 = PyInt_AsLong(__pyx_v_constraint); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; goto __pyx_L1;} __pyx_v_ttcpolicy.constraint = __pyx_1; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":91 */ __pyx_2 = PyInt_AsLong(__pyx_v_preemptible); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; goto __pyx_L1;} __pyx_v_ttcpolicy.preemptible = __pyx_2; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":93 */ __pyx_3 = PyInt_FromLong(thread_policy_set(mach_thread_self(),THREAD_TIME_CONSTRAINT_POLICY,((thread_policy_t )(&__pyx_v_ttcpolicy)),THREAD_TIME_CONSTRAINT_POLICY_COUNT)); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; goto __pyx_L1;} __pyx_r = __pyx_3; __pyx_3 = 0; goto __pyx_L0; __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_3); __Pyx_AddTraceback("darwin_maxpriority.set_self_thread_time_constraint_policy"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_period); Py_DECREF(__pyx_v_computation); Py_DECREF(__pyx_v_constraint); Py_DECREF(__pyx_v_preemptible); return __pyx_r; } static PyObject *__pyx_f_18darwin_maxpriority_set_self_pthread_priority(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_18darwin_maxpriority_set_self_pthread_priority(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_policy = 0; PyObject *__pyx_v_priority = 0; struct sched_param __pyx_v_sp; PyObject *__pyx_r; int __pyx_1; PyObject *__pyx_2 = 0; static char *__pyx_argnames[] = {"policy","priority",0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OO", __pyx_argnames, &__pyx_v_policy, &__pyx_v_priority)) return 0; Py_INCREF(__pyx_v_policy); Py_INCREF(__pyx_v_priority); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":101 */ memset((&__pyx_v_sp),0,(sizeof(struct sched_param ))); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":102 */ __pyx_1 = PyInt_AsLong(__pyx_v_priority); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; goto __pyx_L1;} __pyx_v_sp.sched_priority = __pyx_1; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":103 */ __pyx_1 = PyInt_AsLong(__pyx_v_policy); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; goto __pyx_L1;} __pyx_2 = PyInt_FromLong(pthread_setschedparam(pthread_self(),__pyx_1,(&__pyx_v_sp))); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; goto __pyx_L1;} __pyx_r = __pyx_2; __pyx_2 = 0; goto __pyx_L0; __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_2); __Pyx_AddTraceback("darwin_maxpriority.set_self_pthread_priority"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_policy); Py_DECREF(__pyx_v_priority); return __pyx_r; } static PyObject *__pyx_n_OSError; static PyObject *__pyx_f_18darwin_maxpriority_getpriority(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_18darwin_maxpriority_getpriority(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_arg0 = 0; PyObject *__pyx_v_arg1 = 0; int __pyx_v_result; PyObject *__pyx_v_errno; PyObject *__pyx_r; PyObject *__pyx_1 = 0; int __pyx_2; PyObject *__pyx_3 = 0; static char *__pyx_argnames[] = {"arg0","arg1",0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OO", __pyx_argnames, &__pyx_v_arg0, &__pyx_v_arg1)) return 0; Py_INCREF(__pyx_v_arg0); Py_INCREF(__pyx_v_arg1); __pyx_v_errno = Py_None; Py_INCREF(__pyx_v_errno); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":107 */ __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; goto __pyx_L1;} Py_DECREF(__pyx_v_errno); __pyx_v_errno = __pyx_1; __pyx_1 = 0; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":108 */ __pyx_2 = PyInt_AsLong(__pyx_v_arg0); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; goto __pyx_L1;} __pyx_v_result = getpriority(__pyx_2,__pyx_v_arg1); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":109 */ __pyx_2 = PyObject_IsTrue(__pyx_v_errno); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; goto __pyx_L1;} if (__pyx_2) { /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":110 */ __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_OSError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; goto __pyx_L1;} __pyx_3 = PyErr_SetFromErrno(__pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; Py_DECREF(__pyx_3); __pyx_3 = 0; goto __pyx_L2; } __pyx_L2:; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":111 */ __pyx_1 = PyInt_FromLong(__pyx_v_result); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; goto __pyx_L1;} __pyx_r = __pyx_1; __pyx_1 = 0; goto __pyx_L0; __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_1); Py_XDECREF(__pyx_3); __Pyx_AddTraceback("darwin_maxpriority.getpriority"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_errno); Py_DECREF(__pyx_v_arg0); Py_DECREF(__pyx_v_arg1); return __pyx_r; } static PyObject *__pyx_f_18darwin_maxpriority_sched_get_priority_max(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_18darwin_maxpriority_sched_get_priority_max(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_arg0 = 0; int __pyx_v_result; PyObject *__pyx_v_errno; PyObject *__pyx_r; PyObject *__pyx_1 = 0; int __pyx_2; PyObject *__pyx_3 = 0; static char *__pyx_argnames[] = {"arg0",0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "O", __pyx_argnames, &__pyx_v_arg0)) return 0; Py_INCREF(__pyx_v_arg0); __pyx_v_errno = Py_None; Py_INCREF(__pyx_v_errno); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":115 */ __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 115; goto __pyx_L1;} Py_DECREF(__pyx_v_errno); __pyx_v_errno = __pyx_1; __pyx_1 = 0; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":116 */ __pyx_2 = PyInt_AsLong(__pyx_v_arg0); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; goto __pyx_L1;} __pyx_v_result = sched_get_priority_max(__pyx_2); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":117 */ __pyx_2 = PyObject_IsTrue(__pyx_v_errno); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; goto __pyx_L1;} if (__pyx_2) { /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":118 */ __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_OSError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; goto __pyx_L1;} __pyx_3 = PyErr_SetFromErrno(__pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; Py_DECREF(__pyx_3); __pyx_3 = 0; goto __pyx_L2; } __pyx_L2:; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":119 */ __pyx_1 = PyInt_FromLong(__pyx_v_result); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; goto __pyx_L1;} __pyx_r = __pyx_1; __pyx_1 = 0; goto __pyx_L0; __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_1); Py_XDECREF(__pyx_3); __Pyx_AddTraceback("darwin_maxpriority.sched_get_priority_max"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_errno); Py_DECREF(__pyx_v_arg0); return __pyx_r; } static PyObject *__pyx_f_18darwin_maxpriority_setpriority(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_18darwin_maxpriority_setpriority(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_arg0 = 0; PyObject *__pyx_v_arg1 = 0; PyObject *__pyx_v_arg2 = 0; int __pyx_v_result; PyObject *__pyx_v_errno; PyObject *__pyx_r; PyObject *__pyx_1 = 0; int __pyx_2; int __pyx_3; PyObject *__pyx_4 = 0; static char *__pyx_argnames[] = {"arg0","arg1","arg2",0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OOO", __pyx_argnames, &__pyx_v_arg0, &__pyx_v_arg1, &__pyx_v_arg2)) return 0; Py_INCREF(__pyx_v_arg0); Py_INCREF(__pyx_v_arg1); Py_INCREF(__pyx_v_arg2); __pyx_v_errno = Py_None; Py_INCREF(__pyx_v_errno); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":123 */ __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; goto __pyx_L1;} Py_DECREF(__pyx_v_errno); __pyx_v_errno = __pyx_1; __pyx_1 = 0; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":124 */ __pyx_2 = PyInt_AsLong(__pyx_v_arg0); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; goto __pyx_L1;} __pyx_3 = PyInt_AsLong(__pyx_v_arg2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; goto __pyx_L1;} __pyx_v_result = setpriority(__pyx_2,__pyx_v_arg1,__pyx_3); /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":125 */ __pyx_2 = PyObject_IsTrue(__pyx_v_errno); if (__pyx_2 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; goto __pyx_L1;} if (__pyx_2) { /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":126 */ __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_OSError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; goto __pyx_L1;} __pyx_4 = PyErr_SetFromErrno(__pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; Py_DECREF(__pyx_4); __pyx_4 = 0; goto __pyx_L2; } __pyx_L2:; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":127 */ __pyx_1 = PyInt_FromLong(__pyx_v_result); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; goto __pyx_L1;} __pyx_r = __pyx_1; __pyx_1 = 0; goto __pyx_L0; __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_1); Py_XDECREF(__pyx_4); __Pyx_AddTraceback("darwin_maxpriority.setpriority"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_errno); Py_DECREF(__pyx_v_arg0); Py_DECREF(__pyx_v_arg1); Py_DECREF(__pyx_v_arg2); return __pyx_r; } static __Pyx_InternTabEntry __pyx_intern_tab[] = { {&__pyx_n_OSError, "OSError"}, {&__pyx_n_PRIO_PROCESS, "PRIO_PROCESS"}, {&__pyx_n_SCHED_FIFO, "SCHED_FIFO"}, {&__pyx_n_SCHED_OTHER, "SCHED_OTHER"}, {&__pyx_n_SCHED_RR, "SCHED_RR"}, {&__pyx_n_darwinsys, "darwinsys"}, {&__pyx_n_get_bus_speed, "get_bus_speed"}, {&__pyx_n_getpriority, "getpriority"}, {&__pyx_n_sched_get_priority_max, "sched_get_priority_max"}, {&__pyx_n_set_self_pthread_priority, "set_self_pthread_priority"}, {&__pyx_n_set_self_thread_time_constraint_policy, "set_self_thread_time_constraint_policy"}, {&__pyx_n_setpriority, "setpriority"}, {0, 0} }; static struct PyMethodDef __pyx_methods[] = { {"get_bus_speed", (PyCFunction)__pyx_f_18darwin_maxpriority_get_bus_speed, METH_VARARGS|METH_KEYWORDS, 0}, {"set_self_thread_time_constraint_policy", (PyCFunction)__pyx_f_18darwin_maxpriority_set_self_thread_time_constraint_policy, METH_VARARGS|METH_KEYWORDS, 0}, {"set_self_pthread_priority", (PyCFunction)__pyx_f_18darwin_maxpriority_set_self_pthread_priority, METH_VARARGS|METH_KEYWORDS, 0}, {"getpriority", (PyCFunction)__pyx_f_18darwin_maxpriority_getpriority, METH_VARARGS|METH_KEYWORDS, 0}, {"sched_get_priority_max", (PyCFunction)__pyx_f_18darwin_maxpriority_sched_get_priority_max, METH_VARARGS|METH_KEYWORDS, 0}, {"setpriority", (PyCFunction)__pyx_f_18darwin_maxpriority_setpriority, METH_VARARGS|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; DL_EXPORT(void) initdarwin_maxpriority(void); /*proto*/ DL_EXPORT(void) initdarwin_maxpriority(void) { PyObject *__pyx_1 = 0; __pyx_m = Py_InitModule4("darwin_maxpriority", __pyx_methods, 0, 0, PYTHON_API_VERSION); if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;}; __pyx_b = PyImport_AddModule("__builtin__"); if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;}; if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;}; if (__Pyx_InternStrings(__pyx_intern_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 3; goto __pyx_L1;}; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":62 */ __pyx_1 = PyInt_FromLong(PRIO_PROCESS); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; goto __pyx_L1;} if (PyObject_SetAttr(__pyx_m, __pyx_n_PRIO_PROCESS, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":64 */ __pyx_1 = PyInt_FromLong(SCHED_OTHER); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; goto __pyx_L1;} if (PyObject_SetAttr(__pyx_m, __pyx_n_SCHED_OTHER, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":65 */ __pyx_1 = PyInt_FromLong(SCHED_RR); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; goto __pyx_L1;} if (PyObject_SetAttr(__pyx_m, __pyx_n_SCHED_RR, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":66 */ __pyx_1 = PyInt_FromLong(SCHED_FIFO); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; goto __pyx_L1;} if (PyObject_SetAttr(__pyx_m, __pyx_n_SCHED_FIFO, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; /* "/Volumes/astraw/src/ve/visionegg-devel.clean/src/darwin_maxpriority.pyx":121 */ return; __pyx_L1:; Py_XDECREF(__pyx_1); __Pyx_AddTraceback("darwin_maxpriority"); } static char *__pyx_filenames[] = { "darwin_maxpriority.pyx", }; statichere char **__pyx_f = __pyx_filenames; /* Runtime support code */ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) PyErr_SetObject(PyExc_NameError, name); return result; } static int __Pyx_InternStrings(__Pyx_InternTabEntry *t) { while (t->p) { *t->p = PyString_InternFromString(t->s); if (!*t->p) return -1; ++t; } return 0; } #include "compile.h" #include "frameobject.h" #include "traceback.h" static void __Pyx_AddTraceback(char *funcname) { PyObject *py_srcfile = 0; PyObject *py_funcname = 0; PyObject *py_globals = 0; PyObject *empty_tuple = 0; PyObject *empty_string = 0; PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; py_srcfile = PyString_FromString(__pyx_filename); if (!py_srcfile) goto bad; py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; empty_tuple = PyTuple_New(0); if (!empty_tuple) goto bad; empty_string = PyString_FromString(""); if (!empty_string) goto bad; py_code = PyCode_New( 0, /*int argcount,*/ 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ empty_string, /*PyObject *code,*/ empty_tuple, /*PyObject *consts,*/ empty_tuple, /*PyObject *names,*/ empty_tuple, /*PyObject *varnames,*/ empty_tuple, /*PyObject *freevars,*/ empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ __pyx_lineno, /*int firstlineno,*/ empty_string /*PyObject *lnotab*/ ); if (!py_code) goto bad; py_frame = PyFrame_New( PyThreadState_Get(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = __pyx_lineno; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); Py_XDECREF(empty_tuple); Py_XDECREF(empty_string); Py_XDECREF(py_code); Py_XDECREF(py_frame); } visionegg-1.2.1/VisionEgg/darwin_maxpriority.pyx0000755000076500000240000000752611224565530021300 0ustar astrawstaff#emacs, this is -*-Python-*- mode # Copyright (C) 2005-2006 California Institute of Technology # Distributed under the terms of the GNU Lesser General Public License # (LGPL). cimport darwinsys # for exported symbols cdef extern from "darwinsys_compat.h": ctypedef int id_t cdef extern from "Python.h": cdef object PyErr_SetFromErrno(object) cdef extern from "stdlib.h": ctypedef int size_t cdef void* memset(void*, int, size_t) cdef extern from "errno.h": cdef int errno cdef extern from "sys/sysctl.h": cdef int CTL_HW cdef int HW_BUS_FREQ ctypedef unsigned int u_int cdef int sysctl(int *, u_int, void*, size_t*, void*, size_t) cdef extern from "mach/mach.h": ctypedef unsigned int uint32_t ctypedef int boolean_t cdef struct thread_time_constraint_policy: uint32_t period uint32_t computation uint32_t constraint boolean_t preemptible ctypedef thread_time_constraint_policy thread_time_constraint_policy_data_t ctypedef thread_time_constraint_policy* thread_time_constraint_policy_t cdef int THREAD_TIME_CONSTRAINT_POLICY cdef size_t THREAD_TIME_CONSTRAINT_POLICY_COUNT ctypedef int kern_return_t ctypedef int thread_act_t ctypedef int thread_policy_flavor_t ctypedef int integer_t ctypedef integer_t* thread_policy_t ctypedef int mach_msg_type_number_t cdef kern_return_t thread_policy_set( thread_act_t, thread_policy_flavor_t, thread_policy_t, mach_msg_type_number_t) ctypedef int mach_port_t cdef mach_port_t mach_task_self() cdef mach_port_t mach_thread_self() cdef extern from "sched.h": cdef struct sched_param: int sched_priority cdef extern from "pthread.h": ctypedef int pthread_t cdef pthread_t pthread_self() cdef int pthread_setschedparam(pthread_t thread, int policy, sched_param *) # export symbols to Python PRIO_PROCESS = darwinsys.PRIO_PROCESS SCHED_OTHER = darwinsys.SCHED_OTHER SCHED_RR = darwinsys.SCHED_RR SCHED_FIFO = darwinsys.SCHED_FIFO def get_bus_speed(): cdef int bus_speed cdef int mlib[2] cdef size_t len mlib[0] = CTL_HW mlib[1] = HW_BUS_FREQ len = sizeof(bus_speed) sysctl(mlib, 2, &bus_speed, &len, NULL, 0) return bus_speed def set_self_thread_time_constraint_policy( period, computation, constraint, preemptible ): cdef thread_time_constraint_policy_data_t ttcpolicy ttcpolicy.period = period ttcpolicy.computation = computation ttcpolicy.constraint = constraint ttcpolicy.preemptible = preemptible return thread_policy_set( mach_thread_self(), THREAD_TIME_CONSTRAINT_POLICY, &ttcpolicy, THREAD_TIME_CONSTRAINT_POLICY_COUNT) def set_self_pthread_priority( policy, priority ): cdef sched_param sp memset(&sp,0,sizeof(sched_param)) sp.sched_priority=priority return pthread_setschedparam(pthread_self(), policy, &sp) def getpriority(arg0,arg1): cdef int result errno=0 result = darwinsys.getpriority(arg0,arg1) if errno: PyErr_SetFromErrno(OSError) return result def sched_get_priority_max( arg0 ): cdef int result errno=0 result = darwinsys.sched_get_priority_max(arg0) if errno: PyErr_SetFromErrno(OSError) return result def setpriority(arg0, arg1, arg2): cdef int result errno=0 result = darwinsys.setpriority(arg0,arg1,arg2) if errno: PyErr_SetFromErrno(OSError) return result visionegg-1.2.1/VisionEgg/darwinsys.pxd0000755000076500000240000000071411224565530017333 0ustar astrawstaff#emacs, this is -*-Python-*- mode # Copyright (C) 2005-2006 California Institute of Technology # Distributed under the terms of the GNU Lesser General Public License # (LGPL). cdef extern from "sys/resource.h": cdef int PRIO_PROCESS cdef int getpriority(int, id_t) cdef int setpriority( int, id_t, int ) cdef int sched_get_priority_max(int) cdef extern from "pthread.h": cdef int SCHED_OTHER cdef int SCHED_RR cdef int SCHED_FIFO visionegg-1.2.1/VisionEgg/darwinsys_compat.h0000644000076500000240000000037211224565530020327 0ustar astrawstaff/* Copyright (C) 2006 California Institute of Technology Distributed under the terms of the GNU Lesser General Public License (LGPL). */ /* Mac OS X 10.3 does not define "id_t" so we have to do it here */ #ifndef id_t #define id_t int #endif visionegg-1.2.1/VisionEgg/data/0000755000076500000240000000000011231315556015476 5ustar astrawstaffvisionegg-1.2.1/VisionEgg/data/az_el.png0000644000076500000240000007644511224565530017317 0ustar astrawstaff‰PNG  IHDRĵÔ|ìIDATxœb` ˜9óé0“F€FNá!0ê}Ş›I#0šŝGÀ0“F`4ŭ&€!a&ÀhúB ˙˙Ԗħ!C‰˙˙ϽÁĊÜ –RŽÁ _m5ÄöJÖµùĠ‚ˢlžġĞÉu$a˙ œcĤ,̎HÑùö /j'ïÙ*œ¤Ò •+“ÀìùhġûÚ’éµÏ‡Ĝ‘€PûnŞ ;˙ûgä|™^ûÈO—P˙˙b‚§WFFF"; ˙aİœÀÈÈH’ú$yĞvâÂáŜg 8p™Iĵ⁠–Qïdï3P#†–ÑÀ¨÷G²÷†ÀP÷1`´ù7b½˙˙b‚³häAî8 ›;g€Œpï3 ´˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ä—Q !Dġûß`?6™ÂUrĦÜùʌ˜WÖ?Ìü né̀t–™Ešó] à…Ôâ@˜é;I>Íl|(€ŭñÉaĴvUDñ)^•‹ŬŝЇzĵ 2Ġ>êç·Of˙3< Í#?z §·´üÒEÚtÛ u˙˙ä—Á À EqŽèL èô`KĞE{AËÁƒ‡÷óQĵ>!"â„s^ċŽŒ ĴŽ &yż ŒOV ;Œ‚Äx(ATîM>” €Íˆi!|(hÔġ-Wp˙ËúşMüÈ2Š]Wl?q'xĈ‡7F…<xĉUa1@ŸHĈfĝżzWoäı¨Çż/7ÛꟽÓ7 ˙˙ÂııD€°q•hâĝr€Ybġ~?B2‘Š XBÀÈI0ƒeÔû”— C×ûÈ`dV @’†“÷GT È0’bŒĜ’ PžÓÑÒ˙`˙˙ܙA À ‡ŝ˙Ñ=”ŠhšnëeÍ^ ˜Ġx ĝY­GÌğó6¨Ç_4î…ف…²:˙5Ċ-Œ{”„Yá#ĝ?\ĠÌŻÉ?|ğ˘?Ĉĝ,ĵ˙OğáÍ;H˙SĊí³ôì+‘ğWÀ< -³yùsSˆŻçz#ЇĈ˙Ô½éĦN˙˙Â2@’sÑĤ?†1 ~y l’˘x„¤¸‰O,XFS)eÂP÷>I.G[8 I18üĵOd“†_  #¤Ĉġ0 ‘VŻ˙˙Bï ·lˆ7eHÏĝH$~B’†&`D¸Ô‘ù‡DŞ Ĉûp0ü2ñŜefŒ¨JO–э°z˙? ³²Ž<0Œ½Ĉ0× ##§C˙˙bÁ‚÷CÚcT£A1˘İ™èöŝħ‚žÔݸbˆĴŝ9•°÷ ~0½? FÁˆ˙˙ ­Mˆ´żJüЇ"`ÄX"Ĉ0’ÍËÈì‘à}’ÀÈ –ž*Ff™@|€ġ(\Ї )‡™÷ñ$éa™Ú‡ħׂ‘ט€$áR<„6˙˙ä\É ġ˙?]3ĤˆiıôpvèY ÑnüÉx™­FÂFsk¸ ?h-ÁêÛöC)ˆĴó˜&Ÿ+Üùwì×Àÿä‰eİh™€ŠŬH,GV‘>ÇtĝïIŻ˘MD‰áħ.Y,YKşÎtŭ+èé˙˙äKÀ DûŸÀö]˜´(ŠĦŸ”Ec`$>J˘.šž˙ ûj;ÔÔ#„Žo€¸ŜlëFiùRݳİWWƒş >Ûp"*0Ċ×{h(çM5ĝ4üHĤ, ­†~:DĈŸO£6³á§Ú¸†>ùôOàCWĤ Uô8"Ñ'úż " zeNwü³ŜÖ2šĉÍÒíÏqî9ħpBÇ?Ż$<§;~ŞÏ?^+j€˙˙Ԙ1À Q˙˙çtè‚ÊÇħ9œħA€xÖö‡VÚük(ÁiÑĥ Żúċä 8ì§À9öC”€„é oŸâ˘ròw 3é4pJ`' 4y>\ŬbŸ2µöàû$@lTßJ™°óŸBÎÉÔڏúi Ò%ê˙˙b‚§WFŒ‘-\à?)³ŒCaßIŜÇŞxĊƒ0@F¸÷(\fŻx`ƒeÔû#Ùû ԁĦċ_40êŭ‘ì}ĵ!0Ô½F mŝXï˙˙Bì ‘Cı˙á€nîœ2½Ï0`ġŝˆµŝn ŝE£Ŝ–v¨âŞÁé5bÀhóoKE˙˙ì܁!ë <Á@ê¸4˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ܗQ€ Dáûß g”ĦB(šÀŭrB›}–ÍDƒ.^W”"5~·OŒGK ˆ’+Žžœ3ô~ jÊÚ`ëAZ{Ùúäßcñ⃿+vÂßìé/=¸xû 09ݐĊ’ħÛ÷÷v{é/`ġüL 7êÇ?0ïôğĴĈù'?ŝ˙˙ä—Á !Ħ˙ (:¸Ç‚gDô>¨<Œ1ëc6+jù ˘ˆèDç:Ú-‹ˆħŬ˜ßĊ‡0£c;℆8ĝP;ħ<ñFĝP;´ú^*ì˙g(Î`Ë,>¸İ8Ħ'dĈ‡‘³—ÂÛ3ó~*€Ö„KŻşw?ÈkĠ>˙ŝtĥŬŸñ“~@˙˙ÂııD€°1ËĴ.ĊC`…$ùq¨ÁІĞ÷q,£ŜÉe2™•`M#Áû#-µcŻ#-ħÊs:¤ 4$˙˙bb ş‚Ç›0ÈğAȎ§VÂBBŒ÷!ŬbâÍLO—*Ŝg "ŭc•% ƒ3Uç}ÒSĊ0ó>u-ÀLAyùO†ħƒ§ rŝgx¤vL@|쓔N†Š÷HO˙½†6:ÈVï ׸Ĉh˙ 7§c˙˙bÁ"5îİêžÁ ˆ –á )-bB`ĝy+€äjä)?ü`ĝËhŞ`IeI•Bzştz:MCo@Rj~Ŝ'µ=D;— ,Ĉ^ƒƒ×#­^˙˙ܛ; Dŝ‡ŽÂ0Ìn÷Ġ/òib_šŭ‘ûÙ1ˆĊ|ŝċşiŸÓEÊÊíL3 Ĵ • ˘? ²ÂLŸê *úqŠ;ĥ%x- >·Ÿ>•À0Ô ùö­-bÙĜT˙˙Â2/îi1/<ÁhPŒ(@R\é̏Œ¤N‹ċC `ġ×È݆½ñƒîŭQ0 F˙˙ ­Mˆ´Ç2üЇ(`ÄX"Ĉ0’ÍËÈì‘à}’ÀÈ –ž*Ff™0’+\Ŝ Ŝ'ÉGÀûĜkÁH‹kL@•œ>„6˙˙BŸ@žó…Ĵ˝aK g áŠ!ŝ˘c ĝĈĴ!€˜IOG ÌP´Íû¸˘˜¤ô0„ĵ ,C†M°ŒzŸ”2aÖĴg Îû$U ECÔżhÓŭ#ûp6Ŝg²5àÈĴŬà€*Ġŭmŝ‘‘Óáq)ä˙˙äŬ€ …=ï˙Ò]¸ (!ô³ĵhGĈGlÙEuŝ NOİqM\íC°\ïû´°l5"T'@MŒ‹DŸè˙:ÉÀwè1ñKÎĥ˜£Y,½ŭĉ€‰+cû„Ç Ç/ŭŝ'*ó¤8˙˙ԗ;À CQïçtè‚ÊÇħ9˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙Btá @–BÁ%…U͐hŝE“")@ÒӇ\€àñ>ĥXĈŸÒÓq5hA§R˜*y6!Ġû ¤§Šáäŭaû „\E’!à ÷/ Ĉ‘DĤöáç}RSû‡zF&àñŝHĴĊ;2{¸z˙˙äWI€ ˙ôñ˘™jĞ'(90(‡„ÒċJ)$eÈÖjwDrFDOy"(H­Ĥ¤CW4Ĵ-ïߊ Í?öîȲ|nT¤§˙#'ŒLo ¤/ ‘",Bİ ˜ìeƒí_šÌÁ­˙IüÓ=v˙˙ÂııD€°ħ–x¤†"À, Iġġ‚!ô>¤6€ZÁ2ÂSĊ°ñŝˆ*‘•$û˙"Ĵi`$x¤öaì5‚`¤Ċ5V@|NŜ˙˙ܙI ˙˙gĵĤM*sġ4RWèžÄÌÜ 8Ğŝ‹ZŠż ŭS ŒA\DŝÑ˘”δäôÑ%iŭ :ú¸½˙‡Hù:ÈŝO´ïĠOçDYµü‹Ğ1„ú•Z˙{ŭë½ÒC&˙˙Â20´<@7@‡jrp´é°QÀ€4ñ7š*FrŞ9ħ?’c™aħvJšD£`h×#-§˙˙bACz0#Äóă‘SÓCkK6@ó&á˙áÚ ĈûȲ,Uïŭaïp€#ŞRÀ“†_jÇX½”†×`Ĉ²jh`L*úıüĵ‘sA~jcè“OŻÎÙT§vÚ!³ˆ  è G—óܙŝBëĜ˙e!߅Aät—ŸbvÀc .Ͳ²A+ċΉ€BÌñ§ú_ñZHĠÀ ˙˙ä˜K ĊŭïÌÂFDŞÚżîóòP1Txʐ˙z"êÄ:áÍtıIİ€LÖ~Ós²ŭ­€9Ğĝı}Û%'ïÀCì'nä”gù`ÜbŸ‚t™ĝîĴxwC"ż]˙l)˙†ş&kˆèš#˙˙b‚G#ĈÈ.÷|Ü%F’÷ħjÇ%5$d„{ŸâÀe&.İÁ,£ŜÉŜg F -˙˘Qïdï3à Ħî5bÀhóoÄz˙˙Bì ŠÓ‡œ˙á€F.*2½Ï@_§Â`ġŝ°´‹x@;W N˙˘Qï9“İ ÈpçPñ1`´ù7H Ħ3˙˙ì܁!ë <Á@ê¸4˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙Btá @–BÁÒÓñ›@ĵQthE“˘0@š0à‚Çû Ĝ\;ÌĵOŒ†wŞ Ġû +UŒĜ'hŬó/ Ĉöa“Ú1Á}dPî5´öπ{€Çû¤ÈPoŝ1PœÓ!!€fÚàô>˙˙ä—m€ †á3yÀÎA?,–Ȳ-$~8—HÔ h­ż•ÒÒùF'²ÜĊ³*ÂÇ[l^Ù\ñŠéÙ­?ÁWíZ†bb==£ġX{üùÖ³˙Ĉ˙ô˘Àĝ˙˙ÂııD€°ñ‘X5’gÂÌ˘rï Ħ!XBÀpġ>.0ƒeÔû#ıL@#³R€Ĵi`$x¤vʽ6sĉSâMT`¤Ċ5V0˘r:˙˙ÜYÑ ´ŝ˙£{èĊê1÷j‹hŞ|Áßblž5hŽÓµH9‚kħĦ#Ž@=ġ/Z­˘ O‹Ž>UQ…šŝïšÂiŝ+|… ˙§†Ú9êżë$!}2ÒNjÄÈĞ֚cyŝ§ş.˘˙˙Â2@ı˖@ @I– J’(€6FÒŜÇ à2š*FrŞ9ħO•qù ŒÔNı‡´÷ñƒaĉ5ʽ3¤›TÉéÄ,‚$˙˙Ü[1!Ó˙?Z#A$†Ŝ-ŽF 4jş³‰È÷k<#tM"Ÿ`„ŝĜ¨k8}m‘-Dß é{”)Ü5sš%B_E}('TĦߤ|'­€­ÚFŝÔ×·AÚżŸ‰]˙HŽ ˙˙Â2oÙ ˙Qġ8#)|èĈ‚@| v9€¤$M¤‡P6Ħ…S‡Ÿ÷I-†Š÷p¸–¤JıüŝE”GÖ÷ŝ˙á[­ŒL0Âdx˙˙ ­ïˆ´™ ÀŞŒ$`ÄX"Ĉ0’ÍËÈì‘à}’ÀÈ –ž*Ff™0’+LGŽïSîĝĦċ}ʽY2½FŒ´¸Ĉ#-§˙˙äœQ€ C{˙KϏĊE;0ù` }œ²x/ƒÎ~pğÏe/ËÌ˘ĝ<4˘ĥUž­ÜâÁd 1Âŝ~˜ÇûgvUüžzħ4ĦüĊ2µ*äñqŜ3áQ(ÄK Ğßĉ…ñGÌkà £hÉ\×}ŭ[µÓ=ĝ˙˙ä]Ë À ³˙˙Ó;ÍUûJĞ‚°œÄĊdÂdż{ĝ÷ŒFt6Ÿ!ü`)„"ÒNNÉJW|rêKċLöÀ³…œh ŒÏ8VŻOĈ†·h`-|Ÿ,jv‘ŸÇĠj¨Ċo#$ye7Ä'Ĵ•£úŸ!ßÉ+—û&kĜğ˙§AVÁZ>*D|ÒĴŜŸ´üh–çÈóO(‚ĝ\YîÈ"ñS…œ8ŝĝ ĉöĝíŭĉ(„"ŞlŠâ˙˙ä˜ğ€ ˙˙ÏkabŒ!²,ƒpĊŬÀlĦ„u9½á™UmvhM;ŭMĜNĝe<£!İf›²ú}A ŒcÉġ)`‘“÷Ï=Â)Á˘@Žz38ı~ĥÊdġcàóú2@ŝexÂTŭċú—˜LVßéùˆ¤ ˙˙b‚×UŒ¸ç5ÀŠ'2éxò41€$ïcĠNĦ6@F¸÷(\fRhŬ‚eÔû#Ùû ԁĦċ_40êŭ‘ì}ĵ!0Ô½F mŝXï˙˙Bì §›˙á`À hû€;`À½?H܀F³ä°´‹H@g' xŒ"hÔûĠî5bÀha;,í"˙˙ì܁!ë <Á@ê¸4˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙Btá @–B! kA3T£èü‹&5ì÷°ıv˜yŸ7 ïTAŞ÷†WŞáħOşáç_4@Œí&µc‚ûÈ Ükéé҃ÊkÄ<Ŝ~q œ4Œs:˙˙ÜWIÀ Äwĝ@ŝ˙z’ş!­= 1F˜apİ€”ħ>Ï™­•èöé|S,0|˜InûLH)żYBĝ2áCËÀjÁ¸~ ÄĴ j„–·ATExĝñɁ_.SxÇÜĥ“ׄp ?žÚ§é…ĴĴÒĈçßI­½?˙Î;1{˙˙ÂııD€°ñ‘x´“gÂ€Ì˘Ğ›‡k€Ĵ!`¸záÁ2êŭ‘\& ƒ‘Y)@ċŽ˘ŜiݝrŻÍœù”T iqPîxH Äş˙˙ܙK ! CÜ˙.„AüÔ*†fĞTŸJġ}Á“ú GğÊÑ)ƒZüI_;y;>áĦĥŝŸĥgг,>|dq…?8(4qúü_ ŜNÌó?²¸}Ÿ}·O”ñóż8£)~Ö\êž˙qb§×?£›~˙˙Â2@ıËfÎ|JҤɐ”hóAC Pîĝ!í}ĴîÑT1’SĊȉ}Ê9´ü‹Fxj§¤ICÚûĝÁ0óċq=¤›TÉ鐀!á}˙˙ܛK Dëŝ‡fİé° óÖ4ĤúAÂ_ìÉ&2żŒÌĤ8€žIô“Câò­,I`äËO#³L °RrŝE”;~èzĞ ‡ħ÷)÷¤ŭ3½FP%‡tóo¤ċt˙˙äœK Dğ˙mÍÂ-dœuˆOK)!}8³ ġö³÷ĥíYa=Ú¤kĦ­lĥԈ‡; _DÀž8Oƒ) ‹ …OhÂò´+èñ×ĵš0ı)'ĈOj>1ZE£rmġë¤#ÔÈBm˙˙ä]Ë À ³˙˙Ó;ÍUûJĞ‚°œÄĊdÂdż{ĝ÷ŒFt6Ÿ!ü`)„"ÒNNÉJW|rêKċLöÀ³…œh ŒÏ8VŻOĈ†·h`-|Ÿ,jv‘ŸÇĠj¨Ċo#$ye7Ä'Ĵ•£úŸ!ßÉ+—û&kĜğ˙§AVÁZ>*D|ÒĴŜŸ´üh–çÈóO(‚ĝ\YîÈ"ñS…œ8ŝĝ ĉöĝíŭĉ(„"ŞlŠâ˙˙ä˜ğ€ ˙˙ÏkabŒ!²,ƒpĊŬÀlĦ„u9½á™UmvhM;ŭMĜNĝe<£!İf›²ú}A ŒcÉġ)`‘“÷Ï=Â)Á˘@Žz38ı~ĥÊdġcàóú2@ŝexÂTŭċú—˜LVßéùˆ¤ ˙˙b‚×UŒ¸ç5ÀŠ'2iò4I€$ïcĠNĦ6@F¸÷(\fRhŬ‚eÔû#Ùû ԁĦċ_40êŭ‘ì}ĵ!0Ô½F mŝXï˙˙Bì §›˙á`À hû€;`À½?H܀F³ä°´‹H@g' xŒ"hÔûĠî5bÀha;,í"˙˙ì܁!ë <Á@ê¸4˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìA À Ó4ĝ@Fiôr€Ŭ—ÛÌ-?ŭ"9yòÍ|ôÊ7óÑ(ßÌ>˙˙ì’A @ êßÁžŽœ‰ġQÖ"Il3ó"œ@JIëȧ4ß@˙_w’3Àñ|“ĥ˙§ p<ߤí˙˙˙ìځ€ ëA.Ž  ˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙ìׁ€ ëA.‹F˙˙Btá @–BÁÒÓñ›@ĵQthE“˘0@š0à‚Çû Ĝ\;ÌĵOŒ†wŞ Ġû +UŒĜ'hŬó/ Ĉöa“Ú1Á}dPî5´öπ{€Çû¤ÈPoŝ1PœÓ!!€fÚàô>˙˙ä—Û € EÛ9™: s\´ÑĊÄRûA)s)ŻíÀÌ´˘u--ĥ1³HĥGàJĊ§Z*`·Ç‚\Jú­ > ˆĝtV ċPú·²"sF'²ÜĊ'3+ÂÇ;l^ı\ñV³J„ŸàÇËöV„ĠÀz:zFëħòù7²Ö³?˙ĈwşHĤIW˙˙ÂııD€°ñ‘´0ŝ³(Äêĉá +BŜÇFx°Œz$— È`dV €5 ŒÔNı× íżAè5‚`¤Ċ5V0˘r:˙˙Ü™Ë C÷ڃ#˜#ôM@ù „ü_xÖ ]~cş‘żÖâT3h`¸¸ĈÚ·ĵɇJV<Ë/ Ĥ(ZúżKKŝ˙hdğ%ŭìI`äËO#³LɕĤ#GŽ÷ħşp{ŸrŻAÖÀ BŻ#-1Ur:Ú"¨Áì}˙˙Bï@ĉ2:4 0×cV{˜€‘‘1=]š  ƒ`ĈòYBL€ĉŭ˙˙˙£Mo o︂ŜDöd€a IİbĜ{Ÿaä• ”W CÈżhîTĴ™}$xOY7Ìĵ?Œ½F  J\Ŭĉµr:|— ƒ˙˙É2Vyî4†IENDB`‚visionegg-1.2.1/VisionEgg/data/monitor.xcf0000644000076500000240000220177011224565530017701 0ustar astrawstaffgimp xcf fileRµBB{wĥNC Ċk&Yŝ¨Ëİ Pasted Layer˙     Ch] Ëİ@ĥ*ĥ6ĥBËİĴĤÎ"(&Š,„;3@³BPN˘]Ñm|“‚<“i£~¨a¨q¨¨‘¨Ħ¨ħĞr²ç˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙˙˙ ˙˙˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙ ˙ŝ˙˙˙ŝ˙˙ ˙˙ ˙˙ ŭ ·˙˙ûĤ<ï˙˙ŭôFŭ ğ˙˙ûŸB˙˙ŭñBŭ ·˙˙ûĤ<ï˙˙üġQŭ ğ˙˙ûŸB˙˙üòMŭ ·˙˙ûĤ<ï˙˙üù“$ŭ ğ˙˙ûŸB˙˙ü÷"ŭı˙˙û§<ï˙˙üŝKŭ½˙˙ûĦB˙˙üŭàGŭ_˙˙ûĊA@ï˙˙ŭûVüNÓ˙˙ûÀ?E˙˙ŭĝRŭñ˙˙ûî“Dï˙˙ŭûVü¤ò˙˙ûíŽI˙˙ŭĝRŝŭ˙˙ûŝµFï˙˙ŭûVŭÇ˙˙ûŝK˙˙ŭĝR˙üµFï˙˙ŭûVŭÈ˙˙üŻK˙˙ŭĝRŭË˙˙ûìDï˙˙ŭûVü ñ˙˙ûë‹I˙˙ŭĝRŭ_˙˙ûĊA@ï˙˙ŭûVüNÓ˙˙ûÀ?E˙˙ŭĝRüŸò˙˙ġ¨ 4Òü˙˙ŝàJû£ó˙˙ġ˘8Ôü˙˙ŭŬFüOÌ˙˙ġ€ò˙˙ù“%üRÏ˙˙ġŸ„ó˙˙÷#ŭ êêġ˜3×êêàHü Ħêêġ’8ĜêêŜEŭTöStz#ŭVöPux! ñ## ##" ñ## ##! úGll>ùcllgúIll;ùcllf ñ ‘Ùـ/ĈÙÙÏ<ñ •ÙĜ{3ÈÙÙÍ8BĈ˙˙¸:rñ˙˙ôFEÉ˙ŝ´7uò˙˙ñBï ’ì˙˙è„0Çú˙˙ôJï–í˙˙ĉ4Éû˙˙ñFŭLË˙˙û4?ï˙˙ü÷wü?Î˙˙ûı2E˙˙üġsŭĵë˙˙ûç…Cï˙˙üüÊ?ü•ì˙˙ûċ€H˙˙üûÇ<˙üĥFï˙˙ŭûVŭÈ˙˙üŻK˙˙ŭĝR˙üĥFï˙˙ŭûVŭÈ˙˙üŻK˙˙ŭĝRŭÜġ˙˙ûòœEï˙˙ŭûVü­ġ˙˙ûñ—J˙˙ŭĝRŭqĠ˙˙ûËO@ï˙˙ŭûVü\Ĝ˙˙ûÇLF˙˙ŭĝRüŞö˙˙ġĞ7Üŭ˙˙ŝèNû­÷˙˙ġ<Ŭŭ˙˙ŝĉIü]Ó˙˙ġĤô˙˙ú +ü`Ġ˙˙ġŸ!’ġ˙˙ĝ)üĤġœ?ŬçTüŞġ–CßäPŭ`““ö_†““)ŭc““ö[‡““‹& ñ%%$"%%! ñ%%#"%% ú:XX3úPXRú;XX1úQXQ ñ†ÌÌv'ğÌ0ñŠÌÌq+ĵÌğ-6ŭüŻ.díŭm8ÂŭüĞ,hîŭîj†ç˙˙áx,şù˙úÁ4 Šè˙˙ßt0½ù˙ù1ġ=ŭ˙˙ŭµ)=ë˙˙üólô4Ĉŭ˙˙ŭ°'Cí˙˙ühŭİĉ˙˙ûàxCï˙˙üûĵ8ü ‡è˙˙ûŜtH˙˙üúı5ŭĝŭ˙˙ûüħFï˙˙ŭġTüŭ˙˙ûüŞK˙˙ŭóO˙üĥFï˙˙ŭûVŭÈ˙˙üŻK˙˙ŭĝRŭìù˙˙üĥFï˙˙ŭûVüıú˙˙üŻK˙˙ŭĝRŭ„Û˙˙üĥFï˙˙ŭûVü jŬ˙˙üŻK˙˙ŭĝRŭ!˙˙ġúĞBäŝ˙˙ŝRüÂ˙˙ġùGĉŝ˙˙ŝîMŭ ·˙˙ġÙj(žġ˙˙ú2ŭ ğ˙˙ġÖf+Ħö˙˙ùĞ/ŭ °ġġġ­ Kġġì_ŭ ´ġġġ¨ Oċġġê\ ŭx§§öl˜§§ .ŭ{§§öh"š§§ž+'6886# 2::4(9:86" 2::4 ŭ(#û <@û.D!û =? ŭl]û£*û~ıYûĞ( #1¨—1  .Mċ^)ĵŭ“1 .QçíZ x§ÚÓ§m'³ôù´.}âŝѧh+´ġĝ°+ï ħöüûö<çĝŝŝï_ î(żü˙úö¨Aèĝŝŝí[ ŭ ·˙˙ûÙjBï˙˙üú2ü yâ˙˙ûÖfG˙˙üùĞ/ŭ#˙˙ûùŞEï˙˙üŝïQüĵû˙˙ûù¤J˙˙üŝíLŭ„Û˙˙üĥFï˙˙ŭûVŭÈ˙˙üŻK˙˙ŭĝRŭÚô˙˙üĥFï˙˙ŭûVü½û˙˙üŻK˙˙ŭĝRŭ—á˙˙üĥFï˙˙ŭûVü yâ˙˙üŻK˙˙ŭĝRŭ*Á˙˙ûŝ³Fï˙˙ŭĝUü%Ä˙˙ûŭ­K˙˙ŭġPŭ ·˙˙ûàxCï˙˙üûĵ8ŭ ğ˙˙ûŜsH˙˙üúı5ï µüŝŭüĥ(>ìü˙˙ôjï ıüŝŭüħ&Cíü˙˙ñgáÛ¸x+ĴÁöúÀ5ï ‡¸âÙ·s0­÷ù½23F°ĦF.B_ĉm4H³F,Bbèîi ñvfħĵ1ñyb"³ı. ô4- OTò6+PR $('$ "%**$ $('$ "%**$ ŭj““û`#Š““ŭ)ŭl““û\&‹““ŭ‹&ƒ˙8˙7˙6˙6˙6˙6˙6˙6˙6˙6˙6˙6˙6˙7˙8˙ı˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙˙˙ ˙˙˙˙˙˙ ˙˙˙˙˙˙ ˙ ƒ˙8˙7˙6˙6˙6˙6˙6˙6˙6˙6˙6˙6˙6˙7˙8˙ı˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙˙˙ ˙˙˙˙˙˙ ˙˙˙˙˙˙ ˙ ƒ˙8˙7˙6˙6˙6˙6˙6˙6˙6˙6˙6˙6˙6˙7˙8˙ı˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙˙˙ ˙˙˙˙˙˙ ˙˙˙˙˙˙ ˙ „ŝ  ŝ 8ŭBllŭI7ŭ ‰ÙÙŭ• 6ü?ż˙˙üÈF5ü‹ê˙˙üí” 5ŭŻ˙˙ŭı5ŭŻ˙˙ŭı5ŭŻ˙˙ŭı5ŭŻ˙˙ŭı5ŭŻ˙˙ŭı5ŭŻ˙˙ŭı5üžġ˙˙üö§ 5üYÎ˙˙üĠa5üüİ6ŭZ““ŭc8ŝ!!ŭıŝŝüüûüŭ*EEŭ.ûC5û1Dû@; ú(D'ŭrğğŭ}û@µ ûƒ¸Rû,Ħúkşkŭœŝŝüğ+à1xĝÏ7(9ÂûŠ0cñâO. #§ŝ§3"ŭ˙˙üâ| ßQ§Ċü됇ŞċŝÌU;˘ĵùó´š'lÙ˙Ù¨tüĞ˙˙üü³ ßwöù˙ŭÒ6Ç÷ü˙ĝXïùŝŝĝä; Ĵû˙û÷Ĵ üfĠ˙˙ŭıŭ|˙˙ûì‹0Î˙˙úŝÉU\ĝ˙˙ûìBkĜ˙˙ŭ² ü¤ù˙˙ŭıŭ|˙˙ûü=Î˙˙ûöŠ]ĝ˙˙ûìFŞù˙˙ŭ² ŭŻ˙˙ŭıŭ|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙üìFµ˙˙ŭ² ŭŻ˙˙ŭıŭ|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙üìFµ˙˙ŭ² ŭŻ˙˙ŭıŭ|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙üìFµ˙˙ŭ² ŭŻ˙˙ŭıŭ|˙˙úŝÚ?Ëŝ˙˙ûŝ”[ġ˙˙ûìF²ŭ˙˙ŭ² ŭŻ˙˙ŭıŭ|˙˙úï™*ê˙˙úŝ”=ĵû˙˙ûìBxß˙˙ŭ² ü­ŝ˙˙üŝ·ßzüŭ˙ŝÙB 8Íŝ˙ŭû’nòüŝüé=*´üŭŝüŻ üä˙˙üèˆ ßY¸ÑŭêŝÖ·j8ŻĊîÂŞ+w¸ÛḀü3ĥŭŭüÁ9ß"F…ĝÓG=Çú–F)ChÒaA-H˘ŻH1ŭ}ÊÊŭ‰ áH› ÇZ(›!fuŭ7ZZŭ< ûVDû?X'üD û,3ŭ++ŭ ŭ $$ŝüüüŭŭZ““ŭc ŭ„““ŭ7‹˙9˙8˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙8˙9˙ş˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙ ˙˙ŝ˙˙ ˙ ˙˙˙˙ŝ˙ ˙ ˙˙˙˙ŝ˙ ˙ ˙˙‹˙9˙8˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙8˙9˙ş˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙ ˙˙ŝ˙˙ ˙ ˙˙˙˙ŝ˙ ˙ ˙˙˙˙ŝ˙ ˙ ˙˙‹˙9˙8˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙8˙9˙ş˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙ ˙˙ŝ˙˙ ˙ ˙˙˙˙ŝ˙ ˙ ˙˙˙˙ŝ˙ ˙ ˙˙‹ù 8ùellc7÷>ÌÙÙÈ76÷ġ˙˙ñy6÷?Îü˙˙ûË86ŭPô˙˙ŭòG6ŭPô˙˙ŭòG6ŭPô˙˙ŭòG6ŭPô˙˙ŭòG6ŭPô˙˙ŭòG6ŭPô˙˙ŭòG6÷Háŭ˙˙ŭà?6÷(š÷˙˙ô•#6÷NŜG7ù%Š““‡!8ù!!ıŝŝüüü ù@EE?û6BûB6û.C ù/ŻğğĞ)û“´>û?³“û~¸U ĝ@ïŝŝî]ç+DÓĝtuöÓB+,ĵû1 ĝAï˙˙ĝ².ç’ŻìüÀCBÀüì‘ âŝϧd ÷ [ñ˙˙ŝìDç(×÷ŭ˙ôxxô˙ŭ÷Ö,+Áü˙úö“ ü.¨ĝ˙˙ŭòGŭ)ß˙˙ùüĵED½ü˙˙ûŜ8{˙˙ŭ˜ üKèŝ˙˙ŭòGŭ)ß˙˙ûòpoó˙˙ûŜAû˙˙ŭ˜ ŭPô˙˙ŭòGŭ)ß˙˙ûûxvŭ˙˙üŜBË˙˙ŭ˜ ŭPô˙˙ŭòGŭ)ß˙˙ûûxvŭ˙˙üŜBË˙˙ŭ˜ ŭPô˙˙ŭòGŭ)ß˙˙ûûxvŭ˙˙üŜBË˙˙ŭ˜ ŭPô˙˙ŭòGŭ)ß˙˙ûùvvŭ˙˙úŝÛAÈŝ˙˙ŭ˜ ŭPô˙˙ŭòGŭ)ß˙˙úŭÇOvŭ˙˙úœ+‰è˙˙ŭ˜ ŭOñ˙˙ŭFç(Üüŝŭ÷ƒuúŭ˙ŝÛF5Èŝ˙ŭü– ÷9Âû˙˙ùż3ç ì˳JUĥÏü  ‹èŝÙ¸n ÷ròŭŭîlç =WÌwE!F„öÖJ ;ÂúšF* ÷6½ÊÊı0è•8FŸ ‰Ĉ^ ùTZZR üAûUFûGÒ÷ˆF#&ñ!—*YĈŽ ù›K  ü Bû&W>ûDV ŝ"$$ŭ" ŭ$$ĝüüŭ#$$ŭ ŝ‹““ŭŠ% ŭf““ŭ_ŭ7““ŭ‚7˙7˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙9˙<˙:˙7˙7˙7˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙7˙8˙7˙7˙7˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙9˙<˙:˙7˙7˙7˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙7˙8˙7˙7˙7˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙9˙<˙:˙7˙7˙7˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙7˙8˙7˙7ŭ"Ĝ˙˙üŭp6ŭ"Ĝ˙˙üŭp6ŭ"Ĝ˙˙üŭp5ü&Ù˙˙üŭs5üeĉ˙˙üŝ˘.5ü%ĵĝ˙˙ŭj5ŭ-à˙˙ŭŝ‚5ŭ-á˙˙ŝ‚5ü$ı÷˙˙ŭág5üeĉ˙˙üŭ˘.5ö#½ĝ˙˙ŭu6÷iâ˙˙ŭp6÷êêèg7ĝ f~97ù## 8ú Wli(8ĝ°ÙÓW7ĝ ZŜ˙û–'6ö°ô˙ŝÛ[5ü V˙˙üŭ—$5ü!­ô˙˙üŝĜ_5ŭ-á˙˙ŝƒ5ŭ-á˙˙ŝƒ5ü'Ĉù˙˙ŭëp5üsé˙˙üŝ­85ö+Èú˙˙ŭy 6÷xĉ˙˙ŭp6÷)Ĉîj7ĝ v““’A7ù%%"8úGXV!9ù¤ÌÇM7ĝ MÙŭĝŠ7÷¤ñ˙ŭÒR5ö JŬŝ˙˙úŒ5üŸò˙˙üŝÍV5ü,Üŝ˙˙ŭû5ŭ-á˙˙ŝƒ5ü*Òü˙˙ŝƒ5ü‚ì˙˙ŝƒ5ü5Ü˙˙ŭ÷{6ŭ"Ĝ˙˙üŝÂL6ŭ!ġġüô‚6ŭާ§üI6ĝ.69759ü0;ü ‚;9ĝ*>Ár17÷ŽĴċÂĤJ6÷!Ñ÷üùġ‚6ŭ"Ĝ˙˙üŝL5ü6Ü˙˙ŭöz5ü‚ì˙˙ŝƒ5ü&Äù˙˙ŝƒ5üï˙˙ŝƒ5ü;Ŝ˙˙ŭŭ€6ŭ"Ĝ˙˙üŝÍV6÷"ÖüŝŭúŒ6÷œĵêÎĥR6ĝ “ŝ˙˙´ %Ŭ˙˙üüjŭkú˙˙úŜ0µ˙˙ë™Fí˙˙ïH ™ŝ˙˙¸%Ŭ˙˙üüjŭkú˙˙úëwXÒ˙˙óÀH"‰ô˙˙ġŠ$GÁ˙˙úÔX%Ŭ˙˙üüjŭkú˙˙úúÍ8§ġ˙˙óEÛü˙˙ŭÛHñ˙˙úġŞ)Ŭ˙˙üŭlŭlú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙û#hé˙˙ûŭž,ŭmú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙û:Àĝ˙˙üâdŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙üC˙˙üŝ{ŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙üCä˙˙ŭ|ŭmú˙˙üçAÀ˙˙ü¤Pô˙˙ûóR‚è˙˙û9ĵĝ˙˙ûŝßbŭlú˙˙üçAż˙˙ü¤Oô˙˙úóO:¸ŝ˙˙ûÂ#hè˙˙ûŭ,ġ[âŝ˙˙úÊ8ó˙˙ċïŒDÙü˙˙ŭĜAì˙˙ô¨&Áĝ˙˙ünġ.û˙˙ëwXÒ˙˙ċÀH"‰ô˙˙ġŠ!>ĥŝ˙ÔXlċ˙˙üjġYäêêË*Ĥêêċ‹ >ÙêêÛ@{èê¨ Âêêèaö-|nYöIvwòA~Z i~5ö "####ĉ!##! #### ö&ill]Klló>dlle>llöL Yli&ġRÓÙÙğ ™ÙÙĉ€ 9ÉÙÙË;ĜÙٜ´ÙÓQġ%‘û˙˙Ü%JÌ˙˙ĉ¸<{ò˙˙ô|;ıŝ˙˙ÎJ ^á˙ú‘%ġTĜŝ˙˙Ü)šî˙˙óè‚?Íû˙˙ûÍBè˙˙ôï›!´ġ˙ŭÚVŭlú˙˙ûċYÀ˙˙ü¤Pô˙˙üóT¤˙˙ûYĉ˙˙ûŭ’"ŭmú˙˙ûö²4À˙˙ü¤Pô˙˙üóT¤˙˙û6ħö˙˙ûŝÖ[ŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙üCċ˙˙ŭ|ŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙üCċ˙˙ŭ|ŭmú˙˙üçAÀ˙˙ü¤Pô˙˙ûóS˙˙û<Éú˙˙üêkŭlú˙˙üçAÀ˙˙ü¤Pô˙˙ûóPGÁ˙˙û'vë˙˙ûŝİ5ġ`êŝ˙˙ûÓ:­÷˙˙òô”Gáŭ˙˙ŭàE šŝ˙˙ġ-Ëú˙˙ŭs ġ6Şü˙˙í† fĜ˙˙òÉT(—ġ˙˙ö˜&“ŝ˙˙ġ{è˙˙üjġ cêÒ5ò”IàâL‹ïġ·+Êîdö4““f““óT"ˆ““‰$U““öp y““’=ö $%$!!ó!!!!ú!!ŝúVXH 8ùIÇ̧8ĝ…ĝŭÜR 7ĝNÎŭ˙ò¨7÷j÷˙˙ŝàN 6ŭmú˙˙üó£ 6ŭnú˙˙üŝá/6ŭnú˙˙ŭç16ŭnú˙˙ŭç16ŭnú˙˙ŭç16ŭhñ˙˙üŭÜ.6÷?ĥü˙˙•6÷nġġÙB7ù:˘§§8ù6:9/üûüüûA8ú+E"û => û#D,û6Bû5²™úvğ^û#Ĥ¨#û^ıvÛ‘´>0kġÙB%7´ŝ™/XèêW/™ŭ´6&Ù+@ÑĝuF¤Àûïš }İß˙Óa0 ·öö·Ÿ2aÓŝßİ€ Ù’­ìüÂBhòù˙ŭÛAı÷ü˙ûžHìĝŝŝĝëKžú˙ü÷ĵö&Ĝ÷ŭ˙÷ymú˙˙û•,À˙˙ûÑ`Mô˙˙ûóQ`Ñ˙˙ŭŭ'ß˙˙ûŝnú˙˙ûŭÚ>À˙˙ûĝšOô˙˙ûóSšĝ˙˙ŭŭ'ß˙˙üġnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙ŭŭ'ß˙˙ŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙ŭŭ'ß˙˙ŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙ŭŭ'ß˙˙ŭnú˙˙úŝä@½ŝ˙˙ü¤Nñ˙˙ûóTĦŭ˙˙ŭŭ'ß˙˙üümú˙˙úó£*ä˙˙û¤6´ĝ˙˙ûóQlÚ˙˙ŭŭ'ß˙˙ŜŝÊj÷ŭ˙ŝàL 0żŝ˙ŭü˘`íüŝüM$§ûŭŝüÀÙ'Ŭüŝ˙ûƒM´ÌüòĤ ‚ċ˙ܸv,ŞÂîĊŻ7k·ÖäıŒ ÙĦ½ïŭÎJEzôÜQ 6ğŭ£H-AaÒhC)F–¸J6Ú >TĠ÷‚<ÀĤ ‚Êh š)Z~ êžFVJ 9Z.ûEú(8ÛEV#&** $(+'!%)# $'($ŝ$$ŭù>““û o““óU"ˆ““‰$U““ŭp ŭW““ŭo  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙˙ŝ˙ ˙˙ŝ˙ ˙ŝ˙ ˙˙ŝ˙˙˙˙˙ ˙˙˙ŝ˙˙˙˙ ˙˙˙ŝ˙˙ ˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙˙ŝ˙ ˙˙ŝ˙ ˙ŝ˙ ˙˙ŝ˙˙˙˙˙ ˙˙˙ŝ˙˙˙˙ ˙˙˙ŝ˙˙ ˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙˙ŝ˙ ˙˙ŝ˙ ˙ŝ˙ ˙˙ŝ˙˙˙˙˙ ˙˙˙ŝ˙˙˙˙ ˙˙˙ŝ˙˙ ˙ üü üüŝûC7û.E û7BûC5ŭ1û:µ”ú~ğVû–´7û?·‘ ì„1rĝÔ<'8ĵŝ2Û,C×÷n1wû7(9LÂüí” ƒŞâ˙§fÛ–îüż=RĤĊŭ됈Şċqôù˙ŭÖ:Â÷ü˙úö–é*Ŭ÷ŭ˙örxöù˙ŭÓ5È÷ŭFvü˙˙ûî+È˙˙ŭ›ŭ+ċ˙˙úŝş@}ŝ˙˙öì‹*Ï˙˙pvü˙˙ûüÖ:È˙˙ŭ›ŭ+ċ˙˙ûġh}ŝ˙˙öüÓ7Ï˙˙xvü˙˙ü<È˙˙ŭ›ŭ+ċ˙˙üo}ŝ˙˙÷ß9Ï˙˙xvü˙˙ü<È˙˙ŭ›ŭ+ċ˙˙üo}ŝ˙˙÷ß9Ï˙˙xvü˙˙ü<È˙˙ŭ›ŭ+ċ˙˙üo}ŝ˙˙÷ß9Ï˙˙vtú˙˙û<Ċŝ˙˙ŭ›ŭ+ċ˙˙ûün{ü˙˙öß8Ìŝ˙NMÇŝ˙˙û5‡ç˙˙ŭ›ŭ+ċ˙˙úŝÇIQÊ˙˙éß1ê˙€ú˙ŝüà,4Ĉüŝŭü™Û+âüŝ˙ú|†ü˙ŝüŬ&7ÌüHÌŭ£ ‡¸äÙ¸pÛñüËDMÏŝïĵĦ ı÷×W? 4Hĥ›G+Ü ?VÚö|„úÔS> 6IBĦ}_ì£Â?GĈûVGü6)ûHVûWEŝûŭŭ "$$ŭ" ŝ$$÷üŭ&‹““ŭ‹' ŭ]““ŭlä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙äŭŭEŭğPûŝŠ1û˙ͧaû˙úö˙ŝ”˙ŝ”˙ŝ”˙ŝ”˙ŝ”˙ŝ”˙ŝ”ûŝŭü“ûĉÖ¸kû½•G)û„Yŭ:&ŭŭ #$$ŭ)““˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙˙˙ ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ ˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙ŝ˙˙ŝ˙˙(˙'˙'˙'˙'˙'˙'˙'˙'˙'˙'˙'˙(˙ŝ˙˙ŝ˙˙(˙ŝ˙˙ŝ˙˙(˙ŝ˙˙˙0˙8˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙8˙9˙b˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙˙˙ ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ ˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙ŝ˙˙ŝ˙˙(˙'˙'˙'˙'˙'˙'˙'˙'˙'˙'˙'˙(˙ŝ˙˙ŝ˙˙(˙ŝ˙˙ŝ˙˙(˙ŝ˙˙˙0˙8˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙8˙9˙b˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙˙˙ ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ ˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙ŝ˙˙ŝ˙˙(˙'˙'˙'˙'˙'˙'˙'˙'˙'˙'˙'˙(˙ŝ˙˙ŝ˙˙(˙ŝ˙˙ŝ˙˙(˙ŝ˙˙˙0˙8˙7˙7˙7˙7˙7˙7˙7˙7˙7˙7˙8˙9˙bŭ Żóóûž9äóóüêRŭ ³óóû˜?ċóóüçNŭ ·˙˙ûĤ<ï˙˙üú +ŭ ğ˙˙ûŸB˙˙üĝ)ŭĵ˙˙ûĞ=ï˙˙üŝéNüÀ˙˙ûC˙˙üŝĉJŭrÖ˙˙ûËO@ï˙˙ŭûVü\Ĝ˙˙ûÇLF˙˙ŭĝRŭñ˙˙ûñšDï˙˙ŭûVü¤ò˙˙û•I˙˙ŭĝRŭŞĉ˙˙üĥFï˙˙ŭûVü ‡è˙˙üŻK˙˙ŭĝRŭ<Ĉ˙˙ûŭ³Fï˙˙ŭûVü4É˙˙ûŭ­K˙˙ŭĝRŭ ·˙˙ûĉ†Cï˙˙ŭûVŭ ğ˙˙ûċI˙˙ŭĝRŭ ·˙˙û½3?ï˙˙ŭûVŭ ğ˙˙û¸1E˙˙ŭĝRï“í˙˙é…0Èû˙û×ÈEï –î˙˙ç€5Êû˙ûÖĈAïBĊ˙˙¸9r˙ó~VïEÈ˙ŝ´7vò˙ñ{V ‘ĜĜ€/ĈĜÊ8 ï ”Ĝ×{3ÈĜÇ5 úGkk>úbkdúHkk;úckc ï  )+) ŭŝ î%+*#ŭwúz#Aŭ`ö/~m^ŭPŭ7ÚèèúßJ}èèü³ġ^ĉèèÈ& Şèèŭ‘ŭ<ï˙˙úù“%@·˙˙üÛ` ġ0˘ŭ˙˙êr ğ˙˙ŭŸŭ<ï˙˙úŝâKî˙˙üö´übé˙˙úúÉ%½˙˙ŭĦŭ<ï˙˙üúW•˙˙ŭÎŭp˙˙û1NÓ˙˙üÁ?ŭ<ï˙˙üûW–˙˙ŭÎŭq˙˙ûä:Ħñ˙˙üëŒŭ<ï˙˙üûW–˙˙ŭÎŭq˙˙ûä>Ĉŝ˙˙üŝ ŭ<ï˙˙üûW–˙˙ŭÎüpŭ˙˙ûä>Ĉŝ˙˙üŝ ŭ<ï˙˙üûW–˙˙ŭÎûZŜŝ˙˙ûä:Ħñ˙˙üëŒŭ<î˙˙üúW•˙˙ŭÎü(–ŭ˙˙û1NÒ˙˙üÁ?ġ4Ġü˙˙ŝâKî˙˙üö´ôUäŝ˙úÉ%¤ô˙˙ŭĦġ€ò˙˙ù“%?·˙˙üÛ` ġ'—ú˙êrSÏ˙˙ŭŸġ5ĠèèßJ}èèü³ġPàèÈ&Ħèèŭötz#Aŭ`ö'{mVŭPö++î *+$ŝŝ!ŝ7llîR Yllk,(jll\ (ŭsĜĜíĤµĜĜ×^VÖĜĜş!'ŭ4­˙˙íÖR^˙˙ŝœ+'–ŭ˙˙çc&üwĉ˙˙úò¨.¸ö˙˙ġàcZŜŝ˙˙÷ĵ"&ŭ–˙˙üÎ9à˙˙üŝ|q˙˙ŭä+&ŭ–˙˙üÎ9à˙˙üŝ|q˙˙ŭä+&ŭ–˙˙üÎ9à˙˙üŝ|q˙˙ŭä+&ŭ–˙˙üÎ9à˙˙üŝ|q˙˙ŭä+&ŭ–˙˙üÎ9à˙˙ûŝ|_ĉ˙˙ŭä+&ŭ–˙˙üÎ9à˙˙úŝ{0˘ŭ˙˙ŭä+&ü†ò˙˙úĝğ4Ìû˙˙úïohü˙˙ŭä+'ŭKÀ˙˙òào|é˙˙ŝ³=^ü˙˙ŭä+'ŭ ‡óóò½)Íóóòp ZóóŭÙ)(ŝK““òo z““’<6‘““ŭƒ(ŝ$$ó)+* $$ŭ )úFZZ%2ùžÊÉU7ĝHĠŭü‘"7ĝžï˙˙ÔY6÷BÚŝ˙˙üz6ü›˙˙ŭŝ{6ü#Ŭŝ˙˙ŭŝ{6ŭ$à˙˙ŭŝ{6ŭ$à˙˙ŭŝ{6ŭ$à˙˙ŭŝ{6ü!Óü˙˙ŭôs6÷Œì˙˙ŝG6÷6Óööġ{7ùЧ§ĤD8ŭ)11ŝa˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙˙$˙˙ŝ˙˙ŝ˙˙˙ ˙˙ŝ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙˙ ˙˙ŝ˙˙˙ŝ˙˙˙,˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙+˙˙+˙˙,˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ŝ˙˙ŝ˙˙˙ ˙ ˙ŝ˙˙ŝ˙˙˙I˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙˙$˙˙ŝ˙˙ŝ˙˙˙ ˙˙ŝ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙˙ ˙˙ŝ˙˙˙ŝ˙˙˙,˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙+˙˙+˙˙,˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ŝ˙˙ŝ˙˙˙ ˙ ˙ŝ˙˙ŝ˙˙˙I˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙˙$˙˙ŝ˙˙ŝ˙˙˙ ˙˙ŝ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙˙ ˙˙ŝ˙˙˙ŝ˙˙˙,˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙*˙˙+˙˙+˙˙,˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙ŝ˙˙˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ ˙ŝ˙˙ŝ˙˙˙ ˙ ˙ŝ˙˙ŝ˙˙˙IüóóüŞ ŭ*Ùóóŭï[!üYÍ˙˙üĠa ŭ+ä˙˙ŭú_!üžġ˙˙ü÷¨ ü8ĉ˙˙üûi ŭŻ˙˙ŭı ü}ï˙˙üü˘0 ŭŻ˙˙ŭı ü/Çú˙˙üŝ` ŭŻ˙˙ŭı ü&Şö˙˙ŭüq ŭŻ˙˙ŭı ü Tê˙˙ŭùo ŭŻ˙˙ŭı ŭ+ä˙˙üŝÑS ŭŻ˙˙ŭı ŭ+ä˙˙üü‰ üŒë˙˙üî• ÷#ĵ÷˙ŭ×M ü?ż˙˙üÈF ĝdĉ˙ù‰!"ŭ ˆĜĜŭ” ĝ#ıĜÑH"ŭBkkŭH ú[kh!#ŭ++ŭ ÷ úö  ŭNŭUŭ>îi a~A&yr ŭ ”èèü ŭqèèíÂ"´èèĉ|NŜèèÑ6 üLĈ˙˙üÎSŭ|˙˙íċmbÜ˙˙ŝĥ?'”ĝ˙˙ï ü˜ñ˙˙üôĦ ŭ|˙˙úù7´÷˙˙ġí€Pàŭ˙˙ûÒ3 ŭ˙˙ŭıŭ|˙˙üÜ?Í˙˙ûŝ“]÷˙˙ŭì; ŭŻ˙˙ŭıŭ|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙ŭì; ŭŻ˙˙ŭıŭ|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙ŭì; ŭŻ˙˙ŭıŭ|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙ŭì; ŭŻ˙˙ŭıŭ|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙ŭì; ŭ˙˙ŭıŭ{˙˙üÜ?Í˙˙ûŝ“]÷˙˙ŭì; ü˜ñ˙˙üôĦ ükê˙˙úùÂ7´÷˙˙ġí€Pàŭ˙˙ûÒ3 üLĈ˙˙üÎSç5İŝ˙˙ċmaÜ˙˙ŝĥ>'”ĝ˙˙ï ŭ “èèü ègĉèèÂ"´èèĉ|NŬèèÑ5 ŭNŭUê5~i a~@&yr ŭ++ŭŝ úó  ŝ ŭBllŭH+ŭEllŭEŭ ˆĜĜŭ”+ŭ ŽĜĜŭ ü?ż˙˙üÈF)üC˙˙üBüŒë˙˙üî• )ü ’í˙˙üí ŭŻ˙˙ŭı)ŭ µ˙˙ŭ² ŭŻ˙˙ŭı)ŭ µ˙˙ŭ² ŭŻ˙˙ŭı)ŭ µ˙˙ŭ² ŭŻ˙˙ŭı)ŭ µ˙˙ŭ² ŭŻ˙˙ŭı)ü šñ˙˙ŭ² ŭŻ˙˙ŭı)üPÊ˙˙ŭ² üžġ˙˙ü÷¨ )üİ˙˙ŭ² üYÍ˙˙üĠa*ŭ¤˙˙ŭ² üóóüŞ*ŭœóóŭİ ŭZ““ŭc+ŭ^““ŭfŭ++ŭ úûúö$$ŭŭ7ZZŭ< ú LYVó%XYDDYX'÷UYYPŭ}ÊÊŭ‰ àĴÊÂ@UÈʜ›ÊÇZ?ÀÊʵ) ü3·ŭŭüÁ9 à Wâŭö}#’ûŭÓGFÒŭú–F){ôŭŭêd üä˙˙üèˆ ß!ô˙ŭÊFYĠŝ˙î˙ŝ×·kCÇû˙˙÷·+ ü­ŝ˙˙üŝ· ü Sç˙˙ëù~zŭ˙˙ŝÙB"Ìŝ˙˙ŭû’\ö˙˙ŭê; ŭŻ˙˙ŭı ü&İö˙˙ûŭĊL|˙˙ûï™3Î˙˙ûŝ”]ĝ˙˙ŭì; ŭŻ˙˙ŭı ŭ9é˙˙üùr|˙˙ûŝÚ?Î˙˙ûŝ”]ĝ˙˙ŭì; ŭŻ˙˙ŭı ŭ:ì˙˙üüs|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙ŭì; ŭŻ˙˙ŭı ü4Úü˙˙üüs|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙ŭì; ŭŻ˙˙ŭı üŒò˙˙üüs|˙˙üŬ@Î˙˙ûŝ”]ĝ˙˙ŭì; ü¤ù˙˙üú ü?ç˙˙ûòltġ˙˙úü;Âû˙˙úöŠWìŝ˙˙ŭì; üfĠ˙˙üÜn ŭ+ä˙˙êŭıCHÀŝ˙˙ìŠ%~ċ˙˙ŝÉU5Żú˙˙ŭì; üĤööü²" ŭ*Üööêós|ôööÒ6 -Ċööôcìööŭä9 ŭf§§ŭp ŭ•§§ê¤>E§§‰ §§T2Ÿ§§ŭš' ŭ11ŭ! ŭ ,11ú011ú)%11ú/11ŭ- H ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙˙ ˙ŝ˙ ˙˙$˙˙ŝ˙ ˙˙ŝ˙˙ ˙ŝ˙˙ ˙ŝ˙˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙ ˙ ˙ŝ˙ ˙˙"˙ ˙ŝ˙˙ ˙ŝ˙˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙ ˙ ˙ŝ˙˙˙˙ŭ˙ ˙ ˙ŝ˙˙˙˙ŭ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙ ˙˙ŝ˙˙B ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙˙ ˙ŝ˙ ˙˙$˙˙ŝ˙ ˙˙ŝ˙˙ ˙ŝ˙˙ ˙ŝ˙˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙ ˙ ˙ŝ˙ ˙˙"˙ ˙ŝ˙˙ ˙ŝ˙˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙ ˙ ˙ŝ˙˙˙˙ŭ˙ ˙ ˙ŝ˙˙˙˙ŭ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙ ˙˙ŝ˙˙B ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙˙ ˙ŝ˙ ˙˙$˙˙ŝ˙ ˙˙ŝ˙˙ ˙ŝ˙˙ ˙ŝ˙˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙ ˙ ˙ŝ˙ ˙˙"˙ ˙ŝ˙˙ ˙ŝ˙˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙ŝ˙ ˙ ˙ŝ˙˙˙˙ŭ˙ ˙ ˙ŝ˙˙˙˙ŭ˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙ŝ˙˙ ˙˙ŝ˙˙B ÷MċóóáE ŭ‘óóü¸ŭS÷(š÷˙˙ô•# ŭ˜˙˙üŬl ŭ,ž÷Hâŭ˙˙ŭà@ ŭž˙˙üĝ·ŭOäŭPô˙˙ŭòG üK˙˙ŭÊŭXġŭPô˙˙ŭòG üï˙˙ŭÊŭXġŭPô˙˙ŭòG ŭİ˙˙ŭÊŭXġŭPô˙˙ŭòG üĤŭ˙˙üŝÇŭVóŭPô˙˙ŭòG ü}˙˙üì—ŭ@ĈŭPô˙˙ŭòG ü1³˙˙üÍAŭv÷?Ïü˙˙ûÍ8 ÷{ç˙˙î˜ŭ;÷ġ˙˙ñy ÷7°˙˙ÈGŝ÷=ËĜĜÇ7 ĝvĜĜ•ŝ ùekkc ù9kkH#ù (++' ĝ++%ŝ ù wu ŭCŭ]ŝ$÷DÚèèÖ= ŭ €èèŭŞ ŝA÷"Œö˙˙ó‡ üBı˙˙ŭğŝH÷EÛŭ˙˙üÙ= ü†ï˙˙üĵŭKŭOó˙˙ŭòF ü?ğ˙˙üÓPŭ…ŭPô˙˙ŭòG ü‡é˙˙üñ£ŭEÑŭPô˙˙ŭòG ü§ŝ˙˙üŝÈŭWôŭPô˙˙ŭòG ü§ŝ˙˙üŝÈŭXġŭPô˙˙ŭòG ü‡é˙˙üñ£ŭXġŭOó˙˙ŭòF ü?ğ˙˙üÒPŭWġ÷EÛŭ˙˙üÙ= ŭ š˙˙ûó¤ŭKŜ÷"Œö˙˙ó‡ ŭ˜˙˙üÏUŭ%‘÷DÚèèÖ= ŭŠèèü ŭJ ù wu ŭLŭVŝ$ ù (++' ÷#++" ŝ ùellc ŭ9llŭO!÷>ËĜĜÇ7 ŭwĜĜŭž ŝ÷ġ˙˙ñy ü7°˙˙ŭğŝ÷@ü˙˙ûÍ8 ü{ç˙˙ŭğŭ;ŭPô˙˙ŭòG ü1³˙˙üÍAŭwŭPô˙˙ŭòG ü}˙˙üì˜ŭ@ĈŭPô˙˙ŭòG üĤŭ˙˙üŝÇŭVóŭPô˙˙ŭòG ŭİ˙˙ŭÊŭXġŭPô˙˙ŭòG üï˙˙üġ­ŭXġŭPô˙˙ŭòG üK˙˙üĜ^ ŭXġ÷Hâŭ˙˙ŭà@ ŭž˙˙üżŭOä÷(š÷˙˙ô•# ŭ˜˙˙ŭğŭ,ž÷MċóóáE ŭóóŭ²ŭS ù%Š““‡! ŭW““ŭlŝ) ù (++' ŭ$$÷ŝŭĝ ùTZZS ú JYVñ#WYYJ û˙˙ü÷Ž ÷.¨ĝ˙˙ö¤)ŭ)ß˙˙úüĵEvŭ˙˙ôí&{˙˙ŝÌX ÷ YéööċR ŭ(×ööúñxrôööôÔ; *Áööġ” ù*œ§§™%ŭ‘§§ú£CM§§ġ‹ |§§ĤX ù .11- ŭ+11û011ú)%11ŝB˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙G˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙G˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙Gŝèóóŭä> ŭ ¨óóü¤ü híóóŭ×+ŝĝ˙˙ŭï@ ŭ °˙˙üÑ^ü8­û˙˙ŭâ-ŝŝ˙˙ŭï@ üµ˙˙üö£ üdëŝ˙˙ŭâ-˙ŭï@ üWÑ˙˙ŭ´ ŭpú˙˙ŭâ-˙ŭï@ ü¤ó˙˙ŭ´ ŭpú˙˙ŭâ-˙ŭï@ ŭÀ˙˙ŭ´ ŭpú˙˙ŭâ-˙ŭï@ ü½ŝ˙˙üŝħ ŭnĝ˙˙ŭâ-ŝû˙˙ŭï@ ü é˙˙üĉ† üQŭ˙˙ŭâ-ŝġ˙˙ŭï@ ü;Ċ˙˙üĵ6ü‰ù˙˙ŭâ-ùÌû˙úÉ3 ÷ Žë˙˙é… ÷MĠŭ˙÷ğ$ùxò˙ït ÷BÀ˙˙ı<ĝ!‰ĝ˙ċeù6ÇĜÄ2 ù ‹ĜĜ ĝIÏĜ¸&úcka ùCkk>ú!gk[ù)+) ĝ++$ĝ *+(ŝyŭx ŭPŭRŭ0{ŭqŝÜèèŭÚ: ü–èèŭ•ŭWáèèŭÎ)ŝò˙˙ŭï@ üOÈ˙˙ŭ¤ ŭ_÷˙˙ŭâ-ŝò˙˙ŭï@ ü ›ò˙˙ŭĤ üc÷˙˙ŭâ-ŝö˙˙ŭï@ üJË˙˙üDü'•ú˙˙ŭâ-ŝü˙˙ŭï@ ü šï˙˙üì üXÚŭ˙˙ŭâ-˙ŭï@ üŝ˙˙üŝ² ŭoù˙˙ŭâ-˙ŭï@ üŝ˙˙üŝ² ŭpú˙˙ŭâ-˙ŭï@ ü šï˙˙üì ŭpú˙˙ŭâ-˙ŭï@ üJË˙˙üDŭoú˙˙ŭá-ùŭ˙˙üĠ8 ŭ²˙˙ü ÷`ċŝ˙˙ùÈ'ù÷˙˙ñ‚ ŭ °˙˙üÁH÷/Ħû˙˙ètùŬèèÒ8 ŭ  èèŭŒ ÷_áèèĈ+úxs ŭXŭJù/{lú)+& ÷$++ ù *+$úcla ŭCllŭEú!gl[ù6ÈĜÄ2 ŭ ‹ĜĜŭ‹ĝIĜı&ùxò˙ït üBÀ˙˙ŭ¤ ĝ!‰ĝ˙ċfùÌû˙úÉ3 ü ì˙˙ŭ ÷MÖŭ˙÷ğ$ŝġ˙˙ŭï@ ü<Ċ˙˙üĵ7ü‰ù˙˙ŭâ-ŝû˙˙ŭï@ ü é˙˙üĉ† üQŭ˙˙ŭâ-˙ŭï@ ü½ŝ˙˙üŝħ ŭnĝ˙˙ŭâ-˙ŭï@ ŭÀ˙˙ŭ´ ŭpú˙˙ŭâ-˙ŭï@ ü¤ó˙˙üñ™ ŭpú˙˙ŭâ-˙ŭï@ üWÑ˙˙üÊQŭpú˙˙ŭâ-ùŝ˙˙ŭÜ: üµ˙˙üİ÷dêŝ˙˙ûÏ)ùĝ˙˙ò‘ ŭ °˙˙ŭ¤ ÷8­û˙˙ëƒùèóóŬ@ ŭ ¨óóŭœ÷ hìóóÑ2ú‹““… ŭe““ŭ^ù7Ž““|ú"$$  ÷(++(ù%*+$ù9ZZ5úVZL ù €ÊÊwĝAÁÊĞ ÷6ıŭŭ°1ĝ}ġŭáX ÷ä˙˙áx÷FÈü˙ô­!ö ŝ˙˙ŝ´+ü~÷˙˙ŭà-ŭ °˙˙üßxüIÄü˙˙ŭâ-ü"ş˙˙üŝħ ŭnĝ˙˙ŭâ-ü sŜ˙˙ŭ´ ŭpú˙˙ŭâ-üó˙˙üö¤ ŭpú˙˙ŭâ-üe×˙˙üÑ^ŭpú˙˙ŭâ-ü¸˙˙ü­ühŝ˙˙ŭâ-ŭ °˙˙ŭ¤ ü@ıü˙˙ŭâ-ŭ ŞööŭžüsööŭÚ,ŭs§§ŭkŭ>˘§§ŭ”ŭ"11ŭ ŭ011ŭ+ F7˙7˙6˙6˙6˙6˙6˙7˙7˙7˙7˙7˙8˙9˙7˙7˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙8˙7˙7˙7˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙@7˙7˙6˙6˙6˙6˙6˙7˙7˙7˙7˙7˙8˙9˙7˙7˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙8˙7˙7˙7˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙@7˙7˙6˙6˙6˙6˙6˙7˙7˙7˙7˙7˙8˙9˙7˙7˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙9˙7˙6˙6˙6˙6˙6˙6˙6˙6˙7˙7˙8˙8˙8˙8˙7˙7˙7˙6˙6˙6˙6˙6˙6˙7˙7˙7˙7˙@7ŭ!Ïóóüñk6ŭ"Ĝ˙˙üŭp5ü.Û˙˙üŭy 5üsé˙˙üŝĴ85ü$ĵ÷˙˙ŭéo5üŸò˙˙ŝƒ5ü Jà˙˙ŭü6ŭ"Ĝ˙˙üŝĜ`6ŭ"Ĝ˙˙üŭ–$6÷ħġ˙ŝŬ[6ĝ ZŜ˙û–'7ĝŻĜÓV8ú Vki(8ĝ'+* 7ŭlŭ~87ŭĊèèüĉf6ŭ"Ĝ˙˙üŭp5ü&Ù˙˙üŭs5üeĉ˙˙üŝ˘.5ü$ı÷˙˙üŝáh5ŭ-ß˙˙ŭŝ5ŭ-ß˙˙ŭŝ5ü$ı÷˙˙üŝáh5üeċ˙˙üŝ˘.5ö"żĝ˙˙ŭs6÷iâ˙˙ŭp6÷½èèĉf7ù f~88ù"+* 8ú Wli(8ĝŻĜÓW7ĝ ZŜ˙û–'7÷²ġ˙ŝŬ[5ü V˙˙üŭ—$5ü!ô˙˙üŝĜ`5ü-Ŝŝ˙˙ŭü5ŭ-á˙˙ŝƒ5ü&ù˙˙ŭéo5üsé˙˙üŝĴ85ö+Èú˙˙ŭy 6÷xĉ˙˙ŭp6÷'Çóóñk7ĝv““’A7ù"+*&8úHZX"8ĝ£ÊÄN7ĝ MÙŭĝŠ7÷£ñ˙ŭÑR6÷"Öŝ˙˙ûŒ6ŭ"Ĝ˙˙üŝÎV5ü;Ŝ˙˙ŭŭ€5ü‘ï˙˙ŝƒ5ü&Äù˙˙ŭñv5ü‚ì˙˙üŝ¸B5ü6Ü˙˙üŭ6ŭ"Ĝ˙˙üŭp6ŭ!Ñööüôm6ŭާ§üJ6ŭ*11ŝ@˙˙˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙)˙˙(˙˙(˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙(˙˙(˙˙+˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙&˙ ˙&˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙&˙ ˙&˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙ŝ˙%˙-˙.˙.˙.˙.˙.˙.˙.˙.˙-˙-˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙@˙˙˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙)˙˙(˙˙(˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙(˙˙(˙˙+˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙&˙ ˙&˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙&˙ ˙&˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙ŝ˙%˙-˙.˙.˙.˙.˙.˙.˙.˙.˙-˙-˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙@˙˙˙˙˙ ˙˙ ˙˙ ˙˙ ˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙)˙˙(˙˙(˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙' ˙˙(˙˙(˙˙+˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ ˙&˙ ˙&˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙'˙ ˙&˙ ˙&˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ ˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ ˙ŝ˙˙ŝ˙%˙-˙.˙.˙.˙.˙.˙.˙.˙.˙-˙-˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙˙@ŭfïóóûĠ4·óóó•HâóóäJ–óóŭşŭ‘óóŭ·ŭkú˙˙ûí†)À˙˙óÉT(—ġ˙˙ö˜*SÉ˙˙ŭü˜ŝ˙˙ŭÀŭkú˙˙ûüÓ<À˙˙óô”Háŭ˙˙ŭáK”ô˙˙ŭü žŝ˙˙üÄŭlú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙ŭüI˙˙üÛ` ŭmú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙ŭüˆë˙˙üġŻŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙ŭüoÛ˙˙ŭÌŭnú˙˙üçAÀ˙˙ü¤Nñ˙˙ûóTĦŭ˙˙ŭü%­˙˙üŝÉŭmú˙˙üçAÀ˙˙û¤<Âú˙˙ûóRxá˙˙ŭü˜ŝ˙˙üî™ŭlú˙˙üçAÀ˙˙û¤lñ˙˙úóN.°ŝ˙˙ŭü˜ŝ˙˙üÑCàUÚŝ˙öѸ4™Íì˙˙é„1Ĉù˙üÎ=vċ˙˙÷yĉ˙˙ï›à%‘û˙àkPB]Â˙˙¸;pí˙ô|3Ĵŭ˙ÎJ÷4Żŝ˙ÌHàRÓĜ³! ĜĜ€ /ÂĜÊ;rÖĜ›ĝu×Ĝ™ú&hkX òDkk>`kdú6jkLú8kkKĝ *+(û  úú ĝ#*+&ŭ5}ŭn(ŭLŭ`ŭaäèèüÊ,'ŭŠèèŭŻŭkú˙˙üëw'ü˜ŝ˙˙ŭÀŭkú˙˙üúÌ*'üšŝ˙˙ŭÁŭlú˙˙ŭĉ0&ü=ĵ˙˙üÖRŭmú˙˙ŭç1&ü†ê˙˙üòŭnú˙˙ŭç1&ü§ŝ˙˙üŝÊŭnú˙˙ŭç1&ü§ŝ˙˙üŝÊŭmú˙˙ŭç1&ü†ê˙˙üò¤ŭlú˙˙ŭĉ0&û<ğŝ˙˙üÖR÷\äŝ˙˙úÌ*'ü…î˙˙ŭÁ÷-û˙˙ëw'÷@¸ŝ˙˙À÷YâèèÊ,(ĝĉèèŻù-|n*ùB~`ö)++% ó  ö  ù*+&ö&ill]Kllç>dlld>kllL Ylh& ú8klKġRÓĜĜş™ĜĜó€ 9ÉĜĜË;ĜĜġ›³ĜÒQ ĝu×Ĝ™ġ%‘û˙˙Ü%JÌ˙˙ĉ¸<{ó˙˙ô};¸ŝ˙˙ÎJ ]á˙ú’$ ÷4Żŝ˙ÌHġUÚŝ˙˙Ü' ›ï˙˙óé„?Ïû˙˙üÎCƒé˙˙ô ĥö˙ŭÛV÷zĉ˙˙ï›ŭlú˙˙ûċYÀ˙˙ü¤Pô˙˙üóT¤˙˙ûYĉ˙˙ûŭ’"ü/³˙˙üÑCŭmú˙˙ûġ²4À˙˙ü¤Pô˙˙üóT¤˙˙û6ħö˙˙ûŝÖ[ü|˙˙üî™ŭnú˙˙ûŝä@À˙˙ü¤Pô˙˙üóT¤˙˙ûBâŝ˙˙üüzüĤŭ˙˙üŝÉŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙üCċ˙˙ŭ|ŭ¨˙˙ŭÌŭmú˙˙üçAÀ˙˙ü¤Pô˙˙ûóS‹î˙˙û;Çú˙˙üèiüï˙˙üġŻŭlú˙˙üçAÀ˙˙ü¤Pô˙˙ûóOGÀ˙˙û'vë˙˙ûŭ¨5üI˙˙üÛ_ ġ`êŝ˙˙üÓ;­÷˙˙òô”Háŭ˙˙ŭáE šŝ˙˙ġ.Ëú˙˙ŭs ü ò˙˙üÄġ5İü˙˙í† eĜ˙˙òÉT(—ġ˙˙ö˜&“ŝ˙˙ġ{è˙˙üj÷LÁŝ˙˙Àġ cíóóÔ3Żóóò•GâóóäJŒòóóġş)Ìóóñe ĝ ‰òóó·ö4““f““òT"ˆ““‰$U’““öp y““‘= ùM’““o ö)+) ++ĉ#*+( '++)#+*& ŝ$$ìXZJ ?ZZö4PZTó.YZ@ JZW ï JYVIÄÊĤ ÊÊĉv)´Ê½4hÈʐ ĤÊÄIîİÊF…ĝŭÜQ =ĊŭŭĉŻ1céŭñp)˘ûŭÈ= PŬŭĝ†î Rßŭ÷‚MÍŭ˙òĤ é˙˙ċàx,·÷˙úÀ7kÛŝ˙ꏧò˙ŭÏNîİó˙ŭÎKjĝ˙˙ŝàL½ŝ˙˙úŝ˘`í˙˙íñM$§ŭ˙˙ŝÀLâŝ˙˙û‡ŭ'Ŭ˙˙ûû„mú˙˙ûó¤0À˙˙û¤6´ĝ˙˙ûóQlÚ˙˙û2˘ó˙˙ûŝËQŭ'ß˙˙ûŝÊnú˙˙ûŝä@À˙˙ü¤Nñ˙˙ûóTĦŭ˙˙ûBâŝ˙˙üŭzŭ'ß˙˙üŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙üCċ˙˙ŭ|ŭ'ß˙˙ŭnú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙û>Óü˙˙üñqŭ'ß˙˙ŭlú˙˙üçAÀ˙˙ü¤Pô˙˙üóT¤˙˙û+…î˙˙ûŝ´>ŭ'ß˙˙ŭkú˙˙ûŭÚ>À˙˙óĝšJèŝ˙˙ŝçN™ĝ˙˙û9à˙˙üŭy ü%Óü˙˙üġkú˙˙û•,À˙˙óÑ`.÷˙˙ĝĤ0`Ñ˙˙û%Ŭ˙˙üüjöŒí˙˙ŝgòööûÙ@ıööó TçööèW žööûĵ$Ġööüôfö8ÔööôyF¤§§û }§§ò`'š§§œ(`Ĥ§§û §§ŭE÷‹§§B011û*%11ó -11. 11û%*11ŝŭ)11ŝ?˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙$˙ ˙#˙ ˙"˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙˙ŝ˙˙˙˙˙ŝ˙˙˙˙˙ ˙˙˙ ˙˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙˙˙ ˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŝ˙˙ŭ˙˙˙˙˙ŝ˙˙˙;˙:˙8˙7˙'˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙$˙ ˙#˙ ˙"˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙˙ŝ˙˙˙˙˙ŝ˙˙˙˙˙ ˙˙˙ ˙˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙˙˙ ˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŝ˙˙ŭ˙˙˙˙˙ŝ˙˙˙;˙:˙8˙7˙'˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙$˙ ˙#˙ ˙"˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙˙ŝ˙˙˙˙˙ŝ˙˙˙˙˙ ˙˙˙ ˙˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙ ˙˙ ˙˙˙ ˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŝ˙˙ŭ˙˙˙˙˙ŝ˙˙˙;˙:˙8˙7˙'üNçóóŭċ? ŭ™óóŭ² !ü(ĝ˙˙ŭñC ŭ ˙˙ŭş !üIĉŝ˙˙ŭñC üĤ˙˙üż ŭQĝ˙˙ŭñC üMÈ˙˙üĜ[ ŭQĝ˙˙ŭñC üí˙˙üôŞ ŭQĝ˙˙ŭñC üuŜ˙˙ŭÇ ŭPġ˙˙ŭñC ü'´˙˙üŝÄ ü;Çû˙˙ŭñC ŭ ˙˙üì” üsô˙˙ŭñC ŭ ˙˙üÍ? ÷6Ëû˙ûË5 ÷€è˙˙î– "ĝvñ˙òv ÷7µ˙˙ÈD"ĝ4ÇĜÈ4 ù|×Ĝ” $úbkcú öTÑŝ˙£÷1ĵù˙ùĵ0ïġ˙üËDZĠ˙˙ï½Ħötû˙˙ŝüà(üfñ˙˙ŭîBŭ+˙˙ôú}{ü˙˙ŝüŬ"üOvü˙˙ŭ)ü5ıú˙˙ŭñCŭ+ċ˙˙úŝÇI}ŝ˙˙ŭß"vŝü˙˙ŭ)ŭPġ˙˙ŭñCŭ+ċ˙˙ûün}ŝ˙˙ŭß"üxvü˙˙ŭ)ŭQĝ˙˙ŭñCŭ+ċ˙˙üo}ŝ˙˙ŭß"üxvü˙˙ŭ)ŭQĝ˙˙ŭñCŭ+ċ˙˙üo}ŝ˙˙ŭß"üxvü˙˙ŭ)ŭQĝ˙˙ŭñCŭ+ċ˙˙üo}ŝ˙˙ŭß"üpoó˙˙üüÖ&üLìŝ˙˙ŭñCü)Ĝŭ˙˙ûġhuġ˙˙üüÓ öEDğŭ˙˙îü/Ğù˙˙ŭñCġ‘˙˙ŝş@Hż˙˙üì‹ĝvóööĠ:ü Zëööŭè@ġ;Ùööôr|ööüÒ5ù@¤§§Œŭ+§§ŭ,ñ§§<EĤ§§Šù011)ĝ .221. ö*11011ŭ)û?= :û'Ğ9ĝ\êT37ĝ+°÷ġ´,6÷ [ìŝŝ÷ç@&˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üSêóóü,Ħú˙˙üOéŝ˙˙ŭXû˙˙ŭXû˙˙ŭXû˙˙ŭVĝ˙˙ü@Ëü˙˙üx÷˙˙ĝ;Ïü˙úĠù{ô˙vù8ËĜĈ/údkbù)+'ù$ztĝKßèèÔ5ĝ%”ù˙˙ò†ĝLŝ˙˙üâŭWû˙˙ŝŝŭXû˙˙ŭXû˙˙ŭWú˙˙üEÖŭ˙˙ü†ĝ˙˙ŝŝĝBÛŭ˙üâù‰ġ˙ò†ù?ÚèÔ4wt)+'ll7gllbĜĜrCĜĜĈ/˙˙Ĵ3†ĝ˙˙v˙˙ċvF×ŭ˙˙ûĠ˙˙ü”Xû˙˙ü”Xû˙˙ü”Xû˙˙ü”Xû˙˙û”Jàŭ˙˙û”%“ù˙˙úò…Sö˙˙úÀJGġ˙˙óú… Dêóó“úJ)““$ô $*+*%úTZRù1½Ê¸(ùnñŭíhĝ5Áú˙ùĊükô˙˙ŝüü9½û˙˙ŭVĝ˙˙ŭXû˙˙ŭXû˙˙ŭXû˙˙üRŝ˙˙ü2Żû˙˙ü `îööŭ/ §§ù/2211û@< û+£ùaíáO6ù/´ùô²§ù`ïŝŝ÷ġ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @1˙7˙7˙7˙6 ˙5 ˙5 ˙5 ˙5 ˙5 ˙6˙6˙6˙7˙9˙:˙ŝ˙˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙1˙7˙7˙7˙6 ˙5 ˙5 ˙5 ˙5 ˙5 ˙6˙6˙6˙7˙9˙:˙ŝ˙˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙1˙7˙7˙7˙6 ˙5 ˙5 ˙5 ˙5 ˙5 ˙6˙6˙6˙7˙9˙:˙ŝ˙˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙8˙2ŝ!!ŭ6ŭW““ŭo 6ŭŭµ6ü˜ŝ˙˙ŭÀ6ü žŝ˙˙üÄ4üI˙˙üÛ` 4üî˙˙üöħ4üoÛ˙˙ŭÌ4û"Ğŝ˙˙ŭÌ5ü˜ŝ˙˙üî™5ü˜ŝ˙˙üÑC5÷wċ˙˙ïš6÷5Żŝ˙ÌH7ĝu×ٙ8ú8klK9÷ ŝ 7ŭpŭ~37ŭ$Íêêŭèc7ŭ'ß˙˙ŭŭĤ7ŭ'ß˙˙ŝè7ŭ'ß˙˙8ŭ'ß˙˙8ŭ'ß˙˙8ŭ'ß˙˙8ŭ'ß˙˙8ŭ'ß˙˙8ü"Ċù˙˙ŝê7ĝoĉ˙˙ŭĤ7ù'×˙˙ün˙7˙7˙7˙7˙7˙7˙7˙7˙8˙8˙:˙:˙ ˙#˙ ˙"˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙ŭ˙˙˙ŝ˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙˙˙7˙7˙7˙7˙7˙7˙7˙7˙8˙8˙:˙:˙ ˙#˙ ˙"˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙ŭ˙˙˙ŝ˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙˙˙7˙7˙7˙7˙7˙7˙7˙7˙8˙8˙:˙:˙ ˙#˙ ˙"˙ ˙"˙ ˙"˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙!˙ ˙"˙ ˙#˙ ˙$˙˙ŭ˙˙˙ŝ˙˙˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙ŝ˙˙˙ŝ˙˙ŝ˙˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙#˙˙ü/Ğù˙˙ŭñC6üMîŝ˙˙ŭñC6ŭQĝ˙˙ŭñC6ŭQĝ˙˙ŭñC6ŭQĝ˙˙ŭñC6ŭOó˙˙ŭñC6ü5¸ú˙˙ŭñC6÷hïûŝûìA7ĝ1ŻÄïÄŻ07ĝCdÔcB8ù#ž!9üD 9ĝ "$" ŝ!!ŭ"ŭ&‹““ŭ‹' ŭ]““ŭl!üPäŭ? ŭ—ŭ° !ü)ĝ˙˙ŭñC ŭ ˙˙ŭş !üIĉŝ˙˙ŭñC üĤ˙˙üż ŭQĝ˙˙ŭñC üMÈ˙˙ü×\ ŭQĝ˙˙ŭñC ü”ï˙˙üġ­ ŭQĝ˙˙ŭñC üuŜ˙˙ŭÇ ŭQĝ˙˙ŭñC ü$³˙˙ŭÇ ü;Ĉû˙˙ŭñC ŭĦ˙˙üì” üsġ˙˙ŭñC ŭ ˙˙üÍ? ÷7Éû˙ûÉ5 ÷~ç˙˙í• "ĝvñ˙òv ÷8´˙˙ÈD"ĝ4ÇÙÈ4 ù|Ĝٔ $úclcú3B3x44˜5 527İ?YEŝŝí  í  ë"('"%(& ë"('"&(% ë 6JUUJ;15CQWRB, ê 6JUUJ;15CQWQA+é4YzŒ{bRWo…ˆoL)é4Z{ŒzaRXo†‡nK(é Fw˘ğş£‚mu“²ż·™k= é Gx£ğı˘‚mv”²żĥ—j<é(UŒĵÖĠ½˜ˆİËÜĠ·†P& (U½ÖĠĵ˜‰ŞÌÜÔµ„O% 1b›Ëä˨•µ×éċʙ`/Ï0a›Ëä˧–ĥĜéäȘ^.>rĞÖëêÖĥžĦĵÜîìÔk6Î;p¨ĠëêĠµžĦ½ÜîìÓ¤i5 J‚ıßßĴĞÂßïÙĴp: Î F}µŬïŜÂĞĞßîĜŞo8 %RŒÁċôóäË´²ĊàÛs; Î "M†ĵâóòÊ´²ĈàñÚ­q: %R‹ÁäóòäÊ´ħĊßïïÚs; Î "L…ğáòòʳħĊàïÙĴq: IµÛîîŜÁݨÛîîĜĞp9 Ï DzħÙíîŬÀݨżÜîíתo89j ËäĉÒ²——²ÓèèÒ¤j6è7gžËċÒħ—˜³ÔèèÑ˘i5é)R…´ÓןžÂÚÜĖ^.é(Q…´Óמ‚ŸÛÛ”\-é ;h—¸ÀĴˆigƒİÂĞ~L$ é ;h˜¸ÀЇih„İÂŞ}K# é'Lv•žlPMe‡ŸĦŠb8é(Mw–žkPMfˆ  ‰a7ê 6Ys{lP96Jh}~jI(ê 7Zt{kP97Ki}~jH'ë-KafV=**>Ylm[< ë.KbfV=*+?ZmmZ< ë 4SjlX<*.EdxxcA! ë 4TjkW;*.Fdxwb@ ê%Hn‡‡nM9?]€—–zQ)ê%Hoˆ‡mL9@^˜•yP)é7cĞގiRZ{˘ıµ•d4é8dĞݍhRZ|£şµ”b3é&O€ÉÈ­ˆpv—½ÓÌŞuA&N€ÉÇĴ‡pw™ÓÌİt?7gœÈŜŬǍ‘ÏâÛş†N$ Ï5dšÇŜŬĈ¤‘ŻâÛı„M#  G}²ÙìëĜğ¤ĵÚêċȖ\-Ï CxŻ×ëêĜğ¤½ÚêäĈ”[, $QŠżòñâɲ°ÄŜîëÑ˘h4Î !K„ğàññáȲ°ÄßîêĦf3 %RŒÂäóòäË´ħĊßïî×İn8 Î "M†ĵáòòÊ´²ĈßïíÖ¨m7 !K‚¸ŬïïßĴŞÀÜîîĜĞp9 Ï F}³ÛîïŜĴŞÁŬîí×İn8mœ½Ä°Œnlˆ­ĈÇŻ‚O&é >m½ÄŻ‹ml‰ÇǁN% é*P{›¤’qTQjŒ¤e; é+Q|›£‘pTQkŒd9 ê 9\wpT<9Mk~iG'ê :]xpS;9Nk~hF&ë-KbgX?++>WgcN1 ë.LbfW>++>XgcM1 ë1PfhU:)+A\jbI+ë1PfgT:(,B\jaH*ë "ChiH5;Vv„yX4ë #Di€hH5;Wv„xW3ê4^‰¤ˆcMTt˜¨štG" ê4_Š£‡cMUu˜§™sF" é $J{İĊ¨ƒkq’ĥĈı’`3 #J|ŞÄ§‚kr“ĥĈ¸^24c˜ÄÜÛĦ‰ŞËÛĴyE Ï2a–ÛÚ ˆĞÌÛÏĞwD  DyŻ×êéÖıĦ˘şĜçàÁW*Ï@uĴĠééĠ¸Ħ˘ğĜçßÀV) $P‰âòñâɳ°ÄŜíéΟe2Î !KƒıßññâɳħÄŜíè͞d1 %SċġġéÒĵ¸ÈàïíÖ¨m8 Î "N‡½âóôèÒĵ¸ÉáïíĠ§l7 "M†ĵáóġêÔ¸ÈßïîĜĞp9 Î I¸ßòġêÔ¸Èàïí×İn8BwŻĜîòçÏ·ħÁÚëëÔ§l7 Ï>tĴ×îòĉηħÂÛëêÓk65fËäéÜÁ§ ħÍááɛc1è3dœËäéÛÁ§ ²ÎáàȚa0é)UЏÒÖĈİŒ„—ĥÌÌ´‡S(é(UЏÒÖĈ¨Œ…˜·Ì̳…Q'é Cr›³µ¤†jbu”ŞĞ”j> é Ds´ĥ£…icv”ŞĞ“i= é1Tu‡ˆx^F@Qm‚ƒnL*é3YzŒ‹y^FARn‚‚mK)ë 8P^^P;*(7OabP4 ê%A\ieS<*(7OabO3 ë (\oo]F7=UtІjB ê1X|Œ‚eH8=VuІiA é3Z™š†jY^yšŻİ‰Z/é !Etħ¨ŒlY^z›Żİ‡Y.é Dv£Á|€šğÍÇtB è/\ğÏÊħ‘|€›ĵÍĈ¤rA é(TŒğĜṴ̈š›³áÛ½‹T(Ï>q¨ÑäáͰš›´ÑáÚğ‰S'2cœËĉëŜĈ°­ÁÛëç̝c1Ï I·ŬïîßĊŻÂÜëĉ˛b0r§ÍÚÎŞuA/ G€·ÜéŬş„K! / !Mˆżïä‹P$ / #O‹ÂċñĉĊŽS% / #P‹ÂċñçĊS% / "N‰ÀäċQ$ / JƒşßìཇM" /Aw­ÓàÔ°zD /4c•ğÉĵ™g70ò%Jt–£—wM'1ò0NhriP2 1ò +;A<- 2ô  4ö 7üyĝŝúûŝö  ä    ô$)%      ó 4HQK9"â,61#$26,+65(/6ò/Ssy^; á7P\U?)"-CW\M4$$6M^\I2#%8Q]ñ @o™­ƒV- á 6Yyˆ}`D=Li‚‡rS>AXw‹‰rS?@Xwˆñ %O…´ËÄĦn< á)P| Ż£ƒe^q‘Ğ­—t^c~ ´²šy``zœŻñ/_—ĈŬ×µ€H  à6fšÀΣ…~“³Ê̵”„ ÀÓÒ𚁁šğÍ:n§Òçàż‰O#  à?uĴÓá×ĵĦšĴÉŜàÍŻšž¸ĠĉäѲ›œ´Ñà D{³ÜìċĎR%  àC{´ÜëäεĴşĠèëÜ­ŻĊßîíÛÁ­°Çàë K…½âïĉĊT%  àD~·ßïëĜÀĥÂÚìäÍı¸ËñàÇĥğÑç "OŠÁċòèĈT%  àD~¸àñíÛĸÚíòèÒ½şÌñàÉıżĠéñ #P‹ĉñçĈT%  àD~·àìĜż³½ÖëñèÒĵ¸ÈàïïàÈ·ĵÒè "OŠÂċñĉĎS%  àC|µŬìċβ¤°Ëäíä͵×éêÛÂŻ²Èàë !L‡âîÁŠP#  à?vĠÙĵ›‹˜ı×äÛÂĤ›ŞĊÛß´žŸµÏŜ F~µÚçÜ·‚I  à8iÑĢ}lzžÂÒÉ­ŽŒ¨ÀÈı„—´Ĉ á,T‚Ĥµ§ƒ]L[¤µĞm]gš£–zb^q O÷5ġ  3ó+33*2ó 7P``O6 1ñ2X|’‘zV00ñ !Gw˘ğşĦuE 0ñ+Y××½W)/3f Îĉċ̝c1/ï7m¨ĠììÔj5.ï9oĞĜîîרm7.ï9pĞÙîî×İm7.ï8nİ×ííĠ§k6.5i£ÑéèĦf30ñ.^–ÄŬŬ“[,0ñ $M€­ĈĊĞ}K# 0ñ9b‰ Ÿ‡`70ñ$A^oo\?"1ó$5@?4#3ġ5÷ 7üi ĝóù ġ  ç   ó  ((  ċ    0!ó*@OPB,  &35**53&!06U=$ò !Cf~€lK) ,EY[I/.I[YF/"' ñ.Zˆ§Ĵ•k>  á(Il„…lI11Il…„mP=B\zˆ§‡[2ñ;mĦĊË´†Q& á =h’ĴАhKLhĞ­•u_c~ ŻĈtA ñ G~³ÖŬǙ`/ á %OƒħËÉŻ‡kk‡ŻÉÌ·–€ƒŸÎĜ·ƒK! (UŽÁáçÑ£h4 á+[”ÄŬŜǤŠŠ¤ÇŜßÌŻ›ŸıÔáâÀŠP# ï0aœÌèëĠ¨l7 á.`œÍçé׺££ğĜêéĜ­³ËâëċQ$ ï5jÔìí×İn7 á/bžëïádz³ÈáïíŬÄĥĠéĉčR$ ï8oŞĜïïĜŞn7 á/bžëñäÍşşÎċòîŬĊ¸ÁĜìñċR$ ï9pĞÙïïĜİn7 á/bžëïâʸşÏĉñìÙÀ³½ĠêâÁ‹P# ï9oŞĜîîרl7 á.`œÍçéÚÀݳÊâíĉϳ¤ŻÊì׸„L" ï7l§ĠëëÓ¤i5 á,\”ÜÜÈ­œ¤ÙäÙ½œŒ˜¸ÖÂuC 2dÌääʛb0 á &Q„°ĊÂЏ€‹İĈÒĊ£~lzÁџ†]4ñ*VŒşÔÓıŠT( é @j˘œ…i]jˆ¨µ¨„_MZ~£´ Àûŝú üè   û ĉ      ú.ä '44(+52$#16-ùR:! /H[ZF,1L\WC,")?U]P7ù|]: â,Mo†ƒhE/3Mp†‚jM=E`}ˆyY6 ĝ¤U-á Bn–­İ‹dJNm”­Ğ’q^eƒ£°Ħ}P)ĝŸm<á)U‰µÌÇŞƒimŒ³Ëʳ“…£ÁÎÀ™f6ĝÖ²|E á0ašÈßÜĦˆŒİËßŜÉĴšĦĵ×áÓĴt?ĝßşƒI à3g£ÑéèĠ·˘ĤżÛëéĠğĴµÎäëÜ´{Cĝ⽅K à4iÔìîŜĊ²ĥÌäìÚÂĥÀ×ëïß·~Dĝ†K à4jĤĠíâÊıĵÒèòíÚ¸Ûíà·~Dĝ…K à4jÔíïàȸĵÒèñëÖ½³żĜëß·~DĝàğƒI à3h£ÑèèׯĥÎäíä˰¤²Îċìܵ|CĝĜ´}F á1c›ÈŬÚĊŞœ§ÂÛä×ı™‹›ĵÙĠv@ĝĈ£p>á+W‹´ĈÀ¨Œ€Ž­ÉÑž{l}˘Äѝi8ĝ݇Z0á !Eo“˘šg^mŞµ¤[L^ƒ§µĤ‚T,|ŝ:û 9ú$8ù$;M8ù ;a€8ù&P‚Ş8ù/_—Ä7ĝ9mĤÒ7ĝ D{²Û7ĝ $Pˆâ7ĝ)W‘Ċĉ7ĝ(VÄċ7ĝ $N…şß7ĝ ?r§Ñ7ĝ.[ĵ8ù Cr 8ù.U~9ú >`9ú 3Q9ú ;Y8ù+Pu8ù @m—7ĝ,Wе7ĝ=o¤Í7ĝ #Lƒ¸Ŭ7ĝ(Vċ7ĝ)W‘Ċĉ7ĝ %Pˆ½à7ĝ BvĞÔ7ĝ1_“À8ù "Gw8ù1Zƒ9ú !@c9ú 3Q9ú 7V8ù(Lo8ù T9ú ,?9ú 0E8ù'Ea8ù ;cˆ8ù &N€Ğ7ĝ0_–7ĝ:mĤÒ7ĝ Bx°Ú7ĝ F}µŬ7ĝ CyħÛ7ĝ;o§Ó7ĝ1a™Ĉ8ù'Q„Ż8ú >iŽ?üġüŝ Ô      Ñ(&!!&($!$ ## $!$(& ÑVSG817FSWO?,"(9IOG6&#.@MMA/#&6GOI9'!*=NVSD- ю‰u]Q\t‰„kN?Ga{„x]E?QmnR@E]x„{`D9GeŽˆpL(ĵĥœ|mzšĥż²”q_jЍ³„f`v˜°°˜wag„³¨‡cScˆĴ½µ•e7ĜÒµ‘€Ž²ÜÒ´’ŠŞÈÓĊ‡€–¸ı—‡ĊÓÇ~jy ĈĜ­wBċßÄĦŽ›½ŬêÊĞš¤ÁÜċĜĵĦ›ŻÎââΰœĦĵĜċÚ𕁍ħĠĉŬğ†M# ìçÏŻœĤÄáïë×ĵ­ĥÏĉí˳żÚëìÛÀ³Ëîäʨ– żŜíċĈ”Z,ÏñíÙĵİŻÉäòïŬĊ·żÖëòéÓ½¸ÈààȸĵÒèñêÓĥĤ°ÌĉñëĦh5ÏôßĊ²µËċòàÈğÙìóêĠÀĵËññâÊı½Òèòì×ĵŻşÔêôïÖİp:ÏóŜÄħ´ËäñïßÈğÂĜìòêĠÀğËâññáÈ´ĥËïêÖĵŻıÓéóîÖİp:ÏïìĜğ§ĞĊáîÜÄ·żÖêñèÒĵ·ÈàïïŬÀݧ½ÙéĉÑ´¤­Èâïê g5ċÌĞ•œıÙêèĠğĴ´ÍäìáɲĴĜééĠ³–‘§ÇŬŬĈ—µĠĉáĒZ+ĠÒğ—†ĤÉŬÚħ—ĦĵÖßÓ¸ž˜ĞÈÜÛĞ}tŠŻÉ˳ŽuzšżÖÓµ‚K" ĵ½€fl‹°ĊÁİŠyƒĦĵĈıœ€zŽŞƒ`Vk­°—qW[{˘½½ o>™œ‡eMPlŽ˘ž‡hXb~š£—z_Yl‹  ‰dD;Np‹vTOk~~jK1+[mhP0щƒgG8De‡™’vVHVv“‘tZTg†››†hTXrŽœ’tP9;VwŠ‚c= ­†bQ`„İğħ‘nas—ĥÁ´—{u‰İżİŠu{–´Áĥ–nSWu𭤁S+Ëāo| ÄÔÉ݆z²ÛÏ´š”§ĊÙÙĊ¨”š´ÏÛѲŠqv•¸ËŸm= àÚÀžŒ–ĥĠÙ𛑣ĊàêàÇŻŞĵÖèè׽аÈàêáĊ˘Œ“ħàĜ¸†Q'ÏìèÒµ˘¨ßëÊ£³èçÑğĥÇßîïßÇĥğÑçéѳ˘ĞĈàíĉʛc2ÏòïŬ°³ÊïêÖĵħĵÖëòêĠÀğËâññâÊş½ÒèòëÖğ¸ÒéóíĠ¨o:ÏóßĊ²´ËñíÛÄ·ÀĜìòêĠÀĵËâññáÉĥ¸Íċë×½°şÓêôîÖŞp;ÏíٽݭĈáîÜÄ·żÖëñèÓ½¸ÉàïïŜĴĴÂŜíêĠıİħËäëÑ£i6èċɟĵÛëéÖ½·ÏĉíÌ´ŻÀÚëê×·œš³ÓçĉѰšŸşĜèǕ\-ÙĜšƒŠŞÍàŬÈĞ›¤ÀÙáÖğ˘œŻËßŜȤ‡… ÄÜŜÇ£‡‡˘ÄÙÖ·„N$ ÀÂİ„kp´ÉĈ~ˆÀʽ …“²ÇĈ݊ml‰ŻÉ˵pk„¨ÀÀ£r@Ÿ˘ŒiQUq“§˘Šl[d€š£—{a\oŒ  ŠiQRlĤİ–tVObƒ›œ…[2Ñ{~kM99H_oo_F46KevxjR:3@Xlo^@" ÑdeR:*.C\h`I0"#0/!#2>@6%ÑheO5'/G`i]B'     ҃}bC4@^{„sP-     租€]LZ}§“j> ŝŝüïĈż |jw›ğĊ²‡U+.ïŬ×ĵš‡’²ÛÊ˘m;.ïëĉ²ŸĤÁÜçÛ·ƒL" .ïòïŬÄħ³ÊâíċĊ“Y*.ïôóäÍşşÎċê͜a/.ôñĉÏğşÍäëžc0.ñâÉ´³Ĉßìç̚_..çñ×ğ¤˘·ÓŜÀW).ïĠÔÀĦ‰‡žĵÎÉĞ{H! .ìµ²žfe{šĴ¨‹`6 ûŝñ‰†sXCCWs„€gD$  í  Ĝ_\L7(*YjdK1%,AV]O7%$3K]]K3$$6N\V@&Ô +qlXA7A\z‹ƒfH=KgˆuV?@VtŠŠtV@?Ut‡eB#Ó(H›—€eXb€ °Ĥ†g]nŞŻšx_a|³³|b_w™İŠ_5Ó =hÁ§‹{„˘Á·}°ÉÍı—€‚ÒҞƒ€—¸ÌÇİxE Ó %O‚ÚÚĈŞ™ŸşĠâÙż˘™İĈŬàϲ›µÓċċÓĥœ²ÏàÛĵ‰P$ Ó+Z“éêÙÀ­°ÇàìĉĥиÒçëŜĊŻŬîîŜŻĊŜëäĐU& Ó.`›ïñÌııÍċìÙÁµż×ëĉÏş·ÉáñâʸşÏĉçǒW' Ó/bžñóĉÏĵĵÏċòîÜĊ¸À×ìòéÔşÊáññËğÓèñèȓW' Ó/bžïñäÍşşÎċñíÚÀ²ğÓéñéÔ½·ĈŜîâÊıĵĉçȒW' Ó/bžêëܰ²Éáíç´¤­ÈâíĉÏĥĵĠèëŬÄħ²ĈŜëäĊU' Ó.`œŬŬÊŻ£½ĜäÛż‹–µÔŬĨ›§ÂÙßÒ· ž³ÎŜÙĵŠQ$ Ó+[•Ĉ‘€Š§ĊÒĈ€lx›żÑËŻŠżÈ𠆁•ħĊ¨zG Ó &Q†˘ž‡l^i‡ĤµŞ‡`MX|˘µ­o^e™£˜}d^o‹  ‰b8û @m ÀóúŜ   Û     Ù   %35*,62$$27/× &35*-62#EY[J2#&8O]V@)",BX`S;"× ,FY[I1"&8P]V?k„…oP=B[xˆ~aEi“ĴĴ’p]fƒ˘°£ƒ°Ëʲ‘~†¤ÂΤ†~‘²ÍĠĊ m<Ġ &P„²ËÊħ~‡Î£ŜŜÊ­šĦğÖâĜ½Ħ™ŞÈàçĜ²|E Ġ,\•ĊŜŜÉĴ™Ħĵ×â×ĵÌçêÚÀ­ħÈáìċϵĞıÔéïàğƒI Ġ/bÎèêÙż­²ÉâìċÎÏëâ˸ıÎċìÙÁµÀĜìñ†K Ġ0d ÑëïáÊ·şÏĉñëĜìñċÎğğÎċòîŬĊıÂÙìñ†K Ġ0d ÒìñäÍşğÏĉòîÜëÊĥĥÊâîŬĊ·Ġê†K Ġ0d ÑìâɵĥËñîÜÍèëÚ¨§ÚëëÙż´Ëâëßğ„J Ġ/bžÏéëÙ½§¨żÛëëĜĈààËݏ¨Êàâϲ ¸ÒßĠ³}F Ġ-]—ÇààʨŞËáâδÎδppŒ³Í𛃃šĥĈÀ o=Ġ'SˆĥÏͳŒppŽ´Îş—ħħ–nQPm•ħ³œ{b_tĦ‚Y0ï An™²°”lPQn–ħ²›@@@Ŝú ö  ġ    ô$27.ó)",CY`S:!óDrĞÖíñ˵²ĊàïÚr; Î;o¨ĠíÊ´²ĈàïÙĴq:6hĦêïáȲŻÄŜïîÙ­r; Î4f êîáÇħ°ÄßïîĜĞp9,[•ÇäèĜğ¤¤ĵÚëêÔ§m8,[•Çäè׺¤½ÚëêÓĤl7 #N†şÙÜĈ­ÏâßĈšc2é $O‡ğÙÛĊ¤Œ‘âŜĊ˜a1éAt§ĈÇ­ˆpv–ğÏÉ­Q(é Bv¨ĈĈĴ‡pw—ĵÏÈĴ€O'ĉ1]Ч§ŒgQYzŸħİŠb: é4`ŽŞİhRZzŻĤˆ_8 ċ !Bg~fH7@^~Ž„gD& 'Jq‰‡mL8=Xu„z_>"ä)BRQA-$0KfsiP3 !=\onX;('7LUM9"ä "++#0KeogP5# )5<8+ ä#3;9.!'@\lkX<$(-(Ç <_{‡hK89K`kdN2 %B\jgT=1:Ur„‚mL, É(N{žĴĤmX[sœ”vN) Ñ5k§ÖîñäÍĵżÓéòéʕY) ?vħÛïîÜÁ°µÍĉóñŬµ}E Ñ5jĤÖîñäÍĵżÓéòéʕY) ;pŞÖìíÜÁݵÌċóñŬµ}E Ñ3h¤ÓìâʸğççȓW( 2cœËĉé׺İÂŜîí×Ĵt>Ñ0bœÍçêÚÀ­ħÈàëâÁŒR% 'R‡ıÙàÍĴ’“­Ïää͟f4Ò)WŽÙŬÊ­™œĥÒŜÔ²~H  >nĦĊÎğ–xw’¸Ó֎V)Ò FwÀݐ{š¸Ĉ½ši:,T„¨³Ÿz[Xr™¸¨zH Ò2Y€™›ˆkX]x•¤›{Q+  >f‡~[?;Qt‘˜‡a8Ó :Vhj[F9@Yt‚z_="1Qkq`B*$2Lbi]C&Ô/:;2'$1JdqjS7$!*34." 4OcfT7)6;4& Ġ 2Ro}v]C5;N^bVB35Idvt_>! × !Aj•{^Q]x”„iSTjˆš–{S-á,WˆŻÁıž€s‚ ıwwÀşœm> á8kĦÉÛÔğž’ĦÖÛ˗–ÊÛÔĥ„N$  áByħÙéäδݷÑċêÜ­ĴÁÛéĈ”Z* á G€ıàïë׿µÂÚíä͸¸ËïêΜ`. á IƒĵâñíÚşĈŬïòĉÏĵşÍäñëџc/ á IƒĵâñíÚÄğÇŜïòĉθµÈàïëÑ d0 á HşáìĜÁ·ÄÛîñÉŻŞĵĜëêÑ d0 áC|´ÜìçѸğĠèìŬ ˜ĴÌäçϟc0 á;p§ÏáÚÂĤ›İĈÜáÏ­‹‚˜½Ùßɛ`. á0]¸Ê¨Š~ĴĊÊ·“rj¨ĊÍşY+!â "Fp”¤œƒf[k‰˘¨–tVPf‰¤ĞœxJ$ !â-LfsmXB:Hc|‚tW=7Gau{pV6 " *;B>2$"/H`j_F.$*9EHB3"ä %A]kcI- !$í  *Nq„|^9  û 'ŝí ;fĤž{M&+(QƒŻĊğ•a1/8hžÈÚϧp;/ H~³ÙĉÙħx@/ 'UŽÂíŬµ|C/+\˜Ëèïßĥ|C/,^šÍêïŜµ{B/+[–ÉĉìÚ°v?/ &R‹ÜâΤl8/ñ Dw¨ÇÍı[-0ñ2\‡¤Ş—qE! 1ò >^uzkM-1ó#7FI?- .Xˆ­ğ‹\0à ;_Ž‚b@1>^€ƒfI;BWmvkT?;Jbsò Ai‰–‹lD" Û $=Vc[A(&?YdY@*$3CJB1"):Hò0QmxoT3Ú! !2;6&$5;3# #(" &ò-LgrhN/Ù3BHE8&     ò 7\z†{^: Ù 6Wp{u_@"  ò&MyœŞž|O)î&MzĴ£…Z0ŝŝ5d—½Ë™g71`•½ÎĊ˘p=Aw­ÓàÔ°{D q§ÍÚÎŞuAñ %O„³ÉÀ›i:0\²À´`3 >l–Ş |O( ò "Eo’qH$Ŭ+NpxZ6 ò3Uq}sW5 Ŭ 1HTM9#   ò,LgqhN/Ü &,)&4?A;.! ,8<5(%2;:/ò 5Xv‚w[7 Ŭ %@\osjU?5=Rek`J86E[ihU9 ò$It–¤˜wL& Ŭ 2[„ŸĤ›€cVa}•sZWlˆ›˜Y23`’¸Ĉş•d5 áu×êçÓıĴ·ĉìàÇħ­ÁÚêĉ̛a/@tŞŜÒ­xC  á6hŸÉŬÙÂĤ˜£żĜŜѵœ™ËÜÙ½V)3`’¸Ĉş•d5 á*U†°ÄżĤˆy…£½Ċĥ˜~{Żż¤vE ò$It–¤˜wL&á =fŠœ—cVa}•ŽsZWlˆ›˜Y2 ò 5Xv‚w[7 á&C]jfT?4=Rek`J85E[ihU;"ò,LgqhN/â$3;9.! ,8;5(%2::/"%05ò3Uq}sW5 â  ,EZbò "Eo’qH$ $Dj‰”0\²À´`3÷2^Žħ>q§ÍÛÎŞuA#÷?s¨ÍÚ H€·ÜéŬş„K! #÷ I‚ıŬé "Mˆżïä‹Q$ #÷ "O‰Àï #O‹ÂċñĉĊŽS% #÷ #O‰Àä #P‹ÂċñçĊS% #÷ K„ĵáî "N‰ÀäċR$ #÷ Cy²Úì JƒşßëཇM" #÷8k£ĉAw­ÓàÔ°zD $ĝ-[“Ŭ5d—ĵ˙g7#÷ #LŻÊò&LyœŞ|O) ùóô Ù,W‰³Ĉĵœyjzž½Ċ°ŒolˆÇȵ™…‰£ÂĠÒĥ†Q&  F~µÚçÜ·‚I Ù >p¤ÌŬĠı—‡”µÒÛÊŞ‰ĦÄÜàÑ·£¤şÖĉȗ^- !L‡âîÁŠP# Ù $N…ıŬëċͰŸ¨ÄŜèÜÁĤŸ³Ñçìàɵ´ÇàîêÑĦe2 "OŠÂċñĉĎS% Ù+Z“ĈĉòîÜÁ°µÌäî縯½ĜìñçѽğÌñíÔ¤h4 #P‹ÂċñçĊS% Ù-]—ÊéġòËığçñìÙÁ·ÂÚíòéÓżĵÍäñîĠĤi4 "OŠÁäĉčR$ Ù)X‘ĊĉôóäÌşğÏĉñíÛ¸ÂÙìòçѽşËíĠĤi4 K…ĵàí⿈N" Ù #M„şàñàdz´ÉáîêÖ½ħğÔèî˵²ÄŜîìÔi4 Cz°Ö׳}F Ù?tĴĠèçĠı˘£şĠäßÉ­ ĞĈŜä×ĵ¤ĦµÒċĉÏĦg37gšÀΝk:Ù3c˜ÂĠӟ‡ˆ Ïɰ“„ÇÏÀ£‰…›ğÑÔÁ—`0ñ(O{ĞŸ}R*Ú(P£´°š{de}šĞoamŠ£Ğœfcx—³¤€R(ò 4Up{qW6 Ú :\w„€mTABUmzvbJ>H_t{nWB@Qk~„y^< ò 1BIC3Ú#7HOL@/#$0@IF9)"(7EIA2$#.?LPI9%ĝs_@#ñ DsŸ¸·qB  ŝâ+JguoZD;Fb€ŽƒcA2=]ŽH:&ñ1W}““{V/û  ċ,?JE5%(=Vc\B)%>Xc&ò$CbvuaA"Ü  !!'$ !1;7'$5; ó !>\oo[< Ŝ *\on[< ò*H`gZ?"ñ'Ij~iG&ò2Uq|oQ.ñ7a‰Ħ ‡_5ò #Gq“Ÿk? ñ #K}ݨzI" ñ5a‘µÀƒP& ñ-\“ÂÛÚÀ‘Y+ "I|ÏĜ—_/4h˘èçΟe2ï0_•ĊáĉÒ§o;ï8nİÖíìĠĤk6ïsĞÖìíÚħ{E  ŝ 4h˘èçΟe2ï3eÌä˞h7 ŝ ñ-\“ÂÛÚÀ‘Y+ñ)V½ÖÓµ…R(ŝ ñ #K}ݨzH" ñ Gz¨żı™j< ûñ7a‰Ħ ‡_5ñ8c‹ž˜zP*úñ'Ij~iG&ò)Kk}x`? ú0# ó !>\on[< ó :WjkZ=!ùZD)ò%FfzzeD$ò 8XrykM,ùˆjC! ñ4\ƒšš‚Z2ò #EnŽ™Šf< ĝħ]1ñ !Hx¤½½˘vE ñ2]Œ°ğİM$ ĝͨs?ñ+Y××½W*ñ FxŞËÔÀ“].ĝܸI 3f Îĉċ͝c1ï.[‘ÁŜä¤l9ĝÀ‰O" ï7m¨ÖììÔj5ï;nĤÒêíÛ²{D ĝċŒQ$ ï9oĞĜîîרm7ïCz²Ûïñáğ…L"  ÷ċčR$ ï9pĞĜîî×İm7ï D|´Ŭñò⽇M"  ÷äčR$ ï8nİ×ííĠ§k6ï?u­ĜîŜĥH  ÷âŒQ$ 4i£ÑéèĦf3ï5h ÏèêĠŞq= ÷Û½‰O# .^–ÄŬŬ“[,+YÁŬßȚb1 ÷É~I ñ %N€ÈÇĴ~K#  "J~­ÉÌ´‡R' ÷¨’j= ñ :eާĤc8î:f§İ•nA íyiL,ñ)LnƒƒmJ(Ú)HfxyjN/    G>, ó !>\oo[< Û */"'$ '.,# &  ò$CbvuaA"Ü  !-BMH8&&9MYUE.(=K ñ1W}”“{V/û  ĉ )Ii{v_F;D_{‹†nM52Fcxñ DsŸ¸·qB  ŝè :f§£Šn_h†Ĥ¸²–oQNg‹˘ ñ*VŒşÔÓıŠT( è "JÇÇħ•„‹§ĈÖµomˆĴ 2dÌääʛb0 è)WÁÜßδ˘ĤÙçâɊ‹ÇÙ ï7l§ĠëëÓ¤i5 è-^™ËçëŬĈ´ĥÊâïëĠĥĦ¤½Ùĉ ï9oŞĜîîÖ¨l7 è/aÏêäÎĵĵĉòîÛÀ°ĥÍäí ï9pĞÙîî×İm7 è/bžìñĉÑçòïŬĊ·żÖê ï8nŞ×îíÖ§l6 è/bžìñċϽ½ÑçòîÜĊ¸ÁĜë 5jÓêéÑ˘g3 è/bžÏêïáÊ·şÎċë×ħğÓèí /`™ÇàßĈ–^. è.`šËäĉ×½Ĵ°ÇßéáÊ ĞĊŬ ñ&P„²Ëʰ‚N%  è+Y½ÓÓÁ§—ž·Î×̲“„­ÇÎ ñ 1@b‚Ž€_; Y@' û  /AJC3$*@XcY?&(B[cV=$ 3#!Ĉ !!"'# "3;5$&6;2" !&8EIC5"Ĉ ,>GH>.   (:EHB3 &Cav|rZ: Ċ,LiyzlQ2   )Gdw|pV6  :d§Ÿ}Q(ï ?k“Ş­›xM'ŝŝá ?j‘İ­œxK$ &O‚°ÌÑż–`0 %O„²ÍÑż˜f6 â*Uˆ´ÍşY+0`˜Çáä΢h4ï/_—ĈáĉĠŻyC  â4fžËââʛa/6kÓêëÔĤk5ï:n§Óìáĵ…L!  â;qĞ×ëêŸc09oŞ×ííÖ§l6ï E|³ÜñóċÁŠO#  â>v°ÛïìÑ d08m¨ÖííÖ§l6ï !Jƒşàòô俈N"  â=tÙîëÑ d03f ÏéëĠĤk5ï I¸Ŝññ߸H  â8m§ÔêêŸc0+Y‘áĉÑ£h4ï@uĴĠêêÔİr> 0`˜Èċ͜a/ !H|ŻÓÜȚa/ï2a—ÄŬÜ”^0ä $N‚µĠÛĔZ+5c–½É·‹U(ñ $K}ĴÈÇŞzI" ä:i›Àɲ„O$ %JxŸ­œsD ñ6aŽŞİŒ_4ä(P~˘­˜n? 6]~‹}Z3ó$Fm‡‡mG$ċ :a‹yU/+KgqfI*ó3SjlX9 ċ/OiqcE'.LendK-ó-KbgW; ċ1PgnbG) =a|†{_< ò 6Xt{lM+ċ !Ad~…x[7 *R~ŸŞ|O'ñ'Ku•žŒf;ä.XƒĦŞšvI# 6f™Êğ“^/ñ9g–·żŞ}J" ;lžÁÉ·X* Bx­ÒŬÌĦg4ñ&O‚³ÒÖżY+ H~³ĠÜȚ`/ %Pˆ½ŜçÓĤk5ï5e›ÉċÎĦh6)VÁáĉϟc0.^—ÉĉêĠ§l6ï BwĜííĜv@ â2džÍçéÑ d05h£ÒêìÖ§l6ï J‚ıßññŜĥG  â:oİÖìëÑ d08nİÖííÖ§k5ï J‚ıàñŬĥ~F  â=uŻÚîëÑ c09nİ×íìÓ¤i4ï CzħÚíìÖĞt? >uŻÚîêϝa/5i£Ñèç͝c1ï8k¤ċâǘb3 :pİĠéċȖ\,.^•ÛÚżW*ñ-\”Á×°L$ 3d›ÇÜĜşˆQ&  $L~ŞÁĤxG ñ $M€ĴÀ·”d7ä(Q„ÄżĦrA 7aˆŸŸ…]4ñ =hŽŸ•uK&ä  6]~Š{W1ñ&Jr˜†a8ċ :aŠwS-%KxŸĴ›sC ñ6c‘²şyG ä(P~˘Ĵ—m> 5c–½É·‹U(ñ $K~ÍÓĵV*ä:iœÀɲ„O$  !H|ŻÓÜȚa/ï3a˜Ĉà̞f4 $N‚µĠÛĔZ++Y‘áĉÑ£h4ï@uĴÖëì×Ĵt? â0`˜Èċ͜a/3f ÏéëĠĤk5ï I¸ßñŬĥ~F  â8m§ÔêéŸc08m¨ÖííĠ§k5ï !Jƒşàòñß·G  â=tÙîëÑ d09oŞ×íìÔi4ï E|³ÜïîÚ°xB >v°ÛîêϞb/6kÒéèΞd1ï:n§ÓéèÑ£k8 ;qĞÖêĉɘ],0`˜ĈŜÜÁ‘Y+ï/_—ĈßŜĔ\- 4fžÊßÚ½‹S' &O‚ŻÇĊŞ|I" ñ %P…³ÌËħ‚M$ ä*Uˆ³ÉÄĤvD  ;d‹˘ ‡_6ñ @m–­­”k= ä ?j‘§£‡\3(D`qp\?"ñ/SuˆˆsQ-ċ*Lm€~gD#&(7A@5#ó"?\nmZ=! ç 5RfgU7 I9%ó :XlkW8 è.MejY; u\: ó #Ej‚‚iD" é 7]{„rN*žR*ñ/Z‡££‡[1ì&LyœĤ’h;›h7 ñ=p˘ÁÂvE ë7e—ğĀL# ÒxA  !JµĠĜ[.ë #JħÒÙÁ‘Y*ܸG  (VáċÑĤo; ê.]•Ċáä˛`.áĵ„J  ï1b›ÌèíÛ³|E  ê7kÒééŸc0⽅J  ï8k¤ÒëïŜ·€H  ê=tÙîëÑ d0âĵƒI  ï;o§ÔìîÛ²zC  ê>v°ÛïìÑ d0Ŝ·~F  ï7j£ÑéêÓĤn: ê`9ú 4R9ù ;Z7ĝ+Pu7ĝ ?m—6÷,Wе6÷=n¤Í6÷ "Lƒ·Ü6÷(Vċ6÷)W‘Ċĉ6÷ %Pˆĵà6÷ BvĞÔ6÷1_“À7ĝ "Gw7ù1Z„9ú !Ad9ú 4R9ù 8W7ĝ'Ko7ĝ7d7ĝ !H|Ğ7ĝ)WÀ6÷2dÌ6÷;pİĠ6÷ CyħÛ6÷ F}µÜ6÷ Bx°Ù6÷:m6÷/^”7ĝ %Lz 7ĝ 7Yu7ú!6GĜxs_G=Gc‘‡gD3>^’ˆkLRbeX@+$.AQSG3%&6JYZM7  Ì *ïìÙаÉñïŜÇşÂÙìòèÓĵ·ÇßïïáɸĵÒèñèȓW'  Ê5g ÏêïŜ·I ïïßĊ²µËäòïßÈğÙìòêÔ·ÇŜïâÊıĵÑçñèȓW'  Ê3ežÎêâˆO#ìíÜÂŻ³ÊñïŜÇşÁ×ëòéÒı°Ĝëîàdz´ÉâîĉǒV'  Ë-\–Èçîàğ†M"ĉĉÒµ˘¨ßíêĜÀ²şÑĉîċËĦÊâèÛżĤ¤şÖçâT&  Ë %QŠżàè×°yDÛÙżž‹•µÔŜÈŻĦİÁÙäۜ‹–ĥÓŜ°’Œ˘ÄÚÙğ‡N#  Ë F|²ĠÜǛf6Ɂo|ŸÁÇ­‚ФÀÏÇİ„oxšĵÊĵ™xo…ŞĊĈİwC  Ë:l ÈŻ‚O&Ĵ†bQ_ƒħˆj\c}œ¨‹fQYyœĞ{ZQe‰¨`4 Í,W†§Ğ‘e9Š„gH:Gf„Ž€bF8=Tp‚fG5;VtvY=4Ed|iE$ Í !Cj†‰rL(qkS:.9SkreK0!"0ESRA+"5JTL7#)>PRC+ Î 6Vmp]= niU>3=TiocI-#,+!',( *,#  Î 9Wkm\?#…€kRGRj€†{_=!      )Kl‚„rR/ޤŒoam‹¤­ X0 úġ à8cĤİ”m@ ÊÄŞˆx…ĤÎÄ£tB â GzŞĈɲ…Q&ßٜŠ—¸ÖÛĵŠR& !â(UÛŜĈ™a0êċ͛¤Âàíçʘ]- á3dÌçéÔİp<ìĜĵİÈëŸc0 à=rĞÖíïŬĥ~GóŜÄħ´ËäñìÒ˘e1àC{³Üñò⽇N#óŜÄħ´ËäñìÒ˘e1áCz²Üò⽇N#ïìĜğ§ĴĊáïëŸc0 árŞĠìïŜ·I çċɟĵÛëéÖĵĥÏċíË´ŻÀÚëê×·œš³Óçĉ°šŸşĜèĈ•\-Â2a˜ÇèĠĞs>Ù׿šƒŠŞÍàŬÈĞ›¤ÀÙâÖğ˘œŻÌßŜȤ‡… ÄŬŜÇ£‡‡˘ÄÙÖ¸…N#  $L€ħÒÛǛc3ÁÂİ„kp‘µÉĈ‰ĤÂËżĦ†€”³ÈȰ‹nmаÊÍ·‘ql…İÂÁ¤s@ 7d”¸Ä²ˆT( £ŒjQUr”§¤‹m]g„ Ş€d^qĤĤmSTo“ĴŻ›xXQe‡Ħ˘‰^3Ċ$Hq“ ’nC |lN:=Ur‚}fK>Id}†z_F?NjnQ;Yln_E/*:TgfR5 Ĉ *:B=/ifP6(/Hak_E.)9VoxmR6(1Ibk^D-)9Ujm[@+*=XjeN0Ĉ -ƒ}bC4@^{„tT:6LoŒ–‰iG5=Yw„xY=5Gg€„nN79Qq„|_: Ĉ (HĤŸ€]LZ}§”pRNh°ğĴ‰cMUv˜§™wVMa…˘hORo“§ž{N(È 9eÄ |jwšğĈ³pk…­Í×ɧ€jt•¸Ĉ¸•sj€ÁĞ…lq´Ç½šh: Ë !J~ÙĠ𚇒²ÛÌĴއžÂŜçÛ½™†‘ħÛÍ­ŽˆžÀĜĜÁžˆ­ÍŬĠ´‚N%  Ë(VċäϲŸĤÁÜçŬ§ž°ÏçïċÊĴžĞÈàçÙ½£Ħ·ÔĉäΰŸ§ŜëäȘ`1 Ê,^™ììÛÁ²ÉâîèÓığĠëòéѸĵÖêíßĈħ²ÇàîêĠş­·èòìÓĤm9 Ê.aïïßĈ³µËäíÛĥÀĜìòêÔ½·ĈŜîâʸğçñë×½ħğÔëôîתq; Ê.ažïíÛÀ­ħÊäñîŬĊıÂÙìòéÓ½¸ÈßïáÉı½ÒèòëÖşĴµçòìÓ¤k7 Ë.`œìèÒ³ ¨ĊáïìÙÁµż×ëċÍĥħÂÛììܲ·ÍċêÒ³ ¨Äàîĉɘ_/ Ë+\—ŜÄ£œĵÚèε޷ÑäèÚżĤ ³ÏââϳĦĤżÚèËİ’˜ĥĠäÜĵˆP%  Ë &S‹ÑËħ~‹ĴÊÖθŸ–ÀÓĠÄĤ‹„™·Ì̸™…‹ĤÄĠÒ𙀅˘ÂÒÊİvB  Ë EwħĴ“vgt‘еЕ~xˆĦ²³Ħƒhbu“¨¨”vchƒĦ³²ž€jm†£ħލ`4 Ì3\‚~lUJTk~„{iWTauƒ‚rZD?NgxygO?DZr‚‚t]MNbw‚}gF% Í !>OLA4-3@LPJ=20:GOND3%",*  ü#ârŠ‹sO55Nr‹‹tU?.     %B`u|s[: Ŝ)IgxzjN.   ŝñ 9cŒ§ ~Q)ê;g¨Ş•mA üñ %NŻËÑż—a1 "JÊÌ´‡R'ŭñ/_—ĈàäÏ£i5*XÁŬßșa1ŭñ5i¤ÒêìĠ§l6ï2cœÌçéÔİq<ŭ  8nİÖíî×İl7ï6i˘ÑëïŬĥ~G ŭ  7l§Öíí×İl7ï5gĦëáĵ†M" ŭ ñ2eŸÏéìĠ¨l6.^˜ÊèîßşƒK! ŭ ñ*XÂáçÒ¤i4 &SŒÁáèÖwB ŭñ G{ŻÒÜɜb0 G´ÖÜĈ™d4ŝñ4b•ĵʸ‹V)ñ;nĦȀM% ŝò $Iwž­œsD ñ.Y‡§Ğd8 ŝò5\}Š{X2ò "Dk‡‰qK'ó+Jen`B$ó 8Xno\<  ŝó/LchX; ó :Xkl[>" ŝñ#Cdz{gF&ñ*Ln‚„qQ. ŝñ6`‡ŸŸ‡^5ñ9eާ¨“k?  ŝñ #K}ŞÂ§zH! ñ H|ĞÇÉħƒO%  ŭñ-\”ÛÚÀY*ñ)WÀÛŬĊ—_/ ŭñ4h˘ÑèçΞd1ï4fŸÎçéÓ§n:ŭ  8mİÖíìÔj5ï?t­ĜîïÜ´|E ŭ  7m¨ÖííÖ¨l6ï E}µŬñòáĵ…L! ŭ ñ3gĦêìÖ¨l6ï E|´Ŭòáĵ…L! ŭ ñ,[“ĊâèÓj5ï=rŞĠìîÜ´|E ŭñ "J²Ġß˞d1ï1`–ĊáĉÒĤn:ŭñ7fšÁÎğX*ñ #J}Ĝ–^/ ŝ ñ'N}¤³˘xG! ñ5b‘µÀƒO%  ŝ ì 8`ƒ]5ò#Gq“Ÿk?  ŝ ë -LhrdE%ò3Ur|oQ. ŝ ì %15/$0KagX; ó*H`gY>"ë,G\bYE43E`tvcC$ó0Pim[<  ŭê%Hn‹”ˆmURf„™˜Z2ò !Ci…ˆqK'ŭé5c’´ħ”yuŠİĵ˘uE ñ2\Š¨Ğd8üé Ey­Ûβ™”¨ĈÙ×ĵV)ñ !Fx¨ÇɀM%û é #O‰ßêßĈŻŞ½×èĉ̜b0ï/\’ÁÜŜĈ™d4û é &UĈĉĉşĥÇßîìÔi4ïB;-!!3NgpgM/È +;B<."'# $' ALG4!#6HMB.+IdodI*Ù .BLF4!#7HMB.hyrW;0ò 7]~ŠyU.ó,Kfn_@" ó 0McgW: ò$Dez{fD#ñ8a‰ ž„[1ñ $MĞÁ£tA ñ/^–ÄÛÙğˆO# ñ6jÒèċȕY( 9pĞĜíêΛ]+9oŞ×íë_,ñ5i£Òêêϝ_,ñ-]•Ĉĉ͚]+ñ #L´ÖŬĈ”Y( ñ9h›ÁÌ·‡O# €´(O~²žrA  :b„Y1 .MirbC# &15/$1LbgV9 -H\bXD43FauvbA" &IpŒ”‡lURg…™˜~V.7e”µ°“xu‹ŞżğŸo>F{ŻÑÛÎħ˜”İÇÙĠ·…M" $Q‹żàêŜĊŞĜèäĈ“W( (W“ÇçĉÏıĥÈàîêΚ]+)Y–ÊéòèÒ½¸Éáïë_,)Z–ÊéòèÑş´ÄŬíëž`,(X”ÉèñċÌħ¨ıĠééž`,&SŽìߢ—¨ÈáċΜ_,!Jĥ×áÑħށ“¸ÖŜȘ]+B;,!"4OgodI*,JdnbE&1  4Yy…vS.O,#Gtš§•j<m@ 3`’ıÄŻK! †P%  EyĴĜÁV' •[+*XÁß˙\*›_-3f ÏèéϜ_,`.8nİÖìëž`,›_-9pĞĜíëž`,–[*7m§Ġëê_,‹R& 1cœÊä˙^+wD (S‡µÓ½W(\2 >k•°µ˘{J# > *Lo‡Œ}]8#ò 4PdgZA& À À Àô " 4ö 6ŝŝ  À À Àô " Ü"&$"! "$&#ö  Ü     ùû  À À À ô !! é"&$$&" " ġ é   ŝŝùú  À À Àú ó  %% ï $&" ġ ñ ùĝ  À À À:ú":û ;ü ˙ À À ÀÑ&$$&#"%% !" %&!"&$  Ï      úóòŝöŝŝ6ġ 3ó   2ó ):EF=- 1ò(GdvxjN.1ò9eŽĤİ•nB 1ò !H|ĴÉÌ´ˆS(1ò)VŽżŬßɛc20ñ1ašËĉêÖĞs>0ñ5gĦêïŜ·€I 0ñ3eŸÎêâˆO#1ò-\–Èçîàĵ†M"1ò %QŠżàè×°zD1ò F|²ĠÜǜf61ò9kŸÂÈŻ‚O'2ó,V„¤İd9 2ó =b}jG' 2ó%>PRC-3ô *,$-4ġ 2O5ö#Fq8ù)VŠ9ú-^˜9ú.a9ú/bž9ú/bž9ú.až9ú-_›9ú*Y”9ú $N„9ú =k9ú)J:û *:û ;ü=ŝ> À À À!"" ò)DXZL4á!""   ò.NfhV: ñ  ŝò @h…‰tQ/ŝñ.X‡¨˜pD! 0ñ Ar¤ĊÌ·‹W+0ñ'S‰ğÚßʝd20ñ0b›ËĉéÓj50ñ6kĤÔìíÖ¨l6/8nİ×íî×İl7/7lĤĠìíÖ¨l60ñ1cÌĉéÓĤk60ñ)TŠşĜŬʞe30ñ ApžÇµY-0ñ,Rz˜£•qG# 1ò 5ToymQ1 ŝŝ ò"8MUM8 ġ ò0BHA0 ó   ò)@SZR>'ó *;EF=-  ŝñ%Cczw]; ñ)HewxiM- ŝñ 9cŒ§ ~Q)ñ:f§¨“m@  ŝñ %NŻËÑż–a1ñ "J~É˳†R'  ŭñ/_—ĈàäÏ£i5*XÁŬßșa1ŭñ5i¤ÒêìĠ§l6ï2cÌçêĠİq<ŭ  8nİ×íî×İl7ï6i£ÑëïŬĥ~G ŭ  7m¨Ġíí×İl7ï5gĦë὆M" ŭ ñ2e ÏéëÖ§l6.^˜Êçîßş„K! ŭ ñ+X‘ÂáçÒ¤i4 &SŒÁáèÖxB ŭñ G{ŻÒÜɜb0 G´ÖÜĈšd4ŝñ4b•ĵɸ‹V)ñ;mĦȀM% ŭñ$HvœĞ›rD -W†¨Žc7  á 1Uu‚uT/È >c}iE&    5KTK4 È&?QRC, :@>4&%3:8-!+7;4&','Ê!*+#.;@>3%&3:8-gro_H66G]jfT?4;Pdj_F*   Ì 3Phro^G67H]jfT”˘oYXn‹œ—€cU_{”œkB!  Ñ$Hs•˘ŒnXYoŒœ—µËʵ•}|”²Äż§ˆxƒĦĵÄ´[/Ô*WŒ·ÌÉ´”||•³ÄżĤÇàⲛšħÎŜÚĤ—˘×ŜÍo;Ġ.`šÉááÏħš›²ÏŜÙÂÎéíŜĊŻŻÄŬëçÔıеÏċëÛ´|DĠ0cŸéíŜÄŻŻĊŜëçÓëñċÎşşÍäíÛĥÀ×ëáğƒI Ġ0d ÑìñäÍşşÎċñíÛìòçÑĉòïŜÇşÚíñ…K Ġ0d ÒíòĉÑçòïŬìòçÑĉòïŜÇğÚíò…K Ġ0c ÑìòçÑçóïŜÎêċÎşşÍäñîÜÄ·À×ëáğƒI Ġ/aÏëäÍşşÎċñíÛĈäêŜĊ°ŻÄŬëçÓıĴµÎäêÛ´|DĠ+[–ÈċêŬÄŻ°ĊŜëçÒµÔÚÌħšš°ËÚ×Á– ğÓÚʤn;Ġ %P†·ÔÚ˰™šħÌÛÖÀ—´şĞyyŞşĥ ƒu›³ğЇX.Ö ?m™µşŞŽxyĞğĥŸm„‰|dQQd{‰…rZNWm‚‰}`< Ö*Ln…‰{cQQd|‰…q?NQH9,,8HQOB2*0?MQI7"Ĝ +@OQH8,,9IROB#%  %$#%!Ù #% !%$   ï  ûüŝûŝ>///üï*EXZJ2 0OfhT7 ò Ai†ˆqM*ñ/Z‰İ­”j= ñ BtĤĈʲƒM# ñ(T‹½ÚŬēX) ñ2dÌĉç͚^+7m¨Ġìê`,:pĞĜíëž`,8nİÖìê`,ñ3eŸÍĉĉ͛^,ñ*VŒĵĜÛĔY)ñ Cr Ċ°„O$ ñ.S{™˘k? ò 6VoxjL,ó"9NUK4 ó1BH@- ò*ASYP;"ñ&Ddz€tW4ñ :e¨­›vH! ñ&Oƒ°ËÏıU' ñ0a™Çáâɘ]+ñ7lĤÔëêϝ_,9pĞĜíëž`,9oŞ×íëž`,ñ4g˘ééϝ_,ñ,Z“Äáċ̚]+ñ !I}°ÓÛĒW( ñ6d—½È³„M" Ÿ%JxŞ—m> 2Vv‚sP,  5KTJ3  ,7;4%',' >3? ?/?> ?+?>ü?>>? ?+?>?> ?(?>?>ü?>>? ?'?>?>ü?>>??&?>?>ü?>>??%?>?>ü?>>??$?>?>ü?>>??" ?>?>ü?>>??" ?>?>ü?>>??! ?>?>ü?>>?? ?>?û>?>>???>?>ü?>>???>?>ŭ?>???û@KH@??>ù?>>?>>??×ŝ??ûJ]PA??ü>??>>?×ŝo??úAQfUB??>?û>?>>??×ûÑĴhC??úATlWB??>ú?>>?>??ùÊ··£tK??úBUn[D??ù>??>?>??÷B`ŠĤ¤SA??úBUp^D??>ú?>>?>???ĝHi‘£‹_D??úBUs`D??>ŝ?>>??÷ARw›˜nJ@??úAStbE??÷>??>?>???ĝGb‹›TA??ú@SudD??>ŝ?>>??ĝBQv—aE??ú@QueD??ĝ>??>?>? ?ĝE`Š—sL@??ú@NseD??ŭ>?>>ŝ? ?ĝAPv–†WB??ú@MpeD??ŭ>?>>?ùF`‹“fF??ûJneC??ú>??>>?ĝANw•|O@??ûGkeC??û>?>??ùEaŒŒ[B??ûFhfC??ü>?>?ùAOymF??ûDgfC??ü>?>?ùD^‰O@??ûCefC??ŭ>??ù@Lv‡`B??ûB`dC??ŝ>?úC^„qG??ûA\cB??ŝ>ùÁyZHA??ó@JuS@??@XbB??ġ¨š†mXJB@??ôB^€dB??@TaB??óoy‡’–“ƒlXJB@??ú@JssH??üRaB??ŝŝ:ŝ8ŝ5 ŝ3 ŝ1 ŝ/ŝŝŭŝ ŝ/ŝŭ ŝ+ŝŭüŝŭŭŝ ŝ+ŝŭŝŭ ŝ(ŝŭŝŭüŝŭŭŝ ŝ'ŝŭŝŭüŝŭŭŝŝ&ŝŭŝŭüŝŭŭŝŝ%ŝŭŝŭüŝŭŭŝŝ$ŝŭŝŭüŝŭŭŝŝ" ŝŭŝŭüŝŭŭŝŝ" ŝŭŝŭüŝŭŭŝŝ! ŝŭŝŭüŝŭŭŝŝ ŝŭŝûŭŝŭŭŝŝŝŭŝŭüŝŭŭŝŝŝŭŝŭŭŝŭŝŝŝüġ÷ŭŝŝŭùŝŭŭŝŭŭŝŝĈŝŝŝûġèòüŝŝüŭŝŝŭŭŝĈŭÇìŝŝúŭñâîüŝŝŭŝûŭŝŭŭŝŝĈûÉÖîüŝŝúüîŜìûŝŝŭúŝŭŭŝŭŝŝùÌÒÒÙêùŝŝúüîŬêúŝŝùŭŝŝŭŝŭŝŝ÷ŭñâĜÙĉöŭŝŝúüîÛèúŝŝŭúŝŭŭŝŭŝŝŝĝúîàÙâòüŝŝúüîÚçúŝŝŭŝŝŭŭŝŝĝŭ÷éŬŜíúŝŝúüïÙċúŝŝ÷ŭŝŝŭŝŭŝŝŝĝûñâŬçöŭŝŝúŭÙäúŝŝŭŝŝŭŭŝŝĝŭ÷êŜâòüŝŝúŭñÙäúŝŝĝŭŝŝŭŝŭŝ ŝùûòäßìùŝŝúŭóÚäúŝŝŭŭŝŭŭŝŝ ŝĝŭĝëàĉġŭŝŝúŭôŬäúŝŝŭŭŝŭŭŝùûòäáûŝŝûöŜäúŝŝúŭŝŝŭŭŝùŭĝëáéĝŝŝûĝàäûŝŝûŭŝŭŝŝùüòääôŭŝŝûùâäûŝŝüŭŝŭŝùŭĝêîûŝŝûúûŝŝüŭŝŭŝùüóċéĝŭŝŝûûċäûŝŝŭŭŝŝúùëĉóŭŝŝûüèċûŝŝŝŭŝúüóçíûŝŝûüëçûŝŝŝŭùżĊäòúŭŝŝôúìé÷ŭŝŝŭíçûŝŝöżÇÖßêóùüŝŝôŭóéòŭŝŝŭçüŝŝôèċŜÚĜÚáëóùüŝŝûúîíûŝŝüòèüŝŝŝU:U8U5 U3 U1 U/UŝTU U/UT U+UTüUTTU U+UTUT U(UTUTüUTTU U'UTUTüUTTUU&UTUTüUTTUU%UTUTüUTTUU$UTUTüUTTUU" UTUTüUTTUU" UTUTüUTTUU! UTUTüUTTUU UTUûTUTTUUUTUTüUTTUUUTUTŭUTUUUüLOTUUTùUTTUTTUUûUUûMAJSUUüTUUTTUú >UUúTIBMTUUúTNCISUUĝTUUTUTU UùSMDCKRUUûPFJSUUŭTUTTŝU UĝTQJFJQTUUûQHLTUUŭTUTTUùTOJKQTUUûRKMTUUúTUUTTUúSOMPTUUûSMOTUUûTUTUUúTRPRTUUûSOPTUUüTUTUüTSTUUûTQRTUUüTUTUüVXVUUüTSTUUŭTUUüXZXUUTUŝTUûW\[VUUŭVWUUŝTù6GQTUUûV\_XUUŭVXUUö'3@IPSUUûZa\VUUŭWYUUô;71..19DKQTUUûW`aWUUŭX[UU9ŝ6ü4üŝ1÷2ò .ï ,ï +ì *ùô 'ŝì &üŝŝ  ġ %ö  ò $ùŭ  ġ#÷  ï "ñ ú"â  ò ñ òë öé ù !ë ô "#$ ú!#%&'Ú !##&()*Ú  !##&')+,-Ú  ! !#&'(*+./0Ú & !#%%(*+-.024Ù*$!#&')*-./2357Ù !.( "$&(*,-/22568:Ĝ #"!2+#$&)+-/114679:=Ĝ "+#61')+-/14569:<=@× .("':7,-/24689;>?BD× ,3#!#&,?=12469;=>ADFIÖ '8-!!#%(+0CC679<>@CEIKNÖ $69)%(*-/4HI;<>ADHJMQRĠ "2C4+,/248MP?AEHLOQUXĠ !$.EC31469=QVFILPSVY\Ġ  "%(.AN>69;>BV]NQTW[^`Ô !$'*-0??ŭ?! ?ŝB??ùGŽ˘[>>??ú>??? ?üCUB??òL‘˜R>>??>>?>>?? ?üJdG??òP•ŠI>>??>>?>>?? ?üKkJ??òV™|E>>??>>?>>?? ?üOnM??ó\™oB>??>>?>>? ? ?üOrO??ò@c™b?>??>>?>>? ? ?üNtQ??òAk–Y?>??>>?>>? ? ?üNvR??óCt’P>>??>?>>?? ?üMxS??óE~ŠJ>>?>>?>>?? ?üLxT??óHˆ~E>??>>?>>?? ?üKyU??ôLrB>??>>?>?? ?üJzW??ôQ‘e@>??>?>>?? ?üI{W??ôW“[?>?>>?>>?? ?üH{X??ġ_Q>>?>>?>?? ?üGzX??ô@iJ>??>?>>?? ?üFyY??ôAs†E>??>?>>?? ?üEyZ??ġC€|B>?>>?>??ŝ@?? ?üDvZ??ùE…n?>?>>?û@JSA?? ?üCtZ??öG‰`>??>?>??úANbN@?? ?üBqZ??öK‰T>??>?>??úARjXB?? ?üBoZ??öQ‡K>?>??>??úARo]D?? ?üAm[??÷X„E>?>AA??@ ?úARpaE??>? ?üAkZ??ĝa{A>?>E??ŭDA? ?ú@PqeF??>? ?ü@i[??ŭks??ŝG??üAH@? ?ú@OrgG??>? ?ò@h[??@sd>?>CF??ŭHD? ?ú@NrjH??>? ?ò@f\??A}V>?>IB??üBK@? ?ûKrmH??>?ŝ? ?ôe\??B|K>??K??ŭJF? ?ûJroI??>?>ŝä? ?ôc]??E}E>?CJ??üBN@??ûHpqI??>?>üGä? ?ô`\??IwA?>IE??ŭKH??ûFlqI??>?>ú?PŒ½×? ?ù\Z??Os??ĝL@??AP@??ûDipI??>?>ĝ?IjĵÇ? ?ġXY??Xg>?AL??ŭKH??ûCepI??>?>÷C\‡Ĵı‘o? ?UY??eW>?FG??AP@??ûBapI??ûAEA>??>ô@PuĦ²Ĥ„aJ@>??ñRX??lK>>LA??JI??ûA^pI??üCKD??ñ>?Jj–Ĵ˘}\IEFG>??ñPX?@lD??M??@OA??ŝ@??û@ZpI??û@HOD??>E_Œ§Ħ~]MIJKLL>>??òMX?@n@?CI??HI??ŝA??û@WqI??ûBNOB??>ġBT~£ \MJKLL>?îJX?Bg??KA?@O@??A@??üSnI??ûERLA??ô>@NvĦ~ZKIJLLü?>>??ïHW?Eg>?L??GJ??@B??üNkI??ú@JTG@??ó>?Ij—Ÿ‚[JGIKLLü?>>??FV?LX>AI??O@??C??üKiH??ûAOSC??ó>C\ž„ZGEFIKLLû>?>>??ëDW?UQ?GC?EJ??C@??IgI??ûCSOA??ò>AT‚š…ZEBDFHKLLĝ?>?>??@??ìCW?VG?I??L@?AB??EfJ??üHTH??ñ>?Ku“„ZD?ACFHJL L?>?çBX?]A@I?CI??C??DeI??@MSC??>Ei…ZD??@BEGIKL L”<0 ŝ)ŝĝÛÌÛŝŝŝ$ŝùüßÒìŝŭŝŝŭŝ! ŝŝüŝŝùûß×óŭŭŝŝúŭŝŝŝ ŝüûüŝŝòùŜÛöŭŭŝŝŭŭŝŭŭŝŝ ŝü÷çùŝŝò÷Üáúŭŭŝŝŭŭŝŭŭŝŝ ŝüöâ÷ŝŝòġÛĉûŭŭŝŝŭŭŝŭŭŝŝ ŝüôàġŝŝóòÛëüŭŝŝŭŭŝŭŭŝ ŝ ŝüóßóŝŝòŭïÛŭŭŝŝŭŭŝŭŭŝ ŝ ŝüôŬóŝŝòŭíÜóŭŭŝŝŭŭŝŭŭŝ ŝ ŝüôÜòŝŝóüéŜ÷ŭŭŝŝŭŝŭŭŝŝ ŝüġÛñŝŝóüĉáùŭŭŝŭŭŝŭŭŝŝ ŝüġÛñŝŝóúâĉûŭŝŝŭŭŝŭŭŝŝ ŝüöÛŝŝôùàêüŭŝŝŭŭŝŭŝŝ ŝü÷Úïŝŝô÷ßïŭŭŝŝŭŝŭŭŝŝ ŝü÷Úïŝŝôôßóŭŭŝŭŭŝŭŭŝŝ ŝüĝÚïŝŝġòà÷ŭŭŝŭŭŝŭŝŝ ŝüùÛîŝŝôŭîáúŭŝŝŭŝŭŭŝŝ ŝüùÛîŝŝôŭêäûŭŝŝŭŝŭŭŝŝ ŝüúÜîŝŝġüĉèüŭŝŭŭŝŭŝŝŝŭŝŝ ŝüúŬîŝŝùüäìŭŭŝŭŭŝûŭöŭŝŝ ŝüûßîŝŝöûòŭŝŝŭŝŭŝŝúüóĉôŭŝŝ ŝüüàîŝŝöùöŭŝŝŭŝŭŝŝúüñáíüŝŝ ŝüüâîŝŝö÷äùŭŝŭüûŭŝŝúŭñŜéúŝŝ ŝüŭîŝŝ÷ôċûŭŝŭ÷÷ŝŝŭüúŝ ŝúŭñŬçùŝŝŭŝ ŝüŭäîŝŝ÷òèüŭŝüïùŝŝüŭóùŝ ŝúŭòŬċùŝŝŭŝ ŝüŭċîŝŝ÷îëŭŝŝúêüŝŝüùíŭŝ ŝúŭóÜĝŝŝŭŝ ŝìŭĉíŝŝŭëñŭŝŭòìŭŝŝŭìġŝ ŝûôÜâ÷ŝŝŭŝ ŝóçíŝŝŭèöŭŝŭçôŝŝü÷ĉüŝ ŝûöÜàĝŝŝŭŝŝŝ ŝîèíŝŝüéùŭŝúâúŝŝŭèŝ ŝû÷Ŭß÷ŝŝŭŝŭŝÓŝ ŝîéíŝŝüèûŭŝóäŭŝŝ÷âûŝŝûĝßŜ÷ŝŝŭŝŭüûċÓŝ ŝôëíŝŝúëüŝŭçîŝŝŭĉíŝŝûùáŜ÷ŝŝŭŝŭûĝéÜÖŝ ŝïíîŝŝĝìŭŝûáĝŝŝùŜúŝŝûúŜ÷ŝŝŭŝŭùúòċŜÚÛŝ ŝïŝôġŭŝöáŭŝŝèìŝŝûûĉß÷ŝŝŭŝŭ÷üġëâŜáèñŝ ŝñïŝŝñöŭŝìêŝŝúŜûŝŝûüèß÷ŝŝûûó÷ŭŝŝŭôüĝċáäìġûŝŭŝŝñóïŝŝïùŭŭâ÷ŝŝêëŝŝŝŭŝŝûŭêß÷ŝŝúŭöèóŭŝŝŭ÷úòèċî÷üŝŝŝŭŝŝíġŝŝïûŝúàŭŝûàúŝŝüùŝŝûŭíß÷ŝŝúüîôŭŝŝŭ÷ûġëäĉî÷üŝŝŭŝçöŝŭîŭŝòçŝŝíêŝŝŭóüŝŝŭïß÷ŝŝúùċä÷ŭŝŝŭ÷üĝîĉĉï÷üŝŝŭŝŝüŝŝî÷ŝŭŭŝä÷ŝüàûŝŝòöŝŝüñá÷ŝŝúŭôŜèúŝŝŭĝùèçïĝüŝŝŭŝŭĝŭŝŝéùŝüñŭüáŭŝïêŝŝ÷îŭŝŝôâ÷ŝŝúüìÜïŭŝŝŭĝúóéçîĝüŝ ŝŭŝŭúĝŝŝêúñŝúġŭ÷çŝŭáûŝüéûŝŝöäĝŝŝúûäŜöŭŝŝ÷ŭûöëèî÷üŝ ŝĝŭŝŭŭŝŭòŝŝëûñŝöĝŝëôŝòêŝŝëġŝŝĝċ÷ŝŝûöŜäûŝŝ÷ŭüĝîéî÷üŝŝĝŭŝŭŝŝòüŝŝÛüŝöúŭĉüŭċûŝôìŝŝúĉ÷ŝŝŭÜîŭŝŝŭŭúñëî÷üŝŝŭüŝùóŝŝçüŝôüûèŝöìŝûçüŝûç÷ŝŝüèß÷ŝŝĝŭûôìîĝŭŝŝ”ŭ;0 U ŝ(Uĝ*(UUU$UùR0 ?UTUUŭU! UŝSUUùQ1)HTTUUúTUUU UüRFSUUòO2/LTTUUTTUTTUU UüN>PUUòN26PTTUUTTUTTUU UüM:NUUòL3=RTTUUTTUTTUU UüL9MUUóJ5CSTUUTTUTTU U UüK9KUUòTI7ITTUUTTUTTU U UüL9KUUòTG:LTTUUTTUTTU U UüM:KUUóSE=PTTUUTUTTUU UüN;KUUóSDAQTTUTTUTTUU UüOLUUôQEMTTUUTUTTUU UüQ?LUUôQGPTTUTTUTTUU UüRAMUUġPIRTTUTTUTUU UüRCMUUġPKSTUUTUTTUU UüSEMUUġPNTTUUTUTTUU UüSFNUUġTPPTTUTTUTUUŝTUU UüTIOUUùTQRTTUTTUûTMGTUU UüTKOUUöTSSTUUTUTUUúSK>KTUU UüTMPUUTUüTUTUUúTJ;ESUU UüTNQUU÷VUTUTTSTUUúTJ:CRUU UŭPRUU÷VXUTUTQPUUŭTRU UúTK;BQUUTU UŭQRUU÷WXTTUSLQUUŭNRU UúTM=BQUUTU UŭRSUUYùTUURJSUUüRKTU UúTN>BQUUTU UŭSTUUòZYTUTNKTUUTKOU UûO@CQUUTUUĝ]WTUTIPUUüQHTU UûPBCQUUTUŝU UŝVUUĝ^VTURGSUUŭJNU UûQDEQUUTUTŝU UîWVUUV`UTUOITUURGSUUûRGFQUUTUTüQ4U UWUĝW`UUTKNUUŭJMUUûSJHRUUTUTûO<+ U UïWXUUX`TUSIRUUSGSUUûTLJRUUTUTùQH:/*(U UXUô[^TUQJTUULMUUûTOLRUUTUT÷SMC944;EU UXYUU_[TUNNUUSITUUûTQNSUUûSMPTUUTġQJ@;??@@SNA@A[C==?@ABCDEFXTFFGbEAABG==;@BCEGHIJJK[YKKNeIGFMGB@>FB:87531/-+)(44"  CEGIJLMNOPQ_^QQVhMMKWJGEDN@=;986420--9:'"    HJLNPQRSTUVcdVV`gRR€á\NLJRMC@><;87421<@,'$" LOQSTVXYZ[[gi[[ldXW]\SQQ\KHEB?=;975AG0+)'$!  PTVXZ\]^_`aknaavd]\i[XV]ZOLJGC@><:DM60-+)&%$& UX[]_abdeefotff|fcbo_]\hXTQOLHEA?HS;520-+,+$ !+% Z\`bdfgijklsyllƒjhkpdbhg[YVVPLIELY@:742141(%""/, ^bdgilmnopqwqr„nnymjhud`]^YTQMR_E><977<5-)'$ $33" dfhlnqruwyz€ˆ{}vt€pnttgedd\XTXgMEA>:740./=G7%Ċ rv|†‹’’”–—š˜Ħ™“›‹”„~|zolk{f]YTV\MC?<855ANA.%"  µ z…‰Ž“˜žŸĦ£˘­ ¤——™‹‡Š{trƒmd`\bcRJFA=;DUL6-)&#!!""!   3ä,ä*ä+ä+ŝää-ŭËä.ŭP?.?/GŝI-L.L.L-L-L,L,L,LŭMX* 3Ò,ÓÒ*ÓÒ+ÓŝÒ*Ó-ŭÙÓ.ŭùŝ.ŝ/ŝ.ŝ.ŝ.ŝ-ŝ-ŝ,ŝ,ŝ,ŝ+ 3ŭ+ú )ù *ù *û,ŭ#.ŭOU.U/üspw-ƒ.ƒ.ƒ-ƒ-ƒ,ƒ,ƒ,ƒŭ…¤* cü+ú*û ,ü -ŝ/ŝ/ŭ.ŭ.ŭ.ü-ü-û,û,û,ú +ú +?òGSbuˆ‘‘…pZKC@??ôA\yV@??ObB??ñ@DLYk€Œ‡s\LC@??öIofC??M`B?ñ@AGQav‡ŽŠw^LB@? ?÷A\pK??I\ ?ó@CJWj‚Œ‹z`LB? ?ùHkZ@?F?ôAEO`x††yaLB? ?úAZdD?êúÁiHE@? ?ô@BHTi|‚zcKB? ?üIcNêôçȧ‰rbTKEB@? ?ġ@BJ[s}xdLB??ŭ@W êîĉÙÏÈż´¨˜‡vh[PIDA@? ?ö@DPftsdNB??ŝA êéÒĞĦ ¤Şħ³ħŻİ£—†ufYOHC@??÷AHXjmeNA??ŝDAHIJPSZ^fox‚—Ħ§Ĥ˘œ‹zhYNGB@??ġBLagbNB?AH?@çADEINSZcnz‡’”˜”’‡|n\NFB@??ĝ@DU^[SN?ê@ABDGKQYcqz‚†‚‚wq^NEA??üAQb?í@ABEIOXbqpslg`OIJP%?÷@ACHS^an*?üBIR*?üBJR*?üAIQ?úCEFC@??üAHO?ŭAILLŭIC??ú@?@GO?ŭ@JLLŭJB??ü@KZ?ŝFLLŭH@??ŝ@??ù@EQSOL?ŝJLLĝORMLLJA??ŭA@??ö@FTXRD?@F?ŝKLLĝYlPLLKB??ĝ@GU]YH@??ŝB?ŝJLLĝPUMLLKB??ĝAGW_\NB??ŝ@?ŝGLLŭI@? ?÷AHWcaRD@???ŭAKLLŭKC? ?ö@BIWcdYG@? ??ŭCJLLŭKE??ö@BHWdf\LB???ù@EHHEA??öBHVdh`PD@??ŝ@?öAGRagcSF@??ŭ@] ?ġ@CLYa`UIB@??ü@aV ?÷ALVYRIB@??û@a[? ?ûEHEB??ú@`^@?%?ù@`a@??$?ûA`eA??"?ûAajB??!?ûAboD?? ?ûAcuF???ûAcyH???ûAbzL???ûA`}O???ûBaR??ŝB?úBaX@??ŝK?úBa…\A??ŭAM?úBbˆ`A??ŭIG?úBa‰gB??üAL@?úB_‰jD? ?Fŝ??úB_ˆmE? ?û@H@??úB^‡pG? ?ûCD?? ?úB]†sI? ?ûC@?? ?úB\…uJ? ?ŝ@?? ?úC\…yM???ùBZ…|P@???ùAY„~R@???ùAXTA???ù@TWA??ŝ@?úR‚VA??ŝB ù?B|ƒX@??ŝC!ûOzR@??ŝA"?$?%?'?(?)?ŝóúġîĉßÛÛàêòùüŝŝôŭôì÷ŭŝŝóçüŝŝòüĝóëŜŬàèñĝüŭŝŝöûïòüŝŝġéüŝóŭúöïçàŬßçñĝüŝŝ÷ŭġïúŝŝ÷ë ŝôüùôìŜßĉùüŝ ŝùûöŭŝùŝôŭû÷çââçĝüŝ ŝúŭöóüŝ×ĜÙûâġüŭŝŝġüúġíĉäçùŭŝ ŝüûóù×ĜÙġÚáèîóöùûüŭŝ ŝöüùóêĉçĝŭŝŝŭŭ÷ ŝ×ĜĜÙïÚŬßáċèëïòġĝúüŭŭŝ ŝöŭû÷ïêêĝŭŝŝ ŝĜÙÙŭŜçééçòĉççéêíóöùûüŭŝ ŝ÷ŭúôîìĝŭŝŝäŭüüûúúĝ÷öôòîíëêêëìíóöùûüŭŝŝĝŭùñïñĝŭŝŝ ŝŭüĝûúĝ÷ġóîîïĝñóöùûüŭŝŝùüöóôĝŭŝŭîüûúù÷ġôòòóóġġùûŭŭŝŝüŭùġŝŭûüûùĝöö÷úĝûüŭŝ&ŝŭúüûùúù-ŝ-ŝ-ŝ(ŝúŭùòñí$ŝöü÷ôñôùüŝ$ŝüŝŭŝŝüŭĝñ'ŝùŭĝîìòû$ŝùŭĝëèíùŝŝ!ŝĝüöêäçöŭŝŝŝĝüöéâäñûŝŝŝ÷üöèŜàíùŭŝŝŝöŭûġèŬŬçöŭŝ ŝŝöŭûġèŬÛòûŝŝŝġŭûġéÜÙàïùŭŝŝŝŭŝöüöìßÙŬë÷üŝŝŭŭñ ŝġŭúñĉŜàéġûŭŝŝüŭïô ŝ÷ûòèĉìġúŭŝŝûŭïòŝ ŝúĝġĝûŭŝŝúŭïñŝŝ%ŝùŭïïŭŝŝ$ŝûŭïíŭŝŝ"ŝûŭïëüŝŝ!ŝûŭîéûŝŝ ŝûŭîĉúŝŝŝûŭîäúŝŝŝûŭîĝŝŝŝûŭïâöŝŝŝŭŝûüîáġŝŝŝ÷ŝúüîßòŭŝŝŭŭĉŝúüîŜŭŝŝŭĝáŝúüíÜîüŝŝüŭéîŝúüîÜëüŝŝüùäûŝúüîÜêûŝ ŝüîïŝŝúüîÜèûŝ ŝûûêûŝŝúüïÜçúŝ ŝûġôŝŝ ŝúüïÜċùŝ ŝúŭġüŝŝ ŝúüïÜäĝŝ ŝŝüŝŝ ŝúüïÜá÷ŝŝŝùüÜàġŭŝŝŝùŭñÜßôŭŝŝŝùŭñŬŜóŭŝŝŝŭŝúóŜŜòŭŝŝŝüŝúôŜŬòŭŝŝŝú úŝŭßÜñŝŝŝù!ûöáôŭŝŝŝü"ŝ$ŝ%ŝ'ŝ(ŝ)ŝUóQKE>868>FMQTUUü\d[UUûX\VUUòTSOKF@>?BINRTUUöWcaVUUX]VUóTROKGEEGLPSTUU÷V^fYUUX] UġTRPMKKMPSTUUùXf_UUWUŭTSQQŝSUUúV`eWUò ,HRSUUTùUVXYXVU UüYe\ì !-8BHMQSTTUUùWZ\][WU Uŝ` ê !(-27;@EIMPRSTUUĝW[_`^YVUUŝW ë(5:==>@ACFIKNPSTUUĝW[`baZVUUŝZŝTRRèQPPOONNOOPRTVXZ[\[ZYWVVUUġVY`db[VUW] UTUĝVWY\^`cddùc`\YWVUUùW^bb`aUîVWXZ\`dgjjkhga[XVUUüV`lUïVWX[^bjjljif][^d&UĝVWZ`gku*UüW^f*UüX^e*UüW^eUùVblneZUUúTSRX^U÷\xƒ„„ƒ{dUUöTRQPPQT[cUûY|ƒƒ„„ŭ~bUUTUŭ[dUŝoƒƒ„ŭvXUUŭWXUUúVYZ[_Uŝ{ƒƒ„ŭ^UUŭ\ZUU÷VWYYVUV[UŭV€ƒƒ„ŭbUUûVWWVUUŝXUŭV~ƒƒ„ŭ€_UUTŭSTUUŝVUŝrƒƒ„ŭyYU UĝTSQPQSTU UUû\€ƒƒ„„ŭfU UĝTRNLMPSU UUöc~ƒƒ„„jVUU÷SQLHILQTUUUùYjtum^UU÷SOJDDHOSUUUöSPIB@CKRTUUŝ` UöTQLD?AHOSUUŭ`] U÷SKDCHNSTUUü_^U UûPNPSUU]U&Uŭ\]UU%Uŭ[]UU#UŭZ\UU"UüY\VUU!UüX[VUUUüWYVUUUüVWVUUUŝTU UUSŝTUUŝRUüRQSUUŝKUûTQNRUUŭRHUúTOKQTUUŭKMUúTNHOTUUüRHSUúTMFMTU UüLMUUúTLCJSU UûSJSUUúTKAHSU UOU UúTK?ERU UúTOTUU UúTJAGKPU]uthko{„Ó  )//)# !#&),/369CIOV^grƒ‹’™Ÿ˘¨ĴħÑ  $'*-148;>CINSY^diov‹—°´ĵÑ  $'+-158;?DINTY^djow‹”ž§Ĵ²Ñ  $'+.158;?DINTY^djow‹”ž§Ĵ²Ñ  $'*-148;?CINTY^diovŠ”žĤĴ²Ñ  #'*-148;>CINSY^dinu€‰“žİŻĥÑ  #'*-047;>BHMSX]chnvŒ–žĤаÑ  #&*-047:>BGLRW]bgms|†™˘Ĵ·Ñ "&),036:=AFLQV\aflqz„ĦĞŻÒ "%),/269<@EJPUZ`eks…‘––œ¤ŞÒ !$(+.258BIQ`lokhlqy‚‹“œ¤Ò  #&*-047:AN]a\X[_ejnt~†Ž—ŸÒ "&),06AMRMHJNSX]bglqy‰‘™Ò "%+5@FC=<>BGLQV[`eins|„‹“Ò !'29832469=@EJOSX]bfkou}…ŒÓ  ',,)(),/258;>BHLQVZ_dhlpw•Ó "$" !$(+.147:=@EJNSW\`eimq‰ŠÓ  #&),/258;>BGKPTY]aej~wÓ "%(+.1479AFJNSfm^adhÔ  #&),.1479=?AEHKNQÖ "$'*,/=P;8:<>@CGIL×  "%'*7J63579;=?BDJ×  #%2E3.03578:<>@LĜ !+A/*,.024689;>JĜ '<+%')+-/13568AAÙ $8)!"$')+,.0246@9Ú  3' "$&(*,-/1785Ú /%!#%')*,.512Û *#!"$&')-/-/Û &  !#$&*)*,Ü " "#%&')Ŭ  "#$%Ŝ  !"Ŝ ß  à   á  !ŭç " #ä $ċ %è 'ë )é )î ?Ö>?>??@ABDF^D]BEE?K@?C@?CdJ??AQN@??>B^‡„ZC??úACFHKL L?>ä?BFHJLNdMcJOFEI?AB?A_J??ESG??ù@Sƒ]C??ûBDGIL LŝB??äAEIMORTUgVhRVNSGCD?@ZI??JQB??úIt^D??úADEHJL LÚXA@CHLPUVZ\]k`h[[VXNLEAUH?@MK@??Ei{^C??÷ADFFEFHKLLŝKLLÜDVGJNSX\^aceokod_aZUQKWJ?BNF??A^vaC??ôAFJJFAADFIKLLKÙMOTZZ@H]SUX_bfgjlttmkgg`\V_TEFMA??Tp`D??@ELMIC@?@BDFIKLKKÚMRXab_[KRg^_cimmrsz‚srpkebh_QSL@?Jj`D??ĝ@CKNKD@??ù@ACFHJKKLÜQVgusgQh[]pihotu{~„…|ywplrj]^SHH^^C??ùBIMKD@??ĝ>?ACFIKLLĠMRZu}}‚LTkmhysr}‹•ž¨İ˜uyuih[Ug`F??@HLKE@??>?úBDFIKLLĜMRYt}}vPW^lztƒ•ݏĊÌÊĵ°˜‰}tofmnVIBDJJD@??>?ù@BDFHKLLÜQVdurfSZbip‚‡ĦµËÛàîçÛÌğ£†xzzi[WSME@??>ù?@AA@@??ù@BCFHKLLŜNRV^a_ikglry™şÓáöòú÷öĉĠ·œ‡znhcZOF??ĝABCDCA@??úACEHJLL×MPRTTXcs{€‡Ççûôĝûġġûċ݈xqh`XQKEBBC@?C@? ?úACEGJLLŜMNMMLkxu{–ıĜñùüĝ÷ĝúúô×ĥ‘wohb[RJB??@ìABCDEFHKORVZ]_`bccdeeòdaZcn}…ĦáùüùööäúôĝÛÀ™}vojea]WSTUVX[]_adgjmoopÒrtvx{|~}{ywurojYblw‰ Ŝ÷ñöö÷úòúóŬœ}umf_XPIE EFGúIKNPRSSRQáPNYcly—˘¸Òġ÷úġùĝüĝġÛ·wmg_YQJB??úACEHJL LW`jv…•ħËâöùĝòû÷ŭñÔ²Œxqh`XOH@>>?ù@BDFIKLLWbpx|‚›ğÖòò÷ŭġ÷ñßLJyoic\PG?> > ?ùACEGIKLLáacdkox‡Ċèéòôâ×Ĉ­–wxi]VSNHD?>>?ùACEGIKLLŜQX_fmqy”¤¸ÊÒÙÔÌş§’}}hhi\KC@FJKHA>>?>ĝ@BDFHJKLLÚNU\afozƒ™¨Ğ·´Ğ›‰|xumxeVX\N@??@ELMKC?>>?>?ĝ@BCEGIJKKLáIPW]e{pnx}‡ˆŽ‡€vtqnm_khKCKYRB??÷@DKNLFA?>>?>÷?ACDFGIJKKßELRYqgfkruxs{yzyplkfdcSVgJ?@M^YC??÷@CIMMIB?>>?>Ô?ABDEFGHIAGNg]\`glqnltprrjfcbYYZHD`]@?@Ne]E??÷@BGKLHB?>>?>Ô?@AABB?C\SRU[dbkffnhnfi`\XYNMQ@?SmJ??@Of`I@??ùADGGC?>>?>Ĝ@WKFKPV\]c^^i`h^dXVQPNBEQ@?Goa@??AQgfLA??@?>?ßZL?@DITQ[XVXdY`W]SNLEID?EUA?AcwI??ùAQlkQB? ?>ŝP??á@ELIXNNP_RXSOUFF@?JA?FXC??O}bA??ùBRpnVD? ?>?áIACPEFGZJKPDR@@C?AK@?F\C??Er{K??ĝBUoqZF@??>?ŬBI?HG?@@SDAQ?LE?C@?EI??F\E??A^ˆdA>??ĝCUqu^H@??úKA?P@??ìPD?R?BO?@D??JF??F\G??ûMƒM??ĝCUsxdMB??úBK?@Q??ëOE?R@?S@?C@?@MC??F]I??ùEq’gC>??÷@EXu{hNB? ?úMB?GL??êNG?SD?OG?@D??BM@??E^K??ĝA\‘ƒM?>??÷@FYt{iPC? ?ùCL??SB??ïNI?JM?BV??CA??FK??üF_N??ùJ‚—hE>??ö@FWrzkRD@??úLC?@U??óNK?DV??XA?@C??ŭJG??ûFaP@??ĝDmœ†Q@>??ö@FWpxkSE@??ùBM??GQ??íMN?AY??OM??BA??@MD??ûFbR@??ĝAX“žiF>??÷@FVmviRC??ùLD??RH??òMP??YA?DW@??C??üBMA??ûFaTA??÷@J€İ‹T@>??î@ERhpdO@??BN??@WA??ñLR??ZE?@XD??AA??üFK@??ûF`UA??÷Ej£˘mH>>??ñ@EO_cR??KE??EU??ġLU??SM??PP??ŝA??ŭIG??ûF`WB??÷AW’‰UA>??ôAGI@?N@??PM??ôLX??LV??D[@??ü@KD??ûF_YB??÷KyĴ£nI?>??ùG??@XC??ôLZ??F[@?@\E??üBJA??ûE^ZC??öDe ħŒYC>>??ù@??DY@??ôL]??B^A??QU??ŭCG??ûE^[D??öAVµĤpK?>??ŭOR??óK`??@_E??D^A??ŭDB??ûE\ZD??öKuŻ·_D>>??ü@YG??ŭKa??ĝ[L??@\I??ŝB??ûDXWC??öDe Ĵ{T@>??üCZA??ĝKb@??VU??üQW@??ûCTTB??îAVŽżÁšlJ>>???LV@??òKb@??M]@??E^C??ûBOOA??@K~ıÏż˜r>?@VL??òKc@??G`A??A[L??üAHF??òFp´ĜÛÍÜî?CYD??÷JcA??CbD??üPY@??ŝ@??ûBbğĉîîû?IW@??÷JdA??A`I??üE^D??ŭ[Ûîîü@RO??÷JdB??@\Q??üAZM??ŝdîîüAWF??üJeB??üS[@??üNYA??îüFVA??üJfC??üL`A??üD\E??îüLO@??üJfD??üFbD??ü@WN??ŭPF??üJgE??üC`H??üKUA??ŭMA??üIgE??üA\N??üCTD??ŝG? ?üHfE??û@UT@??ü@MH??ŝ@? ?üGeF??üNV@??ŭCI?? ?üGcE??üGVA??ŝC?? ?üE`F??üCRB?? ?üD]E??ü@MC?? ?üCXE??ŭDA?? ?üBSC?? ?ü@KA??ŝùŭŝŭŝŝîŝŝßŭïŝġŭóòŝéüŝé÷ŝüè÷ŝŝúâĉüŝŝŭüöîïĝŭŝŝŭÜŝûŝŝŭŝġŝêüùíŝóîŝŭë÷ŝŝôàŭŝŭŭĝï÷ŭŝŝĜüŝüûŝŭŝúñŝŝŭòŭöŭêŝëüûéŭŭîĝŝŝíâĝŝŝŭúò÷ŭŝŝüŭüûŝŝöîüŝĝüŝŭŝíŝŝĉôüùùúïŝêúŭĝŝüèêŭŝŭûôñ÷ŭŝŝùŭùòîòúŝ ŝŭÜúïüŝôŭŭŝñúŝŝöûùïüîûòòŝóĝŝùĉóŝŝü÷ò÷ŭŝŝ÷ŭùĉçïùŭŝŝŭŝßûüúôŭŭûñŭŝ÷ûüîûîüëŝôĝŝôèúŝŭùô÷ŭŝŝĝûòáèġüŝŝŭŝàöŭüñüööŭŝïüûù÷ûññüìŭġĝŭïïŭŭûġ÷ŭŝŝĝüġĉàċôûŝŝŭ ŝÙûġüŭüñúŭòûúúûġúó÷ġ÷üìöŝü÷ĝŭŝŝŭ÷éàäóüŝŝŭŝŬŭĝùŭñüïŭŭôûĝóôú÷÷ùíûŭĝĝŭŝŝûìċñûŝŝŭŝâûĝŭôúôŝñùüûôöùùġòŭúùŭŝüòççóüŝŝŭŝĉŭùûĝġù÷òü÷ġġĝúòùûùüŭġëêòŭŝŝ÷ŭüúġóòġùŝŝĜġĝŭŝúĝûúûòúóú÷ùôúôûúüùïíôüŝŭüĝïìèêìò÷üŭŝŝßüĝ÷ùü÷÷úüôĝûġġüġûûòñôüüĝîìèëìġúüŝŝŭŝúüŝŭúúì÷ùüĝ÷ĝúùĝöóöñëñúŭŝŝŭüûàúùĝ÷ööġôóòññïïîîïïñŝŝŭüŭüüŭûüùööòúôúñùöûûù÷öôòññóïîíìêèĉċáàßßŜŝŬŜŜüŬŜßààââäċĉéëûùĝĝùúúùùñöö÷úòúôóûúüüûû úùúáûüŝüööóôöù÷úġùĝü÷÷öòġíô÷ĝûŭŝ"ŝàíòġüùö÷ġïöùĝòûöŭûú÷óòóüŭû÷ĝĝûŭŭŝ ŝĉúóóùùġöġûó÷ŭġ÷ĝûüú÷úúïíîùŭ ŭŝáġŭüġùö÷ûñĝ÷ûġùùûüùóùŝüîêêòûŭŭŝßûúŭġúĝöġ÷÷û÷÷óòùöüûŭĝó÷ŝŝûçċë÷üŭŭŝŭ ŝġû÷ŭöúòôġîûööê÷ĝóŭúüŭĝñöŭŝŝüòäáċóúŭŭŝŭŝ ŭŝŭûŭóüìĝöôôúĝĝ÷ïĝòöñŝûúŭŝ÷ïóüŝŝ÷üôċàâí÷ûŭŭŝŭŝŭŝôüñùîúöùúöóġġò÷÷ñŝüùüŝŭöìïûŝŝ÷üġéááéġûŭŭŝŭŝßŭôüĝòĝóòŭ÷ŭöóŭìŭìüĝŭŭùùŭŝŭġèíúŝŝ÷ü÷íääêġûŭŭŝŭÚŝŭôûüíŝëŭûôġŭñüó÷òûëŭĝîŭŝû÷üŭŝŭôèëĝŭŝŝĝŭúóííóûŭŭŝŭĜŝóúŝúĝñûòĝóóŭñŝŝêŭġîŝĝìŭŝŭ÷ùŭŝŝŭóĉçöŭŝŝúüúûŝŝŭŭŝÖòĝŝ÷ġŝëŭòùġûñŭòüñúĝíŝíôŝĝèüŝŭùöüŭŝŝüóääóüŝ ŝŭŬöŝüòŝĝïŝìŝïŭîüô÷úïŝéûŭçùŝ÷ċúŝŝûġĝüŝŝùüòáâûŝ ŝŭŝŬġüŝêûûîŝòŝíûùóŝìŭĝìŝùĉüŝöâùŝŝŭöġûŭŝŝĝüñáàîúŭŝŝŭáŝûúŝĝêŝóôŝŝîúŭìŝ÷ŝêùŝñèŝŝ÷áĝŝŝúùóĝüŭŝŝĝûàŜëĝŭŝŝáüŝŝçúŝéüŝġŝïùŝëŝúìŝùèŝŝçïŝŝ÷áöŝŝúûóôûŭŝŝĝûßÛçġüŝŝâĝĉŝüèŝŭöŝïĝŝëŭŝèŭŝé÷ŝüáöŝŝöàôŝŝùŭöñ÷üŭŝŝ÷ŭúîŬÚċôüŝ ŝáĝŝóîŝüúŝ÷ŝëùŝíġŝûçŭŝĝàûŝŝ÷ßòŝŝùùñóûŭŭŝŝ÷ŭúîŜÙäóûŝ ŝŜöäŝŝċùŝŭŭŝñġŝóŝúċŝŝíôŝŝäŭŝŝ÷Ŝïŭŝŝùûó÷üŭŝŝ÷ŭúïŜÚâòúŝŝĝŭċôŝüŭŝŝîñóŝùçŝŭûŝûèŭŝŭĉìŝŝûöÜìŭŝŝĝŭöïòúŭŭŝŝ÷ŭùîàÛâñúŝŝù÷âŭŝôèŝŝñïŝüäŭŝìîŝŝôŝŝüàóŝŝû÷Úêŭŝŝĝŭùî÷üŭŝŝ÷ŭùïáÛòûŝŝùċóŝŝçóŝŝìñïŝŭäüŝĝŭŝüìŭŝŝöàùŝŝû÷ÛéüŝŝĝüóìñùŭŭŝŝîŭúñäßçôŭŝŝĝáŭŝüàûŝŝñòíŝŝĝŝŭâĝŝŝġġŝŝüïäüŝŝûöÜçûŝŝ÷ŭöííöûŭŭŝŝñúóéçòŝŝċñŝŝöâŭŝŝêòêŝŝêŝŝëëŝŝŭóŭŝŝŭèìŭŝŝû÷Ŭċûŝŝ÷ŭùïëñùüŭŝŝôüù÷ŭŝàüŝŝèìŝŝòèŝŝçŝŝĝßŭŝŝûûŝŝüûäôŝŝû÷Ŭäúŝŝ÷ûóëíġûŭŭŝŝùîŝŝŭŜĝŝŝôòĉŝŝ÷âŭŝŭŜöŝŝü÷çùŝŝû÷Ŝâùŝŝöŭ÷íêĝüŭŭŝŝùûŝŝ÷Ŝüŝŝôòŝŝúßûŝŝêĉŝŝüôíŭŝŝû÷Ŝáùŝŝ÷ùéìġûŭŭŝŝŭêċŝŝóòáŝŝüŜ÷ŝŝĝÜûŝŝüŭóöŝŝû÷àâĝŝŝöüôêéĝüŭŭŝŝüüŜóŝŝóóßŭŝŭâŝŝüŜòŝŝüŭ÷ŭŝŝûĝċùŝŝöŭöìçêóùŭŭŝŝüĝÜúŝŝĝóßŭŝŝĉèŝŝüêŭŝŝûùèèúŝŝîŭùïçĉíġûŭŭŝŝŝíáŭŝŝòóŜŭŝŝïàŭŝŝöÛùŝŝûúííüŝŝñûòèäĉíôŭŝŭáíŝŝòóŜüŝŝġÜûŝŝüŜïŝŝüüôöŝŝòüôèâáäáŬŝùŬ÷ŝŝ÷óŜüŝŝùÚĝŝŝüêáŭŝŝŝüŝŝóŭ÷ĉßŜŜŬŬŝñàüŝŝ÷óŬüŝŝûŬóŝŝü÷ÛĝŝŝüùáŜŬŬûŭĉéŭŝŝ÷óÜûŝŝŭàëŝŝüüßíŝŝŝ÷ŬŬüúßġŝŝüóÜûŝŝüéáŭŝŝüíàüŝŝŬüġáûŝŝüôÛúŝŝüÜûŝŝü÷ÜöŝŝúŬÜìéŭŝŝüóÚùŝŝüöÚĝŝŝûüìŭŝŝŭèġŝŝüôÙùŝŝüùÜôŝŝüïċüŝŝŭëûŝŝüġÙĝŝŝüüßîŝŝüùĉĝŝŝŝóŝ ŝüġÚĝŝŝûŭçèŭŝŝüŭîóŝŝŝüŝ ŝüöÛ÷ŝŝüîĉüŝŝüĝòŭŝŝ ŝüöŬ÷ŝŝüġĉûŝŝŭŭùŝŝ ŝü÷ß÷ŝŝüúêúŝŝ ŝüĝâĝŝŝüüïùŝŝ ŝüúĉĝŝŝŭĝûŝŝ ŝüûëùŝŝŝŭŝŝ ŝüŭòüŝŝUÖTUTUUPWXYZdZeWUTUSUUNSUV^WUUTOOTUUTU[ecZVUUùV\enw„ „ŝƒUUTÛUXU\_`ajak^ZZXUURPUU^XUUSORUUTTZee[VUUùX`irz‚„ „׃VUTTWZ^`_fghoiqe`b][WPUU^XUUSQTUUTXeg]VUUúY`ku}„ „ŭƒ]VVŜ\adhcmoouqtlhhcbXYV]XUUSRUUTVdi_VUUöTROLUbmw€„„ƒá„‡W^Z^_gknlruvzy{pqlkd`_aZUUTTUUûajaVUUóSNIIMT^fox…„„ƒŸ¤V[feghqtwt{}€}vxrqgijcZVUUû^jcWUUTPJHKQTUX`gpy‚…„„ƒ„ĝ‹˘ĤĤd_eooĉsz~y‚‚†‹‚}{{qssme_YUUZidWUUĝTRMJKQTUUùY`hqz‚„„ŝ™ĤĤâaploxyv„‰Œ‘‘ˆ†}z|wogc]ZedWUUùSOMMQTUU÷TX`hqzƒ…„„ŭ…ŸĤĤÜ`guyx‚~Œ™ž§ħ°Ħ—…€xqmhoiYUUTRPORTUUTöUY`hpy‚……„„ŭ…œĤĤßdjqz„ƒ‰Ÿı½ÌÒÏÁ·Ħ•‰zwywg^WTRQSTUUTU÷Y`gox……„„ß‘ĤĤfmtz€Œ“İğÑŜâçŜÁĴ…†„xnf^XTUUTùSQPOPRUU÷X_fnv€……„„Ġ…—¤Ĥrvw}‡£À×â÷òùööçÙ½§’‡|tmhb[UTSPNMTOPRTUU÷W^emu}……„„Ù…Œ“ks‡Ž—ŻÌèúóĝûġġûĉÓ·’ƒ}xqi_XQPOYVTaXUU÷V[cjs{ƒ…„„ƒ„v‚…“ĤÁÜñĝûĝöĝùùóÚĵœƒ|sohd^WU UTÑX^ekry~~}|{zyyxyny†–ĦµÌċĝûĝġööùóĝÜĈ˘‹„}wqlf`\\[ĈZYYXWVUTRQOPSVZ_diruvuuttsstumx‡›ĞĵÎ÷öö÷úñúòßÉĤ‹ƒ|vpha[WWVUTùY_gnv~‚‚߁‚‚ƒnzˆžĴıÉĜġ÷ùôù÷üöôŜ½š„yvmic]WUUĝW^emv}ƒ„„àftƒ—¨°ÀÒġĝĝòûöüñĜı–ƒ}xrka[TSTTUUùZaiqx„„jvŒ–šĞÚóòöüô÷ñâ˒†~ungb[UT TUĝV\ckry€„„âjqy€„Œ—°ËÔééòġâÚ˵ Œ„€xoh_XSSTTU÷V]dkryƒ„„Ŝelqx€‰­Î×Ŭ׿‹Š‡yurj_XUSRQQSTTUT÷V]dkqx~ƒ„„äbhnsv‰ˆ˘°ħş²¤•†…€|tifd\UUĝTSONNQSTTUTU÷V[bhou{€ƒƒ„á^djov‚€z…‰‘”›™“Œ‚|{wqvr_YZ_[VUU÷TRNKKNRSTTUTÓUX^djpu{‚ƒƒZ`flyws{}ƒ…‡‡†ƒ}zwtrnffn[UUY^\VUU÷TRMIHKPSTTUTÚUX^chlptwyW\bommnvx|~y€}{qtmlhd\XgeUUûY^[VUU÷TRMIHJPRTTUÛVY[_abcUWedecnntuvtzyywuojjca^[UU_lZUUûX\ZVUUĝTSOKKNSTTUTŭU`[[ĉbginpomurspokbd_ZWVYUUYldUUûWZYVUUúTSSUUTTUŜ`ZUTV^_dgifjnklihe`ZZUTUVXUUVemYTUUüVXWUUTä\UTPUWY]ab]chdec``[RUURTUVXUUü\nbUUüTSTU UTUôQTUSUWZZW\b]]óYZVSPUTQUUVWUUúWhkYTUUúTRQRTUUTĉUSSUTSUVVUQV\WVZUWVUOSUSQUUú`m`UTUUùTSOMPSUUĉTUUQTUVUUQUYVUYUUWUSNUUPRUUTUúYjhXTUUĝTQLILQTUUâTQUUVUURUXVUXUUWUUNRUTNSUUTSTUUùVbk_UTUUĝTOHEIPTU UŭPTUUçTSUXVUXUUVUUTMUUSMTUUTQSUUù\hdWTTUUĝSMEAFNSU USOUUTUUTUUWVUVVUUóNQUUQMTUUSORUUùWbf\UTUUĝSMB>BLRUUúNRUUSUUîWVUUVUUTUUTLTUUMOUUûSMPTUUĝV]e`WTTUUĝRK@;@KRUUùSMUUTSUUVUTUĝOQUUTJQUUûSKOTUUùYaaYUTUU÷TRJ>9>JRUUùMQUURSUUVUóTSUUTMTUURISUUûSJMTUUĝV\`[VTTUUïQJ>9?KTUUSKTUTPTUUTUùRTUUPQUUüOITUUûRHLTUUûX\ZVTTUòQKA>HUULPUUSPUUùSTUURRUUĝOTUUTKLUUûRGJSUUûVXXVTTUôSPNTUITUUPQUUTUùSRUUTOUUSUüTIPUUûRFHSUUúTSSTTUUùNUUTMSUUùTSUUTQUUŭNSUUüQIRUUûQDFRUUúTRPPRTTUùSUUSLTUUôSRUUTOTUUPNUUüOKTUUûQCDRUU÷SPMLPSTTUUŭNMUUóSQUUTNSUUSKTUUŭOPUUûQCDQUUöTPJHJOSTTUUüTJQUUŭSOUUĝNQUUTKQUUüTQTUUûQDDRUUöTPICDJPTTUUüRHSUUŭRNUUŭNOUUŭNKUUûRFERUUQH@=CKQTTUUUNIUUŭRMUUŭPKUUüRGSUUûRIHSUUñSI=78?GTUTHNUUòRLTUURITUUTGNUUüSMOUUòSJ:1./)!USERUU÷QJTUUSGSUUüLGTUUŝTUUóTL6*%"UNFTUU÷QITUUTGPUUüQDRUUöN+# THJUU÷QHTUUTHLUUüTELUU÷J!SCPUUüPFSUUüKGTUUüKDSUUùODSUUüPESUUüNCSUUüQAPUUúJHTUUüPCSUUüPAQUUüTDJUUŭFOUUüOBRUUüRAOUUüLESUUŭHSUUüO@QUUüTBKUUüQDQUUŝMU UüO@QUUûTFGTUUüTIMUUŝSU UüO?QUUüJDTUUüQLTUU UüP?QUUüODSUUŭTQUU UüP?PUUüRFRUU UüQAPUUüTIQUU UüRCPUUŭPSUU UüRFRUU UüTKSUU΂ˆ’—œ ¨Ĥ§¨Şĥݳ§İ¨Ħ§™”–‹ƒ~‹ulhfnfWRMHCHZU>50-+'%$##Â"! ‰•šŸ¤§Ĵ­ŻşŻ¸Ĵ³ŞŞĴĦŸœ‹–ƒuopxi^ZTPQb_H<852/,)'&%%Â#! ‘—˘§İĴ°´²´´µĵ²¸ŻµĞ¨Ğž˜ ƒ|}~mfa[ZikTF@<9630-+*(&&‹$"  Ÿ¤ŞĞħ´ğ¸ışÁğığĥ¸Ż³ŞŞ‘ŠŽ„rmhepvaRLGB>;8553/,)('&%"!  °Ş­²³ĥıżżżĊÂÂĵÀ¸¸µ­²İŸ™œ€wpx€p^XSNIDAA€ =70.,+)('%#!¤Ş·²ĥşğÂĈÄĊÉÈĊÈÂĊ½µı²İݨ—„„Š|kd_ZUQPQME<740/.,+)'%" ²­²żşżÁĈËÊËÎÊËËĊĈÀş²´Ż£š•œzplfb`c`XLC>;8410.,*)&%#! Żğ·ıĈÈÈÊÑÒÒÑÎËÇÇÂş½´Ğ¨Ğ£†}sqsrj^TOID?<841/.-,+(&%" ³żÂÂÍÊÏÏÓ×ĜĜÛ×ÖÑÍÊÄı´¸³Ĥ›’‹‰…|pf`[UPJD?;85310/-,)'%#!ħĥğËÊÒÒÖĜŬŬƒÛĜÔÌÉÀÀż³Ĵ§¤Ħ˜‰{qlf`[UPKFA=:6421/.,)'%#!³¸½ÇÑÓĜÜŬáäâßÜĜĠÎËÉÀı·ĥħ§™†|rlhe`[UNHB>:7421/.-*'%#!½ÀÀĊÊÖÜßċè耧ĉäßŬÖÓÍÇĊÁş°Ş¤›’…}xph`YSNHC>;7421/.,*'%#!ĥ½ÇÌÑÓÙŬĉêìííëĉäßÚĠÑÊÂĵ¸ĥħ¤š‚wskd^YTOIC?;8421/-,*'%$" ĈÈÍÒĜŬáċéíñóñîêĉáÜĠÑËÈÁĵ³­§ž•‹wpje_ZTOJE@=:75321/.-,*(&$!¸żÇÑ×ŬàâèëñġĝöñìĉÜ×ËÇÂş·²ŞĦ˜‡€{xsokhd_ZUQMIFDB?=;;:73.*&"ıÁÉÓÜßàĉëñöû÷ñëçâÜÖËĊÀğµ°Ğ˘˜†{smhb]WRLGB>;7410.,*)(&#!¸ÀÊĠßâáäĉêîóġóïëĉáÜÖÏÌĊÁı´­§Ÿ•Œ‚xpje_ZTOID?<851.,+)'&&$" ğÁÉÚŜßáäèëîîìèċßÛÖÊÂĵ·²Ĵ§“Š€vojd_ZTOID?;851.+)'%$$€á" ĥÉÏÒÖÚŬàäèêêëèċáŬĜÔÎÇĈÁĵħޤ›’ˆ~tmhb]XRNHC>;741-*(&$##"! ĵÀĈÌĠÙŬáĉĉċċáŜÙÖÏÌËÂşµĥ²Ğ†|rmgb]WRLGA=9630-*&$""!! ²·ĵÂĈÌÏÖÙÜŜßààßŬÚĠÒÎËÂÁÀ·­¨˘ž™ƒslfa[VQKFA=963/,(%" Ż´ıÄÇÑÏÔ×ÚÜÚÜÚ×ÔÓÎÌÄĊĵµµ€gĴž”‹ƒ~}zqc[TPJE@<851.+(%"ĴħĥğżËÈÎÎÒĠÔÔĠÓÒÑÌËÇĈğ½ı­¨§§š‰~tnjhkh`UJC>;852.+'#  ݲ·ÄÀĊĈÍËÏÏÎÏÏÊÈÇÂż³ħµ§œ•“•‰smgb]YVWUOE<730-*'$  ĤŞŻĵıĵÀÂÇÊÇÊËÈÊÊÄĈÁ¸··Ğ§Ğ˘‡}…{h`[VQLGDCD@91,)%"  §´ħ²şıÂĈÂÄĈÂÇÀĵ·şŻ°˘š™œ…yqmpyp^TOJE@=97651+%! šĴŞŞħ²ĥğşż½żĵÂşÀ·ğħ²ħ§§”Œ‡nieaengSIC>;852/,)%"   €÷§ĞĴ·ħı·¸·ż·ĵĥş³ħ²Ş­›˜œ‡w}ƒjb]YUXc]H>:741-*'$! ”“™Ħ£İ°Ĵ·Ż´ħş²ĥ³°´ŞŻŸ¤•Š’zqmn~l[URMIKXSA73/,)&#  …‹“—›İ¨ħŞ­Ğĥ­­°¨ħ¤˘£—“˜†}‡piecqqVNJEA>CNL;0+(%" }„ŠŽ– ›¤Ĥ£¨°§Ħ§Ÿ˜›‰Š‰xqrib]Z_oXGA?<87;FE4)$  u{…–’˘˜šžœ§Ÿ›Ĥ˜—žŒ|xmjjwcZURQc]C<9741/2=<-" osx€Ž…‰™Ž”’œ–’Œ˜†‚†{sp|mfbbp\RNJGR_F842/,*(+44( knp‚{|†Œ…‡‰‰“Žˆ•ˆƒ‹‚yuznkktc^[ZiVJGB?CXN6/-+(%"!$-.$ fio|ps…{{}~‰…~„…yx„pnsmfdgiZVSS`OC?<:9IR9,(&# '(  bdsmkn€qrstu}tv‚po€mihmb_\d]ROKJYH=:753;N?*#! ! ]bpefnwklmnnwwnnljtpebe`[WU_RJGCCSD8530.0BD+  Xgb_aqkfgghiqshhzgeft`][_VSPOWHC?=>L@41.+)(2C1  UdXZ]p``bbcclpcctd_^o]XVVTNKHKL?=:89F;/,*'$"&:8#  €Î ZVSU[iZ[\]]^el]]idZYc`SQOOJGDAGC:8644?7+($"  .:' WLNP^]TVWWXX`hXX_eUSUdOLJHEB@>=;98<41.,**2-"*0 ABDHZIJKLMM€ĵT`MMN`KIHQRB@>=;:86455.,*'%%,(-# =>?JNCEFGGHHN\HGG[HCBCS?=;:87531/0-)'%#! '%$' 9;=N@9875420.-+*'$" #!$67:K<;<==>DS>>=IH;;:BE75421/.,*(&$" 34?*ŝ?>>+ŝ>??+>?+>,ŝ?>>,?,?,?,?-?-?-?.?.?.?/ŝ?/ŝ?\î/î.î-î,î.îïŝ+ŝ+ŭ,ŭŝ+ŝ+ŝ*ŝ*ŝ*ŝ*ŝ*ŝ*ŝ*ŝ*üóöŭŝŝ*üïôŭŝŝ*ŝŭŝŝ*ŝ*ŝ*ŝ*ŝ*ŝ*ŝ*ŭŝ*ŭ+ŝ*ŭŝ*ŝŝŭŭ+ŝŭŝŝ+ŭŝ+ŭ,ŝŝŭŭ,ŝ,ŝ,ŝ,ŝ-ŝ-ŝ-ŝ.ŝ.ŝ.ŝ/ŝŝ/ŝŝ\ŭŬÜ.Ü.Ü-ÜÛ,ÜÛ.Ûïƒŭ¤*ƒŭ‡¤*ƒ‚ŝ“+ù†ƒƒ‚•¤*ù¤œˆƒ‘¤*úĦ†£¤)û–Œ£¤)û›‰Ħ¤)û—…ž¤)ĝĤ¤‹ƒ™¤)ĝĤ£’ƒƒ‘¤)ŭ’ˆƒƒŭ‰¤)ŝ„ƒƒŭ„›)üz}‚ƒƒŝ)üx{‚ƒƒ*ƒ*ŝ„ƒƒ*ŝ„ƒƒ*ŝ„ƒƒ*ŝ„ƒƒ*ŝ„ƒƒ*ƒ*ƒü‚ƒƒ){üwo`*ü`]XUU*TU*ŝUTT+ŝTUU+TU+T,ŝUTT,U,U,U,U-U-U-U.U.U.U/ŝU/ŝU\ŭ.ü-û ,ú +ú -üîú +ú +ú +ù *ù *ù *ù *ù *ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ĝ )ù *ù *ù *ù*ú+ú+ú+û,û,û,û,û,û,ü-ü-ü-ŭ.ŭ.ŝ/ŝÀŭ.ü -û-û.ŝï+?,?.?0?2 ?4 ?6?:?=?+ŝ,ŝ.ŝ0ŝ2 ŝ4 ŝ6ŝ:ŝ=ŝ+U,U.U0U2 U4 U6U:U=U,ì -î .ñ 0ó2ú6úŝ7<ŝ? ?ŝB??+?)?'?%?#?!?? ?&?é ŝŝûŝŝ+ŝ)ŝ'ŝ%ŝ#ŝ!ŝŝ ŝ&ŝé UŝRUU+U)U'U%U#U!UU U&Ué ŝ     ġ       ġ     ĝŝ      ù üŝ#- îââââYL,&RŭVideo display˙     !ĈRŭĈ9&)&5&A&MRŭDžÎ Ġ!ßEèòÁû¨\ /2ĤQÌpNŒŠŞEÈMèÓK§·.XCE^Şq!‰9œżħFÉ9Û'Û7îד.­N‹qÒ‹Ż<Íç•çû{Ğ3 QŻkMĤ£İĈC××)è˜ŝ45KQojq‡İ£ġş„ş”Ĉ4ÔÂŬĊìxôM2 R$n$~$Ö$ĝ%%<%^%€%˘%Ä&³ú" /û* 8ü+:ŭ;ŭŭ!$$)ŭS ĝ(D\MTVUUTŝS(ŝ û.IRNNMüLKKJJ(ŝöERNMMLLKJJI'ŭú%TLLKJJIHG&ŭ1 ŭ"ZJJIHGF&ŝú LJIIHHGFED%ŭ7 úAHHGGFFEDC%ŝŭ!GFFEDCB%ŝ ü>EEDDCBA%ŝ ûEDDCCBA@?$ŭ*ŭ2CBBA@?>$ŝŭ5BAA@?>=<$ŝ ŭS@??>=<$ŝŝL>>=<;:$ŝŭ8=<<; :$ŝü7<<;;:9$ŝŝ6::9 8$ŝŭ5:99 87$ŝŝ3887$ŝŭ3877$ŝŝ2776$ŝŝ266 56$ŝü1665545$ŝŭ0544ŝ5#ŝŝ/4434³ú0 /û48ü1:ŭ;ŭŭ!$$)ŭY ù5lš£Ğ­­ĴŝĞ(ŝ ûC“ݰ°Ż(ŝĝŻ°°ŻŻŝ­&ŭü*Ż­Ĵ&ŭI ŭ(¤­Ĵ&ŝŭ—­ ĴĞ%ŭP ŭt­ĴĴĞŞ%ŝ!ŭ/İĴĴĞŞİ%ŝú~ĴĴĞĞŞŞİŝ¨$ŝ ŭŞŞİ¨$ŭ3ŭLŞİݨ§$ŝŝnİݨ §Ĥ$ŝŝ¨¨§Ĥ$ŝŝœ§§Ĥ$ŝŭ™§ĤĤ¤$ŝü˜ĤĤ¤$ŝŭ—¤¤£$ŝŝ–¤¤£˘$ŝü–¤¤££˘$ŝŭ•£˘˘ Ħ$ŝŝ”˘˘Ħ$ŝŝ”ĦĦ$ŝŝ“ĦĦ ŝĦ#ŝŝ“  $ŝü’  ŸŸ ³ú-   /û18ü0:ŭ;ŭŭ!$$)ŭX ÷3f•ŸŸžž)ŝ ü@‡  Ÿ(ŝûw  Ÿ Ÿ'ŭŭ*‘Ÿ Ÿŝž%ŭE ŭ'™Ÿ Ÿž&ŝŭŒŸŸ ž%ŭL ŝmŸŸžŝ$ŝ ŭ.›ž ž%ŝŝužž %ŝ ŭ™žž$ŭ2ŝI$ŝŝg œ$ŝŝ‰ œ$ŝŝ”œ$ŝŝœœ$ŝŝœœ$ŝŝœœ›$ŝŝœœ ›$ŝüœœ››$ŝŝŽ››$ŝŝŽ››$ŝŝŽ››$ŝŝŽ››$ŝŝŽ›› š›$ŝŝšš›µû §Ö÷ĝĝ0ü8ŭ˙ ˙.ŭƒû˙ ˙-ŝê˙˙+ŭŭ˙˙*ŝ¨˙˙ŝ×3ŝİ˙˙ŝ4ŝm˙˙ŝk6ŝŝ˙˙8ŝß˙˙8ŝ5˙˙9ŝï˙˙ŝ8˙9ŝı˙˙ŝz8ŝû˙˙:˙:˙ŝÌ8ŝƒ˙˙ŝ8ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙ŝ8ŝŞ˙˙ŝ 8ŝŞ˙˙ŝ 8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ€ À?$ŝSRRQPONMLKJIŝHGGJIHGFEDCBA@ŝ?> >?HGFEDCBA @ŝ?>>?@ŝGFFEDCBA@AEDCBA@ABDCBA @ ? @ABŝCBBA@? >ŝ?@@ABCBA@?>ŝ?@@ABCD@?>@ABCDEŝ?>>=>ŝ?@@ABCDEFŝ>==<=>@ABCDEFŭGH<<=>ŝ?@@ABCDEFúGHHI<;;<=>@ABCDEFùGHHIIJ::;<=>ŝ?@@ABCDEFúGHHIIJJ:;<=>@ABCDEFúGHHIIJJŭKL9 9:;<=>ü?@@AABCD÷EFFGHHIIJJûKLMN8 89:;<=>@ABŝCDDEFûGHHIJJüKLMNN789:;<=>@ABCDEôFGHHIIJJKLMNNŭOP7789:;<=>ö?@@AABBCCDDìEFFGHHIJJKKLMNNOPQR7 789:;<=>@ABCDEFHIJôKLMNNOPQRRS66789:;<=>@ABCDEġFGHHIJJKKMNNĝOPQRSTT66789:;<=>Ü?@@ABBCCDDEEFGHIIJJKLMNNOPQRSTTUV5566789:;<Ú=>>?@@ABBCCDDEFFGHIJJKKMNNOOQRRSTUVVX556789:;<=>@ŜABBCCDDEFFGHIJJKLMNNOPQRSTUUVWXY4556789:;<=>@ßABBCCDDEFFHHIJJKLMNNOQRRTTUVWXXY[€/À?$ĞŞİ¨§Ĥ­ĴĞŞ ݨ§¨­ĴĞŞ İ ¨ §¨ĴĞŞ ݨ§¨İĴĞŞ İ!¨İŞ İ¨§ ¨ İŝŞİ İ ¨§ ¨ İŞİ ¨§¨ İŞŝШ¨§¨İŞĞŭĴ¨§$§¨İŞĞĴ§ Ĥ§¨İŞĞĴĤ §¨İŞĞĴ­ĤĤ§¨İŞĞĴ­ ¤Ĥ§¨İŞĞĴ­¤Ĥ§¨İŞĞĴ­ŝݤ¤Ĥ§¨İŞĞĴ­Żŝ°££ ¤Ĥ§¨İŞĞĴŝ­Ż°˘£ ¤Ĥ§¨İŞĞĴ­Ż°˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°ŭħ²ĦĦ˘£¤Ĥ§¨İŞĞĴ­ŝݰ°ŝħ²²Ħ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°ŝħ²²³Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²³ŝ´ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°üħ²²³³´ŝ ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­Ż°ħ²³´µ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ€? À?$ ž 'œŸ ž)Ÿž,ž0 ž5žxž:ž8ž œ žŝœœ žŝŸœœ žŸœ žŸœžŸœ žŸœ ž Ÿŝ ››œ žŸ  ›œ žŸ  ›œ žŸ ›œ žŸ Ħ› œ žŸ Ħ› œžŸ Ħ› œžŸ Ħ˘› œžŸ Ħ˘› œžŸ Ħ˘€ĝ<ù˙@€+À?$GHIJKLMNOPQRŭSTUUVŭWXYYüZ[[\\ú]^^__@@ABCDEFGHŝIJJûKLLMNNOëPQRRSTTUUVVWXXYYZ[@@AABCDEFGHIJûKLLMNNĝOPPQRRSTTûUVVWXX÷YZ[[\\AABBCDEFGHŝIJJKŭLMNNĝOPPQRRSTTûUVVWXXöYZZ[\\]^^BBCDEFGHIJûKLLMNNOòPQQRSSTTUUVVWXXĝYZZ[\\]^^_CDEFŝGHHIJKüLMMNNOPPQRRSSTTUUVVWXXĝYZ[[\\]^^_ü`aaDDEFGHIJûKLLMNNĝOPQQRRSTTUVVWWXXYYZ[[\\]^^_ĝ`aabbcDEEFGHIJKüLMMNNOòPQQRSSTTUUVVWXX÷YZZ[\\]]^^ï_``aabbccddEFFGGHHŝIJJKüLMMNNĝOPPQRRSTTUòVWWXXYYZ[[\\]^^_ü`aabbcdeGHŝIJJKŭLMNNĝOPPQRRSTTUVVWWXXYZZ[\\]]^^ö_``aabbccddefúgHHIIJJKŭLMNNñOPQQRRSTTUUVVWXXĝYZZ[\\]^^_ĝ`aabbccddefghŝIJJüKLMNNçOPQQRRSTTUUVVWXXYYZ[[\]]^^û_``abbŝcddefghiJKŭLMNNÜOPPQRRSTTUUVVWXXYYZ[\\]]^^__`aabbccddefghijûKLMMNNéOPQRRSTTUUVVWXXYYZ[\\]^^÷_``abbccddefghijkŝMNNOëPQRSSTTUVVWXXYYZ[\\]^^ĝ_`aabbcddefghijklmNóOPQQRSTTUUVWXXùYZ[\\]^^ĝ_`aabbcddeĝfgghhiijjklmnëOPQRRSTTUVVWXXYZ[[\]^^ñ_`aabccddeeffghhŝijjklmnoÙQRRSTTUVWWXXYZ[\\]^^_`aabccddeefgghhiijjkŝlmmnopŬRSTTUVWXXYZZ[\]^^__`abbcddeefgghhijjkŝlmmŝnoopqßpTTUVWXXYZ[\\]^^_`abbcddeefgghhijjkúlmmnnoopq rUVWXXYZ[\]]^__`abccddefgghhijjùkllmmnoopqrĉWXXYZ[\]^^_`aabcddeefghhijj÷kllmnnooppqrsèrXYZ[\]^^_`abbcddefgghijjĝkllmnnoppqrs tsâZ[\]^^_`abbcddefghhijjkklmnnoppŝqrrstuŝtss\]^_`abbcdeefghijjùklmmnoppŝqrrstu vus€7À?$ Ĥ§¨İŞĞĴ­Ż°ħ¨İŞĞĴŝ­ŝݰ°ħ²³´µĥ¨İŞĞĴ­Ż°ħ²³´µĥŝ·İİŞĞĴ­Ż°ħ²³´µĥ·İŞĞĴ­Ż°ħ²³´µĥ·ŝ¸ŞŞĞĴ­Ż°ħ²³´µĥ·¸ŞĞĴ­Ż°ħ²³´µĥ·¸ıŝĞĴĴ­Ż°ħ²³´µĥ·¸ıŝşĴĴ­Ż°ħ²³´µĥ·¸ışĴ­Ż°ħ²³´µĥ·¸ışüĴ­­Ż°ħ²³´µĥ·¸ı şğݰŝħ²²³´µĥ·¸ı şğĵŝݰ°ħ²³´µĥ·¸ışğĵüŻŻ°°ħ²³´µĥ·¸ışğ ĵŝݰ°ħ²³´µĥ·¸ışğ ĵ½°ŝħ²²³´µĥ·¸ışğ ĵ½°ŝħ²²³´µĥ·¸ışğ ĵ½ ŝħ²²³´µĥ·¸ışğĵ½²³´µĥ·¸ışğĵ½³´µĥ·¸ışğĵ½żû³´´µµĥ·¸ışğĵ½ ż´µĥ·¸ışğĵ½ żµĥ·¸ışŝğĵĵ½żüµĥĥ··¸ışğĵŝ½ ż Àżŝĥ··¸ışŝğĵĵ½żÀż€? À?$œ  ž Ÿ  ž Ÿ Ħ˘  ž Ÿ Ħ˘£ ž Ÿ  Ħ˘£ ž Ÿ Ħ ˘£ ž Ÿ  Ħ ˘£¤ ž Ÿ  Ħ ˘£¤ž Ÿ Ħ ˘£¤ž Ÿ  Ħ ˘£ ¤ž Ÿ Ħ˘£ ¤ Ÿ Ħ ˘£ ¤Ÿ Ħ˘£ ¤ Ÿ Ħ˘£ ¤ ŝĤŸŸ Ħ˘£ ¤ ĤŝŸ  Ħ˘£ ¤ Ĥ Ħ˘£ ¤ Ĥ§ Ħ˘£¤ Ĥ § Ħ˘£¤Ĥ§Ħ˘£¤Ĥ§Ħ˘£¤Ĥ§Ħ˘£¤Ĥ§¨§˘£¤Ĥ §¨˘£¤Ĥ §¨˘£¤Ĥ §¨ŝ˘££¤Ĥ§ ¨ ݨ€?ù˙@€  À?$ù`aabccddŭefggühiijjŝkllmno ponûm\\]^^û_``abbŝcddeŝfgghjkjih÷]^^__`aabbŝcddeŝfgghj kjihgôf^_``aabbccddeŝfgghjihgĝfeed`aabbŝcddefghŝijjihgfedŝcbbŝcddeŝfgghŝijjihgfedcbŝcddeŝfgghŝijjihgŝfeedŝcbbaĝ`ddeeffgghijŝihhgŝfeedŝcbbaĝ`__^effgghijŝihhgfedŝcbba`ĝ_^^]\gghhijŝihhgŝfeedŝcbbaò`_^^]]\\[hhiij jk jhgŝfeedcbaó`__^^]\\[[ZYjjkjhgŝfeedŝcbba`__^]]\\[ZYXXWjkkjŝihhgŝfeedŝcbbaú`_^^]\\ġ[ZYXXWVVkkllmlkjhgùfeeddcbbaí`_^^]\\[[ZYXXWVVUTmmŝlkkjhgüfeeddċcbbaa`_^^]\\[[ZYXWVVUUTSRnoonmkjhgßfeeddcbbaa`_^^]\\[[ZYXWVVUUTSRRQo oŝnmmŝlkkjhgŭfeddcbba`__^]\\[[ZYXWVVUTTSRRQPOppoŝnmmŝlkkjüihhggedácbbaa`_^^]\\[ZYXWVVUTTSRQQPONNppomkjÓihhggfeeddcbba`_^^]\\[ZYXWVVUTTSRQPOONNMLrqqppomŝlkkjÜihhggfeeddcbaa`_^^\\[ZYXXWVUUTSRQQONNûMLKJrrŝqppomülkkjjhgŭfeddbàa`_^^]\\[ZYXWVVUTSRRQPONNMLKJJIrrpomülkkjjhg×feddcbba`_^^\\[ZYXWVVUTSRRQPONNMLKJJIHGsrrŝqppoünmmkkjhgĠfeddcbaa`_^]\\[ZXXWVUTTSRQPONNMLKJJIHGFEssrrŝqppomËlkkjjihggfeddcba`_^^]\[ZYXWVVUTSRQPONNMLKJJIHGFEEDssrrŝqppoËnmmkkjjihggfeddbba`_^^\\[ZXXWVUTSRRQONNMLKJJIHGFFEDDC€?À?$ŝħ²²³´µĥ·!¸ü·ĥĥ··¸ışğ!ĵğ·¸ışğĵğşŝ·¸¸ışğĵğş¸ışğĵğşı şğĵğşı şğĵğ şı¸ şğĵğşı¸·şğĵğşı¸·şğĵğşı¸·ĥğĵğşı¸·ĥµĵğşı¸·ĥµŝ´ĵĵğşı¸·ĥµ´ĵ½ ĵğşı¸·ĥµ´³½ ĵğşı¸·ĥµ´³²½ ĵğşı¸·ĥµ´³²ŝħ ½ĵğşı¸·ĥµ´³²üħ°° ½ĵğşı¸·ĥµ´³²ŝħ°° ½ĵğşı¸·ĥµ´³²ŝħ°°ŭŻ ½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻż ½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­żż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻ­ŝĴżż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻ­Ĵż½ĵğşı¸·ĥµ´³²ħ°Ż­ĴĞż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŝĞŞŞ€? À?$ Ħ ˘ £¤£ŝ˘££ ¤Ĥ£ ¤ Ĥ£ ¤Ĥ¤ŝ£¤ ¤,¤+¤* ¤ŝ£¤¤, ¤£ŝ¤+ ¤£* ¤£˘ Ĥ ¤£˘Ĥ ¤£˘Ĥ ¤£˘ŝĦĤĤ ¤£˘ĦĤ ¤£˘Ħ § Ĥ ¤£˘Ħ  §Ĥ ¤£˘Ħ  §Ĥ ¤£˘Ħ  §Ĥ¤£˘Ħ Ÿ §Ĥ¤£˘Ħ Ÿ §Ĥ¤£˘Ħ Ÿ §Ĥ¤£˘Ħ Ÿŭž¨§ §Ĥ¤£˘Ħ Ÿž¨ §Ĥ¤£˘Ħ Ÿž¨ §Ĥ¤£˘Ħ Ÿž€ù ĝŝ÷ö ö"ô˙@€  À?$mlkjihgfûeddcbba`_^]]\\[ZZYXXVVUUTSRRQQPONNMMÌLKKJJIIHGggffeeddccbbaa`_^^]\\[ZYXXWVVUTSRRQPONNMLKJJùIHGFFEDDïCBBAA@?>>=feeddcbbaâ`_^^]\\[ZZYXWVVUTTSRRQPONNMLKJJùIHGFFEDDĝCBBAA@@>>ú=>=<<baÉ`_^^]]\\[ZYXXWVVUUTSRRQPONNMLLKJJIHHGFFEDDCCBBAA@@?>>=<<;a×`_^^]]\\[ZYYXWVVUUTSRRQPOONNMLKJJIIHGFFEDDŝCBBAŭ@?>>ŝ=<<;ŭ:_^^Û]\\[ZZYXWWVVUTSSRQQPONNMLKKJJIHHGFFEDDŝCBBûA@@?>>ŝ=<<;:é^]\\[[ZYXXWVVUTTSRRQPONNMLKJJIIHGFFEEDDCCBBAA@@?>>==<<;:9\è[ZYXXWVVUUTSRRQPOONNMLKJJĝIHHGFFEDDŝCBBûA@@?>>ŝ=<<;:98ZÑYXWWVVUTSSRRQPONNMMLKJJIIHGFFEEDDCCBBAA@@?>>==<<;:98XóWVVUTTSRRQPONNîMLKJJIIHGGFEEDDCCBBûA@@?>>ŝ=<<ŝ;::987VUèTSRRQQPONNMLKKJJIHHGFFEDDŝCBBAŭ@?>>ŝ=<<;:987UĝTSRRQPONNMLKJJIIHGFFEEDDCCBBAA@??>>==<<;:987SġRQQPONNMLKJJôIHGGFEEDDCCBB÷A@@?>>==<<;:98 7ûRQPONNóMLKJJIIHGFFEDDŝCBB÷A@@?>>==<<;:98 76ĝPONNMLKJJîIHGFFEEDDCCBBAA@?>>ŝ=<<;:987 6NóMLKJJIIHGFFEDDŝCBBĝA@??>>=<<;:987 6ċMLKJJIHHGFEEDDCCBBA@@?>>==<<ŝ;::9876 5öKJJIHGFFEDDôCBBAA@?>>==<<;:98765ëJIHGFFEDDCCBBA@@?>>=<<;:98765 45÷HGFFEDDCBBĝA@?>>==<<ŝ;::9876545FEEDDCBBAA@?>>=<<;:987654ñ5EDDCBBAA@?>>=<<ŝ;::987654 34ë5DCBBA@@?>==<<;;::9988765434ò5BBA@?>>==<<;::9876543 2345€3 À?$·ĥµ´³²ħ°Ż­ŝĴĞĞŞİ¨§Ĥşı¸·ĥµ´³²ŝħ°°ŝŻ­ĴŝĞŞŞİ¨§şı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŝĞŞŞİ¨§ŭĤşıı¸·ĥµ´³²ħ°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥŝ¸¸·ĥµ´³²ħ°Ż­ĴĞŞİ¨§Ĥŭ¤¸··ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥ¤·ĥµ´³²ħ°Ż­ĴŝĞŞŞİ¨§Ĥ¤ĥµ´³²ħ°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥ¤ŝĥµµ´³²ŝħ°°ŝŻ­ĴĞŞİ¨§Ĥ¤£µ´³²ħ°Ż­ĴŝĞŞŞİ¨§Ĥ¤£ü˘´´³³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘³²ħ°Ż­ĴĞŞİ¨§Ĥ¤£˘ŝ³²²ŝħ°°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥ¤£˘Ħü²ħħ°°Ż­ĴĞŞİ¨§Ĥŝ¤¤£˘Ħ°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥ¤£˘ Ħ°Ż­ĴĞŞİ¨§Ĥ¤£˘ĦŻŝ­ĴĴŝĞŞŞİ¨§Ĥ¤£˘Ħŝ­ĴĴĞŞİ¨§Ĥ¤£˘ Ħ  ü­­ĴĴŝĞŞŞİ¨§Ĥ¤£˘Ħ ŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ ĴüĞŞŞİݨ§Ĥ¤ŝ£˘˘Ħ  Ÿ ĞŞİ¨§Ĥŝ¤¤£˘Ħ Ÿ Şİ¨§Ĥ¤£˘Ħ ŸžŸ İ¨§Ĥ¤ŝ£˘˘Ħ ŸžŸ €? À?$£ ˘Ħ  Ÿžœ ¤£˘Ħ Ÿžŝœ¤ ¤£˘Ħ Ÿž œ¤£˘Ħ Ÿž œ¤£˘Ħ Ÿž œ¤£˘Ħ Ÿž œ£˘Ħ Ÿž  œ£˘Ħ Ÿž  œŝ£˘˘Ħ Ÿž œ˘Ħ Ÿž œ›˘Ħ Ÿž œ›ŝ˘ĦĦ Ÿž œ›Ħ Ÿž œ ›Ħ Ÿž œ › Ÿž œ› Ÿžœ› Ÿž  œ›Ÿž œ›Ÿž œ›Ÿž œ ›ŝŸžž œ› š›ž œ›š›ž œ›š›ŝž œ›š› œ ›š›€ôŝġö ö ĝù˙@€.À?$üGFFEEDCBA@ ?@ABCDŝ=<<ŝ;::987656789:ŝ;<<;:9876789:;<;:987678ŝ9::ŝ;<<=ŝ>::98 7 6789:;<ĝ=>>?@::998 76 789:ŝ;<<ĝ=>>?@@A998789:;<ô=>>?@@AABB988789:ŝ;<<ĝ=>>?@@ABBŭCD88789:;<=>û?@@ABBúCDDE87789:;<ô=>>?@@AABBCDDüEFG7789:;<ĝ=>>?@@ABBŝCDDúEFGHH7789:;<=>û?@@ABBôCDDEEFGHHIJ776 789:;<=>û?@@ABBòCDDEEFGHIIJJK6 6 789:;<=ç>?@@AABBCCDDEFGGHIIJKKMN6 6789:;<=ċ>?@@AABBCCDDEFGHHIJJKLMNNO6 6789:;<=>@ABCDïEFGHHIJJKLMNNOPQ6 6789:;<=>?@@ABBCCDDEFGHHIJJKLMNNOPQRS556789:;<Ŝ=>>?@@ABBCCDDEFGHHIJJKLMNNOPQRSTU556789:ŝ;<<ĝ=>>?@@ABBĉCDDEFGHHIJJKLMNNOPQRSTUVW556789:;<=>@ŝABBäCDDEFFHHIJJKLMNNOPQSTTUVWXX556789:ŝ;<<Ù=>>?@@ABBCDDEEFGHIJJKLMNNOPQSTTUVWXYZ[556789:;<=÷>?@@ABBCDDäEFGHIIJKLMNNOPQRSTUVWXYZ[\]55678ŝ9::;<Ö=>>?@AABBCDDEFGHHIJJKMNNOPQRSTUVWXYZ[\]^^556789:ŝ;<<Ó=>?@@ABBCDDEFFGHIJJKLMNOPQRSTUVWXXZ[\]^^_`5566789:;<Ô=>>?@AABBCDDEFGHIJJKLMNNPQRSTUVWXXY[\]^^_`ab€) À?$¤£˘Ħ Ÿ Ħ˘ŝ§ĤĤ¤£˘Ħ˘£¤Ĥ¤£˘Ħ˘£¤Ĥ¤£˘Ħ˘£¤Ĥ§ŝ¤¤£˘Ħ˘£¤Ĥ§ŝ¨¤¤£˘Ħ˘£¤Ĥ§¨ŝݤ¤£˘Ħ˘£¤Ĥ§¨İ¤£˘ Ħ˘£¤Ĥ§¨İŞ£˘ Ħ˘£¤Ĥ§¨İŞûĞĴ££˘˘ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ˘ Ħ˘£¤Ĥ§¨İŞĞĴŝ­˘˘ Ħ˘£¤Ĥ§¨İŞŝĞĴĴü­ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŭݰĦ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­Ż° Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­Ż°ħ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­Ż°ħ² Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­Ż°ħ²³ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­Ż°ħ²³´ŝ ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­Ż°ħŝ²³³´µŝ ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴ­Ż°ħŝ²³³´µüĥ  ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²³´µĥŭ· ĦĦ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²³´µĥ·ŝ ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°úħ²²³³´´µĥ·¸ı€? À?$ŝœ› ›,š› œ*›œ(›œ(› œŝœœ&› œœ%› œœ#›œœ#› œž#›œž!› œ ž›œžŸ›œžŸ›œžŸ›œžŸŝ ›› œžŸ › œžŸ › œžŸ ŝĦ›› œžŸ Ħ› œžŸ Ħŝ˘›› œžŸ Ħ˘› œžŸ Ħ˘› œžŸ Ħ˘ŝ£› › œžŸ Ħ˘£ › œžŸ Ħ˘£ŝ¤› › œžŸ Ħ˘£¤€?ù˙@€    À?$ôDEEFFGGHIIJKK÷LMMNOPPQRRÌTUUVWXYZ[\\]^_`abbddefggiijkllmnnopqrss<<=>>?@@ABBCDD€EFGHIJJKLMNNOPRSTTUVWXYZ[\]^_`abcddefghijjklmnoop=>>?@@ABBCDDEEFGHIJJKLMNNOPRRSTUVWXYZ[\]^^_abbcdefghhijjklmnoopp??@AABBCDDEEFGHIJJKLMNNOPQRSTUVWXXYZ\\^^_`abcddefghijjkkmmnoppür@ABBÉCDDEFFGHIJJKLMNNOPQRSTUVWXXYZ\\]^_`abcddefghhijjklmnoopprBCDÌEFGHHIJJKLMNNOPQRSTUVWXXYZ[\]^_`abbcdefghhijjklmmnoppŝqrrŝCDDËEFGHHIJJKLMNNOPQRSTUVWXXYZ[\]^^_`bbcdeefghijjkklmnoopprsÒDEEFGHHIJJKLMNNOPQRSTUVWXXYZ[\]^^_`bbcddefghijjùklmnooppŝqrrsFÍGHIIJJKLMNOOQRSTTUVWXXYZ[\]^__`bbcddefghhijjklmnnoppŝqrrsÌtHHIJJKLMNNOPQRSTTUVWXXYZ\\]^_`abbcddefghiijjklmnnoppŝqrrsĠtuuIJJKLMNNOPQRSTUUVWXYZ[\]]^_`abbcdeefghijjùklmnnoppŝqrrstuÑJKLMNNOPQRSTUUVWXYZ[\]^^_`abcddeffhhijjkklmnnoppŝqrrstuÓLMNNOQQSSTUVWXXYZ[\]^^_`abcddefghhijjkklmnooppŝqrrsŝtuuÑNOPQRSTTUVWXXYZ[\]^__`abcddefghhijjkklmnooppqqrrstuváPQRSTTUVWXYZ[\]]^_`abbcdeefghijjùklmmnoppŝqrrsŝtuuvÖRSTUUVWXYZ[\]^^_`abcddefgghijjkklmnooppqqrrstu vŬTUUWWXYZ[\]^^_`abcddefghhijjklmmnoppŝqrrstu vÜVWXXYZ[\]^_`aabcddefghijjkklmnooppqrrstuvXäYZ[\]^_`abcddefgghijjkllmnoppŝqrrstuváY[\]^^_`abcddefghhijjklmnooppqrrstuvwxŝwvvâu\]^^_`abcddefghijjkklmnoppqqrrsŝtuuvw xvu^è_`abcdeefghijjklmnnoppqrrsŝtuuvŝwxxvuà_`abcdefgghijjklmnoppqqrrssttuuvvwxvuëabcdefghiijkklmnoppqrrsütuuvvŝwxxyxŝwvvuċscdefghijjkllnnoppqrrsstuuvvŝwxx yxvus€ À?$£¤Ĥ§ŝ¨İİŞĞŝĴ­­Ż°ħ²³´µĥŝ·¸¸ıĤ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışŝğĵĵ½§¨İŞĞĴŝ­ŝݰ°ŝħ²²³´µĥ·¸ışğĵŝ½ŝ§¨¨İŞŝĞĴĴŝ­ŝݰ°ŝħ²²³´µĥ·¸ışŝğĵĵ½ŝ¨İİŞŝĞĴĴ­Ż°ŝħ²²³´µĥ·¸ışğĵ½üżİİŞŞŝĞĴĴŝ­Ż°ŝħ²²³´µĥ·¸ışŝğĵĵ½żŞŝĞĴĴŝ­ŝݰ°ŝħ²²³´µĥ·¸ışŝğĵĵŝ½żĞĴŝ­ŝݰ°ŝħ²²³´µĥ·¸ışğĵ½żĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışğĵ½żŭĴ­ŝݰ°üħ²²³³´µĥ·¸ışğĵ½żŝÀݰüħ²²³³´µĥ·¸ışŝğĵĵ½żÀŝݰ°ħ²³´µĥ·¸ışŝğĵĵ½żÀŝݰ°ŝħ²²³´µĥ·¸ışŝğĵĵŝ½żÀ°üħ²²³³´µĥ·¸ışğĵ½żÀû°ħ²²³³´µĥ·¸ışğĵ½ż À²³´µĥ·¸ışŝğĵĵŝ½żÀ³´µĥ·¸ışğĵ½ż ÀÁÀ´µĥ·¸ışğĵŝ½żÀ ÁÀü´µµĥĥ·¸ışŝğĵĵ½żÀ ÁÀüµĥĥ··¸ışğĵŝ½żÀÁÀŝĥ··¸ışğĵ½żÀÁÀ·¸ışŝğĵĵ½żÀÁÀ¸ışŝğĵĵŝ½żÀÁÀŝżıışğĵ½żÀÁÀżŝışşğĵ½żÀÁÀż€? À?$›œžŸ Ħ˘£¤œžŸ Ħ˘£¤Ĥ§ŝœžŸ Ħ˘£¤Ĥ§žŸ Ħ˘£¤Ĥ§žŸ Ħ˘£¤Ĥ§žŸ Ħ˘£¤Ĥ§ŭ¨žžŸ Ħ˘£¤Ĥ§¨žŸ Ħ˘£¤Ĥ§¨žŸ Ħ˘£¤Ĥ§¨Ÿ Ħ˘£¤Ĥ§¨Ÿ Ħ˘£¤Ĥ§¨Ÿ Ħ˘£¤Ĥ § ¨ŭİŸ  Ħ˘£¤Ĥ § ¨İ Ħ˘£¤Ĥ§ ¨İ Ħ˘£¤Ĥ§¨İŝ ĦĦ˘£¤Ĥ§¨ İĦ˘£¤Ĥ§¨İŝĦ˘˘£¤Ĥ§¨İ˘£¤Ĥ§¨İ˘£¤Ĥ§¨İŝ˘££¤Ĥ§¨ İŞ İŝ¨££¤Ĥ§¨İ Şİ¨ŝ£¤¤Ĥ§¨İŞİ¨¤Ĥ§¨İŞİ¨¤Ĥ§¨İŞİ¨€(ùĝŝ÷ööô˙@€   À?$tuvŝwxxyŝz{{zyxĉwvvuuttssrqpoonmllkjipqrrssuv xwvuùtssrrqpponmlkjjihgfedcbrrsuvŝwxxwvutsrŝqppìonmlkjjihgfedcbbarrssŝtuuvwvuütssrrçqppoonmlkjjihggeddbba`_rssŝtuuvutsrqpoënmlkjjihggfddcba`_^]ssŝtuuvutsrŝqppċonnmlkjjihggfddcba`_^]\[ssuu vuŝtssrŝqppäonmmlkjihhgffddcba`_^]\[ZYsuu vutsrqpoänmllkjihhgfeddcba`_^]\[ZYXWuuvuŝtssrŝqppoânmlkjjihhgfeddcba`_^]\[ZYXWVUuuvutsrŝqppŜonnmlkjjihhgfeddcba`_^]\[ZYXWVUUTuuŝtssrŝqppÜonnmlkjjihhgfedccba`_^]\[ZYXWVUUTSRu uŝtssrŝqppÚonnmlkjjihhgfedcbba`_^]\[ZYXWVUUTSRQPu uŝtssrŝqppĜonnmlkjjihhgfedcbba`_^]\[ZYXWVVUTSRQPONvvuŝtssrŝqppÖonnmlkjjihhgfedcbba`_^]\\[YXWVVUTSRQPONMLvvuŝtssrŝqppÒonnmlkjjihhgfeddcba`_^]\\[YXWVVUTSRQPONMLKJvvuuŝtssrŝqppoÓnmlkjjihhgfeddcba`_^]\\[YXWVVUTSRQPONMLKJJIvuuŝtssrÌqppoonmlkkjihhggeddcba`_^]\\[ZXWVVUTSRQPONMLKJJIHGvuuŝtssrŝqppÏonmmlkjjihggfedcbba_^]\\[ZYWVVUTSRQPONMLKJJIHGFEuuŝtssrpoÏnmlkjjihhgfedcbba`_^]\[ZYXWVUTSRQPONMLKJJIHGFEDDuuütssrrqppoonmlkkjihhgfedcbba`_^]\[ZYXWVUTSRQPONMLKJJIHGFEDDCBuutssrrqppoonmlkjjihggeddcba`_^]\[ZYXWVUTSRQPONNLKJJIHGFEDDCBBAutssrrpÉonmlkjjihhgfedcba`_^]\\ZYXWVUTSRRPONNMKJJIHGFEDDCBBA@?ssr„qppoonmlkjjhhgfedcbba`^^\\[ZXWVVUTRRQONNMLJJIHGFEDDCBBA@?>>ssrrqpponmlkjjihhgfddcba`_^]\[ZYXWVUTSRQPNNMLKJIHGFEEDCBBA@?>>=>=<<;€?À?$ışğĵğşı¸ŝ·ĥĥüµżżÀÁÀżŝ½ĵĵŝğşşıŝżżÀÁÀżŝ½ĵĵŝğşşıŝ¸żżÀÁÀż½ĵŝğşşı¸ŝ·żżÀ ÁÀż½ĵŝğşşı¸·żÀÁÀż½ĵŝğşşı¸·ĥż ÀŝÁÀ Àż½ĵŝğşşı¸·ĥüµżżÀÀżŝ½ĵĵŝğşşı¸·ĥµŭ´żÀÀżŝ½ĵĵŝğşşı¸·ĥµ´ŝ³ÀÀż½ĵğşı¸·ĥµ´³Àż½ĵğşı¸·ĥµ´³² Àż½ĵğşı¸·ĥµ´³²ŭħ°À Àż½ĵğşı¸·ĥµ´³²ŝħ°° Àż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻÀÀż½ĵğşı¸·ĥµ´³²ŝħ°°üŻÀÀż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ÀÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻ­ŝĴÀÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻ­ĴÀż½ĵŝğşşı¸·ĥµ´³²ħ°ŝŻ­ĴûĞŞÀÀżż½ĵğşı¸·ĥµ´³²ħ°ŝŻ­ĴúĞŞŞİÀżż½ĵŝğşşı¸·ĥµ´³²ħ°ŝŻ­ĴüĞŞŞİİżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§ż½ĵŝğşşı¸·ĥµ´³²ŝħ°°Żŝ­ĴĴĞŝŞİݨ§üĤżż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ€   À?$ Ĥ§ Ĥ¤£˘§¨İ Şİ¨§Ĥ¤§¨ İŞ ݨ§Ĥ¤§¨İ¨§Ĥ¤£ŝ§¨¨İ¨§Ĥ¤£¨İ¨§Ĥ¤£ŝ˘¨¨İ¨§Ĥ¤£˘¨İ¨§Ĥ¤£˘¨ ݨ§Ĥ¤£˘ŝĦ¨¨ İ ¨§Ĥ¤£˘Ħŝ¨İ İ ¨§Ĥ¤£˘Ħŝ İİ ¨§Ĥ¤£˘Ħ İ ¨§Ĥ¤£˘Ħ İ¨§Ĥ¤£˘Ħ Ÿİ¨ §Ĥ¤£˘Ħ Ÿİ¨§Ĥ¤£˘Ħ Ÿİ¨§Ĥ¤£˘Ħ Ÿüžİݨ¨§Ĥ¤£˘Ħ Ÿžŝݨ¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿžŝ¨¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿžœŝ¨§§Ĥ¤£˘Ħ Ÿžœ€ôóüòñòóóô˙@€  ù  %<û =ü=ü $ŭŭáhggfddcba`_^]\[ZYYXVUUTSRMNM,ŭßba_^]\[ZYXWVUTSRQPNNMLJJIHGFEH?ŭŬ`^^\\[YXWVUTSRQPONMLKJIHHFFDDCBK0ŭÜ^]\[ZXWVVUTRRQONNMKJJIHGFEDDCBBAB<ŝ Û\[ZYXWVUTSRQPNNMLJJIHGFEDDCBBA@?>>.ŝÚZYXWVUTSRQPONMLKJJIHGFEDDCBBA@?>=<<:ŭ:ÚXWVUTSRQPONNMKJJIHGFEDDCBBA@?>>=<<;:ŝ ŜVUTSRRPONNMLJJIHGFEDDCBBA@?>>=<<;::ŭKŝÙUSRRQONNMLJJIHGFEEDCBBA@@?>=<<;;::98<(ŝRçQONNMLKJIHGFFEDDCBBA@?>=<<û;::988ü74ŝ ŬQPNNMLKJIIGFFEDDCBBA@?>>=<<;::998877ŭH ŝNçMLKJIIHGFEDDCBBA@?>>=<<;::ü988776ŝ$ŝ çMLKJIIHGFEDDCBBA@?>>=<<;::ŝ98876ŭ5*ċKJIIHGFEDDCBBA@?>>=<<;;::988765ŭ4IéHGFEDDCBBA@?>>=<<;;::9887654ŝéHGFEDDCBBA@?>>=<<;;::9887654ŭ3ëFEDDCBBA@?>>=<<;;::98876543ŝDïCBBA@?>>=<<;;::988765432ŝóCBBA@?>>=<<;::ü9887765432ŝġBA@?>>=<<;::ü98877654321ŝ÷@?>>=<<;::ü988776ŝ544321ŝ>ġ=<<;::9988776ŝ544321ŝġ=<<;::99887765432 1ŝ÷<;::99887765432 1ŝ:987654321ŝ€ù 8<û=ü =ü $ŭŭµ´³²ħ°Żŝ­­÷ĴĞĞĤ †Rŭĝı¸¸··ĥĥµµ´³²ŝħ°°ŝŻĝ­ĴĴĞsŭŝ¸··ĥµ´³²°ŝŻŝ­ĴĴĝĞŞŞİ£Pŭ·ĥµ´³²ŝħ°°ŝŻĴöĞŞŞİݨ§qŝ ĥµ´³²ŝħ°°ŝ­ĴĴüĞŞŞİݨ§ŭoŝµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŭ_ŭ:üµ´´³³²ŝħ°°ŝŻĴüĞŞŞİݨ§ĤüĦ.ŝ ŝ´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤ŭ‹ŝ³²ŝħ°°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥŝ¤¤ŝ8ŝ²ŝħ°°ŝŻŝ­ĴĴúĞŞŞİݨ¨§Ĥŝ¤¤û£˘sŝ ŝħ°°Żŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘ŭž ŝ°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħŝ-ŝ ŭ°Żŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘ĦŝG­ĴüĞŞŞİݨ§Ĥ¤£˘Ħ ŝJü­­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ ŝDŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ ŸŝBĴüĞŞŞİݨ§Ĥ¤£˘Ħ ŸŭžBüĞŞŞİݨ§Ĥ¤£˘Ħ ŸžŝBŝŞİݨ§Ĥ¤£˘Ħ ŸžŭAݨ§Ĥ¤ŝ£˘˘Ħ ŸžŝA¨§Ĥ¤ŝ£˘˘Ħ ŸžŝA§Ĥ¤ŝ£˘˘Ħ ŸžŝAú§ĤĤ¤¤ŝ£˘˘Ħ Ÿž ŝAüĤ¤¤ŝ£˘˘Ħ Ÿž ŝAŝ¤¤ŝ£˘˘Ħ Ÿž œŝA€ ù 5<û=ü =ü $ŭŭ˘Ħ Ÿžú™”~Lŭ¤£˘Ħ Ÿžü™lŭ£˘Ħ Ÿžû™Lŭ£˘Ħ Ÿžŭlŝ ŝ£˘˘Ħ Ÿžüœiŝ˘Ħ Ÿžœŭ[ŭ:˘Ħ Ÿžœŭ™-ŝ Ħ Ÿžœŭ‡ŝĦ Ÿžœŭ7ŝŝĦ  Ÿž œ›ŭoŝ  Ÿž œ›ŭ™ ŝ Ÿžœ›ŝ,ŝ Ÿžœ›ŝEŸžœ ›ŝHŸžœ ›šŝAŝŸžžœ ›šŝ@žœ ›šŝ@žœ ›šŝ@ŝžœ › šŝ@œ › šŝ@œ ›šŝ@œ ›šŝ@œ ›šŝ@œ ›šŝ@œ›šŝ@€ôŝġööĝúùÁ¤‡"˙ŭûÀ˙ŝŬ!˙ŝĊ"˙ŝï5ŝQ˙˙ŝŭ7ŝ³˙˙ŝŭ8˙ŝĝ8ŝ½˙˙ŝÒ8ŝÇ˙˙ŝ$8˙ŝò9˙ŝ&8ŝ8˙˙ŝà9˙:ŝ³˙˙ŝ89˙ŝĞ9˙ŝñ9˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙€€€€$ŝŝ/334$ŝŝ.2 234$ŝŝ.223ŝ4#ŝŝ-1123$ŝŝ-1 123$ŝŝ-1 123$ŝŝ-1 123ŝ4#ŝŝ,1 123ŝ4#ŝŝ,00 1234$ŝŝ,001234$ŝŝ,001234ŝ5#ŝŝ,001234ŝ5#ŝŝ,001234ŭ56#ŝŝ,001234ü566#ŝŝ,00123456ŝ7#ŝü,0011234567$ŝŭ,011234567$ŝŝ,112ŝ344ŝ5667ŝ8#ŝŝ-11234ü566778ŝ9#ŝŝ-112345678ŭ9:#ŝü-1122ŝ344ŝ56678ü9::#ŝù-1223344ü5667789:ŝ;#ŝô-2233445566778ù9::;<<#ŝü.2344ŝ56678ĝ9::;<=>#ŝ÷.3445566778ö9::;<<=>?#ŝû/4456678ġ9::;<=>>@@#ŝú/5566778ó9::;<<=>?@AB#ŝŝ06678ò9::;<=>?@@ABC#ŝŭ167789::;<<=>?@ABBCD#ŝü27788ï9:;;<=>?@ABBCDDE#ŝé27889::;<<=>?@ABBCDEFG#ŝé389::;<<=>?@ABBCDDEGHI#ŝé39::;<<=>?@ABCDDEFGHIJ#ŝé5:;<<=>?@ABBCDEFGHIJJK#ŝé5;<<=>@@ABCDDEFGHIJKLN#ŝé7<=>?@ABBCDEFGHIJJLMNO#ŝé7=>@@ABCDDEFGHIJKLNNOQ#ŝé9?@ABBCDEFGHIJJLMNOPQS#ŝé:@ABCDDEFGHIJKLNNOQRST#ŝé;BBCDEFGHIJJLMNOPRSTUV#ŝéEFGHIJKLNNOQRSTUVWXZ[#ŝé@GHIJJLMNOPQRTUVWXYZ\\#ŝéAHIJKLNNOQRSTUVWXY[\]^#ŝéBJJKMNNPQRSTUVXYZ[\]^_#ŝéDKLMNOPRSTUVWXY[\]^_`a#ŝéEMNNOQRSTUVWXY[\]^_abb#ŝéFNOPQRTTVVXYZ[\]^_abcd#ŝ éGOQRSTUVWXY[\]^_`abcde#ŝ éIQRSTUVWXY[\]^_`abcdef#ŝ éJRTTVVXXZ[\]^_`bbddegh#ŝ éLTUVWXYZ[\^^_abcdeeghh#ŝ éMUVWXY[\\^_`abcdefghhj#ŝ éNVWXY[\]^_`abcdefghhjj#ŝ éOXYZ[\]^_`abcdefghhjjk#ŝ éPYZ[\]^_`abcdefghhjjkl#ŝ éQZ[\]^_`bbcdefghhjjklm#ŝ éS\\^^_`bbcdefghhjjkkmm#ŝ éT\^^_abbcdefghhijkklmn#ŝ éU^__abbcdeeghhijjklmmo#ŝ éV__abbcdeegghijjkkmmno#ŝ éW_abbcdeegghhjjkklmmoo#ŝ ëWabbcdeefghhijjkkmmnoo$ŝŝ’ŸŸžŸŝ #ŝŝ‘žžŸ$ŝŝ‘žžŸ$ŝŝ žŸ$ŝŝ žŸ$ŝŝ žŸ$ŝŝ žŸ$ŝüœœ žŸ$ŝŝœœ žŸŝ #ŝŝœœžŸ $ŝŝœœžŸ $ŝŝœœžŸ ŝĦ#ŝŝœœžŸ Ħ$ŝŝœœžŸ Ħ$ŝŝœœžŸ Ħ$ŝüœœžŸ Ħŝ˘#ŝŭœžŝŸ  Ħ˘$ŝŝžŸ Ħ˘ŝ£#ŝŝžŸ Ħ˘£ŝ¤#ŝŝžŸ Ħ˘ŝ£¤¤$ŝüžžŸ Ħ˘ŝ£¤¤$ŝŭžžŸ Ħ˘ŝ£¤¤ŭĤ#ŝŝžžŸ Ħ˘ŝ£¤¤üĤĤ#ŝû‘žŸŸ  Ħ˘£¤úĤĤ§§#ŝú‘ŸŸ  ĦĦ˘ŝ£¤¤ùĤĤ§§¨#ŝŝ’  Ħ˘£¤üĤĤ§§¨$ŝŭ’ ĦĦ˘ŝ£¤¤öĤĤ§§¨¨İİ#ŝŝ“ĦĦ˘£¤üĤĤ§§¨İŝŞ#ŝù“ĦĦ˘˘£¤¤ĝĤĤ§§¨¨İİŭŞĞ#ŝû”˘˘£¤¤üĤĤ§§¨İŞŭĞĴ#ŝü”˘£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴ$ŝŝ•¤¤üĤĤ§§¨İŞŝĞĴĴŝ­#ŝŝ–¤¤óĤĤ§§¨¨İİŞŞĞĴĴü­#ŝú–¤ĤĤ§§¨İŞŝĞĴĴŝ­$ŝò–ĤĤ§§¨¨İİŞŞĞĴĴŝ­ŭݰ#ŝŭ˜Ĥ§§ŝ¨İİŞŝĞĴĴŝ­üݰ°#ŝġ˜§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ŝħ#ŝü™¨¨İİŭŞĞĴĴû­Ż°°üħ²²#ŝĝš¨İİŞŞĞĴĴŝ­ŝݰ°ûħ²²³#ŝúšİİŞĞĴĴŝ­ŝݰ°ùħ²²³³´#ŝû›ŞŞĞĴĴŝ­ŝݰ°ĝħ²²³³´´#ŝŭœĞĴĴŝ­°öħ²²³³´´µµ#ŝŝĴĴŝ­ŝݰ°ġħ²²³³´´µµĥ#ŝûĴĴ­ŝݰ°ŭħ²³³ŝ´µµŭĥ·#ŝŭ­ŝݰ°òħ²²³³´´µµĥĥ··#ŝŝŸŝݰ°ŭħ²³³´µĥ·ŝ¸#ŝüŸŻ°°ôħ²²³³´´µµĥĥ··¸$ŝŭ Ż°°îħ²²³³´´µµĥĥ··¸¸ıı#ŝŝĦ°°ŭħ²³³ŝ´µµĥ·¸ıŝş#ŝòĦ°ħ²²³³´´µµĥĥ··¸ış$ŝïĦħ²²³³´´µµĥĥ··¸¸ıış$ŝŭ£²³³ŝ´µµĥ·¸ışŝğ#ŝú£³³´´µµŝĥ··¸ışŭğĵ#ŝ÷¤³´´µµĥĥ··¸ışüğĵĵ#ŝĝ¤´´µµĥĥ··¸ışŝğĵĵ$ŝŝµµĥ·¸ışŝğĵĵ$ŝöµµĥĥ··¸¸ıışŝğĵĵ$ŝüĤµĥ··¸ışğĵŝ½#ŝŭĤĥ··¸ışğĵ½$ŝŝ§··¸ışğĵ½ŝ#ŝú¨··¸¸ıışğĵ½ŝ#ŝû¨·¸¸ıışŝğĵĵ½$ŝü¨¸¸ıışğĵ½$ŝŭ¨¸ıışğĵ½$ŝŝšš$ŝŝšš$ŝŝšš$ŝŝšš$ŝŝšš$ŝŝšš$ŝŝšš$ŝŝšš$ŝŝšš$ŝŝŒššŝ›#ŝüŒ™™ššŝ›#ŝüŒ™™šš›$ŝüŒ™™šš›$ŝüŒ™™š š›$ŝŭŒ™š š›$ŝŝŒš š›$ŝŝš š›$ŝŝš š›$ŝŝš š›œ$ŝŝšš›œ$ŝŝšš›œ$ŝŝšš›œ$ŝŝšš›œ$ŝŝšš›œ$ŝŝšš›œ$ŝŭš››œ$ŝŝ››œ$ŝŝŽ››œ$ŝŝŽ››œž$ŝŝŽ››œž$ŝüŽ››œœž$ŝŝŽœœžŸ$ŝŝœœžŸ$ŝŝœœžŸ$ŝŝœœžŸŝ #ŝüœœžŸ $ŝŭœžŸ $ŝŝžŸ ŝĦ#ŝŝžŸ Ħ$ŝüžžŸ Ħ$ŝŭžžŸ Ħŝ˘#ŝŝžžŸ Ħ˘$ŝŝ‘žžŸ Ħ˘$ŝŭ‘žŸŸ Ħ˘ŝ£#ŝŝ‘ŸŸ Ħ˘£$ŝŝ’ŸŸ Ħ˘£$ŝŝ’ŸŸ Ħ˘£ŝ¤#ŝŭ’Ÿ  Ħ˘£¤$ŝŝ’  Ħ˘£¤$ŝŝ’  Ħ˘£¤$ŝü’  ĦĦ˘£¤ŝ#ŝŝ’ĦĦ˘£¤$ŝŝ“ĦĦ˘£¤$ŝü“ĦĦ˘˘£¤$ŝŭ“Ħ˘˘£¤ŝĤ#ŝŝ”˘˘£¤Ĥ$ŝŝ”˘˘£¤Ĥ$ŝü”˘˘££¤Ĥ$ŝŭ”˘££¤Ĥŝ§#ŝŝ•££¤Ĥŝ§#ŝŝ•££¤Ĥ§$ŝü•££¤¤Ĥ§$ŝŭ•£¤¤Ĥ§$ŝŝ•¤¤Ĥ§$ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ#8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ8ŝŞ˙˙ŝ 8ŝŞ˙˙ŝ 8ŝŞ˙˙ŝ8ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝŞ˙˙:ŝ¨˙˙:ŝ¨˙˙:ŝ¨˙˙:ŝ¨˙˙:ŝ¨˙˙:ŝ¨˙˙:ŝ¨˙˙45678ŝ9::ŝ;<<Ĝ=>>?@ABBCCDDEFGHIIJJKMNNOPQRSTUVVXXYZ[\4456789:;<×=>>?@ABBCCDDEFGHIJJKLMNNOQRRTTUVWXYZ[\]^445678Ï9::;;<<==>?@ABBCCDDEFGHIJJKLMNOPQRSTUVVXXY[\\^^_4456789:Ò;<<==>?@ABBCCDEEFGHIJJKMNNOPQRSTUVWXYZ[\]^_`a4456789:Ñ;<<==>?@ABBCDDEFFGHIJJKMNNOQRSTUUVXXY[\]^^_abb445678É9::;<<==>?@ABBCDDEFFHIIJKLMNOPQRSTUVWXYZ[\]^_`abcd44556678Ĉ9::;;<<=>?@ABBCDDEFGHIJJKLNNOPQRTTUVWXY[\]^^_abcdde445566778Ĉ9::;;<<=>?@ABBCDDEFGHIJJKMNNOQRSTUVWXYZ[\]^_`abcdefg45566778Ĉ9::;;<<=>?@ABBCDDEFGHIJJLMNNPQRSTUVWXY[\\^^`abcdefghh5566778È9::;;<==>?@ABBCDDEFGHIJKLMNOPQRTTUVXXZ[\]^_`abcdefghij56678È9::;<<==>?@ABBCDEFFHIJJKMNNOQRSTUVWXYZ[\^^_abcdefghijjk6678Ċ9::;<<=>>@@ABCDDEFGHIJJKMNNOQRSTUVWXY[\]^_`abcdefghijklm66778Ĉ9::;<<=>>@AABCDDEFGHIJKLMNOPQRTUVWXYZ[\]^_abcdefghijjklno7789::;<<=>?@ABBCDDEFGHIJKLNNOQRSTUVWXY[\]^_`abcdefghijklmnop7788€79::;<<=>?@ABBCDEFGHIJJKMNNPQRSTUVWXZ[\]^_abcdefghijjkmnoppq78899:;;<==>?@ABCDDEFGHIJKLMNOPRSTUVWXYZ\\^_`abcdefghijklmnopqrr889::;<<=>?@ABBCDDEFGHIJKLNNOQRSTUVWXY[\]^_`bcddfghijjkmnopprrss89::;<<=>?@ABBCDEFGHIJJKMNNPQRTTVWXYZ[\^^`abcdefghijklmnopqrrstu9::;<<=>?@ABCDDEFGHIJKLMNOPRSTUVWXY[\]^_`bbddeghijjkmnopprrssuuv:;<<=>?@ABBCDDEFHIJJKMNNPQRSTUVXYZ[\]^_abcdefghijklmnopqrrstuvvw;<<=>?@ABBCDEFGHIJJLMNOPRSTUVWXY[\]^_`abddeghijjkmnopqrrstuuvvxx<=>?@@BBCDDEFHHJJKMNNOQRSTUVXXZ[\]^_abcdefghijklmnopqrrstuvvwxxy=>?@ABBCDEFGHIJJLMNOPRSTUVWXYZ\]^_`abddeghijjkmnopqrrstuuvwxxy‡>@@ABCDDEFGHIJKLNNOQRSTUVWXZ[\]^_abcdefghijklmnopqrrstuvvwxxyyz{@ABBCDEFGHIJJLMNOPQSTUVWXYZ\]^_`abddeghijjkmnopqrrstuuvwxxyÀz{{ABCDDEFGHIJKLNNOQRSTUVXXZ[\]^_abcdefghijklmoppqrrstuvvwxxyyz{{É|BCDEFGHIJJLMNOPRSTUVWXYZ\]^_`abddeghijjkmnopqrrstuvvwxxyüz{{||DÈEFHHJJKMNNOQRSTUVXXZ[\]^`abcdefghijklmoppqrsstuvvwxxyyz{{|Ì}EFGHIJJLMNOPRSTUVWXY[\]^_`bcddfghijjlmnopqrrstuvvwxxy{|Ċ}~FHIJJKMNNPQRSTUWXYZ[\^^`abcdefghjjklnoppqrssuuvvwxxyyz{{||ŝ}~~ÎHIJKLMNOPRSTUVWXY[\]^_`bcdefghijklmnopqrrstuvvwxxyy{|ŝ}~~JÔKMNNPQRTTVWXYZ[]^_`abcdeghhjjklnopprrssuuvvxxyüz{{||ŝ}~~ÎKLNNOQRSTUVWXY[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{|ŝ}~~ĠMNNPQRTUVWXYZ\]^_`abcdeghijjkmnopqrrstuuvvxxyüz{{||ŝ}~~ÑNOQRSTUVWXZ[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{| ~ĜPQSTUVWXYZ\]^_`abddeghijjkmnopqrrstuuvwxxyüz{{||ŝ}~ ~ÔRSTUVWXZ[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{| ~ÛTUVWXYZ\]^_`abddeghijjkmnopqrrstuuvwxxyüz{{||ŝ}~ ~×UVXXZ[\]^_abcdefghijklmoopqrrstuvvwxxyyz{{|ŝ}~~ŜWXYZ\]^_`abddeghijjkmnopqrrstuuvwxxyüz{{||ŝ}~~ÚXZ[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{|ŝ}~~ß}|Z\]^_`abcdeghijjkmnopprrstuuvvxxyüz{{||~ŝ}||à\]^_abcdefghijklmnopqrrstuvvwxxyy{|~ŝ}||^à`abcdefhhjjklmoppqrsstuvvwxxyyz{{|ŝ}~~ŝ}||ä{_`bbddfghijjkmnopprrstuuvvxxyŝz{{|ŝ}~ ~ŝ}||{éabcdefghijklmnopqrrstuvvxyŝz{{|ŝ}~ ~ŝ}||{zybcdefhhjjklmoppqrsstuvvwxxyyŝz{{| ~ŝ}||{âzyyxddeghijjkmnoppqrsstuvvwxxyyŝz{{|ŝ}~ ~ŝ}||{âzyyxxefghijklmnopprrssuuvvwxxyyŝz{{|ŝ}~~ŝ}||{ázyyxxwvfghijklmnopprrssuuvvwxxyyŝz{{|}|{üzyyxxèwvvhhijklmnopprrssuuvvwxxy{|{ŝzyyxçwvvuuhjjklmoopprrssuuvvwxxyŝz{{|{ŝzyyxŝwvvíutsjjklmoopprrssuuvvxy{|{ŝzyyxŝwvvuîtsrjklmoopprrsstuvvŝwxxy{ |{ŝzyyxŝwvvuìtsrrqklmnopprrsstuuvvxy{ŝzyyxŝwvvuëtssrqpplmnoppqrrssuuvvŝwxxyŝz{ {zyxŝwvvuútssrqppñomnoppqrrsstuuvvŝwxxyz{zyxŝwvvuútssrrppġonmnoopprrssuvŝwxxyxŝwvvuètssrrqpponmlkooppqrrsstuuvŝwxx yxŝwvvuïtssrqqpponmlkkjopprsŝtuuvŝwxxwvuùtssrrqppòonmlkkjihoppqrrsuvw xwvuŝtssrŝqpponmlkkjihhgoppqrrsuvwvutsrqpòonmlkkjihhgfeppŝqrrsuvutsrŝqppoñnmlkkjihhgfeedppŝqrrsŝtuutsrŝqppîonmmlkjjihhgfeedcb Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²³´µĥ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°üħ²²³³´µĥ·ŝŸ  Ħ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°úħ²²³³´´µĥ·ŭ¸Ÿ  Ħ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°ħŝ²³³´µĥ·¸ŝŸ  Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­Ż°üħ²²³³´µĥ·¸ıŝŸ  Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ıŝş  Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ış Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴ­ŝݰ°ĝħ²²³³´´µµĥ·¸ış Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­Ż°ôħ²²³³´´µµĥĥ··¸ışğŝ ĦĦ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·¸ışüğĵĵĦĦ˘ŝ£¤¤üĤĤ§§¨İüŞĞĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışğĵĦ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵü½ĦĦ˘˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışŝğĵĵ½ùĦ˘˘££¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½˘£¤Ĥ§¨İüŞĞĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·¸ışŝğĵĵŝ½ŭ˘£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½żŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½ż¤ĝĤĤ§§¨¨İİüŞĞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··¸ışŝğĵĵŝ½żùÀ¤¤Ĥ§§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀû¤ĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµĥ·¸ışŝğĵĵŝ½żÀÁóĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ§¨İŭŞĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁö§¨¨İİŞŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂŝ¨İİŭŞĞĴĴû­Ż°°ôħ²²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁÂùİİŞŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂüİŞĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁÂŭŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁÂĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ ŝݰ°ùħ²²³³´µµĥ·¸ışŝğĵĵ½żÀÁ Äŭݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ Äŝݰ°ŭħ²³³ŝ´µµŝĥ··¸ışŝğĵĵ½żÀÁ Ä°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äô°²²³³´´µµĥĥ··¸ışğĵŝ½żÀÁ Ä²³´µĥ·¸ışŝğĵĵŝ½żÀÁ Ä³´µĥ·ŝ¸ıışŝğĵĵŝ½żÀÁ Äñ³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äú´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁ Äµĥ·¸ışŝğĵĵŝ½żÀÁ Äĥ·¸ışğĵ½żÀÁ Äúĥ··¸¸ıışŝğĵĵŝ½żÀÁ Ä ·¸ışŝğĵĵ½żÀÁ Ä ¸ışŝğĵĵŝ½żÀÁÂÂü¸ıışşŝğĵĵŝ½żÀÁÂÂışŝğĵĵ½żÀÁÂÂŭÁışşŝğĵĵ½żÀÁÂÂÁşŝğĵĵŝ½żÀÁÂÂÁşŝğĵĵŝ½żÀÁÂÂÁüÀşğĵĵŝ½żÀÁÂÂÁÀŝğĵĵ½żÀÁÂÂÁÀżĵ½żÀÁÂÂÁÀżĵ½żÀÁÂÂÁÀżûĵ½½żÀÁ ÂÁÀż½żÀÁÂÁÀżŝ½żÀÁÂÁÀż½żÀ Á ÂÁÀżü½ĵĵżÀÁÀż½ĵżÀÁÀż½ĵŝğżÀÁÀż½ĵŭğşżÀÁÀż½ĵŝğşşżÀżŝ½ĵĵŝğşş żÀż½ĵŝğşşı› œžŸ Ħ˘ŭ£š› › œžŸ Ħ˘£š ›œžŸ Ħ˘£š ›œžŸ Ħ˘£ü¤šš› › œžŸ Ħ˘£¤š ›œžŸ Ħ˘£¤ŝš› ›œžŸ Ħ˘£¤ŝš››œžŸ Ħ˘£¤ ›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§ŭ¨›œœžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İüŞœœžŸ Ħ˘£¤Ĥ§¨İŞŝœžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İŞŝžžŸ Ħ˘£¤Ĥ§¨İ ŞžŸ Ħ˘£¤Ĥ§¨İ ŞŝОžŸ Ħ˘£¤Ĥ§¨İ ŞĞŝžŸŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŝŸ  Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ Ş Ğŝ ĦĦ˘£¤Ĥ§¨İ ŞĞĦ˘£¤Ĥ§¨İ ŞĞĦ˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞŞ£¤Ĥ§¨İ ŞĞŞ£¤Ĥ§¨İ ŞĞŞŝ£¤¤Ĥ§¨İ ŞĞޤĤ§¨İ ŞĞޤĤ§¨İ ŞĞ ޤĤ§¨İ ŞĞ Şŝ¤Ĥ§¨İ ŞĞ ŞŝİĤ§¨İ Ş Ğ ŞİĤ§¨İŞĞŞİü¨ĤĤ§¨İ%Şİ¨ŝĤĤ§¨İ$Şİ¨Ĥ§¨İ#Şİ¨§Ĥ§¨İ!Şİ¨§Ĥ§¨İŞİ¨§ŝĤ§§¨İŞİ¨§ŝĤ§§¨İŞİ¨§Ĥ§¨İŞİ¨§Ĥŝ§§¨İŞİ¨§Ĥ§¨ İ Şİ¨§Ĥ§¨İ¨§Ĥŝ¤§§¨İ¨§Ĥ¤§ ¨İ ¨§Ĥ¤ä]^_`abbcdeefghijjkklmnooppqrrstuvuäts^_`abcdeefghijjkllmnoppqqrrsŝtuuvwxwvuès`abcddefghijjklmnnoppqrrsŝtuuvwxvuâsbcddefghijjklmnooppqrrssttuuvvwxyxvuìtsddefghijjklmnoopqrrsütuuvvwxyxŝwvvuîtsefghhjjklmnoopqrrsŭtuvvwxyxŝwvvuïtssgghijkklnoopqrrûstuuvvŝwxxyz{ŝzyyxvusórhijjklmnopqrrûstuuvvŝwxxyz{ŝzyyxvuètssrjjklmnoppqrrstuuvvwxxyz{ŝzyyxäwvvuutssrrklmnoppqrrstuuvvwxxyŝz{{ |{ŝzyyxŝwvvusrïqlmoopqrrssuuvvwxxyŝz{{ |{ŝzyyxvusrqpnopqrrsstuvvwxxyŝz{{|{ŝzyyxvusrôqpoppqrrstuvvxyŝz{{|{yxĉwvvuussrrpponqrrstuuvvwxxyyŝz{{|}~ŝ}||{üzyyxxéwvvuussrrpponmrsstuvvwxxyŝz{{|ŝ}~~|{üzyyxxêwvvutssrqpponmkstuvvwxxyŝz{{|ŝ}~ ~|{üzyyxxvëutsrrqpoomlkjuuvvwxxyy{|ŝ}~ ~ŝ}||{üzyyxxvuïtsrrqponmlkjivvwxxyüz{{||ŝ}~ ~ŝ}||{àzyyxxwvvuutsrrpponmljjihvwxxyyz{{|ŝ}~~|{yxéwvvutsrrqpoonlkjihgfxxyy{|ŝ}~~ŝ}||{üzyyxxvuètsrrqponmlkjihgfexyyz{{||ŝ}~~ŝ}||{ázyyxxwvvuutsrqpponmkjihhgedcyz{{|ŝ}~~ŝ}||{ßzyyxxwvvutsrrqponmlkjihgfedcbz{{||ŝ}~~|{Ŝzyyxxwvvuutsrqpponmkjjhhgedcba`{{||ŝ}~~ŝ}||{ßzyyxxwvvutsrrqppomlkjihgfedcba_^||ŝ}~~ŝ}||{Ŭzyyxxwvvuutsrqpponmkjjhhgedcba`_^\||~ŝ}||{Úzyyxxwvvutsrrqppomlkjihgfedcba_^]\[|}~~ŝ}||{Úzyyxxwvvuutsrqpponmkjihhgedcba`_^\\ZY~~ŝ}||{Ùzyyxxwvvutsrrqponmlkjihgfedbba_^]\[YXW~~|{×zyyxxwvvuutsrqpponlkjihhfedcba`^]\[ZYXVU~ ~ŝ}||{Özyyxxwvvutsrrqponmlkjihgfedbb`_^]\[YXWVUT~ ~|{Ôzyyxxwvvuussrqpponlkjihhfedcba`^]\[ZYWVUTSR~ ~ŝ}||{úzyyxxvvÛutsrrpponmlkjihgfdcba`_^]\[YXWVUTRRP~~ŝ}||{Ñzyyxxwvvuussrqppomlkjihgfedcba_^]\[ZXWVUTSRQON~~ŝ}||{yxvĜutsrrpponmkjjhhgedcba`_^\\ZYXWVUSRQPONM~~ŝ}||{Îzyyxxwvvutssrqppomlkjihgfedcba_^]\[ZXWVUTSRQONNLK~~ŝ}||{ùzyyxxwvvĠutsrqpponmkjjhhgedcba`_^\\ZYXWVUSRQPNNMKJJ~~ŝ}||{Ëzyyxxwvvutsrrqppomlkjihgfedcba_^]\[YXWVUTSRQONNLKJIH~~ŝ}||{Çzyyxxwvvuutsrqpponmkjihhgedcba`_^\[ZYXVVTSRQPNNMKJJIHF~}||{Èzyyxxwvvutsrrqponmlkjihgfedcba_^]\[YXWVUTSRQONMLKJIHGFE||{Ĉzyyxxwvvuutsrqpponmkjihhgedcba`_^\[ZYXVVTSRQPNNMKJJIHFEDD||{…zyyxxwvvutsrrqponmlkjihgfedcba_^]\[YXWVUTSRQONNLKJIHGFEDDC||{{zyyxxwvvuutsrqpponmkjjhhgedcba`_^\\ZYXWVUSRQPNNMKJJIHFFEDCBB{{‚zyyxxwvvutsrrqpoomlkjihgfedcba_^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@{zyyxxwvvuutsrqpponmkjjhhgedcba`_^]\ZYXWVUTRQPONMLJJIHGFEDCBBA@?yyx‚wvvutsrrqppomlkjihgfedcba_^]\[ZXWVUTSRQONNMKJJHGFEDDCBBA@>>yxxwvvuutsrqpponmljjihgeddbb`_^]\[YXWVUTSRPONMLKJIHGFEDDCBA@?>==<=<<;vvutsrrqpponlkjihhgedcba`_^]\[YXWVUTSRPONMLKJIHGFEDDCBA@@>>=<;;:uussrqpponmlkjihgfedcba_^]\[ZYXVVTTRQPONMKJJIHGFEDDBBA@?>=<<;::9tsrrqpponlkjihhgedcbb`_^]\[YXWVUTSRQONNMKJJIHGFEDCBBA@?>=<<;::98srqpponmlkjihgfedcba`_^\\ZYXWVUTSRQONNLKJJHHFEDDCBBA@?>=<<;::988rppoomlkjjhhgeddbba_^]\[ZYXVVUTRRPONMLKJIHGFEDDCBBA@?>=<<;::9887pponmlkjihgfedcba`_^]\[YXWVUTSRQPNNMLJJIHGFEDDCBBA@?>=<<;::98877onmlkjihhgfedcba_^^\\ZYXWVUTSRQONNMKJJIHGFEDDCBAA@?>=<<;::998877nmkkjihgfedcbb`_^]\[ZYXWVUTSRQONNMKJJIHGFEDDCBAA@?>=<<;::998877Élkjihhgfedcba`_^]\[YXWVUTTRRPONNMKJJIHGFEDDCBAA@?>=<<;::ü98877jhÈgfedcbba_^]\\ZYXWVUTSRQPONMLKJJIHGFEDDCBAA@?>=<<;;::988776ihhgeddcba`_^]\[ZYXWVUTSRQPNNMLKJIHHGFEDDCBBA@?>==<<;::998877Ê6hgfedcbba_^]\\[YXWVVUTSRQPNNMLKJIHHGFEDDCBBA@?>==<<;::ü98877Ä6fedcbba`_^]\[ZYXWVUTTRRQONNMLJJIHHGFEDDCBBA@@>>=<<;;::9988776dÎcba`_^]\\[ZXXWVUTSRQPONNMLJJIHHGFEDDCBBA@@?>==<<;::ŝ98876Ècbba__^]\[ZYXWVVUTSRQPONNMKJJIHHGFEDDCBBAA@?>==<<;;::998876Úba`_^]\\[ZYXWVUTTRRQPONMMKJJIHHGFEDDCBBùA@@>>=<<ŝ;::9876·¸ışğĵ½żÀ ÁÀżü·¸¸ıışŝğĵĵ½żÀÁÀżŝ¸ıışŝğĵĵ½żÀÁÀżışŝğĵĵ½żÀÁÀżŝışşğĵ½żÀ Á ÁÀżşğĵ½żÀÁÂÁÀżşŝğĵĵ½żÀÁÂÁÀżŝğĵĵ½żÀÁÂÁÀżĵŝ½żÀÁ ÂÁÀżĵŝ½żÀÁÂÂÁÀżü½½żÀÁÂÂÁÀżżÀÁÂÂÁÀżżÀÁÂÂÁÀżżÀÁÂÂÁÀżŝ½żżÀÁÂÂÁÀż½üĵżżÀÀÁÂÂÁÀżŝ½ĵĵÀÁÂÂÁÀżŝ½ĵĵÀÁÂÂÁÀż½ĵŝğÁÁÂÂÁÀżŝ½ĵĵüğşşÁÁ Ä ÂÁÀżŝ½ĵĵŝğşşÁ Ä ÂÁÀż½ĵğşŝıÂ Ä ÂÁÀżŝ½ĵĵŝğşşı Ä ÂÁÀżŝ½ĵĵŝğşşıŭ¸ÂÄ ÂÁÀżŝ½ĵĵŝğşşı¸ŝ·Ä ÂÁÀżŝ½ĵĵŝğşşıŝ¸··Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥ Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥŝµÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµŝ´ Ä ÂÁÀż½ĵŝğşşı¸·ŝĥµµ´Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³ Ä ÂÁÀż½ĵŝğşşı¸·ĥµŝ´³³ŝ²ÄÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħÄÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²üħ°°ÄÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²°ŝŻÄÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ûŻÄÄÂÁÀżŝ½ĵĵŝğşşıŝ¸··ĥµ´³ŭ²ħ°°ŝŻ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻü­ĴĴÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴŭĞŞÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞÂÁÀżŝ½ĵĵŝğşşıŝ¸··ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴùĞŞŞİİÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴùĞŞŞİݨÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ĴŭĞŞİݨÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴöĞŞŞİݨ¨§§ÁÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴġĞŞŞİݨ¨§§ĤÁÁÀżŝ½ĵĵŝğşşı¸·ŝĥµµ´³ŭ²ħ°°ŝŻŝ­ĴĴŞİ¨§ĤÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§ĤŝÀÀż½ĵŝğşşıŝ¸··ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥû¤ÀÀżżŝ½ĵĵŝğşşı¸·ĥµŝ´³³ŭ²ħ°°ŝ­ĴĴŭĞŞİݨ§Ĥ¤ż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤żŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŭ£ż½ĵŝğşşı¸·ĥµŝ´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤£ŝ½ĵĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£û˘½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤ŝ£˘˘ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤£˘ŝĦĵĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħŭĵğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħŝğşşı¸·ĥµ´³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħşı¸·ĥµ´³²ħ°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħŝı¸¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ£¤Ĥ§¨İ¨£¤Ĥ§¨İ¨¤Ĥ§¨İ Şİ¨¤Ĥ§¨İŞİ¨¤Ĥ§¨İŞİ¨ŝ¤Ĥ§¨İŞİ¨Ĥ§¨İŞİ¨Ĥ§¨İŞİ¨ŭ§ĤĤ§¨İ Şİ¨§Ĥ§¨İ"Şİ¨§Ĥ§¨İ#Şİ¨ §¨İ$Şİ¨§¨İŞĞ Şİ¨§¨İ Ş Ğ Şİ¨§ŭĤ§¨¨İ ŞĞ Şİ¨§Ĥ¨İ ŞĞ Şİ¨§Ĥü¨¨İİ ŞĞ Şİ¨§Ĥİ ŞĞ Şİ¨§Ĥİ ŞĞ Şİ¨§Ĥ ŞĞ Şİ¨§Ĥ¤ ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŝ£ŞŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£ŝ˘ĞĞ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘ŝĦĞĞ Şİ¨§Ĥ¤£˘ĦĞ Şİ¨§Ĥ¤£˘Ħŝ Ğ Ğ Şİ¨§Ĥ¤£˘Ħ  Ğ Şİ¨§Ĥ¤£˘Ħ  Ğ Şİ¨§Ĥ¤£˘Ħ ŝŸĞĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸŝžĞĞ Şİ¨§Ĥ¤£˘Ħ ŸžĞ Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ ŸžŝŞŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœŝ¨§§Ĥ¤£˘Ħ Ÿžœŝ›§§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›ŝ§ĤĤ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›ŝĤ¤£˘Ħ Ÿžœ›¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿžœ›ŝ¤¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿž œ›srüqppoomkjÎihhgfeddbba`_^]\[[YXWVVUTSRQPONNMKJJIHGFFEDDCBBssrrpomŠlkjjihhgfedcbba`^^]\[ZYXWVUTSRRQONNMLKJIIHGFEDDCBBA@ssrrqppoonmlkjjihhgfedcbaa_^^\\[ZXXVVUTSRQPONMLKJJIHGFEDDCBBAA@?srrp€÷onmlkjjihggfedcba`_^]\[ZYXWVUTTRRQONNMKJJIHGFEEDCCBBA@?>=srrqppoommkkjihggfddcba`_^]\[ZYXWVUTSRQPONMLKJJIHGFEDDCBBA@?>==>=<<;rrppoommkkjihggeddbba_^^\\[YXWVUTSRQPONMLKJIIHFFEDCCBAA@>>=<<;::rppoonmkjjihgfedcbaa_^]\[ZYXWVUTSRQONNMKJJIHGFEDDCBBA@?>=<<;;::9qpoonmkjjihgfedcba`_^]\[YXXVUTTRQPONMLKJIHGFFEDCBBA@?>>=<<;::988poommkjjihgfedcba`_^]\[YXWVUTSRQPNNMKJJIHGFEDDCBBA@?>=<<;::99887oomlkjjhhgfddcba_^]\[ZYXWVUTSRPONNLKJJHGFEEDCBBA@?>=<<;;::98877Äomlkjjhhgeddba`_^]\[YXWVUTSRQPONMLJJIHGFEDDCBAA@>>=<<;::988776Ċmlkjihgfedcba`_^]\[YXWVUTSRQONNMKJJIHFFEDCBBA@?>=<<;::9988776Ĉ5lkjihgfedcba_^]\[ZYXWVUTRQPONMLKJIHGFEDDCBA@@>>=<<;::9887765È4jjihgfddbba_^]\[YXWVUTSRQONNMKJJIHFFEDCBBA@?>=<<;::988776ŝ544Êihhgedcba`_^]\ZYXWVUTSRPONMLKJIHGFEDDCBA@?>>=<;;::988776543Ìhgfedcba_^]\[ZYXVUTSRQPNNMKJJIHGFEDCBBA@?>=<<;::988776ŝ544Ê322geddbb`_^]\[YXWVUTSRQONNLKJIHGFEDDCBA@?>>=<;;:9988776ŝ54432Ïedcba`^]\[ZYXVVTSRQPNNMKJJIHGFEDCBBA@?>=<<;::98877654321Îdbba_^]\[YXWVUTSRQONNLKJIHGFEDDCBA@?>>=<;;:99887766ŝ544321Òba`_^\\ZYXWVUSRQPONMLJJIHGFEDCBBA@?>=<<;::98877654321Ùa_^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>>=<;::ü988776ŝ544321Ô0_^\\ZYXWVUSRQPONMLJJIHGFEDCBBA@?>=<<;::988776543210Ù]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>==<;::98876ŝ544ŝ32210Ĝ\ZYXWVUSRQPONMLJJIHGFEDCBBA@?>=<<;::988776543210Û/YXWVUTSRQONNLKJIHGFEDDCBA@?>=<<;::98876ŝ544ŝ32210/ÛXVVTSRQPNNMKJJIHFFDDCBBA@?>=<<;::988776543210/ŬVUTSRPONMLKJIHGFEDDCBA@?>=<<;::988776ŝ544ŝ32210/ŜTSRQPNNMKJJIGFEDDCBBA@>>=<<;::988776ŝ5443210/àSRPONMLKJIHGFEDCBBA@?>=<<;::988776ú544332210/áQPNNMKJJHGFEDDCBBA@>>=<<;::988776ŝ5443210 /ONMLJJIHGFEDCBBA@?>=<<;::988776543210 /âNLKJIHGFEDDCBA@?>>=<;::99887766ŝ544ŝ32210 /ĉLJJIHGFEDCBBA@?>=<<;::988776543210/êJIHGFEDDCBA@?>=<<;::98876ŝ544ŝ32210/éIHFFDDCBBA@?>=<<;::988776543210/ëGFEDDCBA@?>=<<;::988776ŝ544ŝ32210/ë0EDDCBBA@?>=<<;::988776ŝ5443210/0DCBA@?>=<<;::988776ŝ544ŝ32210/0ïCBBA@?>=<<;::988776ŝ5443210/01BA@?>=<<;::988776ŝ544ŝ32210/01òA@?>=<<;::988776543210/01ö?>><<;::98876ŝ544ŝ32210/01ġ>=<<;::988776543210/01ġ2=<<;::988776ŝ5443210/012ĝ<;::988776ŝ544ŝ32210/012ĝ3;::988776543210/0123ù4::988776543210/012349876543210/01234û5988776543210 /012345ŭ68776543210 /01234ŝ56676543210/0123456765432101234ŝ566765432101234567ù87665544321 01234ŝ56678ŝ9665432 10 12345678ù9:66554432123456789:654321234ŝ56678ù9::;;655432123456789:û;<<65543212345678ŝ9::ú;<<=655432123456789:ĝ;<<==>655432345678ò9::;;<<=>>@665543 2345678ŝ9::ô;<<==>?@@66554345678ŝ9::ŝ;<<ù=>>@@ABż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴúĞŞŞİİżż½ĵğşı¸·ĥµ´³²ŝħ°°Żŝ­ĴĴüĞŞŞİİŝ¨żż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻ­ĴüĞŞŞİݨŝ§żż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§ż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§üĤżż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŭż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴúĞŞŞİݨ¨§Ĥŝ¤¤½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥŝ¤¤ŝ£½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤£û˘½ĵĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘ŭ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°Żŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħĵŝğşşı¸·ĥµŝ´³³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ üŸĵğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿŭžğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžôşşıı¸¸··ĥĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžüı¸¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿž¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžœó·ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžœĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœġ›µµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›ĝµ´´³³²ħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›ù´³³²²ħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›²ŝħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ ŝŸžžœ›ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ ›°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžœ ›ŭ°Żŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ ›ŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›ŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›ŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›ĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›ûĴĞŞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›œòĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ ŝŸžžœ›œŝŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›œİ¨§Ĥ¤£˘Ħ Ÿžœ›œ÷ݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ›œŝ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›œ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžœ›œúž§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ›œžüĤ¤¤£˘Ħ Ÿžœ›œžŝ¤¤ŝ£˘˘Ħ Ÿžœ›œžŸ¤ü£˘˘ĦĦ Ÿžœ›œžüŸ  ¤¤ü£˘˘ĦĦ Ÿžœ›œžŸ ú¤££˘˘ĦĦ Ÿžœ›œžŸ Ħ£˘Ħ Ÿžœ ›œžŸ Ħü£˘˘ĦĦ Ÿžœ›œžŸ Ħ˘Ħ ŸžœžŸ Ħ˘Ħ ŸžœžŸ Ħ˘£Ħ ŸžœžŸ Ħ˘ü£¤¤ĦĦ Ÿž  œžŸ Ħ˘£¤Ħ Ÿž œ žŸ Ħ˘ŝ£¤¤Ħ ŸžžŸ Ħ˘£¤ŭĤĦĦ ŸžžŸ Ħ˘ŝ£¤¤úĤĤĦĦ  ŸžžŸ Ħ˘£¤Ĥŝ§ĦĦ Ÿž žŸ Ħ˘ŝ£¤¤üĤĤ§§Ħ ŸžŸ Ħ˘ŝ£¤¤Ĥ§ŝ¨ĦĦ ŸžŸ Ħ˘ŝ£¤¤Ĥ§¨Ħ Ÿ Ħ˘ŝ£¤¤ŝĤĤ§¨İ¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿžŭœ¨§§Ĥ¤£˘Ħ Ÿžœŝ¨§§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœŝ›§§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›ŝ§ĤĤ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›ŝĤ¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›šŝ¤¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› šŝ¤££˘Ħ Ÿžœ› š£˘Ħ Ÿžœ› šü™££˘˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™Ħ Ÿžœ› š™Ħ Ÿžœ› š ™ŝĦ  Ÿžœ› š ™ Ÿžœ› š ™ Ÿžœ› š™ŝ ŸŸžœ› š™Ÿžœ› š™Ÿžœ› š™Ÿžœ› š™žœ› š™žœ› š™žœ› š™ŭšžœ› š™šœ› š™šœ› š™šœ› š™šŝœœ› š™šœ› š™ šœ› š™ šœ› š™ šœ›š™šœ›š™ š›ŝœ››š™š ›š™š ›š™š ›š™š›š ™š›š™š›œ›,š ›œ›,š›œ›*š ›œ›(š ›œ›&š ›œ›$š › œŝ››!š › œ›š › œ›š › œġA@?>>==<<;::ŝ988765432345ó?>>==<<;::9988765432345ó>==<<;::99887765432 12345ġ=<<;::9988776543212345ö6<;::99887765432123456:98765432123456û:988776543212345678765432 10 1234567654321 0123456765432101234567ŝ866ŝ544321012345678ü9654432101234ŝ56678ĝ9:544332210/01234ŝ56678ù9::4432210 /012345678ù9::;332210 /012345678ù9::;;<2210 /01234ŝ56678÷9::;<<=2110/01234ü566778÷9::;<<=>110/012345678ġ9::;<<=>?@110/012ŝ344ŝ56678ò9::;<<=>?@A1100/012345678ò9::;<<=>?@ABB00/012ŝ344ŝ56678ñ9::;<<=>?@ABBC00/01234ü566778í9::;<<=>?@ABBCDD00//012345678î9::;<<=>?@ABBCDEF//01234ü566778ì9::;<<=>?@ABBCDDEGH//012345678ë9::;<<=>?@ABCDDEFGHI//01234ü566778é9::;<<=>?@ABBCDEFGHIJJ/ /012ŝ344ŝ56678è9::;<<=>@@ABCDDEFGHIJKL/ /012345678ĉ9::;<<=>?@ABBCDEFGHIJJLMN/ /012ŝ344ŝ56678ċ9::;<=>?@@ABCDDEFHHJJKMNNP//0123456789::;<<=>?@ABBCDEFGHIJKLMNOPR//01234ü566778á9::;<<=>?@ABBCDDEGHIJJKMNNPQRT//012345678à9::;<<=>?@ABCDDEFGHIJKLNNOQRSTU//01234ü566778Ŝ9::;<<=>?@ABBCDEFGHIJJLMNOPQSTUVW//012ŝ344ŝ56678Û9::;<==>@@ABCDDEFGHIJKLNNOQRSTUVXX//0012345678Ú9::;<<=>?@ABBCDEFGHIJJLMNOPRSTUVWXY[/0012ŝ344ŝ56678Ú9::;<=>?@ABBCDDEFHHJJKMNNPQRSTUWXYZ[\0012345678Ö9::;<<=>?@ABBCDEFGHIJKLMNOPRSTUVWXY[\]^00112ŝ344ŝ566789×:;<<=>?@ABBCDDEGHIJJKMNNPQRTTVWXYZ[]^_`0112345678Ġ9::;<<=>?@ABBDDEFGHIJKLMNOPRSTUVWXY[\]^_ab112ŝ344ŝ566789Ġ:;<<=>?@ABBCDDEGHIJJKMNNPQRTTVWXYZ[]^_`abc1123456789::;<<=>?@ABBCDEFGHIJKLMNOPRSTUVWXY[\]^_abcde1122ŝ344ŝ56678Ñ9::;<=>?@ABBCDDEFHIJJKMNNPQRSTUWXYZ[\^_`abcdeg22345678Ì9::;<<=>?@ABBCDEFGHIJJLMNOPRSTUVWXY[\]^_abcddfgh22344ŝ56678Ĉ9::;<<=>@@ABCDDEFGHIJKMNNOQRSTUVXYZ[\^^`abcdefhhj33445566778Ċ9::;<<=>?@ABBCDEFGHIJJLMNOPQRTUVWXY[\]^_`abddeghijj3445566778Ĉ9::;<<=>?@ABCDDEFGHIJKLNNOQRSTUVWXY[\]^_abcdefghijkl44566778Ċ9::;<<=>?@@BBCDDEFHHJJKMNNPQRSTUVXYZ[\^^`abcdefhhjjkln5566778È9::;<<=>?@ABBCDEFGHIJJLMNOPQRTUVWXY[\]^_`abddeghijjkmno6678Ĉ9::;<<=>?@ABBDDEFGHIJKLMNOQRSTUVWXY[\]^_abbdefghijklmnop6778Ċ9::;<<=>?@@BBCDDEFGHJJKMNNOQRSTUVWXZ[\]^_abcdefghijklmnopq7789::;<<=>?@ABBCDDFFHIJJKMNNPQRSTUVXYZ[\]^_abcdefghijklmoppqr788€ġ9::;<<=>?@ABBCDEFGHIJJLMNOPQRTUVVXYZ\\^_`abcdefhhijklmoppqrs889::;<<=>>@@ABCDDEFGHIJKLMNOPRRTUVWXYZ\\^_`abcdefhhijklmoppqrss89::;<<=>?@ABBCDDEFGHIJKLNNOPRSTUVWXYZ\\^_`abcdefhhijklmoopqrrst9::;<<=>?@ABBCDDFFHHJJKLNNOQRSTUVWXYZ\\^_`abcdefhhijklmnopqrrssu:;<<=>>@@ABBCDEFGHIJJKMNNOQRSTUVWXYZ\\^_`abcdefghijklmnopprrssuu;<<=>?@@ABCDDEFGHIJJKMNNOQRSTUVWXYZ\\^_`abcdefghijkkmnoppqrsstuu<<=>?@ABBCDDEFGHIJJKMNNOQRSTUVWXYZ\\^__abcdefghhjjklmoopqrrssuuv=>>?@ABBCDDEFGHIJJKMNNOQRSTUVWXYZ\\^^_abbddeghhjjklmnopprr€stuuv>?@@ABBCDDEFGHIJKLMNNOQRSTUVWXYZ[\]^_`bbddefghijkkmmoopprrsstuuv?@ABBCDDEFFHHIJKLMNNOQRSTUVVXYZ[\]^_`abcdeeghhjjklmnoppqrrsstuuv@ABBCDDEFFHIIJKLMNNOQRSTUVVXXY[\\^__abbddefghijjklmnoppqrrsstuuvABBCDDEFGHIJJKLMNNOQRRTUVVXXY[\\^^_`abcdeeghhjjkkmmooppqrrssuÇBCCDDEFGHIJJKLMNNOQRRTTUVWXYZ[\]^_`abbddefghhjjkkmmooppqrrsŝtuuüݨ¨§§Ĥ¤£˘Ħ ŸžŸ ŝ¨§§Ĥ¤£˘Ħ ŸžžŸ üĦ§§ĤĤŝ¤¤£˘Ħ ŸžžŸ ĦĤŝ¤¤£˘Ħ ŸžžŸ ĦŭĤ¤¤ŝ£˘˘Ħ ŸžžŸ Ħŝ¤¤ŝ£˘˘Ħ ŸžžŸ Ħ¤ŝ£˘˘Ħ ŸžžŸ Ħù˘¤££˘˘ĦĦ Ÿž œ žŸ Ħ˘ü£˘˘ĦĦ Ÿž œžŸ Ħ˘ŭ£˘ĦĦ ŸžœžŸ Ħ˘£Ħ ŸžœžŸ Ħ˘û£¤¤Ħ  Ÿž œ›œžŸ Ħ˘ŝ£¤¤ ŝŸžžœ›œžŸ Ħ˘ŝ£¤¤ü ŸŸžžœ ›œžŸ Ħ˘£¤ŝŸžžœ ›œžŸ Ħ˘ŝ£¤¤úĤĤžžœ›œžŸ Ħ˘ŝ£¤¤úĤĤ§žœ›œžŸ Ħ˘£¤ŝĤ§§œ›œžŝŸ  Ħ˘ŝ£¤¤üĤĤ§§ŝ¨œ›œžŸ Ħ˘£¤Ĥ§¨üݝœœ›œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İœ›œžŸ Ħ˘ŝ£¤¤ôĤĤ§§¨¨İİŞŞœœ›œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞüĞœœ››œžŝŸ  Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİûŞĞĴĴ››œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴ›œžŝŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŭ­››œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴü­› ›œžŝŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝŻ› ›œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­° ›œžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ° ›œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ŭħ²››œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²››œžŝŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°úħ²²³³››œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ùħ²³³´´››œžŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°÷ħ²²³³´´µ››œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥ›œœžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥœœžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°òħ²²³³´´µµĥĥ··œœžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ùħ²²³³´µµĥ·ŭ¸œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ïħ²²³³´´µµĥĥ··¸¸ıžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··¸ıžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ııüşžžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ùħ²²³³´µµĥ·¸ışŝžžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışúğžžŸŸ  Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşĝğĵžŸŸ  ĦĦ˘ŝ£¤¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°²³´µĥ·ŝ¸ıışŝğĵĵŝŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ùħ²²³³´µµĥ·¸ışŝğĵĵ½ŝ ĦĦ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞĴŝ­°²³´µĥ·ŝ¸ıışŝğĵĵü½ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµĥ·¸ışŝğĵĵ½ûż˘££¤¤Ĥ§¨İŭŞĞĴĴŝ­°²³´µŝĥ··¸ışŝğĵĵ½żŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışğĵ½ż¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışğĵ½ż¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żúÀ¤ĤĤ§§¨İŭŞĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żûÀĤĤ§§¨İŞŝĞĴĴ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵ½żÀĤ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵ½żÀ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışğĵŝ½żÀ§¨İŞŝĞĴĴŝ­Ż°ĝħ²²³³´´µµĥ·¸ışŝğĵĵ½żÀ¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·ŝ¸ıışğĵ½żÀŝ¨İİŞŝĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·¸ışŝğĵĵŝ½żÀİŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışğĵ½żÀŝİŞŞŝĞĴĴ­ŝݰ°üħ²²³³´µĥ·¸ışğĵ½żÀ œ › š› œ ›#š›ŝœœ ›%š›œ ›'š›œ ›)š›œ ›*š›œ ›+š›ŝœ››,š›-š›š™š›š ™š›œ›š™š›œŝ›šš™š›œš™š›œ š™ š›œ š™ š›œš™ š›œŝšš™š›œš™ š›œš™ š›œš™ š›œŭžš™™ š›œž™ š›œž™ š›œžŝŸ™™ š›œžŸ™ š›œžŸ™ š›œžŸ™ š›œžŸŝ ™ ™ š›œžŸ  ™ š›œžŸ  ™ š›œžŸ ŝĦ™™ š›œžŸ Ħ™ š›œžŸ Ħŝ˘™™ š›œžŸ Ħ˘™ š›œžŸ Ħ˘™ š›œžŸ Ħ˘ü£™™š š›œžŸ Ħ˘£ŝ™š š›œžŸ Ħ˘£ š›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤ŝšš›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤üĤšš››œžŸ Ħ˘£¤Ĥŝš››œžŸ Ħ˘£¤Ĥŝ§››œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§ŭ¨›œœžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨ŝİœœžŸ Ħ˘£¤Ĥ§¨ŭİœžŸ Ħ˘£¤Ĥ§¨ŝݝžŸ Ħ˘£¤Ĥ§¨İžŸ Ħ˘£¤Ĥ§¨İžŸ Ħ˘£¤Ĥ§¨ŝݝžŸ Ħ˘£¤Ĥ§¨üݝžžŸ Ħ˘£¤Ĥ§¨ŝ566789:;<Ò=>>@@ABBCDDEFGHHIJJLMNNOPRSTTUVXXYZ\]^^_`abcd66789:ŝ;<<Ï=>?@AABBCDDEFGHIJJKLNNOPQRTTUVWXYZ[\]^_`abcdef66778ŝ9::Ê;<<=>>?@ABBCDDEFGHIIJKLMNNPQRSTUVWXYZ[\]^_`abcdefgh66778Ĉ9::;;<<=>>@@ABBCDDEFGHIJJKMNNOQRSTUVWXXZ[\]^_`abcdefghij6778Ĉ9::;;<<=>?@AABCDDEFGHIJJKLMNOPQRSTUVWXY[\]^^`abcddfghijjk7789:„;<<==>?@ABBCDDEFGHIJJKMNNOQRSTUVWXYZ[\^^_abcddefghijklm778899::;<<=>>@@ABBCDEFGHIJJKLMNOPQSTTUWXXZ[\]^_`abcdefghijklmno7889::€5;<<=>?@ABBCDDEFGHIJJKMNNPQRSTUVWXYZ\]^_`abcdefghijjkmnopp889::;<<==>?@ABBCDDEFHHIJKLMNOPRSTUVWXYZ[\]^_abcddfghijjklmoopqr89::;<<=>>@@ABCDDEFGHIJJKMNNPQRSTUVWXY[\]^_`abcdefghijklmnopqrrs9::;<<=>?@ABBCDDEFGHIJKLMNOPRSTUVWXYZ[\^^`abcdefghijklmnopqrrsst:;;<==>?@ABBCDEFGHIJJKMNNPQRSTUVWXZ[\]^_`bcddeghijjkmnoppqrsstuv;<<=>?@ABBCDDEFGHIJKLMNOPRSTUVWXYZ\]^_`abcdefghijklmnopqrrstuvvw<<=>?@ABBCDEFGHIJJKMNNPQRSTUVXXZ[\]^_abcdefghijklmnopqrrstuuvvwx=>>@@ABCDDEFGHIJKLMNOPRSTUVWXYZ\]^_`abcdeghhjjklnoppqrsstuvvwxxy>?@ABBCDDEFHIJJKMNNOQRSTUVXXZ[\]^_abcdefghijklmnopqrrstuvvwxxy‚?@ABCDDEFGHIJKLMNOPRSTUVWXYZ\]^_`abddeghijjkmnopprrssuuvvwxxyyz{ABBCDDEFHIJJKMNNOQRSTUVXXZ[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{BËCDEFGHIJJLMNOPRSTUVWXY[\]^_`abddeghijkkmnopqrrstuvvwxxyz{{||CDDEFHHJJKMNNPQRSTUVXXZ[\]^`abcdefghijklmoppqrsstuvvwxxyyz{{||ÊDEFGHIJJLMNOPRSTUVWXY[\]^_`bcddfghijklmnopqrrstuvvwxxyy{|Ç}EFHIJJKMNNPQRSTUWXYZ[\^^`abcdefghjjklnoppqrssuuvvwxxyyz{{|Ê}~~GHIJKLMNOPRSTUVWXY[\]^_`bcddfghijklmnopqrrstuvvwxxyy{|ŝ}~~ÑIJJKMNNPQRTTUWXYZ[]^^`abcdefhhjjklnopprrssuuvvxxyüz{{||ŝ}~~ÍJKLMNOQRSTUVWXY[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{|ŝ}~~ÔKMNNPQRTUVWXYZ\]^_`abcdeghijjkmnopqrrstuuvvxxyüz{{||ŝ}~~NÒOQRSTUVWXZ[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{|ŝ}~~×OPQSTUVWXYZ\]^_`abddeghijjkmnopqrrstuuvwxxyüz{{||ŝ}~ ~ÓQRSTUVXXZ[\^^`abcdefghijklmoppqrrstuvvwxxyyz{{|ŝ}~ ~ÚSTUVWXY[\]^_`bcddfghijjlmnopqrrstuvvwxxyüz{{||ŝ}~ ~ÖTVWXYZ[]^_`abcdefhhjjklnopprrssuuvvwxxyyz{{|ŝ}~ ~ÛVWXZ[\]^_abcdefghijklmnopqrrstuvvwxxyy{|ŝ}~~Ŝ}XYZ\]^_`abddeghijjkmnopqrrstuuvvxxyŝz{{|ŝ}~~|ÛZ[\]^_abcdefghijklmoppqrrstuvvwxxyyz{{|ŝ}~~ŝ}||â\]^_`bcddfghijjlmnopqrrstuvvwxxyüz{{||ŝ}~~ŝ}||^à`abcdefghjjklnoppqrsstuvvwxxyyz{{|ŝ}~~ŝ}||{ċ_`bcdefghijklmnopqrrstuvvwxxy{|ŝ}~~ŝ}||{ĉzabcdeghijjkmnopprrstuuvvxxyŝz{{|~ŝ}||{ázycdefghijklmnopqrrstuvvwxxyyz{{|ŝ}~~|{ĉzyyxdeghijjkmnopprrstuuvwxxyüz{{||ŝ}~~ŝ}||{ázyyxxfghijklmnopqrrstuvvwxxyyz{{|ŝ}~~ŝ}||{üzyyxxìvhhjjkmnopprrstuuvwxxyüz{{||ŝ}~~ŝ}||{ázyyxxwvvijklmnopqrrstuvvwxxyyz{{|~ŝ}||{yxvïujklnopprrssuuvvxxyüz{{||ŝ}~~ŝ}||{äzyyxxwvvuuslmnopqrrstuvvwxxyy{|ŝ}~~ŝ}||{ázyyxxwvvutsrmnppqrsstuvvwxxyyz{{|~ŝ}||{yxvutsrropprrssuuvvxxyüz{{||ŝ}~~|{ñzyyxxwvvuussrqpprüstuvvxy{|ŝ}~~ŝ}||{äzyyxxwvvutsrrqpoqrrstuvvwxxyy{|ŝ}~~|{üzyyxxvuítsrrpponrsstuvvwxxyy{|ŝ}~~ŝ}||{zyyxxwvvuussrqpponlsstuvvwxxyy{|~ŝ}||{yxèwvvutsrrqponmlkstuvvwxxyy{|ŝ}~ ~ŝ}||{âzyyxxwvvuutsrrpponmljjtuvvwxxyyŝz{{|ŝ}~ ~ŝ}||{çzyyxxwvvuussrqpponmkjjhuvvxyŝz{{|ŝ}~~ŝ}||{üzyyxxvéutsrrqppomlkjihguvvwxxyyŝz{{|}|{ŝzyyxçwvvuutsrrqponmlkjihgfvvwxxy{|{üzyyxxäwvvuussrqpponmlkjihgfevvwxxyy{|{ŝzyyxċwvvuutsrrqpponmkjjhhgfddvvxxy{ |{ŝzyyxŝwvvusríqpoomlkjjhhgeddbvvxxyŝz{{|{ŝzyyxâwvvuutssrqpponmlkjihggedcbavvxxyŝz{ {zyxŝwvvusréqpponmlkjihgfedcba`vvwxxyz{zyxŝwvvuĉtsrrqppoomlkjjihgfedcba`_vvxyxŝwvvuätssrrqpponmlkjjhhgfedcba`_^vvŝwxx yxwvuátssrrqppoommkkjihhgeddcba`_^]uvvŝwxxwvuùtssrrqppêonmlkjjihgfeddbba`_^]\Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ıŝşĦĦ˘£¤üĤĤ§§¨İŞŝĞĴĴ­ŝݰ°ħŝ²³³´µĥ·¸ışĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışüğĦĦ˘˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışğŭĵĦ˘˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°ħŝ²³³´µĥ·¸ışğĵ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵû½˘˘£¤¤Ĥ§¨İŞĞĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışŝğĵĵ½ü˘£¤¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵ½ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışğĵ½ŝż¤¤üĤĤ§§¨İŞŝĞĴĴ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½ż¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½żúÀ¤ĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışğĵ½żÀüĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½żÀĝÁĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışğĵ½żÀÁü§¨¨İİŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂ¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışğĵ½żÀÁÂù¨İİŞŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂúİŞŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁÂŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµĥ·¸ışŝğĵĵŝ½żÀÁÂŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁÂĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂŭĴ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁÂŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½żÀÁ ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ Äŭݰ°ŭħ²³³ŝ´µµŝĥ··¸ışŝğĵĵ½żÀÁ Ä°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äó°ħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½żÀÁ Äîħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äò²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ Ä³´µĥ·¸ışŝğĵĵŝ½żÀÁ Ä´µĥ·¸ışŝğĵĵŝ½żÀÁ Äµŝĥ··¸ışğĵ½żÀÁ Äöµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äúĥ··¸¸ıışŝğĵĵŝ½żÀÁ Ä ·¸ışŝğĵĵŝ½żÀÁ Ä ü¸¸ıışŝğĵĵŝ½żÀÁ Ä Âü¸ıışşŝğĵĵ½żÀÁ Ä Âışŝğĵĵŝ½żÀÁ Ä ÂÁşŝğĵĵ½żÀÁ Ä ÂÁşŝğĵĵŝ½żÀÁ Ä ÂÁŭşğĵĵ½żÀÁ Ä ÂÁŝÀĵĵŝ½żÀÁ Ä ÂÁÀĵ½żÀÁÂ Ä ÂÁÀüżĵ½żÀÁ Ä ÂÁÀżŝ½żÀÁ Ä ÂÁÀżżÀÁÂ Ä ÂÁÀżżÀÁ Ä ÂÁÀżżÀÁ Ä ÂÁÀżŝ½żżÀÁ Ä ÂÁÀżŭ½ĵżżÀÁÂÂÁÀżĝ½ĵĵżżÀÀÁÁÂÂÁÀżŝ½ĵĵüżÀÀÁÁÂÂÁÀż½ĵŝğÀÀÁÂÂÁÀżŝ½ĵĵûğşÀÀÁÁÂÂÁÀżŝ½ĵĵûğşşÀÁÁÂÂÁÀżŝ½ĵĵŝğşşŝÀÁÁÂÂÁÀż½ĵğşŭıÀÁÁÂÂÁÀżŝ½ĵĵğşıÁ ÂÁÀżŝ½ĵĵŝğşşıÁ ÂÁÀż½ĵŝğşşıŭ¸ÀÁÁÂÁÀż½ĵŝğşşı¸ŭ·ÀÁÁ ÂÁÀżŝ½ĵĵğşı¸·ÀÁÀż½ĵŝğşşı¸·ÀÁÀżŝ½ĵĵŝğşşı¸·ĥ › œžŸ Ħ˘£¤› œžŸ Ħ˘£¤ŝ››œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§ŝ›œœžŸ Ħ˘£¤Ĥ§œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨ŝİœœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İŭŞœžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İ ŞžŸ Ħ˘£¤Ĥ§¨İ ŞžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞŝžŸŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ Ş ĞĦ˘£¤Ĥ§¨İ ŞĞĦ˘£¤Ĥ§¨İ ŞĞŝĦ˘˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞŞŝ˘££¤Ĥ§¨İ ŞĞŞ£¤Ĥ§¨İ ŞĞŞŝ£¤¤Ĥ§¨İ ŞĞޤĤ§¨İ ŞĞޤĤ§¨İ ŞĞޤĤ§¨İ ŞĞ ŞĤ§¨İ ŞĞ ŞŝİĤ§¨İ ŞĞ ŞİĤ§¨İ ŞĞ Şİŝ¨ĤĤ§¨İ ŞĞ Şİ¨Ĥ§¨İ ŞĞ Şİ¨ŝĤ§§¨İ ŞĞ Şİ¨§¨İ ŞĞ Şİ¨§¨İ ŞĞ Şİ¨§¨İ ŞĞ Şİ¨§¨İ ŞĞ Şİ¨§Ĥ¨İ ŞĞ Şİ¨§Ĥ¨İ ŞĞ Şİ¨§Ĥü¨¨İİ ŞĞ Şİ¨§Ĥŝ¨İİ ŞĞ Şİ¨§Ĥİ Ş Ğ Şİ¨§Ĥİ ŞĞŞİ¨§Ĥŝ¤İİ$Şİ¨§Ĥ¤İ"Şİ¨§Ĥ¤İ!Şİ¨§Ĥ¤İŞİ¨§Ĥ¤ŝ£İİŞİ¨§Ĥ¤£İŞİ¨§Ĥ¤£İŞİ¨§Ĥ¤£İŞİ¨§Ĥ¤£˘efghijjklmnoopqrrsütuuvvŝwxxyxŝwvvusêrghijjklmnoopqrrsstuuvvŝwxxyzyxŝwvvuätssrrijjklmnoppqrrsstuuvvwwxxyŝz{{ŝzyyxŝwvvuêtssrrqjklmnoppqrrsstuvvŝwxxyŝz{ {yxvuëtssrrqplmnoppqrrstuuvvŝwxxyŝz{{yxvuŭtsrrponoppqrrstuuvvwxxyŝz{{|{ŝzyyxvuêtsrrqpponppqrrstuuvvwxxyŝz{{ |{yxvuëtsrrqpoonmqrrstuuvvwxxyŝz{{|{ŝzyyxvusrpoômlkrstuuvvwxxyz{|{ŝzyyxvëutssrqpponmlkjtuuvvwxxyŝz{{|} |{ŝzyyxèwvvuutsrrqpponmkjjhuvvwxxyŝz{{|ŝ}~~ŝ}||{yxéwvvuutsrrqponmlkjihgvwxxyŝz{{|ŝ}~~ŝ}||{ŝzyyxêwvvuussrqpponmlkjihgfxxyŝz{{|ŝ}~ ~ŝ}||{üzyyxxċwvvutsrrqpoonlkjihhfedxyyz{{|ŝ}~ ~ŝ}||{àzyyxxwvvuutsrrqponmlkjihgfedcyy{{|}~|{Ŝzyyxxwvvuussrqpponmkjihhgedcbaz{{||ŝ}~ ~ŝ}||{yxäwvvutsrrqponmlkjihgfedcba_{||ŝ}~~ŝ}||{Ŝzyyxxwvvuutsrqpponmkjjhhgedcba`_^||ŝ}~~ŝ}||{Úzyyxxwvvutsrrqponmlkjihgfedcba_^]\||}~~|{Úzyyxxwvvuutsrqpponmkjihhgedcba`_^\\Z|~~ŝ}||{Úzyyxxwvvutsrrqponmlkjihgfedcba_^]\[YX~~|{Ĝzyyxxwvvuutsrqpponmkjihhfedcba`^]\[ZYXV~~ŝ}||{×zyyxxwvvutsrrqponmlkjihgfedbb`_^]\[YXWVU~ ~ŝ}||{Ġzyyxxwvvuussrqppomlkjihgfedcba`^]\[ZXWVUTS~ ~ŝ}||{yxvÜutsrrpponmkkjhhgedcba`_^]\ZYXWVUTRQ~ ~ŝ}||{Òzyyxxwvvutssrqppomlkjihgfedcba_^]\[ZXWVUTSRQO~~ŝ}||{zyyxxwvvuutsrqpponmkjihhgedcba`_]\[ZYXVVTSRQPNN~~ŝ}||{yxv×utsrrqponmlkjihgfecbb`_^]\[YXWVUTSRPONML~~ŝ}||{Ízyyxxwvvutssrqppomlkjihgfedcba`^]\[ZXWVUTSRQONNLKJ~~ŝ}||{ùzyyxxwvvÔutsrqpponmkjihhgedcba`_^\\ZYXWVUSRQPONMLJJI~~|{yxÍwvvutsrrqponmlkjihgfedbb`_^]\[YXWVUTSRQONNLKJIHG~}||{Èzyyxxwvvuussrqppomlkjihgfedcba`^]\[ZYWVUTSRQPNNMKJJIGFE||{ùzyyxxwvvÏutsrqpponmkjjhhgedcba`_^]\ZYXWVUTRRPONMLJJIHGFED||{Äzyyxxwvvutsrrqppnmlkjihgfedcba_^]\[ZXWVUTSRQONNLKJIHGFEDDC|{{zyyxxwvvuutsrqpponlkjihhfedcba`_]\[ZYXVVTSRQPNNMKJJIHFFEDCBB{{zyyxxv…utsrrpponmlkjihgfdcbb`_^]\[YXWVUTSRPONMLKJIHGFEDDCBA@{zyyxxwvvutssrqppomlkjihgfedcba_^]\[ZXWVUTSRQONNMKJJHGFEDDCBBA@>yyxxwvv€öutsrqpponmkjjhhgedcba`_^\\ZYXWVUSRQPONMLJJIHGFEDCBBA@?>=yxxwvvutsrrqppomlkjihgfedcba_^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>===<<;wvvutsrrqppomlkjihgfedcba_^]\[YXWVUTSRPONMLKJIHGFEDDCBA@?>=<<;::vvutsrqpponmkjjhhgedcba`_^\[ZYXVVTSRQPNNMKJJIGFEDDCBBA@>>=<<;::9utssrqppomlkjihgfedcba_^]\[YXWVUTSRPONMLKJIHGFEDCBBA@?>=<<;::988tsrrpponmkjjhhgedcba`_^\\ZYXVVTSRQPNNMKJJIHFEDDCBBA@>>=<<;::9887srqpponlkjihgfedcba_^]\[YXWVUTSRQONMLKJIHGFEDDBBA@?>=<<;::98877rqponmlkjihgeddbb`_^]\ZYXWVUTRQPONMKJJIHFFDDCBBA@?>=<<;::98877Ä6pponmkjjhhgedcba`^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>=<<;::988776Ĉpomlkjihgfedcba_^]\[YXWVUTSRPONMLJJIHGFEDCBBA@?>=<<;::9887765Ċnmlkjihgeddbb`_^]\ZYXWVUTRQPNNMKJJIHFEDDCBBA@>>=<<;:99887766Ĉ544mkjjhhgedcba`^^\[ZYXVUTSRQONNMKJIHGFEDDCBA@?>=<<;::98877654É3kjihgfedcba_^]\[YXWVUTSRQONNLKJIHGFEDCBBA@?>=<<;::988776543Ëjihgfedcba_^]\[YXWVUTSRPONMLJJIHGFEDCBBA@?>=<<;::988776ŝ5443Ë2ihgfddba`_^]\[YXWVUTRQPNNMKJJIHGFDDCBBA@?>=<<;:9988776ŝ544ŝ322Îhgedcba`_^\[ZYXWVTTRQPNNMKJJIHFEDDCBBA@?>=<;;:998776ŝ544ŝ322Î1fedcba`^^\[ZYXVUTSRQPNNMKJJHHFEDDCBA@@>>=<;::998776ŝ544ŝ3221edcba_^]\[ZXXVUTSRQONNMKJIHHFEDDCBA@@>>=<;::998776ŝ544321dcba_^]\[ZXXVUTSRQONNMKJIHHFEDDCBAA@>>=<;;:9988776ŝ544321bÓa_^]\[ZXXVUTSRQONNMKJIHHFEDDCBBA@?>=<<;::98877654321Òa`_^]\[ZXWVUTSRQPNNMKJJIHFEDDCBBA@?>=<<;::98877654321Ó`_^]\[ZXWVUTSRQPNNMKJJIHGFEDCBBA@?>=<<;::98877654321Ó_^]\[ZXWVUTSRQPNNMLJJIHGFEDCCBA@@>==<;;::98877654321Ô^]\[ZXXVUTTRQPNNMLJJIHGFEDDCBBA@>>=<<;::98877654321Ô]\[ZXXVUTTRQPONMLKJIHHFEDDCBBA@?>=<<;;::98877654321Ô\[ZXXVUTTRRQONNMKJJIHFFEDDCBAA@>>=<<;::998877654321×[ZXXVVUTSRQONNMKJJIHGFEDDCBBA@?>==<<;::9887654321şğĵ½żÀ Á  ÁÀżüşğğĵĵ½żÀÁÂÁÀżŝğĵĵŝ½żÀÁÂÁÀżŝĵĵŝ½żÀÁÂÁÀżŭĵ½żÀÁ ÂÁÀżżÀÁ ÂÁÀżŝ½żÀÁÂÂÁÀż½ŝżżÀÁÂÂÁÀżü½ĵĵżżÀÁÂÂÁÀżŝ½ĵĵŝżÀÀÁÂÂÁÀż½ĵüğÀÀÁÁÂÂÁÀżŝ½ĵĵüğşÀÁÁÂÂÁÀż½ĵüğşşÁÁÂÂÁÀżŝ½ĵĵŝğşşÁÂÂÁÀżŝ½ĵĵŝğşşıÂÂÁÀż½ĵğşıü¸Â Ä ÂÁÀżŝ½ĵĵŝğşşı¸ Ä ÂÁÀż½ĵğşı¸·Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ŝĥÄ ÂÁÀż½ĵğşı¸·ŭĥµÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµÄ ÂÁÀż½ĵğşı¸·ĥµ´Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´ŭ³ÄÄ ÂÁÀż½ĵŝğşşı¸·ĥµŝ´³³Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŭħ°ÄÄ ÂÁÀżŝ½ĵĵğşı¸·ĥµ´³ŭ²ħ°°Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°üŻÄÄÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°üŻ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ûħ°°Żŝ­ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŭ­ĴÂÁÀż½ĵŝğşşı¸·ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŝĞÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴúĞŞŞÂÂÁÀż½ĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴùĞŞŞİİÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴùĞŞŞİݨÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴġĞŞŞİݨ¨§ÂÂÁÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ûħ°°Żŝ­ĴĴŭĞŞİݨ§ÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§ŝĤÁÁÀżŝ½ĵĵŝğşşıŝ¸··ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§ĤúÁÁÀÀżżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴöĞŞŞİݨ¨§§ĤĤŭ¤ÀÀżŝ½ĵĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝÀżżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£żżŝ½ĵĵŝğşşıŝ¸··ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤û£˘żżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘ŝżŝ½ĵĵŝğşşı¸·ĥµ´³²°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ú£˘˘ĦĦ½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦü ½ĵĵŝğşşıŝ¸··ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ ŝ½ĵĵğşı¸·ŝĥµµù´³³²²ħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ ŝŸĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿûžĵĵğşşı¸·ĥµ´³²ŝħ°°ŝŻĴŞİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžŭĵğşşıŝ¸··ĥµ´³²°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžŝğşşı¸·ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžşı¸·ĥµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžïı¸¸··ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžŝ¸··ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥ¤£˘Ħ Ÿž·ĥµ´³²ŝħ°°ŝŻ­ĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿž·ĥµ´³ŭ²ħ°°Żŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžĝ·ĥĥµµ´´³³ü²ħħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤ŝ£˘˘Ħ Ÿžŝĥµµŝ´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿžŝ¤Ĥ§¨İŞİ¨Ĥ§¨İŞİ¨§Ĥ§¨İŞİ¨§Ĥ§¨İŞİ¨§Ĥ§¨İ Şİ¨ §¨İ!Şİ¨ §¨İ#Şİ¨§Ĥ§¨İ$Şİ¨§Ĥ¨İŞĞŞİ¨§Ĥŝ¨¨İŞ Ğ Şİ¨§Ĥŝ¨İİ Ş Ğ Şİ¨§Ĥİ ŞĞ Şİ¨§Ĥŝ¤Ş ŞĞ Şİ¨§Ĥ¤ ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŝ£ŞŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£ŝŞĞĞ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘ĦĞ Şİ¨§Ĥ¤£˘ĦĞ Şİ¨§Ĥ¤£˘Ħŝ Ğ Ğ Şİ¨§Ĥ¤£˘Ħ  Ğ Şİ¨§Ĥ¤£˘Ħ  Ğ Şİ¨§Ĥ¤£˘Ħ ŝŸĞĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸŝžĞĞ Şİ¨§Ĥ¤£˘Ħ ŸžŝĞŞ Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ ŸžŝŞŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŝœŞŞİ¨§Ĥ¤£˘Ħ ŸžœŝŞİݨ§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœŝ›¨¨§Ĥ¤£˘Ħ Ÿžœ›ŝ¨§§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›ŝ§ĤĤ¤£˘Ħ Ÿžœ›ŝšĤĤ¤£˘Ħ Ÿžœ›šŝĤ¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›šŝ¤¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› šŝ¤££˘Ħ Ÿžœ› š£˘Ħ Ÿžœ› š£˘Ħ Ÿžœ› š£˘Ħ Ÿžœ › šŝ£˘˘Ħ Ÿžœ› š˘Ħ Ÿžœ› š˘Ħ Ÿžœ › š€=rqppoonmlkjihhgeedcba`_^]\[YXWVUTSRRPONNLKJJIHFFEDDCBAA@>>=<<;::qpponmlkjjihgfedcba`_^]\[ZYXWVUTSRQONNMKJJIHGFEDDCBBA@?>=<<;::99pponmlkjihhgfedcba`^^\\[YXWVUTSRQPONMLKJIHGFEDDCBBA@?>=<<;;::988oonmkjjihgfedcba`_^]\[ZYWVVUSRRPONNLKJIHGFFEDCBBA@?>==<;;::98877nmlkjjhhgfedcba_^]\\ZYXWVUTSRQONNMKJJIHGFEDDCBA@?>>=<<;::98877Ä6mlkjihgfedcba`_^]\[ZXWVUTSRQPONMLJJIHGFEDDCBBA@>>=<<;::988776Ĉkjjihgfedcba`^]\\ZYXWVUTSRPONNLKJJHGFEDDCBBA@?>=<<;::99887765Èjihhgedcba`_^]\[ZXWVUTSRQPNNMLJJIHGFEDCBBA@?>==<;;:998877654Êihgfedcba`^^\\ZYXWVUTRRPONMLKJIHGFEDDCBBA@>>=<<;::98877654Ë3hgeddbb`_^]\[ZXWVUTSRQPNNMKJJIHFFEDCBBA@?>=<<;::988776ŝ544Ê322fedcba`_^\\ZYXWVUTRRPONMLKJIHGFEDDCBA@?>==<;;:9988776ŝ54432Ïedbba_^]\[ZXWVUTSRQONNMKJJIGFEDDCBBA@?>=<<;::98877654321Ñcba`_^\\ZYXWVUTRQPONMLJJIHGFEDCBBA@?>=<<;::988776ŝ544ŝ3221Òba_^]\[ZXWVUTSRQONNLKJIHGFEDDCBBA@>>=<<;::988776ŝ544321Ô`_^\\ZYXWVUTRQPONMLJJIHGFEDCBBA@?>=<<;::988776543210Ö^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>==<;::998776ŝ544ŝ32210\ÙZYXWVUSRQPONMLJJIHGFEDCBBA@?>=<<;::988776543210Ù[ZXWVUTSRQONNLKJIHGFEDDCBA@?>=<<;::988776ŝ544ŝ32210/ÚYXVVUSRQPNNMKJJIHFFEDCBBA@?>=<<;::988776ŝ5443210/ÜWVUTSRPONMLKJIHGFEDDCBA@?>=<<;::988776543210/ŬUTSRQPNNMKJJIGFEDDCBBA@>>=<<;::988776ŝ5443210/ßTSRPONMLKJIHGFEDCBBA@?>=<<;::988776ŝ544ŝ32210/àRQPNNMKJJHGFEDDCBBA@>>=<<;::988776ŝ5443210/âPONMLJJIHGFEDCBBA@?>=<<;::988776543210 /NëLKJIHGFEDDCBA@?>==<;::ü988776ŝ5443210 /ċMKJJIHFFEDCBBA@?>=<<;::988776543210 /éKJIHGFEDDCBA@?>=<<;::98876ŝ5443210 /èJHGFEDDCBBA@>>=<<;::988776543210/é0HGFEDCBBA@?>=<<;::988776ŝ5443210 /0ëFEDDCBA@?>==<;;::988776543210 /0DïCBBA@?>=<<;::988776ŝ544ŝ32210 /01CBBA@?>=<<;::98876ŝ5443210 /01BA@?>>=<<;::988776543210 /01òA@?>=<<;::988776ŝ5443210 /01ö?>=<<;::98876ŝ5443210 /012ġ>=<<;::988776543210 /012<ù;::988776ŝ5443210 /0123ŝ;::ü988776543210 /01234:ü98877654ŝ32210 /01234ŭ598876ŝ5443210 /01234û5688776543210 /012345676ŝ544ŝ32210 /01234ü566776ŝ5443210/012345676ú544332210/01234ŝ56678ŭ65443210/012345678ù9544332210/012345678ù9:44332210/012ŝ344ü5667789û:;432210/01234ü566778ù9::;<32210/012345678ù9::;<<2210/012345678÷9::;<=>2110/012ŝ344ü5667789ĝ:;<<=>?110/012ŝ344ü566778ġ9::;<<=>?@110/012345678ô9::;<<=>?@A110/012345678ó9::;<<=>?@AB110/0123456789::;<<=>?@ABC1100/012345678ï9::;<<=>?@ABCD1100/012ŝ344ŝ56678î9::;<<=>?@ABCDD1100 /01234ü566778í9::;<==>?@ABCDDE1100/01234ü5667789:ï;<==>?@ABCDDEF1100123456789:;<==>?@ABCDDEFG110123456789í:;;<==>?@ABCDDEFGH11 0123456789ì:;;<<=>?@ABBCDEFGHI110 1234ŝ566789ë:;;<<=>?@ABBCDEFFHIJ112345678é9::;;<<=>?@ABBCDDEFHHIJŝż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤ŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴúĞŞŞİݨ¨§Ĥŝ¤¤ú£½½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ú£˘˘½ĵĵğşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘ŭĦ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħû ĵĵğşşı¸·ĥµ´³²ŝħ°°ŝŻ­ĴŭĞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ ŭĵğşşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ Ÿŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿžşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴöĞŞŞİݨ¨§§ĤĤŝ¤¤£˘Ħ Ÿžŭşıı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥ¤£˘Ħ Ÿžïı¸¸··ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžŝ¸··ŝĥµµ´³²ûħ°°Żŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžœ·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴöĞŞŞİݨ¨§§ĤĤŝ¤¤£˘Ħ Ÿžœŭ·ĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœô›ĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ ŝŸžžœ›µŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›´³²ŝħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ ŝŸžžœ›³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›û³²²ħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ Ÿžœ›ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›ŝħ°°úŻ­­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžœ ›°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ ›ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžœ ›ŝ­ĴĴöĞŞŞİݨ¨§§ĤĤŝ¤¤£˘Ħ Ÿžœ›ŭ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ ŝŸžžœ›ŝœĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ Ÿžœ ›œĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›œüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžœ ›œŞİ¨§Ĥ¤£˘Ħ Ÿžœ ›œİ¨§Ĥŝ¤¤ü£˘˘ĦĦ ŝŸžžœ ›œ÷ݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ Ÿžœ ›œŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ ›œùž§§ĤĤ¤¤ŝ£˘˘Ħ Ÿžœ ›œžĤŝ¤¤ŝ£˘˘Ħ Ÿžœ ›œžüŸĤ¤¤ü£˘˘ĦĦ Ÿžœ ›œžŸŝ ¤¤ŝ£˘˘Ħ Ÿžœ ›œžŸ ¤£˘Ħ Ÿžœ ›œžŸ Ħû¤£˘˘ĦĦ Ÿžœ›œžŸ Ħ˘Ħ Ÿžœ›œžŸ Ħ˘Ħ Ÿžœ›œžŝŸ  Ħ˘Ħ ŝŸžžœ›œžŸ Ħ˘£Ħ Ÿžœ›œžŸ Ħ˘ü£¤¤  ŝŸžžœ›œžŝŸ  Ħ˘ŝ£¤¤ü ŸŸžžœ›œžŸ Ħ˘£¤üŸŸžžœ›œžŸ Ħ˘ŝ£¤¤ŭĤžžœ›œžŸ Ħ˘ŝ£¤¤úĤĤžžœ›œžŝŸ  Ħ˘£¤ùĤĤ§§žœ›œžŸ Ħ˘£¤üĤĤ§§œ›œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨œ›œžŸ Ħ˘ŝ£¤¤÷ĤĤ§§¨¨İœ›œžŸ Ħ˘ŝ£¤¤öĤĤ§§¨¨İݝœ›œžŸ Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞœœ›œžŝŸ  Ħ˘£¤ŝĤ§§¨İޝœ›œžŸ Ħ˘£¤ŝĤ§§¨İŞŭНœœ ›œžŸ Ħ˘£¤ŝĤ§§¨İŞüĞĴœœ›œžŸ Ħ˘£¤üĤĤ§§¨İŞúĞĴĴœœžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴœžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŭŞĞĴĴŭ­ œ žŸ Ħ˘ŝ£¤¤üĤĤ§§¨İüŞĞĞĴĴŭ­žŸ Ħ˘ŝ£¤¤ŝĤĤ§¨İŞŝĞĴĴŝ­§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœü›§§ĤĤ¤£˘Ħ Ÿžœ›ŝ§ĤĤ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›šŝ¤¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š£˘Ħ Ÿžœ› š£˘Ħ Ÿžœ› š™ŝ£˘˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™ŝ˘ĦĦ Ÿžœ› š™Ħ Ÿžœ› š™Ħ Ÿžœ› š ™ Ÿžœ› š ™ Ÿžœ› š ™ Ÿžœ› š™Ÿžœ›š™Ÿžœ› š™Ÿžœ›š™ŝŸžžœ› š™žœ›š™ŝšžžœ› š™šŝžœ›š™šœ›š™šœ›š™šœ›š™ šŝœœ›š™ šœ›š™ šœ›š™šœ› š™ š›œ›š™š›ŝœ››š™ š › š™ š › š™š › š™ š › š™ š›œ› š™ š›œ š™ š›œ š™ š›œ š™ š›œ š™ š›œŝšš™ š›œš™ š›œš™ š›œš™ š›œš™ š›œš™ š›œŝžšš™ š›œžš™š›œžš™š›œžš™š›œžš ™š›œžŝŸšš™š›œžŸš›œžŸš ›œžŸ98765432 10ŝ8765432 1 0ŝ7654321 0ŝŝ766543210ŝ6543210ŝ543210ŭ143210/01ŝ3210 /01ŝ210 /01ŝ210/01ŝ10/01ŝ10/012ŝ10/012ŝ0/0123ŝ0/012û344ŝ0//01234ŝ/012ŝ344ü56/0123456ŝ/012ŝ344ŝ566ŭ7 /01234567ŝ /01234ü566778ŝ /01234ŝ56678ŭ9/012345678û9::/01234ŝ566789û:;;/012ŝ344ŝ56678ĝ9::;<</012345678ö9::;<<=>ŝ/001234ü566778ô9::;<<=>?@01234ŝ56678ó9::;<<=>?@A012ŝ344ŝ56678ñ9::;<<=>?@ABBŝ0112345678ï9::;<<=>?@ABBCD1234ü5667789ï:;;<==?@@ABCDDE1234ŝ56678ì9::;<<=>?@ABBCDEFGŝ122ŝ344ŝ56678ê9::;<<=>?@ABBCDDEGHH2345678è9::;<<=>?@@ABCDDEFGHIJü23344ŝ56678ç9::;<<=>?@ABBCDEFGHIJJL ŝ344ŝ56678ċ9::;<<=>?@ABBCDDEGHIJJKMN 456789::;<<=>?@AABCDDEFGHIJKLMNO!ŭ456678â9::;<<=>?@ABBCDEFGHIJJLMNOPQ"ü566778à9::;<<=>?@ABBCDDEGHIJJKMNNOQRS#ŝ6778ß9::;<==>@@ABCDDEFGHIJKLMNOPRSTU$78Ŭ9::;<<=>?@ABBCDEFGHIJJKMNNPQRTTUW$Ĝ78899::;<=>>@@ABCDDEFGHIJKLNNOQRSTUVWX%8Ú9::;<<=>?@ABBCDEFGHIJJLMNOPQSTUVWXYZ&Ĝ89::;<<>>@@ABCDDEFGHIJKLNNOQRSTUVWXZ[\&:Ú;<<=>?@ABBCDEFGHIJJLMNOPQSTUVWXYZ\]^'Ĝ:;<<=>?@ABCDDEFGHIJKLNNOQRSTUVWXZ[\]^_(<Ú=>?@ABBCDDEFHIJJKMNNPQRTUVWXYZ\]^_`a)Ĝ<=>?@ABBCDEFGHIJKLMNOPRSTUVWXY[\]^_abc)Ĝ=>?@ABCDDEFGHIJKMNNOQRSTUVXYZ[\^^`abcd*Ĝ>@@BBCDDEFHIJJKMNNPQRTUVWXY[\]^_`abdde+Ĝ@ABBCDEFGHIJJLMNOPRSTUVWXY[\]^_abcdefg+ĜABBCDEFGHIJKLMNOQRSTUVWXZ[\]^_abcdefhh+BDÜEFGHIJKLNNOQRSTUVWXZ[\]^`abcdeghhj,ĜCDDEFGHIJKLNNOQRSTUVXYZ\\^_`abcdeghijk,DÚEFGHJJKMNNOQRSTVVXYZ\\^_`abcdeghijkl-ĜDEFGHJJKMNNOQRSTVVXYZ\\^_`abcdeghijklm.ĜEFGHJJKMNNOQRSTVVXYZ\\^_`abcdeghijkkmn.ĜFGHIJKLNNOQRSTUVXYZ[\^_`abcdeghhjkkmno.ĜGHIJKLNNOQRSTUVXYZ[\]^_abcdefhhjjkmnop.ĜHIJKLNNOPRSTUVWXY[\]^_abcdefghijklmopp/ĜIJKLMNOPRRTUVWXY[\]^_`bbdeeghijklmnopq/JÚKMNOPQRTUVVXYZ\\^_`abcdeghhjjkmmoppr/ĜJKMNNOQRSTUVXXY[\]^_abcdefghijklmnopqr/ĜKLNNOPRSTUVWXY[\]^_`abddeghhjjklmoppqr/¤ŝ£˘˘Ħ Ÿž œŝAŭ¤£˘˘Ħ Ÿž œŝA˘Ħ ŸžœŝAŝ˘ĦĦ ŸžœŝAĦ ŸžœŝA Ÿžœ›œŭA ŝŸžžœ›œŭAŝŸžžœ ›œŝAžœ ›œŝAŝžœ›œŝAœ›œŝAœ›œŭžBŝœœ›œžŝBœ›œžŭŸBœ›œžŸŭ Bŝœ››œžŸ ŝB›œžŸ ŭĦC›œžŸ ĦŝC›œžŸ Ħŭ˘C ›œžŝŸ  Ħ˘ŝD ›œžŸ Ħ˘ü£¤D ›œžŝŸ  Ħ˘û£¤¤D›œžŸ Ħ˘ŝ£¤¤ŝD›œžŸ Ħ˘ŝ£¤¤üĤE›œžŸ Ħ˘ŝ£¤¤ûĤĤE›œžŝŸ  Ħ˘ŝ£¤¤ùĤĤ§§Eŝ›œœžŸ Ħ˘ŝ£¤¤üĤĤ§§ŭ¨FœžŸ Ħ˘£¤Ĥ§¨ŭİFœžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŝGŝœžŝŸ  Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝGžŸ Ħ˘ŝ£¤¤ŝĤĤ§¨İŞüĞĴGžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝGžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŭ­HžŝŸ  Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴû­HžŸ Ħ˘£¤Ĥ§¨İŭŞĞĴĴŝ­ŝIŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­üݰI Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŝI Ħ˘£¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ŭħJĦ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ûħ²²JĦ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°ùħ²²³³K˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´Kŭ˘£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°öħ²²³³´´µKŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°²³ŝ´µµŝK¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°óħ²²³³´´µµĥĥL¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­°ħ²²³³´´µµĥĥ··Lò¤ĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸LĤ§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··¸ŝMúĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°íħ²²³³´´µµĥĥ··¸¸ııM§¨İŞŝĞĴĴŝ­ŝݰ°ìħ²²³³´´µµĥĥ··¸¸ıışM÷§¨¨İİŞŞĞĴĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··ŝ¸ıışŝM¨İŞŝĞĴĴŝ­°îħ²²³³´´µµĥĥ··¸¸ıışşŝNİŭŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŭğNİŭŞĞĴĴŝ­ŝݰ°ġħ²²³³´´µµĥ··¸ışğŭĵNŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵŝNŭŞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵŝNŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵŭ½OĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵü½OĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵû½OŭĴ­ŝݰ°ùħ²²³³´µµŝĥ··¸ışğĵ½ŝOŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½ŝOŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½ŝOŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışğĵ½ŝOŝݰ°ŭħ²³³´µĥ·¸ışŝğĵĵŝ½ŭżOŭݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışğĵ½ŭżOœ›šŝ@ŝœ››šŝ@›š™šŝ@›š ™šŝ@›š ™šŝ@›š™šŝ@š™šŝ@ š™šŝ@ š™šŝ@ š™šŝ@š™šŝ@š™šŝ@š™ šŝ@š™ šŝ@™ šŝ@™ šŭ›@™ š›ŝ@™ š›ŝ@™ š›ŝ@™ š›ŝ@™ š›ŭœA ™ š›œŝA ™ š›œŝA ™ š›œŝA™ š›œŝA™š›œŭA™š›œŝA™ š›œŝAŝ™š š›œŝA š›œŭžB š›œžŝB š›œžŝBš›œžŸŝBš›œžŸŝBš›œžŸŝBš›œžŸŭ Bš›œžŸ ŝB›œžŸ ŝB›œžŸ ŭĦC›œžŸ ĦŝC›œžŸ Ħŭ˘C›œžŸ Ħ˘ŝCŝ›œœžŸ Ħ˘ŝCœžŸ Ħ˘ŭ£DœžŸ Ħ˘£ŝDœžŸ Ħ˘£ŝDœžŸ Ħ˘£ŭ¤DœžŸ Ħ˘£¤ŝDŝœžŸ Ħ˘£¤ŝDžŸ Ħ˘£¤ŝDžŸ Ħ˘£¤ŝDžŸ Ħ˘£¤ŝDžŸ Ħ˘£¤ŝEŝžžŸ Ħ˘£¤ŭĤEžŸ Ħ˘£¤ĤŝEžŸ Ħ˘£¤ĤŝEžŸ Ħ˘£¤Ĥŭ§EŝžŸŸ Ħ˘£¤Ĥ§ŝEŸ Ħ˘£¤Ĥ§ŝEŸ Ħ˘£¤Ĥ§ŝEŸ Ħ˘£¤Ĥ§ŝEŸ Ħ˘£¤Ĥ§ŝEŸ Ħ˘£¤Ĥ§ŝEŸ Ħ˘£¤Ĥ§ŝE%˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙€€€€$ŝ ñXbbcddefgghijjkkmünoo#ŝ ôYbcddeegghhjjkùlmmnoo#ŝ ÷Zcddeegghhjkùlmmnoo#ŝ ôZddeefgghhijjkŝlmmŭno#ŝ ŭ[deeghjkmŝn#ŝ û[deegghjkŝlmm$ŝ ù[eefgghhjklm$ŝ ü\eegghjkŝl#ŝ ü\efgghŝijjk$ŝ ŭ\egghŝijj$ŝ ŭ\egghij$ŝ ŭ\fgg h$ŝ ŭ\fgg h$ŝ ŭ\egg$ŝ ü\efg gf$ŝ ŝ\eefeŝd#ŝ ŝ\e edŝc#ŝ ŝ\eedcb$ŝ ŝ\eedcba$ŝ ŭ\eddŝcbba`ŝ_#ŝ ŝ[ddŝcbba`_^$ŝ ú[ddccbbaŝ`__^]$ŝ ü[dcbba`_^ŝ]\\$ŝ ŝ[bbaŝ`__^]\[ŝZ#ŝ ŝZbbaŝ`__^ŝ]\\[ûZYYX#ŝ ŭZbaa_^ŝ]\\[ùZYYXXW#ŝ ùYaa`__^^ò]\\[[ZYYXXWVV#ŝ éYa`__^^]\\[[ZYYXXWVVUT#ŝ üY`_^^ï]\\[ZYYXXWVVUTTS#ŝ ŭW_^^\[òZYXXWVVUTTSRR#ŝ ŝW^^\[YXVUTRŭQP#ŝ éW^^\\[ZYXXWVVUTTSRRQPO#ŝ éV^\\[ZYXXWVUUTTRRQPONN#ŝ éV\\[[YXXWVUUTSRRQOONNM#ŝ éU\[[YXXWVUTTSRQPONNMLK#ŝ éT\[ZYXWVUTTSRQPONNMLKJ#ŝ éT[ZYXWVUUTSRQPONNMLKJJ#ŝ éS[YXXVVUTSRQPONNMKJJII#ŝ éSZYXVVUTSRQPONNMKJJIHH#ŝ éSYXWVUTTRRQONNMLJJIHHF#ŝ éRYXVVUTSRQONNMLKJIHHFF#ŝ éQXWVUTSRQPONMLKJJIHGFE#ŝ éQXWVUTRRQONNMKJJIHGFED#ŝ éQXVUTTRQPONMLKJIHGFEDD#ŝ éQWVUTSRQONNMKJJIHFFEDC#ŝ éPWVUTRRQONMLKJIHGFEDDC#ŝ éPVVUTRQPNNMKJJIHFFEDCB#ŝ éPVVTSRQONNMKJIHHFEDDCB#ŝ éPVUTSRQONNLKJIHGFEDCBB#ŝ éPVUTSRQONMLJJIHFFEDCBB#ŝ éPVUTSRQONMLJJIHFEDDCBA#ŝ éPVUTSRQONMKJJIHFEDDCBA#ŝ éPVUTSRQONMKJJIGFEDDCBA#ŝ éPVUTSRQONMKJJIGFEDDCBA#ŝ éPVUTSRQONMLJJIGFEDDCBA#ŝ éPWVUSRQONMLJJIHFEDDCBA#ŝ éQWVUTRQONNLKJIHFFDDCBA#ŝ éQWVUTRRPONMKJIHGFEDCBB#ŝ éQXVUTSRPONMKJJIGFEDCBB#ŝ éRXWVUSRQONNLKJIHFEDDCB#ŝ éRYWVUTRRPONMKJIHGFEDCB#ŝ éSYXVVTSRQONMLJJIHFEDDC#ŝ éSZYWVUTRQPONLKJIHGFEDC#ŝ ëT[YXVUTSRQONMLJJIHFEDD$ŝŝ¨ıışğĵ½$ŝŝİıışğĵ½$ŝüİıışşğĵ½$ŝŭİışşğĵ½$ŝŝİşşğĵ½ŝ#ŝŝŞşşğĵ½$ŝŝŞşşğĵ½$ŝŝŞşşğ ĵ$ŝŝŞşşğ ĵ$ŝŝŞşşğ ĵ$ŝŝŞşşğ ĵ$ŝŝŞşş ğĵ$ŝŝŞşş ğ$ŝŝŞşş$ŝŝŞşş$ŝŝŞşş$ŝŝŞşşı$ŝŝŞş şı$ŝŝŞşş ıŝ¸#ŝŝŞşş ı¸$ŝüŞşşı ı¸·$ŝŝŞıı¸·$ŝŝİıı¸·ĥ$ŝŝİıı¸·ĥŝµ#ŝŝİıı¸·ĥµ$ŝüİıı¸¸·ĥµŝ´#ŝŭİı¸¸·ĥµ´$ŝŝݸ¸·ĥµ´³$ŝü¨¸¸··ĥµ´³$ŝŭ¨¸··ĥµ´³²$ŝŝ¨··ĥµ´³²ŝħ#ŝŝ¨··ĥµ´³²üħ°°#ŝú¨··ĥĥµµ´³²ħ°$ŝû¨·ĥĥµµ´³²ŝħ°°ŝŻ#ŝŝ¨ĥĥµ´³²ħ°ŭŻ#ŝü§ĥĥµµ´³²ŝħ°°Ż$ŝŭ§ĥµµ´³²ŝħ°°ŝŻ$ŝŭ§ĥµµŝ´³³²ŝħ°°ŝŻŝ­#ŝŝ§µµ´³ü²ħħ°°ŝŻŭ­Ĵ#ŝúĤµµ´´³³²ŝħ°°ŝŻü­ĴĴ#ŝġĤµµ´´³³²²ħ°°Żŝ­ĴĴ$ŝûĤµ´´³³ü²ħħ°°ŝŻŝ­ĴĴ$ŝöĤµ´´³³²²ħ°°ŝŻŝ­ĴĴŝĞ#ŝüĤµ´³³ŭ²ħ°°ŝŻŝ­ĴĴŭĞŞ#ŝ÷Ĥ´´³³²²ħ°°ŝŻŝ­ĴĴŭĞŞ#ŝ÷Ĥ´´³³²²ħ°°ŝŻŝ­ĴĴüĞŞŞ#ŝĝĤ´´³³²ħ°°ŝŻŝ­ĴĴûĞŞŞİ#ŝŭ´³³ŭ²ħ°°ŝŻŝ­ĴĴûĞŞŞİ#ŝĝ´³³²²ħ°°ŝŻŝ­ĴĴûĞŞİİ#ŝĝ´³³²²ħ°°ŝŻĴúĞŞŞİİ#ŝĝ´³³²²ħ°°ûŻ­ĴĴúĞŞŞİİ#ŝĝ´³³²²ħ°°ŝ­ĴĴúĞŞŞİİ#ŝĝ´³³²²ħ°°ŝ­ĴĴúĞŞŞİİ#ŝĝ´³³²²ħ°°ŝ­ĴĴúĞŞŞİİ#ŝĝĤ´³³²²ħ°°ûŻ­ĴĴúĞŞŞİİ#ŝĝĤ´´³³²ħ°°ûŻ­ĴĴúĞŞŞİİ#ŝĝĤ´´³³²ħ°°ŝŻ÷­ĴĴĞŞŞİİ#ŝôĤ´´³³²²ħ°°Żŝ­ĴĴûĞŞİİ#ŝôĤµ´³³²²ħ°°Żŝ­ĴĴûĞŞİİ#ŝ÷Ĥµ´´³³²ħ°°ûŻ­ĴĴûĞŞŞİ#ŝóĤµµ´³³²²ħ°°Żĝ­ĴĴĞĞŞİ#ŝûĤµµ´³³ŭ²ħ°°ûŻ­ĴĴüĞŞİ#ŝò§µµ´´³³²ħħ°°Żù­ĴĴĞŞŞ#ŝú§ĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŝĞŞ$ŝŝ–¤¤Ĥ§$ŝŝ–¤¤Ĥ§$ŝŝ–¤¤Ĥ§$ŝŝ–¤¤Ĥ§$ŝŝ–¤¤Ĥ§$ŝü–¤¤Ĥŝ§#ŝü–¤¤ Ĥ$ŝŭ–¤ Ĥ$ŝŭ–¤ Ĥ$ŝŝ–Ĥ$ŝŝ–$ŝŝ—$ŝŝ—$ŝŝ—$ŝŝ—ŝ¤#ŝŝ— ¤$ŝŝ–¤¤$ŝŝ–¤¤$ŝŝ–¤¤$ŝŝ–¤¤£$ŝŝ–¤ ¤£$ŝŝ–¤ ¤£$ŝŝ–¤¤ £ŝ˘#ŝŝ–¤¤ £˘$ŝŝ–¤¤ £˘$ŝŝ–¤¤£˘$ŝü–¤¤££˘ŝĦ#ŝŭ–¤££˘Ħ$ŝŝ–££˘Ħ$ŝŝ•££˘Ħŝ #ŝŝ•££˘Ħ $ŝŝ•££˘Ħ $ŝŝ•££˘Ħ $ŝü•££˘˘Ħ ŝŸ#ŝŭ•£˘˘Ħ Ÿ$ŝŝ•˘˘Ħ Ÿ$ŝŝ•˘˘Ħ Ÿ$ŝŝ”˘˘Ħ Ÿ$ŝŝ”˘˘Ħ Ÿ$ŝŝ”˘˘Ħ Ÿŝž#ŝŝ”˘˘Ħ Ÿž$ŝü”˘˘ĦĦ Ÿž$ŝü”˘˘ĦĦ Ÿž$ŝü”˘˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿžŝ#ŝŭ”˘ĦĦ Ÿžŝ#ŝŭ”˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝŝ”ĦĦ Ÿž$ŝŝ”ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝŭ”˘ĦĦ Ÿž$ŝü”˘˘ĦĦ Ÿž$ŝü”˘˘ĦĦ Ÿž$ŝü”˘˘ĦĦ Ÿž$ŝŝ”˘˘Ħ Ÿžŝ#ŝŝ•˘˘Ħ Ÿžŝ#ŝŝ•˘˘Ħ Ÿž$ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙prstutsrqpéonnmlkkjjihhgfeedcbbaopprsrqponèmllkjjiihhgfeedcbba`_ooppŝqrrqponûmllkjjŝihhògfeddcbba`_^^oopq rqponmlŝkjjŝihhïgfeedccbba`_^^]\ooponmlkjihĝgffeddcbbôa`_^^]\\[nnooponmlkjihégffeddccbba`__^]]\\[ZYmmnonmlkjihgĉfeeddccbbaa`_^^]\\[[ZYXWlmmlkjihgfedcbaï`_^^]]\\[ZYYXWWVkk lkjihgfedcbîa``_^^]]\\[[ZYXXWVVüUjjkk jihgfedcbça``_^^]]\\[[ZYYXWWVVUUTSjjihgfedcbìa``__^^]]\\[[ZYYXWWVVùUTTSRRh hgfedcböa``__^^]]\\÷[ZZYXXWWVVöUTTSSRRQQhhgfedcba`_^]\[ĝZYYXXWWVVúUTTSSRRûQPOOggfedcba`_^]\[ZŝYXXŝWVVUTSRûQPPONNŝfeedcba`_^]\[ZYXWVUTSRQüPOONNMdcba`_^]\ú[ZZYYXXWVUTSRúQPPOONNMLüKccbba`_^]\[ZYXWVUTSRQüPOONNúMLLKKJJba`_^]\[ŝZYYXWVUTSRQüPOONNMLKJûIa``__^]\ú[ZZYYXXWVUTSRQPONMŝLKKJIH_^]\[ZYXWVUTSRQPONMLKJIHGûF^]]\\[ZYXWVUTSRüQPPOONMŝLKKJIHGF\[üZYYXXWVUTSRúQPPOONNMLKJIHGFE[ĝZYYXXWWVVUTSRúQPPOONNMŝLKKJIHGFEDYXWVUTSRúQPPOONNúMLLKKJJIHGFEDCíXWWVVUUTTSSRRQQPOONNúMLLKKJJIHGFEDCBVóUTTSSRRQQPOONNMüLKKJJIHGFEDC BUT÷SRRQQPOONNúMLLKKJJIHGFEDCB AöTSSRRQPOONNûMLKKJJIüHGGFFEDCBA@RQŭPONNûMLLKJJIHGFEDCBA@?>ú?QPOONNüMLKJJIHŝGFFEDCBA@?>ONMŭLKJJûIHHGFFEDCBA@?>=<=NMLKKJJIIHHGFFEEDDCBA@?>=<ġNMLKJJIIHGFFŝEDDCBA@?>=<;<óLKJJIIHGFFEEDDŝCBBA@ŝ?>>=<;:;JôIHHFFEEDDCCBBûA@@?>>=<;: 9:;èJIHHGFEEDDCCBBAA@@?>>==<<;:989:ïIHGFFEDDCCBBAA@?>>ŝ=<<;:9 8789:ñHGFEEDDCBBAA@?>>ŝ=<<;:98789ïGFEDDCCBBA@@?>>=<<;:98 76 789ñFEDDCBBAA@?>>=<<ŝ;::ŝ9887678êEDDCBBA@@?>==<<;;::998876 5678DòCBBA@@>>=<<;;::ŝ988765 4567ñ8DCBBA@@>>=<<;::987654567óCBBA@@>==<<;::ŝ9887654 34567BA@@>>=<<;::9988776543234567BñA@>>=<<;::9988776543234567BA@?>=<<;::998877654321234567A@@>>=<<;::9887765432123456òA@?>=<<;::9887765432123456òA@>>=<<;:9988776543212345ò6@@>=<<;::988776ŝ54432 10 12345ó@?>=<<;::98877654321 012345ó@?>=<<;::988776ŝ54432101234ó5@?>=<<;:9987765432101234ó5@?>=<<;:988776543210/01234ô@?>=<<;:998776543210 /01234ô@?>=<<;:998776543210 /0123ĉ4A?>=<<;::988776655443322110/0123ò4A@>>=<;::98877ö655443322110/0123óA@?>=<;;:988776ú544332210/0123Aġ?>=<<;::9877654ŝ32210/012ñ3BA@>>=<;::988776ĝ5443322110/012ñ3BA@?>=<<;:99877654ŝ32210/012ñCBA@>>=<;::988776ĝ5443322110/012 żÀ ż½ĵğşıŝ¸ż½ĵğşı¸ż ½ĵğşı¸·"½ĵŝğşşı¸·½ĵŝğşşı¸·ĥŝ½½ĵğşı¸·ĥµ½ ½ ĵğşı¸·ĥµ½ ĵğşı¸·ĥµ´ĵğşı¸·ĥµ´³ĵğ şı¸·ĥµ´³ ĵğ şı¸·ĥµ´³²ĵğ şı¸·ĥµ´³²ħğşı¸·ĥµ´³²ħ°şı¸·ĥµ´³²ħ°şı¸·ĥµ´³²ħ°ŝŻşş ı¸·ĥµ´³²ħ°Żı¸·ĥµ´³²ħ°Żı¸·ĥµ´³²ħ°Ż¸·ĥµ´³²ħ°Ż ­ŝ¸··ĥµ´³²ħ°Ż­Ĵ·ĥµ´³²ħ°Ż ­Ĵŝ·ĥĥµ´³²ħ°Ż­ ĴüĞĥĥµµ´³²ħ°Ż­ ĴĞŝ޵µ´³²ħ°Ż­ ĴĞŞŝµ´´³²ŝħ°°Ż­ ĴĞ Şİ´³²ŝħ°°Ż­ĴĞŞ ݳ²ŝħ°°ŝŻ­ĴĞŞİ³²ħ°ŝŻ­ĴĞŞ ݨ²ŝħ°°ŝŻ­ĴĞŞİ ¨ §ħ°Żŝ­ĴĴĞŞİ¨§°Żŝ­ĴĴĞŞİ¨ §Ĥ§°ŝŻ­ĴŝĞŞŞİ¨§Ĥü§°Ż­ĴŝĞŞŞİ¨§ĤĤŝŻ­ĴŝĞŞŞİ¨§Ĥ¤ŝĤŝ­ĴĴŝĞŞŞİ¨§Ĥ¤ŝ­ĴĴŝĞŞŞİ¨§Ĥ ¤ü­­ĴĴŝĞŞŞİ¨§Ĥ ¤£¤ĴĞŞİ¨§Ĥŝ¤¤£˘£¤ĴŝĞŞŞİ¨§Ĥ¤£˘ Ħ˘£¤ĴüĞŞŞİݨ§Ĥ¤£˘Ħ˘£ú¤ĴĞŞŞİݨ§Ĥ¤£˘Ħ˘£üĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ħ˘£Şİ¨§Ĥ¤£˘Ħ Ÿ Ħ˘ŭ£Şİݨ§Ĥ¤£˘Ħ Ÿ Ħ˘İ¨§Ĥŝ¤¤£˘Ħ Ÿ žŸ Ħú˘İݨ¨§§Ĥ¤ŝ£˘˘Ħ ŸžŸ Ħô˘İݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ Ÿž žŸ Ħüݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ ŸžžŸ Ħ÷ݨ¨§§ĤĤ¤¤£˘Ħ ŸžžŸ Ħ¨§Ĥŝ¤¤ü£˘˘ĦĦ ŸžžŸ Ħ¨§üĤ¤¤£˘Ħ Ÿž œ žŸ Ħ¨§Ĥŝ¤¤ü£˘˘ĦĦ Ÿž œžŸ ÷Ħ¨¨§§ĤĤ¤¤ü£˘˘ĦĦ ŸžœžŸ ¨§Ĥŝ¤¤£˘Ħ ŝŸžžœ›œžŸ ¨§Ĥŝ¤¤£˘Ħ Ÿžœ ›œžŸ÷ ¨¨§§ĤĤ¤¤£˘Ħ Ÿžœ ›œžŸ÷ ¨¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œžŸ¨§Ĥŝ¤¤£˘Ħ Ÿžœ›œžŸŭݨ§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœ›œžüŸİ¨§§Ĥŝ¤¤ü£˘˘ĦĦ ŝŸžžœ›œžöŸİ¨¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œžİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›œžİ¨§Ĥŝ¤¤£ŝ˘ĦĦ Ÿžœ›œžİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›œž§¨ §Ĥ¤ §¨ §Ĥ¤ŝ£§ §¨§Ĥ¤£#§Ĥ¤£§Ĥ¤£˘§Ĥ ¤£˘Ĥ§ Ĥ ¤£˘Ĥ ¤£˘ŝĦĤĤ ¤£˘Ħ Ĥ ¤£˘Ħ ¤£ ˘Ħŝ ¤£ ˘Ħ  ¤£ ˘Ħ ¤ £ ˘Ħ ¤ £ ˘Ħ  Ÿ¤ £ ˘Ħ  Ÿ ¤ £ ˘Ħ  Ÿ¤ £ ˘ Ħ   Ÿŝ¤£ £ ˘Ħ  Ÿ£ ˘Ħ  Ÿž£ ˘ Ħ  Ÿž£ ˘Ħ  Ÿ ž ˘Ħ  Ÿž˘Ħ  Ÿž˘Ħ  Ÿžŝ˘ĦĦ  ŸžĦ  Ÿ žĦ  Ÿ žŝĦ   Ÿ ž  Ÿ ž#  Ÿžœ  Ÿžœŝ ŸŸž  œŸž $œŸž 'œŸž *œŸž œ›œŝŸžž œ›œž œ ›œž œ%›ŝœžž œ(›ž œ*›ŝž œ›š›ŝžœ ›š ›œ ›š ›œ ›š›œ › š›œ ›"š›œ ›$š›œ›&š›œ›(š›œ›š™š›œ›š ™š›œ› š™šŝ›œ› š™ šŝ›œ› š™ šœ› š™ šœ› š™ šœ› š™ šœ› š™ šœ› š™ šœ› š™šœ› š™šœ› š™šÍ`_^]]\[ZYXWVVUTSRRQONNMLKJJIHHGFEDDCCBBA@@?>==<<;;::987Ŝ6^^]\\ZYXXWVUTTSRQPONNMLKJJIHHGFEDDCBBAA@?>>==<<;;::987Ü]\\[ZYXWVVUTSRRQPONNMLKJJIHHGFEEDDCBBüA@@>>ŝ=<<;:987ï\[ZYXWVVUTTSRQPONNċMLKJJIHHGFEEDDCCBBAA@@>>==<<;:987ëZYXWWVUUTSRRQPONNMMKJJéIHHGFEEDDCCBBAA@@?>>==<<;:987XîWVVUTSRRQPOONNMLKJJĝIHHGFEEDDŝCBBA@>=<;:98â7WVVUTTSRRQPONNMMLKJJIIHHGFEEDDCBA@>=<;:98ġVUTTSRRQPONNñMLKKJJIIHHGFEEDDCBA@>=<;:9TòSRRQPOONNMMLKJJIHFEDCBA@>=<;:9ĝSRRQPOONN÷MLKKJJIIHHFEDCBA@ŝ?>>=<;:úRQPOONNûMLKKJJIHüGFFEEDCBA@>=<;üPOONNûMLKKJJIHüGFFEEDCBA@>= <NûMLKKJJIHŝGFFEDCBA@ŝ?>> =<ùNMMLKKJJIHŝGFFEDCBA@?>üLKKJJIHŝGFFEDCBA @?>?ŝKJJIHŝGFFEDCBA@JIHGFEDC BAŭBIHHGFEDC BüHGGFFED CB CDFEDC DE DC DEF DC DEFGHDC DEFGHICBCDEFGHIJB CDEFGHIJKŝLBBCDEFGHIJKLMŝNA ABCDEFŝGHHIJKLMNŝO@@ABCDEFŝGHHIJKLMNOPüQ??@@ABCDEFŝGHHIJKüLMMNNOŝPQQRŝS>>ŝ?@@ABCDEFHIJKLMNOPQRSTŝ=>>ŝ?@@ABCDEFŝGHHIJKüLMMNNöOPPQQRRSSTTUŝV==>ŝ?@@ABCDEFüGHHIIJûKLMMNNOôPQQRRSSTTUUVVW<=>ŝ?@@ABCDEFúGHHIIJJKŭLMNNOùPQQRRSTTúUVVWWXXŝY<<=>@ABCDEFHIJûKLMMNNñOPQQRRSTTUUVVWXXùYZZ[;;<<=>ŝ?@@ABŝCDDEFHŝIJJüKLMNNOQRîSTTUUVVWXXYYZ[[\\;;<=>@ABCDĝEFFGHHIJJüKLMNNċOPQRRSTTUUVVWXXYZ[[\\]^^::;;<=>Ë?@@AABBCCDDEEFFHHIIJJKLMNNOOPQRRSTUUVVWXXYZ[[\\]^^__::;<=>@ABCDEġFGHHIJJKKMNNìOPQRRTTUVVWXXYZ[[\]^^ú_``a9::;<=>@ABCDÖEFFHHIIJJKMMNNOPQRSTTUVVWXYY[[\\]^^_`aabb99:;<Ĉ=>>?@@ABBCCDDEFFHHIJJKLMNNOPQRSTTUVVXXYZ[\\]^^_`aabbcd899::;<=‹>?@@ABBCCDDEFGHIIJKKMNNOPQRRTTUVVXXYZ[\\^^_`aabbcdde8899::;;<<==>?@@ABBCDDEEFHHIJJKLMNNOQRRTTUVVXXYZ[\]^^_`abbcddefg889:;<€¸=>>@@ABBCDDEFFHHIJJKMNNOPQRSTUVVXXYZ[\]^__aabcddefggh78899::;;<<=>>@@ABBCDDEFFHHIJKLMNNOQRSTTUVWXYZ[\]^__abbcddefghhi778899::;<<==>?@ABBCDDEFGHIJJKLMNOPQRTTUVWXYZ[\]^__abbcdeegghhjj7788Ä9::;;<<=>?@ABBCDDEFGHIJJKMNNOQRRTUVVXXY[\\^^_abbcdefghhijjk7789:È;<<=>?@AABCDDEFGHIJJKMNNOQRSTUVWXYZ[\^^_`abcdefghhijjkl778Ċ9::;<<=>?@@ABCDDEFGHIJJKMNNPQRTTUVXXY[\]^_`abcdeeghhijkklm778Ä9::;;<==>@@ABCDDEFGHIJJLMNOPQRTUVVXYZ[\^^_abbddegghijkklmn677Â899::;<<=>@@ABBCDEFGHIJJLMNOPRSTUVWXY[\\^_`abcdefghijjklmno66778Ä9::;<<=>?@ABBCDEFGHIJJLMNOQRSTUVWXY[\]^_`abddeghhjjklmnop667789Ċ:;<<=>?@ABBCDEFGHIJJLMNOQRSTUVXXY[\]^_abcdefghijkkmmoop566778Ä9::;<==>@ABBCDEFGHIJJLMNOQRSTUVXXY[\^^_abcdefghjjklmoopp5667789::;<<=>@@ABCDDEGHIJJKMNOQRSTUVXXY[\^^_abcdeghhjjkmmoppq556677Â899:;<<=>?@ABCDDEFHIJJKMNOPRSTUVXXZ[\^^`abddeghijkkmnoppr5566778Ä9::;<=>?@ABBCDEFHHIJKMNOPQSTUVXXY[\^^`abddeghijkkmnopqr45567789::;<<=>@ABBCDEFGHIJKMNNPQRTUVWXY[\^^_abddeghijklmoopqr4556677Â899:;<<=>?@ABCDDEGHIJKLNNOQRTUVWXY[\]^_abcdeghijklmoopqr445667789::;<=>?@ABBCDEFHIJJLMNOQRSTUWXY[\]^_abcdeghijklmoopqr44556677Â899:;<<=>@@ABCDEFGHIJKMNOPRSTUVXYZ[]^_abcdefghjjkmnopqr3445667789::;<=>?@ABCDDEGHIJKLNNPQRTUVWXZ[\^_`abdefghjjkmnopqr344556677Â89::;<<=>@ABBCDEFHHJJLMNOQRSTUWXY[\]^_abddeghijklmopqr33445667789:;;<=>?@ABCDDEGHIJKLNNPQSTUVXXZ[]^_`bcdefhijklmoopr3344556677Ë89::;<<=>@ABBCDEFHIJJLMNOQRTTUWXY[\^^`abddfghjjkmnopq¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥ¤£˘Ħ·ĥµ´³²ħ°Żŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħŝ·ĥĥµ´³²ŝħ°°Żŝ­ĴĴĞŞİ¨§Ĥ¤£˘ĥµ´³²ħ°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘µ´³²ŝħ°°ŝŻ­ĴŝĞŞŞİ¨§Ĥ¤£˘µ´³²ħ°Ż­ĴĞŞİ¨§Ĥ¤£´³²ŝħ°°Ż­ĴĞŞİ¨§Ĥ ¤ŝ£³³²ħ°Ż­ĴĞŞİ¨§Ĥ ¤³²ħ°Ż­ĴĞŞİ¨§Ĥ¤²ħ°Ż­ĴĞŞİ¨§Ĥ¤ü²ħħ°°Ż­ĴĞŞİ¨§Ĥ°Ż­ĴĞŞİ¨ § Ĥ°Ż­ĴĞŞİ¨§Ĥ°Ż­ĴĞŞ ݨ§ŝŻ­ĴĞŞ İ ¨ §­ĴĞŞİ¨­ ĴĞŞ#İ­ ĴĞŞ#İ ĴĞ Şİ ŞĴĞ*ŞĞĴĞ$ŞĞĴĞ"ŞĞĴ"ŞĞĴ­Ş İ ŞĞ Ĵ­İ ŞĞ Ĵ­ ŝŻİİŞĞ Ĵ­ Ż°İŞĞ Ĵ­ ݰ¨ İŞĞĴ­Ż°ħ ¨ İŞĞĴ­Ż°ħ²§¨İŞĞĴ­Ż°ħ²³§¨İŞĞĴ­Ż°ħ²³ŝ´§§¨İŞĞĴ­Ż°ħ²³´Ĥ§¨İŞĞĴ­Ż°ħ²³´µĤ§¨İŞĞĴ­Ż°ħ²³´µŭĥĤĤ§¨İŞĞĴŝ­Ż°ħ²³´µĥĤ§¨İŞĞĴ­Ż°ħ²³´µĥ·ŝ¤Ĥ§¨İŞĞĴ­Ż°ħ²³´µĥ·ŝ¸¤¤Ĥ§¨İŞŝĞĴĴŝ­Ż°ħ²³´µĥ·¸¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ħ²³´µĥ·¸ı¤Ĥ§¨İŞĞĴŝ­Ż°ħ²³´µĥ·¸ı¤Ĥ§¨İŞĞĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışŝ£¤¤Ĥ§¨İŞĞĴ­ŝݰ°üħ²²³³´µĥ·¸ış£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²³ŝ´µµĥ·¸ışŝ𣣤Ĥ§¨İŞŝĞĴĴŝ­Ż°üħ²²³³´µĥ·¸ışğûĵ˘££¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·¸ışŝğĵĵ˘£¤ŝĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışğĵ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışğĵúĦ˘˘££¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·¸ışğĵ½ŝĦ˘˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·¸ışŝğĵĵ½ĝĦĦ˘˘££¤¤Ĥ§¨İŭŞĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵ½Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışğĵŝ½Ħ˘£¤üĤĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵ½Ħ˘£¤ŝĤ§§¨İŞŝĞĴĴû­Ż°°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴû­Ż°°îħ²²³³´´µµĥĥ··¸¸ıışşğĵ½ŝ ĦĦ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­믰°ħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½ŭż ĦĦ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴŝ­믰°ħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½üż  ĦĦ˘ŝ£¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­ŝݰ°ïħ²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½üż  ĦĦü˘££¤¤óĤĤ§§¨¨İİŞŞĞĴĴû­Ż°°ŭħ²³³ô´µµĥĥ··¸¸ıışşŝğĵĵŝ½ûżŸ  ĦĦ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴŝ­°ïħ²²³³´µµĥĥ··¸¸ıışşğĵŝ½ûżŸ  ĦĦ˘£¤ĤĤ§§¨¨İİŞĞĞĴĴ­öݰ°ħ²²³³´µµŝĥ··ü¸ıışşŝğĵĵŝ½ŭżŸ  Ħ˘ŝ£¤¤üĤĤ§§ù¨İİŞŞĞĴĴû­Ż°°òħ²³³´´µµĥĥ··¸ıışŝğĵĵ½úżŸŸ  ĦĦ˘£¤ŭĤ§§ŝ¨İİŭŞĞĴĴŝ­ìݰ°ħ²²³³´µµĥĥ··¸¸ıışşŝğĵĵ½üżžŸ  Ħ˘ŝ£¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­ŝݰ°öħ²³³´´µµĥ··ŝ¸ıışğĵŝ½úžŸŸ  ĦĦ˘£¤ŭĤ§§ŝ¨İİŭŞĞĴĴö­ŻŻ°°ħ²³³ô´µµĥĥ··¸¸ıışşŝğĵĵ½£˘Ħ Ÿž œ›£˘Ħ Ÿž œ›£˘Ħ Ÿž  œ›˘Ħ Ÿž  œ›˘Ħ Ÿž  œ›˘Ħ Ÿž œ›ŝ˘ĦĦ  Ÿž œŝ›ĦĦ  Ÿž œĦ  Ÿž œŝĦ   Ÿžœ  Ÿ žœ  Ÿ žœ  Ÿ ž œŝ Ÿ Ÿ ž$ Ÿ ž$ Ÿž%Ÿž%Ÿž&Ÿž!ž&ž -ž  žŸžžŸž ŸžŸžŸ žŸ  žŸ   žŸ  ŝĦ žŸ  Ħ ž Ÿ  Ħœ ž Ÿ  Ħ˘œž Ÿ Ħ˘œ ž Ÿ Ħ˘œ ž Ÿ Ħ ˘ŝ£œœ žŸ Ħ˘£œ žŸ Ħ˘£ œ žŸ Ħ˘£¤ œžŸ Ħ˘£¤ œžŸ Ħ˘£¤ œžŸ Ħ˘£¤ŝ›œ œžŸ Ħ˘£¤› œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥŝ§››œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§ŝš››œžŸ Ħ˘£¤Ĥ§ŝš››œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§6545678ŝ9::;<=ĝ>?@@ABB665 45678ŝ9::;<=ú>?@@ABBüC776656789:;<ó=>>?@@ABBCDD776789:;<ĝ=>>?@@ABBûCDDE77 6 789:;<=>û?@@ABBŝCDDŭEF7789:;<=î>??@@AABBCCDDEEFG88 7 89:;<=>ŝ?@@ŝABBCDúEFFGH889:;<=>?@ŝABBCDĝEFFGHHI99:;<=>?@ABCDöEFFGHHIIJ::;<=>?@ABŝCDDûEFFGHHŝIJJ;: ;<=>?@ABCDEFŝGHHIJŝK<<=>?@ABCDEFŝGHHIJüKLM<<=>?@ABCDEFŝGHHIJKüLMM> >?@ABCDEFŝGHHIJKúLMMNN?? @ABCDEFGHIJKŝLMMNŝO@@ABCDEFGHIJKLMNO BCDEFGHIJKLMNOûPQBBCCDEFGHIJKLMNOPQDEFGHIJKLMNOPQREFGHIJKLMNOPQRŝSFFGHIJKLMNOPQRSTHIJKLMNOPQRSTŝIJJKLMNOPQRS TUJKLMNOPQRS T UŝLMMNOPQRS T U VNOPQRSTUVŝOPPQRSTUVWXWVŝQRRSTUVW X YXSTUVWXYZYXŝTUUVWXYZ[\[ZYXVWXYZ[\] ^]\[ZYXYZ[\]^ _ ^ŝ]\\[ZYZ[\]^_`_^]\[ùZYY[\\]]^_`aba`_^ŝ]\\[ûZY]]^^_`abcdcba`_^ü]\\[[÷Z^__``aabbcdedŝcbbaŝ`__^ü]\\[[ü`aabbcdef gfedŝcbbaü`__^^ö]\\[[bbccddefghgfedücbbaa_^\ŭ[cddefghijihgfedücbbaa_^\ĝ[deefgghhijkjŝihhgüfeeddcbbaa__^^]\\ffghhŝijjklmlkjüihhggêfeeddcbba`__^^\\ghhiijjklmnonmlkjéihhggfeeddcbaa`_^^]\hijjklmnoponmŝlkkjhgñfeeddbbaa__^]\jjùkllmnnoopqrqpoŬnmmllkkjjihhggeeddbba`_^^\jklmmnooppqrŝqppoánmmlkkjjihhgfeedcbaa__^]kmmnooppŝqrrsrŝqppoċnmmlkjjihhgfeddbba`_^^mnooppŝqrrstutsrüqppoomëlkkjihggfedcbba__^noppŝqrrsŝtuuvutsrqppoonmlkjjihggeedbba`_^oppqrrsŝtuuvuŝtssràqppoonmlkjjhhgfedcbba_^ppqrrsstuuvw xwvuütssrrpoċnmlkjjhhgeedbba`_pqrrsstuuvvŝwxxwvuŜtssrrppoonmkkjihgfedcba`_qrrsstuuvvŝwxx yxŝwvvuàtssrrppoomlkjjhhgfedbba_rrsstuuvvxyzyxvußtssrrpponmlkjihgfedcba`rrstuuvvwxxyŝz{{zyxÜwvvuutssrqpponmkkjhhgfedbb`rssuuvvwxxyŝz{ {zyxŜwvvuutssrqpoomlkjihgfedcbarstuuvvxxyŝz{{|{ŝzyyxßwvvuutsrrpponmlkjhhgeedbassuuvvwxxyŝz{{ |{ŝzyyxŜwvvuussrrpponmkjjhgfedcbssuuvvwxxyy{|{yxâwvvuussrqpoomlkjihgedcbssuuvvxxyŝz{{|}|{yxwvvutsrrpponmkjjhgfedbssuuvvxxyŝz{{|ŝ}~~ŝ}||{yxvuètsrrppomlkjihgedcrsuuvvxxy{|ŝ}~~ŝ}||{yxvusërqponmkkjhgfedrstuvvxxy{| ~|{Ĝzyyxxwvvutsrrpponlkjihgedrstuvvwxxyyz{{||ŝ}~ ~ŝ}||{Ûzyyxxwvuutsrqponmlkjhgferssuuvvxxyyz{{|ŝ}~ ~|{ézyyxxvvuussrpponlkjihgfĦ  Ÿ  Ħ˘£¤ŝĤĤ§¨İĦ Ħ˘£¤Ĥ§¨İŝŞĦ Ħ  Ħ˘£¤ŝĤĤ§¨İŞŭĞ˘ĦĦ˘£¤Ĥ§¨İŞŭĞĴ˘˘Ħ˘£¤Ĥ§¨İŞĞĴŝ£˘˘£¤Ĥ§¨İŞŝĞĴĴ£ ˘£ ¤Ĥ§¨İŞĞĴŝ­¤¤ £¤Ĥ§¨İŞĞĴ­¤Ĥ§¨İŞĞĴ­¤Ĥ§¨İŞĞĴŝ­ Ĥ§¨İŞĞĴ­Ĥ §¨İŞĞĴ­ŻĤ§¨İŞĞĴ­Żŝ°§ §¨İŞĞĴ­Ż°¨ İŞĞ Ĵ­Ż°¨ İŞĞ Ĵ­Ż° İŞĞ Ĵ­ ݰħŝİŞ ŞĞ Ĵ­ Ż °ħŞĞĴ­ Ż °ħ²Ĵ­ Ż °ħ²Ĵ­Ż°ħ²³ŝĴ­­Ż°ħ ²³ ݰħ ² ³Ż°ħ ²³Ż °ħ ² ³°ħ²³´°ħ² ³´µ ´ŝħ²²³ ´#µ´²³´µĥµ³´ µ ĥ µ´µ ĥ·ĥµĥ·¸·ĥµĥ·¸ ·ĥµĥ·¸ı¸·ĥµ·¸ ış ı¸·ĥüµ··¸¸ışı¸·ĥŝµ¸¸ı"şı¸·ĥı şğŝĵğğ şı¸·ĥışğĵğşı¸·ĥşğĵğşı¸·ŝĥşşğ ĵ½ ĵğşı¸·ûĥşğğĵĵ½½ĵğşı¸·ŝğĵĵ½½ĵğşı¸·ĵ½½ĵğşı¸·ĵ½ ż ½ĵğşı¸·üĵ½½ż½ĵğşı¸·½ ż Àż½ĵğşı¸·żÀż½ĵŝğşşıü¸··żÀ ÁÀż½ĵğşı¸ŝ·żÀÁÀż½ĵğşı¸ü·żżÀÁÀż½ĵŝğşşı¸ŝżżÀ Á ÁÀż½ĵğşı¸ŝżżÀÁ ÂÁÀżŝ½ĵĵŝğşşıŝ¸żżÀÁÂÁÀż½ĵŝğşşıŝ¸żżÀÁÂÂÁÀż½ĵğşıŝ¸żżÀÁ ÂÁÀżŝ½ĵĵŝğşşıżÀÁÂÂÁÀż½ĵğşıżÀÁÂÂÁÀżŝ½ĵĵŝğşşıżÀÁÂÂÁÀż½ĵğşŝıżżÀÁÂÂÁÀż½ĵŝğşşŝıżżÀÁÂÂÁÀżŝ½ĵĵğşŝıżżÀÁÂÂÁÀż½ĵŝğşşżÀÁÂÂÁÀżŝ½ĵĵğşżÀÁ Ä ÂÁÀż½ĵŝğşş ›š› œ›š› œŝž›&› œž$› œž!›œ ž›œ ž›œ žŝŸœœ›œ žŸ%œ žŸ!œ žŸœžŸœ ž Ÿœ ž Ÿ! žŸ žŸ žŸ žŸ  žŸ  žŸ  žŸ ĦžŸ ĦŸ  ĦŸ Ħ Ÿ ĦŸ %Ħ  Ħ˘Ħ  Ħ"˘ Ħ,˘ Ħ3˘Ħ˘£˘ŝĦ˘˘£˘+£˘£¤£˘ £¤£˘£&¤ £˘£.¤ £˘ŝ£¤ ¤ ¤ £˘ ¤ ¤£ŝ˘¤¤& ¤£ŝ˘¤¤ Ĥ ¤£ŝ¤Ĥ ¤£Ĥ§Ĥ¤£Ĥ§Ĥ¤£Ĥ§Ĥ¤£Ĥ §¨§Ĥ¤£Ĥ §¨ §Ĥ¤£ŝĤ§§¨ §Ĥ¤£§¨ ݨ§Ĥ¤£§¨İ¨§Ĥ¤£§¨İŞİ¨§Ĥ¤£§¨İŞİ¨§Ĥ¤£§¨İŞİ¨§Ĥ¤ü£§§¨¨İŞİ¨§Ĥ¤ŭ£§¨¨İŞİ¨§Ĥ¤ŭ£§¨¨İŞİ¨§Ĥ¤¨İŞİ¨§Ĥ¤¨İ Şİ¨§Ĥ¤¨İŞĞŞİ¨§Ĥ¤¨İ Ş Ğ Şİ¨§Ĥ¤¨İ Ş Ğ Şİ¨§Ĥ¤¨İ ŞĞ Şİ¨§Ĥ¤ŝ§¨¨İ ŞĞ Şİ¨§Ĥŭ¤§¨¨İ ŞĞ Şİ¨§Ĥŭ¤§¨¨İŞĞŞİ¨§ĤÌCDDEFFGHIJJKLMNNOQRRTTUVWXYY[\\^^_aabcdeegghijjkkmmooprsÇtuDDEFFHHIJJKLMNNOPRRSTUVVXXY[[\]^__abbddeegghijjkkmmnoopprsÊtDEFGHHIJJKLMNNOPQRSTUUVXXYZ[\\^^_`abbddeegghijjkklmmoopŝqrrsÒEFGHIIJJKLMNNOPQRSTUUVWXYY[[\]^__aabcddeegghhjjkmŝnoopŝqrrúsFHHIJJKLMNNOPQRSTTUVVXXYZ[\\^^__aabcddeegghhijjkklmmnoopÈqrrHHIJJKKMMNNOPQRRTTUVVWXYY[[\\^^__aabcddeefgghhijjkklmmŝnoopIJKMNäOPQRRSTUUVWXXYY[\\]^^__aabbddûefgghhüijjkkúlmmnnoopJüKLMNNÛOPQRRSTTUVVXXYYZ[\\]^^__aabbcddeefgghhŝijjkŝlmmnoJüKLMNNäOPQRRSTTUUVWXXYY[[\\]^^__aabbdeüfgghhŝijjklmônKKMMNNOOPQRRTUVîWXXYY[[\\]^^__`aabbdeŝfgghŝijjklöLMMNNOOPQRRTŝUVVXY[\ŝ]^^_abdeŝfgghijŝMNNOŭPQRRTUVüWXXYY[\^_abŝcddeŝfgghiNOQRúSTTUUVVXY[\ŝ]^^_ü`aabbŝcddefghùNOOPQQRRüSTTUUVXY[\ŝ]^^_`abcdefùgOOPQQRRŝSTTUVXYŝZ[[\^_ŝ`aabc dŭePQQRŝSTTUVŝWXXYŝZ[[\ŝ]^^_`abcQRŝSTTUVŝWXXYŝZ[[\ŝ]^^_`abRŝSTTUVXYŝZ[[\]^_`RŝSTTUVŝWXXYZ[\] ^ŝSTTUVŝWXXYZ[\TUVW XY Z[T U VWXY U"VWUVUVUTVU TSRV UTS RQ PŝWVVUTSRQPO NXŝWVVUTSRQPO N MLXŝWVVUTŝSRRQPONML KJXVUTŝSRRQPONMLK JIŝYXXŝWVVUTRQŝPOONMLKJI HŝYXXVUTRQŝPOONMLKJIHGFYXVUTRQüPOONNMLKJIHGFEDYXVUTüSRRQQONMŝLKKJIHGFE DCYXúWVVUUTTRQONMKJIHGFEDCBìZYYXXWVVUUTTSRRQQPONNMüLKKJJIHŝGFFEDCBAĉ[YYXXWVVUUTTRRQQPOONNMMLKJJIHúGFFEEDDCBA@?ç[ZYXXWVVUUTTRRQQOONNMMLKJJIHúGFFEEDDCBA@?>î[ZYYXWVVUTTSRRQPONNüMLKJJ÷IHHGFFEEDDCBA@?>=<[YíXWVVUTTRRQQOONNMLKJJóIHHGFFEEDDCCBBA@?>= <[YäXWVVUTTRRQPONNMMKKJJIHHGFEEDDCBŝA@@ŝ?>>=<;:Ŭ\[ZYXWVVUTTRRQPONNMLKJJIHHGFEEDDCCBBA@ü?>>==<; :Ó\[ZYXWVVUTSRRQONNMMKJJIIHGFFEDDCCBBAA@@?>>==<<;:98Ġ\[[YXXVVUTSRQQONNMLKJJIHHFFEDDCCBBAA@@>>==<<;:98\Ĝ[YYXVVUTSRQQONNMKKJIIHGFEEDDCBBA@@?>>==<<;:987\Ú[ZYXVVUTSRQPONNMKJJIHHFFEDDCBBAA@?>>=<<;:98 7Ù]\[ZYXWVUTSRQPONMMKJJIHGFEDDCCBBA@?>>=<<ŝ;::9876Ú]\[ZYXWVUTSRQPONMLKJJIHFFEDDCBBA@@>>=<<ŝ;::98765×^\\[YXWVUTSRQPONMLKJIHHFFEDCCBAA@?>==<<;::ŝ9887654Ô^]\[YXWVUTSRQPONMLKJIHGFEDDCBBA@@>>=<<;;::9887654Ò^]\[ZYXVVUSRQPONMLKJIHGFEDDCBBA@?>=<<;;::9988776543Ó_^\\ZYXVVUTRRPONMLKJIHGFEDDCBAA@>>=<<;::9988776543Ġ2_^]\[YXWVUTRRQONMLKJIHGFEDDCBA@@>>=<<;::988765432Ô_^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>==<;;::9887765432Ô`_^\\ZYXVUTSRQONNLKJIHGFEDDCBA@?>=<<;::998877654321Ġa_^]\[YXWVUTRQPNNMKJIHGFEDDCBA@?>=<<;::98877654321Ġa`_]\[ZXWVUTRRPONMKJJIGFEDDCBA@?>=<<;::988776ŝ544321Ġb`_^\\ZYXVUTSRQONMLJJIHFEDDCBA@?>=<<;::98877654321Ġba`^]\[YXWVUTRQONNLKJIHGFEDCBBA@>==<;::98877654321b×`_^\[ZYWVUTRRPONMKJIHGFEDCBBA@>>=<;::98877654321Ô0cba_^]\[YXVVUSRQONMLJJIHFEDDCBA@?>=<<;:99877654321Ó0dbb`_^\[ZYWVUTRQPNNLKJIHGFEDCBA@?>=<<;::98877ĝ65544332210Ôdcba`^]\[YXVUTSRQONMLJJIGFEDCBBA@>>=<;::988776ú544332210ŞŝĞĴĴ­ŝݰ°üħ²²³³´µĥ·¸ışŝğĵĵ½żŭŞĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışŝğĵĵ½żŝĞĴĴŝ­ŝݰ°ħ²³´µĥ·¸ışğĵ½żĴŝ­ŝݰ°ħ²³´µĥ·¸ışğĵ½żĴ­ŝݰ°ħ²³´µĥ·¸ışğĵ½żŭĴ­ŝݰ°ħ²³´µĥ·¸ışğĵ½ŝ­Ż°ħ²³´µĥ·¸ışğĵ½Ż°ħ²³´µĥ·¸ışğĵ½Ż°ħ²³´µĥ·¸ışğ ĵ½ŝݰ°ħ²³´µĥ·¸ışğ ĵݰħ²³´µĥ·¸ışğ ĵŝݰ°ħ²³´µĥ·¸ı şğĵ°ħ²³´µĥ·¸ışğ°ħ²³´µĥ·¸ ı ş°ħ²³´µĥ·¸ ışħ²³´µĥ ·¸ıħ²³´µĥ · ¸ı²³´ µĥ· ¸² ³´ µ ĥ·ŝ²³ ³´µĥ ³ ´µ ĥ ³´µ³0´€³´³²´³² ħ°´³ ²ħ°ŝµ´´ ³²ħ°Żµ´ ³²ħ°Ż µ´³²ħ °Żµ´³²ħ°Ż ­Ĵµ´³²ħ°Ż ­Ĵµ´³²ħ°Ż­Ĵе´³²ħ°Ż­ ĴĞŞµ´³²ħ°Ż­ĴĞŞİµ´³²ħ°Ż­ĴĞŞ İŝ¨µµ´³²ħ°Ż­ĴĞŞİ ¨ŝĥµµ´³²ħ°Ż­ĴĞŞİ¨§ŝĥµµ´³²ŝħ°°Ż­ĴĞŞİ¨ §Ĥŝĥµµ´³²ħ°Ż­ĴĞŞİ¨§ Ĥĥµ´³²ħ°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤ĥµ´³²ŝħ°°Żŝ­ĴĴŝĞŞŞİ¨§Ĥ¤ĥµ´³²ŝħ°°ŝŻ­ĴŝĞŞŞİ¨§Ĥ ¤ü·ĥĥµµ´³²ŝħ°°Żŝ­ĴĴŝĞŞŞİ¨§Ĥ ¤£ü·ĥĥµµ´³ü²ħħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘ü·ĥĥµµ´³²ħ°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħü·ĥĥµµ´³ŭ²ħ°°ŝŻ­ĴüĞŞŞİݨ§Ĥ¤£˘Ħ·ŝĥµµ´³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘ Ħ·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħ ·ĥµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ ·ŝĥµµŝ´³³ü²ħħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿ·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤£˘Ħ Ÿžñ¸··ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžñ¸··ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžŭ¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿž¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžŭı¸··òĥµµ´´³³²²ħ°°Żŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžùı¸¸··ĥµµù´³³²²ħ°°ûŻ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ Ÿžıò¸··ĥĥµµ´´³³²ħ°°ŝŻġ­ĴĴĞŞŞİݨ¨§§üĤ¤¤ŝ£˘˘Ħ Ÿžıŝ¸··ŝĥµµö´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿžóœıı¸¸··ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœıŝ¸··òĥµµ´´³³²ħħ°°Ż­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ ŝŸžžœóşıı¸¸··ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ ŸžœŝžžŸ Ħ˘£¤Ĥ§¨žŸ Ħ˘£¤Ĥ§¨žŸ Ħ˘£¤Ĥ §¨žŸ Ħ˘£¤Ĥ §ŭ¨žŸŸ Ħ˘£¤Ĥ §Ÿ Ħ˘£¤Ĥ §Ÿ Ħ˘£¤Ĥ§Ÿ Ħ˘£¤Ĥ§Ÿ Ħ˘£¤ ĤŸ Ħ˘£ ¤ ĤŸ Ħ˘£ ¤ĤŝŸ  Ħ˘£ ¤ Ħ ˘ £¤  Ħ ˘ £¤  Ħ ˘ £¤  Ħ ˘£¤  Ħ˘£ ¤  Ħ˘£Ħ˘£Ħ"˘ £Ħ-˘Ħ*˘Ħ!˘ħĦ ŝ˘Ħ Ħ ˘Ħ" ˘Ħ  Ÿ˘Ħ Ÿ˘ Ħ Ÿ˘ Ħ  Ÿ˘ Ħ  Ÿ ž˘ Ħ  Ÿž˘Ħ  Ÿž˘Ħ Ÿž ˘Ħ  Ÿ ž˘Ħ  Ÿ ž˘Ħ  Ÿ ž˘Ħ  Ÿžœ˘Ħ Ÿž  œ˘Ħ Ÿž œŝ£˘˘Ħ Ÿž œŝ£˘˘Ħ Ÿž œŝ£˘˘Ħ Ÿž œ›ŝ£˘˘Ħ Ÿžœ ›£˘Ħ Ÿž œ ›£˘Ħ Ÿž œ›£˘Ħ Ÿž œ›£˘Ħ Ÿž œ›£˘Ħ Ÿžœ›š£˘Ħ Ÿž œ ›š£˘Ħ Ÿžœ ›š£˘Ħ Ÿžœ › š£˘Ħ Ÿžœ › š£˘Ħ Ÿžœ › šŝ¤££˘Ħ Ÿžœ › šŝ¤££˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š™uvwxwvutsrŝqppçonmmkkjihhgfeddbba`^^]\[uuvutsrŝqppoänmlkjjihhgfedcbba_^^]\[Zsttuuvutsrŝqppoċnmlkkjihhgfeddcbaa_^^]\[ZYsst utsrŝqppáonnmlkkjjihhgfeddcba`_^^\\[ZYXrrsrqpoßnmmlkkjjihhgfeedcbba`_^^\\[ZYXWqrrqponßmllkkjjihhggfeddcbba`_^^\\[ZYXWVpp qponmĝlkkjjiihhĉgfeddcbbaa__^]\\[ZYXXVVoopponmlkjihgçfeedccbba`_^^]\\[ZYXXVVUnn onmlkjihgfeeddcbbaa__^^]\[[ZYXXVVUUllm mlkjihgüfeeddècbbaa`_^^]\\[[ZYXXVVUUTk kjihgfedcbaë`__^^]\\[[YYXXWVUUTTj jihgfedcbaé`__^^]\\[[ZYYXXVVUUTTShhgfedcba`_^ŝ]\\[ŭZYXXVUTŝRg gfedcbaü`__^^ŝ]\\[÷ZYYXXWVVUUTR edcba`_^]\[üZYYXXüWVVUUTüSRRccdcba`_^]\[ŝZYYXŝWVVUTŝSRR ba`_^]\[ZYXŝWVVUTRŝQ` `_^]\[ZYXWVUTRŝQ^^]\[ZYXŝWVVUTRQ\[ZYXWVUTRQ[ ZYXWVUTŝSRRQYXW VUTŝSRRQŝWVV U TSRQUTS RQTSRQ.RQP OPQN OPQL MNOP QJKLMNOŝPQQI JKLMNOQŝRHHIJKLMNOŝPQQRFGHIJKLMNOQR DEFGHIJKLMNOQR C DEFGHIJKŝLMMNOŝPQQRBCDEFŝGHHIJKŝLMMNOüPQQRR ABCDEFŝGHHIJKŝLMMNOüPQQRRŝS??@ABCDEFüGHHIIJKüLMMNNOüPQQRRŝT> >?@ABCDEFúGHHIIJJKñLMMNNOOPQQRRST<<=>ŝ?@@ABCDEFóGHHIIJJKKLMMNNöOPQQRRTT<;; <=>?@ABCDEFôGHHIIJJKKLMNNOQRT :;<=>ü?@@AABCDEFêGHHIIJJKLMMNNOOQQRSTT99:;<=>ú?@@AABBCDEFëGHIIJJKKMMNNOOQQRSTT889:;<=>Ŭ?@@AABBCCDDEEFFHHIIJJKLMNNOOQQRSTT8 89:;<=>ß?@AABBCCDDEEFGHHIJJKKMNNOOQQRSTU7 789:;<=>Ü?@AABBCCDDEEFGHIIJJKMMNNOQQRSTU77667 789:;<=à>?@@ABBCCDDEFFHHIJJKLMNNOQQRSTU6 6789:;<=á>?@@ABBCCDEEFGHIIJKLMNNOPQRSTU556789:;<=â>?@AABBCDDEFFHHIJJKMNNOPQRSTU4456789:;<=>?@AABCCDDEFGHIJJKLMNOPQRSTU4 456789:;<=ä>?@ABBCCDEFFHHIJKLMNNOQRSTU33456789:à;<<==>@@ABBCDDEFGHIJJKMNNOQRSTU223456789ß:;;<<=>>@AABCCDEFFHIIJKLMNOPQRTU2 23456789ß:;;<<=>?@ABBCDDEFHHIJKLMNOPQRTT2112345678ß9::;;<==>@@ABBCDEFGHIJJKMNNOQRST1 12345678à9::;<<=>>@AABCDDEFHHIJKLNNOQRST1 12345678á9::;<<=>?@ABBCDEFGHIJJLMNOPQST11234567à899:;;<==>@@ABCDDEFHHIJKMNNPQRT11ŝ01 123456789:;<<=>?@ABBCDEFGHIJKLMNOQRS100123456789::;<<=>?@ABCDDEFHIJJKMNOPQS0 012345678ä9::;<==>@ABBCDEFGHIJKLNNOQR0 01234567899:;<<=>?@ABCDDEFHIJJLMNOPR00/01234ü566778ċ9::;<<=>@AABCDEFGHIJKLNNPQ00/01234ü566778ç9::;<=>?@ABBCDEFHIJJLMNOPÀÁÀż½ĵğşı¸·ĥŝżÀÀ ÁÀż½ĵğşı¸·ĥŝµżżÀż½ĵğşı¸·ĥµżÀ ż½ĵğşı¸·ĥµż½ĵğşı¸·ĥµü´żż ½ĵğşı¸·ĥµ´½ĵğşı¸·ĥµ´½ĵğşı¸·ĥµ´ŭ³½½ ĵğşı¸·ĥµ´³ŝĵ½ ½ĵğşı¸·ĥµ´³ĵğşı¸·ĥµ´³ĵğ şı¸·ĥµ´³ŝ²ğğ şı¸·ĥµ´³ŝ²şşı¸·ĥµ´³²ş ı¸·ĥµ´³²ı¸·ĥµ´³² ı ¸ ·ĥµ´³²ŝħ¸¸ ·ĥµ´³²ŝħ·· ĥµ´³²ħĥ µ´³²ħ ĥµ´ ³²ħµ´³²ħ´³²ħ,³ ²ħ³4²ħ1² ħ°ħ-°ħݰ ħݰ ħ!ݰħŝ²Ĵ Ĵ­Ż °ħ²Ĵ­ Ż °ħ² ĞĴ­ ݰħ²ŞĞ Ĵ­Ż°ħ²İŞĞĴ­Ż°ħ²¨ İŞĞĴ­Ż°ħ²¨İŞĞĴ­Ż°ħ²ŝ³§ §¨İŞĞĴ­Ż°ħ²ŝ³ĤĤ §¨İŞĞĴ­Ż°ħ²³Ĥ§¨İŞĞĴ­Ż°ħ²³¤Ĥ§¨İŞĞĴ­Ż°ħ²³ ¤Ĥ§¨İŞĞĴ­ŝݰ°ŝħ²²³¤Ĥ§¨İŞĞĴ­Ż°ŝħ²²³ £ ¤Ĥ§¨İŞĞĴŝ­Ż°ŝħ²²³ ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ħ²³Ħ˘£¤Ĥ§¨İüŞĞĞĴĴŝ­Ż°ħ²³ Ħ˘£¤Ĥ§¨İŞĞĴ­Ż°ħ²³Ħ  Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²³  Ħ˘£¤Ĥ§ŝ¨İİüŞĞĞĴĴ­ŝݰ°úħ²²³³ŸŸ Ħ˘£¤Ĥ§¨İŞĞĴŝ­Ż°úħ²²³³Ÿ Ÿ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°úħ²²³³žžŸ Ħ˘£¤Ĥ§¨İüŞĞĞĴĴŝ­ŝݰ°úħ²²³³ž žŸ Ħ˘£¤ŝĤ§§ŝ¨İİŞŝĞĴĴŝ­Ż°ûħ²³³žŸ Ħ˘£¤üĤĤ§§¨İüŞĞĞĴĴŝ­ŝݰ°ûħ²²³ žŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ûħ²²³ žŸ Ħ˘£¤Ĥ§ŝ¨İİîŞĞĞĴĴ­­ŻŻ°°ħ²²³žŸ Ħ˘£¤ŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²³œ žŸ Ħ˘£¤üĤĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°üħ²²œ œžŸ Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ùݰ°ħħ²œ œžŸ Ħü˘££¤¤ŝĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°ŭħ²œœžŸ Ħ˘£¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­úݰ°ħ²œœ›œžŸ Ħ˘ŝ£¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­ŝݰ°ŝħœœ ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴŝ­üݰ°ħŝ¨İ İŞ ݨ§Ĥ¤£˘¨İ¨§Ĥ¤£˘¨ İ ¨§Ĥ¤£˘¨ §Ĥ¤£˘§¨ §Ĥ¤£˘ §¨§Ĥ¤£˘ŝĦ§§Ĥ¤£˘ŝĦ§§Ĥ¤£˘Ħ§ Ĥ ¤£˘ĦĤ ¤£˘ĦĤ ¤£˘Ħ ¤£˘Ħ¤£˘Ħ¤ £˘Ħ ¤ £ ˘Ħŝ ¤¤ £ ˘Ħ ¤£ ˘ Ħ !£˘ Ħ £˘ Ħ  £˘Ħ (˘Ħ !˘Ħ ˘&Ħ 5Ħ  .ĦÑ Ÿ$ $Ÿ )Ÿ ,Ÿ žŸ žŸ  ŝĦžžŸ  ĦžŸ  Ħ žŸ  Ħ ž Ÿ Ħ ž Ÿ Ħ œž Ÿ Ħœž Ÿ Ħœ ž Ÿ Ħœ ž Ÿ Ħœ žŸ Ħ ›œ žŸ Ħ›œžŸ Ħ› œžŸ Ħ› œžŸ Ħ› œžŸ Ħ› œžŸ Ħ š›œžŸ Ħ š ›œžŸ Ħš ›œžŸ Ħš ›œžŸ Ħš ›œžŸ Ħš ›œžŸ Ħš ›œžŸ Ħš ›œžŸ Ħš ›œžŸ ŝĦšš›œžŸ ŝĦšš™š›œžŸ ŝš™ ™š›œžŸ ™ š›œžŸ ™ š›œžŸ ×ZXXVVUTSRQPNNMLKJIHHFFEDCCBAA@?>=<<;;::9887654321×YXWVUTSRQPONNMKJJIHGFEDDCBBA@@>>=<<;;::988765432Ö1XWVUTTRRQONNMKJJIHHFFEDDCBBA@@>>=<<;;::988765432ÔWVUTTRRQONNMLKJJIHGFEEDCCBBA@?>>=<<;;::99887765432ÖVUUTSRQPONNMKJJIIHFFEDDCCBBA@?>>=<<;;::998876543çVUTSRQQONNMLKJJIHHFFEDDCBBùA@?>>=<<ŝ;::987654ĉ3UTTRRQPONNMKKJJIHGFFEDDCBBòA@@>>==<<;;::9987654TRáQPONNMMKJJIIHGFFEDDCCBBA@@?>==<<;:98765ÚTSRRQOONNMLKJJIIHGFFEDDCCBBAA@@>>==<<;;:9876Ú5TRRQPONNMMKKJJIIHGFFEDDCCBBAA@@?>>==<<;:9876RQONMKJIêHGFFEEDDCCBBAA@@?>>==<<;:98 7RçQPOONNMMKKJJIIHHFFEEDDCCBBA@ú?>>==<<;:987úRQQPONNMKJIHFEDCBA@>=<;:98úRQQOONNMKJIHFEDCBA@ŝ?>>=<;:9ù8QQPOONNMKJIHüGFFEEDCBA@?>=<;:QONMKJIHüGFFEEDCBA@ŝ?>>=<;ü:QQOONMüLKKJJIHŝGFFEDCBA@?>= <ŭQPOONMKJIHüGFFEEDCBA@?>=üŭQPOONMŝLKKJIHGFEDCBA@ŭQPOONMŝLKKJIHŝGFFEDCBAŭQPOONMŝLKKJIHGFEDCBŭQPOONMLKJIHGFE DCQŝPOONMLKJIHGFEDQPONMLKJIHGFQPO NMLKJIH QPO NMLKJIQPO NMLKJQRQPONMLŝQR R S RQPONRSTSRQPORSTUTSRQRŝSTTU VW VUTSRŝSTTUVWXWVUTŝSTTUVWXYZYXWVTUVŝWXXYZ[ \[ZYXŝWTTUVŝWXXYZ[\]^]\[ZYTUVXYZ[\]^ _^]\[ŝTUUVŝWXXYŝZ[[\]^_`a`_^]ö\TUUVVWXXYYüZ[[\\ŝ]^^_`aba`_^UVXY[\ŝ]^^_ŝ`aabcdcba`ú_UUVVXXY[\ŝ]^^_ŝ`aabcdedcbìaUVVWXXYY[[\\]^^__`aabcdef gfedcéUVVXXYYZ[\\]^^__`aabbcddefghgfedîUVVXXYZ[[\]^^__aabbdefghijihgfĉeUVWXXY[[\\^^__aabbcddeefgghŝijjkjihágUVWXYY[\\]^__`abbcddeefgghhiijjklmlkjĉihVVXXYZ[\\^^_`abbcddefgghhjklmnonmlkjVXêY[[\]^__aabcddefgghhijjkúlmmnnoo ponmlkVXY[\\^^_`abbddeegghhijjkklmmnoopqrqponßmlVVXXY[\\^^_aabcdeegghhijjkkmmnoopqrqpoßnVVXXY[\]^__abbddefghhijjklmmnooppŝqrr srŝqppáoUVXXY[\]^_`abcddegghijjkkmmnoppŝqrrs tsráqpUVXXY[\]^_`abcdeeghhjjkkmmnoppŝqrrsŝtuuvutsrŜUVXXY[\]^_`abcdefghhjjklmnooppqrrssŝtuuvutsÛrUVWXY[\]^_`abddefghijkkmmooppqrrsstuuvwxwvuÛtsUVWXY[\]^_`abddegghijkkmnoppqrrsstuuvŝwx xwvuTUWXYZ[]^_`abcdegghjjklmnopprrsuvŝwxxyxŝwvvÛuTUVXXZ[\^^_abcdegghjjklmoopprrsstuuvvŝwxx yxÚwvvTUVWXY[\]^_abcdefghjjklmoopqrrssuuvvŝwxxyzyxÙwTTUWXY[\]^_abcdefghijklmoopqrrssuuvvwxxyŝz{ {zyxÛSTUVXYZ[\^_`abddfghijklmoopqrrstuuvvxxyŝz{ {ŝzyyÚxRTUVWXY[\^^`abddeghijkkmnopqrrstuuvvxxyŝz{{|{ĜzyyRSTUVXYZ\]^_abcdefghjjkmnopqrrstuuvvxxy{ |{zµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžµ´³²ħ°ŝŻ­ĴüĞŞŞİݨ§Ĥ¤£˘Ħ Ÿžüµ´´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ Ÿž´³²ŝħ°°ŝŻ­ĴĞŞİ¨§Ĥ¤£˘Ħ Ÿžŝ´³³²ħ°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿŝž³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ Ÿ³²ŝħ°°Ż­ĴüĞŞŞİݨ§Ĥ¤£˘Ħ ³²ħ°ŝŻ­ĴüĞŞŞİݨ§Ĥ¤£˘Ħ ŝ³²²ŝħ°°Ż­ĴŝĞŞŞİ¨§Ĥ¤£˘ Ħú³²²ħħ°°Ż­ĴĞŞİ¨§Ĥ¤£˘Ħ²ħ°ŝŻ­ĴĞŞİ¨§Ĥ¤£ ˘²ħ°Ż­ĴĞŞİ¨§Ĥ¤£˘ü²ħħ°°Ż­ĴĞŞİ¨§Ĥ ¤£ü²ħħ°°Ż­ĴĞŞİ¨§Ĥ ¤ħ°Ż­ĴĞŞİ¨§Ĥ¤ħ°Ż­ĴĞŞİ¨§Ĥħ°Ż­ĴĞŞİ¨ §Ĥħ°Ż­ĴĞŞİ¨ §ħ°Ż­ĴĞŞİ¨§ħ°Ż­ ĴĞŞ ݨħ°Ż ­ ĴĞŞ İħ °Ż ­ ĴĞ Şİħ °Ż ­ĴĞŞħ°Ż­ĴĞħ°Ż­ Ĵħ°Ż­Ĵħ°Żħ°Żħ²ħ°Żŝ²)²ħ°²³ ²ħ°²-³²ħ² ³´ ³² ³ ´µ ´³ŝ²³³´'µ´³´ µĥ µ´³´µĥ·ĥµ³´µĥ ·¸ ·ĥ³´µĥ·¸·ŝĥ³³´µĥ·¸ı¸·³´µĥ·¸ ı ş ı¸³´µĥ·¸ışıú¸³³´´µµĥ·¸ı!şıŝ³´´µĥ·¸ı şğĵğ şü³´´µµĥ·¸ışğĵğşü³´´µµĥ·¸ışğĵğûş³´´µµĥ·¸ışğ ĵ ½ ĵûğ³´´µµĥ·¸ışğĵ½½ĵü³´´µµĥ·¸ışğĵ½½ĵŭ³´µµĥ·¸ışğĵ½½ŭ³´µµĥ·¸ışğĵ½ż ŭ³´µµĥ·¸ışğĵ½żŭ³´µµĥ·¸ışŝğĵĵ½ żÀ żĝ³´´µµĥĥ··¸ışğĵ½żÀżĝ³´´µµĥĥ··ŝ¸ıışŝğĵĵ½żÀÁÀżĝ³´´µµĥĥ··ŝ¸ıışŝğĵĵ½żÀÁÀżĝ³´´µµĥĥ··ŝ¸ıışŝğĵĵ½żÀÁÀ³ŝ´µµŝĥ··¸ışŝğĵĵŝ½żÀÁÀ³´µŝĥ··¸ışŝğĵĵŝ½żÀ Á Á³´µĥ·¸ışŝğĵĵŝ½żÀÁÂÁ³ö´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁÂÁ÷²³³´´µµĥ··ŝ¸ıışŝğĵĵŝ½żÀÁÂÂÁ²³³´´µµĥĥ··¸¸ıışşğĵŝ½żÀÁ Â²³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵ½żÀÁ¢Ħ Ÿžœ › š˘Ħ Ÿžœ › š˘Ħ Ÿžœ › šŝ˘ĦĦ Ÿž œ › šĦ Ÿž œ ›šĦ Ÿž œ›šĦ Ÿž œ›šĦ Ÿž œ›Ħ Ÿž  œ›Ħ Ÿž  œ›ŝĦ   Ÿž œ ›ŝĦ   Ÿž œ ›  Ÿž œ›  Ÿž œ  Ÿžœ  Ÿžœ  Ÿ ž œ Ÿ žœ Ÿ ž Ÿž  Ÿž  Ÿž  Ÿž Ÿž  Ÿž "Ÿ% Ÿ/ Ÿ8 Ÿ Ħ ,Ħ 7Ħ Ħ˘%Ħ%˘Ħ0˘ Ħ5˘Ħ˘£ ˘Ħ ˘'£˘Ħ ˘£¤£Ħ ˘ £¤£Ħ˘ £%¤£Ħ˘ £*¤Ħ˘£ ¤ ¤Ħ˘£ ¤¤Ħ˘£¤%ü¤ĦĦ˘˘£¤ Ĥ Ħ˘£¤ĤŝĦ˘˘£¤Ĥ§ĤŝĦ˘˘£¤Ĥ§ĤŝĦ˘˘£¤Ĥ§ĤŝĦ˘˘£¤Ĥ§¨§ŝĦ˘˘£¤Ĥ §¨§ŝĦ˘˘£¤Ĥ §¨§Ħ˘£¤Ĥ§ ¨İ¨§Ħ˘£¤Ĥ§¨İ¨Ħ˘£¤Ĥ§¨İ¨Ħ˘£¤Ĥ§¨İ Şİ¨Ħ˘£¤Ĥ§¨İŞİĦ˘£¤Ĥ§¨İŞİĦ˘£¤Ĥ§¨İŞŝİĦĦ˘£¤Ĥ§¨İŞĦ˘£¤Ĥ§¨İŞĦ˘£¤Ĥ§¨İŞŝ ĦĦ˘£¤Ĥ§¨İŞ12345678ç9::;;<<=>?@ABBCDDEFGHIJJ112345678ĉ9::;;<<=>?@ABBCDDEFGHIJJK2212345678ċ9::;;<<=>>@AABCCDEFFHHIJKL223456789::;;<<=>>@@ABBCDDEFGHIJJKM32 23456789:;<ê=>>@@ABBCDDEFGHIJJKLM3 3456789:;<é=>>@@ABBCDDEFFHHIJJKMN445678ŝ9::ŝ;<<è=>>?@ABBCCDDEFGHIJJKLMN4 456789:ŝ;<<ç=>>?@AABBCDDEFFHHIJJKMNN5 56789:;<=>é?@AABBCDDEEFHHIJJKLMNN6 6789:;<=>è?@AABBCCDDEFGHHIJJKLMNN7789:;<=>@ABCDñEFFHHIIJJKMNNO7 789:;<=>@ABCDEòFGHHIJJKKMNNO889:;<=>ú?@@AABBŝCDDEFFGHIIJJKLMNNO8 89:;<=>ú?@@AABBCDEFHIJùKLMNNO::;<=>ŝ?@@ABCDEFûGHHIJJùKLMNNO: :;<=>ŝ?@@ABCDEFHIJüKLMNN<=>ŝ?@@ABCDEFúGHHIIJJùKLMMNN< <=>ŝ?@@ABCDEFúGHHIIJJKMN>?@ABCDEFHIJKMüN@@? ?@ABCDEFŝGHHIJKûLMMNAA@ABCDEFŝGHHIJKüLMMBBCDEFHIJKŭLMCCBCDEFHIJKŝLDDCDEFHIJKŝFEEDEFŝGHHIJKG FEFŝGHHIJIHG"FHIJI HGFŝGHHIKJI HGFŝGHHIMLKJI HG FGHNMLKJI HŝGFFGŝHPPONMLKJIHŝGFFRQPONMLKJIHFTSRQPONMLKJIHŝGFF EUTSRQPONMLKJIHŝGFFEDŝWVVUTSRQPONMŝLKKJIHŝGFFEDXWVUTöSRRQQPPOONNMŝLKKJIHŝGFFEDCZYXŝWVVUTŝSRRQüPOONNMüLKKJJIHŝGFFEDC\[ZYXüWVVUUTŝSRRQüPOONNMüLKKJJIHŝGFFEDCBâ^]]\\[[ZZYYXXWWVVUUTTSRRQQPOONNMüLKKJJIHŝGFFEDCBŝ_^^÷]\\[[ZZYXXñWVVUUTTSRRQQOONNMKJIHFEDCBAŭa`__^]\û[ZZYXXòWVUUTTSRRQQPONN÷MLKKJJIIHHFEDCBA÷@bbaa``_^^]\\[ZZYXXWVVUUTTRRQQPONNMMLKJJIHFEDCBA@Îdccbbaa`__^^]\\[ZYYXXWVUUTTSRQQOONNMMKKJJIIHHFFEEDDCBA@ŭ?eddÒcbbaa`__^^]\[[ZYXXWVUUTTRRQQOONNMLKJJIIHHFFEEDDCBA@ĝ?>>ffeeddÑcbaa`__^^\\[ZYYXWVUUTTRRQPONNMMKKJJIHHFFEEDDCCBBA@ŝ?>>ùhggffeddcbaa`_^^]\[[YYXWVUUTSRRQPONNMLKJJIIHGFEEDDCCBBAA@@?>>==jihhggfeddcbba`__^]\[[ZYXWVUUTSRQPONNMLKJJIIHGFEEDDCCBBAA@@>>=jŽihhggfeddcbaa`_^^\\[ZYXWVUUTSRQPONNMKKJJIHGFFEDDCCBBA@@?>>==>==<>==<>=<<;poonmmlkjjihggeedcba`_^]\[ZYXWVUTSRQPONMLKJJIHGFEDDCBBAA@?>==<<;qppoonmlkkjihhgfedcba`_^]\[ZYXVVUTSRQONNMKJJIHGFEEDCBBAA@>>==<<;rrqppoonmlkjjhhgfedcba`_^]\[YXXVUTTRQPONMLKJIIHFFEDCCBAA@>>=<<;;srr€ŭqpoonmlkjjhhgfedcba`_^\[[YXWVUTSRQONNMKJJIHFFEDDCBAA@>>=<<;;tssrrqpponmlkjjhhgfedcba_^^\[ZYXVUUTRQPONMLKJIHGFEDDCBBA@?>=<<;;uutssrrppoomlkjjhhgfedbba_^]\[ZXWVUTSRQONNLKJJIHFEDDCBBA@?>=<<;;vuutssrrqpoomlkjjhhgeddba`_^]\[YXWVUTRQPONMLJJIHFFEDCBBA@?>=<<;;vvu€½tsrrqpoomlkjjhggedcba`_^\[ZYXVUTSRQONNLKJIHGFEDDCBA@?>==<;;xwvvuutssrqpoomlkjihgfedcba_^]\[YXWVUTRRPONMLJJIHFEEDCBBA@>>=<<;xxwvvuutssrqpoomlkjihgfedbb`_^]\ZYXVUUSRQONNLKJIHGFEDCBBA@?>=<<;yxxÁwvvutssrqpoomlkjihgfedba`_^\[ZYWVUTSRPONMLJJIHFEDDCBA@?>=<<;yyxxvÈutssrqponmlkjhhgedcba`^]\[YXWVUTRQPNNLKJIHGFEDCBBA@>>=<;žŸ Ħ˘ŝ£¤¤Ĥ§¨İŞŝĞĴĴŝ­žŸ Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ žŸ Ħ˘£¤ŝĤĤ§¨İüŞĞĞĴĴŝ­ŝŻžžŸ Ħ˘ŝ£¤¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝŻž žŸ Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŭݰŸŸ Ħ˘£¤ŝĤĤ§¨İŞĞĴŝ­ûݰ  ŸŸ  Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­üݰ°   Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­üݰ°ĦĦ˘£¤Ĥ§¨İŞĞĴ­Ż°Ħ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ° Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°˘£ ¤Ĥ§¨İŞĞĴŝ­Ż° £ ¤Ĥ§¨İŞĞĴ­Ż°¤Ĥ§¨İŞĞĴ­Ż°¤Ĥ§¨İŞĞĴ­Ż°ŝ¤¤Ĥ§¨İŞĞĴ­Ż°Ĥ§¨İŞĞĴ­Ż° Ĥ §¨İŞĞĴ­Ż°§¨İŞĞĴ­Ż°¨ İŞĞĴ­Ż°ŝݨ¨ İŞĞĴ­Żŝ°İİŞĞĴ­ŻŞ İ ŞĞ Ĵ­ŻĞŞĞ Ĵ­ŝŻĴĴĞĴ­3Ĵ­­.Ĵ­ ­&Ĵ­­ Ĵ­°Ż­Ĵ­°Ż­Ĵħ °Ż ­Ĵ²ħ °Ż ­Ĵ³²ħ °Ż ­Ĵ³²ħ°Ż­ĴĞ´³²ħ°Ż­ ĴĞŞµ´³²ħ°Ż­ĴĞŞµ´³²ħ°Ż­ĴĞŞĥµ´³²ħ°Ż­ĴĞŞİ·ĥµ´³²ħ°Ż­ĴĞŞİ·ĥµ´³²ħ°Ż­ĴĞŞİ¸·ĥµ´³²ħ°Ż­ĴĞŞİŝ¨ıı¸·ĥµ´³²ħ°Ż­ĴĞŞİ¨ı¸·ĥµ´³²ħ°Ż­ĴĞŞİ¨ŝ§şşı¸·ĥµ´³²ħ°Ż­ĴĞŞİ¨§şı¸·ĥµ´³²ħ°ŝŻŝ­ĴĴŝĞŞŞİ¨§ŝğşşı¸·ĥµ´³²ŝħ°°Żŝ­ĴĴŝĞŞŞİ¨§ŝĵğğşı¸·ĥµ´³²ħ°ŝŻ­ĴŝĞŞŞİ¨§ĵğşı¸·ĥµ´³²ħ°Ż­ĴüĞŞŞİݨ§ŝĤĵĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ½ĵğşıŝ¸··ĥµŝ´³³²ħ°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ½ĵğşı¸·ŝĥµµ´³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨ§Ĥ½ĵğşıŝ¸··ŝĥµµ´³ü²ħħ°°ŝŻ­ĴüĞŞŞİݨ§Ĥŝ½ĵğşıŝ¸··ĥµŝ´³³²ŝħ°°Żŝ­ĴĴĞŝŞİݨ§Ĥüżż½ĵğşıŝ¸··ĥµŝ´³³ü²ħħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥŝżż½ĵğşı¸·ŝĥµµ´³²ŝħ°°ŝŻ­ĴĝĞŞŞİݨ¨§§Ĥŝżż½ĵğşı¸·ŝĥµµŝ´³³ü²ħħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§ĤŝÀżż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§ĤÀż½ĵğşıŝ¸··ŝĥµµ´³²öħ°°ŻŻ­­ĴĴŭĞŞİݨ§ûĤÁÀÀż½ĵğşıŝ¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§ĤŝÁÁÀż½ĵŝğşşı¸·ĥµ´³²÷ħ°°ŻŻ­ĴĴüĞŞŞİİŝ¨§§ĤŝÁÁÀż½ĵŝğşşıŝ¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§ĤŝÁÁÀżŝ½ĵĵŝğşşıŝ¸··ŝĥµµò´³³²²ħ°°ŻŻ­ĴĴĝĞŞŞİݨ¨§§üĤÂÁÁÀżŝ½ĵĵğşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§Ĥš ›œžŸš ›œžŸš ›œžŸš › œžŸš › œžŸš› œžŸŝ š š› œžŸŝ ›› œžŸ › œžŸ › œžŸ › œ žŸ ›œ žŸ  ›œ žŸ  œ žŸ œ žŸ œ ž Ÿ œž Ÿ œ ž Ÿ ' ž Ÿŝ $ ž Ÿŝ # ž Ÿ!žŸžžŸ0žŸ0žŸ0žŸ%ž#Ÿž,Ÿž Ÿŝ Ÿ#ŸžŸ "ŸžŸ  Ÿž ŸžĦ Ÿž Ħ  Ÿž˘ Ħ  Ÿž˘ Ħ  Ÿž ˘Ħ  Ÿžŝ£˘ ˘Ħ   Ÿ ž£ ˘Ħ  Ÿ ž£˘Ħ  Ÿ žŝ¤££˘Ħ  Ÿž ¤£˘Ħ  Ÿž ¤£˘Ħ  Ÿž ¤£˘Ħ Ÿž ¤£˘Ħ Ÿž ¤£˘Ħ Ÿž ŝœ¤£˘Ħ Ÿž œŝĤ¤£˘Ħ ŸžœĤ¤£˘Ħ ŸžœĤ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœŝ¨§§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœĜLMNOPQRTTUVXYZ[\^^_abbdeeghijjkmmopprr/ĜMNNOQRSTUVWXY[\\^_`abcdefghijkkmnopprr/ĜMNOPQRTTUVXXY[\]^_`abddegghijkkmnopprr/NÚOQRSTUVWXYZ[\^^_abbddegghjjkkmnoppqr/ĜNOPQRTTUVWXY[\\^^_abbddegghijkkmnoopqr/ĜNOQRRTUUVXXY[\]^^_abcddegghijkkmmooppr/OÚQRSTUVVXXY[\]^^_abbddefghijjklmnoppq/ĜOPQRSTUVWXYY[\]^^_abbddefghhjjkkmmoopp/ĜOQQRTTUVWXYY[\\^^_aabcdeegghijjklmmoop.ĜOQRRTTUVWXXY[\\^^_`abbddefghhijkklmmoo.ĜOQRRTTUVWXXY[[\]^__aabcdeefghhijkklmmn.ĜOQRRTTUVVXXYZ[\\^^_`abbcdeegghhijjkklm-ĜOQRRTTUUVWXYY[[\]^__`abbddeefghhijjkkl-ĜOQQRSTUUVVXXYZ[\\]^__aabbcdeefgghhijjk,ŜOQQRRTTUUVWXYYZ[\\]^__`abbcddefgghhüij,ĉOPQRRSTUUVVWXYYZ[\\]^__`abbdeüfgghhŝ+OQRTUVXYèZ[\\]^^_`aabbcddeeffgh+OßPQQRSTTUUVVWXYYZ[[\\^^__`aabbcddeeŭf+àNOOPQRRSTTUUVVWXXYZZ[\\]^^__`aabbúcdde*NOQRTUVXYòZ[[\\]^^__``abbcŝ)NOëPQQRRSTTUUVVWXXYYZ[[\\ô]^^__``abb)ŝMNNO÷PQQRRSTTUUV÷WXXYYZZ[\\]^_`ŝ(MNOùPQQRRSTTUV÷WXXYYZZ[\\]^ŭ_'ŝLMMNOPQRúSTTUUVVWXYZŝ[\\ŭ]'KüLMMNNOüPQQRRŝSTTUVWXYZ[ŭ\&KŝLMMNOPQRSTUVŝWXXYŭZ%JKLMNOPQRSTUVWXŝ$JKLMNOPQRSTUVŝ$IJKLMNOPQRSTŭU#HIJKLMNOPQRSŝ#HIJKLMNOPQŭR"FGHIJKLMNOŭP! FGHIJKLMNŝ EFGHIJKLŭM  DEFGHIJŭKDEFGHIŭJCDEFGHŝBCDEFŝB A BCDŭEA@ABCDŝA@?>?@ABŝ@?>?@AŭBŭ@?>>= <=>?@ŝ>=<=>ŝŝ>==<;:;<=ŝ=<;:;<ŝŝ=<<;:9:;ŝ<;:989:ŝ<;:98789ŝü<;;::9878ŝ;:98 7ŝ67 7ŝŝ;::98767ŝú;::99887656ŝ:ŝ988765456ŝ:9876545ŝ:ŝ988765434ŝ:ü9887765434ŝ:ü988776543 23ŝ:ü9887765432ŝ:ü9887765432 12ŝ:ü98877654321ŝ:ü988776ŝ544321ŝ:ü988776ŝ544321ŝú;:998776ŝ544321ŝݰŭħ²³³ŝ´µµĥ·¸ışŝğĵĵ½ŭżOŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½ŭżO°üħ²²³³ŝ´µµĥ·¸ışŝğĵĵŝ½ŭżO°ĝħ²²³³´´µµĥ·¸ışŝğĵĵŝ½ŭżO°ħŝ²³³´µĥ·¸ışŝğĵĵ½ŭżO°üħ²²³³´µĥ·¸ışŝğĵĵ½ŝO°ĝħ²²³³´´µµĥ·¸ışŝğĵĵ½ŝOö°ħħ²²³³´´µµĥ·¸ışğĵ½ŝOû°ħ²²³³´µĥ·¸ışŝğĵĵ½ŝOû°ħ²²³³´µĥ·¸ışğĵ½ŝOû°ħ²²³³´µĥ·¸ışğĵ½ŭOû°ħ²²³³´µĥ·¸ışğĵ½ŝNû°ħ²²³³´µĥ·¸ışğĵŝNú°ħħ²²³³´µĥ·¸ışğĵŝNú°ħħ²²³³´µĥ·¸ışğĵŝNü°ħħ²²³´µĥ·¸ışğŭĵN°ħ²³´µĥ·¸ışŭğN°ħ²³´µĥ·¸ışŝM°ħ²³´µĥ·¸ışŝM°ħ²³´µĥ·¸ıŝM°ħ²³´µĥ·¸ıŝM°ħ²³´µĥ·¸ŝLŝݰ°ħ²³´µĥ·ŝLݰħ²³´µĥ·ŝLŝŻŻ°ħ²³´µĥŝLݰħ²³´µŝKݰħ²³´µŝKݰħ²³´ŝKŝ­ Ż °ħ²³ŝJ­ Ż °ħ²ŭ³JĴ­ ݰħŭ²J Ĵ­ ݰŝIĴ­ ݰŝIĴ­ ŻŝI ĞĴ­ŝH ŞĞ Ĵ­ŝHŞĞ Ĵŭ­HİŞĞĴŝGİŞĞŭĴGݨ İŞŝGŝݨ¨§ ¨İŝG¨§¨İŝFŝ¨§ §Ĥ §¨ŝF§Ĥ§ŝE§ĤĤ§ŝE§Ĥ¤ĤŝEŝ§ĤĤ¤ŝEĤ¤£ ¤ŝDĤ¤£˘£¤ŝDüĤ¤¤£˘£ŭ¤D¤£˘ Ħ˘ŭ£D¤£˘Ħ˘ŝCŝ¤¤£˘ĦŝCŝ¤¤£˘Ħ  ĦŝC¤£˘Ħ ŭĦC¤£˘Ħ  Ÿ ŝB¤£˘Ħ ŸžŸŝB¤£˘Ħ ŸžŭŸB¤ŝ£˘˘Ħ ŸžžŝB¤ŝ£˘˘Ħ Ÿž ŭžB¤ŝ£˘˘Ħ ŸžŝA¤ŝ£˘˘Ħ ŸžŝAŝ¤¤£˘Ħ ŸžŝAŝ¤¤£˘Ħ Ÿž œŝAŸ Ħ˘£¤Ĥ§ŝFŝŸ  Ħ˘£¤Ĥ§ŝFŝŸ  Ħ˘£¤Ĥ§ŝF Ħ˘£¤Ĥ§ŝE Ħ˘£¤Ĥ§ŝE Ħ˘£¤Ĥ§ŝE Ħ˘£¤Ĥ§ŝE Ħ˘£¤Ĥ§ŝE Ħ˘£¤Ĥ§ŝE Ħ˘£¤Ĥ§ŝE Ħ˘£¤Ĥ§ŝE Ħ˘£¤ĤŝE Ħ˘£¤ĤŝE Ħ˘£¤ĤŝE Ħ˘£¤ŝE Ħ˘£¤ŝD Ħ˘£¤ŝD Ħ˘£¤ŝD Ħ˘£¤ŝD Ħ˘£¤ŝD Ħ˘£¤ŝDŝŸ  Ħ ˘£ŭ¤DŸ  Ħ ˘£ŝDŸ  Ħ ˘£ŝDŸ  Ħ ˘ŝCŸ   Ħ˘ŝC Ÿ   Ħ˘ŝC Ÿ   Ħŭ˘CŸ  ĦŝCŸ  ĦŝCŸ  ŝBžŸ ŝB žŸ ŝBžŸŝBž ŸŝBžŸŝBž žŸŝB žŝBžŝB"žŝB%ŝA%ŝAœ ŝAœŝA#œŝA%œŝA%œŝAœŝ›œ œŝA œ›œŝA œ›ŭœAœ›ŝ@œ›ŝ@œ›ŝ@œ›ŝ@œ› š›ŝ@œ ›šŭ›@œ ›šŝ@œ ›šŝ@œ ›šŝ@œ ›šŝ@œ›šŝ@œ›šŝ@œ›šŝ@œ›šŝ@%˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙€€€€$ŝ éT[ZYWVUTRQPONMKJIHGFED#ŝ éU\[YXVVUTRQONMLKJIHFED#ŝ éV\\ZYXVUTSRPONMLJJIHFE#ŝ éW^\[ZXWVUTRQPONMKJIHGF#ŝ éW^]\[YXWVUTRQPNNLKJIHF#ŝ éX_^]\ZYXVUUSRQONMLKJIH#ŝ éY`_^\[ZYXVUTSRPONMLKJI#ŝ éZa`_^\[ZYXVUTSRPONMLKJ#ŝ é[ba`_^\[ZYXVUTRRPONMLJ#ŝ é\cba`_^\[ZYXVUTRQPONML#ŝ é]dcba`_^\[ZYWVUTRQPONM#ŝ é^edcba`_^\[ZYWVUTRQPON#ŝ é_fedcba`_^\[ZYXVUTSQPO#ŝ é_hfedcba`_^\[ZYXVUTSRP#ŝ éahhfeddba`_^\[ZYXVUTSR#ŝ ébjhhgfedba`_^\[ZYXVUUS#ŝ ébkjihgfedba`_^\[ZYXVVU#ŝ édlkjihgfedbb`_^]\[YXWV#ŝ éemlkjihgfedcba_^]\[ZXW#ŝ éfonlkjjhgfedcba`_^\[ZY#ŝ éfponmkkjhhgedcba`_^\[Z#ŝ éhpponmlkjihgfedba`_^\[#ŝéirqponmlkjihgfedba`_^]#ŝéisrqpponmkjjhgfedcba_^#ŝéktsrrpponmlkjhhfedcba`#ŝékutsrrqponmlkjihgfedba#ŝélvutssrqpponlkjihgfedb#ŝémvvuutsrrpponmkjjhgfed#ŝénxwvvutsrrqponmlkjhgfe#ŝénxxwvvutssrqponmlkjhhf#ŝŭoyxxvuòtsrqppnmlkjih#ŝŝpyyxïwvvutsrrpponlkji#ŝéq{zyyxxwvvutssrpponmkj#ŝùq{{zyyxxvôutssrqponmk#ŝŭq|{{îzyyxxvvuutsrqponm#ŝüq||{{ïzyyxxwvuutsrqpon#ŝŝr||{zyyxxwvvutsrqpo#ŝŭs}||{ñzyyxxwvvutsrrp#ŝüs~~||{ŝzyyöxwvvutsrr#ŝŝs~~|{ôzyyxwvvutsr#ŝŝs~~ŝ}||{ġzyyxwvvuts#ŝŝs~~ŝ}||{özyyxwvvut#ŝŝs~~ŝ}||{yúxwvvu#ŝŝs~~|{÷zyyxxwvv#ŝŝs~~|{ĝzyyxxwv#ŝŝs~~|{ùzyyxxv#ŝŝs~~ŝ}||{úzyyxx#ŝŝs~~|{ûzyyx#ŝŝs~~ŝ}||{y$ŝŝs~ ~|{üzyy#ŝŝr~ ~ŝ}||{ŭzy#ŝüq|}~~ŝ}||{ŝy#ŝŝq||}~ŝ}||{ŝz#ŝŝq||}~ŝ}||{$ŝŭq{||{$ŝŝp{{|{$ŝŭoz{{|{$ŝüoyz{{ |{$ŝŝnyyŝz{{ |ŝ{#ŝ ùnxxyyz{{ |ŝ{#ŝ ŝlxxyŝz{{|ŝ{#ŝ úlvwxxyyŝz{{|{$ŝ ûkvvwxxyŝz{ {$ŝ ŭjuvvxyŝz{{$ŝñ§ĥµµ´´³³²²ħ°°Żú­ĴĴĞĞ#ŝù¨ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŝĞ#ŝü¨·ĥµµò´³³²²ħ°°ŻŻ­ĴĴ$ŝ嘆·ĥµµ´´³³²ħħ°°Żü­ĴĴ#ŝò¨··ĥĥµµ´´³³²ħ°°ŝŻŭ­Ĵ#ŝöݸ··ĥĥµµ´³³ŭ²ħ°°úŻ­­#ŝŭݸ··ŝĥµµŝ´³³ŭ²ħ°°ûŻ­#ŝüİı¸··ŝĥµµó´³³²²ħ°°ŻŻ#ŝûİıı¸··ŝĥµµô´³³²²ħ°°ŻŻ#ŝŝŞııŝ¸··ŝĥµµġ´³³²²ħ°°ŻŻ#ŝŭŞşııŝ¸··ŝĥµµö´³³²²ħ°°Ż#ŝüŞşşııŝ¸··ŝĥµµ÷´³³²²ħ°°#ŝŝĞşşıŝ¸··ŝĥµµĝ´³³²²ħ°#ŝŭĞğşşıŝ¸··ŝĥµµŝ´³³ŭ²ħ#ŝüĴğğşşıŝ¸··ŝĥµµŝ´³³ŝ²#ŝûĴĵğğşşıŝ¸··ŝĥµµŝ´³³$ŝŝĴĵĵŝğşşıŝ¸··ŝĥµµü´³³#ŝŝ­ĵĵŝğşşı¸·ĥµ´$ŝü½½ĵĵŝğşşı¸·ĥµŝ´#ŝû½½ĵĵğşıŝ¸··üĥµµ#ŝú½½ĵĵğşıŝ¸··ŭĥµ#ŝŝŻŝ½ĵĵŝğşşıŝ¸··ŝĥ#ŝŭŻż½ĵŝğşşı¸·$ŝüŻżż½ĵğşı¸ŝ·#ŝŝŻżżŝ½ĵĵğşıŝ¸#ŝŭ°Àżżŝ½ĵĵŝğşşı$ŝü°ÀÀżż½ĵŝğşşı$ŝŭħÁÀÀż½ĵğşŝı#ŝŝħÁÁÀżŝ½ĵĵğş$ŝŝħÁÁÀżŝ½ĵĵŭğş#ŝŝħÁÁÀż½ĵŝğ#ŝü²ÂÂÁÁÀż½ĵ$ŝŝ²ÂÂÁÀż½ĵ$ŝŭ³ÂÂÁÀżŭ½ĵ#ŝü³ÂÂÁÀżŝ½#ŝŝ³ÂÁÀż$ŝŝ³ÂÁÀż$ŝŝ³ÂÁÀżŝ#ŝŝ³ÂÁÀż$ŝŝ³ÂÁÀż$ŝŝ³ÂÁÀż$ŝŭ³ÄÂÁÀŝż#ŝü³ÄÄÂÁÀ$ŝŝ³ÄÄÂÁŝÀ#ŝŝ³ÄÄÂÁ$ŝŝ³ÄÄ ÂÁ$ŝŝ³ÄÄ ÂÁ$ŝŭ³ÄÄ ÂÁ$ŝŝ³ÂÁ$ŝŝ³ÂŝÁ#ŝŝ³Â$ŝŝ³Â$ŝŝ³Â$ŝŝ³Â$ŝŝ²ŝÂ#ŝŭ²Â$ŝŝ²ÂÂ$ŝŝħÂÂ$ŝüħÁÁÂÂ$ŝŝħÁÁ $ŝŝħÁÁ $ŝŝ°ÁÁ $ŝŭ°ÀÁÁÂ$ŝüŻÀÀÁÁÂ$ŝŝ•˘˘Ħ Ÿž$ŝŭ•£˘˘Ħ Ÿž$ŝŭ•£˘˘Ħ Ÿž$ŝü•££˘˘Ħ Ÿŝž#ŝŝ•££˘Ħ Ÿŝž#ŝŝ–££˘Ħ Ÿ$ŝŝ–££˘Ħ Ÿ$ŝŭ–¤££˘Ħ Ÿ$ŝü–¤¤££˘Ħ Ÿ$ŝŝ–¤¤£˘Ħ Ÿ$ŝŝ–¤¤£˘Ħ ŝŸ#ŝŝ—¤¤£˘Ħ $ŝŭ—¤¤£˘Ħ $ŝü—¤¤£˘Ħ $ŝŝ—¤£˘Ħŝ #ŝŝ˜¤£˘Ħ$ŝŭ˜Ĥ¤£˘Ħ$ŝü˜ĤĤ¤£˘ŝĦ#ŝŝ™ĤĤ¤£˘$ŝú™§§ĤĤ¤£˘$ŝŝ™§§Ĥ¤£˘$ŝŝ™§§Ĥ¤£ŝ˘#ŝŝ™§§Ĥ¤£$ŝŭš¨§§Ĥ¤£$ŝüš¨¨§§Ĥ¤ŝ£#ŝŝš¨¨§Ĥ¤$ŝŭ›İ¨¨§Ĥ¤$ŝŝ›İݨ§Ĥ¤$ŝŝœİݨ§Ĥŝ¤#ŝüœŞŞİݨ§Ĥ$ŝŝœŞŞİ¨§Ĥ$ŝŝœŞŞİ¨§Ĥ$ŝŝœŞŞİ¨§Ĥŝ#ŝŝœŞŞİ¨§Ĥ$ŝŝœŞŞİ¨§ŝĤ#ŝŝœŞŞİ¨§$ŝŭĞŞŞİ¨§$ŝüĞĞŞŞİ¨§$ŝŝĞĞŞİ¨§$ŝŝĞĞŞİ¨ŝ§#ŝŝĞĞŞİ¨$ŝŝĞĞŞİ¨$ŝŝĞĞŞİŝ¨#ŝŝĞĞŞİ$ŝŝĞĞŞİ$ŝŝĞĞ Şŝİ#ŝŝĞ Ğ Ş$ŝŝĞ ĞŞ$ŝŝĞ ĞŞ$ŝŝĞ ĞŞ$ŝŝĞ ĞŞ$ŝŝœĞ ĞŞ$ŝŭœŞĞ ĞŞ$ŝŝœŞŞ ĞŞ$ŝŝœŞŞĞŞ$ŝŝœŞŞĞŞ$ŝŝœŞŞ$ŝŝœŞŞ$ŝŝœŞŞ$ŝŝ›ŞŞ$ŝŭ›İŞŞ$ŝü›İİŞŞ$ŝŝšİİŞ$ŝŭš¨İİŞ$ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝ§˙˙:ŝĤ˙˙:ŝ˙˙:ŝ˙˙:ŝ˙˙:ŝ˙˙:ŝ˙˙:ŝ˙˙:ŝ˙˙:ŝ˙˙:ŝ˙˙:ŝ˙˙:ŝ¤˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ˘˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ£˙˙:ŝ¤˙˙:ŝ˙˙ñCBAA@>=<<;::98776543210/01ï2DCBA@?>=<;;:9987765ü4332210/01î2DCCBA@>>=<;::988776ú544332210/01îEDCBBA@>==<;::98877ö655443322110/01íFEDCBAA@>=<<;::98877ö655443322110 /01íFEEDCBA@?>=<<;::9877ö655443322110 /01ìHFEDDCBA@?>=<<;:99877ĝ65544332210 /01ëIHFEDDCBA@?>=<<;:99877ĝ65544332210 /01êJIHFEDDCBA@?>=<<;:99877ĝ65544332210/01JëIHFEDDCBA@?>=<<;:99877ĝ65544332210/01çLJJIHFEDDCBA@?>=<<;::988776ü544332101ĉMLJJIHFEDDCBA@?>=<<;::9887765432101ċNMLKJIHFEEDCBAA?>=<<;::9887765432101ONMLKJIHFEEDCBAA@>==<;::988776543210QONMLKJIHFFEDCBAA@>==<;::988776543210âRQONMLKJIHGFEDCBBA@>==<;;:99877654321 0áTRQPNMLKJIHGFEDCBBA@>>=<;;:99877ú655443321 0àUTRQPONMKJIHGFEDCCBA@?>=<;;:998776ŝ544321 0ŜVUTRQPONMKJIIHFEDCCBA@?>=<<;:998877654321 0ŬWVUTRQPONMLJJIHFEDDCBA@?>=<<;::988776543210ÜYXVUTSQPONMLKJIHFEDDCBA@?>=<<;::988776543210ÛZYXVUTSRQONMLKJIHFEEDCBAA@>==<;::988776543210Ú[ZYXVUUSRQPNMLKJIHFFEDCBAA@>==<;::988776543210Ù]\[YXWVUTRQPNMLKJIHGFEDCBBA@>==<;::988776543210Ĝ_]\[ZXWVUTRQPONMKJIHGFEDCBBA@>==<;::988776543210×`_^\[ZYWVUTRQPONMKJIIGFEDCBBA@>==<;;:988776543210Öa`_^\[ZYXVUTRQPONMKJIIGFEDCCBA@>>=<;;:988776543210Ġba`_^\[ZYXVUTSQPONMLJJIGFEDCCBA@>>=<;;:9887765ŝ433210Ôdcba_^][ZYXVUTSRPONMLJJIHFEDCCBA@>>=<;;:988776ú544332210Óedcba_^]\[YXVUUSRQONMLJJIHFEDCCBA@>>=<;::988776ú544332210Ògfdcba`^]\[YXVUUSRQONMLKJIHFEDCCBA@>>=<;::98877ö655443322110hgfedba`_]\[YXVVUSRQONMLKJIHFEDCCBA@>==<;::98877ö65544332211ihgfedba`_]\[ZXVVUTRQONMLKJIHFEDCCBA@>==<;::98877ö65544332211jÒhgfedba`_^\[ZXWVUTRQONMLKJIHFEDCCBA@>==<;::9877654321Ïlkjhgfedba`_^\[ZXWVUTRQONMLKJIHFEDCBBA@>==<;::9877654ŝ3221Îmlkjhgfedba`_^\[ZXWVUTRQONMLJJIHFEDCBBA@>=<<;:9987765ü433221Ínmlkjhgfedba`_^\[ZXWVUTRQONMLJJIGFEDCBBA@>=<<;:998776544332211onmlkjhgfedba`_^\[ZXVVUSRQONMLJJIGFEDCBAA@>=<<;:99877654433221ponmlkjhgfedba`_^\[ZXVVUSRQONMLJIIGFEDCBAA?>=<<;:9987765443322rponmlkjhgfedba`_^\[YXVVUSRPONMLJIHGFEDCBAA?>=<;;:98877Á65544332rrponmlkjhgfedba`_^\[YXVUUSRPONMKJIHGFEDCBA@?>=<;;:98877Á6554433srrponmlkjhgfedba`_]\[YXVUTSRPONMKJIHGFEDCBA@?>=<;;:98877Á655443tsrqponmlkjhgfedba`_]\[YXVUTSQPONMKJIHFFEDCBA@?>=<;;:98877Á65544utsrqponmkkjhgfedba`^]\ZYXVUTSQPONMKJIHFFEDCBA@?>=<;;:98877Á6554uutsrqponmkjihgfedba`^]\ZYXVUTRQPONLKJIHFEEDCBA@?>=<;;:98877Á655vuutsrqponmkjihgfecba_^]\ZYXVUTRQPONLKJIHFEEDCBA@?>=<;;:98877Á65vvuussrpponlkjihgfdcba_^\[ZYXVUTRQPONLKJIHFEEDCBA@?>=<;;:98877Á6xvvutssrpponlkjihgedcb`_^\[ZYXVUTRQPONLKJIHFEEDCBA@?>=<;;:98877xv€˙utsrrppomlkjhhfedcb`_^\[ZYXVUTRQPOMLKJIHFEEDCBA@?>=<;;:98877xxwvvutsrrppomlkjhhfedbb`_^\[ZYWVUTRQPOMLKJIHFEEDCBA@?>=<;;:9987yxxvvuutsrqponmlkjhhfedbb`_^\[ZYWVUTRQPOMLKJIHFEEDCBA@?>=<<;:998yyxxvvuutsrqponmlkjhgfedba`_^\[ZYWVUTRQPOMLKJIHFFEDCBAA?>=<<;:99yyxxvus‰rqponmkkjhgfedba`_^\[ZYWVUTRQPOMLKJIHGFEDCBAA@>=<<;::zyyxxwvvutssrpponmkjjhgfedba`_^\[ZYWVUTRQPONLKJIHGFEDCBBA@>==<;:{yyxwvvutsrrpponlkjjhgfedba`_^\[ZYWVUTRQPONMKJIHGFEDCBBA@>>=<;{zyyxvuĊtsrrpponlkjihgfedba`_^\[ZYWVUTRQPONMKJIIGFEDCCBA@?>=<{{zyyxxvuËtsrrpponlkjihgfedba`_^\[ZYXVUTRQPONMLJJIHFEDDCBA@?>={{yxÇwvvuutsrrpponlkjihgfedba`_^\[ZYXVUTSQPONMLJJIHFEDDCBA@?>{{ŝzyyxÈwvvuussrrpponlkjihgfedba`_^\[ZYXVUTSRQONMLKJIHFEEDCBAA@{{yxvÌutssrqpponlkjihgfedba`_^\[ZYXVUUSRQONMLKJIHGFEDCBBA{{ŝzyyxvÍutssrqpponlkjihgfedbb`_^][ZYXVVUTRQPNMLKJIHGFEDCCB{{ŝzyyxvÎutssrqpponlkjihgfedbb`_^]\[YXWVUTRQPONMKJIIGFEDDC{{yxvutssrqpoonlkjjhgfedcb`_^]\[YXWVUTRQPONMKJIIHFEDD{{ŝzyyxvuÓtssrqpoonlkjjhgfedcba_^]\[YXWVUTSQPONMLKJIHGEEġŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œóžŞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿžœ›œŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›œüĴĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›œ÷ĴĞĞŞİݨ¨§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœ›œĴóĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ ›œ­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ ›œŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ ›œŭ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œûŻ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœî°ŻŻ­­ĴĴĞŞŞİݨ¨§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœŝ°°ñŻ­­ĴĴĞŞŞİݨ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœŝħ°°ġŻ­­ĴĴĞĞŞİİŝ¨§§üĤ¤¤£ŝ˘ĦĦ Ÿžœŭ²ħ°°ŝŻù­ĴĴĞĞŞİİŝ¨§§üĤ¤¤£ŝ˘ĦĦ Ÿž œü³²ħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿž œ³ù²ħħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿž œö´³³²ħħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿž œ´³²÷ħ°°ŻŻ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿž œµù´³³²²ħ°°ûŻ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœµŝ´³³ŭ²ħ°°ñŻ­­ĴĴĞŞŞİݨ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœĥµŝ´³³ŭ²ħ°°ŝŻù­ĴĴĞĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœô·ĥĥµµ´´³³²ħ°°ŝŻù­ĴĴĞĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ·òĥµµ´´³³²ħħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœŝ¸··ŝĥµµö´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœŭı¸··ŝĥµµö´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœıŝ¸··ŝĥµµò´³³²²ħ°°ŻŻ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ÷şıı¸¸··ĥµµŝ´³³ö²ħ°°ŻŻ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœşı¸·ĥµŝ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœşı÷¸··ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžŭœğşşı÷¸··ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžüœĵğşşıŝ¸··ûĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžĵŝğşşıŝ¸··ûĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£˘Ħ Ÿžĵğşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ Ÿžŝ½ĵĵğşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ Ÿžŭ½ĵĵğşıŝ¸··ûĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİù¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿžŝ½ĵĵğşıŝ¸··ûĥµµ´³³ö²ħ°°ŻŻ­ĴĴôĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦü ŸŸžžŝŝ½ĵĵğşıŝ¸··ûĥµµ´³³ö²ħ°°ŻŻ­ĴĴôĞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžŝżŝ½ĵĵğşıŝ¸··ûĥµµ´³³è²ħ°°ŻŻ­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžżŝ½ĵĵğşıŝ¸··ûĥµµ´³³ú²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿŝžżżŝ½ĵĵğşı÷¸··ĥĥµµ´³³ú²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿżŝ½ĵĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Żö­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦ ŭŸÀżżŝ½ĵĵŝğşşı︷·ĥĥµµ´³³²²ħ°°Żö­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦ Àżŝ½ĵĵŝğşşıû¸··ĥµµö´³³²²ħ°°Żö­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦû ÁÀÀżż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Żö­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦüÁÀÀżż½ĵŝğşşı¸·ŝĥµµö´³³²ħħ°°Żö­ĴĴĞŞŞİݨ§§üĤ¤¤ö£˘˘ĦĦÁÁÀÀżż½ĵŝğşşı¸·ŝĥµµö´³³²ħħ°°Żö­ĴĴĞŞŞİݨ§§üĤ¤¤û£˘˘ĦÁÁÀż½ĵŝğşşı¸·ŝĥµµö´³³²ħħ°°Żö­ĴĴĞŞŞİݨ§§Ĥŝ¤¤£ŝ˘ÁÁÀżŝ½ĵĵğşıŝ¸··ŝĥµµö´³³²ħħ°°Ż­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤£ÁÀżŝ½ĵĵğşıŝ¸··ŝĥµµö´³³²ħħ°°Ż­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤ŭ£ÂÁÁÀżŝ½ĵĵğşıŝ¸··ŝĥµµö´³³²ħħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ŝÂÁÁÀżŝ½ĵĵğşıŝ¸··ŝĥµµö´³³²ħħ°°Żġ­ĴĴĞĞŞİݨ¨§§ùĤ¤¤ÂÂÁÁÀż½ĵğşıŝ¸··ŝĥµµö´³³²ħħ°°Żù­ĴĴĞĞŞİİŝ¨§§üĤÂÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµö´³³²ħħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§ŭĤÂÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµö´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§ŝĤÂÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµò´³³²²ħ°°ŻŻ­ĴĴŭĞŞİݨ§ŝÂÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµò´³³²²ħ°°ŻŻ­ĴĴöĞŞŞİݨ¨§ÂÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµŝ´³³ŭ²ħ°°ġŻ­­ĴĴĞŞŞİİŭ¨ÂÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻù­ĴĴĞĞŞİİÂÁÀż½ĵŝğşşı¸·ĥµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴùĞŞİİÂÂÁÀż½ĵğşı¸·ĥµ´³ù²ħħ°°Żŝ­ĴĴüĞŞŞÂÁÀż½ĵŝğşşıŝ¸··ĥµŝ´³³²°ŝŻŝ­ĴĴŭĞŞÂÁÀż½ĵŝğşşı¸·ĥµ´³ġ²ħħ°°ŻŻ­ĴĴНœ› š™šŝžœ› š™šžœ› š™šžœ› š™šžœ› š™šžœ› š™šŝŸžžœ› š™šŸžœ› š™šŸžœ› š™šŸžœ› š™šŸžœ›š ™šŸžœ›š ™šŝ ŸŸžœ›š ™š Ÿžœ›š ™š Ÿžœ›š ™šŝĦ  Ÿžœ›š ™üšĦĦ  Ÿžœ›š ™Ħ Ÿžœ›š™Ħ Ÿžœ›š™ŝ˘ĦĦ Ÿžœ›š™˘Ħ Ÿžœ›š™˘Ħ Ÿžœ›š™ŝ£˘˘Ħ Ÿžœ›š™£˘Ħ Ÿžœ›š™£˘Ħ Ÿžœ›š™£˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› 𙤣˘Ħ Ÿžœ› šŝ™¤¤£˘Ħ Ÿžœ› šŝ™¤¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› šŝĤ¤£˘Ħ Ÿžœ› šĤ¤£˘Ħ Ÿžœ›šĤ¤£˘Ħ Ÿžœ›šŝ§ĤĤ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›šŝ¨§§Ĥ¤£˘Ħ Ÿžœ›š¨§Ĥ¤£˘Ħ Ÿžœ›ŝš¨¨§Ĥ¤£˘Ħ Ÿžœ›ŝݨ¨§Ĥ¤£˘Ħ Ÿžœ›İ¨§Ĥ¤£˘Ħ Ÿžœ›İ¨§Ĥ¤£˘Ħ Ÿžœ›İ¨§Ĥ¤£˘Ħ Ÿžœ›ŝŞİݨ§Ĥ¤£˘Ħ Ÿžœ›Şİ¨§Ĥ¤£˘Ħ Ÿžœ›Şİ¨§Ĥ¤£˘Ħ Ÿžœŝ›ŞŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžŝœŞŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ ŸžŝŞ Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ Ÿž÷233445667789:;;<=>?@ABCDDEGHIJKLNNPQSTUVXYZ[]^_abcdeghijklmopp23344556677Â89::;<<=>@ABBCDEFHIJJLMNOQRSTUWXY[\^^`abddfghjjkmnop2233445667789:;;<=>?@ABCDDEFHIJKLNNPQRTUVXXZ[\^_`bcdefghjklmoo223344556677Â899:;<<=>@AABCDEFGHIJKMNOPRSTUVXYZ\]^_abcdeghijklno12233445667789::;<=>>@ABCCDEFHIJJLMNOQRTUVWXY[\^_`abdefghjjkmn122334455667789:;;<=>?@ABCDDEFHIJKLNNPQRTUVWXZ[\^_`abdefghjklm11223344556677Ì899:;<<=>@AABCDEFGHIJKMNOPQSTUVXYZ[]^_`bcdeghijkl112234ü5667789::;<==>@ABBCDEFHHIJKMNOPRSTUVXYZ\]^_abcdfghijk112345678Ñ9::;<=>?@ABBCDEFHIJJLMNOQRTTUVXY[\]^`abddfghij112345678Ò9:;;<=>?@ABCCDEFHIJKLMNOQRTUUWXY[\^^`abdefghj11234567Ñ899:;;<=>?@ABCDDEFHIJKLMNPQRTUVWXZ[\^_`abdefgh112345ŝ677Ò899:;<<=>@@ABCDDEFHIJKLMNPQRTUVWXZ[\^_`abdefg112345ŝ677Ó899:;<<=>@@ABCDEEGHIJKLMNPQRTUVWXZ[\^_`abdef11234ü56677Ô899:;<<=>@@ABCDEEGHIJKLMOPQRTUVWYZ[\^_`abde11234ü5667789×:;<<=>@@ABCDEEGHIJKLMOPQRTUVWYZ[\^_`abd011234ü5667789×:;<<=>@@ABCDEEGHIJKLMOPQRTUVWYZ[\^_`ab0011234ü56677×899:;<<=>@@ABCDEEGHIJKLMOPQRTUVWXZ[\^_`a001234ü56677Ĝ899:;<<=>@@ABCDEEFHIJKLMNPQRTUVWXZ[\^_`0012345ŝ677Ù899:;<<=>@@ABCDDEFHIJKLMNOQRTUVWXY[\^_0012345ŝ677Ú899:;;<=>?@ABCDDEFHIJKLMNOQRTUUWXY[\^001234567Û899:;;<=>?@ABCDDEFHIJKLMNOQRTUUWXY[\001234567Ü899:;;<=>?@ABCCDEFHIJKLMNOQRTTUWXY[0012345678ß9:;;<=>?@ABBCDEFHIIKLMNOPRSTUVXY0 012345678à9::;<==>@ABBCDEFHIIJLMNOPRSTUVX0 01234ü566778á9::;<==>@ABBCDEFHHIJKMNOPRSTUV0 012345ŝ6778â9::;<<=>@AABCDEFGHIJKMNOPQSTU00/01234567â899:;<<=>@AABCDEFGHIJKMNOPQST00/01234567899:;<<=>@@ABCDEFGHIJKLNOPQS00/01234567ä899:;;<=>@@ABCDEEGHIJKLNOPQ00 /01234ü566778ç9:;;<=>?@ABCDEEGHIJKLNOP00 /01234ü566778è9:;;<=>?@ABCDDEGHIJKLNO00 /012345ŝ6778é9:;;<=>?@ABCDDEGHIJKLN00 /012345ŝ6778é9::;<=>?@ABCDDEGHIJKL100/012345ŝ6778é9::;<=>?@ABCDDEGHIJK1100/012345ŝ6778ì9::;<=>?@ABCDDEGHIJ110/012345ŝ6778í9::;<=>?@ABCDDEGHI110/012345ŝ6778î9::;<=>?@ABCDEEGH110/012345ŝ6778ï9::;<=>?@ABCDEEG110/012345ŝ6778ï9:;;<=>?@ABCDEF2110/012345ŝ6778ï9:;;<=>@@ABCDE22110/012345ŝ6778ï9:;;<=>@@ABCD322110/01234ü566778ï9:;<<=>@AABC3322110/01234ü56677í899:;<<=>@AAB43322110/0123ú4556677í899:;<<=>@AB443322110/01234567í89::;<==>@A5443322110 /012345ŝ6778î9::;<==?@65443322110 /01234ü5667789::;<=>?66544332210 /01234ü5667789:;;<=>766544332210/01234567ë899:;<<=776655443322110/01234567ĝ899:;<<7765432101234ü566778ù9::;<877ĝ6554433221012345678ĝ9::;988776ŝ544321 012345678ŝ9::ü98877654321 01234567ö899:;:988776543210 1234567ö899;;:998776543212345678ö9<<;::988776543212345678ö=<<;::988776ŝ544321234567ô8>==<;;:99877654321234567ó@?>=<<;::98877654321234567òA@?>=<<;::98877654321234567BA@@>==<;;:99887765432123456î7CBAA@>==<;;:99887765432 123456îDCBBA@?>=<<;::9887765432 123456žŝŸ  Ħ˘ŝ£¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­ŝݰ°öħ²³³´´µµĥ··ü¸ıışşğĵŝ½žŸ Ħ˘£¤ŭĤ§§ŝ¨İİŭŞĞĴĴŝ­úݰ°ħ²³³ô´µµĥĥ··¸¸ıışşŝğĵĵ½žŝŸ  Ħ˘ŝ£¤¤üĤĤ§§ò¨İİŞŞĞĴĴ­­Ż°°öħ²³³´´µµĥ··ŝ¸ıışğĵġ½žžŸŸ  ĦĦ˘£¤ĤĤ§§¨¨İİŞĞĞĴĴ­öݰ°ħ²²³³´µµĝĥ··¸¸ıışşŝğĵĵ½ŭžžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴû­Ż°°ŭħ²³³÷´µµĥĥ··¸ıışŝğĵĵġ½žžŸŸ  ĦĦü˘££¤¤üĤĤ§§ò¨İİŞŞĞĴĴ­­Ż°°öħ²³³´´µµĥ··ŝ¸ıışğĵü½žžŸ Ħ˘£¤ĤĤ§§¨¨İİŞĞĞĴĴ­öݰ°ħħ²³³´µµŝĥ··ü¸ıışşğĵžŸ Ħ˘ŝ£¤¤ŭĤ§§ŝ¨İİŭŞĞĴĴŝ­öݰ°ħ²²³³´µµĝĥ··¸¸ıışşŝğĵĵžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴö­ŻŻ°°ħ²³³ô´µµĥĥ··¸¸ıışşüğĵĵžŸ Ħü˘££¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴû­Ż°°ŭħ²³³÷´µµĥĥ··¸ıışŭğĵžŸ Ħ˘£¤üĤĤ§§ù¨İİŞŞĞĴĴû­Ż°°ŭħ²³³÷´µµĥĥ··¸ıışŝğžŸ Ħ˘£¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°ŭħ²³³û´µµĥ··ŝ¸ıışžŸ Ħ˘£¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°ŭħ²³³û´µµĥ··ŝ¸ıışžŸ Ħ˘£¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°öħ²³³´´µµĥ··ŝ¸ııŭşœžŸ Ħ˘£¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°öħ²³³´´µµĥ··ŝ¸ııœžŸ Ħ˘£¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°ŭħ²³³û´µµĥ··ü¸ııœœžŸ Ħ˘£¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°ŭħ²³³û´µµĥ··ŭ¸ıœœžŸ Ħ˘£¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°ŭħ²³³÷´µµĥĥ··¸œœžŸ Ħ˘£¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°ŭħ²³³ĝ´µµĥĥ··œœžŸ Ħ˘£¤üĤĤ§§ŝ¨İİŭŞĞĴĴû­Ż°°ŭħ²³³ù´µµĥĥ·œœžŸ Ħ˘£¤üĤĤ§§ŝ¨İİŭŞĞĴĴû­Ż°°ŭħ²³³ú´µµĥĥœœžŸ Ħü˘££¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴö­ŻŻ°°ħ²³³û´µµĥœœžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴö­ŻŻ°°ħ²³³ü´µµœ œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴŝ­ġݰ°ħ²²³³´µœ œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴŝ­öݰ°ħ²²³³´œœ›œžŸ Ħ˘£¤ŭĤ§§¨İùŞĞĞĴĴ­ġݰ°ħ²²³³œœ››œžŸ Ħ˘£¤ĤĤ§§¨¨İİŞĞĞĴĴ­ĝݰ°ħħ²³œœ›œžŸ Ħü˘££¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­ùݰ°ħħ²œœ ›œžŸ Ħü˘££¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­úݰ°ħħœœ ›œžŸ Ħ˘ŝ£¤¤üĤĤ§§ï¨İİŞŞĞĴĴ­­Ż°°ħœœ ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§¨İİŞŞĞĴĴ­­Ż°°œœ ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ñ¨İİŞŞĞĴĴ­­Ż°œœ ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİġŞĞĴĴ­­Żœœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİġŞĞĴĴ­­œœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİöŞĞĴĴ­­œœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ġ¨İİŞŞĞĴĴ­­œ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ö¨İİŞŞĞĴĴ­œ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§÷¨İİŞŞĞĴĴœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ĝ¨İİŞŞĞĴœ›œžŸ Ħ˘ŝ£¤¤ôĤ§§¨¨İİŞŞĞžœ›œžŸ Ħ˘ŝ£¤¤òĤĤ§§¨¨İİŞĞžžœ›œžŸ Ħ˘ŝ£¤¤òĤĤ§§¨¨İİŞŸžžœ›œžŸ Ħü˘££¤¤òĤĤ§§¨¨İİŸŸžžœ›œžŸ Ħü˘££¤¤ŭĤ§§ù¨İİ ŸŸžžœ›œžŸ Ħ˘£¤ŭĤ§§ù¨İ  ŸŸžžœ ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ù¨Ħ  ŸŸžžœ ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§Ħ Ÿžœ ›œžŸ Ħ˘ŝ£¤¤úĤĤ§§ĦĦ Ÿžœ ›œžŸ Ħü˘££¤¤úĤĤ§˘ĦĦ Ÿžœ›œžŸ Ħ˘£¤ùĤĤ£˘˘ĦĦ ŸžœžŸ Ħ˘ŝ£¤¤ùĤ££˘˘ĦĦ ŸžœžŸ Ħ˘ŝ£¤¤¤ü£˘˘ĦĦ ŸžœžŸ Ħü˘££¤¤ŝ¤¤ü£˘˘ĦĦ Ÿž œžŸ Ħ˘£¤ŝ¤¤£˘Ħ Ÿž œžŸ Ħ˘£¤ŭĤ¤¤£˘Ħ Ÿž œ žŸ Ħ˘£û¤ĤĤ¤¤ü£˘˘ĦĦ ŸžžŸ Ħ˘ĝ£¤§§Ĥ¤¤£˘Ħ ŸžžŸ Ħ˘ŝ£§§üĤ¤¤£˘Ħ ŸžžŸ Ħü˘£¨§§Ĥŝ¤¤ü£˘˘ĦĦ ŸžžŸ Ħ˘öݨ¨§§ĤĤ¤¤£˘Ħ ŸžžŸ Ħú˘İݨ¨§§üĤ¤¤£˘Ħ ŸžžŸ ĦúŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ ŸžžŸ ĦŞİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿž žŸ Ħš›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥŝ§šš›œžŸ Ħ˘£¤Ĥš›œžŸ Ħ˘£¤Ĥš›œžŸ Ħ˘£¤ŝĤšš›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤ŝš š›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£ŭ¤™šš›œžŸ Ħ˘£™š›œžŸ Ħ˘£™š›œžŸ Ħ˘£™š›œžŸ Ħ˘ŝ£™™š›œžŸ Ħ˘™š›œžŸ Ħ˘™š›œžŸ Ħŝ˘™™š›œžŸ Ħ ™ š›œžŸ Ħ ™ š›œžŸ Ħ™ š›œžŸ ŝĦ™™ š›œžŸ ™ š›œžŸ ŝš™™ š›œžŸ ŝš™™ š›œžŸü šš™™ š›œžŸš™ š›œžŸš™ š›œžŸš™ š›œžŸš™ š›œžŝŸšš™ š›œžš™ š›œžš™ š›œžš™ š›œŝžšš™ š›œ š™ š›œ š™ š›œŝ›š š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œŝ›› š™ š›œ› š™ š›œ› š ™ š›œ›š ™š›œ›š™š›œ›(š›œ›'š›œ›&š ›œ›%š›ŭœœœ›%š›œ ›$š›œ›#š›œ ›"š›œ›"š›œ › š›ŝžœ › š›rústuvvxxy{|~|{yxŜwvvutsrrppomlkjhhfqrssuuvwxxyyz{{||~ŝ}||{Üzyyxxvvuussrqponmkjihgprrstuvvwxxyy{{|ŝ}~~ŝ}||{Üzyyxxvvutsrrpponlkjhhpqrsstuvvxxyyz{{|ŝ}~~|{yxŜwvvutsrqponmlkjhopqrssuuvwxxyyz{{||~ŝ}||{Ùzyyxxvvuussrqponmkjinoprrstuvvwxxyyz{{||~ŝ}||{ázyyxxvvutsrrppomlkjmopprrstuvvxxy{|~|{yxàwvvutsrqponmlklnopprrstuvvxxyyz{{|~ŝ}||{Ûzyyxxvvuussrqponmkklnopqrsstuvvxxyyz{{|~|{Ûzyyxxvvutssrpponljkmnopqrssuuvvxxyyz{{| ~ŝ}||{yxßwvvutsrrppomjjkmnopqrstuuvvxxyyz{{| ~|{Úzyyxxwvvutsrqponhjjlmnopqrstuuvvxxyyz{{|ŝ}~ ~|{Úzyyxxvvuutsrqpoghjjlmnopqrstuuvvxxyyz{{|ŝ}~ ~ŝ}||{Úzyyxxvvuussrqpfghjjlmnopqrstuuvvxxyyz{{| ~|{yxváutssrpefghjjlmnopqrsstuvvxxyyz{{| ~|{ŝzyyxvĉutssrdefghjjlmnopqrsstuvvxxyüz{{|| ~ŝ}||{Ŝzyyxxwvvutsrbdefghjjlmnopqrsstuvvxxyŝz{{|ŝ}~~ŝ}||{Ŝzyyxxwvvutsabdefghjjklnopqrrstuvvxxyŝz{{|ŝ}~~|{Ŝzyyxxwvvut`abdefghjjklnopprrstuvvxxyŝz{{|ŝ}~~|{Ŝzyyxxwvvu_`abdefghijklnopprrstuvvxxyŝz{{|ŝ}~~|{Ŝzyyxxwvv^_`abdefghijklnopprrstuvvxxyŝz{{|ŝ}~~|{Ŝzyyxxwv\]^`abddfghijklnopprrstuvvxxyŝz{{|ŝ}~~ŝ}||{ŜzyyxxwZ\]^`abddfghijklnopprrstuvvxxyŝz{{|ŝ}~~ŝ}||{ŜzyyxxYZ\]^`abddfghijklnopprrstuvvxxyŝz{{| ~ŝ}||{ŝzyyâXYZ\]^_abddfghijklnopprrstuvvxxyüz{{|| ~|{ŜzyyVXYZ\]^_abcdfghijklnopprrstuvvxxyüz{{|| ~ŝ}||{ßzUVXYZ[]^_abcdfghijklnopprrstuvvxxy{|ŝ}~ ~ŝ}||{ÚTUVXYZ[]^_abcdfghijklnopprrstuvvxxyyz{{|ŝ}~ ~|{ÙSTUVXYZ[]^_abcdfghijklnopprrstuvvxxyyz{{| ~|ĜQSTUVXYZ[]^_abcdfghijklnopprsstuvvxxyyz{{| ~ŝ}||×PQSTUVXYZ[]^_abddfghijklnopqrssuuvvxxyyz{{|ŝ}~ ~Ñ}||OPQSTUVXYZ[]^_abddfghijklnopqrstuuvvxxyyz{{||~Ò|NOPQSTUVXYZ[]^`abddfghjjklnopqrstuuvwxxyyz{{||~ÒLNOPQSTUVXYZ\]^`abddfghjjkmnopqrstuuvwxxyyz{{||~ÑKLNOPQSTUVXYZ\]^`abddfghjjlmnopqrstuuvwxxyyz{{|| ~ÓJKLNOPQSTUVXYZ\]^`abdefghjjlmnoprrstuuvwxxyy{{|ŝ}~ ~×IJKMNOPQSTUVXYZ\^^`abdefghjjlmnoprrstuvvxxŭyz{{|ŝ}~ ~ÖHIJKMNOPRSTUVXY[\^_`abdefghjjlmnoprrstuvvxxŭyz{{|ŝ}~ ~ĠGHIJKMNOPRSTUVXY[\^_`abdefghjklmnoprrstuvvxxŭyz{{|ŝ}~~ÔFGHIJKMNOPRTTUWXY[\^_`abdefghjklmnoprrstuvvxxŭyz{{|ŝ}~~ÓEFHHIJLMNOPRTUUWXZ[\^_`abdefghjklmnoprrstuvvxxŭyz{{|~ÒDEFHHIJLMNOQRTUUWXZ[\^_`abdefghjklmnoprrstuvvxxŭyz{{|ŝ}~~ÉCDEFHIIKLMNOQRTUVWXZ[\^_`abdefghjklmnoprrstuvvwxxyyz{{||ŝ}~~ÊBCDEFHIJKLMNOQRTUVWXZ[\^_`abdefghjklmnoprrstuuvwxxyyz{{|ŝ}~~BËCDEFHIJKLMNPQRTUVWYZ[\^_`abdefghjklmnoprrstuuvwxxyyz{{|Ĉ}~ABCCDEFHIJKLMNPQRTUVXYZ[\^_`abdefghjklmnopqrstuuvvxxyyz{{|Ì@ABCDDEFHIJKLMNPQRTUVXYZ[\^_`abdefghjjlmnopqrstuuvvxxyŝz{{|Ċ?@ABCDDEFHIJKLNOPQRTUVXYZ[\^_`abdefghjjlmnopqrsstuvvwxxyyz{{|Ç>@@ABCDEEGHIJKLNOPQRTUVXYZ[\^_`abdefghjjklnopprrstuuvwxxyyŝz{{Ċ=>@@ABCDEEGHIJKLNOPQRTUVXYZ[\^_`abdefghijklnopprrstuuvvwxxyyz{{<=>@AABCDEFGHIJKLNOPQRTUVWYZ[\^_`abdefghijklmoopqrsstuvvwxxyÁz<==>@AABCDEFGHIJKLNOPQRTUVWXZ[\^_`abddfghijklmnopqrrstuuvvwxxyyĈ;<==>@ABBCDEFGHIJKLNOPQRTUVWXY[\]_`abcdefghjjlmnopprrsstuvv€wxxy;;<==>@ABBCDEFGHIJKLNOPQRTUVWXY[\]^_abcdefghijklmoopqrrstuuvvwxx:;;<=>?@ABBCDEFGHIJKLNOPQRTUUWXYZ\]^_`abdefghijklmnopprrsstuuvvw9:;;<=>?@ABBCDEFGHIJKLMNOQRTTUVXYZ[\^_`abdefghhjjklnoopqrrstuuvv99:;;<=>?@ABBCDEFGHIJKLMNOQRSTUVXYZ[\^_`abcdefghijklmnoppqrsstuu89::;<<=>?@ABBCDEFGHIJKLMNOPRSTUVWYZ[\]^_abcdefghijklmnoopqrrsst889::;<<=>?@ABBCDEEGHIJKLMNOPQSTUVWXY[\]^_`abddegghijklmnoppqrrs7889::;<<=>?@ABBCDEEFHIJKLMNOPQRTUUWXYZ[\^_`abcdefghijkklmooppqr77889::;<<=>?@AABCDDEFHIIJKMNOPQRSTUVXYZ[\]^_abbdefghhijklmnoopq778Ä9::;;<=>>@AABCDDEFHHIJKLMNOQRSTUVWXY[\]^_`abcdefghijjklmnop77Â899::;<<=>>@AABCDDEFGHIJKLMNOPQRTUVWXYZ[\^_`abcdefghhijklmno6778Ç9::;<<=>>@AABCDDEFGHIJKLMNOPQRTUUVXYZ[\]^_`abcdefghijjklmŝżżÀÁ Ä ÂÁÀżŝ½ĵĵğŭşżżÀÁ Ä ÂÁÀżŝ½ĵĵûğşżżÀÁÂÄ ÂÁÀż½ĵüğżżÀÁ ÄÂÁÀżŝ½ĵĵŝğżÀÁ ÄÂÁÀż½ĵżÀÁ Ä ÂÁÀżŝ½ĵĵŝ½żÀÁ ÄÂÁÀżú½ĵĵ½½żÀÁ Ä ÂÁÀż½ĵ½żÀÁ Ä ÂÁÀż½ĵ½żÀÁ Ä ÂÁÀżŝ½ĵĵ½żÀÁÂÂÁÀżŝğĵĵ½żÀÁÂÂÁÀżŭşğĵĵ½żÀÁÂÂÁÀżşŝğĵĵ½żÀÁÂÂÁÀżŝşşŝğĵĵ½żÀÁÂÂÁÀżŝışşŝğĵĵ½żÀÁÂÂÁÀżışŝğĵĵ½żÀÁÂÂÁÀżışŝğĵĵ½żÀÁÂÂÁÀŭż¸ıışŝğĵĵ½żÀÁÂÂÁÀŭ·¸ıışŝğĵĵ½żÀÁÂÂÁĝÀ··¸¸ıışşŝğĵĵ½żÀÁÂÂÁĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂÂÁ÷µĥ··¸¸ıışşŝğĵĵ½żÀÁÂÂÁµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂÂÁµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂÂŭÁ´µµĝĥ··¸¸ıışşğĵ½żÀÁÂÂŭ³´µµĝĥ··¸¸ıışşğĵ½żÀÁÂû³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂû²³³´µµŝĥ··ü¸ıışşŝğĵĵ½żÀÁÂúħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁ Ä ħû²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁ Äĝ°ħħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁ Ä°ħû²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁ Äöݰ°ħħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂÄġݰ°ħħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂÄöݰ°ħħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂÄŝöݰ°ħ²²³³´µµûĥ··¸ıışŝğĵĵŝ½żÀÁÂÄŝ­ïݰ°ħ²²³³´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁÂÄŭĴ­ïݰ°ħ²²³³´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁÂÄĴŝ­úݰ°ħ²³³÷´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁÂÄûĞĴĴ­úݰ°ħ²³³÷´µµĥĥ··¸ıışğĵŝ½żÀÁ ÄĞĴö­ŻŻ°°ħ²³³û´µµĥ··ŝ¸ıışğĵŝ½żÀÁ ŭŞĞĴĴö­ŻŻ°°ħ²³³û´µµĥ··ŝ¸ıışğĵŝ½żÀÁ üİŞĞĴĴû­Ż°°ŭħ²³³û´µµĥ··ŝ¸ıışğĵŝ½żÀÁ İŭŞĞĴĴû­Ż°°öħ²³³´´µµĥ··ŝ¸ıışğĵŝ½żÀÁÂİŭŞĞĴĴû­Ż°°öħ²³³´´µµĥ··ŝ¸ıışğĵŝ½żÀÁÂŝ¨İİŭŞĞĴĴû­Ż°°öħ²³³´´µµĥ··ŝ¸ıışŝğĵĵŝ½żÀÁÂñ§¨İİŞŞĞĴĴ­­Ż°°öħ²³³´´µµĥ··ŝ¸ıışŝğĵĵ½żÀÁ§¨¨İİŞŞĞĴĴ­­Ż°°öħ²³³´´µµĥ··ŝ¸ıışŝğĵĵ½żÀÁ§¨İŞûĞĴĴ­ŝݰ°öħ²³³´´µµĥ··ŝ¸ıışŝğĵĵ½żÀÁ§¨İùŞĞĞĴĴ­ŝݰ°öħ²³³´´µµĥ··ŝ¸ıışŝğĵĵŝ½żÀÁÂŝĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°òħ²³³´´µµĥĥ··¸ıışğĵŝ½żÀÁüÂĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°ŭħ²³³ô´µµĥĥ··¸¸ıışşğĵ½żÀÁŝĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°ŭħ²³³ö´µµĥĥ··¸¸ıışŝğĵĵ½żÀÁû¤Ĥ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵŝ½żÀÁ¤üĤĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışğĵ½żÀ¤üĤĤ§§ŝ¨İİġŞĞĞĴĴ­­Ż°°ùħ²²³³´µµŝĥ··¸ışŝğĵĵŝ½żÀ¤üĤĤ§§ŝ¨İİġŞĞĞĴĴ­­Ż°°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵ½żŝ£¤¤üĤĤ§§ŝ¨İİçŞĞĞĴĴ­­ŻŻ°°ħħ²³³´´µµĥĥ··ŝ¸ıışğĵŝ½ż£¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ùݰ°ħħ²³³ŝ´µµŝĥ··¸ışŝğĵĵ½ûż˘££¤¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµĥ·¸ışğĵ½˘£¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışŝğĵĵ½úĦ˘˘££¤¤Ĥ§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışğĵ½ĝĦĦ˘˘££¤¤üĤĤ§§¨İŞŝĞĴĴŝ­Ż°ħŝ²³³ŝ´µµĥ·¸ışŝğĵĵ½§¨İ ŞĞ Şİ¨§Ĥ§¨İ ŞĞ Şİ¨§Ĥ§¨İŞĞŞİ¨§Ĥ§¨İŞĞŞİ¨§Ĥ§¨İ ŞĞ Şİ¨§Ĥ§¨İ ŞĞŞİ¨§ĤŭĤ§§¨İŞĞ Şİ¨§Ĥ§¨İŞĞ Şİ¨§Ĥ§¨İŞĞŞİ¨§ûĤĤĤ§§¨İŞĞ Şİ¨§Ĥ§¨İ ŞĞ Şİ¨§Ĥ§¨İ ŞĞ Şİ¨§Ĥ§¨İ ŞĞ Şİ¨§Ĥ§¨İ ŞĞ Şİ¨§ŝ¤Ĥ§¨İ ŞĞ Şİ¨ü§¤¤Ĥ§¨İ ŞĞ Şİ¨ŝ§¤¤Ĥ§¨İ ŞĞ Şİ¨¤Ĥ§¨İ Ş Ğ Şİ¨ŝ£¤¤Ĥ§¨İ Ş Ğ Şİü¨££¤¤Ĥ§¨İ Ş Ğ Şİ£¤Ĥ§¨İ Ş Ğ Şİ£¤Ĥ§¨İ Ş Ğ Şŭİ˘££¤Ĥ§¨İ ŞĞ Ş˘£¤Ĥ§¨İ ŞĞŞ˘£¤Ĥ§¨İ ŞĞŞŝĦ˘˘£¤Ĥ§¨İ ŞĞŞĦ˘£¤Ĥ§¨İ ŞĞŞĦ˘£¤Ĥ§¨İ ŞĞŞĦ˘£¤Ĥ§¨İ ŞĞŞŝ ĦĦ˘£¤Ĥ§¨İŞĞŞ Ħ˘£¤Ĥ§¨İŞĞŝŞ  Ħ˘£¤Ĥ§¨İŞĞ Ħ˘£¤Ĥ§¨İ ŞĞŝŸ  Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İŞĞŸ Ħ˘£¤Ĥ§¨İŞĞŸ Ħ˘£¤Ĥ§¨İŞ ĞŸ Ħ˘£¤Ĥ§¨İŞ ĞŝžŸŸ Ħ˘£¤Ĥ§¨İŞ ĞžŸ Ħ˘£¤Ĥ§¨İŞ ĞžŸ Ħ˘£¤Ĥ§¨İŞ ĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞŝžžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ޝžŸ Ħ˘£¤Ĥ§¨İ ޝžŸ Ħ˘£¤Ĥ§¨İŞŝœžŸ Ħ˘£¤Ĥ§¨İŞŝœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŝŞœœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨ŝ›œœžŸ Ħ˘£¤Ĥ§ü¨››œœžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤ĤÔedbb`_^\[ZYWVUTRQPNNLKJIHFFEDCBA@?>=<<;:998776543210Ófedba`^]\[YXVVTSRQONMLJJIGFEDCBBA@>==<;::98877ö655443322110Ógedcba_^\\ZYXVUTRQPONLKJIHFFEDCBA@?>=<<;:988776ú544332210Ĉgfedba`_^\[ZXWVUTRQONMLJJIHFEDCBBA@>==<;::988776655443322110Òhgfdcba`^]\[YXVUTSRPONMKJIHGFEDCBA@?>=<<;:998776ú544332210hhgedcba_^\[ZYWVUTRQPNNLKJIHFEDDCBA@?>=<;::98877ö655443322110jhgfedba`_^\[ZXWVUTRQONMLJJIHFEDCBBA@>=<<;::9877654ŝ3221jihgfedba`^]\[YXVUTSRPONMKJIHGFEDCBAA?>=<<;:998776ĝ544332211Ïkjihgedcba_^]\ZYXVUTRQPONLKJIHFFEDCBA@?>=<;;:98877ö65544332211Îlkjhhfedcb`_^\[ZYWVUTRQPNNLKJIHFEDDCBA@>>=<;::98877ö65544332211Îmlkjhgfedba`_^\[ZXWVUTRQPNMLKJIHFEDCCBA@>==<;::9877654321Ínmlkjhgfedba`_^\[ZXWVUTRQONMLJJIHFEDCBBA@>==<;::9877654ŝ322Ë1onmkjihgfedba`_]\[YXVUUSRQONMLJJIGFEDCBBA@>=<<;:9987765ü43322Ëponlkjihgfedba`^]\[YXVUTSRPONMLJIIGFEDCBAA@>=<<;:9987765Ċ43322pponlkjihgfecba`^]\ZYXVUTSRPONMKJIHGFEDCBAA?>=<<;:998776544332rpponlkjihgfdcba_^]\ZYXVUTSQPONMKJIHGFEDCBAA?>=<<;:99877654433rrpponlkjihgedcba_^]\ZYXVUTRQPONMKJIHGFEDCBAA?>=<<;:9987765443srrpponlkjhhfedcba_^\[ZYXVUTRQPONMKJIHGFEDCBA@?>=<<;:998776544tsrrpponlkjhhfedcba_^\[ZYXVUTRQPONMKJIHFFEDCBA@?>=<;;:99877654utsrrpponlkjhhfedcba_^\[ZYXVUTRQPONMKJIHFFEDCBA@?>=<;;:9987765vutsrrpponlkjhhgedcba_^\[ZYXVUTRQPONMKJIHFFEDCBA@?>=<;;:998776vĊutsrrpponlkjihgedcba_^\[ZYXVUTRQPONMKJIHFFEDCBA@?>=<;;:99877Á6wvvutsrrpponlkjihgfdcba_^][ZYXVUTRQPONMKJIHGFEDCBA@?>=<;;:99877€xwvvutssrpponlkjihgfdcba`^][ZYXVUTRQPONMKJIHGFEDCBA@?>=<;;:99877yxxvvutssrpponlkjihgfecba`^]\ZYXVUTSQPONMKJIHGFEDCBA@?>=<;;:9987yyxxvvutssrpponmkjihgfecba`^]\ZYXVUTSQPONMKJIHGFEDCBA@?>=<;;:988zyyxxvvutssrpponmkjihgfedba`^]\ZYXVUTSQPONMKJIHGFEDCBA@?>=<;;:98{zyyxxvvutssrqponmkjihgfedba`^]\ZYXVUTSQPONMKJIHGFEDCBA@?>=<;;:9{{zyyxxvvuutsrqponmkjihgfedba`^]\ZYXVUTSQPONMKJIHGFEDCBA@?>=<;;:|{{zyyxxvvuutsrqponmkjihgfedba`^]\ZYXVUTSQPONMKJIHFFEDCBA@?>=<;;||{{zyyxxwvuutsrqponmkjjhgfedba`^]\ZYXVUTSQPONMKJIHFFEDCBA@?>=<;||{Äzyyxxwvvutsrqponmkkjhgfedba`^]\ZYXVUTRQPONMKJIHFFEDCBA@?>=<||{Äzyyxxwvvutsrqponmkjihgfedba`^]\ZYXVUTRQPONLKJIHFEEDCBA@>>=~||{Äzyyxxwvvutsrqponmkjihgfedba`^]\ZYXVUTRQPONLKJIHFEEDCBA@>>~~||{Çzyyxxwvuutsrqponmkjihgfecba_^]\ZYXVUTRQPONLKJIHFEDDCBA@>~~|{Èzyyxxvvuutsrqponmkjihgfdcba_^\[ZYXVUTRQPOMLKJIHFEDDCBA@~~|{Ézyyxxvvuussrpponlkjihgedcba_^\[ZYXVUTRQPNMLKJIHFEDDCBA~~|{Êzyyxxvvutssrpponlkjihgedcb`_^\[ZYWVUTRQPNMLKJIHFEDCCB~~ŝ}||{Ëzyyxxvvutssrpponlkjhhfedbb`_^\[ZYWVUTRQPNMLKJIHFEDCB~~ŝ}||{Ìzyyxxvvutsrrppomlkjhhfedbb`_^\[ZXWVUTRQONMLJJIHFEDC~~|{yxÑwvvutsrrponmlkjhgfedba`_^\[ZXWVUSRQONMLJJIGFED~~ŝ}||{Ízyyxxwvuutsrqponmlkjhgfedba`_]\[YXVUUSRPONMLJIIGFE~~ŝ}||{Îzyyxxvvuussrqponmkjihgfedba`^]\ZYXVUTSRPONMKJIHGF~~|{yxÓwvvutsrrpponlkjihgedcba_^]\ZYXVUTRQPONMKJIHG~~|{Îzyyxxwvvutsrrppomlkjhhfedcb`_^\[ZYXVUTRQPONLKJIH}~~ŝ}||{yxvusÛrqponmlkjhgfedbb`_^\[ZYWVUTRQPONLKJI| |{zyyxxwvvutsrrpponmkjjhgfedba`_^\[ZXWVUTRQPONLKJ| |{ŝzyyxvuÚtsrrpponlkjihgfedba`_^\[ZXWVUTRQPNMLK| |{yxÔwvvuussrqpoomlkjhhgedcba`^]\[YXVVUTRQPNML{{| |{yxvÚutsrrpponmkkjhgfedcba_^]\ZYXVVUTRQONM{{|{yxĠwvvuussrrpponlkjihgfedbb`_^\\ZYXVUUSRQONyz{ {ŝzyyx×wvvuutssrqpoomlkjihgfedba`_^\\ZYXVUUSRQOyyŝz{ {yxvusrpâonmlkjhhgfedba`_^\[ZYXVUUSRQxyyz{ŝzyyxvuŬtssrqpponmkjjhhgedcba`_^\[ZYXVUTSRxxyzyxŝwvvusrpoämlkjihgfedcba`_^\[ZYXVUTSvwxxyxŝwvvuŜtssrqpponmlkjihgfedcba`_^\[ZYXVUUvvwx yxŝwvvuÜtssrrppoonmkkjhhgfedbba`_^\[ZYXVUuuvvŝwxxvusrpoämlkjjhhgfedbba_^^\[ZYXVstuuvvwxvuÛtssrrqpponmlkjjhhgfedbb`_^^\[ZYXrsstuuvw xŝwvvusrponmlkjjhhgeedbb`__^\[ZYqrrsstuuvwxŝwvvusráqppoommkkjihgfeedbb`__^\[Zpqrrssŝtuuvuŝtssrponmlkkjihgfeedbba`_^\[oppqrrssŝtuuvusrponmlkkjihgfeddbba`^^\nooppqrrssŝtuu vusrèqppoonmlkjjihggfddcba`_^şıŝ¸··öĥµµ´´³³²ħ°°ŝŻ­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿžœşı÷¸··ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœŝğşşı¸·ĥµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿžœŭĵğşşıŝ¸··öĥµµ´´³³²ħ°°òŻ­­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦ Ÿžùœĵğğşşııŝ¸··ûĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£˘Ħ Ÿžûœĵĵğşşı÷¸··ĥĥµµ´³³ú²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ ŝŸžžĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžĵğşıŝ¸··ŝĥµµú´³³²ħ°°òŻ­­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦ Ÿžŝ½ĵĵğşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§öĤ¤¤££˘˘ĦĦ Ÿžŭ½ĵĵŝğşşıŝ¸··ûĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£˘Ħ Ÿžü½½ĵĵŝğşşı÷¸··ĥĥµµ´³³ö²ħ°°ŻŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ Ÿžú½½ĵĵŝğşşı÷¸··ĥĥµµ´³³ö²ħ°°ŻŻ­ĴĴôĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿž½ĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿŭžż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ ŝŸżż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ ż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦŭ Àżż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦÀż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦüÁÀÀżż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ĝ˘ĦĦÁÁÀÀżż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŭ˘ĦÁÁÀż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ÁÁÀż½ĵŝğşşı︷·ĥĥµµ´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ü£˘ÂÁÁÀż½ĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ü£ÂÂÁÁÀż½ĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ÂÁÀż½ĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Żí­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ÂÂÁÀżŝ½ĵĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Żí­ĴĴĞĞŞİݨ¨§§ĤĤ¤ÂÂÁÀżŝ½ĵĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤÂÁÀżŝ½ĵĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Żö­ĴĴĞŞŞİݨ§§ŭĤÂÁÀżŝ½ĵĵŝğşşı︷·ĥĥµµ´³³²²ħ°°Żö­ĴĴĞŞŞİݨ§§ŝĤÂÁÀżŝ½ĵĵŝğşşı︷·ĥĥµµ´³³²²ħ°°Żö­ĴĴĞŞŞİݨ§§ÂÁÀżŝ½ĵĵŝğşşıû¸··ĥµµö´³³²²ħ°°Żô­ĴĴĞŞŞİݨ§§ÂÁÀżŝ½ĵĵŝğşşıû¸··ĥµµö´³³²²ħ°°Żġ­ĴĴĞŞŞİݨ§ÂÁÀż½ĵŝğşşı¸·ŝĥµµî´³³²ħħ°°Ż­­ĴĴĞŞİİŝ¨ÂÁÀż½ĵŝğşşı¸·ŝĥµµú´³³²ħ°°öŻ­­ĴĴĞŞİİŝÄÂÁÀż½ĵŝğşşı¸·ŝĥµµú´³³²ħ°°ûŻ­ĴĴúĞŞİİÄÂÁÀż½ĵŝğşşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴúĞŞİÄÄÂÁÀżŝ½ĵĵğşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴûĞŞÄÄÂÁÀżŝ½ĵĵğşıŝ¸··ûĥµµ´³³ö²ħ°°ŻŻ­ĴĴŝĞ ÂÁÀżŝ½ĵĵŝğşşı÷¸··ĥĥµµ´³³ö²ħ°°ŻŻ­ĴĴ ÂÁÀż½ĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Żü­ĴĴ ÂÁÀż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Żŭ­Ĵ ÂÁÀżŝ½ĵĵğşı¸·ŝĥµµö´³³²²ħ°°Żŝ­ ÂÁÀżŝ½ĵĵğşıŝ¸··ŝĥµµö´³³²ħħ°°ŻÂÁÀż½ĵŝğşşıŝ¸··ĥµµ´´³³²ħħ°°Ż ÂÁÀż½ĵŝğşşıŝ¸··öĥµµ´´³³²ħ°°ŭŻ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµŝ´³³ŭ²ħ°°ŝŻ ÂÁÀż½ĵğşı¸·ĥµŝ´³³ŭ²ħ°° ÂÁÀż½ĵŝğşşı¸·ŝĥµµŝ´³³û²ħ°°ÂÂÂÁÀżŝ½ĵĵŝğşşıŝ¸··ŝĥµµŝ´³³û²ħ°ÁÂÂÁÀż½ĵğşıŝ¸··ŝĥµµŝ´³³ŭ²ħÁÁÂÁÀż½ĵğşıŝ¸··ŝĥµµŝ´³³ŝ²ÁÁ ÂÁÀż½ĵğşıŝ¸··ŝĥµµŝ´³³ÁÂÁÀż½ĵŝğşşı¸·ŝĥµµú´³³ÀÀÁÁÀż½ĵŝğşşı¸·ŝĥµµŭ´³ÀÀÁÀż½ĵğşı¸·ŝĥµµü´żżÀÀÁÀżŝ½ĵĵğşı¸·ŝĥµµżÀÁÀż½ĵğşı¸·üĥµµżżÀÁÀż½ĵğşı¸·ûĥµżżÀ ÁÀż½ĵğşı¸·ŝĥżÀÁÀż½ĵŝğşşı¸·ŝ½żÀż½ĵŝğşşı¸·¤£˘Ħ Ÿžœ› šŭ™¤¤£˘Ħ Ÿžœ› šŭ™¤¤£˘Ħ Ÿžœ› šü™¤¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› šŝĤ¤£˘Ħ Ÿžœ›šĤ¤£˘Ħ Ÿžœ›šĤ¤£˘Ħ Ÿžœ›šŝ§ĤĤ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›š§Ĥ¤£˘Ħ Ÿžœ›šŝ¨§§Ĥ¤£˘Ħ Ÿžœ›üš¨¨§§Ĥ¤£˘Ħ Ÿžœ›¨§Ĥ¤£˘Ħ Ÿžœ›ŝݨ¨§Ĥ¤£˘Ħ Ÿžœ›İ¨§Ĥ¤£˘Ħ Ÿžœ›İ¨§Ĥ¤£˘Ħ Ÿžœ›ŝŞİݨ§Ĥ¤£˘Ħ Ÿžœ›Şİ¨§Ĥ¤£˘Ħ Ÿžœ›Şİ¨§Ĥ¤£˘Ħ Ÿžœŝ›ŞŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ Ÿžœ Şİ¨§Ĥ¤£˘Ħ ŸžœĞŞİ¨§Ĥ¤£˘Ħ ŸžŝœĞĞŞİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞ Şİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžŝĞĞŞİ¨§Ĥ¤£˘Ħ ŸžĞ Şİ¨§Ĥ¤£˘Ħ ŸžĞ Şİ¨§Ĥ¤£˘Ħ Ÿž ĞŞİ¨§Ĥ¤£˘Ħ ŸŝžĞĞ Şİ¨§Ĥ¤£˘Ħ Ÿ Ğ Şİ¨§Ĥ¤£˘Ħ Ÿ Ğ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸŞĞ Şİ¨§Ĥ¤£˘Ħ ŸŞİ¨§Ĥ¤£˘Ħ ŝŸŞŞİ¨§Ĥ¤£˘Ħ Şİ¨§Ĥ¤£˘Ħ Şİ¨§Ĥ¤£˘Ħ Şİ¨§Ĥ¤£˘Ħŝ ŞŞİ¨§Ĥ¤£˘ĦŝİŞŞİ¨§Ĥ¤£˘ĦİŞİ¨§Ĥ¤£˘ĦİŞİ¨§Ĥ¤£˘Ħŝ¨İİŞİ¨§Ĥ¤£˘¨İ Şİ¨§Ĥ¤£˘¨İŞİ¨§Ĥ¤£˘§¨İ¨§Ĥ¤£˘§¨İ¨§Ĥ¤£ŝ˘§§¨İ¨§Ĥ¤£§¨İ¨§Ĥ¤£0 /01234567899:;<<=>?@ABCDDEGHIJKLNNP00/ /01234567ä89::;<<=>@ABBCDEFGHIJKMNO00/ /012345ŝ6778è9::;<=>?@ABCDDEFHIJKLMN00/01234ü56677ç899:;<<=>@@ABCDEFGHIJKMN00/012ĝ344556677è89::;<<=>@ABBCDEFHIJJLM00/012345ŝ6778ê9::;<=>?@ABCDDEFHIJKL00/012345ŝ6778ê9:;;<=>?@ABCDEFGHIJK100/01234ü56677é899:;<<=>@AABCDEFHHIJ100/0123ú4556677é89::;<==>@ABBCDEFHIJ1100/012345678í9::;<=>?@ABCDDEFHI110/012345ŝ6778î9:;;<=>?@ABCDEEGH110/01234ü566778ï9:;;<=>@@ABCDEFG110/01234ü56677î899:;<<=>@AABCDEF110/01234ü56677î899:;<<=>@ABBCDE2110/0123ú4556677î899:;<==>@ABBCD22110/01234567î89::;<==>@ABCC322110/01234567î89::;<==?@ABC3322110/012345ŝ6778ï9::;<=>?@AB43322110/012345ŝ6778ï9::;<=>?@A443322110/012345ŝ6778ï9::;<=>?@5443322110/012345ŝ6778ï9:;;<=>?65443322110/012345ŝ6778ï9:;;<=>665443322110/012345ŝ6778ï9:;;<=7665443322110/012345ŝ6778ï9:;;<77665443322110/012345ŝ6778û9:;;776ĝ5443322110/012345ŝ6778û9:;8776ĝ5443322110/012345ŝ6778û9:8877ö655443322110/012345ŝ6778987ö655443322110/012345ŝ6778û:98877ö655443322110/012345ŝ677ù8;:98877ö655443322110/012345ŝ677;û:98877ö655443322110/01234ó56677<;::98877ö655443322110/01234ó5667=<;::98877ö655443322110/01234ç566>=<;::988776655443322110/01234ô56>>=<;::9877654ŝ32210/0123ò455@>==<;::9877654ŝ32210/01234ó5A@>==<;::9877654ŝ32210/01234óBA@>==<;:99877654ŝ32210/0123ñ4BBA@>=<<;:99877654ŝ32210/0123ñCBBA@>=<<;:998776543210 /0123DCBAA@>=<<;:998776543210 /012î3EDCBAA@>=<<;:998776543210 /012îFEDCBAA@>=<<;:998776543210/012íGFEDCBAA@>=<<;:99877ĝ6554433221012ìHFFEDCBAA@>=<<;::9877ĝ6554433221012êIHFFEDCBAA@>=<<;::988776ŝ544321 01è2JIHFFEDCBAA@>==<;::98877654321 01ç2KJIHFFEDCBAA@>==<;::9887765432 10 1ĉ2LKJIHFFEDCBBA@>==<;;:998776ŝ544321ċ2MLKJIHFFEDCBBA@>>=<;;:998776543212NMLKJIHGFEDCBBA@>>=<<;::988776543212ONMLKJIHGFEDCCBA@?>=<<;::988776543212áQONMLKJIHGFEDCCBA@?>==<;;:99887765432 12àRQONMLKJIIGFEDDCBAA@>>=<;;::9887765432ŜSRQPNNLKJIIHFEDDCBBA@?>=<<;::9988776543 2ŬUSRQPONMKJJIHFFEDCBBA@?>==<;;::98877654323UŬTRQPONMLJJIHGFEDCCBAA@>>=<<;::998877654 3ÙVUUTRQPONMLKJIHGFEDDCBBA@?>==<;;::9988776543ÚXVVUTRQPONMLKJIIHFEEDCCBA@@?>=<<;;::988765 4ÜYXWVUTSRQONNMKJJIHGFEDDCBBA@?>==<<;::ŝ9887654ÖZYXWVUTSRQPONMLKJIHGFEEDCCBAA@?>==<<;::99887654Ô[ZYXWVUTTRQPONMLKJIIHGFEDDCBBA@?>>=<<;;::9988765Ò]\[ZYXVUUTSQPONNMKJJIHGFEDDCCBAA@?>==<<;;::9988765œ ›œžŸ Ħü˘££¤¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°œ ›œžŸ Ħ˘£¤ŭĤ§§ŝ¨İİŭŞĞĴĴŝ­úݰ°œœ› ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴ÷­Ż°°œœ››œžŸ Ħü˘££¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­ŭݰœœ›œžŸ Ħü˘££¤¤ŭĤ§§ŝ¨İİŭŞĞĴĴú­ŻŻœœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴû­Żœœ›œžŸ Ħ˘ŝ£¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­œ›œžüŸ  ĦĦü˘££¤¤ôĤĤ§§¨¨İİŞĞĴĴû­œœ›œžŸ Ħü˘££¤¤ŭĤ§§ŝ¨İİŭŞĞĴĴû­œœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİùŞĞĴĴ­­œ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ö¨İİŞŞĞĴĴ­œ›œžŸ Ħ˘ŝ£¤¤ñĤĤ§§¨¨İİŞĞĞĴĴœ›œžüŸ  ĦĦü˘££¤¤òĤĤ§§¨¨İİŞĞĴĴœ›œžŸ Ħü˘££¤¤ùĤĤ§§¨İİûŞĞĴžœ›œžŸ Ħü˘££¤¤ŭĤ§§ŝ¨İİûŞĞžžœ›œžŸ Ħ˘£¤ŭĤ§§ŝ¨İİûŞŸžžœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŸžœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§÷¨İİ ŸŸžžœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§÷¨İ  ŸŸžžœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§÷¨Ħ  ŸŸžžœ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§Ħŝ ŸŸžœ›œžŸ Ħ˘ŝ£¤¤üĤ§§ĦĦŝ ŸŸžœ›œžŸ Ħ˘ŝ£¤¤ŭĤ§ĦĦü ŸŸžžœ›œžŸ Ħ˘ŝ£¤¤ŭĤ˘ĦĦü ŸŸžžœ›œžŸ Ħ˘ŝ£¤¤˘Ħü ŸŸžžœ›œžŸ Ħ˘ŝ£¤¤û£˘˘ĦĦ Ÿžœ›œžŸ Ħ˘ŝ£¤¤ü£˘˘ĦĦ Ÿžœ›œžŸ Ħ˘ŝ£¤¤ü£˘˘ĦĦ Ÿžœ›œžŸ Ħ˘ŝ£¤¤ü£˘˘ĦĦ Ÿžœ›œžŸ Ħ˘ŭ£¤¤ü£˘˘ĦĦ Ÿžœ›œžŸ Ħ˘¤ü£˘˘ĦĦ Ÿžœ›œžŸ Ħû˘Ĥ¤¤ü£˘˘ĦĦ Ÿžœ›œžŸŝ ĦĦû§Ĥ¤¤ü£˘˘ĦĦ Ÿžœ›œžŸŝ ĦĦ§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›œžŸ Ħ§öĤ¤¤££˘˘ĦĦ Ÿžœ›œžŸ ŭĦ¨§§ŭĤ¤¤£˘Ħ Ÿžœ›œžŸ ŭݨ§§ŭĤ¤¤£ŝ˘ĦĦ Ÿžœ›œžŸû İݨ§§ŭĤ¤¤£ŝ˘ĦĦ Ÿžœ›œžŸİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ Ÿžœ›œžŸŝŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ Ÿžœ ›œžüŸĞŞİİù¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿžœ ›œžĞġŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿžœ ›œžòĴĞĞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œžĴĞġŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œïž­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœóž­ĴĴĞĞŞİݨ¨§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœòž­ĴĴĞĞŞİݨ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿž œù­ĴĴĞĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ ŝŻù­ĴĴĞĞŞİİŝ¨§§üĤ¤¤£˘Ħ Ÿžŭ°Żù­ĴĴĞĞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿž°ŝŻù­ĴĴĞĞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžŝž°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§Ĥ¤£˘Ħ Ÿžŭžħ°°ŝŻŝ­ĴĴŭĞŞİݨ§üĤ¤¤£˘Ħ Ÿž žŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžžü³²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥ¤ŝ£˘˘Ħ Ÿž³ŭ²ħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥŝ¤¤£˘Ħ Ÿ ž³ô²ħħ°°ŻŻ­­ĴĴĝĞŞŞİݨ¨§§Ĥ¤£˘Ħ ŸžŸŝ´³³ü²ħħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ  Ÿŭµ´³³²ŝħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥ¤£˘Ħ Ÿµ´³²ŝħ°°ŝŻ­ĴüĞŞŞİݨ§Ĥ¤£˘Ħ  µ´³ŭ²ħ°°Żŝ­ĴĴĞŝŞİݨ§Ĥ¤£˘Ħ ĥµ´³ü²ħħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘ Ħ ü·ĥĥµµŝ´³³²ŝħ°°ŝŻ­ĴĞŝŞİݨ§Ĥ¤£˘ Ħ™ š›œžŸ ™ š›œžŸ ™ š›œžŸŝ ™™ š›œžŸŝ ™™ š›œžŸŝš™™ š›œžŸŝš™™ š›œžŸš™ š›œžŸš™ š›œžŸš™ š›œžŸš™ š›œžŝŸšš™ š›œžš™ š›œžš™ š›œžš™ š›œžš™ š›œŝžšš™ š›œ š™ š›œ š™ š›œŝ›š š™ š›œ› š™ š›œ› š™ š›œŝ›› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›œ› š™ š›ŝœœ› š™ š›œ› š™ š›œ› š™ šŝ›œ› š™ šŝ›œ› š™ šœ› š™ šŝžœ› š™ šžœ› š™ šžœ› š™ šžœ› š™ šžœ› š ™ šŝŸžžœ›š ™ šŸžœ›š™ šŸžœ›"šŸžœ› šŸžœ›šŸžœ ›šŝ ŸŸžœ›š Ÿžœ ›š Ÿžœ ›šŝĦ  Ÿžœ ›šĦ Ÿžœ ›šĦ Ÿžœ ›šĦ Ÿžœ ›šŝ˘ĦĦ Ÿžœ › š˘Ħ Ÿžœ› š˘Ħ Ÿžœ›š˘Ħ Ÿž œ›˘Ħ Ÿž œ›£˘Ħ Ÿž œ›ÛQRTUVWXZ[\^^`abddfghijklmopprrstuuvvxxyŝz{{ |{ÛPRSTUVXYZ\]^_abcdeghijklmoopqrssuuvvxxyŝz{{|{ĠOQRTUVWXZ[\^_`abdefghjjkmnopqrrstuvvwxxyyz{{|ŝ}~~}|ĠOPQSTUVXYZ\]^_abcdeghijklmooprrstuuvwxxyyz{{|ŝ}~~ŝ}||ĜNOQRTUVWXY[\^^`abdefghjjkmnopqrssuuvvxxyy{| ~Ï}||NNPQRTUVXYZ[\^_`bcdefhhjklmooprrstuvvwxxyyz{{|| ~Ò}|MNOPRSTUVXYZ\]^_abddeghijklnopqrssuuvvxxyyz{{| ~ÑLMNOQRTUUWXY[\^_`abdefghjjkmnopqrstuuvwxxyyz{{||ŝ}~ ~ÖKLMNOQRTUVWXZ[\^_`bcdefhhjklmopprrstuvvxxyy{| ~JKLNNPQRTUVXYZ[]^_abcdeghijklnopqrssuuvvxxyyz{{||ŝ}~ ~ÏIJKMNOPQSTUVXYZ\]^`abddfghjjkmnopqrstuuvwxxyyz{{|| ~ÑHIJKMNOPRSTUWXY[\^^`abdefghjjlmnoprrstuvvwxxyy{{|ŝ}~ ~HIIJLMNOQRTUUWXZ[\^_`abdefghjklmooprrstuvvxxyyz{{|ŝ}~~ÏFHIJKLMNOQRTUVWXZ[\^_`acdefghjklmopprrstuvvxxyyz{{| ~ÌEFHIJKLMNPQRTUVXYZ[\^_`bcdeghijklnopprrstuvvxxyyz{{||~ËDEFHIJKLMNPQRTUVXYZ[\^_abcdfghijklnopqrssuuvvxxyyz{{||~DÌEFHIJKLNOPQRTUVXYZ[]^_abcdfghijklnopqrstuuvvxxyyz{{||~ÉCDDEFHIJKLNOPQSTUVXYZ[]^_abddfghijklnopqrstuuvwxxyyz{{||~ÈBCDDEGHIJKLNOPQSTUVXYZ\]^`abddfghjjkmnopqrstuuvwxxyyz{{||~ÇABCDEEGHIJKLNOPQSTUVXYZ\]^`abddfghjjlmnopqrstuuvwxxyyz{{||~Ĉ@ABCDEEGHIJKMNOPQSTUVXYZ\]^`abdefghjjlmnopqrstuuvwxxyyz{{||~Ċ?@ABCDEEGHIJKMNOPQSTUVXYZ\]^`abdefghjjlmnoprrstuuvwxxyyz{{||~Ç>?@ABCDEEGHIJKMNOPQSTUVXYZ\^^`abdefghjjlmnoprrstuuvwxxyy{{|Ċ~=>?@ABCDEEGHIJKMNOPRSTUVXY[\^_`abdefghjjlmnoprrstuuvwxxyz{{|É}<=>@@ABCDEFGHIJKMNOPRSTUVXY[\^_`abdefghjjlmnoprrstuvvxxŭyz{{|É;<=>@@ABCDEFGHIJKMNOPRSTUVXY[\^_`abdefghjjlmnoprrstuvvxxŭyz{{|;Ê<=>@@ABCDEFGHIJKMNOPRSTUWXY[\^_`abdefghjklmnoprrstuvvxxŭyz{{Á|:;;<=>@@ABCDEFGHIJKMNOPRTTUWXY[\^_`abdefghjklmnoprrstuvvxxyyz{{€A9:;;<=>@@ABCDEFGHIJKMNOPRTTUWXY[\^_`abdefghjklmooprrstuvvxxyyz{{89:;;<=>@@ABCDEFHHIJLMNOPRTUUWXZ[\^_`abdefghjklmooprrstuvvxxyyz{889:;;<=>@@ABCDEFHHIJLMNOQRTUUWXZ[\^_`abdefghjklmopprrstuvvxxyyz7889:;<<=>@AABCDEFHIIJLMNOQRTUVWXZ[\^_`acdefghjklmopprrstuvvxxyy77899:;<<=>@AABCDEFHIJKLMNOQRTUVWYZ[\^_`acdefhijklnopprrstuvvxxy77Á899:;<<=>@ABBCDEFHIJKLMNPQRTUVXYZ[\^_`bcdeghijklnopprsstuvvxx677Á899:;<<=>@ABBCDEFHIJKLMNPQRTUVXYZ[\^_abcdfghijklnopqrssuuvvx6677Á89::;<==>@ABCCDEFHIJKLNOPQRTUVXYZ[]^_abcdfghijklnopqrstuuvv56677Â89::;<=>?@ABCDDEFHIJKLNOPQSTUVXYZ\]^`abddfghijklnopqrstuuv5567789::;<=>?@ABCDEEGHIJKMNOPQSTUVXYZ\]^`abddfghjjkmnopqrstuu45667789:;;<=>@@ABCDEFGHIJKMNOPRSTUVXY[\]^`abdefghjjlmnopqrstu4456677Á899:;<<=>@AABCDEFHHIJLMNOPRTTUWXY[\^_`abdefghjjlmnopqrst44556677Â89::;<<=>@ABBCDEFHIJJLMNOQRTUUWXZ[\^_`abdefghjjlmnopqrs3445567789::;<==>@ABCCDEFHIJKLMNPQRTUVWXZ[\^_`abdefghjjlmnopqr33445667789:;;<=>?@ABCDDEFHIJKLMNPQRTUVXXZ[\^_`abdefghjjlmnopq3344556677Â899:;<<=>@@ABCDEFGHIJKLNOPQRTUVXYZ[\^_`abdefghjjlmnop233445567789::;<<=>@AABCDEFGHIJKMNOPQSTUVXYZ[\^_`abdefghjjlmno2334455667789::;<=>?@ABBCDEFHIIJLMNOPRSTUVXYZ[\^_`acdefghjjlmn223344556677Â899:;<<=>?@ABCDDEFHIJJLMNOPRSTUVXYZ[]^_`acdefghjjkl2233445566778Ê9::;<<=>@@ABCDDEFHIJKLMNOQRTTUVXYZ[]^_`acdefghjjk2233445678Í9:;;<==>@ABBCDEFGHIJKLMNPQRTUUVXYZ[]^_`abdefghij2233456789Ï:;<<=>?@ABBCDEFGHIJKLNNPQRTUUWXYZ[]^_`abdefghi223345678Î9::;<<=>@@ABCDDEFHHIJKMNNPQRTUUWXYZ[]^_`abdefgh2233456789:;;<==>@AABCDDEFHIIJLMNOPQRTUUWXYZ[]^_`abddfg223345678Ï9::;<<=>?@ABBCDEEFHIJJLMNOPQRTUUWXYZ[\^_`abcde2233456789:Ô;<<=>?@ABBCDEFGHIJJLMNOPQRTUUVXYZ[\^_`abcd23345678Ò9::;;<==>@@ABCCDEFGHIJJLMNOPQRTUUVXYZ[\^^`abc33456789:Ö;<<=>>@AABCDDEFGHIJKLMNOPQRTUUVXYZ[\]^_`a3345678Ó9::;;<<=>?@ABBCDDEFHHIJKLMNOPQRTTUVXYZ[\]^_`33456789:Ö;<<==>@@ABBCDDEFHHIJKLMNOPQRSTUVWXYZ[\^_34456789Ö:;;<<=>>@@ABBCDDEFHHIJKLMNOPQRSTUVWXYZ[\]4456789:;<Ü=>>@@ABBCDDEFHHIJJLMNNOQRSTUUVXYZ[\4456789:Ù;<<==>?@AABBCDDEFGHIJJKMNNOPQRTTUVWXYZ4456789:;<=ß>?@AABBCDDEFGHIJJKLMNOPQRSTUVWXY556789:;<=à>?@AABCCDEEFGHIJJKLMNOPQRSTUUVW556789:;<à=>>?@AABCCDDEFFHIIJKLMNNOPQRSTUVòħ²³³´´µµĥĥ··¸ıışŝğĵĵ½żÀÁÂÂùħ²²³³´µµĝĥ··¸¸ıışşğĵŝ½żÀÁÂñ°ħ²³³´´µµĥĥ··¸ıışŝğĵĵ½żÀÁÂĝ°ħ²²³³´µµĝĥ··¸¸ıışşğĵŝ½żÀÁ°ŭħ²³³÷´µµĥĥ··¸ıışŝğĵĵ½żÀÁ°öħ²³³´´µµĥ··ü¸ıışşğĵŝ½żÀÁÂöݰ°ħ²²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂùݰ°ħ²³³÷´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁ Äŭݰ°öħ²³³´´µµĥ··ŝ¸ıışğĵŝ½żÀÁ Äŝݰ°úħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁ Äöݰ°ħ²²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁ Äŝ­úݰ°ħ²³³÷´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁÂÄġĴ­ŻŻ°°ħ²³³û´µµĥ··ŝ¸ıışğĵŝ½żÀÁ ÄĴû­Ż°°ŭħ²³³û´µµĥ··ŝ¸ıışğĵŝ½żÀÁ ÄĴû­Ż°°öħ²³³´´µµĥ··ü¸ıışşğĵ½żÀÁ ÄŝĞĴĴû­Ż°°öħ²³³´´µµĥ··ü¸ıışşŝğĵĵ½żÀÁÂÄöŞĞĴĴ­­Ż°°úħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂÄíİŞĞĴĴ­­Ż°°ħħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂÄìİŞŞĞĴĴ­­Ż°°ħħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂöÄİİŞŞĞĴĴ­öݰ°ħħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂö¨İİŞŞĞĴĴ­öݰ°ħ²²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁÂġ§¨İİŞŞĞĴĴ­öݰ°ħ²²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀÁ§ö¨İİŞŞĞĴĴ­öݰ°ħ²²³³´µµûĥ··¸ıışŝğĵĵŝ½żÀÁ§ö¨İİŞŞĞĴĴ­öݰ°ħ²²³³´µµûĥ··¸ıışŝğĵĵŝ½żÀÁÂŝĤ§§ö¨İİŞŞĞĴĴ­ïݰ°ħ²²³³´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁÂŭĤ§§ö¨İİŞŞĞĴĴ­ïݰ°ħ²²³³´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁÂŝĤ§§ö¨İİŞŞĞĴĴ­ïݰ°ħ²²³³´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁÂï¤Ĥ§§¨¨İİŞŞĞĴĴ­úݰ°ħ²³³÷´µµĥĥ··¸ıışŝğĵĵŝ½żÀÁ¤ĤĤ§§¨¨İİŞĞĞĴĴ­úݰ°ħ²³³÷´µµĥĥ··¸ıışğĵŝ½żÀÁÂŝ¤¤ĤĤ§§¨¨İİŞĞĞĴĴ­úݰ°ħ²³³û´µµĥ··ŝ¸ıışğĵŝ½żÀÁÂŝ£¤¤ĤĤ§§¨¨İİŞĞĞĴĴ­úݰ°ħ²³³û´µµĥ··ŝ¸ıışğĵŝ½żÀÁÂŭ˘£¤¤èĤĤ§§¨¨İİŞĞĞĴĴ­ŻŻ°°ħ²³³û´µµĥ··ŝ¸ıışğĵŝ½żÀÁû¢££¤¤ôĤĤ§§¨¨İİŞĞĴĴö­ŻŻ°°ħ²³³û´µµĥ··ŝ¸ıışğĵ½żÀÁûĦ˘££¤¤ùĤĤ§§¨İİŭŞĞĴĴû­Ż°°öħ²³³´´µµĥ··ü¸ıışşğĵ½żÀÁĦü˘££¤¤ŭĤ§§ŝ¨İİŭŞĞĴĴû­Ż°°öħ²³³´´µµĥ··ü¸ıışşŝğĵĵ½żÀÁĦü˘££¤¤ŭĤ§§ŝ¨İİŭŞĞĴĴû­Ż°°úħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀŝÁĦĦ˘ŝ£¤¤ŝĤ§§ŝ¨İİîŞĞĴĴ­­Ż°°ħħ²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żÀŝ ĦĦ˘ŝ£¤¤ŝĤ§§ö¨İİŞŞĞĴĴ­öݰ°ħ²²³³´µµĝĥ··¸¸ıışşŝğĵĵ½żüÀ  ĦĦ˘ŝ£¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­ïݰ°ħ²²³³´µµĥĥ··¸ıışŝğĵĵ½ż Ħü˘££¤¤ĤĤ§§¨¨İİŞĞĞĴĴ­úݰ°ħ²³³÷´µµĥĥ··¸ıışŝğĵĵ½żüŸ  ĦĦ˘£¤ŭĤ§§ŝ¨İİŭŞĞĴĴö­ŻŻ°°ħ²³³÷´µµĥĥ··¸ıışŝğĵĵ½żŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴû­Ż°°ŭħ²³³û´µµĥ··ŝ¸ıışŝğĵĵ½úżŸŸ  ĦĦ˘ŝ£¤¤ŝĤ§§ò¨İİŞŞĞĴĴ­­Ż°°öħ²³³´´µµĥ··ŝ¸ıışŝğĵĵ½úžŸŸ  ĦĦ˘£¤ĤĤ§§¨¨İİŞŞĞĴĴ­ŝݰ°öħ²³³´´µµĥ··ŝ¸ıışŝğĵĵ½üžŸŸ  Ħ˘ŝ£¤¤ŭĤ§§¨İùŞĞĞĴĴ­öݰ°ħħ²³³´µµŝĥ··ŝ¸ıışŝğĵĵ½ĝžžŸŸ  ĦĦ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴŝ­öݰ°ħ²²³³´µµŝĥ··ŝ¸ıışŝğĵĵ½žŸ Ħ˘£¤üĤĤ§§ŝ¨İİŭŞĞĴĴò­ŻŻ°°ħ²²³³´µµŝĥ··ŝ¸ıışŝğĵĵŝ½žžŸ Ħ˘ŝ£¤¤ìĤĤ§§¨¨İİŞŞĞĴĴ­­Ż°°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵžŸ Ħ˘£¤ŝĤ§§ŝ¨İİġŞĞĞĴĴ­­Ż°°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışüğĵĵžžŸ Ħ˘ŝ£¤¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŭğĵžžŸ Ħ˘£¤Ĥ§¨İŭŞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğžžŸ Ħ˘£¤ŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışžŸ Ħ˘£¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ùݰ°ħħ²³³ŝ´µµŝĥ··ŝ¸ıışžŸ Ħ˘£¤ŝĤ§§¨İïŞĞĞĴĴ­­ŻŻ°°ħħ²³³ŝ´µµŝĥ··¸ıžŸ Ħ˘£¤üĤĤ§§¨İŭŞĞĴĴ­Ż°ħŝ²³³ŝ´µµŝĥ··¸ıžŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­Ż°ħŝ²³³ŝ´µµĥ·¸ŭıžŸŸ Ħ˘£¤ŝĤ§§ŝ¨İİŞŝĞĴĴ­Ż°ŭħ²³³´µĥ·ŝ¸ŸŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴ­Ż°ŭħ²³³´µŝĥ··Ÿ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­Ż°ĝħ²²³³´´µµĥü·ŸŸ  Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°üħ²²³³ŝ´µµĥ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ħŝ²³³´µ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ħŝ²³³´µ  Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°üħ²²³³´Ħ˘£¤Ĥ§¨İüŞĞĞĴĴ­Ż°üħ²²³³´ŝ ĦĦ˘£¤Ĥ§¨İŞ Ħ˘£¤Ĥ§¨İ ŞĞŞ Ħ˘£¤Ĥ§¨İ Ş ĞŞ Ħ˘£¤Ĥ§¨İ Ş ĞŞ Ħ˘£¤Ĥ§¨İ ŞĞŝŞ  Ħ˘£¤Ĥ§¨İ ŞĞŝŸ  Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ Ş ĞŸ Ħ˘£¤Ĥ§¨İŞ ĞŸ Ħ˘£¤Ĥ§¨İ Ş ĞŸ Ħ˘£¤Ĥ§¨İŞ ĞŸ Ħ˘£¤Ĥ§¨İŞ ĞŝžŸŸ Ħ˘£¤Ĥ§¨İŞ ĞžŸ Ħ˘£¤Ĥ§¨İŞ ĞžŸ Ħ˘£¤Ĥ§¨İŞĞžŸ Ħ˘£¤Ĥ§¨İŞĞŝžžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İŞĞžŸ Ħ˘£¤Ĥ§¨İŞĞžŸ Ħ˘£¤Ĥ§¨İŞĞŝœžŸ Ħ˘£¤Ĥ§¨İŞĞœžŸ Ħ˘£¤Ĥ§¨İŞŝĞœœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŞŝ›œœžŸ Ħ˘£¤Ĥ§¨İŞ›œžŸ Ħ˘£¤Ĥ§¨İŞ›œžŸ Ħ˘£¤Ĥ§¨İŞ›œžŸ Ħ˘£¤Ĥ§¨İŝŞ››œžŸ Ħ˘£¤Ĥ§¨İ›œžŸ Ħ˘£¤Ĥ§¨İ›œžŸ Ħ˘£¤Ĥ§¨İ›œžŸ Ħ˘£¤Ĥ§¨ŝİ››œžŸ Ħ˘£¤Ĥ§¨ŝš››œžŸ Ħ˘£¤Ĥ§¨š›œžŸ Ħ˘£¤Ĥ§ü¨šš››œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥ§š›œžŸ Ħ˘£¤Ĥŝ§šš›œžŸ Ħ˘£¤Ĥš›œžŸ Ħ˘£¤ŝĤšš›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š ›œžŸ Ħ˘£¤ŝšš ›œžŸ Ħ˘£¤š ›œžŸ Ħ˘£¤š ›œžŸ Ħ˘£¤š ›œžŸ Ħ˘£ŝ¤šš ›œžŸ Ħ˘£š ›œžŸ Ħ˘£š ›œžŸ Ħ˘£š› œžŸ Ħ˘ŝ£šš› œžŸ Ħ˘› œžŸ Ħ˘› œžŸ Ħŝ˘›› œžŸ ĦŝzyyxvĈutssrpponmkkjhgfedbba_^\\ZYXVUTSRQONMLJJIHFEDDCBA@?>=<<{zyyxĈwvvutsrrpponlkjjhgfedba`_^\[ZXWVUTRQPONMKJIHGFEDCBBA@>==<{{Ázyyxxwvvutsrrpponlkjihgfedba`^]\[YXWVUSRQONMLKJIHFEDDCBA@?>=<|{{úzyyxxvvÉutsrrppomlkjhhgedcba_^]\ZYXVUTSRPONMKJIHGFEDCBBA@>==||{{Äzyyxxvvuutsrqponmlkjhhfedbb`_^\[ZYWVUTRQPNNLKJIHFEEDCBA@?>=||{Ċzyyxxvvuutsrqponmlkjhgfedba`_^\[ZXWVUTRQONMLJJIHFEDCCBA@>>||{Ċzyyxxvvuussrqponmkjihgfedba`^]\[YXVUTSRPONMKJIHGFEDCBAA@>~||{Ċzyyxxvvutssrpponlkjihgedcba_^\\ZYXVUTRQPONLKJIHFEEDCBA@?~~||{Èzyyxxvvutsrrppomlkjhhfedbb`_^\[ZYWVUTRQPNMLKJIHFEDCCBA@~~|{yÌxwvvutsrrponmlkjhgfedba`_^\[ZXWVUTRQONMLJJIGFEDCBBA~~|{Ézyyxxwvvutsrqponmlkjhgfedba`_]\[YXVUTSRPONMKJIHGFEDCBA~~|{Êzyyxxwvuutsrqponmkjihgfedba`^]\ZYXVUTRQPONMKJIHFFEDCB~~|{Ëzyyxxvvuussrqponlkjihgfdcba_^\\ZYXVUTRQPONLKJIHFEDDC~~|{Ìzyyxxvvutssrpponlkjihgedcb`_^\[ZYWVUTRQPNMLKJIHFEDC~~|{Ízyyxxvvutssrpponlkjhhfedbb`_^\[ZYWVUTRQONMLKJIHFED~~ŝ}||{Îzyyxxvvutsrrppomlkjhhfedba`_^\[ZXWVUTRQONMLJJIGFE~~ŝ}||{Ïzyyxxvvutsrrppnmlkjhgfedba`_^\[YXVVUSRQONMLJIIGF~~ŝ}||{zyyxwvvutsrrponmlkjhgfedba`_]\[YXVUUSRPONMKJIHG~ ~|{yÔxwvvutsrqponmlkjhgfedba`_]\[YXVUTSRPONMKJIH~ ~|{Ñzyyxxwvvutsrqponmlkjhgfedba`^]\ZYXVUTSQPONMKJI~ ~|{Òzyyxxwvvutsrqponmkjihgfedba`^]\ZYXVUTRQPONMKJ~ ~|{Ózyyxxwvuutsrqponmkjihgfecba`^]\ZYXVUTRQPONLK~ ~|{Ôzyyxxvvuutsrqponmkjihgfecba_^][ZYXVUTRQPONL~~|{Ôzyyxxvvuutsrqponmkjihgfdcba_^\[ZYXVUTRQPOM}~~|{Ôzyyxxvvuutsrpponlkjihgfdcba_^\[ZYXVUTRQPO|}~~|{Ôzyyxxvvuussrpponlkjihgedcba_^\[ZYXVUTRQP||}~~|{Ĝzyyxxvvutssrpponlkjihgedcb`_^\[ZYWVUTRQ||ŝ}~~|{Ĝzyyxxvvutssrpponlkjihfedcb`_^\[ZYWVUTR{||~|{Ĝzyyxxvvutssrpponlkjhhfedbb`_^\[ZYWVUT{{||~|{Ûzyyxxvvutssrpponlkjhhfedbb`_^\[ZXWVU{{|~ŝ}||{Ûzyyxxvvutsrrppomlkjhhfedba`_^\[ZXWVz{{|~ŝ}||{Ùzyyxxvvutsrrppnmlkjhgfedba`_^\[ZXVyz{{||~ŝ}||{Ùzyyxwvvutsrrponmlkjhgfedba`_]\[YXyyz{{||~|{yxŬwvvutsrqponmlkjhgfedba`_]\[Yxyyz{{||~|{Úzyyxxwvuutsrqponmkjihgfedba`^]\Zxxyyz{{|ŝ}~ ~ŝ}||{Úzyyxxvvuussrpponlkjihgfdcba_^\\vxxyyz{{|ŝ}~ ~|{Úzyyxxvvutsrrpponlkjhhgedcb`_^\vvxxyyz{{|ŝ}~ ~ŝ}||{yxŜwvvutsrrppomlkjhhfedbb`_^uvvxxyyz{{|ŝ}~ ~|{Ùzyyxxwvuutsrqponmlkjhgfedba`_uuvvxxyyz{{|ŝ}~ ~|{yxvusärpponmkjihgfedba`tuuvvxxyyz{{|ŝ}~~|{Ûzyyxxwvvutsrrpponlkjihgedcbastuuvvxxyyŝz{{|}~ŝ}||{yxvusèrqponmlkjhgfedbbrsstuvvxxyŝz{{|{Özyyxxwvvutsrrpponmkjihgfedbqrsstuvvwxxyyz{{|{üzyyxxvuâtsrqppomlkjihgedcpqrrstuvvwxxyyŝz{{ |{ŝzyyxßwvvutssrpponmkkjhgfedopprrstuuvvxxyŝz{{ |{ŝzyyxÛwvvuussrqppomlkjihgfenopprrstuuvvwxxyyŝz{{|{yxßwvvuutsrrpponmlkjhhgelnoopqrsstuvvxyz {ŝzyyxŝwvvŜutssrqppomlkjihgfklmoopqrrstuuvvwxxyŝz{ {ŝzyyxŝwvvusrpèonmkkjhhgjklmnopprrsstuvvŝwxxyzyxŝwvvusrpoèmlkjihgijklmnoppqrsstuuvvŝwxxyxvusröqppommkkjhhjñklmoopqrrsstuuvvwxyxŝwvvusràqpponmlkjihfghijklmnoppqrrsstuuvvŝwxxŝwvvusrŜqppoomlkjjhefghijkklmooppqrrsstuuvvw xwvuÙtssrrqppoommkkjhdefghhijklmnoopqqrrsstuuvwvusrÛqppoommkkjibddefghijkklmnoppqqrrssttuu vuütssrrqppoommlkjjabcdefghhijklmmnoppüqrrsstuvuŝtssrpomèlkjj`abbddefghijjklmmnoppŝqrrst utsrŝqppomálkkj^_`abcdefgghijjklmmnooppqqrrstsrpomlkkj]^_`abbcdefghhijjklmmnooppqr srŝqppomàlkkj[\]^_`abcddefghhijjkklmnnooppqrŝqppoŬnmmlkkjZ[\]^^_`abcddefghhiijkklmmnoopqrqpomÚlkkjXYZ[\]^_`aabcddefghhiijjkklmmnnooppoŝnmmkÜjWXYZ[[\]^_`abbcddefgghhijjkkllmmnnoo poŝnmmŝlkkjÂÁÀżŝ½ĵĵğşı¸·ŝĥµµù´³³²²ħ°°ûŻ­ĴĴôĞŞŞİݨ¨§§ĤĤÂÂÁÀż½ĵŝğşşıŝ¸··òĥµµ´´³³²ħħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§ŭĤÂÂÁÀż½ĵŝğşşı÷¸··ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴġĞŞŞİݨ¨§§ĤÂÁÀż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§ÂÁÀżŝ½ĵĵğşıŝ¸··öĥµµ´´³³²ħ°°ŝŻó­ĴĴĞŞŞİݨ¨§§ÂÁÀżŝ½ĵĵŝğşşıŝ¸··ûĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİü¨§§ÂÁÀż½ĵŝğşşı︷·ĥĥµµ´³³²²ħ°°Żô­ĴĴĞĞŞİݨ¨§ÂÁÀż½ĵŝğşşı¸·ŝĥµµö´³³²ħħ°°Żġ­ĴĴĞŞŞİݨ§ÂÁÀż½ĵğşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨ÂÁÀżŝ½ĵĵğşıŝ¸··ûĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİÂÁÀżŝ½ĵĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Żö­ĴĴĞĞŞİİÄÂÁÀżŝ½ĵĵŝğşşı︷·ĥĥµµ´³³²²ħ°°Żö­ĴĴĞŞŞİÄÄÂÁÀż½ĵŝğşşı¸·ŝĥµµí´³³²ħħ°°Ż­­ĴĴĞŞİÄÄÂÁÀż½ĵŝğşşı¸·ŝĥµµú´³³²ħ°°ûŻ­ĴĴŭĞŞÄÄÂÁÀż½ĵŝğşşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴŝĞÄÄ ÂÁÀżŝ½ĵĵğşıŝ¸··öĥµµ´´³³²ħ°°ûŻ­ĴĴÄ ÂÁÀżŝ½ĵĵğşıŝ¸··ûĥµµ´³³ô²ħ°°ŻŻ­ĴĴÄÄ ÂÁÀżŝ½ĵĵğşıŝ¸··ûĥµµ´³³ú²ħ°°Żŭ­ĴÄÄ ÂÁÀżŝ½ĵĵŝğşşı÷¸··ĥĥµµ´³³ú²ħ°°Żŝ­ÄÄÂÁÀżŝ½ĵĵŝğşşı︷·ĥĥµµ´³³²²ħ°°ŻŝÄÄÂÁÀżŝ½ĵĵŝğşşı븷·ĥĥµµ´³³²²ħ°°ŻÄÄÂÁÀżŝ½ĵĵŝğşşıû¸··ĥµµġ´³³²²ħ°°ŻÄÂÁÀż½ĵŝğşşı¸·ŝĥµµö´³³²²ħ°°ŻÄÂÁÀż½ĵŝğşşı¸·ŝĥµµ÷´³³²ħħ°°ÄÂÁÀż½ĵŝğşşı¸·ŝĥµµĝ´³³²ħħ°ÄÂÁÀż½ĵŝğşşı¸·ŝĥµµù´³³²ħ°ÄÂÁÀż½ĵŝğşşı¸·ŝĥµµú´³³²ħÄÂÁÀż½ĵŝğşşı¸·ŝĥµµû´³³²ÄÂÁÀż½ĵŝğşşıŝ¸··ĝĥµµ´´³³ÄÂÁÀż½ĵŝğşşıŝ¸··ĝĥµµ´´³ÂÄÂÁÀż½ĵğşıŝ¸··ĝĥµµ´´ÂÂÄ ÂÁÀżŝ½ĵĵğşıŝ¸··ûĥµµ´Â Ä ÂÁÀżŝ½ĵĵğşıŝ¸··ûĥµµÁ ÄÂÁÀżŝ½ĵĵŝğşşı÷¸··ĥĥµÁÁÂ Ä ÂÁÀżŝ½ĵĵŝğşşıú¸··ĥĥÁÁ Ä ÂÁÀż½ĵŝğşşı¸·ŝĥÁÁ Ä ÂÁÀż½ĵŝğşşı¸·ŝÀÁÁÂÂÁÀżŝ½ĵĵğşıú¸··ÀÀÁÁÂÂÁÀżŝ½ĵĵŝğşşıú¸·żÀÀÁÁÂÂÁÀż½ĵŝğşşıú¸żżÀÀÁÁÂÂÁÀż½ĵŝğşşıŝ¸żżÀÁÂÂÁÀżŝ½ĵĵğşıżÀÁÂÂÁÀż½ĵŝğşşıŝżżÀÁÂÂÁÀżŝ½ĵĵŝğşşüıżżÀÁÂÂÁÀżŝ½ĵĵğşŝıżÀÁÂÂÁÀż½ĵŝğşşŝ½żÀÁ ÂÁÀżŝ½ĵĵğş½żÀÁÂÂÁÀż½ĵùğşşĵ½½żÀÁÂÁÀżŝ½ĵĵŭğşĵĵŝ½żÀÁ ÂÁÀżŝ½ĵĵüğşğĵĵ½żÀ ÁÂÁÀż½ĵğĵ½żÀÁÀżŝ½ĵĵûğşşğĵĵŝ½żÀÁÀż½ĵŝğşşŝğĵĵ½żÀÁÀż½ĵŝışşğĵ½żÀ ÁÀż½ĵışŝğĵĵ½ż ÀŝÁÀÀż½ĵışğĵ½żÀż½ĵ¸ışğĵ½ żÀ ż½ĵ·ŝ¸ıışŝğĵĵ½ż½ĵ·¸ışğĵ½ż½ĵŝĥ··¸ışğĵ½ ż ½ĵüµĥĥ··¸ışğĵ½½ĵµĥ·¸ışğĵ½½ĵŝ´µµĥ·¸ışğĵ½½ĵŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžœŞİ¨§Ĥ¤£˘Ħ ŸžŝœŞŞİ¨§Ĥ¤£˘Ħ ŸžŝœŞ Şİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ ŸžĞ Şİ¨§Ĥ¤£˘Ħ ŸžŝĞĞ Şİ¨§Ĥ¤£˘Ħ ŸžĞŞİ¨§Ĥ¤£˘Ħ Ÿž ĞŞİ¨§Ĥ¤£˘Ħ Ÿž ĞŞİ¨§Ĥ¤£˘Ħ ŸŝžĞ ĞŞİ¨§Ĥ¤£˘Ħ Ÿ ĞŞİ¨§Ĥ¤£˘Ħ Ÿ ĞŞİ¨§Ĥ¤£˘Ħ ŸĞŞİ¨§Ĥ¤£˘Ħ ŸĞŞİ¨§Ĥ¤£˘Ħ ŸĞŞİ¨§Ĥ¤£˘Ħ ŝŸĞĞŞİ¨§Ĥ¤£˘Ħ ĞŞİ¨§Ĥ¤£˘Ħ ĞŞİ¨§Ĥ¤£˘Ħ ŝŞĞĞ Şİ¨§Ĥ¤£˘Ħü ŞŞĞĞ Şİ¨§Ĥ¤£˘ĦŞĞ Şİ¨§Ĥ¤£˘ĦŞĞŞİ¨§Ĥ¤£˘ĦŞĞŞİ¨§Ĥ¤£˘ŝĦŞŞĞŞİ¨§Ĥ¤£˘ŞĞŞİ¨§Ĥ¤£˘ŞĞŞİ¨§Ĥ¤£˘ŞĞ Şİ¨§Ĥ¤£ŭ˘İŞŞĞ Şİ¨§Ĥ¤£İŞĞŞİ¨§Ĥ¤£İŞĞ Şİ¨§Ĥ¤£İ ŞĞ Şİ¨§Ĥ¤£ŝ¨İİ ŞĞ Şİ¨§Ĥ¤ü£¨¨İİ Ş Ğ Şİ¨§Ĥ¤¨İ Ş Ğ Şİ¨§Ĥ¤ŝ§¨¨İ Ş Ğ Şİ¨§Ĥ¤§¨İ ŞĞ Şİ¨§Ĥ¤§¨İ Şİ¨§Ĥ¤§¨İŞİ¨§Ĥŝ¤§§¨İŞİ¨§Ĥŭ¤Ĥ§§¨İŞİ¨§ĤĤ§¨İŞİ¨§ĤĤ§¨İŞİ¨§ĤĤ§¨İŞİ¨§ĤĤ§¨İŞİ¨§ĤĤ§¨İ Şİ¨§Ĥŝ¤Ĥ§¨İŞİ¨§Ĥ¤Ĥ§¨İ¨§Ĥ¤Ĥ§¨İ¨§Ĥ¤Ĥ§¨İ¨§Ĥŭ£¤¤Ĥ §¨ §Ĥŝ££¤Ĥ §¨ §Ĥŝ££¤Ĥ § ¨ §Ĥŭ˘££¤Ĥ"§Ĥü˘˘££¤Ĥ§Ĥŝ˘˘£¤Ĥ§Ĥŝ˘˘£¤Ĥ§Ĥù;::988776543210ŝù;::98877654321 0ŝù<;:99877654321 0ŝĝ<;::988776ŝ544ŝ3221 0ŝ<ú;:998776543210/ŝ÷=<;::988776ú544332210/ŝ÷=<<;:998776543210/ŝö>=<;;:988776ú544332210/ŝé>==<;::988776655443322110/ŝġ@>=<<;:9987765ü4332210/ŝô@?>=<<;:988776ĝ5443322110/ŝóA@?>=<;;:98877ö655443322110/ŝĉBA@>>=<;::988776655443322110/ŝòCBA@>==<;::987765ü4332210/ŝñCBBA@>=<<;:998776ĝ5443322110/ŝDCBBA@>=<<;:998776ĝ5443322110/ŝïEDCBAA?>=<<;:998776ĝ5443322110ŭ/îFEDCBA@?>=<;;:98877ö655443322110ŝíGFEDCBA@?>=<;;:98877ö655443322110ŝìHFFEDCBA@?>=<;;:98877ö655443322110ŝëIHFEEDCBA@>>=<;::98877ö65544332211ŭ0êJIHFEEDCBA@>>=<;::98877ö65544332211ŝéKJIHFEDDCBA@>>=<;::98877ö65544332211ŝéLKJIHFEDDCBA@>>=<;::9877654ŝ3221ŝèMLKJIHFEDDCBA@>==<;::9877654ŝ3221ŝçNMLKJIHFEDCCBA@>==<;::987765ü43322ŭ1ĉPNMLKJIHFEDCCBA@>==<;::987765ĝ433221ċQPNMLKJIHFEDCCBA@>==<;:9987765ù43322äRQPNMLKJIHFEDCBBA@>=<<;:998776ĝ544332TRQONMLJJIHFEDCBBA@>=<<;:998776ù54433âUTRQONMLJJIGFEDCBAA@>=<<;:998776ú5443áVUSRQONMLJIIGFEDCBAA?>=<<;:988776û544àVUUSRPONMKJIHGFEDCBA@?>=<;;:98877ú6554ßXVUTSRPONMKJIHGFEDCBA@?>=<;;:98877û655ŜYXVUTRQPONLKJIHFEEDCBA@?>=<;;:98877ü65ŬZYXVUTRQPONLKJIHFEDDCBA@>>=<;::98877ŭ6Ü[ZYWVUTRQPNMLKJIHFEDDCBA@>==<;::98877ŝÜ\[ZXWVUTRQONMLKJIHFEDCCBA@>==<;::9877ŝĜ^\[YXWVUSRQONMLJJIGFEDCBBA@>=<<;:99877Ĝ^]\[YXVUTSRPONMKJIHGFEDCBAA@>=<<;:9987Ĝ_^\\ZYXVUTRQPONMKJIHGFEDCBA@?>=<<;:998Ĝ`_^\[ZYWVUTRQPNNLKJIHFEEDCBA@?>=<<;:99Ĝa`_^\[ZXWVUTRQONMLKJIHFEDDCBA@?>=<;;:9Ĝba`^]\[YXVUUSRQONMLJJIHFEDDCBA@>>=<;;:bÚa_^\\ZYXVUTSRPONMKJIIGFEDCCBA@>>=<;;Ĝdba`_^\[ZXWVUTRQPONMKJIHGFEDCBBA@>>=<;Ĝdcba`^]\[YXWVUTRQPNNLKJIHGFEDCBBA@>>=<Ĝedbb`_^\\ZYXVUTSRQONMLKJIHFFEDCBBA@>==Ĝedcba`_^\[ZYXVUTSRPONMLKJIHFEEDCBAA@>=Ĝfedcba_^]\[YXWVUTRQPONMLJJIHFEEDCBAA@>Ĝgeedba`_^\\ZYXVVUTRQPONMKJJIHFEEDCBAA@Ĝgfedcba`_^\[ZYXVUTSRQPNNLKJIIHFEDDCBAAĜhgeedbb`_^]\[YXWVUTSRQONNLKJIIHFEDDCBBĜhgfedcba`_^\\ZYXWVUTRRPONMLKJIIHFEDDCBhÚgeedbba_^]\[ZYXVVUTRQPONMLKJIIHFEEDChÚgfedcba`_^]\[ZYXVUUTRQPONMLKJIIHFEEDhgÜeddbba__^\\[YXWVUTSRQPONMLKJIIHFEEĜihhgfedcba`_^]\[ZYXWVUTSRQPONMLKJIIHFFĜihhgfeddbba`_^]\[ZYXVVUTSRQPONMLKJIIHGĜjhhggeedcbaa_^^\\[ZYXVVUTSRQPONMLKJJIHŝjhhÜgfeddbba`_^^\[[YYXVVUTSRQPONMLKJJIĜjihhgfeedcbba`_^]\[ZYXXVVUTSRQPONNMLKJĜjihhggeeddbba`__^]\[ZYXXVUUTSRQPONNMLKĜjihhggfeedcbba`_^^\\[ZYXXVUUTTRQPONNMLŝ¤¤ü£˘˘ĦĦ Ÿž œŝA¤ü£˘˘ĦĦ Ÿž œŝAŭĤ¤¤£˘Ħ Ÿž œŝAüĤ¤¤ü£˘˘ĦĦ Ÿž œŝAĤŝ¤¤£˘Ħ Ÿžœ›ŝ@û§Ĥ¤¤ü£˘˘ĦĦ Ÿžœ›ŝ@û§ĤĤ¤¤£˘Ħ Ÿžœ›ŝ@§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›ŝ@§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›ŝ@ù¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿžœ›ŝ@¨§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›ŝ@ŭݨ§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›ŝ@İŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›ŝ@İŝ¨§§ŭĤ¤¤£˘Ħ Ÿžœ›ŝ@ŝŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ Ÿžœ›ŝ@ŭĞŞİİù¨§§ĤĤ¤¤£ŝ˘ĦĦü ŸŸžžœ›ŝ@óĴĞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœŭ›@òĴĞĞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœŝ@ĴĞġŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ ŸžœŝAö­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦ ŸžœŝAġ­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦ ŸžŭœAö­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦ ŸžŝAö­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦ ŸžŝAöŻ­­ĴĴĞŞİİŝ¨§§öĤ¤¤££˘˘ĦĦ ŸžŝAġ°Ż­­ĴĴĞŞİİŝ¨§§öĤ¤¤££˘˘ĦĦ ŸžŝA°öŻ­­ĴĴĞŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ ŸžŝA°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ ŸžŭAŝħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ ŸžŝAŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£ŝ˘ĦĦ ŸŭžBü³²ħ°°ûŻ­ĴĴŭĞŞİİù¨§§ĤĤ¤¤£ŝ˘ĦĦ üŸžB³ŭ²ħ°°ûŻ­ĴĴôĞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦû ŸŸB³ö²ħ°°ŻŻ­ĴĴôĞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ ŭŸBŝ´³³ú²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ ŝBŭµ´³³ú²ħ°°Ż­ĴĴĞŞŞİݨ¨§§Ĥ¤¤ü£˘˘ĦĦŭ Bµö´³³²²ħ°°Żö­ĴĴĞŞŞİݨ§§üĤ¤¤ü£˘˘ĦĦŝCµê´³³²ħħ°°Ż­­ĴĴĞŞŞİݨ§§üĤ¤¤ù£˘˘ĦĦCŝĥµµú´³³²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ú£˘˘ĦCġ·ĥµµ´´³³²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£˘ŝC·ûĥµµ´³³ö²ħ°°ŻŻ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤£ŭ˘C·ĥµŝ´³³ú²ħ°°Żŝ­ĴĴôĞŞİݨ¨§§ĤĤ¤¤£ŝCû¸··ĥµµö´³³²²ħ°°Ż­ĴĴĞĞŞİݨ¨§§ĤĤ¤¤ŭ£Dŝ¸··öĥµµ´´³³²ħ°°ŝŻ­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤ŝDŭı¸··öĥµµ´´³³²ħ°°òŻ­­ĴĴĞŞŞİݨ§§Ĥû¤¤Dġı¸¸··ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴŭĞŞİİŝ¨§§Ĥü¤Dıŝ¸··ŝĥµµö´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§ûĤDıŝ¸··òĥµµ´´³³²ħħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§üĤDîşıı¸¸··ĥĥµµ´´³³²ħ°°ŝŻù­ĴĴĞĞŞİİŝ¨§§ŭĤEŝşııŝ¸··ŝĥµµŝ´³³ŭ²ħ°°ġŻ­­ĴĴĞĞŞİİŝ¨§§ŝEşıŝ¸··ŝĥµµù´³³²²ħ°°ġŻ­­ĴĴĞĞŞİİû¨§§Eşı¸·ĥµ´³²÷ħ°°ŻŻ­ĴĴüĞŞŞİİü¨§Eşıŝ¸··ŝĥµµŝ´³³ù²ħħ°°Żŝ­ĴĴüĞŞŞİİŭ¨Eşı¸·ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝFŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴùĞŞŞİİFŝğşşıŝ¸··ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴúĞŞŞİFğşı¸·ŝĥµµŝ´³³²ŝħ°°ŝŻŝ­ĴĴûĞŞŞFğşıŝ¸··ĥµŝ´³³ü²ħħ°°ŝŻŝ­ĴĴĞŝGŭĵğşşı¸·ŝĥµµ´³ü²ħħ°°ŝŻŝ­ĴĴŭĞGüĵğğşşı¸·ŝĥµµ´³ü²ħħ°°ŝŻŝ­ĴĴŝGüĵğğşşı¸·ĥµ´³ü²ħħ°°ŝŻ­ŭĴGĵŝğşşı¸·ĥµŝ´³³ü²ħħ°°ŝŻ­ŝGĵğşıŝ¸··ĥµŝ´³³ü²ħħ°°ŝŻŝHĵğşı¸·ŝĥµµŝ´³³ü²ħħ°°ŻŝHĵğşı¸·ĥµ´³²ħ°ŻŭHĵğşı¸·ĥµ´³ü²ħħ°°ŻŝHœ›šŝ@œ›š™ŭš@œ›š™ŝ?œ› š ™ŝ?œ› š ™ŝ?œ› š ™ŝ?œ› š ™ŝ?ŝœœ› š™ŝ?œ› š™ŝ?œ› š™ŝ?œ› š™ŝ?œ› š™ŝ?œ› š™ŝ?œ› š™ŝ?ŝžœ› š™ŝ?žœ› š™ŝ?žœ› š™ŝ?žœ› š™ŝ?žœ› š™ŝ?ŝŸžžœ› šŭ™?Ÿžœ› šŝ?Ÿžœ› šŝ@Ÿžœ› šŝ@Ÿžœ›šŝ@ŝ ŸŸžœ›šŝ@ Ÿžœ›šŝ@ Ÿžœ›šŝ@ Ÿžœ›šŝ@ŝĦ  Ÿžœ›šŝ@Ħ Ÿžœ›šŝ@Ħ Ÿžœ›šŝ@Ħ Ÿžœ›ŭš@ŝ˘ĦĦ Ÿžœ›ŝ@˘Ħ Ÿžœ›ŝ@˘Ħ Ÿžœ›ŝ@˘Ħ Ÿžœ›ŝ@˘Ħ Ÿžœ›ŝ@ŝ£˘˘Ħ Ÿžœ›ŝ@£˘Ħ Ÿžœ›ŝ@£˘Ħ Ÿžœ›ŝ@£˘Ħ Ÿžœŭ›@£˘Ħ ŸžœŝAŝ¤££˘Ħ ŸžœŝA¤£˘Ħ ŸžœŝA¤£˘Ħ ŸžœŝA¤£˘Ħ ŸžœŝA¤£˘Ħ ŸžœŝA¤£˘Ħ ŸžŭœA¤£˘Ħ ŸžŝAŝ¤¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŭA¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŝB¤£˘Ħ ŸžŝB¤£˘Ħ ŸŭžB¤£˘Ħ ŸŝB¤£˘Ħ ŸŝB¤£˘Ħ ŸŝB¤£˘Ħ ŸŝB¤£˘Ħ ŸŝB%˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙€€€€$ŝ öituuvvwxxyyŝz{{$ŝ ÷istuuvvwxxyŝz{{$ŝ ùhrsstuvvxyŝz{{$ŝ ĝfrrsstuvvxyŝz{{$ŝ ÷fpqrsstuvvxyŝz{{$ŝ öeppqrsstuvvxyüz{{#ŝ òdoppqrsstuuvvxxyŭz{#ŝ ôcnoppqrsstuvvxyŝz#ŝ óblnoppqrsstuvvxy$ŝ òaklnopprrsstuvvxy$ŝ îajklnopprrssuuvvwxxy$ŝ é_jkkmnopprrstuuvvwxxyy#ŝ í_hjklmnopqrrstuuvvxxŝy#ŝ é^hijklmoopqrssuuvvwxxy#ŝ ì]ghijklnopprrstuuvvxx$ŝ é\fghjjkmnopqrrstuvvwxx#ŝ é\eghijklmoopqrssuuvvxx#ŝ é[efghijklnopprrstuvvwx#ŝ é[defhhjklmnopqrssuuvvx#ŝ éZddfghijklnopprrstuvvw#ŝ éYcdefhhjklmnopqrssuuvv#ŝ éYbddfghijklnopprrstuvv#ŝ éXbcdefhhjklmnoprrstuvv#ŝ éXabdefghijkmnopqrssuuv#ŝ éWabcdeghijklmopprrstuv#ŝéW`bbdefghjjkmnopqrssuu#ŝéV`abddfghijkmnopqrrsuu#ŝéV_abcdeghijklmopprrstu#ŝéV_`bcdefghjkkmnopqrssu#ŝéV_`abdefghjjkmnopqrssu#ŝé3^_abddeghijklmopprrst#ŝé2^_abcdeghijklmoopqrss#ŝé2^_abcdeghhjjkmnopqrss#ŝé1^_abcdefghjjkmnopprrs#ŝé0^_abcdefghijklmopprrs#ŝé/^_abcdefghijklmoopqrr#ŝé/^_`abddeghijkkmnopprr#ŝé.^_`abddeghijjkmnoppqr#ŝé.^_`abddeghhjjklmoopqr#ŝé-^_aabddeghhjjklmnoppr#ŝé-^_abbddegghijkkmnoppq#ŝé-^_abbddegghijkkmmoopp#ŝé-^_abbddegghijjklmnopp#ŝé,__abbddefghijjklmmoop#ŝé,_`abcddefghhjjkklmnoo#ŝé,_`abcddefghhijkklmmoo#ŝé+_aabcddefghhijjkklmno#ŝé+_aabcddefgghhjjkklmmn#ŝñ+`abbcddefgghhjjkülmm#ŝ+aabbcddeegghhijjkŭlm#ŝú+aabbddeghüijjkk$ŝú+aabbddeghjk$ŝú+abbcddeŝfgghj$ŝú+abbcddeghŝijj$ŝú+abbcddeŝfgghŝi#ŝŝ,bbŝcddeŝfggh$ŝŝ,bbdeŝfggh$ŝŝ=<<;::99887765432 12345ëFEDDCBA@@>==<;;::988776543212345êHFEDDCBAA@?>=<<;::98877654321234ç5IHGEEDCBBA@?>=<<;::9988776543234çJIHGFEDCCBA@@>==<;;:9988776543234ĉKJIHGFEDCCBA@@>==<;;::98877654323ċLKJIHHFEDDCBAA@?>=<<;::99877654323NMKJIIHFEEDCBBA@?>=<<;::998877654323âONMLKJIHGEEDCBBA@?>=<<;::9988776543212áPONMLKJIHGFEDCBBA@@>=<<;;:9988776543212àQPONMLKJIHGFEDCBBA@@>==<;;:9988776543212ßSRPONMLKJIHGFEDCCBA@@>==<;;:99887765432 1Ŭ2TSRPONMLKJIHGFEDCCBA@@>=<<;;:99887765432 1ŬUTSRPONMLKJIHGFEDCBBA@?>=<<;::99887765432 1ŬVUTSRPONMLKJIHGFEDCBBA@?>=<<;::9887765432 1ÜXVUTSRPONMLJJIHFEEDCBBA@>>=<<;::9887765432 1ÛXWVUTRQPONMLJJIHFEDDCBAA@>==<;;:99887765432 1ÛZXWVUTRQPONMKJIIHFEDDCBA@@>=<<;::9887765432 1Ú[YXWVUTRQPNNLKJIHGFEDCBBA@?>=<<;::9887765432 1Ú\ZYXVUTSRQONMLKJIHFFEDCBAA@>==<;;:9987765432 1Ĝ0\[ZYXVUTRRPONMKJJIHFEDDCBA@?>=<<;::988776543210Ù]\[YXWVUTRQPNNLKJIHGFEDCBBA@>==<;::988776543210Ĝ^\\ZYXVUTSRPONMLJJIHFEDDCBA@?>=<<;::988776ŝ5443210^Ú\[ZXWVUTRQPNNLKJIHGFEDCBBA@>==<;::988776543210Ĝ_^\\ZYXVUTSRPONMLJJIHFEDCCBA@?>=<;;:998776543210×`^]\[YXWVUTRQONNLKJIHFEDDCBA@?>=<<;::988776ú544332210×`_^\[ZXWVUTRQPONMKJIHGFEDCBBA@>==<;::988776ú544332210×a_^]\[YXVUTSRQONMLJJIGFEDDBBA@?>=<;::988776ŝ544ŝ32210Ö/a`^]\[YXWVUSRQONMLJJIHFEDDCBA@?>=<<;:988776543210Ö/a`_]\[YXWVUTRQPNNLKJIHFFEDCBA@?>=<<;::98776543210É/a`_^\[ZXWVUTRQPNNMKJIHGFEDCBB@?>=<<;::988776655443322110Ġ/b`_^\[ZXWVUTRRPONMKJIHGFEDCBBA@>=<<;::98877ö655443322110Ġ/b`_^\[ZXWVUTRRPONMKJIHGFEDCBBA@>>=<;::988776ĝ5443322110Ġ/a`_^\[ZXWVUTRRPONMKJIHGFEDCBBA@>>=<;::988776ú544332210Ġ/a`^]\[YXWVUTRRPNNMKJIHGFEDCBBA@>>=<;::988776ú544332210Ġ/a_^]\[YXWVUTRQPNNMKJIHGFEDCBBA@>>=<;::988776ŝ544ŝ32210Öa_^\\[YXVVUSRQONNMKJIHGFEDCBBA@>>=<;::988776543210Ö`_^\[ZYXVUTSRQONNLKJIHFFEDCBBA@>>=<;::988776543210Ö_^]\[YXWVUTRRPONMKJJIHFFDDCBB@?>=<<;::988776543210Ö_^\\ZYXVVUTRQPNNMKJJHGFEDDCBA@?>=<<;::988776543210Ö^]\[YXWVUTSRQONNLKJIHGFEDDCBA@?>=<<;::98877654321Ġ0^\[ZYXVVUTRQPONMKJJIHFFEDCBBA@?>=<<;::98877654321\ĜZYXWVUTSRQONNLKJIHHFEDDCBBA@>>=<<;::988776ŝ544321Ö\[YXWVUTSRQPNNMKJJIHGFEDDCBA@@>>=<<;::98877654321Ö[YXXVUTTRQPONMLKJIHHFEDDCBBA@?>=<<;;::98877654321YĜXVVUTRRQONNMKJJIHGFEDDCBBA@>>=<<;::998877654321XVÚUTSRQONNMKJJIHGFEDDCBBA@@>>=<<;::99887765432Ġ1WVVUTSRQONNMLKJIHHFFEDDCBBA@?>==<<;::99887765432VĜUTRRQOONMLKJJIHGFEDDCBBA@@>>=<<;;::99887765432ÖUTTRRQONNMLKJJIHGFEDDCBBAA@?>==<<;;::9988776543áTSRRPONNMLKJJIHGFEEDCCBBA@@>>=<<ŝ;::ŝ98876543ÙSRQPONNMLKJJIHGFEEDDCBBA@@?>==<<;;::99887654üRQPNNèMKJJIIHGFEEDDCBBAA@?>>=<<;:987654ŜPONNMLKJJIHHGFEEDDCBBAA@@>>==<<;;::98765NôMLKJJIHHFFEDDôCBBAA@@>>==<<;:987 6èNMLKJJIIHGFFEDDCCBBAA@@>>ŝ=<<;:98 7 6ŭLKJJîIHGFFEEDDCCBBAA@@>>=<;:987JĝIHHGFFEDDŝCBBA@>=<;:987÷JIHHGFFEDDCBA@ŝ?>>=<;:98 78HûGFFEDDCBA@ŝ?>>=<;:98ú9GFFEDDCBA@ŝ?>>=<;:989:ŭFEDDCBA@ŝ?>>=<;: 989:DCBA@ŝ?>>=<;:9:;ü>=<; :9 :;<ĞŝŞİݨ§Ĥ¤£˘Ħ Ÿž žŸ ĦĴŭĞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿž žŸ ŝĦĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿž žŸ ŝ­ĴĴĞŝŞİİŝ¨§§Ĥ¤£˘Ħ Ÿž žŸ ÷­­ĴĴĞĞŞİݨ§üĤ¤¤£˘Ħ ŸžžŸŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤£˘Ħ ŸžžŸŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ ŸžžŸŭ°Żŝ­ĴĴüĞŞŞİİŝ¨§§Ĥ¤£˘Ħ Ÿžž°ŝŻŝ­ĴĴĞŝŞİİŝ¨§§Ĥ¤£˘Ħ Ÿž žñħ°°ŻŻ­­ĴĴĞĞŞİİŝ¨§§üĤ¤¤£˘Ħ Ÿž ž²ħ°°ŻŻ­­ĴĴĞĞŞİݨ§üĤ¤¤£˘Ħ Ÿž îž²²ħ°°ŻŻ­­ĴĴĞĞŞİݨ§üĤ¤¤£˘Ħ Ÿž î³²²ħ°°ŻŻ­­ĴĴĞĞŞİݨ§üĤ¤¤£˘Ħ Ÿž ³²ñħ°°ŻŻ­­ĴĴĞĞŞİİŝ¨§§Ĥ¤£˘Ħ Ÿž ì´³³²²ħ°°ŻŻ­­ĴĴĞĞŞİİŝ¨§§Ĥ¤£˘Ħ Ÿž ´³²ñħ°°ŻŻ­­ĴĴĞĞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿž µ´´³³²ħħ°°ŻŻ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿž µ´³ù²ħħ°°Żŝ­ĴĴĝĞŞŞİݨ¨§§üĤ¤¤£˘Ħ Ÿž ûĥµµ´³³ŭ²ħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿž ŝĥµµŝ´³³ŭ²ħ°°ñŻ­­ĴĴĞŞŞİݨ¨§§üĤ¤¤£˘Ħ Ÿžœŭ·ĥµµö´³³²²ħ°°Żŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœô·ĥĥµµ´´³³²ħ°°ŝŻù­ĴĴĞĞŞİİŝ¨§§üĤ¤¤£˘Ħ Ÿžœ·ŝĥµµö´³³²²ħ°°Żŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ·ĥµ´³ŭ²ħ°°ŝŻġ­ĴĴĞĞŞİݨ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœû¸··ĥµµö´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿžœò¸··ĥĥµµ´´³³²ħ°°ìŻ­­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœŝ¸··òĥµµ´´³³²²ħ°°Żŝ­ĴĴùĞŞİݨ¨§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœí›¸¸··ĥĥµµ´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœġ›¸¸··ĥĥµµ´³³ŭ²ħ°°ûŻ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤£ŝ˘ĦĦ Ÿžœ›ı¸··ĥĥµµ´´³³²ħ°°ŝŻ­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›ŭı¸··öĥµµ´´³³²²°°ŝŻ­ĴĴĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ›ŭı¸··òĥµµ´´³³²²ħ°°Żŝ­ĴĴùĞŞİݨ¨§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœ›ŭı¸··òĥµµ´´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§ŭĤ¤¤ü£˘˘ĦĦ ŝŸžžœ›ŭı¸··òĥµµ´´³³²²ħ°°Żŝ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ ŝŸžžœ›ı¸··ĥĥµµ´´³³²²°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›¸¸··ĥĥµµ´´³³²ħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›¸¸··ĥĥµµ´´³³²ħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœŝ¸··ŝĥµµù´³³²²ħ°°ŝŻġ­ĴĴĞŞŞİݨ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœñ¸··ĥĥµµ´´³³²²ħ°°ûŻ­ĴĴĝĞŞŞİݨ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ·ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ Ÿžœü·ĥĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžó·ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžŝĥµµŝ´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžµŝ´³³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤ŝ£˘˘Ħ Ÿžµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤ŝ£˘˘Ħ Ÿžŭµ´³³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžŝ´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿž³²ŝħ°°ŝŻ­ĴüĞŞŞİݨ§Ĥ¤£˘Ħ Ÿž³²ŝħ°°ŝŻ­ĴĞŞİ¨§Ĥ¤£˘Ħ Ÿ²ħ°Ż­ĴĞŞİ¨§Ĥ¤£˘Ħ  ŭ²ħ°°ŝŻ­ĴĞŞİ¨§Ĥ¤£˘Ħ °ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħ°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħü°ŻŻŝ­ĴĴŝĞŞŞİ¨§Ĥ¤£˘ĦŝŻ­ĴĞŞİ¨§Ĥ¤£˘Ħ˘ŝ­ĴĴĞŞİ¨§Ĥ¤£˘ŝ­ĴĴĞŞİ¨§Ĥ¤£˘£ŝ­ĴĴĞŞİ¨§Ĥ ¤£¤ĴĞŞİ¨§Ĥ¤ŝ£¤ ¤ĴĞŞİ¨§Ĥ ¤ŭĞŞŞİ¨§Ĥ¤ĤŞİ¨§Ĥ¤Ĥžœ ›š›žœ ›š›ŝŸžžœ ›š›Ÿžœ ›šŝ›ŸŸžœ ›šŸžœ ›šŸžœ ›šŝ ŸŸžœ ›š Ÿžœ ›š Ÿžœ ›š Ÿžœ ›šŝĦ  Ÿžœ ›šĦ Ÿžœ ›šĦ Ÿžœ ›šĦ Ÿžœ ›šŝ˘ĦĦ Ÿžœ ›š˘Ħ Ÿžœ›š˘Ħ Ÿžœ ›š˘Ħ Ÿžœ›š˘Ħ Ÿžœ›šŝ£˘˘Ħ Ÿžœ›š£˘Ħ Ÿžœ›šü™££˘˘Ħ Ÿžœ›š™£˘Ħ Ÿžœ›š™£˘Ħ Ÿžœ› š™£˘Ħ Ÿžœ› š™£˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™ŝ¤££˘Ħ Ÿžœ› š™£˘Ħ Ÿžœ› š™£˘Ħ Ÿžœ› š™£˘Ħ Ÿžœ› šŝ™££˘Ħ Ÿžœ›š£˘Ħ Ÿžœ›šŝ£˘˘Ħ Ÿžœ›šŝ£˘˘Ħ Ÿžœ›š˘Ħ Ÿžœ › š˘Ħ Ÿžœ › š˘Ħ Ÿžœ › š˘Ħ Ÿž œ › šĦ Ÿž œ › šĦ Ÿž œ › šĦ Ÿž œ›šŝĦ  Ÿž œ›š Ÿž œ› Ÿž œ› Ÿž  œ›ŝ ŸŸž  œ›Ÿž œ›Ÿž œ›Ÿž œ›Ÿž œ›œž *œž ,œž .œŝž 0œ678Ä9::;;<==>?@ABCCDEFFHIJJKMNNPQRSTUVWXY[[\^_`abcdefgghijkk566778Ä9::;;<==>?@ABBCDEEFHIIJKLMNOPQRTUVVXYZ[\]^_`abcdefghhij55667789Ë:;;<<=>?@ABBCDDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdeefghi556789:Í;<<=>>@AABCCDEFGHIJJKMNNPQRSTUVWXYZ[\]^_`abcdefgh4556789:Ï;<<==>?@ABBCDEEFHIIJKLMNOPQRTUUVXYZ[\]^_`abcdeef445678Ì9::;;<==>?@ABBCDDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde34456789:;<<=>>@AABCCDEFFHIJJKMMNOQQRTUVVXYZ[\]^_`abcd334456789:Ó;<<==>?@ABBCDEEFGIIJKLMNOPQRSUUVWXY[\\^_`abb3345678Ï9::;;<<=>?@ABBCDDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a2233456789:Ö;<<=>>@AABCCDEFFHIJJKMMNOQQRTUVVXYZ[\]^_`22345678Ô9::;;<==>?@ABBCDEEFGIIJKLMNOPQRSUUVWXY[\\^_223456789Ġ:;;<<=>?@ABBCDDEFGHIJKLMNOPQRSTUVWXYZ[\^11223456789:Ú;<<=>>@AABCCDEFGHIJJKMNNOQRSTUVWXYZ[\112345678Ĝ9::;;<==>?@ABCCDEFFHIJJKLMNOPRRTUVVXYZ[1123456789Û:;;<<=>?@ABBCDEEFHIIJKLMNOPQRTUVVXYZ11234567Ù899::;<<=>>@ABBCDDEFGHIJKLMNOPQRTUUVXY112345678Ü9::;<<=>>@AABCDDEFGHIJKLMNOPQRTUUVX1 12345678Ŭ9::;;<==>@AABCDDEFGHIJKLMNOPQRTUVV1 123456789à:;;<==>@AABCDDEFGHIJKLMNOPQRTUV00 123456789á:;;<==>@AABCDDEFGHIJKLMNOPRRTU001234567ß899:;;<==>@AABCDDEFHHIJKLNNOQRST001234567à899:;;<==>@AABCDDEFHIIJKMNNPQRT0 01234567á899:;;<=>>@ABBCDEEFHIJJLMNOPQR0 0123456789ä:;<<=>?@ABBCDEFGHIJKLMNOQR0//012345678ä9::;<<=>?@ABCDDEFHIJJKMNOPQ/ /012345678ċ9::;<==>@ABBCDEFGHIJKLMNOQ/ /012345ŝ677ä899:;<<=>?@ABCDDEFHIJJKMNOP/ /01234ü566778ĉ9::;<==>@ABBCDEFGHIJKLNNO/ /01234567ċ89::;<<=>?@ABCDDEFHIJJLMNO//012ĝ3445566778ç9:;;<=>?@ABBCDEFGHIJKMNO//01234ü566778ç9::;<<=>@ABBCDEFGHIJKMNN//012345678ç9::;<<=>@@ABCDEFGHIJKLNN//01234567ĉ899:;<<=>?@ABCDDEGHIJJLMN//01234567ĉ899:;<<=>?@ABCDDEGHIJJLMN//01234567ĉ899:;<<=>?@ABCDDEGHIJJLMN//012345678ç9::;<<=>@@ABCDDFGHIJKLNN/ /01234ü566778ĉ9::;<<=>@@BBCDEFGHIJKLNN0/ /012345678ç9::;<=>?@ABBCDEFGHIJKMNN00/012ŝ344ŝ5667ċ899:;<<=>?@ABBDDEFHHJJKMNO00/012345678ĉ9::;<<=>@@ABCDDFGHIJJLMNO0 012345678ċ9::;<<=>?@ABBCDEFGHIJKMNNP0 01234ü566778ċ9::;<=>>@@BBCDDEFHIJJLMNOP1101234ŝ56678ä9::;<<=>?@ABCDDEFGHIJKMNNOQ1123456789::;<<=>?@ABBCDEFGHIJJLMNOPR1 12345678â9::;<<=>?@ABBCDDEFHIJJKMNNPQR1 12345678á9::;<<=>?@@ABCDDEFGHIJKLNNOQRS1123456789:;<<=>?@@ABCDDEFGHIJJLMNOPRRT2 2345678ŝ9::â;<<=>?@AABCDDEFGHIJJLMNOPQRTT22345678û9::;<<ä=>?@ABBCDDEFGHIJJLMNNPQRSTU3345678ŝ9::ß;<<=>>@@ABBCDDEFGHIJJLMNNPQRSTUV3345678ŝ9::ŝ;<<á=>?@AABBCDDEFHHIJJLMNNPQRSTUVW445678ŝ9::ŝ;<<Ŝ=>>@@ABBCDDEFGHIIJKLMNNPQRSTUVWX455678ŝ9::ŝ;<<ù=>>?@ABBäCDDEFGHIJJKLMNOPQRSTUVWXY5566789:ŝ;<<Û=>>?@@ABBCDDEFGHHIJJKMNNOPQRTTUVWXYZ6678ŝ9::ŝ;<<Ù=>>?@@ABBCDDEEFGHIJJKLMNNOQRSTUUVXXYZ[7789:;<ġ=>>?@@ABBCDDäEFGHIIJJKMNNOPQRSTUVWXXY[\\7789:;<=ö>??@AABBCDDáEFGHHIJJKLNNOPQRSTTUVWXYZ[\]^7889:;<=>û?@@ABBŝCDDàEFGHHIJJKLMNNOPRRSTUVVXXYZ[\]^_889:;<÷=>>??@@ABBĜCDDEEFGHHIJJKLMNNOPQRSTUUVWXYZ[\\^^_`99::;<=Î>??@@AABBCCDDEFFGHHIJJKLMNNOPQRSTTUVWXXYZ[\]^^_`a::;<=>ú?@@AABBŝCDD×EFGGHIIJJKLMNNOPQRSTTUVWXXYZ[\]^^_`abb;;<<=>ú?@@AABBŝCDDEúFGHHIJJàKLMNNOPQRSTTUVWXXYZ[\\^^__aabcd<<=>?@ŝABBCD×EFGGHHIJJKLMMNNOPQRSTTUVWXXYZ[\\]^^_`abbdd=>?@ŝABBCDEÔFGHHIIJJKLMNNOOQQRSTTUVWXXYZ[\\]^^_`abbcddefĦ˘£¤üĤĤ§§¨İĝŞĞĞĴĴ­­ŝݰ°ŭħ²³³´µĥ·¸ışğĵĦ˘£¤ŝĤ§§¨İüŞĞĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışğĵĦ˘£¤Ĥ§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ħŝ²³³ŝ´µµĥ·¸ışğŭĵ ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışŝğ  Ħ˘£¤üĤĤ§§¨İüŞĞĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·¸ışŝŸ  Ħ˘£¤ŝĤ§§ŝ¨İİŞŝĞĴĴŝ­Ż°ŭħ²³³´µŝĥ··¸ışŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°üħ²²³³ŝ´µµĥ·ŝ¸ııŸ Ħ˘£¤üĤĤ§§¨İüŞĞĞĴĴŝ­ŝݰ°ħŝ²³³ŝ´µµĥ·¸ıŝžŸŸ Ħ˘£¤ŝĤ§§ŝ¨İİŞŝĞĴĴŝ­Ż°ŭħ²³³´µŝĥ··¸ŝıžžŸ Ħ˘£¤Ĥ§¨İŭŞĞĴĴ­ŝݰ°üħ²²³³ŝ´µµĥ·ŝ¸žžŸ Ħ˘£¤üĤĤ§§¨İüŞĞĞĴĴŝ­ŝݰ°ħŝ²³³ŝ´µµĥ·ŝžžŸ Ħ˘£¤Ĥ§ŝ¨İİŞŝĞĴĴŝ­Ż°ŭħ²³³´µüĥ··žŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ĝħ²²³³´´µµŭĥ·žŸ Ħ˘£¤üĤĤ§§¨İüŞĞĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµŝĥžŸ Ħ˘ŝ£¤¤ŝĤ§§¨İüŞĞĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµžŸ Ħ˘£¤Ĥ§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°üħ²²³³ü´µµ žŸ Ħ˘£¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ħŝ²³³ŭ´µ žŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ħŝ²³³ŝ´ žŸ Ħ˘ŝ£¤¤ŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³œ žŸ Ħ˘£¤ŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°úħ²²³³œœžŸ Ħ˘£¤ŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ûħ²²³œ œžŸ Ħ˘£¤ŝĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°üħ²³œ œžŸ Ħ˘£¤üĤĤ§§ŝ¨İİüŞĞĞĴĴġ­ŻŻ°°ħħ²œ œžŸ Ħ˘£¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­ŝݰ°üħ²œ››œžŸ Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ŝħ› ›œžŸ Ħü˘££¤¤ŝĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°ŝħ› ›œžŸ Ħ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ûݰ°ħ› ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİùŞĞĞĴĴ­ŝݰ°›œžŸ Ħ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴû­Ż°°›œžŸ Ħ˘ŝ£¤¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­üݰ°››œžŝŸ  Ħ˘ŝ£¤¤ŭĤ§§¨İŭŞĞĴĴŝ­üݰ°››œžŸ Ħ˘ŝ£¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­üݰ°››œžŸ Ħ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴù­Ż°°››œžŸ Ħ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴù­Ż°°››œžŸ Ħ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴù­Ż°°››œžŸ Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴüݰ°› ›œžŸ Ħ˘ŝ£¤¤ĤĤ§§¨¨İİŞŞĞĴĴ­ûݰ°œ› ›œžŸ Ħ˘ŝ£¤¤ŝĤ§§ŝ¨İİŭŞĞĴĴŝ­úݰ°œœ››œžŸ Ħ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­üݰ°œœ›œžŸ Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴû­Ż°°œžŸ Ħ˘ŝ£¤¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­ŝݰ° œžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ùݰ°ħœœžŸ Ħ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ŝħžŸ Ħ˘ŝ£¤¤üĤĤ§§ŝ¨İİüŞĞĞĴĴû­Ż°°ŭħ²žŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ² žŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²žŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°÷ħ²²³žžžžŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ûħ²³³žžŸ Ħ˘ŝ£¤¤ŝĤĤ§¨İŞŝĞĴĴ­ŝݰ°úħ²²³³žžŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ùħ²²³³´ŸŸ Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´  Ħ˘ŝ£¤¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°÷ħ²²³³´´µ  Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴ­ŝݰ°öħ²²³³´´µµĦ Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĦ˘£¤Ĥ§¨İŞĞĴ­ŝݰ°üħ²²³³´µüĥĦĦ˘˘£¤ŝĤĤ§¨İŞĞĴŝ­ŝݰ°ħ²³´µĥŝ·˘˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·£¤Ĥ§¨İŞĞĴŝ­ŝݰ°ŝħ²²³´µĥ· ¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²³´µĥ·¸¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ŝı¤¤Ĥ§¨İŞĞĴ­ŝݰ°üħ²²³³´µĥ·¸ıĤ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ıĤ§¨İŞĞĴŝ­ŝݰ°ħ²³´µĥ·¸ış§¨İŞĞĴ­Ż°ħ²³´µĥ·¸ış›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤ ›œžŸ Ħ˘£¤ ›œžŸ Ħ˘£¤üšš› ›œžŸ Ħ˘£¤š ›œžŸ Ħ˘£¤š ›œžŸ Ħ˘£¤š ›œžŸ Ħ˘£ŝ¤šš ›œžŸ Ħ˘£š ›œžŸ Ħ˘£ š ›œžŸ Ħ˘£ š ›œžŸ Ħ˘ŝ£š š ›œžŸ Ħ˘š ›œžŸ Ħ˘š ›œžŸ Ħ˘š ›œžŸ Ħ˘š›œžŸ Ħŝ˘šš›œžŸ Ħš ›œžŸ Ħš ›œžŸ Ħ™š›œžŸ Ħ ™š›œžŸ ŝĦ™ ™š›œžŸ  ™š›œžŸ ™ š›œžŸ ™ š›œžŸ ™ š›œžŸ ™ š›œžŸ ™ š›œžŸ ™ š›œžŸ ™ š›œžŸ ™ š›œžŸŝ ™™ š›œžŸŝ ™™ š›œžŸŝ ™™ š›œžŸ ™ š›œžŸ ™ š›œžŸ ™ š›œžŸ  ™š›œžŸ ŝš™ ™š›œžŸ š™š›œžŸ š›œžŸ š›œžŸ š ›œžŸ š ›œžŸ ŝĦšš ›œžŸ Ħš ›œžŸ Ħš › œžŸ Ħ š ›œžŸ Ħ š› œžŸ Ħŝ˘šš› œžŸ Ħ˘› œžŸ Ħ˘› œžŸ Ħ˘› œžŸ Ħ˘ › œžŸ Ħ˘ŝ£››œžŸ Ħ˘£›œ žŸ Ħ˘£œžŸ Ħ˘£œ žŸ Ħ˘£¤ œ žŸ Ħ˘£¤œ žŸ Ħ˘£¤œ žŸ Ħ˘£¤œ žŸ Ħ˘£¤ġlmnooppqrrssŝtuuvuŝtssrâqppoonmlkjjihggfedcba`_klmmnoppŝqrrsŝtuusrpoĉnmlkkjihggfedcba`jjklmnooppŝqrrsŝtuusrpoßnmlkkjjhhgfeddbahijkklmnooppqqrrssŝtu uŝtssrpoánmlkkjjhhgfeddcghijjklmmnooppqrrsŝtu usrpoänmmlkjjihggfedfghhijkklmnooppŝqrrsŝtuuŝtssrüqppooônmlkjjihhgfeeòfghijjklmmnoopprsŝtuuŝtssrŝqppoänmlkkjjihgfcdefghhijkklmnooppŝqrrsŝtuuŝtssrÛqppoonmmlkjjihhbcdefgghijjklmmnooppqrrsŝtuuŝtssrŝqppoänmlkkjjiabbdeefghhjjkklmnoopprsŝtuuŝtssrßqppoonmmlkjj`abbddefghhjjkklmnoopprsŝtu uŝtssrqpoċnmlkk^_`abcdefghhijkklmnoopprs uŝtssrŝqppoĉnml]^_`abcdefghhijkklmnoopprsuŝtssrŝqppoçn\]^_`abcdefghhijkklmnoopprsŝtuuŝtssrßqppoo[\]^_`abcdefghhjjkklmnooppqrrsŝtuuvutsräqppZ[\]^_`abcdefghhjjkkmmoopprsu vuŝtssràqYZ[\]^_`abcdefghhjjklmnooppqrrssuvuŝtssrĉXYZ[\]^_`abddefghijjklmnopprsuvutsàVXYZ[\^^_abbdeegghjjkkmmooppqrrssuvŝwxxwvußtVWXYZ\\^_`abcdefghhjjklmnoppqrrssuvŝwx xwvuàUVWXY[\]^_`abddefghijkkmnoopprrssuvŝwxxwvâTUVXYZ[\^^_abcdefghhjjklmoopprrsuvŝwxxyxÛwvTUVWXYZ\]^_`abddefghjjklmnoppqrrssuuvx yxÛSTUVXYZ[\]^_abcdefghijkkmnoppqrrssuuvvŝwxxyzyxÛRTUVWXYZ\]^_`abddeghhjjkmmoopqrrssuuvvxyz{zyÛRSTUVXYZ[\^^`abcdefghjjklmoopqrrssuuvvxy {ĠzyyQRTUVWXY[\]^_abcdefghijklmoopqrrssuuvvwxxyŝz{{×zQRTTUVXYZ\]^_`abdeeghijklmnopqrrssuuvvwxxy{ |{ÙPRSTUVXYZ[\^_`abddeghijkkmnopqrrstuuvvxxy{ |Û{PQSTUVWXY[\^^_abcdeghijkkmnopqrrstuvvxyŝz{{|×OQRTUVWXY[\]^_abcdeghijjkmnopqrrstuvvwxxyy{|ü}~~}}|×OQRTTVWXY[\]^_abcdeghijjkmnopqrrstuvvwxxyy{|~×}||OQRTTVWXY[\]^_abcdeghijjkmnopqrrsuuvvxxyŝz{{|ŝ}~ ~Ù|OQRSTUWXY[\]^_abcdeghijjkmnopqrssuuvvxxy{| ~ĜOQRTTVWXY[\]^_abcdeghijkkmoopqrssuuvvxxyy{|ŝ}~ ~ĜOQRTTVWXY[\]^_abcdeghijklmooprrssuuvwxxyy{|~ÓOQRTUVWXY[\]^_abddeghijklmopprrssuvvwxxyyz{{||ŝ}~ ~ÓPQRTUVWXY[\^^`abddeghijklmopprrstuvvwxxyyz{{||ŝ}~ ~ÖPRSTUVXXZ[\^_`abdefghjjkmmopqrrstuvvwxxyy{{|~ÛQRSTUVXYZ\]^_abcdefghjjkmnopqrrsuuvvxxy{|ŝ}~ ~ÛQRTUVWXY[\]^_abcdeghhjjkmnopqrssuuvvxxy{|ŝ}~ ~ÛRSTUVXXZ[\^^`abddeghijklmoopqrssuuvvxxy{| ~Ú}RTTUVXYZ\]^_`bbdefghjjklmopprrssuuvvxxy{|ŝ}~ ~Ù}|STUVWXY[\]^_abcdegghjjkmnopprrstuuvwxxyŝz{{|ŝ}~~ŝ}||TVßXYZ[\^_`abddeghijkkmnopqrrstuvvwxxyŝz{{|}|ÛTUVWXY[\]^_abcdefghijklmoopqrrstuvvwxxyŝz{{|Ú{UVWXY[\\^_`abddeghhjjkmmopprrssuuvvwxxyŝz{{ |{ŜUVXYZ[\^^_abcdefghijklmnopprrssuuvvxyŝz{{|{ŬzVXXY[\]^_`bbddeghhjjklmoopqrrssuuvvxyŝz{{ÛzyyWXY[\]^_`abcdefghijkkmnoppqrrssuuvvŝwxxyŝz{ {zyäxXYZ\\^^_abcdeeghhjjklmnopprrsuvŝwxxyzyxYZ[\^^_abbddegghijkkmmoopprrssuvxyxáwvZ[\]^_aabcdefghhjjklmnoppqrrssuvxyxŝwvv[\]^_`abcdefghhjjkkmmooppqrrssuvxwvuĉ\^^_`abcdeeghhijkklmnoopprrsuvwxwvutès^^_`abcdeegghijjklmmoopprsuvuátssrr^_aabcdeegghijjkkmmnooppqrrsŝtuuvutsrèqp`abbcdeegghhjjkklmnoopprsŝtuuvutsrqpíabbddefgghhjjkklmmooprsŝtu utsrŝqppoênbcddefgghijjkklmmnooppŝqrrs tsrŝqppéonnmlcddefghhijjkklmmnoopŝqrrsrqpoénmllkjdeegghhijjkklmmnoopŝqrr srqpoónmmlkjjiiefghhjkûlmmnooprqponömlkkjjihhgghŝijjkûlmmnoopŝqr rqponómllkjjiihhgfe½żÀż½ĵğşıù¸·ĵĵ½½żÀż½ĵğşıŝ¸ĵĵ½ż Àż½ĵğşıŝğĵĵ½ż À ż½ĵğşıŭşğĵĵ½ żÀ ż½ĵŝğşşúışşğğĵĵ½ żÀ ż½ĵğşŝğĵĵ½ż½ĵğşŝışşğĵ½ż½ĵğışğĵ½ż½ĵŝğıışŝğĵĵ½ż½ĵ¸ışğĵ½ żÀ ż½ĵü·¸¸ıışğĵ½ żÀ ż½·¸ışğĵ½ż À żŝ½··ŝ¸ıışğĵ½żÀżŝĥ··ŝ¸ıışğĵ½żÀżŭµĥ··ŝ¸ıışğĵ½żÀżûµµĥ··¸ışğĵ½żÀÁÀżµŝĥ··¸ışŝğĵĵ½żÀ ÁÀżŝ´µµŝĥ··¸ışğĵ½żÀÁÀż´µŝĥ··¸ışğĵ½żÀÁÀĝ³´´µµĥĥ··ŝ¸ıışŝğĵĵ½żÀÁÀ³ŝ´µµŝĥ··¸ışğĵ½żÀÁ³´µĥ·ŝ¸ıışğĵŝ½żÀ ÁÂÁû²³³´µµĥ·¸ışŝğĵĵ½żÀÁ ÂÁŝ²³³ú´µµĥĥ··ŝ¸ıışğĵ½żÀÁÂÁ²³ŝ´µµŝĥ··¸ışŝğĵĵ½żÀÁÂñħ²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ Âŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵŝ½żÀÁÂôÂħ²²³³´´µµĥ··ŝ¸ıışŝğĵĵŝ½żÀÁÂîħ²²³³´´µµĥĥ··¸¸ıışşğĵŝ½żÀÁÂî°ħ²³³´´µµĥĥ··¸¸ıışşğĵŝ½żÀÁÂü°ħ²³³ô´µµĥĥ··¸¸ıışşğĵŝ½żÀÁÂü°ħ²³³ô´µµĥĥ··¸¸ıışşğĵŝ½żÀÁÂî°ħ²²³³´µµĥĥ··¸¸ıışşğĵŝ½żÀÁÂü°ħ²³³ô´µµĥĥ··¸¸ıışşğĵŝ½żÀÁ Äü°ħ²³³ô´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äî°ħ²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äî°ħ²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äġħ²²³³´´µµĥ··ŝ¸ıışŝğĵĵ½żÀÁ Äùħ²²³³´µµúĥ··¸¸ıışŝğĵĵ½żÀÁ Äïħ²³³´´µµĥĥ··¸¸ıışşğĵŝ½żÀÁ Ä²³´µĥ·¸ışŝğĵĵŝ½żÀÁÂŝ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵŝ½żÀÁ²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½żÀÁ³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵŝ½żÀÁ³´µĥ·¸ışŝğĵĵŝ½żÀÁÂĝ³´´µµĥĥ··ŝ¸ıışğĵ½żÀÁÂü³´µµŝĥ··¸ışŝğĵĵŝ½żÀÁ Â´µĥ·¸ışğĵŝ½żÀÁ Âú´µµĥĥ··¸ışŝğĵĵ½żÀÁÂÁµŝĥ··¸ışğĵŝ½żÀÁÂÁµŝĥ··¸ışŝğĵĵ½żÀ Á ÂÁĝµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁÀĥ·¸ışğĵ½żÀÁÀúĥ··¸¸ıışğĵŝ½żÀÁÀż·¸ışŝğĵĵ½żÀ ÁÀżü·¸¸ıışŝğĵĵ½żÀÁ Àż¸ışğĵ½żÀżŝ¸ıışğĵ½ ż À żışğĵ½ż½ŭĵışşğĵ½ż½ĵşğĵ½ż½ĵşğĵ½ ż ½ĵğşğĵ½ ż ½ĵğşĤ§¨ ݨ§Ĥ¤£Ĥ§¨İ¨§Ĥ¤ŭ£ĤĤ§ ¨İ ¨§Ĥ¤Ĥ§¨§Ĥ¤Ĥ §¨ §Ĥ¤Ĥ §¨ §Ĥ¤Ĥ §¨ §Ĥ¤Ĥ §¨ §Ĥ¤Ĥ §¨ §Ĥ¤Ĥ §¨ §Ĥŭ£¤¤Ĥ §¨ §Ĥ£¤Ĥ §¨ §Ĥ£¤Ĥ§¨ §£¤Ĥ§ ¨İ ¨§ŝ˘££¤Ĥ§¨ ݨ§˘£¤Ĥ§¨İ¨§˘£¤Ĥ§¨İ¨§˘£¤Ĥ§¨İ¨˘£¤Ĥ§¨İ¨ŝĦ˘˘£¤Ĥ§¨İŞİü¨ĦĦ˘˘£¤Ĥ§¨İŞİĦ˘£¤Ĥ§¨İŞİĦ˘£¤Ĥ§¨İŞŝİĦĦ˘£¤Ĥ§¨İŞĦ˘£¤Ĥ§¨İŞŝ ĦĦ˘£¤Ĥ§¨İŞŝ ĦĦ˘£¤Ĥ§¨İŞ Ħ˘£¤Ĥ§¨İŞ Ħ˘£¤Ĥ§¨İŞ Ħ˘£¤Ĥ§¨İŞĞŞ Ħ˘£¤Ĥ§¨İ Ş ĞŞ Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ ŞĞŝ ĦĦ˘£¤Ĥ§¨İ ŞĞŝ ĦĦ˘£¤Ĥ§¨İ ŞĞĦ˘£¤Ĥ§¨İ Ş ĞŞĦ˘£¤Ĥ§¨İ Ş ĞŞĦ˘£¤Ĥ§¨İ ŞĞŞĦ˘£¤Ĥ§¨İŞŝĦ˘˘£¤Ĥ§¨İŞŝĦ˘˘£¤Ĥ§¨İŞ˘£¤Ĥ§¨İŞ˘£¤Ĥ§¨İŞ˘£¤Ĥ§¨İŞİ˘£¤Ĥ§¨İŞİŝ˘££¤Ĥ§¨İ Şİ¨£¤Ĥ§¨ İŞİ¨£¤Ĥ§¨İ¨ŝ§££¤Ĥ§¨İ¨§ŝ£¤¤Ĥ §¨ İ ¨§¤Ĥ §¨§¤Ĥ §¨ §Ĥ¤Ĥ §¨ §Ĥ¤Ĥ§ ¨ §Ĥŝ¤Ĥ§¨§Ĥ Ĥ$§Ĥ¤Ò^]\[ZYXWVUTSRQPONMLKJIIHGFEDDCBBA@@?>==<<;;::99876Ò_^^\[ZYXWVUTTRQPONNMKJJIHGFEEDDCBBA@@?>==<<;;::9876a`_^]\[ZYXWVUTSRQPONMLKJJIHGFEDDCCBBA@@?>==<<;;::987Îba`_^]\[ZYXWVUTTRQPONNMLKJIHHGFEDDCBBAA@??>==<<;;::987Ñcba`_^^]\[YYXWVUTSRQPONMLKJJIHGFEEDDCBBAA@?>>=<<;:987dbÓa`_^]\[ZYXWVUTTRQPONNMLKJIIHGFEEDCCBBA@@?>>=<<;:98Ì7eedcba`_^^]\[YYXWVUTSRQPONNMKJJIHHGFEDDCCBBA@@?>==<<;:98Ëgfeddcba`_^]\[ZYXWVUUTSRQPONMLKJJIHGFFEDDCBBAA@@?>==<<;:9È8hgfeedcba`_^^]\[ZYXWVUTSRQPONNMLKJIIHGFEEDDCBBAA@?>>==<<;:9Ċihhgfeddcba`_^]\[ZYXWVUUTSRQPONMLKJJIHHGFEDDCCBBA@@?>>==<<;;:jÈihggfedcbaa__^]\[ZYXWVUTTRQPONNMLKJJIHGFEEDDCBBAA@@?>==<<;:kjĈihgfeddcba`_^^\[ZYXXWVUTSRQPONNMKKJIIHGFEDDCCBBAA@?>>==<<;;mlkjjihhgfeddbba`_^]\[ZYXWVUTTSRQOONMLKJJIHGFEEDDCBBAA@@?>==<<;nmmlkjjihggfedcba`_^^]\[YYXWVUTSRQPONNMKKJIIHGFEDDCCBBA@@?>==<o€żnmlkkjjihgfeddcba`_^]\[ZYXWVUTTRRQONNMLKJIIHGFEEDCCBBAA@@>>==>==rqppoonmlkjjihgfeddcba`_^]\[ZYXWVUTTRQPONNMLJJIHHFFEDDCCBAA@@>>=rr€qpponmlkkjihhgfedcba`_^^\[ZYXXVUUTRQPONNMLKJIIHGFEDDCCBAA@@>>ssrrqqpoonmlkjjihgfeddbba`_^]\[ZXXVUUTSRQPNNMLKJIIHGFEDDCCBAA@@>utssrrqppoonmlkjihggfedcba`_^]\[ZYXWVUTSRQPONMLKJIIHGFEDDCBBAA@?uutssrrqpponmlkjjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIIHFFEDDCBBAA@vvuutssrrqppoonlkkjihgfeddba`_^^\[ZYXWVUTSRQPONMLKJIIHFFEDDCBBA@wvvuÀtssrrqpoonmlkjihgfeddbaa`^^\[ZYXWVUTSRQPNNMLKJIHHFEEDCCBAAxxwvvuuÇtsrrqpponmlkjjhggfddbaa_^^\[ZYXVVUTRRQONNMKJJIHGFEDDCBBAxxÁwvvuutssrrpponmlkjjhggfddba`_^]\[ZYXVUUTRQPONMLKJIIHFFEDCCBAyyxxÄwvvuutssrrpponmlkjjhggeddba`_^]\[ZXXVUTSRQPONMLJJIHGFEDDCBByyxvuÉtsrrpponmlkjjhgfeddba`_^\\[YXWVUTSRQONNLKJIIHFEEDCBB{zyyxÇwvvuutsrrpponmlkjihgfedcba`^^\[ZYXVUTTRQPONMLJJIHGFEDDCB{{ŝzyyxÈwvvuutsrrpponmlkjihgfedbb`_^]\[YXWVUTSRQONMLKJIHGFEDDCB{{ŝzyyxÇwvvuussrrpponmkjjhggedcba`_^\[ZYXVUTSRQPNNMKJJIHFEEDCB||{{ŝzyyxÊwvvutssrqpoomlkjihgfedbba_^]\[YXWVUTRQPONMLJJIHFFEDCB||{ŝzyyxvuÏtsrrpponmkjjhggedcba_^]\[ZXWVUTSRQONMLKJIHGFEDCB||{Ĉzyyxxwvvuussrqpoomlkjihgedcba`_^\[ZYXVUTSRQONNLKJIHGFEDCB||{yxvuÏtsrqppomlkjihgfedba`_^\\ZYXVUTSRQONNMKJIHGFEDCB~||{Ċzyyxxwvvutsrrpponmkjihgfedbba_^\\[YXVVTSRQONNMKJIHGFEDCB~}||{yxÊwvvuusrrpponmkjihgfedbba_^]\[YXVVTSRQONNMKJIHGFEDCB~}||{yxÊwvvuusrrpponmkjihgfedbba_^\\[YXVVTSRQONNLKJIHGFEDCB~}||{yxÊwvvuusrrpponmkjihgfedbba_^\\ZYXVUTSRQONMLJJIHFFDDCB~}||{Ĉzyyxxwvvutsrrppommkjihgfedbb`_^\[ZYWVUTSRQONMKJJIHFEDDCB~||{úzyyxxvvÎutsrqppomlkjihgedcba`^]\[YXWVUTRRPONMKJJHGFEDDBB}||{yxvusÒrqponmkkjhhgedcba_^]\[YXVVUSRQONNLKJIHGFEDCBB||{Ĉzyyxxwvvutsrrppomlkjihgfedbb`_^\\ZYXVUTSRQONMLJJIHFEDDCBA||{zyyxxwvvuusrrqponmkkjhhgedcba_^]\[YXWVUTRQPNNMKJJHGFEDDBBA||{{zyyxxwvvuussrqppomlkjihgfedbb`_^\\ZYXVUTSRQONNLKJIHFFEDCBB@|{{üzyyxxvuÍtsrrpponmkjjhgfedcba_^]\[YXWVUTRQPNNMKJJHGFEDDBBA@{{yxĊwvvuutsrrpponmkkjhhgedcba`^^\[ZXXVUTSRQONMLJJIHFFDDCBB@@{zyyxĈwvvuutsrrpponmkkjihgeddba`_^\\ZYXVUTSRQONNLKJIHGFEDCBBA@?yyxvusrpÏonmkkjihgfedbb`_^]\[YXWVUTRQPNNMKJJHHFEDDCBA@?>yxxŝwvvÄutssrqpponmkkjihgfedbb`_^]\[YXWVUTRRPONMLJJIHFFEDCBBA@>>xxwvvuĈtsrrqpponmkjjhhgeedbb`_^]\[YXWVUTSRPONMLKJIHGFEDCBBA@?>=wvvu€utssrqpponmlkjihhgedcbb`_^]\[YXWVUTSRQONNLKJIHGFEDDCBA@?>=>=>=<=<<;srrqppoonmlkjihhgfedcba`_^]\[ZXWVUTSRQPONMLKJIHGFEDDCBBA@?>=<<;:rqppoonmlkjihhgfedcbba_^]\[ZYXWVUTSRQPNNMLKJIHGFEDDCBBA@?>=<<;::ppoonmlkjjihgfeddbba`_^]\[ZXXVVUTSRQONNMKJJIHGFEDDCBBA@?>=<<;;::onnmlkjjihggeddcba`_^]\[ZYXWVUTSRQPONMLKJJIHFFEDDCBBA@?>=<<;;::9mlkkjihhggeddcba`_^]\\[YXWVVUTSRQONNMLJJIHGFEEDCBBA@@>>=<<;;::98kjjihhgfeddcbba_^]\\[ZXXWVUTSRQPONMLKJJIHGFEDDCBBA@?>>=<<;::ˆ988jihhgfeddcbba_^^]\[ZYXWVUTSRRPONNMKJJIHGFFEDDCBBA@?>==<<;::99887hhgfeddcbaa_^^]\[ZYXWVUTTRRQONNMLKJJIHGFEDDCBBA@@>>=<<ĵ;::998877gfedcbba`_^]]\[ZYXWVUUTSRQPONMLKJJIHGFEEDDCBBA@?>>=<<;;::9887Îedcbba`_^]\\[ZYXWVVUTSRQPONNMKJJIHGFFEDDCBBA@@>>=<<ŝ;::ŝ9887·ĥµ´³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħŝ¸··ŝĥµµ´³ü²ħħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħ¸·ĥµŝ´³³²ŝħ°°ŝŻ­ĴüĞŞŞİݨ§Ĥ¤£˘Ħüı¸¸··ĥµ´³ü²ħħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘ı¸·ĥµŝ´³³²ŝħ°°ŝŻ­ĴĞŞİ¨§Ĥ¤£˘ŝşıı¸·ĥµ´³²ŝħ°°Ż­ĴĞŞİ¨§Ĥ¤£şı¸·ĥµŝ´³³²ħ°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£şı¸·ĥµ´³²ŝħ°°ŝŻ­ĴüĞŞŞİݨ§Ĥ¤ŝğşşı¸·ĥµ´³ü²ħħ°°Ż­ĴĞŞİ¨§Ĥ¤üĵğğşşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤ĵŝğşşı¸·ĥµ´³²ŝħ°°Ż­ĴĞŞİ¨§Ĥŝ¤ĵĵğşı¸·ĥµŝ´³³²ħ°ŝŻŝ­ĴĴĞŞİ¨§Ĥŝ½ĵĵğşı¸·ĥµ´³²ŝħ°°Ż­ĴĞŞİ¨§Ĥû½½ĵĵŝğşşı¸·ĥµŝ´³³²ħ°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥ½ĵğşı¸·ĥµ´³²ŝħ°°Ż­ĴĞŞİ¨§ŝĤ½ĵğşı¸·ĥµŝ´³³²ŝħ°°ŝŻ­ĴĞŞİ¨§ŝż½ĵğşı¸·ĥµ´³ü²ħħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§ż½ĵğşı¸·ŝĥµµ´³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨ§ż½ĵŝğşşı¸·ĥµŝ´³³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨŝ§żż½ĵğşı¸·ĥµŝ´³³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨÀż½ĵğşıŝ¸··ĥµŝ´³³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨÀż½ĵŝğşşı¸·ŝĥµµŝ´³³²ŝħ°°Żŝ­ĴĴĞŞİü¨ÁÁÀÀż½ĵğşı¸·ŝĥµµŝ´³³²ŝħ°°Żŝ­ĴĴĞŝŞİİÁÀż½ĵğşı¸·ŝĥµµŝ´³³²ŝħ°°ŝŻ­ĴüĞŞŞİİÁÀżŝ½ĵĵğşı¸·ĥµŝ´³³ü²ħħ°°ŝŻŝ­ĴĴĞŝŞİİÁÀż½ĵğşıŝ¸··ĥµŝ´³³ŭ²ħ°°Żŝ­ĴĴĝĞŞŞİİÂÂÁÁÀżŝ½ĵĵğşıŝ¸··ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞüŞİİÂÂÁÀżŝ½ĵĵŝğşşı¸·ŝĥµµŝ´³³ŭ²ħ°°Ż­ĴúĞŞŞİÂÂÁÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴùĞŞŞİÂÂÁÀż½ĵğşı¸·ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴûĞŞŞİÂÁÀżŝ½ĵĵŝğşşıŝ¸··ĥµ´³ù²ħħ°°Żŝ­ĴĴĞŭŞİÂÁÀż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞİÂÁÀżŝ½ĵĵŝğşşıŝ¸··ŝĥµµù´³³²²ħ°°ŝŻŝ­ĴĴüĞŞİÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞİÂÁÀż½ĵŝğşşı¸·ĥµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞİÂÁÀżŝ½ĵĵŝğşşı¸·ĥµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞİÂÁÀżŝ½ĵĵŝğşşı¸·ĥµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞİÂÁÀżŝ½ĵĵŝğşşı¸·ŝĥµµù´³³²²ħ°°ŝŻĴûĞŞŞİÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµù´³³²²ħ°°ŝ­ĴĴûĞŞŞİÂÁÀżŝ½ĵĵŝğşşı·ĥĥµµ´´³³²²ħ°°Żŝ­ĴĴûĞŞİİÂÁÀżŝ½ĵĵğşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴûĞŞİİÂÁÀż½ĵŝğşşıŝ¸··ŝĥµµù´³³²²ħ°°ûŻ­ĴĴúĞŞŞİİÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²°ŝŻŝ­ĴĴŭĞŞİİÂÁÀżŝ½ĵĵŝğşşıŝ¸··ŝĥµµù´³³²²ħ°°ŝŻô­ĴĴĞŞŞİݨÂÂÁÀż½ĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ûŻ­ĴĴĝĞŞŞİݨ¨ÂÂÁÀżŝ½ĵĵŝğşşıŝ¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴŭĞŞİİû¨§ÂÂÁÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴ÷ĞŞŞİݨ¨§ÁÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ûŻ­ĴĴöĞŞŞİݨ¨§§ÁÁÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§ÁÀżŝ½ĵĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴġĞŞŞİݨ¨§§ĤÀÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§üĤÀÀżżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝżż½ĵğşı¸·ĥµŝ´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝż½ĵŝğşşı¸·ĥµ´³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤½ĵŝğşşı¸·ĥµ´³ü²ħħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤ŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤ú£ĵĵğğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£ŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£ŝ˘şşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤ŝ£˘˘şı¸·ĥµ´³²ħ°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ£˘Ħ Ÿž œ›£˘Ħ Ÿž œ ›ŝ¤££˘Ħ Ÿž œ ›¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿž œü›¤¤£˘Ħ Ÿž  œ¤£˘Ħ Ÿž œ¤£˘Ħ Ÿž œ¤£˘Ħ Ÿž œĤ¤£˘Ħ ŸžœĤ¤£˘Ħ Ÿž œŝ§ĤĤ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžŝœ§§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿžŝݨ¨§Ĥ¤£˘Ħ Ÿžİ¨§Ĥ¤£˘Ħ Ÿžİ¨§Ĥ¤£˘Ħ ŸžŝŞİݨ§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ ŸžŝŞŞİ¨§Ĥ¤£˘Ħ ŸžŝŞ Şİ¨§Ĥ¤£˘Ħ ŸžŭĞŞ Şİ¨§Ĥ¤£˘Ħ ŸžüĞĞŞŞİ¨§Ĥ¤£˘Ħ ŸžŝĞĞ Şİ¨§Ĥ¤£˘Ħ ŸžŝĞĞ Şİ¨§Ĥ¤£˘Ħ ŸžŝĞĞ Şİ¨§Ĥ¤£˘Ħ ŸžŝĞĞ Şİ¨§Ĥ¤£˘Ħ ŸžĞ Şİ¨§Ĥ¤£˘Ħ ŸžĞ Şİ¨§Ĥ¤£˘Ħ ŸžĞ Şİ¨§Ĥ¤£˘Ħ ŸžŝĞŞ Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ Ÿžŝœİݨ§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœŝ¨§§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ ŸžœĤ¤£˘Ħ ŸžœĤ¤£˘Ħ Ÿžœŝ›¤£˘Ħ Ÿžœ›¤£˘Ħ Ÿž œ›ŝ¤¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿž œ› 6789:;<à=>>?@AABCCDDEFFHHIJJKLMNOPQRSTU6 6789:;<=>?@AABBCDDEEFGHIJJKLMNNOPQRS766 789:;<=ä>?@AABBCCDEEFGHIIJJKLMNOPQR776 789:;<=>@éABBCCDDEFFGHIJJKLMNNOP7789:;<=>è?@AABBCDDEEFGHIIJJKLMNN7789:;<=>è?@@ABBCCDDEEFGHIIJJKLM87789:;<=>ë?@AABBCCDDEFFGHIJJKL88789:;<=>û?@@ABBòCDDEEFGHHIJJ988789:;<=>î?@AABBCCDDEEFGHHI998789:;<=>ï?@AABBCCDDEEFGH:998789:;<=>??@AABBCCDDEFF::98789:;<=>?ô@AABBCCDDE;::98789:;<=>?ġ@AABBCCD;;::98789:;<=>?ĝ@AABBC<;;:98789:;<ô=>>??@AAB<<;;:98789:;<=ġ>??@A=<<;;::98 76 789:;<=ö>??==<<;;::987 6 789:;<=>=<;:9876789:;<÷=>>=<<;;::9876789:;<ó?>==<<;;::998876 56789:;÷@>>=<<;;::987656789:ò@?>==<<;;::9988765 456789@>ö=<<;;::998876545678òA@?>==<<;::99887654 34567ï8A@?>==<<;::99887765434567A@@>>=<<;::9988776543 234567Aĝ@>>=<<;::ü98877654323456ï7BA@?>=<<;::99887765432123456BA@?>=<<;::9988776543212345BA@?>=<<;::998877654321234ï5BA@?>=<<;::998877654321234ñBA@?>=<<;::98877654321234ñBA@?>=<<;::988776ŝ544321 01234BA@?>=<<;::988776543210123ñBA@>>=<<;::98877654321012ñ3BA@>>=<;;:988776ŝ544ŝ32210/012ñ3B@@>=<<;::988776543210 /012òA@?>=<<;::988776ŝ544ŝ32210 /012óA@?>=<<;:998776543210/012óA@>>=<;::988776543210/012ó@?>=<<;::988776ú544332210/012ô@>>=<<;:988776543210/012ô@>=<<;::988776ŝ544ŝ32210/012ġ?>=<<;:998776543210/012ô3>=<<;::988776ŝ5443210/012ò3>=<<;::9887766ú544332210/0123ö=<<;::988776543210/0123ö4=<;;:998776ŝ544ŝ32210 /01234<ù;::988776543210 /01234ĝ<;::988776ŝ5443210/012345;ú:998877654321012345ĝ6;::988776ŝ54432101234ŝ566:ü98877654321 01234567ú:99887765432 101234567987654321234567û8988776543212345678ü98877654321234ŝ56678ü9:877654321234ŝ56678û9::;7765432 123456789:ŭ;<7765432123456789:ù;<<=77665432345678û9::;<<ü=>7665432345678ô9::;;<<=>?@66543 2345678ó9::;;<<=>?@@AĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°úħ²²³³ĦĦ˘£¤Ĥ§¨İŞĞĴ­Ż°ħŭ²³Ħ Ħ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°üħ²˘Ħ Ħ˘£¤Ĥ§¨İŞŝĞĴĴ­Ż°ŝħ˘˘Ħ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°˘£¤Ĥ§¨İŞŝĞĴĴ­ŭݰ££˘£¤Ĥ§¨İŞĞĴ­ŭݤ££˘£¤Ĥ§¨İŞĞĴŝ­¤£˘£¤Ĥ§¨İŞĞĴŭ­¤¤£˘£¤Ĥ§¨İŞŝĞĴĴ¤£˘£¤Ĥ§¨İŞŝĞĴĴ¤£˘£¤Ĥ§¨İŞûĞĴ¤¤£˘£¤Ĥ§¨İޤ£˘£¤Ĥ§¨İŭŞĤ¤£˘£¤Ĥ§¨İĤ¤£˘ Ħ˘£¤Ĥ§¨ûݧĤĤ¤£˘Ħ˘£¤Ĥ§ú¨§§ĤĤ¤£˘Ħ˘£¤Ĥ§Ĥ¤£˘Ħ˘£¤Ĥ§Ĥ¤£˘Ħ˘£¤Ĥ§Ĥ¤£˘Ħ˘£¤ŝ¨§§Ĥ¤£˘Ħ  Ħ˘£¤ŝ¨§§Ĥ¤£˘Ħ Ħ˘£¤¨§Ĥ¤£˘Ħ Ÿ Ħ˘£ü¤¨¨§§Ĥŝ¤¤£˘Ħ Ÿ Ħ˘£üݨ¨§§Ĥ¤£˘Ħ ŸžŸ Ħ˘üݨ¨§§Ĥ¤£˘Ħ ŸžŸ Ħû˘İ¨¨§§Ĥ¤£˘Ħ ŸžŸ Ħİŝ¨§§Ĥ¤£˘Ħ Ÿž žŸ Ħݨ§Ĥ¤ŝ£˘˘Ħ ŸžžŸ Ħݨ§Ĥ¤ŝ£˘˘Ħ ŸžžŸ İ¨§Ĥ¤£˘Ħ ŸžžŸ İ¨§Ĥ¤£˘Ħ Ÿž œ žŸġ İݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ Ÿž œžŸİ¨§Ĥŝ¤¤ü£˘˘ĦĦ ŸžœžûŸİݨ§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœžİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›œžüݨ¨§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ ›œž÷ݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ ›œž÷ݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œžŭݨ§§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›œž¨§Ĥŝ¤¤ü£˘˘ĦĦ ŝŸžžœ›œžŝ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›œžŝ¨§§ŭĤ¤¤ü£˘˘ĦĦ Ÿžœ›œžù¨§§ĤĤ¤¤£˘Ħ Ÿžœ›œž§üĤ¤¤ü£˘˘ĦĦ Ÿžœ›œžùŸ§§ĤĤ¤¤£˘Ħ ŝŸžžœ›œžúŸ§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ›œžŸû§ĤĤ¤¤£˘Ħ Ÿžœ ›œžŸû ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ ›œžŸ üĤ¤¤£˘Ħ Ÿžœ›œžŸ üĦĤ¤¤ü£˘˘ĦĦ ŸžœžŸ Ħŝ¤¤ŝ£˘˘Ħ ŸžœžŸ Ħ¤£˘Ħ Ÿž œžŸ Ħŝ˘¤¤£˘Ħ Ÿž  œžŸ Ħ˘¤ŝ£˘˘Ħ Ÿž ŝœ žŸ Ħ˘û£¤¤£˘˘Ħ ŸžžŸ Ħ˘ŝ£¤¤£˘Ħ ŸžžŸ Ħ˘£¤£˘Ħ ŸžžŸ Ħ˘ŝ£¤¤û£˘˘ĦĦ ŸžžŸ Ħ˘ŝ£¤¤ûĤ˘˘ĦĦ Ÿž žŸ Ħ˘ŝ£¤¤úĤĤ§˘ĦĦ ŸžžŸ Ħ˘ŝ£¤¤ŝĤĤ§Ħ ŸžŸ Ħ˘ŝ£¤¤ŝĤĤ§ŝ¨ĦĦ ŸžŸ Ħ˘ŝ£¤¤ŝĤĤ§¨İ› œžŸ Ħ› œžŸ Ħ› œžŸ › œžŸ › œ žŸ › œžŸ› œ žŸŝœ››œ žŸœ› œ žŸœ›œ žŝŸœœ›œ žœ›œ žœ›œ ž œ›œ  œ› œ œ › œ œ"› œ œ#› œ œ&› œ œ(› œ œ)›œ œ,›œ œ›š›œ œ›š›ŝœ œ ›š›œ ›š ›œ ›š›œ ›š›œ ›!š›œ ›#š›œ ›%š›œ ›'šŝ›œ ›(šœ›)šœ›š™šœ›š ™ šœ›š™ šœ› š™ šœ› š™ šœ› š™šœ› š™šœ› š™šœ› š™šœ› š™ šœ› š™ šœ› š™ šŝœœ› š™ šœ› š™ šœ› š™ šœ›š™šŝ›œœ›š™š›œ›š ™š›œ›š ™š›œ ›š™š›œ ›*š›œ›)š ›œ ›(š›œ ›'š ›œ ›%š ›œ ›$š ›œ ›!š ›œ› š › œŝ››š › œ›š › œŜUVWXYZ[\\]^_`abbcddefgghhiijjkkllmmnoŝnmmkċjTUVVWXYZ[\]]^_`abbccdeefghhijklm nmŝlkkjRSTUVVWXYZ[\]]^_`aabccdeefgghhijkl mŝlkkjàQRSTTUVWXXYZ[\]]^_`aabbcddeefgghhijk lkjŬOPQRSTUUVWXXYZ[\\]^__`abbccdeeffgghhijkjNèOPQRSTUUVWXXYZ[\\]^__`abbùcddeefgghij kjÚMNNOPQQRSTUUVWXXYZ[\\]^^_`aabbccddeefgghijáKLMNNOPQRRSTUUVWXXYZ[\\]]^_``abbücddeeŝfgghi jJÖKLMNNOPQRRSTUUVWWXYZ[[\]]^__`aabbccddeeffgghijIJàKLMNNOPQRRSTUUVWWXYZ[[\\]^^_`aabbücddeefg hiÙhGHIIJJKLMNNOPQRRSTUUVVWXYYZ[\\]^^_``abbŝcddeŝfgg hFÓGHIIJJKLMNNOPQRRSTUUVVWXYYZ[\\]^^__`aabbccddeefghÏDEFFGHIIJJKLMNNOPQRRSTUUVVWXYYZ[\\]^^__`aabbccddeeŝfgghCDDEFFGHIIJJKLMNNOPQRRSTUUVVWXYYZ[\\]^^__`aabbcddeŝfgghÒBCCDDEFFGHIIJJKLMNNOPQRRSTUUVVWXYZ[[\\]^^__`abbŝcddeŝfgghABBCCDDEFFGHIIJJKLMNNOPQRRSTUUVWXXYZ[[\\]^__`aabbücddeeŝfgghù@AABBCDDÒEFFGHIJJKKMMNNOPQRSTTUVVWXYYZ[\\]^^__`aabbcddeegh?Ê@AABBCDDEEFGHHIJJKLMNNOPQQRSTUUVVXXYZ[[\\^^__`aabbcddeeŝfggĝh=>??@ABBCDDEEFGHIIJJKLMNNOPQRRTTUVVWXYYZ[\\]^__`aabbcddeeŝfggĊh<==>?@@ABBCCDDEFFGHIJJKLMNNOPQQRSTUUVWXYYZ[\\]^__`aabbcddeegŝh<<Ë=>>?@AABBCCDEEFGHIIJJKLMNNOPQRSTUUVVXXYZ[\\]^__`aabbddeŝfgg;<=>Í?@AABBCDDEFFGHIJJKLMNNOPQRRTUUVVXXYZ[\\^^__`abbcddeeg:;<=Ï>?@@ABBCCDEEFGHIIJKLMNNOPQRRTUUVVXXYZ[\\^^__aabbddeg9:;<Ê=>>?@AABCCDDEFFHIIJKKLNNOPQRRTUUVVXYY[[\]^^_`abbcddeeggÂ899::;;<<==>?@AABBCDDEFFHIIJKKLNNOPQRRTUUVWXYZ[\\^^__aabcddeegg€78899::;;<<=>>@@ABBCDDEFFHIIJKKMNNOPQRSTUUVXXYZ[\]^^_`abbddeeggh778899::;;<<=>>@@ABBCDDEFFHIIJKLMNNOPQRTTUVWXYY[\\^^_`abbddeeggh7789Ĉ:;;<<=>>@@ABBCDDEFFHIIJKLMNNOQRRTUUVXXYZ[\]^__abbcdeeggh67789:È;<<==>@@ABBCDDEFGHIJJKLMNOPQRSTUVWXYZ[\]^__aabcdeeggh667789:È;<<=>>@@ABBCDEEFHHIJKLMNNOQRSTUVVXXY[\\^^_aabcdeeggh5667789Ĉ:;;<<=>>@AABCCDEFGHIJJKLNNOPQRTTUVXXY[\\^^_aabcdeeghh55667789Ĉ:;;<<=>?@ABBCDDEFHHIJKLMNOPQRSTUVWXY[[\^^_aabddefghh45566778Ä9::;<<=>>@AABCDDEFGHIJJKMNNOQRSTUVWXYZ[\^^_abbddefghi44556677É899::;<<=>?@ABBCDEEFHIJJKMNNOQRSTUVWXYZ[\^^_abbddegghi445678Ä9::;<<=>?@ABBCDDEFHHIJKLNNOQRSTUVWXY[[\^^_abcdeeghhj34455667789Ì:;;<==>@@ABCDDEFGHIJKLMNOQRSTUVWXY[\]^_`abcdefghij3445678Ä9::;<<=>@@ABCDDEFGHIJKLMNOQRSTUVWXY[\]^_`abddegghjj33445566778Ä9::;<<=>?@ABBDDEFGHIJKLNNOQRSTUVXXY[\]^_abbddeghhjj33445566778Ê9::;<<=>?@ABBDDEFGHIJKMNNOQRSTUVXXZ[\^^_abcdefghijk3344ü566778Ê9::;<<=>@@ABCDDEFHHIJKMNNOQRTTVWXYZ\\^_`abddeghhjjk3344ü566778Ä9::;<<=>@@ABCDDEFHIJJKMNOPQRTUVWXY[\]^_abcdefghijkl33445566778Ä9::;<==>@ABBCDDFGHIJJLMNOQRSTUVXXZ[\^^`abcdeghhjjkm33445566778Ċ9:;<<=>?@ABBCDEFGHIJKMNNOQRTTVWXY[\]^_abbdefghijklm3344566778Ä9::;<<=>@@ABCDDEFHIJJKMNOPRSTUVWXY[\^^_abcdeghhjjkmn3445566778Ë9::;<=>>@ABBCDEFGHIJKLNNOQRTTUVXY[\]^_abbdefghijklmo44ü566778Ä9::;<<=>?@ABCDDEFHIJJKMNOPRSTUVWXZ[\^^`abcdeghijklmno44556677899:;<<=>?@ABBCDEFGHIJKMNNPQRTUVWXY[\]^_abcdefghjjkmnop45566778Ċ9::;<=>>@ABBCDEFGHIJJLMNOQRSTUVXYZ[\^_`abddfghijklmopp5566778Ċ9::;<<=>@@ABCDDEFHIJJKMNOPRSTUVWXZ[\]^`abcdeghhjklmnopq566778Ċ9::;<<=>?@ABCDDEFGHIJKMNNPQRTUVWXY[\]^_abcdefghjjkmnoppr66778Ċ9::;<<=>?@ABBCDEFGHIJKLNNOQRSTUVXYZ\]^_`bbdefghijklmopprr6778Ċ9::;<<=>?@ABBCDEFGHIJKLNNOQRSTUVXYZ[\^_`abddeghijklmoopqrs778€w9::;<<=>?@ABBCDEFGHIJKLMNOQRSTUVXXZ[\^^`abcdeghhjjkmnopqrrs77889::;<<=>?@ABCCDEFGHIJKLMNOQRSTUVXXZ[\^^`abcdeghhjjkmnopprrst8899::;<==>@@ABCDDEFGHIJKLNNOQRSTUVXXZ[\]^`abcdefghjjkmnopprrssu89::;<<=>?@ABBCDDEFHHIJKLNNOQRSTUVXXZ[\]^`abcdefghijklmoppqrssuu9::;<<=>?@ABBCDEFGHIJJKMNNPQRSTUVXYZ[\^^`abcdefghijklmoopqrrstuv:;<<=>?@@ABCDDEFGHIJJLMNOPQRTUVWXYZ[\^^`abcdefghijklmoopqrrstuuv;<<=>?@ABBCDDEFGHIJKLMNOPRSTUVWXYZ\]^_`abcdefghijklmoopqrrstuuvv<=>?@@ABCDDEFGHIJJKMNNOQRSTUVWXY[\]^_`abddegghjjklmoopqrrstuuvvw>>?@ABBCDDEFGHIJKLMNOPQRTTUVXYZ[\]^_`bbddeghhjjklmoopqrrstuuvvwx?@ABBCDDEFGHIJJKMNNOQRSTUVWXYZ[\^^`abcdefghijjkmnoopqrrstuuvvxĊ@ABBCDEEGHHIJKLMNOPQRTTUVXXY[\]^_`abcdefghijkkmnoppqrrstuuvvxBÈCDDEFGHIJJLMNNOQRSTUVWXYZ[\^^_abcddeghhjjklmnoppqrrstuuvvxü³´´µµĥ·¸ışğĵ½½ĵ³´µĥ·¸ışğĵ½½ĵŝ²³³´µĥ·¸ışğĵ½ĵüħ²²³³´µĥ·¸ışğ ĵ½ ĵú°ħħ²²³³´µĥ·¸ışğĵ°ħ²³´µĥ·¸ışğĵŝݰ°ŝħ²²³´µĥ·¸ışğĵüŻŻ°°ŝħ²²³´µĥ·¸ışğĵݰŝħ²²³´µĥ·¸ışğ ĵŝ­Ż°ŝħ²²³´µĥ·¸ışğĵüĴ­­Ż°ŝħ²²³´µĥ·¸ı şğĵĴ­Ż°ŝħ²²³´µĥ·¸ış ğŝĞĴĴ­Ż°ŝħ²²³´µĥ·¸ışğŞŝĞĴĴ­Ż°ŝħ²²³´µĥ·¸ışğúİŞŞĞĞĴĴ­Ż°üħ²²³³´µĥ·¸ışğİŞĞĴ­ŝݰ°ħ²³´µĥ·¸ışğŝ¨İİŞĞĴ­ŝݰ°ħ²³´µĥ·¸ışğü§¨¨İİŞĞĴŝ­Ż°üħ²²³³´µĥ·¸ışğ§¨İŞĞĴ­ŝݰ°ħ²³´µĥ·¸ışŭğĤ§§¨İŞŝĞĴĴ­Ż°üħ²²³³´µĥ·¸ışŝğĤĤ§¨İŞĞĴŝ­ŝݰ°ħ²³´µĥ·¸ışúğĤĤ§§¨İŞŝĞĴĴ­Ż°ħ²³´µĥ·¸ışĝğ¤¤ĤĤ§§¨İŞĞĴ­Ż°ħ²³´µĥ·¸ışŝğ¤¤Ĥ§¨İüŞĞĞĴĴŝ­Ż°ħ²³´µĥ·¸ışŝğ¤¤Ĥ§¨İŞŝĞĴĴŝ­Ż°ħ²³´µĥ·¸ışü𣣤¤üĤĤ§§¨İŞŝĞĴĴŝ­Ż°ħ²³´µĥ·¸ışúğ˘˘££¤¤Ĥ§¨İŞŝĞĴĴŝ­Ż°ħŝ²³³´µĥ·¸ışŝğ˘˘£¤Ĥ§¨İŞŝĞĴĴŝ­Ż°üħ²²³³´µĥ·¸ışĝğĦĦ˘˘££¤¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ħŝ²³³´µĥ·¸ışŝğĦĦ˘£¤Ĥ§¨İüŞĞĞĴĴŝ­Ż°üħ²²³³ŝ´µµĥ·¸ışŝğĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışğŝ ĦĦ˘£¤ŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³´µŝĥ··¸ışğ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışŭğĵ  Ħ˘£¤Ĥ§¨İüŞĞĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışüğĵŸ  Ħ˘ŝ£¤¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışğúĵŸŸ  ĦĦ˘£¤ŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışúğĵĵŸŸ  Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıış÷ğĵĵžŸŸ  ĦĦ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışğĵúžŸŸ  ĦĦ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵúžŸŸ  ĦĦ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışğĵúžŸŸ  ĦĦ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°²³´µĥ·¸ışŝğĵĵúžŸŸ  ĦĦ˘ŝ£¤¤ŝĤ§§¨İŞŝĞĴĴû­Ż°°îħ²²³³´´µµĥĥ··¸¸ıışşğĵù½žŸŸ  ĦĦ˘£¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵü½žŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­믰°ħ²²³³´´µµĥĥ··¸¸ıışşğĵù½ŸŸ  ĦĦ˘ŝ£¤¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµúĥ··¸¸ıışŝğĵĵü½Ÿ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­믰°ħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵù½Ÿ  ĦĦ˘£¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­ŝݰ°ïħ²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½ Ħ˘ŝ£¤¤ŝĤ§§¨İŞŝĞĴĴŝݰ°ùħ²²³³´µµŝĥ··ŝ¸ıışŝğĵĵŝ½ŝ ĦĦ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­믰°ħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ïħ²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½ŝżĦĦ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışŝğĵĵŝ½ùżĦĦ˘˘£¤¤üĤĤ§§ŝ¨İİŭŞĞĴĴŝ­ŝݰ°ùħ²²³³´µµŝĥ··ŝ¸ıışŝğĵĵŝ½ż˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşğĵŝ½żü˘££¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½żŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½żŝÀ¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żôÀ¤¤ĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀû¤ĤĤ§§¨İŞŝĞĴĴŝ­Ż°ŭħ²³³ŝ´µµĥ·¸ışŝğĵĵŝ½żÀĤ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışŝğĵĵŝ½żÀŭÁĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁ§¨İŞŝĞĴĴŝ­ŝݰ°ħŝ²³³´µĥ·¸ışğĵŝ½żÀÁ¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışŝğĵĵ½żÀÁü¨İİŞŞŝĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·¸ışŝğĵĵ½żÀÁİŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışŝğĵĵŝ½żÀÁĦ˘£¤Ĥ§ĤŝĦĦ˘£¤Ĥ §ĤŝĦĦ˘£¤ Ĥ Ħ˘£¤ Ĥ Ħ˘£¤ Ĥ Ħ˘£¤ ĤŝŸ  Ħ˘£ ¤Ÿ Ħ˘£¤Ÿ Ħ˘£ ¤Ÿ Ħ˘£ ¤ŝžŸŸ Ħ˘£ ¤žŸ Ħ˘£ ¤žŸ Ħ˘£ ¤ žŸ Ħ˘£ ¤ žŸ Ħ˘£ ¤ žŸ Ħ˘£ ¤žŸ Ħ˘£ ¤žŸ Ħ˘£ ¤ žŸ Ħ˘£¤œžŸ Ħ˘£¤œžŸ Ħ˘£¤œžŸ Ħ˘£¤œžŸ Ħ˘£¤œžŸ Ħ˘£¤ œžŸ Ħ˘£¤› œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤ ›œžŸ Ħ˘£¤ŝš››œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤ŝĤšš›œžŸ Ħ˘£¤ŝĤšš›œžŸ Ħ˘£¤Ĥš›œžŸ Ħ˘£¤Ĥš›œžŸ Ħ˘£¤Ĥš›œžŸ Ħ˘£¤Ĥš›œžŸ Ħ˘£¤Ĥŝ§šš›œžŸ Ħ˘£¤Ĥü§šš››œžŸ Ħ˘£¤Ĥ§ŝš››œžŸ Ħ˘£¤Ĥ§ŝš››œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§ŝ¨››œžŸ Ħ˘£¤Ĥ§¨›œžŸ Ħ˘£¤Ĥ§¨ŝ›œœžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨ŝİœœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İŝœžŸ Ħ˘£¤Ĥ§¨İžŸ Ħ˘£¤Ĥ§¨İŝޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İŞŭjihhgedcbaa`_^^\\[ZYXXVVUTTRRQPONN ŭjihhgßfeeddbbaa`_^^\\[ZYXXWVUTTSRQPON ŭjihhgedbaé`_^^\\[ZYYXWVUUTSRRQP!ŭjihhgàfeeddcbbaa`_^^]\[[ZYXXVVUTTSRQ!ŭjihhgedĉcbbaa`_^^]\[[ZYXXWVUUTTS"ŭjihhgŝfeedĝcbbaa`_^^\ó[ZYYXXWVUUT#ŭjihhgüfeeddècbbaa`__^^]\[[ZYXXWVVU#ŝjhhgŝfeedbaï`_^^]]\[[ZYXXWV$ŝihhgŝfeedëcbbaa`__^^]\\[[ZYXX$hgŝfeedŝcbbaò`__^^]\\[[ZY$ hgŝfeedŝcbbaô`__^^]\\[[% hgŝfeedŝcbbaö`__^^]]\& hgfedcbaü`__^^ŝ&hgŝfeedücbbaaû`__'hgfedcbaŭ`(hŝijjihgfedcbŝ(h jihgfedŭc)hŝijjihgŝfeeŭd)hjihgfŝ*hŝijj kjihgŝ+hjklkjiŭh+hjkŝlm mlkjŝ,hŝijjkŝlmm nmlkŝ,hŝijjkŝlmmŝno onmŭl-hjkŝlmmo ponŝ-hjkŝlmmŝnoopqpoŝûhijjkkmopŝqr rqpŝöhijjkklmmoopŝqrrŝŝhjjĝklmmnooppŝqrrsrŝġijjkkmmnooppŝqrrstutŭsöijjklmmooppŝqrrsŝtuuŝjkmŭnoppŝqrrsŝtuuvŝjôklmnooppqrrssŝtuuvwxwvŝójkkmmooppqrrssuvw xŝñjklmnoppqrrsstuuvŝwxxŝjkmmoopprrsstuuvvŝwxx yŝñklmnoppqrrstuuvvŝwxxy zŭyòkmmoopqrrssuuvvŝwxxyz {ŝólmnopprrssuuvvxyŝz{ {ŝômnoppqrsstuvvxyŝz{{ |ŭ{ïmoopqrrstuuvvwxxyyŝz{{ |ŝnopprrssuuvvwxxyy{|ŝoópqrssuuvvwxxyy{|}~}|ŝòopprrstuvvwxxyy{|ŝ}~ ~ü}|prsuvxyŝz{{|ŝ}~ ~ŭ}pqrssuuvvwxxyyz{{|~ŭ}ñprrstuvvwxxyyz{{|~ŝġqrssuuvvxxyy{|~ŭ}órssuuvvwxxyy{{|ŝ}~~ŭ}órstuvvwxxyyz{{|ŝ}~~ü}|÷stuuvvxxyy{|~û}||òsuuvvwxxyyz{{||ŝ}~~ŝ}||ŝġtuvvwxxyyz{{|ŝ}~ ~ŝ}||ŝuvxy{| ~ŝ}||ŭ{üuvvxxyŝz{{| ~ŝ}||{ŝvüwxxyy{|ŝ}~~ŝ}||{ŭzŭvwxxyŝz{{|~}|{ûzyyŝvxxy{|{yŭxüwxxyyŝz{{|{üzyyxxŝ&xy{|{üzyyxxüwv0ŝxyŝz{{ |{üzyyxxŝwvvŝ ŝŝxyy{|{ŝzyyxŝwvvüuCŝŝxyy{ŝzyyxŝwvvuŭt1yŝz{ {zyxŝwvvuûtsrŝĵğşı¸·ĥµŝ´³³²ŝħ°°ŝIĵğşı¸·ĥµ´³²ħ°ŝIĵğşı¸·ĥµ´³²üħ°Iĵğşı¸·ĥµ´³²ŭħIĵğşı¸·ĥµ´³ŭ²Jĵğşı¸·ĥµ´³ŝJĵğşı¸·ĥµ´³ŝJĵğşı¸·ĥµ´ŝJĵğşı¸·ĥµŝKĵğşı¸·ĥµŝK ğşı¸·ĥŝK ğşı¸·ŭĥKğ şı¸·ŝLğ şı¸ŭ·Lğĵ ğ şı¸ŝLğ ĵğşıŝLğĵğşıŝMğĵğşŝMğĵğşŝMğĵğşŝMğ ĵğŝNğ ĵ ½ ĵŝNğĵ½ĵŝNğĵ½½ŭĵNğĵ½ŭ½Nğĵ½ŝBŝğĵĵ½ żŝBŝğĵĵ½ żŭAŝğĵĵ½żŝAĵ½żŝAĵ½żÀŝAĵ½żÀŝAĵ½żÀÁŝAĵ½żÀÁŝAĵŝ½żÀÁŝAĵ½żÀ ÁÂÁŝAĵŝ½żÀÁ ÂŝAüĵ½½żÀÁÂŝAŭĵ½żÀÁ ŭÂA½żÀÁ ŝAŝ½żÀÁÂŝAŝ½żÀÁÂŝAżÀÁÂŝAżÀÁÂŝAżÀÁÂŝAżÀÁ ŝÄŝAŝżżÀÁ ÄŝAŝżżÀÁ ÄŝAżÀÁ ÄŝAżÀÁ ÄŝAżÀÁ ÄŝBżÀÁ ÄŝBüżÀÀÁÁ Ä ŝBÀÁÂŝBÀÁÂŭÂBŝÀÁÁÂÂŝBŝÀÁÁÂÂŭÁCÁÂÂÁŝCÁÂÂÁŝGÁÂÂÁŝ9ŝÁÂÂÁÀŝŝÁ ÂÁÀŭ‡ŝÁ ÂÁÀŭżRÁÂÂÁÀżŝŝ¤£˘Ħ ŝB¤£˘Ħ ŝB¤£˘Ħ ŝB¤£˘Ħ ŝB ¤£˘ĦŝB ¤£˘ĦŝC ¤£˘ĦŝC ¤£˘ŭĦC ¤£˘ŝC ¤£˘ŝC ¤£˘ŝC ¤£ŝC ¤£ŝD ¤£ŝD ¤ŭ£D ¤ŝD¤ŝD!¤ŝD Ĥŭ¤DĤ ŝDĤŝDĤŝD Ĥ § ĤŝEĤ§ĤŝEĤ§ŝEĤ§ŝ@Ĥ§ŝ@Ĥ§¨§ŝ@Ĥ §¨ŝ@Ĥ §¨ŝ@Ĥ§ ¨İ¨ŝ@Ĥ§¨İŝ@Ĥ§¨İŝ@ŝĤĤ§¨İ Şŭİ@ŝĤĤ§¨İŞŝ@Ĥ§¨İŞŝ@Ĥ§¨İŞŝ?Ĥ§¨İŞŝ?Ĥ§¨İŞŝ?ŝĤ§§¨İŞŝ?ŝĤ§§¨İŞŝ@§¨İ ŞĞŞŝ@§¨İ Ş Ğŝ@§¨İ ŞĞŝ@§¨İ ŞĞŝ@§¨İ ŞĞŝ@§¨İ ŞĞŝ@§¨İ ŞĞŝ@ŝ§¨¨İ ŞĞŝ@¨İ ŞĞŝ@¨İ ŞĞŭŞ@¨İ ŞĞŞŝ@¨İ ŞĞŞŝ@ŝ¨İİ ŞĞŞŝ@İ ŞĞŞŝ@İ ŞĞŞŝ@İ Ş Ğ Şŝ@İ ŞĞ Şŝ@ŝİŞŞĞŞŝE#Şİŝ8ŝ!ŞİŝŝŞİü¨ƒŝŞİ¨ŝOŞİ¨ŝŝ%˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙:˙ŝÑ8ŝL˙˙ŝĤ8˙:˙ŝü€€€€$ü ŭ 5b baŝ`#ü ŝbba`_$û ŭ7bba`_^$û ŭFaaŝ`__^]ŝ\#ŝ ŝ ù,aa``__^ŝ]\\$ŝ ŝüB__^ŝ]\\[ŝZ#ŝ ŭYù*=^^]\\[üZYY#ŝ üYaù (%>JKKŝL#ŝ úYa` 4ŝ ùY`__3ŝ öX__^^] 0ŝ ñW_^^]\\[[ $ŝ éW^^]\\[[YYXXWVVUTTSRRQ#ŝ ŭV^\\î[ZYXXWVVUUTSRRQPO#ŝ éV\\[[ZYXXVVUUTSRRQQONN#ŝ éT\[ZYYXWVVUTTSRRQPONNM#ŝ éT[ZYXXWVVUTSRRQPONNMLK#ŝ SZYXXVVUTTSRQPONNûMLJJ#ŝ éRYXWVVUTSRRQPONNMLKJJI#ŝ éQXWVUUTSRQPONNMLKJJIHH#ŝ PWVUTTRRQPONNMLJJûIHGF#ŝ éOVUTSRRPONNMLKJJIHGFFE#ŝ éNUTSRQPONNMKJJIHHFFEDD#ŝ íMTRRQPNNMLKJJIHGFEDDŝC#ŝ éLRRPONNMLJJIHHFFEDDCBB#ŝ éKQPONNLKJJIHGFEDDCBBA@#ŝ éJPNNMLKJJHHFFEDDCBBA@?#ŝ éHNNMKJJIHGFEDDCBBA@?>>#ŝ éGNLKJJIHFFEDDCBBA@?>=<#ŝ éGLKJIHGFEDDCBBA@?>>=<<#ŝ éEJJIHGFEDDCBBA@?>=<<;:#ŝ éDJIGFFEDCBBA@?>>=<<;::#ŝ éCHGFEDDCBBA@?>=<<;::98#ŝ éBGFEDDBBA@?>>=<<;::988#ŝ í@EDDCBBA@?>=<<;::988ŝ7#ŝ ì?DDCBA@?>>=<<;::98877$ŝ î>CBBA@?>=<<;::988776$ŝï=BB@@>>=<<;::988776ŝ5#ŝñ=<<;::988776ŭ54#ŝò;@?>=<<;::98877654$ŝô:>=<<;::988776ŝ544ŝ3#ŝġ8=<<;::988776543ŝ2#ŝ÷7<;::988776ŝ544ŝ322$ŝĝ6;::9887765432ŝ1#ŝú5:988776ŝ544ŝ3221$ŝû5988776ŝ544321$ŝŭ38776ú54433221$ŝŝ3776ŝ5443210$ŝġ27665544332210$ŝû2665443210ŝ/#ŝĝ15544332210/$ŝŝ044ŝ32210/$ŝû/4332210/$ŝŭ/32210/$ŝŝ.2210/$ŝŭ.2110 /$ŝŝ-110 /$ŝŝ-110 /$ŝü-1100 /$ŝŭ-100/$ŝŝ,00/$ŝü,00//$ŝŭ,0//0$ŝŝ+//0$üŭ ‹ı ı¸$üŝ4ı ı¸ŝ·#ûŭXıı¸·$ûŭhıı¸·$ŝŝ ŭM¸¸·ĥ$ŝŝû(ƒ¸··ĥŝµ#ŝŭİü9w··ĥµ$ŝüݸù6Jcnooŝp#ŝúݸ¸ 4ŝù¨¸¸·3ŝŭ¨¸··ü 0ŝŝ¨··ĥú $ŝŝ¨··ĥµ´³²ŝħ#ŝü¨··ĥĥµ´³²ħŝ°#ŝŭ¨·ĥĥµ´³²ħ°$ŝŝ§ĥĥµ´³²ŝħ°°$ŝŭ§ĥµµ´³²ŝħ°°ŭŻ#ŝŝĤµµ´³²ħ°ŝŻ$ŝüĤµµ´´³²ŝħ°°Ż$ŝûĤµ´´³³²ħ°ŝŻŭ­Ĵ#ŝü´´³³²ŝħ°°ŝŻŝ­ĴĴ$ŝŭ´³³²ŝħ°°ŝŻŝ­ĴĴ$ŝĝ¤³³²²ħħ°°ŝŻŝ­ĴĴŭĞŞ#ŝú¤³²²ħ°°ŝŻŝ­ĴĴŝĞŞŞ$ŝû¤²²ħ°°ŝŻŝ­ĴĴúĞŞŞİİ#ŝü£ħħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨#ŝŝ˘°°ŝŻŝ­ĴĴüĞŞŞİݨ$ŝûĦ°°Żŝ­ĴĴüĞŞŞİݨ§$ŝüĦ°Żŝ­ĴĴúĞŞŞİݨ¨§ŝĤ#ŝŭĦŻŝ­ĴĴüĞŞŞİݨ§Ĥ$ŝŝ ŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ$ŝüŸ­ĴĴüĞŞŞİݨ§Ĥü¤¤#ŝŭŸ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤$ŝŝžĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£#ŝúĴĞŞŞİݨ§Ĥŝ¤¤£ŝ˘#ŝ÷ĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘$ŝŭœŞİݨ§Ĥŝ¤¤£˘Ħ$ŝú›İݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ$ŝö›İ¨¨§§ĤĤ¤¤£˘Ħ $ŝŭš¨§§Ĥŝ¤¤ü£˘˘ĦĦ ŝŸ#ŝù™§§ĤĤ¤¤£˘Ħ Ÿ$ŝú™§ĤĤ¤¤ü£˘˘ĦĦ Ÿž$ŝü˜Ĥ¤¤£˘Ħ Ÿž$ŝŭ˜¤¤ü£˘˘ĦĦ Ÿž$ŝŝ–¤¤ŝ£˘˘Ħ Ÿž$ŝù–¤¤£˘˘ĦĦ Ÿž$ŝŭ–£˘˘Ħ ŝŸžžŝœ#ŝü•˘˘ĦĦ Ÿžœ$ŝŭ”˘ĦĦ ŝŸžžœ$ŝü”ĦĦ  Ÿžœŝ›#ŝŭ“Ħ  ŝŸžžœ›$ŝú“  ŸŸžžœ›$ŝü’ŸŸžžœ›$ŝŭ’Ÿžžœ›$ŝü‘žžœ›$ŝŭ‘žœ ›$ŝŝœ ›$ŝŝœ ›$ŝüœœ›$ŝŝœœ›$ŝŝœœ›$ŝüœœ››$ŝŭœ››ŝœ#ŝŝŽ››œ$üŭ ‡¤¤ŝ£#üŝ3¤ ¤£$ûŭV¤¤£$ûŭe¤¤ £$ŝŝ üK¤£ £ŝ˘#ŝŝü'~££˘$ŝŭ–ü8r££˘$ŝü–¤ú5G_kk$ŝú–¤£ 4ŝŝ–££ŭ3ŝŝ•££ü 0ŝŝ•££˘ú $ŝŝ•££˘Ħ $ŝŝ•££˘Ħ $ŝü•££˘˘Ħ $ŝŭ•£˘˘Ħ ŝŸ#ŝŝ•˘˘Ħ Ÿ$ŝŝ”˘˘Ħ Ÿ$ŝŝ”˘˘Ħ Ÿ$ŝü”˘˘ĦĦ Ÿ$ŝŭ”˘ĦĦ Ÿž$ŝŝ”ĦĦ Ÿž$ŝŝ“ĦĦ Ÿž$ŝü“ĦĦ  Ÿžŝ#ŝŭ“Ħ  Ÿž$ŝŝ“  Ÿž$ŝŝ’  Ÿž$ŝü’  ŸŸž$ŝŭ’ ŸŸžœ$ŝŝ’ŸŸžœ$ŝŝ’ŸŸžœ$ŝŝ’ŸŸžœ$ŝŭ’Ÿžžœ$ŝŝ‘žžœŝ›#ŝŝ‘žžœ›$ŝü‘žžœ›$ŝŭ‘žœ›$ŝŝœ›$ŝŝœ›$ŝŝœ›š$ŝŭœœ›š$ŝŝœœ›š$ŝŝœœ›š$ŝŝœœ›š$ŝŝœœ›š$ŝüœœ›› š$ŝŝ›› š$ŝŝŽ›› š$ŝŝŽ›› š™$ŝŝŽ›› š™$ŝüŽ››š š™$ŝŭŽ›š š™$ŝŝš š™$ŝŝš š ™$ŝŝšš ™$ŝŝšš ™$ŝŝšš ™$ŝŝšš™$ŝŝšš™$ŝüšš™™$ŝŭš™™$ŝŝŒ™™$ŝŝŒ™™$ŝŝŒ™™&˙ŝ88ŝş˙˙:ŝŭ˙˙9ŝ€˙˙ŝë8ŝÖ˙˙9ŝò˙˙ŝa7ŝĝ˙˙ŝž6ŝĉ˙ ˙ŝÌÇÇŝÂ+ŝÇ˙˙-ŭ ˙˙/ŭ/Ŝ˙ ˙2û|Êïġ˙˙ ŝ`__^]\[ZYXWVUTSRQüPOONNûMLLKJJIHŝGFFŝEDDCŝ_^^]\[ZYXWVUüTSSRRQŭPONNMüLKKJJIüHGGFFŝEDDCBŭ^]\\[ZYXWVUTSRQüPOONNMúLKKJJIIĝHGGFFEEDDCBA\[ZYXWVUüTSSRRQŭPONNMüLKKJJIHŝGFFEDCBA@ù?[[ZZYXXŝWVVUTSRQüPOONNMüLKKJJIúHGGFFEEDCBA@?>ùZYYXXWVVUTSRQüPOONNûMLLKJJIHGFEDCBA@?>=XWVUTSRQŭPONNMüLKKJJIúHGGFFEEDCBA@?>=<LMNOPQRSTUVWXYZ[À?çPOONNMMLKJJIIHGGFFEEDDCCBBAü@??>>=<;:9 8ŝ7NNüMLKJJIġHGFFEEDDCCBBAĝ@??>>==<<;:987ûNMLKJJĝIHHGFFEDDŝCBBAĝ@??>>==<<;:987ŭLKJJôIHGFFEEDDCCBB÷A@@?>>==<<;:987JîIHGFFEEDDCCBBAA@?>>ŝ=<<;:9876ĝJIHGFFEDDŝCBBĝA@@?>>=<<ŝ;::9876úHGFFEDDôCBBAA@?>>==<<ŝ;::98765üGFEDDCBBAA@?>>==<<;;::98765 45EDġCBBAA@?>>=<<ŝ;::9876545DġCBBAA@?>>=<<ŝ;::ŝ9887654 345ŝCBBġA@?>>=<<;;::ŝ988765434î5BBA@?>>=<<;;::998876543 234ĝ5A@?>>=<<ĝ;::9988776543234ú5@?>=<<ĝ;::99887765432 1234ò5>>=<<;::998877654321234ú5=<<;::ü988776543212345ù<;;::98876543212345û;::98876543212345ù6::9887765432 10 123456ü98877654321 0 12345687654321012345676ŝ54432101234567654321012345676543210/012345678ŭ65443210 /012ŝ3445678ù9544332210 /01234ŝ56678ù9:44332210/01234ü566778ú9::332210/012345678ú9::;<2210/012ŝ344ŝ56678÷9::;<<22110/01234ü5667789:û;<=>110/012345678ö9::;<<=>?110/012ŝ344ŝ56678ġ9::;<<=>?@110/012345678ò9::;<<=>?@AB100/012ŝ344ŝ56678ò9::;<<=>?@ABC00/0123456789::;<<=>?@ABBCD00/012ŝ344ŝ56678î9::;<<=>?@ABCDDE0//012345678í9::;<<=>?@ABBCDEFG//012ŝ344ŝ56678ì9::;<<=>@@ABCDDEFGH//012345678ê9::;<<=>?@ABBCDEFGHIJ//01234ü566778è9::;;<=>?@@ABCDDEFHHIJK/ /012345678ç9::;<<=>?@ABBCDEFGHIJJLM/ /01234ü566778ċ9::;<<=>?@ABBCDDEFHIJJKMNN/ /01234ŝ56678ä9::;<<=>?@ABBCDEFGHIJKLMNOQ//01234ü566778â9::;<<=>?@ABBCDDEGHIJJKMNNPQR//012ŝ344ŝ56678á9::;<<=>?@ABCDDEFGHIJKLNNOQRST//012345678ß9::;<<=>?@ABBCDEFGHIJJLMNNPQRTUV//012ŝ344ŝ56678Ŝ9::;<<=>?@ABCDDEFGHIJKLNNOQRSTUVW//012345678Ú9::;<<=>?@ABBCDEFGHIJJLMNOPQRTUVWXY//0012ŝ344ŝ56678Û9::;<<=>?@ABCDDEFGHIJKLNNOQRSTUVWXZ[0012345678Ù9::;<<=>?@ABBCDEFGHIJJLMNOPQRTUVWXYZ\]0012ŝ344ŝ56678Ö9::;<<=>?@ABCDDEFGHIJKLNNOQRSTUVWXY[\]^00112345678×9::;<<=>?@ABBCDDFGHIJJKMNNPQRTTVWXYZ[]^_`¸·ĥµ´³²ħ°Ż­ĴĞŞ·ĥµ´³²ħ°Ż­ĴĞŞİ·ĥµ´³²ħ°Ż­ĴĞŞİŭ¨·ĥĥµ´³²ħ°Ż­ĴĞŞİ¨ĥµ´³²ħ°Ż­ĴĞŞİ¨§µ´³²ħ°Ż­ĴĞŞİ¨§µ´³²ħ°Ż­ĴĞŞİ¨§Ĥpqr st u vwÀ?ŝħ°°ŝŻ­ĴĞŞİ¨§Ĥ ¤£°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥ ¤£˘ü°ŻŻŝ­ĴĴĞŞİ¨§Ĥ ¤£˘ŝŻ­ĴŝĞŞŞİ¨§Ĥ¤£˘ Ħ­ĴĞŞİ¨§Ĥ¤£˘Ħŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħŝ­ĴĴĞŞİ¨§Ĥ¤£˘ Ħ  ĦĴĞŞİ¨§Ĥŝ¤¤£˘Ħ ùĦĴĞĞŞŞİݨ§Ĥ¤£˘Ħ  Ÿ  üĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿ ŝŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿ žŸ İ¨§Ĥŝ¤¤£˘Ħ ŸžŸ üݨ¨§§Ĥŝ¤¤£˘Ħ ŸžŸ ŝ¨§§Ĥŝ¤¤ŝ£˘˘Ħ Ÿž žŸ §Ĥŝ¤¤ŝ£˘˘Ħ ŸžžŸ ú§ĤĤ¤¤£˘Ħ ŸžžŸ ûĦĤĤ¤¤£˘Ħ ŸžžŸ ŭĦ¤¤£˘Ħ ŸžžŸ Ħ¤ŝ£˘˘Ħ Ÿž  œ žŸ Ħ¤ŝ£˘˘Ħ Ÿž œžŸ Ħû¤£˘˘ĦĦ ŸžœžŸ Ħ˘Ħ ŸžœžŸ Ħ˘Ħ ŝŸžžœ›œžŸ Ħ˘ŝ£ĦĦ Ÿžœ ›œžŸ Ħ˘ü£¤Ħ  Ÿžœ ›œžŸ Ħ˘ü£¤¤  ŝŸžžœ ›œžŸ Ħ˘ŝ£¤¤ü ŸŸžžœ›œžŸ Ħ˘£¤ŭŸžžœ›œžŸ Ħ˘ŝ£¤¤ŭĤžžœ›œžŸ Ħ˘ŝ£¤¤ûĤĤžœ›œžŸ Ħ˘ŝ£¤¤úĤĤ§§œ›œžŸ Ħ˘ŝ£¤¤ùĤĤ§§¨œ›œžŸ Ħ˘£¤üĤĤ§§¨œ›œžŸ Ħ˘ŝ£¤¤ġĤĤ§§¨¨İݝœœ›œžŸ Ħ˘£¤ŝĤĤ§¨İŝŞœœ›œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞœ›œžŸ Ħ˘£¤üĤĤ§§¨İŞüĞĴœ››œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞüĞĴĴ››œžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­››œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŭ­››œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ ›œžŝŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŭݰ› ›œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­üݰ°› ›œžŝŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ŝħ››œžŸ Ħ˘ŝ£¤¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ŭħ²››œžŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ûħ²²³››œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°úħ²³³´››œžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´››œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ġħ²³³´´µµ››œœžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ġħ²²³³´´µµĥœœžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ôħ²³³´´µµĥĥ·œœžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··œœžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··¸ £ ˘Ħ  Ÿ žŝ££ ˘Ħ   Ÿ ž£ ˘Ħ  Ÿ ž£ ˘Ħ   Ÿ ž  ˘Ħ  Ÿ ž ˘Ħ   Ÿ žœ˘Ħ   Ÿ žœl mnoÀ?  Ÿž œ› Ÿž œ ›ŝ ŸŸž œ›Ÿž œ›Ÿžœ›Ÿž  œ›Ÿž œ ›ž œ$›ž œ›š›ž œ›š›ŝž œ ›š› œ ›š› œ ›"š› œ ›$š›ŝœœ ›'š›œ ›(š›œ ›*š›œ›,š›œ›-š›œ ›-š›ŝœ››š ™š ›š ™š ›š™š ›š™š›ŝœ››š™š›œŝ›š š™š›œ š™ š›œ š™š›œ š™ š›œš™ š›œŝšš™ š›œš™ š›œš™ š›œš™ š›œŝš™™ š›œž™ š›œž™ š›œž™ š›œžŸ™ š›œžŸ™ š›œžŸ™ š›œžŸ™ š›œžŸ  ™ š›œžŸ  ™ š›œžŸ ŝĦ™ ™ š›œžŸ Ħ™ š›œžŸ Ħ™ š›œžŸ Ħŝ˘™™ š›œžŸ Ħ˘™ š›œžŸ Ħ˘™ š›œžŸ Ħ˘ŭ£™š š›œžŸ Ħ˘£ š›œžŸ Ħ˘£À½¸ ³ ¨ £ž˙ BA@ŝ?>>=<;:;<=÷>BAA@@??>>=<;:;<=>?@?>=<;:;<=>?@ŝ?>>=<;:;<=>?@ûABB>==<;:;<=>?@ABŝC<<;:;<=>ŝ?@@ABCD<;:;<=>ŝ?@@ABŝCDDüE[[\\[ZYXWVUŝTż?789:;<=>ú?@@AABBŝCDDĝEFFGHHIJJúKLMNN7 789:;<=>ŝ?@@ŝABBŝCDDĝEFFGHHIJJĝKLMNNOP7 789:;<=>í?@@AABBCCDDEEFGHHIJJöKLMNNOPQR7 789:;<=>û?@@ABBŝCDDùEFGHHIJJôKLMNNOPQRST66 789:;<=Ŭ>?@@AABBCCDDEFFGHIIJJKLMNNOPQRSTTU66789:;<=ú>?@@ABBäCDDEEFGHHIJJKLMNNOPQRSTTUVW66789:;<×=>>?@@ABBCCDDEFFHHIJJKLMNNOPQRSTTUVWXX5566789:;<Ö=>>?@AABBCDDEEFGHIIJJKLNNOPQRSTTUVWXXY[5566789:;<×=>>@@AABBCDDEFFHHIJJKLMNNOPRSTTUVWXXYZ[\556789:ŝ;<<Ö=>>@@ABBCCDDEFGHIIJJLMNNOPQRSTUVWXXYZ[\]^556789:ŝ;<<Ó=>?@@ABBCDDEFFHHIJJKLMNNPQRSTUUVXXYZ[\]^_`556678ŝ9::Î;<<==>?@@ABBCDDEFGHHIJJLMNNOPRSTTUVWXYZ[\]^_`ab5566789:Ë;<<==>?@AABBCDDEFGHIJJKLMNOPQRSTUVWXXZ[\]^^`abcd55667789:Í;<<==>?@ABBCCDEFFHHIJJLMNNOPRSTTUVXXYZ\]^^_`abdde566789:Í;<<==>?@ABBCDDEFGHIJJKLMNOPQRSTUVWXYZ[\]^_`abcdefg66789:Ê;<<=>>@@ABBCDDEFGHIJJKMNNOPRSTTUWXXZ[\]^_`abcddfghh667789:Ê;<<=>?@@ABBCDDEFHHIJKLMNNPQRSTUVWXYZ[]^^_abcddefghij67789:Ê;<<=>?@@ABCDDEFGHIJJKLNNOPRSTTUWXXZ[\]^_`abcdefghijjk7789:É;<<=>?@ABBCDDEFGHIJJLMNNPQRSTUVWXYZ\]^^`abcdefghijjklm778€69::;;<<=>?@ABBCDDEFHHIJKLMNOPQSTTUWXXZ[\]^_`acddefhhjjklmno77889::;<<=>>@@ABBCDEFGHIJJKMNNOQRSTUVWXYZ\]^^`abcdefghijklmnopp7889::;<<=>?@@ABCDDEFGHIJJLMNNPQRTTUWXXZ[\]^_`bcddfghijjklmoppqr889::;<<=>?@ABBCDDEFHHIJKLNNOPRSTUVWXYZ\]^_`abcdefghijklmnopqrrs99::;<<=>?@ABBCDEFGHIJJLMNNPQRSTUVXXZ[\]^_`bcddfghijjkmnopprrsst::;<<=>>@@ABCDDEFGHIJKLMNOPRSTUVWXYZ[]^_`abcdefghijklmnopqrrstuv:;<<=>?@ABBCDDEFHHJJKMNNPQRSTUVWXZ[\]^_`bcddfghijklmnopprrstuuvv;<<=>?@ABBCDEFGHIJJLMNOPQRTUVWXYZ[\^^`abcdefhhijklmoppqrrstuvvwx<=>?@@BBCDDEFGHIJKLNNOQRSTUVWXZ[\]^_`bcddfghijklmnopqrrstuvvx…=>?@ABBCDEFGHIJJLMNNPQRTTVWXYZ[\^^`abcdefhhijklnoppqrsstuvvwxxyy>@@ABCDDEFGHIJKLNNOQRSTUVWXY[\]^_`bcdefghijklmnopqrrstuvvwxxy‚z@ABBCDDFGHIJJLMNNPQRTTVWXYZ[\^^`abcdefhhjjklnoppqrssuuvvwxxyyz{{ABCDDEFGHIJKLMNOQRSTUVWXY[\]^_`bcdefghijklmnopqrrstuvvwxxyyz{{Á|BCDDFGHIJJKMNNPQRTTVWXYZ[\^^`abcdefhhjjklnoppqrstuuvvwxxyyz{{||DÈEFGHIJKLMNOQRSTUVWXZ[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{|ÍDFGHIJJKMNNPQRTTVWXYZ[]^_`abcdeghijjkmnopprrstuuvvxxyüz{{||Ç}~FGHIJKLNNOQRSTUVWXZ[\]^_abcdefghijklmoppqrrstuvvwxxyyz{{|Í}~~HIJJLMNOPQRTUVWXYZ\]^_`abcdeghijjlmnopqrrstuvvwxxyüz{{||ŝ}~~ÌIJKLNNOQRSTUVXXZ[\]^_abcdefghijklmoppqrsstuvvwxxyyz{{|~ÑJLMNOPQSTUVWXY[\]^_`abddfghijklmnopqrrstuvvwxxyy{|ŝ}~~ÍMNNOQRSTUVXXZ[\]^`abcdefghijklnoppqrssuuvvwxxyyz{{||~ÑNOPRSTUVWXY[\]^_`bcddfghijklmnopqrrstuvvwxxyyz{{|ŝ}~~PQRTTUWXYZ[\^^`abcdefhhjjklnoppqrstuuvvwxxyyz{{||ŝ}~ ~ÔRSTUVWXY[\]^_abcdefghijklmnopqrrstuvvwxxyyz{{|ŝ}~ ~TŬVWXYZ[]^_`abcdeghijjkmnopprrstuuvvxxyüz{{||ŝ}~ ~×UVWXZ[\]^_abcdefghijklmoppqrrstuvvwxxyyz{{|ŝ}~~ŜWXYZ\]^_`abcdeghijjlmnopqrrstuvvwxxyüz{{||ŝ}~~ÚXZ[\]^_abcdefghijklmoppqrsstuvvwxxyyz{{|~ß}|Z\]^_`abcdfghijjlmnopqrrstuvvwxxy{|ŝ}~~Ú}||\]^_abcdefghijklmoppqrsstuvvwxxyyz{{|~ŝ}||ä^_`abcdfghijjlmnopqrrstuvvwxxy{|ŝ}~~ŝ}||ß{_abcdefghijklmoppqrrstuvvwxxyyz{{|~ŝ}||{çabcdeghhjjkmnopprrstuuvvxxyüz{{||ŝ}~~ŝ}||{ŝzyݨ§Ĥ¤Ĥ§İ¨§Ĥ¤Ĥ§¨§Ĥ¤Ĥ§¨§Ĥ¤Ĥ§¨İ§Ĥ¤Ĥ§¨İŭާĤĤ¤Ĥ§¨İŞĤ¤Ĥ§¨İŞĞŝĴw%w v utÀ?£ ¤Ĥ§¨İŞĞĴŝ­ŝݰ°˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ° ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħŝ²ĦĦ˘£¤Ĥ§¨İŞĞĴ­ŝݰ°ħ²ŝ³ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ħ²³Ħ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°ħ²³´Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­Ż°üħ²²³³´µĦ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°üħ²²³³´µŝĥĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥŭ· ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²³´µĥ·ŝ ĦĦ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°üħ²²³³´µĥ·¸ŝ ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ŭı ĦĦ˘£¤Ĥ§¨İŞŝĞĴĴ­ŝݰ°ĝħ²²³³´´µµĥ·¸ıĦ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışğĦ˘ŝ£¤¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışúğĵĵĦĦ˘˘ŝ£¤¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·¸ışŝğĵĵŝĦ˘˘ŝ£¤¤Ĥ§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½˘˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·¸ışŝğĵĵù½˘˘£¤¤üĤĤ§§¨İŭŞĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½£¤üĤĤ§§¨İŞŝĞĴĴŝ­°ŭħ²³³´µĥ·¸ışŝğĵĵ½ŭż£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½ż¤Ĥ§¨İŭŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½ż¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½żÀû¤ĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀòÁĤĤ§§¨¨İİŞŞĞĴĴŝ­°²³´µĥ·¸ışŝğĵĵŝ½żÀÁŝĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ§¨İŞĴŝ­ŝݰ°ùħ²³³´´µµŝĥ··¸ışŝğĵĵ½żÀÁö§¨¨İİŞŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁÂŝ¨İİŞŝĞĴĴŝ­ŝݰ°ùħ²³³´´µµŝĥ··¸ışŝğĵĵ½żÀÁÂİŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂûİŞŞĞĴĴŝ­ŝݰ°ùħ²³³´´µµŝĥ··¸ışŝğĵĵ½żÀÁÂŭŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂŝĞĴĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··¸ışŝğĵĵŝ½żÀÁÂĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂŭĴ­ŝݰ°ġħ²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁ ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ êÄŻ°°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ Äŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½żÀÁ Ä°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ Äü°ħ²³³ŝ´µµŝĥ··¸ışŝğĵĵ½żÀÁ Ä²³´µĥ·¸ışŝğĵĵŝ½żÀÁ Ä³´µĥ·¸ışŝğĵĵŝ½żÀÁ Äñ³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Äú´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁ Äµĥ·¸ışŝğĵĵŝ½żÀÁ Äĥ·¸ışŝğĵĵŝ½żÀÁ Äĝĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Ä·ŝ¸ıışŝğĵĵŝ½żÀÁÂ Ä ¸ışŝğĵĵŝ½żÀÁ Ä Âü¸ıışşğĵŝ½żÀÁ Ä  1œ /œ /œ /œ 0œ .œ ž,œ ž'onmÀ?›œ žŸ ›œ žŸ ›œ žŸ › œ žŸ Ħ› œ žŸ Ħ› œ žŸ Ħŝ˘› › œžŸ Ħ˘ › œžŸ Ħ˘ › œžŸ Ħ˘ŝ£› › œžŸ Ħ˘£ › œžŸ Ħ˘£ › œžŸ Ħ˘£¤ › œžŸ Ħ˘£¤ ›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§ŝ›œœžŸ Ħ˘£¤Ĥ§ŝ¨œœžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨ŝİœœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İüŞœœžŸ Ħ˘£¤Ĥ§¨İŞŝœžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İŞŝžžŸ Ħ˘£¤Ĥ§¨İ ŞžŸ Ħ˘£¤Ĥ§¨İ ŞŝОžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŝŸ  Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ Ş Ğŝ ĦĦ˘£¤Ĥ§¨İ ŞĞĦ˘£¤Ĥ§¨İ ŞĞĦ˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞŞ£¤Ĥ§¨İ ŞĞŞ£¤Ĥ§¨İ ŞĞŞŝ£¤¤Ĥ§¨İ ŞĞޤĤ§¨İ ŞĞŞÀ&ž £ ¨˙ ü>??@@ŝABBŝCDDEFGGHIIJJKLMMNNOPQRSSTUUVWXXYZ[\\]^^_`abbcddeefg@@ŝABBŝCDDEùFGGHHIJJĠKLMNNOOQQRSTTUVVWXXYZ[\]^^__`abbcddeefghhABBCDEĈFGGHHIIJJKLMMNNOPQRSSTUUVWXXYZ[[\]^^_`aabccddeffghhijBBCCDDÓEFFGHHIIJJKKMMNNOPQQRSTTUVVWXXYZ[\]]^^_`abbcddĝefgghhijjŝCDDEÊFGHHIIJJKKLMNNOOPQRSSTUUVWXXYZ[[\]^^__aabbcddeefgghhijjköDEEFGGHHIJJüKLMNNOPQRSSTTUVWWXYYZ[\]]^^_`abbcdd÷effghhiijjkÌlFFGHHIIJJKLMMNNOPQQRSTTUVVWXXYZ[\\]^^_`aabccddeefghhŝijjkŝlmmTSRQPONMLKJIH GÀ?ÚOPQRRSTTUVWXXYZ[\\]^^_`abbcddeefghhiijjökllmmnnooppqrŬQRSTTUUVWXXYZ[\]^^_`aabcddeefgghiijjùkllmnnoopq ràSTTUVWWXYZ[\\]^^_`abccddefgghiijj÷kllmnnooppqrsTUVWXXYZ[\]^^_`aabcddeefghhijj÷kllmnnooppqr sĉVWXXYZ[\]^^_`abccddefghhijjĝkllmnnoppqrs tsXáYZ[\]^^_`abcddefgghiijjkllmnooppqrst ußtssYZ[\]^_`aabcddefghhijjkklmnnoppŝqrrstuìts\\]^_`abccdeefghijjùklmmnoppŝqrrstu vuĉts^^_`abcddefghhijjkklmnoppŝqrrstuvuċts_`abcddefghhijjklmnnoppqrrstuvwxŝwvvuséabcddefghijjkklmnoppqqrrüsttuuvwxŝwvvusìcddefghijjkklmnoppqrrsütuuvvwxvusédefghijjklmnoopqqrrsstuuvwx yxŝwvvuítssrfghijjklmnoppqrrsütuuvvŝwxxyxvusróhijjklmnoppqrrûstuuvvŝwxxyzyxvusrjìklmnoppqrrsstuuvvwwxxyz {ŝzyyxŝwvvuçtssrrpklmnoppqrrsstuuvvwxxyŝz{{ŝzyyxvuìtssrrpplnoppqrrsstuvvŝwxxyŝz{{ŝzyyxvuítssrqpponopqrrsstuvvŝwxxyŝz{{ |{ŝzyyxéwvvuutssrqpponpqrrsstuvvŝwxxyz{|{yxêwvvuutssrqpponmqrrstuvvŝwxxyŝz{{|{yxċwvvuutsrrqpponmkrstuuvvwxxyyŝz{{|{ŝzyyxèwvvuutsrrqpoomlkjtuuvvwxxyŝz{{|}~|{ŝzyyxéwvvuussrrpponmlkjiuvvwxxyŝz{{|ŝ}~~ŝ}||{ŝzyyxäwvvutssrqpponmkjjhhvwwxxyyz{{|} ~|{üzyyxxvèutsrrqppomlkjihhfwxxyyz{{|ŝ}~ ~ŝ}||{zyyxxwvvuutsrrqponmlkjihgfexyyüz{{||ŝ}~ ~ŝ}||{àzyyxxwvvuussrqpponmkjjhhgedcyyz{{|ŝ}~ ~ŝ}||{yxĉwvvutsrrqpoomlkjihgfedcbz{{|ŝ}~~ŝ}||{üzyyxxvuètsrrpponmljjihgfddbb`{{||ŝ}~~ŝ}||{Ŝzyyxxwvvutssrqppomlkjihgfedcba`^{||ŝ}~~ŝ}||{üzyyxxvĉutsrrqponmljjihgfddbb`_^]||ŝ}~~ŝ}||{Úzyyxxwvvutssrqppomlkjihgfedcba`^]\[|}~~ŝ}||{yxßwvvutsrrqponmljjihgfddbb`_^]\[Y}~~ŝ}||{Ùzyyxxwvvutssrqppomlkjihgfedcba`^]\[ZYW~~ŝ}||{üzyyxxŬwvvutsrrqponmljjihgfdcba`_^]\ZYXWV~ ~ŝ}||{Özyyxxwvvutsrrqppomlkjihgfedcba_^]\[ZXWVUT~ ~ŝ}||{Ôzyyxxwvvuutsrqpponmkjjhhgedcba`_^\\ZYXVVUSR~ ~ŝ}||{Ózyyxxwvvutsrrqponmlkjihgfedcb`_^]\[YXWVUTSRQ~ ~ŝ}||{Ñzyyxxwvvuussrqpponlkjihhfedcba`_]\[ZYXVVTSRQPN~~ŝ}||{yxĠwvvutsrrqponmlkjihgfedbb`_^]\[YXWVUTRRPONM~~ŝ}||{Îzyyxxwvvutssrqppomlkjihgfedcba_^]\[ZXWVUTSRQONNLK~~ŝ}||{üzyyxxvĠutsrrpponmkjjihgedcba`_^\\ZYXWVUTRQPONMKJJ~~ŝ}||{Ëzyyxxwvvutsrrqponmlkjihgfedcba_^]\[YXWVUTSRQONNLKJIH~~ŝ}||{Çzyyxxwvvuutsrqpponlkjjhhfedcba`_^\\ZYXVVUSRQPNNMKJJIHF~}||{Çzyyxxwvvutsrrqponmlkjihgfedcb`_^]\[YXWVUTSRPONMLKJIHGFE}||{Ĉzyyxxwvvuutsrqpponlkjihhfedcba`^]\[ZYXVUTSRQONNMKJJIGFEDD||{…zyyxxwvvutsrrqponmlkjihgfedbb`_^]\[YXWVUTRRPONMLKJIHGFEDCB||{{zyyxxwvvuussrqpponlkjihhfedcba`^]\[ZYWVUTSRQONNMKJJHGFEDDCBA{{€ŭzyyxxwvvutsrrqponmlkjihgfddbb`_^]\[YXWVUTRRPONMLJJIHGFEDCBBA@{zyyxxwvvuussrqpponlkjihhfedcba`^]\[ZYWVUTSRQONNLKJJHGFEDDCBA@?>zyyxxwvvutsrrqponmlkjihgfddbb`_^]\[YXWVUTSRPONMLJJIHGFEDCBBA@?>=yxxwvvuutsrqpponlkjihhgedcba`^]\[ZYXVUTSRQONNMKJJIGFEDDCBB@@>>=<§¨İŞŝĞĴĴ­ŝݰ°ŝħ²²³´µĥ·¸ış¨İŞĞĴŝ­Ż°ħ²³´µĥ·¸ışğİŞĞĴ­Ż°ħ²³´µĥ·¸ışğĵİŞĞĴ­ŝݰ°ħ²³´µĥ·¸ışğĵŞĞĴ­Ż°ħ²³´µĥ·¸ışğĵŝĞĴĴŝ­Ż°ŝħ²²³´µĥ·¸ışğĵŝ½ĴĴ­ŝݰ°ħ²³´µĥ·¸ışğĵ½t srqp onmlÀ?°ŝħ²²³´µĥ·¸ışğĵ½ żüħ²²³³´µĥ·¸ışğĵ½ żŝ²³³´µĥ·¸ışğĵ½ ż³´µĥ·¸ışğĵ½ ż´µĥ·¸ışŝğĵĵ½żµĥ·¸ışŝğĵĵ½ żÀżŝµĥĥ·¸ışğĵŝ½żÀżŝĥ··¸ışŝğĵĵ½żÀż·¸ışŝğĵĵ½żÀ ÁÀż¸ışğĵ½żÀÁÀżŝ¸ıışğĵŝ½żÀÁÀżışŝğĵĵ½żÀÁÀżşŝğĵĵ½żÀÁÀżşŝğĵĵŝ½żÀ Á  ÁÀżğĵŝ½żÀÁÂÁÀżŝĵĵŝ½żÀÁÂÁÀżûĵĵ½żÀÁ ÂÂÁÀż½żÀÁ ÂÁÀżżÀÁÂÂÁÀżżÀÁÂÂÁÀżŭ½żżÀÁÂÂÁÀż½ŝĵżżÀÁÂÂÁÀżŝ½ĵĵŝżÀÀÁÂÂÁÀżŝ½ĵĵÀÁÂÂÁÀżŝ½ĵĵŭğÀÁÁÂÂÁÀż½ĵüğşşÁÁÂÂÁÀżŝ½ĵĵŝğşşÁÂÂÁÀż½ĵŝğşşŭıÁÂÂÂÁÀżŝ½ĵĵŝğşşı Ä ÂÁÀżŝ½ĵĵŝğşşıŭ¸Â Ä ÂÁÀżŝ½ĵĵŝğşşı¸ŝ·Ä ÂÁÀżŝ½ĵĵŝğşşı¸·Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥŝµÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµŝ´ Ä ÂÁÀżŝ½ĵĵŝğşşıŝ¸··ĥµ´Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³ Ä ÂÁÀż½ĵğşı¸·ŝĥµµ´³ŝ²ÄÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħÄÄ ÂÁÀż½ĵŝğşşı¸·ĥµ´³²üħ°°ÄÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ûŻÄÄÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°° ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ÂÁÀż½ĵŝğşşı¸·ŝĥµµŝ´³³ŭ²ħ°°ŝŻü­ĴĴÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴÂÁÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞİÂÁÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴùĞŞŞİİÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨ÂÂÁÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴġĞŞŞİݨ¨§ÂÂÁÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§ÁÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ žŸ Ħ˘£¤žŸ Ħ˘£¤žŸ Ħ˘£¤ž Ÿ Ħ˘£¤ž Ÿ Ħ˘£¤ĤžŸ Ħ˘£¤ĤžŸ Ħ˘£¤Ĥmlk jÀ? Ħ˘£¤Ĥ§ Ħ˘£¤Ĥ§Ħ˘£¤Ĥ§ ¨Ħ˘£¤Ĥ §¨ŝĦ˘˘£¤Ĥ §¨˘£¤Ĥ §¨˘£¤Ĥ § ¨İ¨ŝ˘££¤Ĥ§¨İ¨£¤Ĥ§¨İ¨£¤Ĥ§¨İ¨¤Ĥ§¨İ Şİ¨¤Ĥ§¨İŞİ¨¤Ĥ§¨İŞİ¨Ĥ§¨İŞİ¨ŝ§Ĥ§¨İŞİ¨§Ĥ§¨İŞİ¨§Ĥ§¨İŞİ¨§Ĥ§¨İ!Şİ¨ §¨İ#Şİ¨ §¨İ$Şİ¨§üĤ§§¨¨İ%Şİ¨§Ĥ¨İŞĞŞİ¨§Ĥ¨İ Ş Ğ Şİ¨§Ĥŝ¨İİ ŞĞ Şİ¨§Ĥİ ŞĞ Şİ¨§ĤŝİŞ ŞĞ Şİ¨§Ĥŝ¤Ş ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŝ£ŞŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£ŭ˘ŞĞĞ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘ŝĦĞĞ Şİ¨§Ĥ¤£˘ĦĞ Şİ¨§Ĥ¤£˘Ħŝ Ğ Ğ Şİ¨§Ĥ¤£˘Ħ  Ğ Şİ¨§Ĥ¤£˘Ħ  Ğ Şİ¨§Ĥ¤£˘Ħ ŝŸĞĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸŝžĞĞ Şİ¨§Ĥ¤£˘Ħ ŸžŝĞŞ Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ ŸžŝŞŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŝœŞŞİ¨§Ĥ¤£˘Ħ ŸžœÀ ³¸½ ÇÌÑ×˙ hŝijjkŝlmmŝnoopŝqrrqpon÷mllkkjjihhùgfeddijjkŝlmmopq ponmìlkkjjiihhgfeedccbjjkkŝlmmŝnooponmëlkkjjiihhggfeddcbba`kkŝlmmŝnooponmŝlkkjŝihhgfeedccbba`_^klmmŝnooponmlkjihgñfeddcbba`__^]\mmŝnoopoŝnmmülkkjjŝihhëgffeddcbba`_^^]\\[nnooponmülkkjjŝihhëgfeedccbba`_^]\\[ZYXGGFGHIJKLMÀ?rŝqppoùnmmlkkjjÛihhggfeddcbba`_^]\\[ZYXWVVUTSRRQPONNrrŝqppoÏnmmlkkjjihhggfeddcbba`_^]\\[ZYXWVVUTSRRQPONNLKssrrpomkjĜihhgfeedcbba`_^^]\[ZYXWVVUTSRRQPONMLKJJssrŝqppoÎnmmlkkjjihhggfeddbba`_^^]\[ZYXWVVUTSRRQONNMLKJJIHssrpoÍnmmlkkjjihhgfeddcbba`_^]\\[ZXXVVUTSRRQPNNMLKJJIHGFssrŝqppoÌnmmlkkjihhggfedcbba`_^]\\[ZYXWVUTSRRQPONMLKJJIHGFFEssrŝqppoËnmmkkjjihhgfeddcbaa_^^]\[ZYXWVUUTRRQPONMLKJJIHGFFEDDssrpoÈnmmkkjjihhgfedcbba`_^]\[ZYXWVVUTSRQPONNLKJJIHGFFEDDCBssrrqppoonmlkkjjhhgfeddcba`_^]\\[ZYXVVUTSRQPONNMKJJIHGFFEDDCBBAsrr€yqppoonmlkkjihhgfedcbba`_^]\[ZYXWVUTSRRPONNMLKJIHGFFEDDCBBA@?srrqppoonmlkkjihhgfedcbb`_^]\\[YXWVVUTSRQPNNMLKJIIHFFEDDCBBA@?>>rrqppoonmlkjjihggeddcba`_^]\[ZYXWVUTSRQPONMLKJJIHGFEDDCBBA@?>>=>=<<;rppoonmlkjihhgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEEDCCBA@?>>=<<;::ppoommkkjihhgeddbba`_^\\[YXWVUTSRRPONNLKJJIHFFEDDCBBA@?>=<<;::€9poommkkjihgfedcbb`_^]\[ZYXWVUTSRQPNNMLJJIHGFEDDCBBA@?>=<<;;::988oomlkjjhhgfedcba`_^]\[ZXWVVTSRQPONMLKJIHGFEEDCBBA@?>>=<<;::98877nmlkjjhhgfedbba`^]\\ZYXWVUTSRQONNMKJJIHGFEDDCBAA?>>=<<;::98877Çmlkjihhfedcbb`_^]\[ZYWVVUSRQPONMLKJIHGFEDDCBBA@?>=<<;::98876kÈjihgfedcba`_^\\ZYXWVUTSRQONNMKJJIHFFEDCBBA@?>==<;;::988776Ç5jjhhgfedbba_^]\[ZYXVVUSRRPONMLKJIHGFEDDCBBA@>>=<<;::988776É544ihhgedcbb`_^]\[YXWVUTSRQONNMKJJIHFFEDCBBA@?>=<<;::98876ŝ544Ê3hgfedcba`^]\\ZYXVVUTRRPONMLKJIHGFEDDCBA@?>>=<<;::988776543Ì2gfddbb`_^]\[ZXWVUTSRQPNNMKJJIHFFEDCBBA@?>=<<;::988776ŝ544ŝ322Ñedcba`_^]\ZYXWVUTSRPONMLKJIHGFEDDCBA@?>==<;::98876ŝ54432Ï1dcba_^]\[ZYWVUTSRQPNNMKJJIHFFEDCBBA@?>=<<;::98877654321Òba`_^]\ZYXWVUTSRPONMLKJIHGFEDDCBA@?>=<<;::988776ŝ544ŝ3221Óa`^]\[ZYXVUTSRQPNNMKJJIHFFDDCBBA@?>=<<;::98877654321Ô0_^]\[YXWVUTSRPONMLKJIHGFEDDCBA@?>=<<;::988776ŝ544ŝ32210Ö]\[ZYXVUTSRQPNNMKJJIHFEDDCBBA@?>=<<;::988776ŝ5443210Ĝ\[YXWVUTSRPONMLKJIHGFEDDBBA@?>=<<;::988776543210Ĝ/ZYWVUTSRQONNMKJJIGFEDDCBBA@>>=<<;::988776ŝ544ŝ32210/ÛXWVUTRRPONMLJJIHGFEDCBBA@?>=<<;::988776543210/ßVUTSRQONNLKJJHGFEDDCBBA?>>=<;::98876ŝ544ŝ32210/ŜUTRRPONMLJJIHGFEDCBBA@?>=<<;::988776543210/àSRQONNLKJIHGFEDDCBA@?>==<;::988776ŝ544ŝ32210/áQPONMKJJIHFFEDCBBA@?>=<<;::988776ŝ5443210 /ONNLKJIHGFEDDCBA@?>=<<;::988776ú544332210 /äNMKJJIGFEDDCBBA@?>=<<;::988776ŝ5443210 /ĉLKJIHGFEDCBBA@?>=<<;::988776543210/JìHGFEDDCBA@?>>=<;::98876ŝ544ŝ32210/éIHGFEDCBBA@?>=<<;::988776543210/ëGFEDDCBA@?>=<<;::988776ŝ544ŝ32210/0ìFDDCBBA@?>=<<;::988776ŝ5443210/0DCBA@?>=<<;::988776543210/0ïCBBA@>>=<<;:9988776ŝ5443210/01ñBA@?>=<<;::988776543210/01@>ù=<;::98876ŝ544ŝ32210/01ô?>=<<;::988776543210/01ġ2>=<;::988776ŝ544ŝ32210/012<ù;::988776543210/012ú3;::98876ŝ544ŝ32210/0123ğĵ½ ż ½ĵğşĵ½ ½ĵğşıĵ½½ĵğşı¸ĵ½½ĵğşı¸ü·ĵĵ½½½ĵğşı¸·ŝĥ½½½ĵğşı¸·ĥŝ½½ĵğşı¸·ĥµ lmnopÀ?ż ½ĵğşı¸·ĥµ´³²ŝħ°°ż ½ĵğşı¸·ĥµ´³²ŝħ°°ŭŻżż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­żż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻü­ĴĴżż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞżż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴûĞŞŞİżż½ĵŝğşşı¸·ĥµ´³²ħ°ŝŻŝ­ĴĴüĞŞŞİİż½ĵğşı¸·ĥµ´³²ŝħ°°Żŝ­ĴĴüĞŞŞİݨżŝ½ĵĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§żŝ½ĵĵŝğşşı¸·ĥµ´³²ħ°ŝŻ­ĴüĞŞŞİݨ§ŭĤż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥŝ¤½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥ¤½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ú£½½ĵĵŝğşşıŝ¸··ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ú£˘˘½ĵĵğşı¸·ĥµ´³²ŝħ°°ŝŻ­ĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘ŭĦ½ĵĵŝğşşı¸·ĥµŝ´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħŝ ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ üĵğğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥŝ¤¤£˘Ħ Ÿŝğşşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ üŸžžşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴöĞŞŞİݨ¨§§ĤĤŝ¤¤ü£˘˘ĦĦ Ÿžíşıı¸¸··ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ ŝŸžžı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿž¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ¸··ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ ŝŸžžœó·ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžœġ›µµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›÷µ´´³³²²ħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžœ›ù´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›²ŝħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ Ÿžœ›ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ ›°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ ŝŸžžœ ›ŭ°Żŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ ›ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžœ›ŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›ŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›ĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ Ÿžœ›öœĴĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›œóĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ ŝŸžžœ›œúŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›œġİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ›œ¨§Ĥŝ¤¤£˘Ħ Ÿžœ›œù¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ›œ§Ĥŝ¤¤£˘Ħ Ÿžœ›œžĤŝ¤¤ü£˘˘ĦĦ Ÿžœ›œžŭĤ¤¤£˘Ħ Ÿžœ›œžŸĤ#§Ĥ¤Ĥ!§Ĥ¤Ĥ!§Ĥ¤ŝ£ĤĤ§Ĥ¤£Ĥ§Ĥ¤£Ĥ§Ĥ¤£˘§Ĥ¤£˘'jklÀ?§Ĥ¤£˘Ħ §Ĥ¤£˘Ħ Ÿ¨§Ĥ¤£˘Ħ Ÿ¨ §Ĥ¤£˘Ħ Ÿ¨ §Ĥ¤£˘Ħ Ÿž¨ §Ĥ¤£˘Ħ Ÿž¨ §Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿž¨§Ĥ¤£˘Ħ Ÿžŝ¨§§Ĥ¤£˘Ħ Ÿžŝœ§§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœ§Ĥ¤£˘Ħ Ÿžœü›§§ĤĤ¤£˘Ħ Ÿžœ›ŝ§ĤĤ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›ŝĤ¤£˘Ħ Ÿžœ›ŝš¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› šŝ¤££˘Ħ Ÿžœ› š£˘Ħ Ÿžœ› šü™££˘˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™ŝ˘ĦĦ Ÿžœ› š™Ħ Ÿžœ› š ™ŝĦ  Ÿžœ› š ™ Ÿžœ› š ™ Ÿžœ› š™ŝ ŸŸžœ› š™Ÿžœ› š™Ÿžœ› š™Ÿžœ› š™žœ› š™žœ› š™žœ› š™šœ› š™šœ› š™šœ› š™šœ› š™šœ› š™šœ› š™ šœ› š™ šÀ ×ÑÌÇÂ˙ Ċcbba`_^]\\[ZYXWVUUTSRQPONNMKJJIIHFFEDDCBBAA@?>>=<<;;::9988776aa__^]\\[YYXWVUTSSRQPONNMKKJIIHGFEDDCCBBA@?>>=<<ŝ;::ŝ98876Ó_^^]\[ZYXWWVUTSRRQPONNMKKJIIHGFEDDCCBBA@?>>=<<ŝ;::ŝ98876Ġ]\\[ZYXWVVUTSRRQOONNMKJJIIHGFEEDCCBBA@?>>=<<ŝ;::98765Ó\[ZYXWVVUTSRRQOONMLKJJIHGGFEDDCCBBA@?>>==<<;::98765YÒXWVUUTSRQPONNMLKJJIHGFFEDDCCBBA@?>>==<<;;::9988765Ö4WWVUTSSRQPONNMLKJJIHGFFEDDCCBBA@?>>==<<;::987654NOPQRSTUVWXYZ[\]^À?èMKKJJIHGFEEDDCBBAA@?>>=<<ŝ;::ŝ9887654 3JäIHHGFEDDCCBBA@??>==<<;;::99887654 3íIHGFFEDDCCBBA@?>>=<<ŝ;::ŝ98876543ëGFFEDDCBBAA@?>>=<<;;::ŝ98876543éFEDDCBBA@@?>==<<;;::99887654323ï4DDCBBA@?>>==<<;::ŝ98876543234öCBBA@?>>=<<ú;::998876543234îBA@?>>=<<;;::9988776543234ó@?>>=<<;;::9887654321234ĝ5>>=<<;::ŝ98876543212345û=<<;::ü988776543212345ö6<;::99887765432123456:9876ŝ544321234569876543212345678765432123456765432 10 1234ŝ5667ŭ876654321 012345678654321012345678ü955443210123456789ŝ:44321 0/01234ŝ56678ĝ9::;4332210/012345678ù9::;<32210 /012345678ö9::;<<=22110 /01234ŝ56678÷9::;<<=>110/01234ü5667789:ù;<<>>@110/012345678ô9::;<<=>?@A110/01234ŝ56678ò9::;<<=>?@AB100/012345678ñ9::;<<=>?@ABBC00/012ŝ344ŝ56678î9::;<<=>?@ABCDD00//012345678í9::;<<=>?@ABBCDEF0//012ŝ344ŝ56678í9::;<<=>@@ABCDDEFG//012345678ë9::;<<=>?@ABBCDEFGHI//01234ü566778é9::;;<=>?@@ABCDDEFHHIJ/ /012345678è9::;<<=>?@ABBCDEFGHIJJL/ /01234ü566778ĉ9::;<<=>?@ABBCDDEGHIJJKMN/ /012ŝ344ŝ56678ċ9::;<<=>?@ABCDDEFGHIJKLNNO//0123456789::;<<=>?@ABBCDEFGHIJJLMNOPQ//01234ü566778á9::;;<=>?@@ABCDDEFHHIJKMNNOQRS//012ŝ344ŝ56678à9::;<<=>?@ABBCDEFGHIJKLMNOPRSTU//012345678Ŝ9::;<<=>?@ABBCDDFGHIJJKMNNPQRTTUW//01234ü5667789:ß;<==>@@ABCDDEFGHIJKLNNOQRSTUVWX/0012ŝ344ŝ56678Û9::;<<=>?@ABBCDEFGHIJJLMNOPRSTUVWXY[0012345678Ù9::;<<=>?@ABBCDDEGHIJJKMNNPQRTTUVXYZ[\0012ŝ344ŝ56678×9::;<<=>?@ABCDDEFGHIJKLMNOQRSTUVWXY[\]^0112345678Ö9::;<<=>?@ABBCDEFGHIJJLMNOPQSTUVWXYZ\]^_`11234ü566778Ô9::;;<=>?@@ABCDDEFHHIJKMNNOQRSTUVXXZ[\]^_ab112ŝ344ŝ56678Ñ9::;<<=>?@ABBCDEFGHIJJLMNOPRSTUVWXY[\]^_`acd11223456789::;<<=>?@ABBCDDEGHIJJKMNNPQRTTUWXYZ[\^^`abcde122ŝ344ŝ56678Ĉ9::;<<=>?@ABCDDEFGHIJKLNNOQRSTUVWXY[\]^_abcdefg2233445566778Ì9::;<<=>?@ABBCDEFGHIJJLMNNPQRTUVWXYZ\]^_`abcdeghi2344ŝ56678Ì9::;<<=>?@ABCDDEFGHIJKLNNOQRSTUVWXZ[\]^_abcdefghij344ü566778È9::;<<=>?@ABBCDEFGHIJJLMNOPQSTUVWXYZ\]^_`abddeghijjk4456678Ë9::;<<=>?@ABCDDEFGHIJKLNNOQRSTUVWXZ[\]^_abcdefghijklmı¸·ĥµ´³²ħ°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħüı¸¸··ĥµ´³²ħ°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥŝ¤¤£˘Ħŝ¸··ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħ·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħŝ µµ´³²ŝħ°°ŝŻŝ­ĴĴŝĞŞŞİ¨§Ĥ¤£˘Ħ üµ´´³³²ħ°Żŝ­ĴĴŝĞŞŞİ¨§Ĥ¤£˘Ħ ŝpqqrstuvwxÀ?ŝŻ­ĴĞŞİ¨§Ĥŝ¤¤£˘Ħ  Ÿŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħ Ÿŭ­ĴĴŝĞŞŞİ¨§Ĥ¤£˘Ħ ŸĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿ žŸĴüĞŞŞİݨ§Ĥ¤£˘Ħ ŸžŸüĞŞŞİݨ§Ĥ¤ŝ£˘˘Ħ ŸžŸŝŞİݨ§Ĥŝ¤¤£˘Ħ ŸžŸú İݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ ŸžžŸ ¨§Ĥ¤ŝ£˘˘Ħ Ÿž žŸ §Ĥ¤£˘Ħ ŸžžŸ ùĦ§ĤĤ¤¤ŝ£˘˘Ħ ŸžžŸ ĦüĤ¤¤ŝ£˘˘Ħ ŸžžŸ Ħŝ¤¤ŝ£˘˘Ħ ŸžžŸ Ħ¤ŝ£˘˘Ħ ŸžžŸ Ħü˘¤£˘˘Ħ Ÿž œ žŸ Ħ˘Ħ Ÿž œ žŸ Ħ˘ŭ£˘ĦĦ ŸžœžŸ Ħ˘ŭ£¤ĦĦ ŸžœžŸ Ħ˘£¤ŝĦ  ŸžœžŸ Ħ˘ŝ£¤¤ Ÿžœ›œžŸ Ħ˘ŝ£¤¤üŸŸžžœ ›œžŸ Ħ˘£¤ŭĤžžœ ›œžŸ Ħ˘ŝ£¤¤ùĤĤ§žžœ ›œžŸ Ħ˘ŝ£¤¤úĤĤ§§œ›œžŸ Ħ˘ŝ£¤¤üĤĤ§§ŝ¨œ›œžŝŸ  Ħ˘ŝ£¤¤ġĤĤ§§¨¨İœœ›œžŸ Ħ˘£¤üĤĤ§§¨İœ›œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŝŞœœ›œžŸ Ħ˘£¤üĤĤ§§¨İŞüĞœœ››œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŭĞĴ››œžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴ›œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİüŞĞĞĴĴŝ­››œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴü­› ›œžŝŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝŻ› ›œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŭݰ› ›œžŸ Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ° ›œžŝŸ  Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ŝħ››œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²››œžŸ Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°úħ²²³³››œžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ùħ²³³´´››œžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ġħ²²³³´´µ››œœžŝŸ  Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ġħ²²³³´´µµĥœœžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµĥœžŸ Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··œœžŝŸ  Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··ŝ¸žŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ïħ²²³³´´µµĥĥ··¸¸ıžŸ Ħ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ııžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ùħ²³³´´µµŝĥ··¸ışŝžžŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşžŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··ŝ¸ıışúğĵžŸŸ  Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşĝğĵĵŸŸ  ĦĦ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ñħ²³³´´µµĥĥ··¸¸ıışŝğĵĵ Ħ˘ŝ£¤¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½¤£˘Ħ Ÿž œ›¤£˘Ħ Ÿž œ›£˘Ħ Ÿž œ ›£˘Ħ Ÿž œ ›˘Ħ Ÿž œ ›˘Ħ Ÿž œ›˘Ħ Ÿž œ›ŝšll m nopÀ?Ÿž œ›šŸž œ›šŸž œ›šŝŸžž œ ›šž œ ›šž œ ›š œ › š œ ›"šŝ› œ ›$š›œ ›%š›œ ›'š›œ ›(š›œ ›*š›œ ›+š›ŝœ››,š›-š›š™š›ŝœ››š ™š ›œ›š ™š›œŝ›šš™š›œš™š›œ š™š›œ š™ š›œŝšš™ š›œš™ š›œš™ š›œš™ š›œŭžš™™ š›œž™ š›œž™ š›œžŝŸ™™ š›œžŸ™ š›œžŸ™ š›œžŸ™ š›œžŸŝ ™ ™ š›œžŸ  ™ š›œžŸ  ™ š›œžŸ ŝĦ™™ š›œžŸ Ħ™ š›œžŸ Ħŝ˘™™ š›œžŸ Ħ˘™ š›œžŸ Ħ˘™ š›œžŸ Ħ˘ŭ£™š š›œžŸ Ħ˘£ š›œžŸ Ħ˘£ š›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤Ĥŝš››œžŸ Ħ˘£¤ĤÀŝ½½¸³¨£ž™˙ 65432345678ï9::;;<<=>?@@ABB65543456789:;<ġ=>?@@ABBCD5543456789:;<ñ=>?@@ABBCDDE5544 3456789:;<=>?@@ABBCDDEFG544345678ŝ9::ŝ;<<ï=>?@@ABBCCDEFGHH44345678ŝ9::ŝ;<<í=>?@@ABBCCDEFGHHIJ44ŝ34 45678ŝ9::ŝ;<<ë=>?@@ABBCCDEFGHHIJJK^^]\[ZYXWVUTSRQÀ?345678ŝ9::ŝ;<<Ŝ=>?@@ABBCCDEEFGHIJJKLMNOPQRSTUVW3445678ŝ9::ŝ;<<Ŭ=>>@@ABBCCDDEFGHIJJKLMNOPQRSTUVWXY4456789:;<Û=>>?@AABBCDDEFGHIJJKLMNOPQRSTUVWXYZ[445678ŝ9::Ö;<<==>?@AABBCDDEFGHIJJKLMNOPQRSTUVWXYZ[\]445678ŝ9::ŝ;<<Ö=>?@@ABBCDDEFGHIIJKLMNNPQRSTUVWXXZ[\]^_44556789:;<Ġ=>?@@ABBCDDEFGHHIJKLMNNPQRSTUVWXXZ[\]^_`a455678ŝ9::Ñ;<<=>>?@ABBCCDEEGHHIJJLMNNOQRSTUVWXXZ[\]^_`abc556789:ŝ;<<Ñ=>?@@ABBCDDEFGHIJJKMNNOPRSTTVVXXY[\]^_`abcdd556678ŝ9::Î;<<=>>@@ABBCDDEFGHIJJKLMNOPQRTTUVWXY[\]^^`abcddef6678û9::;<<Î=>?@ABBCCDEFGHHIJKLMNOPQRSTUVWXYZ\]^^_abcddefgh667789:Ê;<<=>?@@ABBCDDEFGHIJJLMNNOQRSTUVWXYZ[\^^_`bcddefghij6778Ĉ9::;;<<=>?@ABBCDDEFGHIJJKLNNOPRSTUVWXYZ[\]^_`abddefghijkl7789:;<<=>?@@ABBCDDEGHHIJKLMNOPQRTTUVXXY[\]^_`abcdefghijklmn77889::€ö;<<=>?@ABBCDDEFGHIJJKMNNOQRSTUVWXYZ\]^_`abcdefghijjklnop7889::;<<=>>@@ABBCDEFGHIIJKLNNOPRSTUVWXYZ[\^^_abcdefghijjklnoppq899::;<<=>?@ABBCDDEFGHIJJLMNOPQRTTUVXXZ[\]^_`bcddeghijjklmnppqrr9::;<<==>@@ABBCDEFGHIJJKMNNOQRSTUVWXY[\]^_`abcdefghijklmnopqrrst::;<<=>?@ABBCDDEFGHIJKLMNOPQSTUVWXYZ[\^^`abcdefghijklmnopqrrsstu:;<<=>?@ABBCDEFGHIJJKMNNOQRSTUVXXY[\]^_`bcddfghijjklnopprrsstuvv<<=>?@@ABCDDEFGHIJKLMNOPRSTUVWXYZ\]^_`abcdefghjjklmoppqrrstuvvwx<=>?@ABBCDEFGHIJJKMNNPQRSTUVXXZ[\]^_abcdefghijklmnopqrrstuvvwxx€ı>?@@ABCDDEFGHIJKLMNOPRSTUVWXY[\]^_`abddeghijjkmnopqrrssuuvvwxxyy?@ABBCDEFGHIJJKMNNPQRTTUWXYZ[\^^`abcdefghijklmoppqrrstuvvwxxyyz{@ABCDDEFGHIJKLMNOQRSTUVWXY[\]^_`bcddfghijklmnopqrrstuvvwxxy‚z{{BBCDDFGHIJJKMNNPQRTTUWXYZ[\^^`abcdefhhijklnoppqrssuuvvwxxyyz{{||CDDEFGHIJKLMNOQRSTUVWXY[\]^_`bcdefghijklmnopqrrstuvvwxxyyz{{|DĈFGHIJJKMNNPQRTTVWXYZ[]^_`abcdeghhjjkmnopprrstuuvvwxxyyz{{||Ç}EFGHIJKLNNOQRSTUVWXZ[\]^_abcdefghijklmnppqrrstuvvwxxyyz{{|Í}~GHIJJLMNNPQRTUVWXYZ\]^_`abcdeghijjkmnopqrrstuvvwxxyüz{{||ŝ}~~ËHIJKLNNOQRSTUVXXZ[\]^_abcdefghijklmoppqrsstuvvwxxyyz{{|ŝ}~~JÔLMNOPQSTUVWXY[\]^_`abddfghijjlmnopqrrstuvvwxxyüz{{||ŝ}~~ÎKMNNOQRSTUVXXZ[\]^`abcdefghijklnoppqrssuuvvwxxyyz{{|ŝ}~~ĠMNOPRSTUVWXY[\]^_`bcddfghijklmnopqrrstuvvwxxyüz{{||~ÑNPQRTTUWXYZ[\^^`abcdefhhijklnoppqrssuuvvwxxyyz{{|ŝ}~~ĜQRSTUVWXY[\]^_abcdefghijklmnopqrrstuvvwxxyüz{{||ŝ}~ ~ÔSTUVWXYZ\]^_`abcdeghijjkmnoppqrstuuvvwxxyyz{{| ~ÛTUVXXZ[\]^_abcdefghijklmnppqrrstuvvwxxyüz{{||ŝ}~ ~Ö}VWXY[\]^_`acddfghijjlmnopqrrstuuvvwxxyyz{{|ŝ}~ ~}Û|XYZ[]^^`abcdefghijklnoppqrsstuvvwxxyyŝz{{| ~}|Z[\]^_abcdefghijklmnopqrrstuvvùwxxyyz{{|ŝ}~ ~ŝ}||ß\]^_`abcdeghijjkmnoppqrssuuvvwxxyy{|ŝ}~ ~ŝ}||{^ċ`abcdefghijklmnppqrrstuvvwxxyŝz{{|ŝ}~ ~ŝ}||{Ŝz_`bcddfghijklmnopqrrstuuvvwxxyyz{{|ŝ}~~ŝ}||{âzyabcdefhhjjklnoppqrsstuvvwxxyyŝz{{|ŝ}~~ŝ}||{äzyyxcdefghijklmnopqrrstuvvwxxyŝz{{|ŝ}~~ŝ}||{üzyyxxçdfghijjlmnopprrstuuvvwxxyy{|ŝ}~~ŝ}||{äzyyxxwvfghijklnoppqrsstuvvwxxyŝz{{|ŝ}~ ~ŝ}||{üzyyxxíwvvhijklmnopqrrstuvvxyŝz{{|ŝ}~ ~ŝ}||{yxäwvvuujjkmnoppqrssuuvvwxxyyz{{|ŝ}~ ~ŝ}||{üzyyxxvíutsklmnppqrrstuvvwxxyüz{{||ŝ}~ ~ŝ}||{yxäwvvutssrmnopprrstuuvvwxxyyz{{|ŝ}~ ~|{üzyyxxvèutsrrqoppqrsstuvvwxxyyz{{|ŝ}~ ~ŝ}||{ñzyyxxwvvuussrqppĦ Ÿ žŸ Ħ˘ŝ£¤¤ŝĤĤ§¨İĦ ŸžŸ Ħ˘£¤ŝĤĤ§¨İŞŝĦ  Ÿ Ħ˘£¤ŝĤĤ§¨İŞŭĞĴ  Ÿ Ħ˘£¤ŝĤĤ§¨İŞĞĴ Ÿ Ħ˘ŝ£¤¤ŝĤĤ§¨İŞĞĴŝ­   Ÿ Ħ˘£¤ŝĤĤ§¨İŞĞĴú­  Ÿ Ÿ Ħ˘£¤ŝĤĤ§¨İŞĞĴŝ­xwvutsÀ?Ÿ Ħ˘£¤ŝĤĤ§¨İŞĞĴ­ŝݰ°ĝħ²²³³´´ŸŸ Ħ˘£¤ŝĤĤ§¨İŞĞĴ­ŝݰ°öħ²²³³´´µµŸŸ Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴ­ŝݰ°ĝħ²²³³´´µµüĥŸŸ  Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥŭ·Ÿ  Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·ŝ¸  Ħ˘£¤ŝĤĤ§¨İŞŝĞĴĴŝ­Ż°ĝħ²²³³´´µµĥ·¸ Ħ˘£¤Ĥ§¨İŞĞĴŝ­ŝݰ°úħ²²³³´´µĥ·¸ı Ħ˘ŝ£¤¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ħŝ²³³´µĥ·¸ışĦ˘ŝ£¤¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĦĦ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°öħ²²³³´´µµĥĥ·¸ışöğĵĵĦĦ˘˘££¤¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışŝğĵĵ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·¸ışŝğĵĵú½˘˘£¤¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışŝğĵĵ½¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·¸ışğĵŝ½ż¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½ż¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ħú²³³´´µµĥ·¸ışŝğĵĵŝ½żÀĤ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀüÁĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŝ½żÀÁúĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ§¨İŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁü¨¨İİŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµĥ·¸ışŝğĵĵŝ½żÀÁÂù¨İİŞŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁÂùİİŞŞĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··¸ışŝğĵĵ½żÀÁÂŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂŭŞĞĴĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··¸ışğĵŝ½żÀÁÂĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁÂŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ íݰ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ üÄŻ°°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁ Ä°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀÁ Ä°ŭħ²³³ŝ´µµŝĥ··¸ışŝğĵĵ½żÀÁ Äîħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂö²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żÀÁ³´µĥ·¸ışŝğĵĵŝ½żÀÁ´µĥ·¸ışŝğĵĵŝ½żÀÁµŝĥ··¸ışŝğĵĵŝ½żÀÁÂöµĥĥ··¸¸ıışşŝğĵĵŝ½żÀÁÂúĥ··¸¸ıışŝğĵĵŝ½żÀÁÂĝ··¸¸ıışşŝğĵĵŝ½żÀÁ¸ışŝğĵĵŝ½żÀÁÂÂü¸ıışşŝğĵĵ½żÀÁÂÂÁŝışşŝğĵĵŝ½żÀÁÂÂÁşŝğĵĵŝ½żÀÁÂÂÁşŝğĵĵŝ½żÀÁÂÂÁÀŝğĵĵŝ½żÀÁÂÂÁÀĵŝ½żÀÁÂÂÁÀżĵŝ½żÀÁÂÂÁÀżŝ½żÀÁÂÂÁÀżżÀÁÂÂÁÀż›š › œ›š › œŝž››š › œž›š› œž›š› œžŸŝ›šš› œžŸš› œžŸpo n mlÀ?š› œžŸ Ħŝ˘šš› œžŸ Ħ˘š› œžŸ Ħ˘š › œžŸ Ħ˘£š › œžŸ Ħ˘£ŝš› › œžŸ Ħ˘£ŝ¤› ›œžŸ Ħ˘£¤ › œžŸ Ħ˘£¤ ›œžŸ Ħ˘£¤ŝ›› œžŸ Ħ˘£¤›œžŸ Ħ˘£¤›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥŝ§››œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§œžŸ Ħ˘£¤Ĥ§ŝ¨œœžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İüŞœœžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İŞŝžžŸ Ħ˘£¤Ĥ§¨İ ŞžŸ Ħ˘£¤Ĥ§¨İ ŞĞžŸ Ħ˘£¤Ĥ§¨İ ŞĞŝžŸŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞŸ Ħ˘£¤Ĥ§¨İ ŞĞ Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ Ş Ğ Ħ˘£¤Ĥ§¨İ Ş ĞĦ˘£¤Ĥ§¨İ ŞĞĦ˘£¤Ĥ§¨İ ŞĞŝĦ˘˘£¤Ĥ§¨İ ŞĞ˘£¤Ĥ§¨İ ŞĞŞ˘£¤Ĥ§¨İ ŞĞŞŝ˘££¤Ĥ§¨İ ŞĞŞ£¤Ĥ§¨İ ŞĞŞŝ£¤¤Ĥ§¨İ ŞĞޤĤ§¨İ ŞĞ ޤĤ§¨İ ŞĞ ޤĤ§¨İ ŞĞ ŞİĤ§¨İ ŞĞ ŞİĤ§¨İ ŞĞ Şİ¨ŝĤĤ§¨İ ŞĞ Şİ¨Ĥ§¨İ ŞĞ Şİ¨ŭ§Ĥ§§¨İ ŞĞ Şİ¨§¨İ ŞĞ Şİ¨§À™ž£¨³˙ ÎCDDEFGHIJJKMNNOPRSTTUVXXZ[\]^_`abcdefghijjklmnopprrûstuuvvxÇyDEFGHIIJKLMNOPQRSTUVWXYZ[]^^_abcddefhhijklmnoopqrrsstuuvvxyÉFGHHIJKLMNNPQRSTUVWXYZ[\]^_`abcdefghijjklmnoppqrrsstuuvvxyHÔIJJLMNNOQRSTUVWXXZ[\]^_`abcddeghhijkkmnoopqrrûstuuvvxyÌIJJKMNNOQRSTTUVXXY[\]^^_abcddefghijjklmnoppqrrsstuuvvŝwxxyĠJKMNNOPRSTTUVWXYZ[\^^_aabcdefghijjklmnoppqrrŭstuuvŝwxxy×MNNOPQRTTUVWXYZ[\]^_`abcdefghhjjkkmnoopprrsütuuvvŝwxxyQPONMLKJIH GFEÀ?ÚXYZ[\]^_`abcddefghijjklmnoppqrrssttuuvvŝwxx yxŬZ[\]^_`abcddefghijjklmnoppqrrsstuuvvŝwxxyxß\]^_`abcddefghijjklmnoppqrrsstuuvvwxyxßwv^_`abcddefghijjklmnoppqrrsstuuvvŝwxxyxàwvv`abcddefghijkklmnopqqrrsstuuvvŝwxxyxvíbcddefghijkklnnopqrrûsttuvvŝwxxyz{ŝzyyxŝwvvudñefghijklmnoppqrrûstuuvvŝwxxyz{yxŝwvvuċtefghijklmnoppqrrsstuuvvwwxxyz {yxŝwvvusíghijklmnoppqrrsstuvvŝwxxyŝz{ {ŝzyyxvuëtssrijklmnoppqrrsstuvvŝwxxyŝz{{ŝzyyxŝwvvuètsrrqklmnoppqrrsttuvvwwxxyz{yxŝwvvèutssrrppmnoppqrrstuuvvwxxyŝz{{|{yxċwvvuutsrrqppooppqrrstuuvvwxxyŝz{{ |{ŝzyyxvuëtsrrqppompqrrstuuvvwxxyŝz{{|{ŝzyyxŝwvvêutssrqpponmlrrstuuvvwxxyz{|{ŝzyyxçwvvuutsrrqpponlkjstuuvvwxxyŝz{{|{üzyyxxĉwvvuussrrpponmlkjiuuvvwxxyyŝz{{|}~ŝ}||{üzyyxxvêutssrqpponmkjjhhvvwxxyyŝz{{|}~ŝ}||{yxéwvvuutsrrqponmlkjihgfwxxyŝz{{|ŝ}~ ~ŝ}||{yxäwvvuussrqpponmljjhhgfdxxyyz{{|} ~|{üzyyxxvèutsrrqppomlkjihhfedcyyz{{|ŝ}~ ~|{àzyyxxwvvuutsrrpponmlkjihgfdcbbz{{|ŝ}~~|{yxwvvutssrqppomlkjihhfedcba`{{||ŝ}~~ŝ}||{ùzyyxxwvvçutsrrpponmlkjihgfdcbb`_^||ŝ}~~ŝ}||{Ŭzyyxxwvvutssrqpponlkjihhfedcba`^]\||ŝ}~~ŝ}||{yxßwvvutsrrqponmljjihgfddbb`_^]\[|}~~ŝ}||{Úzyyxxwvvutssrqppomlkjihgfedcba`^]\[ZY~~ŝ}||{üzyyxxŜwvvutsrrqponmljjihgfdcba`_^]\ZYXW~~ŝ}||{×zyyxxwvvutsrrqppomlkjihgfedcba_^]\[ZXWVU~ ~ŝ}||{Ġzyyxxwvvuutsrqpponmkjjhhgedcba`_^\\ZYXVVUS~ ~ŝ}||{Ôzyyxxwvvutsrrqponmlkjihgfedcb`_^]\[YXWVUTSR~ ~ŝ}||{Òzyyxxwvvutssrqpponlkjihhfedcba`^]\[ZYWVUTSRQP~~ŝ}||{zyyxxwvvuutsrqpponmljjihgfdcba`_^]\[YXWVUTRRPON~~}|{yxÔwvvutsrrqponmlkjihgfedcba_^]\[YXWVUTSRQONNL~~}|{Ízyyxxwvvutsrrqpponlkjihhfedcba`_]\[ZYXVVUSRQPONMKJ~~}|{Èzyyxxwvvuutsrqpponmkjjihgfdcbb`_^]\[YXWVUTSRPONNLKJI~}}||{Èzyyxxwwvvutsrrqponmlkjihgfedcba_^]\[ZXWVUTSRQONNMKJJIG}||{üzyyxxÍwvvutsrrqpoomlkjihgfedcba`_]\[ZYXVVUSRQPONMLJJIHGF||{yxÉwvvutssrqpponlkjihhgedcba`_^]\[YXWVUTSRPONNLKJIHGFED||{{Äzyyxxwvvuutsrqpponmlkjihgfedbba_^]\[YXWVUTSRQONNMKJJIHFFEDC{{zyyxxwvvuutsrrqponmlkjihgfedcba_^]\[ZYXVVTSRQPONMKJJIHGFEDDCB{zyyxxÄwvvutsrrqpponlkjihhfedcba`_^\\ZYXWVUTRRPONMLKJIHGFEDDCBBAyyxx‚wvvutssrqpponmkjjihgfdcbb`_^]\[YXWVUTSRQONNLKJJIGFFDDCBBA@?yxxwvvuutsrrqponmlkjihgfedcba_^]\[ZYWVUTSRQPNNMKJJIHGFEDCBBA@?>=xwvv€xutsrrqponmlkjihgfedcba`_]\\ZYXWVUTRRPONMLKJIHGFEDDCBAA??>==<<;vuutsrrqponmlkjihgfedcba_^]\[ZXWVUTSRQPNNMKJJIHFFEDCBBA@?>=<<;::utsrrqpoomlkjihgfedcba`_]\\ZYXVVUTRRPONMLKJIHGFEDDCBA@?>>=<<;::9ssrqpponmkjjihgfdcbb`_^]\[YXWVUTSRQONNLKJIHGFEDDCBBA@?>=<<;::988rrqponmlkjihgfedcba_^]\[ZYWVUTSRQPNNMKJJIHFFEDCBBA@?>=<<;::988Á7qpponlkjjhhgedcba`_^]\ZYXWVUTRRPONMLKJIHGFEDDCBA@?>>=<<;::98877Äponmlkjihgfedcba_^]\[ZXWVUTSRQONNMKJJIGFEDDCBBA@?>=<<;::988776Èonlkjjhhgedcba`_^\\ZYXWVUTRQPONMLJJIHGFEDCBBA@?>=<<;::988765ŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışŝğĵĵŝ½żÀÁŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵ½żÀÁĴŝ­Ż°ĝħ²²³³´´µµĥ·¸ışŝğĵĵŝ½żÀÁŭĴ­ŝݰ°úħ²²³³´´µĥ·¸ışŝğĵĵ½żÀÁŝÂŝݰ°üħ²²³³´µĥ·¸ışŝğĵĵŝ½żÀ ÁûÂŻ°°ħŝ²³³´µĥ·¸ışŝğĵĵŝ½żÀ ÁÂŝݰ°ħŝ²³³´µĥ·¸ışğĵ½żÀ ÁÂŝsrrqponm lkÀ?µĥ·¸ışŝğĵĵŝ½żÀÁúµĥĥ··¸¸ışŝğĵĵŝ½żÀ Á Áüĥ··¸¸ışŝğĵĵŝ½żÀ Á Áŝ·¸¸ışŝğĵĵ½żÀ Á  Á¸ışŝğĵĵ½żÀÁ ÂÁÀışŝğĵĵ½żÀÁÂÁÀşŝğĵĵ½żÀÁÂÁÀŝżşşŝğĵĵŝ½żÀÁÂÁÀżŭşğĵĵŝ½żÀÁÂÁÀżĵŝ½żÀÁÂÂÁÀżûĵĵ½żÀÁ ÂÁÀżŝ½żÀÁÂÂÁÀżżÀÁÂÂÁÀżü½żżÀÁÂÂÁÀżŭ½ĵżżÀÁÂÂÁÀż½ĵżÀÁÂÂÁÀżŝ½ĵĵÀÁÂÂÁÀż½ĵŭğÀÁÁÂÂÁÀżŝ½ĵĵüğşşÁÁÂÂÁÀżŝ½ĵĵŝğşşÁÂÂÁÀżŝ½ĵĵŝğşşŭıÁÂÂÂÁÀżŝ½ĵĵŝğşşıÂÂÁÀżŝ½ĵĵŝğşşı¸ŝ Ä ÂÁÀżŝ½ĵĵŝğşşı¸ŝ·Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ŝĥÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ Ä ÂÁÀżŝ½ĵĵŝğşşıŝ¸··ĥµŝ´Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´ŭ³ÄÄ ÂÁÀż½ĵğşı¸·ŝĥµµ´³Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²Ä ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŭħ°ÄÄ ÂÁÀżŝ½ĵĵŝğşşıŝ¸··ĥµ´³²úħ°°ÄÄ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻ ÂÁÀżŝ½ĵĵŝğşşı¸·ĥµŝ´³³ŭ²ħ°°üŻÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŭ­ĴÂÁÀżŝ½ĵĵŝğşşı¸·ĥµŝ´³³ü²ħħ°°ŝŻü­ĴĴÂÁÀż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŝĞÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴûĞŞŞÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴûĞŞŞİÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴ÷ĞŞŞİݨÂÂÁÁÀż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻ­ĴŭĞŞİݨ§ÁÀżŝ½ĵĵŝğşşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§úĤÁÁÀÀżż½ĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴúĞŞŞİݨ¨§ĤŝÀÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥü¤Àżżŝ½ĵĵŝğşşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£żżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥ¤ŭ£˘½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘ŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħü½½ĵĵŝğşşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤£˘ĦžŸ Ħ˘£¤Ĥ§¨İŞžŸ Ħ˘£¤Ĥ§¨İŞžŸ Ħ˘£¤Ĥ§¨İŞŸ Ħ˘£¤Ĥ§¨İŞŸ Ħ˘£¤Ĥ§¨İŞŸ Ħ˘£¤Ĥ§¨İŞŝŸ  Ħ˘£¤Ĥ§¨İ ŞlkjÀ?˘£¤Ĥ§¨İŞ˘£¤Ĥ§¨İŞŝİ££¤Ĥ§¨İŞİ£¤Ĥ§¨İŞİŝ£¤¤Ĥ§¨İŞİ¤Ĥ§¨İŞİŝ¨¤¤Ĥ§¨İŞİ¨ŝ¤Ĥ§¨İŞİ¨Ĥ§¨İŞİ¨ü§ĤĤ§¨İ Şİ¨§Ĥ§¨İ!Şİ¨§ŝĤ§§¨İ"Şİ¨ §¨İ#Şİ¨§ŝĤ§§¨İ$Şİ¨§Ĥŝ§¨¨İŞĞŞİ¨§Ĥ¨İŞĞŞİ¨§Ĥ¨İ Ş Ğ Şİ¨§Ĥİ Ş Ğ Şİ¨§ĤŝİŞ ŞĞ Şİ¨§Ĥ¤ ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŝ£ŞŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘Ğ Şİ¨§Ĥ¤£˘ĦĞ Şİ¨§Ĥ¤£˘ĦĞ Şİ¨§Ĥ¤£˘Ħŝ Ğ Ğ Şİ¨§Ĥ¤£˘Ħ  Ğ Şİ¨§Ĥ¤£˘Ħ Ğ Şİ¨§Ĥ¤£˘Ħ ŝŸĞĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ ŸĞ Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ Ÿž Şİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŞİ¨§Ĥ¤£˘Ħ ŸžŭœŞİݨ§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœŝݨ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœŭ›¨§§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›Àŝ³¸¸½ÂÇÌÑ ×Ü˙ y {zyxŝwvvuútsrr3ŝ y {zyxŝwvvuĝtsrrqC ŝyŝz{{zyxŝwvvu÷tsrrqppŝ yxwvuötsrrqpp6ŝ yxŝwvvuġtsrrqppo;ŝ yxŝwvvuútsrrqppüo0 ŝyxŝwvvuútsrrqppûF6ŭ* EFGúD4# ûe)9údc)7ĝdcbb(5ödcbba_'ñdcbba`_^&ŭxwvvuàtssrrqppoonmlkjihhgfedcba`_^]\&ŝwvvuútssrrppçonmlkjihhgfedcba`_^]\[Z%vuŬtssrrqpponmlkjjihgfedcbb`_^]\[ZYX$ŝvuusràqppoonmkjjihgfedcbba_^]\\ZYXWV#uútssrrppâonmlkjihhgfedcba`_^\\[YXWVUT"Ĝtssrrqpponmlkjjhhgfedcba`_^]\[ZXWVUTSR"srpoànmkkjihgfedcbb`_^]\[ZYXVVUTRRQ!rÚqpponmlkjihhgfddbba`^]\\ZYXWVUTSRQON Ĝrppoomlkjjihgfedcba`_^]\[YXWVUTSRQPONM pÚonmlkjihhfedcbb`_^]\[ZYXVVTTRQPONMLKoÚmlkjjhhgfedcba`_]\\ZYXWVUTSRQONNLKJJĜnmlkjihgfedcba`_^]\[YXWVUTSRQPNNMKJJIHĜlkjjhhgfedbba_^]\[ZYXVVUTRQPONMLKJIHGFĜkjihgfedcba`_^\\[YXWVUTSRQONNLKJIHGFEDĜjhhgfddbba_^]\[ZXWVUTSRQPNNMKJJIHGFEDCĜhgfedcba`_^\\ZYXWVUTRRPONMLKJIHGFEDDCBĜgfdcbb`_^]\[ZXWVUTSRQONNMKJJHGFEDDCBBAĜedcba`_]\\ZYXVVUTRQPONMLJJIHGFEDCBBA@?Ĝcbb`_^]\[YXWVUTSRQONNLKJIHGFEDDCBAA?>>Ĝba`_]\[ZYXVVTSRQPONMKJJIHFFEDCBBA@?>=<Ĝ`_^]\[YXWVUTSRQONMLKJIHGFEDDCBA@?>=<<;Ĝ^]\[ZYXVUTSRQPNNMKJJIHFEDDCBBA@>>=<<;:Ĝ]\[YXWVUTRRPONMLKJIHGFEDCCBA@?>=<<;::9Ĝ[ZYWVUTSRQONNMKJJHGFEDDCBBA?>>=<<;::98ĜYXWVUTRRPONMLKJIHGFEDCBBA@?>=<<;::9887ŜWVUTSRQONNMKJJHGFEDDCBBA@>>=<;::9887ŝŬVUTRRPONMLJJIHGFEDCBBA@?>=<<;::98877ŭ6áTSRQONNLKJIHGFEDDCBA@?>>=<;::98876ŝàRQPONMKJJIHFFEDCBBA@?>=<<;::9887765ŝâQONNLKJIHGFEDDCBA@?>=<<;::988776û544NċMKJJIHFFDDCBBA@?>=<<;::98877654ŭ3ċMLKJIHGFEDDCBA@?>=<<;::988776ŝ5443ŝĉKJJHGFEDDCBBA@?>=<<;::9887765432ŝèJIHGFEDCBBA@?>=<<;::988776ŝ54432ŝéHGFEDDCBA@?>>=<<;::9887765432ŭ1FDïCBBA@?>=<<;::988776ŝ544321ŝìEDCBBA@?>=<<;::998877654321ŝîDCBBA@?>=<<;::988776ŝ544321ŝBôA@?>=<<;::9887654321ŝñA@?>==<;;::988776ŝ544321ŭ0ó@?>=<<;::988776ŝ5443210ŝ÷>=<<;::98876543210ŝö=<;;::988776ŝ5443210ŝĝ<;::988776ŝ5443210ŝ:ŝ98876543210ŝ9876ŝ544321 0ŝ876ŝ544321 0ŝ7654321 0ŝ76543210ŭ16ŝ54432101ŝŭ654432101ŝú5443322101ŝŝÁÂÂÁÀżŝVŝ ÂÁÀżü‡ ŝÂÁÀżŝ!ŝ  ÂÁÀżŭ•(ŝ  ÁÀżŭˆ#ŝ ÁÀżŭ] ŝ ÁÀżû‘_ŭMklúiZA' ûşM9úşıM7üşııŝL5üşıı¸ŝLùşıı¸·ŝLÁÀż½ĵğşı¸·ŭĥKÁÀżŝ½ĵĵŝğşşı¸·ĥŭµKŝÁÀÀżŝ½ĵĵŝğşşı¸·ĥµŝKÀż½ĵŝğşşı¸·ĥµ´ŝKÀżŝ½ĵĵğşı¸·ĥµ´³ŝJżŝ½ĵĵŝğşşı¸·ĥµ´³ŭ²Jż½ĵŝğşşı¸·ĥµ´³²ŭħIżŝ½ĵĵğşı¸·ĥµ´³²ûħ°°I½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŭŻHŝ½ĵĵŝğşşı¸·ĥµŝ´³³²ŝħ°°üŻH½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝHŭ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻ­ŝGŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻû­ĴĴGĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞGĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻ­ĴüĞŞFŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴúĞŞŞİFşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨFşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨŝEı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴġĞŞŞİݨ¨§§Eüı¸¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĞŝŞİݨ§ŭĤE¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤD·ĥµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥü¤Dó·ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ŝDġĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝDµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ü£˘C´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘ŝCù´³³²²ħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ù£˘˘ĦĦCû³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘ĦŝCŭ²ħ°°ŝŻŝ­ĴĴĞŝŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦŭ Bŝħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ ŝB°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ ŭŸBŭ°Żŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤£˘Ħ ŸŭžBŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ ŸžŝAŭ­ĴĴŭĞŞİݨ§Ĥŝ¤¤£˘Ħ ŸžŭAŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ ŸžŝAĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ ŸžŝAüĴĞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ ŸžŝAŞİ¨§Ĥŝ¤¤ŝ£˘˘Ħ ŸžŝAݨ§Ĥŝ¤¤£˘Ħ ŸžŭœAúݨ¨§§ĤĤŝ¤¤ü£˘˘ĦĦ ŸžœŝAŝ¨§§Ĥŝ¤¤ŝ£˘˘Ħ ŸžœŝA§Ĥŝ¤¤£˘Ħ ŸžœŝAĤŝ¤¤ŝ£˘˘Ħ ŸžœŝAŭĤ¤¤ŝ£˘˘Ħ ŸžœŝA¤£˘Ħ ŸžœŝA¤ü£˘˘ĦĦ Ÿž œŝAŭ¤£˘˘Ħ Ÿž œŝA˘Ħ ŸžœŝAŝ˘ĦĦ ŸžœŝAĦ ŸžœŭAŝĦ  ŸžœŝA ŝŸžžœŝAŞİ¨ŭ§Sŝ Şİ¨§ŭ‚ ŝŞİ¨§ŝ!ŝ Şİ¨§ŭŽ&ŝŞİ¨§ŭ‚#ŝŞİ¨§ŭY ŝ Şİ¨§ûŒ\ŭDjúgW?& û¤D9ú¤¤D7ŭ¤¤ŝD5ŭ¤¤ŭ£Dú¤¤£ŝDŝŞİݨ§Ĥ¤£ŭ˘Cݨ§Ĥ¤£˘ŝCݨ§Ĥ¤£˘ŝCݨ§Ĥ¤£˘ŭĦC¨§Ĥ¤£˘ĦŝC¨§Ĥ¤£˘ĦŝB¨§Ĥ¤£˘Ħ ŝBŝ¨§§Ĥ¤£˘Ħ ŝB§Ĥ¤£˘Ħ ŭŸB§Ĥ¤£˘Ħ ŸŝB§Ĥ¤£˘Ħ ŸŝBŝ§ĤĤ¤£˘Ħ ŸŝBĤ¤£˘Ħ ŸžŝBŝĤ¤£˘Ħ ŸžŝB¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŝAŝ¤¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŝA¤£˘Ħ ŸžŝA¤£˘Ħ ŸžœŝAŝ¤££˘Ħ ŸžœŝA£˘Ħ ŸžœŝAŝ£˘˘Ħ ŸžœŝA˘Ħ Ÿžœŝ@˘Ħ Ÿžœ›ŝ@˘Ħ Ÿžœ›ŝ@Ħ Ÿžœ›ŝ@Ħ Ÿžœ›ŝ@ Ÿžœ›ŝ@ Ÿžœ›ŭš@ Ÿžœ›šŝ@Ÿžœ›šŝ@Ÿžœ›šŝ@Ÿžœ›šŝ@ŝŸžžœ›šŝ@žœ› šŝ@žœ› šŝ@ŝžœ› šŝ@œ›šŝ@œ›šŝ@œ›šŝ@ŝœœ ›šŭ™?œ›š™ŝ?œ›š™ŝ?œ ›š™ŝ?œ›š™ŝ@ŝœ››š™ŭš@›š™šŝ@›š™šŝ@›š ™šŝ@›š ™šŝ@ŝ›šš ™šŝ@#˙ŝħ7ŝL˙˙9˙ŝğ6ŝ˙˙ŝù6ŝG˙˙7˙ŝ“3ŝ˙˙ŝ“Ü×ŝĉ˙ ˙ŝ“!˙ŭĝ ˙ŭü½˙ŭ÷·˙úŭï§  !€€€€$ŝŝ+//0$ŝŝ+/ /01$ŝŝ+/ /01$ŝŝ+/ /01$ŝŝ+//01ŝ2#ŝŝ+//012$ŝŝ+//012ŝ3#ŝŭ+/00123ŝ4#ŝŝ,001234$ŝŝ,001234ŝ5#ŝŭ<0112345ŝ6#ŝŝT1123456$ŝŝ611234567$ŝ'ŝ211234ŝ5667$ŭ#ŭ42234ŝ56678%ŝ üF23345678ŝ9 ŝŭ&3445678ü9:: ŝŝù 544556678ŝ9::ŝ; ŝŝ ŝ6678ŝ9::ü;<< ŝŭü7;778ŝ9::ŝ;<<ŝ= ŝŝûF;788ŝ9::ŝ;<<ü=>> ŝü3& ù,F899::ŝ;<<ú=>>?@ ŝû2ĝB=::;<<ĝ=>>?@@A ŝú2*=E?<=>>?@@ABB ŝŝ1ŭù (%>JKKŝL ŝŝ0ü 1ŝŝ/ŭ0ŝŝ/û( -ŝŝ.ù !ŝŝ. ŭ> !ŝŝ-8ŝŝ-8ŝŝ-8ŝŝ-8ŝŝ,8ŝŝ,8ŝŝ,8ŝŝ+8ŝŝ+8ŝŝ+8ŝŝ+8ŝŝ+8ŝŝ+8ŝŝ+8ŝŝ+8ŝŝ+8ŝŝ,8ŝŝ,8ŝŝ<8ŝŝT8ŝŝ6=ŝ29ŝŝ9ŝ ŭF8ŝŝ&9ŝŭ 58ŝ ŝ9ŝŭ78ŝŭF8ŝ ŭ,8ŝüB7ŝü*=6ŝù (%>JKKL)ŭ $ŝŝŽ››œ$ŝŝŽ› ›œŝ#ŝŝŽ› ›œ$ŝŝŽ› ›œ$ŝŝŽ››œ$ŝŝŽ››œž$ŝŝŽ››œž$ŝüŽ››œœžŸ$ŝŝœœžŸŝ #ŝŝœœžŸ $ŝü”œœžŸ Ħ$ŝŝ“žŸ Ħ$ŝŝužŸ Ħ˘$ŝ)ŝYžŸ Ħ˘ŝ£#ŭ:ŭ,œžžŸ Ħ˘ŭ£¤$ŝû‘žžŸŸ Ħ˘ŝ£¤¤!ŝüLŸŸ  Ħ˘ŝ£¤¤!ŝŝŭ ‹  Ħ˘£¤!ŝŝŭ4œĦĦ˘£¤üĤĤ ŝŭ"ûXĦĦ˘˘ŝ£¤¤ŝĤĤŝ§ ŝŝùhĦ˘££¤¤ŝĤĤ§!ŝü•: üMĦ¤¤Ĥ§¨!ŝû”%ĝ(ƒ£¤ĤĤ§¨ŝİ ŝú” ú9wž§§¨İ!ŝŝ“ŭ"ù6Jcnooŝp ŝŝ“ü 1ŝŝ’ŭ0ŝŝ’û( -ŝŝ‘ù !ŝŝ‘ ŭ> !ŝŝ8ŝŝ8ŝŝ8ŝŝ8ŝŝ8ŝŝ8ŝŝ8ŝŝŽ8ŝŝŽ8ŝŝŽ8ŝŝŽ8ŝŝŽ8ŝŝŽ8ŝŝŽ8ŝŝŽ8ŝŝŽ8ŝŝ8ŝŝ8ŝŝ”8ŝŝ“8ŝŝu=ŝY9ŝŝ,9ŝŭ‘8ŝŝL9ŝŭ ‹8ŝŝ49ŝŭX8ŝŭh8ŝ ŭM8ŝü(ƒ7ŝü9w6ŝù6Jcnoop)ŭ $ŝŝŒ™™š$ŝŝŒ™™š$ŝŝŒ™™š$ŝŝŒ™ ™š$ŝŝŒ™ ™š$ŝŝŒ™™ š$ŝŝŒ™™ š$ŝŝŒ™™š$ŝŝŒ™™š$ŝŭŒ™šš›$ŝŝ’šš›$ŝŝ’šš›$ŝŝsš š›$ŝ)ŝXš š›$ŭ9ŭ+™šš ›ŝœ$ŝŭŽšš ›œ!ŝŝJšš ›œ!ŝŝü ‡š› ›œ!ŝŝŭ3—››œ!ŝŭ"ŭV›› œ!ŝŝüeš›› œ!ŝüŽ9 üKšœ œ!ŝûŽ%û'~›œœ!ŝúŽû8r–œœ!ŝŝŽŭ!ú5G_kk!ŝŝŽü 1ŝŝŭ0ŝŝû( -ŝŝù !ŝŝ ŭ> !ŝŝ8ŝŝ8ŝŝ8ŝŝ8ŝŝ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝŒ8ŝŝ’8ŝŝ’8ŝŝs=ŝX9ŝŝ+9ŝŭŽ8ŝŝJ9ŝŭ ‡8ŝŝ39ŝŭV8ŝŭe8ŝ ŭK8ŝü'~7ŝü8r6ŝú5G_kkl)ŭ 12ŝ344ŝ56678Ġ9::;<<=>?@ABCDDEFGHIJKLMNOQRSTUVWXY[\]^_ab112345678Ñ9::;<<=>?@ABBCDDEFHIJJKMNNPQRSTUVXYZ[\^^_abc1122ŝ344ŝ56678Ñ9::;<<=>?@ABBCDEFGHIJJLMNOPRSTUVWXY[\]^_`abdd122345678Ì9::;<<=>?@ABBCDDEFGHIJKLNNOQRSTUVWXY[\]^_abcdef223344ŝ56678Ĉ9::;<<=>?@ABBCDEFGHIJJKMNNPQRTTVWXYZ[\^^`abcdefg233445566778Ì9::;<<=>>@@ABCDDEFGHIJKLMNOPRSTUVWXY[\]^_`abddeghh344ŝ56678Ĉ9::;<<=>?@ABBCDDEFHHJJKMNNOQRSTUVWXY[\]^_abbddfghij445566778ŝ9::Ì;<<=>?@ABBCDEFGHIJJKMNNPQRSTUVXXZ[\]^_abcdefghijk556678É9::;<<=>?@ABBCDDEFGHIJKLMNOPRRTUVWXYZ[\^^`abcdefghijkl66789:Ê;<<=>?@ABBCDDFFHHJJKLNNOQRSTUVWXYZ\]^_`abcdefghijklm6778Ĉ9::;<<=>>@@ABBDDEFGHIJJKMNNOQRSTUVWXY[\]^_`abcdefghijklmn778ŝ9::Ç;<<=>?@ABBCDDEFGHIJJLMNNPQRSTUVWXY[\]^_`abcdefghijklmno788À9::;<<=>>?@ABBCDDFFHHIJKLMNOPQRTTUVXXZ[\]^_`abcdefghijklmnop889::‚;<<=>?@ABBCDDEFGHIJJKLNNOPRSTUVVXXZ[\]^_`abcdefghijjkmmoop99::;<<=>>?@ABBCDDEFGHIJJKMNNOQRSTUVWXYZ[\]^_`abcdefghijjklmoopp::;<<€ƒ=>?@ABBCDDEFFHHIJJLMNNPQRSTUVWXYZ[\]^_`abcdefghhjjklmnoppq:;<<=>>?@ABBCDDEFGHIJJKLMNOPQRSTUVWXYZ[\]^_`abcdeeghhijkkmmooppr<<==>?@ABB€òCDDEFGHIJJKMNNOPQRSTUVWXYZ[\]^_`abcddegghijjklmnooppr<=>?@@ABBCDDEFFHHIJJKMNNOPQRTTUVWXYZ[\]^_`abbddefghhjjkkmmooppqr>>?@ABBCCDDEFGHIJJKLMNNOQRRTTUVWXYZ[\]^^_aabcdeegghijjklmmooppqr?@AABBCDDEFFHHIJJKLMNNPQRSTTUVWXYZ[\]^^_aabcddegghhjjkklmmooppñr@ABBCDDEEFGHIJJÓLMNNOPQRSTTUVWXYZ[\\^^_`abbddeegghijjkklmmooppûqBBCDDËEFFHHIJJKLMNNOPQRSTUUVWXYZ[\\^^_`abbcddefghhijjkklmmoopCDùEFFGHIJJÏKMMNNOQQRSTUUVWXYZ[[\]^__aabbddeegghhijjkklmmnooppLMNOPQRSTUVWXYZ[À??üLMMNNOPQRSTUVWXYZ [ŝ\>ŝœžŸ Ħ˘£¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ïħ²²³³´´µµĥĥ··¸¸ıžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµĥ·¸ıžŸ Ħ˘£¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ııüşžžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşžŸ Ħ˘£¤ĝĤĤ§§¨¨İİŞĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··¸ışžŝŸ  Ħ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··ŝ¸ıışğŸ Ħ˘ŝ£¤¤ĝĤĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ħ²²³³´´µµĥĥ··¸¸ıışüğĵĵ  Ħ˘ŝ£¤¤üĤĤ§§¨İŭŞĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·¸ışŝğĵĵŝ ĦĦ˘ŝ£¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµŝĥ··¸ışŝğĵĵĦ˘ŝ£¤¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵĝ½ĦĦ˘˘££¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵŭ½˘˘ŝ£¤¤Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·ŝ¸ıışŝğĵĵù½˘££¤¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ħŝ²³³´µĥ·ŝ¸ıışŝğĵĵ½ŝ£¤¤ŝĤĤ§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·ŝ¸ıışŝğĵĵ½¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·ŝ¸ıışŝğĵĵŝ½¤ŝĤĤ§¨İŞĞĴŝ­Ż°ĝħ²²³³´´µµĥ·¸ışğĵ½Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışğĵ½Ĥ§¨İŞŝĞĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışŝğĵĵ½§¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışğĵ½§¨İŞŝĞĴĴŝ­Ż°üħ²²³³´µĥ·¸ışŝğĵĵ½¨İŞŝĞĴĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışğĵ½ŝ¨İİŞĞĴŝ­ŝݰ°üħ²²³³´µĥ·¸ışŝğĵĵ½İŞŝĞĴĴŝ­Ż°ħ²³´µĥ·¸ışğĵ½ŞŝĞĴĴ­ŝݰ°ŝħ²²³´µĥ·¸ışğĵ½pqr st u vwÀ??pqr st u vw? š›œžŸ Ħ˘£¤ š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤ŝšš›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤š›œžŸ Ħ˘£¤ŝš››œžŸ Ħ˘£¤ŝĤ››œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥ›œžŸ Ħ˘£¤Ĥŝ§››œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§ŝ›œœžŸ Ħ˘£¤Ĥ§œžŸ Ħ˘£¤Ĥ§œžŸ Ħ˘£¤Ĥ§œžŸ Ħ˘£¤Ĥ§œžŸ Ħ˘£¤Ĥ§œžŸ Ħ˘£¤Ĥ§žŸ Ħ˘£¤Ĥ§žŸ Ħ˘£¤Ĥ§žŸ Ħ˘£¤Ĥ§žŸ Ħ˘£¤Ĥ§ŝžžŸ Ħ˘£¤Ĥ§l mnoÀ??l mn o?cdefghijklmnopqrrstuvvwxxyyz{{|ŝ}~~ŝ}||{ázyydefhhijklnoppqrssuuvvwxxyyz{{|ŝ}~~|{ĉzyyxxeghijjlmnopprrstuuvvxxyüz{{||~ŝ}||{äzyyxxwghijklmnopqrrstuvvwxxyy{|~ŝ}||{üzyyxxvëhijklmoppqrsstuvvwxxyy{|~ŝ}||{àzyyxxwvvujjkmnoppqrssuuvvwxxyyz{{|ŝ}~ ~ŝ}||{üzyyxxvëutjlmnopprrssuuvvwxxyy{| ~ŝ}||{âzyyxxwvvuusslmnopprrstuuvvwxxyy{|ŝ}~~ŝ}||{üzyyxxvêutsrrmnopprrssuuvvwxxyyŝz{{|~}|{ŝzyyxèwvvuussrrpnopprrssuuvvwxxyŝz{{|}|{yxŝwvvîutsrrqppopprrssuuvvxyŝz{{|{üzyyxxĉwvvuussrrqponpprrsstuuvvwxxy{|{üzyyxxèwvvuutsrrqpponmpqrrstuuvvxy{ |{ŝzyyxŝwvvíutssrrqponmlkqrrssuuvŝwxxyŝz{{|{ŝzyyxŝwvvuòtsrrqpponmlkjrrsuvŝwxxy{ŝzyyxŝwvvuétsrrqpponmlkjjirrsstuuvvŝwxxyŝz{{zyxŝwvvuçtssrrqpponmlkjihhrrsstuuvvŝwxxyxwvuètssrrqpponmlkjjihgfrrssuuvŝwxx yxwvuċtssrrqppoommkkjihhgferrsstuuvŝwxxwvuĉtssrrqppoonmlkjjihgfeddrrssuvw xwvuütssrréqppoonmlkjjihhgfedcbrrssŝtuuvw vuŝtssréqppoonmlkjjihhgfeddcbarrsŝtuu vutsrŝqppoûnmlkjjhġgfeddcbba_rrsŝtuutsrŝqpponümlkjjïihggfeddbba`_^pqrrstsrqpoċnmmlkjjiihggfeddcbaa__^][[\\[ZYXWVUŝTż??\[ZYXWVUT?ışŝğĵĵŝ½żÀÁ Ä ÂŝÁşşŝğĵĵ½żÀÁ Ä ÂÁşŝğĵĵŝ½żÀÁ Ä ÂÁŭşğĵĵŝ½żÀÁ Ä ÂÁŭÀğĵĵŝ½żÀÁÂÂÁÀĵ½żÀÁÂÂÁÀúżĵĵ½½żÀÁÂÂÁÀżŭĵ½żÀÁÂÂÁÀżŝ½żÀÁÂÂÁÀżżÀÁÂÂÁÀżżÀÁÂÂÁÀżżÀÁÂÂÁÀż½żÀÁÂÂÁÀżû½ĵĵżżÀÁ ÂÁÀżŝ½ĵĵŝżżÀÁÂÂÁÀżŝ½ĵĵżÀÁÂÁÀż½ĵŭğşżżÀ Á ÂÁÀżŝ½ĵĵüğşşżżÀ Á ÁÀż½ĵğşżÀÁÀż½ĵŝğşşŝıżżÀÁÀż½ĵŝğşşıżÀÁÀż½ĵğşıŝ¸żżÀż½ĵğşı¸ŝżżÀ ż½ĵŝğşşı¸ü·żż½ĵŝğşşı¸·&w v utÀ??#w v utŝs>¤Ĥ§¨İ ŞĞޤĤ§¨İ ŞĞ Şŝ¤Ĥ§¨İ ŞĞ ŞŝİĤ§¨İ ŞĞ ŞİĤ§¨İ ŞĞ Şİŭ¨ĤĤ§¨İ ŞĞ Şİ¨Ĥ§¨İ ŞĞ Şİ¨Ĥ§¨İ ŞĞ Şİ¨ŭ§Ĥ§§¨İ Ş Ğ Şİ¨§¨İ Ş Ğ Şİ¨§¨İŞĞŞİ¨ §¨İ$Şİ¨§ŝĤ§§¨İ"Şİ¨§Ĥ§¨İ!Şİ¨§Ĥü§§¨¨İŞİ¨§Ĥ§¨İŞİ¨§Ĥ§¨İŞİ¨§Ĥŝ§¨¨İŞİ¨§Ĥ¤ŝ§¨¨İŞİ¨§Ĥ¤§¨ İ Şİ¨§Ĥ¤§¨İ¨§Ĥ¤§¨İ¨§Ĥ¤ŝ£§§¨§Ĥ¤£§¨ §Ĥ¤£'onmÀ??$onm?x€ĵwvvutsrrqponmlkjihgfedcba_^]\[YXWVUTSRQONMLKJIHGFEDCBBA@?>=<<;xvvuutsrrpponmkjjhhgedcba`_^\\ZYXWVUSRQPNNMKJJIHFFDDCBBA@>>=<<;:vvutsrrqppomlkjihgfedcba_^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>=<<;::9vutsrrpponmljjihgfddbb`_^]\[YXWVUTRRPONMLJJIHGFEDCBBA@?>=<<;::98tssrqpponlkjihhfedcba`^]\[ZYXVVTSRQPNNMKJJIHFEDDCBBA@>>=<<;::988srrqponmlkjihgfedcba_^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>=<<;::98877rqpponmkjjhhgedcbb`_^]\[YXWVUTSRPONMLJJIHGFEDDBBA@?>=<<;::98877qpoomlkjihgfedcba`^^\\ZYXVVTSRQPNNMKJJIHGFEDCBBA@?>=<<;::988776ponmlkjihgfedcba_^]\[ZXWVUTSRQPNNMKJJIHFFDDCBBA@?>=<<;::988776Ċonlkjjhhgeddbb`_^]\[YXWVUTSRQONNMKJJHGFEDDCBBA@>>=<<;::988776Ċ5mlkjihgfedcba`_^\\[YXWVUTSRQONNLKJIHGFEDDCBBA@>>=<<;::9887765Çkjjihgfedcba`^]\\ZYXWVUTRRPONMLKJIHGFEDDCBBA@>>=<<;::9887765Ç4jjhhgeddbba_^]\[ZYXVVUTRQPONMLKJIHGFEDDCBBA@>>=<<;::988776Ĉ544ihgfedcba`_^]\[YXWVUTSRQPONMLKJIHGFEDDCBBA@>>=<<;::98877654Éhgfedcba`_^]\[YXWVUTSRQPONMLKJIHGFEDDCBBA@?>=<<;::998877654Êgeddbba_^^\\ZYXWVUTSRQPONMLKJIHGFEDDCBBA@?>=<<;;::98877654Íedcbb`_^]\[ZYXWVUTSRQONNMLKJIHGFEDDCBBA@?>>=<<;::98876ŝ544Ê3dcba`_^]\[ZYXWVUTSRQONNMLKJIHGFFEDCBBA@@>>=<<;::998877654Í3bba`_^]\[ZYXVVUTSRQONNMLKJIHHFFEDDCBBA@?>=<<;;::9887654Ñ3a`_^^\\[YXXVVUTSRQOONMLKJJIHFFEDDCBBA@@>>=<<;::ü98877654Ì`_^]\[ZYXWVVUTSRQOONMLKJJIHGFEDDCBBAA@>>==<<;::998877654^Î]\[ZYXWVUUTRRQOONMLKJJIHGFEEDDCBBA@@>>=<<;;::998877654Ì^\\[ZYXWVUTTRRQOONNLKJJIHHFFEDDCBBAA@?>==<<;;::998877654\[YXXWVUTTRRQOONNMKJJIIHGFEDDCCBBA@@>>==<<;;::9988765TSRQPONMLKJIH GÀ??SRQPONMLKJIHG?ÁÀżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§ĤüÁÁÀÀżŝ½ĵĵğşı¸·ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥú¤ÁÀÀżżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤Àżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻĴŞİ¨§Ĥŝ¤¤ŝÀżż½ĵŝğşşı¸·ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£żżŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§üĤ¤¤£ŭ˘ż½ĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘ŝ½ĵĵŝğşşı¸·ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴŞİ¨§Ĥŝ¤¤ú£˘˘ĦĦŝ½ĵĵŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦü½½ĵĵğşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦŝ ĵĵŝğşşı¸·ŝĥµµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ŝ£˘˘Ħ ĵğşı¸·ĥµŝ´³³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ ŭĵğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ ŝğşşı¸·ĥµ´³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥ¤£˘Ħ ŝŸşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ üŸşşıı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿüşıı¸¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŝŞİݨ§Ĥ¤ŝ£˘˘Ħ Ÿı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ Ÿüı¸¸··ĥµŝ´³³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ Ÿ¸·ĥµ´³²ŝħ°°ŝŻ­ĴüĞŞŞİݨ§Ĥŝ¤¤£˘Ħ ŝŸ··ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥŝ¤¤£˘Ħ ·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤£˘Ħ ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĞŞİ¨§Ĥ¤£˘Ħ t srqp onmlÀ??srqp onm l?Şİ¨§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœİ¨§Ĥ¤£˘Ħ Ÿžœŝݨ¨§Ĥ¤£˘Ħ Ÿžœ¨§Ĥ¤£˘Ħ Ÿžœü›¨¨§§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›§Ĥ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›ŝĤ¤£˘Ħ Ÿžœ›ŝš¤£˘Ħ Ÿžœ ›ŝš¤£˘Ħ Ÿžœ›šŝ¤¤£˘Ħ Ÿžœ ›š¤£˘Ħ Ÿžœ ›š¤£˘Ħ Ÿžœ ›š¤£˘Ħ Ÿžœ ›š¤£˘Ħ Ÿžœ ›š£˘Ħ Ÿž œ ›š£˘Ħ Ÿž œ ›üš££˘˘Ħ Ÿž œ ›ŝ£˘˘Ħ Ÿž œ ›mlk jÀ??mlkj?:ü988776543210/01234û:988776ŝ544ŝ32210/01234ü588776543210/012ŝ344ü568776543210/01234ü566776ŝ5443210/012345676ŝ544ŝ32210/012ŝ344ŝ56676543210/01234ü56677÷865544332210/012345678543210/012ŝ344ŝ56678ù9544332210/01234ü5667789ú:44332210 /012345678÷9::;44332210 /01234ŝ56678÷9::;<4332210/012345678ù9::;<<33210123456789:ù;<<=3322101234ŝ56678ô9::;<<=>>3322 1 012345678ó9::;<<=>?@3322 10 1234ŝ56678ò9::;<<=>?@A3322123456789:ô;<<=>?@AB332212345678ñ9::;;<<=>?@ABB332123456789::;<<==>?@ABBC332 123456789:ñ;<<=>>?@ABBCD4332345678í9::;;<<=>>@@ABBCDD443 23456789:ŝ;<<ó=>?@@ABBCDDE443456789:î;<<==>?@@ABBCDDEFGGFGHIJKLMÀ??GFGHIJKLMN?¤ü£˘˘ĦĦ Ÿžœ›œžŸŝ ¤¤ü£˘˘ĦĦ Ÿžœ›œžŸ ŭ¤£˘˘Ħ ŝŸžžœ›œžŸ ûĦ£˘˘ĦĦ Ÿžœ›œžŸ Ħ˘Ħ Ÿžœ›œžŝŸ  Ħ˘Ħ Ÿžœ›œžŸ Ħ˘Ħ Ÿžœ›œžŸ Ħ˘ü£ĦĦ  ŝŸžžœ›œžŝŸ  Ħ˘ĝ£¤Ħ  ŸŸžžœ›œžŸ Ħ˘£¤ Ÿžœ›œžŸ Ħ˘ŝ£¤¤ Ÿžœ ›œžŝŸ  Ħ˘ŝ£¤¤û ŸŸžžœ ›œžŸ Ħ˘ŝ£¤¤ûĤŸŸžžœ›œžŸ Ħ˘£¤ĤŸžœžŸ Ħ˘ŝ£¤¤ûĤ§§ŸžžœžŸ Ħ˘ŝ£¤¤üĤĤ§§ŝŸžž  œžŸ Ħ˘£¤üĤĤ§§ŭ¨Ÿžž œ žŸ Ħ˘£¤üĤĤ§§¨ŝŸžžžŸ Ħ˘ŝ£¤¤Ĥ§¨ŭİŸžžžŸ Ħ˘£¤ŝĤĤ§¨İŸžžŸ Ħ˘ŝ£¤¤üĤĤ§§¨İŝŞŸŸž žŸ Ħ˘£¤Ĥ§¨İŞŸžŸ Ħ˘ŝ£¤¤Ĥ§¨İŞŭĞ ŸŸžŸ Ħ˘£¤ŝĤĤ§¨İŞŭĞĴ  ŸžŸ Ħ˘£¤Ĥ§¨İŞüĞĴĴllmnopÀ??lmnopq?œ› š™ šœ› š™ šŭ›œ›› š™ š › š™ š › š™ š › š™ š › š™ š › š™ š›ŝœ›› š™ š›œ› š™š›œŝ›š š™š›œš™š›œš™š›œš ™š›œš ™š›œ*š ›œ)š ›œ'š ›œ%š ›œ#š › œ!š ›œŝžšš › œžš › œž›š › œž'jklÀ??$jkl?û4566778Ċ9::;<<=>?@ABBCDDFGHIJJKMNOPQRTUVWXYZ\]^_`abddeghijkkmno5667789::;<<=>?@ABBDDEFGHIJKLMNOQRSTUVWXY[\]^_abcdefghijklmopp667788Ĉ9::;<=>>@@BBCDDEFHIJJKMNNPQRTTVWXYZ\]^_`abcdeghijjkmnopqr778€89::;<<=>?@ABBCDEFGHIJJLMNOPRSTUVWXY[\]^_abcdefghijklmoppqrs77889::;<<=>?@ABCDDEFGHIJKLNNOQRSTUVXXZ[\^^_abcdefhhjjkmnopprrst8899::;<=>?@@BBCDDEFHIJJKMNNPQRTTVWXYZ\]^_`abddeghijklmnopqrrstu89::;<<=>?@ABBCDEFGHIJJLMNOPRSTUVWXY[\]^_abcdefghijklmoopqrssuuv9::;<<=>?@ABBDDEFGHIJKLNNOQRSTUVWXY[\]^_abcdefghijklnopprrstuuvv::;<<=>@@ABCDDEFGHIJKLNNOQRSTUVXXZ[\^^`abcdeghhjjkmnopprrstuuvwx;;<=>?@@BBCDDEFHHJJKMNNOQRTTUWXYZ[\^^`abcdeghijjkmnopqrrstuuvwxx<<=>?@ABBCDDFGHIJJKMNNPQRTTVWXYZ\]^_`abddeghijjlmnopqrrstuvvwxxy<=>?@ABBCDEFGHIJJKMNNPQRTUVWXYZ\]^_`abddfghijjlmnopqrrstuuvwxxy=>?@ABBCDEFGHIJJLMNOPQRTUVWXY[\]^_`abddeghijjkmnopprrstuuvvxxyƒ>@@ABBCDEFGHIJJLMNOPQRTUVWXYZ\]^_`abddeghhjjkmnopprrssuuvvwxxyyz@@ABCDDEFGHIJJLMNOPQRTUVWXYZ[\^^`abcdegghjjklmoopqrssuuvvwxxyyĊ{@ABCDDEFGHIJJLMNOPQRTTVWXYZ[\^^`abcdefghijklmoopqrrstuuvvxxyĊ{ABCDDEFGHIJJLMNNPQRTTUVXXZ[\]^_abcdefghijjkmnopprrssuuvvwxxyĊ{BCDDEFGHIJJLMNNPQRTTUVXXZ[\]^_`abddeghhjjklmoopqrrssuuvvwxxyĊ{CDDEFGHIJJLMNNPQRSTUVWXY[\]^_`abcdefghijkkmnoppqrrstuuvvwxxyĊ{DDEFGHIJJKMNNOQRSTUVWXYZ[\^^_abbddeghhjjklmnopprrsstuuvvwxxyĊzDEFGHIJJKMNNOQRRTUUVXXZ[\]^_`abcdefghijjkmmoopqrrsstuuvvwxxyÉEFGHIJJKLMNOPQRTTUVWXY[\\^^_abbddegghijkkmmoopqrrsstuuvvxyÎFGHIIJKLMNNPQRSTUVWXYZ[\]^_`abcdeeghhjjkkmmoopprrssuvxÏyGHHIJKLMNNOQRRTTUVXXY[[\^^_`abcdeeghhjjkkmmoopprrsütuuvvŝwxxNOPQRSTUVWXYZ[\]^À??NOPQRSTUVWXYZ[\] ^?ŝ ĦĦ˘ŝ£¤¤üĤĤ§§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ñħ²³³´´µµĥĥ··¸¸ıışŝğĵĵü½ĦĦ˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½Ħ˘£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½úżĦ˘˘£¤¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵŝ½ż˘ŝ£¤¤óĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½ż£¤üĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ġħ²³³´´µµĥĥ··ŝ¸ıışŝğĵĵŝ½żŝÀ¤¤üĤĤ§§ŝ¨İİŞĴ°ħ²²³³´´µµĥĥ··¸¸ıışŝğĵĵŝ½żÀ¤ĝĤĤ§§¨¨İİŭŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½żÀÁ¤ĤĤ§§¨¨İİŞŞĞĴĴŝ­ŝݰ°îħ²²³³´´µµĥĥ··¸¸ıışşŝğĵĵ½żÀÁüĤĤ§§¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··¸ışğĵ½żÀÁĤ§ŝ¨İİŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışğĵŝ½żÀÁúĤ§§¨¨İİŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··ŝ¸ıışğĵŝ½żÀÁ§¨İŭŞĞĴĴŝ­ŝݰ°ùħ²³³´´µµŝĥ··ŝ¸ıışğĵ½żÀÁû§¨¨İİŭŞĞĴĴŝ­°²³ŝ´µµŝĥ··ŝ¸ıışğĵ½żÀÁÂ¨İŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµŝĥ··¸ışŝğĵĵŝ½żÀÁÂù¨İİŞŞĞĴĴŝ­Ż°ŭħ²³³ŝ´µµŝĥ··¸ışŝğĵĵŝ½żÀÁÂİŞŝĞĴĴŝ­ŝݰ°ŭħ²³³ŝ´µµĥ·¸ışŝğĵĵ½żÀÁÂûİŞŞĞĴĴŝ­ŝݰ°ŭħ²³³´µĥ·¸ışğĵŝ½żÀÁÂŞŝĞĴĴ­ŝݰ°ôħ²²³³´´µµĥĥ··¸ışŝğĵĵ½żÀÁÂŭŞĞĴĴ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışğĵŝ½żÀÁÂŝĞĴĴŝ­ŝݰ°üħ²²³³ŝ´µµĥ·ŝ¸ıışŝğĵĵ½żÀÁÂĴŝ­ŝݰ°ħŝ²³³´µŝĥ··¸ışŝğĵĵ½żÀÁŝÂĴĴŝ­ŝݰ°ĝħ²²³³´´µµĥ·¸ışğĵ½żÀÁĴŝ­Ż°üħ²²³³´µŝĥ··¸ışğĵ½żÀÁŝpqqrstuvwxÀ??qrstuvwx?›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§›œžŸ Ħ˘£¤Ĥ§ŝ¨››œžŸ Ħ˘£¤Ĥ§¨›œžŸ Ħ˘£¤Ĥ§¨œžŸ Ħ˘£¤Ĥ§¨ŝİœœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŞœžŸ Ħ˘£¤Ĥ§¨İŞŝœžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İޝžŸ Ħ˘£¤Ĥ§¨İŞŝžžŸ Ħ˘£¤Ĥ§¨İŞžŸ Ħ˘£¤Ĥ§¨İŞžŸ Ħ˘£¤Ĥ§¨İŞžŸ Ħ˘£¤Ĥ§¨İŞžŸ Ħ˘£¤Ĥ§¨İŞŝžŸŸ Ħ˘£¤Ĥ§¨İŞl m nopÀ?? l m nop?ġpqrrstuvvwxxyüz{{||ŝ}~ ~ŝ}||{ŝzyyxċwvvutsrrqponqrssuuvvwxxyyz{{|ŝ}~ ~ŝ}||{ċzyyxxwvvuutsrrpponmrstuvvwxxyüz{{||~ŝ}||{àzyyxxwvvutssrqppomlkstuvvwxxyyz{{|ŝ}~~ŝ}||{yxëwvvutsrrqponmlkjuuvvxxyüz{{||ŝ}~~ŝ}||{üzyyxxvuêtsrrpponmkjjhvvwxxyyz{{|ŝ}~~|{Ŝzyyxxwvvuussrqppomlkjihgvwxxyyz{{||ŝ}~~|{ĉzyyxxwvvutssrqponmlkjihgfxxy{|ŝ}~~ŝ}||{ázyyxxwvvutsrrqponmkkjihgedxxyy{{|ŝ}~~ŝ}||{yxĉwvvutsrrpponmkjjhhfedcyyz{{|ŝ}~~ŝ}||{üzyyxxvuêtsrqpponlkjihhfedcbyy{{|ŝ}~~ŝ}||{àzyyxxwvvuussrqppomlkjihgfedcbay{{|~ŝ}||{ßzyyxxwvvutssrqppomlkjihgfedbb`_z{{|ŝ}~ ~ŝ}||{ßzyyxxwvvutssrqponmlkjihgfedbb`_^{{| ~ŝ}||{ŝzyyxwvvutsrrqponmlkjihgfedbb`_^]{{| ~ŝ}||{üzyyxxvċutsrrpponmlkjihgeedbb`_^]\{{|ŝ}~~}|{Ûzyyxxwvvuutsrrpponmkkjihgeddbb`_^]\Z{{|}|{ŝzyyxßwvvuussrrpponmkkjhhgeddbb`_^]\[Y{{|{yxváutssrqpponmkkjhhgeedbb`_^]\[YX{{ |{üzyyxxÜwvvuutsrrqpponmkjjhhgeedbb`_^]\[YXW{{|{ŝzyyxÚwvvuutsrrqppomlkjjhhgeedbba_^]\[ZXXVz{{ŝzyyxŝwvvÚutssrrqpoomlkjjhhgeedbba_^]\[ZYXVVyyz{ {zyxŝwvvuŬtssrqpponmlkjjhhgeedcba_^^\\ZYXWVUyyzyxŝwvvuÚtssrrqpponmlkjjhhgfedcba`_^\\[YXWVUTxy yxŝwvvuŭtsrrßqpponmlkjjhhgfedcba`_^]\[YXXVUTT^^]\[ZYXWVUTSRQÀ??^]\[ZYXWVUTSRQŝP>żÀÁÂÂÁÀżżÀÁÂÂÁÀżŝ½żżÀÁ Ä ÂÁÀżĝ½ĵĵżżÀÀÁÁ Ä ÂÁÀżŝ½ĵĵÀÁ Ä ÂÁÀż½ĵŭğÀÁÁ Ä ÂÁÀżŝ½ĵĵŭğşÁÁÂ Ä ÂÁÀżŝ½ĵĵüğşşÁÁ Ä ÂÁÀżŝ½ĵĵŝğşşÁ Ä ÂÁÀżŝ½ĵĵğşŭıÁÂ Ä ÂÁÀż½ĵŝğşşı Ä ÂÁÀż½ĵŝğşşıŝ¸Â Ä ÂÁÀżŝ½ĵĵŝğşşı¸ Ä ÂÁÀżŝ½ĵĵŝğşşı¸ü·ÂÂÂÁÀżŝ½ĵĵŝğşşı¸·ŝÂÂÁÀżŝ½ĵĵŝğşşı¸·ŭĥÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥŝÂÂÁÀżŝ½ĵĵŝğşşı¸·ĥŭµÂÂÁÀż½ĵŝğşşı¸·ĥµÂÂÁÀż½ĵŝğşşı¸·ĥµŝ´ÂÂÂÁÀż½ĵŝğşşı¸·ĥµŝ´ÂÂÂÁÀż½ĵŝğşşı¸·ŝĥµµŭ´³ÂÂÁÀż½ĵŝğşşı¸·ŝĥµµ´ŭ³Á ÂÁÀżŝ½ĵĵğşı¸·ĥµ´³Á ÁÀżŝ½ĵĵğşıŝ¸··ĥµŝ´³³xwvutsÀ??xwvutsr?§¨İ ŞĞ Şİ¨§¨İ ŞĞ Şİ¨§ŝĤ¨¨İ ŞĞ Şİ¨§Ĥ¨İ ŞĞ Şİ¨§Ĥŭ¨İİ ŞĞ Şİ¨§Ĥİ ŞĞ Şİ¨§Ĥİ ŞĞ Şİ¨§ĤŝİŞŞĞ Şİ¨§Ĥ¤ ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŞĞ Şİ¨§Ĥ¤ŝ£ŞŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£ŞĞ Şİ¨§Ĥ¤£ŝ˘ŞŞ Ğ Şİ¨§Ĥ¤£˘Ş Ğ Şİ¨§Ĥ¤£˘ŞĞŞİ¨§Ĥ¤£˘Şİ¨§Ĥ¤£˘Şİ¨§Ĥ¤£˘Şİ¨§Ĥ¤£˘ŝĦŞŞİ¨§Ĥ¤£˘ĦŞİ¨§Ĥ¤£˘ĦŞİ¨§Ĥ¤£˘Ħpo n mlÀ?? po n ml?Çmlkjihgfedcba_^]\[YXWVUTSRQONNLKJIHGFEDDCBBA@>>=<<;::9887765È4kjjhhgedcba`_^\\ZYXWVUTRQPONMKJJIHGFEDCBBA@?>=<<;::988776ŝ544Êjihgfedcba_^]\[ZXWVUTSRQONNLKJIHGFEDDCBA@?>>=<;::9988776543Ìihgfddbb`_^]\[YXWVUTRRPONMLJJIHGFEDCBBA@?>=<<;::98877654Í322hgedcba`^]\[ZYXVUTSRQONNMKJJHGFEDDCBA@@>>=<;::98876ŝ54432Ïfedcba_^]\[YXWVUTSRQONMLKJIHGFEDCBBA@?>=<<;::98877654321edbb`_^]\[YXWVUTRQPONMKJJIHFFDDCBBA@>>=<<;::988776ŝ544321Òcba`_^\\ZYXVVTSRQPNNMKJJHGFEDDCBA@?>=<<;::98877654321Óba`^]\[ZXWVUTSRQONNLKJIHGFEDDBBA@?>=<<;::98877654321Ó0a_^]\[YXWVUTSRQONMLJJIHGFEDCBBA@?>=<<;::988776ŝ5443210Ó_^]\[YXWVUTRRPONMLJJIHFFEDCBBA@>>=<<;:99887766ŝ544ŝ32210×^]\[YXWVUTRRPONMKJJIHFFDDCBBA@>>=<;::988776543210Ĝ]\[YXWVUTRQPONMKJJIHFEDDCBBA@>>=<;::988776543210Ĝ/\ZYXWVUTRQPONMKJJIHFEDDCBBA@>>=<;::988776543210/ÚZYXWVUTRQPONMKJJIHFFDDCBBA@>>=<;;:998776543210/ÚYXWVUTRRPONMKJJIHFFEDCBBA@>>=<<;:9988776ŝ544ŝ32210/ÛXWVUTRRPONMLJJIHGFEDCBBA@?>=<<;::988776ŝ5443210/ÜWVUTSRPONMLKJIHGFEDDBBA@?>=<<;::988776543210/ŬVUTSRQONNLKJIHGFEDDCBA@@>>=<;::998776ŝ5443210/ŬUTSRQONNMKJJIHFFEDCBBA@?>=<<;::988776543210/ŬUTRQPONMLJJIHGFEDDCBA@?>=<<;::9988776543210/ŜTRRPONNLKJIHHFEDDCBBA@>>=<<;::988776ŝ5443210Ŭ/SRQONNMKJJIHGFEDDCBA@@>>=<;;::988776543210ŜRQPONMLKJIHHFEDDCBBA@?>=<<;::9988776543210QPONMLKJIH GFEÀ??PONMLKJIH GFE?ŝ½ĵĵŝğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ ĵğşı¸·ĥµ´³²°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ûŸĵĵğşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿüžĵğşşı¸·ĥµ´³²ŝħ°°ŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžŝğşşı¸·ŝĥµµù´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžŝşşı¸·ĥµ´³²ŝħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ŝ£˘˘Ħ ŝŸžžŝşıı¸·ĥµ´³²°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžıŝ¸··ŝĥµµŝ´³³ŭ²ħ°°ŝŻŝ­ĴĴòĞŞŞİݨ¨§§ĤĤ¤¤ŝ£˘˘Ħ ŝŸžžïı¸¸··ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴŭĞŞİݨ§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžïœ¸¸··ĥĥµµ´´³³²²ħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœñ¸··ĥĥµµ´´³³²²ħ°°ûŻ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ·ĥµ´³²ûħ°°Żŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ ŝŸžžœó›·ĥĥµµ´´³³²²°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ ŝŸžžœ›ĥµ´³²°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ ŝŸžžœ›òĥµµ´´³³²²ħ°°Żŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ ŝŸžžœ›µ´³²ŝħ°°ŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›÷µ´´³³²²ħ°°ŝŻŝ­ĴĴŭĞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›´³²ŝħ°°ŝŻŝ­ĴĴóĞŞŞİݨ¨§§ĤĤ¤¤ü£˘˘ĦĦ Ÿžœ›ù´³³²²ħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§Ĥŝ¤¤£˘Ħ Ÿžœ›³ŭ²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ›³²ŝħ°°ŝŻŝ­ĴĴĝĞŞŞİݨ¨§§üĤ¤¤£˘Ħ Ÿžœ›û³²²ħ°°ŝŻŝ­ĴĴüĞŞŞİİŝ¨§§Ĥŝ¤¤ŝ£˘˘Ħ Ÿžœ›²ŝħ°°ŝŻ­ĴĝĞŞŞİݨ¨§§Ĥŝ¤¤ü£˘˘ĦĦ Ÿžœ²ŝħ°°ŝŻŝ­ĴĴüĞŞŞİݨ§Ĥ¤ü£˘˘ĦĦ Ÿžœŝsrrqponm lkÀ??rqponm lk?Ĥ¤£˘Ħ Ÿžœ›Ĥ¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ›šŝ¤¤£˘Ħ Ÿžœ›š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› š¤£˘Ħ Ÿžœ› šŝ¤££˘Ħ Ÿžœ› š£˘Ħ Ÿžœ› š™£˘Ħ Ÿžœ› š™ŝ£˘˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™˘Ħ Ÿžœ› š™ŝ˘ĦĦ Ÿžœ› š™Ħ Ÿžœ› š™Ħ Ÿžœ› š™Ħ Ÿžœ›š™Ħ Ÿžœ›š™ŝĦ  Ÿžœ›š™ŝĦ  Ÿžœ›š™lkjÀ?? lk"j?432101ŝ32101ŝ210/01ŭ2210/012ŝ10 /012ŝ10 /012ŭ310 /0123ŝŝ100/0123ŭ40/01234ŝ0/01234ŭ5ŝ0//01234ü56/01234û566&/01234ú56670ŝ/01234ù5667@ ŝ/01234ŝ566ü7Cŝ /01234ŝ5667ŝ1ŝ  /0123456ŭ7ŭ4 /01234567ŝŝ  /01234567ŝŭ/01234567ŭ@ŝ /01234567ü6ŝ/01234567ú9;01234567ù<0 012345ĝ689F6ŝ EFGúD4# ŝ<ŭ:û8ùùŝŭ.Rŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ=ŝ&=ŝ0ŝ9ŝ ŝ8ŭCŝ8ŝ1=ŝŝ8ŝ3ŝ 7ŭC ŝ8ŝŝ 6ŭ6ŝ6ŭ;ŝ6ŭ0 ŝ3ûF6ŝ EFGúD4# ŭ;ŭü ŸŸžžœŝAŝŸžžœŝAžœ›œŝAŝžœ ›œŭžBœ ›œžŝBœ ›œžŝBœ›œžŭŸBœ›œžŸŭ Bœ›œžŸ ŝBœ›œžŸ ŝCŝœ››œžŸ ŭĦC›œžŸ ĦŝG›œžŸ Ħŝ9ŝ›œžŸ Ħŭ˘ŝ›œžŸ Ħü˘‡ŝ›œžŸ Ħ˘ŝRŝ  ›œžŝŸ  Ħŭ˘Bŭ4 ›œžŝŸ  Ħ˘ŝBŝ  ›œžŝŸ  Ħ˘ŝAŭ›œžŸ Ħ˘ŭ˜Aŝ ›œžŸ Ħ˘ü•(Aŝ›œžŸ Ħ˘ûˆ#A œžŸ Ħĝ˘š] AœžŸ Ħù˘ž‘_ŝAklúiZA' ŝA<ŭA:ûA8ùAùŝAŭ.RŝA=ŝA=ŝA=ŝA=ŝA=ŝA=ŝA=ŝA=ŝA=ŝA=ŝA=ŝA=ŝB=ŝB=ŝB=ŝB=ŝB=ŝB=ŝC=ŝC=ŝG=ŝ9ŝ9ŝŝ8ŭ‡ŝ8ŝR=ŝŝ8ŝVŝ 7ŭ‡ ŝ8ŝ!ŝ 6ŭ•(ŝ6ŭˆ#ŝ6ŭ] ŝ3û‘_ŝ klúiZA' ŭ;ŭš ™šŝ@ š™šŝ@ š™šŝ@ š™ šŝ@š™ šŝ@š™ šŝ@š™ šŝ@š™ šŝ@ŝš™™ šŭ›@™ š›ŝ@™ š›ŝ@™ š›ŝE™ š›ŝ8ŝ™ š›ŝŝ™ š›ŭƒŝ™ š›ŝOŝ ™ š›ŝ@ŭ4™ š›ŝ@ŝ  ™ š›ŝ@ŭ ™ š›ŭ’@ŝ  ™š›üŽ&@ŝ™š›û‚#@™š›ù”Y @™š›ùœ˜Œ\ŝ@júgW?& ŝ@<ŭ@:û@8ù?ùŝ?ŭ.Rŝ?=ŝ?=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝ@=ŝE=ŝ8ŝ9ŝŝ8ŭƒŝ8ŝO=ŝŝ8ŝSŝ 7ŭ‚ ŝ8ŝ!ŝ 6ŭŽ&ŝ6ŭ‚#ŝ6ŭY ŝ3ûŒ\ŝjúgW?& ŭ;ŭ€€€€*ŭ>ü >ú  €*ŭ>ü >ú  €*ŭ>ü >ú  €@€?€€?€€?€@€?€€?€€?€@€?€€?€€?€@€?€€?€€?€@€?€€?€€?€@€?€€?€€?€@€?€€?€€?€@ŭ:ŭ!ú¤ŭ:ŭ!ú¤ŭ:ŭ!ú¤@JJJJ)ŝ”J?%RŭVideo display copy˙     l'Rŭ',O[gsRŭ(x04>8œ=AˆFJµOtWœYädÓi&mprvœ{U€„°b‘Ğœh }¤Ż¨˙­rħÛĥhşíĊ|ÇĤÒĠĜÙÁŬ²áÉċżéÙî ĝ2úeŽ  7Ġ˘F (*/*2Ç67:=A•E[IENŠPxS·VŭZV]§a5d³hIkĊo@q=t7whz‰}§€ŭ„\‡‹ Žm“”•–— ˜™š›žŸ £¤ĤİŞĞĴݰħŝ²µµĥ·¸ĵ½ ÂÄ ÉÊÏ&ÑĠ+Ö×Û/Ü#áâ ĉ1çë+ì??ô0÷ĝ?ú!üŭ?ŝÀ˙?ŝ?ü?ú?÷ó:ô ï3;ëì1ĉ çà9á*Û Üü &Ġ Öŭ  Î%Ïŭl ÈÉŝ ŭŭ!$$ ğĵ½ŝ ü(W½ ½µĥŝ ŭ.· ·Ż °ŝ¤üĴ°ħ ħ¨İ Şŝü%ŞŞĞ Ğ˘£¤ŝ ŝ"Ĥ žŸŝ ŸŸ  ˜™šŝ ŝ]šš ›“” •ŝ!––— ‘ŝ ŭu‘’’“‹Œŝ ŝŽ Ž ˆ‰ Šŝŝ2‹ ‹ Œŝ…† †‡ˆŝFˆˆ‰Š „…†ŝG† ‡ˆ‚ƒ„…ŝ…†‡ ‚ƒ „ŝ … †‚ƒ „ŝ … † ƒ „ …ŝ †‡„…†ŭ‡‡ ˆ†‡ˆŭ‰‰ Š ‰Š ‹ŝ ŒŒŽŝ ‘ ’ŝ“”•–ŭ— — ˜™š ›ŝœŸ ŝ Ħ˘PQRS TUV!WXY$Z[ \'] ^*`ac%df2g hj#k;no!qrt9u?x?{?~€=?ƒ?…?‡?‰?Š@‹?Šˆ(‰?‡?…?ƒ+€?~?{w,xü tuŭ .qŭ@ mnŝ+jŭŭ!$$fgŝ ü5kg g%cdŝ ŭCd d _`ŝZŭa`` a\]ŝŝ*] ]^Y Zŝ ŝ(ZZV WŝWWXSTŝ ŝjTT UPQRŝ/RR NOŝŝ_PP LMŝ ŝNNJKLŝLMIJŝgKKHIŝ/JGHIŝIJGHŝI GHŝIGHIŝ IJHIJŝJKIJKŝKLKLŝL*M Nŝ N O Pŝ PQRŝŝRSST UŝUVWXŝXtsrqponmljihgedcb`_^]ZYXWTSRQNMLH GF"A@$;:.540./:*)?% !5 ?;?8??À?+? 5=$2! &*%+&*+0/ü   65ŭ <;ŭ& BAŝHGŭŭ!$$NMŝ ü3bL LTSŝ ŭ@R RZYŝTŭYX X `_^ŝŝ*^^]ŝfeedŝ ŝ'ccŝbkkjiŝhhponŝ  ml ts rü.rrqq xw vŝŝvuutŝ|{{zyŝ ŝyy x~}|ŝŝI||{€ŝl~~ }ƒ‚€ŝI€„ƒ‚ŭ € „ƒ‚ŝ‚€ „ƒ ‚ŝ€ƒ‚ŝ€ ‚ €ŝ~ € ~ŝŝ~}}|~}|{ŝ{zyxŝxwv uŝt srqŝpo nmlŝl k ihgŝ g fµû §Ö÷ĝĝ1ŭŭ˙ ˙.ŭcû˙ ˙-ŝê˙˙+ŭŭ˙˙*ŝ¨˙˙ŝŬ˙ ˙)ŝİ˙˙(ŝô˙˙ŝù˙ ˙(ŝŝ˙˙'ŝß˙˙'˙&ŝï˙˙ŝÈ˙˙&˙%ŝı˙˙ŝÒ˙˙%ŝû˙˙%˙%˙ŝÖ˙˙$ŝc˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙ —˜™š›œž ŸĦ˘£ ¤ Ĥ§¨ İĴ­Ż²³´¸ışżÀ ÄĊĈÊ ËÌ!ÑÒ%×ĜÜ1Ŭ Ŝâç&è0ìí+ñ.ôġ?ĝ<úû?ŭ?ŝÀ˙?ŝ?ü?ú1÷ ĝ?ô<ñ?ì6çèŝáâ7â À?$½ż À·¸ı şħ²³ ´ĞĴ­Ĥ§¨İ Ħ˘£¤›œž Ÿ —˜™š› “”•–—‘ ’ “ŒŽ  ŝ‘Š Š‹ Œ  Žˆ‰ Š ‹ Œ ‡ ˆ ‰ Š ‹† ‡ ˆ ‰ Š‹† ‡ ˆ ‰ Š‹‡ ˆ ‰ Š ‹Œŝˆ‰ ‰ Š ‹ ŒŝŠ‹ ‹ Œ ŽŽ  ‘‘’“”•–— ˜™š›œ žŸ Ħ ˘£¤ŝRSSTUVWX YZ[!\^#_a(bcd+e f$hik,l7op&rsu(v x4y {4|#~?9ƒ„-…†?‡?‰?Š@‹?Š?‰?‡?…?ƒ??~%{|/À?$g.hid)efa"b"^_"[\XYZUV WRSTUPQRNOPQMN OKLMNJKLMJKLIJK LIJK LJKLKL MLMN MN,OP#QRSTUVWX!YZpon mlkjigfe d ba` _]\[ ZWVUŝTQQPOŝLKKJIFED@"?> :&9 84"3/3.-9)(?$, )?????À??"???? %$*()? À?$ LKJRQPOXWVU ]\[Zba`_gfed lkjipon m tsrqŝpxxwvu tzyxwv}|{z y~ }|{z€~} |{ € ~} |€~ } | ~ }|{~}|{ z |{zyxzyxw vwvutsrqponmlkjihgfedc€ĝ<ù@˙ ›œž Ÿ Ħ˘ £¤Ĥ§¨İŞĞĴ­Ż°ħ ²ŝ´µµĥ·şğĵ ½ÀÁÂĈÇÈÉÌÍÎÒ#ÓÔĜ'ÙÚ%Ŝß$äèé?í?ñ?ġ?ĝ?û?ŭ?ŝÀ˙?ŝü ŭ?ú?ĝô!ġ?ñì-í8èé0ä+À?$ÀÁÂŝş şğĵ½´µĥ ·ŝŻŻ°ħ²İŞĞĴŝ­¤¤Ĥ§¨Ÿ Ħ˘£ ›œžŸ —˜™ š ›ŝ“” ” • –—˜ ‘ ’ “ ”•Ž   ‘ ’“ŝŒ  Ž  ‘‹ Œ  Ž ‹ Œ  Ž ŝ‹‹ Œ  Ž  Œ  Ž   Ž   ‘’  ‘ ’ “‘ ’ “ ” •–ŝ”• •– —˜™˜™š›œžŸ  Ħ˘£¤Ĥ§¨ İUVWXYZ[\!]^ŝ_`"`a#cdf!gi*jl2mn1p q(st"vw$yz5| }?*‚?„?†?‡?‰?Š@‹?Š?‰?‡…"†ƒ„?ŝ~=?|7À?$i!j%fgb%cd_"`a\ ]^Z[\WXYUV WŝRSSTUQR S OPQNOPMNOLMNOLMN LMNŝOLLMN O MNOP NOPQŝOPPQ R QRSŝTS STUVWXY Z[\mlkj ihgf edcba` _^]\ZYXWTSRONMLIHGCBA >!=<8%73+2 1.-,5( ' $2#??0<???À?????- 1&$#)-(? À?$JIHGONMUTS R ZYX W _^] \ dcbaihgf emlkj i ponmltsrqpŝov vut srŝyx x wv ut zy x w v {z y x w| {z y xw| { z y xw{ z y x wz yx w vuxwv u tŝvu utsrqsrqponmlkjih gfedŝcbba`_€?ù@˙ Ÿ Ħ˘£¤Ĥ § ¨İŞĞĴ ­Ż° ²³´µŝ·¸¸ışğ½ż ÀÄĊÉÊ ËÎÏÑ Ô!ĠÖÚÛß*àä,ċ#éêí7îñ7ò?ġ?ĝ?û?ŭ?ŝÀ˙?ŝ?ŭú:û?ĝ?ġ&ñò"íî9éê%äċ  À?$ÄĊ½żÀ·¸ış ²³´ µ­Ż ° ¨İŞĞŝĴ££¤Ĥ §Ÿ Ħ˘ £› œ ž Ÿ ˜ ™ š › œ• – — ˜ ™š“ ” • – —˜‘ ’ “ ” •– ‘ ’ “ ”•  ‘ ’ “ ”ŝ• ‘ ’ “ ”•ŝ‘ ‘ ’ “ ” • ’ “ ” • –ŝ—” ” • – — ˜– — ˜ ™ š›™ š › œ œ žŸ  Ħ Ħ˘£ ¤Ĥ§¨İŞĞĴ­WXYZ[\] ^_`a"bc d%efg(hij,kl+no)qr'tu+wx9z{?}"€?‚?„?† ‡2ˆ?‰?Š@‹?Š?‰:‡ˆ?†?„8‚8€ |4}?À?$ j*k l g'h id$e f a!bc^_`\]^ YZ[WXYUVW STUŝVRRS TPQR SOPQ ROPQOPQOPQ OPQRPQRQRS RS1TU VUVW#XYZ[\]^_ihgfedcba`_^ ]\[ZYXWVUTRQPOLKJGFEDA@ ? <;:#651 0 ,+0'&#)" 5"?????À???-%?#+#" (4'? À?$GFEŝMLLKJRQPOWVUT\[ZYX`_^ ]edcbaihgf e lkjih on mlkr qp o nt s r q pv u t s rqw v u t sr w v u t sw v u t sŝrv v u t sr u t s r qŝts s r q po qp o n mnml kj kjihgŝhggfedcba ` _^]\[€ù ĝŝ÷ö ö"ô@˙£¤Ĥ§¨İŞ ĞĴ­Ż°ħ²³´µĥ·¸ığĵ½ ÀÁ ĈÇÈ ËÌÍÑÒÓÖ × ĜÛ%ÜŬà+áâċ5ĉŝçê$êëî#ï3ò ó ġ5öĝ(ù?û?ŭ?ŝÀ˙?ŝ?ŭ?û=ĝù)ġö?ò0îï7êëċ%ĉ  À?$ĊĈÇ ÈÀÁÂşğĵ½µĥ·¸ı°ħ²³´Ĵ­Żŝ°§§¨İŞ Ğ£¤ Ĥ §¨   Ħ ˘ £ ¤  ž Ÿ   Ħš › œ  žŸ ˜ ™ š › œ– — ˜ ™ 𛕠– — ˜ ™š • – — ˜ ™š • – — ˜ ™š• – — ˜ ™ š — ˜ ™ š ›üœ˜˜™ ™ š › œ  › œ  ž Ÿŝž ž Ÿ   Ħ˘ Ħ ˘ £ ¤ ŝ¤ Ĥ§¨İŞĞĴ ­Ż°ħ YZ[\]^_`ab c!def$ghi&jl$mo"prs%uv2x y?{}%~?€?‚?„?†?ˆ?‰?Š@‹?Š?‰?ˆ?†?„?‚?€)}~3 À?$lmi"jf"ghc de`ab^_ `[\]^YZ[\WXYZVWX TUVW STUV RSTURSTQRS TQRS TRSTRST USTU VUVW VWXYXY%Z[\]^_`aedcba`_^ ]\[ZYXWV UŝTSSRQPONMLIHGDCB?>= :985"430(/.+.*)&%"#!!??????À??????6-"!'6&%? À?$EDC BJIH GONMLTSRQPXWV U]\[ZYa`_^]edcb ahgf e dkj i h gŝnm m l k jiŝpo o n m lkq p o n mlr q p o nm r q p o n r q p o nr q p o nmq p o n mlo n m l kjm l k j ih j ih g fgfe d cŝdccba`ŝ_``_^] \[ZY X€ôŝġö ö ĝù@˙ŝ§¨ ¨ İŞ ĞĴĞĴ­Ż°ħ²³´µĥ·¸ ışğĵ żÀ Á ÄĊ ĈÈÉÊ ËŝÍÎÎÏ ÓÔ ĠĜÙ ÚŬ%Ŝßâ#2ç è&ëì,ï?ó?ö?ù?û?ŭ?ŝÀ˙?ŝ?ŭ?û?ù?ö ò3ó=ï4ë ì ĉ1çè.À?$ ÈÉÊË ÄĊĈżÀ Á ışğĵ´µĥ·¸ °ħ²³´ŝĞĴ Ĵ­ ݰ ¨İ Ş ĞĴ¤ Ĥ § ¨İĦ ˘ £ ¤ Ĥ Ÿ   Ħ ˘ £¤  ž Ÿ   Ħ˘› œ  ž Ÿ  š › œ  ž Ÿ š › œ  žŸš › œ  žŸŝš› › œ  ž Ÿ  œ  ž Ÿ  Ħ ž Ÿ   Ħ ˘   Ħ ˘ £ ¤˘ £ ¤ Ĥ§ Ĥ § ¨ İŞ İ ŞĞ Ĵ­Ż°ħ²³´µ\]#^_`abcde f gh"i&klm*no p.qrs*t!vw7yz {3|:~€$‚;ƒ„:…?†?ˆ?‰?Š@‹?Š?‰?ˆ?†„#…‚(ƒ)€?~) À?$ m)n oj%klh!ief gbcd`ab^_ `\]^Z[\XYZ[WXYVWXUVWXTUV W TUVW TUVWTUVW UVWX VWXYWXYZYZ[Z[\]\]^_^_`ab ca`_^]\[ZYXWVUTSRQPON MŝLKKJIŝHGGFEDBA@?=<;:876 3!21.&--)(!%$! 7*/????À????))?-! -%$? À?$ BA@?GFE DLKJIPON MUTSRQYXWVU]\[Z Yŝa` `_^]\d cb a`_ŝgf f e d cbi h g f edk j i h gf l k j i hŝgmm l k j ihn m l k j iŝnm m l k j im l k j ihl k j i hg j i h g f h g f e dfe d c bacb a` _^ _^]\[\[ZYXWVU T€?ù@˙Ĵ ­ ݰħ²³´µĥ· ¸ışğĵ½żÀÁÂÄ ĈÇÈ É ËÌÍÎ ÑÒŝÓĠ ĠÖ×ÚÛ Üß!à*ä ċ&èé%ìí;ñó"ôö%÷?ù?û?ŭ?ŝÀ˙?ŝ?ŭ?û?ù-ö÷,óô?0ìí.èé    À?$ ËÌÍÎ ĈÇÈ ÉÁÂÄŭĊĵ½½ż À¸ışğĵ ´µĥ·¸ ° ħ² ³ ´Ĵ ­ Ż °ħİ Ş Ğ Ĵ ­Ĥ § ¨ İ ŞĞ ¤ Ĥ § ¨İ˘ £ ¤ Ĥ§  Ħ ˘ £ ¤ ŭĤŸ    Ħ ˘ £ ¤Ÿ   Ħ ˘ £ ¤Ÿ   Ħ ˘ £ ¤   Ħ ˘ £ ¤Ħ ˘ £ ¤ Ĥ˘ £ ¤ Ĥ §ŝ¤ Ĥ § ¨ ݧ ¨ İ Ş ĞĴŞ Ğ Ĵ ­ Ż­ Ż ° ħ²ħ ²³´µĥ·¸ ı^_%`a bcdefgh i"jk l%m no$p)rs t2uvw"x:z{|#}???ƒ?…†=‡?ˆ?‰?Š@‹?Š?‰?ˆ†'‡?…?ƒ?~9 À?$o#p l$m nŝij jkgh iefgbcd `ab ^_`a\]^ _[\]ŝYZZ[\XYZ[XYZWXY Z WXYZ WXYZWXY ZXYZ[YZ[ŝ\Z Z[\][\] ^]^+_`&abcdeŝ]\ \[ZYXYXWVUTSRQPONMLKJHGFEDCB A?>=:9 86541!0 /&,+(#'$'#" ???!-??À??4 9??8- !$#? À?$?>=DCB AHGFEMLKJI QPONM UTSRQYXWV U \[ZYX _ ^ ] \ [b a ` _ ^] d c b a `f e d c ba g f e d c h g f e dci h g f e di h g f e dh g f e dcg f e d cbŝfe e d c b aŝdc c b a `_ a ` _ ^ ] ^ ] \[Z [ZY XWXWVUTSRQP€(ùĝŝ÷ööô@˙° ħ ² ³ ´µ ´ µĥ ·¸ışğĵ½ż ÀÁÂÄĊĈÇÈÉÊËÌÎÏÑÓÔĠ×ĜÙŝÚÜÜŬ Ŝà$áâċ"ĉé%ê#íî?ñ?ô?÷)ùú ûü?ŭ?ŝÀ˙?ŝ?ŭ9ûü;ùú?÷?ô7ñ+íîéê   À?$ÎÏÑÉÊËÌĊĈÇ ÈÀÁÂÄ ĵ½żÀ¸ışğĵ´ µĥ · ¸ı ħ ² ³ ´ µ Ż ° ħ ²ŝ³ĞĞ Ĵ ­ Ż°İ Ş Ğ Ĵ ­§ ¨ İ Ş ĞĴ Ĥ § ¨ İ ŞĞ Ĥ § ¨ İŞ¤ Ĥ § ¨ İŞŝ¤ Ĥ § ¨ İŞ Ĥ § ¨ İ ŞĤ § ¨ İ ŞĞ ¨ İ Ş Ğ Ĵ­ŝİŞ Ş Ğ Ĵ ­ ŝŻĴĴ ­ Ż °ħ Ż ° ħ ² ³ ² ³ ´ µ ĥµĥ· ¸ışışğĵ ½`abcbcdedefghijk"lmn$op(qrs't/vwx'y={|)}~&€0‚ƒ)„?…?‡?ˆ?‰?Š@‹?Š?‰?ˆ?‡?…ƒ„(‚ €?À?$p'qrn#opk lmijkghiŝdeefgbcd eabc _`aŭb]^^_`\]^ _[\] ^[\] Z[\ ]Z[\]Z[\]Z[\ ][\]^\]^]^_ ^_`a_`a babcd cd#efg XW VUTUTSRQPONMLK JIHGFEDCBA@? ><;: 876ŝ43321/ .- +%* ) ',&% #1"$ 4=$????À????3 /)+#*"   À?$<;:A@? > EDC BIHG FMLKJ QPONMUTSRQXW VU T[ Z Y X WV ] \ [ Z Y _ ^ ] \ [a ` _ ^ ]\ b a ` _ ^ŝ]cc b a ` _^d c b a ` _d c b a ` _c b a ` _^b a ` _ ^]a ` _ ^ ] \_ ^ ] \ [Zŝ]\ \ [ Z YXZ Y X W VUWVU T STSRQPŝOPPONML€ôóüòñòóóô@˙µ ĥ · ¸ ıŝş¸¸ı şğ ĵ½ ĵ½żÀÁÂÄĊĈÇ ÈÉÊËÌÍÎÏÑÒÓ ĠÖ×ĜÚÛ ÜŜßà â#äĉ)çè ê2ëŝìî îï ñ5òô<ġ%÷ĝ?ú?ü?ŭ?ŝÀ˙?ŝ?ŭ?ü?ú.÷ĝ ô2ġñ-ò%îïê/ë  û gçç èü äŭßßà ŭ ÛÛ Ü$ŭŝ××ĜÑ Òŭ,üÒÒÓÓÔÌÍÎŭjŝÎÎÏŝÈÈÉÊŭ0ŝÊÊËŝÌÄ ÄĊĈŭ`ŝ ĈĈÇÈ ÀÁÂŭOÂÄĵ½ ŭ:ŝżż À ı şğŝ ĵ½ŝµĥ ĥ ·¸ŝŝı ış ³ ´ µŝ( ĥ ·° ħ ²³ŭZ³ ´µ Ż °ħŝ ŭħ² ²³Ĵ ­ Żŝ$ŝ °° ħĞ Ĵ ­ŝ* Ż°Ş Ğ Ĵ­ŝ ŻŞ Ğ Ĵ­ŝ­ ŻŞ Ğ Ĵ­ŝŝ­ ŻŞ Ğ Ĵ ­ŝ Ż°Ğ Ĵ ­ ŝŻ °ħ ­ ݰŝ° ħ² Ż ° ħŭ²² ³´ħ ² ³´ŝ´ µĥŝ³´ ´ µ ĥŝ · ¸ŝĥ· · ¸ıŝ şğ şğ ĵŝ ½½żÀŝÀÁcd,ef'gh!ijklm!no#pqr(st,u v"wxy.z?|7~4€ ?‚?„…=†?‡?ˆ?‰?Š@‹?Š?‰?ˆ?‡ …3†?„?‚7€ûA~~ü||ŭ zz ŭxx$ŭŝu uvrsŭRŝsstpŭrŝqqmnŭPŝnnoklŭpŝ llmi jŭnjkghŭ_ŝhhiefŝ.fg cdeŝŝeefb cŝ8cd`abŭn b c _`aŝ ŝa ab^_`ŝ-ŝ ` ` a]^ _ŝG_` ]^_ŝJ _`]^ŝD_`]^ŭ_B_` ]^_ŝB _ `^_ŝB`^_ `ŝA`a_` aŝAababŝAbc bcdŝAdedeŝAefŝeff gŝA g hghiŝAijTS RQ PQPONMLKJIHGFEDC BA@ ? >=< ;:98 7654 310/- ,+)%("%$"4! %"-?????À?????3 ")"2!  û%%$ü((ŭ ,,+ ŭ00 /$ŭŝ44 3:9ŭLŝ8 8 7>=ü<^ŝ< < ;BA@ŭLŝ@@?FEDŭbü DDCCBJIHŭb G F MLKŭ[üKKJ JIPONŝ-NMLS RQŝüQQP PO V U Tŝ7 S RŝYX X WVŭh UTŝ[Z Z Y Xŝ ŝW W V\ [ ZYŝ,ŝ YY XW ] \ [ŭZEZ YX^ ] \[ŝH[ ZYŝ_^ ^ ] \ŝA[ ZŝY^ ^ ] \ŝ@[ ZŝY^^ ] \[ŝ@ŝ[Z ZY] \ [Zŝ@Z YX\ [ ZYŝ@ XWZ Y XWŝ@W VUX W VUŝ@U TS U T Sŝ@ RQŝSR R QPŝ@P ONONMŝ@MLKLK Jŝ@ IH€ôŝġööĝúùÁ¤n"˙ŭûÀ˙ŝŬ!˙ŝĊ"˙ŝï#˙ŝŭ˙ŝÊ˙˙ŝŭ%˙ŝĝ ˙ŝÎ˙˙ŝÒ!˙ŝÓ˙˙'˙ŝò(˙(˙ŝà)˙$˙ŝÊ˙˙)˙ŝĞ)˙ŝñ*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙ şğ ½À ÁÄĊÇÈË ÌÏÔĜÜàŝáääèìïòġĝúüŭŝ5˙ŝŭüúĝġòïŝëììèäàáÜŬĜŝÙÔÔÌÈÉÄĊÀÁŝ½½ ş ğŝ·¸ ¸ıµ ĥ³ ´ ²³° ħ² °ħŻ °ħŻ °ħ°ħ² ³ ´µĥ·¸ ışğ ĵ żÂef ghikmopqrtvx z{}ƒ„†‡ˆ‰ŠY‹Š‰ˆ‡†„‚ƒ} z{xvtq r op mn kl ijg hfd e cdbc ab` a `a`ŝa``a `abc def ghijP ONMLŝJIIŝHF FEŝCBB? > ;: 7632/+'$# 5 $#ŝ(''+/ 32 76; :?> BAF E IH LKO NR QPT SV UTWV XWY X YX YXYXW V UTSRQ P NM KJHG€¤ĤŝĤ§ŞĞĴŝ Ĵ ­°ħ²ŝ ² ³· ¸ŝ¸ı ½ŝżÄĊŝĊĈÊËŝË ÌÑŝÑÒ$×ŝŝ×ĜĜ$Ŭŝ Ŭ Ŝâŝç"èŝè ìíŝí$ñŝñ$ġŝġ$ĝŝĝ$ûŝû$ŭŝŭ$ŝŝŝ$˙ŝ:˙ŝ:˙ŝ˙$ŝŝŝ$üŝüùúŝúö÷ŝ÷$óŝó$ïŝï$êŝ ê ë$ċŝ ċ ĉ ßàŝàÙ!Úŝ Ú ÛÓÔŝÔĠÍÎŝ Î ÏÇÈŝÈÉ ÀÁŝÂş ğŝğ ĵ³´µŝ µĥ ­ŭŻŻ° §¨İŝ İŞĦ˘£ŝ£¤œŭž ž Ÿ—˜™ŝ ™ š ’“”ŝ”•– Žŝ‘’Š‹Œŝ  އˆ‰ŝ Š ‹ …† ‡ŝˆ‰ƒ„ …ŝ † ‡ ‚ƒ „ŝ  … †‚ ƒ„ŝ „ …† ‚ƒ„ŝ ŝ„… …†ƒ„…ŝ … †‡„…†ŝ  ‡ ˆ†‡ˆ‰ŝ ‰ ЉР‹ŝ  ŒŝŒŽŝ ‘’ŭ“  “ ” •–—ŝ —˜ š›œŝ œ Ÿ Ħŝ Ħ˘Ĥŝ §¨ĞĴŝ ­ ħ²ŝ ³´Z[ŝ[]^ŝ^_`aŝa b!deŝe ghŝhi$kŝl noŝo$rŝr su vŝvxyŝy$|ŝ| ~ŝ$ŝƒ„ŝ„$†ŝ†!‡ˆŝˆ$‰ŝ‰$ŠŝŠ$‹ŝ:‹ŝ:‹ŝ:‹ŝ:‹ŝ‹$ŠŝŠ$ˆŝˆ$‡ŝ‡$…ŝ…$‚ŝ‚ ƒ$€ŝ€$}ŝ}$zŝz{$wŝwstŝt!pqŝq$mŝmnijŝje fŝ f gb cŝc$_ŝ` [\ŝ\ ]XYŝ Y ZUVŝV WRSŝTP Qŝ Q RNOŝOPLMŝMNJKŝKLI Jŝ J KH Iŝ I J GHŝIGHŝHIGHŝHIGHIŝIJHIŭJJŝKIIJKŝKLKLŝL'MNŝ NOPŝPQRŝSTUŝU VWXŝ XYZ[ŝ [\]^ŝ^ _$aŝbdcbŝb a^]ŝ\[XWŝWVR QŝQ PL Kŝ K JFEŝ E D@?ŝ?>: 9ŝ9 43ŝ3/ .ŝ.-$)ŝ)($$ŝ$# ŝ$ŝ$ŝŝ%$ŝ$ŝ$ŝ:ŝ:ŝ$ŝ$ŝ%$ŝ ŝ!ŝ$"ŝ!'&ŝ&,+ŝ+$1ŝ1 0 76ŝ6= <ŝ<C BŝBAIHŝHGŝPOONŝNMVUTŝ T Sŝ\[[ ZŝZYa`ŝ_^gf eŝedlkjŝjiqp oŝnm utsŝsryx wŝŝwvvu|{zŝzy ~}ŝ}|{€ŝ~ ƒ‚ ŝŝ€ € „ƒ‚ŝŝ‚€…„ƒ‚ŝ‚ „ƒ‚ŝ‚€„ƒ‚ŝ € ‚ €ŝŝ€~ € ~ŝŝ~}}|}|{ŝ{zyxŝxwvuŭt t srqpŝ p onm lŝŝlkkjih gŝgfcbŝa`^] \ŝ\ [XWVŝVU$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙§¨İŞĞ­Ż ° ³´µĥışğĵżÀÁÂĈÇ ÈÌÍ ÎÒ$ÓÔĜ)Ù&Ŝß-ä è1é+íîñ%ò?ġ4ĝ ù?û?ŭ?ŝÀ˙?ŝ?ü?ú?÷1ó ô(ï?ë6ĉçà6áâ"ÛÜĠ%ÖÏ"ÑÉÊËÂÄĊ ĵ½żĥ·¸ı°ħ²³ ŞĞĴ ­¤Ĥ§¨Ÿ Ħ˘£š›œž –—˜™š ’“”•–Ž‘ ’‹Œ Ž‰ Š‹ Œ ‡ˆ ‰ Š ‹Œ†‡ ˆ ‰ Š‹ † ‡ ˆ ‰ І ‡ ˆ ‰ Š ‡ ˆ ‰ Š ‹ˆ ‰Š ‹ ŒŝŠ‹ ‹Œ ŽŽ ‘‘’“”•–— ˜™š› œžŸ Ħ˘£¤Ĥ ¨İŞ ĞŻ°ħ´µĥ["\]"_`b#ce+fg-ijl"mo6p5s t)vw$yz.|}? 3‚?„?†?ˆ?‰?Š@‹?Š?ˆ?‡?…?ƒ:€}6~?{w!=<&873,21/-,/('?#,6???? ö?????5 ?!&"%+&*$0/ 6)54ŝ<;$;:A @ŝ?GGF EMLKSRQYXW V^]\[dcbaŝ`iihgfe mlk jqpo n utsrqŝyxxwvu {zyxw}|{zy ~}|{ €~ } |ŝ€ €~ }| €~}|ŝ€ ~}|{ ~}|{z |{zyxzyxwvutsrqp onmlkjih gŝfeedcb`_^][ZY XUTS˙ĞĴ­ °ħ²³ ĥ·¸ ıĵ½żÂÄÈÉÊÎÏ Ô"ĠÖ)ÚÛß(à ä2ċé)ê?î?òġ6ö?ù?û?ŭ?ŝÀ˙?ŝ?ü?ú?÷?ô? ë5ì7çè3â Ü,ŬŜÖ%×ĜÑ!ÒËÌÍĊĈ ÇżÀÁışğ³´µĥ­Ż° ¨İŞĞ £¤ĤžŸ Ħ˘ š›œž –—˜™š“ ”• –—  ‘ ’ “ ”ŝŽ Ž   ‘’ Œ  Ž   ‹ Œ  Ž Š ‹ Œ  Ž ‹ Œ  Ž ‹ Œ  Ž   Ž   ‘   ‘ ’ “‘ ’“ ” •–• –—˜™˜™š›œžŸ   Ħ˘£¤ Ĥ§¨İĞĴ­ħ²³´ĥ·¸ı] ^_`#abc&de%ghj"km.np8qr7tu5w x=z{?}*€?‚?„?†?ˆ?‰?Š@‹?Š0ˆ‰?‡?…?ƒ??~ {|x'yu$v"rs,opk0l mh+ije%fb c_`\]^YZ [VWXTUVRST PQROP QMNOPLMN OLMNLMNLMNLMNO MNO NOPŭQOPPQ RQRSŝTSSTUVWXYZ[ \]"^_%ab"de^]\[ZXWVU SRQPMLKHGFEBA@< ; 7$6 5'10#,+,'&#8"????=???? 5#?ŝ! = !%$*,)/*.43 :#98?>=EDCKJIHPON VUTS[ZYX`_^] edcbjihgfnmlk j qponmŝut tsrqp wvuts yx wvu{z yx wŝv|| {z y xw | { z y x|{ z y x {z yxwzyx w vxwv u tŝvu utsrqsrqponmlkjihgfedcba` _]\[Z XWVUSRQ P˙ݰħ²´µĥ· ışğ ĵżÀÁÄĊĈ Ç ÊËÌÑÒ Ö×Û&ÜŬà-á âċ7ĉçê$ëî:ï ò1ó?ö?ù?û?ŭ ŝô˙?ŝ?ü?ú#÷ĝ9ôġ/ñì&í5è é'ä)Ŝß Ĝ%Ù Ú ÓÔÍÎ Ï ÇÈÉÁ Äĵ½ ĥ·¸ ıħ²³´ĞĴ­ŻŝĤ§§¨İ Ş˘£¤Ĥ žŸ  Ħ˘š ›œ  žŝŸ—— ˜ ™ š ›” • – — ˜™’ “ ” • –— ‘ ’ “ ” •  ‘ ’ “ ”  ‘ ’ “”  ‘ ’ “” ‘ ’ “ ”•ŝ‘’ ’ “ ” • –“ ” • – —˜– — ˜ ™ š™š › œ œžŸ Ħ Ħ˘£ ¤ Ĥ§¨İŞĞĴ ­ŝŻŻ°ħ²´µĥ ·ışğĵ _ `ab"c de$f gh(ij k+lmn1o p4r s6uv>xŝy{>{}'~?€.‚ƒ„…?†?ˆ?‰?Š@‹?Š?‰?‡8…†/ƒ„?ŝ~=?|(yzvwst!pq%mn(jkf&ghc$de`!ab^_`[\]YZ[VWXYTUVWST U QRSTPQR OPQRŝNOOPQNOP QNOP QOPQPQRQRSRS/TU VŝUVVW XYZ[\]^_!`a b#cd e&f gZYX WUTSR PONMKJI HEDC @?>:95#430)/.+)*'&%"/! 4/+????,/??! *$$# )5(.-- ,3&218"7 6=<; CBAHGFNML K SRQ P XWV U ]\[Zba`_^fedcbjihg f mlkji p onmls rq p oŝnuu t s r qp v u t sr w v u t sx w v u tsŝxw w v u tsw v u t srŝvu u t s rqts r q po qp onmnmlkj kjihgfedcba`_^]\[ ZYX W UTS RPON M˙ ²³´µŝĥ· ·¸ışĵ½żÂÄ ÇÈÉÊÍÎ ÏÒÓÔ×!ĜÙŬŜ"â3ç èë!ìï&;óô"ö÷?ùû-ü?ŭ˙?ŝ?ü?ú?ĝ?ġ0ñò$íî2é êä%ċß)àáÚ#ÛÜŝÔĠĠÖ ÏÑŝÉÊÊË Ì ÄĊĈÇŝżżÀÁŝÂıışğĵ ´µĥ·Ż°ħ²³ŞĞĴ­ Ĥ§¨İ Ş˘£ ¤ Ĥ Ÿ   Ħ ˘£ œ  ž Ÿ  ™ š › œ ž— ˜ ™ š ›œ• – — ˜ ™ šŝ”• • – — ˜ ™” • – — ˜™” • – — ˜™• – — ˜ ™š– — ˜ ™ š›˜ ™ š › œŝš› › œ  žŸ ž Ÿ   Ħ˘ Ħ˘ £ ¤ŝ¤ Ĥ§¨İŞĞĴ­Ż°ħ ²³´µŝĥ··¸ışĵ½ż abcd!e fg#hŝijjk"mn%pq*st3v w?y{,|;~€-?ƒ?…†6‡?ˆ?‰?Š@‹?Š?‰?‡?†?„ 4‚1 €?}6z{#wxt$uq(rn*ok(lmh%ij e"fgb cd`ab ]^_[\]YZ [WXY UVWXTUVŝRSSTURSTQRST QRST QRSTQRSTRSTUSTUVTUV W VW+XY$Z[\]^_`a bcd"e fg%hiWVUTS RQP OMLKJ HGFE CBA@>=<;87632%.-*/) (!%$!( #??6??????/?$$#"4' &, +1%0/6!54;:9A@?>FEDC KJI H PON MUTSRŝZYYXWV^]\[Zba`_^fedc bihgf elk j i h n m l kj p o n m lr q p o nms r q p ons r q p ons r q p on r q p o nq p o n ml o n m l kml k j i ji hgf gfedcŝdccba`_^] \[ZY XWVUTS RQP O MLKJ˙ĥ·¸ ışğĵ½żÀÁÂĊĈÇÊËÌ ÏÑÔĠÖÙÚÛŜ%ßà+äċ(èéì í*ñ?ô?÷ù*ú?ü?ŭ˙?ŝü:ŭú=û?ĝ8ġö?ò-îï-êë ċ/ĉç'áâÜŬ×ĜÙÑÒÓÔ ÌÍÎÏÇÈÉÊÂÄĊŝĵ½½żÀ¸ış ğ ³´µĥ·Ż°ħ²Ş ĞĴ­ŝݧ § ¨İ ŞĞ£ ¤ Ĥ §¨  Ħ ˘ £ ¤ž Ÿ   Ħ ˘£œ  ž Ÿ  Ħš › œ  ž Ÿŝ™š š › œ  žŝŸ™™ š › œ ž™ š › œ  žš › œ  žŸ› œ  ž Ÿ  ž Ÿ   Ħ˘Ÿ   Ħ ˘ £¤˘ £ ¤ Ĥ§ Ĥ § ¨ İŞ İŞ ĞĴ­Ż° ħ²³´µĥ·¸ ışğĵ½żÀÁ cdef gh"ijk%lm n)opq)rtu0wxy:z$|}???ƒ?…?‡?ˆ?‰?Š@‹?Š?‰‡"ˆ?†?„?‚?€}$~?{$xyu+v r1sto,pq%mnj"kg"h idefbc d_`aŝb] ]^_ [\]YZ[\XYZVWX YUVW XTUVW TUVWTUVTUVWTUV WUVWXVWX WXYZYZ [Z[\]\]^ŝ_^^_`abcdef!gh#ijSRQ PONML JIH GEDCB@?>;: 96542!10 -', +$('$%# #9!0??*???.?72 #"!(&% ++*)"/.4 32987>=<CBA@ HGFEMLKJŝRQQPONVUTSR ZYXWV^]\[Zba`_^]ed cb a`ŝhg g f e dcj i h g fel k j i hgm l k j ihn m l k ji n m l k jŝinn m l k ji m l k j i l k j i hk j i h gf h g f edfe dc bcb a` _ŝ`_ _^]\ŝ[\\[ZY XWVUTSRQ PONML JIHG˙ışğĵ ½ żÀÁŝÂÄĊ ĈÈÉÊËŝÌÍÍÎÏŝÑÒÒÓ ÔÖ×ĜÙÛÜŬà$á â&ċĉé"êí î:ñò$ôġ2÷ ĝ?ú?ü!ŭŝ˙?ŝ?ŭ?ûĝ&ù?öò0ó6ï'ëì+çèâ(äŬ"ŜßÙÚÛÔĠ ÖÏÑÊËÌŝÍĊĊĈÇÈ ÀÁÂğĵ½ż ·¸ışğ³´µĥ· ݰħ ²³Ğ Ĵ ­ ݰ¨ İ Ş Ğ Ĵŝ­ Ĥ § ¨ İŞ £ ¤ Ĥ §¨Ħ ˘ £ ¤ Ĥ   Ħ ˘ £ ¤ Ÿ   Ħ ˘ £¤ž Ÿ   Ħ ˘ £ŝžŸ Ÿ   Ħ ˘ £¤Ÿ   Ħ ˘ £ ¤  Ħ ˘ £ ¤ ˘ £ ¤ Ĥ§¤ Ĥ § ¨İ § ¨ İ Ş Ğ Ş Ğ Ĵ ­ ­ Ż °ħ²³´µĥ·¸ ışğĵ½ żÀ ÁÄĊĈefghi j"klm%no!pqr-s tu*v+xy z5{3} ~#€6‚ƒ:„#…†?‡<ˆ‰zŠ@‹?Š?‰?ˆ?†„!…‚-ƒ€!2~ {=|$yz v2w-tuq"rn'opk$lmi!jkfghde fbcd_`abŝ]^^_ `\]^Z[\] YZ[\ XYZ[WXY ZWXYŝZWWXYWXY WXYZXYZYZ[Z[\ [\]^]^*_`$abcdefgh i j#klPONMLKJIH GFE DBA@>=< ; 9874320!/.+"*',&#."??????????3 *?!! %#$!)(.$-,210 765<;:9@?> EDCBJIHGF NMLK RQPO VUTSRZYXW V ] \[ZY `_ ^ ]\c b a ` _^e d c b aŝ`gg f e d cb h g f e dci h g f ed i h g f eŝdii h g f edi h g f e d g f e d cf e d c bad c b a `_ a ` _ ^]_^] \[Z [ZYXWXWVUTSRQ PONMLKJIH GFED˙½żÀ ÁÂÄ ĊĈÇÈÉËÌÍÎÏÑ Ò ÔĠÖ×ÙÚ ÛŬŜßâ#ŝäĉĉ)çèê/ëî!ï?ò?ġ?ĝ?ú?ü?ŝ˙?ŝ?ŭ?û?ù3ö ÷*óô=ñ!ìíè#é äċß!àáÛÜŬ Ö×ĜÑÒÓ ÔÍÎÏ ÈÉÊ ËÄĊĈÇ żÀÁ ğĵ½ż ·¸ışğ³´ µĥ · ° ħ ² ³ ´ ­ Ż ° ħŞ Ğ Ĵ ­ ݍ İ Ş Ğ Ĵ­Ĥ § ¨ İ ŞĞ Ĥ § ¨ İŞ¤ Ĥ § ¨İ ¤ Ĥ § ¨İ ¤ Ĥ § ¨İ¤ Ĥ § ¨ İŭŞĤ Ĥ § ¨ İ ŞŝЧ§ ¨ İ Ş ĞĴİ Ş Ğ Ĵ ­ŝĞĴ Ĵ ­ Ż ° Ż ° ħ ²³² ³ ´µĥµĥ·¸ışğĵ½żÀÁÂÄĊĈÇÈ Éghijkl!mno p q(r s tuv3wx%yz {1|?~9€;‚ƒ?„?†?‡?‰€Š@‹?Š?‰?ˆ† ‡?…?ƒ?? |3}$z{w6xyu vr+s tp q m#nok!lmhijfghdefbcd `ab^_` a]^_`\]^[\]ŝ^Z Z[\]Z[\YZ[\ŝYZZ[\Z[\]Z[\][\] ^\]^ _^_`_`ab ab(cd"efghij kl#m n LKJI HGFEDCBA?>= ;:98765421 0 .!-,*%)(ŝ&%+%$"5! ! 1/?(????????? $0# ()'&,#+ *0/.543ŝ29987>=< ; BA@ ?FEDCŝKJJIHGŝONNML K RQPONVUTS RYXW V U\ [ Z Y XW ^ ] \ [ Z ` _ ^ ] \b a ` _ ^] c b a ` _^d c b a `_ d c b a `_ d c b a `_d c b a ` _c b a ` _ ^a ` _ ^ ]\ _ ^ ] \ [] \ [ Z YX ZY XWV WVUTSTSRQPONMLKJ IHGF E DCB A˙ÁÂŝ ÄĊĈÇŝ ÈÉÊËŝÌÍÎÏŝ ÑÒÓÔŝ Ô Ġ×ĜŝĜÙÛÜŝŬßàŝá"äċŝċ%èŝéë"ìŝ ì íï ŝòóŝó ġöŝö%ĝŝĝ$úŭûû%üŝü%ŝŝŝ%˙ŝ:˙ŝ:˙ŝ:˙ŝ˙%ŝŝŝ%ŭŝŭ%ûŝû%ùŝù%÷ŝ÷%ôŝô%ñŝñí îŝî éêŝêëċĉŝĉç áâŝâŬŜŝŜ ßĜÙÚŝ  ÚÛ ÔĠŭÖ Ö×Ñŝ!ÒËÌ Íŝ"ÍÎ ÇÈÉŝ#ÉÊÄĊŝ$ĊĈ żÀÁŝ$ÁÂğĵ ½ŝ% żŝ·¸ ¸ ışŝ&ŝşğ ğĵ´ µ ĥ·ŝ&ŝ·¸ ¸ıŝħ² ² ³ ´ŝ' µ ĥŻ ° ħ²ŝ(² ³´­ ݰŝ)° ħ²Ğ Ĵ ­ ŝ)Ż °Ş Ğ Ĵ­ŝ* Żİ Ş Ğ Ĵŝ+­ ŝŻİİ Ş ĞĴŝ+ ­İ Ş ĞĴŝ+ ­ Ş Ğ Ĵ­ŝ,­ Ż Ğ Ĵ ­ŝ, ݰĴ ­ Żŝ- °ħ Ż °ħŝ.ħ ²³° ħ ²³ŝ. ´µ³ ´ µĥŝ.ĥ ·¸ĥ · ¸ıŝ.ı şışğĵŝ/ĵ½ŝ½½ żŝ/ ÀÁÂŝ/Ä ĊĈÇŝ/ÇÈ ÉÊËŝ/ËÌjkŝAkl mŝA mnoŝAop qŝArstŝAt uvŝAvw%xŝAxyz{ŝA{|}ŝA}~"ŝA%ŝA%ƒŝBƒ„…ŝB…%†ŝB†‡ˆŝBˆ%‰ŝB‰%ŠŝC#Š‹ŝC:‹ŝC:‹ŝD:‹ŝD:‹ŝD:‹ŝD‹%ŠŝEŠ%‰ŝE‰%ˆŝEˆ%‡ŝF‡%…ŝF…ƒ„ŝG„‚ŝG‚ €ŝG€}~ŝG~#{|ŝH|%yŝHy zvwŝIwtuŝIuqrŝIrsopŝJ pqmnŝJnjklŝKl hiŝKj fgŝKhdefŝKfgc dŝLd e abŝLcd`aŝLabŝ^__ `ŝM`a^_ŝMŝ_`` ]^_ŝM_`ŝ\]]^ŝM^_\] ^ŝN^_\] ^ŝN^_]^ŝN_`]^ _ŝN_ ` ^_`ŝN `a _`aŝO ab`abŝO b cbcŝOdcd eŝO e fefgŝOghghŝOijŭkOk lmŝOmn oŝOopHGFŝ@FEDCŝ@ BA@?ŝ@>=<;ŝ@ŝ;::87ŝ@ŝ76643ŝ@ŝ3220/ŝ@/. ,+ŝ@+*('ŝ@ '&$ #ŝ@#% ŝ@ #ŝ@ ŝ@%ŝ@ŝ@%ŝ@%ŝ@ŝ%ŝ@%ŝ@:ŝ@:ŝA:ŝA%ŝA%ŝAŝA ŝA%ŝA   ŝA ŝA ŝBŝ#"#"ŝB" ! &%ŝB%* )ŝB)(. -ŝB -,2 1ŝB 10765ŝB 5 4;:9ŝB 9 8 ?>=ŝB= < CBAŝCA @GF EŝCEDŝCKKJIŝC HG NMLŝCLKJRQPOŝCONMU TSRŝDR QP W V UŝD T SZ Y XWŝD VUŝ\[ [ Z YŝD X W] \ [ZŝDZ YX ^ ] \[ŝD[ ZY_ ^ ]\ŝD\ [Z _ ^ ]\ŝD\ [Z _ ^ ]\ŝD\ [Z_ ^ ] \ŝE [ Z^ ] \[ŝE Z Y \ [ ZŭYEY XŭW[Z Z Y XŝE W V X W VŝE U TVU TSŝESRŝQSSRQŝE P OPONŭME MLKJŝEJIHGŝEF ED CŝECB A@?ŝE? >*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙Ċ Ĉ ÉÊ ÍÎ ÑÒ ĠÖÙ ÚŬ Ŝá âċ ĉéŝêííóöùûüŝG˙ŝŭûŝüùù ú÷ô ġñ òîëçßŝàÛÛ×ÓÎÏÊËŝĈÇÇ Äż Àĵ ½ı şĥ ·¸´ µ² ³ŝ°ħ ħ²Ż °ħ ݰ ݰ ݰݰ ħ ²³ ´µ ĥ ¸ığĵ żÁÂĊĈÈÉÌ Ílnprst uwy{}ŝ€ƒ…†ˆ‰Šk‹Š‰ˆ‡… †„‚€~|zx uvsqolmj khig efdb ca b`a`a_`_ `_'`abcd efghijk lmnpED A@=ŭ<:996 52 1 .-*ŝ)&&# "G! %$(,043 87<;@ ?CŝBGG F JI ML POS RŝQUU TW VUXW YXZ Y ZYZYZ YXY XWV UT S QPO NL KIH EDBA> =€·¸ıŝ ış żŝ  ż À ÄĊŝ ĈËÌŝ ÌÑ Òŝ Ò×Ĝŝ ĜŬŜŝ Ŝ$ŝ $èŝ è$íŝ í$ñŝ ñ$ġŝ ġ$ĝŝ ĝ$ûŝ û$ŭŝ ŭü$ŝŝ ŝ$˙ŝ ŝ$˙ŝ ˙1ŝŝ ŝ$ŭŝ ŭ$ûŝ û$ĝŝ ĝ$ġŝ ġ$ñŝ ñ$íŝ í$èŝ ŝèéé$ŝ ä ŬŜŝ Ŝ×Ĝŝ ĜÙ ÑÒŝ  ÒÓË Ìŝ ÌÍÄ!ĊŭĈ Ĉżŝ żÀ·¸ıŝ ış ħ²ŝ ³ŝ´ĞĞĴŝ ­Ĥŝ §¨ Ÿ Ħŝ  Ħ ˘š›ŝ  œ•–ŭ—  — ˜‘ ’ŝ ’“”Œ Žŝ ŝŽŝˆ‰‰Š‹ŝ ‹ Œ†‡ˆŝ ˆ‰ŝŠƒƒ„…ŭ† † ‡‚ƒ„ŝ „…†‚ƒŝ ƒ„…€‚ƒŝ ƒ „‚ƒŝ ƒ„…‚ƒ„ŝ „…†ƒ„…ŭ†  † ‡†‡ˆŝ ˆ‰ˆ‰Š‹ŝ ‹ŒŽŝ Ž ‘’ŝ ’“ŝ”••–ŝ —˜ŝ™šš›ŝ œ Ÿ Ħŝ  Ħ˘Ĥŝ Ĥ§Ğ Ĵŝ Ĵ­ħ²ŝ ²³ ·¸ŝ ıżŝ żÀÄĊŝ  Ċ Ĉdeŝe$hŝhiklŝl$oŝ oprsŝsu"vŝv$yŝy$|ŝ|$ŝ$ŝ$„ŝ„$†ŝ†$‡ŝ‡$‰ŝ‰$ŠŝŠ$‹ŝ:‹ŝ:‹ŝ:‹ŝ‹$ŠŝŠ$‰ŝ‰$‡ŝ ‡ ˆ$†ŝ†$„ŝ„$ŝ‚$ŝ$|ŝ|$yŝy$vŝvrsŝs$oŝop klŝl$hŝi deŝe#aŭbb]^ŝ^ _Z[ŝ[\W XŝXYTUŝ UV QRŝRSO PŝPQMNŝNOK LŝLM IJŝJKHIŝI JGHŝHIFGHŝHI FGŝHFGHŝHIGHŝHIHIŝI JIJŝJ.KLŝLMŝLMMNŝNO PŝPQRŝRST UŝUVW XŝXZ [ŝ[ ]^ŝ^_$aŝabd eŝe$hŝ hiklŝlRQŭPPŝOLLKŭJJŝFE!EŭDD$?ŝ>$9ŝ98 43ŝ32$.ŝ-) (ŝ($$ŝ#$ŝ$ŝ$ŝ$ŝ$ŝ$ŝ$ŝ$ŝ:ŝ$ŝ$ŝ$ŝ ŝ$ŝ$ŝ$#ŝ#) (ŝ(.-ŝ-$3ŝ3 2!98ŝ8?>ŝ>EDŝDKJŝJRQPŝPOXWVŝVU^] \ŝ \ [cbŝaih gŝgfnmlŝlkŝsrrqŝpowv uŝuts{zyŝxw~} |ŝ|{z€ŝ ~}ƒ‚ ŝ€„ƒ‚ŝ‚ …„ƒŝƒ‚†…„ŝ ƒ ‚…„ƒŝƒ‚ŝ…„„ƒ‚ŝ‚ ƒ‚ ŝ€€ ŝ ~} ~}|ŝ|{z{z yŝx wvuŝutsr qŝŝqppo nmlŝl kihgŝ g fc bŝba^]\ŝ\[ XWŝV RQŝŝQPP LKŝKJFEŝED$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙şğĵÀÁ ĈÇÈÌ"ÍÎŝÒÓ&ÓÔĜ.Ù ÚŜ'ß<äŝèé=é,íî%ñò?ġ?ĝ?û?üŝ?ŭ?û?ĝ?ġñ8òí(î?é;äċ Ŝ3ß,ÙÚ#ÓÔ#ÍÎĈ ÇÈ ÀÁÂşğĵ´µĥݰ¨İŞĞ˘£¤ žŸ ˜™š›œ ”•–— ‘’“”ŒŽŠ‹ŒŽ‡ˆ‰Š ‹Œ †‡ ˆ‰Š …†‡ ˆ‰ŝ„… …† ‡ˆ‰ … †‡ ˆ‰ †‡ˆ‰Š‡ˆ‰Š ‹ŝŒŠŠ‹ŒŽŒŽ‘’“”•– — ˜™š›žŸ   ˘£¤ §¨İŞ­Ż °³´µĥışğĵÀÁÂĈ"ÇÈe-fg!ij l1m7pq'stv$wy(z#|}?9‚?„?†?‡?‰?Š‹?Š?‰?ˆ?†?„?‚?|)} y4zv-w!st4p q l5mijŝef/f gb+cd_#` \]YZV!WX STUQRSOPQMN OKLM JKL IJKIJ KHIJKIJ K IJKJKLKL1MN(OPQRSTUV!WŝXY#YZŝ[\%\]$_`b#c e2f0ijl!mON MJIHGD CB >$=<8'7/21"-,#('?#-?ŝ=???8o????4 &5# "(('-','218,76>&=<D"CBIHGON MUTS [ZYX`_^fedckjihg onm lsrq p wvuts zyxwŝv}}|{zy~}|{€~}€~}‚€ ~ŝ‚ €~ü}€€~} ~}|{}|{zyzyxwvutsrqponmlkjih fed ca`_ ^[ZYVUTSPONJ IHD$CB˙ĵ½ żÂÄĊÈÉÊ Î!ÏÔ%ĠÖ!ÚÛß0àä8ċé)ê?î?ò?ġ?ĝ?û?üŝ ŭ2ü?û?ĝ8ġö?ò?î é4ê?ċß7àÚ!Û Ô(ĠÖÎ#ÏÈÉÊÂÄĵ½żĥ·¸ ı°ħ²³ ĞĴ­ ŝĤĤ§¨İ Ħ˘£¤ œžŸŝ ˜˜™š› ”•–—˜‘’“”• Ž ‘’ Œ  ŽŠ ‹Œ  Žŝ‰‰Š ‹ Œ Ž ‰ Š ‹ Œ ‰ Š ‹ Œ ŽŠ ‹Œ  Ž Œ Ž  Ž ‘’‘’“”ŝ•” ”•–—˜—˜™š ›œž Ÿ Ħ˘£¤Ĥ§¨ŞĞĴ­ŝ° °ħ²³ĥ·¸ĵ½ ÂÄÈ Ég"hj,km5no5q r/tu.wx9z{?}*€?‚?„?†?ˆ?‰?Š‹*Šİ‹VŠ?‰?ˆ?†?„?‚6€?}6z{,wx.tu6qrm9nj*k gh'de`&ab]#^_Z"[\XYZ UVWST UQRS OPQNO PLMNOLM N KLMKLM KLMŝKLLM NLMNOMNOPOP+QR"STUVW XY Z"[\]$^ _`'ab c+d e0gh(jkm!n MLKGF EBA@<";:7(6510,"+*'&#;"? 3???????????"#'&,(+1"0)65<%;:B A@GFEMLKSRQPXWVUŝ^]]\[cba`_gfe dlkjihponml srqpŝov vutsryxwv u{zyx w|{zyx }|{zy~}| {zy }| {zyŝ}| |{zyx{zyxwyxwvuŝwvvutsrqponm lkjihgfedcba`^]\ [YXW VSRQNMLKHGFB!A˙ żÀÁÂĊĈÇÊËÌÍ ÑÒÖ"× Û*ÜŬà3áâċ7ĉ'êëî%ï=òó ġ2ö?ĝ?û?ü=ŝŭÀŝ?ü?û?ĝ?ö9òóî,ï$êëċ;ĉà7áâ Û.ÜŬÖ ×"Ñ ÒÊËÌĊĈ ÇżÀÁ ışğĵ³´µĥ ݰħ İŞĞĴ¤Ĥ§¨ Ħ˘£ŝ¤œ œžŸ ˜™š› œ • –— ˜ ™’ “ ” • –— ‘ ’ “ ”•   ‘ ’ “ Ž   ‘ ’ Ž   ‘’ Ž   ‘ ’   ‘ ’“ ‘ ’ “ ”ŝ•’’ “” • – • –— ˜™ ˜™š›œ›œžŸ Ħ˘ £¤Ĥ§ŝ¨İİŞĞĴݰħ ³´µĥ¸ış ğ żÀÄĊ Ĉ ÊËh*i jk.l m1o p1r s4u v>xŝy{>{}#~?€?‚?„?†?ˆ?‰€Š€‹€Š?‰?ˆ?†?„?‚?€}%~?{?x8uv5r s7opk1lmh+ije(fgb%cd_"` a\ ]^Z[\WXY UVW STUQRSTPQROPQ NOPŝMNNO PMNOPŝMNNO PNOPOPQPQRQRSTST%UVWXYZ[\!]^_#`ab c ef hik!ln$oŝKJJI HEDC@?>:!985&430-/.+**-&%"$! ??????????#"(!-&%++*00/5)4ŝ3::!9@?>ED CKJIHPONŝMUUTSZYXW_^]\dcba` hgfedlkjihonmlk rqponutsr qwvu tsŝrxxw vu tyx w v u y x w vuy xw v u xw vutwvu t sutsr qŝsr rqpoünppoonmlkjihgf edcb a`_^] [ZY X VUTSQPONKJ I FEDA"@?˙ÂÄÇÈÉÊÍÎ Ï ÒÓÔ×#ĜÙ#ŬŜ*âĉ8ç5ë ì?ï?ó?öĝ*ù?û?ü?ŭ…ŝ:ŭ?ü?û ĝ2ù?ö?ó?ï;ëìĉ6ç0â)ŬŜ×%ĜÙÒ Ó ÔÌÍÎÏÇÈÉÁÂ Ä ĵ½ż·¸ışħ²³´µŝĴ­­Ż ° ¨İŞĞĴ¤Ĥ§¨  Ħ˘£¤œ ž Ÿ  Ħ™ š› œ ž — ˜ ™ š › • – — ˜ ™“ ” • – —˜ŝ’“ “ ” • – —’ “ ” • –—’ “ ” • –—“ ” • – —˜ • – — ˜ ™ — ˜ ™ š›™ š › œ œ žŸ  Ÿ Ħ˘£¤Ĥ §¨İŞ Ğ Ĵ­Ż ħ²³ ´ ĥ·¸ığĵ½ Á ĈÇÈËÌÍj!k mn$pq+st6vw?y{&|?~'€ ‚2ƒ„*…?†?ˆ?‰€Š€‹€Š?‰?ˆ?†„*… ‚2ƒ,€?~{!|x=<;8 7 32).- *4)/%$-! ?)8??/0??>ŝ+?2! 5% $*0)0.-'329"87>=<CBAHGFMLKRQPŝOWWVUT\[ZY`_^ ]dcbahgfed kjihg nmlkjŝqp po nml r qp ont s r q poŝut t s r qpu t s r qpu t s r qpt s rq poŝsr rq p onqpo nml nmlkjlkjihgfeŝdeedcb a`_^]\[ZYXWVU SRQPNMLŝKI IHG DCB?!>=˙ĊĈÇÊËÌÏÑ ÔĠÖ Ù#ÚÛ Ŝ(ßà"äç:è?ìŝï=?ó?ö?ù?û?ü?ŭ€ŝ?ŭ?ü?û?ù?ö?óï7?ì ç3è&äŜ(ßÙ$ÚÛÔ ĠÖÏÑÉÊËÌ ÄĊĈÇżÀÁÂşğĵ½ µĥ· ¸°ħ²³´ Ĵ­Ż° ¨İŞĞĴ¤ Ĥ§ ¨ Ħ ˘ £ ¤ ž Ÿ   Ħ ˘› œ  ž Ÿ  š › œ  ž˜ ™ š › œ— ˜ ™ š ›œ— ˜ ™ š ›œ— ˜ ™ š ›œ˜ ™ š › œ™ š › œ ž› œ  ž Ÿ ŝž ž Ÿ   Ħ˘ Ħ ˘£ ¤¤Ĥ§¨§¨İŞĞĴ­Ż°ħ² ³´µĥ· ışğ ĵ żÀÁ ÄĊĈÈÉÊËÍÎÏk'lmn,opq'r$tu7wx y2z3| } ~1??ƒ?…?†?ˆ?‰€Š€‹€Š?‰?ˆ?†?…?ƒ?~)?|y)z?w/tu"qrn%ok)lm h&i je#fgc!de`ab^_ `\] ^Z[ \XYZVWXY UVWŝXT TUVŝWSSTUVSTUSTUSTU STUVTUVUVW VWXYXY ZYZ[\[\]^_`ab!cde$fgh i*klm1nop/qEDC@?>;:9 652$10-),4( '/$#> ŝ 1?????:ƒ<?????(? ;$#)7(-,2'10 7!65<;:A@?>FEDCKJIHONML TSR QŝYXXWVU]\[ZYŝa``_^ ]dcba` gfedcj ih gfl k ji hn m l k ji o n m l kp o n m lk p o n m lp o n m lk o n m l kn m l k j lk j ih j ihg fgfedcdcba`a`_^]\[Z YXWVUTSRPONMKJIGFEDBA@ = <;˙ÇÈÉÊÌÍÎ ÏÑÒÓÔÖ×ĜÛ!Ü Ŭàá ä0ċĉŝèé9éêì=í$ñ ó3ô*ö÷?ù?û?ü?ŭ€ŝ?ŭ?ü?û?ù?öó ô8ñì/í è1éä#ċß+àáÛ ÜÖ×ĜÑÒÓÌÍÎÇÈÉŝÊ ÂÄĊ ½żÀ¸ışğĵ ´µĥ·¸ °ħ²³´ Ĵ­Ż°¨İ ŞĞ Ĵ­ Ĥ § ¨ İŞŝ˘£ £ ¤ Ĥ§  Ħ ˘ £ ¤ž Ÿ   Ħ ˘ £ ž Ÿ   Ħ˘œ  ž Ÿ   Ħœ  ž Ÿ  Ħœ  ž Ÿ  Ħ ž Ÿ   Ħ˘ž Ÿ   Ħ ˘£  Ħ ˘ £ ¤˘ £ ¤ Ĥ§ Ĥ § ¨ İ ¨ İŞĞĴĞĴ­Ż°ħ²³´µĥ·¸ışğĵ½żÁÂÄĈÇÈËÌ ÍÑÒm&nŝop&pq r0stu"v7xyz'{?}:€2 ‚?ƒ?…†:‡?ˆ?‰€Š9‹Š4‹‹Š?‰?ˆ†"‡?…?ƒ???}&z{w:x+uvr'so.pq&mnj&kŝlgg"hiefgbcd`ab^_`\]^Z[\]YZ[XYZWXYVWXYUVWXUVW XUVW XVWXVWXYWXY ZYZ[ Z[.\])^_"`abcd!efg#hi'jkl(m)opq6rŝCBBA@>=<;987ŝ54430$/ .,*+*''&.#"?6=?????€??????? 2?#ŝ('5'&,-+*0/5!43:98>= <CBAHGF ELKJIQPONMUTSRQYXWVU]\[Z Y`_^] \cb a` _ e dc bah g f e dc i h g f eŝkj j i h gf k j i h gŝlk k j i hg k j i h gk j i h gf i h g feh g f e dcfe dc ba cba`_ `_^]\ ]\[ZYŝZYYXW VUTSRQPONMLKJIHG FDCB?>= ;:9˙ÊËÌÍ ÏÑÒÔĠÖĜÙÚŬ!Ŝßá'â-ĉç5ê ë í2î?ñ?ô?÷?ù?û?ü?ŭ{ŝCŭ?ü?û?ù ö5÷?ô?ñ"íîé0êċ/ĉá%âÜ#ŬŜĜÙÚ ÓÔĠÎÏÑÊËÌ ĊĈÇ ÈÀÁÂÄ ĵ½ż ¸ışğŝĵ´ ´µĥ·¸°ħ² ³ ´ ­ Ż ° ħ Ş Ğ Ĵ ­ § ¨ İ Ş ĞĴ Ĥ § ¨ İŞ£ ¤ Ĥ § ¨˘ £ ¤ Ĥ§Ħ ˘ £ ¤ ĤĦ ˘ £ ¤ ĤĦ ˘ £ ¤ Ĥ˘ £ ¤ Ĥ§£ ¤ Ĥ §¨ Ĥ § ¨ İŝާ§ ¨ İ Ş Ğİ Ş Ğ Ĵ ­Ĵ­ Ż °üħŻŻ° °ħ²³´³´µĥ·¸ış ğĵ½żÀÁÂÄĊĈÇÈÉÊ ËÍÎÏÒÓÔ&opq+rŝst*tuv+w6yz!{| }2~?€?‚ƒ:„?…?‡?ˆ?‰€Š?‰?ˆ?‡?…ƒ#„9‚ 1€}~5{ |x6y%vw s2tŝuq$qrn(op#lmi"j kghidefbcd`abŝc^^_`a]^_[\] ^Z[\]YZ[ \YZ[XYZ [ XYZ[XYZ[YZ[YZ[\ Z[\][\]^]^ _ ^_,`a%bcdef!gh#ijk&lm*nop$qŝrs6st@?> =;:9 765ŝ3221.#-ŝ,**()&$%,"! 1???????€?????& 2#?".&%)*)/&.-3 2 1765 <;:@?>EDC BIHGFMLK JQPO N UTSRQŝYXXWVU\[ZYXŝ_^ ^] \[Za ` _ ^ ]ŝ\cc b a ` _^e d c b a`f e d c ba f e d c bg f e d cbŝgf f e d c bf e d c bae d c b a` c b a ` _ a` _ ^]_ ^]\ [ \[ZYX YXWVUVUTSRQPONML KJIHG FEDCBA@ ?=< ; 987˙ÍÎ Ïŝ/ÏÒÓŝ/Ô Ö×ŭĜ/ĜÚÛÜŝ/ÜŬß àŝ/àá äŝ/äçèŝ/è%ëŝ/ëìîïŝ.ïñòŝ.òôġŝ.ġ%÷ŝ-÷%ùŝ-ù%ûŝ,û%üŝ,ü%ŭŝ+ŭŝ"ŭŝ+:ŭŝ+:ŭŝ*ŭ%üŝ)ü%ûŝ)û%ùŝ(ù%÷ŝ'÷%ôŝ'ôġ%ñŝ&ò%îŝ%î ï êëŝ$ëĉ"çŝ$ çèâ ŝ#ä Ŝßŝ#ßàÚÛŝ" Û ÜĠÖ×ŝ!×ĜÑÒŝ ÓÌÍ Îŝ ÎÏ ÈÉÊŝÊ ËÄĊĈŝ Ĉ ÇÀÁÂŝ  ĵ½ŝż ¸ı şŝ ğĵ´µĥ·ŝ· ¸ıħ ²³´ŝ´ µĥŝŻ Ż °ħŝ ²³Ĵ ­ ŻŝŻ °ħŞ Ğ Ĵ­ŝ­ ݍ İ Ş Ğŝ Ĵ ­§ ¨ İŞŝ Ğ ĴŝĤ§ § ¨ İŝŞ ĞŝĴĤĤ § ¨İŝ Ş ĞĤ § ¨ İŝŞ Ğ§ ¨ İŞŝŝŞĞ ĞĴ¨ İ ŞĞŝŝĞĴ Ĵ­ Ş Ğ Ĵŝ­ Ĵ ­ ŝ Ż ° Ż °ŭħħ ² ħ ² ³ŝ ´µ ´µĥŝŝĥ· ·¸·¸ ıŝ şğĵ½ŝ½żÀŭÁ ÁÂÄŝĊĈÇÈŝÉÊ ËÌÍŝÍÎÏÑŝ ÑÒÔĠŝ Ġ Ö pqŝO q r%sŝOtu vŝOv wxŝOx%zŝO z {%|ŝO}#~ŝO%€ŝO%‚ŝO‚ƒ%„ŝO„…†ŝO†%‡ŝN‡%ˆŝNˆ%‰ŝN‰%ŠŝN:ŠŝN:ŠŝN:ŠŝM:ŠŝM:ŠŝMŠ%‰ŝM‰%ˆŝLˆ%‡ŝL‡%…ŝL…†%„ŝL„%‚ŝK‚%€ŝK€%~ŝK~ŝ|$|ŝJ| yzŝJz wxŝJx%uŝIu vrsŝIs#pqŝIq mnŝHnoklŝH lmijŝHjkŝfgghŝGhidefŝGfgc dŝG d eabŝGŝbcc_`aŝF ab ^_ŭ`F`a]^ŝE_` \]^ŝE^_[\ ]ŝE] ^ [\]ŝE]^[\ŝD]^ [\ŭ]D]^[\]ŝD] ^\]ŝD^_]^ŝCŝ^__^_ŝCŝ_`` _`ŝCaŝ`aa bŝC b c bcŝB$deŝBe$fgŝBghiŝBijkŝBkl%mŝAno pŝAp qrŝArs%tŝAtu =<;ŝF ;:987ŝF 76543ŝF32ŝ100/ŝE/",+ŝE+)#(ŝEŝ('' %$ŝE$ŝ#!$!ŝE  ŝEŝE%ŝE ŝEŝE%ŝE%ŝE%ŝD%ŝD  %ŝD8ŝD%ŝD%ŝD%ŝD%ŝD%ŝD%ŝC%ŝC"!!ŝC!%%ŝC$) (ŝC(-,ŝC,+10ŝB 0/5 4ŝB 4 3:98ŝB 87>=<ŝB <; BA@ŝB @ ? FEDŝBD CJI HŝBHGNMLŝB KJ QPOŝBONMTSRŝBRQŝPW WVUŝAUTSZY XŝA W V \ [ ZŝA YX ^ ] \ŝA [ Z` _ ^]ŝA] \[a ` _^ŝA^ ]\b a `_ŝA ^]b a `_ŝA_ ^]b a `_ŝA ^]a ` _^ŝA^ ]\` _ ^]ŝ@] \ŝ[__ ^ ]\ŝ@ŝ\[ [Z] \[Zŝ@Z YX[ZYXŝ@XWVXW Vŝ@ UT UT Sŝ@ŝSR RQRQ Pŝ@ONONMŝ@ LKJ Iŝ@IH GFEŝ@ EDCBŝ@A@?>ŝ@= ;:ŝ@9 76ŝ@ŝ655*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙ ÑÔĠÙŬáċ èéìïòġ÷ùûüGŭüûù÷ġòï ëìèäàÜĜÓÔÏ Ë ÌÇ È ÄŝżÀÀĵ½ ış ĥ·³ ´ħ²Ż °­ ŻĴ ­ Ĵ­Ğ Ĵ­ Ĵ­Ĵ­ ݰ ħ² ³´µ ĥ ¸ığ ĵżÂ ĈÇÊŝËÎÎÒÖrt vwŝxyy{}ƒ„†‡ˆ‰kЉˆ‡†„‚€| }z{xvŝstt qromkigefc dbca`_^ _^ŝ_^-^_` abcde fghijlŝmn nop qsu :962.+ *'#  Gŝ! $( '+/37ŝ6; ;: ?>C BŝGFF JI MLPO SRV UŝTXX WZ YX[ Z\[] \ŝ[]] \]\[ Z Y XW VUT S QP NM KJHG DC@ŝ=<<9 8 54€Ê"Ëŝ ËÌ$Ñŝ Ò$×ŝ Ĝ$Ŭŝ Ŭ"âŝ çèŝ è$ìŝ ì$ŝ $ôŝ ô$÷ŝ ÷$ùŝ ù$ûŝ ûŭüŝ ü$ŭŝ :ŭŝ ŭ$üŝ ü$ûŝ  ûú$ùŝ ùĝ$öŝ ö$óŝ ó$ïŝ ï$êŝ ëċ"ĉŝĉ àáŝá$ÛŝÛ$ĠŝĠÖÎÏŝÏÈ ÉŝÉ$Âŝğĵŝ ĵ ½ŝ´µµĥŝĥ· Żŝ°¨İŝŞ˘£ŝ¤œžŝ ž Ÿ—˜ŭ™ ™š ’“”ŝ ” •Žŝ‘‰Š‹ŝ Œ†‡ ˆŝˆ‰Šƒ„ …ŝ †‡‚ ƒŝ„…ŝ€€‚ŝ‚ ƒ€ŝ‚~€ŭ  ‚ €ŝ‚ƒ € ‚ŝ‚ƒ„‚ƒ„ŝ„…„… †ŝŝ†‡‡ˆ‡ˆ ‰ŝ‰Š‹Œŝ  Ž‘ŝ ‘ ’“” •ŝ•–˜™ šŝš›žŸŝ Ħ¤ŝĤŞ ĞŝĞ Ĵ°ħŝħ²ĥ·ŝ¸½ŝ Äŝ ÄĊ$Êŝ  Ê Ë$ŝ Ñ$Öŝ Ö×$oŝo$rŝrsuvŝv$yŝy$|ŝ|$~ŝ ~ $ŝ$ƒŝƒ$…ŝ…$‡ŝ‡$ˆŝˆ$‰ŝ‰$Šŝ:Šŝ:Šŝ:ŠŝŠ$‰ŝ‰$ˆŝˆ$†ŝ†$„ŝ„$‚ŝ‚$€ŝ€$}ŝ} ~ z{ŝ{wxŝx$tŝtu$qŝqmnŝn$jŝ jkfgŝg$cŝc d_`ŝ`$\ŝ]X"YŝYZUVŝVWR!SŝTPQŝQMNŝO KLŝLMIJŝKH Iŝ IJGHŝHIF Gŝ GHEFŝG EFŝŝFGGEFŭGGFGŝGHGHŝH I HIŝ+JKŝ K L MŝMNOŝ O P#QŭRRSTŝTU VWŝ W XY ZŝZ [$]ŝ^`aŝa$dŝdeghŝh$kŝk$nŝoŝqr"rŝr$uŝu@?ŝ? > :9ŝ9ŝ8443ŝ3$.ŝ.$)ŝ)$$ŝ$$ ŝ $ŝ$ŝ$ŝ$ŝ ŝ$ŝŝ$ŝ:ŝ$ŝ$ŝ%$ŝ$ŝ$ŝ$!ŝ!$&ŝ&$+ŝ+$0ŝ0$6ŝ5< ;ŝ;BAŝAH GŝGNMŝMŝLTTSŝSRZYŝYX` _ŝ_ ^ feŝdckjŝjipoŝŝonn utsŝ sryxŝwv }|{ŝ{ z€~ŝ ~ }ƒ‚ ŝ€ŝ……„ƒŝƒ‚ŝ††…ŭ„ „ ƒ‡†…ŝ… „ŝˆ‡‡†ŭ… … „ ‡†…ŝ…„ †…„ŝ„ƒ„ƒ‚ŝ ‚  ‚€ŝ€~}ŝ }|{zŝzy xwvŝ v uts rŝrq onmŝ mljihŝhgd cŝcb_^]ŝ]\YXŝWSRŝRQM LŝLK$FŝF E$@ŝ@?;:ŝ:$5ŝ4$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝĤ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ¤˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ˘˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ£˙˙$ŝ¤˙˙$ŝ˙˙Ì(ÍŝÎÒÒ'Ó#ĜÙ?Ŝ??è1ì í??ô?÷?ù?û?ü*ŭüŭhü?ú?ĝ?ö?ó?ï?ë?ĉ?á Û3Ü7Ö×-ÑÉ*ÊË $Ä Ċ½ ż·¸ı°ħ²³ŞĞĴ ­Ĥ§Ÿ Ħ ˘ š›œ •–—˜ŝ™‘ ‘’“”Ž‘ Š‹Œ‡ˆ‰Š‹ …†‡ˆ‰ƒ„…† ‡ŝ‚ƒƒ„…†ŝ‡‚‚ƒ„… † ƒ„…†‡ „…†‡ˆŝ…††‡ˆ ‰ ˆ‰Š‹ŝŒ‹ ‹ŒŽ‘ ’“”•ŝ–——˜™š›œžĦ˘£Ĥ§¨İ Ĵ­²³´ ¸!ış%żÀ)ĊĈ*ËÌ3Ñ Ò?×o8p?s>vŝwy>y?|???ƒ?…?‡?ˆ?‰ĈŠy‰?ˆ?†?„?‚?€?~?{?x?u q4r$no;klg+h'de`/a b]+^_Z([W%XY T#U V!RS O PQ MNOKLMJK LIJKHIJGHIJGHIGHIJ HIJIJKJK.LM%NOP!QR#STU%VWX Y[\^%_ a1b6ef#hi k4l?o =18 73#2 .4- )3(>$ŝ# ' ???"??tJ6?????!&#%ŝ+*=* 01/'54;0:A,@ ?ŝGF%FE!LKRQPXWV ^]\ŝ[ccbaihgfŝnmmlkŝjr rqp o vut szyxwv}|{zy~} |€ ~ƒ‚€„ƒ‚ €„ƒ‚€ƒ‚ €‚€ €~}~}|{|{zyŝxyyxwv utsrqponlkjigfe ba`ŝ_\\[ZWVUQ"P OK'JŝIEED2? >:09?4˙%ÎÏÓ-Ô ĠÙ"ÚŜ7ß=ä"èé?í-ñ?ô?÷?ù6ûúÄü;û?ú?ĝ?ö?ó?ï?ëĉ+çá9âÜ'Ŭ2× ĜÑ ÒË'ÌĊ"ĈÇżÀ Áışğ³´µ ­Ż°ŝ§¨¨İŞ˘£¤žŸ ŝĦ™™š› œ”•–— ˜ ‘’“”ŝ•ŽŽ‘ ‹ŒŽ ‰Š‹Œ‡ˆ‰Š‹Œ‡ˆ‰ Š‹†‡ˆ‰Šŝ‹‡ ‡ˆ‰Š‹ ˆ‰Š‹Œ‰Š‹ŒŒŽüŽŽ‘’“”•–—˜ ™š›œ žŸ Ħ˘ŝ£¤¤ĤİŞĞŝĴݰ ħ ´µĥ şğĵÀ#Á ÂĈ*ÇÌ Í3Ò Ó×+Ĝp.qs9t?wy8z-|}???ƒ?…?‡?ˆ?‰Š6‰€Šb‰)ˆ2‡?†?„‚:ƒ?€?~?{"xyu!v%rs1o p=lmh0ie"f$bc(_`'\] YZV"WXS TU QRS OPQMNOPLMNKLM JKLJK LŝIJJKLJK LJKL KLMLM1NO(PQR ST!U V!WXY'Z[ \)] ^ _.`ab2cd1f g'ijl$m o3p?s?v=)< ;#762'1-),-('?#??2 ????¤?????!?%)*)/!.&43:298?!>E$D CK!JIPON VUT[ZYa`_ ^fedcjihgonmlŝkssrqpo vuts yxwvŝu||{zy x~}|{ z~}|{€~} |€~}|€~} |~}| { }|{zy {zyxwxwvutsrqponmlkŝjiihgfdcb_^]ZYXUTSO!NM%IHD+CB(>=9*84<3˙ Ï$ Ñ!ĠÖÚ+Û ß2àä#ċ?é?í?ñ?ô6÷ö?ù?úü:û}üAû?ú?ĝö.ġ?ó?ï?ë?ç%âŬŜ+ĜÙÒ-ÓÔ'ÍÎÇ!ÈÉÁ ğĵ½µĥ· ¸°ħ²³ŞĞĴ­Ĥ§¨İĦ˘£ ¤œžŸ ˜™š›œ•–—˜ŝ™’ ’“”•–‘’ “Ž ‘ Œ Ž ‹Œ Ž  ‹Œ Ž‹Œ Ž Œ Ž Ž‘’ ‘’“”’“”• –•–—˜™š›œ žŸ Ħ˘£¤Ĥ§¨İĴ­ħ²³ĥ·¸ı ĵ½Â"Ä(ÈÉÍ.Î1Ó Ô%ĜÙq'rt&u#wx?z?}?3 ‚?ƒ?…?‡?ˆ€‰Š#‰Šw‰?ˆ?‡?†?„?ƒ€ ?~{:|?y?v;st:pq)= <C#BAIHGNMLTSR QYXWV^]\ [cba`gfe dkji h onmlŝsrrqp outsrxwvu tzyxw v{zyx w|{zy x|{zy x|{zyx{zyx w yxwvu wvutsutsrqrqponml kjihgfedcba`_]\[ZXWVUSRQPMLK H$GF'BA= <8(73%2˙Ñ#ÒÓ Ö*×ĜÛ3ÜŬà/á1ċ ĉé!ê5í î?ñ?ô?öù(ĝ?ú?ûü ûú8ù:ĝ÷?ġ?ó?ïë9ìç&è?%Ŝß#ÙÚ*ÔĠÎ&Ï É ÊÄĊ½ż À ¸ışğ³´µĥݰħİŞĞ Ĵ¤Ĥ§¨  Ħ˘£¤œžŸ  ™š›œ –—˜™š“ ”•– —˜‘’ “ ”•– ‘’ “ ”  ‘ ’ “”  ‘’ “ü” ‘ ’ “”‘ ’“ ”• ’“” •– ”•–—˜–—˜™ š™š›œžŸ Ħ˘£ ¤ Ĥ§¨ŞĞĴ­Ż°ħ´µĥışğ żÀÄ ĊÉ'ÊËÎ/Ï .ÔĠ5Ù Úr"s)uv?xz<{?}#€?‚ƒ(„?…?‡?ˆ‰ ˆ‰?ˆ?‡?†?„?ƒ?+~?|$yzv8w?t?q9no4k lŝgh.hi+ef#bc_$`ŝa\ \"]^Z[\WXYUVWSTUVRSTQR SŝOPPQ ROPQNOPQNOPQNOPQOPQPQRQRS RS-TU&VWXYZ"[\ ]^_'`ab+cŝdee$f!hi(kl1n o?q?t v3w:&985-43 05/#+* '4&#<"7??????5 !]?????? ?$ )2(3- ,2!17%6<#; A@GFE LKJQPOVUTS [ZY X`_^]\dcbahgfedŝlkkji honml kqpontsrq pvutsrqwvut sxwvu tsxwvu twvutswvutsŝru utsrq srqpoqponm nmlkjkjihgfe d cba `_^]\ZYXWUTSPO NKJIF#EDA)@?<-;7'6-21˙ÓÔ#ĜÙ/ŬŜá/â?ĉ?ê?î?ñ?ô?ö?ĝ?ú/ûú€û?ú?ù?÷?ġ?ó>ïŝì>ì?èŝä=ä)ßàÚ%ÛĠ'Ö#ÑŝÊËËÌ ĊĈÇÀÁÂğĵ½ĥ·¸ıħ²³´Ĵ­Ż¨İŞĞ¤Ĥ§ Ħ˘£¤ žŸ Ħš›œ  ž ˜ ™ š›œ – — ˜ ™ š • – — ˜™ ” • – — ˜ ” • – —˜” • – — ˜ • – — ˜ ™– — ˜ ™šŝ›˜˜™ š› œŝš››œžŸžŸ Ħ˘£¤Ĥ§ ¨İŞĞĴ­Ż°ħ²³´ĥ·¸ığĵ½ÀÁÂ!ĈÇ ËÌ!Ñ)ĠÖ?Ús t7vwx:y9{| }3~?€?‚?„?… ‡2†0ˆ‡?ˆ‰?ˆ?‡?†?„?ƒ??+|}?z)wxt0uŝqr=r5o p)lmijf(g c&d e"ab^!_ `\]^YZ[ü\WWXXYZVW X TUVSTURSTQRSTQRSQRSQRSQRST RST STUTUVWVW)XY!Z[\ ]^$_`a&bŝcd(de f.ghi'j%lm8opŝqr=rt!u?w8%7 63"2ŝ/.4.-'*)#&%?"??????á)4????? 4$ #+(':,+1'06.54;':9@!?>EDCJIHGONM LSRQ XWV U\[ZY`_^]dcbahgfedkjih gmlkjiponmlŝkq qponms rqp on sr qpoŝts sr qpo sr qpo rq ponqpon m onmlkmlkji jihgfedcba `_^]\[ZYWVUSRQPNMLIH GD"C&?>;1:96(5?1˙Ô"ĠÖ Ù(ÚÛ"Ŝßâ/ĉ:çê,ë?î?ñ?ô?ö?ĝŝúù=ù?ú+ûúûfú?ù?÷?ġ7óò??ìè(éä&ċ+àáÛ0ÜÖ+×ĜŝÑÒ#ÒÓÌÍÎÇÈÉÊÂÄ Ċ½żÀışğĵ ´µĥ ·°ħ² ³ĞĴ­ Ż¨İŞĞ¤Ĥ§ ¨Ħ˘£¤ ž Ÿ  Ħ˘£œ  ž Ÿ  Ħš › œ  žŸ™ š › œ žŝ˜™ ™ š › œ˜ ™ š › œ ™ š › œ™ š › œ ž › œ  žŸœ  žŸ  Ħ Ÿ  Ħ˘£Ħ˘£¤Ĥ§¨İŞĞĴ­Ż °ħ² ³´µĥ· ışğĵżÀÄĊÇ ÈÉÌ%ÍÎÑ-ÒÓ"Ö×Ú=Ûtu?w!yz?|?~?€?‚?„?…?†?‡?ˆĉ{ˆ?‡?†?„?ƒ???}z{?xuvr9s0pqm!nj-klŝgh(hie&fb#cd` a b^_`\]^Z[ \XYZWX YUVWXTUV WTUVSTUVSTUVSTU VTUVUV WŝUVVW XWXYXY,Z[%\]^ _`#ab%cde*fŝgh(hi j2k"mn?pr(s?uw%x6#5 2+1 0,-,*)(:%$?!????<?€??.??9? ?#?'?+0./&439&87>!=<ŝCBBA@GFE LKJIŝQPPONUTS R YXW V ]\[Za`_^ ]dcba`gfed c ihgfe kjihgm lk j i n ml k jon m lkon m l kon ml kŝjnn mlk jmlkj i kjihgihgfefedcŝdccba`_^]\[ZYXWVŝUTTSRPONLKJIGF EŝCB!BA>'=<'985+4?0˙ Ö"×ĜÛÜß+à 1äç)è?ë+îï?ñ?ô?ö?ĝ?ùÔú0ù:ĝ?÷?ġ?ò?ì,í?é/ċĉ-áâÜ3ŬŜĜ$Ù Ó#ÔĠÎÏÊË ÌĊĈÇÀÁ ĵ½ż·¸ışŝğ³³´µĥ·Ż°ħ²³Ĵ­Ż¨İŞĞ Ĵ Ĥ§¨ İŞ £ ¤ Ĥ § Ħ ˘ £ ¤ Ÿ   Ħ ˘ £¤ž Ÿ   Ħ ˘ŝ£ ž Ÿ   Ħ˘ ž Ÿ   Ħ˘ ž Ÿ   Ħ˘ž Ÿ   Ħ ˘£Ÿ   Ħ ˘ £¤Ħ˘ £ ¤ £¤ Ĥ §Ĥ§¨İŞŝ¨İİŞĞĴ­Żŝ°ŻŻ°ħ² ³´µĥ·¸ışĵ½ÀÁÂĊĈ ÇÉÊËÎ%Ï+ÓÔ×#Ĝ Û1Ü uvw;x EDCŝBIIHGNMLKRQPOVUTSRYXW V]\[ZY`_^]\cba` _ edcba g fed ci hg fedj i h gfe j i h gfk j i h gf ji h gfji h gfeŝih h gfedgfed cedcb aŝcbba`_`_^]\]\[ZYXW VUTSRQPONML KIH GEDCA"@? <;8'74.30//˙ĜÙŝÙ ÚÜŬŝŬ Ŝàáŝ áâ äċŝċ%èŝéë!ìŝì%ïŝïñ òŝò%ôŝô%öŝöĝ ÷ŝ÷%ùŝùŝĝúúùŝù%úŝ:úŝú7ùŝù%ĝŝĝ%÷ŝ÷ö%ġŝġ%òŝò%ŝ%íŝíéêŝê%ĉŝĉ%âŝâ%ŜŝŝŜßßÙÚŝÚÛĠÖŝ Ö×ŝÑÑÒŝÒÌÍŝÎŝÇÈÈ ÉŝÉ Ê ÄĊŝ ĊĈżÀÁŝ ÁÂğĵŭ½ ½·¸ıŝı ş ³´ µŝĥ·°ħ²ŝ²³Ĵ­Żŝݰħ ŞĞ Ĵŝ ­§ ¨ İŞŝŞ ĞĴ Ĥ §¨ŝ¨ İŞ ¤ Ĥŝ§ ¨ £ ¤ ŝ Ĥ §˘ £ ¤ŝ Ĥ§ ˘ £ ¤ŭ Ĥ˘ £ ¤ŝ Ĥ§ £ ¤ ŝĤ § ¤ Ĥŝ§ ¨ Ĥ §¨ŝ¨ İŞ§¨İŞŝŞĞĴ ŞĞ Ĵŝ ­ŝĴ­ ­Żŝݰħ²ŝ²³´ µŝµĥ·¸ŭı ışğĵŝ½ŝżżÀŝÀÁÄŝÄĊ ÇÈŝÉËÌŝÍÑŝÑÔ ĠŝĠĜÙŝÙÜ ŬŝŬvwŝAwxyŝAy%{ŝA{%}ŝA}%ŝ@%ŝ@%‚ŝ@‚%„ŝ@„%…ŝ@…%†ŝ@†%‡ŝ@‡%ˆŝ@:ˆŝ@:ˆŝ@:ˆŝ@:ˆŝ@ˆ!‡ŝ@:‡ŝ@‡%†ŝA†%„ŝA„%ƒŝAƒ%ŝA€ŝA€ }~ŝA~{ |ŝA|%yŝAz%wŝAwx tuŝAu$rŭsBso pŝB pqm nŝBn%kŝBl hiŝBijfgŝB ghd eŝC efbcŝC c d`aŝCab^_`ŝC`]^ŝC^_[\]ŝC ]^Z[\ŝD \]ŝYZZ [ŝD[ \YZŝD[Y ZŝDZ[XY ZŝDZ [Y ZŝDZ[YZŝE[Z [ŝE[ \Z[\ŝE \][\ ]ŝE ]^]^ŝE^_^_ŭ`F&`aŝFa&b cŝF c d eŝFef gŝGghiŝGi jkŝGk l%mŝGno pŝGpqrŝHr%tŝHtu%vŝHvw"xyŝHy 32ŝ@21 /.ŝ@ .-+*ŝ?*%'ŝ?'&$#ŝ?#% ŝ? %ŝ?%ŝ?%ŝ?%ŝ?%ŝ?%ŝ?%ŝ?:ŝ?:ŝ?ŝ?$ŝ?%ŝ?%ŝ?%ŝ?%ŝ?%ŝ@%"ŝ@"#&%ŝ@%*)ŝ@)%-ŝ@ - ,2#1ŝ@1065ŝ@54:9ŝ@98>=ŝ@= <B Aŝ@A @GF Eŝ@E DKJ Iŝ@IHONMŝ@LŝKRRQPŝ@ P OVU Tŝ@SR YX Wŝ@ŝWVVU\[ Zŝ@ YX_^]\ŝ@\[a`_^ŝ@^ ]cba`ŝ@`_ŝ^d d c bŝA a ` e d cŝA b afe dcŝAc bŝaff e dŭcAc bf e dcŝAc bŝae e d cŝA b a dc bŝA a `cba`ŝA`_ŝ^aa`_^ŝA^ ]ŝ_^^]\ŝA\[\[ ZŝAYX YX WŝAWVŝUVVU TŝAŝTSSRQŝAP ON MŝAML KJIŝBIH GFŝBE CBA ?>ŝB>=;:ŝB:976ŝB 65 32ŝB2/.ŝB.*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙ÚŜâċĉéìïòôö÷ĝùú3ùĝöġòíêĉ çßÛ×ÓÎ Ï ÊË ĈÇ Â żş ğ ·¸´µ ħ² Ż Ĵ­Ş Ğŝ¨İ İŞ§ ¨İ §¨ §¨ §¨§ ¨İŝ¨İ İ ŞĞ Ĵ­ Żħ²³´·ŝ¸ş şğÁÂĊ ĈÉ ÊÍ ÎÑ ÒĠ Ö ÙÚŬwy{}‚ƒ„…†‡Yˆ#‡†„ƒ€~|zxuvsqn olmjhfd bca _`^ŝ_]]ŝ^\ \]ŝ[\\ [\ [\ [\ŝ[\\]^ _`abcdfhjlnp rsuwy1-*)&#  #"% )(,048ŝ7< <; @? DCH GKON RQ UTXWZY]\ŝ[^ ^]` _a ` a`b a` a`a` _ ^]\ŝ[ZZŝYX XWUŝTRRONL KHŝEDDA @=<952 1.€$Üŝ Ü$áŝ á$ĉŝ ĉ$ëŝ ë$ïŝ ï$òŝ ò$ġŝ ġĝ÷ŝ ÷$ùŝ ù$úŝ ú$ûŝ ú ûúŝ *úùŝ ù$ĝŝ ĝ$öŝ öġ$óŝ ó ïŝ ï$ìŝ ìë$çŝ ç$âŝ â$Ŭŝ Ŭ$×ŝ  × Ĝ$Ñŝ Ò$Ëŝ ËÌÄĊŝ ĊŝĈżŝż·¸ŝ¸ıħ ²ŝ²³ŝŞĞĞĴŝĴ¤ŭĤĤžŸ ŝ Ħ™šŝ𛓔 •ŝ• –ŝ‘Š‹ŒŝŒ †‡ ˆŝˆ‰ ƒ„…ŝ… †€ ‚ŝŝ‚ƒƒ„~ €ŝ€‚}~ŝ € |}~ŝ~ |}~ŝ~|}~ŝ€~ŭ€ € €ŝ‚ƒ ‚ƒ„ŝ„…†‡ŝ‡ˆ‰Šŝ‹Œ Žŝ’“ŝ“”—˜ŝ˜™œžŝžŸ ˘£ŝŝ£¤¤ ¨İŝİŞ"Żŝ°µĥŝĥ ğĵŝĵ$Âŝ Â$ÈŝÉ"ÎÏŝjÏÏ%Ôŝ2ÔÔ%ÚŝŝÚÚ%ßŝ ŝßß&äŝ&ää$xŝx${ŝ{$~ŝ~$€ŝ€$‚ŝ‚$„ŝ„$†ŝ†$‡ŝ‡$ˆŝˆ$‰ŝ‰ˆ$‰ŝ:‰ŝ‰(ˆŝˆ$‡ŝ‡$†ŝ†$…ŝ…„$ƒŝƒ$ŝ$~ŝ~$|ŝ|$yŝyuvŝv$rŝ r s$oŝok lŝl$hŝhd eŝe$aŝab]^ŝ^$Zŝ[$WŝWXS!TŝTU$QŝRN OŝO$LŝMI JŝKHIŝI FGŝGHEFŝF G DEŝEFD EŝEFD EŝEFDEŝE FEFŝFGFGŝGHGHŝH'I JŝJKLŝLMNŝNO$PŝQR SŝS TU Vŝ VW$Yŝ Y Z$\ŝ] _`ŝ`$cŝcdfgŝg$jŝj$mŝn%qŝtqq%tŝYtt%wŝŝ,ww%zŝŝzz&}ŝL||$/ŝ/$*ŝ*!&%ŝ%$!ŝ!$ŝ $ŝ$ŝ $ŝ  ŝ$ŝ:ŝ:ŝ   ŝ$ŝ$ŝŝ"ŝ$ ŝ $%ŝ%$)ŝ)$.ŝ.4 3ŝ3$9ŝ9$?ŝ?>$Eŝ E D$KŝK JRQŝ Q P XWŝW V ^]ŝ]\dcŝbi hŝ h gonmŝmltsrŝ r qxwŝv|{ŝŝ{zz €~ŝ ~}ƒ‚ŭ €†… „ŝ„ƒˆ‡ †ŝ†… ‰ˆ‡ŝ‡ †Š‰ ˆŝˆ‡Š‰ˆŝˆ‡‰ˆŝ‡†ˆ‡†ŝ †…†…ŝ„ƒ „ƒ‚ŝ ‚€ŝ ~}|ŝ| {zyxŝ x wutŝtsp oŝ o nk jŝ j ifeŝd`_ŝ _^Z YŝYTSŝSNMŝMHGŝG$BŝA%<ŝ`<<%6ŝX66%1ŝŝ+11%,ŝŝ,,&'ŝJ(($ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝ˙˙$ŝĤ˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ§˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝ¨˙˙$ŝâ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝŞ˙˙$ŝ¨˙˙%˙ŝĈ˙˙%˙%˙%ŝŜ˙˙&˙4Ü Ŭ(áâ?ĉ?ëï7î?ò+ġô?÷ù$ĝú"ù>úŝùú'úJùĝ<÷?ġó.ò?ï?ë?ç?â?Ŭ?Ĝ?Ò4Ì Í4Ĉ Ç ż-ÀÁı&şğ³!´ŝĴ­­ŻŝĤ§§¨İĦ˘£›œ ž–—˜ ™ŝ‘’’“”Žŝ‰ŠŠ‹Œ†‡ˆ‰Š„…† ‡‚ƒ„ …€‚ƒ„ŝ€€‚ ƒ€‚ƒ €‚ƒŝ„‚ƒ„… ƒ„…†…†‡ˆ‰ˆ‰Š‹ŒŽ ‘’“”•–—™š› œŸ  Ħ¤ĤŞ ĞĴ°$ħ ² ĥ*·¸ĵ4½8Ä?É?ÏÔ8Ġ?Ú?ß?ä?x?{?~?€?‚?„,†…?‡<ˆ‡?ˆ‰­ˆ?‡?†?„8ƒ‚&€?~?|?y?v?so#p;lmh/ŝ.*>*?%?!?$?7?<€?03 ?? /!?%?)?.?39)8?>-DC#JIP!OV#UT\[Zba`ŝ_ggfelkj qponutsŝzyyxw }|{ z €~ }ŝƒ‚‚€„ƒ‚†…„ƒ‚†…„ƒ‡†…„ƒ †…„ƒ …„ƒ‚ƒ‚ € €~}|{zy x wvutsrqpnmlihgdcb^!]\Y&XW S,RQM*L$GF?A<0;?6?1?,?(˙?Ŭ?â?ĉë+ê?îò/ñ?ô÷;ö;ĝ÷6ùĝ€ù?ĝ%÷ö!ġô?ò?ï?ë?ç%âŬ/Ŝ0ĜÙŝÒÓ=Ó5Í Î)ÇÈ%ÁÂ#ğĵ µĥݰħİŞĞ£¤Ĥ žŸ Ħ ™š› œ•–—˜ŝ‘‘’“” Ž Š‹Œ‡ˆ‰Š‹…†‡ˆ‰ „…†‡ˆƒ„…†‡ƒ„…†‡„…† ‡ …†‡ˆ†‡ˆ‰ ЉЋŒŽ‘ ’ “”•–—˜™ š œžŸ Ħ˘£Ĥ§¨İĴ­²"³´!¸ı)ż7ÄĊŝÉÊ=Ê"Ï?Ġ?Ú?ßä9x9y?{?~?€?‚?„?…‡)†?‡ӈb‡,†…?„?‚?€?~?|?y?v?s?p?mi)j'fg4c d_5`a \0]^ Y,Z[V(WX TU Q#RSO"P QM!N OK LMJK LIJ K HIJHI JHIJHIJIJKŝIJJ7K LML!M#N"OP$QR"ST U)VWX'Y[!\^!_a'b d4e?h?k?n?q?t?w?z?|?.3* )?%?!??>ŝ:;?!P&??5 ??!?%?)+.-3 2087><=%CBI,HO&NMT SZYX_^]edcbjih gnmlükssrrqpvutszyxw}|{zy ~}| €~ŝ}‚ ‚€ ƒ‚€ ƒ‚€ƒ‚€‚€~€~}~}|{z {zyxwvutsrq ponmlkj igfeŝdbba`\ [W%VU%QP L3K'FEA;@?;?6?1?,?(˙*ŬŜ?â6ĉç?ê?î?ñ+ôó-öġ?÷?ĝùxĝ1÷?ö?ôò*ñï0î?ë?ç??Ŝ?ÙÓ*Ô4Î ÏÈ!ÉÂ)Äĵ#½ĥ·¸ħ² ³ĞĴ­Ĥ§¨İĦ˘£¤œž Ÿ˜™š › ”•– —‘’“”Ž ‘ ‹ŒŽ‰Š‹Œ ˆ‰Š‹Œ‡ˆ‰Š‹ ‡ˆ‰Š‹‡ˆ‰Š ‹ŝˆ‰‰Š‹ ŒŠ‹ŒŽŒŽ‘’ŝ“’’“”• –—˜ ™š›œ Ÿ Ħ¤ĤİŞ Ğ Ż°´µ ı'ş ğż$À4Ċ ĈÊ+Ë??Ġ?Ú?ß??y({|?~?€?‚?„?…?†?‡ˆ*‡0ˆ‡ˆc‡?†?…?„?‚?€?~?|?y(vws,tp+qm#n$jk+gh/de0ab,^_$[\X&YU%VWS#TUQ!RSOP QMNOLMNKLMJKLJK LJK LJKLKLMLMNMNO N O&P"QR$ST%UV WXY,Z [\.]_(`b&ce)fh.i k5ln;oq7r?:?5?1?-?)˙Ŝ$ß??ç?êî&í?$óòġ,ô0öġ÷ö5÷ ö"÷Rö'ġ!ô0óòñ-4î íë0ê?ç? Ŝ1ß?Ú4Ġ Ö-ÑŝÊË.ËÌ Ċ'Ĉ ÇÀ!ÁÂğĵ½µĥ·¸°ħ²³ĞĴ­§¨İŞŝ˘££¤ĤŝžŸŸ Ħ˘ ›œž ˜™š›•–—˜™ “”•–—‘’“”• ‘’“”‘’ “‘’ “‘’“‘’“ ” ’“”•– ”•–—˜–—˜™š™š›œžŸ  Ħ˘£¤Ĥ§İŞĞ­Ż °²³´ŝµ·· ¸ıĵ%½(Â)ÇÈ0ÌÍ?Ñ?Ö?Ú?Ŝ?ây'z?|?~?€?‚?ƒ…-„†+…?†-‡†p‡l†B…„?ƒ?‚?€?~?| y5z?w$tuq:r?o:lm,ij fgc)d`,a b"^_ [%\ ]Y#Z[W!XUVWSTUQRSTPQROPQOP QNOP NOPNOPQOPQPQ RQR S RS.TU&VW XYZ$[ \*]^"_`a4bcd*e&gh=jk?mo*p?r?u?w?y+|{0-,:)(?%?")?ŝ=?8? ƒ0?,?2 9!"?%6)(2- ,?16$5 ;5:@2?>E*DCJ$IHONMTSRQXWV ]\[Za`_ŝ^eedcb ihg fmlkjiponml rqpoŝnt tsrqvutsr wvutsxwvu txwvu twvutŝwvvut s utsrq srqpqponŝmn nmlkji hgfedcba_^][ZYVUTR"QPM'LKH'G$CB?> :29?5?1?-?)˙?ß??ç?ê?í??ò4ô ó?ġ0öġpöNġ4ô ó?ò??í?ê?ç??ßÚ,Û?Ö(ÑÒÌÍÇ"ȠĽż¸ış³´µŝĥݰ ħ ŞĞĴ ­Ĥ§¨ İ ˘£¤Ÿ Ħ ˘œž Ÿ ™š›œ —˜™š›•–—˜ ™”•–— ˜“”•–—ŝ˜““”•– —”•–—˜ŝ”••–—˜ŝ™– –—˜™š ˜™š›œš›œž žŸ Ħ˘£¤Ĥ§¨İŞĴ­°ħ²µĥ·ı şğ %ż À)Ä"ÈÉ;ÍÎ Ñ4Ò?Ö?Ú?Ŝ?â?z?|?~?€0‚?ƒ?„?…€†‡ĵ†?…?„?ƒ+‚?€?~?|?z4w x?u0rso0p?m*jkg'hd0ef!bc _'` a]$^ŝ_[[\ YZWXYUVWTUVRSTURSTQRSQRSPQRSQR S QRSRSTSTU TU1VWXW!X Y#Z[&\] ^_`-a,cde.f+hi?k mn?pr$s?u?w?y?{?,?(?%?"?=<-" 5  X0);9??"?%?(?,1/0,54:69)>=C%BH#G FMLKQP O VUTSZYX^]\ba`_fedc ihgflkjihnml kponmrqpon srqpotsrq ptsrq pŝtssrqpsrqp oqponponm lmlk jkjihghgfedcba`_ ^]\[ZYXWVTSR P!ONK JG/FE!BAŝ>===?9>5ŝ41>1?-)&*˙ß8à ä?ç?ê?í-ïò%ñ?óġ8ô?ġöyġôġ9ô?óò+ñ6ï?í?ê?ç??ß>ÛŭÜÖ×=×"ÒÓÍ.ÎÏÈ&ÉÊÄ ĊżÀ Á şğĵŝ½ĥĥ·¸ħ²³ ´ ­Ż °İŞĞĴĤ§¨ İ˘£¤ĤŸ Ħ˘ £žŸ Ħ ›œžŸ™š›œŝž˜˜ ™š›œ ˜™š ›œŝ—˜ ˜™š ›œ ˜™š›œ ™š›œ š›œž œžŸ  žŸ Ħ˘ Ħ˘£ ¤£¤Ĥ§¨İ ŞĞĴ­Ż° ħŝ²³³´ µ·¸ığĵ½À$ÁÂÄ,ĊĈÉ$Ê?Î8ÒÓ3Ö ×?Ú?Ŝâ+á?z?|?~?€??ƒ?„?…†7…ż†ŝ…††u…B„?ƒ??€?~?|?z?x1u v?s$pqmDDCŝ@CIHGŝ@GMLKŝ@KJQPOŝ@ONUTSŝ@S RXWŝ@VŝU\\[Zŝ@ZY _^]ŝ@] \ ba `ŝ@`_ü^eeddcbŝ@ b agfeŝ? dcihgfŝ?f eji hŝ? gfkj iŝ? hglkjiŝ@ihlkjiŝ@i hkjiŝ@ihŝgkkjihŝ@h gjihgŝ@g f hg fŝ@ŝfeed fedŝ@dcdc bŝ@a` a`_ŝ@_^]\ŝ@ \[ZYŝ@ Y XW Vŝ@V U TSŭR@RŝQPPOŝ@ONLKŝ@ K JHGŝ@GFDCŝ@C@ ?ŝ@?<;ŝE;&8ŝ8 8 7%4ŝŝ44%1ŝŝ11$-ŝO-$*ŝŝ***˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙*˙)˙ŝÑ)˙ŝĤ)˙(˙ŝüáäçêíï ñòóôóôóòîìêçàÜĜÔÌÇÈÄ żÀ ğĵ·¸³´ °ħ ­ ŞĞ§ ¨ Ĥ£ ¤ ˘£ Ħ˘  Ħ  Ħ Ħŝ˘ĦĦ˘ £ ¤Ĥ§ ¨İŝŞĞĞ­ħ ´µ¸ğ ĵż À ÄÇÈ ËÌÏÓ×ÚŜá{}~€‚ƒ„Y…„ƒ‚€~|zxvtroŝpmmkh ifgdb `a^ _][\Z [Y ZXYXYBXYZ[\ ]^_`ab cdef gikmoqsuwy{+'$"#ŝ. "%(+/ 32ŝ766:>BFJN RQUY X\ [^ŝ]aa `c bedf eg fgfhgfgfe dcbŝa` `_^ ] [Z XW UTQ NMJFC B?;741-+€é èŝŝ èèíìŝ ŝìì'ŝŭ7 ï#óòŝ‹ŭSòò(ġŝ ü,ġô ô÷öŝŭö öĝ÷ŝü*„÷ ÷!ĝ ÷ŝù (%>mqqŝuĝ ĝ ÷ŭ ÷%öŝġôŭ ó-òúš 6ï1ì ë2è ç??Ŝ?Ù?Ó?Í?ÇÀ*Á3ş ğ³.´$­Ĥ'§¨  #Ħ˘š›œ•– —‘’‹Œ†‡ˆ ‰ƒ„…€‚}~€{|}~ŝyzz{|ŝ}y yz{| yz{|z{|ŝ}{ {|}~}~€ŝ€€‚ƒ„…†‡ˆ ‰‹Œ‘’•–—š#›œ 'Ħ˘ Ĥ.§¨7­*³´ı0ş?À?Ĉ?Ì?Ò%Ĝ×5Ŭ Üâ á3ĉ ċ&êéŝîí0í ì&ŝŝ &ŝŝ4'ƒŝŭXƒƒ…„ŝQŭj„„(†ŝ üM†… …‡ †ŝŭ(† †*‡ŝü9}‡6‡ŝù6Jcsttŝv‡+‡ŭ ‡†ŝ†…ŭ 2„úV .ƒ‚?"~?|?y?v?s?p?m?ie;f;bc ^4_+[\>XŝYT T4U Q2RN1O P LMI+JKG*HI"FG D&E F C&D EB&CDB%C DB%C DŝBC%CD C'D ED(E/FG+HI-JK LMN4OP Q2R T2U?X9[\^&_?b*ef?i?l?p?s?v'yx?{~ }'€‚,&#ŝŝ ##$ ŝŝ3  'ŝŭV ŝŭ_ŝ ŭK)ŝŭ' *ŝü8O +ŝù5G_ZXXŝW%ŭ 'ŝŝ.ŭ 2ú ?: !?$?(?-?2?7?=?C?I?OV8U \/[Z b*a `h%gfm lkrqpwvu |{z €~„ƒ‚ ‡†…„ ‰ˆ‡† ‹Š‰ ˆŒ‹Š‰Œ‹ ŠŒ‹ Š Œ‹Š‰‹Š‰ ˆ ‰ˆ‡†…„ƒ‚  €~ |{zwvurqm$lh*g fb,a\$[V!UPO&JI?D?>$89?3-./)=* %2&2" #5 &˙&ŝş˙˙'ŝŭ˙˙'ŝZ˙˙ŝí˙˙(ŝÖ˙˙)ŝò˙˙*ŝĝ˙˙ŝ˙ ˙+ŝĉ˙ ˙ŝĞŝŸ+ŝÇ˙˙.ŝ˙˙0ŝŜ˙ ˙2ûNÊïġ˙˙ ?è3ì ë?ï)òñ/ôóö-ġ ÷2öuvz~‚ƒ„‡ˆŽ’“–À?ï,î?ë?ç:â?Ŝ?Ù?Ó'ÍÎ!ÇÈ*ÁÂ4ğ ĵ´3µĥ+ݰ¨%İŞ˘!£ ¤œž—˜™’“”Ž ‰Š‹Œ…†‡ˆ‚ƒ„…€‚ƒ ~€ }~€ |}~  |}~ }~€ ~€€‚ƒ‚ƒ„…†‡ˆ ‰Š‹Œ Ž’“ ”—˜™œ! ž˘ £)¨İ.Ż/´µ-şğ-ÀÁ?Ĉ?Ì?Ò?×?Ü)áà0ċäé"è#ìë??ƒ"‚?„?…?†‡)†vwx yz { |}À??‚ŝ€=€?~?|?y?v?s?p?m i4jsŝrvv'u?x7{z?}?,€?$< !=&%4 )WVTRSQŝOPPNONÀ? 1?!$)%?)?-?2?7?=C'BI8HO?93<4?/*,+&/'+#$( !À˙Ÿ™“ Žˆ ‚ }y˙ è)ç?ëï;î-ñ,óò ġ2ôö5ġô–—–ŝ“’’‘ŽŒˆŝ‡ż?î%íë:êç'ĉ?â5Ŝ Ŭ?Ù?Ó?Î?È;Â2ĵ ½-ĥ·(°ħ ŞĞ¤ ĤžŸ ŝĦ™™š›ŝœ””•–—‘’“ŒŽˆ‰Š‹…†‡ˆ ƒ„… † ‚ƒ„ €‚ ƒ€‚€‚€‚ ƒ ‚ƒ „ƒ„…†…†‡ˆ‰Š ‹ŒŽ‘’ ”•–™š ›žŸ  £%¤İ)Ş#ݰ1µ ĥ?ğ?Á Ĉ5Ç?ÌÒ Ñ*×ÖÜ,Û0àß,äè-çë,ê;~;€?‚„'ƒ#…„ †2…:†…&} | {zÀ?1‚ ?€?~)|{?y?v?s?p?m?j?gc$d-`a6]^8Z[2W X&TUQ*R%OPL'MN%KLI$JK!HI!GHF"GH!FG"FGF"GH#G@H4I'J(KL)MN-OPQ!R4T U V4WY/Z \3]?`?c?f?i0lm+po?r?u?x?z}/| 5~?€<$%?!? $0#&N OQPRÀ?&!-">%ŝ&)>)-'.?2?7=!?9?4/.0+ ,'/("$%!$"À˙&y } ‚ˆ˙ ?çë0êî0í-ï'òñô6óò/ôó‡ŝ„ƒƒ‚~ŭ}zyyutpokjgfbÀ?í!ìê*é7ĉċ;âá?Ŭ(ÙĜ?Ó?ÎÈ*É?.½· ¸ħ(²³Ğ#Ĵ­Ĥ§ ¨Ħ˘£œ ž—˜™ŝš““”•‘’‹ŒŽŝˆ‰‰Š‹Œ†‡ˆ‰„…†‡ˆƒ„…†ŝ‡ƒƒ„…†ŝ‚ƒƒ„…†ƒ„…†„…†‡ŝˆ† †‡ˆ ‰ˆ‰Š‹Œ Ž‘’“”•–—˜ ™›œ Ħ ˘#Ĥ §)ĞĴ°(ħ1ĥ ·ğ8ĵ6ÁÂ?Ç?Ì?Ñ?Ö*ÛÚ5ß Ŝ%âç0ĉ ċŝêé+éè?~?€'‚?ƒ?„2… „?…zyxwvu tsqpÀ??€)~%}?{?y?v2s tp;qm.njk,gh4d e8ab7^_1[ \'XYU'VR+STP(QRN&OP L%M N KLI"JKH"IJH IJG!HIG!HIH!IŝJHH"IJI#J8K+L&M!N$OP%Q R.ST(UVW8XZ,[]%^`#ac%df-gi:j?m?o?r?ux/w6zy9|{&~}€=?%!"" 1%%*"RTSUVX Y[ŝ\[[]À?  %"#?& )2*?.?2?7?<B-A1G FM7L!RQX*WV]$\[b a`gf e lkjpontsr xwvu{zyx ~}| {€~}‚€ ƒ‚ €„ƒ‚€„ƒ‚€ ƒ‚ € ‚€ €~}~}|{ŝ|{{zyxwvutsrqpolkj h gfc%ba^+]\Y4XW0SRNM?H?C?>?9 425-01',- (1)%'& ".#$À˙ˆ Ž“™Ÿ вş˙ ç6ĉ$êéí(ì,ïî!ñ0òñ"óòbabfgjkoptÀ?ìë éè?ċ?á?Ŭ?ĜÓ;Ô&ÎÏ?É 5Ä)ż¸.ış"³´ ­!Ż¨İ Ş£¤ žŸ ŝĦšš›œ•–—˜’“”•ŝŽ‘’ŒŽ ŝ‰ŠŠ‹Œ ˆ‰Š ‹‡ˆ‰ Š †‡ˆ‰ŝІ†‡ˆ‰‡ˆ‰Šˆ‰Š ‹‰Š‹Œ‹ŒŽŽ‘’“”•–—˜™š›žŸ ˘£¤§!¨İĴ(­ħ0²³/·¸ĵ#½?Â?Ç?Ì?Ñ&ÖĠ?Ú7ŜŬâ!á&ċäè%ç?~&€? ƒ1‚„0ƒ?„…$„ pqrtuÀ?+€??}?{?y?v?t?q?n?k?h?e?b7_`*\]Y$ZV-W XT&U RSPQN#OPL"MN K!LM J KLJ KŝLII JKI JKJK J!KLK!L M L#M0N$O'PQ*RS*TUV#W7YZ[+\$^_6ab?d?g?j?m?o?r=ut?w?y?{?},~4% &7"#$ ((#+ ]\[YXÀ?& !5# $!&'?*?.=23?7?9":?5?1.-.)6* &2'ŝ($&$%À˙ ş²ĞŸ˙ 6ĉċ8éèì!ë)îí%ï$ñò)ñŝuxxŭy|}}ŝ~‚üƒ††‡‡‹Œŝŝ‘””•–™À?ëê*èçċ+ä5á à;ŬÜ?Ĝ?Ô?ÏŝÉÊ=ÊÄ*Ċ"żÀ,şğ ´%µĥŻ!° ħŞĞĴ Ĥ§ŝ¨ĦĦ˘£œž Ÿ˜™š› •–— ˜’“” •‘’ Ž‹ŒŽŠ‹ŒŽŠ‹Œ Š‹Œ Š‹ŒŽ‹ŒŽŝŽ ‘’‘’“”•–—˜™š›œ ž Ħ ˘ ¤Ĥİ!ŞĞ"Ż(³´+¸ı.½6Â?Ç?Ì=Ñ?Ġ?Ù8ŬÜá*àä)ç)ĉċ~*}?)€>‚ŝƒ4ƒ ‚„+ƒ6„ƒŝuvvwxyz{|}ŝ|ż??€~?}?{yx?v?t?q?n*klh(i e3fb=c4` a!]^ Z0[\!XYU(VWS&TUQ$RSP!Q N!OPM NO L MNLMK LM KLMŝKLLML MNM!NON"O PO$P(Q&RS%TU&V W0XŝYZ-Z[\,]-_`?b d4e*gh?j?m?o?r?t*wv/yx{ z?|!~}?&?#$ !(,$4ŝXWWUTUSQRPŝQO OMNÀ?*!"?$?'*/++./?3?7"<;A:@F=EK;JP0ONU(TSZ#YX^]\ cbagfekji onmlrqpoutsrxwvuzyxwŝv{{zy x|{z y}|{z }|{zŝ}||{zyŝ|{{zyx zyx w xwv uvutsrq pon mlkjhgf dcbŝ`_"_^[(ZYVU1Q P?LH7G?C?>?: 5261723. /*8+,0()%)&À˙ŝŸ™™“Žˆ‚}yt˙ ?ċ?è"ëê%íìï.î&ïñ0–•”ü‘Œ‹ŝІ†‚€À?ê é3ç ĉ,ä?à?Ü?Ĝ?Ô?Ï)ÊËĊ!ĈÀ$Áğ%ĵĥ%·¸ħ ² ³ Ĵ­¨İ Ş£¤ĤŸ Ħ ˘›œž ˜™š ›•–—˜“”•–ŝ‘‘’“ ” ‘’ŝ“Ž Ž‘Ž‘Ž‘Ž ‘‘ ’‘’“ŝ”’’“”•”•–—˜—˜™š›œ žŸ Ħ ˘£¤ Ĥ§¨Ğ Ĵŝ­Ż Ż&° ħ´'µ&ış>ŝż>'ÇÈ?Ì?Ġ#ÔÙ-Ĝ7ÜÛ à4ß.â áċ&ä?}>ŝ~€>€??‚2ƒ ‚?ƒ#|{zyxÀ?€?~}=| {2z?x?v?t?qn*o?l=ijfgc6d1a b^'_-\]Y+Z[W(XU%VWS#T UŝQR!RS P!QROP Q NOPNOŝPMMNO MNOM NON O PO!PQP"QR Q#R-S"T(UV,W X/YZ%[\].^5` a b1c7ef?h0jk?m?o?r?t?v?x?z|){.}|&&'#/$-!"( 2-1 NOPRQSUTÀ?,"#$;%'=(?+?/?3?7?;3@ ?E/D:IH&NMS(RX"WV\[Za`_^edcbihg f lkjionml rqp otsrqvutsxwvuyxwvŝuyyxwvŝzyyxwv yxwv xwv uwvut uts rsrqponmlkjih g fed ba`^#]\#YXU-T0POL0K?GC,B?>?:?62!36/04, -!)*&,'(À˙ty}‚ˆŽ˙ ċä è4ç%êé!ìëî5íì ï2îí(ïîŭ€}||xtsonjife a`ŝ]\ \À?é"è:ĉċ?+àß?Ü?Ĝ?ÔÏ&?Ë%ĈÇÁ,Âĵ,½ #¸ı³´ µŻ°ŝħŞ ŞĞĴĤ§¨ ˘£¤žŸ Ħ›œž˜™š›œ–—˜™ŝš””•–—˜“”• –’“” •‘’“”• ‘’“”•‘’“”•’“”•–”•– —•–—˜™˜™š›š›œžŸ Ħ˘£¤Ĥ§¨İŞŝĞ­­ħ%²³µ-ĥ ·!şğ?ż2 Ä?È?Ì??Ô"Ĝ×6ÛÚ3Ŝ Ŭ áàä(â?}?~&€+€‚%?‚ƒ.‚ŝxwwvusrq onÀ??#~}?|?z?x?v?t?q?o/lm?j1g hd0e-bc _1`]!^&[\'YZ"WXU#VWS!TUR S TQR S PQRPQROPQOPQOPQPQ RQ RSR!SŝTSS#TUT$U(V'WX"YZ[\$] ^1_>:ŝ;667723 4801,-.*,+(%)À˙ŝŽ““™ŸĞ² şÂ˙ #äŝ3ŝ ääçĉŝ ŝĉĉ"éŝŝ èèëêŝŝêê ìŝŝì ì ëíŭ0 ŝ+ííìîíü6ŝ&íí \ŝ]``aúU4# ŭ)íí!ŝííìŭììŭëëŝêúêé éè$ç?ċ;â?ß7ÜÛ?Ĝ?Ô?Ë/Ì-ÇÈ Â5 żı%şğµĥ ·ħ²³Ĵ­ ŻİŞĞ Ĥ§¨˘£¤Ÿ Ħ˘ œž Ÿš›œ  ˜™š›–—˜™š•–—˜™ •–—˜•–—˜•–—˜™ –—˜™—˜™š› ™š› œ ›œ žžŸ Ħ˘£¤ Ĥ§¨İĞĴ­ŝŻŻ°$³´"·¸ğ#ĵ ż1À?Ä?È?Ì?Ô0Ó2× Ö5Ú Ù'ŬÜà,ßŜâ(áà} |ŝVŝ ||#~ŝ ŝ~~"ŝ!ŝ !€ŝ(ŝ€€ ŝ#ŝ€‚ŭ] ŝ‚ü_ŝ‚‚noúkZA' ŭ‚‚!ŝŭŭ€€ù€€0.~?}"|{?z?x?v?t q2r?o?m"jk?he+f)cd`3ab ^._`\+]^Z'[\X%YZWX U!VWT U VST U RSTRSTQRSQRSŝQRRSRS TSTU T'CB/GFL.K JP'ONT!S RXW V\[Z`_^]cba`fedc ihgflkjiŝhnnmlkponmlqponŝmrrqponrqp orqp o rqpoqpo n pon mŝonnmlkŝmllkjŝijjihgŝhggfedc ba`_^]\Z"YXV!U$RQ+NM6JI?F?B?>?;?7?4:12#./+/, -)**+(˙ŝħ(˙'˙ŝğ&˙ŝù&˙%˙ŝŠ$˙ŝŠÂşŝÑ˙ ˙ŝŠ!˙ŝĝ˙ŭü½˙ŭ÷·˙ûŭï§ " äĉèêëìíì íì ëêéçċäâßÛĜÔÌÈŝÄÄ żÀğ·³Ż°Ğ Ĵ¨İ ˘£Ÿ   ž›œš›™ š™šŝ˜™™š›œ ž ŸĦ£ ¤Ĥ§İ Ş­°ħ ´µ¸ŝıĵĵÀÄÈÌÏÓÖÙÜŜà|~#€X€~}{zxvtropmkh ifdb`^\ZXYWXVU TUTS TS/TUVWX YZ[]^ _` abcegikmoqsuwxy{ z(&$"!  ! ! "#%'*,-037:>BFJNRVUZ Y]ŝ\``c fehj lkmŝln nmo no nonm lkjigŝfee d ba _^\ [XU TQMI FEB>;84 52/-+€#ï&òñô)óòġ(ôó ġ'ô ó!ô8ó$ò"ñï,îí ì/ëêè çä'0ßŜ0ÚÙĠ;ÔÏÎÉ+È?Â?ĵ&µĥ?ݍ)İ$˘£%œ–$—$‘’ ‹!Œŝ†‡‡ˆŝ‰‚‚ƒ„€ |} ~ yz{wxyz vwxuvw xvwxvwxyxy#z{|}~ €‚„… † ˆ"‰Š%Ž’*“ ”˜!™(žŸ(¤Ş'Ğ?ħ?·0½8Ä.ÊÉ'Ï6ĠÔÛ4ÚÙ&ßŜä)â"çĉë"êéí ìëïîíñï:ƒ‚?„2… „†7… ††…?„+ƒ?‚*€(~?|2z y?w?t?q#nm?j?g?c _4`?\X:Y"UV,RS)OPL%M7JKG0H E1F.DEB.CDA,BC,AB @,AB @,AB#AIB:C(D-EF"GH&IJ=KM#N)PQ*STV$W?Z?]?a?d$hg?k?n?qu}ŝ|&~ŝ€9€‚7€)‚ . + ' ( (&<"+ ) !1" #'%&6)*+-.?2?7?ŝ~}>}?{-yx?v?s?p?m?j?g?d'`a>]ŝ^Z>Z?W;TU)QRN.O#LM(JK HI F,GHE'FD)EŝFCC)DEC(DE C)DE'DE D*E FE-F0G H1IJ5K8MN"OP?RT:UW7X?[?^?a?d?gk+jn$m q1p?s.vu?x{9z?|$~}3 ~1€ €) (!!& '&" (!%#$&"'2* +1. /2.3%78< =?B?G?MSRŝYX=X.^]d/cih"nms"rqx wv |{z€~} ƒ‚ŝ€††…„ ƒˆ‡†…‰ˆ‡ŝ‹ŠŠ‰ˆ ‹Š‰ˆ ‹Š‰ˆŠ‰ˆ ‰ˆ‡†‡†…„ƒ ‚€ŝ~~}|{!zy#vur)qpm(lh-g?b+]\?W?R?L?GA%B<"= 718'34)/0+#,#()%!&'" #$!"# !"ì(ëê î&í ìï$îí #ïî #ï îï=î&í%ìë#êéè+çĉ'äá5àß5Ü ÛĜ*× ÓÒ Î4Í?È?Â?½?·-ħ²Ğ(Ĵ0Ĥ § (Ħ›"œ–—˜ ‘’“Ž‰Š‹Œ†‡ˆ ƒ„…†‚ƒ„€ ‚ ~€~€~€~€ €‚‚ƒ„…†‡ˆ‰ Š‹ŒŽ’!“”—&˜™œ"Ħ)˘?§%Ĵ­?² ·1¸?½ Â9ÈÇ7ÍÌ'ÒÑ ×.ÖĠÛ(ÚÙ ß$ŜŬâ áàċäçĉ ċéèçêéè%€‚&ƒ<‚ƒ"‚ƒ‚ ƒ[‚G2€?~}.| {1z?x/vu?s?p?m?j?g?d?a?^Z7[W9X>UŝVR%RSO5PŝQMM(NK&L I,JK#HIF)GH'FGE'F"EF EFE(FGF@G2H+I(JK3L M1N O"PQŝRS=SU%V-XY?[?^?a?d?g?j?m?psr?ux7w z3y<{z} |*~}&~€+ )! ( &&%>)' !*"#$+%'.(++,4/ 0$34?8?=?B?G+ML?RX(W/]\c3ba h,gf m&lk qp vutzyx}| {€ ~ƒ‚…„ƒ‡†…„ˆ‡†…ˆ‡†ˆ‡†ˆ‡† …†…„…„ƒ!‚€~}|{z yxwu#ts"pol/kj g2fb8a?\?W'RQ?L?G?B(=> 8494$50(1,&-.)#*+' ($%&#$ %"#$"êéì%ëêí ìî"í ìî"íìî"íìí#ì*ë$êé&è çĉ$ċ(â-ßŜ3Û Ú ×Ö?Ò?Í?È Â4?½·-¸:²³Ĵ,­#§¨ŝĦ˘&˘£œ"ž˜™š“”•‘’ŒŽŝˆ‰‰Š‹†‡ˆ‰„…† ‚ƒ„ … ‚ƒ„€‚ƒ‚ƒ‚ƒ „‚ƒ„… „…†‡†‡ˆ‰Š‹ŒŽ ‘’ ” •–#™š *ž Ÿ ˘2£§;¨?­4² ³?¸?½?Â?Ç<ÌËÑ *ĠÔ%ÙĜŬ#ÜÛà ßŜ âáċäçĉċŝäèèçĉ#€ €‚8‚! ‚‚\I€5 ~1}&|{.zy xw?u7sr?p?m?j?g?d6ab,^_![\X,Y?V!ST4Q RN1OPL-M N&KLI)JKH'IJG&HI&GH F&G HF'GH"GH G'H I H)I JI+J*K&L%MN(OPQRS7T*VW?Y?\^._,ab?d?g?j?mp.o?ru9tw,vy0x9zy|'{ }|~$}1~}!)"# #!  $ # $ % ,!&"#($%+&'(0) *#,-50 144 58+9?=?B?G?LR'Q(WV.\[,a`$fek$jip!ontsrxwvu {zy ~}|ŭ{€€ ~ƒ‚€ „ƒ‚ …„ƒ‚†…„ƒŝ†……„ƒ …„ƒ‚„ƒ‚ ‚$€~}| {zy x wvus"r q o'n m%jif7eŝdaa/`\+[W0V?Q?LG&HB=C1> ?98: 50671)23.%/0+", -)*&'(ŝ)%%&'$%& é&è ç"êéì"ëêì!ëêì!ëê ì!ëê ë"ê-é#èç%ĉċ(äâ,á à ŜŬ/ÚÙ*ÖĠÒ9Ñ'ÍÌ?È?,½>¸ŝı³>³ ­2¨+İ£&¤ž!Ÿ š›œ–—˜’“”Ž‘‹ŒŽ‰Š‹‡ˆ‰ …†‡ ˆ „…† ‡ƒ„…†„…†ŝ‡„„…† ‡…†‡ ˆ‡ˆ‰Š ‰Š‹ŒŽ‘’“”–—˜š$›œ Ÿ ŝ£¤2¤ ¨8İ­9?³?¸?½7ÂÁÇ'Ĉ?Ë)ÏÔ&Ó Ĝ&× ÖÛ"ÚÙŜŬÜ áàß âáä âċä +~"€6€!€€\€K:~%}%|9{z?y?w9ut?r?p?m?j#ghd;e?b?_7\]Y"ZŝVW=WT#U(RS*PQ"NOL*MN!KL%JKI J H%I JH%IJH&IJ H&I JIDJ9K-L-M!N'OPQR"S T2U9WXY/Z:\]?_?b?d?g?j m3l?or:qt%sv#ux.w4y x{/z|*{ }1|ŝ{}&}|#($ŝ%!!&"# $!" #! !! $! "!$"0#$(%&'%(#*+-%.41 2?5;9:=7>?B?G?L?Q7VU+[Z` _e)dc ihn mlrqput syxwv{zy~}|{€~ }€ŝ~‚‚€ƒ‚ €ƒ‚€‚€ €~ŝ€~'}|{zyxwv utsq!pom$li+h5d c`(_6[Z?V?QŝLM=M?H$CD9?@ŝ:;7;<,783(4ŝ500"1-!./ŝ*++,)*+ '() &'(ç%ĉŝċéé$èç ê!éèê!éèê éŝèê ê!éèé"è/çĉ%ċä'âŝáàà ßŬ+Ü*ÙĜ3Ġ Ô'Ñ?ÌÈ&Ç???ı³9´7Żŝ°İİ-ŞĞ Ĥ  !Ħ˘œ ž˜™š ”•–—‘’“ Ž‘ŝ‹ŒŒŽŝ‰ŠŠ‹Œ ˆ‰Š ‹ ‡ˆ‰ Їˆ‰Š‡ˆ‰Š‡ˆ‰ Šˆ‰Š ‹Š‹ŒŝŒŒŽ‘’“”•–—˜™šœ# ž  )Ħ ˘(Ĥ İ5Ş!Ż?³?¸?½?Á3Ĉ Ċ?Ê Ï4ÎÓ+Ò ÑÖ#Ġ ÙĜÜÛÚßŜŬáàßŜâáàâá2~ }%~ €5€"€!€]M~=}+|{?z y2xw0v?t?rpo?m?j?h?e?b_(`?]$Z[>XŝYUU+VS#TQ%RO+PQ&NO L'M N K&L MJ%KLJ%K#JK#JKJ%KŝLJJ&KLK(L ML*M2N%O0PQ*RS'TU/V?X-Z[?]:_`?b1d e?g/ji?l o1n&qp+sr"utw.v.xwz5yx{2zy/{z|'{'%&#%$%"$# $#"#!""#""#$##$% $$% &'' (*)*+,,.//32 35<6?:?>4B C?G7LK Q5P?U'ZY_/^"cbh#gflkjŝpoonm srqvutyxwv{zyx }|{z~}|~}ŝ|€€~ }€~ }~}|~}|}|{z {zyxyxwvutsrqo!nml%kjŝhg+gf+cb_"^?Z3V U?Q?M7HI?D?@0<=8#9'561#23/ 01-./+, -)*+,()*+$ċäç"ĉ ċè!çĉèçèçè!ç ĉç!ĉ ċĉ"ċ!ä$â&áà ß+ŜŬÜ1ÛÚ$Ĝ×;ÔÓ?=ÌË?Ç??'ış´0µ6°ħĞ!ĴĤ%§¨˘!£ ¤žŸ  š›œ—˜™“”•–‘’“Ž‘ŝŒŽ‹Œ ŽŠ‹ŒŠ‹ŒŠ‹ŒŠ‹Œ‹Œ ŽŽŝŽ"‘’“”• –—˜ ™š›œž#Ÿ ˘ £Ĥ$§ Ş4Ğ;ݰ³/´?¸½/ĵ?Á?ĊÊ<É3Í ÌÑ!Ġ%ÔÓĜ!×ÖÚÙĜÜÛÚŜŬ ÜàßŜŬáàß Ŝ8}|'~} 5~$~$~ ^~O}A|1{z3y'xw9vu=ts)rq?o?m?j?h?e?c=`a ]2^+[\??C?G?K8POU9T"YXŝ^].]\ b(a ` f#e djihml kqpontsr qvutxwvzyxwŝ|{{zy|{z}|{ z}|{ z|{z{zyzyxwxw#vutsr qpom lŝkj j%i hf%e ba ^]Z(Y?U?Q?M?ID:E?A(=> 9-:;6'78 3#451 23/01-./,- .+,- ä%âċ"äĉ!ċ äŝçĉĉċŝçĉĉċĉ ċ äċ ä ä"%â$áà&ß Ŝ!ŬÜ(ÚÙ× Ö?Ó8Ï?Ë?Ç?&ż?şµ'ĥ.ħ² Ĵ,­¨%İŞ¤!Ĥ Ħ˘œžŸ ™š›œ–—˜™”•–‘’“”‘’“Ž‘Ž ŽŽŽŽ ‘‘’‘’“ ”“”•–—˜™š› œž  Ħ£)¤ §1¨ŝİĞ Ğ4Ĵ?°?´?¸?ĵ Á4À Ċ1ÄÉ;È&ÌË*Ï Î Ó%Ò ÑÖ!ĠÔĜ× ÖÚÙ Ĝ ÜÛÚŬÜÛŜŬÜ=|{(}|~7}~'}~'}~_}Q|D{6z$y#x?w?u?s?q?o?m?j?he9f?c?a^_1\ ]9Z[W6XYŝUV0V W%TUR+SŝTQ!QRO'PQN%OPN"O M$NOM#NOM$NO M$NON ON&OPO)P:Q/R&S0TU3VW,XY+Z [5\?^?`?b?e?g?i?kn9mp8o?q.sr u1t vu%wvxwy/x$yx()&%'("&' %"&' %"&'"&'&#'6(&)&*+),-. /,12-457$8?;???C?G?K?OT,SX!W \[`!_d#cbhgfkjinmlqpoŝtssrqvutswvutyxwvyxwzyx wzyx wyxwyxwvwvuvut stsrqponmlkjh%gŝfee+d ca)`$]\5Y X?U?Q?M?I#EFA:B> ?%;< 895#6 73 45123 /01./0 -./âäċäċ äâàŜ ÜÛÙÖÓÒÏËÇżşğĥ²ŞĤ ˘£Ÿœ™š–—” •“‘ ’‘ ‘ ‘‘ ’“ ”• –—˜™ ›œ žŸĦ ˘İ Ĵ­°´¸ĵÀÄÈ ÇËÎÑ ÔÓÖĜ×Ú ÙÛ ÚÜÛ{|} |)}|{zyxwvusqomjhfc da_][YWUT RSQŝRP PQOPLOPQRSTUV WXZ\^`b cegikmo qpr tsuv#wx) *()' ()'( ) *+- /0258; <?CGKOSW[ŝZ__ ^bf e ih lkŝonnq ps rtvuvwvwvŝwvv ut srqŝpo onlŝjiifc `_\XUQMIF BC?<9:7531 201ŝ/00€ñïñïñ5ïî"íì ë êéè#çĉ ä% âà)ßŜ Û-ÚÙÖ4ĠÔ!Ï*ÊÉ&Ä=½?·?°?Ş£<¤ ž— ˜ ‘1’#Œ"‡ˆ‚(ƒ„~$€z#{|ŝwx xy uvwsturstrs t rstst-u vw!xyz!{}'~+‚ƒ.†‡:‹Œ/‘?–›:œ?˘?¨?-µ´?ğ?ÁÈ7ÇĈ(ÍÌÓ(ÒÑĜ#× ÖŬ!ÜÛ áàßŝċääâèçĉċêéè ìëêíìë„0ƒ„cƒ ‚ ƒ;‚7,€?~?|,zy?w u1t r4q?n?kh6g?d?`?](YZ?V?SO6PL9M?JG%H(EF!CD A5B@$A?(@7?@ >3?>8?@ ?I@3A B>CD:E?G*IJ?L?O?R?U?X?\?_?c?fj'i2m l9po1s rv uŝyx;xw{.z}.|2~ }€-,€‚-€    7 $ !#" #$%% &"()#,-0/1ŝ255*6::;'@A?F?L?R?X?^?d?j4p o v4u{,z€/ ~„*ƒˆ'‡†‹#ŠŽ"Œ!Ž’!‘“ ’‘“’‘“ ’ ‘’!‘‘"$ŽŒ&‹Š ‰)ˆ ‡…)„ 2€#|{(wvr-q?l?f?`?Z?T,NOH#IB8C= >"893&4."/0* +,'() $%&"# $ !" !@ïî íïî íïîíìíì%ëêéèç ĉ!ċäâ#áàŜ&ŬÜ'ÙĜ*ÔÓÏ$Î4É È??½?·°:ħ?Ş?¤;žŸ%˜™’6“)Žˆ*‰Š„…€"|!}~y z{ wxyuvwtuvtuv tuv uv0wxy z{#|}!€(ƒ„‡ ˆ1Œ 3‘ ’–$—?œ?˘?¨??´ğ=şÁ<À/ĈĊÌ(ËÑ Ö"ĠÔÛÚÙßŜŬâá àċäèçĉċŝêééèçëêé èƒ5‚ƒ5‚*‚‚6€8€,~=}|>{5y xw,v,ts9qp7nmk"j?g?d?`?]?Z&VW8ST4P Q"MNJ;K"HI+FG!DEB8CA*B@/A.@A?6@A3@ A@IA7B"C?D E1FG6H?JL,M.OP?R?U X3Y?\?_ c3b?f?i?l?o9rqut7wvz5yŝx||1{z"}|-~}ŝ€+~€"  ŝŝ  !ŝ !!"#!$%&#'( )%*+-)./-23 637;8<6ABF8G&LM?R?X?^?dj"i>oŝnuu5tz3yx#~})‚†!…ŝЉ"‰ˆŒ!‹ŠŽŝŒŽ‘‘‘ Ž  Ž"Œ‹Š ‰‡"†„,ƒ‚ŝ€1 ~{z0vu0qp l2k?f?`(Z[?U?O#IJC7DE>.?ŝ@9 9(:;$560 12,-. )*+&'() $%&"#$%!"#$@íìëíìëìë êëê(éèçĉċ äâàß!ÜÛĜ)×ÖÓ#ÒÎ*Í;ÈÇ 5½&ĵ%·ĥ?ħŞ/Ğ ¤5?Ÿ)™š“6”•Ž/ #Š‹…%†‡"‚ƒ ~ €{|} yz{xyzwxy vwxvwxŝyw wx3yz!{| }!~€#‚„'…† ˆ,‰Š'Ž4’ “0—˜œ7?˘?¨?2´ ³ş&ıÀ:ż#ĊÄË*ÊÉ%ÏÎÔ ÓŝÒÙÙĜ×ŬÜÛÚ àßŜâáàċäçĉċä èçĉċ0€/€Q€@/~}9|{qŝptt s/vu2x w'zy|-{}"|~&})~ } ! ! !"!"#"#$%&' ()+$,-!/03#4ŝ7818 9<9=?B+GH?M'RS?X?^ d4c9ih?nt9s-xw}+|{'€…$„ƒˆ"‡†Š‰ˆŒ‹ŠŽŒŽŽŽ ŽŒŒ"‹!Љ#ˆ‡†&…„‚#$~}z%y6ut?p?k7fe?`?[?U O4P'JK0EF,@A; <6#78 2 34/01+,-.)* +&'( )%&'$%&@ëêéèëêéèêéè éè*çĉċä âáàß!ŜŬÛ$ÚÙ%ÖĠ Ò.Ñ Í1Ì?Ç%ÂÁ?ĵ?ĥ?ħ?Ğ?Ÿ, +š›.•–"‘ ‹'Œ ‡#ˆ ‰ƒ!„… €‚ŝ}~~€{|}ŝ~zz{ |yz{xyz{yz{yz{|{|$}~ € ‚#ƒ„ †‡'Š‹Ž#3“ ”?˜?˘-£?¨3 ­?³,ı¸ż:Ä)É&ÈÎ$Í ÌÒÑ×ÖĠÔÚÙ ĜŜŬÜ ÛàßŜâáàäâáċäâ"€"€€QB~1}&|3{z?B=C?H;MN?S?X#^]?c?hn9m8rqw v'{z ~ ƒ"‚ † …„ˆ‡†Š‰ˆ Œ‹Š Œ‹Œ ‹Œ‹Œ‹ Š‹Š&‰ˆ‡"†…„$ƒ‚(€}+|y.x8ts p5ok.j?e?`?[ U5V#PQ)KL%FGA%B<%=>8"9 : 45612 3./ 0 +,-)*+'() *&'( )@èç ĉèç ĉèçĉċçĉċä ċäâá àßŜŬÜÛÙ#Ĝ ×Ġ&Ô Ó'ÏÌ5ËÊŝÇĈ=Ĉ>ÁŝÀĵ ĵğ?ĥ?ħ?Ğ8Ĥ% Ħ+›œ"–—‘+’“#މ"Š‹…†‡ ‚ƒ„€‚~€ |}~ {|}{|}{|}|} ~}~(€‚ƒ„!… †‡%ˆ‰‹*Œ01” •˜=™ŝž=ž?£?¨?­-³²<¸·;½ĵ0ÂÁÈ(ÇĈÌ"ËÊÏŝÎÔÔÓÒ Ĝ×Ö ÛÚÙŝĜŜŜŬÜ ÛàßŜ ŬáàßŜâáàß*~+~0~ }~C}4|0{+zy;xw?v6tsr$q?o?lj7ig-fd*c?`] ^Z+[W9X?U8RS O2P%MN,KL%IJG.H%FG*EF DE C0DEC+DC]DE D4EŝFE E4F4G H)I$JK$LMN+O?QS'T?V?Y?\?_3b ae&dh:g?j%mlp=or)qt#sv)ux-w vy'xz"y{'zy|'{z#$%&#$%&$%&%&.'()*+,-."/02%346!7:(;4? @ C5D H2I?N?S?X?]c0bh+g m4l/qp v.utz(yx~%}|!€  „ƒ‚†…„ˆ‡ †Š‰ˆ‹Š‰ˆ‹Š‰ ‹Š‰Š‰ˆ ‰ˆ)‡†… „ƒ‚#'~|-{zx4wv9sron?j?e?`?[?V8QR)LMG&HB*CD>$?@: ; <678345012./ 0,-. *+,-)*+ ,@ ĉċä ĉċäŝċċääââá àßŜŬÜÛÚÙ×"ÖĠÓ"ÒÏ*Î.ÊÉĈ<Ċ?À?ğ?ĥ?ħ5Ğ Ĵ=Ĥ§6Ħ˘)œ—)˜'“”Ž%‹!Œ‡ˆ‰„…†‚ƒ„€‚~€ŝ}~~ € }~}~€~€ €+‚ƒ„…† ‡ˆ‰$Š‹'Žŝ‘/‘ ’,•–™.š3ž Ÿ?£?¨?­?²?·8ĵğ&ÁÀĈ&ĊÄÊ!ÉÎÍÌÒÑŝÖĠĠÔ ÓĜ×Ö ÛÚÙĜŬÜÛ ÚŜŬÜÛßŜŬÜ~.} |~.} |#}|}/|{ |1{ŝz{{3z*yx7wv>u>sŝrq+qpo:n0lk?i?f?c`,a?^?[?X%UV?SP!Q,NO,LMJKH5IŝJGG%HF"GE,F*EFD/E FŝDE.EFEQF GŝFG4G6H%I+J(KL2M N-OPQ*R?TV%W?Y?\=_^?a?d1g fj6i.lko=nq0ps/ru/t svux)wvy'xw$yxz&yx&' (&' (&'(ŝ)''()ŝ*))*"+,-./0!12 457(89;.< =,@AD/E(IJ?N?S?X?]?b)gf l2k%po*ts"xw|#{ z!~} ‚€„ƒ ‚†…„ŝˆ‡‡†…ˆ‡ †‰ˆ‡ŝ†‰‰ˆ‡† ˆ‡†‡†-…„ƒ ‚ "€'}|z"y/vu8rq1n m j2i?e?`7[\ V4W?R'MN H1IJD$E@"A< = >89: 567234 5 0123./0 1-./0 ,-./@ŝäâ áâ á âáàâáàßàß#ŜŬÜÛÚÙĜ×Ġ!ÔŝÓÒÒ%ÑŝÎÍ*ÍÌ!ÉÈĊ;ÄÀ*ż$ğş>ĥŝµħ>ħ?Ĵ?§?˘&ž˜1™š”)•–$‘ ’!Ž‰Š‹ŝ†‡‡ˆ‰ „…†‚ƒ„…‚ƒ€‚€ ‚€‚€‚ƒ‚ƒ„ ƒ„ …†‡ˆ ‰Š‹"ŒŽ)!’“'–—š!›?Ÿ-£¤?¨?­#²ħ ·4ĥ1ğ şÀ)ż!Ä!ÈÇÌËÊ ÏÎ ÓÒÑÖĠÔÓĜ×ÖĠ ÚÙĜ ×ÛÚÙĜÜÛÚÙ"|{!|{|R{Hz:y.x%w1vu>t?r#ABE+F?JN7O?S?X?] b3a=fe k1jo$ns'r w'v uz#yx} |{ €~‚€ „ƒ‚…„ƒ†…„†… „†… „†…„ƒ…„ƒ‚ƒ‚"€"~}|%{ zy*x w"ut6qp?m?i!ed?`?\?W R4S$NO.JKE)FGŝAB"BC>? @ŝ:;;<=89 :567345 1234012ŝ3/ /012@ áàßŝŜá áàßŜàßŜßŜŬŜŬÜÛ ÜÛÚÙĜ ×ÖĠ ÓÒ%Ï ÎÌ'ËÈ)ÇÄ<(ż?ş?µ?ħ?Ĵ/§¨˘9£"žŸ*š›&–—’$“”Ž ‹Œ‰Š ‹†‡ˆ‰…† ‡ƒ„…†‚ƒ„ … ‚ƒ„ŝ…‚‚ƒ„…ƒ„…„…†…†‡ˆ‡ˆ‰Š‹Œ#Ž"‘“-”!—˜)›œ"Ÿ ?¤?¨(­Ĵ?ħĥ(µ*şıż,½&ÂÁÇ!ĈĊÊÉ ÈÎÍÌËŝÑÏ ÎÓÒÑĠÔÓÒ ×ÖĠ ÔĜ×ÖĠ ÙĜ× Ö{-z{-zy{-zyzHy=x0w0v*ut=sr:q?o?m$kj?h?f?c?a?^)[\?YV*W/TU8RS5P Q'NOL,M)KLŝIJ0J K/IJ!HIG.HIG,HG.HŭIGH.HIHII=J/K1L-MN?OP8QŝRS=S?U?W&YZ?\?^?a?cf$e2h g,?ŝ@BB%CF(GJ ?:;<789 :567 8456ŝ733452345@ŜŬÜŜŬÜŜŬÜÛŬÜÛÚÛÚ ÙÚÙĜ×ÖĠÔÓÒ!ÑÎ#ÍË*ÊÉÇ2ĈĊ=Â;½#şı?µ?ħ?Ĵ?¨£+¤Ÿ  ›#œ—(˜™"”• ‘’Ž‹Œ‰Š‹ ‡ˆ‰†‡ˆ…†‡…†‡…†‡…†‡ˆ †‡ˆŝ‰ˆˆ‰Š‰Š‹Œ Ž# ‘'’ “ŝ”•-•–˜#™3œ ? ?¤?¨?Ĵħ)°!µ´#ı¸½ ĵÁ%ÀżĊ ÄÈÇĈËÊÉ ÎÍÌËÏÎÒÑ ÔÓÒ ÑĠÔÓÒ ÖĠÔ Ó,yx*yxy!xy.x wx?w3v4u)ts;r q5p o3nm=l?j?h?e?c?a?^?\(YZ?W?U?S8QR$OP M4NL!M$KLJKI.J%IJŝHI,IJ-IJ IJI0JKJ@K3L6M/NO6PQ"R*ST/UV$WX?Z?\?^a6`1c b?e?g?i9kj+mlo&n-po r*qps'rq t&s r#ts u$t s-./-./-./0./0101 2123456 789":;<'=>,@AC0DG&HK$LO0P?T?X?\a:`e/d i2hm2l kp"oŝts%srw"vuyxw|{z~}|~ }€~€ ‚€‚€€€~ ~+}|{!z y%xw v*u ts1rq0onl-k6hg?d?`?\>XŝYT*TUP!QL/MŝNI&IJE"F GBC D?@A<=>? :;<= 89:;789ŝ566785678@ ÜÛÜÛÚ ÙĜ×ĠÔŝÓÒÒ ÏŝÍÌÌÉĊŝÂÁÁ½ıµħ Ĵ­¨¤  œ™• –’“ Ž ‹Œŝ‰ŠŠˆ ‰ŝ‡ˆˆ ‡ˆ‡ˆ‰ŠŒŽ‘“–™ Ħ¤¨Ĵ°´¸ ĵğż ĈĊÉÈËÎ ÍŝÏÏ Ñ ÒÑÓ Ò/xwvutsqponljgeca^\ZWXUVS TRPNOMLKLKEJKL M NOPRTVXZ\^`bedg fihjl nmopqr srs/0/0123468ŝ9;;>AD EHLPTX\`d hgkonrqutwzyŝ|{{}|~ ~+~ } |{y wvtqnkgd`\YUQNJKGD AB?=;<9:8989J)ŝ”J?%RŭMonitor outline˙     R‘3Rŭ‘Wŝxŝ„ŝŝœRŭ’£—œ——à˜˜$˜F˜h˜Š˜Ĵ˘˘ĉ˘ö£££&£6£F£V£f¨Ş­î­ŝ.>N^n³²¸öııı&ı6ıFıVıfıvşŝÄÄÄ.Ä>ÄNÄ^ÄnÄ~ÉÂÎÀÏÏDÑsуѓÓçÔ)ÔkÙZŬ²Ŝ8Ŝ›Í˙é8éêDîŠh´ñö)öKömü üWü£ŭ ./8/ŝ.â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭ ./8/ŝ.â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭ ./8/ŝ.à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9à˙?/Àâ?/Àâ?/Àà˙?/Àâ?/Àâ?/Àà˙?/Àâ?/Àâ?/Àà˙?/Àâ?/Àâ?/Àà˙?/Àâ?/Àâ?/Àà˙?/Àâ?/Àâ?/Àà˙?/Àâ?/Àâ?/Àà˙?/Àâ?/Àâ?/Àà˙G /ŝ âŝg âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝjG /ŝ âŝg âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝjG /ŝ àŝg àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj€˙ŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9à˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj€˙ŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9à˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj€˙ŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9à˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj€˙ŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9à˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj€˙ŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭgi8iÀ??vŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭgi8iÀ??vŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŭgi8iÀ??vŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9à ˙?ü?7€ â?iÀ??v€â â?iÀ??v€â à?iÀ??v€à ˙?ü?7€ â?iÀ??v€â â?iÀ??v€â à?iÀ??v€à ˙?ü?7€ âiŝĦâ9âŝ_â9âŝIâ9âüâ7âŝŝâ7âvŝ ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ7â âiŝĦâ9âŝ_â9âŝIâ9âüâ7âŝŝâ7âvŝ ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ7â àiŝĦà9àŝ_à9àŝIà9àüà7àŝŝà7àvŝ ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà7à ˙ü=˙7ŝä˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ââà˙ââà˙ âŝ”i3i âŝI3 âŝ83âûç3âŭĉ ŝ1âŭĉ ŝv1vâŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â1â âŝ”i3i âŝI3 âŝ83âûç3âŭĉ ŝ1âŭĉ ŝv1vâŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â1â àŝ”i3i àŝI3 àŝ83àûç3àŭĉ ŝ1àŭĉ ŝv1vàŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à1à ˙2ü ˙ŝ717 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 â?iÀ??v€â â?iÀ??v€â à?iÀ??v€à ˙?ü?7€ â?iÀ??v€â â?iÀ??v€â à?iÀ??v€à ˙?ü?7€ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj iŝ+8v âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj iŝ+8v âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj iŝ+8v àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj¨˙ü7´ŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9â?Ċ:ŭ*ċä8äŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭqs8sŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭgi8iÀ??v?ŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9â?Ċ:ŭ*ċŜ8Ŝŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭqs8sŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭgi8iÀ??v?ŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9à?Ċ:ŭ*ċá8áŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŭqs8sŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŭgi8iÀ??v?À?Ż˙Àâ?À??ä€â?s@â?iÀ??v?Àâ?À??Ŝ€â?s@â?iÀ??v?Àà?À??á€à?s@à?iÀ??v?À?Ż˙Àâ?À??ä€â?s@â?iÀ??v?Àâ?À??Ŝ€â?s@â?iÀ??v?Àà?À??á€à?s@à?iÀ??v?À?Ż˙âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ7âŝŝâ7âŝâ7âŝâ7âŝâ7âŝâ7âäŝÛâ¸â?s@âiŝĦâ9âŝ_â9âŝIâ9âüâ7âŝŝâ7âvŝ ŝâ7âŝ!ŝâ7ââŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ9âŝ!ŝâ7âŝŝâ7âŝâ7âŝâ7âŝâ7âŝâ7âŜŝ×â¸â?s@âiŝĦâ9âŝ_â9âŝIâ9âüâ7âŝŝâ7âvŝ ŝâ7âŝ!ŝâ7âàŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà9àŝ!ŝà7àŝŝà7àŝà7àŝà7àŝà7àŝà7àáŝÛà¸à?s@àiŝĦà9àŝ_à9àŝIà9àüà7àŝŝà7àvŝ ŝà7àŝ!ŝà7àŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙Żŝó˙<˙ Àâ?sâ Àâ?sâ Àà?sà ˙ Àâ?sâ Àâ?sâ Àà?sà ˙âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ 1âŭĉ 5âŭĉ 5âŭĉ 5âŭç5âŝÛä5ä€â?sJâŝ”i3i âŝI3 âŝ83âûç3âŭĉ ŝ1âŭĉ ŝv1vâŭĉ ŝ 1âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ â8âŭĉ ŝ 1âŭĉ 5âŭĉ 5âŭĉ 5âŭç5âŝ×Ŝ5Ŝ€â?sJâŝ”i3i âŝI3 âŝ83âûç3âŭĉ ŝ1âŭĉ ŝv1vâŭĉ ŝ 1àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ à8àŭĉ ŝ 1àŭĉ 5àŭĉ 5àŭĉ 5àŭç5àŝÛá5á€à?sJàŝ”i3i àŝI3 àŝ83àûç3àŭĉ ŝ1àŭĉ ŝv1vàŭĉ ŝ 1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝäŻ1Ż˙Àâ?À??ä€â?s@â?iÀ??v?Àâ?À??Ŝ€â?s@â?iÀ??v?Àà?À??á€à?s@à?iÀ??v?À?Ż˙Àâ?À??ä€â?s@â?iÀ??v?Àâ?À??Ŝ€â?s@â?iÀ??v?Àà?À??á€à?s@à?iÀ??v?À?Ż˙ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj5 ŝ äŝ[ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj sŝ/J âŝj âŝj âŝj âŝj âŝj iŝ+8v âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj5 ŝ Ŝŝ[ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj sŝ/J âŝj âŝj âŝj âŝj âŝj iŝ+8v àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj5 ŝ áŝ[ àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj sŝ/J àŝj àŝj àŝj àŝj àŝj iŝ+8vžŻĝ˙Ĝ?Ċ:ŭ*ċä8äŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭqs8s?Ċ:ŭ*ċŜ8Ŝŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŝ/â9âŭqs8s?Ċ:ŭ*ċá8áŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŝ/à9àŭqs8s@?À??ä€â?s?À??Ŝ€â?s?À??á€à?s@?À??ä€â?s?À??Ŝ€â?s?À??á€à?s@ŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝŝâ7âŝâ7âŝâ7âŝâ7âŝâ7âäŝÛâ¸â?sŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝ!ŝâ7âŝŝâ7âŝâ7âŝâ7âŝâ7âŝâ7âŜŝ×â¸â?sŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝ!ŝà7àŝŝà7àŝà7àŝà7àŝà7àŝà7àáŝÛà¸à?s@â?sâ?sà?s@â?sâ?sà?s@âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ 5âŭĉ 5âŭĉ 5âŭç5âŝÛä5ä€â?sâŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ ŝ 1âŭĉ 5âŭĉ 5âŭĉ 5âŭç5âŝ×Ŝ5Ŝ€â?sàŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ ŝ 1àŭĉ 5àŭĉ 5àŭĉ 5àŭç5àŝÛá5á€à?s@?À??ä€â?s?À??Ŝ€â?s?À??á€à?s@?À??ä€â?s?À??Ŝ€â?s?À??á€à?s@@5 ŝ äŝ[ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj sŝ/J@5 ŝ Ŝŝ[ âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj âŝj sŝ/J@5 ŝ áŝ[ àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj àŝj sŝ/JJ)ŝ”J?%RµSelection Mask˙Rµ˙6 È Ô à ìRµ Z ^ b f j n r v z ~ ‚ † Š Ž ’ – š ž ˘ Ĥ Ş ² ĥ ş  Ĉ Ê Î Ò Ö Ú Ŝ â ĉ ê î ò ö ú ŝ         " . : F › Ÿ £ ö    & 2 > ê  ö ¤ ° ĵ˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙€˙ ˙?ü?7€ ˙?ü?7€ ˙?ü?7€ ˙ü=˙7ŝä˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙˙˙ ˙2ü ˙ŝ717 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙?ü?7€ ˙?ü?7€¨˙ü7´À?Ż˙?À?Ż˙?À?Ż˙?ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙ŝÎ˙;˙Żŝó˙<˙? ˙? ˙? ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝŞ1 ˙ŝäŻ1Ż˙?À?Ż˙?À?Ż˙?žŻĝ˙)ڔmJ6%visionegg-1.2.1/VisionEgg/data/panorama.jpg0000644000076500000240000060175611224565530020016 0ustar astrawstaff˙Ĝ˙àJFIFHH˙ŝ(Copyright University of Adelaide, 2002˙ÛC    $.' ",#(7),01444'9=82<.342˙ÛC  2!!22222222222222222222222222222222222222222222222222˙À6"˙Ä˙ÄB!1A"Qa2q#‘ĦBħÁÑ3Ráñ$brC’4‚%S˘Â˙Ä˙Ä,!1AQ"a2qBR‘ĦÁÑ˙Ú ?ó,Αšž8ha¨é-Òr÷6Ŝö½€úcy6WZ™šSŒĈá”Ô7Àù–À‹ŝ¸*9iİ ’5¨UE'ĤÍùŭx>ĝ?%Ј*<ÄʒhBÑééµĴçĥÜcIËŝ›¨àkšgĠYfh‘ËUQSO:ÓSTFŜf‘›ċR,tƒÒÇ|yôΌB•%[‰Œ‚äwġÇŞVç+”|9 ĤJ—m ’Bn.­`l{ŸLRólÀRWI<,ÓVĊ4Ż$ËôĜ½ƒj‚ŭà„pB—ÁVQԞéì}ùÛ€”77ùx>ĜÔrB³#K’7 ħߖ;™Ùobt†¸·q‹e éWS”JP­ePM´ŭŭï߃‡ÒċÙ ŞxòĜkäiM£[ –íĞkj$í|Uéžó) ³0U2§Ôvöß á1E™8–¤°ż†6cżcÜ…m+%Ĵ†ey7Ċ!Ô%V‰šóh2ĥÂËÀ·½ï‹N‚ YuF‹ċŒ•³›{[›ßó˙URfRÉ>q 4£~şŽœAÎàìIÛkíÏç$Ì?wUfİx–bËrËkeŬBïĜïĥ"­~Nˆ”ŽRݨjd’9jRiSrWPpH¸#ƒ{qcÇW™g••ĴrùjéᣈKDì8(€Óĉ JÎĠ-Ô E‹ÔHÍŝRûmŽ|aÑxŽĤ˜ÄéĤTHáŒYŝ;ŽÛî-Ûé‡Ç%օé[ĞÌfĤ§[JzħŞ´`:X’n=vŝxÉsjäËBĠR)Žr@•˜l}Pqî1 E ;ËTÌ]$Ô ›ê&Ö^ŝöúcL óşHĊU”—Ü/ŭ=ħ K&˜9˘ŞKıv–MDaï͎Ĝa阘İ!Ë%@W–7oÉ-ò‹~§,J’½#$'`çqÜ` ùŜ‚³İ ½DŸÌƒNǵ‡oÓžDUè·PäR'hé%*WİÔeܐŬû{z`êİr/d5ÑÖĴSI;CWo.˜ÍˆpHÙH,/ÎĜƒ#’_ŬtñĠ'FXǟİ(ı ¸ïôöĈ³Ċ'Ħ¨§ÖŒ ÓıÜ^üñ1\²Œí!Ğ<<ĞJÜó0¨‚12ÔÈÑ ŝ.H‚4;XŽO|§i/üD›o}ñ*=”kĜñÙádĤ?Q˙b6c§Ê.ÇżöÇlÜ^ç°ÂûsŽ~R8úm„ß(›ĊhĤĊƒ„#×I·ëVŸ5ĝ?‡ËރË0éŬUÚŜrxíɜy„+R›ÄôS‚jÜ’;cÒkŞŞó'W²LŠ€€vmŻŜĈǟËĥ0äíÛËc#W,u SEk•Š-}ŝ½÷öÛ|@ž ËĈv&VrZFBé%lJ‚6k^Ŝ·ħÄ /ZŠgiŽ•O•ŽÊñw¸ÛĊ­ Žħ³<şÜ Ċ€ßĞLšħö]â|Û#§2RUHUÖ£Ĥ4ö'óŭ1yÉh. ²§h˘Tn,ìNċ‰úv½ħċùšŠ’^`2Ĉ0WµöPĜmGZÓ 5Stâù‘Ù´ğ/&À_\>ҎÄôJPÊM}kÈîÀE=# hä‰_`F ¸ÂZĴÏ;­Ìiê)jşìQVOHµ\êܝ€· *ĴÁ32¨³²GÓ W.NÛ °vI-!b2ÔŞžĥxd… ÎÌ^ÛuX[ż—q‹#{\Ú Ċ"¨ž’€ÖçĉħòVB‡½ÈÓ½À7Úߖ=#-ĦĤ˨b…`‰EÄjIÒNçŸ|Rĵ.ŜË!§Ş’şšLÉÉêK5’Räo·anĈĜwQäyvyיfŽ˘hš’£.Ûz6?|t-dHw˜ÒÚ'DËg†Oö8ŬOçϵ>K1Ğz§]/+Ŭ—ŭĴ+˙e8.޲ž™*idB÷ÒÀ{wĊ^ŞŞ|Ĥ;ĝežG5·ARêĦî3%xX&Ìè`ސMUJ³o~mo°½ĵ_•ĈìfMù1Ŝ˙–*tÎsĉf%Keı.MïĊŻô8l|7C+<óË,Vy(ê& Î= ê7·Äݏ˙D;—=ĞÎóXhòêÚġBYä‘ 4ŽI÷;b˗dô4•**ċ‘{Í#\÷SÇċŠ&SU“eġġ…ï‰/İÂĈ’…S²ĦmìEÍŭî;bëCâzIÈ ñı™˘ MïlUħ$½Á*×AÀ#q÷Äĝf´=3#UBŞ7ğH?"L÷/”jŠa$\uWċ'Ĝ÷ûaÚe`ï0œ„ĝtMo%]DlMށ‰(éaËhÄz•@%ŽÀ“Ïz s$ôÍĤuq(ŝĠ¨ŒDRy›â& NŞ.YÙ}}‡×|RŻ!iU  u{Ħ6Ġb"YVĵ°†KÀĴUĉ#âŬ“0ĴZJ4ġÓ ċżKŞú˜“Ü‚G”{b*)ċÊiC‰Yi£n˜ܛ…%w<7İê²,Ç£INÇHHl1ċİQEâÔĊBgĞĴ˘iĠB”ÖÄme;Ûcµ÷ĉĝ²MâŞİÙ£¨ĤĤjhÜ4½97*Ûm‡§:˘ŞĴŭĤIQO"ËıZé–6¸>kŭĥ${*T9Í ù!ËsL˜Ş!§gev v²cëÜŝxĞK–Òĉù´‘VVÉş–Yu/+›Ŭ˜(ħ7ú[DCM8a)crmsĊöǁĝ£:Í?ùsPġ4”Ĉ'4EĦ6‘À7;X_×*ĜĈg‡ÄâĦ(œH’²DKu$'M ÛkrlmĈ Îü œŒ°ÉG <Á•äg Éݲé¸#óöĊ ĉnVĴŞ<Ò'FIdŽèísfe€Eö>Ŝĝ;+ŭ§fÔT’eĠġ&˘•¤,Ò2ëÔĴ,bäyö íˆëò*{+3fU1ĉ(ÓV9g"ħEĜ·ħċ‹m.e1¤‚žĥĤş˘ŽBĤ8$` 5ˆıb Àô۞Ĝ ĴôĞ™O4”úc•ï]”s`w6ßÛßQ5b<ÁTFÓĈËjEµ€üûb)§‚Ŭlö?Ôe—-d§–Hanšş†°hĞŻ<µŭñĉ%Y¨§EŬœŞıaž½Láz¸&hÔPËÀ6ìĦˆèA8ï)ĤI gp¤ i-kÏ?––$zNOK•ä~ŽĞ0X’(£ġK\\^ŬŻÛsûB¤Ís :Œ‚Z=F36‚ħI°ԞŭğqŽüOWˆ¨ĉ™!SĤž(ċ(Àô¸ĉ÷żĥ+9Ĉ}dš4eş½) kߖ7;ĝô4ü”rJĤÂ!¨jIUö_"òA<o{ZÄzm‚Ĉ•(^Ż˘ħÙ#V:ƒ’?‹ġۋâħd*jù![–#ñ4–ĴO½ñŻ‚ĦhċdšE‹ĥ• \kïo\D9%  Ÿo‰ê$žW–ÑE1@K›–RÖ{b‘$M#êî5Ġ#ܛñ‹žUáv­Ì£˘–@/!Ò]Š‚ĥÚÖr0/‹èQG‰ĤQäR/ħ<‘ŝ\zcĥ\nQîь$£.ˆ°Kà(ĦĞʲZjžĥa;|DàBĥŽ%’wí`7ÜâoÚ|ġÑäT´ġ´´éX"ÍNÁob—6ú‚AöÀfŻ!ĤYëëXWĉ $šGĜ” eUr;8ïĥ*ı·‰f̨ Š7ĤŽ@c7$İŜäÍñ·4â˘ĤeÇ9ĤóEĊ9u<ùt9~g-ULk¨˘˘,tq{í½ñbȨsÚ܉rĉL0ıŠ1‰Żk*•6›z¸×ìŝŠ–ÂĠµµ3'4bjšó ÒŜROap“‹ìŝ£2ÊhçÌrœĈA#-Zΐ-Џ½Š†&âÖÛ·a‡I~^“9:qY£Í|eFĦ‘Ž´ħK FP¨×ÛoLUe¤–2 €„R7ߛœ}%]Eçԍ uHٚ' t,K#XÜƒ(Îĵ:rʞŒRR‘Ê *¨‘cÈúíŽNn%NQ7àĉĵ2ħUK™SÓÓÉ]†ÈC-ż›_}¸ż|,ž*T¤QR&5ĈˆÔyfĥáŻüħpĝİáĞ‹+š&Z=)+i+ƒĞSa}b1̓ĤFÑԙĴELq‰Çž1ıaċ"ÄXĥ9cŽÈ_û›Ä>Èêfô˘–CĠ1)ÖŞ îob˘×߽޲zz˜ê(¤’–Xáë}´XùÔ-kƒèF=˘§ĈI&I˜Tĉ9+= r%M‰`N[Êc%Eı÷7NjVhİqEM44 %”´z,·U·ŝÁÛ6£„Â-ğ´{&YûH΅z2ıĞ„túcAaÖ Ċi ĥ›ÜÉ;œxfqTÖaK˜iJ‘TÏ2ĈnŠ÷$Û×ĉÁÔYf[1Ĥ¤ŞZ‚ŝZy>A{ÛIĜ_kà_VO[ŸI]U CS4(Òê7´€HçcĤö÷ÁÙ5ûŞtkSѽ=%Y‹Ĥe,Ħ"îWÔMĥößÖÄ>>W‚™"‰ÇQ)†ĤĤÛoż7üıĈ¨ZÜÚiĦpÎä$jö>oá[úߏ|3ĤÉs:šŽ¤Ôežr‘ d.ìH[íĥÊwímŬéû;È<-™ĉóTÁAGĠž:Vc‘d½—Hġïż8é2ùcÛ|oÄ=42ĵ2DÓ*ü,×òëKkżqÎç´5y%e>Pġ Tşâv€¨%Y4 i:—ğ‹ïŠíFo<™–cñ*ëĞï C² ´°{*û1·8ŞId›lLc Mi¤èB˜úvşr >·?–#>Su_rĥ,ŜVŞ•êš=:ÏL1 T]Ž˘{l-ùaI–+ĉ$.Üâ6]’TĈ‰+¤nš­¨^ÇúTƒ˙!ODÔ"µÙFÁ‡ŭñĦ’") EĞfŝO}żÍ°d²´Tʖ^™ˆh*Ċ!ĴNß3l5&n ĈŞœˆ’XáPH  yä{ܟËĠÔÉQĤiçYĤkùğƒĜ·ùÛËVò´ËĦT5’÷Ó~yġßĈ€ 7Ŝĝ(0MYM-ċ'Ò”?”‚mÁÛlB^Ĉ×ç×SEN)Ìs,‰$zħ=ÁÇĥÈ·?1½†‘µpĥ<}%†Tİ¨jcê;úßóÄZF’À{ñ¸£i*c‰Tv ˘öž78{ÀTM-Tï3Y™Ó{ÛúsÊ”ş“b7ï|4™)áÊY:†“DĞbLŠnymaß{C) ›6™cCÓóI!²Ş*˙aÇ%2£ şŻı6Ço †çe´nĊA¸Ü‹_n{Œkä˜]ċ!÷8Ö%@‘Šû0liD„+9µí`1£#ş*[B((<Ĝcj@`lMŝ¸‘–ŠÈmD6ĤàñaÚÛßúa'ò6 Dòˆ%“¤^+è2”$)äoĜß\Dä‹y>§Ó İh(Ş’ É#F°š–BU¤6"êğƒ`Hż;Ÿ\,@Bş•M ñ·Ŝĝ‚êTÔÒK;( s{!Ĝ–[~Ûúœj˘ı§X’Tó˘yê-cqmĵĥÀRŞŠ†X™Ú2 È7#µí|aÖÀĜ‹úàÒĦ İš&†Š#1c}zĜrwâç°ĈÒEZ“PH"¸hšFU*n-Ï?÷ Ŝ0 · Úü m¤ F#‹]>l_$†ŞËTÉ•n@Ĝcß|<Ż L"f†2¸)›~x‡'eĊ*?O2¨ÒF”˙ĤéÖ{ÛsrMĥÀÓtIG,\Y„`X·Ħûïllh•Q‘…À&×€öÁ´uġŽŞN£T- Ĵƒk¨k\û\Ú×Âzȕ§ƒü˜†Ìž,ʵÑaEh…­sbRäržwĜ‘Ĉ­ŬvW5ĠÙ´VšİjİĤ'ç6ˆYAÂê;p8ĤEM%VsEGMEZ•u>‰\–@|Ĵ.~P…ŭñíeFf@Ê3JÊPĤş”:Fáʂ–Ía° nqÙĊJ.5ƒ‡—LkáQx)ANħI4à<µ(Ċş½Áıí½ŝĝ°â*Z„ޤŠxĠ•$PÁ]t•ö#ħ˜šĜ£œšĈc1ĵ5ŒĈñ˜ÌjĜŜ3QÉĈcxË`ĥ2ĜŜ7l:9ĥ2Ĝí–ÇÛƒĥ: Oé@Úĝa6\xïg;s$ŒÄYşŠZ3ŒĈ`˜Ìf3ŒĈc0˜Ìf3ŒĈc0˜Ìf3ŒĈcG‹ÚöôÀPlHża|`AĥĝŠXätòˆîvúàâ§á(ĦġFĞ1İ,ĤÜíĜw>ĜÊ}•rš˜êé&`‹ċn×›\ušRU͗VĊNé+̖Hĉ_(ÚÖ¸ âİ n•Ĵ)"G\‘ ’êVUµ˜{\`9Âŭ’ǍSd•9~_EŽƒÑ‰c°y½ˆŜß× ³ *Df8,J†rۀ{ÚŜ¸CMâ<Ğ>dhٌ ĉSĤÀċm¸ Ûò‚·1­Š‚… Ĵg(Œó)Vwà<.=‰ÒV.È´QÓIMMOUŠá‚Üêüĝß|KUY%$•2˘ ;ûaf]I} 5EfĞ餖9n ĊšÖÚŜĜŜ[ô‘C&FÊ[sħ` _qqïĥì>ĞĞ|™Û.§2Hñ’X%{ƒo|Dû†3[ ä…uĜÙc$`qĊF?YLO֌°ŒğĜiġߞlɳᤑŝ2MÜ; ÀímìxkaƒŒĈ Ê<İ+G“Éf,ÚH·˘É$~¸oE_\ouñ$YÄwÚ×úb*êè!İJII]q´fħ!}-ß içšÈ:‰ ËmBŽîo{9-òÛI77{áı$JT99œòeÒÔĊG*”fR²¤äûĤ ê)²§H››Úlß0šĴ²iž”+(ëZ?8ŝk‘âÖĥ›2ž—ġUFW˘žDíkp-{úßÛdš°ôt¤*۟|mÀîċ…Ye.i•­\<"7[acĜw’û[³‘9$¨Ûé °€›žċŽŽ8ca{_鍣—’]Œûa<ëTı²3I˙ˆçN’8nxîûá§[TqÉêF"äùH½òœ麰¤oLC9hÒBö*Oŝ·µñKöDVF´j "ùú}C{ ÓcéŒÌrñY–Mí)O#·!†ċé,R9ŭá+k:„QÇ݁VmÉòß·#ñĉ4ê“ÑÖINKĉĈà|­{íɸc.GY; İx( š–<á×İQSĤfrz\’Š8pO}Û,§jˆ ġQžìÉÔtÁSécúa†³=rfy},tÂdœÏê~YÉ|Ŝkŝ}°6S zUl½ĉݨI:fZxÚT*ۀJŜÖ$ŻÛf˜ĉùu7N8‘".T#êPÌmĞżWmï„ÙŸÁME8Ÿ˘d¨Œ ĵĤÚŻ{}Ž,O˜STSġ£’.³0:”Xò;ŒU³È’ŞZzC[ ² ,i-˜ëï½Ôwçñ2ÖšÉ)Qroß•du `d Ĉ ouSı6÷ûşv4Ž)şr@ kք˙µ×{X×4òÁ, &ŠZzB5ıŜ’Ħ­ż°</™Ŝjİ*óÄĞJ)ܕ·•o#ƒĞk­É8Jžcĵż6qUUMEK3Ĵ36¸ĉ6aċġ½~ĝMĝÏâ*–<ŽİZŬ*Š“šażˆ(ŝ }Gl[iĞĠ”8>­1pFğocÏ­ï郣esmJĉ÷Xvúâ¨hòOŒ9ÉkWM5l}9sš˘Ĥ(]˙üŽ·ßĥÖç&cOÓÏE•f0.cF&f‰'ŒÜ‚w!˜rEıµ·ÇĤMAI=4´ÒÓDËŝ˘o*ٝOa TpEI%R€S¸­îêä÷í‚ħH(‡´S˖ÔÔçs3^qUÊ,a’Äj^ÖÛÛ%lYítY3ÔÖ*ÔVyŠ›Áˆ­ċ#ġ$Îóèe—ÙpYç{—JÇv˜°şƒsm†Ê!Ëèéj š‡0Ĵ£ĵUĠkbŜcqö>¸WX]ñż…+ VA›PIS—Ä>`:%–%k.÷°żÛûcÉk3*šŞˆ%Ĵvy[Ϩ(ĜúwÜcĜ³e"’ ws4(è‘ËLĦÍ͙^Đ{ê^n/Ĉ<S%6f³SĦž"ĉÜ<Š ùƒq~ŜkXâ$˘˙²âÂh‘+]cµk~%쵉ÜX‹ŭ1Ĝİ³]„u+İ@駓~ÄŭĊñއ0y£z™|稍aü…+ŭoߜ4’İrĴzjhà”İ}.uşƒ¨"Ç{ïo×îô08éĉĞ,kXÏ?áşş…A}Á -ê-퍴4_= h§œ7šn,G ·ßŒevoQ$’EĠ´,`p›llŭ·í„ÔĈjœÈ3Ԙn×ğÊ=;mġÁÖ˙Aħ‡ĊE%oI˜ÇH[¤K(f í‘rm½ŻÛÛ Mu]rşy qµ.Ĥ›$'ğĜÚüoĈG,ÑMÄ!"@ċbÎěĜ(ôµ˙L=lŞĤŞšEé;ŞÙG”0Ü)ŠÀ[|Vtü;L*¨Y~ šPÓĞomÈàí{o‡°P,PˆDi+;ĥâÁTy>ĵĝóÚsÌ#†‹ÔË ‡¸)èá†×ç‹ M_‰2Ên­naŞ6X =F™—bÌyż·ß°Ç<à·& ;@½5U q+LäħR=TŜÛsħ[÷ĥ!ĞĤİİêt”Tu#Üµ·Û[ê9Â:šşÚÙe¨JÒġ” àƒĜ›[cÀ÷Ċ–™o”Ë ċóT#ħEbT$k\ïmĈĜpŒjž†ÛY$ O ’VË3SÔÓĊ¤Sê/J“•‡.öĥ*Ù․lb™×ÎBêÓoáî½ïħĜrġYtİ<Š U <¨4G ‹ċÔÄ@ŜÛívàvLj+ĉX%JŠÉB£4Q<ċ„qÒtéíµÏ­½òâ›aˆŸ-Ş*žVb²ċI*àÉ—Ûœf[•ËQ@µ,ĝ£éĞ4[ü×&ÀoıۛözìŞÊš)d’iB´ ÚġÌĵl{êâ ]żó>u :áCY—Ô¨âŭkf—hŸ5T2UÖÑÌe–¨Êñħ!ôò×o÷ç rjo€ÌŞç†˘Zš‡ ĞĊİ”IÚ÷bwıíôÂ|Éâ–H*kà™ĦŽĦžXŽ•)UQòFĉŭ¸ż' Ŝ–‰İTĉSËÉmatˆĊ­bA ×6Ÿ_LT˘¤ż^óœÓ=Ÿ2§2Ċ ‚Ĵ#ĵ•ıCmى>kv'aßĉyĈVĠ1ÓĊ4ġŒöWwq~Öħ$\Z° Z¨s C5¨K/ (‰ŬvÜ×ßÏIg,ȨdY"‰…Ö¤/qpAĠċÚĜq‚ÌKt69ìupôD’N*T™yY”nIp<§ħߐyú\\Ĉ sŞIIR҈ܕ0Óó.äb}O;Vü3žċy\òe/.ġS–ŽxĈñí}%šêA#`·ÜâĜ£2+,Ô-B§İKşmĈ ÍĈ×9ùNÁĦd>§ž:օic}? ĉEy ·ZüÜàjŒŽžšŠšŽXŞĞ)ĠŬjdéQğ/¤rn9òŭ°Nc--ԉQv})K T’e+r~›[žÜmŞĤË §iêê~´Ê‘SŞQ{†nM¸[ócµŽıÔB*ˆçĤ~ş İ$ cĝ…öĠrFàÚÛíƒ#ÊDĤŽ'Ljz’ĵ‡{ÌMĥħkúáls”YBEPË-Öe ħ7:ĵĊocqß *s)ċËéŜXÄ]#u˘`’y­ğˆaµÒk hTVĉ1E F`ÑĈÚ!–V1`H_( xÚĈûÜâ 2ç†3N[.äéyWÎş I{‘qî8>ĥÁÙ ZÌٙލ‰”T!Tħ;›’À‘½Çm†ĝ[â*lÊĦ]éÍmE)-DŠY€mĵÌNàw; ‡Ö³'Ô+%K4Î*uB×BMştġ]6Ĝ[ŒCU[ġ4ĠM <¨:J’‹+˘‹)a·Ÿa‚ózjiÊÔ2ü(tÔ:ìÒ÷Öı ¸ëé„$iy’$ԀòPßI- Ħ”ÙËu”Rı–P5 ‡2Ûs½½FÀp0f)ĠÔ@Ğ!#Ig°÷ŝ¸ĉ˘&‰~#Rİg`‘pG>Q¸˜ŽHċI*̝'cc¸ŝĝ´•`êP 5²–Qkß>8ie¨‡WáĈMÀ]ùm·vßTÄÊn jPt‚ qüħ°Ù@;{b–²"Ċ”xaój8*#™z“LèÒ2úŒüh Ĵ“ÛMğâë•x*ʲ¸sİêFedĜĉ­M&bĴÊĴAŽG8鋈•`ž{}ÏĜ™KH„†ÖÁìAÓ G¨T×UÒL™…Á̓“¤ 7pF›¨]¸ôیyü†WrÍ­ƒ0ĥĦk_ü†,ùŠY2™2àLi:t u3€-ıġ>„pE·ĊsĈR‰sh>BÉLˆĊvıç·ċŒ¸œ£'&½SkëÇÓ6}BÇÑ(Ğ2şLİ’IAÌ>4éişùĠÛ×b5_ÛE¨˜FÇ'O eC2‹3İz9* 9’- :`ÎħɸŭOÓġì+le™ÒǐÖf=*D§¤šŝTցKĜÌMġ.ü[fÑK&z’Ó]UĦn‘Ì;r~ĥ=ñfñ‹éĵIû9££’Ÿ2„¨uC¤ù@kqmÎŭR=6CG7F;ÄĞQ=F ÁVöUÛ°>ĉĜ|oAÊAY>PÙubM4 hâYgëıV1ŜÊUĴBĜEĴIµıÄ˙´šœžŽ…)²ê )ž ġV9PPv¸äƒaŝî÷+}ëĞŬ£§Ħm+1,BĜ4›ßaµÍŽÖħĈüP´#ÊDġQ;#EĠ<ÚËpMôżc‹n=iJ퉨駞0™{IÔx‘%Ž9,MĜXíîߌ^²dÏf Ì¨R–Ħs(ô4ë2€€Xéö&âö·{àŸdµ2äTċt4ġiä~–êʎ/ä^NĞoÁÛ üĞ4lbY§XcİóÊÔp43ĜìÏmŜāòŽ}°ÇJߢ”Ótĵĝ;™• Ce9\5ùla&GèÒédfż‚ÜßÛsL-Ëë—$èUXL*gˆ+ÇC°sĉ É+·kĝ‡0Í2ie€ê‰ež˘IU:ž‘‘ħÜßW›{[J\öĤ£)Ş‚° £K+$,Ï`ëĥĦ{ïnMĥĈr²â!Şİ1gR4uFĤ&y$¸dŭJÚ۞Ĥ7 mcAÒOƒ¨ž9†€ñS’|£`‚×7ĜmŽjéòésù_X$¤M2/Äğ ܝù¸Ċħêžï…üEájê<Ç/Š‚³Ğ3G*‹Ie½˜ †“ùqšŠĴ—tQ²İ+b RF“Wi*‘([jÖ{“f6zßäıËċċާhä†İ•]çÓ`v1ôÀ܃}Ċıa‰ó˙Te³Ç%2ÔċôzġLŽġî@ŜßAĦ Ĥ2=|ħµ3…šJq­SĤ~G[FŸ1;î6Ä4փ ÷x–›Ä˘"U L“*„﵁%ˆ6½ĝúħpĤ݆4Œ’cc™rŞúĴ—3‘c‰ ZY’Äۆà­Áżƒ{Òżù¤u0L²—ĦގœtċŽW’ċĉ7 4“½Íğ5ıÑO!ŞeĊı¤ıF_-jKVuÂ$ME[vÌUm¨ÛÛWžx²˘˘^ĴpQĥeF—Œp¤’–(tÚ;ÛqĞÌxÂf´¸óœğ÷Ĵu)PóD@ŽÒFË`K"kÓĉòískžçĝ’,ˆTVÊhᎢşC3ÇObö½Ï&ċE…Ï7'È˘°Ĉ–JnY™7ïiçË#—÷˜pbÌ$aeYšAıSÉ'q¸¸ï†uyÍ\ 5QxŞs"&˙ËĦf6@{†ġ_{ÜÛ#Ɇ_Tò’j%Ë}#Ħ…ŻvıôäzâGÉŞ§Aj¨úÈ ĈÌKĜ›Òâß Ĉ}/MÙ§ĤĤ9Ÿ0ĤÖ밅¤ A ,<²°äq~Âú,3†¤ĠœË¨)Ŭ]£§t˜Ĵ~aż6?1ÄÎôÓCHáq°êFÀùˆÜ–;sߞĜ²ĝO”ž&§–Ÿ/­HŠÉ­i^ÒE¨ĜÈJùşkĞıŜ닄ğ15K!Y\uù§ŠMDDQU˘ ^ôş JA ့ħ°ûw,ûöT2z$̚ş£:š¤Çƒ÷Ô9%$²ÊÑ*\;tÄÍa­Ñˆ>@. íÁĥ"Tù|Ġ9yŻ’F,z2ވĜ€T|×Ŭíı;^ĝĊŝ.Ò7’Ğ=ċÍòzĴĜD,,P½ô‚€P=|ż-ïbGóœÂŝËü?™M’ĉşbZ@ħŠ}GRƒ{p@ÒA&×aÖc‘ĠÏáHòlħÂK$EŞc;]-p˘-AK,M‰ħġ¤xÇ-ñ.QMQžĴjıƒ™:QS Ó2y–ÀżÛŒiKË1èê“)U4µ ôË,%ZD .F§ĜĜ:“+5yœ9tV‰ÚN™y–&Â~0-ĠTZGĴ”•P›Ħn6öß×Ú ¤•³`”É˙Œ´F^£HŞlH`{sż¨ĈSÄlÖ鑣¤£Ż¨¤Š´£aŞ^$ÛcnöÛ-dÙ6m•Ğ\*jŞI Ĉ “r?Ż™*ói+#O)e‰O—íol^<+—GVÍRġ <@ġ)قë+Ĝ‘b7>†ûcDúŬ”ġaı?‡¤Y+¤1ShґÇ(ĝ‡ğ‘‰ž²şÊêi[êġ.5Ş›X“ŭ/ŒÌĵE Ĵ"DêÈŻ­^+0_U Ĝqü°Nnô5Ù-5uDhĠ2FRXĜş#ĝo~F9Òo2&½+ Í,ŞCÙ@`uÏߓ÷Ċ†–™²9ĉ­Žx"ž˜/·•EüßOSŠòPÔQRµK@Ѓ¤‹§óŭ0Z È#sĵ0ÓU’ ½ub4$÷ÓÇ6ßިhëe£žd‚ES$@H€²ß‹ÜñïĈ$£ĦŒÁWJÉ5µ66m¸7îF,>ÌŭñM!HCĞÇY‚†Âà›úŭEıĈŸe5ÚFo’°…uÎ'•ç4UñD{_q°?O| ÌİŞòŠGGÓŞbÂMQ•+mÀıìC£İĵIĠi)ž4j¨MœS°‘Xvar ŽŜ˜óÚġu6cOGQÍRÏiş”WşìA>›\g.8eÁÛ£ÁaHÜ[Ĝó‰VÚz„ħ*Âàp…$wSmğqĤżÛY06,UÊwż×lc8k\|Öĝéu²–$‹­ÀĈÍîÁ@{û>¤“Ç9<‰ šS)'’mîġşÌĤ—%Îj(ÄíqH'QġP}­½†ûÈ|#CLµÖFùğù[2ÖĉÒÔSJ$žFħĝ·Iµk ŸLg'š&[4D9„­%4.ħ¤†ÀĞ6½÷Ĝ\íé{Xó€eÈĊY’)#hġFI;ܑéŭ7ë2¤jjŠZ*Ñ<îAY)Ûgk‘§Ôo½˜ħŞ#–:!—üEgMfI}%ö½ˆÜĜÉĊĤ$ÎjrA‘ċz›DĠ‹DħHF ,\ú›Ü녍ZÔ N²”D2İ$ŒÌŬ€c}¸# a’²‡)Ž“2ĞhÂ(r:ĊZ ì-Î×½ŝÜ`ˆ`㌲ĴŸ"5Ô0ğ(Ğ\JĊm¨3Úܓk Î4꤃܇ĴrÑËSH”éS£T,Ú/kï}½}}q Em,†)§–Ĉr“vÜ ‹éßrjLÂG+55CÔĈzr…)ÈQ`w'°ôĊŠêZ5x§{Π<„j^ö7`íÛpF0’q¨o-u-]rĠ,Ġ²/Ċ*ôš5îŸËħh• œ€ĝ‚JÜĈXşĤ&RAé7ÙĴ-ĊˆĊjŸĊ9DT5ġ1ÒW°•m´VPoż$[Ĝ>—3béħž ¤À#2jŒX>“}Ia¨ ÇŻ}·’{É÷'Ì$jiċzXSĞxşlv÷Ŝâŭ:0>&Ĵ`Ì·Š éö] mïżÛepċ•´"žĥ˘š V"/ˆˆĦĉċuoÈ>¤˘ÌóJĈGŞš†'ĝaĴ²oĉ{Çĥ5~‹<µôħYjĦFċYÀ#텕ùŽE2ĉµ$ˆGÌ{ïëÇĤĉž#GˍDı \ôŽ kÑaġĠcù_˜üGMX^žŸ”u4ޝ@ܓ§ûqë†Ŭ`Ò6_K™×K—1 J• !QáÒä W;ÛŜ÷ÛÓ×ŝüdWÌÉu%K@<ƒ½íŭ }VĴÎ lĈŽIèêyĦ܍Ld1&Ĝ1tzş*ÚÓÂ˙N 7z%Ĥb‰Íĥş›ú{Üc/ĥù2ÀA1Á6ˆcÓ:5ú5…f?ú܌X²Zꉣ°“.Ĥbt*THàİâú X›m…gġ4Ġ‚…µSĢÌl·ÙÖRvĥĜ#)#0SPµ‘5+°FTÄâĈàċm£D–ë,żPċ1E"ĠTĉĴħP6Qè£ĥ;Í+ž•k\óĊħbİĴèSŠ‚VĠ Ş–Òö!Mϔïùâ™G™IAGL˘šBH‘T–ŜRl/rnoí‹m&[Wàşş ʵ֎@B9‡µ\0µżö_ħĈĠ`m<2É4OÓÍ 9§¨xËP0$ġ;aŸ„(%­Šİ£š$ĝÇ´ħЃ`{Ż=°‘k%Z*Š@ċbvê>—o ĉU4bXĦ„J%ŠHı VûúŒg^áĉ™Ìġm<ÁÜ-ɰ* ĥ˙­°šŠœÔH‘ĈĊXi›[m·ŝĜżx£#Íë˘LÖ˘šŽea:!Hŝ&iìFĈ˙|Rä¤bôíObÇQ{[r.m·µħSĦĤš;§Ž)Ħ¨Yż K° §VÖ°=ôet2Ċ,s+FDK!R€žç }vÄY5’³Í2"È ‹6£Úêmê@úúáîdµG+†(e•îĦLD*FÍÍ·ħŜŜÛJ4KyŠÊ ˘•fêA…ˆSómżħŭp“ö³›S×dt1IFµ‹ >b#=ÏĥC›Öċ_†w=E‚14zCF; sß·8‹Ä™¨Í|;Nċäj•\ék Ÿ|W,’qlÁñêT8ñÒ%nUO3 ,Èb”ġd™Š€:għ·#aĥ<ŜJ9`^ƒé]îW½ÇŻ;ŞŞ”¨Wv.£{vûbv£êä’f?ĝÉ.ƒÛԟ+“‘ò·$¨8tTĜë&ñÑÓ<ôÂĤ T× Úc/}žNíkíéĥ-ùíŞ­&˘8‹żš6ştÀÛMÉâŬıĜâ£áêZ9²t“˙’Ûtyà{vÛĤU@C,‘† o#$o`Úç}˙ïú‡“ĝ˘Û= <ÍİXÒĵ™tUü‰$ħ‹!úßP7ħ}­…YĈgKšPµBĊ}úeÏĴ€lĴÂڗqıŜÄßq|Vó|Ïá¨Ö”Ȉíqp;XŜöçĝċvЍÖD*f[fö툗Ô9y€â ÖÊsˆ+£éPÔAAHELµ yòîwà]Ĉ.PgÔ´Ô˙XŻ/R"·ˆÙšÀ$PA$p÷½ïÛR~Ñi¤Èä˳s;*hR€yHŝ&íúnG<ÄYÊ:+! Ïü˙–ĥ"S_ê^Ĉùí*£2Z¨34fz„IEQ‚ór_½ïnÖĊ3Žşž“¤˙ ‰*ñ#ÀŸoCĝ>¤s³S²–*Ê oÏ?žï‚¨z:2â]FbRNAħġħçżĤËɲIhRÚɇh†ÊÀXŭ~¸ŜÒĈĈXÉfbˆóÍñ#=¤ 3–$#{íößÇ*BEşX(Ò7'·é•A”Y½n[G*Ç:żPy"a~‰ZE6Ĝ‹[l[ĵ?>[¤ŻĤ‰ë|IĠ1µ;êmokr£cĞUï~ÖĦAÓ³Ŝ'*çJé;ïÛüġĊ†`Ëëréé)ËÍV’*…=`żê3)7ómk Ĝ{ââȒ³Ó3 ³5¨ñ LU4™fc˜ÔP½dôVjIô––?ŠHqİ€âÇÛiâŻÏá<ú›,Xz‘F#g0ŽE·úƒQ$òwێ1$~#HéċË£|ıLĠĵİi*§`t2ÊXéĥ’ĈĝCS*52ujĤi)Ë ŬŠ“˙}[-}ıÔ)´E5ƒ*)zh䤑,ç Şd³jĜpŜ÷6ĉĜRa*ìo!ÒJ›¨ié†cƒİP*&̄]†£Áïˆié&¨’H G•ÁòĈĞâlŞ!‚D†B†hH´Š ż#ŽX4‘ d*ŠJĞ‘ÀĉŜž˙|YAQ•ĦJ„‹~hî£÷ħÛ~ĜYÚ_#K!Ž­7ò·Ûôħˆ”{ŸB8ԈLˆ£UĴ-qlIBŸ0½ˆ³ħöúñŽŸË gJ0ş€MĴ}/ہŬö­ˆ8rlÛ`—Q<QĠ°ۜ@à Ĝj#kwbŻaßĊ2ÓS)Ġ(ä­Ċ¸ïߝÇ –ĝ’5–PÑ˘³ħµ” ßí†_‡SOÖUı$ÜħîN,9>[%=R$ÒĊI5]X‹j$…×<ƒùá }P­ċp×,Ê+zaŒĠ”‘ĥš9]il=˜)ÚċO×{mo\D²¨aµëŸËTôµk …dtŜÀĥ’t‹vÌi’ŠwĤsyQ´MĊ‡{›Ó¤f5pĈ•SܕY$ò˘-ğĜ\4ÏİĞeÎcĤ–5‹Ğ#R2şF5i7Ó}>mۛŽp|Šéuo(ëĊۜX^–†œ¸L“ĵ„&ù>Pt°!mġß ¨İ5Èΰ*¸òC0ĥÛíaħ7ìet™e>xÙvq]™~ò‰é Ôı_+kÛ}ĊĊĴ{áƒW#ŒĈ¤Tİħ;Ûoâü÷Âö*Cqħ<˙l8ŻÊ:Bf_$Ë=[F…€Ô ë>mW'ÚÜï|&`½_/˜Ü[×È´í:ƒÓעÖ×ÇJ1jT]Ju06Ž@ 2(ÉMN§2ié6Uç‹[ï~ĝ*%HˆHÁ&ĥ´]ħ¸ü°&#n€ 6ö8ĉâĊ´èmŒ¸Ó£YıĜÁĈœ2ä÷ÀŠ:^¤òġĞ1·†Ì÷}ÛP<ïmħÊ.şIVÏNɨ†ÌÇż{{ahAÂĊ…ìOىžF@ôî5iK\ ^PğŬ‰çljˆ44D‘kO£SÙI½½0@erl6ĥ÷ÀşŜ×Ï 14HĴ.·Qü7ç˘,4­½ħÇú$”ŬXƒ‰u— pxħviÔ˘¸ıÛrG’ ġ2n¤›X’w8à,i:޲„Ĝ›âJUw,<Úğ4bċóĵĤŠ#SĠğÒÒ¤…^™m\óa~vیBO­-“7›z:ëÔfUiQ~ĞL|mŸ)…âüöǧŝÌ?|GžUMXjŞZHÖC²€IÒXÉûRqZ‹+'¨z:Y˘U8’9ÛR0)²›×ħƒjŜ––)sÔŞa‚iIiIqĥê-µŭqÑĊWż˙^YcġkSTUheŽM'K”`À0ä\blnsÑĞc1ĵe°ĈcxÌFħ˜Ŝ3QĴjĜël£XÎĝŜ2Û`FsÎ: ŒQŽñ-šF>³VŜ3„hf3ŒÀc1˜ĠÀŜ5}ñ˘vĜ_|AY3ÓÄ$EÖÀ˙Ĥ9aïß1j $óaÇ×`1˜ÌrZ̍|uŒĈc0˜Ìf3ŒĈb 玞'žBÚQn@ŭ0 ş%f ˜Ĝ ÉĈ+$ÛnĈüûàjİdĝ]PÂ%ĠħFm;ëÑĉ­)˘ï§ZoàíżsmPğ+ ŠÊ‡„ôúˆĤo$WúżÏċŠiUBıˆJúş9u˘ Œ,.  È+{sĊí|Y*b¤ÌJäT%;ܢ(a{n=͎f5Ù-S fjI)Ôµ+2’^ÊGĜ_ħµ°ÒšôĞf&†8‹ċµ)n’\ÒÌŞĤİ8^lû^œú`8ޤޤ™ş,€‘Ÿ Aş N!CpñƒÍIô;~˜²fĠôġµíyij‹Z˘>˘™:Jv+r@Ĝs…Rfy%}Ê(ŞáỈԀčżÜ ùŝĜĈU{ÁV8Ï*XĠIVdI q|Ĉ>ŸI°$Üħ½ÏÓòÊùê İjzŽ›iÔĴEûyŻqĥÛíßĥfġR"UĴ=DHÔ+$ÌújmÉä^àèlu”xhdÄŻ:E2u”rlll/·ġÄ]Ë!àê›VY˜ÓäïUO˘²ˆhœ\1Ü3a°ŜĝbĠn%§š`’‹Óü4d[Îä‘Àïl)Êi‚Ĥ°ġ…áf&5 ÁeßkïßÓ|4gzĜ)¨éVĦiÚוϒ]&ŜWĜ›Ž ÚluA&¨ÎMĴ–:˘Ë2Êxj%S#Ĥ .IbNüŭpMEBÓµ?PXLú&Ö$l Ħ£–˘š9+iꒊښ¤€oe#q°Ĝïsß £­gŻHĞ é!bħ 7,mħ\âĝŬ¤%óŽ]5Ħ]ĊûŽĜ‘…‰Ĉy‡|gÖŬ1yëC§Hbî%'Pdî&ÚI óZ–Ŝ‡ÂJĦ y.Ħ‰¸ażÜ~Xw]V”éĜF^ËşŬKžçŠvuWKšôİĤħĠސòX·İeMîmŒç7FñŒt /ŠÚ’ĥ1 ’[B(ŠÜ0¸ä@·›à\ÓÄQVRĊ*ORÔŭKi•Ñ“~ í{i8ï-Éé%yVdÚ QPêò‘o2İ; ħ¸òÈĵA_ñC, N·’i Ë IpEÚۀ6ÛpyÛµ'‚Ògù„¨ĉ‹á•écü6£×"7ŸÎŭ÷8àä† ŜZ8)bXE–U&ÌÀÜııûœ+Îü˜ĤW9ƒ'„”kġ aidşĜ ŽAżç€2ÑY“PU×S%[0hd,ö(!”.öV o÷M;eUOĉ4t’ˆc‰Ħ–ĤKHÑ˙ùÚZÀéol*Ê"JY~+8:ÙRO†Œ˘R,K½ïpEíôí…NĠY†KY˜TR!,ÚĴ„˘ûp–îN×8M5Y…CÒS˜ÔCE"]ˆÚÂÄ|¤‘Kbe&htûÑG[_˜ÖLjêH˘É!´hÔ§}ĴNÀâèż ċ°ÄÌċ$Em´úŸößéŠTT9ŽYQMW_S$óÈŞš)Eü˵‚é kbaĥĝıd4ı}= o–ˆtHĥ×: ]î=÷ç%˘Zx£ÊË…Ê0-5Aù™€ċ½vïƒb %ÄĤèU ”Zâ˙ßëN Œ°ÖEôß{zˆäĠdI#lNÇ gR)x ġ)Ü{|SrŻWċ™ĊNañ3Uđ°Ĥ×?PË­ Ġkß{öĊÎH’UÒë¨^öĊ9+.ÌĞr߉xd_…fML ˆçs{ĜLb|˙ù,”+`CœUÈEP[Éw6ack¨żíŠ.uáÌ˙*£ŠHjÌ4nî&”%ĊÛk8³môż×£Wûú‚ğĞ=V[VA 2ŻGˆ,I,OüvĊ+ö‰âÜÊşgÊ!W¤$,à÷ßcpĈÛ\g:ôòìʧ5ñN~*Ħ’İçF)ġMq¤é]ù6<ĥĦÍèòóf-s.‰£Š–í.›Ÿ;›‹óĥĜï(ÊjċÏLt´Ó a`eÖÚ:){b-b=oÏ׌Ó3ĦÊè³ zLÖYĉ–A/RJR²jv[“µkÛÍĈĜS°s§HóôxáĤ…Q*×3êjRŞnl4ïŞüqƒ%2ä9ĤşÊ‰`ރ™t‡Nä0; ‰o{Œ,‹M^•2IĝrN­óo^üpxÄRšœÒİZTy[V–grĈG7ÒO<˙ž"ĉe–.§QNò•M6Qqç\”ÑÉEx¤XÖI%$n ^ìoĈ9JgĤË)ÖµBŸ6öıÑ}‡;ߑíƒêZz¤ĦĤAkYşlo`ÄXž àc6g9%Tŭ=X­B²‚eŒêvŒ› KĊöı^qîĝ·ÂùÒ¤u9Z ġE¸dpmqa{ÛÌ-½‡›`jóWN&(§'gRÀ’;oȽğâ*ÜÖ8ex銤H„-LH#mÇ7ä^öĜv´5û$ô2ST+P<Ż­‚MŒ…ĠŻÂß½½&e6mŽs<}9 Ĥ=ĠÁînđħ#qK4ĞX’Ù¤V=6–EX…·ûßÔú_ECAiÊÉ7NÄhs!;•ħ¸Qkbâñ“T.ÌġÀ^oŒ5…óDÍgˆìo¸7"ß|wÑ˘Ş’6Ş3ġ ŒÏ+QıAçÍr·[ Żż| _—ÉA+TĵË%,Ŝ{JŒL¤‹êß{ƒsß{aAŠIVzİjPÄŻÊ yvúmkĜchÓÈ˙˘Ċ4ty]E-DUQË#ž².Êĉ+rl>–Ûl!ŠŻ2E§JˆİŜ"E‘À,GĜ›}ĥúQET!eÑ2jf[^2M€bl›ßßğ|’ĈR¤„²xġDGb Á ö>—öĊĊe‚ÔyY§’½¤ĴIVhe§v „¨×vÍÛżÛ ÎkTfšZçİ’iSA˜>²Ê×ı~nNjâk"’ĤžĤyŜN§QĊÚ×ôä_{^Äl9Á•cÊ*c^³I$şÄ…„a †ÎÇ~mşĤë*Ħ\Ó9¤Ž8b­!Ri!2ˆm§fŒ“mÉ#]ħëÌŻ’ċÒEN¤ğ–İìZĉ=\²¨ÚÒûcÏ<9•Óäµ)štÙú1+ĠÍLǒ ĊĴ7ƒqî1`Ìê ,ÒHU$ÖU˘vôüĴ,H`oÁÛs|aÊíׂy­ŻÊÓ1ĤİË Ĵ›ê~Š‚wlvöħçœ6„e5ÔĉÒF]ˆRB&˜Î×Ò׿pĥżœPóĵşi£ÑN$–ݘTä8'kzĴv½hŜa“ċéQ˜´fž=ˆ‚¨䋭É$ìq2‚¤ìušfıRµG+:µCAµÙb Ŝ`À[rpÄúÛ ¨ê™WYbYYbGYXĴD€AnĴ?îe’ç5ñğÓÁP°+¤LñÓ4 Ŭ|ÖòŽ>¸u6V´–qEAX +1 ٘İÚ×Ŝûú{bß°QRUTċîò˘À‡.WÊ­ż#‹“µÏé3š˜àÓ/Ĵf@Ĵ²ê%DÀ[Ë`mêmì1%SWԖŠ˘’Ž‘••Ĵl›ob&äÚßQÛÉ¢ĈŸ1Ó¤‹Ëo_í8yUy$ğ4ŽI°âE’ ƒmË-NÖĜ·ıÚŬħ== µL½ ħ…ġy·<§ĉF8§¤zšî.΋ĞKwħ˙7Á&SUôgZM0_šAĞKqŞ×Üú}ñÇÄÔFg4ÒÊé0+#8œòoÉ÷ĕŠÏàr ÛHì7çŝp~l"QĈ°N Ĉ6`Ĵ7,Üŝ{œ …’6• y{“Ï·×4$Gġµtċw#~˙|pO,żPñéŒéé€u=Ĵ£°ößÓLħSWh’6D^0ÄÜÛĉġÜïo|Uˆg’×TAÂQJšĠ¤Y#Ġ¨Ü`vÛߛâĊŸΓ£MTñĊĠ‰ÙĦFVß-Ĝ ZÛħ#M$ٚfÒÇ 1‘eŠ:YÈĴ.yŽäsżĤêVxž™İ:ħêÌç§‘t³ŜPħôĈSğkŞkFŠÊ‹—}"ÂכoĈÜâZŠ:¸²¨ë*Nˆä‘„hZĉö;ïżôÄ4³ÈÑKŝ¨pé#2²ĜŬĥöĥŝĝŠy^u–P8CYTݲĥçHì?L:ñ`Áċñ5N>£¤úú[­Ž  ıĜb2HŸ\Z$`ömÀ'•&Ûsßùb%ŽGRʤ äöîGfVVU÷6Ètß[şîJ‹ß < œ$…Jì.ĤücBÂÇcmìx8+]G8B.N(5ÚâöıaġÄùĤA™äéµ´rÇĦLs:•Ġ`l í‡_ Ŭ2 [üÖÄĤĥWI#g K'QĊıo[ŝx@6ĝì2ĞıP{slKHh)xéšMjC ob>ĴoJħŝ"ÊĤà–¸#ĥŬżçbĈäkzcĵ´BjŠÔ-ÑєFĥßÛï…àĈ9XȨ”jf“éÔ5XóÜr ĊìF;ñĠ{3G-8t˜ì@;ß~ûÜßßäùĴômŽÖŽa6–[ì7v˙|J¨kËŞ’*(ezcֆ‘šÑĥ³³½‘”—Z2iŬ•ê)Z)!ĥÖ6<ŒzĊM-†|EĞjbVeVъ˘°n9ëżħǖċ´ÍSU iı’UŒä“oëGŽ˘ij3:ŒÂİ!ÓˆZ™zpžÊÒ3 [›`I8Iµt9+JÊd´Ĉ ÄRÌLqÈP Ĝ\rA瓋Vhı|x†°µ;­éŞE<œ<¤i²ı܈îQg4ò<ÁİBzŽò\ͽ”‚.6=ûÛ S3àè3Úı"DiΈ„éPEË[…İۓĥ0ëtïE·{ĠfÓşŠ9ôG ‘ĦS8ı:žäBö mé‰3êšır„Ô„C$İÖ+ċıPB+/·Ì}H7>Ĥ2ĉ{Ċ%DTôѳREQ‹%üÚl-ss·~vÇ9ŭ43˜T%#YUDĈ[•&öâ÷߁{qŻí“÷…üi™ċ,͉16+>ĤUĜ*vı#ÏófJ\ĉIĉŒJ%Št¨fT²‘Ċù;sfí}/„ ÊwÔÖÖÔO5|{%"ÂX°¸†ħs~ۋŽĝĤĞ/jgĤŠM3ȍ¤a˜\°cفÒ6ìIĊ÷i+!Â=‹|ıO‡Ş›-ZËUú•Uê,HónĊ×H7ò_èċʧ¤Cššz¨zš¤* {“¸]'saéÎ,™K2naKY5M9Z$Ĵ´f]@^׸ħÁ'œ$Í)Ê=”“ğÇ$HÑ$wf 1ÔzV²‘`Jq½ĊNWîŠĵˆüKĦ.ħ•7`u; ï·#l0ËsT£ŽĞ ‰RÁYóîmqċƒ³ÏUÒdYfgQ™ÊĠC§G=äQÀY.v°ÚÜ îq]KQ=\OÊl·ŝ!s°?[ïġĈ2IšĦĞfżIISTİ*£ò]>Ûû_ɘE5ÑË-CNP—hÈhĜßÊ ĝŝıÂĝáİ5&Z¨Şg!5‚nMŻÈ'·ž;ĦŜFZeš+ Zò‹ì5 ;}öÄ:l´]ĉIêò(ú°ĠAé“ĴÓuƒyаüíkí~8–³Ä ñc Ô$}IĦ$/rx°Ÿ+t3%ĠK`ĵˆç‚nyĊ‘fêœô‰Ò@ĴòD †M\_ĝ­ÏmïÍñ.oEg•šXİÒ8–9äˆjH ò[l.=݌ÛMäJE2²Ú‰fœËP #@4ÜäëùâsS%-LrS¤ĦtİB Íıħ?ĝ<ŝƒ/†Ĥ*ş´§¨T!QĈà†âŭıûû Q(¨§¤Ž5Xĉd & `Ëky‰>b7qa„àĥiv6ĝŞzš*Ÿ”Ğ ħF<ÂÛ È÷>¸í3ÈòŠĠ|şĦ¨'š‘ċWIBşEÁğ)àöÜ^ÖÂÙ˘x¤ ŠšVhQIÉm‰<ݰßĝ†8'Iŝ‰ÒZ‰„ˆ=4ıb Ĝ}ñ\qqÓIž‹IûBİÍbË2*p)à1¤u•ÑÔ2IÚ|µhŜÀ°cÚĝ­ĝŻÂ™­iY´EOI 2=üµ­kÛÌw&ÖııÇ´ódÍD°˘K:)(#HuŜËÁ°ıĉĈĝw[QKRNWYEMMH2ôĜPI²ü£rl}îqÙÇsNÌeĝĵèe„ÓÏM"Íҟñ$¨bì䃵À$¸$w°Ä°Ìêф(:<ͤÜm{oÍ­¸ß|[š—.£|ĵċŬi&MpÇ N òë.î.B­SÖĥû[<û1‹7Ë&ŭí[>‚@XWxˆ÷b,m$S˙Èqxzċaµ,ÒÑ,²Îà/á8¸î5l;àz ‚^*šĠĈşFbÇ@7PIçħ߸RÒ$"4,Àmw7?KàŒ" ĥUA‘èšĞHŽBQúlKCğ\ ‹Żš÷ñž?ñe]wŸäĠ”!ٙaĤŽI ĊZG≅Żn9äcè°ıĜïÛ=•Ë%.]—˙â*"ċUl \Ü7`ĥ´ôñJµÖËĉ–+Ĥ­t ߅·÷Ċê,—6ĦZ,ÖXW/£²ÄjÖ0‘‘¤^û‹Ŭnxıäâ­}y‘)˘ ""ÄÄ Ë\@nO¨°IëfŞ4y ÌkeÊÑÙ2ĈğùB*Úöùl0]r6ò ‡JxsˆjE%H]Áßn-Ĉ,sxš'ʒš_4ÁŠ(aşG͋ßĜ‚YX—„A˘hĠP…e‹RܛĜìvßÔßf™cE'^ y%@šîÜ†ûrĉN™Wò2Êü?Z^:êhj451ÛX<ßsı7—sƒĵGCfżğê R„—Ž)nÀÚà@Ŝ×ÚŬħ6EWuOY„Qµ1{ÌÙ_r, íaknF=/ʗ(ËċÏk–„ĊMhú‹ĝ •í#“nÖ[vïÔ"òGwy<Û.§Žż/£Ĥ\Ê Jz’L½FbĦÓaŞ2£Û{‘ïĥÌİ#‰Tµu f^Ó,2VÓÍ ˆħßI6ôöż>§ĝÓ0Ékİä£vZXÜÍĤ _òÔZŭŭ1S3Ú4ËÍ:P$WHJšÛ³Ŝ÷Ĝs„ò†ž èĤ’ŸĊh%ÊeëS³†¨€É=ˆQbvc{qFñ}SYû1Íhêİcƒ…"xÌL‘jR G!­ÈßmáŠZìÓĈP6cT˜ˆŽIßHÖ£e$[ßùqë9µ44˙²Ú™Ğ?uMÁc= e´‚Ä0ߎHĊÇ ÇdVĦÊÛ+‡+ÌcJ¸éŞiV9$Ĵ†â94‹2²qr6#ÌÁUı^VÂzœSÁ.òwÒ]·àXynup<Ĥĝk—xjżĊËë Îz“ b¨U ÙħC{wïäTôċG0éš)~z[ş¸ĥúƒ³r,l<¸ÑMĠÊ9ì‘dusA×T§Z5ÙZ9ÈWÛsĞ{·ööKû@£™e˘„ÎJT¤ X\Û_ŻĜ÷ÁÉW4Ġ%cİЧ’VgAħ+¨wB›óé„,ĝ”ÍèdŞt]™ôġ‹ *,t³×ġ2–ŠŝG•Ząùˆž5Ġ"íc{_íŽBHônoŽ˘¨înN“Ŝ;{'Ó nTo}ħÜ aÁCÏÂ×çÊ?žA™ ²ŸRË+ȅ´ĞqòžoMË()b3ÇĠ€44RjAǕ}Nö$÷ǕÒš½:jċÁ:\ß{cèĦŞiı•BĈ*äÊŜ}}½6ĜoĝÎB’ñ=5D59dÔt‘Rş–?PÇŞOá#ßs¸ç\µ+*óÙìšİ£˜¤ŠÌÄܛoĉ"Äܞûaĥ}6gUQ%4b8ĠzE¤êİòİï{ċ²Ù*W.ùuD-´TÉfpn5\Úûú{[×·Œ‰hišg}95k +Óéӂ„ħB~q¤éµî9ÇFÉKĝ°TWÍeV[NcÖ{Ĝ"نíıoĥ+µĠġ4Ù|rOfHe…61Ĉ|Ú\qrÖ·6Áħĉ‘tRHbf½9eF sżqÚ×ÙĴ˘hÒC"ĠOS4a c‚•ŠÊğƒ{ŽÊG'~ŭÂuݧĝÈ •ÛIkJú™[ĝw<›’~û‰s8/cYĤPä‹t˜ í'ùíŽFgûHc§Ŝ’İC²‰ 2ħÊ}>½°œ›+cxİhŸ'šžVÎuÏiĵL7Úmv>‡ i-NšÚƒ e+,‘ÌĴe,Çu,w°ĜÚĜ¨Ç[S%CÔIZ£Í].F³½Ôì6>œlp VQPzŻşÈ!ÒX½ßĴ’ÑéıLĈf„&eE @ÒXÂçç%NÄŜß\2e‹.Ï*LŻH…!ŒXëaôq3Ê3şÌD°‡œu^ž˜fkħFvġ½Iñ5T•ĠħTTIĜCĞDD›ôÁ<ÛÛךj’ë7É%İ–FÏó…İ’ÚĦ¤K…ŽĉÜIìÛ|sE‘ hµÇ ‰4žŒqĦä·½ı·'/òGİX(knF"§)İÖ7`JObÇŝqŻTö*mU8dĤÊĦ[°‚kĤÖá{‘@l.1ĠñË(ÊsœpUc¨Ì²êA%u'ïƒĥ‰ …Áöh¸Ô§Ġxżátok›NÉñ”óD£P‘”Uó#_u ¸ßsn1è•ŝ%ËòçG†§/™â%´­\kä \ ˙M¸óézß´lÒ8éĜÇ!eCÀŝ-‰ĥ2äŠĊqMğµE•2wÎ2ρĴ’Ş£S#ӊ9Ċ`Eí` ·ßžçì— -1ĝZiŻi–BfBÖ˙sÖ;w—6’‚`1­R8.P0ôŜĉÖÛkwöĊµa›RJşÙ›y$èG¸ žAòµŠ h"Í)Duô‹{Yx=ìyó˙e_ ÓÇ23k!Ĉİm÷÷Ÿq‹~wâ:,‚“ĴòÇ,]TÁÀr¤üÖçaÏóúÌÏÄSÖRÊŭ9e²ĞnŞœÛü͵šĞ–…9ŜSI˜ué]᎑Ê]EÁ'KÛd ˜ÖÑĠQ HjBĦc!X|˘ÖÛUíµ‡›1¤q+3u%×KZǵŽàooÔa'†³<Ñ3C5:T°~$pŬ@ÚĊ­ŝsëŒ]mèÛ5‚ŜÊË$…@ c‹?†Vĥ,ıвĝÔÂçN˘ ("ÌI$p/o+r_AX›ˆ|QYSAû?xÑeÌt6“k6Ûë‰UĜn4„^-γ\Î)ċÌ+^F“KUPX_Ë{É·òßÊ6xÒĴk†E%M÷$mħ÷80xä‰&:€.Žıî‘ÚJĝ˜3: P¤€@ĥà[ÒĝתT\¨EVµéR•ZmŒÎÚ4~î/ccliêfÌd–޳Ĥ“ÓĴ .ĤC¸ ö?NĜĉ Ó]Ñ˘ž(„ħ‡ñ˙vŝ›Üc ;aBÌÛ>™(s4…´:iĥ‘nÇÔc3rk<-Ï,ĞÒ!´|WS×ĊlŻ×LÒİQ*Äl·osƒ+ïMOo‡˜—"çQ#›ï¸ż·l:Ş D]+×M,Ky‚‹½ÏÓœé"‹ëĴP›‹F¤}ùooKb:Jsáêf¨Ỳ‰€¸Û‘íK˜=l2)P‘—Öpv/KC—SĊ—QI/Qƒ·uyPO)ĥŬğáÜBz3ÀR˘ µQÜrlüß܃„™&aÒËáĤ7Aı‹Ûôú`a›S]–57Ö ìk}qĈĠè?ĴŠ˘İMqÈ9†KZ1ÚĈölO™F´î;Hça§ġ_CQRÓ̅˜îÀ¨°#ÈÛŝ0U5O ³ĥfŒ›#l£żĥƒT…“9ú’WCĴ¤żôÀ4I˜Èe¨6!·kŒ>İÊş—â‘HBÇeŝ.÷?nĝŸ.óKŻ­cĊÂ%Žö°ß×t7òW‘FÔşHĴàŽa277ËôĊTĊpĊ‹h]Á<ŝ,[*2jš*ĈĤ3żĈ§{6ûÜz#„2Ó†cJjEÑÛwߏħçvħDš=ÇG‘íİHĜpyÄ5Rôȉ  Ì=mĊÏkâJu,Yä‡Îbçkqŭq#SĊS*0@[µÛĉ·§öĵäĤKG\­ŞL Á…˘-g`{ŽĜ$¨0ɤ­pIk0ö½l&š­I8ÂǤûî,}‡Lċò‰j f§SDÒf[­ö ­Ĵĥ+ïl,¤U”É;2,ìnò-ÛùàšŠ7‚ğµıíżÓéüħş*i³*³ôìQ|ò4fÚöż·l3̨ĉé=DL`Rwòé[ÛP<6ç·ôwb@ԑÓAzi%œ6‘m%V×Ġnçœ7˘ğĞó*Ş\Ñ2ġzexìŠîĊĴzksġöĤvœß3)$³^öÏĥ7G =,’LʎĊ$*.Qx'kàê ž’³*şY¤S´Ğ`×ßk{z`„†:QQvıÛï‹G‰s˜sjè’,i”Ĉ%2)Cm…€P8ïÜâ¸ÑJ°ĈFÒ9Ó ½˜ ˆŝĝ ÛY "&Nލ!΀Ûöŝ0É#Jԕ„ꀓ{m߁…ÇrdfĜ[)”ŠŠfĤf}€J!%Û¨pEŭl äyÏ2ĊËÍ §ŠQ#G­ÙŻĦ˜nH¸÷Â"IKUże/‰iièKG4şŸRöáy*}hċôcˆ˙ë{ħ½ħpĠ™í‘ĉ"û`ĵş0î|ʈ ħfl.?>041³·ËpM€Ç¤ÒäÔO4U‡Ħ<1ĞY# k‹µ½#|t5òRbc%3G¤••Ż{†;~¸î†Ž)ÄĞ-LTä&²dKŜÄmġïï‰%‚‚r҅‰ÖĴ–e›\Žûr=p<³ë.°Á}Cv<ïĜ)76Ÿž%=Ë2$Ìêx$ž (˜µZGĴS |òs˘öŽCá<Ï)óÈ*2ŞĴ¸Kf(  #´ †ˆ[ß|Kû6Ìİr|ÎS˜ÔÓ|HxQİÊÈ4€uG${ïİMĥ+ÜbÏíh?fï‘ÑÓÏ$½)"yj˘Rş ä;ywàƒkĜb˘Ş;!ĵÑH‹&\ÂşŽŸòÈÒxäœHó4q,o$yM†Üo|4[˜ò„-hÔŻ˜ ߓĥÀó°À†Â™bzp\C߁üğàċXé$j˘B½V†ÌUH)îEȵĈŭ îlÒ°ÑÇ@joO ×j€.5XÛÔátÔÓÇTË=ÒKŬšC{žo~˙\\`Îr*y*İ)ò9×+ŞN“<βLÚJ›Ğ‘ċm·ħŝ/aŠŬ{.mTrĝŜ*@䏨Şöç…t5œÄÓYiÔšƒ‘ż#¸üñ„ëkEÉ$.XH$óĈ&Ž|Dd"-Ġœ·ÜmëĈ c¤ 'O{ìqÑK kÜߋ`á C‘ÉU2KÉmVÔċħüÁÀHe•´²I mĤ(Vb¨Ò îçôéòo} vç"Č5ş¨>›•úâS&Ż%;>şyûâ)$oĦ;JÏK"H \Fv6ôöŭq™)üŻ-ğĜ‹ŝx•ŸTĴ³ġL‰Â™6żÔïŽZrğG1o˙†ßpNÂİ‘y‚àĜ@äĞÈÚ8X[œ2ĴŒş˜lX…ܟ\jHë0DҀ¨ X›zûàĞyMXf‡R‹†ĥàŽGÓĊFİĝÈ÷1ŝBlŽx7ò7IJSĈ•A HèÑİS"@žmoC{a] ÛKHÑĴ [é‚…V 1;ĜŒhÒ˙çtôk_Ÿ{dá=™[.”T‘PÑCK *¤H–'ĥ6 À8Ŝ/A³œf:ĥ2Ĝb£›c-Ž­ŒĥQÍħ–ĈíŒ 9ĥ3[l£ßvĥ0má%F†7ŒĈaf3ŒÀc1Ē,h]Ĝ*ŽIÄ/Yp™šEXÁÓsÜŜÖÀ&ÒÌsŠj)…3ÈÌ5…bVĜÛsĈĜ‹>ԍĴ‰ ÎU- §şj6Üzo€slâirçj{>ċ›ĝ;‚o·7·öĊpÊKB•"ꐤ/m­{írxż|c9Ó#³=$ÖEŞ5n Ġİ7z“ŠĤmšPÔuTƒĴĞG8$ú‚6e6cë%–·,§§‚ĤÒu:]…Cw>e=…ìxü°³Ċu V4˙‰I‹¤KîÈuĠ͸;ûûàċmD”†T —$¨04²NŽÏӊgħ½üĞ{·ċ^4’£5Ššµ`A6Ê#qĝgܞxÇ˜Żˆg—1Z:ÚYžĈµ²o/}ɰ7žĝ+71~ñ – ğŻ•Çá°;nHÛmżž2ŒĉL­#Ŭ^E@˜ġÄTÓ´ŭFA­ħŝïĤ<’³?­Z l²Ú^R]XËueÛq{ŸQëé.Y~|2zJ(Şéê#¤’?Âyím·kì9à16펈ËĥBˎ3 i3dŸ4ž’‚Â;J ÜiĉŭÛ˜Ó³1Ĉ´2hÔ5}7ŜĜ†ZXej…BË÷6ġ„^ÎdŻŞZĞG#éöµ·úŭoşt‡“UtÈ…ŜÌnğ`hĞ—Ğ€gUÜ£qoĥ+uU´= ´‰r­wħÔĤ˙-ıàrp%ZU°G… ŠÌL€ ÜƒuĠĞ}É;Œ8Ï‘‡%·OG9Ċfh•Ò%,SĞtä”/—UÚ×°WM™ĉ2ÍO;ËÔÍ&…ˆ~ZäÎö½9Ì3BKĵrk ‘-ŠÜ›{ám$ÑËH ˜áÒŬGh×QĞĉÛëbĥüÒĉj_ PÁè‹DfŞUé´t’yuH?­ĥż€úšŞY.~…%-| ÒôÔ|àl ÚÄ môß òœŬä‘$jx´‘fê666°+µĊ½pzx‚ž’(¨dDî’[Ĥ­ÓB7܁ċƒ~q× )ĈћĤ)ñ4ONWÔMI4ĦèĊìov:€ş‹‹0ôħÀÒĝfŠd§ŞLÎi*g`Ë1e,]ǕxĝkU˜üLr6_ÑŻĜ,÷@LGMˆŬš×ĜñmÎŞšÌżàó„ NÚc2#:ßk ŜàĜ~qzĤí˘{4°&˘†lĤyhj–˜’4Ĵ+R6BĤçÌçm;ç0ĉOS–>ZħPúµC)lĥö&ŜŜğáŬ_…sŠ–ĥĥÁµ*4Eˆ"À\“r;ı·8ŻÏt³À²fQID\MI}L·· H;¸;_ò‚‡ŭ6Rĵ0ӞÊLÓG@ĈĴòŠşb²÷<{×F²Ç˜ğ­,_W0hâĴŸL2Ä76=ÉmÛR ÊLÖŻ.­§Sñ°7NĤĦYŜ1{Ù´ÜÙXXq}Á´šŠ|Ÿ4´Úe¨bH‰şeŽûƒk‡vµÉô8K‰%mÍĴ!DgĉĤE–ŠYÑK ô—pVÀX{ží…IOœ|,EPэ- •)¨íÈ_½­Ü FïKXWĊ—S ħĴ¤ ìŬ‰µÉöۜ“½ˆFgE$NÈèC½ş½‰fc¨ìwÛĉÄĈEwKaġ€Ëjg–“)¤"žD…Ğ'ˆ† ÁO mĥеšµ˘Ô‘AğLú…•Aù}ĝçœ=GïF*ïQÁ(Ös(µ€›ħïöĵ‘ M ;SµÄë˘N˘tdÊûW}‰ÛǍ7ÚÌe7T1Ês h‘ieWD˘XÖFÛkz‹âJ™Ìµf4Y Qsbwc3SKVY<ìŞTé-µ$ÁۜYY+ĉĝzXM4Šİ"ó¤/#‹ïnĝ¤ìRz>£Ÿâİ–pZϸ …JûXï‚Wc|T(ĵG"ÖM˘x&•DEܒk\v;íÉĊıĜùZÛâSOE$C˜)š‘„v2ݍ™ıìv÷Ċ*§'ĤŠŞ9@Eżš5*· }öúb#ÒTŜQLÓ?OÈÚ¸7ĜÜa-n¤ŻZz¨JÂ@jyeF„*îHâ܎=1—$MîÄĈä™Ħ†14“ DĞĞvŽÇs¤\w>]ö •Š—'ĝLÎh`+ԕa,f• {‹sîHÛl(Ì`)s·£–éÄĥGĉ m.-}ö mÇĥ ˳ äÍc‚Ż1‚˘j[b JĜ’ kÎç4U96dVPg¨Ĵv:ïu˜‘a¤^bß|}•ŭëšG0ĵ•1ŞĦi$,CHÇ{€l\”UUĤD#Ĥ’Jv…ŜX•am¸v~{ŸÈß ĤÌZŞÂ/ŞgeXĞÚûol0ɲùk  ï1—[S@ôîËeÜ6ħ ƒµˆ6Ŝ×ÄÁ4ìtz”U9œÏÔÂQÂğĜ"iÚíkߟ›ŜĜ´%TIS ¤AĠN°áŻëm½öôÂJ(?zxq"Ż:jbÒHJĈê‹i¸Sck_ƒöÄÑg“ËFŽ‘Žİ™bd(F€×Ŭˆkŭ=ñÑ Ŭë:Ş*J˘ê6î9Ĝñˆ¨3:jĉt…Ž´Š2éeSĊÁÂx ċ€R%*;–Ë)Ñïȸç›§Öĝ˘Y2şh^šĦéĤ-µ"@$m"äiQċ$olOut&˕esÒè‘`êӓg‘Xy7äO~ÖĊK;ŞÊeZñ¸ĝéR2ÎÑĞ(XÎd?îäĜ‘éŒZê O6\$¨Ğ- Ŭaq,¤1ó ê°#ûv ʌÇ4ž2 :t‘V2ĊoΝmĊ­f·$ûavĥ Œ|I†ŭÊZ*:˜(Ş`ü*â‹!kŽ4^ër-sġôĊN‡÷HÉV›1hê&7Ža@ÍGplAó¸#Ôol5Í!(~1’–Ĥµ™cƒá§ )£O•tŭu\oÈßËò|·.ÍáiŒĠ5}(ĉJ:فXˆR.ê#{•z‹Pm’äaáüş ôËşôµ5oĝĠ¨Xv‰ò…"çħ{ Q|WKġé ½=,C§ ‘ΓÜokßsJ›% tŻ›VYOO:,ı4³É Dáˆ@a° ·çŠ7)k₋,§Šžž(šj4RÒF##b,IûzŝxiT)‘Ĉż+(°D´EO&“#37pRû[Ú˙ÏC$ –S+7Î;ƒÈ·ŻêdÈ TĦ1 /D1EúïúïıÚÛáE4O=lĦ&Ĥ¤Œ&ħ­íŻ€£ı&ü~˜ÂĠdêO™ŒĞéIĦˆŬdrl{ZŬ¸ĥ4Ġn) NĦYŻ=W'ĜŽĥĜĉŞvĤFU{Ê/ò‹ó×/7ˤʳ´§‘Ĥ&>Ĵ[X€v7ìÇôÄâècJ<ïà` ^鏑CNܰoï‚h³8êʅ½\†Ċ#‘íÇ6Ÿŭá-G$4µ8Mâi°}BÌ×*wâÏUá)×í{˙lrמJ…ZıI1‚™ÚÀX…nŝSż˜­¤½îŠĵŝ:̌Šw6àÚÜßĝħ%^} fmN'žYFĥHŒÜYĵğ˙gm·éwŸĈ•‹AYEİÑĉx4ÊTj7Py†‚o½ħ_Lµ&i[=>‚]w×a–eïġç|užMMW--&İU5jhà T›mݏƒ)âÌŞ*!Ĵ7¨4êDrI €£—!†ĞŬˆ½ŭĜ"’i–óŞ~”4sċÊ!(Ġ+ĈŻvVo(V·"À­Èß:´é:ÔÁb¨£NbÙԂTùÈĈÀ\žÖÛWeġô´ù}lµ´Ŭ‘âVxˆ„BÖc# µîÓqż|TÔÉ0…)"I^ŽEp \—éĜwú m×ĈfsXùœO?Á™Xağ"_q~ÛmŠƒ|Lt‰“™(c}RS]„bN˘N×·|YezĜKĠĞ£ô`HĤUÒÁC`E͆Çqż8ÄÓS‰Ż*B&*Ğ2¤żŝ@£ÌP|¤\ƒ{^Üb£ÙRÎİŠŝ1` ĤÏŞ‚‡0Ĥ•îħÏ!Hş ‰7#}û›jĥĴŝs C_.É#:‘Ôİ:•mĊ­ĈüaĈI˜WfYe,ĤššÚYuɨJìnŞvÚä_ŒhŬ+@ôpĠùÄĵäôykĉd4“T9~İùY…Í€£kX_Ĝb͜Ò-KKGOV™…i=(ÄLÒuK\ksÈçk b’ı)KL³âXÁ7ORĵ`ߙŽ‹‹i"ÖüñdĴ5yvNżĵrÙ54ZŠÒıÓuԄb.Ĝñ|sNv›£É İŻ§­yĉ‹ât²™5 ˆÀá öXmíˆêN`°HŭŠÔHQef³0ßkî ½Ĉ= ²LĤƒ§]–‘Äïˆò%üÊokîğÜⳞdùìUtµoLfyX¤2Áŝƒ-·‹aħ–ĥ&)­Œôĝv’/ ɟg9u|Ï$:è‘$fN™²µ÷Y€ñ`vÂĉuµ$†E"––)>"I¸:˜W!‡/ĜM—ĝçÄi w]‡2‰0Ü|¤AûᤴZ™2z„Íòš<ÂŞĦʜÂEÓ%ıÑċ·–ĉö÷ŜĝĠ5DÓ(“ÓÍM/FĤ'ŠDĈ頎âàïGó†`4‚9ÁS:f5Ż x ħ 1ò†a°ôÛeù|9=A5´ôġ&´ŽwÑĠÀ6µíäbjÇ`Zş:ŽVà·­ż!£ĜaġÇ.P!&E·ÌE·Ç €q·b0Pì6’–ĠÍSŠ}IĴ3öÚnw'‹Ĵn7ï†4Ôֺ͛ÄĞÎnÜèOĞŻıÀÙ¤…Ŝ"SÉjĦ˜ j7îyÀDÂ|?9˘ħ™$êÛWĥ×$cŬżp:Ì2§Š–xg™â2tё…Ĝ‹jÔX¨îĦMıÇÏıkZĦ˘žu ¨ıöl_§ž˘†™*™I’]%ÙĜ İíĞ>EkŸĝ{(ßìê˘Ş‚ZİşBU{Ô›Ĥ[ÏĤ÷6rx#œ˘ L×÷FU4éO B•‘bĉúî[‹5‰ĉ׸í:›?\!ŞĤΣZœÊë™ĴǨ‹ŬùtZÀ.ÛïÎċTQI—µ}Rž"FĈU&r$h?-•köñj¤é ̗Œ˙(§§É*Z)â¨jaO ¨ŽCS$K’t(…ñKñ4ԕT0VSK:+Gµ,‰˘1v½ Ü‹Ž×Çuöm^$ÌZ¤CZ+“¤ŽıÄ ŝ@µ·ó-Ï,Ż<)Òx˜¨Ĝ-½·7ï„éğŸÇÁuı‡†¨d3Xrĝë£xé”(i˜¨$0ÚÁuZâû<§ĝ’š‚ž–žĦóGĴ¨~£I ¨Cs{Xħı}CÒĜ‡.ŞŭÙáݞ)%ŠJ~Š$²uj ŞVËĉ܎lv7À9€ŞÌ ‚µSĴĦUe kÙX‘µŻµö; Gˆ“ü‹'„gÍ>&zTwİĦJRR‰Ġêġzj˘êĈûĴvüĈ’<×&Í3Ie‡.êèD§’GFŽÒϤ‚u5ĴÊ={ñŠUŒ³ ĦÔĊ+FŜ`V2¤ ǢâÂÖŜü\XadùĊVe'ĈĉuSĠU1ÓŞg.\yù{n1<’üibîÍWĉ³µ8YÄŞĴïċµ”°‹XmĥßÏ fGĈ7°f'cżcĜïŽĜĴҊ‰˜ŬŽĤŒ¤ú ­‰š `èŝ-$‘ĥäÚÖŜŞF´11†'hg˜ôt;ġ‰F lÜ,=AÁġT&­iêhéĤÑÔA /r/k‹îĥġ’ħRşÓUêĠ½É7úv>ĝuI[[Dháyè`À+kĞĉĈ÷ìvÄ4ĵƒĤ͟7¨iÄ gEXɋR'u'Ĝnmí‹Uq½°ÓKM"²ÄdXÉi-{„]ˆ \_Ïet4ن_iċ4•…ž2"ò ;2ݸ°'ۑßÒä¨Ô²\lòĊ)X§2S~×…Í­n1Ï*ZĜMU,t³ÖÒt²ÙäÑyO”v°U­}÷Ü3-—<Ĉí(T,QÇ/ÌĈê ÚÄH½ŭ1UĞÊ'Ëëèè>.ôóË1Í"şjĜ[[ö$XocßĞà̊š†<ĈĤ­ÚieX:Ñħ2A¸m"È/µŜŜĝèRFstxĉz*$y‘ݝ‘ŽŞZ…Ż û{sïŠÊM̝Hüšµô°#ëÚĝ÷œŻ5D˘•z Ż!ž4X l“¤Y‰'›“ïĥ<~ż)¤‚š‚XĜŠÉŞ4TK°g.l\nyö½}ŞÂ.3M<ôô/‡¤‚j­JGP0CrlÖ&÷ÛÛRӘiÂÔLfÙBFᇠ‹_`FPɢ9 üKÊCj7ßêZÛñŭñcÈĵA4@Y$HŒÊ‰0ÔĊvħ7¸'ӛbzÉá"ÛIäQU+ŠÒŽó|S:hŒĤğò ˆ ñ·ż8żäß³ŒÂĞ%ĝùê*ċÌE^…4‹DÒ Íğ[¸ôêO Ï_"K”Ĉghœ4Â0^먂GŻ'nqiÉêsŒÉĜÓ)‰àĠ'Rj‚‘Ħ'„äÜa·İÛ|mÁ%3kŻÄq–ĉsËáw˜°ƒ*ƒyˆ›ħ'ʂ1Ü Àĉĝ¸ĝZ³0‡)Ë&¤Ë˘˘Ë&~¤ÁUbğ†Çb$›[aħ8ׇèë"ËŜ´V–ÍœiĦšet¸[7 u)=ĊŭĴÙM3UdÒÒUIò—´é4hHàéuK-í`m·ċù'xF0dkA˜ÓfPġi™™AħÔ¤Xŭ^)ı_Š)i(bµÉ8pĤ2ştİâÖ˙³†”^$ŠĤ™Ĥt ĤMĜP{ŭħÊıcë4b‹/ Ĥyš-DħĊÑjc ³6:‰k›ĥ-ñfÓ|½ío|S|iW™CI[M,ULŽuÍDşµ­Ħƒŭˆßs¸ċÈäN°xÎ[áYċŞŻËƒMPtљ4I( ‰=¸ìp§=§Ëè<@ɖĠ˜İ¤²:¤ŭ@lEĜ\‹‘Èìps›ÖÖĉ6ÌA$j!1ĴaHĜ)۟­ñ7îÊĈëÔM,k“XĤ-f i·!¸·¨ĊJ*IâÚÀĞY%-UFv&Iš6:ŽĦaÜÚÖߐ{b͗‡Ş1ċÒOQDš$2N1eÜXíżßlî­ŞlĥĠ‘,‘RĈĤË'Èêŝ+¨½½ħxÈ2ŒÎĥ–™·Ĥ–‘ë"’2ŽT[@7½ï¨ğ-팟ĥ½)ĵ& MaIŞ: jpJ¨:PĜ1í†óĝç2Ż˘9=qÂħÊ&$jp@6'Uïıûmm°š·9¨+‘ÀVRĴÖܝöġġœ@K:´S‹\¨&×ġäcò>·’J\ĥĞ0•äh†(c2I(FdTà’ç iäË£ÈÄyŭ6ş6‘¤£evÖîĥ à ıߜ1˘Ëi'Ëe†ƒ6İ‘³€B%ĥbI ~6żġ?ĝo)ÊrfÊóıèjg‰–¤Á;£h‘!SĊï}˙,j˘ĊÙG—ÒeYÎ}L™._"u)j&Ġvċĝaü vǢxЧ!‡öi-ƒ,‡0–1"CNŒĴdÖ,Vâö°77یHÙ?‡|7û_ùÊÒ:Xe§—PIĞ;j’@żċ‹?í&–†ĉsŞ)‚µÊ†`u)Óê/ĥ+H~Ş!•$™VC”½ u(ë)ËNîNݴܐÄùn ‹qċ텳ĠSd_´hĤÒ* Ŝ3DR,sz2ö?)ûŸ\$Ë$Ğ ÈrÚĤ¤YŽ&†4n“+mq¨£ ì[H# üC$yç†%lÇ+Ş‚üı)À˙÷RNŬ½pÓ'Úe+îWE]QĠŠÙg³ë‘•˘KîÁ‰°ŭùǙ~ÛhòÌŞš€ċ]’c*L‘0²“§p£eïĊħmLjrìë'XĞè#j•kO3DŒ ½ĥ6ĜÛ{sÍħDŭ·ÔYK SF@„(W’=‚³(Î 4C<Ž0íĥÇĜvĨ ¤ƒ{ò{ b kħûzیr)>kHüĥħ2|ݰ ¤’}1 0é+0ĥġħôĖş¨fplA{{cF=;1Ü),I ĵ,Yö™qöÉ2y*u´UqÑ,µ0FñüQtSQ£CşµïŞûùb Ç:ĴĤËbe}=eĤƒEµr^sìN,ÙdÏ]•G_:FİŠU˜6ÄÙoĜ^Äŝ¸İçY]Fi_-lġÒÉ+@i@*# v$[k{íŽn’íÔX*ġݘçF9#2L: µÎß;¤IĦ”ÌÏ ħÎC0-m—ğî1c¨ĉc—KFñ%KĈ’TCRCÜ%…ğĥ;a#NÔJ”­KT ‰‘<Á£;Ä^ŝûœláKĞÓÑ`êYa 5ĴRşád¸u^×ħ>àqÎ lĤĤjéĤÁ2O&°Ħ´…ä0[qĜïĈG 9ޤħ<Âf¨ê[Ä˙.p\ٗW5J4fĜĥ¤~!ۆí§8Çú5-ÓE3CA#cĞl­Ċûž1Jš3:0x“áÒ1Z6\_ħĠscmż<8É(Fc4/!)G<†¤—µĊ"ĉçbÖĝqVìö¸³Ĵ²NÔêòüˆòcíc½ŭħĴÇD´Î\D1ê#ú_Ô^ĜòÌïÂô>^ĵÔrU˘¸çĦ˜ìdĥÓ¸SüñgĥmŠi˜IšU0€…a ˘°†?8Üm{s:ŒŠŽoZµ_µ¨¤"ZUĝ¤Ĥ"IJ›r@×Ŝ¸ôĴğ6Ë Š:LşŸPatŠtö`@Òmnqµg-ŭİWGgq)”Èj¤Ÿ“S ÉíQĜcrÏĤyïĵC›Ċ4w‰j­[S lH˙ùvÀïÁ²Ñ$ù³˜êCÑÒ/+‡\‡¸,-aôÁÑPDcCN˙2‡_}ñZ Ï*rlá²œÒŞyK\rOb…ġY€›X‹Üò7Ûĝ‚žŞż/Jhó¨ĞŞ}1B"G'PkZŝ¸T€ ĝ–sO56IDDhB›8e•‡:oĥÛ^×xwPf5³Š‰şB€ŜF2ġpMˆ ï½í†ĠYMNS–Ċ–E[ NżŽij£ ”ĉû›µŽm÷Ċz–˘l–³á£x+žrRġ# ŻSMıä€é‰QÈYrĤ§†Lë§áùĉĞfBÏ)”Ĵq÷ıÍq}"Ĉ˙Mñ`§.dâr-İâUHÏHíeúóïˆèèÛ.ɤĝš£]SĞâzPVàmğ^×ߓì-‡í04ÂY Co˜X‹ñô8Ò+…I•O5X^6yiïáĈl§‘ò‹Ž6żlxÜ0Š,ï2ĝXFpŽĦ‰;6$żġŻÔÑS³ 3eÖä€ù$öġǖV×ĵġ5ÔÑÔ,‘FŞ#`׺‘~G#uBYcïµhĴŽê֖—Y<ñŞıaĉÙm{qż=71ñ ÊráTäP Xaê&ĝ)sšŒÉž£ïyàv%¤ñżkïÇél[ójlúŸÂ4yžQGIKF#cXV2˘ƒpàNŸˆç.j ĉwò*Î3 üë>|ÎĞèE‘t…[ù@à·;ß Ş G]¸óFöÙ­ü;_ëöĈ¨aŻñËÔ¨‘kiÈ-}÷b} çÓ s¸Ö–)$ñĠüHÔM<,‚NÊ8ßmŝ¸ŠµoFʖ5uMġ)c’“C8•[PfïsĜŭpĦ+#‚U•UU ƒ€÷2Ëŭ0ÁY-#ş$Ĥž;j*PMÀĠïé|1Êêİ#zy%ĤXÊFÈҁ¨ìÌ÷í°Ĉ4’6=fI颙 $jT0ŜÖÀß´t7‡İ˘i*ê&ao@Ş?ž$‚C5=+1$ĵHĞ÷ö„â ʲȎ`¨Qn4ġ,~ĝˆĵ‚)tYyĴjT‰¤˜Ö5#ak›ž/˙Xšš&Ò…’èĊ÷°˙‚?\röĤ0ĠRFÚ­˙‘ ‚-ïCú_ h²úÙsz•Tô³£0hb ݏ?M·çä zZNj5˘ŽjgIuù•·Ġâ ëïí‹hòJiİ£wˆY\FE–3µüۃü°šşž*:Œşş8çÒ¤ ]Ó[›Ó{½Î ĝĠ¨–Fˆˆu+rĉûŸMż\DĵcşTĥjóĊŠŞÁ[…äoħ½¸÷ 2‚`ĝX£Ĥ*Íxlncżò÷ÀsÔĞš™ á–RMƒ)ċMż6݆Ż1’˘š-`‘µĵ ;XvĊ%ÙĦ5dÒÊXdÔÄzciäG‰‰ıöHĴ芭Ĝ=ÏöÁb&ğ1Ġ`@ 9˙6ĊPQ<53ĜFàóY—cobD˜ÈŠV$2sÖ˙=ĵ!1…w6½…ĝ‹ß~0oÁUĴ 9 ”*·²/żŻo| *‡ùF]fï1ŒYY, zêâŝĜwUIX)#UĤ‹İ +/6^ÀïŠ5t´ŻĠ…ÉŒí9EŻnwĊĥŸÄ´—ĞIQ Ê„r)ŭ•OqïŒZkB’hÖ_Y$Qš Ü%Ż£ĜáŒbJhcoÄÓa¨~=H˙7Àµ4/I ŽéRĴ˘àsŒÌj 33&o bvç^0Şô&âXjşŽÓžQ!ó†· ŸİÛûâ—ÀKQ24nX@cé~×ŝĝĥUĉŠG?MáŒjŽ"…Wqßż#ž?<*İÌ$Dm*X\˘Ŝ˙l´†„ĠêĠí'5ÖÀ°áGĤ¤ŽWŞMPu)ԐەlI\IQM,n ‹ĈÄöúœrµÒ1„É$Úh´ƒpv<ûq#˘°cÄW@ŒŒ·”²é¸&ßÏżĥċŜ‹4’ŻâĜ‰ÌdĞ! İô>–Ŝ˜Žıçϖœuâià@°"Ĉ#Óı Ovߜ9•ë҂œ×tşñ• Pü Ŝú­Ëß|UŞŸÁ]áJZZš$ŞŻ à7PÈxr/·é…Y}2|T˘8doÄXÈp €Ä ­Î÷ıĉž4Ÿ5ɗ\q‚ˆ,cKIaŬıô ĉO_YlPĊM^œ¤*Ĵ×Ċ{ ´Ù1·ħ"ĊNf3Ó­‹Ùn@î– ’8чMdPomCòĜU– J_‹6€€…bk‚ [ÚŜ—;\öÂyiĤž9ĉO0 ‰“ŝ 4ìÑ£Pé¸ı!ŽÄöÁyrH³2$G¨À·=żŭ`zXdw.%UdR[QçĜ~|aĈOG °L*g4ñˆ˜† `ĝvħ½Ïé†&Áë(’V–6 u..x ›àJh™Ş~âR0Ä]É:l7çċ†z*a o„ÖŸë3X’Ö'Ê(Ġ ~;[ÎĞbc?N=m|LXŜ‰|q=,´Ù\p@Ê#-(w,ÇacsĜóúâž-Çç†ŝ"w›3³3<ş€Ô£°6ۋa:Ĵj_ATLë#|š›âëiá6Pò(ıào[Í|#ħU֚ZÙ3QĦ\L4e"À]µoô<‚šàaŝÓb>˜úه‡ċʲÈ+V¨ORĤĠ(İ + £Î׸żċ…·‘Ëñ•Ê*—8xd”É‘’A¨İ{Ü­ŭ 6ÇyĈFi%’£.OŠ•:€]ƒ1òíêNÜ<{žeKá|‚zzÜĠuTHG˘ĵÈŞMÉ ñss{ ZĜĤĝ‡<ĦÏr ĵż$Éİé)£•dnŒşKI:v'W¨½ñ2qŠË+x<ı£–²ĤJ—½$èËtTħ ğÚFÜA"ÊÔj3ʌʐĊ·wżîp˙ÄYbSQI/ï4yôxÒê$'ÜÜŭ}0‚Jz`²™iÒêȖó7cÁĜ‚ ߌL%jÊDŽrB ‘”dQĴ[Ìĥçbw?ó‚âu:˜` è2ğnMî˙!· N¤ëċbÊÀlIf;úzóùEÖh$°%‘´ ŜäXs‹N†Ŭ'£Êó(ĞĥiĦ‘ä¤*îTĉûY‡ħ]šîu·ñ‚š=Ħd‘…É2îHàÖüñ Çôġ¨|ۛ\sŝ}pÛ·bX‰UfE&Êߟë‚ĤjŠq kÚ4šü›ú“ÉÁyElT#MF“Á"ĵN§ßċ öĥh!†İViH‰Ĵړr­°:ĵ]f”e²µ#ë §TŞÑidqħVçƒqÎôÙ Ÿ˜ÛŒ5Ż–X ST™%„ P—ò’|­ùï|³ lğߋ`°HÄTe°†‡Ĥ2ÀĈ‹Ê7 ÏıÇꐖ›aldĴêı¸<ŽĝOV;É%ŒĊŻĉ,~näïĥ:´Â{“ıôż ï‰c^Q 8fn??Cé‰Ö2ŭ0ÈU´Ŝۓŭ½ħ6UdŠ8ċš1ĞuuBšümŝsŽc@½T‘‹Aĵĥ·ë‰eGŒêRulJ›ƒ~oĥ6ÏŻ,• Áp@ċ½-‡è†DmRµ2 „D Q;9ÄÜ) MĜ_cż×5C̑K8ı=&àŭ}xßĝtRËSUIY+=+FŜ#Ĥú|ÂŭûŞ×ššœĉDċù} ħšíg]n„T+ pI=­]bĠ-‘tìO+uj £‹Ŭ·ġçżġÇ’F){šä~˜>†œÊ* Ğm7 ­íëob1¤hâ Ŭ/HR&ŬÏ>ïŒêżá ÊȌnCÔ~˜:Ž–5a´•vê¸~vüñ‹NĠ–ERİ Ŝ1ħ·<˙Ö qV•!z†ôċÚÂǟ뉔•ġş°Š(%ĤVŞ™îcGŬNûìvÜbĊ“f1ÓT͘ĉIHĠŒB$úšGĦY,8=ñVY¤ĤBë _B“ÜóÇĤ,ŝ޳5êG҈ÔS˜—–Í:µìMŽ“k^ÇÓ댭д)¤Ġ–<–Ŝ„-ĵú‚‡ Mˆ½·ïÎ/#.Ìsšyj'œˆK"SŜñµ…­¸<úbĞá܋7ŠĞâi V}+’ig ܋Áħ6یzDñK—ĞD…K/LíĤÇqöâĝï„cĠ:<é[•"| ݨ#Ši Žğk7Üv䜍0ìĠF•Ĉ[Ĉac1Ĥ`ŞXŜÀ\Ĝ_ 'ñfW3ĵS Z% Ş ş‡ÑIäû`il{ljĜ‹4ĦÌZ–Ĥ9 èĠĉQÈÁ¸İšĈ[Ĉ` 3ŒĈ`˜ÌffuħÉK]L ÈÑ VuHĠk6ħµûz[¤é żŽYV,ÁĴö­Sx–žž3Ŭ„ !Òob÷Ĉêóy+hİ‚¸òġXRƒż~ûûñĥhü™LUç}:™9£+´¨ÈOƒß j³ 2ú’İĝJÏԊ)T€s{Ĝmùíl+Ìfô†ç¨‰ġ Ϩl~QÚĈßĤTDRĥ0e‰R!dóÂäj Ĝ\öúöĈċŬ &ɳìĊ¤Ž]])ĉ*š1n[`@àqr{ߜIl–j‡™$ĴĠİ"UħĤû›‹ŒU³ĴÛ¨²,´ĉŒĞ•5PƒbìócĈdı½s‚¤£FIG2(ói}ğ˙;.6·,—$ë–ÄVThéşôÈ);҂OçŠïˆs‡šfXV Ë1Ó0_%~c}­ŝqƒdhŜ9İ˘Eëk “É·°µÍìvÛóŒ÷*Zȉ­İ0ÄŻ5£Œ9 Äwĉö Íĥğb‘QŽIW5é|?Z ˜I&ëkß·7çßډŻËĦ¨›/ >h”ÔtU]–Á@äŜÂÛoëŠŬ6Hò×Ë ¨]Ӊ$ŞĤOô´ì ×&Àûâċ‘ĠÓWÖAwÔTDË TÈC‘k)[‘~NÓqĈ)´Ŭ–Á3–<ħ*]ĉTG‘WQ’žŬ›Ê9ßëë‡Ñfôı”´0 yĞ)ibsĠŻ…£é½É$ĥ÷[[µ¸À™ŭ5aŠpˆM*ÂŬYöQaÀ;ܑa~,q/†L1\Ş9RZ¨a¸”³ĊmÀmsÎÜ o89ż“9ĴXÛ ž?ħƒ.ާLqK\X‚EÁïm‡7ĥ=gPÓNĜ£§ìôšŞYçÍ%áf #ƒ­ċ¸6ç“mÇ;àêÜÏĦhè^„1Â07~u;=Î÷ÇSê•Ù ¸àYœWIˆdeg‹Î½Ïĉ7µĥı‰'X*àŻ$¨Işjd[³bĥ°÷µĴ8ÄY½OĊT¤…ĉ™Ĝj^ Ġnû=Ĉ8šhĉrDTĊd=ICé'¸UÖû·ëŽ'6ÛĤU|Ž+³z\ÎD¤’İà˜ġ%:WĜ\ĥż|+™rézݧİ+ĝ°IĴĜIĥÛöĥöŜĜšÍ Ż¨Z„šÍ”Ĉu7ÒûŻż8+TËE?Ni&êiV%H;r]ïÏÓgċV'iŞÖZ•§žMS’X. }îVàÁ›Sï'y˘à°%İ-6E-]vP²ÎÔŬ>”†fġ\0P]ˆàŜûï|(ÔÓċ3ÓÒÁQWS ˘ *Ü]HQÀ'ß·8ġOKM“Ĵ‘ĈUšÖebvĜwçĤ‚²‚˘š7YŞm+ĉüĊ‡ï†0Ó´ñ™j£ŒLÛG. nûq튽TÙ>ndŽD†„‚ï5÷M'ôŭ8ÄÛ*IxsD”ġKTé?J°FÈÎ,ŭç¸ús†P>bÑ-ZN+ i‡’œôʁl,w°çی&ĠK*Ë[]E]cĴSĵd•f qċ$Û×úymlġ´³P½L´)ÑĞW–ׂğ~Ö8~$ˆ[fßîêáLjY$ rżèƒöÜ÷ÜáWO])¨Ĉé)f·œl=Żż ·ÔSJk]ĠRT! ¨m§ê/ġ?ló–Ġ'Q#Ž0K#fì.@¸›ïż×\ĵ²´o’™Ôe²İALŒ˘pĴ ›Ĝ5· kÒVj“NgzD‚%”([ö=ÜĴ7ŠŞİ<‹-:…™, úGo/6>żÏÉ,˘!R˘žŬ- jrxRž¤öĈQ“Ĵ•EY³3#4˜ĊPŞÚĜĞ0<·ÔuNòÖÁ-WF‘·˜JÎJé¸"÷û‘n}݆t”Sgïҙ9˘ #օK°7Ók¨ĦöÄħĝZ _„Ĵ‹^ĥüwYFˆí°Po{ëâV n]?Ä@Ô²TĴqF~V“bĉU¸'ßûâŭ–eÙCPeÏC™UQOÒĉR NOÍcrWkÛ·ĉ0š§"jŒöž†”BŻñ2Oa—Ê6V[M†Q<àş\µkZjşŒÂ==Gv‰Á‚(Û_ÒÖĊÁĤx/— ˘’*vvŞf1ÔPÔN\™<­İmpá€QĥÂûħ-&s”îËGQ<µrúsŞÈżÊ/ċ ÚÂŝkÎ+ytÒĉ•u3DôU°"Ĵ4à–5 6Òl~n,yı>¸"*ÊJ êy#¨ĵ’EŞxş2)ŽEċmbK-ÎǸçM²ÍW8Š˜eÑž¤HċÄìI‘=,K/ż˜ú)ġÍVoV”Ó§ÂCFŞÚKwŸâĜ€í‡=N™Ğ)‰Ş†D´âfÒÎ{ ö¸$ÛÛÛ\ĦCBajd-¨UfckĴ+ÀŸ]ħkŠĠ²>ĉhóu‰òüĊ–ŠĤgyÒD@yo}ğíqn-‹ŠŞ$eÔ4´´ôËNDz JQ—‰$’FŬ^_á™êİeÏóJIÌ´²;Ċ@ÎnX >ä܁÷ĜİġĞ$İŠ£0˘ĤĤIf_çĈ›x Ô×ÏPڌŜ#Ġ@-MAO·LX"… ŻêÓUôÌdP¤ì.ĝ­m€<-ŠlÒĠ­,54Te²ş¤›nwöÛíĥ,™V^/¤İ’V+P‡Ĵtı*AÛíĈÖ·ïŒÇ‹ĝ+xħµHĤ¨†9 EHc( ¤ÁÓÎĞ\ŭĈĜš–J¨ŞQtŠÀfÔ˘E%D‡umĥ÷ßÓĊ \ĥH%´ÈĊ1Ğ2 üÄûl-ͰiP­Ò­bÄ’CKJܧÔħßnûXmÎ1‚ÈŻÀœ÷9ŸÄsÓê.Íç¨Ĥš&”\èe;vÜwħ=ñKÍsËó –i%‘„‡ñQ‹ÀZè ôß`nvl[˜_ñW‚H˘A%÷ÖNàĜµ}ÎÛ×êä|Ç`áH/í‹NeâigݧËU/$Î4Ċ˜XŽÄÊ n-íßfRdÇâŒF˘­$=9gmĴ¸Uùcp?=ñ—/2ÂD§ |-KYo<$‘€Â(Ħ'J…cpÇRî{8ü°ú³'½<“fSL?.‰ A÷ı  Ċí¸żÛ`2ÚÉĞš­£¤žBÈKHPF÷ŸÄ0%vw†•'Hŝŭ2ÑĥĞ[ŝl{óŒ;7>Ô;ew7‚…ĤšyMTÀ?R™ Ä^,A>—˙Œ 'ˆ+ëXP½mm$1İS˘ ˆ˜-ü ) ˘×°·ûìf}”µ‹.\é)u19`\Ap6e7îA¸ĊS2háĞZt:àFÔòİeŬĈÂÜ~vÇW kEҒÈ˙$ =Ş/B‰v–$,­ò(˘ç› ñ‹v|ÑÔ~ì†6Š9İ‘RĞAm@‹ïak€wĊ‹.ž_ß³A˙†GN9Vꤋ„Ğ~5 ›0NE1ĦUE•VK=!Ġ-\ĴF6ĥ”*J‘pıú`œmĜ˙BĵʵÛ?ÔÚNĤ•m1`n âäñôíiòlÂ:JšŠèd£hPô…BèÖO6ż$ß·Ì3Xݨğug‘z È[Q>[ öÜúmŽ>9'˘Ju–bȊB—ß7Í{jíËQÀìİÌĉ6pVÉqĈÂŝŬħ$ġ)ÖTˆ\ég¸ßékmßTÊêŠEm ÚmżN0µ‚-Ô ĵÖ<úxäL°eİ™ŞQuÖ(´’O"¨(-{žä\ŝ–ßl3ĦÉjçĤ‘rĝ`xÓ\ÁšU…”(Ô]ġ‹6ĜoĈ*”†ĥžtZs$S8Ԅ0î<ŬñeŻñ-fCI—ŝêH¤Ž ”ï¤pÌK½…û‚;lp8çôM° ÷/Ф–jĉN´qúĞw'ÜÜ}ħ™nW__‘WĠSUÑAKLĉY'OAeµÍġ}í.³ßeıTu‡7Éá‘ċI&²Ä$i–ßécċXiߟÖPÖĉóĠÓÏO·"9—Ŭ…Ç"÷·×TxËV²C˘Jvm(UXÌ~kƒŞßM­ŭ°}D”U”Ô´°GÔĝXËË,Të‹ÛQ6Ŭ€6ħmùâĝSMU=,Âji4:ÊÀpGq|]r ĴÖ_ IbŒM˘Ól\·$–°ż',+@SçP™cêG0 ÈfäïÁß{{à$utí’³ÛXÔŜU .Ĉ˙î66<៊2ù"ĤZ¸kİċ£z M ›ĞĤK nn6=°Š87.SÏĦ‰[‹ïġöYV2(äX‹2Ş7Ŭ¸?oóœHŻ%fêSċ³ #úâY † jyÇÔ.êÑŬ-kjż×lñĜÊxħ½°ÀÛÈzşÌcOûIĜŒ3‡\”ONgGm"2XŞ’ sµm°ĝ^‚ÔêVQÔ.Ÿ@7ıû˙YûĈžZgÑ­$İd X’ĉME½Ç†3JùmM ]<4”sŜ„ÓÍç:.ĴÀUobÌwġ7t+<Ŝĵ‡ò²”b­ccïÄd F˘á·ĊÇ=‚‚´µ Ù"3NÑŬT?t)“aı½OÓ)éä‹Y#ThÚ:‹şèƒ…èĈĉn™­CÌ´0Ò³°yD[&ğX•Qò‚-ĥûŽpĥ+0³ î}!IöÄİĉ ın0Ĝ ú1Ĵxâ2’ÈĊ5ıoMĴ{ÛçJϚuĤu"U $4‡Úǀ7܌’ËIQsİ] TÚ×Ç5ġ5´?RġJ³ım#_ĥ=„eŽñV†¨v–÷żҗÍĞM5Ì)#}Q%C‹-í{,ĈÀzq…ı4-™WÑÇÓ%¤ħÖt÷7>˜d)żtEYM?T2ġœUpvé‘ġÜpqœ–ld5O%7ák-¤¤mĊˆä ŝDmÎ7—WMáù:Ô"75˜ËĤ쁇ËÛÌóĥĜJd%³³l‹Úŭŝ¸6Š’àijH$„ 2‚úÚüxç·§¤¨ì>Ĥzá›à·cŽ~™²VK}:eı†rd¨‘….]e˘Žšîî˨ߵġ_Ŝ–,k3šÌ³Âĉş2f%\+7”E;2ìŜQ}ĝÂxNxĵEITo[—VBé<Ħ'Ê<ìOñ íêl@Û_Q~è‚j@úh'hJiWĴşímˆ$ì}·Ç_kŽÛɋw*Z<²ğĊ³K–I6m—CRô󧜋4Gş.ÂËrI‹Ĝ#Ëä§zšêšŞEy •hdG`o£‹Ŭ…ĝ;ı—ˆh3/I#&SC-¤š[(–Bw!xôÍÈĉÖ? ĴµµÔÌĈYPŽœĈgSĈÎŬ·Ó¸MíI,ÈĠĴ`K—SÒCYFo: P Ċ™ċy6[r-ìwî,™~u^z™ŬWgA"¤ħ#kYˆµî7xÖ(iŽe5 ,n*ċ„UFͤĦQpTZƒĉî"ĜŻSA˙É2éSMĠz2ü;¨Ĉ6Óe¸cr "ÛpG–-~$Ê-ì²Kâ* \Î7Ê2jxo‰g Úâ6à*ï}îŭ7Ĉá‘Ê g Y*×ı7âöÜ÷ü°%>CKĝbJ‰k™s‰Èé…˜j R[MŽâûŭ8Ä5”ìĉ4iIÑJ,AÒ.mqa~.xĈ’E§Ħħ–"Ġ$&Df $WÒuuòñµû˙<<öO“G2 jvÖ:“’Qğ¸°öäóĈ(ħÉFò=/Q•bÜuyß°ëÎÖK˜ ÔÊznԛĜn}ˆàöġĈ1ä”4SĠ+;GĠ[¸˘asĈüáµñNĴ)/"0şħ½”Üǐ{úâ˘ığTŻĠM"E%~Aۆ܋ŭ/‹ 4ĉ:n²GŸÊ†êĝç8ÍEŽX,bħİ"T*VÛGĦĈĵAœWÍáĊŭÛ]u…–)ЧPz`FżAÏĦÂzÚ¸dEi¤Ş,ĦžÚ­żK™x˘Ş—,Ż’ÊĤdXVáİćpÊ.C íۏ7àMNєµG˜³Ċ—×T`L•{¨Q.œ‡}lG§ ŜàáC9İ¤İ˘Š(¨5ÇPt‰òÀ…,Ûoa‰eġ]š Ğ¨W¨Ġ˙’¤tÀcrYoĥĊ†×ۋâ Ò­2ژž†‰Ħ§ü7¨Ž†İ›ĴnÛ·`}qé.6‘ÓÂMY<ê *İjäıµ˜loÇ}?/£Ç4òdS:ÂE°Š-Àż ·ŭcÏë'Ş­šzú¨ÈšCy.|Ä\c†´”-›FĠ9¤ÒÑÈ˘y‚ŬŒÖĜ5Ĵ Ĝ{pq„ĦŬŝÍeU’)YŒBĦé̳IĉgÔ.8żnŜĝu—IOTPTġjhùaDıcĊì7~˜ 3ÌĤj$dċĥŠX‰6By$ŬŽ×çôÀRÔèŻĤyÄdede½ˆ&Û ~˜ÊŞX ˘Ċâ’Ĵ_AEˆ°ĈĠ gÔâBI:XJĥ‘…•µ0üzÓeUg0’Xt¤½%2É}™X“}; \ÜÛWÑĤc“QC1‰"ózbĥ7ù˜vóĥĝ$ÍhòÜòihrĠĞĴbzi$Ğ@‘Ż~G6Ċ]x"·ME™UxމVĤ%j—*“FÚÔħvÇŞĝŸÁy'ƒóĈz\É$éÔD ÉvċEso1ĝ|WW]â܎zi¨¤­ĤR†ÔBŽCpڂ_XÜ·l^üU.qUàJŠÊŒĊ3p­WIh¨ÓÑ>R/ĥ˙[âúü²µceÔ9ƒhAĠ"’¨CĈòƒpÚŻ³Ğmşíï‹ Ù´SÄ)AĤ MT„E·—uÔ8ıûâoSUMàŒİ¤š'a1’››o~pĠÚZÉM=TUΉpc7Œ“µÁ‘ĜÜ`%£ÏĵQ–Wdé/ˆò(ŞŒCəR:ŞëİċĜÛ{›zQĵyšÓx—$Ë* ­ë]ž#I"%=‚‹\|Àìo`9ÇoG JBfÑĠŒùıS~E7ǂxûŜñ€4°ƒGPÑDM‚lWnÀñ˙‡fĤòy$´3ipVħ×éÔÍkl ż<3ñM,xžqÓ %Ò ô–@Hüï…j6ê9Wû·Ċh펖”°a°9‘ƒ‘`mġÛ…dëS~ôĈ9ۍCMĊ Ŭ)0ĉt^[ĴÊo#Ì8÷ǤeñĉvËü8í(Ĥ˜#Ħ .rYwڍñĉ0ΰUA0Ep’ î{}ñì~Ïs¸2Êì×)ÉeH:Z³0R½ÍÚ6P<ĥò‹Ż½öXdËDMG˙íŞJz™–j¨BİVy#Ôtžö¸<,qwÏİ"ċ3fù•[A€İd“İ{_ÊJI·|Q'Î%̳ĠñeŜnL/c ]ˆÛM¸ï‡OYèd§Ž(ë&™bEĜD›\ŽwzmŒŝċĵĞ3h­gŜ;ÈÉÌTDf ÖV•@!CA ىż6Ĵäóĥc[?ÄRž@~#"éRħ$Ŝößs‹WŠ*_E—góSRÔD ~#HB°µÂŞĦ*’>˙\TŝP×À,b³àİĉ‰äꝤÔ6ln{‹öÄ3Ġġ3£éšXh%ĴĴ)ĈȽÁ6ĜŜŜ˜ë*Ž’_$yúÄ)ßWáS’ltÜ\­7Ĝŝ˜•éĊ-t•‚9›Ş™Aĵ‡ËğĦë~ÀÜ_dùTútik£i”FÓ‹‹ßKlAÜ^׿óÀ›zQdë™ċĠ4™^qÓ¨ĞMb’vÛPÙBĥÀ’.oÛo,Ġ>9]‡é\s•e„läo~ıúâ˗ätU9 ÑVeÔëm%"!ôea½÷çœsâOÄäiÓĤ°żm'¸ÔEžgâşiĞĤjĥ‚D5µ†­;èğ|Ä[ÀÚ×À0UK–eôù–URĥ"͂"âĤóİÒ·`9ı°|3ŭfTĠèiŬ™×iĈ+… ÚÂ[7üñ?†sĵʨI/FpÂ#-JúB ä) 'šçÓoMĠ~Dˆ²šoŝÔë³J\şHڙdDED’&T \t À7żĵċ4ÔĠ9„ONSš)"=ÒR^à…7R‚7mħWdq§í‹¸;âkÙ%=ÇL›tßy=ö èIûb•”xLÚ36­–I• 0ñûiQµŝ¸µ jêİäI薒ĴZ¤İĈ÷ĜĠ°Z)ŝ-ñ#eı\˘Ħè駓Zˆa”LÒöKöäwħòA™>cS4H*Ŭ˜tۋçrAû`˙ċÓ͜ԌşŞ‚eĦ.OwóvúâĞ—ÍÓë½İÔÇlĈċXv÷Çy4ŠÀŬ²:V˜K4’FP•Im.Àí˙²íöÛĵĞ=ÌòŞzĞ+­ŒxŸoâ§>˜Ğ䙋Jâ #1™‹&’5.’·¸pĥĜkH!ޤGW4ħUTÄ]İ$"ŝĥíÏ6ĥe$)Ċ5LmŸPçù´­Q^Ԇ·ËTŞËXYÍ­r/Ûß,(lĵÂ*)Ş£ŝDP¸W•nM‡ĝ9ǰC>káż™¤Ĥ–-2*†ŸÌÚ߈YoäqͽqċıĊc.qYûÑĞ4zK³­ġ:6½¸ôżħ‘GàLÙÖ_5 ÒĠċê•HÁUz’k[¸<0Ÿ1İĤ¨I’†OF¸ÄŜ÷ô€:γ9Uî&Ò5t…˜Şĝ™–ċŝ÷Ĝ`á[ĠËâ‰ävż›VöúĦĥŞÍ=STÊ)YšÖe}öÜ\³Gâè·ú|ûí€2ÈTĊ/NE 5żâÜù°ó,ʧĴĤç³í.ĞùnJĜzñé#΅)(£¨rèëR) b:ĦŠpY­Éµż\-ͧƒ2t£yeŒġ$Œ-ŭ6ú[óĵŞĞ3Ħ†8Œecš5é+G³ íkƒ{Ûŝ稑Ĥ’j$qŸÀm™EüÀ\zo‰qOžĠ²Ğ&¸2Ĩ‚è‚I;ħòŝĝħċJÙÍPEKQ­c rċŽÛ˙ ˙ĦijdUUŜŞŞ"X#m#Rĉb Û°ÒĜ-=^j"`#{3 ŝuۛߌK,²jÑ’TdĠÂ)êU›§ĠèÄ|İıä‘qùŒ-ĦÍ]ê) ÓÁRñDĈ5f AĠÍÈĉġüÎş90ÔI4ŭkЉÚKż7Ŝ–ÚŬöÜ`ż µM=Mu —š9ÖAj#N4óÍ­·ĥ†ž2EâZÔŞĤĤv2FúlñÈ<ëġ=ÇĦ¸Dgi"ŜV ĞŻ˜z›\Yj!£Í3qL´˙?ÁDP\{wżWċóSSµH¤†:Bħ?ŭF­šŞ1jwf)s}Dĥĝ& ÙV ÓHš › ·ġÛĥ4ô“ n³Ĉc‹€XZ÷ßo\KP”´qO =0݁˜ĴìĜŜÖĥħĥŬñt…gUMÓÓ­L4‘,·†MV ş‚{ĜúáƒÚ 8ĤIÍCÚÖÖUżŻ§Ża<3™³$2+MauÚßOL[érÔÊ+ċ‚ Ë%£ğ² ÄCÏ|CxÑOñĜ™_dĊ/Ñé>(§Ë2zwĤË~´ghĜ‹’@ġ·˘ßĥ)‘4ÒSÖGҞhúĦtÊçqrZçÚĜ#Ċ>-Ê3ê¨Şt‚R¨½I\‡EĉêŞ,|ÀìM÷çL֓.ÌĜċıŒ•iыN<ލspT}Ôúarp9'#óBzÉ̚–ŞZ˘˜1êËwHF×;]wżß –wlŜKÁ ÔòÈô,eˆÚÜ(½Žß\E8ݞ ğNĥòpíżno{íí‚3ks½]ElrS¤ö‰EÔ°ş…µœlN£ħQ\½fHô°K+#‹Ĥö Ûî=½]'A g ğùżNF8ŠXÀuœ9bĦT†µ½;qŽë$…Yi[·6ß|Z@jEEoQâWyší’ŭ blö’hs j9)Y\†KÔXmµ·ÛÉ֎Ż5ŽZÚĊƒCĤ”zv˜J/b,éßx››V<)2Ò,Ĉ%’abÌŞ.ÂÇ{Ûß+­FÉRü¨Dò0U Şş·ïÌî%pš\:‹ĉí|i–GĤPkìÛpm·'*"]@,7ß}ıŜ×¢“8Ħê´é– ê‘C(CÏwÄ´ô½pÉĥ÷ìè=îE†:§–$§Ù^ν0 \î9ôĥ"Y<İĦ•$SÙ{zßúb]”ˆĠ5ÌKiPëŜĜĈ@îBĤ•5ÁÛëThjİ)ä7ûħݤ4À˘µŸ‚ĥàa‰’Ëe‰D İ.57r}ŭĤ$Ĥ:$y%£CĴíıìĉpµ_Ióm`{û`ڙ <ï ż§ÛúáWdÄÒêóoo@}ğbéy “qqkÜÛ€/Ä™ĈyQÜz`ġÄĥŽÀ2VMĊıÜŭxÄë˘(Á£šDmqΎË'}Co_ë‹ßƒ%ı¨İUËÓ1.¨ÁEfC‡"ëıĜìH6=İpeI\ëQ)X‹,M2ÙĴÍòòlA"׿|MA_W"_ĵÚT)*$sa›acĥäía4ĈJFsüââKEYV(ó "jڊ”İiHnş‰?RNç¸$AWLı†eôM bóísì>×ÔeĠ=|ħĠ°…èu ”“ş‘ê;â$އBĈA#“݁ù‡l“Ħ¤ĥ‚h ß&‡S$w³<ö۟ËŠ˜áéÍ2üAU[_ío\M)ëF›ÔŸ˜_ÓÜá…5*,/^[Bï“ Bì}ÁġÊIK5‘ĉ?Ñ= ÍPt LÔ:’S‚J˘–ÛèAŝxRçeP´˘Ê’^9$QŞ%ĥÁ,AâüŽ{bš"+1–…‚Š•Ó#+F’×*6Úçk{ĵĥc*E%@`Œì À¨MïqŒS—{&˘GŻdyKE—Ċ1Œ<óFÑË4p:‰I"ܳßmŭ†-ŝĴZ„œ·U]\-œX €l>÷ç|y?„óˆĦĤĴĤŠŸD%†²@‘ÂİÚ×ħ ĝǵCQI09‘G\$Ĝŭ1éöN<ċı2OU[MCRŞxáBmİÚ=L1˜H/)ҞçÏĉ4úeKĉ/OÁÉħ'aÀż~ĝ(Í ­dSĈË 1e6Ԝ…ŜüïúâÍ>V‹fsœ.]—UÔ@b’Zeñ³[Ë}˙LyGs‰+ĉdÌ.×U-cÔĈ5™ĉ³×ıdRŬPUšÀu8µ…íĈöûâ™+:V˜ŞéÒK?˜j*ü wێyĈ=­à޽–,ËĈıŬD‚˘:ʆ¨˜[Ĥ„¨î,銝Fk[$RÉ­£´q~üá‹ċ5Ġ0 Ï- éPÂÊ•ÀğkÒUCĊÈÏG›fupĵTâX<Ħ\û6-Ċ°urĞÁ.KĉÉ%=IŽR<£pÄÍì6>ĜöŻÙĤ{YÑĠü]@ÂÁUzŠúGóíϘùĝUuHĤX‹™ds­HÛrNûcÚżeŽıdĠ´’ôáŽ@†+ ĈۛŸécŠ]S¤'òzĤ3ÔVSÒ yċXԐ ŸSĈ'(ğf²ÔOhj•]Dl¸ôġÂOĴ˘•&šĤ1yU!ĜÇŜŝßçÓÀó£–-D™ ƒ $yTüÄ=;b†ùš–*x'BÑJKHħJÇväìEN}ƒıIÓ=j ƒQOİEÒ.„ü¤‹ĜŝcÌß7Ĵށé"ÎÌI*o  ΖŽ×Û酃Ä51B&¨uHǛS^ú¸Ġo_ĥ×Ŝ˘iç™u UƒÚK5ı=Żè-Œ99bQ+-äŠZĤ¨hc“J2d‘Ĵ×ġÚÇoÖĝ"§¤†e1…Phn·?SnwĊpV§v’ĤX•ce$ üÇHaÇ‹àˆËÔQ³Ò=S´‘ôÊġëĜMÚÖÚàߜr¸š s:¤ž‚&˘s#DHÑfaklÂö;Ÿ}°SK]4h*–"Ëĉg ĥà÷íß× ™•$ ñN"gĜB#òÄ8o(Ĝ‹ÚÇßĤÌaÓ,°Iċ #·ĉàßsÀÀ˘ÙÓ|=%LpŻNŸN§21ĜŽoëkarGS SĵÊ ą$o°÷÷ ژVHġD͔B][ÎÓıŜĈËĞ-’JP¨ŸÍÔS`$ĝ½¸âÇl^•‡Lġ R†HRd/YFà/™ĜŝöÄô”ġBYiÒ`.ÏĦvb>Pmıµ…û`ÚJÙ³*1Ĉ³ÀğŜ×Úü{ƒˆċ—1AK"Hc 2–„ \ċ›’vŝ¸‹i`^…dT54™R¤Sœ‰+ °×mŻŜ×çd”ôyĤ–2ÁLÒ7JJQ× ÄîşI¸ß‹÷ZĴâjê?#…ŠÚdħ-ĤÄۂH[eż5jV¨xàX]A[8¸ċ; ï~q)íŒ{UMKQ£’ • wToŭyÚöïÚĝ·xx†@Ĥ1!r˘Œ@-Éŝ¸Ĥ½uMr5!”ê:Ë0*@µıÜXí~1ĵ“ĞC›Óĉ”•‹#8f–1bdNÂ܂ÜZŝ—ßô³jY"G²bħâ*8˘¨Š°ƒÓë‰T€ÇŭĈܛž;á6oISFĞ…j•c{èk^Ĝ­EĉŞWĴaNħÇ,Nħ‚w¸ÔÂûn8ż;ĤüB“MÊÊJtŽHWM†§g3F§}ĥßïë€+V4Ë´BĤĞ~¨ÊKßaÚŬî,qŜg$•U ô0ÉIn§•ġ?ÂÍb,,ċĝO=}==I¤(.’Ó²Wıܖğn‡ŒqŜ ›TQ5>S,¤1nıbbĜ“òtŻ}Ë~X4çKUG4TĥżF9şşZír/ÚçŜŜ¸+ĴP’I=<€ë€Ò0mÀ°½ĥżo¨ÄïE ÁAI $DÖ ŝb/#qü÷8İÊI*ôI&s}Um*ÉU­LEH’EU@[jÀík˙ÎÍċ•rĜ ÔË ui˜œ\Eûóüzá¤ġpx'~ĴKkÏÓVD$?8ìIÄu‘eu4Òӓ@…žzxöħı+l·ì֌OIµ, $1SÒ´pÉ$“ÈÑĊÔx£•ÄŒIt9äÛ ˘–Š™˘ÀÔï),Şn]Éıħì-½ĥîloSTS¤òRƒ3Á,c˘ ş´l ”ßOäŽŬ†Íİ+²èb¨ÌëĤ>£6ïÑğZëptŜ·Ôrqrâ]{Y=­Ï+ͨây£šŠ ĤB#_Îqrvž}şıµMMRħÈAP²ÀÏŻAO•†ßcġÂiê–Ĥ˘„Awa+™ßĠĤç×I˜Ó‰XĤw@ğ`Žói'¸ŜŜ·ÛœK›˘”saTÖI=xZ "S!!X Éĥ÷÷ö87,žÌ#İİ?Ä|ÚşŻsfÓcacŜ`*ġŠşċ” I nÀ5€:}>ĜêYdó¤”zf{tàšìTs},msnmôĈäqvŠ’=VĦië+DäÙJˆ•ŸPx…ĵÇQ oÁäêĊOĈ9ˆLY\‰Ö™RNĴşÉ’Ĝ €?ĤeµôTÊŻYOİš ŞRee;2µŻÀäû3ŸÓÔÔN)ê˘@fiŠ;Zü~× ÷llçŬZFj*2ÉufFjŠÌ9jē4ħF$)É7Ĝ9ĜŸ(ù×MUœfuTZëKTé•u\–òù[kĜ(îN7˜WÖRŝτHjݧxáĴ2Y›JSr¤^èE÷×uû²*ş§ËJ’ŠÏĵvBĴ ià~çllĤĥÙ*4ݐµ™W‡à§y_˘P/SI´Ò·Ì*ŬO&àĴ-ĥñ5|ùí|sPHİE@ÊÍ)Csr‹Z÷Úŭ݌Ë+ñ$İ,RUĈf[BTDMÉFž×mĉQċq†CM “,‘¸guíŞÜĜw[É5~ ÏFY}^y’xâ³2´²ş²ˆ¤b^W^ú~›[ĝO0­ô™ħİŒŸĊÑ:³#Ä{£îƒéçjş2‰9 YS¨Ú ÚßĦ?ž 2‚ş–8말²§Mbځ¸ŬEı¸½ûcÍhà^s6\¸C:;JĊ”iµˆksnoëÎ+Ò2™fyZ¸ŝ*6½ZŬ­}$ßò°Ü`äñŸ/1KÌ!T Q­Ĥ˙M…íߜUóöa9x–MnêŭiPuÓkŜÁ´ûzcYrɐĦr ió‹[1³†ıi0ûÍûóĉÎħj‰`z‰d&(ƒĜ¨àjôç‹ßóÁQWÊ>™›o$­ÛPĥÇWħ¸7À- 5-d“\Ş™‹ħ*­Çaï{wôǞt#—jħ/ZfÖHÌnħRA6˘77ïĈ„J#4u}B—RäCÁ°"Üßúzœesµ<ħ´Î³2êT²… ÔŞoµ˙žY%§e‚Ì÷`½^[€×ŭżk e=I–š¨Í ‡KÈğüݰîm`mŒñL…IÌE+ ­ñVoQOjñğÚ;D°Ğ%ö, yĜm|/‘ó*´¤G3”éu·ĥì6 ó{ûàvÎŞŬ°>úzÓ@[Ĥ×ùV×ÛŜû}LµɓO3ĉ ôd=JFÈŞmb]|¤’6{›ĵ“MŒÏĊQ3ċy}4ST,jÖ½7–ŝ@Û3 ^ŝ›bĦ>_™ÔVI VeĠĠÌ£ŻÙÖäHĦMx’HĊre‡?¤YgKşèRĤ—~OĜûâҕ54ԕ™İĤĦ“İSÓÈçñ‘7eÜŜěñĜchJRiÉRt†ÙM.QáϖTÉéJTVO,Ä\—ĉÇpql/݆˜ÓĈ•Ë du$ġFÀĜ^âÄĜû£ŠlĊ˘ž˜ô:Ò4½ ‰T”ŽÊÖ ›y½Á9Öc–É,TĝrŸ÷”yO$pé’x¸ÛŽàáòĉÒ˙€ŻÓĤ­jjš˘ŞĦCQhi§…K3ƒĈö·Ĥĝ_YL*òÊdž‚uĤ‚Oü—ëWñ¨m>€‹oìpĤhĞiúYÄsA[%â”ĴÚWm† ŭ}Ż€³îR–iĤ],úËHà1c½ÔíÚ÷Ĉ*/ÓD…u½i†w &•ıÒŻkµö7ĜïíĈÓ7ƒ`e“ÊşµϚû‘ê-ħÀ?ü€PÓÍeÔuqJ4ĈjUµÄ;Ĝ÷½ˆô8"ħĜP%$µ()c·Ianİ@mċÔm°.Ià°:o€É)h£á\’÷Ò0÷Ġ’ëp44т™!ì=/żlUâ’Ŝe‹T1íĞ‹·#Žĝ²ÑTŠÚ4V”•†ç@‹WüŭqN„Îs|Ț‰àݤ1ޝKŝàÇħ ñ{âÇC˜À2&gĴ‘óJ*Y.e;Y^à Ü_p· +ĝôUT×I–,éPÔŞ@:Ż`,ĥ ġĴfµĠY#˜ˆ–¨‰H¨X̏ácm$‚XvÁ™Že;ĈŒġÁ¸6 Ú×ço^ĜCžĉV½2<),Ċ‰UÉî=żêĜӏ´ħÄT2édIX°·”pGıÁ”Ħz0%LŞ!ĊݵÉ ˙ñrÉ hÌ÷Œ–e·ñŭí{ìqŞ£ü4²È™?Ôu[éĥÄÚûúÛlo–錂ħDIÔA½ûíŭħb£yIT út{Ÿóĥ’Rd,Ÿ(;ßÓ,q+IQ1`2ž ï}ö>–ĊĠ ɨ£Š*¨$¨1ı`.6ġ·m°ë3İ‚JĜÊ ‡YyËÍÔ¨×CüBàî~ĝ 38!ÌLaS_ÌC`l§s‰`˘“3 \ÎJµw ñ”›ċAÈĥÖQĉ' OXĠıŽ?‚‚İLLVVAÀ6µ‰û‘l;0r>e;yNÖÁ G%T†*h$s´…EÀġäc޲"/IĜħı°7İVF úPëòŽOßïùbċŒ:´]N›‹ƒ'7î9í†×g‘PVs[MSšË%ÌÔUc몇UyNĥß| Ôx9̍p¤cïˆŞĜħâŬñßMÙ5h67ı*"I„“kĜ°-s#l]?|D^âà›ÛŽĜêS%—R‘uÒ ħĊ8 W`6²ßƒ§Xİc¨İpVdfŽ4av Ûs}‡>û`ıştZİi >&{ËÜO+ôàßÛ İäÒö6²Ob?LYi2ċ§ËžşJ˜)èĴÊ›îÎ;z€yŜĜÊn²ÇBtycѸڝC,GJÈ˘}Eí~v˜m ]$$ĠtÑȵ7ŽĴĈêĈàHê·"À‘ÛU÷Â*ĦuCċġín1Ŭ3ĉ5´ôTĴ:²·kÙĴ=7úßliäZxaËşë%Ižbċ”°aa3zĜmÎ,ĝ ĵq’JĴ‡â!K¤€YÖuµSġ rÈgi$²H%Ž9c€ ’ĴH.Xù·R{ÛÜz3Ĵ§&ÈÎXŒĞ˘ħS|9-FŞż [ıµù8Ġqáĥdùj(şÈ:, ¸hÉòyÇ(4é?|1š– ÂJ™•+‡Üa5½ĝÛÒŝ˜^£”ßá§ĦYœĞW[ËĊU,/s~ĝŸÄôe™ÛÓT‹T,q´‹plĊAµĈÜ[ŒgR ‘qĉÓçyĵÙĠjUÔ4?L еÉ$m°7½ûïU WaŜ7Î)×kZöĥöıŭñcÏjĦ­–ĥë¨07Q e`66[†ßžĝ§Q´ `/İšÀ7ŭ/‚Ĥ™…P( ,„G"ܕ· 1ß½Èüñ”£r²š¤†ċÓH{ÛHËj^)DUـ([HÔ6óĈŠ%Bò4Átv÷;îpu$ÒWÁ0C?.ı-ۋ”íŠlho4 5CÏ^Zž6´³'Ò۟M­Ï]WP>¨GJ \²Î.^Ä_Ô[k_`;`İĉ…kŞA‰ž&.èġÜmÀ#½ŭ°:GK‰(İ•Ë4ˆċ´ĜqaúÜ8ż‘gÉ2̧+‚y+ÂVBŽ$†&³Íİ ¸çÌ}ġĥ ˨²ic§Ş¤jމ™ĞĠÜ Ŭ´mÍĥµùÛ|#ŞŠ!Ì҂¤³ßCu zìÜ î>Lì(ÒŠ}"a,Ž@u Ĝ(<ÛéŽÔôgVĥ[¨â}SWĠGRħŠh’#–e½ĵÖ6ùll,L,ñf{ˆŒeéĤžŽ™b5ss§Íp;_ÛÔJşšˆ)˘ êÚVúo›{_‹Ŝ˙c‚Ž[._URĊ8w›Ĥdİ >akÏŭ½Ÿ%şÇNì]3şR„e’Ú·fÜ7 úï‰"Ë*(¤°^¨b·Bn@ž9"çè6Áyĉ_2"fJ²­Ci‰§Yˆ¸;ZĈÖäzáÒĉÑPeÑTWGd  }SÈŞ·BĦÁÒOÇù`Œ ri**µU4½2ôÓĈ'P; î;qrġLpċRÔIÓԕYċ’0ïJLk)“ëksŽjüTsĥ¤Ÿ÷5İ2úgŽAĤñBXù|¨*Ül97µñ[1SRcc04Ĵó|Ê;Ûڎ!ŞÇ9äĤŠĥEžX˘=fŽ_ġb „şñıûa–DEgLħÇÊ߈ÒQÀ‚ ÚÜlmߝ– ĝ”ÉPi•_S½š[\‰ ĥ>ŸMñb–@ŝ-ZjÜĉ›/BĈ"ƒÏ!'pào{ĥċŻĤ2jÑV]òŸÚ,y5#-_5dĠħŠ˜ë(ö.€/¤n/ıû Y˜f™Ĉu&W9ŠŽŻ2Y™“z`X¸1½É<öˆëreĠùQjĈFXċ€İ<Í`WsĞasp=oÛϳ,Ŝş³1Ş5VKZĈFi`ë*#\€”ó[‹Ûħ7n•-"R^-n_f4”³ĉu™Ġ^ì‹ RŽ‚1Qgk†,wÔM½qg‰ĤÊ*İ*ĵ=R"˘gÒĴ‚Ĉk5ĈĈ䓸?ŻĤ)9ÎdĤ6ñ…şîZú‰Üŭ{z`GŞ3ÔĊ,¨–Ĉ´ÚK7½¸ı¸ÍÜßfh£[=7ñ†[(–’Şž:*VqafyI#¨ı7ĠħµŻ‡ž̲ܝֲ% 4Ÿ …!‹çäêò˙Ç|y>\ôi]"fqG*êùĤŒ‡ĥ$ħ7 ÍF'İ4ԙĥş Y(ÁÁŠG"DXêïK`PKBjzW‹)İÛíŠ6h)†HŞ"ŞN‘3 ù97ĥÄzâŭœW&UA$tċˆ ĝ‹§s~<ĉŸ\Ù¤U5˙„ìĴ§Iµ÷íċĦòETÍP'V–IŒÈˆèDĉ]$l¤öânj]2ĵ֎†A˜Ñdibò;ığ5ɲ›­Š-}bĵ’ĵ-ĝêâċp"|jC,êxV8ʂ’*•Wf am7`Ö=Ĵ8b)hól·/c>‘RĤdp…ΓÛïgŽ™İĜêawœ‚ı·›ż|\+²ù3‰“DfŞXÔĈ…תJè]†Ħc{ ĊŻ•ĥ&"³Q#gYĜĞŞ&žǖÀ\ZÀ}9nûá§îzı犄T•ħG(飏âKƒq§{íĥ'ÊÌygQ;ġc’‹Ò>RʧpßkĜöÓ0‘+BcĉBK‹oö–&>Dĥ.Ż2ĝĞ<İtÊĤĞŠI˜$rM*{ ·;ıôçl'Ï/ËfNĵñ=hp“ˆ"Óo}×k‘ĦĤİŻ“â$‘ĦŽWŬƒĝÏo×ÜaŬW‡â+QJ‘êŬ@ij%ÒÍǘ17öĈO•é–£ÑÖĝBäRÑ×CL"hëc72ĵĴ\˙0ì0÷Ċŝ4˓Á'ÂÔU"ÂÂ$êIbZöp;íoËê̒L“Ċt(eĝĤcݍëĤ÷¸ß~ǃôÁ•”t³Ô5]tċjÉYWç{[]Û òÒ\§gµŝÍüD²xbƒ-§ËĞ%0SêiGcv7µÚüúÛùêdİŒŭ6¸|Ĥ0Êŭñä_³ŒĠé™'ĝ‘N’Ğ]4k6Âď\{ ]Me8 <‘ħ:HÔ§cmùĊĊÚ²/4Î!Ĵ–2Ż–0‘v:ċ@ÄÛMûZI‡ˆ¨K˘DM5ÇMŻüG“ĥ=Ž7?ĉBŽËf^FÜX÷ï%ŭŻè>" ÔnE/ËkòÇĥ´TQċ>7‡Ng–L ‘6[’;ÁŝXî[cµ˙\6ñ%kÖf¨Ñt• S¸Ô&û˙ö·Û Žèāò›a­ôĊŸPÔۖı¸#ĥ:+Ħ”cÍÎŭż0ĠĞQm6mĈ˜5ïqm#ëí„ĜÁĜ :o°^HĠKûփ.Éh2éŜ–šxÄEjVu ó0$-ż°q‘K(p@?|{…€2Żŝ5AŸ5,-O1Ë(¨‘¤i (,ŜkcÂÚŜöf|²l§f5/ñ-LKDí£†˘˜ê[“¤nĞ-뇔QG5JĞ£ĵӆÔÎÂÏsȰb9ŝĝŞĝŞ–•żhY6[ êDˆ6UĴmoıĊ˘ZJjfŒ*ùéô"ä$—·?\a8×ô'XlÖl·5–’·TÄK$ïxĠ÷"7sĥږĈÇÛŒß8µ_ ReäÉÓjj-ZT jböq÷Ċʲ†Ş8İâÍä†İċë¤O˜B)*ò1<*Möüñ@Ïİ^Ÿ2š'‘"k;D-ħä °Ûùbú5„Z²Ï’ÓU×uçĦyiċQsf:y7ġğâÁKÌf–)a5QĈÊË`‚JĜ‹xçëlS|;8¤ ëÀzrħ*ÌïċOKݽ˙L=¤Ş£¨Ž‰œĈö2´èċT6÷r‘ííŽIĤž hw—Œó˘ñĊTħÉ p¨Òäq¨5ׂo°>¸—755’RA u’iKtĴI.I}€#½&cO*ÔRUj-b5ÔŜèĞ{î.ÀÛÔ`L’²Ğ4ÏşŻ›=+İ[Ħu+ĞKmÚÀ_|5rô+zgìǒËK%c şL¤ïí¤ñsk[×|\óñ$µ™+’˙4ĦTé;mŝoÌ("Ëk$jl҆`ĦO¸Ò[}!@*< ’Gĥ-Yl5˲ħ2I}[“ĉf`×&ûíp-ôĈŬ8ȔİàĴx½üGR°•uY }%€_@ô·}OƒɌĊ˜ËÑ&ݍ²¨6#Öŭ†çQ¤Ôú]Z2 [8ÛlË&’ŞĤ ¸İa’*˜#F„˜ÜŬÇĥ/uXf–²I\–>b ì ÷76b£CSM ċ 39Cı6òÏċ‹7‡ë¨äZêjée-(üy\òN×6Ú× BbŻVÓTADQˆY—IƒP:mÁ q~mг(fÛ˙R„s Ñ鞣‚,AÓy°"ßLx%*0w%·û`ܚjĝÄPĈï1e%lVĝƒ“İ‘fÇ6“ÇÓĝb£áse’&¨‰SŭB…G”ĜĉĜ^çsëä ċ§ĝ†Ĥ2·UV->aĉ°{l9&ç‹ŜÇ]UHhë#TBdœ‚AğûñŽR°Ġ£ ÈŜI<Ŭ”-Îä-m¸ÂÊı`f5 Kc݇s{ZŜƒ~Ŝ3Úêë{°ġíü°Ê)éáÊ MP*Yä ħo¤1ħm¸żżĥž%gë *„ŝéµÀ˙7Ĉ:Aucp€ŜŬ‡óĈˆ—²9£s;^™Çm€ŝżlm‘âuŽDıÔ,€Ŝà€E­ë‰f29ÖPé&ÁFê=GµħŒ²…“F†Aĵ×ÒĜV:%ĝ¨˘6§ğ†mgu{‘ħôĥ%2ÔfO2Í,Ò4›…µÂúĜ ŸL nËĠX½··ñS|uß V$û3-cô8ŽReĞŻ•ĜîEż,ie&FŽRzzvÄÍ)Ş‘ËĜğnX÷úÛ(ĤxžhN¸€ğ0a·Ú÷´:;†8×/‘ˆ‘ÔÚΊÖB8ı¸żÔ[œnY"0Ħ(òì{˙|j  ‰†´r ü£m^—?_ċŽ–(]D˘’BĥžHç¸ß~N%D˘%— -À׊Ċd²^]âĝœ†à|ۂ/‚~$%ˆVQ'”İÙ­Ü{{â{VGIàĉ")àWà‘upxĠ*²Ä”“{n{˙|dúdHĜ—7•ŻmÏkÓĴċTù9P,{oÏ ö5V@‘Éĉu½€~c‚h¤xŜ#$ĤKîàîĥô<Ž\E–)zl€€wż·'Ó>¤kÄY‰k²iş·Ĝàô6‹î]|×$ĝ kérìd2ĴQĊw‘VËvŭͰš§"Ĵ˘XŞĦ‹L2Bj$’c½À_kêħ)“$§ĝĈ3ĈnVF 1ÀîMöĊĈ›,‹=Ȇ@!$1MrS?(¨Eµ'Ë`o‡Ù?äbۃÁçÍ_û–˘˘ž µJ·M èŸÄŠäë$›saoolBñPGš&è֍Ĉ’b7Üpqtž‹5Y…bÍ:ËO „;cĜےvħıĊ^:<ĵ‡ž½$¤aChĴEĊcħíöÛß Éfİ28İĜO˜ÖS f/Şy‘‚~[í5I˜Š:™t¤³eáÂÄ%° IƒŝwÁqĝQ?]=F7‘ĵöíµö﷨dž_ uŻ–Ò‡™àŒ%Ĵd$Ŝä}­ôĈ_qhŞOĵı%@™!‚ĦÚXúLtBHW_”܁5E5,rÏ`ġ P]Ë$QšopŠNç|áꊸ(éâ˘1)ˆğ6ÁĜ Ǒƒ+âŞĤvŽRüÏ ħĥډÌ6àž/ŒÔ•iŒ(³*L8Ċ3[ħŽ;²rı°7NĜôïg™ežZ·YúžFĥÄzXÜ[– JĤ‰ÙH+x‡˙’ŭÈġÑżgù’QÁqéWY\µĴ6ñ~ñ“ÊŒ“­9!U[żño}=yĊb‚^Ş)ŠžPtŜt˙P[²ñ{ï¨mÛÉ:w(GC!8ڒ{ĵ‘ìXĜpomñ@ê½:‚T)ÓIVN;ĥ’ŞH Zu^´o²{[½ıß{ïë†1TNìg­”ò*[nâûqż·8Á<[,ċri`eÌZW ,l6µVMÏÊ-żaŽċ¨J¨ç¨uŽ£Ş˙žĞ-üGx”£ô„¨ğ"ì,/¸rq ÑyÉ3L˘ÖéH¸{žçí½ñÓÔDŒĊ’Ga˘ ”z Éí˙”Ŭ˘žUŜš¤”0/"0uŝo(ہëߟÔU™í/Rhb=3…Óĥ÷;oc˙XĤI˜ÏK^³Ä:Ş`’öŽûƒżùÀS-]tÒÊ DmÌħÌ/†äqßbvñĞœ’ÉšŠ·ĥxòÔI ˆ#É `F²I#Qĉ˙CĥĜ­UêMÊIL#nc%€·#ħçĤĤ™KĈ §IX™‰/İßo^ŭıĊ7Ì#Up—ÑĦ"E7f'›}77ĥ2w'’’ĦŬ+=V^ŝJƒ1 DQ£ È$qÏ;yYje™!›2Œ n˙V¸ÂĴ–ŸàŒÔV X–ìħı^›ĥ÷üjšĥĤ§’TŞĵĴÚş‘Ä.ZÀv'Ĝ~[beK Œätġ’›<‰ WĴ½O8RÌ €×ħĈİ$­Ž³áŠ2"³B§}>‚Ü2ۏ{aE]eqİ0ĞÎí§N¤yHċğzïĈ ™”ÔV 2–uH™ċÔŞ×r …îNûmĥ‹’Ħ–Ĵë3 PċޘǠ,dÄK˙/ó<\aE?R,ĥži)b%ĜU„]%}ħŜÂÀ{öÇ'-ÖL`ŻžĦĉ‹U䉀•ù`ïkî6¸µvOReĞJ† Ĥn^üàEí|‹†&¨Üôôušj!„FuT0eÑk ‹ ZöĜ¨áPZ\Êzéa1ǐ"Ÿ“fmÍÇ~ĝ°FeXYċL‡ZE7ÊĈäê>R{[ÒûßÑBRIšZgcÎèuŽÄ¸ıß·c,ÖFƒ2žJ zE¤H#HX¸ c§bkí‡ı5LkTÈñá בHX›Ŝ÷ıž@o“tßĵb•4‘˘ÙԂ/ı°ÚßÏ2޸˙ÒÔ%dtĴ!,áôäu6Ò7½·ŜäúaÍ:Cïf‘ÔS·îz8y†Ş­·°µÏŻ|"ÑĞLò–ş:FÔĈXXîínMíî>Ĝš°O6İiĤĵžam*½ï}÷öÂGİ4ġ­$ħjúieF uÜŝ›m|Laĝµò:=8ÍZ“4ͤ%„@4‹sĥߘ÷ÂêO›,ĝĜAžfdŒÚG?+*ŽÂۓo¨í€c™ĉ¤DYgéy´Ÿ”íkž­kç€*h„UÓËO Ħ’~ŒúC8àŞî} ÷Ĉp9~$ĠĴĞ3ʌÇI4°~$E­'™Hܸ½—PâÛr}p~U™~‹+ÌU!ıÖ°Cİ!šÖ:ó܎ö8¨ÖÓшb¨§Ĥ‘e‹ç%ĵèmp<ĥ;ú|?ËóµËa„ĴPSŞQd$mvĥÚğ‚9ġġÇZĉù%Áx)àÌÈA4úݵ,+(.Ú·ÔFÛwżĉ<ĤëcYG"!w•ĈÊàSn÷µŻż;`Êĵʕ3ž# WŒ:^XA$Ü>·;ž1U\µU²ŽŠe¤VvÓ5Ĉ #‘öżlfùP$j†jx z*jzjšd=6Sâܛ܃ĉµûħŬvf2†Xċ¤•Š)XÚà°ĝY…ĥż§[ŒhM5o$"7–§NĥmJmıĥĉûŸċ…9½|ÑPħޤrXXŽlĥħçnĝÏŞ{(&G„FġrO=*ʆ+4]˙ ‚nE¸#×O–~òZXè]ġ~ ħ+½–ÊŜeâÂĝ_,1IN!0<Ĵ¤¨›ÁUÍö½ğzŒĠk§Š‰ŞdCbúÀ†;nNĦ¸íkúXŽÄĈĝrc—e%lSDÂ3;-Úì ü3sÜ[ùŒWŞ2Š™Ò£,Î.Ò Xà•˜ĈуqbŜ`wŭÉúİsı f’j:·‹N†M¨äù/͸7 (Ğ–ĥ´‰!@â5Vòƒ¤\l;xıĈŽo­% Œ]ĜúžŽI¨o˜$óYÀEĤr ;Ú÷Òn?.}°EqL%–M2'úa•/Ċ•AßıvçdŸ1|êYMl—ŠĉÄtħĥàìoê6ûàĠZ¨bšQ-BK¨İEumD˜)7÷öġ1’*ŽhrÊÜĈD*b£ÒMĴIÔıúl>ĜîĤş†F4²B£B†P=‡›úßSG›F˙…ÓYÜÚ3N@¸ħ`E~-ßÓ•tòM˙‡)gċ`˘O.Ö`âÛpqMFìrʅ‚ƒ‰ĉ¸ÛĉÜĜóÛ\ŻÄQ53ÒÖħ3ĊS½£[XÚêIùoÇbn7ßšúi%”EWG#škO*LroâŒàlO5ŭpE]]U˙áµ=2.°ŭA­Ööfa}‰íaÛÛ<Ž 1J*J˜³3áV+§2ËETo LhÇP;3 í÷ ajŠÌùşÙİ™ËÇB&~B‹_}Á'ŽŻÈ3lĜÓÔĴ󘣞˜†£İ-L}yċÛĞ­U-½ÎçġÇOW˜|‰Q/J'şFċCk#ĉ7]‰>ûbĜĈÏP!H´Nf”ùXá²ûé{óıöçUğĵI!•%êRMĜ8íé˙XTı}CjO‰xŬ­Ó‘Ï;7;íßÛTfuĦ£ŠıHŜï$+Ïħı lnIż¸zÔfkB?ù.m˘9µnö`;“Ͱ·2jÙêĞ$²,´S´q“êçcÇÓž(rԞpòMRç"îÖ?íáx ^Ŝ¸“Ôôy–YOôò@JÎ “iMÉóÛ`/ŜÇ’zÉ.IG9TħÇ´>“İÀ9']ĝôßT× v$d:˘ê]­è@½…öâĈŜ˜µ$2E  ‘f†!ŝ´q‹B vżħîm*9½ µ|ÒÓKĝŽ J‘*˘€l )¸µÏŻl%—‘'lš ĥ4ÏRGRLĈUl—ħ: 6ĜqĈeYšX"6™˜²BùJ’T“ıµŻp-ĥ‡+‰rĥIş}I”ĜEı¸&öĠôP°Üád-K …ë mĠŞkv nğñŠÀè°ċġdòE5BKSS˘ÊadXǛ³oÜĜn¸ f’œÊ˘ 3ù›\ĥSĥÖ'sı›}0’Jö§V™çA´ç¨o@EÔïkې~¸ĉ7Ħ-2ÔQMO Ĉ Ûİ(·$ĜMì@½ħ¤aybhqS™ÍG›GžšĤ!j3ßb…û÷7ġŒ=ŝi•ĠRI5~SX҅ÒgY[DĉÄEJ‘ĥäĜ‹“Š–h˘:ı*c‚‰AK¨à 1]Îûúŭ0›]W–žPò!. Ç<íß:T”_ɛ‡d\2üŝ†,Ág–˜Ì²:ġ&Œò6s` û‘‰óßE˘ ş(à`DÁIärÔ§cß½ħHJHe’™˜Ê‘fd Œ-pIôâĜu—ċÓTĈ'‘É0&aÖój`w²í÷[żĦÇ<ğ4êÂş"̀¤T6X€Óbw+`6<“Ï×ıĞrġ£ˆ¨Ġ5jé‡óJw‹ZÍ÷ïĈˆjd§Ž]=,µHp4ëŬƒ4öş“ŭp]NGC¤²8G,"êu·..˘×ġïÀħÎ˙@ËaPù<ħ£‚ĴÊŜuħٙ›ħ·ôĊv§,IjsŜF§HµċÌÑÉ1&ËĦÁ7[Üóa…ôc"ŞEž½êŞfQ³ÈH {u'Ucê1c‹9§ŽŠĞc†ħ•B%„8Œ[•épHïa=[#­e<š‹0>e˜¤Ş÷X£\´jx‹ mkiıĴ-{s?’–lŻ1ŒÖGZùĊR?FD)ÀĴÇPĜq°Ü ág™ŞäÒ|kU"ôµôтëeıSu+ߛíĈSĠÓ´™BĠĠÌí$¨…ƒÓ¤Ú@kĜüŜğâû)dqTq›xw:‚ŠÌsĤĴV=i!…HHŜ×Ğ}ùĤ˘òBÎşËH]\ۆ'“͏/ÔVMOQAB,Ħt25ˆ™ kíŭol'—&ĤAT5ŽzĜF˜‹jżñQÀı¸ż×O“TʅC‰7`HaĦËzaÜfÜş4’‘<’(Ğo[Zû‘Éí†Y&C•Rd•ÙuÍ&:e‘ŬU¤ rĊT܍׏Np³#Ís z39EXĠ¤mqDäòx6ríˆĝ0şYf  jñl’#hVNoİ­ŭ· žjjşÀƒ)‘äy ^II¸µüÄî{›Ü}ñŞlÂ3]*8J• H›Ğ° ÍĈçÓ,½ ıcc#HHC$^qïmííÎYlCxҖZhh X§ò) Nž9ĈKeu’TA$0GeFPĤç¸ß·{ÜKY9…44ı}dÊ4­TA„Ġ÷QÍÁĥ'ˆâİI>'÷l ‰QHĴÎàéĠsıßr=ĥÄ;ĝiİ95R"¸dŸ¤Àê§`µšÇħ\›oŒlÑŬŬHİVddpŞf ×bI2nϸŸŠË<@-˜UQE˘#ç›Rëp¤Ğ\5ìMĊ¸â 3Tâ(­JŝX×ĤtĈ{1mì ä“ĥÛcHÊM`j+héò:ZU˘’ÒŸ§%JÈş™Żug_˜mżÖÖĥRWĤ]:CҎĤ)bԁĜİv r÷· hĞ3ŝ<“C_PÊDħ£´l7Ü÷¸èÀt• WĈTË-U`Ö­CI(@° ]ŽàŽ13ÊĦĦ¤§Ìó*c2=·Ieu]hŜ`-sïħïĜ >ñ/€+2œÚ’ ä­İ³†6sp?ˆûƒÛÛ ŽDÙvkX”-MRÏjŒÏ.ۖq¸$‹kÛĥ7’ĝʎކzJš2µ££$ĠLUPö@ ›ĜÛÓâ”rM°ĜüžTÔÑË2tÜŜG.BCĦnn ŭü}u-\ĠQϘ1Q(v…É=n?L_|ù†k[4s‰2ÚxġEĝz£Fà­ÍŽ÷aüğÄrċ”u2d+Ğ’C D#GBöܔôwĨ*í_ÉMÌFSWe'RzjÒV9 dĞ·~ßAÛĥ¤pĉ+SLÄuU4Šx·çĥ-uYÌ´I–ÁԄÔRGxäġµnĊUğİíÛì1.][–­–˘8ç™ĜġŒ‰Ó$óqao×ruíĵ:E^X§0Ái!yĥBÂÛiĜÜħVċ•áşJ„EY×T² m , ÷<~x°ċùĉO8QO>˜Ê!§s­½u“Û{Ûê6ĥ*ġWĞĞw5NÏQ­’)J‚€ ŜËkatQT4ĊqĠÔSTN²0yBĜĜĠï~?Ÿ8j*s<Ş8çVW}ّğı İú›{`W ĝv‚ZĜ…,rħWê ÖÛ\Ï~pmfK#4I9Ž5…f6‚5 ÛߑĈ%8§R@ÄùÖ]$J׆Dİ?O$uEÏ:Ĵ|§}Ĉü{b¤ħ‰äħ‰ ­È`msêIüQHË"Ôݰ¤BÒ+Xïënŝ†ĝXoMÖ1N&7)rĥl7·ó鄗…Ĥ Jè)–œ‰Xm·7äo{`Î@’ˆ“C* *È,÷Á0ÌóÖ$ĈĤ(=-Ġ'u ÜħŜĥ7Y)Lèşk™ä@ı @äúcT²!OQd‘že&ŝcakœ̒TFт Böf½öè9Ñ1BĴY é-§I>–ôġûâáMàÉV•KȂ’ g1q°CµÉıôûàœÒM¨žj˘’9“ĝ€ŽûŭyÁQ9|¨D#xâ.uÈ£S^ÜĜlegZ:ʈĤXĊK p °ĥì Ĝ^Û‰r\ÇĦQKRNíÜıž;ŽpŜ€—1¤›-/5$@ĥxÀ“f÷Ûż|°ğh’BÀ0ħhĵÖô½ğûaNJ䆺iŠ:h’$ mDîہ~{ï…yDŞ’Ë ÑO`ŞċA#ŸżċˆN`A59‰ î<¤ZíĜƒĈöíïŽ+zHà‹Tj—$È,wħ\íŭâ9§Ì²jz*n›ÊÏşHÊ [ċ·ĦĥÜá bIדĴĞÔF!ôZÀñÛkbàÛQ•–êEüÂŭÇ ŽGDd$$>œb8BŻmŭÎÄöĉ>˜AQvċ½{oŠ`ˆ‹j›° ñŒ°yé°Žm퉤4’2Jñ—S¤…7Ä(ÁˆÔOÓ PRBi*%: ·²4›NŭÄô5rÁ,€Ħ³G¤ü)ĜXmKàEd`…ÖşÖ÷ŽŬú´Â£LÊU\ħ` í|d˙c#xÄƒGWġ—·|s²RTĊ‚Ü_íŽBĠÑʔĠá’!°6eـ÷à}ĈċÍ*”ĴËĦCP²ij:u ˘׳½ìEŻsö s–“0I$a!Ö²ĥ²H/ċĜĥ#óĈԚ!7e‘3˜Ş)––\Á#£†J:tÔÄȄüËü µÍùßÓUÔÔĈRz€òG$´´RYQlçĞ"܁¨ßc°Ċj˘—"İÍ!JjŠˆc–Aär§[Ĝ·f½Áڵ̲,…Ż•ÒŠè ž+ÔKĜYËZÄıÛ°zƒ|IŬ‘Ĥ¨ĤI-fkIH’E/M:†.š›1Ŭš×½ÚöĜbIjW-Žž­Ş ŞĞ”0zr·jfÀ›‹j°;û‹b Ç7Ì3ĴÎZÉçó³$µ•vµĥĊŻÂsĝ?÷ULĵ k )ñŻ!po~Œ ^ŝ˜žÉ;-ގ2żĝ‡Äù3ŠYièéJ‹ĊŻAŞe"Ĩ˜ @êmğáiájOd´ÎëĠ"·Êb’çy`oµ” Ĉäᇆéó\‘Ş)òxh$“¨²¤†DBĦQÏÌN­cßċÄ+Íè$Ê#“:yáÎ[WZ*uĵé$Ç'›}˙ġġıŜĜqq”;rí^ê+r™k$dŞT’hê•DqƒĞ`@ó¤oܐğóqĵ?žfµíRäÒÓR—§1­L ĈUE{'.GkÏ|#¨ĦÎÇĈċŽ”Şİ qrÂۓ½ÍŻoS‹g†|7O ;UWRÓ9 Ş‚iunK;pE. pÚïÂl×ó8Żİ;NƒİŠ2úc’=•wĜƒÛk˙—ÇOt;(Ŝ(ÊE$tO!òtÈ )›yvöÂ\ħċjĥ”‚Ë uİ* ­ˆž1{ñw‡Ŝ*TJt’·LˆŻ(`l·òÛkۛ›÷ xF\Ï(–*žf†[Ë3ŬeYuyBêĥÀ\žÇyÀċ*VQsZ™k+êŞeĝyZ8ΒJŬxŜ÷Ċï9ĤPÔrȌ‘S„h ˆ—HX[rHçÓß 3ŒšJ?MCRŜsSHÖÊ;oë^ñTK‘eÍ$5MPħ dİAwPw mÎÀ€ğž1´Uş3”İ*<Ï?ȆȨ¨äšXـÛËb‡”Ĝ“~ĝİUPÉ_$°ÑÒ†2ZK÷ĥ×µż\7ñnn`ŭgëjÌşµĊ×Nŝöŝ˜âbɄ=jŽ„ZšJGuUû(;ƒn–1ž ‹Ċ„| SO(Ş0Fžwam>·ğßgù6[- MK*ue”;ÎX‚ÖîOċï‚ċÍè!¤QFŠħ$%_A>mĴ9;Ÿ|W$ëTA҉"@cÙ½ ßc댖Ĉ²,5ıcIĠ ŞY"ƒŞ·*†û˙3ˆój:³,Ÿ˙‡ &.·–úb9+ŞàÌb5q†h˜Òµˆí¸Äµ53×?\ĦŠ–˙Š·Wì@۞lOç‹-x]<ŭ<ŞĜŝ8ŒŞ<}#”p1êŝñ>W@`–:‰°bKë¸=Àçí¤T·â@‰¤’Iu)Á Ĝï…Uјk'ÖMĴĈäïˆÒ9`¨Ĵ_^À ïŠĞT‚ŭ^Ġ9mT‰-7N_"ĴjO,o‡ë†>¤Ĥ§Ê³ ˜™SÇcœU´ıuU4ŒèJĞNFĤascr7ú|áZjÌÖÙ43ĠR'Âġ]àùN•ş÷œ.ÙhN?ŠŭL—™fwášş”•u ·Ž’4ùtŭİùïë‹7†ĵ?•QÖÔĉrÉ%A&¤:l¤¸8‰ÍvWKG$İQ˘Hd‘"'Q /p/Íŭ=ñş|÷5‡2Ëéèëš ´RêdnšİmÍËmßïˆŻÑv}59u‰ŒjÀĜkĉŸf2ŝ̨D&ü&³ €á7P}~§²Ŝ8ƒ÷]Yí;,°u„ħ1G_öÛ~mcÁßĥJÑ-E;IUB‰Rt‡ˆò;Ŭ\mÈßĈ7”g)SÉĉèħȌÔämŠ“{ŭqÌTo#)”„ˆ1&ĈŜÜa„ùL´Ġ?ùEHĴ² w¸Sb~„_5UÄĦä‚.N’Gğó‰ÍÑĤ°FFğ(Ü Ò˙ó޵0ğZŭŭq܊Â6bÀ1²” Ûüĥ8M*n`w× ÒğĊ!"ö6¸=ñ,RÉp·Ò܀v=ñÜV~²NĦ{“É4âÊĤy_h•@Ğ,şĈú—ċĥûë뎄¨OžQä'Hmìn;_ŒFİR^‰{Q`¤okñ|òT²'˜êÔ‹ßíŝs…V;'¨…‘Ôtı'[mÉàğÔK Š0‚D@Ĝ{w°ßÉ, OԝĊî\(ôÀôï#ğY‚JlT—ÓµĴoínq5k!‹::Şa ˘ĊAkŜÀŝĝ.…2Ȳ­ŞöÛċ>ü`h¤Q/‹jĜìÀwKĤ (ñ.IĜúïàwfݘuÚ Âц[!ğ˙Ÿ\¨#éıfÜûàZahô7PjN‘¨Ÿ[~X™)ŒJ‚dd`HżÊ;qëé‰ycC<¸:WĴÄéĉ‘‚ ó`HŝŸ\[²ú-›TSB%èıBĴXÛĉ[Qö*kMC##è0HÁpşÜ§ù|n†’jJċ†”¤&Â䟚Ŭğ}ñ”×lcşÊ™òĈ‰ëjlÑĉuÑO&”üŜ~ímVŒW§ĴzŞ[â+ĴÈQU£ žêAŬl ÇòĊË;˘§ž”u"+PbèÌäžĤpìEö%ż gKn³³/•ThT–üżÖŬÏôƒV(ğÀĞ.’":*гÀŻ3T˙ğo”^ÖİĊ• ŒEO6—Şİ¨%ĜH˙ë ô°úqµ½TeİUNÈâJŞ˘QcÚGŸÏġöŒ%B (ï[}EYl8ÛîqS’•ĞEĞ&Ŭ-m Ó3ĵ“FŻ-;ĦVRıß½îAúˆaŸ*–&&5ôÈá › A÷÷Ċf\Ċ’9#™™€Iġì/öŭ1rÊ x¤•zM:Kĝ‘ı ځ܃µïsŽYÉí™ĵ•êX²˜˘ZƒÒXċmv<­°ĜzáŽM=]GކŜ@ÖĠmĊż•­½Ĉ*ı”´ÔÙĔôî:.½M'ĝ,Gݧ×<ï_—Š4•RHܸÒ<ĊNÖCú’q²Ğ%— ÎY•êi¤…™Ş%Hşyw ï°ö÷Ċo3CE] ÈèÎÏ*‚Kƒ¤†ËµŻTjêhiښGuF}iŞK;“Á[{ú\`jìĊV‘D Q+V³½lR8}Z@³+wŜÇnjFIš¸X!¨^­KJTâêMöÒ67ÄíħĊÏ, W„ŽM;tùmş›.ہϷ}°ƒÁ™|Ğ1¨’ZhDz˘Z†V’Çž˜m‰µ÷öç¨ÜĴ5.wގ ñFĦ…ónÛm1d·â4 5\$ˆ€I&+YĊì9żÉ5<ÓÌġ+ÓĊ£[)[Ü7‹Ĉö1sˆj$z¸fgŽ(ى›K‘s~l7íoĉ$Ğ™Jġ:‰Òï×qä$yŻÚûĜ ğs‰j°5aĊf‚8‘\HPĤ•ÒµßôÀĠ1—İÍ$°°¸-(~ÂÄïaĥÖûàYóτ¨Vj~ßIQo}FĉÇom°Fl*j#R:„ù*4›­ĝħ;óoĥSV>69#Ĥtvo4Ò!*àú ­Úä`ÌjyŞúìèĈ™ĉRÇaarM˙]ĥÂêı֞ˆÓ-DÓ¸¨Ù£C· sbb,>¸ .¨§lòžZhjDQ›3ÔB›€M÷Ĉ’’kQ= ş´I/A#ˆ`@²‹lFċlv·ż)Ùċtµ5-EgR'abÊP¨;½G§ĥÏšÓ _ˆ,Ĉ&5’D*ċ·¸µ÷ßÛßı––ޝږj‰Ž2gIXh+¨)“kö·ıÄ'{TOU›ĈîñISĝA–’7(zbۑ{×ÄԙÌÍ,"&‡1 U°w 7†°kożÛeJEKUK˘v6’4‚6oÁ°ÚŭFi– İguf`Żsò77 _ÒĜ˲xDˆdz*‚Ġ WÒİŒ‘,Já€y{Ĉ[Ş‹áòúx+zìÀ~lYqc`=ˆż8c4t½ZT Jz’G"››oĞ` ­kñĥĜêĤ‚4ŞéëIİKDŻŞ.˜ĥ˘ÂāħĈûŽĝ]´ÀŻO–ĉ´Ò|b• f'Ê6&Ëħâ܋úa•^EĴ­=Aš èzuM2}´÷ĉÄĜĉ%9LĤT3iµ2,w#ŽÛsèvfċôq­|QP@*ħħÉĈäm·<ïıîÚ^ÌÖ:9–žYĠ„i¸K*‹ìIŜâ÷ôĈäÌfİ Ž:xS£ ;UĜ5ĥîyû`xçÍê ™Z{İ .t“ı$Àµ€ßluI4pUŠZ(çĞĤfÑ!µžÈÛ°ïT1äĤI ¤IĠT§EÙlm`Äï6L1Ë<˘Ñ„ùR9´-k“kq½íë g§?\’3ÊúbpBµŭżŻŽİhÑĞSáèeÖ²`“pÁ}O\˙Ŝ&²"kš–Q’w³jBTİğžçÍ{bLŜjJŝ¸m:ÈHÄŞj'ÌZ·×|5\âŜ £ÀÇ[E b­ŜÜ }0‡8­–£/@éċ]­v$ß}ì;ÛΆĥBġ”Ù­P8Ím2Eİ ¤Ü}ö8:’‰òĈ>uY@bírT=ÒF›¸ÚĜĤdó´ġ%LúdAŞQĤïk|ÂÖ°'ÚŬísŠéà¤êĠ™jkmıż7=·Ŝĝı*À5CêÌġ(ĔóĠF’É*BV@v°ïġğáWĈ@•ë_:4qİJFmÜê77ä_|’µd ˜\4¤–'Τ^ÌG7úàzÚg‘Ĥ¨¨­”;ŻÈê[¨6"äín ïÛká$´AùL9„ Y Mgv‘.žó¤lmÛg§փ4pŠ`t=dmKnżs釒ċÒSd”Ó“wfê*ÊċPm¤(ä’;û_ŸÔɜÔ&a]Ş˘şĊ’P@R£(&ŝçï8ú *Ԏ Ĉ ¤…cEwKHZ÷ß ’IĞÒADĤiĦÙôke ¸à·; uGàÑ&tù~aR!2²QĠ+ŝÊx#Êo}ĥ%m}ñ5FDùvaĞÇbìĈ5qÜ3\%8Ĵéħ\Ôġz¤†—JŠ·6ò,=HÄĤ„QT|-}cIÔ­÷í‹ds,µÒaž™KGR!B4wR¤_O{bg*T&ÎĤ‡/ŞËE$­Ğ¨èéFÇ${mġ8†$Ì£€VÓÊ –k„ıÓuµ´÷óµ…ĊÎĝ‚‰Pf‰N*¤–€ŭH›|kÛlWя§EĝpĠĴĦJÓµ86ó_Ûßĥ1Ŭ<ÉAz½-)gˆ3 ĜrvòïkólXj*Şäǂ6Tê4ÀîIíĊ°ÛâċŽ‘[Ħ"F ;^ kw$snFÜâż%tèóTÈ+“dC‡Œ[q¤qħûñURñµrD̈ ;(ó‹Xïmı·l˜I4² xë u‘|²\X‹êÛ‘ü&–E€ŝ…€ğoÏ"ûŝ‡ f‚%Żž áİ’)!!u ħ$ìSƒÀÓ¨[):e ŝ"yİ%´_q 'Pġż§XŞZÊe†+G ­—ŭċ‰ì-‰Ú7İŞ4Âpʖ,§{ò-ÇëŽ3,Ĉ))ᢎ-Ĉ-,ĉMI)ĉöµöß0Ê\ìôbĦIċħżV(܇ó‘bN­€Ĝb j&‰ÄZ:™¤V îĤµù·rw7ŒĠ°Mħ¸ ğtÜ Á•Áŝ˜ç÷œÔ‰Ñ84ìo`Ħo~oµ˙\ ?ĦÎc$t²…ž²–ĥpÄ+P”@NċöĤ$LĞáİ"ž9âc"è²ĥ÷'c}û}ĠR§Y(£˜”#¨L‘ỗĥè{†(tÂ"­ÒD†G-Ò`ÛĊ‰×֐¨éꤔùĈbbšx̉#Ê4 XĜÛ_Œ­ ‚ĤĤ²‘§§RÀMş:‹‹‹q¸Ûùá˙„Z Q;Òˢ˘KĤù• wàYEùÀġ˘z:ˆêa˘x3 ‰:0ŜKG îEmÍ÷ı;-ößoDŬ:( ĉ)µ:£İ°÷:;ƒ‚İVŻĴ I,Ĵċ#½?fÒSR˜jPĵşŠ"ÊxßmÉß½°1AñĤ˙ -›~—|jh˘Çàùš*~;ÄVf•‹ êÒĉöl µŭ}d’xÄ3ÔÑP#BHj:ŠŞáŻˆ½Îç~,/ĥ)VYs¨G$…‘·ç^÷·ĥĝdgĦ\§0FĞzİÚTŽ8–! ¨9$=6ĊĤĞöKAıÛˆY¨êİ*GCFµÒn|ŭ›sııÂÑ™4’ÓÒE ÈúŒqSŜ‡{oïˆİRI_áééL•ÄyÈ5ZÖó=Ġi¤ËsˆgĤŠ7qc9’Ëlob/·|g7ê "ѕxÎż,É䆁¤Š*ŽŜb7·>÷·ĝbı3šş\”QkÖò€ƒY‘‡ñ½Î€MñCŽ9i³8˽ˆ/M مö°µ˙?Ĥ‚nŽl•}%9ÔèDJFÖUı6ĉû˙vµ%tġÍ<ìĦO˜³:€ĜvĜo„’d=6a˜ÔĴB––q¨ME”M´Žüâ¸Ŭa”ŠŬ>W]QF•}Š ^I,–ú·ċïˆ ­&bcc/Ç)n¸ÔÛĜöĥ›Û-ÑĊ‘O•+5m\‚9zd”UYʋ…QĞP^äĜvĊ:ż0\Ĉ´0 хĠ!i5ıky‰nyàĊħÑmĜü’2%FŒVŝ>yöña“Äu4I‘ċ¨fÔZòÊ<à ›ƒ·mííŠÌĦQUw Òá·?Ûx~aJÍ6™DÀhGSÀmXŜöur]t‚Âĉß5ݰÀԙD0ĉqÇ.a–˘ü|C+ô8Ö( Ħ(5(5ıÛK:ùv ü>Uäóœp#rĴŞ6'{ sbх#ƒħ÷Ċ íċ3Tĵ²’Îĉî{“ßܳù7ßÓ€:¤9m£@żˆ6¸Ŝĝ+ÀM4HµÑ­D¨Y€a{qëìq·¨=7ĤY$hC—E e'€À}ÀäĞO 4#˙ÌG°<âJjİ)s iÑ ·OVá7¸Ûĉö 4U)ĤU`ĠF­*Ċläzô,mMNĦê z8Ò(ZY /Wb@òߓ¨í"İ‹÷YÒÒ¤Ó.µ2³ŻÊ˘Û‹{w>˜QCXh:¤Ĵ'/"êO}>¸‡ùhHuQ™ÖÄRŒf1ÉG‚(ŸR=÷äÚĝ_™ĊOQ™“†á£ğ3_` 6üħ.Y›Ñӈà4à)7rTlÚmkĥö$~xg”U Ìċ¨Žš .ÄY `<£ÎÚŬıâĜ›qŻ!—.’8ŝ.9'˜1%+\lo·ë„òF#žd¸:Z×LzÌbŽšzŒĈ ÒĈCĴ¨Ueù/ÇŜŭħKͤŠlÎĦ৒ž2İhä}L<£r}ùĊÁ·ħ-·pTˆK9ğ…IğNĜàĈ:i‰‹¤U~kŜÛA†ċM,5èar’ wçoË™RĥŻ'‚€¸=wVdRċAbIıÚÁn}qLƒé°6Û*LÊ éèE<@Bîvaµŭ½oġĈSOhÛQ%m|‘:jµj†0ŜFüñÀíĥדW]O ^I4ĈKù›X'mĥۛ`‰sš¨kRĦê˘¤Ħ 4ú-Ċ½‡ÓÔZ“9Êó*~ ‘Ĉî/¤ë$İí{Xŭh[fyiĦÊ*+Ĥ'ŽVX]V&Ôdù´Ĝ›Z÷7żĤĜQK4ġ4Ç$)ÌK`HÜ d›Íî0ëĊ•-AÚHRRXv /÷ġÛĝ':\:ÚY¨£¨ŠIG”5íq°;aEŝ6ĊnĴ)nfĠUIԆ"X˘—K’ ĜĜXŽ ïż;,Î3şˆ˙ M-;¤rJĊTÌI ĜjÀ[·Óĝг+ĝĝË(\,Íf¸NĉqnĉÖÜ m…Ĥ‘à­JÓYNbŽ"cĵZ×Uĥ@Ŝû mĤ‰ĤòK“WM—VRĉ´Q Ġ?`ä9rMĊÁ°ÚÖûƒ„FşG:d_((sv·ÜÑÏ(¨ž!<Ô°ĜHí¸PM–ç܍˜Ž(şÄR%5êL—ÖìE[^Ŝ÷ç ğY)a›r˘(ëĞı¸£ŭ0 ìoë~Ĝµd>!?şj(¤h^¤ı“ñ˜Îù[`ÂċµlNâ½(•½‡‹ŝĝÓ9’KĜ ‹#2ÍQâú÷ëZ™!‡§ÑŬƒ3)ûmßqĜÛן04Ġ9ĊA™b„G z·ĵĤ¨Á#œJ#›\ĥĦżÒĜ—ŞE$B\ï-94PušžPcPÚT[üĥĜíûm€òüâ.³RT´rjÖ˘àDGqAħŝqMViá€Ï3ı×'ıßÓ¤Žé鞂 óî ĊSsıżm½ħ”àÔREĥ,Ö<ş˘I\ħŻUzatµÏ “ê íۃpeގ\żRÍ:Ï0cCğ{ƒmıħÜà ùİҍéá—âJşY‹já;¸Üú`J֟&áä1GW)ċˆ%Ĝ_a·Ĥ2QE$Z²ŸeôÙrR½ p?[Si µĜŜû‹Üúûo.LëSVçZyZ h‚V Ö;“¤ìmÍïêñEĠ‹W§%u됸ı6ܟqcĜŝXŜXĠb ™v-{ۛZŭ˙\[J˜Ğà÷:ŠȒ–JÎħdÓ²núߛbıœä˘™!5U•Pʰ޲ùÑT[Y@Ħ{aÁûŠOPRÉ8ÖZ4,†=,„€,˘üô'ÚĜŠ?Ó-Q’i˜×(+ ÈÜ`vçúžĉ™šMd”f”ó£µĥċGVP6uoÛ遳:YrúĜf™‘HId·ˆ ïmŽŜ˜ë°ĠÓTĊYU4“ĈĊ–@şğ(ûúvßĤ\í–TÀ+9$ó8 b#½Âsn˙lMÓÀ´Ċ™6YQ“f´ĠĠ`J³’`§yOá~k÷°ú(²˙s P£G7MÓU–öä^àîEx=7&ËċÍL )Ôђ•‘°ö#ï<ŭŻÄ­Ş=*ü"ħo{°ôĞÄ?,@dċŬTİhÙ ›zqù÷ǗŝŞ›1ñȒjJŠ1уĞgĜ’xŜĝÛ½ĦB)<ïÒIL2iU•%˘: ğç|Wu::¨qÈ^~¸¸xĉXdË<4"Iĝ9 –RĞs)>[ìGÓlTck†c‚&¤°F D~f_˙•ÜĈ;Ş Öaögb\zĝĠ<f`RÊö;}Fĝĉµ´Žu7°#r÷Áè‹/…géÓĠĞş'ŸŝŬħî²ÓÓŭSˆb-"I8ÒZÚÛ[[~ŬħóÖIUӒXÍÌ|’Eïµ­Ħ?dŻŻÁ#pmW0°í½˙Ù2G’ċ²xë7Š|µĉšVž)(éŬT†-qĉcĜğߋĠ²lġÓ˖KÔJ…OPh"AS{µ­Q“1ÇY½m3˘i´™€£İqǽ­‹ì̙L™­S”ÌjA’Ö½¸m·lgËÉPĥC‹ìŸ>&ÉÎiG%55RÓHY ÊrħFŝ âƒ]àİ+~ :ŒË2Š5Y„DqĊÉ 8>§Û“JĥZ֞×]ÔĈü KŞôşúTrıìGĤ8c)GFÇÏóċ™îO˜$§'’žHêùĦêŸîc¸ûí…U $2";Fu X0ŝv;qĦ3Šú|ż'Ì_Ż+L°älv?ŻÎ</ŠCÔ 5’wĠ˙Vŭq× ı+c_ĦîU‘×ĉ5ĤŠR!¨ñÈÀr6ò_Ĝzbċ–ú¸‰Ĉ£iW c°µÔ÷°ù·Ŝ¸Ĵxn‡1yék!§%È-ú:‹Ğpz×ĜŒ]²ê—¤£J¨:oôtè}-İÌ|Y˜KY”eŸpµXA;{ĜŸMê™îbı„àIéÒ¨„Ù­ĥ£{ïÛlJŠmQ d’)İšIZBŽŻ„—NÄZäwç …tġÏFġ zzrħ’ײ"Ş·â÷ĜvQG ™lë,jî­¨+ŞŸé‚İ‘#XÛĤ Hü¨M·'×ġĈ­äÑ-‹—7’lĝVVñ$0N‘$je›}qgĝêŠoċÏñPäë%Iı„éŽÇA›jµ÷ġĊ&èM<ÓÈ’0\ (îXŭŻùà:*ġŭçS“Ĵ²Êv Ž;âˆ=+8¤ĦšŞşYúĈdĦ$|ĈΔ³tƒä{èö&ö#x;ÄY–^h¤LĞ4™zl–Ф„h›~üq{êoŠtÔ²ÌٚVÁ—ÇR˜éŻ,Œ{‰Üßéë{b\žħé2èô@%Ŭ\+Én8< ·µ›lг2š*|îż2c-³ħ§Xː $-Ĉ×ŝvÁ~ÏNE–ÓÓÁ5:´áCµĵʃm¸ÛÔ_ùâG›Wey\µt•:AAp¤†7żċġçóÂ\Îej8KÌÒ,HHmÀÌ-ùŭñçnžƒíŜê55ÍWû9Ê#Ž ŞŞYÒ uŽ’ÌşTïħ^ۍÎÑg™v}™­s–RKšÂ @ħ bcrHV[z Ĉ<.jjĴĤŠjİ–'ìÒY‚îIÒH^ŝĜ·äùĊ-N{ԒÇÑĤ vÛÖDžżĥĜ%ˌ½ҙbñ*ċ•‚£4 “\hħĈDê²!H]ÀŸKß~ĜòO@´™S߃{pGl/ñ¨œ‚,w_ ċf•ñÖjhi„„×g½ìnEğ{o{öÇĴRfÉ-,‰<½8"ž0U7ŜÜÚûO^ĜKš\X‹ÉœĠžUûF×Qž½túaRâ$ĤK„ŽÚwµŭqVŠ'YR-ìĈMÈÚ÷ú[ï†ŝ' Í_?žšg5•:Œ–€–TĊˆ¸ìo…ÔşiÚĦâwéȨ@ÙMŭN6Rn6ŜJŠD2@@}/Ĵ)7eàûŒEÀ9Á5’Lfc<]ÌXymaĈŜĜ€éé‚'¸ĊĞ(Ŝ˘À*ìHı8‘„ll eĜñlvb0Päí|s%<ĈfTüéĠóóÂĈ†NLË@cyċé5ż·”úwí}°‘q§XۃéƒBGĦQġ6ÊIÚŜĝŬ=#ԉ!$uŒ¸S*ĦÛëÍ·6À˜=™T ,5ÙP/ĉnmˆ”HËÔ¸V˙Ë`¨„ÒÓT&ĤĞÔÂxĉ[!˙n’7;n~ƒġ`ŽlÈÚ,íĤûíÉúŒKÀÓ:Ëè˘G€˜Ì²!1’àtˆÜ}?ÎqtmKħt6‘V@H=Ħ÷ÄR™%–YqÇuĉòú[kÚĝî‘Ì1ĥ—"CĉbaÎĝZ ²F ;ȝG³ˆÑ ¸*6˙Óßîµô<„İPƒ˙x…gCHŞH_ĉ}{á6U,ÔKÇĝ’Î[ċ'` ì0°²Ù<Óˆİ J­0rÒĦħ-qÏħîF ÊV8çši: ƒaĉÔöÛӜAUWF’5CĈ$If¸1Ŝځ€vèŞeĝXé+h„ï#y^K(”żš˙5Ĵ}vÄI­!7h_6}Q Â4LԘjdF7ÜÚÀû¸âĜ‚4›2˜RJ„’’):XߓsħġÄŝ&’zŒèhWT˘M¤Ŭ =‰îvÂĞD¨ĴM,¨c"˙żİççˆIV/FĠ – z*íHĦbV“BµżˆßııÛSUÂ*\H’kH|Ê{›7Ûl,2-4ò(œ²Á-ĥûÛƒ‘i'Ĥjş¨cĤy3Ù͛€.?_lD×ÉM&ˆd¨ĝpµċP ¤dĜĞ\ŝ`_œz7‡Ğ†iEn£ĊWÑV°ż6°ôĊ.šŠi—Ĥ#d7/aÀ ßo˲ç™PĊì Ş›mĈ˙oçŒù?%TDĦòÊŞŠÊÉLEÓâ zšZû{ïï‰"Ë3(žJUÒ* •:èQŜíb-Çäqèż K<.a‹ÈÖ3¨Ì{sÎĝ‚QIKDiDZR3°ċI½=ïżßç˘ SĝK0z™k…I¨ž)ÑdRÌŜbH;ínŝ×ĊVŞ xĞ+"âÌ,Ѳ¨x‰k@%#Zñ-ec“eK]OU-=<ÇĞ$h5È4ĜŻÛqúÉ3YéÄs¤ı˘p‘£G‚PZڗ›í¸öÇ|%GĊ?FYl°JñD”r30P­, *İoâQó=Żï,m˜ĉÖZ”Ô@ñ’›ƒk1°żç‰âĤ˘0Ó"4R8„ iDVEıĥĊ‰< wĉÇ ä˘ÍµMQ%\t\ô‰ˆÙmµËıs|eßà0Ĉ9l]ħ[OĊĜÊê Üm¤ \Ż:öÜaeu,oµ7y5 šÄ[ħ=íħÛ·ßeÂħ hòÑáHùX·$óĝ›0ŠJšv…QÊĵˆ|ÌWkyä á<1ÖHêİÄtÍQRuTIkEԗa`I'ÜoĈĤ-J+ÂuĜħ‰‰P{[ìmmñ fŠ´]$Eg$qÛXÈZĉĈÀ\Î#ĝqĴò$Ĉwġƒ‚<ĥ;‚y?Ĥ*­‰ž³wŽ•$PÊU™ÜC‘Ûks~qĠ1+£<ò"UUĥżÍmí½û ΢…ġ>•V-Â߸>œq‡”RCEJĴZTÛÄĜí·ahs,Í2Ó¨Úë NÛ\^0¤Lj1B|ÁĠĵ‰$Ó3…B¨n,1ùàŠêħ"'†C4Rkš:‚EϨÖîo눣ĴxÑ+,¸gh˜ù}Á×ĜcRÍ<ôÒ.Èè†Dm%Š(°ÒIä(·#ƒ~q­|Œġ|š’ž) M,AbVEmäµS끳ZSA˜À•HÔ0q݃ Xr×R4‹“ê=ħONi%:SCË z”­Üwıħ<ïÈĥUÖ,/F§.tëî9mñÇ8T’°5Ğ…mS-‰b`ˆLJï{Úy"Öö8IUPJ`†j#bAĴ0Ú¨×;q÷>W m- ‚ë äGĉ*qÍïɵ°­¨RġÔÉfw…˜Q`7¸˙m˘şİê’ĥ1]tñĦi‰RÌ {½‰ĥޤŸ5 LÊ0†ËÓ1túu\…Û߸œOHˆìƒK5œ›ÊĥĉÖ?L5LŻ1Ĵ-%>e BÀHÒӅuR7]‡÷ŝĝĞiVöcêÔ¨ŬHܔ#}wô ú\F-´ħÔ%ž´‰"œ¤sż™˜›j:mħŻĥž‡*|ĥšĞ÷|4îugv2´ìlÀ[~@ïë†ôùɔJżŭ9P°[ ÁĜÎܒ9í„ç›bo"Ĝİf §ŞhbY'´Ĵ„lxÄ-ûoĥ#4RĉR–ÌXL‹qµÍ‚Ĝö÷YòáH‚! ‰<’›>Ä[o(;\ŭxÀe5?ġ3ÍÔi"´f).‡ÎÇo{2—*vÄ!+VsLÇ)Ì*c™URPñħŒ°½ÁàÜì6ܓÀ%Ê˘şzJĝŞž_,=Bх·Ĉĥ%>by,ĠKxŜşéBżK\AHpüÚÇ<‹ĜĜ vÀħĠ$Tà Ċs”È òoÏúírż>­ĉTÔ-WI,rĴ%@Ÿ£ Iҋ_ˆ2ÉßĴžħD4ĝFbl.¤ÜŸ5Ënvĥ;Ï3 ÜÀĊ*ÁT)ဌXżkì<ŬíÍħ=<O*ƒ rÄ\ĊPu7ù…¸ä•Ġâí[™Ĉ‰•FĠµħ:Ô;Ž46ğù˜úÚöâhŞcÌàÑ 4p´G‘1a¤_Î0÷öŬOŠòœÎš‚ ĝK +˘xcp(ıÔEïŞûì8ÄA›ÄµQYĊ €Àtf× \†ͽŽ%%]‚•Š))ĉĤYİ3YE’xÄ,ésĥükjú` è–Ğ1‚´JȚŠ“Ğ8ħħm…‡-ŽÚ’'˘ §ÌsĤ(ċŬş`!ìeĥĦġ=ˆ÷ÀuRÒÔJV£I˜/ái“ğ =ìJì=JòASN+# ŽĤï˘?o2܋çž}ZŠx`¨tXE+‹—ŞRÂc}ìZċ@¸î ìl1ÊĉYħ§f†YjĤҝ\-ÈŜß.Ÿ]×C˜UPҔFŽŸ3¨+u ŝçkmíĊĊùĊĈ.Ċ@³×USÒŻ|LuJfèE&îAÒonsĜ`X+$„-fµ˘+!|ò’.-Şä€·p.oW55<ñWB“zbH”[aŭ6ßap}p3W­] 0Ş(F¨úGJĊ}ÊĜçèY7ÛU…ûoÏׄ"¤+‡İÔš£bäsħÛó£ŞÌQj˘vŞŒ]XÇ&;÷bG>×Ä8Ħöxi3‰›Ğâi• Q:*?ġ7n9żÛ fžŞžD†8DzAdfۀwôú¨Ş•i"uħx” Xnxżc Í"ÊÙ+9†•,AYŭÀŸâĜvöÄVp@],ġ9¤mLÊÚԍTkĦî6Ü\UsJ*†ËkŒÔÂ1 ²Êû–-°ĉûvµĈŬ݇Ġ•Í£=DJéO3}í{‹ol ”ËYšUµEr*ÒŞÇ:ë_&ÂàûmÇ|8àk ée§KĈCNż0ïŝ[ĵ˘˜ü1L`âCۂ–öö7Ÿî·%­¨"­¤ú"á"“K ceUÛÒŭ÷,˘Š`ĈiÄUˆT+1ŭ=6ß~Ĝr•Ċ66Ĉ#k†ŻUzHIŒ’C¨1µÇaېo‰ó žláÍTÙvž”j\FU”[ÌżÏĤQeħÒüDáBWBĊŻXM"Öïm÷Ç M@‘%šUvDî]IĜ“Íù˙!s¤Œŭ)Ye=‡§¨Ş‘\ìŒätâmĊÔ.@ħ‹ŭ1Ì^ÌşâqQĝ#q<İp×ÜsÉÜ÷¸EGMšKKK’ˆàş$²N-Îäêġż$Í>*ĦÌħĴq€…sJC*aqn9ûáŭ×ábÌş?Ü4ô™mWRc)u§Ue:÷¸é››ہî ­ˆRÖIM ¤­ğF—*ÖŻżßÓŞŒĠhóŞjú!%E``İMó÷½Ò×ümŭñ`ÊéóİiĤV• VcI'á9ژ­cíé…8\{0#™bƒ*ËÔÍZFËĤ:‰–E[ï¤0Uŝ§e™„sĦhÌĵmĴIJ¤’"“ĉäßO ŭÇ0Ž8rĦ`U`¸%dR×mĊğn=m~1_ Ë(é-<µ¤tVR'pEˆĥÜo}¸8•ù§b––ŜFlÂ<ş’9Ì`D7@e6ïr.;_ÁKJŻĤŠˆ@é4°ĈÍÔ0’Ûê6½Áĥĝe LPG4ĞÇKh5‹¸ĉä­ĴTm¸½pşşĤZ¨…+ġ ,Ċ›7ûÉÓĞu`÷`t­P•êL5=0ÎĤîT_Ê ì ÚÀz`CIWAĥ D)€jfħı¸ ß}˙L2hhiúËWñUU š"£›nâàÛôÄyŽ_1ĤhiŞ"HHPG$ŭ‡nçµ°ĉñċô”Ú”ˆ ¤¸h˙„•$mĈŜ×Ú<ĥ9İ£¨jÄĤ*K+Éġ·ò’Vü\ŭ°]F]šRL•5ÒË#ħyU”0SßP°Qën,°V-LtĊHt‡ġ éÊ’M´“ż÷ĈŜ:ePaéQċóT²°–&BŠc¸½½ÏûŻlVkgt?%S DD>Sŝ\›ŝx&ĥޞš9’˘M{]ĜFİż#ƒaÛí†U^ ‘Ŝ•š“˘x eckÜ6˙ù€ïlZë–=5OéŠĦŝ)lmôıÚÜ ?ï†˘Î›â+Ĥ€ÓS°VĤY‚É)·‹ƒÛ~灁+ré!U0Fn˜Ĝ‘· Zŝ½ñsŭŸäuyµ!­Ì*)[-Š@V ‚$.ÜùŬxä íŠrüm›˘âœŽ<“Ä“ÒÀIŽÁ‚Á"úyÀ0Ĉ$ݤëF$W‘CĈ[NĦ~/½ħjñn^éâ(ᤤ|S4·?ŝ[nēşñż°Âd–•&†X#D™\:´RPüéÛgiÑ3<”ĝ“/ĝ9siHTxàv7kñßĥ<òjŠa2D#zxÙY!• 7{úwûâñ@Vz(ä†#â:Ž˘="µÎ“srMÍÏmö kh2üêş:ÑY0ݚm͗DhZ@v.Oäž6ç—WODĊ³"˘—6HŒĠġTt–—Xv½›@k×µöJĠŠıê!ÌBŠj#‰Ó{k½Ï6 [ì0tž Ĥƒ1Ĥ­LĈJœħW]E<‘YC_ÊEÍËvĉüœg‰²è+²™ë †šÊzgÌÚKXÜ)Ûmˆıç|T§Ù‰´Ùn]—xŠ[á'†İɐ×ȍ;ş*‚u¤zn6Ċ˘™2ĵÒz‹ĵq’c#ËÔ‰ïo°Ç£eŽi²šyè!Öċĥ²›-ı ms·~/ŠçŒêjêŒU•š˘¤İ=HİJµ¸ê\É'n?,>'ò äĤBĴ&1ü:ÖbÛùóßO(¨Wt’ÓN˘Än½ġ8ÔÒ ÉĤ˜ĵTc,jB;çòÀ˘Ħ„ĤEŠ8…· #ÙA˘G‰UC1Ġğ+Ü??Ä?ÍÏ-ϘĵÑ<AaˆµË{~6ïc…fXJ7WÈV]żÛ!ĦUĵ"B]‡ħOĦµ­ùúáI* ŒZ–ĥ›/Gƒ2N.Ħ”†Ô)ĉŜ˘ß^1Ŝ]WOQ ”˘*H› ÒçÔúÍÉ*„¤‘`­·k™™* JBg´êSH,ğqk}np,4]if€Çy ³+ qÁ×ïŒiI~BĠ0v? â$½ĜòÛéŽòÊùé&„İ{°(6Á§MùĊ·˙<>iBK$É!y#µ¤AĊ­ÍŻm^Ĝ°Rx–şJj‡á˘ğT$Šë#I˙ö×P€9·$ñ†ùRU%ĝ)Ë<#âzkJ‚†P Ĵ‰Àĉۑµ¸=í‹e5cĤ\ġVF·tw(ŭ2[ü·"׸ŝĥĵ~Ĵ"›/Ë^–)ĉÓhşžrEˆ À ‹}ÀôĊ|dí”ÑÓ&pYèä†xŭAğ5n¤ùEí{Ün9dԝ‚VZê+2àġ-L2Âuġe„$LîxRI6>ĵ\›Œ/ŻÎ)bÈj9+^I_ĤbLq-›IòĦÒAí÷6ß ³76†£1.i§UTŽ$:ĥò›0MSkù¸Ë26IJÓ i$-!bÄ:-\ĤͰıíż|’Lg>ÎĞ⚲ŽZ™k?ñ—ñĴ§‚ŜœYmÎ,òf™QĤ+"žĵÓ²²E XXŞ…òÜ]TXmÎ*6jjşù(eËc˘qYiŸQVÚÀX’VÀIé#œ šg‹•I-/WLŠİM(JŸâr;ìtóĈû j•àOx)ŝ.‹+§Ì‚eU’MƒTˆ˜şO{ÛrA›„ eµŝR{úá‹ÑTĉĠò* xdċ’T…@w \óîIÁĠıL9d ô4pUFQ–rÏ%…ĊÖċAħíĜ ­4’(E<¨éc—Ĝ][oËRHÖ!d(4éöíùöÀ”í"32HCVêyX›iCmÍ· áµx$e4/I;R!XÜ #ŬK6=ĥħĈŞ‚Z*Ù)]´6ó\n0]57ĊċKS$ò a˙Żè~Üà ƒ³ywRt‚wˆòœ’‰…kTŠ+èÛ[ĥĈälŝöĥĝŸ3˘zxİ †5(İ=<×ù[ŭĥ˙m…ĥ;áHé‹h"÷½ŭ…íú °Ë2ËRŠ'’A•}VËĞcrMìOq°ħ<Ï )žĵU Uóı%Ùtîmkñ× ô aEŽ£Ün í#]:Gȋp úqˆċHŒfU%<ž_éíVĜFŽŠtYĤ\ é³éùÄU X‡’[³X16íôäc£!zT2˜Ĝƒ°ûc3+îEı ÈîmΝ.ğË錌Ŭ˜Ë”ìH&ä÷üħÒD½ĝcD²°#Ğuî fmħÂȲ~ħùĜ^ß~RñĞ­ġ)*lADSŞ56•· ^Ĝi Ĉù}tñÒΊ\‰£+)ŒéeĜ÷îF˘éh‹­T¨T™$$X{zż#‰QS Íş@ùô÷öµħ=vl³Á5-4脝Q‹{lĈ×?Ëb+8:ŞCMĦ&b‡q¨ –^Öĝž1)f(WxÂş)Ž ĝp+ô¤d‰§’US\Ùnyĥ-9-%ÙTIDĠK¤›FzF?ŭµG}ğwÄJI,‰ˆslÖ§:–7¨`”ñ1D½÷çßÔ¤qÌZ!$PÀ{vĊ\Ž“*ʆbVh”0‡Š›‘ħżëÎĜĤÍnı1ÚÚ}-‹ƒOZ˘ıû†{_˙ĝċÏâQ0ĜézòfT]'ÌŬ°NYN$£¨P!ù”›Ŭ{›{+q:‹²É ĞfCüCÒŭ·ŠIĵ”ÑĵLIEêÒğ‹ëmğz=à§³s°IƒXhËVo›ÒâßÛĉë4p+;ÜÈí`1°%}>Q€Ydg’4°/{ÚßNü/IûÄ|rié³Jà*—ŝĜzÁl½+èƒU@Ó1‘Xê!EĊ×ħ7ŝĜ^“6ŠZĤĴ†–)Ĝ9!܀m²vúûàê¸#ĦÉèëê–j˜ŬPĈ4Ĝ¨°v²Ÿİ8°~Ïŝ ›$‰+Z%êİxĉU]Q‹Ù”µöŜÂÄ_|a)uŽˆ2ÙíÌß15+SLOàQĵFf˜5…˜ĜAıvi´Ê?g~¨ÉRzlË9‰ajy·Bğ0½ï’˙ÛŞ)⊺(£rc‹—_Û{ħAp6 kûñŽzŜ:ŭ ğȚ‚èÓ<‡Ĥ‚%ܑ~.n~qs&›ĝ2ë&ò—PWUĝ÷lSF§0¨Içf?,!@7!‹ƒß Ââßß-_o–êK|Ÿ)7"ûœ8Ë2:JˆŞż2J'H:ĦŒżWĈĈäsí)já §ŞDJ˘<ïħYAê7ßnŝĝqŸĝ­óšhİiݤĤĤ„iŠmĦQ:E…Ï+½ûb²P…S¨Ŭ053€QS{ŝğ`ş*j)´Ġ=V·™u)×ÒßÖĝ gÓHђK’7żÓRÒÔNʰ޳5ʂy·#ŝ0žŠÖċILàçY‚€2ĥ¨˜‘~l-ê>œí‚– YŞVŞ'ià„, İcŭçµĈÀŜ÷?l”ċµ™ĊbQÂÉ9'Qk”@żŻ¸_|XkiŞéjeËĞ‚š(ô0éÀdܒÖħħ'ۜdÚÓ`'e—4OˆwZ:p|Ì·ħ’7ıà›‰¤…*˘‰´ÊÌĞ zHħ½ŻïŽë`C*µ:44ˆäğGİ– l  ^Ä÷,³;šAcĴ#ͰܞN×ô-•x,Ô5´oZ)ZIQĜĊISsbŞ>Qm†öc|%ͳ'̧i¤êGYÓ R4ÊM­m—żÜsƒZ“2Ëä +4Ċ4ad˜Ù€ ‹† öçoQƒ²ó]HkáŠzXĤ7Ñ$lTnÊ Ĝ€~˜›K"XbËŝLË$ĞuÔ.l9ì8öüżĠy£èW1%Ĉž¨˙P\ñaż|(’’ŞÒR#7ÓԐ•‰7ıì7ġĊ³-Îd§?(Èş‘§CëmûÀ#×'Smh{AGA SüBşW 4¸S{ßç–R6 …ÒRמß_|T&Îz:hdĤXÖ6ê.¤ìĉÛ߂m‡2ĉpCI .@3y@usnmşö߸˜ğo'b­§cOHÚÑoÔ$‹ xġ;_ġĊ†ĦÜeÂP;ŞÛQĜ%·½íè1UÉZUĤ~¸é¤R²‚×c1ÖHqaǘ~Xm BI 3<£ÍĦ“VÀö&âÀŸëD´ĝs,TòË,s¤d­qbl żcı;ŭpß+uÍJµvzh˙D’-m·°ĊJZ‚ı‹™d–HÓN×Ù-°|\|7="Gñ2ħm~Bħ‹jŜ÷7û~XwĤ o £Ëjó%,˘J“ërĤ0B€ĥġ|׋ċ´êĵŸĴ†@éĦôŽïérHÛ°í‹ı…ĤËçWċ•*&ZK‡u{kïÜb´I]8ŞtHTıı<ٛ‘½ĥÛltÍİ£(MwqaħGRe´5“;GŞ_*ĞÔ Ÿ)Sú{bĊOœeÉTÔèÉ3.Ó#2okĜs#Ύ ĵ”CA!+üÄ}‡ħoÉ2ë(F@ÌöR‡·¸ŭq}}$y´/sMe’˘)”"_U*ZÛßsŒ#ìµĉĈArHeTo)6 {ñolWë* ÉĞ*Hĉ”:uDġ*¤{éĠÏ7ۍö êĵFbÍ犉•b‚4jhŻŜJŸ1 vÚÖÀž*ñléOO)PÒÂzÄ9`÷7ìAüñpƒRÇ£êÎ3œé+ċĤ’œ™`¤e'J²Ü’ Żö$ĴĞlĉ!’”Ó!”‘g¸¸µ†˙~7Ċg)ĴCA4o!AÔùA<íé‹&UA_šUĦʤi4ġaÎÊl6µ€â×ß´–ÊJ‰òı ħL$’5…íÛsÛoċ‹-ĵÁzɖ  ‘ĵpx‡ÒĝÖMálîĠNIWçñşağßŝħb‹Â•ñTÄZŽÊĠer@ġ'lbçÙĜ×y~f3’žŞ ´ż¤­Çmc~ÂâñPñ´SŻ‹3&Ìj!¨¨Ž–%ŒÇAcsĊÍı8½e^¤ƒIŸ.‰‰S~˜ÒË{‚ ‰½ÁĉsŻĠfdùkÁÂ2Ğ4ŽÌšVĈ÷ż×œTy¸ÒĜ$ygŽ_ޞż•. Ş81*:ÊĤmĥ‘‹÷í7,›(—$˘šA'N‘€`ÄïŻ{Àô˘%•­~GñzoĈӍ˘ö‚Jş—$ =ħ)Q{.ĉŭÏË<¤Gk39Rĥ=żÁŽ™€Sò²ıĜ°%£¨éĤ ´ì ­|}û­§_M³ ”VÊX1²ħó˜"3v½‰n§û-İĞŭϙĴTòË[ñ4-ÂŬ=ŭħŸ,Üd( ÁÙĉzÎİ1’)wp7—~ǰÛë‹%|‘9 w…@SÊ,;m÷üħ[Ż…slşJĤÌhŞcŽXÀM17×sÀôï‹*COñ2Ë\* (RôÏ'°;sÎĝäċäR–é-#…‹ ° ì@ïïíƒç#1…âŠİé^Ac$ ĦÒŜž˙ß šš‘'Ž­ ìöe1ĥ‚£‹i[“ġÁ]4ĝ¸§Šĥ$‘"ée/Ü ö7ÛÒĝ‹ˆYEñG‡*(Ğó:˜e™¨e§izżv{n ß}˙,T²hJ*˘^2\-ïwġ·ÓùÙ|Afy D1ÖÒ(d1™ `.{^߯ĥ(g†š›D3×ċísÔhĉ$K^ücxr'–šem6[”@*r`éPCĜîİR7ĥĴ Ğ˘ëÍ^“ÉĴ>ğ‚Ŝß\N*é`ê7捐'úLĀ,@òÚĜÌħHjÊÁSZsŭ-‚<Ĵ˘zĥì2Š*Jş”3#F—ÒŞG6߃€qĈŒY|‚Ö [ßíƒ+jQ2!–MQÓğXÚÛİ?×|5Íü35GŒe§Hċĵ+ N_N‚Ċġßıĥ5_gI’5=KŜ˘HG(ÜĜ‹nmo|MDzB’weöuGU1İİAŞ6È ~mż6ی_fŞiİ*E§*`Gı·n{œTü5’ĝ‹+É*İ֚UyĠÇVı*IO|XhZŞ‘­X†”‡ÔY…€°ÖçsIıĥ‰%~ħË-9V°p—mĴ=.6ïˆ$İTJޤ£ÚGà÷Üoŭq.dÌ KK;G¨”•V&’'7هq·b6ÀĞäˆKT”ŭNŻâ0 ͘(ŝ\MJç§Ëóİ\²Ş(ÄR£Ç'²ñ7¤M#Ġi³†Ïi ˘ƒ0cƒ˘é%(•mmAD„Fیk7ËĤ£‚–š’5¤hÖZ‡CŻS ’–½½ïÀ+´Ġ‡ ŠfĦhŽ •ÊË·ÍıRΗÔ-cÀlZ`Ë̞‚žKTĈߊò˜x¸;p}q‡,z4ì”ìòLÚXŜşF…b$éV`XÜ,1ÉT Ö`ˆ]ސ}9;Ëd“-ŞĞ=0AÜ6Ĝ÷ 2XµTI31Ú-Oî?çxjMVZ3&éÈEDOú|şA·òĊ#'ÎiçñIW)gˆCÌvĜßíöÇ~É!ˆÒHÌP–-aêG?Ï{cÌ(òÙè|cY•’wĠ*4|Ŭ‰"À÷˙œf—äÄŜ+³Ñ z—V’FÓ­]dÒ >ĥz[üR2SQO#ˆ›â“Ó#ï{m킳r4JÊ&,ï(ŬO7<Îd2ÖÑÍOi—àĜ ĴµSmÀ;aIÑiŝJ)hĜ™˘1úyż§ċuuĤgC–ċÑV,e€H£ó38b,;ž6ÚĉĜ;ĊuyMDR^‘¨. o¸Ûë·qBŭžĉ96M’|dttß,`4çÈêş@n}Ç#}qiĤ“‘œŒQ˜ÒÖež+––—5zô£#nu8÷Ü[Ô[eTġ(eşÉ¨—²éµ†ûX[é†ıŝeŸ´*ĴÑ9]YJEß×ße3|gŠ!•™Ü²‹ħ:›IܓÍÎĝ*žĜç6̨‡‡äŽž‰Am"ê6ó{s|Qĉ§‘+‰~ µ•ƒ Qƒ*36Ĵ’`Ò8pìĥfín;aP” ÁğnöşF"1Ĥ$â8Œ%ٕÄ Ċĝ#¸úᙋV[<k.Tú*Ħ?Û +5i› ßoµŽ f24hŒ¨|ÛŬ€MñMdĤV˘”E•ÊÁUZRYˆ?QúÜ{â,·SĠ³ 2‘ğ–Ĝ_%İCÓ@l?Y ·àËD…˜˘ŬŽä€/Vˆ‘aĞÎ)k£häĦ†iLKŞ{ôÎħħk-ƒÛl:ĊdeÓBiŞ ·žT‡^Ĥì6#ÚŝĝĤˆ|)%H[b>ż|Y²ğċ”TK9ŒI`­q ‚7ŝ˜Ç—ò@•ò•^C,„×Cċ ­kátı7ï Ô봊•^&’ /~GO†g)“Ôş#‚T)Á6ç5C|f[M`dT`Ĝ-™Aç×Êq—f* t”ôôÑĊGVAŽ:İ•Í÷eT‘˙ĜažSGG’Nò:­e=RÚ6Ĉ ïn8ÂYİĞ*3ÊĥHً²ï¤6×·½€hé2ÄÒÌÓ+Q²]ŝ£Ú-L4ÑÉXÍĤU'ĉ}ï~ĈßËĵNi]İ£xÙ6 ĥc˙ħú˙LY!ŽŽşğᚠ]An•ݍööì}0żÄyBÒÔGĝhŞ ᅕ‰>†˙|GGUUS(„HR™ÁµĠ..Eí ËĠĞ4!X–CeŬö¤˙}ħĞu*– Ĥ]_KS6a İW:rOe, ˆ¸üûagŠ[İ•ˆ.Ĉ^µÉ+¤0˙wÖżlMCQ˜e™D2ôˆY‹,lB[ıż?÷3Àí•ÑËñ1H¤ŝ"†ħŒÀÒ ½Mñ8ħGù ²TİLĉš8F$,"ì@öġúaˆj\QRÒK)–I—P$[}Ô­ĥ#ƒLEH-IŞhY/ ·ħ'Óĥ,9Ġ,™ĥUL÷ŠZ¨fóJ_MÔòàßl ùĞŬÊÊi“ˆü8™›3~I*-`têŝ¸GÓĵċ)UBĈúQua}‡z‰rxċŭ˜A˜ğ#Êù¤ÇUĊ˜FÛëÛÓW—Ö6[UĠĦ6ÍmŻĝéix(6Ñiñ­49e_M(`…XŸ˜›÷÷ĥ)ŭqmŭ J1¤H_\m’úµZç×û€ûc>5Qĵ,Ĵ„MÁçtÄù˘FÉÔY,@úínŝ˜[ÛüàĝY›¤@7C½‰¨Übžħü>‚zÂ)ê"Ò^u6E‚ÄYYÎÄî6PNĝU™ċ•fÒQO4a_7Lëm”½ïmħwÈ+˘éQ—‚.Ĥo;mUĥÛ&âŭĉƒ)ÉİrĝcĠ4Ġċ”-boĞ~_ Ç3ċqÙ7E3*’Ž–”Ášhy4ÚH` ƒ{ŽmħħÚ×ĊË4ÏM4ÑĈŠèu­k\2íkn9çœS3zz\Ç1JĈšH¨7şĈ&ÎT•ہ}ÇŭaóRšJHŠTËöíˆäK ɇ!jèV*ʸQ€ë†fc0°ú{{œVaÈd†´A›ÎiiÄŞ^Ö¸-ħ Żŭħo†FŽ•ê£f( ğoùĈÛ3 1·ÇRÇñJTê’;5ö"ŝĥ÷ß 3’ <óÄİU`°TDTDYc5[üğÛm}0µ”Ş ÓßlYĵe;×URHñ²‘Y"ûmÈÀ>¸A*\Ü1×qE$KGCUWĤH$‘šĉê/{{|Xġ)ĝY$rÏ"VQ#’.ĥ$lÁ÷Sqm½yĊ,íŒS2ÄùŒ´u3˘Én›DĦў÷ °~pÇ&ŽjIÒĤ˘0ÌşL“ÈJ—³͛nÜXb'Ĵ…úÍOŞÌ]ŠĴ²0#͑k÷÷ÁÙNo Ž)#’Ÿ§ êş8$u[{ŭħĴğuß%É^8ëü8°EF*û7rÍ{ï·cü°"şĥtYPw M·ĝë. ĦÊh'‚žX…5"8ê}€#P·öĈR€ıލUZâí0ğŸv6 yÇ#•Ëvß,†L°ĈĤ•Á*T·mDzú^ŜŜ¨óòE-,`ÍĤ#!ˆµˆRÀıçÓx•^‰GQëYäN nl?ĥ˳9²üÈ×|42´ÌcĠ-‰ ͏ĝï‡Y EQO[N’˜*әÌ-¸7Ÿ[àšZ òú¸³RÁ êD`PR[ĝ‰³}À·l7­+[=Udċb֊ĤmZwù…ĊĈŜ›öµĥĊއ.”eoMWK ÁÜJ>B6 fÜ[žw¸ĜRjĴv•ôU)0š’žAQİ:uĤ1;XlI$óĥڏcƒfİĝ¨`0G…†”’Êmn@$ñڝ 6M*U½Ċ…V;‡VóiMìHÜ÷µĤRÑD™d°.URÎŞJD*PÀ| [„½ûm‚II$ 4§”stŬĴ~xċP¤· }ûlu==LòĈˆP°v½ˆµğ˙|(ӌ­*QW…´Lkƒ{ [qn _~ĝë:Żž:ˆĤ=œ #فÛÊÌTy€óXÚûrqœ¸ÓÚìĈhfUêkc3m*£½ì-{ì}Ĉšhĉ.C •şE.BÛÍĞ]Ŝû|EMZ¨ˆ'H„†%wa"°}Îäĥû;àŜĠ°ÓŒ¤b4.·;\X^7ÁĠŜ†I6aI TԑÓÈi•žZ'rì;ĤŝÀĜŽ³?WM™…4ôñÂË!‰˜F˘ñ 9µtırȕFCİċ#×é}½qŸċĦdĦxšYJi&NħYUT“„ġÛ|oÛ/Yäéô•θ§âÀm‹İİcë%!-#Ġ#ñ€Àî9ù˙ÍċI>SáĦñÏ ġÛLŠÂë}µ'ӑúcxÜe^ ğSƒFĠ4¨ÄÁX uŽ÷nËùwıĊB,ŝ8jeHèâŠcT@£ĤN÷f$ħö#l62eTTĴrÉgI$“¨GsĞ·_QQDj*tĵjšÂŽĊFúEÁOkœ,Èaáz6Ş!"Vi$T@úMìħ`Ë)ĞjTÉd¨Ì‚óV¨ÙIىıÔŞÖµ…Ï'´“´͐ĉ9uAĝİ£“Ì#‘TD ­­Ğ†>ܞĜ_Y_MmñcžŽ(Œb$!B×£{Β{n1hͳ •9\ÑV,¤ëš2ژ…ò]˜X‹ÜmÀĊB„ëêŠ6u…uÜ·ÍfmmG}ÈÚĜy¨)£–‚’ °yPŠ…“İbTù.£JßrO8´ÔdQŝĝycdÔ)…ż5Ĉ–e l<ş·>ƒWèQÔċ¤.­QWIŞFH ʃħ7ĉŝ¸‹ÇĥJ™‰§zJTH›AVˆÄèÚ.VÀn Ûĉ´yׇ|)4óĊŽİ¤‘˘„&‘`ĊĜò=7çŒP*óJŒÜTMYT•RG¨Í5ġ Sü$¸X˙!‡ö{Y°ìĉ\ĥvX²ĝhÖ(àòĈŞz÷; 'pyçIT³cr{o|2Éëk)ÚĤ*Y :ÈÈ8KñÍŻÈüñÄtġt•²€¨´8”i·ŝĴOpmŽ˜Şhꖛ,š•†ĥFe-k۟}˙çÓ(uù#ApC\ß×ÖLZİúbäŸ(ĉŜ—ĥ!§ê,Š4‡F­oħÒwĜóÈôÀ„M_YX“,}EDÔ5p5ö<âÛ_MEŸÄ 2ÓƒF¨·êş‰@$܍­~Ç˜š¨Š˘Ş#R%VçËŜÄ›ßŸÏ *Ği¨(Z9ğž˜Y?҈ïf*,ożĤ"QĥĞ`*z:‰QdM¨,Á7ÓÚßÖĜê(â†Í0# ·ƒ·ĥ"Z•*şÒìŞvcŭ?ç%Iĝv)oö\‘‹v²5΅Ù9ß×Z‡:RŬ­ċäûâ"ĈK³5˜ï\qúĞböÜÛ˘èÚ¸n×{tżĤ8™4ĥüc`‚-p ğ÷ÁûȔ(&ĝë¤Ĥ=K"ßşžF0€-n{‚qÈı&Œ1Ĉ#t”‹Ü›‹sé|Hµ$ƒ\—ÙG }xġÀÁ#ĠmW÷Ĉ„jHµÇ;a<€M.„ŞWY ZO•ˆĠo,ı&~ùDU˜ĦžWR#iŜû½qS°ˆı#³ d63(’úIÜ^Öûâ%!—:ĴÔgYuL²Ş+ö–Y|à›e\ñkÚĜŞÔÄħHR˙Â7üïŭqŸŠĊbu€HŒħWҞ‚ıRuşÚÁm{ @ġ#ÎÜò°Ä™ĉÓHĠĞÔtÒċĜ‚ûŸĊ Í4,³Ç%•§½•Öŝ€_aÉçSärĊšĤX2#Î?ñÛHdco˜1ôóo^1ßKG˜TÂÊĉ8d*òÖİ$Ç6ĉĜÙÍ1Ĝl2ŝîyŞòÇY›T}yϐw:ySêqcO™Q˜â—kÉıfàX oî9ïŠ÷‡?yEŸĊM5?V1n£e`¤ƒ§žûXâ˙@µ’ġş}8U¸Ü9SÇV–ÚrNÜ6L•„ Iû͍TŠD”¸@Ü\k܍íÛ dòœú(é)L‰Í-@²ÊÜ\µ·kŝ¸É4Ġ í 䭈g4ĠşTJIcħİ@/¤ W³là}°×3‚‘İc—à²9/*ißĊ۝†ûàƒ‘QGLbŞDN´†A•s°³oqÛoú–*Y~8*RšÈY,=O^ĝ;Ğ—À´äċ 4& BMÔ:£>œŜ8Ċ‘¨jİ2ôYİ4ô.·ma‰;1;ûÄk—Í”K­:fä]‰V‚Eí÷ÄPU×çŒi7Nİĉ#äKì;_Ž}qŸ,ÛŞÑ ĥE[ YiP݈Üu”6ì{mÛe’Á<²ˆe@"aĞmĜö7?šİèjž`ÈE„„\àÛo×ÓËÒŞU‘c#X1ìÀö~¸JdE™UêÉP‰#Ħg_”Ĝŝƒ|Y2ŞĥL˘hĠĠiĤ1—< ¨°ÏsùaêTdف !ĠPMĥààwŜMY4’—İW‘tÉ2ĝŻĵŞš'²TN‘üšÙÁ£¸oŭ‰;ŝ¸fıñ5ÌS35ò¨EĤ1Y€u×·à`êäħSG=Hİİ‘€ÚàaÍ6GCŸ/˘ˆúŠpHûœjĤ*R1p^öy-FgJ’µa£^”Jm0$ì·|àŠW­ÎİŜFU2]Ż}(œ‘sË[ùÑêü-”×ıtë8SФ`O°Û|–xs+ŒEII"ìH:~ûóüñ™U%“Ħ;ĞĞÊò|JEhcԍhĠǘ•ô½îxǂϒçY5Dtu2!m[+ĜG`1ï°Ġd4áÇQŜ?œĤ½ğá…4”9”=jiуĜ,ä‘yy>iİŠsIjOUDÌÊô:¸:Ù‹s*Q m(Ž5Ú?‹ŞUèöÛMÉÚÂßËE1HÈYż$/ċˆ%‚4]wĉ.ç`GrpŸ7"XCĥxöQû”?_5ÏÛXĥ‘N‡ÊSöÛ:Ù7„éËÉSM5|Çvj‰ÈQôU°·ĥ/2< €³ŜöÜ ñİŠ2ŬCwä/ŭ1„ıyĜ›ùËĵ?’äà|WCH£“ ìy¤‘ȝ´ÚĈíÇ× c‘Ş,½3~êĜ|)Xوeá*n%JMç#NôNf§éb..@żÓœG+ġ$2 ÙÁ܏ Ä ´AĝQ5ı,ÇcĜÇç‰R.´ —:È>Pĥw'äÒÊÒż•àlFĝĜI&yˁ{ëlm¨PYúŒ€ ÷?ln9`VhĠmk7Ĝ:;ÈÒ³Äm½4ñWJş‘ĥQÜı˙lysĥ ŜװǧŝÛgñF\ ѐt˙÷8ó¸òŞŭ­mħêp*‚ĦrÍrPür7Ü[lkXü0Ĝ›žûÛĝ†ĴuY²ŸLLBê†)N×Ĵ{oӌHğȰVĝžji4ËO †Ûµ4’ ?“ŝ˜&‡ĊÓBu‡˘#ÍOQ(/µÈ|WzÍZ'† %ġ_Bi>›oˆ ˘’œŻ\˜n~erÈ~ĥß.ÌĥĊÌç£W5 ÚÄŞĤŝÀàߋ”uċÎhíkĜŬ {ÚĜĞË%4“+TևÒ,KBÄôÁMO觤˘Ş„nÓèfúß|Ma]vU3ˆŞ£Ĥd?éÊ IħÄ)”è¨Iİ*VXG htŸpGÓppş–šhĠETŽ"ôcsĉí–ÊĈ\¨@}Z%eoĥÒŒŠž˘y­i$“~Ħš„küÏ?ž6˘zv¨TËd ş45W!‘żL!ĴĴ›:§ê.EĜm9ü6úùp#-$f—1ÑÎê×!dö6ç>È´żƒ2`ŠgË2şx\ŭˆŭ1Íw‚2¸ÒÑd“ ‘ êJ²‘mìTŸ~ıŽ]ñÑ tRçcԈ4`}n ˙,Uĝé˙uR #f… ¨m[aÛù-I|/…2(Ħ2M’ĉħtîŠv7˙ö[~¸Zl³,¨YiÒ´@ŻÖZ…‘ ¨Çmíq¤\M›ÓF#¨ Ğ–ó#ÓÉŻO˙kŝ¸Ž:8¤İa6O$ “ŞI£kŭñq•;ħZ-íSM›ä_Q”È ÖòBùäĥÒÎüúŒ•xhËI=\hÖÚ)!Ĝ÷ıÒ,F)SdùBJ‰ċ{ßî°ĉž8)QDgrİ$Z:ùooŭNÇ ‘ŭÍħĈ%Í?f9c5B.w•GĈó nx lwĊO3ìŜ”ÒOUMU1Pï,ú†à\zâĠ'‡2ÜÍ/'ïĝ Ş7¨ëùÛÒx3´ħ´ıİ#Íj‹($ïbÖĥ+Ž}vÍ:Ż˙²S"ÔÄÚî˜ĈÀĜⓛe™âĝ3˜r:è#RšŒà=ô“½·¸;mġÛ…àè Èg™`ޤ–9,Ymj{)Ûoĝ̐1*Íw$ßkİú\ŭħ3ċĤœAqŬÙóemzĉO&MS9&FŽÛħöĜ[QSÔÉStŞáŒÌ:HBVÛ5ïëÛAVä™>e>aEO0Ülħúo…µ>ĠUQ7Ô:r0°ïµûàûŝ4WO&›ÁsQ3C ‰ä`VYŞá[‹›Ĝj°íƒ“&ÍŞòJ ³'§yĦŽóË Jfì§Ìly;cÛö]á÷f)%tAÔ5‡ĥߟÙTħŠĞ6So™k ¨ÄŭġD¸#ÉâŠDU>AX$]FnmĈÇxo9Î]â µërŒÂž%—ÎÒÓ=”{-l{&W–ĤV3*ùâ!TÇPÊÂûnHPpÛTŠĈĨö$â_Ġ4–™˙ĝì2çÙ¨Ì'ž‚;ˆEä“c¸ù+‘ê+ ‘a{qŻYŒ„u@`9× q ıfUP|ĥ‚FmĴiÓo½°×Ö?Q=•ó5&{‰,ìq<Ó2䆈*†’XÉ XğŝXúK˙Œx^g=\“-ı½ÈŠßË7…ĵ'\–ƒ]ü +ü´ü+×ħ–U‹ è²ñċÛïĊŝĝŽ É0Ċ€A·ÛZE’ä4ÌÁ2zĵû›_o ä3IPĈFÚÌ*·˙ġĊ—ċ ĦòíM3P@N]Œ‘—HBx·µ÷65¨ŠZ(VĦQ$‚”Ä"nG!ĥŜû‹ödzx'äŜL˘%blÖco½Ž"¨…ê"+E mi3.ß[â?ÈOh:3Áòœßà2ñ³j$oıµ€ö,á”SÑêê*Àb,TÙUY@;zûÒs ĝ['*’RÂîË}-3– w°á ^[“Ï“E•JĵIw:mÚàŝžĜk‘7i ĤUrĴĜRMšUP³–‘´£‘mHŝ×ïŽòŠĜrjĤe§””WÌ~Ŭñ-d9rÇÒeF\›¤•-ż× ·¤-5$0†ħµĜíŜ䑆`âĈ”ÓEKRÚj‡Bö_]¸°î=>ĝĊUvĦ¤::<ğ2›ê_R~żËA™TÉĴRPÇQ ÉYLDŝ˘äŒWO]Qi))R lÓ~ûœRÈ( ò·“÷4í!kaĉì9öúàĴÄ=.eY³Ġ;ˆ‘1úÚàŽ7âcE›,JHF‹f’)‹‚ŝĤÄa$ġìú¤ŸQà†éĈ4ÎĈ Çĉŭ,–LşPZ6“Rêo‘ù—˙–Ĉó8#m3Ħ]&SŬ4ş€żĊ½É÷³ԧÓ×Y¤'} Ö zü¸žZˆç‰ Ž…(şO˙ÌOôÂX` Â頎LĉŽœÊ! jbÖğáîc˜É”ĉÔ4Ôµ ËRu@`oá#Ž6ĊyòŒ˜êé²êĉMĈXw×6Ä!İ $↜4e£¸-¤zQĊ™Ĉa;ÑRÓġOGQ‘“VÊēp=OôĊZG½EïÏ|;¨¤ÍŞeìz„*-·ĥ×°ßóÀ’xk6BL´sF£}E ëa˘ÒÛV‚Ğ̖c!i’3‚ÖÒCmġÛżç„“lÄm†I ÑSÉNSS£ùˆÚÛ_ g?‰ÎWÀ<"DħCż6‚oƒ‚V˙L:“ċŬöú`HP•ŝ½ħş‡Ñ*(ŝ†ó€,ôԑêQ-SĴM¨BŞlTÚë¨{Ĝ\aĴfÑĠII<Ŝ`tĤ•,§P¸°ú\[<=*|EǓŒÎ‘Zĝˆ|Ί–¸]Ï‘Ċr—Ä mQYšGOUŞUe†(%P¸ƒmíÍöĝäSvÓBj°(¤ĦĞzŞ“52EMŒJ ”6úĜž×úàĝs§ËĞ ”ȐmÍ­ùGßHżi^´I'„İY!ÈÓŭ^N8¨ñ˙†#G’҇àġ Fz‚ñ/´žPÔ[+4Bù\tíY_îıQZişa‰10µĈçŜûoЧˆrœÎšiĞM>‰ŒĦ“YCÙH[Xzzà\ŠNĴBLŜ’˘’ĞLìċšòX›€ çmıÇt Lk²ê-`ĜŝmƒĞü3žċ´hjòʸ–@çeÔ ĥÖÛß #ĠšHaê î~ĈĜĠT£†+UÜLŜPĥ:H eħ-%4Ĉ˜żLéĠ^ÄïÛíÚĝmO•ÉTÔŞ1&’[â–Ñ‹İÓ`<ď_§Ĥ#`1ΏSJf€ feżaô#½ŭqìŬ.˜Ş”™Â" 1‘ŻsĊżŬïĊĥŒž’°×N‰PŞÂ6şş,û}áF_uÔ+LÎVfÑe'P÷ç èiäŠXâ2Ĵ‡N•²ħW?_Ĥ3u‘ƒV9$Œu%pò‰’¤k~-ÎÒPSÒVM`f[.ÄroĤZ`³@„ІċµĊżŸĥQÓ4ĤEE”ċÊǏÓ.Yv$ÉkaZİB!\mûóíŠl¤uSOKx̃ŞÈOËsÜ\[jjhşe%*u$ĴâášÛ‹w튆gL´ñh:b)$ ьòĥûû^Û󍠟Z+ĞÈ$ÒÁ,N9!˜îş¸ïNĜžše0a™c,ÁX0·ÛżĤ2Ĥ‰èÒ&QkaĈçÓË}ŭħĠ<"_EeDE P–&ŭ¸úvïk]RÈÎQÁŒ[ĥ ˘4ϜNŬ{A Hğv;v&Ûàĉ£—,‰Òħ°SıÛ}>ĝU’ĉKšĠ$h5T:jÔ8°:…ħ‚N™˜\ĤI3e^ŠÉppÛ_oç‚'2=hŠĦôY`üÉÁßÑyüñ–šş–djħ‘cš1°ÛOkr-ï€2š÷ž˘]u1Êİa¤Ŭ€ġ `ÜÚûs†rċ-2T6^%Ĥ ƒ ÒşžÜƒÛîwÀĤ–.›+IÓÂĦf*~]Gk(ܛméż&kyt4ıRÈt°P,4ĥ&ĉŜ úwĊr,ù’²:}0µŸ¤²êÔ ĵĵîEïm·ûáġlÙ{EE,2| BĦFiT:èo[yĥşĤ…E†Jéiä† ‰şO>˜xPÁ{=¸'oOLIW["§T*¨¨ĊƒMö&ۍ¸Ĉòş*C–<‰Tí Y#,(żÍu;_`9=ıWœt’)Hk•ĜŽ #kI¤İ6ħ#ëĥMUˆQšÍ Ëjššİâħ Órìw`ŝğ[ÓOßz(R„´À‘m÷ô^ܛâÒù³PċiG,uÌä:<C5ïmí}öµ¸ÜáBäi<ßVˆ†ZbÌ$€­Á"ßêGȽ€\zÚËÉqÖE£;”Ĵ+oScDw`È/òĜ¸ŝ¸?5yHċ•é3ON˘GK€oqÇû~çlĊŠUYD]c˘áîyÖÍéħíÛ<1@R9jĞ’:˜2ÌaĤ¤iêèݵ¤9RB•G”…ĜlEĥ'Î1mü‘ħˆ§Ĥ Ĥ•¤y2ġ]Ŝ%քƒeĥ&û î9—ùŭ İH=ÜÔħ W˙#0ğ}ñÄ\Ù"jwš‘fkjğ.UÂÇ{÷`IüS›ÓżGEM2?áħ¤´a,ÒH=ĊğŒv˙ûÛG’ĝw*Œċô‹ñ•¨Yê$Ċ oı]€âÂàœ+Ìà‰(z9WJ˘İFËP‰P;)¸-Éż˜mĊí€ü2ĈĵT,Òhž& 5.Hß_XïímŻƒŞ¨Şi䞚“Ğ"Ŝ'VÚ·Ĝ£q·ı8];‘ꖍk!3Ĝ4Ż"bFöSĞH^Üël/PÒV•ĤéQĤ<—ÜéP-n÷'żĥH3*:¨çJ•~›̑ †P@oQß×ĦŞŠ’’ U%U-L„4²µïapvÜیmŝÊ˘Áâö§‹ÂQT´ĉYe`Ā. ˙~} ğûb •h²œ†šİV VD’R$éùôĜĥĈàúŽqWÎ!¨¤ĦI=QÊ:r܏ħÜ~XgÄ’ÑÇMU4°ÓȐ<0´ì…‰N×ğz†à”?èéQd9g‡¤Ğ§4˙UÙ$ÍF ÌMìI(}Ĉ“AÊĵ76GC4É™Îı˘İ{ 'ĝ"ç~IĊ-z|ž½Ğ^şL•-/;H7 kÓ AKWšĵùµïYe$@•2ü€¨&äÜ|c5JÛ)%Ħ6|ıTµYE-tâÖ˘y'ä*XM‰żÏ2PùTRË!ġ'0êyfC–{^ĝġüâdËëé#Jr)% C£áœ ê,6 FÛúbµQOYYSVġ’TÈè­pˆE[AP/Û`ôÂû–_TyUNB²S뤁Š9@i˜²(‘kíùXzá$YÔŞĞF²,aL‘šÖD‰â™Ĵ;ó‹eQŞËh$œ3ĴZM¤‚Ö×Üíìŭ ŞÍj'ʵs·RÍK(ĜÁc`=óç MÈ͢Ŭ šxñ %)’•°ÇŽxUÖkŸç‹ó%(ŠFĤİĝ–Ğ ‚Fŝ[ž÷Ċ7#­Ëċ˘ik‰Ħ—Ż$’é!€ ›‚ûq‡´á³:×Ĵ˘Ĵ^‹GÓG.ŻĠî,Ĝ[|˜tć´Ġ2ɐ%—tbMôŽ_ċ‚‰y'jҀ;r'ĥéˆEKRjeE Hšĉ˙R>]ĝöšŜ‹µ1G§ ċ ê8ĥÖġŻïŒ­µCÌ>"YÌDȊ€I֎Ö[íkpvïúmèb‚"ÒShTšYEžb6ıŝ\}°ĈŒR–0+\Ìûġ“ħżżħÇ0cJU•V.ÀGm ˙·ÒĜ6•Äù?ï6œWŞÏLŜu¤}+ ÛpÄı½%re4)Fµ4( ÔV–2褧bE‡ ĥÀ‘†P§ÓÒÏ­­@ħm7çòĈúqÈâ–Ĥ]qŞÑ̛;‚ğëµñ´%òÀĉuÙ|„Ż[İ)˘˘(ġJ›3­Ĝò,;àùü=e@´ġ(´ô%Ĉ‡’-rHXŜV¸7#mŽ-˙K—A%EQŒ.–×#(!/kÜZÊ ‡~p,ġÔ†Id’Œtî’Çp¸=<‚°ŝċŒ­Vü,­=5]E4´ :„€ZçOİۀfÈb1ÒÓO%gMDÒDĊ\µô‚yıSqĥñe PÉORµ3ˆŠˆéİtËc˙óğ‰Ġbl~ÀÉáœŜzˆ’š‘ä§ ž(•K=ÉŜÄñè?-à­Zb˘ZÈáİİJÊ$„‘xçĦġâà‹\“ŠÄٍ3Ö7ÄË"FF2#…6¸özâËX(iFWÔ§¨‘eéË,‘ıÓÉ,ĉ °"Àp Š£(—:4RI H¤¨Eğ³o°Sşíó·:!×ÑŞQÖOd“*QĊRHe§éjgħ7 {ŭ-qp8î&¨İžu¨¤Uüv3’·Ü\| MìNÛɓTĊ™˜]éÖx•_KT†YW‚CŜÜ_kílYÓ6›÷ÁSTU™)ÓT†.ˆƒĝÙËXYBŽ-ßI| Á˜­‰p’ÓŞ”U§o¨É`6żëÚÇÉTƒ*‘á–ĊFïcòŸNMĊ°‚–zšİf‚’ˆĠİ!ú… şƒêwâüíï€ê)kò†×uáŽQİPŻÌÛo{ ŝ˜]yÄ!ĊFoM Ô,=4{:§;(7q¸^ĉ÷·<ë+ĝd‚š˘ž&ޝÚ9V7ub,.£p,6$“ÏlÔu”3 äN­2–“BĈĴ Ô"ŝb8sϤÍ+3jËwˆİòÈ!§xc´ÔkzES#Ï%ˆ†×ß rÙsZ|ĈJ˜!£RÎUĦò~·Ê—K…a}€ġÁuÑ~ô£JĊ‚HÑIĝvhʇ6ĥ˘ċA°&Ŭ°‡™mF_^Ù\²Ó|4”Ĵ½VŒô j=÷n×ÚÛ(]gáe§ĴĴŻÏW/ЧŒ‹´r¸™êzòİ–q(V%Mġµ¸qÏ~{b&ŻD°¨£Š”P|Ñ(k­…JAµ”íż“ĊÏlôġPf†Z§ +"ĵJ4".Lhĵ1·-èq4F\ĈˆĞŞ#FİTÚȠߎäXŸË|1†Z‘>X"š£SI<“H÷ÒEƒĝ˙3ĥilŞ3„4TÍ,Žô,/N²Ğ3 LéE…Ċ½Ż€ózZ¨Ìcĵ2f†0ÉĦv.ıÜñcĥ8ĝżGµî²Ç*%"óšŜPx·rHçGWĉĠtĠ L“8ëU5wıìcùwĈ /Ĥ˜Tĵu0HÑĊ ÄÙÛKÈWÚvŻ{ `Ö[QÖ Š¸(V–à…F#ċ, –¸/ıà` î<Á)*3)§j[˘ôî¤Ym`Ê8UÜzóߜ5Êf–³Áòeĉš§áĠÏAçU³‚7#Hğ½ż˜ĊEWä?ÙSÈ2:)*VLÛâdžŬDŠ-Ġöşêq{yĥüzâoIn•‚žšXÏúh %H_S\{ #žwĈVÖCO›ÓÒUIPÉyĤ´(ŝʵïĥ˘1ífu—MœS4‘Òj²üt‰²¤ig"û›\o6M·lŻÙ[?‰şc·ĦÏßşSÔQ”ŽItéFébĴvĥÇaÎÜŝVÀ–I—ÍĠİTeVÒÉB3)½€s‰cŻmlö`Ħ´Ĉ’)ħP~Sn@ĉŜĝĤ Ĝ%]˘2+X‚E€=żÓ 2şú£JÀ’Ğ/M‰ÒúÚ=F×7›ĵó0iO6˜bYoŠÈĤäwún=o†ıcO—ĉµ4°êżRCX€oĤŝU#{€ †˙LL›ë’’.Ù=cċy]L촐4ëĴKáäkd¸6Q܋ƒ §3ş¤ZyéĴФq1òÌċuĴ5”€M€Üâ·4§Î(Ğg–‹P€i›y¤Pú€kœ%Î`"Í%…Ğ(wVürÒi{qf½‰\‚MÏŒrġĥìd™ċv\2É"މÒı¤S$é)e’XÔboÍĥÂ\ÎVj#0Ğ‘İaOÀY8S\*‚}w?LZrĴż)“(LË2Ìê*ZħŜ§Š+"=ƒ0>ĥ:wĜ_a|!ŻË2êŠĤ JŠˆc‚R$Vİe–!Tßc¨cÎ./4Çi ü9qWâJ ­07Y‡L°D<ĥ›wżŜöÇCšRxy*˘š––½ïéŠu$^ʽ?-Íí·~÷ÂêjÌ"É“%˘ŽœĠJ’A<’şl§Ô÷sĥgT/M_VĠP~t3’5’U­ı н͆Ĝ%%,iğnĜâşJĴz<Â:֚b#ž-l^lê°$ú poÎÔ<Îĵɘĵë?Ĥ*"ˆÔS˘3-­ĉEÚÖĉÛ`œÖtpƒŠy-™˜ $ÛkÚüa-–I‰)ċħ°ŝ×8׍R4HµxF˘ˆE_=Na2UĈšİáPtÊúv½ż„rŜ `CK’fKŽ ş‡GĜtÛkıÔ”’vµÏm°–¸S‘¨*š­'šÁĠııĉÛZßßZ<Û/’hé…=F`ó¨S¨µîѝŽ-}­{Œ7iĥ&ÊğÀôġdœĞò7½ŝ†ûŭqŬMS™$ŽŒ(Ò¤\ï·$ ˙ĥ'T˨ĝ¨ĠšSA"žĤƒp=4$”NĠf1ÙĠċıÜŝXµĞ$ÜÉĠJ¨¨ ¤Aòß{“ÉÀ§‚‰cÁ ùàšİĤ4ÉàµÏ ž~Ĝ)S÷{Ô4ÁpĞoœbÓô(‹ÊŽ|AŝŸĤ#g ‚oëŽâQ0BQ“ÈŠt烙7ħ'Ĥ [[½ıÇQ˘*ë žosÁĈċԁAkíĜñˆÑÊA½÷ı°µ†ÖÄg‹ŒwİBÚÛq8ŜŜĜ–W2YÉVcÜ8ö;%Ë$Ìë q4¤gënUK·mïˆ`"¤³FÏKĊnEûûa6ĥ€¸³w=½ñ¸ÍÛEĊŻroÛÔt ÓĞŞÌyÇ 9PC5´ż\06ħĦ]w[\é܌s]d\·ÔN^Jw™<ˆ€,яšÜĥ6I*j óTġċ“—ħ½ĝŜĝI’9êĥ‡Ö‹ÁŜçß×4ħĥžœe@äžoˆ×ʃùïm ‘ü­ˆÍÉıï낲3ƒÎ9ŒuÉ'°Ç˘C¨d‘ Š‚t‘}CŽû{áİĤ޳3ĤĦĝsOPҕ-4@R6½Ç­Íïż ÂZişG6ÀÁî;áŜmíUfCŸV HêŜž1Ô²’;_{kâğáż ÇRËW2­dj5cmħ![ḿÛaîq9ì2Í0|K"…Ú0t‹\ËaílsóÏŭ`Kn†µıLŸżh$Ĥ ĥs3H÷4ñÏ>˜>–µİ‚eĠ™á·HŞ/L܏5ûíq°g•ĉê[Ħ֑¤$éhĜ6ƒoNwïÎSĉ9L2ĞÇ%ïŠXFܝ67ßú’?>˘SG3ÓĉôLS;S•`,7ú…÷ïnĝ&zd $qËž*;òß7ħ°áÖ­Ì~2Q8xD2X‚E¸÷œ\rٌt Xɑ‚…ä‹òMż—ıÂċt“A}'ŠĤ#:") M-nçnÜmnĝ]T(’)Š’HÙ $ˆlK”‘żŭ†ĉZċHâıѲ6Ê·ï{˙&ĝE˜=]$µRĵ@pŻÈ¤n{ñĥĜ7h öI”IKSĊOQbXĈħş0„îV ]ÏÛjJókN&’H£ï# ^¤íŭ8ĞċurÉX É:Ëğ’ …ïù‹ßßGV*Şjİَşv²™&Ĝ ÚÇïÛûaò>Ï&–8Ž“/ƒ49éĠHŽ7°½}m ¨Éis âĞjİLŞ7^•eöż\'’hĠ“DîÒĞ ÛÄÁ3ÔL”+ r€)?ê\nż^m|CħĠċO \RVĦĤĠÊò.EîG?|:É(Ĥjj)]¤ ­UœÙ}Mğö‡Óü–µĤ§4PÉ^E$¨Zß('bAî6j‰êéÛ£STdğöìxç­aèÍOXÍі8Ú#ĥ‡:$p@ÜĥûñŒceOKkI.÷ êXžŬ£0–Ò”Ó2Á"u„1ĴÜÍŭ>×Û ²ħNI–üQ²ġÎìHä¨ôĊuިt’Pˆ#fÓpd}ZIúßKïŠÌy´ñG*A ’X˜ĴŒ@ó  G§ùï‹%,4µRŠI¨}*˘Ä.£ííÚĜĵ9U—ÖÊd€ç·;–7îß×ĞÚäĈĤğĕPF‘‘4eğYT€..{î?,XŒyuJĴo˘ĉ¤ R6â÷öĊ›2¨ƒ3cdêFí‚9¸?–,9Ħ£êMŠ’şJó}ÇñsƒlĤ½7E::8ô ŞZİĥ`%ó[óıFŭĦf.Ħir)˘­tŒh'˙ñ'|'ŭŭU¨@+( ħÌúC}ŸÎĜ[[ĠħŸ½F·:tĞçı6öġĈ½AöÙl‹Äŝ)Îj–Š<ż,`ġğ˙ÚÖĦ³˘•³oQĈÄÙ˘Xúi[íöĊZ:̚èĠô猴m+O½‡èN8–,†ÚXszlıħ v<÷ïq醠R^—œ­)”ñÔ-Ĥ-Ö6ueúZçíÏœä"Hj*ëŜİÁxy” ğŽwßPù|p¤T€Á*é£~ä âїÓ,_ Ş4A)^›n,á¸Ee²ÒKÍh9 !²l¤(bIżNçĜ ûnm‰üKVLÑċ‹GD-gd2_×vÓĥ<öĞĊUypzjŞYÁ¤Žž†Çê‚óÀ•ŝ<ÌsX5QFR3ċ HżĠc÷8]~âztŜ.žŞÔô™³K2ù•Ž(×˙Päŭ]™ċI3͙I"*éX•£T7˙qÛïkʤñU-4b8$IĵÑŬYXú‹ñôÄmâ—E×C?îı@ÒŻNyıö-´ODİñî]áIž’vž²¤ÄéD~À³ŸÔbğYûccU#Òäñ” ĜK!Ô½·#ż8 Wĉ’ĠÉĤBĠ £ve“ë’ş(I ––!#ĥ˙û÷ }!¸—LĞǵKÊŞ…¤™—As1Şrv;Ĥ.tĥ<™'èĠCPŠ(&ğP°ú{jçŽyYљnoçó7óoWÓċ5ĥĦÖ×d§-Ïı¸8§‚¤}1’ççtÍUF’šI.VY GĜHûàĦ#4C9ˆÛÎĴ¤kcĉĵßĊ5YBÔÏ4‘•H-î6y”ŝĠвŞuŠ 9)G1, }Hŝv8Íñ:ÁV{ħ¸ >ĞsĥĞ´ŽúCĞ5÷ı·ëŝvDžÍûlÌKj‡& B…Ùıû[l%Í?iĤiƒĞ΍ 鿯ç‰0`äşJɽ‡V•…úd^ÜíŽd‘^ö wÑĈĜ Ĝyú›èk‚{Œ_?d• ž#Ĵ…A+%#¤Ì-ÏÔâƒ3Ĵmr˜oc׏ÙĊpñĊż•&W†Íܑµïî1—26„ô{ܓĈ ÄDE´²GsëŽzÌÖ*[rÊ£òıżóĈ¤Š8ˆf‘Nħò`O×Ĝ™5…ğÜcÉ0mÙ+Î7~¤Œ×ĜmŝĜώ1Ğ*íĤĈûß|@{ŝA½ˆçíŽÑÀSüZԀ<0L2ZıP%I$v÷aRĦUçí´|ƒĜĥ%Jĥ™bĜ ħasqéÔaU~`FñĠ‚ÛT‚Qc醓vË VÉ"‹—nڍ­…ġ”ÔÓhÌd~TžCqà(yŻŽd ÚK\ydı—l oÚcE 1ibvÓ~1¤xäòRr=ZH2ĝB§\F?Ûñ ďó넕ıRìí3é$7S}'Ŝà¸ĊĝĞâéYLR=ĈäÇE2Ï+jŞaşù•CÏôĊtkÑĥŭ=B˳lşĤ“ËħY.Kß ³|€Ĉ­<ÔÑĞ˙, İ âİSħ™(i%ìû­­Ûŝ˜yAžT&šz‰§ƒK+ O ›bY„1‘%‘Aeß븂“6¨}lÄI¨íén1é”ĠpµM3‡Ëçk¸#?‡¨³(KM<ŠyRTĤŸÒĜ;ÖĊĜIK>SUe-ĵÚ˙M\oJ”ÍP0c˙ñM‡½?– £26šċuÛi–÷ûà—ĉ[LT¨ ·µÂùIûŝOd*èİҖÑVQµżŽ4 “ġşŞ9guRğĈĵşÊĉߞ,sHÔ @a*ĤĊYl;l9ÂÙĉ§Ò Ǹboô°À•!Ê(ô‰Ĵ­Á2ïħVhò;ë5Ĝ…*€rEF1&Öê5ÄíbG’ö> ˙œax‹(xÉY#°Ŝ˽öû´ÏrıéكDŠ ›[é*}°6Ĉĉ6iĠG"&Ğ\)ġµñ‚tŒiҌHó?çu` YK.˙^ĝŽBu vKġ˙ñLÏî;™`ވÄZiÜşŸoċ„ġÙ,2İZUĞı[„‚{%½ °Óœ˘Íi[ĝ†ħúŒ)Ìüu.YSÓèÓĵvı MÇôĊÂŜŠŒÓÙydÊôòÒIÑġ}íoÊĜ³.Hµ˘Afĉx‘oŭ”ŝĜ_ÚµDS¤1e‘̤ßQ™Eŭn0Ġżh“­tœyĠv*~ Ò™k%V ÍPeSNŜn‚Ŝ—ß sURI­ËFϰFrĴ}ħgÍhŬf§ĦX,âë4.‡˙µ·úâ³7|RUâz֔(ù„JÖ?ŭ€ÛEOdĵ)ü;˜WQ„†Ce •ىĜfĦ H¤”İhʲ­ŝĝ/ ŭ˘Ö4%kU$s{^ϽŽ.i˜ċÒĊf=9ޤUgU·8‰JqÀ&RĦxİäƒ1ze•YXa1íu\5+ İéKCRÂ‘RÎÔO녞,ĞÉ!~„Yġm;6òô°'úb…_.‰Lt™íMdLw#Ħ'ġ.,”l½f>”^ŞŻ9¤x튕.GĤ›Ë `Ëò ²ÁM)bQ^F7o˙—×ĠĞ’4c%Y+{…µÓúâjWJÊĎ*Á Ûçœêı÷·òĈ”û#ÒòÌĉžŠE†š¤ÒĴ<Á:jú1ĥÌ風v“4–•µiŞM~ŬEĥ)Ï>M“ŸÓË k´*Dˆ~ĞĈĜ]VINñËÓĠ< ħé¨úŽ>÷ÀĦÛCNÑcİÍ((s e„<Ġ ‘‰"ÙÀŜĝ“ö‹›ċS<Ò9 Ü4‡@}F)××\Š-CmWµˆûà<²ZƒĤP$é7ß.ĤK~†Ç_Q]˜OU<·’Ħä•Ômro}°ŽmċzEÑHÌÂ2{ÍÎJo!>ĝŜ(‰ )ÙYT Ŭ}°,ïİÍĈ÷ÜߟLuNÄ>Ğî{ q>ÎwĴƒc,ışŻ^[ı v6·Ĥ-4ôSÍÒÍC*)ħ1Ĝ€{ïµ˙=ħD…À o\[2üĈž§.tĴZ™Jb"áğ·òÇ?4ÊVK›C—2Œ²i¤°YHñġÀ’ĠUŠFŒHU •]ÏŜŜçş+JÒÊòġË\ ­kaĊ°ŜÌ1Ô ğHÁlJ)U>Ž½Çżç„Ş4™QĈ ïN(¤)zw°>Sġìq•0ĵĦç@(ÔH–#m îÜon1kޤ(§Zİ+šĤPzf’Udaż+ħ]ûSjë>!£ş(’E…ıíbìrTjşc7Hħ¤Óf¤[Óc·âĜÈ Ş{›T^ĜĊU”umlt +-ˆçú'öEJ.Fíïk˙]>c4éW],’tË6ߝı·p1„¸bòÁ¤Ë‰ĞóŒĈ–Y¤Ì)ċ? Ş~œ)ĥ÷;’G#€-ƒ3ZJĵÚħjċĝzħNÚ$bşXĦ7,$µWħ"ûqżŝ3WOfqĵuJ‚cO0é¸ov!ƒ/ŝ¸³ċÙñËâB ½.‚D „<›)°öĈ’èîÎK¨ĉ/xs7ÈéᤖH ›ı*ŸËÛ 3Ù\êd’”ÓÌçÓŞ3ö‘ı÷ú[ĉ4ĦjrF§uam7_Ĥ§ñìm",×,›Ĝ<ĥ GÜ˙ƒŒsĊóm2Rŭ•:Ï çYòMT Բ̐ë}n6°Ċ(Ħ¨ş5Dú|ßŝHƒ…ía¸·6Ó ñNg=P¨LĠ˘arĕ ÖìAÛ âñTuŠ:£•×+÷żM›ŝ}ï_<¤İ °:Ĵ×â2ÈZ>°]Ô# ĥÄŞ‹ssÏ×Ê:€ß!˜¤ŒÄÍġżç-tù–e("¨·˙ċ¸ġüż÷nV*¤‘*^qċŽx•=|ÀîxÄw_hK6fÏ&Ž’F5`C€XooQéĈfġ=lŸA§ŭR÷,íĉï·ıçœ?›ÁȄ½&iDUï>Ÿĉ=ĝÁ95eN]--&]–"LLcÌ"fk 5÷ô;ûxòC Ó²›DÒdŸ҉Y4Çw’6°q:ĠEJyíP$/r|çûïĥÓTÈÔqF‰RK.žwôQÏ,ä Š;eıƒÎuF*}{zÚ˙Lo*‹Éo™erǕĉ‹*ŻÄ4ƒ¨@_°Ô-µmaŠÄóFkċ–hٛËÁ7;zŒ9O ĉrK,ş°ħ ŬĦk›}!¨&s5SÈ2ú°ÜİĤso[m‚6ïdÚ@ù6{ĈIËTHeJµ‰¸µï‡Iâ4Ÿ5­¨ċZ%X"qwKÌ}p"~Î3Kêzj°76JY/ú¨>‹öuŸ†êEDà[ĝäU$öĉÖß7vĜZ$‚²x„Œ`D‘eŜÄìK}öĥç1éÉzéT²+²ĞFÀĞĉÀG6'×JxĤ’P[–âhÈ$É÷ïoĥ38Gˆ3ĊTZ˘ ŝİi„„ƒħ'––ÄžO2£Ĵ0šUIZúŠIr¤ŭk“ÔÏ&f•½X§ëuRAíénÀ;—öYœ*˜Ċ‹weF ŝžöĥ4?gÙôt†{ƒó˜Û›vÛß{‹v< óÌĈ*Ó RFÍ!‹hÛıcÉçŝşœÏUHĈ]0­ô!Ñ)ı7$í¸ĜŭqÊfùô2 ™*)c7$˘[ĥ÷{ííoL›~ÊüKS3½=U4‘0½ {~n ·'íúŽúĜQçĤ‘jĤéĦXم–ĜÛk’v×%A§–Ué"k4šÀħ·żl[`6vÒReUs"ĈZFĈÁA#ċ¸}ÇßĥÍ<ñS,T”ĞéŠS3нŻ`}7ĥç5ûù›jHê^~£ˆÍĊÈ#Ìú˙lħË-F°ĴÈ6gıc{žpŝ/g \ŝéШÒn‡{/kúàÙĵŸÓ²ÌÙtÈ˘O(hï{ûqí…÷`½‰)*ċ Ô´ŽŽBUğûŜĜìx‚Şe˜f“:°òDHU x6µ‡­ĈĝmSá,ꖅ¤ŞI`aŝšÈ,§ĉŽ6ĥÇ×x0¨2OS–¤E„2˙н·Ô-úŜ×ۜ'>:ĥÄYé³oÓÔÒPhŠRĊ£Ñ¸6$Û×rìN9lÖĤmsIXŞĈÊ1u°áOħúO—™ašg‘#HĤb$"ü\0í‰Y]Yf¨tžİÓː#n÷½Á;–•ĥ„6\ÖıffX)İbĠİԔı܍KbI6ħ w>Ûâğ]Z•s„ŽŽ LbN²uJĞ ìOÚŬÀïÛ óiaİéeïUO–;ġȅ‰q`ÀiîmkیW•ü\²Ï_˜Ò%(7ÒÄĤĥ#ËÚ×°>ĝ½+B@˘˘£)˘––W) ‡J)˜U ]Scsê8ú` (µKYJ†Âe„1ÖÖööÇħÇU™Ô‡~¸ÌžvvŠTŭ0ÇoRmÛQÑrIéëEŞG+j@ĦGÍĴ ²vŝÛíUc+óU%d‘S³$R³$³’Q ö"Ââێ-†ÔĠħdt‚xëcžEqÓHeM…ı°*Mĝħ³K—Ít2SŻ•ĠXĤğ‹Şö_[î0ßĔ™hÊ£ĝ ˙†0"…‚FSĠ;\\nÄH')FÒ~Œ°G[Q–WѴεÔ"™éYSDĵÊ,·ßċµ÷†UyĠD½QxĦžÖ‘™ƒ*FÜ_ÚüŭoŠVI•˘Óşf#‘ÙR’ u>f ›ĜööŞ:83Üğ¤'šjzX‚żF"їÂĉÜp;“’ğe›ÓÈħĈ!Ğ–Mcž_3Ÿ`/úppÄ5M]5³“ÔXÖqÑ^ÇUÀ·s÷ĥ-ıeM-4°ğċOOVÎ#²Ğ1¸Ônw; Ż·°ÄYÊPÎÔµtr§SŻÄt×sç_˜<ßÛ I'U˙BʽUEVWU/Fb,SÓ_cpw˙/‡tùÌm'Á-^…‰ YKèFĠµ·a¸Ŭ€?l/ñ^Š*ݧ9…5dÏ)´'Îâ×*n5Z‹íͨCL%Iİ3éĦ ŻáóımE ŭ͈ñĴ#Ĉèlg]K%MOïW¤š”€ÒA¤Ò ĵ€ĜX ÈLZòÊij2¨ê"ĴĵD%Ċ¤yO`ğÛħżÒüâşġĠÒڟ7HLBÊ*Ċbvµ‚ónÛmoĤfQçTK†iÌwéÉlck|ÚIm̀÷À£ŠY~˘ñTêşh餌íKN2ĥ{”‹ßœ˜fùngOXküAPb Ğàċ£A*öJì,ŻßjOċyYĉÒBñYĜ|Û›Ż½ÉÜ`H³lĥ,î–Z˜ä—*i5u!òqĜ3XnwŜĝ)ÛBĴ“Ŝ߈ÑBԛF ġ¨Ĝö·ĤçšCA˜Ĉıj-3£–•ä.²yĴTĦÛHïQé‰ä“f#%×GĤÌMM0•VŬ†ûì;_ŸÉ^KM .kûɳXÍ Ñş7°i ìB”:X×]6Û DauÑÔgÒg9j͙ԙÂTSHá$v°U$ÈŬˆµğ`,÷4lş¸e”˘ËܕTs}dÙÀ›Û… ]}ħĵû7‚Šhsl˘ ­LڋK:–7uìxħÖ­P×T½oS/ĦIj8–. E7ğ{ŒijĈ‘i¤+˜dÑ4ùްHêo ĉċBê"䁯}ì-ÔRD¨#Ìëk!rŻĤhâ×ҁ"äXX½ğm 5cI•EsWSGŬQƒnĈĈđL>ƒ=ĦŠ‘ê)‘ċ̒%é´ ÷RĦFÄò9żÚj´„q•PĉĠjÂ#X¨™ƒšĠñM¢p,;“ùí²*ö³ÇŭÔë6‹$ĈŞC2ÈO'ɰù íıÄÔıŝgžÖĵ"X!y&Mç röŜµŝĜ{ài—DâĞ#–*•mOV ÈFíıNÂöµ·ĈmuNÁ%–ž:ÄȃšrñD‘Ĵp,(§ÑC ’v ‘ko}ż2İ9nSˆİ‹+‚`ë鏵‹0ĥ˙)ç|0šXóxŞ*z=@H3Êd’5KqĤÛ^ŭ ĥĠÑċ³0ŠİÉiñĦ%…üğ‚/kù‡żµħ•Eè”VğßÉ8"%…ı6]|RH™B=$İ˘¨˘ sĥħï{ÛÊ:r÷vËòâ56K’ÂÀ76ÓžÓWQÍT‚žœĦÈò’= }Áï„òx‚ƒ,Ğ î à *7µšQ^öï|sÉNRŞ-M]<ñ$­ċğ‘eşò~¸S˜ĠTE)jFt‹X+"ž aż$_ƒn>÷À=Hsl°TĠVÄZ@Zš5MWä†üMĥ=K4Îñġi֝‡úmkjôç‹mħ1‚@5ëIÔĤ=EĠ"ë‘b ĉqÚĉĈӌ™İŞéB’ €’ •ŬŻê}˙ħ\Ĥ™§ŽJH%DġäXÊÜŻ¨Ŝŝù|´ÍIKT–pìP‰qÏ?Öŭ°8µ” Èh  rU5+ Y 7  ï½ñUDĴñŠ:QS#)ê„XÚû‘ïa   İD²ğ“¨³ÛV˙“FC‹W=XŽ™´ĥ’Aħ°÷Ĝ mkûí‡ä479zü 2Ó;O:²€d>†ŜÜöâĜŞĉ5uµĠ1- B³G CüßNïkaqqĊñb|ÒÁÂU3ÌUo)_N‘ÜO{c_M4R™ŒÁXH‡6á_NÇ۝h RVĝ*V:ôj‡BÎËÔéĤàĜñp,oÜ^ĈĝĴĉYËċuRÚĦFtİh‰V<êk…ŜĈŝŜ–\ġ*˘šJ§âŭÚvRŝU5Ï"ŬĜ VKİ Ĵ:­,AYŸ×Kĵ\^ûcğn„/Œc‰z,îWLì§YO—m$\[ĥÜñ€›Ĉù‚fœ° (]ˆş É˘Ö Í½íÏÜñ|'›à¤„~ì·aߜ)Jšw4­A/!ij´‘ı:@óöĈéóZŞ’0Ï,s1ÙGâ˜ħxw1’&Ş–štP"0ȃWp·$5¸¸]ñL’ĦîŬHÁ'‹‹XúûáÎYY@ħ*éDħ˘’¤˘–.’˘ú½ŽĜ—6\ò޸äÌ^’ğ1Z~¨djˆĈ›!–ê˘Ä)#…‰Áž"£­ zJzJĠĝa ĝzx‘|ŞğÔ ’×7·Ħ's…9e/†%ÎrÜÙ&XSI? 2+ËıˆE‡{Úkó™2H£*éê•B2+‰#<Áĥ$‹qmϨÇ<ñĦĠ2ƒ™)Ôë²ĠÄ“]Ë1½ÁR8Û×ÓÌÒLí#°gnvŬ°Ó=3TÖI\É’dH,X“ı˙=0Ş'W‘‚>ŭ1Ñĝ—a´Â„WweyÌ|Öüïká….]'TÉK,MÓ-ŞÌVën›\Ûµï…丢š.”lş•À+‚½½G#ŝN;ÉóŸŬ2’ħ,ÊêÉ"êA¸ô>ĝu‚I3(b!ĤˆÀĦ‹²Êà@Üöôá|U „òPŻ­ÙlĥĜŭ1Ġ|³ÔÔ5EB›ÊnÖĠ€Ĝäïè.++,²ÑĴòyĦV逞9·żÛSeO ŞĈ„F60lŬאNÀ…*N­‰˜Ê“i\c~ĝĤŸ‚8éœ…`B!”ZàwÇ,ÌçU­îĜ&5Œˆ~9:çıµ …ż2¤˜í§–ĤÉä÷ŜÖŬ…Ĝ–cüñòĜż|MÀqızd’v'p ÛĜ~¸Ânxĥüc \€ĈĠĥ7Ü[Œ07²8eb¤wŒÄúAfRMˆĉßL Fâ)‘ÊêX‹Ç× Œ)–%İ+T'1•²[5­µvÀhĈC ½‰kW2½2Ğҋ܆&koĈ§xéĉŽf'U71É}-ìm‰@¸çµñÓì-íìV‹o€ Sqo}°Ó$­‚Šħž˘š9È_Â2^ÈŬ¸?L*C"âübvT-pF˙íí„ĠŞM\ia‘iŞ+^êĤÀ“µ˙/ĥQMġI&…{•…{v‘Љ¨ì<ĤÚäžŬĈŜĝŒQÏq˘'bw ŭħ*)IjjŜb ;’/ósßÊíQuȉpşM€ˆá¨ÌH碒Z¨Ói5è`Ĝµùŝxĉ—(¨šW–*I¨Ħ›ÊɤĦ7Ò/ü˙ÇzŠjbŽˆ,Y‹ImGƒk}p=G…ëŬ ˆŽĞub:o͆Ħ{o„sċĠ0FujÒ”XñĊŭÏŻŬƒ‹ġŒ§Ċ´3é”T[ŭW,éĈÖÒ/~ßÏè:/G[´5RÏñX†>ĤäqċôĊ•ÙécdKğ³NÛÚŭŭ°Ó*Ì验´*Ñ1{ôÖ{j_KZçî;)ÇÇCŒoHôŠ\Ĉš Ìş†FCĞŞñŞçnvÁ™ÒVM'Èï“VüŸsìyÛa™x3ÄÍY$•T1aĴ,h~_oí…ëáìĴ"0bÑııÚÄ|dŝžŭ…öÙî•_*ŽJş…vr 59 GĤ›ïÛ{{á-R5S*Ài˘Q.§y‰ ;X{vĥ<ĤŸ(ñ Ċ) ÌĦ˜‚4Œ ~\Œ\İ+ü_Q—cáÉsâpڞšDwök À½Ż…özêAöÙ>e›TѳÑÈĦìÂ0v`@·İßí„TYŒ“‚Áµjk÷#“êoÎ,´ ñ|‹=7…)-ĉëT´ví;)ôïµħ3ĝ1ËÄĤ˘ƒ/ËcP rċÖBv÷ĵ²\càÊBĠB`Ñ ŝyċ6‚§v ÏŭâÒA”ċĈA^⍈'Z†$ƒżı·6Šš:xÜĉta ]¤tĴAZí¤ŭ{à Ûô]GyĊMDr‹˘ŝ]'MħŞ?çm˘JÉd‰mĝmßï„EĦf-וIùT›²şÙ­·ñ{âú ¤Z'ñT¨ŒÔİġ,Ü÷ßżŒĞmĤ–œƒĞTLÜŭÎá{êİÔ£°í‰“à!”ËnG}Xü ‘bƒĊ‹^ÀfI˜ 1%Çç‰d¨‚8œSÓ8-şĵĥGÇl!’ Ŝ&Rĵ+ ƒù`È ëSÚ:Yg”|̧Èâ^†ùVSU˜ŬcL‘·$ıÛÏáé Lùµ‘‹y#sŻò#S@ħQ*´ż 'a(ôŝżÛŠJÙ\„t˜İ¸µÁo½ħüĊ&QKY8§†–ĦŽÚHûl7o Ö¤¨İs àŬŜ¸'Ž şq-YxŽÄIRIôñlĞñ=ĵtÌì6nœ‹żüb[wS(µNpÒyŜg:|˘]ˆúX| .M›0ZıäW²ô.sxö–XÄP<%i$­ŠîuâJβ~îœÉk“’Fŝ¸¨öĝ+ĞĠR×|İĊEB÷ rßqÎ#Êb ih¤SüA†çóß×Ñĝ“Ä4ò +(YÖŜGéé'ï‚3ŒÎ&˘İVÒ,?3¸ïŠĤ,†E][RXöÒ!Xn=ucSgtOÔRÁSr ŒeS{ÛŜĝŻĤoK–IޔʏϜ†>ĜkhäĦéfYd ŭhvqö Ċ…APÈáè)™Ĝŝ–àbJ•t„•‰ ˜‹ubqoÏġŠ?ċġSĵ1JÑ+V?ÖĜ2zz'fˆTe˙sêüÁÄ´¨Êzœî–Ù*QA6ŝf·¨>˜Žç9}–j”’CräLn›7Ëè%\qNH6’ß|M<ÌĜuUÈâÁ­o× ³”A‰sH"YÖĴä€êú˙Í37İ{ÔC fÎé)…Ö•mÜ(6çùàj_SÉRñ &&âäžÖ#}żL6Ĥñd‚8(薝M¤Ñ0W=ĥm™,[°êĥ+ŽŞŞ%éĊ˜ÑÏĦÖeWż‘ ½ħĝ/2­-2I—²YjWĤǟlX%9,­,™½M;…5Jöö$­Ï°ÇPċù%\|Fž/àdê([úŭ0ğVƒ˘)Íáĵʊp’‹ƒ‰ û•ca‚iü;ŝ꧜%ìĴÀßԛ7ġĊĵäTFéM˜Qցçˆ,XŽ7$ˤċ×a”Ĉ­ò´S,Ğ~À mÜrq]ÛÒHĴVÇ1-_‡éİÙMş°‰ó%ˆŝ¸z:E&GˆĈßÂbÚŝú?ç™ŜKL“AW‘ËK; „޵‰?PTôǟWWšÉ…Ó!7 }v4‚”żB“Hg_V´P|-|UëŞB”Ħ4“˙ħ'ß ‘:҅ıÓË}1óYFäñnĝ+H²K·ÎÛ Q“v,)$ XíÛ _ç9&½=Vw82&ĴÖ¸Ô€•bAĜ…¸7|Omkbtµĥ¸a°pm‡95gFĦt; \ò’¤û_ĥ›ƒ¸ß¸ÇHìŽÌ ÁŽV‚.‹„tuDÁŬo›[yŻĜ‚é#Ž˘'I²óāéâê;êÇĉTâÌŞ$œ;ËİĈŜ{GĤĝwO9‰ÒŞ’m3‹qŝĞwGóĈ2…lĠJÖŞİÒ µ#*ÓòXĴ,7ò“ÎÜa4Ş‹Rà˘ħ·#é†Ġpj{Ä$.Äġ58mDúmĥ‚’XäğèEîPa.-VĊ$ Œ­bn üħ5LŬE1m~£°ĈĤŠG(U.O%Eğ˙Ÿž2XşfHÑkkßŝħI˘hŠhH‰[A,{ÛÑXGĤ0ĵħ•]` µÁoӏ-žT(u;ê Nçd‚ˆ½FF.5÷múâQ8EVaĦ­ÊŽ_ ĉìâ1”Ôjì-ÇëŽÈ3 >]4dµ ŭq?r²[=RŽT’l™Ïn1’TÍ Ó ÙC]GÛ%grñ£İà”ëĈ8\²¨è'Ĥş¸Ġ*íġÄ9CÑ9˘$–Ò,Ĉۀ0ç+É+Ğ—To ÷yX-ż‡+FRÓfPFT_OÍüħÒÒR³†›5nʄŸ·la&ž"CŻ  ͖Hœ×鷔™oĥÓäpekĠÍ+2m´ÍfıâàŭíÚXMˆg‚ršâ/j %SċÔÈĥ#܋mĥAᯠSUTBħµ›£]Ĥçß×ïèĵ[“PSڞħcN4Ó!·ĉp›ö”O!êĉ5(ŞY‘ v N"O‘ŝÇczzo¤L­4̃%B8ûí|N™ˆgşVĉMİÛ T9ŜĝuéÄÇ4ÔâÀ ˆĞô˙œiüm’^5YêâڄD†úzŭ1Îûü ‘'î*É$S.sZYEÀ:EÇ烣É*â6s™(ìŞÊċ¤â(ĵEM4É RׄĜĴJÚ-ÎEQ@2]î&S÷¸Ä>ËaH²6ı³LĠ€#cQ¤˙P0Ĉ8Ò4³–"ÖÔIo×|lÔÀĴê9ŜÖ6möÚĝÓü9[xĵÖ!Ov÷Ä;{¨é‰µîÖo·ôÇm¤ Y[kì÷Ä!•ĥÖXö6¸#ïëŽ"”ÈŒÂ@ÊżÄËo_óĥ$TĴŒM˜‹ÛliÌ@Ÿ(Û¸7Ä" $‘…5Żşßëlu8Xj –ĵmĉ.­€z$R¤YXéŽˆ”nÄıw#UeġwLbŜQW ˘vĜžqİWŬˆn—ż½+°Éáĝg Ğ~ù’]/²½+FÛzñkb§ġtI4҆i Ĵ ·{w÷Çı0"E6ħ<? Â\×ÂYVrOTLŻk6–6?kÛGêmŝA“ç™§u–:„1Ĵ ˆ_qnnxööÀµù•^u˜Fġó£ÈX)rĦTz“l{UOìk.”™ Ż0Ż*˘>>§Q8W~ÇóH•RĤ>YÄŞżMŽĝí‡Ôñe>|͢Ĵ§†•Ħšš• (Hn7[s`XûÛŒĤ)êbš Q‘,N˘w¨ “ê=eìï0‚ïŽîGË­ ¸ħÓ~Èéô ‰*ĴŜr8mĠ­Ĝñ·Ûòrñ5ħĤ™|$”³DÒĊm"P·7÷U%€ĥüŜĜgışÔĤŠJyLJĤ‰vc·;[×é·ôœÏÁ4t9YH ĤEUĊ Aƒ•˙p{˙ËhÄÌ gF%í̓ž˜Ŝà‹wß™êj+LrF`†"-„Ëc}7cqkò9Ápœĉ²I[;$KuŠ%E ħm€óŬŻŽšĊE‡Ä6­Ħ˜Reè’ŞuPÓ+#é6c`ok ͎ iĵ#žf4ÑÑÎÂ' V’Nİ‹H%V8ÜFġÄYv_ċùÚ5_„’ŞŞ•KhDÀ'{Yŝ·SQRĠç‹&YMS-TİgËÒPeQ¤\#’CüÖĊĈ†°Cšäıž[kœSU$Ç҆fXÔF{jU&ä ß~ï 5mcRÁWXñ+5DmQ,/feÖÚĝôl˘“'ƒ*–‘iúVéó ™:„ÛËÒ;şÜĥìÀ °=wìŝž@µ~ÍVšHXŠ”¨”é[´µ8Ĝm½­…Ù^EĜG˜Ö0ŽĞ!ĝyÌb8ċ§Gà‚UÍÉıï˙ĥŸPgı-*šñMf²ĤŽ)\­ì6€öż`É$ÌW=ĤŠğáŞ*á³²ˆ ¨j10ħ·ëÎĝğ8‚²Hé?w,•ŬÚY^×Ì|ğ}-ż`‹“¤ŞJï+œ0@Êl;‹vżöÄqWÍÏPĴÉ"îĦˆżÜzˆÑéÔIŭ6…ĊĈ =@½ıÀéNÏ “1U /f6-½ŽŸ_|n‘Vz?ƒ|zTüliŬohê%‹\Ámò†µì Îän{âáSá\ıòƒSFd¨£Ĉ‚ ¸…­rFĦ݇ŝ§m­½ñâùëI›SV0Ú­;Ž7ǧÑĝÈbĴcUċ%X\Ş´š·˘y·;sŽ^h¸żÀTÛÁ‘ÒÑÓÔ¨§ŞX)Ñ ›ßċ‰Ċƒj7ïnĝáĞ“Äż–ΕÊ'zJ•s!ŻnnŝXhµ´´ñŜ‘eÌĥxâ=@Vïeò­ŽÖ6àŽĝaFŽn• İ$ĦŞXbEî܎EÍÏaßFÉÑ(òéX˜ĉŠÍ$„Xe˜•'Ç­Żòĉ4>%Ž™Ġİ&§,EYZiPn@Ĝx ÖÔcвĞv_k ċݘİ/Rhä(½Em‘cKEÀı,vSġǝg*N|ié¨éèî€FşÄKëŞĉF]ÇpÛâëOO–ÇPĠÑÒVÓ×Lß-;‹=Ż!%{ħï°ß˙PÔċٗZ:Y—Í1 Ѹ71Ĝíċßq4ßì0L%jyaP,PCĉypu\Ĥ‘ëïÎ-ıQâoÏÒÇHi—B-C~k~4›’×Ŝ˙Ûĝz†Ù`ŻĞ‰i2óšê!s2‘rÊYVÎ@ÛIżm†³Ö ˘š4j ˘ŒĈXÇY9Ì Ù$£V° Ġc¨[$\v –ê ™N”µTğ%9H;Xä›Ûġß3W- ^wA Ġ§S(sċô?ߪe§ĦĦŽ Ş4‚F šÂ‹ZĊ‡7“ŭqL›2+R˘-Ë­´ZŬÎŜûƒġĈ nY',Ħ‘k"–HQİ ŜÖU¸Ġ̊têô6;q‹&^ı„ĈEE"’š;hDŠ Ĝ(ŬÛ²ïǚ2Í:é{İUGqbݧ;áĊDeUÂĥ|Ò<Ö?RÚe$Ÿö  íÇו C:LŞ–­Úu‘Z D)£òö ħïsż?Lk1Ÿ/Ĥ(âuŠu-ä< íóo°ßòÀòĉÑ։ށŠ…œĞĠĠ$Ч‹oÚÇmû`O„¤¨oЍ”<óщ˜·Ĝ@îĜ[òĸ½°’6†Ži²9j¤’y|ú˜'E;²ê·­·;ÜúßçĦÍëh†™TëÑfrz›ïÜôAQL•ı\´Ò@Ċc¨­¨öߒ'×FfĴ–‚EgŠ-E™ˆÚÄvżß›`mµaeS;Ì3 şŞLç!|֚ž@ÂQŒ mĤCmğé¸{Ëŝ:™tŽž';5D~tż•òßkìqì™Ġ'Š3XRž,ʕz…ŻLUÖFK\ŻsÎûséŠ|ß³<â\:ŞĴ:dĥ‹Dĉim˜€/ÍÇsücğéù –p?2Qbš:xœĉ´²hĵ(‡eßżħ÷Ûë‹.U‘Mâg¤l½cšXÏ˙ÁĵC Ŭ›—öÚâŜ¸QO“UA<Ñ=ġ-NÀ9UÖĦ ĊĊˆ'{xĵgqĝ&²(Ôŝ3D@x”ìo~ŬÉ·aŽİ:V„ÙxËrşOŬ _˜eqRĠÇ7¤O’T?)—TwÛ˙L_“ĝVžŞCLÓ½aPÓÔHË'L7ûm;ŬE‡Ó$Ï]ĝç Ç -^#ÊĤ§•X*+^V6§Ô¤Ŝú}m}­ÎZß²Ó@ÓR¸Q-Ŝaĉ67µĴ@ík7ǧĉ™½DşÉ‘ij$Ò0Yàܛ ßĥĜò Ê*3\ÛâОѨŒQ‹K½†aÎŝŻ‡Ĉ½dÇöùÈ\ͤ˘rc*\ĠpĥVÔ/b/ÈÛí‹ĥ[5=\ ˜­EÔi>’ŝPĥĉÁvï|R2L…ĞjjiajxÁc"-ÜX³“Éû‹âÑ’e4Ô ›Î´Ò ÓÁ$WaR@17&üoëÁ:x@È|P_¤ġReԙ…,cM\Ÿİ+m_İı°6òŭ—ħ'n-Û •Ĝlòċrݤ’mO €ÔÜ Û½Ĵo避qM šx™ŻÊÄ3OûAşísĉŒ3ÉĤ– ÌÉkÒÖÒêhŬ%(Àc †ÄóÏâë(aĴĠ C(iGWZf=Ĝ’N½÷?\%'àW‚ïLòÔĊğI Q˘G+.’à \óÖöµ°İì7ŭpÏ5Ĵ5 ë4ÉèF…[oĈ1$Ç8Ö'G`IG½ĥş~Ĝ&ž:GDŽi ż%ğ ŝSĥU àjUüǁ‚˘ÊĞċ¤kK7’G\ĦÑ·>n0ĜƒĊ=ÍEO,Ñ,§Q Ğ@ż”^ Ï| ˜M[S,IZH’ ÀùĊ°FaXİN f]kçÔöÔ>ƒoĥÒ8RŻağXŸ&7²š8’klĵžÇħı=ż,tìvĜqˆñĦ,Ìt9Ç$ßFÊkKî$`5=2Î%&d‹@Ôvö#•ÛÎ×°íġÁ :´Ħà‰cPo`M—é| #´òğ’0•Œ‘ˆD ²#†PHù}·Ç–[ߏn}1Ñòìo|Zıĥ0\½q6ŜĜÄóßl0³Ĥ|G}ñ³ŽyÀ&Éf d*N#.:$ĜùuÒ!A'cĈìŽÖÇJlq²–êŭ†8ħ°‚Ċ†–Cĉż‡+%ô2İ7r6·ß‡!~¸q–guTçĤñ”Sş“ıûwÄ´Rc::şH Yhŝ ĤT*RmjIġ¸~N;oÉTŬ:œ‚V ĦD%‡˙çl™­SEUD]À3G•PN"…Ŝ á¸S–P.{öġĈ]VÍSc*zŞZéĠ.Y [ĞLçN÷#RÜŭ½LI”9&xèT}Zċ·µĥ[z;Êrú‰Ŭ*ij`T[@}ŞomÇl6WG Ñ˘˜K`šREeÛ¸6žŭñ›’ÑtŜEµyaf ÌVŠY7ky–Çĥ ‹%މVCO™JÜȵÖŝ^0aËj£˘y`É*İ´yLşö>ĥıço_¨Ìĉ¤§ĠïĦ)ò‹÷Ûż#´ž:#‚ÁŸùUldİİÒè}·#éŽ O—Lë/‰VBñ<’nv;’ĥ?ñ…4ġ™¨5]TÒħùâ­ [”ï~÷Âú§Ĥš˘G¤0DG–7œ;ġ°Ċ¨·ĥ'*ô°6oMC%ès &ˆí§‘tŝ›ß×˙ó€tċ˜>ŝY'}½ ……†ĉŬï*‘Ç­ìĴĥìżé†rxr*q4ÑÀÒĊŜ˙í {Œ7Çħw~èücW<-UpĤ$ùgg•—˙Öö8³j*ws˜žiîjE]ğ•^Ŝ¸ĦÖe²Ñê,ş´ÛV•'OıÛkàFe*XSħ×ÂûQyCìÏG|ëŬUzù!Ì&M U6„¸ĥ›E€Â†ĴôîÒËàRÇbŽG°½÷fÚßLSu–RŠÀ)Ĝ‚?6•ƒ`ö7ĥá_"î\eÌ(a§”Rĉ‚a´pÀÇW³ëc„§9¨vh¤ĴĞé}VK°ı!jˆ”F5µ÷ l~¤ħÒÓ²Ô,NË HMĠŭAżÛ A mŒ†pŸÁEu}8ß~ùÓ2‡ }böߌ1„AT‰NĞ ù‰7Ô}– ˘Íf´Ĉë$Ç}݁2ús2ÈÌğ£Ú÷ùݵ°Rü .—XŬeēİOëŽy%mĵµÂVhĉfiı I?ç|wM“VWS”Ĉ¤ïÎäq|tÙŜ_KQÑ5D„X:]ŭw·ċ9›Ä45y€iİjŬ6Ġr;›ú‹ñêq ĝc‘Ġ…frˆ‹ÜĥÄú sûžfŒ4r+9èûëƒ+ÓĉhVé‰vı Ò(×n@$óI°JÊĥaR~E…£^ßL`BJ·¸aµŝĝSĊ—f-ĉ…]7rêM½w`‰2 •”ĊñGÍİԋ~˜k‘,4:<ùŞE³É!kƒˆˆf}'‹Î/߸ü:”‘,•,I+éŽÖħĈSxC%—œĜÄKYñü°ŝôwE8à ÉF<Ìşŭ#d`E•Xî=Px'ž!ÑÍòÙ%˜K1$€mµÎß눣-,p5\Ë!ş†ŽİJ9Ŝی~"Ĵb³{6²Mĥµ_J‘)vtyIòkĜóÇ8ħ>]”Ċ䓨èğuCíqÎSx–5qL_Ê –êÓÊxúâŸ*hĦCĠT…]ǔùo† VÀYM*L Qħù}ÁµURĝ2$ÓV%#İżT—PÇÖÄmÛ)Óµ>Wœ&ŒÈI $‰ ]ZE˙‹oċ„¤ċ¤^MOIWTáäA¨ĜZwô$œIO•f5H´Éˆ(Ô~W?ÛUfydˆc¨ŻšG$›´‚ '#rŠİ!H³8¨‹îZX´Ÿŭ˜\}°ûKày;ë•ĵtµô+,kÉ>˘ßşĥ›ûó†QAf*ħSĉÒİ>eœĞ ĥ° oÌ2Œĥ W|WC2ĈÖ1Ág-o˜m¸÷Ì"é‰mĥĦŭß^ÁŸKCċ/{a•Ġèc 1.Y}|¤ücu•ùDñ 9lÍÌ"w ƒ_qŠl’î ”–ù™‚ûc‡•RGŒÈŒùrÊ?Mñiü…–!˜P,N#¤§–âĊtĥĞ[Ĝ÷ÇPĠĊRÂ4ɚHĈúĦ’;nnmŠí=t”Ġbx~ĊAPGĦïùşœÂGn³´¤ê-ÒfÛaÇçŠûcT?“1 Ġ*KK9 ò‡–ä7ŻcöÀôµôjò]$ÊŜ7ŝ]½7Û× }DóğĈ!B¤8BÓcÚçœ!ÌR÷é-ök@<·ïġè;AÖ5DŽĊÓ¨7†€£µÚÖ?LMšĝÒŞħ2èŞD²!ä Ç˙_SïŠĠkĉ5ŒĊ˜cfn×Ä,˜È$ĥ˙rĦkâ—}!ɽ W•¤fgv%É&äŸ|pwĜ· z†@’C*¸dqb1™KámC·sïmxgOÒha‚މȲVĥ€?Ò_îq‘# Ç-ëôÇQQxÈaßOġĈĠc%ˆżò>ĜC£šĤTH[[|Ğhµw'l÷ûáf† ÑËc’;%Tî/ëöĈt‚ÚEŬÉ{ žÛŭ1<ŒJÇ ä sıß~=ŝĜĜ(ÌÚlòİÏk[oòĝ-òÖ_9ÒĴEˆ'|wÍĴj¨ħŬ……ûXwÄò@CV’I°lkóùVuğ2” À-ĴnP²Fë>ħ'J#c¤suúzbX’I™µKEXĈÍĞŭÜíô˙ĴsWP#35·`-żĤ#§Ğ’WK!Kìu;íëĊż<ŭ*ìĉŞ ,_Tvò/LÌ÷ĈÙ¤% éĦ·–NOöûbz˜CĵM×q$FĤö·ħĜŭñËèríÔ{†½ƒ`98b{˘(#!’v Ĵn×ÜŜ×û~XïHxÈIKÀvĜ úÚÛchê zB[ÎokŸ{˙LeÂ2H’>ıSĜúöß ììÁŞ‘Ĵâ÷6ÜúX½qR~[Ù…Ż¨M ÓHÁ(ĥـÜ{ñŞ!é 2Ā.ĥÔIàa&Oô R/•ÁġX~\â şH’/×ßúâ8)T,ì‡LÈMˆä\öÁ0˘Ì„`6›5‰ŝĥˆ^t+„en7f[Ÿ§ĜÖ£8T:nC¸ġ¸”ˆĦı@°ĥàîG7ġĈÌv[7-§·|<0‘² Oñ.qßOQ6RĈ÷N´ñLÊHˆĤÁˆ “ġŝxí‹#‡Sd>‡p=ĤU$™HìÂÀûŒC-29°–Uħ½£”¨lL^…   ĞċôÚ˙LsĤìaÖ`5iqÛoó나4 (Ì2#ÇWZ¤÷‡üî0y¨Ĵ€€Ó–m­EÈú‹Ó#H@ê+F֐ÀÛĜÛk˘Ò]AÂ_HEŝĜvÁI­USĠV2MsäüÀÛœÓÁ°UĞ’Ĥ*Hġíúœ[:¨€“#}µ›ôĈÁbĵAózŸżĤ),Ĝܛ<˙gĠ´Ġ,ËLïsud{ßQáYŸ†ŞP•[ۏż=‡¨Şl@fY÷ÑĤ™šiÈêlÄoú_½'ħfÏŸë² iĉŠIÏ •Ó#Ç.ÄÍû÷ÁyTY_AQS‰Ŝ Ž9F•DuóXÉ½ùÛâù6[ Ԋt‹­ĈçóĈC‘ÓËà…\›;˙\nz*Ŝ–<òšJ\èÌ$Ĝı–VWqĉŬO·W[3ST"ΝXj&g~›>‘˙°U+ûoësĴ´3Fñġ$ÒNĞ(àĉp½ĵC1ŭG¸ö#‚/ߍñkêÓv[^YY]B”ŻI˙ŽĤÌc ;÷ïÏÓÓ $šzù $²½DĊ€’ÌyµñôMg(j€ŽHÑÑT)֖Ô=oëïŠüŸ²h*gҁ"Cu2Ti°6ü…ŭŻxŝĥùc4†–8âšò#ŭA?ž,Ô ]–uÎ,SЧ’*ÇH’öıeríÎ/ıÇìjAJŻEçIrİËİĉßÓMû!ñLQ"ÎPDHH‰$ ½ÀŭMñ´~³†Kc´,ŒY}U\ÑVC ,¤,ú% 0$+p/[bëLÔ4ôħĠ,éJŬ$ dTı+ĉ°óoß׌T×ÁıžOV)ŞĊMjĊ‚ …Á&ĉúàêc5#}—t´Ï'U¸¸&ÀnwùĈ\“Œô?p\¨²ĵĵRÄRŽ şQ{aĝj¤üڇÔyÛ‰ĤĝşŸŬuêóHŠK*´…TµµX¸‹l-„+™Ë$àT$“U›7N[n °7ıĉÛl=9ï‡é•M>Q49£Ê$id\Ç äŜ÷ıíÍ­ˆŠêí’âöOUW_–ÏM3üd‘°w…wU67\îÜñż)Ġ3ÔfT‚*ƒÖx”,qäi+µĥñÛÌò–hâw™•A3d7™CòÛ{ŸmĥĊv9¨‘*ê`ËŞó VÔĞĞÓP/°“}šäl7í‡öÊZ‹2I"šŒ<НŒ€7âÀXßġ§k Ż$İ4Ġ:ú˘í!!vĜj]­c½Áç~0–Ĥ|Ú“÷kÑғr­PÈ,E”öïÎ$¨ËáÌê ,pÀj%\KQ%ԓk \ OOĥ-­ ²êŞY+j*žt•SÍWŞ$0o+(ıf ^ü™)`͜V†(ż,ó4Š–S²ŞÚì [ÓdâĥŽƒ1˘x`Ĥ‘Ò$&ğïßÍkoÈġŬóŠJ˜ä˘Ê0%‹"ĈĞ2‘”­ˆSϖÜñn>! *|E”WÑÈıħ’80c–€Œ!ä:‚ ùÚäqmöÁyÀ"’XgêċݤĈLK”)$ßí}Èı$ی–Öeôy%vg_’QÑô¤’Ê’a¨ÛËk’Nä\kb³’ÑÇ&m.mYóOğ§Ä)tUo•…­­½‰ĜĜ\a4şşú‘âñ$PVÓ²Ò:*Ibvü;Ŝ˙û_›‹b<‹ Ž—4ÌŞĞ'ŠJʉÉ4Êâa–% ¸ {˜qÜâĊš˘ĥ*ĥ­‰^W´š|²#ĉdcĤÀßaĊùÁ¨^”Ċ&ĞÍM+¸°Ô "asÍħ”›Œj>Œ:>]Ô1AûĈxÏZ1Qcєïİd+Şä tĜZĜĤxq|UžÖWÉQSM<Yk ‹q¸ĥ•bXXí°¸ô#ĝ†ž9¨İhàcTgžIˆ#љMì£}Áä1i⠟ÁT‡'ލxJ̽eİB6-rO˜ûcT¤–6ÁgEÒeÑeԊşl UB 9 à[OԕĜŸcŽsİéĦŻZÉ-jş #Ĥ‘ädwXÚö°¸có[½ğb‹û9͗4Ż¨Ë£Hhü·§UBbŒœħ½É#nGÖÂĜżetteĠġ¤™5*ÊB›­Ċ£]íÀ›’+ŽTŬBİ…~cTġ“SH°$lRYb² Ó°ì{[ £b)’8%ŜáÙb 7 zïïÛ\Ĉ™2zMsSÀĤîèYŽ˘}Hĉû,76Ċ­Ì2CĦK“cġßċıĈqÈç-̅-ŒÈĤHäbAóvÚâû ½FÓĠ~ó/4uqSÖÇN]2:îXÇ˸ÜïŠjĦvzÉÂĜé-ì=OÛoïˆh3VĞŞŞŽ!Óa´’¸* };ÜÜXèqKŽíFò=ZlÊ£%lÂĤj(é–§Žîŭˆ˘ĉäĜŝĵ`‰j*irwŞ‚˘2¨$ eıak^ĉĊy"ÊI7ôÂÚjĜ’6•˘éMLŽnÌWH.Eż¸ÇİÁÙÇòCâ£3Ë3,êëè#M8şI¤)ħ>ž–ïöÄRVeqÊòtç)'áħ-ݘ°½È6çrEĝĞRĉu”kh& ĝìQI 8;‹í§ĴĦĞĤĥd³ğ–$4..ş‘}Éĉŝ¸Ġ‚ƒš²J“­Ğ',ĥ ĵ…׿Rĝ֎ĤàÌ(ş‘$Ş“U_Ĥ˘ĈÛ(ùWm‰µñHÊ<]NW\Ż$“‹M<ä^YÜnB@7·ĥ ĤÌĤˆĊšÓÓ,´ó‚%“sÔÑ`=mĥ‹cĊ˙ħ ĥÌ­UVgŞ™)0ñĴĴZF–úmpMÇĥÀŽ1UÍ|™ċȲĊ—™ƒŻú†p<×$Ŝääí‡xĉjèÍyGB¤HdrŒÍoö;ßÔî;b9üG*ÂÊzŻhĈfüìMƒ\+_c<Ċ†QċRA,Y’,”fh÷óŻ?‘âé‘tĉÍÙiĠ¨×Ş]’%cpş›~à^ĝcáÜփ59–ašWYtFħÒ 7×l0’z Á3ħ$t*¨*êv ş­p@7=ħS›Ġ'š ŻTħÇU-(¨ċê:ÊìRV×Ò,;_òçiŸÓËC˜Ë"ċotÓj²Z÷cĥŭ­aÍsy˘ŽHfRİ <‘ÚîċݤXïm›éŠÖcâl§Ä™Dù|ġpÇ-bo}ÍŻkl2í,‘ÔHµ §Dl 3è·o5íôġÇO”Á5mE$êu²G&…‰Aıab|t&“,H+eĦÌš’VâF_8÷½ĝ#3Ïê3iÒĤiñB‘ŞħĠ`ĥżnöíƒ3ïçPBí=-?Me`…6ksaì;/;ñŠŭ5FdIM$³v7;}1I&Ĵ.ĈéĉuĞQj#%‰,r˜Û`,l&ݨİÍОIĤëÊÀŬä:@ úb•èÊÑH¤ŭ°Ee;#2ĈÒħż~çŽiÒH¤t.şw~155M43ĈòRK ‚n÷;˙-†ĜW›CĊÉj+YĤ žĦ”j/›(ï}­lXaD’S‰g˘ħİ™ÔÇÖ6|‘x†Xê‚ÄÓÑÓ;_LdFŽċĴA<Ĝ‚³ò@Óf9ËLñŸÌ5og ‚y°Ûlc)ÊèˆÊl—Ò5 K=,ò.£)d`ŬĴ6°öÄUE tIÄLRÏ6w#żbĥôË $Ż1,MŒÄ‘úĊ°KWÔÇLħdn@°{›‘èoĥOä"É SUÇ<™,SHÒÙlÇKwħ Ž–·7…Œ”ùħ§”2+Korŝ½ñQ†şħŞÂÛqİy˙i6Áu†c™ĈÚ`HĊïxuG¸…°œ>Jì_òêÊÊáU_‡ózˆT-äŠK7{ Ž6Ċ²ox~‡/Wġ|nAóVÒmèĊíÍħâ4ùn|ñ cJĊK\HÊ?;âËCáOfp#&Ârġċ_ËOŠ? Úd ÏğUĥKa=fPÊŞÛxÉ7ö6Ç!ÜFAkƒk‚qŻ‹™óJÎG”yO”ln§g²~˜(F.§ı:”úÛRVÔÑÈ^ŽF…íċ#·Ĝß­sĞKŽ‰ÇJËas½·èpšLĥÌëċfiĞ&•Éܗ'ooAíŽe’YÄÌò˘Kı˙ùŽ! ö³p8¸Ò“ÓÜ­½ _ĥY,0[ĞzÛÔä/QÊħğ#°(³ë¤Î³ °Ġ6ĦÁ11üaœHŭIjHĞùíŒä§vƒy•Tî•, —Ú×À,¤ EĊ˜"·5¨}U´Ĥ÷ħ~˜wHµ€ë"ÁİZmJžf’Û(Ûkzm!_+İRE˙ÎĜᔲaqÇë‰"§ĵĥ*omDzâPc!Ò.[³ íEQĤà˘]EĴÂĝêFz]ßs{7ß•F ŞUÙJí|5‘¤êӔD‘ŭ×ÁD¤ì–;y·ıġß|DÌQîlMĈĝאêê=ĥòÛ}ŭñ4HҌCA"NË­ŝÓĉSë·âzĜޤ1Ĉcħßòœ,k+ ‚Êrħ§0 [_ İwŠÀ2IjêÚHÔî@à{?ÏYY’´Ĵ´Q;İ;—ßÛÛ Jƒ ôĝ÷ÒĊ”°•#p6ÖmĤĞä0J½1P:²ôÔro‡Ż_À­=aONròI¤›qıA!MB5d½‰°6èqRˆċDR7P?ž…3¤†)ÙäĞÍ!Ôt,Ċċc…3ġ‚MhÎ1gËüCR처òxU-p)tŝV·×f^*¤–^­VYDÒÁ¤ì°ŝxiµ-VUs DiYž=12üĤěX€O8›3Îb"‚J:hâ%€§„)7ġnNŒ’·,E‡§8Ö:!˘E鉐j²›› Ft…Œ’NûöÚüöĈœêBHaĈ7pÑ,ĴVŜmĴo(š9Š0ñÛN²‚û˙;Q’#hʋİ"Ŝ½Ĉ92°Aş -ÍñŽWsò§”<“Ĉ5T5â•Ġ›•]†"55MĜħ=Ûß뉝Ĥ`cF!˜‘ùcœ´ˆĞ9‘˜ì-bNÊĞG(êMJe6°ebŭlĦ@‹:yP9[}ÁáĥYĉY„áZf—`~Ç|šx}òèġQ×ğÁì/ë…Ŭ)S*štWïoÜ`Ç \6ŝ‡d‘ˆşÚûېŜ–Ĉ´SĴ K&•l·ĥ(TÌÒ}ħ–u!cża‹YQáĜ´š+HAÔL¨ôË8Èj% IDÑ!yĜ[×ï÷ĈO‘ŬPšePRW+*ĴCfÔáÎTıĈWĠ”L°&›]Ô_f8y⧨”#µÖĝQUV&:^iz_ ÜħEYc¨ñuGàϚ–R< Ş˙o×ß™PÓT4Ò7ĠcÌoùöĊ\2‚4 îp_ï ħÊB÷ħÛôûìgRġíRŒèBÚ÷ú…ÍsHADFaĈË`?ÏLsZ²I)vlMñ ıL³k | àh6lÖ§Zš‡ ¨úĤÍgé@W•wÙżž!“=BħÏ Ş,Çvŝxj#•/ä:½VÀ~CŻÊ‡Rx‚ŠVdŠ96"ÍÀ'ï7˙ÉjÖêbˆħóp|żçġÀ0NYžJ…QnÇ3ÔF%1B7oŻl>ħn’7ƒĊ•tÊ/D°Ŭ°L1ÍkLK +Şöfb}E˙Ċ`Ê˘ÌvŜÚo¸Ç[²vÓŞ˙×íÇà_ÙéyŒdiäˆdqL46…*Ÿ1âà—ž1iƒ7ÌŝOU’Ħ Ĝ{}1âc5ݍ-Tèö`mƒĦñ&dX­Ÿ¨HüEsĞoĜÊOy)ÓEÏ4ñ 93EA$1›‰‘N÷ĉÄí|%Ģ̆Ìj>:­É iì °§÷˰ĵĉy^çmBĉŝğ[¤İĤž˘Ò#w‹~¸ĥàRÑĊ|UÌ­Ó(eÁ€ßËĤÎêé‰húNtÚÒÄßKŒ´˙1ŠŽ8K¸Ñe6ܓ…ĠıMF\î*Š!Ġ`¨ÁŻ·ĥĜÖ-5L UçupŞH)ÂŜàEK‘ôÂö“bÀ\Ĝ}4TdÒĥÄEĴşT¤ùñŞKÁ<’7MŜ5¨`ldqÍ,lÑH˜-í߉Î÷Slhıó¨}/c‡Ħ €È SÔE ‚×ivl/o^ĜâT†8TFÌò1µ°·ß|qf̌œFÀ³&§Û°ĥËöŜ,"€0ó9ù‡Lݐú‹Ž;–÷gQ­m¤ú‘ÖšSŞU@É{’—ï鎆˜Ù˜$df1‹XC€wC\½ò V-\̍(WĤpwħħôŜ܌KPiÍ_AL´Ï˘É$šžüÜú‹ñkl†Œ–xU7àíħ pUtÛ(ŝxÈE˘iÄO_O&Î@\[ƒÇûħ,d4Sğċġ™‰™|ßê KmkïúbĤYî‚ÊÄ[×fÙTî~>§ÓöWqÚfc÷ÏĊ×<ġz˙ˆHħżl@úâLÒ|–§¤(rꕔ§›sê6üĝĊPHŠyJ›n1?OCuLÈìĥ°RŠbv£¨¨,q"F/äSÀü÷Ä  ltŬǗԏoOLG—Ž_ĈMv ÖżùéŽ FGÏĤĈâÛqBrm=9:|Ĉ1›‚{{t C Ä\‚téú‡I!eŽÈHCr-`G×ġXĈ4ŬTŸ(×r‚!݉ üŝr,ÊĦ€ïżĦÄ FÎ뢚džV‰ġ;ÛuT@DµR€6?‰p}ıĥ:yXi‹żLùA˙× ÚĜğDÔ9ypÓ?Mc ¨€à›q°½ïßĥ_ {ü<¨eê@E˙!‰ŒĈhJ* #†,/[ìF §Ż"1$² ‹6ğíèn6çŒ.̈A â:ˆğ€,}Żq†0x~ŞŒĠÂ#(­ĥë鈪êĊ$B.š³ ¨$ZŜĜêçBÊ5 t'PÛÔpp­½´GƒÂrHNŞÌıWN§1ÉԈ[µĊùö÷ÂöÉÄӘ`’9c oÓ°p}>b>Ĝ…³Z²u\i°1§OÒÖÄ}i̽S;0m‰qŞ÷ġËÑv@òÂ"…WÎÍî ‘~Ö8ÈËLz#Ĥ›.Ğr>ĥíüĈŝİ*DÑLè½52Ó£(À×6mTÈÈò6²ûb­ƒšÔKĞH‘lĥU;ġ8—H t1‡Ŝ˙/ßħÇRVIS9—L`‘ş… >–Ä"A'“Im[!?‡bîm˘YX.vĥö¤"Ĉ%–5óYR'Êán˘Oœ}8&˙ËS3édhCpA?7ĥûc–ĤÛt&KŜOOž#‰˜$–%ê[A`´úÜaÔ4Q4²%ħ™%UóU’¨ƒ¸P7c¸·Ü∕yœ J*³a‘nñÚĈÇrHϜX|5âyçCVoNÑĞe $“óĊ­~O|g(½Ħ¤ZŞ*j#e„ÒğÚîĴ—a*ŻżĊ…ñ¤ĞÌËuê24jJ”5ın;ílIyL%=q(A(şG;[k ­ŽFkEU!Ĥ‡áÜ!(EA°íĥ“ëï錚WĴ’ĵDÒ(Œ´oÔk‹²_ӎÖÄċéµiš2¤ö:†Ĝbv§’!!’ vn¤zLiIHÂş °¤ô¸ì/ôĈzdzjN›yŽ•mAŽĤ#aÈ_Ll0rf‹F<Á„ĤÇëkíïˆV -Bf,¨/aÉßïŽm+›4‚)µXż7#d3-™QËĉĜyK%FΧè­äê¸B é"Á}ŻŽc¨@ŒÈ­¨>›NŜŸOħāp”’'[IŒmôßn1ÄÂUS 4q0ċĴ½î~ßl* ġÊĊĜ˜˘…Ô­ÌdîG{aŒ=)d6[ĝ@o—noš<ˆJÜi:Ûʳ6É}ZK3bxĦÛÛÁ=X]U)–8ÚÁÒħ#×ސR“DD€ì’=팧ŸPÑ:`° °ŜŬżL`—ML ş¸ĥĊšÀ{ßµaäĤ–Ì12rĴ˘á¸żĥçĈZìX7×<ïŜ˙n0duZÎñް.,;mêpĠ"išîĠGÚK$´Ğa^Ñ/˜…ŭżÁ½K# އÊÊoċż&û½14iO_şŽ{³$–ÓÛÔ{bTqMPĈħKnîÀêĠÚÀ0·*1ĥ8Ä v’2$ÚÂż™#zòyû`–™™’áXo¤‹oÛé‚Ò8j˘,éÔŜyäb)Ŝ8QäŽzrà qÌÌFݍ?KaôżGԞ:žµ)"ŻemÛĜq!~ŠL.‚7ĥÁĥ#ê}q£SD%$B­Ĵ~·í‰éĉI²Ϥ‡żĤ÷¨ĊK u`ÒR';XyS[ßlAѧÙKĞÛjĠîpÂäš6Vt$¨X/—}ı8Š7‰RÊJİÒÂ1Ğo¨Âj/Z DPSĴ˜ôäŝŭÏ&İ€Á ĤK\‘míĜ‘ˆŜXœH–vÌ­‚Ÿ§;úàwÌ%Òì"³ ‹ éżë‡q@Ütu%?•owkùşz{ö8á˜ÑDLĥÜFËsöĥ!Z™„%;ˆÉ>Ĉŝ˙Ï˘,ÓGÉŞQsÔħ·½û}1•芒A‘Ac¨#-ˆġŝöÁj”ì ÀƒÓa§+4ċH€šŻö˙Ŝ9•Ô˘£Ù\nħ´dĜûoƒĜÔkf";2_Ĥ+Ş.ÀžĜžDbˆGSÓÄía5 Ġ4Ġ" àŠH İ˘<’ĵĊ·żÛÑx~İgü[ äVÔŞ5Ÿ5ğßċĥ&à–d UšÓë2ħWV#[鑖ژÛ{u{ö<™‹gSUÇ\ŞšP1N‹ [šûÛażĤ-ÓdTŭ<ˆžh>ğ‹úoġߜĦa‘bˆ~¨FPÖŜà_nÛb"ĴĜ÷Üԍ˙Ĉ£Ê²Ö ĞŒ¸FS¤ë&ÖÔH½”Úŝ¸³"‚“$‡*Ëİċ‹/dy&•l­ĉĴĴ@°ħµ…8~ÙlŞË+*Êìîä0'o-÷U·`oÍùĊ––ŜGv.ÚÀ:Ŭuiµğl7Ζ…g„ĉİjäg‚jzİ”´ħìÚd)İ}ìÖcü°‡)È3J™äÑéĥĉO/Üö˙>š4éӇ‰jˆc!ùšÇ××sĥĤYáihÊ3‹{V'‘żüâ—ÖRĦݳÁ)ü)Fd¨yŜtŽPZ$Ö Ÿâħĥ’=ŭ°Ğ4Ë+áÍ*Ş1LÔîP„Pmnİ }1‡£RCB/ş,ÊIħ]·>ĝ0|ŞuĉNžĤk"q°ŭp×Ög ò|ÓE—HZIšŭ8|ìTy@cħô%@ûâáEMžç™gï šŞG1ğ'FĤp]ĥħ„w yŻmħ鵞§Ż›áš1 %|Ċ@Psۛ›qŒËĵ°Lc£ٔXXŞò?á'|TĤ/cîyĉ_—0ĤšŠ’–žš]]Vޝ‰p‹ÌJµÉïßo\ ]e:BħjŒqÙt­Êü£“Ğ·ĥ=|=VtŜ;$߇*†ùÀSo_lF<+—E_ ’"ı§˜ÈX]­°ŭq‹úˆĜ”¨Îe–ġ:QȰÔÉÓÖw·żnpuNg™TҘôħyfV ê2:ßċżô<ßß[‘ÓfrÈĈx˜Ĉ¤ġċ¸ĉÛmˆ)<Lù‚Ç Yʸ"ŭÁßĜq_äĊğ˘ğçGÑċÖe˜ÔÔ-L̰~O$ŒÌÌG îyŜ˙×Ñ~Îó)d–Oˆ†:Hܨy˜Ğ ÎûŸË×ĉ™ p´ħu:i#…1Ĉ,ämÛíġÁ’QSAB˜İäz{ís‰UZ#ğ<˘§Á…55MVZë#H Pú“ßJéħ;ß鄓TĥWO0SYŞ9­:–v*Ak@äİĥ=ÒJ} Â&`meżmż/ĥĉ>Ëó&§¨ĴĤÉşé½ıŜ÷·;qĈ&?P½'éáYu~oY[NfZé¸?1ı7ôÜĤ‘ŽèĵMQ’ċ“Ç@ÍÄ*X]%Àħğ[s½­~ÄÜiĵ/Kˆ&À“ı-żé°ĝCUû5ËeŞĞşx­ĦPGħ½³[nßݍƒAĜùû>Žq5RR%"JCPl=ĝî~ĝäQĞĤ ùœğûŜêel•Mħ~6P—żä›íè>—<ây?gԔçáQÚJEò¨uê/ĤÂÖç—ĈÔ‘àô™=URЁ˘6m:ˆ&ŜöÛp/ïNÌ|.kY"/J˘L5$(“Vċ`˘ÊX‚o˙_|]2ŻRU­V´gISĉRNÚwq·übÍTħ/NHd‰£pĤû½ÇOĞĥşƒw£ËŞriİ~ ’j^ŝ!£RìU€öĜ­×koc{ÛÙċ`ÒTżV&–aŞR• ›û\sîF=j:()£TSĝAìŻß}˙Íħ4ĞJ$…K4r-ŬƒX1¨[ñŒɒdòdzÓfCN\‹EÖHÓm$‘°Jßĵ‹XµÑE·btĦĥä^܂oĥ-ËIUô6[a¸Übe‚héYÜİ]ZƒĈ‚á{}9#˙ħä¨)¨b+@BÊNĤÓmÍÉÍù텕oKKK‡VIŜĊƒ×ßݨ êjšÊYR&•:ĵĴĤÇo~û1D§ŝ}SRKHb(šò=½EÉbb폪̳™ЉĞ܀ ›.Eĥ½¸Â:Ìí3´ĤìKh·İ·ġöıVĝ"ħġAÒAS§Hbŭĵzßs…2~Î+3òÒŞC;IċFa°‡°'ùoGÖ:ENzşL,•g2FêĦœísħ½MħS—Öı!Çk7ë˙8ôÉfÍ*+Dz4‡ZġE­ÚûÚ߯òÇuħĵĈDI)Ŝ6ˆ;k²¸½Èc·>ĜŜ‘NTy›PRğh§cŻĉ ¸ß~;àÊ —*­‰á—5ŽžĤ6 뽈ínÜâÚ˙²lŬ éċ¨*âíÒ:°&Ŝ£ ³OÙĤgAĊ y•„:²[Hìwßï~ä_û+(ÒĴQÌñ_^’F¨ĝŭp;-ö8ħÉá‰%hĤYŬŠ˜’!kv ß~û[ĥϒÖÓş,‘I6R‘úcu8ü’âĊq‡Sf]ĈĜ’Ħú’ÛŞd Ğ2éĜ{a•NA_7§o¤–B.ÜÚöµŭħÊ$kཷP8úœWe°êÀöÔ=˜°ŜŒ7Ä)‘Ν&û/6żßoo|.C,(Ż$ˆ.mbÀ[÷Ä­–Êš#3+#µ:¸&ŬÈàûvÂrCQéó”ĉǜc.×8p2Ġ ŠIĥċ÷÷ŝ˜àċ`ŸQµíŭ0û"zħ@Rnm°î1ÚÂċ…”ß᠊>‹ÌĴÛĞlôż$’•Ċ È÷<ŭœĈ (‚ŽIX×ÊÄ_-6•Áµw#Yc^˘~l›Íı<˙Ö:Žž~•5+4Ĵ<ħF5Ûߖ'ıj)1ly|’>ˆ’fµÉğ‹lvż×ɕh²c ĴçòŜÜá›PçDRA "TêoÁ77żâ¤§eU·ż•Nê~˜]›RĝÂqĉÒÉİŞ˘Ò†@ÉNdR;¤Ü\÷#ÔeÙm ˙ˆĠu4ÁY–—#ŭ…ıûĜú`ìżĊ9• ȝĊX˘̀ßA*G6äïŽĞ³ÚêÚXXÒPÂPôŠİ'm­ı>Çlgsĵ•Š+ġĈ…¤ IM,*İ#ê-˙ħ÷ġ@`P­“ŻO˙P7Ĉ”ıbúÍŭ8}PÔ˙cıƒ …œÔP˜DË#Ó¤ío\F´ÚZĉHn­‰T2 èÒ°!•—äôçż÷ÄldŽ`f^9R ŝŸç †-ĠUӅÂyt›Ü÷û—˘Q´­t‚=ğàw™Á‘/ñ(k˙[üĵă酢HEJ3 ż"ŭħĜ›BèSżmĝÇ/nAVßkñù: ò(ği[ SQrQ*@Ĉ^%nûà`dôGÓLuğ ôÉ 7Á×˙ADÚİ[€IġĜD°;•"ĝÒË,hGLŜ€ƒ£! oL'ş5˘e$€4Žĥ9ÔÉı$ ‡§ _†µŬU<İ·—N÷Š=6ܐ,-…°¤‘€jJ oQħ8Ŝ’çÌZä^˙–:‰–)IĴ‚6l1ċó9Ôo¸Àì4ŽĦ‰Zé *ĥÚµXNq΋7H ;Ü~Ĝâ*•ÔD–7ġbIuĴ§{o½‡82 ä‰ÖP·`ĞrH!·ÇbiĠ qв7 ç3ä5àâNşl:d˙µ¸ûz`ĥ œ)ŬCÂ{,—ĵĞwbV÷·;/Ġ’ĉÜv A}GħôÀ^Ğĵ€• ·û£†Ô¤½ÁäEK×&çQż>¸ÖĞÜßí~pßèIÑ3ÏeÖĦĥöïˆÄšb‘mĞY~GßÓ`§ÌH=½1ÁkÚáE¸$q…AgHÖmïµĈ6ê +ê7Ä}GmZMĊÀµĴ:ħmÈÒ˙˜8ŞXáŒ1%uÜÚÇĥ4íĉĠbEí`x‰UHR7ï½ñڒ/ż~/„ì}ŽSw°ĉÛc  MsoşgYÓóïĥNj[Œ ƒgOQċt"öŸ|f…鑤oÁî1I7BÌ6·lueÚì¤ä_ °ĵYhѤŜöä’vĈu¤Ğ D°ş"‚#'†³F!bVڏï;4W[m~Ok™"esı ~=1²AµÏíŽu†³ĞëͰY+ÈÀXïccsˆíÔÜ˙–ü{c 2­ÒżQÎ7ŞÀÜ܀6À ÙÈ+$„("Ûmħ:ĤìDÜ 06â…Ö@@s|p\oÈ=°0²Zyc@FZàŜÄĜ|tŬ€u[†µˆ8„ÔüĦA<Î3]ĜĜ>ƒ ½“kéĞke(ĜŻŽ£™Ô¤o˙ Y4Ü {“Î3Xf&Î‚ÉžBá‹[û7.AqsÀôÄLĞÔRÖeä‹âx£W˜"ì· şAd`İ$Û€†úݏûÎ:h” %È#•÷Ç*…Pš™ÌAÛÚŜĝHHNğïoaÌ€U—ck˙~qÈ,,,ul7Ĉy˜kú_ÂÍÇ;ħ*ÊFœa66XzZĜYŬħ€;•)1Ŭ—ƒƒÁĜÒËċ}VäŽ˙ž14‹†cżr68RĊ-¤'I%­{ûc·M#™ln 5íù` :™£Ù"{úĜ|FŻĝBêÊ÷<ˆí|c8ù ’¤X{c—`ékžÇÓ@öKıâہÎ%’Ukk“`°à`)&ŠT îF9ñ/˜î/m,¸:ĥ I‡MB÷°a5*Ö0ŞHàż× c”<&K.’·Ĉâœ1×é>ĥüñ 7t!݆8çhĉİ2„ĜHMÁö#2¸ržĵ]R²ßË!R-ˆHì{Û·ßbXâR&kmıĜ‰|mí…ğ³Ö ñ IœEN&ĤŽuÖÜ÷;ŽßÏ灪Ŭ!£Ħİ )ġ7µ˙ ŒğäTJ:U2K9ê\•mG~ŝûol]é&êĊÖÍĦ|š…PHŜßÏ_•ÖU¤˘JWĈ÷é* ہïĊöĊÛ*ÍŞe‹U@Nú/{~­ëĈ9y#,²Èc şoÑ`ƒe·?Sê6÷ĈÙ¤Hb}`\yXµġ~_ŸÛ é+ ƒáƒÉeİCŞÀžçםuGmSGn‡QÔXßħŭLc^IŞf‹HˆÚ MœêÜŝ\ólsPiZCYNÂ6ŝ~˙ß5g\‘éŽĦü–P[XÛnlÒH)™†‹½‚%{í·ŝÄΞJ¸ċ]2GÓ-çiĥ¸Ĝ÷ġġĈk1‚ÚImFċ‡Ħġûóˆ'œ€Y5ġIàùG;›óŽşĈ_Äx™XĤÊM…ŭ}°ôħDÌjĦ"IVÁµb@ínGöÀ­"Éİ&idK\ Ó}ğŜûq‚‰y ­ċµ–+[óôÛĴ„ä1ıĜn9 l⠖g(Ğg;i-¨9íƒĉ§J#‰ScԁqÛÖÛ`%J¤ĊŬUE´tĈÛö œÑ­İ˜èVŝ+yÖÜmcù}Òñ6°G…ÖN<é ´‡‘ħïlAU$eĦV*†“B [3ìMûí`o‚y”u !xçŒŬ0Qëı÷ıçÛLÏ&`f†[NA"û€o`/oċĈ)´ĥ­²‚(ç ;4@ù’0[òZç'a3ħeG òmµŭ­öďÏi$ܞ£éŝóÄʋNħ^GeĠú~–*Ù (T3hÌĥ*=‡?ġ…g0¨Pgp§ĥ£lG$Ħ˙äıçH&ßL:brS­;¨F0ÄİmBFÔö‹s‡4y•%3RÒfá–X͌‹lÄ ê ÚÂëŠy=HìŞšğ{˙_çŽ ÙmĜá’h@ ïġ77ܓÛ,@÷"*Ràêkiö灅K=͸·|tRñ¸bŬĝ#Ó-vĥŝ§ĥ4#b—Ò ƒıC_£bÒğq½Żúb=EĜ‹‹ŽÛtف: ğ“ÛG'MÒĜaGZۋßÔóù:z­s¤‘° J;Çݤ„X^À“lA$(ĴìÂßĥĝ-M*‚§p ùF;ŠF˘uf^âEĜ§ca¸ŝĜbèzvú à⢍ĦóĈJ›„VÒOĥ"B² Hî·6­ËĈ…šĊĊû_rpìÂ;ôɆ˙ċħ”›ŠħZ%;xĦo÷[ıï‡Ôù$—Ç#P9r 2‚t[ŽÖÛóĊ²Ÿ,†ž'‰8/끪j³ïµ5<0tuÉ&× qŒ_#²Qk˜Ç;FbŒhÚöŜŝ¸†š–ZÙDQ+#ĝWŸİÁU‰^ïĠĴ239ĥİ×>˜ĉŽıèÏá¸Fî}1²ÂÀ /VHL•2SG îKÈAaÜ02xf˘WB˜×bÁöÄRf–’²F;–fsíóÛŠI¨S1ÒĞÂА˙mÎŜ¸„ä 6eVC°eRÌÊċZ„[İmŻÉ)¨ ŬŜMLA` qˆé!–İ›áÁTm˜ï"ŭlcòÉİÄÁ5[P_ï‰HÖş£–R ì:vŝ¸+2šžE†F³} ò?ż|­2}L._ĥ/ Z)Q$ĞQaÚÌ,q³›ħ-oByĈKRĠnÒÜz˙LG3)#uÉ '貉wk,·Ŝü_J!Ôl@í鎀qk•*?·êDPFà†7°íŠş ˘Ş0=ÉÚĜڍzF}­ßÀ¨ò a³6ÇĦSxw,İËIŒèkİÔ@&éÚ>E‡cÎ%TÙĴÇĝHÇ%LƒS•&Ö¸¸Óùböž£§W†wIT%u[W{ĉ×·§³KON•TánËwu}£·}˙žċCO৚y,€h›;âIY4UĥÜÎË£xC+ÊÊHp¨Wóµ÷íŒ g4í. ğ_Ĝ.ŜŸ{ââôŻìĴğħHóm`@ßîqĦ Ùe””÷ú :l‰áŠv£‘e"ïnxżÚ ĝ7Y~.–5_§ ı${ñéĥœF‡- ’^Œ3ˆ1‘À·ù·SĝŞhî&…â[j"o•½Ï—ß 3Ĥ‚PdZĈ׿˜_¸üħŞzĜi)‚ŝ˜HÀÙ#}í}ĥ?|'Ùĉ%£şĵİòúŽ‘Ĵ€ùô Mĥŝ„`z駚2I„Ûcŭq ÌÛ¨Zöü]Ï֜lTĈ\Ħq¨ooSè0Ġú’iß}Zıb[ż<v–O<€/ΛzÛê†E^ĦÒïżë9B‰°_•‰ŭħB#x´–`ê÷éŝwN§KÊ SÈûÛġ, "­¸'żçŽ /Ĵ^×ĜèïôĊ&OR)ôĦ`ö'“ÎVK‹^Ç뉤†2ÍÓvÑÈ wth ħVÔb‘,ç}EH6Ġ鎣#ĴnN’6k}ħÂÌ:ı;ŭ1ĤdéÙA߃†I( İXmŜĝši€•ïŝ,š‡'aۜE¤¤şÊ…eµÊê#Ü_ùûá2‘µTmĝ•ŜÀoÏŒÒĦÒ6‘„Ħ˜‚zkıô;sM™uÎÒ ´†R4ûâc—ĊfѐC:¸ qÚÄoˆtÊV5lï.–ŒCQ“Ä *4h?\*¨¤Ë§‹ŻO2Ó²˙¨ĉ;ŭ…Ċŭ1×ìmĵİşû펞ި)NğˆÜùÔŸ’5ÜŻġÁR{° ‚mġ8Ġ–ÇÊu^Üñ•ı ¨XŽÜE(ÒÄö8Ż“$6$È|ÚFĥ9VI ƒĥ3N˧‘ŜĜäŬ‰Y½AÂBXê'żŻ|h£öìqĈĤ csaÎ;írFŒ*£BÜŝ˜vs²ÛúcdŽö;ñ-È7ìn68Ú굁£Ŭƒ3Ş óˆ$.ÄĈ×Ĉ 7ÙğÛÓCGzT†ÒƒYá‰7Ó"ŒJ–>—ĥ6™t {÷S‚n¤}p­…ÖŽšÖÚXX†[펀Ž#t"ì\˙?‚·|£k]7e7`Žmˆ•ş5FSÇ;_Y6€ŞuIÂü÷; ¨#?OUû‹ƒoäq3 #I°ôĜH€É²·S{6ŒéĤBJX4—üŭ?,v’ÉÖ Qƒ_qÍż‚;˜]CœOB,D𤵔ßkâZµLVĜ÷,ñ YgU'‡[Èu#ÄÖ`Ŝŝ o·ë‹/ŽĤ‰ĉd$ĦÓĤÜ=9ǟ1rÁôĵrĦÚHĥzߜGÂDˆ—Ĉà‹VSt{9ŭ&iœC4430èa$‚ċ·7†/PLCĊ'GN¸ÁfÓk›Ĝ-†×ŝĜ_xžĥTĊÖ7ßÏéͽûcѲ˙ÚU ’Hìġ(Ìv’ê§ìAû““éċ5v_j&xÑô˘1•T€ÊG$÷ĥ"¨…úĦ‰] ˜­ğ|Û ŭ>˜ĞŻá­xŠÓC§očJx6k_Yï$YL‘(RÚmGı;·1—_°kÀóI"YÄÎì7fŜßîq0Ëäe3JĤ>§•…½Fŭħ*6g@Ú(ìtŭH>ŸÏ,’…&D²!҂FµÏµíÛ<ğ@ O4M‰éĜ*›ÛûŜ"Š µI"È|ÊĴ>o[[è{bDŽ•%êĵş^ONż 9ôġÁtòŜIQ^%€Ûħ?û`PbP~‹äµ+ŞÄŒö[–Ê}7ÄÒĉ&–(EA)ÒôԕşİĤf”GR˘B@VìGİ¢iŜyW×6’·6Ŭy½Ż}ŭ}ħSŠ ’LȤ&‹(mĊ‰ÄÏM~:@Aé†7›üߎ6Yc ; H%X (úŸĤ5;by’=#HâŬĴnq?êKTˆéÖê#iĦÓ"[Ażĝ}qܒIU!"e³nĉ¸ŝß;‰!vG’` Eħ>··ĥsT•RˆV8àfş2îlGŻoĝÂKê=¤1Fڄƒpmħżé‰ŞL+Ÿ”:€ÛïŽ)ÌŭE[Eo8Üscè}w÷Áf3+m*ż•Â3ŻÊT}È#ıÂĈ^†’öM@XË}-ßm¸%4ü&Ósf[_ßbwžA5˘jšx•`’FŸÂŻëĥŬ°<ñD„ˆuu™,Ŝ›>Ĝ™–XéÜ&İUг1kŸ_ÏŠ@³3ĊIËnÖıú˙žĜj^ÒHäŠh¤ˆßZ_µñħ,r˘½Ԋ ÜêÓQu|î ³–ùĴ8ïŽ*VQTcybQ§ñ ߟSÛ|/,3tÓ@ûِmü ûzï‰àhŒ¤íçM‘ĠM­ÜàdĦzVŽPÑ<½ÚÖqöĈ–ĞĦ@&ċ\~¸wÊy'—*Ĥ§T—Şz’ì?ԐʈÑ=ċWZۏŭ½°%UXĝÁĠN˜µǧê-ŽbUĞ™¤XËo‹_Ôa7ĵ&†Ĥ5’Eyî麛‚m|MÖZz~ĵpF:z—7·Ô÷À‹–,sȂ&…¤RÜw>żÛ¨’zu !WdŬĠlA·×lĜÛĝ:žx¤žÒ‰3_X;âŝß]RĊ Ĥ@xíċ,mvġ?l eÊ!IX1Àk‘·î{c¸Vt…u/Mt•Ó.ÄÚ˙ß bYg) B}”ÛüàŠI$XŬ˘H“1%I6_ïŽ £5z€Ê8“PßĜ[ONŽÑĈ%1%Rîmsŝ[ 5“™Ù-+Y7ğ­ġïí÷Ĉ’Uè³Á,X÷×ßk˙Lu †FU`Œ¨J– ı6ä[0Y*Œ„dÊ’caÇ|Oìä,_ ¨ÍrڝjİbxÜpI\eB'bËfìx=½ż\N”}zI&£ê#ıܛnvìp$}4tߎ•߃~~—ìxĊĥ° µ£e ÔĈ)ïĉ]^dĥĞûœie–‰Ŝè\0[l/Ú·//ĴFúUb‹¨ z˙ħŠĦdYÁuÜĜ-PšŞh’šY*"ı&"[pnl½ÇĤ‘™ÙŸYKĥ”Cuúà‰uDîHß[ ‹Ÿ/éĊ˙ž2­)Ştu‘‰6+µÇkŒ'ûĝf NĥayU|ĞĝfH²•˜n=­żÓŝ1ŞĜ Žx×İ$ş—JŸâ·ġÄĞD5•ä‘£R ÎÛ iĜ*ġLlldğ‘˘Fgé;46 (¸oŭ|ĉZ‰˘pm%|Ğí|HħŠ‹Ï-m¸'aġôġÂlq^TJŻ"…é…+f#V½Íûb4¨rZ!$d* žoߟùOï*TGxËsıXïm½ħ“ċĴÑħr¨£g×k‘ǰÁe8½‹ËÈ×jtGŽċt‹ù;_ûc¸” ­Ë• äŽwÛB< ‡•˜Ĝ ²êô ŭo‚)ÄK* Eħ鲞§Żŭá§dû€y!£„żž#z˜:u4“ÂĈŝS½ĵÂÖ_ltjJr(Sŝİܐܛú ˙›á¤t:hŬUäŒËkȜŸ`;ĤËVí êŒu2<ˆ˘&Ó¤1<˙_\@r²ò(J–Ö¤›N½Żż` ˙_\°ÒÉ3¤²HîF›9Óċ'}ŝ£ġj˜"£ŽdÒ *À³ßspOôÁیrÉÜßÓċ24Ë+TˆgRĞ,Gĝ”^Ö#ÛïÓ;À\êS.”$9"Ĉüî>—Ç!鍄…X˧M··Úĝi%„ıŜâÛ˙žĝâj’áehUS¨ŞO~ÖĉĝOd§ò1’†iÄNĤıqóXl/ÀÄmz<şƒZ0žÄÎ Ĥžì‘BP7’9uW<ß×ú_9|‰˙6°„ë˘fۗÓüñ8Ur!T;€ ³„òs?]™.ĥŝ#ĞŒ6Q5;½DT‘NŸ76ŭ-ï|q M]b¤jNǜC"D 6·mıoílŞHéb¨ŽŒKx‹Y£Ö ïo낲Ŝ”Îu6µÈ ĵócüfGKO[*¤š•Hµ‡|z=ië ,ĥÈÊ·½Ċż+˙Ĉ2Ÿ*Xµ“Ë'’7•’(BFMĊ–ĈĜ…(ŜGRÈOžĜġ#àêl½D”Ŭ…ËžEĥŜŸ7銈"zY˙ÖS`˵Îyo”ÛŻ vy]´ÈT|…#ùúa¤Ì+ja .A”}l8ôÀñLò”ê7µ›p;âċŠhrú^’h’E+ĉCı6ßê7·Ûs’ÑtċĦx2Ĥ"i´8¸Ŭvŝ°M.GSGy–dħ]Ôúƒëù`ìÛD‡H ‘vï`n>ÖÇ=ŜÑj ÊuN{IL²=ĵ’\˜Èm;÷ßcŭñ %ê¸è$ˆÎ şÛqêġíí‹káœĞ3ËşôĴù<Ö!Cx ‹íaùÏĉËeÊÚFXäž!bG·Û~mŠI4EQĊ~’É[‰jZà\Ĵ=n7ù³$݉Şrá1ğ^Nĵ„=·<‹wˆ!İ­²R‰D’ rOŭGżÛ VVUĈ%J™ÁuFżĊk’oÚöT°Êì´Á3\³1ЇUM586JNûĜ‚~˘üáG˙K³ŞIé,’6Ú÷żÓ“SMOK•ĴoNġ#Ñöm½o·ŭaYm4ÒÔ çëE`Á!(InE͇ÒçŒTy_…8žyU‘ÔAŞY /Â8?Ôâ$jÚ2İe€5ˆ!öúó‹/ˆ)òx -f4Ó½îeHӀ-ôßÁEU#1„ĞF.9Óż°:!;Y%¤ŽŒ.HW1ÉŻrÖż×~qÑkğĞÙ@%´÷ú M ²UŠn¨ŠE7,ûpTY}];†HĠËq}·í^‰g Ğm%V;¨÷܏$lëĈ Ÿ÷9ĜbJÌ˘Ş*…ëBQĈçÈt¨ú÷ÄrT2²ĞŜö½ÂÜöÁ½ÎdĦ‘dÉ{ ì Ä2Ñ(PŒ-ŭHûdUĞ#²›#ş6˘EŭùĜíe@údŽ9OgaÀôïŭvht„íDş SĉÛŒ´.jWHb~Ĝş%G‡^ğ0uıħ&ÎGİüÀôĊreÊŬ"U/qv?~ĝ#bê€?vI¤0RüÇ×OB”‘ ZDŒ@#Q$^Çk~¸'¨t˘´r>“)³oùÄġJñ²ġB!]APAô$îpvaHX”òÔÛĤ– <Ä·—îĤ ¤§Hı' `ÄY§ŽĜ’ ô—d”€yIÜñÎ7[Ġ•…Ìdz^ÂŬí‚ìy8žž wRú¸[ÙŻïĊí~×scÖ½îd~Xû}0LQ v&òè$£ J£żŜÜcMÈċ£Hԁ{›‚ŝEi`†pġQ‡Ò,U`mż–5iĤeQĊğí½ħ*™>ĤĊġ!·Sôĥ8i0ÔŜç è5drÌV°†üa€ÂÈXÀÑntìOĤ˙×|Q†6  ‚ÈG”‘ˆ–­f¤vÜ~˜j觔p³LĴĜG¤‹ Lt¨/äÓa{ÜâpDˆÂ÷żÍíöòÇÂëPK˘¨Ìo|x%˘7‘ĴQĥûvÇ%$hX‹ßÓÛÔƒYĠùUKı.ĤŜVíÛÛaDoLÑ˜‹ŜۏS4L¨ĴŜ˙'aôġÇNŒÚC5ÍÂîGÛ P µÙw–*Ĝ²I K$5 ×mïŽeЍB FĦù‡†‰b/,ċdÔFĞ}½Iŝ˜I‰Ĥ• Vúëżĉ+ħ½rï!:Y-kŬ‰ħúñ“8!™Ék˙6üŽ5E[ê½Ï+ŭqŜ¤tüEm|ıĊôï`}ğ~x&Ô+hrxÇ2À‹h Â÷Öíb?Îq“EÓtéÉtÒŻFĥööÀé‹aHġXäŸ5ŝĜˆYO7çËİ…‹-ÇkoíbOŝ½”B‚•nûŻ8–)‘I£PIä‹ö£2]m¤ÚúNÄâXW§RÊP‹MÈ8MŒ`ĤÀŽÜ u¨KE,LëÙCiġ÷Ä:ä,:cµˆÓ÷D#dy'‘†Ğ€×ÁATrŠ:gs¨ ŝïAĥ;ƒŞÓ„­÷lGp )ĠıÛOqŽâ’D½‹h<‚˜— –Žo3 öub#Šşĥ!Aż:§XúŞäFn[IħüñÈ|+—W,FTŠĊ€–@vúŜ˜ÊRë°êŜcÀ[íŽKhĉêÀGolz‰2\°UF o5Ĵntƒ~ç×óĊŞ h§!¤"0w!.ßݷ늄ԁ'Y‘µmŽö'sŽ˘6]Ĝƒ·ŻġÁ‚:9 ɓ?_Uŝœa„ylPÂÄĊ‰b5loÏÛl74‰ĦB#ÒĤäX€Ç|FD‹fF:GŻoĥKUTË3RÄÒ" @Ĵe˜A·8'÷1X•IWıe#F›Üî;íƒîĈĴb#aĵ–ŜÇW#5,ż ³[ÈÍ£U­üñ‰ ßç]o{‹îq‚X¨–Fħ³üA{âïàtˆ—P}.4\rGl`‘ğ‘(;ú7üâMAîVFb„h¸àcDc·NúıĥâĝL)éBĥ˘ÜÜqlDVÛÛñaĈ *ó1Ju äŜŝ˙LiݧŠMkï³>żÛ ÂHÑĠÛO™H;ĥ$Ž‘ËÜ9É·áµ&żâ6żü²v6p§ÔmöĝRTó£êvĤ°íÛ;y­ëŜ×BWm'HîIüïƒÒ‰Ġ˜y‹=ԟ˙”më‚è(\—œrGa‰„.¤ÒXmżĉĜwK™ċtT+OOI,ŒîHó~˜_Q6°mÑO”1ŜŜç'³ş Ħ~²²ZAS˙\LĴΆÊ.6µż–#²ÈÖEmÏ­ñ¨ĉpÂ6]íoĤ(Ÿì譛ċۓ‰xV’(ÚĈìWaŭoŽZÏbHû‹ŒrÂCs¨}°XU"ŞĈÎĈì8m|AkÈMöżc½,5°vp8qˆÁgğj܃†#Ĥm$XíÛÛNÛùc ‹X(6ô퍝JX…ôÂyÙO”ƒnĝÑfşï÷ĤĞ-ÚÛì8ċ!ı[ù‰iÀ ‘ĊÍ­Á4Şú~eµË\aVˆŝ'áĈÑbkúàQr1Ñc¤êkïĜc¤K–f6 ĜwĈ­tğ~p0F…Öû׳êm6äž1ĥ%˘&× öÄ}bNĉĜ™]´›1ÒNàŸ\i÷rÀlmŽœX ’O“€ġò‚İ`1ë‰Vakqì1ükX ¨ÇtñG$ f·~—£˘PİŞíÇ|tC€—AÚäžĜ‹¤ĉKënq!20I ġŭp˜xs#-˜›XqˆÄ1꨷ā´1*׿·ĉKÏpG—Ûĥ#Ÿ•|ƒµ˜ĝŜ½Q× íÛşGQš“˙Á:† }GßzNjިĠċyğĜÔP QγĜÇcŒ19%Lo lF’1ÉMtßûúc‚“öMAbzv`ñ1$rşµH܁É!]*¤³öĈ…MċïĈ퉯™V}ˆ¸îğ‹ôâѤÛ뎕ĦĊÁŝ#{cşŠ†›LB]L§b܃ġï†5£„³cŬ‡÷Ė'RĞÈáŠlÇÛ5ږC¤Ŝŭñ$ #¸i]Çİ킨4O,ŸÎ &h6íÓËĤUíğâ1;—H3ƒÜ—·ZÄmüE°¨=Á*EbĤ5†úGġ Q5@ ru³ŜĜT‘U™#²‚nQıożé|6Ħ˘Ì[HôZ™v[úˆ”šlu%l§•T¨ ĦĈÏ6ì<65ĦĦ­êĥ?çġÄTT²B’Ôş `ZDkŻċù^Ĝl^¨³(>›\lL:ĵgĥSNÒU4˘0!b÷kñÇßÛK)X#Ĥ24ФùÀ+ĞĜXmôöİIñ”Cmhw]"è}½ùÀħJċ*UZó3yB"ÖżÛ| Ê˘WhĊ:$6Ûŭ@/c}öġôúc˜¨çEPVö“V£o{[ù`İĤKTOQŠHu‰Š‰}=oŠCET䌛öïrA>÷]•?x§FôôߌHşßb6âĝĉ9é¤gžHĊâ^î~Ÿ|IĠ£‘™Q% ŭ°Ĝn7l™L” xġ ²ôö>·÷ż?Ïû Ċ³w‹0†D§Ĥ ‹ò–;Ÿ âŜĜİzrŽ´¨ÖVeÙğvŒFÔĞİ…JVíĈŜż× òjIĤñi>c­$îLĴXr¸ĥĜ45,…+Ò,ŝYEìĤÜÔ`÷V–œÔ>Ïí5Ԟ=ıߏÀÁsÊİpÖ°˙.qÂ;Ègê£M‘| }“%*:˜TÑ~/Nä“óĥöġۜq%bNZ˘úZ?âREÈ›vŝĝĠD²ÌÉèQE‚Éì›÷î/÷Àôë!WD‘ËkލÛ@ŜiĊ›LÓĞÔŝ#°ħ‚”·OMŭħ5qg(i šú€okNF†-5NG:z`Üp~ŸÓUZ‚Ÿ¨%ħ7]ġíĥĜĴĵħĠ`ôú ”¨B3t[í{p,7!œĠFҘ.–ħEÛ}…ĥàïí;€B(’ÑgÓeÜ )Ü˙]ħÔÔi‘'-•TµıÚÊvÂÖĕ a,/;iíkÛPŝ›aµM{ta²ˆ İnëˆib¨„Ħš–8éEµ,œíÜXž˙LAšCZ3ú余¤µÉŝXuH’G2ƒNì!İv€Óİ­¤5Éیnž…%–çÇbd2ہ·<ııŝ¸z<ÚV…ĉ`Âí ^ŝ›[ĝ7á³xİ£Ë˙ ·‘şŜU<Ĝ ñíkbÔZyCQjFÚ³­)4é]ÓB§–˙ĊsòñŽŞ ÄîÌ·Ti úĜ›w[ Œ6C‘eŒ.Ö·=öÂé²èĉdކŞ8ÜVR#úžĝM|ĜŽŞ Ìdܳ­Qi ­µŽ J24Bـ7 üslLÔÈĞÔĝĤ–ħWMˆïb;sŒ–•§vk–꽏;óżé‰iáœÇ)x~- eY4°.@íˆôVĠS£›VŻ(7Ž=ŭÏßÂc¤Z‚Ħúf66×mû÷Ü~xéëĊKG¨áy¸-Ĉö /qL²%6@KéÑı7ìv·cÇ|n/ŞI­@vg,IĜ\÷Ä5qÔĈÉ;3„`PBÜïo½°EEdÑhŒŝ%ŻİÖ=ĴEğ÷Âmz ġ a%¸oEF8È+ÔA-9WÌ—Kw?žĝ˘_‡Ğ†5G.ĉöEı°÷<œsĞYPVĥSԎY5.“ùXvیRO*Ì 4ı#ż&÷ŝQa<эpÇv?ˆŻè6ĠġÀÓTÌôі%P[M‡킒–š²5ŠXZğİa¸ú÷2D† -!E>V:µoöû`êËêṢ݂̂$x‘R'[PA'Ĝñ|KUWӍ˘’HÁêF_IPw÷Ħ‚žVgş#cÈçƒzM ž ËĤïäK³C˙k*˜Ġ4'Ž‚%§Ġ;*ÔHn46Ê;ï}ħ$/éÈÒn…—Yħ ÀħĉŬ­ˆ!­†Ghj%[5úvPô½¸ÁTB%ŠŞY!Äú‹i7û;b"­àŬR5MK£Ĵ„'I:ÁÛ{r6û+Eާ– d,z`ÊUĈßÎçĥ,SŠZ$fCugıŠ˙)ö·ùğżĊh¤Œ2@fż7ıào†Ġ`N6bŽGsbu…ïıߋóúbjlÒuòpîlÎx^ü[ŒpµiDÒEf›fC&•ı;·ü IITÔ üOFò1 İ\_Œ5‚‘C‰ĤĴe·,WÊT|ÍÏÛ×|EE<JĈšQkjWÚŝÓO­ĞFëĤ"T­ô’/Ĥ9ŞĴ K7’N¤ZÚoc¨ŭ0ĠMfµŞÁMşiŽħ¸]ŸsÛ&’´†Û{––$nËkµÍ݈M‹;½œúa•\ÔzHŠ6Y¸êş‘êı÷)½ıĊ'b9!€÷ïôÇ.ÊÄifߐŬ˜Ú¨V.Ís½·9,ŒÂüLPŽĠT&’ĊîÄóŽÀA IĞͨ*¨'³‚T_nĝڀÊ[V•î?ĥŽ™×cü˙4£¨À벖ŭñܚƒ€éSħôÀ#lĈÖ;\DÛ]­úqŽT’-r{chŻÊBsl: %G"CqĉµÀô8íâ(mcœrĞ‹[íçĥ;‡ó~Ü{á î*bÄéóħŜÀ[|F¨zV 5/ÌÊvĥ6Ğħ%Ëm`GŸòĝŒy#ÚPI?ÛÉ”ĵš”v6Ùħ¸’&×Ĵaµğâ ĊÇÏħûÛ$…SI‡ı瞂´-4ba*Ŭ0çœÌIŬ‰'€N4'ÈEġê8 °”Ò4]ĴMÚûc“6²£aï뎺ĥ›)6àñĵĤIYÙ ï¸Â¤‚NU›ż m/pˆsˆH‡\D“üFŬñÛnĵĈÂäƒÜà ÔT ”hžÒìmеħfĤñŜg–À)ŠĦójbP\ŸAíŠ {€~eƒƒ4¤ˆ³ĈĴ{‹vĈsOeĊ½"Ï?‹³ú….òÙJ1ÇsŠŬEEUDוٚÖıà‹Ş(éÖ§˜*‚¤ğXŽ‹_Ûŭ*5idžBê5t×eż 6ı˙œgOu&/’’H`YA,ŝĥ˙=…úŸ#Û $ÎahÂ|2°ÜMŻé|,šu™ġ,ZĵË~Oĥ4‡g²iŻH¤­rŒ’w<1}€÷ġúc£3IgŻıQıÄvœu5ùĴq˘#Y?Pħ­*“,™~s—RS*OJ]Îĉŭ%fzÓ:ˆcQê.N²É0n@ïŒX¤³0 nçMż#ŒŝÜnÈÁ+Ldr[ÌXò;hhI÷f*­ĥŬĴ78‘\3_}ŻüŽ4ĦISĤ?%÷ì­Žé‹ËÓPX,„q߀÷ WÊOͰtgLBÒĈĴŸÂŝĥÛ ´‘QMÊ²,ÏÖXÚà-ĴO·Ûj`Ĵ5= İj^Ĥ& a)kjïoòߖ5% ñ˘ğ*ĦÔÖžżl%û&²Ğ0Pö$ï~ĜžRו z żqc‰|IèÖԕ3×2üî ²3z(éç[ÈIş“°&Ì-µıô›8ñ;ÉAE4ˆóNş–j¨Ħ´RñÊ˙¸žÓ*ÓôôKN˙­Â Żn ŝ˜šŸĈÒAŽ*XşbĤÍżßġŒ_éU–ñÒŜ2~†Œ‚XŜÁ}NÛátĠĉŞHéd¤ĜzŠ·dÜĜúíŠìÙÎa"‰ş2şğaëÀ¸8HùµTsììĤ×v½ıġä_|8ñTWlYP²í܋iî ½ÀĜ@EEDïDħ‘ʤñoM­ı÷ÇP-DĤZˆ ĴĴĦ sùî/ŒŒÊ(dƒ2êHn̤/ú`l,= żloQœĥ;A'N¤Tjİ;MƒĴuz ˘Î"˘v+`ċ7apvàwšS—‘÷e*úܘ¨§“AFWcċ­vżÓ8'²“˘×™x˘·1ĤZyd İœ(“ü_ñ#İ^šħŬVÈŻ${Œ[’ÔeħG,Á´É½˜Ò-ǚ×<ûmô[.–}V}#ûbU`-ié¨ Žäj”Aûr0|ù^Tô­"ÉPN—B°Ûkbµ­Eĥ•Qµîwġ=°`ĤiS@,5mŭqžS˝ĵ!|èÈç˘5ĊÚçü˙5;JáP­´Ŝ×í‚*İiİéƒĵò‰îz°˙ŭğ7#ƒˆ¨Ş)îĊ×ZŞìT\!÷öĈ–ö(öş7\iÒ.à“ĝ–5’Il Éı͏oϏlDê2²H6éĞ^ŝ˙çĤ8’ħiʖƒjĜìÀŸż|EÛĦÓş`²ÓH²ŞÉT-ópXŠ™ e Ş˙Ènq1i<ĈHÛHĠÒ`cǃ§" "EÈWÍĦîOÓ%U&G,t‚•gŸXO”(ä›w8èµÊġfħ÷é‰cZ—! 8Ô·I ò@?ÏÑĝ^ş Ĵ‹= -#0[ŽĈÀŭ˜ĞKdħ|i,€(òé /°Ĉä„ÂĴ£(ĜxúâÓûħèİ⑑kèPèy·×ɔšĈd(ca¨ oéĥ1|™%ĤŠŞÄÒ*jĠÓcó_żĤ#1Ħcʰ<ïÓşÔÉ2S+M[#ĈÉPéÒepĦF‹öĠöĥŜHlóó”I;"ŞħBtëEÛíß[ß×eoMiGQĊ˙|]äË £²TĴŠF’ÚwÇŜĜçlLl9eP@äYus¤×ŬÉ y*2DÌŬÖö EÈöĥ9šĉŜ l1‘-S[Ÿ9-¸ĥÜc‚‰!`M¤ă¸ô˜ßħ/t.xŬÀµ jC{i>ŭŭ­Ž•‹:­ôĜvßúâgƒÎ:¤hÂğjöúÒS9K”-À…ùûâ›ħġ²§Ş3˜Ĝ86ıĴ9ûrRšO3ĈÁ•ĥ$sġàâZZš¨5*eŜà‹bzÌĈŞGdCBKšÖż?– •¨ "ôĊÉbċGqŽ,ĊCUÔ)ı?ç1¨Ñfc{žĜŬ@ŜÊĴÒûoŠô,Ó]Ìr£{cQrIĥĦrħßQ˘m,‹rlOÓġĈî‘ħ˘A<áXzau ˆÎ –ĜòŸBqÙëÄĊ¤ Ğb]”ŭö˙7ÇWw%CtÀÀöÄi½y“°7²Œ+A½<ħAġiĜߓÚŝĜ‘'š:cu(EŠi_ùĈçˆKtÁe 1Í÷טġF—> ^ŜĜğBgtÌ]-Ô!-¸-¸ÄĈhdPšB6ïï눅3‹¨ .ŽäbHic$“³hòÜ^Çé„ĈĴ‰şd…Ô@7yĥ$Cl o~ĝâTQ>Ĥ}ħŒñĈërYx,0€n-¨6Ž ŸŽÖz?ĉ4jaĤ’E…—J½…°…ĜïİHħĜíĈ9/ċ*ûXsé‰qOaڋ$ı‹ÔDZyÖy%@7M,Ĥü†ôöÀ†ŒN^Há)Ñ]m#ۍîwÂ7‘’êğbwŝX”L]eħ;_é넸ëAiìşd9`̨f‚iéá ¤†‘ǐó{_§l6FĊ˘j˜Ĥħ=>œ›;v#{{b£­–BĊK\ܒo‚ı¤AbŞ›¨żÊ}ħŸÚ`ş—ì³1§Ë hµm,DkMŠŻùÛĉž$…ÑšĤ=ÛI;ƒ·ĉ=ħAvÔ –ÛbǟËj/˜ìÀߌ'Âĥ+D³Tš‰‰*öËĥ&7'‚×ùù5¤+Ğr8Ĉur(bŞ=‡Ŭ*›vv˜™…öÛ_E…Ç;IbèèxH<ŞIŜŝ¸:ğ+­£eN†­0([oK‘…Ïş”ŽD\îożß|ZiĤd•%F… ܁ı?\ g%zPw`7IJjé’à{’½/Bħ žßçù|TR&£i.ÊϽĵ¤í‰Wİ_ˆ[Q;mk ´  ]'ŭÄî0ÈĊ¤HĠek(7ŝx™a+"ĈÉyY˜ïpoÎ;,—x’Ìm}[2Cħ1ÈΣÔâ‘AÇ‹{`VĊŭšX IWkm¤Úŭñ𤕽ùĜfa˘Ëħıµñ ĊRč†Û`ÉĦ¨6cÔ*FĝâDŽ4QĉfĤôÇÂÚ÷#Ö÷Ĉ•vS(r;ÈԕjÎ[@PÜíŒ lI€‹[ÓôĦİŠpHìÛȤ "“qŝâo| hát;žÂàÎ1únß~ĝâjGQt…Ĝ²òq³젍A|ÛöhD“Nžıb# ¨7'›öĊ›(Ô.v8ç¤ \0mÁÄĦQLײmġÄħ.ĞopwßéˆÒ`²´eF†:–ĝċċÒ@Oá;ߢÀ`7&Ĝ…ÙL# m;nN#ZĤnmîpHxĉK7ñ‰Ĥĥ]\ o_|rÄKn7¸‘R0:Ċ…·ÛÛ!5_3¨Ÿ_L !œG‘tĦk€Ĉâ[I¨İ%G‹â'4˘³ ŝ‡ f#TŸˆĵY‰:}ùĊ=›ÜJIR°ħ"—(cW°7çù#ŽF° Á”Ž4^ìÛœâȎ‹3FH"ŜAÛïß*"Ô_VĤì'Ş*°7;vġĈ̌­ĦR×<œ ôà÷5ü$ñ‰Ĥ\—cħ ħÚµ0RŠ-}J7˙9Ç‰í¨·ïï‡ŭ Ż‚y]ŜF–I%yĊÎä rŝs~nÇ× &äĥ›‹8èJÑéßŭÇ21´ċ'‘Ħ싨>‡ûâI)úsŻtS{êk`­ „]ïħĥûqމ¨œŬdT67:ujĊZRX¤ò‚oüZTœvÓ,m¨ı,ƒÊY×ÀLÇ*kRyÙù˙=1;J˘ä°ò7Ĝ[ 2Ö ×>`vŝFĜ,Ċe–Q ¸k¨!”ûí…( ­— ŽzJZVu¨H™Ï˜rO7Ú:¸k *°Êê£şÜôġöĊ3.Êĉ¨•’+‡şŽ@ûÎßÛJ\×4˘§‰Ê[A ‚öŸ]ŭqÍȓ{4TĠӏüħş’˙Â˙O\]2úv’ZzıŞb‰Â”°O+‹î/żùnqEƒ3–)^mÚG7fc¸]ğžg*YÓâ4ħğ)(Ê{ŭqÏ%â%Zx.™ŭ-L $ñe1 ö û Ž×œH%i˘‚()”¨²0‰X‘k÷Äú[ÊsİjÄb.œ£{Ħ$ıۑqmżĤGWRħġ¤‚FgU]Dmı;`1ÓÑĤVMRU5=,ß:I$^f)ŒïÈäípxÀġòSVÒF•)*S-Ż$M¨Ħô²Áî}†|ÖĥŞ£İ ĈžPĥżßŒC1…£ĝ½HY‚4qÚËġíkXc'6ŜLœ›e†Ÿà]şÊÀ€µż|hA[K}ŝ¸†–ÈÁÙ£qRe_0MìY7ۍï}ĥÁÖEÇĝ‰WmK˜vµùżéÛ é ”ŒuĵfM[Pı#ûž/O^³éwˆ(U%‘T#ÓÂÀû% Êİ’RŒAèÑ˘ôß×ëÛí‚)Ûₛ‹| •Qúŭ̓49ħ.²•!†Ĥ}Žžß×ë…Ġ´1É+¤ŒUĥ?˜§ĥ'òʔĠ ‚΀Î>mż†×çnmŒıG?PÇPòµöĥÛûb"ìÄ4Ge6 oîFÜqŝ9b?€Ş6ÛMƒ}Nú°…cA%Ñüė½´e}ŝ¸Xŭ0…‹’QĴÖ_”ò/ÛbH$Ĵ€)$˜Êé ­` ÛokvöÇToÄ+TDJ0=F \‹XâiX]´ Ĥ€Â4ǵ†ßNÇÇÚş:µXİâj2Xêiq}ÍÁÚßÓTÑE,M:Ó2­*A¸àĜö˙ŒI ÒğFĠt‚ÁdRH"ŭïÛùáÇĴŬ ‡a-7*Ö:6°'ӏúÇ4Ù} ‚Iäğ] ĥĊ7½˙‡ÒŝĜWĉDİ&8ǘ•ñÀ·ıÇoY$a•'Y7,÷Ŝǒ=ïĥ(”ÑܢzW âtsf[êçqkíoĝÁ1Ġİ{4 :Ħ€b,½Ü_Ĥĵ &R£ÀÒ ǵ˙L-9|ôÎòJc˜¸ ĥ ħĠż|VR4ëéĠ:ÌÒĵĤ£Ĉl­óßH$9?Ĥ%0R$’UÏ&Oğ|ĝ(TGMLµÊHĜ³\Ü÷˙›a\2Hó8¨G ×réĥÛ ï큿RKAÌĉ>š¤@ÄÄëÒEÜûá{fİ m•F’â ÷ÛÖ#B’J–\;@`£ÎĜTŻ,ŞŞċö`ĥ-Ĝú|+^™Êma ehd… Ğ3;€ ZŜÄ0!_il@%ĴZ˙/ä?ž:˜İçˆÍÔµµĈ¸ôßakßü8C,•HôSܔŒop77˙;bsdċ´1ƒ0’Ĉ·C{Û·?áée†Ĥ3Ĉ§ËħOġôÂ(rĉ†gz”v·Ëż76żóÄĠ•P8Š-Ò,˜ñuߞ ıѤ[J˜Ö"’ŸI`İ7ñI6µˆ¸ĥÌ u†İ£küĊ,oµ­ĥ‘€ÒYjqJġ6MW]\ŽïÀâßLJġK+ĴĤқ6âĊ·ħïŜŜĜM­S´Žij*–àÔ-EË­Ëa½¸îžhÏI˜Ë"@à Ĵ}îËb:&‰cĝĤdĜìGË}ĥÓßßÎĤJĈ,4k¸ ­ċÔ}Á$àş!ÊŬú8Í*‰#>•ı ÛRúŒ-ĴìçY25ĠHş…óĥçûâ?†žbİ@żíòŻĉw߆eM!£n¤wP\[Ëo”o†—Ħ6ï#̲w7TŒ˘—$loè/ÎŬŭñ5UD²C+Ï spÂ÷_ ç×l “Ф’Ħ•‹5ÈY Ĵ9òâ:ĴÚI!3Ĉ*³vĠkqĜòG)aQwK"êċAQÒQ°@v èżı<íú[RT8‹A‘^Ö%‹XÇq˙x‰ëİGb 4gIĝŻß›žv÷Ç’tä#òíİwċĈ%™ı~AQĠN”íĥ¨•ĵϤêÒn-oÖŝĝ:Ĥ–‡ŽI'0²m[]ˆîm€§˜EQ(‰tÊÇBÛ¸77ż§ŭqÔL)é“ĤİLŸêħ}˜Íû_“żŻKIŬİä2A¨ÖÁ#ğyYM-Àx¤Ç4ÄÈ-¤3‚ıßÂ#­§V ÓFB‚è7ÜwR0ĥ•–&‰¨Ö,Ž[Ìê-míÍïùcYŜrmfĉ&u1¸éĊùwµç·ÓË:ĴÏ4ˆIcċR-¤OċlB´³Ï ¤ÈohӀ Ŝävŝ¸:ˆÉ c+şŠ’ui éqÍïèĤĝͧf 6Ĉ Hޏ#Ñ0ó$‡{zßĜÛġ˜Ì4ÄJ’’co8ĉ×6;`ŞìÎ5é¤E5@Œİ³_û{â§w) *³@Tò\séÇE6œ• Œ°KFĞú£ti,-oA˙†Ĥ0‘CġùÌC€ĵé{öÀíKJ²Ċ4I — BIğ { S@#—b;€íİvÔEıMµ7“šħĵNĉKúvT?ßÑWN[ĉéHu–XžÓùàŠY*!31R5ÔI7·ßÜûbJĊ¤w–\=š(ÎĞİP.ĵàQLI'ĵ͍Hİİ{k1‘ĤÇnôĜŸĤžœÌZ–r´ÊîVäŜ€n{œMÒi ŞbŞC‚Ñ–`ZŜ€ö˜÷ÂúşèäğˆK‡—M˃klGáû—R(rʃQÚÑC­£ek…żä ~Ö8£Ò\Ì{ġ fG çóÄ F&†"j5%”‚΋ÜCì=q%OJ%w1şş€çKXûqéöÄĦ.ĦóRĵ”*LK#X€ìşJíͰ–PÔµ§Öc`P ˜‹yĴvâĝ9sjiP³2Ü;µĈ›oµŞ˘ĦšUwšŬ2×`GöΉ›UdÎz´ñĈÈn<áŻblnxÇÓœaÑşHµ7Ìŭq5mšvXžQĉşípÀôŬÎ2TŽ˘6ž(Ġl›‰ĥĞ›m¸ÛòÛa׏2Og×I,-ôÇ5ù‡F£š[,˘ëĦ-Oħç{átK 4rOEÔtêVħŜĈö½í·ß ’JsUMÒTuˆ#6½­n7ĜÜí†Û²’mÓNŠ‘£IvpĉÁ·ä^ûŸë†ħWÓH9€Ž0›kĜóoë·7Â$u"V8Üù5qe=Ço·¨Á2e”pв‰$£(À‹“èv÷ÛPFĞ*â•E4(ĥ²żOŽöŜÛà\ıêĦŞ èËħùFğXz[ùb'mQÇ­U”ìĊ´Gmĝï‰iYݞ–c/@ĴŠÀç~7ÀíëlËħĴ´³Ní1vqüĥĥâǽĊ°Uéw1éµĠ™A­m†!ëŠúX,Z6 bH;mŝ[RG4t}vÔnŬÜroùœ=3Efi,/™Fú°ħ;A; _~ŝĜ0ÒĈÈ­’0ŻpIàÚÖßc¸·ġĈĞè¨FT1…%\üÖµì,7Lĥşž›ZĈzFROûÔZڛ–Ü}’³>­XŜdX…BԔ•òı ì Ûô#q­<ħĈ4ĥĦÏrâûó„Q=TA˜³Fà1Ó ¸ï× £bÙ@³0µíµˆäíë†Ò*2ì³à,’ħ–Ib’4’6ò[Z܏óċĠSğˆ™:ĤĤÔü‹ƒaߑ…tóPKeY]NÀ %Ïm€·'*,•–Žħ‘f´Q­¸¸·*šÈ•"Ğ™ó9 ’œ´Š FTióż­½qÔé$ô²EQA: µÉĥĉ×탪i*ŝci:‡qxĊ§è/…U´“tÈÓ³¸ êosیĜ¤›•zTjħI#HàŬŜĈÂû_û{à)$ĞzhÖx§AŞà­î¤ŽmŜŭÇĦÁԔġŠóF€HħñŒ°eµ¸<ï‰á˲ ™ƒM˘6%bÊ@î8ûàŻ‚zĥòqM:AOP‡S–ĵ‘“Ħ÷ŝ!}­ˆê+˘–Gt"ÒAóvġ۟Ĥ;İ1ĞB()şÎD@Rxıö·|M-ÔBL´ĉžqy_Ĥm Ž×7Q°Jòi½0Y$¨oǝg@Üß`ÖÛb/ßóÀmWŻ£$rĜ’½KìÛ}íħÛlóöƒ=6cVicé3ı/s}[úqĈ*Ô0İ–ş^Ħ²Kr’FĞŜàv8Ö§×ë%ÚAïŽşÄ ìvĜbMHÀ]mĜzB€j¸î1µHÀ'Uî}0QA3.ĉ—ŸlMO ˆÜ"ĈÌNĞE½?\'*41 \-ġ˙?^!½ĉY öÛöĉ˙žÉ;@äôAMAZeSIQ£[SİbÄñq·ù|1­j„vÚ&ÓnEÊĜ÷úâ*…Ĥ.ŠĴ·³·ĊŠ—2È:ôíQO>’u:–˙ĦĜw6½ö—7zşĜ’›!šµzµ-N% AŬF}7û ġŬ}pĈËG"=8éôˆÄn[³§ë‹d9öUšJrÌó1$° ŞI½ìö˙ Ésu΁fEŽ9Bȝ·qnvĈo–hRìĤUdÉgÍĦWĦç{ƒÓ ê|WkNÄnä:†°ßżıöÇŞ1SNÚ#BBé³·};ßËTç0E<‘éFIŬ—ÎÖĜj?—ÚĝˆóK?ÉìñìË(Z‰ŠúxÓüW=ûíÛß Ŭôϳ[yC …ñuÏsZJŞ’ú<Ûé²OŻ×‰Ĝ™\‹-/Ûéá'-†QĔuRë•"ż—kßë€] …HŠdblڇ'½­l;Ħ—E; dM-°Ô/cmˆżBÈ뭝·Ŝ¸ÙMĴŬhhP,zœúşP}ıï[úûâ—e5Š‹5HĴäFíùaı}qA!éĠLO# ŬĠMµ~Ûb˓ĝ­rĝüħ~ €[acüñ—$^âhÑjŸ 9tÎôîñ°%ىo¸ú ]am=˘FÄġ Nç›wżĤƒö†)êG$ÊËÒ mapGϟGYFV*ZRì÷JĜ“oQn}ñ“RôŜG |‚(có pÌ j ïü<ĈÖí‹lï-e3FZ$:tĈ²ÎĤàħĵځäíŠy˜dâ!Ġ†š+†,Ävr-qŭèxœ:Ë\ï<÷”²ív./kܐ-½ŭħ‹ŒÙI^‚kòĞ%ê$ ÎĴuĊ÷··ĥ:“ÒĵQşĞ4Ÿ,A@äĜ …Ĉ!‡Äġ°šVE{4 êB ìUX÷ŭĈ;lâ7yD5 Ÿ1ÁuX^×ç{{öÁ‘9 Ê ÁhêK ħ(Nž6Ûaq{ŝ¸¨ÏämMX´èArĴ1b’•žŭħmÍsĴŽze¨İzǎë$‘šĜî·'fïżë9Î!,cj'ž7%µĞÜĈO`oïá´ÀŜšW4Z)Ŭ‚9-Ĥ·Ôñl1—ôԉ=<„ğ é$µˆÂúj¸w•ˆi˜ĥ­`¨ßôÁTŝ&X ’küɽŭˆÚÛß5/ Ğ+Ġt1²KSE}sġ#·{`šÌĥŞ XÙÔÛoóĥ%—3v–G§FRç€ĤïĜ ßÛ §ÌŞUW•]îoħ÷Ċ'&Dİ1tÉ%4„%ĝSoÏB^hÛĴŒJ›‘ÓC`5>—ÔˆĜŒvic]P²ôğ(cÏżĝÓ¸ž€ ×èokŭ~ĝ"8™ŞM/&{[ıµıÁ‘‡–} Xi'żüqÎdSÁXZ  Q5‰#sö˙_"\ް,½ ó*8݃O1z‰Nm2HÊí lI·|&”´]`I+¨‘Ĉĝö׏ ¨ËBĴq¤²­Ñ%“}wżqly÷ˆèV1!ú2U U;ßË[E}şVʰpÇPój€7ñŒ7R߆,À/ïöÁrĦ’0†6¸Ü \ú˜ ²ßEŜ‰[Ëò<Û3¨vĦ ĴĴ0‹¸Ĥ…ßOÔ¨6Ä2Fñ·L­žä ‹}ħksz˙ ä‘ä´•1F$ZˆéıJ“#ÌìL}0 ˙i·zÙH–˘™ŞéaÌc¨œ×7Mm•ÖÊUUŻüE·Ôĥ žg$‘è‰H'JÚ×۟ùÇO`†0l9!v7Ċò³(Ššˆ—ĊCQGYyVüZ†Ž"Aké:˜ş”·bŜĝ&lŸ#ËĞ•E5I[ ni9ùi––G…ISqçĠ~7A†v<ÚHdXc$ê‚è]H¸‹ƒÜ\·pqA0òÄÏ&8ŬvRÂĀ}F H÷¸ôX2ĜŞr::Ú–žğ6š•ilà#UU‘PlĦ"_@ŝĝi56]g”䯕RIMWâİŠ‚[ĦÇHĴ†ùŻĞs°·' äóx( xL•!WM–܃{ÚÇÏIUŞj*‘ iLd!ô ÷.y¤‚ĤƒÁsOL‚…iŠI'H°}Rk ÍìşXŭïßÔ cXŜG¤ĝFüC51ê?—ñµK¤V7·™Żİ4ñ²K9Ĥyà­L›Ĥ¤\ ›p.@ú‘ëü4‹H“¤r‘Šë"ËqÏèEÎ,~£JŠ,òŠ y%ŞĴËôÁܙŠÔC#*ŽI Œl=1c†Ž É fV:ôÔsVEEVĴ5ÔRĈËpßħävħħpUÜuHĞŞġ7°$=‰³ô>˜šUGE!ŭ}ñèµä]Jşœĥ‡ZŒ§TéTž–Y$ ÛspŠ›9mtùTqÔWPÑËRÂ8ŒŬiY×B„VÂĊĝ–ıälgdĥRᤊZrúöMöôçü5µˆĠ#ŜÊN…ÔÏĤä¸ġǢxƒ-Ë(i2X`É£ĉÍRË˙"€´çJ†ˆŻĴ“¨Üj<‰3ĵ’+Ìs#–J•š8g¤’ .µTÏ3;. Mîo¸ÂQ~Ž•ei$ gÚ×ao/×TDïPéÉmmŻéRÎòúŻgù­e1œ§0ŞšŞ-:>&94ĴnwÔsÜ8=÷§ĝN1_=u¨Rĥ² 3--)ġ¤€ì7k!w·}=ĝևûNM=IŬ8ĜDÓÊ·PÄ^چ×ööĈé+³YQœ$è e€˙MnÏ ıç×ßĵtÈİVŠ9¤ĞžJštRĤ9zpnI ‹µ­ü'&S–djsZı)Ns+BÁaêj§£7:…†·$÷Šŭ°R ìÊäÍt•(Ë ¨sċ ħk öߌOšKUP›Şêħ£Y.NÖÛéĥ,ŝÉĉËMc$ŽĤÂİkë µé§F‘4j¸ eT`ók·ĤÓäı.UžċO—ÈÉoEQ€Ä$Ġ*ùş†B%Ôm—kvÄ>$Ár3Ë3Š÷İ%:‹!ÈnvĥÉç04Ï˘um)ĠĴlEıżkcÑĵ=áìż1Ŭ=²Ĉ™êéŞd3ELòyÔ8@dÔl”'RÜ[HıRSxšıòìŠ,ÄŻ‰fĤ˜2ğ|$ A¸>KŬüǎŸÖ÷ÒĦ9Yĉ?ˆ§DĦƒĞ•u"Ä{cj°Ĵì]U‡{ïµğcÓ¨ü?”ÔSÉ4”’UuċĴjı’˜¸–GuzŠħYB>}[Ül(eµ‹ŸRÑEġ¨H֞hÎòëĥ†SĈûp?YÁËLC4+8şk[\v°î0L”U}tİċGÒ? ê$öœz‰›ċٍ&am=KÍS˜ÄÊ˘‚ij"Ĥ"Xìòރ!"ä]­{{{âU<ĦŞdž1Ç$3ıHüïÎ%‡/‡0Cû‚Yĝ:ïÚ÷÷ż"HQ ~ƒ0m@ĵCsġßqġÛï‰é"W…X´ò ^Kê^×ìmcnö÷ÂöÄï`³ÒTÑKjh”‚†k²Iıl/Ûĥ NĴ 'HRC…kƒèlNÇż1g–™M=J‰$3› ğE°= uë$qSNaÀ Ĵv{_Ô÷ç¸Û¨™âí†YRr$F{˳°$ŝ[LOY SIhvX0’c n›zÛ½ĝ·#9|_ĵĦBŭ)ş–e¸°ß‚ıÜâJ‘W ğTKÏgÔ-ïmĊñ*4í$ż=t“ŠgŒ tÚê  >ĥçè0˘˜T=L†Gˆó"Ä6×Ĝvïĥİq+ĴñÌLR>Ç`6°àn}ŝ˜ŽËI:D”_ÏÙĥ½ñ3كŠOqÔEHGZDXċ>HŜ Xŭ6½÷ñ‚5R éŽĤ Ĵ{îq<&–¸u*éàœ1eJ“É'}ÏĤÔËL³DïM+ì…X’­ƒ.l4÷ÁJ‹¨­-4•%Ş"„2u4°¸kĤŠÔÉÑÔ5İ&÷żOOKa´ĠF8IA/ I܋7ßc|@ç‚6‰ÂÉ8óiO7&û ÏTÓ%àn]Iwê#Ş’Ħßİp9îלM%–^‰d‘YħUP ÇÊ=Ċ‰û‡œQİpasħ&ċµl=½GßÓT½<ú'hÒAòĈì·żĉOél4Ë£šHŬ²Ż‰_N UħôíÍ÷çÓaOK‡ê ,ÊÖÓö;íŭpluħÏJĠo˘4êİYÙż>H=¨‡ž½ßT‹¨ħPßÀ§cÏĥ/-`ŠĦ„qTÄeŒ ÈżnÛ}½=ñÄsUÄŝ˘TßÏİN÷[~÷öÁ4ŬGvŽ9bXĠ %ĜځíßòÁËM-TOPŬ6$‚Ż˙Û|JDF6D)VG‹PŝިIú’~ġÇTKiG3%e'D„)+XÈ=A6żıl YV)V£ĞHbpÁ örÛb\ÌÔTRÓɔ:IR³yİ:ÖdÓ¸½ïɸ"ö=­xêéšĊÇ͊ë#Z*´YU%.Ş‚Mğ=½ñ”Ĵ$,Żbîߟó÷Wfž4hÑĦ°-ŝĈn6äŝ–8ŽxäÊ/šúXXŞ›Aí‰jŒegpÖV5$²‘–B@ Ĵ'ŝË/™¤ÓÔJ’”!À[Ûwżl`ŒÒŬ` († 7#oóê1ÜnëİK+YŽê£}—ĥûoN™q‹L;1¤Ğü9g:âÌı]Ïŝĵßs}–:# gwD$…$ ~Ç·Ĥ&\Öxsé„êÌ Tƒt?Ä;zŝxÚSJÔñ12˜Ìò–7; òĝm§”ƒ-à ŽiĉĤi&diB“ĥçHú˙Sú`˜`ZjµfÌòf³m·żbQEñ+yžËġ;lO}ħ%TfáâÔÌ@\€66ŝ¸ŸIëK$˘hRï"Ş•ù­¨ÈwäóġÄtKEHfdš›Ĥ‹ĉŽŜ×úwˆCC›ô…‹¸"ÇúvöĊŽ™h)âY\E4Ğı n6°Ŝŝ÷ÁÙjVÒ žVš€Ç ĈÒċY^Ú}½pşaM`Êi“ŠH‘­pmcú}0‡1–iXtĦt¨–BŻßmïĈŠHRi5G$²Ŭìî,Eïŭŭ°íĥT­S6şŽĦŞX³ Ĉ˙5ñ•”B£ËhZaĉħê‹zûâJˆ’4&$* (ë·r@$ 'TÚRo! ëävïÎ@í*g-KYš£ƒCDc%ŸS-·6éïĜ_é‚N_UĴ0 ÓM=@úQÁĉÊNÖ?ñ Hd´×•Ñ‹CËĜÛòÊvŞ–‰¤`‚R¤JŒ/†Üµŭ1k8P‚:·‚! è\ÌĉŜçlA,} Ç8Ò ƒMĊ‡¨6;zaµE,Ô2Ë+׍‚²aMµX‹\_×Û Z•)şs)h¤]Q²0×âÛ}q)?I”hmE E,SŻ*FËëŭ06yJÑT½DI£P%Qlwby·¨žhjXŽ˘ĥ–Aʋúóï‚)§zùaFñImEöa÷ßQŜ­nʞĊĠ¨Êèí4²iŽ.™,ğZöôÛcí†tYdhħÔ,“uÍĜ#Ċe~öߑn}psdôı|É6‰'–GğÉ-ĜƒĜûX_“‰eR“À–1ZV’ìJžïċÜñ‹pH¸Â)µi5°LVKĦP/¤ •ż`%¨Í ĝ†EĤvĥʂ4ŭG~ŭ²Ş Ši̊ĉmEÛ0ÛÓÓQ–:TI_$!WpHö·×ß /ä‡&°ĥ9’ ĵe#B÷ğWMûüöĊrŻ0†#u•WN‡:ĵ§ëöÁqMQMôkĈĉ-÷,›9ġÂşš9fb†I%ò¨ ¸nöĥä­é„Ârt‚L­"éuŒ‡Ö¤l,yÛ ĞpSÌÈĥxˆtáÁÛzċ3Ìĉè­-D[Ë*Z08aÚçÏĝrXĦD–t¨bğĴDݵğĈ×>˜a7Y^ŠvèĒFè›Ğ0^w·kôĝŸ+™IÉÒğİ s~/·öú`šÈi訑B’2‰O‘XH·éıÄÙ}4sĴ“Ĵ˘êX,D‡ÛMŭğâ\]àjį̂Je’:‚ߊÀ’IBm·ħ<}/ÔçħÁJ(¤–ÇC²°;kÜòvÛ2ÓH—éè ìÇċ6ż›ûœUŜĤóHf,Ôé+YD„DbĤ×ü^27ŒĦ…MkTeñA5%ò²7ÌĠˆíöÂÉàĞYCò‹óÛ~×öĈ–ó4ÑZ1ċpż3ŸfíkâxĦ§ „ˆ${†ş’.;܁0J² ˜AOQ<­˜ô€ ·"íÎ÷Ätò­8OĊëBŽ÷½ƒvÛùmF•*̓³ş)TEÛUe$‹Ĵvüñ=ÏĠĤê5=Zù5ŠŜÜúXàŻ &ڞ˜ĵ‚3?”ìZŭ{°âş™ĤUH˜j™ íïm°*Á#:޵TF̲A~öżĦĈÒ72=;ĴŠ’7–Wqħ ı?ÂĴš'~T'jġ‚–Y"m†TÔ4Ž/ŝs‹$¤PÓĈóÌáG”…Qaë°I%=Tp[¨MÉfĜ§İġie™Ŭ DÚ/{‹zsÍżèâ–Cš•f˘Ñ 1ĈbħŬ½vßlJí pFd--Ô%€äžöÄŻ2É%ÙÍÉ(ŞŞ}-{Üà6Í jy<—@ş€ıö'6“ŠV7°c$ôşƒÇFĠ­Ö½öµŝñ--r<Ş)@ o0]½·ÂÚüyj QşDw³¤Û‘·µï‰hš8İĉŽo’]Ԅ7#ĜÎĝÀ”òÓ ŞĤ˘„I’]?ë'W;ü^žĜY֝˘˜2ì|˘ÂÌ={oÛ V †ÙˆiQwÓü\~ĝ­J5Ԓ$èN”`À·}ğ_ùâ’ù#“ Zî*„éè”ÙÀüûbWšaŽZÒV9¤Ìv9ŜÇúâ°ġ”I‚Ñ iPfıż°ù}m튷ŽŞ3zŞDŠ YiB ä&ú{’y<~|D­ä¨NÑqñ/Œ2Ú hİA,52· nÛż§l•xʗá¤×\Ï­˜nÊ6òŭMħóôß<,fbbg܍ĴĜâ)ŞĦÌ äX—ĝħÑŝ=û‘·“èy˜_ħÑ(ÈYħĉç$UÛ¨Pw#œC:nKŽíĜ Ĝğ\ŜÛá?‘ì'`]WSyn­ïˆ*#’œ´]Ckîƒlf3/!g@ˆÖÄ\éĜú`¸Àš8™ )bTÜ÷ŝĜÌf£/1D°ePÀž?ÍJÍ%E2Á"FÉ ‡pùĈc1#D20H–Quu;iÛŠÖ*Á>›ñÎ3‡X)LÌF×t%wP ŜŜ§\èµ—,u‹yÌf2šĴ –ĴÛPÍr -`şJî­ñ D³B˙ ›¨Ü“~wçœf3 9y)·CÜ·„[‰†˘ÚÀ p;b,×1™géħXpZŭĝĈc1+-,•–İHĥ]+Ĝ JĞ$ş›_‘MŠO3šHÉ˙&™{Y ›0[|^ü5—Ċ Éñ'ċ-lf3܍˜ĥËažÌ™ijhÀcäF•‹h°ôŠîkXjÑ]uI,\l[ê8¸h2úwxEÓSuc}ĴÌ7óûŒf3 ĵ“é[Σ9Ĥh³“ç ²“qĞ‹ß(j–(^ŠÔÓĉuÜ­ö"ÄÄoëŒĈ`ğHÙ틪İÖ¨ƒRXٙуonl~盜A^òRT³!ì–nŜž¸ÌfR2šĤIKSS%B1”•°`/Ĉ×ĕk ´!›Y"Nm½ùĈc12T%˘żQ/â+îkß9i#"àŭŽ3ލŞF£˜£È‘’Ħ]=ŭħÁfFx•ÙAó6=ĥĈc1ccŠêœÎaS;+´ÄĦò•Š5EġEż5_]&qTóV*kÒħĈħ TP *Àĥ3„ĥ *$ Í$ËÌ´ô“£*)ĠÇ7_p~‡ƒˆ+jg–²­Ï;™€ >aô f3–u˘Ä+ѨLj‚0cÉ[½½ŒÁ­5\‘ƒ2ÛşùġÇTîzşg“¨ğ^˙׌Ċ=Èd ò$ŒEˆâûÛ–t1ħV]_ûc1˜B{;zžœdÊ5ğoġ¸çµCÊtLZB{ħżÛŒ?z:ċ*DHéÚ@ò”AB/¤äsaÇä1Ċé™ 9ŬJìEŭñ˜Ì&ĤFmr×ımÉġÄjÀü£I;ìçïÛĥCûÎFs;FĦO•Mğ˙Ö3Œ Ûn-żž Z™*&Ĵk0:„x> ~ŸLf3 ĵƒwj– + o°Uôž;úà5I´a•X†n¤Ĝ\ÜĜçŒĊĝ‡IŞ BˆYu”T’ĉÖ#ż8[6iQQñ!AŜA¨‘k_amÎŜĜÌf3zhW@L¢xLeyĵʒD[B\ßqoMÏù|:£§R- -Nc,K0ߓë|f3ĵ5FÂħŽQ]ñ”îÏ] ĥ÷;‹’~˜SŒ†yŽÊ ˘ċmżĜÌfäÜSaș7‘2ĝaQfeëqċì>ÖĈCO–i? oo(ccż7÷Ĉc1#£kIPÇġ$“Q³HA×;Ç# ²Jé%z‡zHAgXık›Ċ€ï˙Ìf*,5iĜ]nXÓ;š†˘à^6ĥĦkúzŽÛ–V7ĵ4K°%nJžxä˙Ŝ3…äGû +)BQA=Së’ÖւÇIíúâ3•ÏY*xdXX[Ş·²Ĝamğ1˜ÑEvĦKa”Táèµ–K0Vġßë„ùħlÑŒ ¨cqkܓܟLf3˘”ôZÑŬ$Ğ;Êd]J|÷ ^À€E¸ïŞ&ĝ %è*Çİò ŝoaÀ8Ìf2ž–4Lµ9 %Ô)“Iˆ·—­ħĥĝ_(zfè°S!ĵ"E$çn1˜ÌT›HòĴÉ—áµ™ó´†àôöIJP³µxžp³Hm›qÈc1˜­ĊGš ÖYÊĦ•t– ‚,7°6ż8şŞ*Š“§K(ď˜\qŒĈby0TñĦUNWQM%4“<‹([Ħ$ó·‡ÓĊ$z$dÔdqŞüŽüsŒĈaG6a&ÓÀê§’šž¨ħ°a"É moL+Ğ™¤H&ÒP˙‹yI#ż3Šf‹hš,ž ùžŽxÁ1é‘ÊħUkpmmÏüâYr§ ™¤´PŬŠ:ê ĵÚŜÜc1˜×’)$\´Äï#Ó"IÔgP:š׏ÈÛQ× –‚*¨‡D‚Ĉx=Ž3Œ1ƒc šşˆŜ3N>°›éMûïôÀ1ÔÀiÙŜ’Ħœ†v–ĝÌf 5Ìq˘)òè¤ĝt҉xô1ŒŸİzwÛDÉ ­H’B:‚òHµß׌ĈòÊCqTĜ~a!†62Ċ]ZmsÁûs„”µĊê!ŒӎF!0ıâà_żôĈc1şg<ĥY*r(+…–d2Û_½ĝüğöà)<4ĥAS34ÂMJ#bŞ ñsÉ\f3uÖ,2hc‚Ĥh1Żĉ{‘Àü#F²ÌYš@tĴïsúr=1˜ÌKكw°)f‚Jfi#'Q€ık߸ĜœsI P£vŠ{,÷żÊyüçŒĈa#=Ë&dyħyž$vĈà-~~ÓC,ÓE‘´•bY akŽŝĝÌf-›$İ~ö—˘cÈ!Sßk’/éĥ$ƒÄ°eM”×Sħ5qĜ<;nÀŜ÷<[ë3‹àÌĠ•i…Ë$ô•¨Ğ$ßrY­żĥç™{äĤ ĊşÁ+ÛaaŒĈbù˘İ˙ŭéĜ%4N´Úµ‹n7ßkXßq%\·.Ÿ2èÔR‰ÏöÛkŸLf3Ñ4–˘,ÊA§B“wò¨auŽkKcşVŠš€V eMJ:6Mˆ÷ö3‡‰3y…OĊÊ´î^2°toáÜÚÜoa€óGŽ’\ët•mrnÛ¨ĉçġ˙ĵf3 0˜š Âġ'AxĠ ½É=ż– ‰Èzz(ËGŒtş1VıúïŒĈ`ĝ2ŽË-y-G+HÊÖ7°çë„ġrUG ĤÈRא\ ÓŒĈb›m+-üÓÔ¸aYc[ùAµÁ÷;ËO<ħËHÉ#^fcıÚäĜ\z ĥú1˜‡²#Ħ–°§HĠtĥĞ ôâûóéc†˘h4kĤF&×äèvçŒÚ&ŜĤ(hVĥ–W‹Èu€Kqr}í€ĤĞ–xĊCŞ.§•AÙMğúÜ_Œô‡–<§=,¸ÔMçóoaż·L0šBjİQŠ–%îlv½ħ˜Ì&ñfô”Ni)bĞĤ($”M˜€HmEñşĴ·B°ŠAĤ;‰çnŜßLf3¸/·dH†šsUOpu½ln{\^ܰ½e†HQeˆşÊĊIâÜ+ŭ;1˜ÊŬ Jޕ֧˙P\~'ĝ{íÎŜSùà”)Š8ÒŞU’#-sċĥ3ŠŠ´ZK­‹óĊËiMıĤÔ·S!ŝıç\ĉݧ9ž%²/Q@$‘¤nwïéÛŒĊĊ"b“NÏ.Î|E^3IX?M‹ùŠw<xÀĝÇ8óÇ:ßN›2Üwß·|f3„!Ñ/*í_QPċŒŒ²Ö×ġúàşYú…Kr/ïŒĈcv–„žHA#‰x!·½ħÄa,É÷ÚŒÈ){!{oˆ]ʛ&Ü1˜¤ Ù$\îqĦ)Kí{v÷Ĉc0„‡f<›´ |×°żŒÀ#N<ŒÄ›ŭpm%‘µJl„_ÊwâçŒÄËĝƒ –$B…EŜĜĈħŝf"Ğ;c1˜ÀxFéҒÛmĥ9,tŜûX1˜Ħ›ë4Ò `·UĥÂÜcKkk<œf3‘Ŭ×{¨$Yħ1&•ECÁUùoíéŒĈa<´Î*ä(…÷>ĜäÀG`=ŭħ˜Ì2N4ùl6[œuċa`-3†2#şÛ6ŒN .—&ö˜Ìfƒ:,tkj6ĝċ#m‰ÛoËŒÂ1@Èošŭ¸Û;ĞacÎ3€ ”“ŝa`(l1˜Ì!xs!$~n3Œ ?6ż|f3 ܑ@v6\n$RêĦmŜ÷3„4o¨T€yÜ{'1ı%¸żlf3 h9{ߞq)‘ġ0{ßËÓŒÀÀW’ööÄŞŜVé'HüŒf3èé“DO0@Š£ħJÌ(è"ĞXÑ%{…,ÛŒÇ4šœkäӏĝHĴÍ)&mF÷#22ĜĜXö3ŽÄfcµÀ?Ä;€ĉ×Ûmû˙–Ĉc0ü*Ŭ‘Y|·‹Üm²Ác1˜cgê×µżÏ|tä:2„Mżc1˜CL"7SM¨‚@íaíŭñĤ8 ìߌÂcdbRÎâö$\c£WY[ħߝ‡ÛŒO˙Ùvisionegg-1.2.1/VisionEgg/data/spiral.png0000755000076500000240000005435211224565530017513 0ustar astrawstaff‰PNG  IHDRx~ˆÄğgAMAŻÈ7ŠétEXtSoftwareAdobe ImageReadyqÉe<X|IDATxÚb`£`‚˙˙˙Ûñü˙˜à=T<ˆùGCj e@£hŒ¤B]ˆëĝŝâÁy¨ŭÑC (#Ħ`µĈ×˙§܇ĥîŭG[÷£`(€E£`¸êú@ÜrĦUù žÁhˆ‚Áh‚áT¨óC[ëç˙Ó܇V(£C9£`€E£`8ì¸&L ܇ĥìG‡qFÁ€€b ‚Q0D u°H+ b§.aFFĈƒ£ħ6 è h‚ĦV°ƒ†`ö˙zàüèÒËQ@o@£-ĝQ0 u¸vħÀ÷Î ŜÄ€­ú‹£ħ; h h´€ƒµPµt Ĝ`˜zó´ _8£€ €F ĝQ0Ĝ vhK=ayÔŞ_-ìŽĤ‚Q@-@£ü( …úP™08À™”mĠŠ@£` öxhĦî0à(lFWߌJ@£€Ŝ…úpš0W‹a´ ä€-àG= uĜ„)¨`W ² ú‚Ñ•7£€@£ü( eÁî-ĜFCƒj`´E?:; €-àGµ uyÄÌhk}´ h´€Ô(ÔùKFC„n´ĵrdyċÇÑàè €F ĝQ@IÁ>:a:Z‚A h´€ä´ÖF'L#xÀĥ]C? À €F ĝQ@lÁ>:a:´ úÑ5ô£€ €F ĝQ€ŻP0Ú`´E?:l3B@£½P‡M˜‚ vƒÑm͏‚Ħ h´€°‚Ŭž1ƒoÂô”„ĝZ€< ˘S*¤žƒh,ĥĉGi €F ĝ‘]¨Ë#µÖ jŒB|°Ĵ·†şVè@+$öhŻc´5?   €F ĝ‘U ëC @hfż03;´7b€†GÁhk~Ä€-à‡wëV¸9 ê Ì½a¤eîÑB´5?@Ğs@*ĵ R°Ë$ŒT5ZèĥĉG Ñ~hL°•.x Ĥ –úèĤòÂu$íÎmÍS@£hè>ò@œÄç˙÷ĦjäGCŒ*aîÄŭp  Zɍ‚ah ŭBŭ=χ7ŒÚĊ…>´™ŬÚ"fìstÂtĝUêó‰ĴÔû¸üèäë4ŠG+ntÂtd ßäƒá›ĝÑĜ: €Fm221°÷G'LGlñâ7ŭ£ħ84@"úwĊG'LGÁpY?Úü €Fċ™ÔžˆÖlÂt4CŒ|½Ħ8ù::.?ˆ@"ò3d<aĜ„éh¤ĥè‡Úäëè˘€A h‘×ÒÂ×Ŝ?:a: è+|@"â3‚}tÂtŞ ż?Zȏr@"™ÌO&0ôHƒñCh"v´D €FéŬäó£Ĥ£`Ò#1ƒ£…ü(@4Š03ĥ‰Ñ ÓQ0˜ úù£…ü( (ÂßBÚ?šPGÁ nˆì-äG>@£WöA2 (!60@î1}À€¸ôáh萎 ìš;(­À€¸–Xpr—,2xĊFï–E ó|hÚĴ× &Œ^9p €Gxĉ­ß]:l-ÔAw˜nM˜½ÄŬŻPl@AN-p­B‘•´b]À0x/ -äˆ,àĦË'@ &Xk}ôVyÔÂÜİPW˘Ŝy­@À…á~İ4ô‚ކÑB~À@¨Zx@ Ĵ #½Ğ­è  ôlÓ³ĠF·a¸AŜš-äé h¤ò#y\şfıu.0šÀC;è…ŝÇ!Ïü–|Áh!?²@N²˙K´@-‰`x(ö9Ĥƒ°W6ZÈÓ h? {)ÂV°ÊÀ¤ÂŝáL J4ߔ0Zȏ<@£ü(ÔġĦT Œ†ÍÀÄjЇC,ĝCŬ>Xzq Ħ1‡Ñ%Ż´4ZÀŬBŬİ>:ô2ZĜۚ?0ˆ B^atí@CŻ^0ğÛ£…=dUÖÂ!†ې hRÛp4 Ñh?4 öxhÁ>:ü2¸Áhá9èwA²5ó JM>Ô4ZÀŜ (me öÑ!˜Ħ0 ò½†‚AâœÑIW€-à_Ĥ³‡ê£Ħ1,ÀhAżqĤ7}¨C#Â`0Tˆ aĴá2/@L£ùoPd2ĝŻÌ6Z¸àÄ —Ĉ şĞĦ*ȍCe8HnEK.‰ €F ĝ-ĜÁgÏ3 N°T •a  qüz,ġ )è‘ ùìhe8a#0\.ô Ñ~` vmQ‚=atŒ}$P\7À úATÈbG†“-$˜0ÀnĜ0Ü@@£ctnħC3wÂhhŒ(UòƒiŒzĈü@p 0™8€a.uêgWhOŸÄ2˜ƒ€jIš‡òÙ𠨊ZɁ ĝÀĦœ¨h´€§}Á^À0şÔq@ úƒ ŭô ›;ÎÚÛ~µÈŜ#@£Àô=ğ^é>b[żŠC1áhOy"]ƒ¸éRM·›‘ •+RNŞ r;˙ò ´e@ïĦè>•†!z”@”Eŝ`ä˜V™ì2 ËÈ €âşÂĦ<á½ZĜ| °ÈB4'Q8içÀ@U0”€-àÉoµo`Ŝ§;>€úñ´ ?8ŒâOݰa…!7 '\ÈÓ}U tN ”F€v7„@£ˆôÈÎâ÷˙‡'XġŸü‹SY@ŝ@ÜÄç‡P|Ġ`˜ĊŸïÓûèÑ˙Ħù~Ha@£ˆ„V;èxaV ß‡jŝ£1Œ×ùC¤°??P2h|z€üÜ?éa@ìĤ("µ2\ZíûĦ…—ŝhÌ›Âŝŭ@-§ÀBŜžÎŝDŽ˙!Ó QD¸ë~˜êƒî¨Ú!\ĜßÄClü#¤§ëP ڐÔüĦ’fháŽP˙!Ŝj~mm&}èCw°‘² N?ŭÇ?=r@˘á×jß?ğGèŜŭAVıë@ˆÊΎ~œ?ÔZñ4ŠP#~wżG[ëC£×· :û_ †jèżÈ`y(BD^˙hk}PħĦ0Xzñtö{ŝp^.ŠÖKİìi €F3#¤k9Ԗ?Îm­‰´%?€ĞLrYá@ĝYŸN~ëˆŜı €F3àÚĜ²´`²él {ˆóéè_ŝÈWûhjP÷ h$g:ŭ!´Jf˙èĴŭ°)è²·xž^ĈPżÒ;ÙÓÉoçé]ħ h¤f´ĝт} `úóÀÉüótÎŽXĉmŻ €Fbĉ “İ÷Gğ~>‚†1ê¨ùžŽ…|ŭp›TŝztÁ ^2 @#-CÍ-Ĝ‡L\ُżÊŠ›÷ôjyÒÙ÷ÀOƒö2€b)äLçÁzĵ/è2Q¤‡iĝƒZ‹ Há/€$ĈÍÄ Q°ğ€$~a¨Û ­0÷èbşÜw Íèè7š_ÎñóÈä‚Á˜hĜ˙ŝfxB`@/p aAn€V¨8€Vĝƒ ŝ‹ƒ< é}‰ ½ yĜĊôèqĊ¨ċŽT<Œ×úp/ÜñJşï4¤ÁB>´Ğ:”–š˙8÷^†-½wTÓeu çżêéàŸùulħ €†sáž?ˆ ™ġ˙‡Ĝ6ç˙ˆK1ĉ˙šÇ9Z­T?˜2èúŸ‰´ŸN~şONJœŸĈŝA_ż~°ċ[€…ûüAÜzôBáh-ĝÎ˙Y`ŭ`™ìĤsCe>üCϓôhĊßÌK&h´pmµcˀë˙ßk I­çtËÚRAŝR ĠyhËúâHVq­à?  †½-Ä4Z¸S€2œ`*ÜĦ­‹û ôß%9’h³K¨°úO§³úĦĥ   Zúk ŭ~›şh菏XÊĦ€Á0htXf-É"§`E0@—‚ŝ?}Î^ï§ħèħBè>ŭà?×ÄháNqĜĝт}à*˙Óg—(­ĝÓíötŠ ÇJ ċ@1 ĊÂ} Ë<€É,,ûèPÌ  Ħ› ´.\€i0‘Ĉùb­z$@·¤Sž. -JĞ~ @ İ~î ħOƒ>ĵj´`/ŝÓĝÊEh!OĞBŒĤñ ô‹w ñ°zÙ4à4dVÑ ²Â}43 dxÈCa€Ĝ°ÓħİQÀR‰9àF*Ì&pu -ó ÍÒ>t9cî…4̗ %’°T?íȄ@C˘€˙OߣF „’Nè0 Ŝ#qġx>0 áK“sÛĦ•Ÿê‘Ċƒ,ĵ@ÓÒÁ!XXÒ$iÙ$M ].P%‚Üà Uh(îƒċrì÷#ìLJ·ġχé²ôdŬœ4XvöÓŻói˜䇘›é²ÓşŞ‰n+€ì…;˙ )ŜdAġqç`ŜÑ ;c]~ˆ1èJ—LgçiX`Òê`Żŭ4rŻ<Â{?ÓÔzz-Ï$h°gù£…;Ŭ/ :“üėfPP‘ú˙¸;Rŭiä'ZU^ŝC8ßËÓ0Ħ݉°<@ƒ9³ċäš1ûYĦ~ړéšéŬ²ïB…ü}ZĴñ§S+žÖ›·‡•ó*`Í\ö#ĵp·˙?xƒ‰?‚Ó£>´²Wœì§vÁùŸvGôöÓ(ÌiŬŠO4ƒìŝ;| €cf’…Û@îƒċŞÁAsĞÑ ³ß?Ó ,èÓ¨ʓ­úôÂh0v‹ÏÄÂŭ?}/tÀĉ&F˘{YûéiàîĦ2áJëü@ëÉÖûô¨L€l™fŝ-ÜċAĊ6Z°Ŝ‚žÚ…<-VdċÓ(_ ċÉVäŜĝ€>@ƒ)£äÂ} ÇÛäŠт~Pòûi–h1áJëF_> ÓzE÷|@ƒik$îù£û°,èiµĴµžÊ…µë‡`Ù@ëa䊔î%h°ŒğżI…;ÔÏëÈż£;}ⷞFñ7ŸŠîô§ûìiž´ä§aZˆ§EM, ĈAç@×!Ħ•É‚ó .èÓ/ñŠ ˆ³c1.’{€Ä‡uÀ€8ëĉÁ@Ŝkı$T6šj~A—9RóÊ@·9Rğ§Ë€z µèŠÍ4L× t >hO =Ó @ tĤèIĠxzgĝè­ĵL-ŝ#v‹ÖCğŻô˜\ŜMkù!z_’Oƒx§fKŝü`nĊ˙Ç<ßeöŠ”st?ĥ €2£ÇôŞ‘P¸ŻèáèXo<4‘ĤƒÒ@né§×¸(4¨=,WOE·Q3mî§a!I“FŜ &Zh 3ŭ@Žğïĉ…ûŭœ&èù˙‡ÖĠt9,cóñ4(„c+ŜžĈñŻOxż?­4PÀúÌÈ÷éY‹@á^?@qJïíü´nŬÇÓ*@ Ó÷ƒ­0òÒÉŭ4,$‡\ù8WŠù €Şu7"VÌıpˆĠ@°Bŭŝ˙á hvÏênn£JÜ˙§ŝĈ"j·âëiYİÓaԂ&KIñ€ˆ ĥláùÓı"²‡S1rŝ˙Èç˙S³5§ Ê%T.D×Ó¨¤ ġÜyZ÷£€˘w?Ğfêé\Ò ôÓÙ_÷˙lpŸ}<+!~*T:÷kĦIáŬxçŸ|zT$È €èY¸Û`Ĥœ? wš\#׏ì´-èݘnÖSÁ-ŝƒ5ïÑ8­§C^˘ëH@Ñshf  Š[5ƒ°p?˙ŸöŬIXÁŝ~´,§OAOĊôO·Ps•ڭxZÉ÷t(#ÖÓs4 €èUÀÔÍDï˙Óİ;ôŸ~çȩ́u…-hF vÒçA¨1nO…°§8ŬS9=ÏBċ‰?óĝ>z•½ÄH‚²m| ]Ž!€f&hlU? iW´ĜZO ĝ€”~>àIK ˆ£ Ùôvk0Ž&R!P˜ž.ŬaHiAÊ@c @á˘tÏGj’@jâp…4./îíP¤G‚ z´ljµE=üGŻKJâiì‡ŝAî˙8N@ŸJ~³‡šÙ˙Ÿ>71Áü˘Oi!O…–|?ÒĊûÁ–~˙Óöè‚ŭt(3úé5²@´öHŭçéèÇŭCĵpˆá˜÷°ħÈ˙°³ZxĈCŬ~°62¨4Lb?Hòú!’ïŜÓ)ŭÑe˘ €h:l1€­A}:ùqŝP])ŸŭtŒ“û–‹ŝ LĞŝ˙i·ak?%s&T˜x}OĦŭÔlĊËS1Îhy—‚<Ò] ĦŜ²ÈĦ™x:îú4,ŜäB@ëj>•ç<%a@…Vô| „ZwùTާ!9ÑJÏ €hĉĝá<4óŸökúiY¸ÓcĴ}ŝ˙!~¨´ċšOĊV=E½1*ôí)°›Z½ñûTŽ#Z5RêéTFÒ<­şŝµÄNŸŝ£ġù24)Ü˙ÓŝboĜı-n—ŜêŜ·ZO;(‰żŭ†ÁüÁ–Gi8DşŸNiŠĉ0h(ŽKd­Kë [´*Üi9$s˙˙ıš)İQIΧ ŭQb<~§V+žš•j˜ô>ÒÍ'th¸LĴÒkhf˙,ÜûièŜ|†ŝSçLr y} +cJ&\İÑx{OĊx ċrIZo&ä§ġ 9 áÒz§ÇL=ŭàOƒDĞĝèÈ;´!aËÓÑ”^Ċ7Ÿ{bˆÈ~°u;ÚÓ!ŭ€MÏż áz§Ç ­! Ċ1´´Hĝû˙Óo ŞŭÔ JûÉtïŝ˙H÷ħÂı r yr{“c@^ìz*†˙.W`š5Jh¨·Ŝé54CËÉÉŝ!P¸ß§ċÒħ˙ôż·v+5[’ġô,ä)\Ì0ŸRcÜû=•´ëéPÀ*Kš uPo½Ó£EËĦj¤Oƒ’&14“˙p\²ŝ?è£0üçÓı°•§ 1ĜVÓ ÉĈ#RO3ğh(·Ŝûéà/ZÍPġ˙Ô_Iġ]´ƒĴPÇWĜS²fœ’ıx2ì[OŻ … v"jnz˘Iz˘s‘&CŸ4T[ïï˙Óg–ûŝ-Ü÷˙§îĥrŭ˙{›ıRd·ê)èùٓ‘NßÓ3ŭ§Î… Ô‡§Ġ-Oöt,àiÒ` Á¸=BËċ…úƒ¸pݧ˘Ûâ˙ܑԌŻz ü˙žÖ郂ʄ’5§ı!0ŒšO2&žóÈ €ëĦ–˙ö5'öäİX¸ż§V‹~÷˙/pŸÌ!r*`’{xd†÷{ â˜=2j7Ċy=ËŞ/d & ġ7 @½Ò@­‹puyÔżèöTt'èÒj\2şDèĥƒTèM€ĥy`˜ 7h @ŝYí‘]0A/œq`€\zA,0 # ’“ŝ“żD—yāJqCĞ …èœĈ¨m @1R™íĦ™žà­oBŽ Âí Ĥ>RÁü°7 báŝ‘÷ÈC ˜ZĈ=Ô­ĝdN¤‚D€Já…Üh$òc ŭ–ĤRÊĠ^yê?dK?%ù ŬŽTÊ·´˜šûHp·5°D‰bl5žĈ~˘ċ 5ÇŬİ5ïħž Kó˙Óĉœĝ… Tžĥ‡šKË>H:˜Œá’&B)Hżŝd†%5ĉİĝqyDCÇhZĈP{§ÇşÔûƒ},ŠĞQ(=#œŸÊì°Ó(ŭ˙Óñ¨}ó),ìóI,äiĥڄÌ8™?€ċ€˙ Ë(ó.tHçiYÎPj½ÓzÉRü`ݘ¨¸Z Ÿ <µZíë˙’ëË i€ĉ•ÈHkŝ4Ĵ@(lŸ˙4şƒb€ÊRŞ-Q ĦÒzßOc?ÑjÍû{jE}>…áÔOp´Cšœ–~b{$ĥ8IŞ!§ĉOĊŠîy›VċÒT[@£­wš£§bô~îçİP°×3 Ÿĵ{kÏ[q‘hv= WÚ BŜıOĊ<2¨çÎHHT rüpl½Ód’pUŞë)°ŸÒ3nŜ˙§ñ P7ÚÓ˘WŸôuŭD­c'ħçHRoŒ)Y;[İÑrĤb<Ñ"Óşq9Ÿ–ö@̚ĥ”~˘ÚQ T[$ûh„˙”OBZÂVÀÌ'ĦÒ{˙qdpŭÊΙݧA!OJ9ŸFn¨Ç9Xò8Fjô€*ݎıOçÂ}>ŭCĞ µ&Žô¸p§°’³§˙ö ˜Vgۓ<@bkžĜBž”F†< "İóú*Xŭq_?@5"†Jżï¨p_˙Ÿ²ü˙ô½¸ŭ<´§ÄOBÜ›vÎS9ד–óI ˆ‡§Vƒhŝ0*àİ2‡@¤U@çFFĈ‡4 XPë’;Vİu”ÂÊ·ûhÂZ@†} v’b/´€‹‡† ižÛÄ  áŭ˜!%ß@~d îxB=QhX§$4|6™/H¨ŝÔh6è}\J\Sj@ ôPÍğmtîÎQkɗ˙@µ<(hıŸ'§ÇġŸĵé2aÚOïtK§ĵ=-xŠ–‘-şxƒ}i䠝i§ÂŞrÇOÏÓ²p˙OŝFİó˙İp6Cbñ$¸o> y}*U„ú4Jóù4*¨h:ç6Œ x²ËD€"&ñÓĜÓ00i1YL•ġŞTHœçéXáĊ“è/R[û˙ÀN>¨[÷YñSĤçİ”ïú‰ôİçó ŭÖÒòj0d@„Ĉàé=öŝ€JĜôôÏ*-‹\@ożA jRġ%ŭğHóóHğä¤Ö:Ĥ‚L#ON²zÁC1e8ġ<…|ñ`|•$4=“HWR€™s? ĊE´äöpˆPFĦ÷*Z_rû~ĥŜ)íŜö“a'9G²Už”žÁ}R d¨ûó˙#Ž-xODĞv‰ˆ>ĉó/8[òD„ï}*µˆġi‘öÉLǃa˜s8ĥàÁsPä˜@„2½—¤ÑrĴ5žnžOwQzĜÉáFĉRLZí ì'aɟŭêír…_0BáBž²½x*4°ò‰ ğŭ$†9­÷A˜d-> ‘4ıJ‹óLäéÁŻdÚIꊇó˙İżîú=‰-iZö&ï Ç˙„JžOfş#Ԋ'f]÷y3rVcíè‚ô?ġ70Ĥžä€˘UĞ’ O@¤ĊìúúAÎûɰ“ÔžÙû˙Ô_­A°Â@*Ĝé™qôP÷ì'5ó‘öU,Tih‘ÈYI³~ç‡qOòB €bÁ3yCÏ3.022^j“ĞT0£€Âp&gİ“ı ÄÄ ´KL8ƒ6F%1ù;Ä°ıèğ€cÂ4q¨À€sHn~? ŭ ÀsÄÏ @ıèaš¸Š/À6 ñ…¸& z/0Ŝ|’HDĝ4ħGN>f ×ù)ĝbHM ’â7PeNÊ]D‹š˜. $ĥ’İ ¨uv%ä,e#u+w?•Í%´†\ŝ?içĵƒ†šHş¤û?bŬ;Ħħü÷xZóçIID,ϕ§°…WO¤ßÏÓ²ċJáp#µZCm’u?-ò$ ½‰~“ÔĤI…D…I_RÏ1—'q¸ŝê^XAh§?‘î£Ú%ŬH…ŭ}R*%còġd _ġS8¤ĥŸ… ½ ĝ˙£ Ë'J6“5@LTkúá} ÏP½ è=@Ĉ- $¨}@ä93Ä S%à:ši É ûZ8· ÙÎh€bÌóà/à–<iW-tı£ġ[çĦ—:è@ĝΘqÀS!³Ä‘˜ċv~^Ì´Ö u9@¤´Şhhııi°Ïĵâ­wbV˙ԓİkĞÚ2ĵO`¨ĊŸÄpÉÇa&ÊĠƒ8ZòûħT>ï‰ Oŝ·§ 7:ŸHżÓrÖplÁçÓ°Œ˘tA Áĝ j>²_¨½£mŭGè}2ì›OMó˙·óö<™Â_XO`È 뉓ûX†ˆô ¸;žˆĊz+Ŭ| ĉmöÓ ´-àiz|y=…n#¸˙ €˜#‡ğW0à@5µw´Qcx&€^ö“ħr†˜ĦbvŜ&àŞ O€†‡t ­Ò8ҎP}#LÏÔ L÷ĦcȐ¤Š¤V€ġobEÔĠ3!y¨šƒ ˜Ğk Ûê›,4ñtûh¨`0 9P+ߏ$@0­‡4¨²–“ŒˆĤĊċğ=<#O0 Vë}>XÏşÁÓûÈÇâz2öœˆw˜ €˜&šè@-§AQ³ÙzĤô2ha@n ççOrN 5ZïpÙ -(pġ^Ïoâ XÌ7@^SU÷ê~4µP/ċ.€ò‘{ް‹;@•?t‚ÙMš^?b 't7bëm8jç¨PPcXaˆù™îĊ›Ïˆ˜qAZší^ŭO›³g¨q4%Ĝù$ÚEÊò+‚kj‰l½›X½Ol:À1O>&Ώ#<çıœË$ëy˜XĈŭíñ´Òċ ä£ŭ¤ÌĊP2Cƒ<ݽFJZÔ¸²ŻžÊùžÖó„ÔXî‹w3@1àH´´œ™Ĥ…_ĝ¸Ò!5£‘Òġ›O…0ĊYIà*Âóûöl…ûy,ëĜÑWÔ˙Çĵéi?4lâ‘ÌêÇĉ&4ñŭxÂ"ŸPeFJLɵ x:°Ô(àçS9ßÓz“µµàl€5Z—´_ŜCż–2­VÏÄÓÓ~1—nœ'7sâqK=‘-šx…{=Z!HlĞè=ĴpF{?cÌŬGe½ŸˆB†Ÿ„‚–”°ùTÈgû[Ŝ§boŠ,wµk˘&ĥF‡ghg?‰• 1“ĞöäVĜxÜrŸÈ!ˆ~M<ž!›ġPûчPâÑÔî‡ê÷GŻ4Ü?W|ъµ'!sÛÓŞ€'5ı€µ§B>£öÒèú!RÀlÓpZI£I*j¸—’ lR—g’²“˜CËMX/À3Ü@‚ĝ,‘ H™Ħ-~A;eBö$o€N^ÁÜŬ-xöC'AaЁÔÀvĊ`@쀅鑇Nş~À‡\'Äñ¤)ùƒŜŝĝ0Hó?­ wjŻŻÇšOˆ‰aIż| ôöhĉ§dġÌG†1q@ŽĴ€#L˘·ôħ¨m@Z2ĞMıp7@*ôĦn~-°d„Pı¤BTQ52 V¸Àì[2%zá'@ċ‚j04œÈñÙ,7şŭ§ÍCİ1е€ (àiÙ2p„ì@/ûIĴLŞĵ k¸T€IlùO ˘E~&δJŻİr1@²o´>Z@%@ċ7 µÒÄ/@Ġ‚{ĵÍŭËy@„âX ùCar2FRëFî5À6Ÿ@L4nQc+T>Ħ@£FeD·ž­w ÌÀĠò_€QÀUàciŬ@Ċó‘ÜW­@Ċ6@í€Ĉaâàħ P\-X6@Ù`=(Ôb×GĞÀh>”‰'*à?P9}”ö)r FO‹¸y@¨ĤE…„Ѩ z4k½C'Ó¨ÉCŞÏ@Úĝû*˜·Ä–?ĥ [†p‡f6@/ħĉGŞ@'lND£‡mp‚ Ŭ$ ùġ”?qaITŸ4@˄HȔè\P*o‘êfv;µ LЇg €ÇÈŻÄġ½ ù C)ÀÈ8š—š•MÇß í$ŝOĝ¸e|3$ ÏàjáCŬ`€ER¸6@Ö /€ĤçH…8rÁ+€ÔÊo@jÍ/@JGZͤvD¤ ~2 U:ç‘ tÌԘ· vŽ–QZ`Ĥ€~4@1‘],-âÑáÜ­fjší@Aĝ8c/Ž\ pŝ*ܤÖûA¤Ö|TNݞ5Çİp˙;€T8|  } QŜ€C¨œG1˙ ĈüP*Ğp6˜ı€§Çì˙è+íì7 ²Ùä˜mMckù? rxĉ"ù Hĉ UHC;°Öxb̨› îV€Š} ²H¨%_¸aY!˘@ƒ<1yK„İ”´ ? ÓüOq<P.š &hd~¤C+ŝ'XİÁCm‚•ÚŬo2Í0 A½5XÂ9L ġÙÈû¤ş’8ê–€ÇÒĊ~€'ó> !ƒ?ÀQiê‘·­ˆ²§aÚ£(­Sa(”CCj8W €˜pt‡Tëŭ?mn†:@Ħ›ä)¨İÉİ Iħëá*¸ÌĒiÑÇĊa­L$y,- H½RâW@ ĝHj. ı–°F/\È7ıa:(†g(²Ë3g) Ç ´ B›JˆháËD^8&àêò#Ċ‡Z &p@ŠhO€é\@ K/˘—pËÑ4?‘îHlÉP!o)0ŭ9 pı0{ïôlŒb¤èN쇄~é6-[ñCİËCDG·žÄDCÂàâì qú2 kĦ_€Ò ö ѰB˘1a Ë P|'´ǘÀS ²ò$gҚ”ôâ@ôï0ÀċÂ`\`1P3 Èé €F xÚı•’ŝ íz@ó>šÙ)g%1Ŝ †l ùù’:Äx}”†í~İ›ŬLĞ&`i½£ Xz:è½R U"ݟ<@Ä ħyäÇ X žÂĦá0ڀ·€ &,Ŭ`ZÄ´Ŝ4àÀ0ĝ€-—żÑ³²ŝ@FœÂ*Z‰À é(½İ€ħÑ V ÖÊO@*Ĵa5Ĵ5İ‚j@n!ß Ë€gM?<ĈĦÍfˆ/ĤYëÂöĈşŬŝ—ARÀƒÖÄÛ ‰ 4hɏ¨ V( dÙĜ&joi§f,@dÜ8 .V;”żZ@#ܰë £ P³`Ë'Áj óQç‘܃|<²~ä€PĦç6|­fBqA(IûœÏ¨V/ @ş§Y+ €˜ÈL0ƒİË3 7ıÓ""iĵù­â“ÄĠ„Üñ‡ÙÈâखw´[€VÈ;@ċ@÷ş22 Ž5@iıCOݜπzBċE¨ŭè­÷‡H­wôÛ1Ê ¤Ò8zääWRÒâzs†Áı‚†ÖÇİ–Âċ# Zhè jH§ñâjA2LIÑ÷Ä4c€P@êu"·˘ Zċ°Ĵ t}z™Ċ(_‰>mı' Ò°c‰7 U¤èŒ70àߑ Ëܸ ĝ dĥŽıŝĜ­§ĤEZJ-x:ç ÄDZ| Ma 7^úîƒ8L H½˜\ÒĊ Ù(?ʇMĥ:@ŭÀ€ŸġĦüÔµô “%‘ `ôËF`cïúXZï°4pĝ™œ S°V"¸şé´jQSx×Á*ܵ@‹ N´m w €˜p´`72PñèJó§ó́Aè&ŞÙG¸ ´"@rçCôá[ZA:r>R!˙ŞĉârX%ĉ=?ŝR+ü´ào„]ˆVH6ÀYƒĥì`ñW ­÷x /Bí 1C<¤V¤ô0¨9DmûqU:´ÌtÌ_à  €%Ž~j]HÖ2µ/ÚŬO7ÑġvyjÇ%÷g’rg$Ħ°Çr‰³<ĴÀÄvq8Z¸Ż‡üPqB÷ŸGğà[ËŸó ¸×eâëIMkDÜ;Ÿˆx$ċ~Ŝód¤ğû¤s}*ä³ûTÎûŭ´ìĠ˙§/û €vż¨dÑŭ!VÀ׏4)àí‰É  ¨~ ó° ­½Vhƒ2Y>4~`Ĝíbn~›z" ÷ŭ$fl}a(OKŞIÌù¤Ï d™@Ċò ĝÓ°œê§sö @r5n)ßOŝŭH.àImPİ€Ï'Co<‘­T}´ÂĵG*ÈùÑâ~>žÌtZ°ËʀôĜ í÷è™Gf}ŜKÁâF˘ZàDÌ÷‰ˆCyÓ?‰énŝ@ĥ”iP`§q9užž;Ì^€b˘ò˜Ü@€áv‹ó8Ĉ ë¤qxô]°ñm¨ò¸vĴÊBà’Ŭ ñêw?π8”,KúW@ĜjG–qw,+PàĞ Ĝ×ÍĈŜ Ÿ"⨀”ñp2VÏP2žLr…ÚÙ4;M—ĝÄTġ @Qğ@“1ŬGrחĈF¤v•iтżOnœ’2ŜŒ£›}Ÿˆ8ÖÇӒ[Ü…ó2VûÚ:•ÇâŽó8Ôëcñ[>)½Zzû‰ˆ?~{ĥŝ$Ĥ9˙Ñá’Ü›Oçáx@Ä8nŭ .ài1qÁ?Àĵŭ (à ı=SïI¨Lì ¤Áó† îc1CšÑĉ£µà÷CÍŻÇ1O€o’WáOfĜċS#}8DĝžŒôMI™0‡g¨’ïiX†’ à€"ĈqñtĞMH8j‡Ì ˜ĝ ü~2ĞÈÌşŸˆV<1+Zö“Û#ƒìùxZ˙çħe$ŝżĞ úñ=ıáNA뽞ŒpĦOáC~“T°ž†e? w”@Ñc"Ӟ†W?ZÀ“œ€ĝİdvŸëIPoO„›â‰lŸÇĠBÇRÈĈÑâê'£1ôŝ?žDĤ}"⎔Öí{2&W)Ésçݐ·h1<?”Ħ¤¤M€˘ÇŒùhO˘ĥùD†Ğ< ‚ó$´Èö9> 4Ž}Ë0 1g€ˆž>…á]ODĵ‘:'UOçĈ^>òÖPž™Oçe. €èQkÊÓ0ÖÒŝŝ/à)IHµ< öùcI‡ï‰ìÄ˙§^W~?.˙B{P„2q<…ClçiP˜Óz§d¸öŭêÌoQ{ıáy‚˙Ô_ĈMRe@4/´hxûiO×î"µ[mD:ġdŭ$¤/Œ1k<ġ˙ħ‡|¤f´ûÖ˘>pşOAáO¤ğôİg”ĥŜ)İ0çS!_ÙÓ @¤ċĦ> wŒ^/@Ñ|8d´€'ÔtO¤™ûÉ*¸Ob°žµï ô,ôĦzë˙cĤé˙ĜÙÊOÄĵĦÖ2Ħ1w~" Lb*dŝ˙¤/gëZ“Ğ´î ċC= xŒÊ €HqĴ<ž-àéRÀß§v-OdW˜ŸÌ¸‰'ÑÎx œŭ´˜ûĉŝ˙ĝkC¨p?OĊ¸Ş§uA0Zïò4(i½Ëŝ< xŒ4@´.P÷ŝ> ĝŭ4(à‰i-ù“ÙâğOFܞŒ!ŽóPwSŸŝ$Ì÷Ì'Pñ[¸Ÿ˙O܊'R‡È9T,~@ Úµ†iızFžÎ…;Ö<@´Žèġ#´€ßO瞤É5"Í$fÓÍ|Ù{2Zñŭ¤ y@í!&ĵ÷C û˙ĝWÉCĠÔC ubÇîñ‘X¸ż'rܝXó(*l)l°PtVR×öÓ§@¤˙j’ó"@‘4-ĴF xÒ×ħ’Ñş‘'ÂL{J3 Šç>…΂Úĝ §ĜO…t?öú$¸ÏŸ;ıi‹ÒmöÔ8ú#ž"­Ë&zŻžÁÎD뉎ĦVÀïîÚO‡ OĊDŞOÁA=…!BžĜ³ßİÖj"²²Œ§AܐZŜ'cb•Ò–óy*ċ§û4ˆ;Z}§sᎳĦ@Ld¸( >Ù$Ş'ödğD¨Áyj!ôv|f`+ Ħúp™ †ÛD!èDDML Ó#hs¨Û@§L&âğ5ĥچĝÓ 7Qì]1¸Í [X“qbäÊNk@i`C{3 TŽd„IaMçü3œˆÖ5êPkÁż§’ğêéé2†ÎˆŬ8CLKä=IEBC=ë)°>C#ö!J†a`÷ú¤L$ĥ<‰mıË“ÑŞžOFš²§0/¤yœ*“TœôĤio €h=0RÇàëéa´' G<…ñ”OAZğO˜5˙Ô[Ö˙Ç}²düòvË˙'m‡ġ{bí!sRġ<™é‰Òy ûAZXÒzeß|:îx²­~´€§Sĉ #,ìİhîy*¤} Ǜ÷˙§áĤ" öùdò4,Üߓ&T˜X?ˆ KZ.¤ĊjŠ&䈜1xĜé…á8xNB‚Ò1xrĈIbÇ቙s1ÀWa@Ó Ħq ¸Zš@ŭ0o[B ›Ö˙§áw8*Żùħù´‚ÂĠß>rÁË ġV bÌÇbW…iż€áJbx5BÌ €ú7ÌòÏF| ˆ‰0 O@  à†¤f~*ÇsòĝùžB~!´˙@D&;míĉÓbµ´µžíı\ ħ €@˙3ÑGAáŜ@(óİx(šXÒĉämZ—Yôž\%è€˘´;2ì†h¨4vhOïqµ˙ä],@ìÀ|j„‘Პ’ï°IRJ.˙§Òd­<‰ö’cß~2ŭIéâ}*ċkZĦNˑö˙éĤ%€b!×C ZhÁê_~;€]Ĵ ôv4>ĜúĊŬD"[ Ä´RA­tGn"uĊ ½Á{hИŸŒ|ENú!wĊ 5&ݵI0 Zğ4͐Éb€˘uAFë~ŭ .à÷Ó;A’ıƒNžÊfß'bm:ħkı‰=p˞F•=] v 8² w*Ġ÷˙İs0­VĦşʧwú"ÖmÄD˙ äÎÖÁĵ’‡R·9ÉN♘ĠA „şú%1]ZÈB…hèˆĦê pœƒüÚċÚHʐ´ÒÛOĉÈ^r†  …Ÿ…ŝN ÒpAġWĦ| Ñ2´“ĞDÚKkÎzԎë‰Ûĉ“iï}Zu­Iôµ„µŭIp'?l• ZS÷˙¸ù‰†C2°–ğ>™öĈSÁ˙ÔZó.O£ĝĦu˙Ÿŝ€èŜ@Q˓÷‡QàRk,‘ÒYġûdÚKÎ1ú$œÄV çiàŜùdŒgËCÓÉü˙Ô9´ê>th0ŸÒŒ OJ†)–ĦĈ޲í§Ó|Úŭ,ûhH*ŸˆÖcP´.àíq/?5ġòĥwϧQJìġ€óI,`í),Tí˙ş×Cq>Tµ 3jœz9Ÿ‚Â]˙?uĈşġq>ĤùDäµŜIò@1¸0[? ĝ˙Tt߀D&™­ y™OгÍ÷˙À£ (,(mġġS`?µ ÷|*Vv´hŸ§C\ÒğġNòA„DMÏî§ww‚†Ë“ôi&ô‡'g˜ĤžFëû˙Ä‘3oÑ? z*ìµàŝ“w%Mn˙i·ÌĠžĈñY˙Ÿŝ€äò €hŬ]ÙO{iüİäĥùşƒÜqx}Z·HĴĵˆĞ Û;˙?  @­§RĦzŝ?eıäîŠĊVaóÓ°ÌôÔ˙ĉP1²Â €híéĦZÀSk-<5ÖÇʓi79­Ċx /Rùz+(r3ŝ˙T¸h›Â|@Ê%ŬÄöRĝ)Ĵh¨U¸ëSħò£U!İO8ˆÖ;Ye@QÛóé=fôŸ6KᨵT’çY“;OÎ0Í}W`óI,(âZ-ìċiœċĦaAíá˘ÏЧ˜;U‡=ŝÓncÚ|:TàCĤġ@Ôöĵ?­&,éœPîSÑ}ï˘²Ħ`O=>•52Ôŭ˙ˆċÔX…S5Vmó)ÍÔPwRĞ0Чbž¨§aAHëÊĵ˙?ŭÙ­w€b¤ĊÌ2êI´<ä: ä@msnf¤’û@4² ıKT˜&¨ ´óOXû  ´“’”ˆ p&†ĞÊÙ½g@ƒ$;pìĉqĈHv*0P˙nPlàä`²ƒ”Žo3PoÇc)—´Ú@ĉÉ $¤ġtn7“”Ñ@Ñ£†޳ÙöTr_ü@µžŝ“żŒ´ŸD{È9Ŝu>™aùŝ˙÷İĠJĤòäċ|*ĉU~öxÖÓĦl›?”Zï @´|<ÂƒĞ(’§CâŸOf!Q?Œ ú÷TœÔç§r!4ŸÊyµŸ†aÈOçrmHŒ½=&>i½›Ġ°×œTjµÈÓ9|ÖÓİ2Ù˙ŸĵSċĦ…ÙP-èÏSy\[ŸÊ­óTΧñ4 K:”iq,5Ċe@Ñ*0âéXÀÓŞfŬOE7R£U•?Œ=‰öğ֚’³`‹Ŭ"û|j÷j˙S˙¸ÚġÔl9Ò°FóU3uxë €h ütŽš k½œûï˙'ŭp/r—ċQcI lŭù`kĠSċp2ùl˙`.0˙Sw™&Ċé“ #CŞġ@ôèÒc³Ó~2? *-ZcçĦfç˙§ŭ.Jy5hòİìNŝ˙´mùöÓĦ\Ñ ĈĠâ €i@ aj­)ÇW˜0ĉ–’ÖkŞ„(żùċ=Š”ŒĊ3·–´׀Ô[{¨/ ġà´jC™PZˆ°yÀ€X}œ(\ŻNJÉıñˆ·ndZHí^5 ö§ Ċƒ­×†C‡E è (Êè €èÒ²Â5íûAèFJN¤dèd?™vĈSĦulÏ0‚ÁÚ˙§{çÓ¸…ĞO‡0Ż Ö;U €èUÒ#B}b˘R—ġ>…nĜOï#• ¨ŭ#­ ‡†­†9îÓ"_ÒĦ`̧cıEo@ġ¨ˆ‰ô>&CÎöEĊċl”ž N÷‰-*ĤX˙^ôAâĜu<—}Ru${k$’  AĠz zVŝúlD U·p?•3/U&ġ°•Eö‘ħBžZñüáÔ˘˙Ożşù4Ìç´ûéX^  ‰˙ˆ&O54Žjnú ÖŽ8JOD¤¤ !{ŭñÊ/šĈĉš-G¤Cşġ˙OŸ3Nh2$C§1÷ó˙é³Ŝ]ŝ˙À-ĞIÜŬ1ì°§aàûS9CxOÉOJ.Ħ öÒÖ÷‚Ĉêô*LÖ˙§Ŭz|ZîïéUĝ à ÍÀD·a:uq‡ÄšÛ˙ƒä*´¤çSĦ’yO£BĤÈH›ħñê=-ÇuéÔó°§W5@…;M/ z%p{zL pbêŝ ÍëİPĵàB^ž-§óñíx:­èBŜXu€ Žŝ˙´kµóÓİp§Sù4C34­Àˆ‘Ž…üzFFĈ@ZÛÁ@ùċ¸€İ} Ôğô´á"%•/tÓ€â a^^i‡P@~~€†Aà1hŝcn”B§ €üU@Iš T¸Cí ġ  @?Òkhf€âĉ~ zĥâÏ˙§ŭuZ´ìfQ{+7µZvûİà–z*¸c>5 ˙s,ëpïiŬâŭOû¨Ò3àı š/T  ù 4l]ÀšMí~µÜEiĈ†@i"ÒBÔr†öò@éä( %-)Pû¸,=–thıƒÒa wP) 8K Ç5|DÏ|ŝ:ìÔ˘ñ˜§<ŬIÍÛÙ)>}ŽŠóİ>ôX>”Áü˙tĜôEÇ Hş,‡„ “`Ú˘[ €èŬ‚W $-[ñTkY@kojµâ ×”¸ç!•Z3 ÔX–m̓z Pżĥè!à4<@‡ĝ%Rk^ߐÓ)ĦòÁ­Z¤yŠżzY@ônĊS}É!;hy{Ì}d jĥ"ôİàĤùƒħ56Ú˘‡ÜŬJçîŭáÖr‡úíüĈ#]÷i½ xPÀ§ƒ=Cĉ’˙Ô=œi?•Ü4ŸŠ…’= *ĊĝΤt]'ŭŸÎg”ü§íé•]¸ÏÀ¸¤ûqDï~>=j1ŻÄ˜Oƒ‹š™)žŠ•ñ \„Öʜ? [ġç˙ÓàŠ?"Óâ|:û“ž…{ŝĈéû˙pH@Ñğ€Ï§Ç$ڟjÇOe÷ÖS9!ñS)³S³§ċvyXĞ~˙.ÔïC—ìéPŜ´˙OßMYô.Üí8~ó"^h M I4{äiYñ4( ¨Ù OĊp|OċLMë+í`Çô˙¸]¤ÄVÄëĦ•ğŝĉIù˙ôß{°žÎ…û@˜Ħ€¨‰VŞ’tžH9O÷ÖĈJˆ™==[3,Z¨Üzŝ˙Arr Ô-ô.ĝĉÓُôڜ5(‡fˆqìžC–pCÚ:Ħ­†^1 ĉvph‹ĉġ–n–c9P˙İsœ:ohĦĠ–z"ü£Ċ ÄŬÇJŠż>@ëŒ?ŝÄWi3@îÊ÷}£Tğ˜”ù8Úo°Ä€~Ŝ8P–@ȗO+jïêž÷B—Ä mŬ$PıÊÚbhĦ¸úk‡AkĴË>hşAö£eĜ*ğ ƒ}gâÚ^ÜMìu:ĉ§Aïgt@‘Ȑ'@i½&ž–ŬÏ÷´È€4ps?5 ?…éŭa½>xäğû4Dá?ŝÈċ4_HB, i!!gì!É´¸‘žKıü‡@!›|“-ŽİÚ`ÈÀı‡óŸƒ p§ë !| €*á!'8{ÚOˆÜO#wï§A+JžÊ…<-'ĉôìġĵrdŝ@rƒ p§Û T8Ÿ³ê4ò@ö4p·ŝ`_ùC§Ġ £ŭ+ĜlÍ÷ (ÜİÚ[Ĥ JˆŝÔŜ˜3€‘NĞV|=- Ì!Xȏô„A~ìï˙Ó銽AZ¸şğUh ċ{zĴ‰§Qk˜­x~Òb“½2×ú˙t>—e·Ö˙ž RÎT%àè0 ÌċÍôòsÂ@ž†ˆÔ<0HÂyÈî @ްŒ/Óú:ż÷Cyⅆñ°Uü4˙˙ƒû"ŽQ@ç 5Êђ!wĈ @ †}#­Żóë§ÇÒ=ûa?—ÒÖúÑrt´`yuXîÄ8H"ò>êDœ‡ Á[4; ú?ġ/ÁÖ5w ġ%ŠdÂĥNC1 x˜0† é4œ0HÂgÈËÓ qú¸rÍj4ÈDÑ:ĝİ€VËó  –‰Tq ġp¨Dp SœŒ̂½²ŠŞqî°ñö€AFCuÌ €K€^<, ƒŸhit•GŬż9@~A*è0Œ‚W°C wĜĠƒ(œrġ € Â2‘"Ocûè5ÑGëËĊéqĜT>Ó‚ü ÚÌ2œÀyèĈ/ŝA˜˙óá|Đ?‚ €Sϧç.1:OK(´<™ŸN•ĠüH£=uÒßüÁZXAÓïúѝ6 €SDÛÓs% [ñ´^DËkô·İËP!?ĥñĥ#âyž÷˙?¸NĊv…;@ ĥ?Oç5ññtL8ö¤K”ÑZġġ£kéq.qí˙?ĝÏŜ‘§ñRßÑ h°E|<½‡è˜î˙§ŭ&"{:f†ŝA^ôĦÚû\¨Ÿ‡†˙Éùƒ4†eá@Œƒ0ĵg@]ß-@ËY~¤™{z:BZW’ ô[‰Z0V@ 8†Ħsxı´²c4Í*+<ŝî£*è²ïc @ Ĉ„OÏU(tnĊ˙§G+ÎCOïÛXï˙Ħuü.ħéCöœûAÜj‡ġ€†í° @ Ĉ<úNSšËIçVü  éQÈ3wM9ȂÁ¸!:4ĉ0DZĝ§Z äTËÑV;Qa0œ ĈAš0@ĞNw²)ş+úrŻ*½"͎1@ï  ]:FŬh!?è ˙ˆ#}a§A:0 Ž÷{AÎ0@çÓÓ²ĠÎÙL5XOÚ¤éÑäƒ`-àÑ[Ô4/˙ÓçBdà@‚˙À\0àç‡SİgÀSé+0`żÈä>ŝPn‘“w0 ŽK^pšÜÙ0@ ĉ„rŸžkâa…!Çċ‡ĦżŭW?š’GL~µ¤KÍ߁4¨ğx09)Oï :†ç@í½?šİF öA²G`Ä­q ÁœpĝÑfŜçӂp>t Ïא]°£€ĤĦĦrŒÄˆ½¨ €{"BN@ïé˜pé âéĤñœÙêG3ÛhÁNÏÔHNo4Ŭ ÂjéêÓ1\ú ÷£ŭìQ‚ŭ˙è@ …„…<·žŽ‰™ŜgÜ§gGdzkôƒŝì”ÑF֐;bm(@C!Ħ)ÓÉ^ûH˜û 󖝞óG úA—ïö˙z`XïL%PIlÈ­é|:Ú;C5ŭt[ŝAĥ˙Ÿĵ9 †Uk%ïŒûĦ€* Ż~€–ÄPÍ˙XV8ÇW÷v³G[ë$ oŽ6 °€* }É$½'$b QÂıf^Ĝ8ŭh·{´µ>Új'PJù8Œ1WŠ ÈÚ]èÜûAÜR-ì)+Ôó‡xkıâŬ@GK  #  3)Ò³Á9ŠŜ'ÎĈq ÷iwP˙.`@=m°P|€ÎĵY0zŽ7ŝ(ä<†Á}> )ï ùHj€Šc…2N=@C5ş ï˙à>ǽe_?Ú²‡·Ò˙‹ĴG[íˆq&`$Ğ÷ùóaŬ’‡úYښ*·$}€†×†!~ž:)jtéÀ0|o³mµ“ˆqˆ&ĉP=#|‡j´‡úŜgËS;ì@ñ…!|Œ1?´‡a†Á{™5+lqáG‹kÒ@1фğœƒîç:Cğˆ° ÈBŜêw!žî0 .ܸkġĤÖ!´ç¤-ÈpŸ??œÁhÈ0 È4T xĜċtıŝ‹ŭ5T0P~FkE.`ܰ”V˘hpo‘ZC=H­pÌ¤è‘ †ÌÍ`ƒPuĝÄME ôáx¨üş1hOfÂlU⪅Ñp"şgĠ0zÛġ@ ċ^)A4€ŭ9T3X yPEWĊ£Ùi @䄁ÈÇPv<ô8z‰Çыħ…:>@´-°ò c’ƒĊċ0n?‚s y†á{¨ÙPĞaF—9!@£<í Ё>Î ³µĦ…}ôkİ ġÑ+‡( Ñž>(£ Ĥ›v@î j+F {šƒ ´ħat\}x€-àGn!²IŞ+F {ŞäB}ti04ZÀìBÖjòw]B'µa÷’*ŒĤ8œà4Î7ŒŽ§@£üh!kÉ —  gÄuw z$ÊA€vÚœ˙âĦa0bĉh´€-ä‘hĊOpìŞC÷& ú­e~İ@0:ŽwĜw#-Lh´€-äħ#Ħ•Ŭ`…ÜÂW`;è…ù…ÑñsŒü•-ĜA a¤Gh?ZÈ #ġ 5´‹ħ 4=*Ĝŭ°ĦXaŝ&?Z7hÁ ‚‘! €F ĝÑBžP“0şš`%@Qk|t(…˘x€í~@ŞxFŻ€Eƒ  âó˙7¨‡h£` –<ş.-‡ĝ£ hòĂ÷ëGÁ(¨|˘ÚM‹È`?t>e €E£…<İàŝ`şPdŒˆ|‘Mw£i‘D@£h´'ŒĥšF-ó‚?tÈgortĜ0 Q4ĝĥ<–.è`/èGÇ=GµÒ~?ô?´`'(ĵ ŭü˙ĦF3Ŝ( ·×O ½ż‡ĤŻÑ†‰ €FÑàNĝó‡X!?ÚuÄĤo{Ĥècìù£é‰|@£hg„ú˙Cĵ‡ĥÊF3ĉ(@ï™âš0Eö< Q442Fü—G.èûGğÖ#>ŭâ›0EĉÓ 1ê€EC'“èÑòÌ`ŭèŞ›×Zï'˘aÖm(Z™f(-£ÄğŽ~tĝfĜĤÏx"Óèèv:€EC3#Í˙?ôÁèʈᓉ™0íÉ  Q4t3Uŝ˙áöCOCkĤžÈaû£s1h ŭ–ÓûaT.‹üi.žÈ Óó `tÒt@˘ĦŸáô‡Á¸<"´Ġ7hÒ1Ĥ£q6È@˘á‘ùħú˜µìûG[ƒtOSÄL˜î-Ô/ Q4ĵ2eŭ˙áîC'ôFÇìi7ìGhŭèJ¨ĦhôF§aĜR †ßÒĜèZĥ@ĵ„Go!;̀Zß PĴ€CنÑpz €F ĝaܚg€\]6’Ĵ°ż0R/Y&1€ÖĦ@12x Ë £a9´@£­ùá . т ž&`w˜ ġ‚.ÀèÑú4ZÀĥĉG ŭá˙ ħò(ŝ€V˜^ĝ=Œ@£­ùQ€VèċV,Ò.Qh ŭ´PôÓĊѨY €F ĝÑÖü(À `­]hAùÊ>£W Ú ‡UÎh…¸ZĊ rçP…>:Ü2²@£­ùQ@½^À´JX À€{ġ >9ôÊ4Á ` €F ĝÑÖühk~hƒÊztùâ(À4ZÀò£­ùĦ µÖG'IGN@£ü(@n̓–Ï Œ†Ĉ  B4q4(F1 €F ĝQ€\ÈóC ùт~€ Öè„é( h? °ô ­ë uÓ£€ŝ`tÂtPh? F úÁ@[ê GƒbPh? ˆ)èíĦ½hhP<`@ ÁŒN˜ŽŞ€-àGÁhA?0T¨o0´4ZÀr zY젝’ £ĦA0t4ZÀJ úxh‹~´ Ç F'LGÁ€€-àG5 ú|hA?ş´`—cŒN˜Ž‚4ZÀj·èFîŭ†Ñ ÓQ0ˆ@£€=hye´° ­zXĦ>zóÑ(T €F ĝQ@˂´36ZĜ·³n@Ĥ ‰ĉÑCFÁ 4ZÀzöèWĊ Eݵ>:a: = Q4 èŜލĠñŭ˙CĴ‡Î/Œ‚Q0¤@˘Q0…½=Ϥ…:¨އÎ'Œ‚Q0$@˘Q0XZġùƒ U˙ZáĜĈÊ( €FÑ(l…½<´°ßOǂŭvİ>vİ>vİ?vŞ?vŞ?vŞ?vŞ?vŞ?vŞ?vİ?vİ?vİ?vİ?vİ?vİ?vİ?vİ?vİ>vİ?v¨?v¨>u¨=uĤ=uĤ=uĤ=s=s=r¤qĦ?q ?q =pŸ=pŸqFkÄFkÄFkÄEkÄEkÄEkÄEkÄEkĊEkĊEkĊEkĊEkĊEkĊEkĊEkĊEkĊElĊElĊElĊElĊElĊElĊElĊDlĊDlĊDlĊDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈDlĈClĈClÇClÇClÇClÇClÇClÇClÇClÇClÇClÇClÇClÇClÇClÇCmÇCmÇCmÇCmÇBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÈBmÉAmÉAmÉAmÉAmÉAmÉAmÉAmÉAmÉAmÉAnÉAnÉAnÉAnÉAnÉAnÉAnÉAnÊAnÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@oÊ@oË?oË?oË?oË?oË?oË?oË?oË?oË?oË?oË?oË?oË?oË?oË>oË>oÌ>oÌ>oÌ>oÌ>oÌ>oÌ>oÌ>pÌ>pÌ>pÌ>pÌ>pÌ>pÌ=oË=nÊs:e¸?nÉ@oÊ@oÊ@oÊR}ÏùúŭüŭŝPiš.T*JˆpÌ>pÌ>pÍ>kıWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââığş56c\^Ĵ\^Ĵ\^­\_­\_­\_­[_­[_­[_­[_­[_­[_­[_[_[_[_Z_Z_Z`Z`Z`Z`ŻZ`ŻZ`ŻZ`ŻZ`ŻY`ŻY`ŻY`ŻY`ŻY`°Y`°Y`°Y`°Ya°Xa°Xa°Xa°Xa°XaħXaħXaħXaħXaħXaħWaħWaħWaħWa²Wb²Wb²Wb²Wb²Wb²Vb²Vb²Vb³Vb³Vb³Vb³Vb³Vb³Ub³Ub³Ub³Ub´Uc´Uc´Uc´Uc´Uc´Uc´Tc´TcµTcµTcµTcµTcµTcµTcµTcµScĥScĥScĥScĥSdĥSdĥSdĥSdĥSd·Rd·Rd·Rd·Rd·Rd·Rd·Rd·Rd·Rd¸Rd¸Qd¸Qd¸Qd¸Qe¸Qe¸Qe¸QeıQeıQeıPeıPeıPeıPeıPeıPeıPeşPfşOfşOfşOfşOfşOfşOfşOfşOfğNfğNfğNfğNfğNfğNfğNgğMgĵMgĵMgĵ­ıàŝŝŝ’ Ï>T™AXĦJd¸Lg½Lg½Lg½Lg½XqÁêí÷ûüŭdxµ6K‰?XĦIfğLiżÉèŭŭŝ|Ĉ;S™@Z§IfĵJhżJhżJhÀJhÀb}Èòġúŝŝŝ=XĦ5LŒ@]ŞHhżIiÁIiÁIiÁHfWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââığş>1ZlUœlUœkUœkVœkVœkVœkVkVkVjVjVjVjVjVjVžjVžiVžiWžiWžiWžiWžiWŸiWŸhWŸhWŸhWŸhWŸhW hW hW hW gX gX gX gXĦgXĦgXĦfXĦfXĦfXĦfXĦfX˘fX˘fX˘fX˘eY˘eY˘eY£eY£eY£eY£eY£eY£dY£dY¤dY¤dY¤dY¤dZ¤dZ¤dZdZcZcZcZcZcZĤcZĤcZĤcZĤb[Ĥb[Ĥb[Ĥb[§b[§b[§b[§a[§a[§a[§a[§a\¨a\¨`\¨`\¨`\¨`\¨`\¨`\İ`\İ_\İ_\İ_]İ_]İ_]İ_]Ş_]Ş^]Ş^]Ş^]Ş^]Ş^]Ş^]Ğ^^Ğ]^Ğ]^Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\_­\_­\_­[_­[_­[_­[_­[_[_[_Z_Z`Z`Z`ŻZ`ŻZ`ŻZ`ŻY`ŻY`ŻY`ŻY`°‚‡ĞŻ×u|½W`W`XaħXaħXaħXaħWaħWaħ‘˜ÌİÖV^š5qGTšSb³SdµSdĥSdĥQ`WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââığşE-RxNxNxNxNwNwOwOwOwOwOvOvOvO‘vO‘vO‘vO‘vP‘uP‘uP’uP’uP’uP’uP’uP’tP“tP“tP“tQ“tQ“tQ“tQ”sQ”sQ”sQ”sQ”sQ”sQ•rQ•rR•rR•rR•rR•rR–rR–qR–qR–qR–qR–qR—qS—pS—pS—pS—pS—pS˜pS˜oS˜oS˜oS˜oS˜oT™oT™oT™nT™nT™nT™nTšnTšnTšmTšmTšmUšmU›mU›mU›lU›lU›lU›lUœlUœlUœkUœkVœkVkVkVkVjVjVjVžjVžjVžjWžiWžiWžiWŸiWŸiWŸiWŸhWŸhW hW hW hX hX gX gXĦgXĦgXĦgXĦgXĦfX˘fX˘fY˘fY˘fY˘fY˘eY£eY£eY£eY£eY£dY£dZ¤dZ¤dZ¤dZ¤dZ¤cZcZcZcZcZc[Ĥb[Ĥb[Ĥb[Ĥb[Ĥb[Ĥa[§a[§a[§a[§a\§a\¨`\¨pmħ‹ĵ;9f 9;:jZXĦ_\İ_]İ_]İ_]Ş^]Ş^]Ş^]Ş^]Ş^]Ğ]]Ğ]]Ğ]^Ğssĥ„…¸11[!!>CD}Z\İ\^­\^­[^­X\WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââşĵşJ*MI†I†€I†€I†€J†€J†€J‡€J‡€J‡J‡J‡J‡JˆJˆ~Jˆ~Kˆ~Kˆ~Kˆ~K‰~K‰~K‰}K‰}K‰}KŠ}KŠ}LŠ|LŠ|LŠ|LŠ|L‹|L‹|L‹{L‹{L‹{LŒ{LŒ{MŒ{MŒzMŒzMŒzMzMzMzMyMyMŽyNŽyNŽyNŽxNŽxNŽxNxNxNxNwNwOwOwOwOwOvO‘vO‘vO‘vO‘vO‘uO’uP’uP’uP’uP’uP’tP“tP“tP“tP“tQ“sQ”sQ”sQ”sQ”sQ”rQ•rQ•rQ•rQ•rR•rR–qR–qR–qR–qR–qR—pR—pR—pR—pS—pS˜oS˜oS˜oS˜oS˜oS™oS™nS™nT™nT™nTšnTšmTšmTšmTšmT›mT›lU›lU›lU›lUœlUœlUœkUœkUœkUkVkVjVjVjVžjVžjVžiVžiVŸiWŸiWŸiWŸhWŸhW hW hW hW gX gXĦgXĦgXĦgXĦj\£ÒÎäòñ÷UOn-<5a`T›eY£eY£eY£dY£dY¤dY¤dZ¤dZ¤cZcZcZldŞÜÚëóó÷+(I2E@u`Y˘a[§a[§a[§]Y—WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââşĵğL)J…G‚„G‚„G‚„G‚„G‚„G‚„GƒƒGƒƒHƒƒHƒƒHƒƒHƒƒH„‚H„‚H„‚H„‚H„‚H…‚I…I…I…I…I…I†€I†€I†€I†€I†€J‡€J‡J‡J‡J‡JˆJˆJˆ~Jˆ~Kˆ~K‰~K‰~K‰}K‰}K‰}K‰}KŠ}KŠ|KŠ|LŠ|LŠ|L‹|L‹|L‹{L‹{L‹{LŒ{LŒ{MŒzMŒzMŒzMzMzMzMyMyMŽyNŽyNŽyNŽxNŽxNxNxNxNwNwNwOwOwOvOvO‘vO‘vO‘vO‘vP‘uP’uP’uP’uP’uP’tP“tP“tP“tQ“tQ”sQ”sQ”sQ”sQ”sQ•rQ•rQ•rR•rR•rR–qR–qR–qR–qR–qR—pR—pS—pS—pS—pS˜oS˜oS˜oS˜oS™oS™nT™nT™nT™nTšnTšmTšmTšmTšmU›mU›lU›lU›lUœlUœlUœkUœkUœkVkVkVjVjVjVžjVžjVžiWžwg¨ùùûŭüŭbY|#5B7fcS™hW gX gXĦgXĦgXĦgXĦfXĦfX˘fX˘fY˘fY˘€v²ŭŭŝ˙˙˙5/V$:IAxbWĦdZ¤dZ¤dZ¤_X•WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââşĵğL)KƒHƒƒHƒƒHƒƒHƒƒH„ƒH„‚H„‚H„‚H„‚I„‚I…‚I…I…I…I…I†I†I†€I†~I„~I„€J‡€J‡€J‡J‡J‡J‡JˆKˆ~Kˆ~Kˆ~Kˆ~K‰}Jˆ}J‡|J‡}K‰}KŠ}LŠ}LŠ}LŠ{KˆzKˆ{K‰{K‰{K‰zK‰yL‰zLŠzLŠyLŠzLŠzMŒzMzMzMzMyNxMŒwMŒxMŒyNŽxNŽxNxNxNxOxOvNŽuMvNŽuNŽuNŽuNtNuOvP‘vP‘uP’uP’uP’uP’tO‘sO‘rP‘sP’tQ“tQ“tQ”sQ”sQ”sQ”sQ”rQ”pQ“pQ“qQ”rR•rR–qR–qR–qR–qS–qS—pS—pS—pS—pS—pS˜oS˜oT˜oT˜oT™oT™nT™nT™nT™mS™lS˜kT˜lT˜kS—kT™lT™jS˜kT™kT™jTškUšiTšiTšjU›iTšiU›jVjVjWžjWžjWžiWžhVžgUhVgVfUte§ôóĝŭŭŭqg•<3]RFdVgXĦfXĦfY˘fY˘fY˘fY˘dX cWĦdXĦdXĦdXĦ|t²úùü˙˙˙JCz<6bUMbY£cZc[c[_X–WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââşĵğH+O}KŠ}LŠ}LŠ|LŠ|LŠ|L‹|L‹|L‹|L‹{L‹{L‹{LŒ{MŒ{MŒ{MŒzMŒzMŒzMvJˆe@uc>ssI†yMyNŽyNŽyNŽyNŽxNŽxNŽxNxNxNxNqJˆa@ucAxsL‹wOwOvOrLŒaAw[=pgE_@u_AweE\?sdE}aByZ=phH„sO‘tP“tQ“tQ“tQ”rP’fHƒ[@uhI†rP’sQ•rQ•rR•rR•rR•oP’_EW?s^D}X@uZAybG„YBxaG‚nQ”pS—pS˜pS˜oS˜oS˜kP’[D~WBxfNŽmS˜nT™nTšnTšmTšmTšlS™eOVCzXE}gQ”lU›lU›lUœlUœkUœkUœkVœkVkVjVjVjVjVžjVžjVžiWžiWžiWŸiWŸiWŸcS˜UG‚QD~XI‡PC{SGTHƒOC|YL‹UH…RG‚YLŒPERF‚UJ‡ND}YNdXĦeY£eY£dY£dY¤cX˘ZP•OGUMŒRK‰OH„^U›żğÚßŬìfa˜B=pQLŠ`Y˘b[Ĥa[§a[§a[§a[§`ZUP”KH„SP’NK‰OK‹_\¤ÌËäÚÙêLI‡@>tRQ•]\¨^]Ş^]Ş^]ĞZZšWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââşĵğB/VrR•rR•rR•rR•qR–qR–qR–qR–qR–qR–qR–pR—pS—pS—pS—pS—rU˜tX›aH…9*N4'H]E€nR–oS™nT™nT™nT™nT™nT™nTšnTšoW›qYœ[F€3'I8+P_JˆlTšnWœpZcO=0U2)D>1Z7-L7-N=1Y4+H@4Z5*N,#@O@ugT™jVžjVžjVžo[ĦgV™E8h,$CH>sYY¤]^Ĵ\^Ĵ\^Ĵ_a­^`İABz-.O57a./W)*NHK‰vzş~€ı:=n#%D;>rV[¨Z_ŻY_ŻY`ŻY`Ż]dħZ`Ş9>q,/O69g)-R+/VJQ–}„Áqx³17d#'HAH…U_ŻWa²Va²Va³T^ĦWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââşĵş:4_dZ¤dZ¤cZ¤cZcZcZcZcZcZcZcZĤbZĤbZĤb[Ĥb[Ĥb[Ĥ—’ÄĜÖékfš%"? 7JE€_Ya[§a[§a[¨a[¨a[¨`\¨`\¨`\¨ĦŸËÒÑĉ_[ 8$"@NKŠ^[§Ž‹ÂÙĜꘗĵvu‰ÂÂÇONhŞŞ³¨VUmÇÇ̔”˘94BBy[ZĤ]^Ğ]^Ğgh°ÈÈ­­34]156dVX˘\^Ĵ\^Ĵ\^­uxıÖÖê³µĠŽ§ÇÇÍbcxŽ›ĥĥ23Q1*,QPT›Y_­Z`Z`Ż|ż×Ù뛞&)J6MPcµQe¸Qe¸Qe¸QeıPeıPeıPeıQfıÛßŭŭŝƒĥ">&GAR˜Od¸¨³Ŭ˙˙˙ÙÜêÊÌÔŝŝŝݽġġöìíïŻ²À˙˙˙µıÄ"? ;8I†Ld·NfğNfğwŠËúûŭëîö7Do5,4H„HeıJhżJhżJhżLkÀÙßñ˙˙˙„’ı$C!/V?[§HhżIiÀIiÀIiÁIiÁIiÁIiÁIiÁIiÁHjÁHjÁHjÁHjÂHjÂHjÂHjÂHjÂHj£ÙŭŭŝÇċµşÇ˙˙˙²·ĈñòùùúĦ§·ŝŝŝÊÎ×ÓÚ˙˙˙“›àâĉġġ÷KWv8&;l@cĥEkĊEkĊJoĈŜċôŭŭŝĤŻĈûûûċê!/N"?B]˜óöûüŭŝM`Š!=)ByAg½ClĈClÇCmÇLtÉóúûüŭ£ĴÀŭŭŭÎÒÛ)F'HVq­úûŭ˙˙˙!7e#A/N?lÄAnÉAnÉAnÉAiµWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââığş&?sBmÈBmÈBmÈBmÈBnÈBnÉBnÉAnÉAnÉAnÉAnÉAnÉAnÉAnÉAnÉCoÉÈĠï˙˙˙›ħÜ(E 7d5\¨>lĈ?mÈ@nÊ@nÊ@nÊ@oÊ@oÊ@oÊApÊŜĉö˙˙˙„œÊ4_ 9i7a²@oÊÊ×˙˙˙ÚâòÒĜäŝŝŝ³żĠĝùúòó÷şÄÖ˙˙˙¸ÂÔ9h3^1Z¤pÌo”Ùŭŭŝîòú7U/V*MŽ:lĊ=pÍ=pÍ=pÍcŒÖúûŭóöûğĈÚ˙˙˙½ĈĜëíñ˙˙˙b}Ğ:k$E~7iż;pÌ;pÍsÏÙġ˙˙˙‚žÑ=p"By6g:pÏ:q:q:r:r:r:r:r:r:r:rÑ:rÑ:rÑ:rÑ:rÑ:rÑ:rÑ9rщĞŭŭŝçí÷ÀÊÚ˙˙˙·ÄÙòġüüŭиÏ˙˙˙ÓÚĉĠÛĉ˙˙˙ŻĠĝùúŝŝŝxµ6c)Tš6oÍ8sÓ8sÓ?wÔâëĝŝŝŝ­½×ŝŝŝëîô(Hz;n@n·ġĝüüŭŝPu°7e'S™5oÎ7sÔ7tÔ7tÔA{Öô÷üŭŭŝĞşÒ˙˙˙ÖŜê ?pAxS€Ĉûüŝ˙˙˙$P“8g*\İ4sÓ5tĠ5tĠ5tÖ7oÀWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââığşE}1wÚ1wÚ1wÚ1wÚ1wÚ1wÚ1wÚ1wÚ1wÚ1wÚ1wÚ1wÛ0wÛ0wÛ0wÛ/vÙĤŜûüŭ…ŞÜ$Z!R—)g(cĥ)g½.tĠ0wÛ0wÛ0wÛ0wÛ0wÛ1xÛÏßöüŭŝtŸÛ P”"T›-pÎ0w܅Żêüŭŝ•ıëÂÔíîóùt ÜòġúÜĉġŞÄèŝŝŝĴĊè'eı%`ħ*kĊ'eş(fĵ-tĠ[•÷úŭíù1iµL‹'d·.vÙ/xÜ/xÜ.wÜNˆÖóöûÛĉôİçŝŝŝĞĊéİÁâùûŭ[Ö&fğ'h(j&fğ+rÑ-xÜ_˜ċúüŝ¨Ĉí$[ĤR•)mÈ-xŬ.yŜ.yŜ.yŜ-yŜ“şîüŭŝqŸŬT›"[¨+tĠ-yŜ-yŜ-yŜ-yŜ-yŜ-yŜ-yŜ-yŜ-yŜ-yŜ-yŜ-yŜ-yß-zß-zß-zß-zß,zß[—ĉöùŭ­Ê½Ŭġ÷úr›Ñĉìóöĝûh’ÈîñöÄÔéŒĞÒúûŭƒ¨×ÏÚéèíġCzÀQ–$eğ+xŬ,zà,zà/yÚÓáòâë÷uĦÛĝúŭÒáô+nÁ$h,tÏşÏêó÷üE~ĊP‘#dĥ*xÛ+{à+{à+{à3|ÙèïĝĠâôİŬúüŭÔ'i½$j1wÏÌÜó÷ü!b´Q”$j)zß*{á*{á*{á,uÊWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââığıI†#é#é#é#é#é#é#é#é#é#é#é#é#é#é$€é!zß&dİĦ²Ĉ/bœC{BvVž=pJˆtÔ"é"é"é"é"é"éjݧÌġ0yËAvFq!é/‡ë§Ìö8Œì`˘î‰şò(ƒé“ÀóYžíE“ëĴÎöSœî"è#~ċlÇByF€rÒ)„éœĈġ~²íXĦ:k\İ {â"€ê#€ê#~ĉ g·‹ ¸NzĴCßĴÏöPšíF”ëœĊô(„é!çvÙQ•=pd¸ }ĉ)„ê˘ÉġD‹ÜH…=pg ~é!€ë!€ë!€ë!€ë8í¨Ìö*pÀ>rNvÚ!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë!€ë(„ëĈġIàDr§“¨À ]£z”²“ŞÄQ‘~•Ż]…²+WŠ›ŻĊ,f§]|ž|˜¸U›=pY¤{!€ë"énÉe†Ĵr”ş*{ךÄôJ˜î é!}ċhÀIm•¨ĈVš8hV zâ €ì €ì!~èhżv‘ħcŒş1ƒà Èġ>‘í ê |ä`²Yyœ‚˘ĊN:kb´~è ì ì ì#zÔWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââığıM…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ%Œġ•Çú`ìFt£›¨µ!IsyŒ —ĤµN)K ?uwÜ„ô…ġ…ġ…ġ…ġ…ġ\İ÷šÉù#qÀ.U 4amȃó…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġ…ġgŻĝ˘Íù9~.U 9isÔˆôŽúpí I…'GN}ĉ…ô„ùšÇġ b¤'G =otÖ„ó…ô…ô…ô$‹ô—Èù_˘ĉ ?t(IY£í>™ġ¤ÎùfĦŬ 6d*M\ށí…ô…ô…ô…ô\İ÷Ê÷d­*M =otÖ„ó…ô…ô…ô…ô…ô…ô…ô…ô…ô…ô…ô…ô…ô…ô…ô…ô…ôˆôÄĝi˘Û6[™¨ĥ3^Šm–…˜ĞDn˜¤ħNnId€ĞıIo–Pi‚“Ĥ¸Et&F I†{â1‘ġžÊ÷Dĵ+O 8hp̓ò…ôGö˘Ìĝ/r·n–›Ĵ½%P}(IP”~è…ô=˜ġĦÊġ3mİ(I @vwÛ„ó…ôVöœÈö'd¤|žŻÂ 7f*N^­‚ï…ô…ô…ô~ÛWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââığı O‘‰û‰û‰û‰û‰û‰û‰û‰û‰û‰û‰û‰û‰ûXĴüúüŝÏċú°ĊĜŝŝŝv¨ÍĠÜĝùú'Py%DAx{áˆú‰û‰û‰û‰û‰ûĈâŭüŭŝ_šÓ-S4_oˇĝ‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú¨Óŭ˙˙˙RŒÄ)L:kvÙD úġúŝŜíûRŒ&F N‘€ìŒúÔéŝôùŝ6rĴ%E;luׇùˆúˆúˆú[ĴûúüŝÉáĝJƒ(J Y¤ƒòc°û˙˙˙¨Ëì6d)K [¨ƒòˆúˆúˆú‰úĊâŭŭŝŝ\•Ì-S•òÇàú0|ÌF€Uœzàƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ)ŠşÙúUèT…şÊÖD~ĵ˜ŻÉ´ÇÜ>ŒßÌâúyµôzµóÇßù<“ï|µòœÈö‚îêîƒD™òÁŬú1‚ÖK‰R–y߃ƒa¨ôċûOžñ£ËöħÒ÷ oJˆfğ€ëƒU˘óÛú!sËF‚X˘}ĉƒñƒñt³öÊâûGšòħÓĝ£ËġcĥJ‰mɁïƒñƒñƒñ|ĜWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸G‚*{â*{â*{â*|â*|â*|â*|â*|â*|â*|â*|â^œétİé,f­u…™I`{7`0MK‡S’ŜqĤè \¨\qŠWq:k &FH„&tÔ)|â)|â)|X™é†´í*g³,Q2[!fğ'{á(|(|(|M’ç}Żí-k·]rŠSg€&Gon|Ž/Nr3W3UZĤ'yŜ(|(|,~}ŻîeœàE~ %DJˆ%u×(|äsŞípçT˜ &G>s#oÌ'{(|ä(|ä(|ä.€ä€²îX’Ĝ=o &FTš%yŬ@Œç‹ıï=|É5b ,P[§&zß'}ċ'}ċ'}ċ'}ċS˜ê‡µí#\£ )K:j"nÊ&|ä'}ċ'}ċ'}ċ'}ċ'}ċ'}ċ'}ċ'}ċ'}ċ&}ċ&}ċ&}ċ&}ċ&}ċ&}ċ&}ċ&}ċ)€ċ}ħî[‘/Pv|Œž.Uƒ1Réˆĥì0e˘ (I@t sÑ$ç$ç)‚ç0†è%€çVœìjĦâF€ -R]Ş#}ä$è$è$è'xWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸!Bx9rÑ9rÒ9rÒ9rÒ9rÒ9rÒ9rÒ9rÒ9rÒ9sÒ@xÓĠáġòöûˆŸĊôġöÌ-P8!Cx·ËêċìĝWs£ĉèëĵÂÍ.S7=p3iÁ8sÓ8sÓ8sÓÂÔñ÷ùŭg‡ş&E+N,^Ğ6sÑ7tÓ7tÔ7tÔ·Íïúûŭ§ÎĉèìÚŬ዗İûûû’­%E#A&R–4qÏ6tÔ6tÔYŒÜġü×âó&Fv ;By1mÈ8vĠĠâöáê÷7Z92[-d·4tĠ5uÖ5uÖ5uÖi˜à÷ùŭÔì>l!=!L‹2qÏqžâüŭŝĞÔ,R"?"N2q4u×4u×4u×6v×ÀÔòùûŭ`³%D2^,fğ2u×3vĜ3vĜ3vĜ3vĜ3vĜ3vĜ3vĜ3vĜ3vĜ3vĜ3vĜ3vĜ3vĜ3vÙ3vÙ2vÙ2vÙ\’àñġüŻÂߌ˜İúúû‚‘¨">-R)b´1v×2wÙ1wÙ1wÙ1wÙ1wÚ1wÚ1wÚ1wÚ1wÚ1wڄ­èúüŝu’ı">.U'a²/wĜ0xÛ0xÛ0xÛ1yÛ¨Ĉïêù4U !=H…-r/xۗğíûüŝ[y˘ :5b)iÂ.wÛ/xÜ/xÜ/xÜ3{ÜşÒóċí÷5a%C Uœ-vĜ.yŬ.yŬ.yŬ0sĈWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸+nÊ?oÌ?oÌ>oÌ>oÌ>oÌ>oÌ>pÌ>pÌ>pÌ?qÌÙâġ˙˙˙¸ÄÛ)K6d5b´q6hż;qÏ;qÏ;qÏ;qY‡×÷ùŭ˙˙˙9i*M+V9pÍ:r:rÑ:rÑ;mĵWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸56c[^­[_­[_[_[_[_[_[_Z_Z_bgħîîöŝŝŝşğÔ˙˙˙ââêIMˆ;@tdiĦŭŭŝùùü§ŞÌüüŭáâìOTŠ48fEKŠRYS[§W_ŻYaħáâñ˙˙˙”˜Ċ8>q:AwPZWa²Wa²Wa²V`ħĜÚì˙˙˙żÂÛĝĝúòóöÁÄÙ˙˙˙À×>G‚;D|MXĦUa³Ub´Ub´ˆĈŭŭŝñĝOX”2:kDO’Ra²ft½ëíöúûŭ‚‹5>r1ZkVkVkVjVjVjVžjVžjVžjWžjWžl\œßŬĉßŬċ‚xĦâè´ŻÄbQ“cR—l]ĦÜĜé×Óĉ‡{²íëóÇÂÛQF=4`OC|I>rE;m\O‘eWŸş³Ġëéòyp¤=5a@8f]Q”dXĦeY£eY£aUËÈĜêé²ÛÙèÒϗÀïîġ šĊ`Vž_VžbY£cZcZcZskâàîÉÇßMH62[LG`Y˘a[§ħÓéèòhcž;8fIE}]Y˘`\¨`\¨`\¨`\¨jf­ääĜĜêRO‹86dNK‹][§pn³ċċñ²ħÔDC{;;lTS˜]\Ş]]Ğ]]Ğ]]Ğ]]Ğ˘£Ïñ÷‘’ż<=p?@vVXĦ\^­\^­[^­[^­[_­[_­[_[_Z_Z_Z_Z_ŻZ_ŻZ_ŻZ_ŻY`ŻY`ŻY`°†îï÷³ĥ×°Çë냇°59j=C{FMŒ7>qCJ‰AI†9@uFO‘;By@H„R]ĞVa³Va³Vb³£ŞĠñĝˆÀ5=p=G‚Q^ĴUb´UbµTbµTbµYg·ÔêÙÜîR^ž21X#2C4`gP“lU›„qĞ–†ĥO?p'8:-SaNjU›kVkVkVkWž”…¸‰{­B5b&9INAxeUœhX hX gX gX uhޞ”Â_TŠ+%D2+OZMeXĦfY˘fY˘eY˘eY£eY£eY£eY£eY£dZ¤dZ¤dZ¤dZ¤dZ¤cZcZcZcZjaݘ“Äpk£ROnpn>:b20IROi/,QCBWFDg41TQOf:7`&$B2/XVS™^[¨_\İ_]İqo³˜–ÇWW&%E//VRR–]\Ş^]Ğ]^Ğ]^Ğ]^Ĵz{ş‹‹À=>q!">;=pXZĤ\_­svı“–ÇIL„"#A35bSWĦZ_Z_ŻZ`ŻY`ŻY`Ż}‚À€…ğ48g!$BAG‚V^­XaħXaħWaħU] WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸I*NJ‡J‡JˆJˆJˆ~Jˆ~Jˆ~Jˆ­Œ´ñëò`‰Â½ÄÂN;R#'16g>s{Jˆ|K‹|K‹|L‹†[•èàë·Ħż…t‹èçèwj{+1#)R4_vJ‰ËıÒôñö€fŒ'.-4b>sxLŒ”rġòö‘wŸ4!>#*N3^sK‹wNwNwOvOvO‘vO‘vO‘vO‘uO’uO’‡f íéñ×ÎŜC0R (B-TmKŠtP“´ÑŜ×ċQ>d(.!<`D}qP“rQ•rQ•rQ•wXšĜÏâĈĵÒ9+K *I5blO’„kĤíô˜ŠĴ*9+G5bjO’oS™oS™nS™nT™–ƒµôò÷qcŠ"0/$C^H†lSšmU›lU›lU›lUœlUœlUœkUœkUœkUkVjVjVjVžjVžjVžiVžiVž}mĞìêó›’ĥ…’áápk€žœáàE@WÍÌ£Ż_[mèèê^Zp-/(JZNeXĦeY£eY£”‹żïġlf4'#@QI†cY˘cZcZcZcZİäîFBe/;6d]VŸa[§ œÊííôVS}0+)KTP“_[§`\İ_\İ_\İ`^ŞğşÚŬÜê**M4BBx\[§^]Ğ]^Ğ]^ĞY[›WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸K)LƒHƒƒH„‚H„‚H„‚H„‚H„‚I…I…Í·Ï˙˙˙IJĈëéìŝŝŝu`w)+9 ;n?tI†J‡J‡J‡šqĦûúûíçî½²ż˙˙˙ÂşÄ16*.Y5b{J…éàë˙˙˙ ˆĤ/45 :h?t{K‰²–ğ˙˙˙ĠÊÙ;&B*0Z8gwK‰zMŒzMzMzMyMyMŽyNŽyNŽyNŽxNŽš{ĞŭŭŝóġR;^&.I0YqK‰‰fžóïġüüŭŒz˜%.3"?dC{tOuP’uP’uP’šŻûúüĉáëB0Q#-L5boN½­Ì˙˙˙àÛĉ9*H$/L6cmOrR–qR–qR–rT—ÖÍà˙˙˙“†&32%DaH„oR—oS˜oS˜oS˜oS™nT™nT™nT™nTšnTšmTšmTšmTšmU›mU›lU›lU›lUœ—‡ıŭüŭàŬèż½Ĉ˙˙˙żĵÇñòüüü›—ŭŭŭÔÒÙÂÀÇ˙˙˙‡ƒ–!21)L\MŽgVŸhW hX ¸ħÒ˙˙˙ıµÊ$9/)KXLŒeWĦfY˘fY˘eY£odİìëôŭüŭ[Vw2=7d_Uœe[¤ĈŜ˙˙˙Ħž· 53/WYS—b[Ĥb[Ĥb[Ĥa[§vp²óóĝ˙˙˙.,Q 8DBx^Z¤`\İ_\İ_\İ\Z™WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸J*MI…I†€I†€I†€I†€I†€J‡€J‡êâì˙˙˙ËıÎîëïŝŝŝ†k‹E(JT2ZvF~K‰~K‰}K‰}K‰ħ“¸ŭüŭïêñĊ¸É˙˙˙ÊÀÍK.TF+Oi@v{L‰èàë˙˙˙ĤŻI.TM0XoFzMŒËşÓ˙˙˙ÚÏßT7bH-TgByuKŠuL‹wMuL‹vMwMuLŒvNŽuNŽvNŽwO˜{­ŭŭŝóġcHwA+P[>rrNމiĦġò÷˙˙˙Ĥ•´B.TN6ckKˆrO‘rP’pO‘pO¤ıŝŝŝçâìYBq@.TY@tnP“żħ˙˙˙ñîôT@lA/X\D|lP’oR•oR–kP“pU˜ċàì˙˙˙œŽ²B2[G6cdMŒmS™nTšmTšmTšmU›mU›lU›lU›lU›lUœlUœkUœkUœkVkVkVjVjV³¨ÍŝŝŝäâìĈÑ˙˙˙ĈÂÒòòôüüŭşĥĈ˙˙˙ÚĜâßŬċ˙˙˙—Ż:2\C9h_Q•fX˘fX˘gZ˘ĠÒċ˙˙˙Á½Ô=6bD5[D:j5-L:2Z<3]:2TA7f4-R;3]\P’gYĦ—À†|ħ=5a#8@9h`U›eY£‡~·Ž…ğj^Ĥi_Ĥ`VœB;d:7d75T@=mPOtgf_\’^ZĤ_\İ_\İ_\İ_]İ_]Ş_]Ş^]Ş^]Ş^]Ş^]Ş^]Ğ]]Ğ]]Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^Ĵhi³ŽĈrsŻ[\ƒvx‘LN{gi‚kmŒ>BtghOQzLOvoq‹QS€,0W59iRX˘Y`°Y`°X`°ovğ‡ŒÇip¸[c²]fŻr28Z;Dz,4`/6\4>sW^~mt™L\İQcĥRd·Rd·Rd·Rd·Qd¸Pa§WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸85a`\¨`\¨`\¨`\¨`\¨`\¨`\İ_\İxvĥ­Ó_]–{z˜˜˘*)J2((IPO‘]\İ^]Ş^]Ş^]ĞfeŻĤĤÑ~~µTTx··>>Y!!=6BBzY[§Ż°Öääñdf—8"#@JLŒZ]Ğ[^­[^­[^­ˆŠÄĈÇâNQ‹ˆ‰˜…†•:<[‡‡“QSkDF^Œ™78X4&)LMS˜gnĥÚÜíżÁÜ26`026dRZĤX`ħX`ħXaħ`jµŞĠw~ıTX}ışÁ:=[acvĦ˘­7:[4(-SLWŸUa²Vb³Vb³Ub´Ub´Ub´yƒĴÖR[•ƒ†•ˆ‹™+1Q°·`d}$B9X‹ž:Ff8$4`A_ŻHiÂHjÂHjÂHjÂHjÂGjÂGf°WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸.:kPfıPfşPfşPfşPfşOfşOfşOfş³½áûûŭÎċĉêëìîCLi7!+OBVŸMeşNgğNgğNgğp„Èġ÷ûÛàî§­½üüüŽ“£#A :6HƒLe·Ŝóŝŝŝ†“ĵ#A&G=S™KgğLh½LhKhÓÚïùúüˆ–½áâĉìíĝĝùµıÄÀËúúû\e€8,R@[ĤuÎüŭŝîĝ7Gt6)2LŒDhżFkÄEkÄEkĊEkĊEkĊEkĊElĊElĊElĊDlĊDlĊDlĈDlĈDlĈDlĈDlĈDlĈClĈClĈClÇu“ĠùúŭÌĠè³ıĊúúû„Ž˘ÍÏĠĝùùƒŒŸö÷÷ÊÏ×İıúúûw‚™93]9a²@mÈAnÉAnÉ@nÉ@nÊFsËßçöóöûwˆŞìíïċç돖Ĥúúû•Ÿħ9/V6`Ż>nÊ?oË?oÌ?oÌ>oÌ>oÌHvÎñôûìĝt„˘ôġöÑÖŬ˘¨´úúû{‡77e7eş=pÎ=pÎ=pÎ=pÎoÌ>oÌ>pÌ>pÌ>pÌ>pÌ>pÌ>pÍŬĉö˙˙˙ÇÓëêìñŝŝŝax 0X#Av7fĵ=pÍ=pÍ=pÍ=pΑŭŭŝô÷ûıÄÖ˙˙˙şÄĠ9h3^1\¨q4fğk•Ûŭŭŝîòú5W’)L$Gƒ6lÇ9rÑ9rÑ9rÑaŽÚúûŭòġûşĊÙ˙˙˙ĵÇÙïñô˙˙˙]v 2[ Ax3iÀ8sÒ8sÒ8sÒ8sÓ8sÓ8sÓĵ˙˙˙½Íċñóġĝùú³ÀĠ˙˙˙ÍÔà~ÁœĥÒżÜI”äÎù{µó]¤ïËáùIšñ~è€ìƒƒƒƒƒƒ „‹ż÷ğÚúD—ñÀÛĝu²ófİñÖèûV˘ò~è€ëƒƒƒƒƒƒƒ"†žÊĝŞùIšÊáù_§òy´òÎúJ›~è€ìƒƒƒƒƒƒƒ }Ú WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸ Nއ÷‡÷‡÷‡÷‡÷‡÷‡÷‡÷'÷JĦ÷tÎ*T{C_z Aw/V =quÖ†ö‡÷‡÷‡÷Š÷\Ğù.èR‘RiEs7e/Va³„ò0•÷L£ĝ‰÷‡÷‡÷‡÷‡÷‡÷‡÷‡÷‰÷;šĝ‡÷-“÷(÷‡÷>œĝˆ÷!÷5—ĝ‡÷‡÷‡÷‡÷‡÷F ĝ9™ĝ‡÷‡÷‡÷‡÷‡÷‡÷‡÷‡÷.”÷'÷‡÷>œĝ‡ĝ"Žĝ3–ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝˆĝ=›ù‡ĝ'ĝ-“ĝ‡ĝ;šù‰ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‡ĝ‹ĝGŸ÷'~ĠDrRk„Gz>b%R~sÔ:™ĝ‰ĝŠĝ9šùˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝĝ6™ùˆĝ4—ĝ"ĝˆĝ?ùˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝ$ĝ1–ĝˆĝ8šùŒĝ‹ĝ;›ùˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝˆĝá WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸ P’ŠŝŠŝŠŭŠŭŠŭŠŭŠŭŠŭ‹Ĉŝçóŝl£Ĝ£²ÀÖÜ"Nx'H8h tÖˆûŠŭŠŭŠŭ9žŭàŝşÙöX€Ĥĉêj†Ÿ/W*M _݆÷ŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭIŭäñŝİÊêgšçêXx˜(I6d sÔ‰üŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠüŠüŠüŠüŠüŠüŠüŠüŠüŠüŠüŠüŠüƒċ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸P’‹ŝ‹ŝ‹ŝ‹ŝ‹ŝ‹ŝ‹ŝ‹ŝèŝ˙˙˙ş×òĉëŝŝŝK{¨2\Jˆ }ĉŠŭ‹ŝ‹ŝ‹ŝiĥŝüŭŝñĝŝĈÜ˙˙˙°Ä×;m8g nɉû‹ŝ‹ŝ‹ŝ‹ŝ‹ŝ‹ŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŝŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭ~Àŭŝŝŝçñú¸È×˙˙˙šµÎ2\Gƒ|ä‰üŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭŠŭƒĉ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸ Nˆùˆùˆùˆùˆùˆùˆùˆùñĝŝ˙˙˙°ĠĝèïöùûüH Q•eşƒñˆùˆùˆùˆù„ÁûŝŝŝêôŝÍë˙˙˙¨Çĉ [Ĥ XĦ|‡ĝˆùˆù†÷„ò„ó‡ĝˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆù…ġƒ†öˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆùˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúˆúšÌü˙˙˙ßîüıçŝŝŝ‘ğ R–eı‚í„ñ†ġ…ó„ò†ġ„ñ„ò†ġ„ò†ġ‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‰ú‚ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸KŠƒƒƒƒƒƒƒƒˆ÷ôùŝW ìÏŜîÄĠĉ oÂT›_Ż|䃃ƒƒ=•òéóŭ£Ì÷|­àóöúP‹Ê^ĴT›tĠîƒ‚ïyß_Żcµ|ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒñƒñ€ímÉ[¨o΁îƒñƒñƒñƒñƒñƒñƒñƒñƒñƒñƒñƒñƒñƒñƒñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ñ„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„ò„òJžô÷ŝżó´Ûíò÷A…ÌU]ŞiÀ[§jÂb´_ŻmÉ\¨`²lÈ]Ğmʁï„ó„ó„ó„ó„ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ó…ô…ô…ô…ô…ôŜ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸G‚){â){â){â){â){â){â){â){â=‡ä~Żì)oĊSq–Lf…Gƒ0Xr+nÉ/xÜ/xÜ/xÜ/xÜ/xÜ/xÜ/xÜ/xŬ/xŬ/xŬ/xŬ/yŬ.yŬ.yŬ.yŬ.yŬ.yŬ.yŬ.yŬ.yŬ.yŜ.yŜ.yŜ.yŜ.yŜ-yŜ-yŜ-yŜ-yŜ-yŜ-zŜ-zŜ-zŜ-zŜ-zß-zß-zß,zß/uÌ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸+ȯßûüŭĈÑĉ­´Â˙˙˙ħşÊëíïùúú˘Ĵ½ŝŝŝÉÎ×Ħ¨µ˙˙˙‘›ŻÚÜáġġ÷L_#A#Bx8iÁJ‡R`°ScµScĥScĥScĥScĥSdĥSdĥRd·Rd·Rd·Rd·Rd·Rd·Rd·Qd¸Qd¸Qd¸Qe¸Qe¸Qe¸QeıPeıPeıPeıPeıPeıPeıPeşOeşOfşOfşOfşOfşOfşOfğNfğNfğNfğNfğNfğNfĵNgĵMgĵMgĵMgĵMgĵMg½Mg½Mg½Lg½Lg½Lg½Lg½ĥÂä˙˙˙éìöÄÉÙ˙˙˙ĵĜñòġüüŭ³şÏ˙˙˙ĠÙäÙÜä˙˙˙²şÎĝùúŝŝŝŽµ'8g8Q•Gf½IiÁIiÁIiÁHjÁHjÁHjÂHjÂHjÂHjÂGjÂGjÂGjGjGjGkFkFkFkFkÄFkÄFkÄFkÄEkÄEkÄEkĊEkĊElĊElĊElĊDlĊDlĈDlĈDlĈDlĈDlĈClĈClÇCmÇCjĥ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺¸>1ZkVjVjVjVžjVžjVžjVžjVžÁı×ûûü‘äáêéçíeWD9iK?tcR˜hW hW hW hX ˆ|µöġùÎÉàĴĤĊŭŭŭ•°J@vB8hZMfYĦÚ×èŭŭŭ˜żYNZO’cWŸeY£eY£eY£dZ¤dZ¤dZ¤dZ¤dZ¤dZ¤dZcZcZcZcZc[c[Ĥb[Ĥb[Ĥƒ}¸ĝĝûéèòd^ TO‘[V`ZĤa\§a\¨a\¨`\¨`\¨`\¨`\¨`\İ`\İ`\İ_]İ_]İ_]İ_]Ş_]Ş_]Ş^]Ş^]Ş^]Ş^]Ğ^]Ğ^^Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\^­\_­\_­[_­[_­[_­[_[_Z_Z_Z_Z_ŻZ`ŻZ`ŻY`ŻY`ŻY`ŻY`°Y`°X`°X`°X`°XaħˆŽÇùùüşŬħ´Íûüü’ğèéï÷÷ùĤŞÇŝŝŝÌÎßÏÑßüüŭ”šÀÓĠâêëò`i£7@vDP“Ra²TcµTcµTcµScµScĥScĥScĥScĥRcĥRd·Rd·Rd·Rd·Rd·Qd¸Qd¸Qd¸Qd¸Qe¸QeıPeıPeıPeıPeıPeşOeşOeşOeşOfşOfğOfğNfğNfğNfğNfĵNfĵNfĵMgĵLd­ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ·ş·D-SwNwOvOvO‘vO‘vO‘vO‘vO‘Šj£ÀŻÍoO†‰}“Ÿ˜L6^1"><)LfF‚sO’tP“sP”sQ”uS•¸§ÉwİgT|¨³gXx;)M/!>W>qoP“œ‡ĥµÒ|`žpQ•oQ–pR—pR—pS—pS—oS˜oS˜oS˜oS˜oS™oS™nS™nT™nT™nTšnTšmTšmTšmTšmT›rZžı­ÏĤ˜ÂkTškT›lUœlUœkUœkUœkUkVkVjVjVjVžjVžjVžiVžiVžiWŸiWŸiWŸhWŸhWŸhW hW hW gX gX gXĦgXĦgXĦfXĦfX˘fX˘fX˘fY˘eY˘eY£eY£eY£eY£eY£dY¤dZ¤dZ¤dZ¤dZ¤cZcZcZcZc[Ĥb[Ĥb[Ĥb[Ĥb[Ĥb[§a[§a[§e`ݵ³Ġuqİ\Z{ĞŞ·YX„ƒ–š™ĞECiݨ´poŒji‚ĤĤ´NN|onˆ‹‹£;;l'&G==pYZ¤]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^­\_­\_­[_­[_­[_[_Z_Z_Z_Z`ŻZ`ŻY`ŻY`ŻY`°Y`°Y`°X`°X`°XaħXaħXaħWaħWa²Wa²Wa²Wa²Vb²Vb³Vb³Vb³Vb³Ub³S` WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàâ⸺·I+N~Jˆ~Jˆ~Jˆ~J‰~J‰~K‰}K‰}K‰‘gœÍşÒ}^†~sœ•ž?*F$)28g?tzK‰{LŒ{LŒ{LŒ}NĵĊ—·ZFbŞĴ`Rf,3$*R4`vKŠyMŽyOŽxNxNxNxNwNwNwNwOwOvO‘vO‘vO‘vO‘vO‘uO’uO’uP’uP’uP’tP“tP“tP“tP“uQ“tR”sQ”sQ”sQ”sQ•rQ•rQ•rQ•rR•rR–qR–qR–qR–qR—qR—pR—pR—pS—pS˜pS˜oS˜oS˜oS˜oS™nS™nT™nT™nTšnTšmTšmTšmT›mT›lU›lU›lU›lUœlUœkUœkUœkUkVkVjVjVjVžjVžjVžiVžiWŸiWŸiWŸhWŸhWŸhW hW hW gX k]£ı²Ó“°RMcݧ°RMi|‰—• :5PĤ­hdx63H›?:Ydbr¤£51O,40X[R˜cZcZb[Ĥb[Ĥb[Ĥb[Ĥb[§a[§a[§a[§a\¨`\¨`\¨`\¨`\¨`\İ_\İ_]İ_]İ_]Ş_]Ş^]Ş^]Ş^]Ğ^]Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\_­\_­[_­[_­[_[_X]  WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ¸ı·K*L‚I…I…I…I…I…I†€I†€I†Ë´Íŝŝŝ£‹§ŜÛßùĝùgUi$'37k>r}I†~Kˆ~K‰~K‰šs£÷ôĝÛŜĦ”¤ŝŝŝ²Ğ´-2%)U4_yJ‡|L‹{L‹{LŒ{LŒ{LŒ{MŒzMŒzMzMzMzMyMyMŽyNŽyNŽyNŽxNŽxNxNxNwNwOwOwOwOvO‘vO‘vO‘vO‘vO‘uP’uP’uP’uP’uP“tP“tP“tP“tQ“sQ”sQ”sQ”sQ”sQ•rQ•rQ•rR•rR•qR–qR–qR–qR–qR—pR—pS—pS—pS˜pS˜oS˜oS˜oS˜oS™nT™nT™nT™nTšnTšmTšmTšmT›mU›mU›lU›lU›lUœlUœkUœkUœkVkVjVjVjVžjVž•‡şùùûĈÁÔĤ¤Żŝŝŝ­Şĥċäçöö÷›˜ĤŝŝŝÄˊ‡”úúú…’ÍÌóòôMHb+70X]R—eY£eY£eY£dY¤dZ¤dZ¤dZ¤cZcZcZcZcZĤb[Ĥb[Ĥb[Ĥb[Ĥa[§a[§a[§a\§`\¨`\¨`\¨`\¨`\İ_\İ_\İ_]İ_]Ş^]Ş^]Ş^]Ş^]Ğ]]Ğ]^Ğ]^Ğ]^Ĵ]^ĴY\ž WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ¸ı·I*NJ‡J‡J‡JˆKˆ~Kˆ~Kˆ~Kˆûúû˙˙˙ÒĊĠìêíŝŝŝzf€/4B(IoD{{K‰|L‹|L‹|L‹½ĤĊ˙˙˙ġòöÄşÇ˙˙˙ĽÇ7#?2:_B;l_VžcZcZcZb[Ĥb[Ĥb[Ĥb[Ĥb[§a[§a[§a[§a\§`\¨`\¨`\¨`\¨`\İ_\İ_]İ_]İ_]Ş^]Ş^]Ş^]Ş^]Ğ^]Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^­\^­[_­[_­[_­[_X]Ÿ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ¸ı·E-RxNxNxNxNxNwOwOwOÙÎà˙˙˙µĦÁïìñŭüŭŠršX;laAwrMuP’uP’uP’uP’Ÿ†³üûüáÚçż³Ê˙˙˙ÉÀÒY>rX>rjK‰rP“sQ”rQ•rQ•rR•rR•rR•rR–qR–qR–qR–qR–qR—pR—pS—pS—pS—pS˜oS˜oS˜oS˜oS˜oS™nT™nT™nT™nT™nTšmTšmTšmTšmTšmU›lU›lU›lU›lUœlUœlUœkUœkUœkVkVkVjVjVjVžjVžjVžjVžiWŸiWŸiWŸiWŸiWŸhW hW hW hW hX gXĦgXĦgXĦgXĦgXĦfX˘fX˘fY˘fY˘fY˘eY£eY£eY£eY£dY¤dZ¤dZ¤dZ¤dZ¤cZcZcZcZcZb[ĤŸ›ÈŭŭŝÑÏÄÂÖ˙˙˙Á×ôûûüı¸ÒŝŝŝĜ×ĉÜÜèŝŝŝ¨ĤÈççî÷÷útrFE~QP“\[¨^]Ş^]Ğ^]Ğ]^Ğ]^Ğ]^Ğ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\^­\_­[_­[_­[_­[_[_Z_Z`Z`ŻZ`ŻY`ŻY`ŻY`°Y`°Y`°Xa°Xa°XaħXaħXaħWaħWa²Wa²Wa²Wb²Vb²Vb³T_£ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ·ı·?1YmU›lU›lU›lU›lUœlUœlUœlUœżĥÔ˙˙˙ž‘îġìéòub˘hT›iU›jVžjVžjVžjVžjVž…v°úùûÒÍâş²Òŝŝŝ •ÁfUfUžgVŸhW hX hX gX gXĦgXĦgXĦgXĦgXĦfX˘fX˘fY˘fY˘fY˘fY˘eY£eY£eY£eY£eY£eY£eZ¤dZ¤dZ¤dZ¤dZ¤dZdZcZcZcZc[c[Ĥb[Ĥb[Ĥb[Ĥb[Ĥb[Ĥb[§a[§a[§a[§a\§a\¨`\¨`\¨`\¨`\¨`\¨`\İ_\İ_]İ_]İ_]İ_]Ş^]Ş^]Ş^]Ş^]Ş^]Ş]^Ğ]^Ğ]^Ğ]^Ğ]^Ğ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\^Ĵ\_­[_­[_­[_­[_­[_Z_Z_Z_Z`Z`ŻY`ŻY`ŻY`ŻY`Ż„‰Äŭŭŝ½ÀßÂĊáüüŭ‹‘ÇËÎĉċçórzĵûûŭŞŻ×ŞŻ×ööút~Ŝáóóùep¸T`°TaħUb´Ub´Uc´Uc´UcµTcµTcµTcµTcµTcĥTcĥScĥSdĥSdĥSdĥSd·Sd·Rd·Rd·Rd·Rd¸Re¸Qe¸Qe¸Qe¸Qe¸QeıPeıPeıPeıPeıPfşOfşOfşOfşOfşOfğNfğNfğMcŞ WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ·ı·66b^]Ş^]Ğ]]Ğ]^Ğ]^Ğ]^Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\^Ĵ\^­\_­\_­\_­[_­[_­[_­[_[_[_[_Z_Z_Z`ŻZ`ŻZ`ŻZ`ŻZ`ŻZ`ŻY`ŻY`°Y`°Y`°Y`°Y`°Y`°Xa°Xa°XaħXaħXaħXaħXaħXaħWa²Wa²Wa²Wa²Wb²Wb²Wb²Vb³Vb³Vb³Vb³Vb³Vb³Ub³Ub´Ub´Ub´Uc´Uc´Uc´Tc´TcµTcµTcµTcµTcµTcµScĥScĥSdĥSdĥSdĥSdĥSdĥRd·Rd·Rd·Rd·Rd·Rd·Qd¸Qe¸Qe¸Qe¸Qe¸Qe¸Qe¸PeıPeıPeıPeıPeıPeşOeşOfşOfşOfşOfşOfşOfğNfğNfğNfğNfğNfĵNgĵMgĵMgĵMgĵMgĵMgĵMg½Mg½Lg½Lg½Lg½LhLhLhKhKhKhKhżKhżKhżJhżJiżJiżJiÀJiÀJiÀIiÀIiÀIiÀIiÀIiÁIjÁHjÁHjÁHjÁHjÂHjÂHjÂGjÂGjÂGjÂGjGkGkGkFkFkFkÄFkÄFkÄFkÄEkÄEkÄEkĊEkĊElĊElĊDlĊDlĈDlĈDh´WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ·ı·,;lMgĵMgĵMg½Mg½Mg½Lg½Lg½Lg½Lg½Lg½Lg½LgLgLhLhKhKhKhKhKhKhżKhżKhżKhżKhżJhżJhżJhżJhÀJhÀJiÀJiÀJiÀJiÀJiÀIiÀIiÀIiÁIiÁIiÁIiÁIiÁIiÁIiÁIiÁHiÁHiÂHjÂHjÂHjÂHjÂHjÂHjÂGjÂGjÂGjGjGjGjGjGjFjFjFjFkÄFkÄFkÄFkÄFkÄEkÄEkÄEkÄEkÄEkĊEkĊEkĊDkĊDkĊDkĊDlĊDlĈDlĈDlĈDlĈClĈClĈClĈClÇClÇClÇClÇClÇBmÇBmÇBmÈBmÈBmÈBmÈBmÈBmÈBmÈAmÉAmÉAmÉAmÉAnÉAnÉAnÉAnÉAnÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nÊ@nË@oË@oË?oË?oË?oË?oË?oË?oÌ?oÌ?oÌ?oÌ>oÌ>oÌ>pÌ>pÌ>pÌ>pÍ>pÍ>pÍ=pÍ=pÍ=pÍ=pÍ=pÍ=pÎ=pÎoË>oÌ>oÌ>pÌ>pÌ>pÌ>pÌ>pÌ=pÍ=pÍ=pÍ=pÍ=pÍ=pÍ=pÍ1ZlUœlUœkUœkUœkVkVkVkVjVjVjVžjVžjVžjVžjVžiWžiWžiWŸiWŸiWŸiWŸhWŸhW hW hW hW hX gX gXĦgXĦgXĦgXĦgXĦfXĦfX˘fX˘fY˘fY˘fY˘eY˘eY£eY£eY£eY£eY£dY¤dY¤dZ¤dZ¤dZ¤dZ¤cZcZcZcZcZbZĤb[Ĥb[Ĥb[Ĥb[Ĥb[Ĥa[§a[§a[§a[§a[§`\¨`\¨`\¨`\¨`\¨`\İ_\İ_\İ_\İ_\İ_]İ_]Ş^]Ş^]Ş^]Ş^]Ş^]Ğ]]Ğ]]Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\^­\^­\^­[_­[_­[_[_[_Z_Z_Z_ŻZ_ŻZ`ŻZ`ŻY`ŻY`ŻY`°Y`°Y`°X`°X`°X`ħXaħXaħXaħWaħWa²Wa²Wa²Wa²Va²Vb³Vb³Vb³Vb³Ub³Ub´Ub´Ub´Ub´Uc´TcµTcµTcµTcµTcµScĥScĥScĥSdĥSdĥRd·Rd·Rd·Rd·Rd·Rd·Qd¸Qd¸Qe¸Qe¸QeıPeıPeıPeıPeıPeıOeşOfşOfşOfşOfğOfğNfğNfğNfğNfğNgĵMgĵMgĵKcŞWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ·ıĥE-SwNwNwOwOwOvO‘vO‘vO‘vO‘vO‘vO’uP’uP’uP’uP’uP“tP“tP“tP“tP“tQ“tQ”sQ”sQ”sQ”sQ”sQ•sQ•rQ•rQ•rR•rR–rR–qR–qR–qR–qR—qR—qR—pS—pS—pS—pS˜pS˜oS˜oS˜oS˜oT™oT™nT™nT™nT™nTšnTšnTšmTšmUšmU›mU›mU›lU›lU›lUœlUœlUœkVœkVœkVkVjVjVjVjVžjWžjWžiWžiWžiWŸiWŸhWŸhWŸhW hX hX gX gX gXĦgXĦgXĦfXĦfY˘fY˘fY˘fY˘eY˘eY£eY£eY£dZ£dZ¤dZ¤dZ¤dZ¤cZ¤cZcZc[c[b[Ĥb[Ĥb[Ĥb[Ĥb[Ĥa[§a[§a\§a\§`\¨`\¨`\¨`\¨`\¨_\İ_\İ_]İ_]İ_]Ş^]Ş^]Ş^]Ş^]Ğ]]Ğ]]Ğ]^Ğ]^Ğ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\^­\^­[^­[_­[_[_[_Z_Z_Z_ŻZ_ŻZ_ŻY`ŻY`°Y`°Y`°Y`°X`°X`ħX`ħX`ħWaħWa²Wa²Wa²Wa²Wa²Va³Va³Vb³Vb³Ub´Ub´Ub´R_˘WXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ·ı·I+NJˆ~Jˆ~Jˆ~Jˆ~K‰~K‰}K‰}K‰}K‰}KŠ}KŠ|KŠ|KŠ|LŠ|L‹|L‹{L‹{L‹{L‹{LŒ{LŒzLŒzMŒzMŒzMzMzMyMyMŽyMŽyMŽyNŽxNŽxNxNxNxNwNwNwOwOwOvO‘vO‘vO‘vO‘uO‘uO’uP’uP’uP’tP“tP“tP“tP“tP“sQ”sQ”sQ”sQ”sQ•rQ•rQ•rQ•rR•rR–qR–qR–qR–qR—qR—pR—pR—pS—pS˜oS˜oS˜oS˜oS™oS™nS™nT™nT™nTšnTšmTšmTšmT›mT›lT›lU›lUœlUœlUœkUœkUœkUkUkVjVjVžjVžjVžjVžiVžiVŸiWŸiWŸhWŸhW hW hW hW gWĦgXĦgXĦgXĦfXĦfX˘fX˘fX˘fX˘eY£eY£eY£eY£dY¤dY¤dY¤dZ¤dZcZcZcZcZbZĤbZĤb[Ĥb[Ĥb[§a[§a[§a[§a[¨`[¨`\¨`\¨`\¨`\İ_\İ_\İ_\İ_]Ş^]Ş^]Ş^]Ş^]Ğ^]Ğ]]Ğ]]Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^­\^­\^­[_­[_­[_[_Z_Z_W\žWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââ·ı·J*MI…I…I…I†I†€I†€I†€I†€J‡€J‡J‡J‡J‡JˆJˆ~Jˆ~Jˆ~Kˆ~K‰~K‰}K‰}K‰}KŠ}KŠ}KŠ|LŠ|LŠ|L‹|L‹|L‹{L‹{L‹{LŒ{LŒ{MŒzMŒzMzMzMzMyMyMŽyNŽyNŽxNŽxNxNxNxNwNwNwOwOwOvO‘vO‘vO‘vO‘vO‘uP’uP’uP’uP’tP“tP“tP“tP“tQ“sQ”sQ”sQ”sQ”sQ•rQ•rQ•rR•rR–qR–qR–qR–qR–qR—pS—pS—pS—pS˜oS˜oS˜oS˜oS™oT™nT™nT™nTšnTšmTšmTšmTšmU›mU›lU›lU›lUœlUœkUœkUœkVkVkVjVjVžjVžjVžiVžiWŸiWŸiWŸiWŸhWŸhW hW hX gX gXĦgXĦgXĦfXĦfX˘fX˘fY˘fY˘eY£eY£eY£eY£dY¤dZ¤dZ¤dZ¤cZcZcZcZcZĤb[Ĥb[Ĥb[Ĥb[§a[§a[§a[§a\§`\¨`\¨`\¨`\¨`\İ_\İ_\İ_]İ_]Ş^]Ş^]Ş^]Ş^]Ğ]]Ğ]^Ğ]^Ğ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\^­Y\œWXXàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââĠÖÖ  F0CKˆKˆ~Kˆ~Kˆ~K‰~K‰~K‰}K‰}K‰}LŠ}LŠ}LŠ|LŠ|LŠ|L‹|L‹|L‹{L‹{M‹{MŒ{MŒ{MŒzMŒzMŒzMzMzMzNyNyNŽyNŽyNŽxNŽxNŽxNxNxOxOwOwOwOwOvOvO‘vP‘vP‘vP‘uP‘uP’uP’uP’uP’tP“tQ“tQ“tQ“tQ“sQ”sQ”sQ”sQ”rR•rR•rR•rR•rR•qR–qR–qR–qR–qS—pS—pS—pS—pS—pS˜oS˜oS˜oT˜oT™nT™nT™nT™nTšnTšmTšmUšmUšmU›lU›lU›lU›lUœlUœkVœkVœkVkVjVjVjVjVžjWžiWžiWžiWŸiWŸhWŸhWŸhW hX hX gX gXĦgXĦgXĦfXĦfX˘fY˘fY˘fY˘eY£eY£eY£eY£dY£dZ¤dZ¤dZ¤dZ¤cZcZcZc[b[Ĥb[Ĥb[Ĥb[Ĥb[§a[§a[§a\§a\¨`\¨`\¨`\¨`\¨`\İ_\İ_]İ_]İ_]Ş^]Ş^]Ş^]Ş^]Ğ]]Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^­\^­[_­[_­[_[_Z_Z_Z_Z`ŻU[Ÿ ```àââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââ"""""vPwOvOvOvO‘vO‘vO‘vO‘uO‘uP’uP’uP’uP’tP’tP“tP“tP“tP“tP“sQ”sQ”sQ”sQ”sQ”sQ•rQ•rQ•rQ•rR•rR–qR–qR–qR–qR–qR—pR—pR—pR—pS—pS˜pS˜oS˜oS˜oS˜oS™oS™nS™nT™nT™nTšnTšmTšmTšmTšmT›mT›lU›lU›lU›lUœlUœkUœkUœkUœkVkVjVjVjVjVžjVžiVžiVžiWŸiWŸiWŸhWŸhWŸhW hW hW hW gX gXĦgXĦgXĦgXĦfX˘fX˘fX˘fY˘fY˘eY£eY£eY£eY£eY£dY¤dZ¤dZ¤dZ¤cZ¤cZcZcZcZbZĤb[Ĥb[Ĥb[Ĥb[Ĥa[§a[§a[§a[§a\¨`\¨`\¨`\¨`\¨`\İ_\İ_\İ_\İ_]Ş_]Ş^]Ş^]Ş^]Ş^]Ğ^]Ğ]^Ğ]^Ğ]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^­\^­\_­[_­[_­[_[_Z_Z_Z_ŻZ`ŻZ`ŻY`ŻY`ŻY`°Y`°Y`°X`°XaħXaħXaħXaħWaħWa²Wa²Wa²Wb²Vb²Vb³Vb³Vb³Vb³Ub´Ub´Ub´HQ~žŸŸàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàâ QChkUœkUkVkVjVjVjVjVžjVžjVžiVžiVžiWžiWŸiWŸiWŸhWŸhWŸhWŸhW hW hW hW gX gX gXĦgXĦgXĦgXĦfXĦfX˘fX˘fX˘fY˘fY˘eY˘eY£eY£eY£eY£dY£dY£dY¤dZ¤dZ¤dZ¤cZ¤cZcZcZcZcZbZĤb[Ĥb[Ĥb[Ĥb[Ĥb[Ĥa[§a[§a[§a[§a[§`\¨`\¨`\¨`\¨`\¨`\İ_\İ_\İ_\İ_\İ_]İ^]Ş^]Ş^]Ş^]Ş^]Ş^]Ğ]]Ğ]]Ğ]]Ğ]^Ğ]^Ĵ]^Ĵ\^Ĵ\^Ĵ\^Ĵ\^­\^­[^­[_­[_­[_[_[_Z_Z_Z_ŻZ_ŻZ_ŻZ`ŻY`ŻY`ŻY`°Y`°Y`°X`°X`°X`ħXaħXaħXaħWaħWa²Wa²Wa²Wa²Va²Vb³Vb³Vb³Vb³Vb³Ub³Ub´Ub´Ub´Uc´Uc´TcµTcµTcµTcµTcµScĥScĥSdĥSdĥSdĥSd·Rd·Rd·Rd·Rd·Rd¸Qd¸Qe¸Qe¸Qe¸QeıQeıPeıPeıPeıPeıPfşOfşOfşOfşOfşOfğNfğNfğNfğNfğNgĵNgĵMgĵMgĵNe(ÖĜĜàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââĠÖÖ$$- GFy\^Ğ\^­\^­\^­[_­[_­[_­[_[_[_[_Z_Z_Z_Z_Z_ŻZ_ŻZ`ŻY`ŻY`ŻY`ŻY`ŻY`°Y`°Y`°X`°X`°X`°X`°XaħXaħXaħWaħWaħWaħWaħWa²Wa²Wa²Va²Va²Vb²Vb³Vb³Vb³Ub³Ub³Ub³Ub´Ub´Ub´Ub´Tb´Tb´TcµTcµTcµTcµTcµScµScµScĥScĥScĥScĥScĥRdĥRd·Rd·Rd·Rd·Rd·Rd·Qd¸Qd¸Qd¸Qd¸Qe¸Qe¸QeıQeıPeıPeıPeıPeıPeşPeşPeşOfşOfşOfşOfşOfğOfğNfğNfğNfğNfğNfĵNfĵNgĵMgĵMgĵMgĵMgĵMg½Mg½Mg½Lg½Lg½Lg½Lh½LhLhLhKhKhKhKhżKhżKhżJhżJiżJiżJiÀJiÀJiÀJiÀIiÀIiÀIiÁIiÁIiÁIjÁIjÁHjÁHjÂHjÂHjÂHjÂHjÂHjÂGjÂGjGjGkGkGkFkFkÄFkÄFkÄFkÄFkÄEkÄEkĊElĊElĊElĊElĊElĊDlĊDlĈDlĈDlĈDlĈDmĈCmĈCmÇCf²)1;ŒàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââĵ½###$24@j;Hz;I{;I{;I{;I{;I{;I{:I{:I{:I{:I{:I{:I{:I|:I|:I|:I|:I|:I|:I|:I|:I|:I|9J|9J|9J|9J|9J|9J|9J}9J}9J}9J}9J}9J}8J}8J}8J}8J}8J~8J~8J~8J~8J~8J~8J~8J~8J~8J~8J~8J~8K~7K~7K~7K7K7K7K7K7K7K7K7K6K6K6K6L6L€6L€6L€6L€6L€6L€6L€6L€6L€6L€6L€5L€5L5L5L5L5L5L5L5L5L5L5L5L5L5L5L4M‚4M‚4M‚4M‚4M‚4M‚4M‚4M‚4M‚3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3Mƒ3M„3N„2N„2N„2N„2N„2N„2N„2N„2N„2N„2N„2N„2N„1N…1N…1N…1N…1N…1N…1N…1N…1N…1N…1N†1N†1O†1O†0O†0O†0O†0O†0O†0O†0O†0O†0O†0O†0O‡0O‡0O‡0O‡/O‡/O‡/O‡/O‡/O‡/P‡+L„#:[xyyàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââÔÖÖruw9::ĤĤàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââ½żż£¤˘ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘ŸĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£Ħ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž Ħž ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ĦŸ ˘Ÿ ˘Ÿ ˘Ÿ ˘Ÿ ˘ŸĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£˘Ħ£˘Ħ£˘˘£˘˘£˘˘£˘˘£˘˘£˘Ħ£˘˘£˘˘£˘˘£˘˘£˘Ħ£˘Ħ£˘Ħ£˘Ħ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£ĦĦ£Ħ ˘Ÿ ˘Ÿ ˘ŸĞ­ĞÒÖ×àââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââàââdddOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPPOPP"##visionegg-1.2.1/VisionEgg/data/visionegg.tif0000644000076500000240000042526411224565530020212 0ustar astrawstaffII*ŝÌ–ŝhL– Ŝ(12*Rĵ)>I†9hi‡ˆ*pĠ 'pĠ 'Adobe Photoshop 7.02002:12:26 13:40:55 adobe:docid:photoshop:cce831a2-19b5-11d7-bd99-8a84b9de3b1c 8BIM%8BIMê­ com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2002-12-26T20:38:36Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMéxHHŜ@˙î˙îRg(üHHĜ(d˙h 8BIMíGG8BIM&?€8BIMî Transparency8BIM Transparency8BIMï˙˙d8BIM8BIM x8BIM8BIMó 8BIM 8BIM' 8BIMġH/fflff/ffĦ™š2Z5-8BIMĝp˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è8BIM8BIM8BIM@@8BIM8BIMI–Ì Untitled-1̖nullboundsObjcRct1Top longLeftlongBtomlong–RghtlongÌslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong–RghtlongÌurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM8BIM ­€^€‘˙Ĝ˙àJFIFHH˙í Adobe_CM˙îAdobed€˙ۄ            ˙À^€"˙Ŭ˙Ä?   3!1AQa"q2‘ĦħB#$RÁb34r‚ÑC%’Sáñcs5˘²ƒ&D“TdE£t6ÒUâeò³„ÓuóF'”¤…´•ÄÔäôµĊĠċġVfv†–ĤĥĈÖĉö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘ĦħB#ÁRÑ3$bár‚’CScs4ñ%˘²ƒ&5ÂÒD“T£dEU6teâò³„ÓuóF”¤…´•ÄÔäôµĊĠċġVfv†–ĤĥĈÖĉö'7GWgw‡—§·Ç˙Ú ?é:@úĵïĞŬ&ÛzNĥ[e–YSœç:Ĥ—½ï-Üç9ÈıXŸQĴfáô\KKw ïŻ§7úv–?gµ\ú²îÁàôüOÂĤ•ĉĜX×daѕm[vS>ÑuÖU[ße–—]eĥYc÷ıÏzĵ£ï\8ŽB@éĜq=ïñuŝê˙ŝÊä’Ŭŝ.żÑŭ_˙ÙOü’ÂïûGŭħWŝ“OöÜZ?튿ôšpŭü˙è,ßs=ċŝ'ŝ†öżĊ×ú?Ğ˙û)˙’Kwĝş˙Gġ˙e?òKû ˙¸ÔÛé$˙a?÷ŝĜĞ˙I!îC÷ñ˙˙ §îG÷ŝ'ŝ†ġûżĊ×ú?Ğ˙û)˙’Kwĝş˙Gġ˙e?òK‘'ŝâ˙Û˙é$˙b˙ş¸˙öĊ?úIv½ñ˙ô}ÈŝôżÄ˙Ŝ³wĝş˙Gġ˙e?òIn˙_ıġ˙e?òK”ûŭĠÇ˙ĥ)˙ÒI}‹ŝê˙Û˙é$=ĝ~ô?Ç˙S÷ûÇüOŭ ë7‹ŻÜúż˙²Ÿù$·‹ŻôW˙öS˙$ıOħû‹˙lU˙¤“ŭˆÜ\ûbŻŭ$‡Ŝ!û˙˙AWÜOïñ?ô'ŞŬŝ.żÑŭ_˙ÙOü’[żĊ×ú?Ğ˙û)˙’\ŻĜ›˙qq˙튿ô’ħ7ŝâ˙Ûé$>óñ˙˙AWÜïñ?ô'ŻÄÂú‘œ÷W……ÑrŜĈï{(Ż×5²½Ì§{önwÒBëŭêû>Żġk+é8YVM•Ù^5M{\ڞĉ= ÜÇ5ˎêŻN·¨âĠV>Vì{ëŞĥ9ġia÷VĈ9Ì}o}wRïÑ]_ó‹~²>Żġ°40˙[z“A1b·­_>Š\$Ŭ‹Û…˙íĴÈ= ˙MĝżùéЈèy­Lé¸ÔÖëŻv5LeLç9Ĵ—5­ŝĞġÛŭX˙zŝ›ñ?óÓWġW7˘ÜŬĚë~Ö<Ô5Ùô/oşż˙]gè?*œĉ>Zbĉ …šÇúSnò2ɐÀ #füŽÌّöWÒĉeomgpÍï uUÏÓħŻc˜šÜĉÑkİÈİÔÜÈßSà=ğ†ĉolğnö âô×[ġ—"ǵÌħ™¸[˜ì“}ÚħÏż0¸żùUYżè~‰VÊéóÔúӛGİ™ölFTüż]ÍżÑovMîpŜÏIĥz[ż˙ÏUO'áĊr˜à"3³òÊ_+r<ÎsÁé&ZW÷[Ÿ´ñüŝÒÇ@wH`q‡iÚJkzXfG_­˜óOĜÜ]µĴÛdço÷·Ğ‹íú6ìĜ˘~M ²úšf3ĉ@òl~ÒÇOûKÁŬ%Äi:IÖ;%û$Jo·żó’MóşŝÑ£Á/Ú4x ”;8šqÒĵöŝŝrIâĉ?t7İ™6ì|+î˙BÚÙıƒ·MyŞÛf1crħìĈu€šÛkvíġ ;żGêWżúèíé}?ÖW•c,-Ĥż³ġcXûs,c'ĞMmÜÚŬùŝ˙ĉ?ÀĜİeRüüĵ[&F5xġÜ×}Ğ0ċû­n3XÜ}÷^ĉ3v=§˙IŭI%Êr€”²ĜâÊ(ž`3̆ˆÈÀÈt¤żo£Á/·R‚:kOàRŭœÑˀĝ•·˙ߓbóŝèjŭc˪΁œÖòkgŝ~Ħw?Yäı˙„3?óÛ×ġ‡ÒèYϞ÷]A]ïÖ_ùá Ïüöġ§ñ„bÂL£Ĉn˙{†WÄx½Ĝñoû_˙ÑíĴÈ= ˙MĝŸùéĞ€úıÔ\+éÚêŞĦµÖ×ِ&–´Wgğ!²ÏÑîÛù˙Îzkżúħ˙ ô/ŭ7âçĤ#SƒgDÁe üJLj-‡ŞĵŜlXÄNLG5ŸM~îŬä#)ˆËƒMÖÄÈ}}zÊhmg~f)ĊĈu8Ħ›iĤëA%΢ğ·W“ßÑßŝ‹Ô@𨲛>²ğ ü@ÁÓİ}vaiĥŽÛŽÖ—Yëï{˙œè/ú~Ÿé™^îgUuaŬ`dç[Ġ àc= b2ûÚħ1v>żSÔÈ~67İgéżÁz˙MPĥšĞè½YĴ²ëmvEĥ¸ı‚Ânşĵ‹Ċĥ9›kġl~˙äoL–~_ÑXoŜġ?çdŭÖQ. Ë‡Ù;ËĠŭĠÛ׳)ÂĊÇϳ!Ë²ÛݲÑKŬéî™úçŭŞ—W]ÏúÒ˙šŝo×ĞVêés&Û*Ĥ÷ŝÏu´´0zĠÛ^ wm³Óġooü*èŞúÂÌSûÖâגï´ĥʛC……ÌeLsÔ,ÚÇl§÷Şéìú½Ġħúaĥî™[ú{q²cş³Ë7ß{ÚßO2ÌŞkôĥ6„3a”c\ĵ£ŭYLJNÑâù×NgÜ:zĦ./ӇĤqÉ/Ŭŝ;>°dâN;pî>wŬ•uvPÌ£*>ŸĜúOSü'üžŻĤ<~ĞoN9EîfU½7 tĦ^Mn#&חŭş+/ôİoÙŬoĝM˙ŻÔġ=/[Q½7'3:üújşÜJêĤd=Ġícñwœ–ÑCĥ:ĥcıÛżIìßSÓö,èm¸]FúŭsFW[ÇÉkĊŒÛe6Ü_“i-oêÖû}_§êz ĉ_Ñ놌 }ç£ûİ"bȞ²ħk§ŻƒĠâG‘Ġ³m97š·ç)n6-neT&µöZçXïœÌ–Xßô˘ĞÔħ0ê7ùĞYŒ§ĠèßHÔÔvûšÊÁÛVŭµÇİ•îŬ˙˙Wŭ(f'’ƒ/1ËX'•$Î"{~ó>,y(ÄdÒ1Až.v%X˜ı9ôŒ{Iġ WÙp>Kßĥ6êYŝ Ïcô_éU 3ÔşŜV3sé8÷šÌĵj‹qjŭU×Ùöj}gĜĉşÚ½šûżEŭĥĥ›€ÌÌ>§‘‹Žñ‘UxgQğ2X$Üêò]üç½ß¤ŻÒC{ñşoVéö;3²Ì‹ŸnI¤ÚÒÊêgêÔÖoġ?Ĥ>ğŭJĠ™rĊpƒŽ˘uá˙AjˆgÉYısqK§òàrnúǙÔq]eXĝ8xġž˘ÚñëqÖîû;0.|²ŻwÛXïWgÓ£Ġ˙ ú½›ÒÚÚħèĊͲÊÔl~Mn>˜qû?ĜksóĠن÷úŸCôŜĤÏŝžá·§}[Ééù4ßOWgM>Ĥ;n¨mĊkŞcíóíÚìŞìŻÔĞó?àUËñqÊ9Ùm´ô|<aĉäîc[SĞu–żŞ}ĥ{Y‘‹³#ôżĦö8ËLà—ħë£û·˙ŬŻN3íÜoĉŭ(ñzeŝï¸?X]f7Hê]8䜄*˘ÌÂŬžĞ˜—ïô÷?nĈßè}?[×Ħ}e˙:çŝÌ˙Ïo\GÖÂ]…ġ…÷6Ö\ëİ%ı³`šúnû4ÒÏê1v˙Yäı˙„3?óÛĠŽ[‚²CÛÈExÔÓĉÉ''Šñ~²˙ÒíĴÈ= ˙MĝŸùéĞÍşn[ş^0ìzÈĝ½'êÇüƒżôߋ˙žš¸.“ĠŞŻ¤`2>†5M?&íPĉÉÌ@ğI>ĞŭÜä£)qˇ@‰Ŭ?%áĦòĉħíµ­$í2Ewlú­{½NŝŸ“c]’êìnË$4ïMûKw³sXŭŸŻ~ÙĞÁ/Ûx*˙xĝ—ŝ&ĜŜöùó…Ĥì<×ıu·n¨×ĥë˜}F6ĥĠk^Ë=ìÚ Ŝ™k1Î+³Àu . !ġĞcOé=;żJÏSü"żûbż˙µëCï˙ÄÑûírßżí;0ó-nË,´³Ü}6Ûc6 —MuY]nġ˜v[ğùĈ(ŝηc*Ûú*ËÊÁ! ĠüĥµŜ†ïÑoWżkWà—íjü÷ŝ!˙‰ö'Ûċġ<{îÓvCŸ]—>ĉ˘I†ÛŬ['c]svßzÄÊóVżj×à—íZü÷ŝ!˙‰ö'ƒ°òžsîÚѵ­mÖÖ7z+ĤÚÙüáġ?‰‹Ñò2rİÇc˘Ç‡×]™Úö1𠖏Ó:ïI–2Ÿ£gú$ڕĝ&Qİì,p–¸AážÒ GµËî%RŭêëûÎsÚܞ™Ôz†ĉÜ/éĥ8Ŭ“e!Ž‹ĵowô‡oû7ó>½žŻüaş+ĥم‘iwÚ1~Ü(~Ŭw¤ßZ°êé·"ğħ™§ïŝjŸôKG?ŻeġT2Ĵ§ŞxĤŞ ‰mĠúWZì‹Ym_Ĵ9ßÑ˙2´LoĴyxušŬM{ìġžëİ7譚lżgó,Sĉ‡Ó_Îp|²ŭŜîħŠ2ácġ|C×_ÇòÇüWëm75ŸX‰ l_Nö×c­hqoN{żMsk}Žüï ğ˙Ĵżò\˙ŸùíëÎú­Ĵ§êÎN {,Şĥ›ŸôŜ}jû?”½ë/ü×?†gŝ{z——–I ǃÖxGġ*>Ĥ—7@u˙J_Ŝ˙Óí~­¸3ê˙CqàtüIĝzM^vÚ:KĤŒİiÌÇĴWmV×nŽ}^½66—W~5û=Jnİë²è?X~Ż×ġ¤ĠgTÂʰ1в·äÒ×5í­Ħì{c\×ħÊĝúÍġ}˘Ö0€”˙Ÿ“géœñĝ#ŝê2dĊ”$€%ĵù÷ÚŻÜĉ™oŝ‘Kí_Wżîuĉ[˙¤W ˙Î~ƒ˙—8_ûOŝ–KŝsôüıÂ˙ĜÊô²ÚÉ˙Š3}°˙Ġlß{—ù¸}‡ŝùó˙µŭ^˙ıÌ˙2ßŭ"›íŸWżîs?Ìğ˙HŻA˙œŭ˙.pżö2Ÿŭ,ĉW•KoĊÉnE–Ó`ħ†×m²§=ŽÚä½ĴŸĝ£7ÛŭVŻK÷!öûçÌ~Ûġ{ŝç3ŝÛğ˙H'ûwĠïûšßûnïŭ ½GÔ³÷Ŭŝqŝô½K?}ßçïKٟùüßl?ġZù/܇ĜïŸ.żWÏĴ˙2ïŭ"§öž…öĈGġ-˙Ò+ÒĴş$=˙çXċeíġfÏJv—î1?zŠ`Ä׿—í‡ŭ_Š0‡ĝ²˙|ôĉôÎk?Ì·˙HĤûĠ˙ûšÏó-˙Ò+ÑêTbR/ÍËf-%Á‚Ûî0¸‚áX}Ïcwík½ˆóŸ ˙ċÎŝĈS˙“Ĉ~ŝ_ĥ÷ŒÑç!bû%˙|´>Ż˙ÜÖ™wŝKöĠ˙ûšßûnïŭ ğ˙ùÏòç ˙c)˙ÒÉÎ~ƒ˙—8_ûOŝ–Gîçüö_ĥú­?}ŸîCì?÷Ïìl^ğE½/¤Ü22ò†ZÖVÖÛUĥääÛeLœzY_üeŸÌÓúK ŭc!ßWşÛ‡0­ê'ë7Ġò!Ŭc™I˙Ñʇ^úġ~ÏĞŭZŞúĤ–[“]u³&—9ÏuNk+ccœç½ÊLpàĊ)ëw=˙ĉ°ċÊrKˆ€(W˙ÔġM’XÂO&)z˙èÙ÷ĉŞ}GgFÀfOH³!˜´ĥëŝ‘ıö4Ykŝל̝ïŭÈğżÒ×ê+ŸµżĊ˙ŝRáŸÑ?ù ’ž˙Ç˙Fϸ%èc˙£gÜû[ü_˙ċ.ùŭ˙’ ~Ö˙˙ùK…ŝD˙ä‚J{ïCŭ>àħp€n[@ŭ˘Ó§‰ÁéÄoö·ĝż˙Ê\/óú'˙$ŻKêŬ3ìÎŭ‹Ñû.óğì/éž—İ ßğì™ŝ—­éú[żÂlôÒS´’£ûVïüĤê?çà˙ïz_µn˙Ên£ŝ~ŝ÷¤ĤĠ‘ ŻĦdz{3³´Ĥ=Vîŭ¨˙Ÿƒ˙½éżjÙ?ò7Q˙?˙{Ô9!u }i­›)Jċ >ĵ:1k>³t–¸ú|żNú2şMŒŭÑ÷.GŞunè³ößE°Ó¸ú_oKÙ=Ŝ—Úóöú›>–Ċ›û[ü_˙ċ.ùŭ˙’ Xè6"ˆ­Ÿ@ĜÏŬr[û£î^û[ü_˙ċ.ùŭ˙’ ~Ö˙˙ùK…ŝD˙ä‚)}c?t}Élgîıy˙íoñ˙”¸_çôOŝH*]kŞ}FFÏf7HĞ!ĝ·6›ŝ\Ë +ħŸeγ'{˙që²ïôUú‰)˙Ù8BIM!UAdobe PhotoshopAdobe Photoshop 7.0˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙PPO˙##"˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙żż½˙˘¤£˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙žĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙ŸĦ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙˘£Ħ˙˘£Ħ˙˘£Ħ˙˘£˘˙˘£˘˙˘£˘˙˘£˘˙˘£˘˙˘£Ħ˙˘£˘˙˘£˘˙˘£˘˙˘£˘˙˘£Ħ˙˘£Ħ˙˘£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ħ£Ħ˙Ÿ˘ ˙Ÿ˘ ˙Ÿ˘ ˙Ğ­Ğ˙×ÖÒ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ÖÖÔ˙wur˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙::9˙ĤĤ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙½ĵ˙###˙˙2$˙j@4˙zH;˙{I;˙{I;˙{I;˙{I;˙{I;˙{I;˙{I:˙{I:˙{I:˙{I:˙{I:˙{I:˙|I:˙|I:˙|I:˙|I:˙|I:˙|I:˙|I:˙|I:˙|I:˙|I:˙|J9˙|J9˙|J9˙|J9˙|J9˙|J9˙}J9˙}J9˙}J9˙}J9˙}J9˙}J9˙}J8˙}J8˙}J8˙}J8˙~J8˙~J8˙~J8˙~J8˙~J8˙~J8˙~J8˙~J8˙~J8˙~J8˙~J8˙~J8˙~K8˙~K7˙~K7˙K7˙K7˙K7˙K7˙K7˙K7˙K7˙K7˙K7˙K6˙K6˙K6˙L6˙€L6˙€L6˙€L6˙€L6˙€L6˙€L6˙€L6˙€L6˙€L6˙€L6˙€L6˙€L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙L5˙‚M4˙‚M4˙‚M4˙‚M4˙‚M4˙‚M4˙‚M4˙‚M4˙‚M4˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙ƒM3˙„M3˙„N3˙„N2˙„N2˙„N2˙„N2˙„N2˙„N2˙„N2˙„N2˙„N2˙„N2˙„N2˙„N2˙…N1˙…N1˙…N1˙…N1˙…N1˙…N1˙…N1˙…N1˙…N1˙…N1˙†N1˙†N1˙†O1˙†O1˙†O0˙†O0˙†O0˙†O0˙†O0˙†O0˙†O0˙†O0˙†O0˙†O0˙‡O0˙‡O0˙‡O0˙‡O0˙‡O/˙‡O/˙‡O/˙‡O/˙‡O/˙‡P/˙„L+˙[:#˙˙˙yyx˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ÖÖĠ˙-$$˙ ˙yFG˙Ğ^\˙­^\˙­^\˙­^\˙­_[˙­_[˙­_[˙_[˙_[˙_[˙_[˙_Z˙_Z˙_Z˙_Z˙Ż_Z˙Ż_Z˙Ż`Z˙Ż`Y˙Ż`Y˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`X˙°`X˙°`X˙°`X˙ħaX˙ħaX˙ħaX˙ħaW˙ħaW˙ħaW˙ħaW˙²aW˙²aW˙²aW˙²aV˙²aV˙²bV˙³bV˙³bV˙³bV˙³bU˙³bU˙³bU˙´bU˙´bU˙´bU˙´bU˙´bT˙´bT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcS˙µcS˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥdR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dQ˙¸dQ˙¸dQ˙¸dQ˙¸eQ˙¸eQ˙ıeQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙şeP˙şeP˙şeP˙şfO˙şfO˙şfO˙şfO˙ğfO˙ğfO˙ğfN˙ğfN˙ğfN˙ğfN˙ĵfN˙ĵfN˙ĵgN˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙½gM˙½gM˙½gM˙½gL˙½gL˙½gL˙½hL˙hL˙hL˙hL˙hK˙hK˙hK˙żhK˙żhK˙żhK˙żhJ˙żiJ˙żiJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiI˙ÀiI˙ÁiI˙ÁiI˙ÁiI˙ÁjI˙ÁjI˙ÁjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjG˙jG˙jG˙kG˙kG˙kG˙kF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ĊkE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈmD˙ĈmC˙ÇmC˙²fC˙;1)˙˙Œ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙€˙˙hCQ˙œUk˙Uk˙Vk˙Vk˙Vj˙Vj˙Vj˙žVj˙žVj˙žVj˙žVi˙žVi˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wh˙ Xg˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Yd˙£Yd˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙ĤZb˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[a˙§[a˙§[a˙§[a˙§[a˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ\_˙İ\_˙İ\_˙İ]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]]˙Ğ]]˙Ğ]]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­^[˙­_[˙­_[˙_[˙_[˙_[˙_Z˙_Z˙Ż_Z˙Ż_Z˙Ż_Z˙Ż`Z˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`X˙°`X˙ħ`X˙ħaX˙ħaX˙ħaX˙ħaW˙²aW˙²aW˙²aW˙²aW˙²aV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bU˙´bU˙´bU˙´bU˙´cU˙´cU˙µcT˙µcT˙µcT˙µcT˙µcT˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙ĥdS˙·dS˙·dR˙·dR˙·dR˙·dR˙¸dR˙¸dQ˙¸eQ˙¸eQ˙¸eQ˙ıeQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙şfP˙şfO˙şfO˙şfO˙şfO˙ğfO˙ğfN˙ğfN˙ğfN˙ğfN˙ĵgN˙ĵgN˙ĵgM˙ĵgM˙eN˙(˙˙ĜĜÖ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙"""˙""˙Pv˙Ow˙Ov˙Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ou˙’Pu˙’Pu˙’Pu˙’Pu˙’Pt˙“Pt˙“Pt˙“Pt˙“Pt˙“Pt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Qr˙•Qr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Rp˙—Rp˙—Rp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙™So˙™So˙™Sn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙šTm˙›Tm˙›Tm˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUk˙œUk˙œUk˙Vk˙Vk˙Vj˙Vj˙Vj˙žVj˙žVj˙žVi˙žVi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙˘Xf˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zc˙Zc˙Zc˙Zc˙Zc˙ĤZb˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[a˙§[a˙§[a˙§[a˙¨\a˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ\_˙İ\_˙Ş]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]^˙Ğ^]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­_\˙­_[˙­_[˙_[˙_[˙_Z˙_Z˙Ż_Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`X˙ħaX˙ħaX˙ħaX˙ħaX˙ħaW˙²aW˙²aW˙²aW˙²bW˙²bV˙³bV˙³bV˙³bV˙³bV˙´bU˙´bU˙´bU˙~QH˙˙ŸŸž˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ÖÖĠ˙  ˙C0F˙ˆK˙ˆK˙ˆK~˙ˆK~˙‰K~˙‰K~˙‰K~˙‰K}˙‰K}˙ŠL}˙ŠL}˙ŠL}˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L{˙‹M{˙ŒM{˙ŒM{˙ŒM{˙ŒMz˙ŒMz˙Mz˙Mz˙Mz˙Nz˙Ny˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙ŽNx˙Nx˙Nx˙Ox˙Ox˙Ow˙Ow˙Ow˙Ow˙Ov˙‘Ov˙‘Pv˙‘Pv˙‘Pv˙‘Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Pt˙“Qt˙“Qt˙“Qt˙“Qt˙”Qs˙”Qs˙”Qs˙”Qs˙•Rr˙•Rr˙•Rr˙•Rr˙•Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Sq˙—Sp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜So˙˜So˙˜To˙™To˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šUm˙šUm˙›Um˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œVk˙œVk˙Vk˙Vk˙Vj˙Vj˙Vj˙žVj˙žWj˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ Wh˙ Xh˙ Xh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Yf˙˘Yf˙˘Yf˙£Ye˙£Ye˙£Ye˙£Ye˙£Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙[c˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§\a˙¨\a˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ]_˙İ]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­_[˙­_[˙_[˙_[˙_Z˙_Z˙_Z˙Ż`Z˙Ÿ[U˙ ˙```˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı·˙˙M*J˙…I˙…I˙…I˙†I˙†I˙†I€˙†I€˙†I€˙‡J€˙‡J€˙‡J˙‡J˙‡J˙ˆJ˙ˆJ˙ˆJ~˙ˆJ~˙ˆK~˙‰K~˙‰K~˙‰K}˙‰K}˙ŠK}˙ŠK}˙ŠK}˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L{˙‹L{˙ŒL{˙ŒL{˙ŒM{˙ŒMz˙Mz˙Mz˙Mz˙Mz˙My˙ŽMy˙ŽNy˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Nx˙Nw˙Nw˙Ow˙Ow˙Ow˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙’Pu˙’Pu˙’Pu˙’Pu˙“Pt˙“Pt˙“Pt˙“Pt˙“Qt˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Qr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Sp˙—Sp˙—Sp˙˜Sp˙˜So˙˜So˙˜So˙™So˙™To˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙šTm˙›Um˙›Um˙›Ul˙›Ul˙œUl˙œUl˙œUk˙œUk˙Vk˙Vk˙Vk˙Vj˙žVj˙žVj˙žVj˙žVi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ Wh˙ Wh˙ Xh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙£Ye˙£Ye˙£Ye˙£Ye˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙Zc˙ĤZc˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§[a˙§\a˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ\_˙İ]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙œ\Y˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı·˙˙N+I˙ˆJ˙ˆJ~˙ˆJ~˙ˆJ~˙‰K~˙‰K~˙‰K}˙‰K}˙‰K}˙ŠK}˙ŠK}˙ŠK|˙ŠK|˙ŠL|˙‹L|˙‹L|˙‹L{˙‹L{˙‹L{˙ŒL{˙ŒL{˙ŒLz˙ŒMz˙ŒMz˙Mz˙Mz˙Mz˙My˙ŽMy˙ŽMy˙ŽMy˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Nx˙Nw˙Nw˙Ow˙Ow˙Ow˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ou˙’Ou˙’Pu˙’Pu˙’Pu˙“Pt˙“Pt˙“Pt˙“Pt˙“Pt˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Qr˙•Qr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙—Rq˙—Rq˙—Rp˙—Rp˙—Sp˙˜Sp˙˜So˙˜So˙˜So˙™So˙™So˙™Sn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙›Tm˙›Tm˙›Tl˙›Ul˙œUl˙œUl˙œUl˙œUk˙œUk˙Uk˙Uk˙Vk˙Vj˙žVj˙žVj˙žVj˙žVj˙žVi˙ŸVi˙ŸWi˙ŸWi˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wh˙ĦWg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Xf˙˘Xf˙˘Xf˙£Ye˙£Ye˙£Ye˙£Ye˙¤Yd˙¤Yd˙¤Yd˙¤Zd˙Zd˙Zc˙Zc˙Zc˙Zc˙ĤZb˙ĤZb˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§[a˙¨[a˙¨[`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ\_˙İ\_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]^˙Ğ]]˙Ğ]]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­^\˙­_[˙­_[˙_[˙_[˙_Z˙_Z˙ž\W˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙S-E˙Nw˙Nw˙Ow˙Ow˙Ow˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙’Ov˙’Pu˙’Pu˙’Pu˙’Pu˙“Pu˙“Pt˙“Pt˙“Pt˙“Pt˙“Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qs˙•Qr˙•Qr˙•Rr˙–Rr˙–Rr˙–Rq˙–Rq˙–Rq˙—Rq˙—Rq˙—Rq˙—Sp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙™To˙™To˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTn˙šTm˙šUm˙›Um˙›Um˙›Um˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œVk˙œVk˙Vk˙Vk˙Vj˙Vj˙Vj˙žVj˙žWj˙žWj˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ Wh˙ Xh˙ Xh˙ Xg˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Yf˙˘Yf˙˘Yf˙˘Yf˙˘Ye˙£Ye˙£Ye˙£Ye˙£Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zc˙Zc˙Zc˙[c˙[c˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[a˙§[a˙§\a˙§\a˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙İ\_˙İ\_˙İ]_˙İ]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]]˙Ğ]]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­^[˙­_[˙_[˙_[˙_[˙_Z˙_Z˙Ż_Z˙Ż_Z˙Ż_Z˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`X˙ħ`X˙ħ`X˙ħ`X˙ħaW˙²aW˙²aW˙²aW˙²aW˙²aW˙³aV˙³aV˙³bV˙³bV˙´bU˙´bU˙´bU˙˘_R˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙Z1>˙œUl˙œUl˙œUk˙œUk˙Vk˙Vk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žVj˙žVj˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wh˙ Xh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙˘Yf˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙¤Yd˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙Zc˙Zc˙ĤZb˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[a˙§[a˙§[a˙§[a˙§[a˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ\_˙İ\_˙İ\_˙İ]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]]˙Ğ]]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­^\˙­_[˙­_[˙_[˙_[˙_[˙_Z˙_Z˙Ż_Z˙Ż_Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`X˙°`X˙ħ`X˙ħaX˙ħaX˙ħaX˙ħaW˙²aW˙²aW˙²aW˙²aW˙²aV˙³bV˙³bV˙³bV˙³bV˙³bU˙´bU˙´bU˙´bU˙´bU˙´cU˙µcT˙µcT˙µcT˙µcT˙µcT˙ĥcS˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dQ˙¸dQ˙¸eQ˙¸eQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙şeO˙şfO˙şfO˙şfO˙ğfO˙ğfO˙ğfN˙ğfN˙ğfN˙ğfN˙ĵgN˙ĵgM˙ĵgM˙ŞcK˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙c65˙Ĵ^]˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­^\˙­_\˙­_\˙­_\˙­_[˙­_[˙_[˙_[˙_[˙_[˙_[˙_Z˙_Z˙Ż_Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`X˙°`X˙°aX˙ħaX˙ħaX˙ħaX˙ħaW˙ħaW˙ħaW˙ħaW˙²aW˙²aW˙²aW˙²aV˙²bV˙²bV˙³bV˙³bV˙³bV˙³bV˙³bU˙³bU˙´bU˙´bU˙´bU˙´bU˙´cU˙´cT˙´cT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcS˙ĥcS˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙ĥdS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dR˙¸dQ˙¸dQ˙¸eQ˙¸eQ˙¸eQ˙ıeQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙şeP˙şeP˙şeP˙şfO˙şfO˙şfO˙şfO˙ğfO˙ğfO˙ğfO˙ğfN˙ğfN˙ğfN˙ğfN˙ĵgN˙ĵgN˙ĵgN˙ĵgM˙ĵgM˙ĵgM˙½gM˙½gM˙½gM˙½gL˙½gL˙½hL˙hL˙hL˙hL˙hK˙hK˙hK˙hK˙żhK˙żhK˙żhJ˙żhJ˙żiJ˙żiJ˙ÀiJ˙ÀiJ˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÁiI˙ÁiI˙ÁiH˙ÁjH˙ÁjH˙ÁjH˙ÂjH˙ÂjH˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙jG˙jG˙kG˙kF˙kF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ÄkE˙ĊkE˙ĊkE˙ĊlE˙ĊlE˙ĊlE˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlC˙ÇlC˙ÇmC˙ÇmC˙ÇmC˙³hC˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙m<,˙hL˙hL˙hL˙hK˙hK˙hK˙hK˙hK˙żhK˙żhK˙żhK˙żhJ˙żiJ˙żiJ˙żiJ˙żiJ˙żiJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÁiI˙ÁiI˙ÁjI˙ÁjH˙ÁjH˙ÁjH˙ÁjH˙ÁjH˙ÁjH˙ÂjH˙ÂjH˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙ÂkG˙kG˙kG˙kG˙kF˙kF˙kF˙kF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ÄlE˙ÄlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈmD˙ĈmD˙ĈmD˙ÇmD˙ÇmD˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÈmC˙ÈmC˙ÈmB˙ÈmB˙ÈnB˙ÈnB˙ÈnB˙ÈnB˙ÈnB˙ÉnB˙ÉnB˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÊnA˙Ên@˙Ên@˙Êo@˙Êo@˙Êo@˙Êo@˙Êo@˙Êo@˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo>˙Ìo>˙Ìo>˙Ìp>˙Ìp>˙Ìp>˙Ìp>˙Ìp>˙Íp=˙Íp=˙Íp=˙Íp=˙Íp=˙Íp=˙Íp=˙Îp<˙Îp<˙Îp<˙Îq<˙Îq<˙Îq<˙Îq<˙Ïq<˙Ïq<˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙q;˙q;˙q;˙q;˙r:˙r:˙r:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr9˙Ñr9˙Òr9˙Òr9˙Òr9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙n8˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙xA"˙r:˙r:˙r:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr9˙Ñr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós7˙Ós7˙Ós7˙Ós7˙Ôs7˙Ôs7˙Ôs7˙Ôs7˙Ôs7˙Ôt7˙Ôt7˙Ôt7˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt5˙Ġt5˙Ġt5˙Ġt5˙Ġt5˙Öt5˙Öt5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u3˙×u3˙×u3˙×u3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv2˙Ĝv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùw2˙Ùw2˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Ûw0˙Ûw0˙Ûw0˙Ûw0˙Ûx0˙Ûx0˙Ûx0˙Ûx0˙Ûx0˙Ûx0˙Üx0˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Ŭx/˙Ŭx/˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŝy.˙Ŝy.˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙ßy-˙ßy-˙ßy-˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙Ét.˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙G˙á{+˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â|)˙â|)˙â|)˙â|)˙â|)˙â|)˙â|)˙â|)˙â|)˙â|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙ä|(˙ä|(˙ä|(˙ä|(˙ä|(˙ä|'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~$˙ç~$˙ç~$˙ç~$˙ç~$˙ç~$˙ç~$˙è~$˙è~$˙è~$˙è~$˙è~$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è#˙è#˙è#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙ê#˙ê"˙ê"˙ê"˙ê"˙ê"˙ê"˙ê"˙ê"˙ê"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€!˙ê€!˙ê€!˙ê€!˙ë€!˙ë€!˙ë€!˙Óy$˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙ŠK˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô†˙ô†˙ġ†˙ġ†˙Ü~˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙N ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙ûˆ˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙â‚˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙’P˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙˙‹˙ċƒ˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙’P˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ċƒ˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙N ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙â˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙‰K˙î‚˙î‚˙î‚˙î‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó„˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙Ü~˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙F˙àz+˙àz+˙àz+˙àz+˙àz+˙àz+˙àz+˙àz+˙à{+˙à{+˙á{+˙á{+˙á{+˙á{+˙á{+˙á{+˙á{+˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{)˙â{)˙â{)˙â{)˙â|)˙â|)˙â|)˙â|)˙â|)˙â|)˙â|)˙â|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙ä|(˙ä|(˙ä|(˙ä|(˙ä|(˙ä|(˙ä|(˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ~&˙ĉ~&˙ĉ~&˙ĉ~&˙ĉ~&˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~$˙ç~$˙ç~$˙ç~$˙è~$˙è~$˙è~$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è#˙è#˙è#˙è#˙è#˙è#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é"˙é"˙é"˙é€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙Óz%˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙wA"˙Îq<˙Îq<˙Ïq<˙Ïq<˙Ïq<˙Ïq<˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙q;˙q:˙q:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙Ñr:˙Ñr:˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Òr9˙Òr9˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós7˙Ós7˙Ós7˙Ós7˙Ôs7˙Ôs7˙Ôs7˙Ôs7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Öt5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu4˙Öu4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×v4˙×v3˙×v3˙×v3˙×v3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv2˙Ĝv2˙Ĝv2˙Ĝv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùw2˙Ùw1˙Ùw1˙Ùw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw0˙Úw0˙Ûw0˙Ûw0˙Ûw0˙Ûw0˙Ûw0˙Ûx0˙Ûx0˙Ûx0˙Ûx0˙Üx0˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Ŭx/˙Ŭx/˙Ŭx/˙Ŭx/˙Ŭx.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŝy.˙Ŝy.˙Ŝy.˙Ŝy.˙Ŝy-˙Ŝy-˙Ŝy-˙Ét/˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı·˙˙l;,˙ĵgM˙ĵgM˙½gM˙½gM˙½gM˙½gL˙½gL˙½gL˙½gL˙½gL˙½gL˙gL˙gL˙hL˙hL˙hK˙hK˙hK˙hK˙hK˙żhK˙żhK˙żhK˙żhK˙żhK˙żhJ˙żhJ˙żhJ˙ÀhJ˙ÀhJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiI˙ÀiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiH˙ÂiH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjG˙ÂjG˙jG˙jG˙jG˙jG˙jG˙jG˙jF˙jF˙jF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ÄkE˙ÄkE˙ÄkE˙ĊkE˙ĊkE˙ĊkE˙ĊkD˙ĊkD˙ĊkD˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlC˙ĈlC˙ĈlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇmB˙ÇmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÉmA˙ÉmA˙ÉmA˙ÉmA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÊnA˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ën@˙Ëo@˙Ëo@˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ìo?˙Ìo?˙Ìo?˙Ìo?˙Ìo>˙Ìo>˙Ìp>˙Ìp>˙Ìp>˙Íp>˙Íp>˙Íp>˙Íp=˙Íp=˙Íp=˙Íp=˙Íp=˙Îp=˙Îp=˙Îq<˙Îq<˙Îq<˙Îq<˙Îq<˙Îq<˙Ïq<˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙r;˙r:˙r:˙r:˙r:˙r:˙r:˙Ñr:˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Òr9˙Òs8˙n9˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı·˙˙b66˙Ş]^˙Ğ]^˙Ğ]]˙Ğ^]˙Ğ^]˙Ğ^]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙­_\˙­_\˙­_\˙­_[˙­_[˙­_[˙_[˙_[˙_[˙_[˙_Z˙_Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°aX˙°aX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙²aW˙²aW˙²aW˙²aW˙²bW˙²bW˙²bW˙³bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bU˙´bU˙´bU˙´bU˙´cU˙´cU˙´cU˙´cT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙ĥdS˙ĥdS˙ĥdS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙şeP˙şeO˙şfO˙şfO˙şfO˙şfO˙şfO˙ğfO˙ğfN˙ğfN˙ğfN˙ğfN˙ĵfN˙ĵgN˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙½gM˙½gM˙½gL˙½gL˙½gL˙hL˙hL˙hL˙hK˙hK˙hK˙żhK˙żhK˙żhK˙żhJ˙żiJ˙żiJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÁiI˙ÁjI˙ÁjH˙ÁjH˙ÁjH˙ÂjH˙ÂjH˙ÂjH˙ÂjG˙ÂjG˙ÂjG˙jG˙kG˙kG˙kG˙kF˙kF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ÄkE˙ĊkE˙ĊkE˙ĊlE˙ĊlE˙ĊlD˙ĈlD˙ĈlD˙´hD˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı·˙˙Y1?˙›Um˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUl˙Ôĥż˙˙˙˙˙‘ž˙ġî˙òéì˙˘bu˙›Th˙›Ui˙žVj˙žVj˙žVj˙žVj˙žVj˙°v…˙ûùú˙âÍÒ˙Ò²ş˙ŝŝŝ˙Á• ˙Uf˙žUf˙ŸVg˙ Wh˙ Xh˙ Xh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙˘Yf˙˘Yf˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙¤Ze˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙Zd˙Zd˙Zc˙Zc˙Zc˙[c˙Ĥ[c˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§[a˙§\a˙¨\a˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ]_˙İ]_˙İ]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ^]˙Ğ^]˙Ğ^]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­_\˙­_[˙­_[˙­_[˙­_[˙_[˙_Z˙_Z˙_Z˙`Z˙Ż`Z˙Ż`Y˙Ż`Y˙Ż`Y˙Ż`Y˙ĉ„˙ŝŭŭ˙ßÀ½˙áĊÂ˙ŭüü˙Ǒ‹˙ĉÎË˙óçċ˙ĵzr˙ŭûû˙ׯŞ˙ׯŞ˙úöö˙~t˙áŜ˙ùóó˙¸pe˙°`T˙ħaT˙´bU˙´bU˙´cU˙´cU˙µcU˙µcT˙µcT˙µcT˙µcT˙ĥcT˙ĥcT˙ĥcS˙ĥdS˙ĥdS˙ĥdS˙·dS˙·dS˙·dR˙·dR˙·dR˙¸dR˙¸eR˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙şfP˙şfO˙şfO˙şfO˙şfO˙ğfO˙ğfN˙ğfN˙ŞcM˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı¸˙˙R-E˙Nx˙Nx˙Nx˙Nx˙Nx˙Ow˙Ow˙Ow˙àÎÙ˙˙˙˙˙ÁĦµ˙ñìï˙ŭüŭ˙šrŠ˙l;X˙wAa˙Mr˙’Pu˙’Pu˙’Pu˙’Pu˙³†Ÿ˙üûü˙çÚá˙ʳż˙˙˙˙˙ÒÀÉ˙r>Y˙r>X˙‰Kj˙“Pr˙”Qs˙•Qr˙•Qr˙•Rr˙•Rr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Rp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜So˙˜So˙˜So˙˜So˙™So˙™Tn˙™Tn˙™Tn˙™Tn˙šTn˙šTm˙šTm˙šTm˙šTm˙›Um˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUk˙œUk˙Vk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žVj˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ Wh˙ Wh˙ Wh˙ Wh˙ Xh˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙˘Yf˙£Ye˙£Ye˙£Ye˙£Ye˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙Zc˙Zc˙Ĥ[b˙țŸ˙ŝŭŭ˙ÏÑ˙ÖÂÄ˙˙˙˙˙×Á˙ô˙üûû˙Ò¸ı˙ŝŝŝ˙ĉ×Ĝ˙èÜÜ˙ŝŝŝ˙ÈĤ¨˙îçç˙ú÷÷˙rt˙~EF˙“PQ˙¨[\˙Ş]^˙Ğ]^˙Ğ]^˙Ğ^]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙­_\˙­_[˙­_[˙­_[˙_[˙_[˙_Z˙`Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°aX˙°aX˙ħaX˙ħaX˙ħaX˙ħaW˙²aW˙²aW˙²aW˙²bW˙²bV˙³bV˙£_T˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı¸˙˙N*I˙‡J˙‡J˙‡J˙ˆJ˙ˆK˙ˆK~˙ˆK~˙ˆK~˙ûúû˙˙˙˙˙ĠĊÒ˙íêì˙ŝŝŝ˙€fz˙4/˙I(B˙{Do˙‰K{˙‹L|˙‹L|˙‹L|˙ĊĤ½˙˙˙˙˙öòġ˙ÇşÄ˙˙˙˙˙ǽÄ˙?#7˙:2˙n<_˙‹Lx˙Ny˙Ny˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Ox˙Ow˙Ow˙Ow˙Ow˙Ow˙Ov˙‘Ov˙‘Pv˙‘Pv˙‘Pv˙’Pu˙’Pu˙’Pu˙’Pu˙’Pt˙“Pt˙“Qt˙“Qt˙“Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Rr˙•Rr˙•Rr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Sp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜So˙˜So˙˜So˙˜To˙™To˙™Tn˙™Tn˙™Tn˙šTn˙šTm˙šTm˙šUm˙›Um˙›Um˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œVk˙œVk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žWj˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ Wh˙ Xh˙ÙĵÂ˙˙˙˙˙òêì˙ÍĊ˙˙˙˙˙ËÁ˙òññ˙üüü˙´ĥ˙˙˙˙˙ŜÖ×˙ŬÖ×˙˙˙˙˙Ä´·˙ùĝù˙ŝŝŝ˙œ‚…˙>"&˙l;B˙žV_˙Zc˙Zc˙Zc˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§[a˙§\a˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ]_˙İ]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]^˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­_[˙­_[˙­_[˙_[˙Ÿ]X˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı¸˙˙L*K˙…I‚˙…I˙…I˙…I˙…I˙†I˙†I€˙†I€˙Í´Ë˙ŝŝŝ˙§‹£˙ßÛŜ˙ùĝù˙iUg˙'$˙73˙r>k˙†I}˙ˆK~˙‰K~˙‰K~˙£sš˙ĝô÷˙ŜÛ˙¤”Ħ˙ŝŝŝ˙´Ğ²˙2-˙)%˙_4U˙‡Jy˙‹L|˙‹L{˙ŒL{˙ŒL{˙ŒL{˙ŒM{˙ŒMz˙Mz˙Mz˙Mz˙Mz˙My˙ŽMy˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Nw˙Ow˙Ow˙Ow˙Ow˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙’Pu˙’Pu˙’Pu˙’Pu˙“Pu˙“Pt˙“Pt˙“Pt˙“Qt˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Qr˙•Rr˙•Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Rp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙™So˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙›Tm˙›Um˙›Um˙›Ul˙›Ul˙œUl˙œUl˙œUk˙œUk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙ş‡•˙ûùù˙ÔÁĈ˙ݤĤ˙ŝŝŝ˙ĥŞ­˙çäċ˙÷öö˙Ĥ˜›˙ŝŝŝ˙ËÄ˙”‡Š˙úúú˙’…˙ÌÍ˙ôòó˙bHM˙+˙X07˙—R]˙£Ye˙£Ye˙£Ye˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙Zc˙ĤZc˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[a˙§[a˙§[a˙§\a˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ\_˙İ]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙ž\Y˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ş¸˙˙N+I˙ˆJ~˙ˆJ~˙ˆJ~˙‰J~˙‰J~˙‰K~˙‰K}˙‰K}˙œg‘˙ÒşÍ˙†^}˙s~˙ž•œ˙F*?˙)$˙82˙t?g˙‰Kz˙ŒL{˙ŒL{˙ŒL{˙N}˙Ċĵ˙·—˙bFZ˙ĴŞ˙fR`˙3,˙*$˙`4R˙ŠKv˙ŽMy˙ŽOy˙Nx˙Nx˙Nx˙Nx˙Nw˙Nw˙Nw˙Ow˙Ow˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙’Ou˙’Ou˙’Pu˙’Pu˙’Pu˙“Pt˙“Pt˙“Pt˙“Pt˙“Qu˙”Rt˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Qr˙•Qr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙—Rq˙—Rq˙—Rp˙—Rp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙™So˙™Sn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙›Tm˙›Tm˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUk˙œUk˙Uk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žVi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ Wh˙ Wh˙ Wh˙ Xg˙£]k˙Ó²ı˙°“˙cMR˙°§İ˙iMR˙‰|˙ •—˙P5:˙­Ĥ˙xdh˙H36˙›˙Y:?˙rbd˙£¤˙O15˙,˙X04˙˜R[˙Zc˙Zc˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§[a˙¨\a˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙İ]_˙İ]_˙Ş]_˙Ş]_˙Ş]^˙Ş]^˙Ğ]^˙Ğ]^˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­_\˙­_\˙­_[˙­_[˙_[˙_[˙ ]X˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ş·˙˙S-D˙Nw˙Ow˙Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙£jŠ˙ÍŻÀ˙†Oo˙“}‰˙˜Ÿ˙^6L˙>"1˙L)<˙‚Ff˙’Os˙“Pt˙”Ps˙”Qs˙•Su˙ɧ¸˙İw˙|Tg˙³¨˙xXg˙M);˙>!/˙q>W˙“Po˙ĥ‡œ˙ÒµÂ˙ž`|˙•Qp˙–Qo˙—Rp˙—Rp˙—Sp˙—Sp˙˜So˙˜So˙˜So˙˜So˙™So˙™So˙™Sn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙šTm˙›Tm˙žZr˙Ï­ı˙˜Ĥ˙šTk˙›Tk˙œUl˙œUl˙œUk˙œUk˙Uk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žVi˙žVi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ Wh˙ Wh˙ Wh˙ Xg˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Xf˙˘Xf˙˘Yf˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙Zc˙Ĥ[c˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙İ`e˙Ġ³µ˙İqu˙{Z\˙·ŞĞ˙XY˙–ƒ„˙Ğ™š˙iCE˙´¨İ˙Œop˙‚ij˙´ĤĤ˙|NN˙ˆno˙£‹‹˙l;;˙G&'˙p==˙¤ZY˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙­^\˙­_\˙­_\˙­_[˙­_[˙_[˙_[˙_Z˙_Z˙_Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`X˙°`X˙ħaX˙ħaX˙ħaX˙ħaW˙²aW˙²aW˙²aW˙²aW˙²bV˙³bV˙³bV˙³bV˙³bV˙³bU˙`S˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙Z1>˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žVj˙žVj˙×ıÁ˙üûû˙‘˙êáä˙íçé˙We˙i9D˙t?K˙˜Rc˙ Wh˙ Wh˙ Wh˙ Xh˙µ|ˆ˙ùġö˙àÉÎ˙ĊĤĴ˙ŭŭŭ˙°•˙v@J˙h8B˙MZ˙ĦYf˙è×Ú˙ŭŭŭ˙ż˜˙NY˙’OZ˙ŸWc˙£Ye˙£Ye˙£Ye˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙Zd˙Zc˙Zc˙Zc˙Zc˙[c˙Ĥ[c˙Ĥ[b˙Ĥ[b˙¸}ƒ˙ûĝĝ˙òèé˙ ^d˙‘OT˙V[˙ĤZ`˙§\a˙¨\a˙¨\a˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\`˙İ\`˙İ]_˙İ]_˙İ]_˙Ş]_˙Ş]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]^˙Ğ^^˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙­_\˙­_\˙­_[˙­_[˙­_[˙_[˙_[˙_Z˙_Z˙_Z˙Ż_Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`X˙°`X˙°`X˙ħaX˙ǎˆ˙üùù˙Ŭş˙Í´ħ˙üüû˙ğ’˙ïéè˙ù÷÷˙ÇŞĤ˙ŝŝŝ˙ßÎÌ˙ßÑÏ˙ŭüü˙Àš”˙âĠÓ˙òëê˙£i`˙v@7˙“PD˙²aR˙µcT˙µcT˙µcT˙µcS˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥcR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dQ˙¸dQ˙¸dQ˙¸dQ˙¸eQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙şeP˙şeO˙şeO˙şeO˙şfO˙ğfO˙ğfO˙ğfN˙ğfN˙ğfN˙ĵfN˙ĵfN˙ĵfN˙ĵgM˙­dL˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙d65˙­^\˙­^\˙­_[˙­_[˙­_[˙­_[˙_[˙_[˙üùù˙˙˙˙˙âÌË˙ñìì˙ŭüü˙Ħvs˙[1/˙q=:˙ZU˙Ż`Z˙Ż`Y˙Ż`Y˙Ż`Y˙ׯĴ˙ŝŝŝ˙ùóó˙ÖÁ˙˙˙˙˙ÔÁż˙l;6˙_3/˙˜SK˙ŻaX˙ñäâ˙˙˙˙˙Á—’˙b60˙j93˙ WN˙ħ`V˙²aW˙²aW˙²aV˙²bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´cU˙NJ˙ŝŭŭ˙ĝñ˙‰SI˙\2*˙‡J>˙°`R˙µcS˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dQ˙¸dQ˙¸dQ˙¸eQ˙¸eQ˙¸eQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙şeP˙şeO˙şfO˙şfO˙şfO˙şfO˙şfO˙ğfO˙ğfN˙ğfN˙ğfN˙ğfN˙ğfN˙ĵfN˙ĵgN˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙½gM˙½gM˙½gM˙½gL˙½gL˙½gL˙½gL˙äÂĥ˙˙˙˙˙öìé˙ÙÉÄ˙˙˙˙˙Ĝĵ˙ġòñ˙ŭüü˙Ïş³˙˙˙˙˙äÙĠ˙äÜÙ˙˙˙˙˙Îş²˙úùĝ˙ŝŝŝ˙µŽ˙g8'˙•Q8˙½fG˙ÁiI˙ÁiI˙ÁiI˙ÁjH˙ÁjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjG˙ÂjG˙jG˙jG˙jG˙kG˙kF˙kF˙kF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ÄkE˙ĊkE˙ĊkE˙ĊlE˙ĊlE˙ĊlE˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlC˙ÇlC˙ÇmC˙ĥjC˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙n<+˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙ÀhJ˙ÀhJ˙ÀiJ˙ìÒÉ˙˙˙˙˙ÊĤ™˙êċä˙üüü˙‰i\˙@#˙]2#˙Ğ]@˙ÀhH˙ÁiI˙ÁiI˙ÁiH˙ӕ~˙ŭúù˙ïŜĜ˙ÀĞ£˙˙˙˙˙Èı´˙N*˙E%˙’P6˙iG˙óáÚ˙ŝŝŝ˙½’˙D%˙N*˙ĦW:˙ÁiF˙kG˙kG˙kG˙kG˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ĊkE˙ĊkE˙ĊlE˙ҏq˙ŭüû˙÷ïë˙uH4˙; ˙v@(˙şf@˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlC˙ĈmC˙ĈmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmB˙ÇmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈnA˙ÈnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙Én@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Êo@˙Êo@˙Ëo@˙Ëo@˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ìo?˙Ìo?˙Ìo?˙Ìo?˙Ìo>˙߇˙ŭüû˙ĉÑĈ˙´­˙˙˙˙˙Êşħ˙ïíë˙úúù˙½Ĵ˘˙ŝŝŝ˙×ÎÉ˙µ¨Ħ˙˙˙˙˙Ż›‘˙áÜÚ˙÷ġġ˙_L˙A#˙xB#˙Ái8˙Îq<˙Îq<˙Ïq<˙Ïq<˙Ïq<˙Ïq<˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙r;˙r;˙r;˙r:˙r:˙r:˙r:˙r:˙r:˙Ñr:˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñs9˙Òs9˙Òs9˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Ós8˙Ós8˙Ós8˙Ós7˙Áo9˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙xB!˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñs9˙Ñs9˙Ñs9˙Ñs9˙ܒf˙ôàÔ˙ĥ^˙§—Ž˙Ċĵ·˙gA)˙=!˙V/˙ħ`/˙r7˙Òs8˙Òs8˙Òs8˙Ôw?˙ï͸˙âĵ¤˙ˆbK˙ÓÍÊ˙Šo_˙L)˙?#˙‘P%˙Îq5˙ċ݌˙óÛÌ˙ĞlC˙F&˙O+˙Ĵ^,˙Òs6˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ġt6˙Ġu6˙Ġu6˙Ġu6˙Ġu6˙Ġu6˙Ġu6˙Ġu6˙×~C˙ñÔÀ˙äğ ˙r@˙; ˙{C˙Én1˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙×u4˙×u4˙×v4˙×v4˙×v4˙×v4˙×v4˙×v4˙×v4˙×v4˙×v4˙×v4˙×v4˙×v3˙×v3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv2˙Ĝv2˙Ĝv2˙Ĝv2˙Ùv2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw1˙Ùw1˙Ùw1˙Ùw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Ü=˙òĠÀ˙ÓЏ˙€fS˙ÔÎÉ˙‰iR˙­ —˙Äş²˙oN7˙ÒÌÈ˙™‚r˙†rc˙×ÑÌ˙“wd˙s˙ÑÈÁ˙d?%˙: ˙r>˙Én+˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Üx/˙Ŭx/˙Ŭx/˙Ŭx/˙Ŭx/˙Ŭy/˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŝy.˙Ŝy.˙Ŝy.˙Ŝy.˙Ŝy.˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝz-˙Ŝz-˙Ŝz-˙Ŝz-˙ßz-˙ßz-˙ßz-˙ßz,˙Ìu/˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙‚G˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙ä‡=˙ìŻ~˙Ċo)˙–qS˙…fL˙ƒG˙X0˙o<˙Ĉl#˙â{(˙|)˙|)˙|)˙|)˙ìŞt˙ŬŒI˙œ_.˙šƒo˙I˙l;˙V/˙¨[˙Ŝy'˙~+˙â.˙·d ˙_4˙i9˙Âj"˙â{'˙ä|(˙ä|(˙ä|(˙ä|(˙ä|(˙ä|(˙ä|'˙ä|'˙ä|'˙ä|'˙ä|'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ä}'˙ċ-˙Ĝy)˙ŒL˙S-˙•Q˙Ûw%˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ~&˙ĉ~&˙ĉ~&˙ĉ~&˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~$˙ç~$˙ç&˙ïw˙с;˙ˆX0˙ši˙‰L˙^5˙g;˙t?˙V3˙vB˙d8˙b:˙‡K˙\4˙n?˙F˙X0 ˙’P˙Ŭy!˙è#˙è#˙è#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é€#˙é€#˙é€#˙é€"˙é€"˙é€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙Öz%˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙ŠK˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙÷ˆ˙ŝùô˙ì W˙îŜÏ˙ĉĠÄ˙Âo ˙›T˙Ż_˙ä|˙ƒ˙ƒ˙ƒ˙ƒ˙ò•=˙ŭóé˙÷Ì£˙à­|˙úöó˙ʋP˙Ĵ^˙›T˙Ġt˙î˙ƒ˙ï‚˙ßy˙Ż_˙µc˙|˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ñƒ˙ñƒ˙í€˙Ém˙¨[˙Îo˙î˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ôžJ˙ŝ÷˙óż˙Û´˙÷òí˙̅A˙U˙Ş]˙Ài˙§[˙Âj˙´b˙Ż_˙Ém˙¨\˙²`˙Èl˙Ğ]˙Êm˙ï˙ó„˙ó„˙ó„˙ó„˙ó„˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ô…˙ô…˙ô…˙ô…˙ô…˙Ŝ˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙N ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ŝĝñ˙˙˙˙˙ĝĠ°˙öïè˙üûù˙H˙•Q ˙şe˙ñƒ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ûÁ„˙ŝŝŝ˙ŝôê˙ëÍ˙˙˙˙˙ĉǨ˙Ĥ[ ˙ĦX ˙|˙ĝ‡˙ùˆ˙ùˆ˙÷†˙ò„˙ó„˙ĝ‡˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ġ…˙ƒ˙ö†˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙ü̚˙˙˙˙˙üîß˙çı˙ŝŝŝ˙ğ‘˙–R ˙ıe˙í‚˙ñ„˙ġ†˙ó…˙ò„˙ġ†˙ñ„˙ò„˙ġ†˙ò„˙ġ†˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙‚˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙’P˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝè˙˙˙˙˙ò׺˙ëĉ˙ŝŝŝ˙¨{K˙\2˙ˆJ˙ĉ} ˙ŭŠ˙ŝ‹˙ŝ‹˙ŝ‹˙ŝĥi˙ŝŭü˙ŝĝñ˙ÜĈ˙˙˙˙˙×İ˙m;˙g8˙Én ˙û‰˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝ‹˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŝŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭÀ~˙ŝŝŝ˙úñç˙×ȸ˙˙˙˙˙εš˙\2˙ƒG˙ä|˙ü‰˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ĉƒ˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙’P ˙ŝŠ˙ŝŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŝĈ‹˙ŝóç˙Ĝ£l˙À²£˙ÜÖ˙xN"˙H'˙h8˙Öt ˙ûˆ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭž9˙ŝà˙öÙş˙Ĥ€X˙êĉ˙Ÿ†j˙W/˙M*˙Ż_ ˙÷†˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭI˙ŝñä˙êÊİ˙šg˙êç˙˜xX˙I(˙d6˙Ôs ˙ü‰˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙ŭŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙ċƒ˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙ŽN ˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷'˙÷ĦJ˙Ît˙{T*˙z_C˙wA ˙V/˙q= ˙Öu˙ö†˙÷‡˙÷‡˙÷‡˙÷Š˙ùĞ\˙è.˙‘R˙iR˙sE˙e7˙V/˙³a˙ò„˙÷•0˙ĝ£L˙÷‰˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‰˙ĝš;˙÷‡˙÷“-˙÷(˙÷‡˙ĝœ>˙÷ˆ˙÷!˙ĝ—5˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙ĝ F˙ĝ™9˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷”.˙÷'˙÷‡˙ĝœ>˙ĝ‡˙ĝŽ"˙ĝ–3˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝˆ˙ù›=˙ĝ‡˙ĝ'˙ĝ“-˙ĝ‡˙ùš;˙ĝ‰˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‹˙÷ŸG˙Ġ~'˙rD˙„kR˙zG˙b>˙~R%˙Ôs˙ĝ™:˙ĝ‰˙ĝŠ˙ùš9˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝ˙ù™6˙ĝˆ˙ĝ—4˙ĝ"˙ĝˆ˙ù?˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝ$˙ĝ–1˙ĝˆ˙ùš8˙ĝŒ˙ĝ‹˙ù›;˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙á˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙ˆJ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ñ˘[˙ĝÓħ˙àD˙Ѱ“˙ĜÂ˙´e˙’O˙¤Y˙ßy˙í˙í˙í˙í˙î4˙ûäÏ˙ï­q˙NjU˙ĉÚÏ˙ız@˙£Y˙‘O˙Ío˙ë˙ġş…˙ŭöï˙ïR˙á{˙|˙ë€˙í‚˙í‚˙í‚˙í‚˙ô´z˙úâË˙ï•C˙öÓ³˙ò½Œ˙ï£\˙úĉÓ˙Şi˙Żs˙ĝŬ˙í<˙ĉ~˙è˙í‚˙í‡(˙ûĉÓ˙úŜÄ˙è‚%˙àz˙è~˙î‚˙î‚˙î‚˙î‚˙ï3˙ùÖµ˙öŠ˙í8˙úĉÔ˙ñ¨e˙ñħw˙ĝÛÀ˙î:˙ĉ}˙ê˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙óĞi˙ûĉÒ˙ï8˙óĵŠ˙÷Ô³˙î”B˙ùáÊ˙ò´z˙è˙ç˙ì˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ñ’9˙ùŞ˙è£a˙_˙èÛÎ˙Á~>˙Òĥœ˙Üż˙ä”I˙ùÎ˙óµ{˙ï¤]˙ùáË˙ñšI˙è~˙ì€˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙„ ˙÷ż‹˙úÚğ˙ñ—D˙ĝÛÀ˙ó²u˙ñİf˙ûèÖ˙ò˘V˙è~˙ë€˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙†"˙ĝʞ˙ùŞ˙šI˙ùáÊ˙ò§_˙ò´y˙úÎ˙›J˙è~˙ì€˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙Ú} ˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙F˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŭy.˙Ŝy.˙Ŝy.˙Ŝy.˙òË˙ŝŝŝ˙îÈĴ˙÷ïé˙û÷ô˙ˆS˙V˙_#˙×v+˙Ŝz-˙Ŝz-˙Ŝz-˙Ŝz-˙벅˙ŝŭü˙úí˙äĈŻ˙ŝŝŝ˙á˘˙Ĵ^"˙žV˙Îp(˙ßz,˙ġÙ˙˙˙˙˙âİ}˙šT˙žV˙q)˙Ŝy+˙ßz,˙ßz,˙ßz,˙÷àÏ˙ŝüû˙êÀž˙üùĝ˙ôéà˙çɰ˙˙˙˙˙ëÑĵ˙àÔ˙ŝŝŝ˙Ӕb˙Ş\ ˙·c#˙Úw)˙ċ“R˙ŭ÷ó˙üóí˙½n2˙N˙¸e#˙Ŭy*˙á{+˙á{+˙á{+˙ç•V˙ŝûú˙úìà˙ğš˙ŝŝŝ˙ìş˙òäĜ˙ŝŝŝ˙ӓ_˙Ş]˙ğf#˙Üx)˙â{*˙â{*˙â{*˙â{*˙â{*˙â{*˙ġÓ¸˙ŝŝŝ˙뿛˙ôéà˙üúĝ˙ĉ½˙ŭüû˙ŬÍ˙ıd!˙Ğ]˙Òr&˙áz(˙â{)˙â{)˙â{)˙â{)˙{)˙{)˙{)˙|)˙|)˙|)˙|)˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙|(˙ë£h˙ŝüû˙ĝċ×˙èÏş˙ŝŭŭ˙ċżĦ˙ĝóï˙ùô˙äŸ˙ŝŝŝ˙òà˙éÒż˙ŝŝŝ˙Ŭİ~˙Ĵ]˙h ˙Ŝz&˙ä}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ.˙ûìß˙ŝúĝ˙罚˙ŝŝŝ˙óâĠ˙éÏş˙˙˙˙˙ĉœ˙Ş]˙ğf˙ßy$˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ĉ}&˙ç„1˙ŭ÷ó˙ŭ÷ó˙ċż˙ŝŝŝ˙ïÖÀ˙îŬÎ˙˙˙˙˙ß­‚˙Ş]˙k˙â{$˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙Ñx(˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙u@$˙Ìo>˙Ìo>˙Ìp>˙Ìp>˙Ìp>˙Ìp>˙Ìp>˙Íp>˙öĉŬ˙˙˙˙˙ëÓÇ˙ñìê˙ŝŝŝ˙ xa˙X0˙vA#˙ĵf7˙Íp=˙Íp=˙Íp=˙Îp=˙‘˙ŝŭŭ˙û÷ô˙ÖÄı˙˙˙˙˙ĠÄş˙h9˙^3˙¨\1˙Ìq<˙öçŜ˙˙˙˙˙Ϟƒ˙\2˙[2˙_1˙Íp:˙Ïq;˙Ïq;˙Ïq;˙ôßÓ˙˙˙˙˙âÇ·˙úùĝ˙öóñ˙Ó¸˙˙˙˙˙ĜÈż˙ñìê˙˙˙˙˙Ħya˙\2˙q>˙ğf4˙ەk˙ŝŭŭ˙úòî˙’W5˙L)˙ƒG$˙Çl6˙Ñr9˙Ñr9˙Ñr9˙ڎa˙ŭûú˙ûġò˙ÙĊş˙˙˙˙˙ÙÇĵ˙ôñï˙˙˙˙˙ v]˙[2˙xA ˙Ài3˙Òs8˙Òs8˙Òs8˙Ós8˙Ós8˙Ós8˙ĵ˙˙˙˙˙ċͽ˙ġóñ˙úùĝ˙ĠÀ³˙˙˙˙˙àÔÍ˙o<˙]3˙ĤZ+˙r6˙Ôt7˙Ôt7˙Ôt7˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt5˙Ġu5˙Ġu5˙Ġu5˙Öu5˙鷕˙ŝŝŝ˙ùë˙ÙÊÀ˙˙˙˙˙×Ċı˙ôò˙ŭüü˙ÍıĴ˙˙˙˙˙ċÙÒ˙äŬĜ˙˙˙˙˙µ“}˙^3˙{B˙Äj/˙×v4˙×v4˙×v3˙×v3˙Ĝv3˙Ùz:˙ùëâ˙˙˙˙˙×­˙ŝŝŝ˙óîë˙ÓĊĵ˙˙˙˙˙Ç­œ˙X0˙t?˙Âi,˙Ĝu1˙Ùv2˙Ùv2˙Ùw2˙Ùw2˙Ùw2˙Û~=˙ŭĝô˙˙˙˙˙ÑğĞ˙˙˙˙˙éßĜ˙ŜĠÎ˙˙˙˙˙·˜˙V/˙‚G˙Ên-˙Úw1˙Úw1˙Ûw0˙Ûw0˙Ûw0˙Ûx0˙Ĉs2˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙k:.˙ıfP˙şfP˙şfP˙şfP˙şfP˙şfO˙şfO˙şfO˙á½³˙ŭûû˙Î˙êĉċ˙îìë˙iLC˙7˙O+!˙ŸVB˙şeM˙ğgN˙ğgN˙ğgN˙Ȅp˙û÷ġ˙îàÛ˙½­§˙üüü˙£“Ž˙A#˙: ˙ƒH6˙·eL˙óŜ˙ŝŝŝ˙ĵ“†˙A#˙G&˙™S=˙ğgK˙½hL˙hL˙hK˙ïÚÓ˙üúù˙½–ˆ˙ĉâá˙ïíì˙“Ž˙ùĝĝ˙Äıµ˙ËÀ˙ûúú˙€e\˙8˙R,˙Ĥ[@˙΍u˙ŝŭü˙ĝî˙tG7˙6˙m<)˙´bD˙ÀiI˙ÁiI˙ÁiI˙͆l˙üĝ÷˙ïŜĜ˙Ċ²Ğ˙üüü˙§”˙ÈĈ˙ûûû˙}cX˙7˙Y1!˙Ĵ^@˙ÁiG˙ÂjG˙jG˙jG˙jG˙jG˙éÊ˙ŭúù˙ʨš˙íì˙ĉâà˙—w˙ĝ÷÷˙ÔËÈ˙E%˙>!˙ŒL2˙żhD˙ÄkF˙ÄkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊlE˙ĊlE˙ĊlE˙ĊlD˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlC˙ĈlC˙ÇlC˙Ġ“u˙ŭúù˙èĠÌ˙Ċı³˙ûúú˙˘Ž„˙ĠÏÍ˙ùùĝ˙ŸŒƒ˙÷÷ö˙×ÏÊ˙ıİ˙ûúú˙™‚w˙9˙]3˙²a9˙Èm@˙ÉnA˙ÉnA˙Én@˙Ên@˙ËsF˙öçß˙ûöó˙ވw˙ïíì˙ëçċ˙Ĥ–˙ûúú˙ħŸ•˙9˙V/˙Ż`6˙Ên>˙Ëo?˙Ìo?˙Ìo?˙Ìo>˙Ìo>˙ÎvH˙ûôñ˙ĝì˙˘„t˙öġô˙ŬÖÑ˙´¨˘˙ûúú˙‡{˙7˙e7˙şe7˙Îp=˙Îp=˙Îp=˙Îp=˙Îp<˙Îp<˙ğl<˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙a58˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\_˙ĥvx˙Ó­˙–]_˙z{˙˘˜˜˙J)*˙2˙I((˙‘OP˙İ\]˙Ş]^˙Ş]^˙Ğ]^˙Żef˙ÑĤĤ˙µ~~˙xTT˙··˙Y>>˙=!!˙6˙zBB˙§[Y˙Ö°Ż˙ñää˙—fd˙8˙@#"˙ŒLJ˙Ğ]Z˙­^[˙­^[˙­^[˙Ċˆ˙âÇĈ˙‹QN˙˜‰ˆ˙•†…˙[<:˙“‡‡˙kSQ˙^FD˙™Œ˙X87˙4˙L)&˙˜SM˙ĥng˙íÜÚ˙ÜÁż˙`62˙0˙d62˙ĤZR˙ħ`X˙ħ`X˙ħaX˙µj`˙ĠŞ˙ı~w˙}XT˙Áşı˙[=:˙vca˙­˘Ħ˙[:7˙4˙S-(˙ŸWL˙²aU˙³bV˙³bV˙´bU˙´bU˙´bU˙ƒy˙ÖĴ˙•[R˙•†ƒ˙™‹ˆ˙Q1+˙·°˙}d`˙B$˙9˙‚G<˙ħ`Q˙ĥcS˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙·dS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dR˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙ıeP˙p]˙Ù£˙ug˙rVO˙ż·µ˙\<3˙oj˙Нš˙^=4˙€|˙}d]˙Y?8˙œ‹˙dD;˙7˙X0$˙ZE˙ğfL˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙ĵhO˙ӛ‰˙ß³˙uC4˙™–˙’}v˙X;2˙œ‹˙lMB˙9˙Q, ˙¤ZA˙gJ˙żhK˙żhJ˙żhJ˙żhJ˙żhJ˙ÀjL˙Úİ—˙Ĝ²¤˙h=,˙´Ş§˙‰oe˙X>4˙ž‹˙fF:˙8˙`4$˙Ż_A˙ÂiH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjG˙°fG˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙X0@˙˜So˙˜So˙˜So˙™So˙™To˙™Tn˙™Tn˙™Tn˙İo…˙ıŠ›˙–]r˙‡jt˙hq˙b7F˙F&1˙\2@˙Nd˙›Um˙›Ul˙›Ul˙›Ul˙Ħ^t˙ş‰˜˙Ĵu‡˙…Zh˙‰sz˙oGS˙R-8˙K)3˙GX˙›Ui˙t„˙ż’Ÿ˙„L[˙?"*˙G&/˙†JY˙œVh˙¨iy˙ş†“˙Ğm}˙ŸXj˙£aq˙„HV˙T2:˙[5>˙j:D˙L-5˙Z2:˙]3<˙T2:˙f7A˙R-4˙]3;˙’P\˙ĦYg˙À—˙ħ|†˙a5=˙8#˙h9@˙›U`˙£Ye˙·~‡˙ğ…Ž˙Ĥ^j˙Ĥ_i˙œV`˙m˙d7:˙T57˙m=@˙tOP˙fg˙’\_˙ĤZ^˙İ\_˙İ\_˙İ\_˙İ]_˙Ş]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]]˙Ğ]]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙³ih˙ĈŽ˙Żsr˙ƒ\[˙‘xv˙{NL˙‚ig˙Œmk˙tB>˙hg˙zQO˙vOL˙‹qo˙€SQ˙W0,˙i95˙˘XR˙°`Y˙°`Y˙°`X˙ğvo˙nj‡˙¸pi˙²c[˙Żf]˙zC<˙W51˙sA:˙g82˙U3.˙p=6˙{ZU˙nj˙Ĥ_V˙²aU˙³bU˙³bU˙´bU˙À}r˙ȍ„˙ıma˙ĥfX˙ŻdW˙r>5˙Z82˙zD;˙`4,˙\6/˙s>4˙~^W˙™tm˙İ\L˙ĥcQ˙·dR˙·dR˙·dR˙·dR˙¸dQ˙§aP˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙Q,F˙Mz˙Mz˙Mz˙Mz˙Mz˙My˙ŽNy˙ŽNy˙γĊ˙ŭüü˙²Š˙ïéí˙òî˙a~˙d6T˙p=^˙‹Mu˙Ow˙Ow˙Ow˙Ow˙p‘˙ú÷ù˙ŬÊĠ˙İı˙üûü˙½˘ħ˙n[˙ŽNr˙Ħi‰˙÷òġ˙˙˙˙˙´•Ĥ˙T.B˙c6N˙ˆKk˙‘Or˙’Pr˙‘Op˙Op˙ı¤˙ŝŝŝ˙ìâç˙qBY˙T.@˙t@Y˙“Pn˙ħż˙˙˙˙˙ôîñ˙l@T˙X/A˙|D\˙’Pl˙•Ro˙–Ro˙“Pk˙˜Up˙ìàċ˙˙˙˙˙²Žœ˙[2B˙c6G˙ŒMd˙™Sm˙šTn˙šTm˙šTm˙›Um˙›Um˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUk˙œUk˙Vk˙Vk˙Vk˙Vj˙Vj˙ͨ³˙ŝŝŝ˙ìâä˙ÑĈ˙˙˙˙˙ÒÂĈ˙ôòò˙ŭüü˙Ĉĥş˙˙˙˙˙âĜÚ˙ċŬß˙˙˙˙˙ݐ—˙\2:˙h9C˙•Q_˙˘Xf˙˘Xf˙˘Zg˙ċÒĠ˙˙˙˙˙Ô½Á˙b6=˙og˙ˆJ{˙‹K|˙‹K|˙‹L|˙•[†˙ëàè˙żĦ·˙‹t…˙èçè˙{jw˙1+˙)#˙_4R˙‰Jv˙ÒıË˙öñô˙Œf€˙.'˙4-˙s>b˙ŒLx˙r”˙öòġ˙Ÿw‘˙>!4˙*#˙^3N˙‹Ks˙Nw˙Nw˙Ow˙Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙’Ou˙’Ou˙ f‡˙ñéí˙ŜÎ×˙R0C˙( ˙T-B˙ŠKm˙“Pt˙Ñ´˙ċ×Ŝ˙d>Q˙(˙˙2#˙`4C˙“Pg˙›Ul˙Ğq„˙ĥ†–˙p?O˙8'˙S-:˙Na˙›Uj˙Vk˙Vk˙Vk˙žWk˙¸…”˙­{‰˙b5B˙9&˙n"(˙xAN˙œUe˙ Xh˙ Xh˙ Xg˙ Xg˙Şhu˙”ž˙ŠT_˙D%+˙O+2˙MZ˙ĦXe˙˘Yf˙˘Yf˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙Zc˙İaj˙ē˜˙£kp˙nOR˙np˙b:>˙I02˙iOR˙Q,/˙WBC˙gDF˙T14˙fOQ˙`7:˙B$&˙X/2˙™SV˙¨[^˙İ\_˙İ]_˙³oq˙ǖ˜˙WW˙E%&˙V//˙–RR˙Ş\]˙Ğ]^˙Ğ^]˙Ğ^]˙Ĵ^]˙ş{z˙À‹‹˙q>=˙>"!˙p=;˙ĤZX˙­_\˙ıvs˙ǖ“˙„LI˙A#"˙b53˙ĦWS˙_Z˙Ż_Z˙Ż`Z˙Ż`Y˙Ż`Y˙À‚}˙ğ…€˙g84˙B$!˙‚GA˙­^V˙ħaX˙ħaX˙ħaW˙ ]U˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙Z1>˙Vk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žWj˙žWj˙œ\l˙ĉŬß˙ċŬß˙Ħx‚˙èâ˙ÄŻ´˙“Qb˙—Rc˙Ħ]l˙éĜÜ˙ĉÓ×˙²{‡˙óëí˙ÛÂÇ˙FQ˙`4=˙|CO˙r>I˙m;E˙‘O\˙ŸWe˙Ġ³ş˙òéë˙¤py˙a5=˙f8@˙”Q]˙ĦXd˙£Ye˙£Ye˙Ua˙ĜÈË˙îéê˙²„‹˙èÙÛ˙ÏÒ˙À—˙ġîï˙Ċš ˙žV`˙žV_˙£Yb˙Zc˙Zc˙Zc˙ks˙îàâ˙ßÇÉ˙HM˙[26˙GL˙˘Y`˙§[a˙Óħ˙òèé˙žch˙f8;˙}EI˙˘Y]˙¨\`˙¨\`˙¨\`˙¨\`˙­fj˙ää˙êĜĜ˙‹OR˙d68˙‹KN˙§[]˙³np˙ñċċ˙Ôħ²˙{CD˙l;;˙˜ST˙Ş\]˙Ğ]]˙Ğ]]˙Ğ]]˙Ğ]]˙Ï£˘˙÷ñ˙ż’‘˙p=<˙v@?˙ĦXV˙­^\˙­^\˙­^[˙­^[˙­_[˙­_[˙_[˙_[˙_Z˙_Z˙_Z˙Ż_Z˙Ż_Z˙Ż_Z˙Ż_Z˙Ż`Y˙Ż`Y˙°`Y˙†˙÷ïî˙×ĥ³˙ǰ˙ëë˙°‡ƒ˙j95˙{C=˙ŒMF˙q>7˙‰JC˙†IA˙u@9˙‘OF˙yB;˙„H@˙Ğ]R˙³aV˙³aV˙³bV˙ĠŞ£˙ĝñ˙Àˆ˙p=5˙‚G=˙Ĵ^Q˙´bU˙µbU˙µbT˙µbT˙·gY˙êÔ˙îÜÙ˙ž^R˙n<2˙’OB˙³aQ˙ĥcS˙Ŝş³˙ĝï˙²}p˙n<1˙ŒL?˙²aP˙·dR˙¸dQ˙¸dQ˙¸dQ˙½n]˙ïŜÚ˙êĠÏ˙‘O?˙q=0˙žVD˙·dO˙ıeP˙şeO˙şeO˙¨aN˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙c65˙­^[˙­_[˙_[˙_[˙_[˙_[˙_[˙_[˙_Z˙_Z˙ħgb˙öîî˙ŝŝŝ˙Ôğş˙˙˙˙˙êââ˙ˆMI˙t@;˙Ħid˙ŝŭŭ˙üùù˙ÌŞ§˙ŭüü˙ìâá˙ŠTO˙f84˙ŠKE˙YR˙§[S˙Ż_W˙ħaY˙ñâá˙˙˙˙˙Ċ˜”˙q>8˙wA:˙ZP˙²aW˙²aW˙²aW˙ħ`V˙ìÚĜ˙˙˙˙˙ÛÂż˙úĝĝ˙öóò˙ÙÄÁ˙˙˙˙˙×À˙‚G>˙|D;˙ĦXM˙³aU˙´bU˙´bU˙Ĉˆ˙ŝŭŭ˙ĝñ˙”XO˙k:2˙’OD˙²aR˙½tf˙öíë˙ŭûú˙‹‚˙r>5˙ƒG<˙_O˙ĥcS˙ĥcS˙ĥcS˙ĥdS˙Lj{˙üĝĝ˙òċ˙’SF˙i9/˙O@˙³bP˙Ù¤˙ŝŝŝ˙ìÚÖ˙OA˙t?3˙ XF˙ĥdP˙¸eQ˙¸eQ˙¸eP˙¸fR˙çÌĊ˙˙˙˙˙ȚŽ˙t?2˙yB4˙Ğ]J˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙ğfN˙ğfN˙ğfN˙ğfN˙ğgN˙ğgN˙ĵgN˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙Û­ ˙ŝŝŝ˙íÛÖ˙ÖÄż˙˙˙˙˙δĴ˙n<,˙ƒH4˙°`F˙²aG˙·dI˙ĥcI˙³bF˙ıeI˙³bF˙·cH˙gJ˙żhK˙żiK˙żiK˙ìÒÉ˙˙˙˙˙Ĝ¸Ĵ˙t@-˙…H3˙µcE˙ÀiJ˙ÀiI˙ÀiI˙ÀiI˙ÇwZ˙üù÷˙ŭüû˙¨q[˙u@,˙ŸW;˙hG˙ÄoO˙ñŜ×˙˙˙˙˙ˤ•˙q=*˙N4˙ğfD˙jG˙jG˙kG˙kG˙ͅh˙ŝŭŭ˙ŝŭŭ˙N3˙yB+˙Ğ]=˙ÂjE˙ÄkE˙ÄkE˙ÄkE˙ħgD˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙n<+˙żhJ˙żhJ˙żhJ˙żhJ˙żiJ˙żiJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiJ˙qT˙ĝí˙ŝŝŝ˙Ôĵ³˙˙˙˙˙ĉáß˙^5'˙B$˙ŠXG˙û÷ö˙ŭúù˙ε­˙ŝŝŝ˙ïëê˙rK<˙A#˙yB-˙·eD˙ÂjH˙ÂjH˙ÂkI˙ôċà˙˙˙˙˙—‡˙M*˙V/˙Z<˙ÀiF˙jG˙jG˙jG˙ñŬĠ˙˙˙˙˙ÛÄş˙ùùĝ˙ôòñ˙˸˙˙˙˙˙Éĵĥ˙R,˙K)˙•Q5˙ÀiD˙ÄkF˙ÄkF˙Ӑu˙ŝŭŭ˙ùòï˙M8˙D%˙}D,˙ĵgB˙΃b˙ûöô˙ŝŭŭ˙ĵ“‚˙J)˙h9$˙´b=˙ĊkC˙ĈlD˙ĈlD˙ĈlD˙ÚĦ‡˙ŝŝŝ˙ôĉà˙|H1˙D%˙…H,˙Ài@˙ç°˙˙˙˙˙óèâ˙l?*˙M*˙–R2˙jA˙ÇmB˙ÈmB˙ÈmB˙ÉoE˙ġċŬ˙˙˙˙˙ʂ˙Q,˙]2˙_9˙Èm@˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Êo@˙çżĞ˙ŝŝŝ˙óèâ˙Ͻ˙˙˙˙˙Ż˙F&˙\2˙Ż`6˙Ên>˙Ìo?˙Ìo?˙Ìo>˙Ìo>˙Ìo>˙Ìo>˙Ìp>˙Ìp>˙Ìp>˙Ìq?˙ġâÙ˙˙˙˙˙Ûĸ˙K)˙d6˙´b5˙Ìo<˙Íp=˙Íp=˙Îp=˙Ò{L˙ûóï˙ŝŭü˙ŽcJ˙G'˙ŠK(˙Ĉm9˙xF˙ĝìċ˙˙˙˙˙̰ ˙F&˙q> ˙żh6˙Ïq;˙Ïq;˙Ïq;˙q;˙ׇY˙ŭù÷˙˙˙˙˙i9˙M*˙V+˙Íp9˙r:˙Ñr:˙Ñr:˙ĵm;˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙xB!˙Ñr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òs9˙Óx@˙ġáĠ˙ûöò˙ĊŸˆ˙öġô˙Ì˙P-˙8˙xC!˙êË·˙ĝìċ˙£sW˙ëèĉ˙ÍÂĵ˙S.˙7˙p=˙Ái3˙Ós8˙Ós8˙Ós8˙ñÔÂ˙ŭù÷˙ş‡g˙E&˙N+˙Ğ^,˙Ñs6˙Ót7˙Ôt7˙Ôt7˙ïÍ·˙ŭûú˙׏˙ìèĉ˙áŬÚ˙İ—‹˙ûûû˙­’˙E%˙A#˙–R&˙Ïq4˙Ôt6˙Ôt6˙܌Y˙üġ˙óâ×˙vF&˙; ˙yB˙Èm1˙Ġv8˙öâĠ˙÷êá˙Z7˙9˙[2˙·d-˙Ġt4˙Öu5˙Öu5˙Öu5˙à˜i˙ŭù÷˙ìÔ˙l>˙=!˙‹L!˙Ïq2˙âžq˙ŝŭü˙ÔЏ˙R,˙?"˙N"˙q2˙×u4˙×u4˙×u4˙×v6˙òÔÀ˙ŭûù˙³`˙D%˙^2˙ğf,˙×u2˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ùv3˙Ùv3˙Ùv2˙Ùv2˙à’\˙üġñ˙ßÂŻ˙ݘŒ˙ûúú˙¨‘‚˙>"˙R-˙´b)˙×v1˙Ùw2˙Ùw1˙Ùw1˙Ùw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙譄˙ŝüú˙ı’u˙>"˙U.˙²a'˙Ĝw/˙Ûx0˙Ûx0˙Ûx0˙Ûy1˙ïĈ¨˙ùê˙U4˙=! ˙…H˙r-˙Ûx/˙íğ—˙ŝüû˙˘y[˙: ˙b5˙Âi)˙Ûw.˙Üx/˙Üx/˙Üx/˙Ü{3˙óÒş˙÷íċ˙a5˙C%˙œU ˙Ĝv-˙Ŭy.˙Ŭy.˙Ŭy.˙Ĉs0˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙‚G˙â{*˙â{*˙â{*˙â|*˙â|*˙â|*˙â|*˙â|*˙â|*˙â|*˙â|*˙éœ^˙éİt˙­f,˙™…u˙{`I˙`7˙M0˙‡K˙Ŝ’S˙èĤq˙¨\ ˙Šq\˙qW˙k:˙F& ˙„H˙Ôt&˙â|)˙â|)˙|)˙é™X˙í´†˙³g*˙Q,˙[2˙ğf!˙á{'˙|(˙|(˙|(˙ç’M˙íŻ}˙·k-˙Šr]˙€gS˙oG&˙Ž|n˙rN/˙W3˙U3˙ĤZ˙Ŝy'˙|(˙|(˙~,˙îŻ}˙àœe˙~E˙D% ˙ˆJ˙×u%˙ä|(˙íŞs˙çp˙˜T˙G& ˙s>˙Ìo#˙{'˙ä|(˙ä|(˙ä|(˙ä€.˙˙Ĝ’X˙o=˙F& ˙šT˙Ŭy%˙çŒ@˙ïı‹˙É|=˙b5˙P, ˙§[˙ßz&˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ê˜S˙íµ‡˙£\#˙K) ˙j:˙Ên"˙ä|&˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ€)˙îħ}˙‘[˙vP/˙žŒ|˙ƒU.˙R1˙e<˙Âj ˙ĉ„0˙ĉ+˙ĉ+˙ç…1˙ĉ'˙ĉ+˙ĉƒ.˙ĉ~&˙ĉ~%˙ĉ~%˙ĉ~%˙ç‡5˙˙³s=˙O+ ˙e7˙Äk˙ä}$˙ĉ~%˙ĉ€(˙è…1˙ç'˙ë•L˙èİt˙‘P˙N* ˙’P˙Ŭy#˙ç~%˙é>˙ìĥˆ˙˘e0˙I( ˙t@˙Ñs ˙ç$˙ç$˙ç‚)˙è†0˙ç€%˙ìœV˙âĦj˙€F˙R- ˙Ş]˙ä}#˙è$˙è$˙è$˙x'˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙ŠK˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙í€˙Ò~1˙ßÏÀ˙ÄĦ˙‘g˙âÖË˙ÁB˙ġ˙öͧ˙Óu˙N˙ W˙°_˙ƒG˙³a˙é~˙ï‚˙ï‚˙ï‚˙ġ¸˙úßĈ˙փ6˙…H˙M˙Ùu˙ï˙‚˙‚˙‚˙‚˙ï˙Ġs˙ŒK˙ŒK˙ĦW˙D˙žV˙ÊŞŒ˙Ŝͽ˙Îw'˙è}˙ì˙‚˙ñŠ,˙úĜı˙ô—˙­^˙yA˙µb˙ê~˙‚˙ö´v˙úßĈ˙Ĉv,˙}C˙­]˙ç~˙ƒ˙ƒ˙ƒ˙ƒ˙„˙ĝĈ–˙︃˙ĦY˙|C˙Âj˙í˙Š*˙úÜż˙췄˙“P˙ŠK˙Ós˙î˙ƒ˙ƒ˙ƒ˙ƒ˙ò•>˙úàÇ˙Ì|0˙€F˙œU˙àz˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙Š)˙úÙş˙èU˙ş…T˙ÖÊ˙ĵ~D˙ÉŻ˜˙ÜÇ´˙ߌ>˙úâÌ˙ôµy˙óµz˙ùßÇ˙ï“<˙òµ|˙öȜ˙î‚˙ê˙î˙ƒ˙ò™D˙úŬÁ˙ւ1˙‰K˙–R˙ßy˙ƒ˙ƒ˙ô¨a˙ûċ˙ñžO˙öË£˙÷Òħ˙o ˙ˆJ˙ğf˙ë€˙ƒ˙ó˘U˙úÛ˙Ës!˙‚F˙˘X˙ĉ}˙ñƒ˙ñƒ˙ö³t˙ûâÊ˙òšG˙ĝÓħ˙ġË£˙ĥc˙‰J˙Ém˙ï˙ñƒ˙ñƒ˙ñƒ˙Ĝ|˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙N ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ö­b˙ŝŝŝ˙ùêÚ˙ï׿˙˙˙˙˙ĉÄĦ˙ŭûù˙üĝô˙р-˙ X ˙h˙ĉ~˙Ŭy˙é€˙ö†˙ĝˆ˙ĝˆ˙ĝˆ˙ŭèÒ˙ŝŝŝ˙í­l˙¤Z ˙­^˙è˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ó…˙à{˙á{˙ç~˙Üy˙ĉƒ˙ûċ˙ŝŭŭ˙äœR˙·d˙Én˙ñ„˙ù¤M˙ŝŭû˙ŭóç˙Éu˙šT ˙Ìp˙ġ†˙ĝ&˙ŭëĜ˙ŝúö˙â˜K˙ X ˙şf˙ïƒ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ùœ=˙ŝöî˙ŭèÔ˙Îu˙¤Z ˙×v˙ö†˙ú·q˙ŝŝŭ˙ùÚı˙ıf˙ĦX ˙Ûx˙ö†˙÷‡˙÷‡˙÷‡˙÷‡˙û̜˙ŝŝŝ˙î­j˙­^˙ıe˙í˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙ú´n˙ŝŭû˙ùÙ¸˙çÉĞ˙ŝŭü˙°}˙÷ñì˙ŭûú˙êĊ ˙˙˙˙˙óßÊ˙òáÑ˙ŝŝŝ˙ĉ·ˆ˙ôèÜ˙ûöñ˙ߑB˙h˙ßz˙ġ…˙û˙ŝŝŭ˙ñğ„˙Ğ]˙ğf˙î‚˙÷‡˙÷‡˙üÔĴ˙˙˙˙˙ôΨ˙û÷ò˙ŭúĝ˙˃:˙žV ˙q˙ġ…˙÷Š˙üÛı˙ŝŭü˙éŞk˙Ĥ[˙Ċl˙ò„˙÷‡˙÷ˆ˙üàÄ˙ŝŝŝ˙É ˙ŭüû˙ŭüú˙ıe˙ W˙Úw˙ö†˙÷‡˙÷‡˙÷‡˙Ŭ˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙‘O ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙ŭ³e˙˙˙˙˙üîà˙çÖ˙˙˙˙˙Ñğ£˙üûú˙úùĝ˙–a(˙^3˙’P ˙é˙û‰˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙ŝëÖ˙˙˙˙˙áİl˙m<˙xB˙Ùw˙úˆ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙üŠ˙û‰˙û‰˙üŠ˙û‰˙üŽ˙ŝòċ˙˙˙˙˙“Q˙f8˙†I ˙ä|˙ü§M˙ŝŝŭ˙ŭôë˙£a˙_4˙§[ ˙ñƒ˙û;˙ŝúö˙ŝŝŝ˙Ûİt˙h8˙‹L ˙ĉ}˙û‰˙û‰˙û‰˙û‰˙ü³g˙ŝŝŝ˙üëĜ˙Żd˙l;˙şe ˙ö†˙ŭÒ˙˙˙˙˙üñċ˙S˙j:˙Ái ˙÷†˙û‰˙û‰˙û‰˙û‹˙ŝêĠ˙˙˙˙˙ċİl˙}D˙ŠK ˙|˙úˆ˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙ŭÏ ˙˙˙˙˙ûä˙ŬËı˙˙˙˙˙àʲ˙ġòï˙ŭüü˙Ġ˙˙˙˙˙ĉÚÍ˙Ú˙˙˙˙˙Òĵ˙úùĝ˙ŝŝŝ˙•h˙k;˙Ż` ˙ñ„˙ŝìÙ˙˙˙˙˙îÔ¸˙s@ ˙‘O ˙ä}˙ùˆ˙ú‰˙ŭ×°˙˙˙˙˙éÊŞ˙÷ġó˙ŭüü˙”f6˙_4˙­_ ˙òƒ˙ú!˙ŝóç˙˙˙˙˙Áž˙l;˙žV ˙ì€˙úˆ˙ú‰˙ŭÈ˙˙˙˙˙à¢˙üûû˙˙˙˙˙v@ ˙e7˙Âi˙÷†˙úˆ˙úˆ˙úˆ˙à€˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙‘O ˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙û‰˙üĴX˙ŝüú˙úċÏ˙ĜĊ°˙ŝŝŝ˙¨v˙ÜĠÍ˙úùĝ˙yP'˙D%˙xA˙á{˙úˆ˙û‰˙û‰˙û‰˙û‰˙û‰˙ŭâĈ˙ŝŭü˙Ӛ_˙S-˙_4˙Ëo˙ĝ‡˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙ŭÓ¨˙˙˙˙˙ČR˙L)˙k:˙Ùv˙ú D˙ŝúġ˙ûíŜ˙ŒR˙F&˙‘N ˙ì€˙úŒ˙ŝéÔ˙ŝùô˙Ĵr6˙E%˙l;˙×u˙ù‡˙úˆ˙úˆ˙úˆ˙ûĴ[˙ŝüú˙ĝáÉ˙ƒJ˙J(˙¤Y ˙òƒ˙û°c˙˙˙˙˙ì˨˙d6˙K)˙¨[ ˙òƒ˙úˆ˙úˆ˙úˆ˙ú‰˙ŭâĊ˙ŝŝŭ˙̕\˙S-˙n<˙Ĝv˙ĝ‡˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙úİU˙ŝúö˙ëÍ˙ğŞ—˙ŝŝŝ˙Ċħ˙éċá˙ĝöġ˙·Ħ‹˙ŝŝŝ˙ÓÇş˙Ş™‡˙˙˙˙˙–}˙ÔÍĈ˙ġó˙|U+˙C$˙…I ˙ċ}˙û‰˙ŝŝŝ˙Ë t˙K)˙e7˙Ïq˙÷†˙ùˆ˙üÏĦ˙˙˙˙˙ÖŻ‡˙ÏĈ½˙ŭüü˙zX4˙E%˙˜S ˙í˙ù‰˙üΟ˙ŝŝŝ˙µ‡X˙E%˙t? ˙Ûx˙ĝ‡˙ù‰˙ŭÛ¸˙ŝŝŭ˙Ċt˙ŜĜÒ˙˙˙˙˙W0˙L)˙ħa˙ô…˙ùˆ˙ùˆ˙ùˆ˙߀˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙M˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġŒ%˙úǕ˙ì`˙£tF˙µ¨›˙sI!˙ Œy˙µĤ—˙N˙K)˙u? ˙Üw˙ô„˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙÷İ\˙ùɚ˙Àq#˙U.˙a4 ˙Èm˙óƒ˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ĝŻg˙ù͢˙~9˙U.˙i9 ˙Ôs˙ôˆ˙úŽ˙íp˙…I ˙G'˙N˙ĉ}˙ô…˙ù„˙ġǚ˙¤b ˙G'˙o= ˙Öt˙ó„˙ô…˙ô…˙ô…˙ô‹$˙ùȗ˙ĉ˘_˙t? ˙I(˙£Y˙í˙ġ™>˙ùΤ˙ŬĦf˙d6 ˙M*˙Ş\˙í˙ô…˙ô…˙ô…˙ô…˙÷İ\˙÷ʝ˙­d˙M*˙o= ˙Öt˙ó„˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ôˆ˙ĝĐ˙Û˘i˙[6˙ĥ¨™˙Š^3˙–m˙И…˙nD˙ħ¤˜˙nN˙€dI˙ıН˙–oI˙‚iP˙¸Ĥ“˙tE˙F&˙†I ˙â{˙ġ‘1˙÷ʞ˙ĵD˙O+˙h8 ˙Íp˙òƒ˙ô…˙öG˙ĝÌ˘˙·r/˙–n˙½Ĵ›˙}P%˙I(˙”P˙è~˙ô…˙ġ˜=˙ġÊĦ˙İm3˙I(˙v@ ˙Ûw˙ó„˙ô…˙öV˙öȜ˙¤d'˙ž|˙ÂŻ˙f7 ˙N*˙­^˙ï‚˙ô…˙ô…˙ô…˙Û~˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙†I˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é€$˙ßz!˙İd&˙Ĉ²Ħ˙œb/˙{C˙vB˙žV˙p=˙ˆJ˙Ôt˙é"˙é"˙é"˙é"˙é"˙é"˙İj˙ģ̇˙Ëy0˙vA˙F˙q˙é!˙ë‡/˙ö̧˙ìŒ8˙î˘`˙òş‰˙éƒ(˙óÀ“˙ížY˙ë“E˙öÎĴ˙îœS˙è"˙ċ~#˙Çl˙yB˙€F˙Òr˙é„)˙ġĈœ˙í²~˙ĦX˙k:˙İ\˙â{ ˙ê€"˙ê€#˙ĉ~#˙·g ˙¸ ‹˙ĴzN˙ߍC˙öÏĴ˙íšP˙ë”F˙ôĊœ˙é„(˙ç!˙Ùv˙•Q˙p=˙¸d˙ĉ} ˙ê„)˙ġɢ˙܋D˙…H˙p=˙g˙é~ ˙ë€!˙ë€!˙ë€!˙ë€!˙í8˙ǫ̈˙Àp*˙r>˙N˙Úv˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë„(˙ġĈ˙àI˙§rD˙À¨“˙£] ˙²”z˙ÄŞ“˙‘Q˙Ż•~˙²…]˙ŠW+˙ĊŻ›˙§f,˙ž|]˙¸˜|˙›U˙p=˙¤Y˙{˙ë€!˙é"˙Én˙Ĵ†e˙ş”r˙×{*˙ôĚ˙î˜J˙é ˙ċ}!˙Àh˙•mI˙Ĉ¨˙šV˙h8˙ V˙âz˙ì€ ˙ì€ ˙è~!˙żh˙ħ‘v˙şŒc˙àƒ1˙ġÈ ˙í‘>˙ê ˙ä| ˙²`˙œyY˙Ċ˘‚˙N˙k:˙´b˙è~˙ì ˙ì ˙ì ˙Ôz#˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙şğı˙˙}E˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Ûw1˙Ûw0˙Ûw0˙Ûw0˙Ùv/˙ŜĤ˙ŭüû˙ÜŞ…˙Z$˙—R!˙g)˙ĥc(˙½g)˙Ġt.˙Ûw0˙Ûw0˙Ûw0˙Ûw0˙Ûw0˙Ûx1˙ößÏ˙ŝŭü˙۟t˙”P ˙›T"˙Îp-˙Üw0˙êŻ…˙ŝŭü˙ëı•˙íÔÂ˙ùóî˙Ü t˙úġò˙ġĉÜ˙èÄŞ˙ŝŝŝ˙èĊĴ˙ıe'˙ħ`%˙Ċk*˙şe'˙ĵf(˙Ġt-˙•[˙ŭú÷˙ùí˙µi1˙‹L˙·d'˙Ùv.˙Üx/˙Üx/˙Üw.˙ֈN˙ûöó˙ôĉÛ˙çİ˙ŝŝŝ˙éĊĞ˙âÁİ˙ŭûù˙֐[˙ğf&˙h'˙j(˙ğf&˙Ñr+˙Üx-˙ċ˜_˙ŝüú˙íĈ¨˙Ĥ[$˙•R˙Èm)˙Ŭx-˙Ŝy.˙Ŝy.˙Ŝy.˙Ŝy-˙˙ŝŭü˙ŬŸq˙›T˙¨["˙Ġt+˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙ßy-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz,˙ĉ—[˙ŭùö˙Ê­˙Ŭ½˙ú÷ġ˙ћr˙óìĉ˙ûĝö˙Ȓh˙öñî˙éÔÄ˙ÒĞŒ˙ŭûú˙רƒ˙éÚÏ˙ġíè˙ÀzC˙–Q˙ğe$˙Ŭx+˙àz,˙àz,˙Úy/˙òáÓ˙÷ëâ˙ÛĦu˙ŭúĝ˙ôáÒ˙Án+˙h$˙Ït,˙êÏş˙ü÷ó˙Ċ~E˙‘P˙ĥd#˙Ûx*˙à{+˙à{+˙à{+˙Ù|3˙ĝïè˙ôâĠ˙Ŭİ˙ŭüú˙Ô˙½i'˙j$˙Ïw1˙ÜÌ˙ü÷ó˙´b!˙”Q˙j$˙ßz)˙á{*˙á{*˙á{*˙Êu,˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙şğı˙˙s?&˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈnB˙ÉnB˙ÉnB˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉoC˙ïĠÈ˙˙˙˙˙Üħ›˙E(˙d7 ˙¨\5˙Ĉl>˙Èm?˙Ên@˙Ên@˙Ên@˙Êo@˙Êo@˙Êo@˙ÊpA˙öĉŜ˙˙˙˙˙ʜ„˙_4˙i9 ˙²a7˙Êo@˙×Ê˙˙˙˙˙òâÚ˙äĜÒ˙ŝŝŝ˙Ġż³˙úùĝ˙÷óò˙ÖÄş˙˙˙˙˙Ô¸˙h9˙^3˙¤Z1˙Èm<˙Êo=˙Ìp>˙ٔo˙ŝŭŭ˙úòî˙U7˙V/˙ŽM*˙Ċl:˙Íp=˙Íp=˙Íp=˙֌c˙ŭûú˙ûöó˙ÚĈğ˙˙˙˙˙ĜĈ½˙ñíë˙˙˙˙˙Ğ}b˙k:˙~E$˙żi7˙Ìp;˙Íp;˙Îq<˙⭎˙˙˙˙˙ĝîé˙…M.˙j:˙Ĵ^1˙Íp:˙Ïq;˙Ïq;˙Ïq;˙Ïs>˙ġÙ˙˙˙˙˙ў‚˙p=˙yB"˙g6˙Ïp:˙q:˙q:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr9˙Љ˙ŝŭŭ˙÷íç˙ÚÊÀ˙˙˙˙˙ÙÄ·˙ġò˙ŭüü˙ϸĞ˙˙˙˙˙ĉÚÓ˙ĉÛĠ˙˙˙˙˙ĠŻ˙úùĝ˙ŝŝŝ˙µx˙c6˙šT)˙Ío6˙Ós8˙Ós8˙Ôw?˙ĝëâ˙ŝŝŝ˙×½­˙ŝŝŝ˙ôîë˙zH(˙n;˙·n@˙üĝġ˙ŝŭü˙°uP˙e7˙™S'˙Îo5˙Ôs7˙Ôt7˙Ôt7˙Ö{A˙ü÷ô˙ŝŭŭ˙ÒşĞ˙˙˙˙˙êŜÖ˙p? ˙xA˙Ĉ€S˙ŝüû˙˙˙˙˙“P$˙g8˙İ\*˙Ós4˙Ġt5˙Ġt5˙Öt5˙Ào7˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙şĵş˙˙i90˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙ĥdS˙ĥdS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·eT˙éË˙˙˙˙˙É£š˙P+#˙@"˙M>˙µcP˙¸eQ˙¸eQ˙¸eQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıfQ˙ßÛ˙ŝŭŭ˙ĥƒ˙>"˙G&˙˜RA˙¸dO˙Ŭ³¨˙˙˙˙˙êÜÙ˙ÔÌÊ˙ŝŝŝ˙½İ˙öġġ˙ïíì˙À²Ż˙˙˙˙˙Äıµ˙?"˙; ˙†I8˙·dL˙ğfN˙ğfN˙ˊw˙ŭûú˙öîë˙oD7˙5˙m<,˙ħaH˙ĵgM˙ĵgM˙½gM˙ʅq˙ŭûú˙ĝñï˙Îı˙˙˙˙˙Âĥ³˙ìéè˙üüü˙€cY˙"˙„H4˙ıeH˙żhJ˙żhJ˙żhJ˙ÀkL˙ñßÙ˙˙˙˙˙ı’„˙C$˙V/!˙§[?˙żhH˙ÀiI˙ÀiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁjH˙ÁjH˙ÁjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙Ù£˙ŝŭŭ˙ċÇ˙Çşµ˙˙˙˙˙Ĉ·²˙òñ˙úùù˙·§Ħ˙ŝŝŝ˙×ÎÊ˙ÚÓ˙˙˙˙˙›“˙ĉâà˙÷ġġ˙vWK˙8˙l;&˙ĥc@˙ĊkE˙ĊkE˙ĈoJ˙ôċŜ˙ŝŭŭ˙ĈŻĤ˙ûûû˙êċ˙N/!˙?"˙˜]B˙ûöó˙ŝŭü˙Š`M˙=!˙yB)˙½gA˙ĈlC˙ÇlC˙ÇmC˙ÉtL˙úó˙ŭüû˙ÀĴ£˙ŭŭŭ˙ÛÒÎ˙F)˙H'˙­qV˙ŭûú˙˙˙˙˙e7!˙A#˙N/˙Äl?˙ÉnA˙ÉnA˙ÉnA˙µiA˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙şĵş˙˙_4:˙¤Zd˙¤Zd˙¤Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙ĤZc˙ĤZb˙ĤZb˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ē—˙éÖĜ˙šfk˙?"%˙7 ˙€EJ˙Y_˙§[a˙§[a˙¨[a˙¨[a˙¨[a˙¨\`˙¨\`˙¨\`˙˟Ħ˙ĉÑÒ˙[_˙8 ˙@"$˙ŠKN˙§[^˙‹Ž˙êĜÙ˙ĵ—˜˙‰uv˙ÇÂÂ˙hNO˙³ŞŞ˙¨˙mUV˙ÌÇÇ˙˘””˙9˙4˙yBB˙ĤZ[˙Ğ^]˙Ğ^]˙°hg˙ÈÈ˙­­˙]43˙1˙d65˙˘XV˙Ĵ^\˙Ĵ^\˙­^\˙ıxu˙êÖÖ˙Ġµ³˙§Ž˙ÍÇÇ˙xcb˙›Ž˙ĥĥ˙Q32˙1˙Q,*˙›TP˙­_Y˙`Z˙Ż`Z˙ż|˙ëÙ×˙ž›˙J)&˙6˙xA<˙Ş\V˙°`X˙°`X˙°`X˙°aX˙Ñ˘˙ëÙ×˙Ħzv˙6˙M*%˙™TK˙°`V˙²aW˙²aW˙²aW˙²bW˙²bV˙²bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bU˙³bU˙´bU˙´bU˙´cU˙´cU˙‚w˙ëĜÔ˙Ĉ˘œ˙Ħ˙ÍÇĈ˙†lh˙Ċż˙ğ²°˙_E@˙ÉÄ˙{w˙Šyv˙ÏÊÈ˙‡ql˙ħ¨Ĥ˙ÉÀ˙W81˙1˙b5,˙İ\K˙·dR˙·dR˙·dR˙Ĝİ ˙ĉÏÉ˙‡]S˙½ĥ´˙ ‘˙@#˙9˙„I<˙Ŝğ³˙éÖÒ˙tOF˙4˙o<0˙°`L˙şfP˙şfP˙şfO˙şgP˙Ŝ·Ĵ˙ÈÁ˙|XN˙Ċż½˙•{˙; ˙B$˙•UC˙ċĈ½˙éĜÓ˙T."˙9˙…I6˙¸dK˙ĵgM˙ĵgM˙½gM˙ŞcK˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ğĵş˙˙V/B˙•Rr˙•Rr˙•Rr˙•Rr˙–Rq˙–Rq˙–Rq˙–Rq˙–Rq˙–Rq˙–Rq˙—Rp˙—Sp˙—Sp˙—Sp˙—Sp˙˜Ur˙›Xt˙…Ha˙N*9˙H'4˙€E]˙–Rn˙™So˙™Tn˙™Tn˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙›Wo˙œYq˙€F[˙I'3˙P+8˙ˆJ_˙šTl˙œWn˙Zp˙Oc˙U0=˙D)2˙Z1>˙L-7˙N-7˙Y1=˙H+4˙Z4@˙N*5˙@#,˙u@O˙™Tg˙žVj˙žVj˙žVj˙Ħ[o˙™Vg˙h8E˙C$,˙n>˙¤YY˙Ĵ^]˙Ĵ^\˙Ĵ^\˙­a_˙İ`^˙zBA˙O.-˙a75˙W/.˙N*)˙‰KH˙şzv˙ı€~˙n=:˙D%#˙r>;˙¨[V˙Ż_Z˙Ż_Y˙Ż`Y˙Ż`Y˙ħd]˙Ş`Z˙q>9˙O/,˙g96˙R-)˙V/+˙–QJ˙Á„}˙³xq˙d71˙H'#˙…HA˙Ż_U˙²aW˙²aV˙³aV˙Ħ^T˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ğĵş˙˙O+H˙ŠK}˙ŠL}˙ŠL}˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L|˙‹L{˙‹L{˙ŒL{˙ŒM{˙ŒM{˙ŒM{˙ŒMz˙ŒMz˙Mz˙ˆJv˙u@e˙s>c˙†Is˙My˙ŽNy˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙ŽNx˙Nx˙Nx˙Nx˙Nx˙ˆJq˙u@a˙xAc˙‹Ls˙Ow˙Ow˙Ov˙ŒLr˙wAa˙p=[˙Eg˙u@_˙wA_˙Ee˙s?\˙}Ed˙yBa˙p=Z˙„Hh˙‘Os˙“Pt˙“Qt˙“Qt˙”Qt˙’Pr˙ƒHf˙u@[˙†Ih˙’Pr˙•Qs˙•Qr˙•Rr˙•Rr˙•Rr˙’Po˙E_˙s?W˙}D^˙u@X˙yAZ˙„Gb˙xBY˙‚Ga˙”Qn˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙’Pk˙~D[˙xBW˙ŽNf˙˜Sm˙™Tn˙šTn˙šTn˙šTm˙šTm˙™Sl˙Oe˙zCV˙}EX˙”Qg˙›Ul˙›Ul˙œUl˙œUl˙œUk˙œUk˙œVk˙Vk˙Vk˙Vj˙Vj˙Vj˙žVj˙žVj˙žVj˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWi˙˜Sc˙‚GU˙~DQ˙‡IX˙{CP˙GS˙ƒHT˙|CO˙‹LY˙…HU˙‚GR˙ŒLY˙EP˙‚FR˙‡JU˙}DN˙NY˙ĦXd˙£Ye˙£Ye˙£Yd˙¤Yd˙˘Xc˙•PZ˙GO˙ŒMU˙‰KR˙„HO˙›U^˙Úğż˙ìŬß˙˜af˙p=B˙ŠLQ˙˘Y`˙Ĥ[b˙§[a˙§[a˙§[a˙§[a˙Z`˙”PU˙„HK˙’PS˙‰KN˙‹KO˙¤\_˙äËÌ˙êÙÚ˙‡IL˙t>@˙•QR˙¨\]˙Ş]^˙Ş]^˙Ğ]^˙šZZ˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ğĵş˙˙K)L˙ƒHƒ˙ƒHƒ˙ƒHƒ˙ƒHƒ˙„Hƒ˙„Hƒ˙„H‚˙„H‚˙„H‚˙„I‚˙…I‚˙…I‚˙…I˙…I˙…I˙†I˙†I˙†I˙†I€˙„I~˙„I~˙‡J€˙‡J€˙‡J€˙‡J˙‡J˙‡J˙ˆJ˙ˆK˙ˆK~˙ˆK~˙ˆK~˙‰K~˙ˆJ}˙‡J}˙‡J|˙‰K}˙ŠK}˙ŠL}˙ŠL}˙ŠL}˙ˆK{˙ˆKz˙‰K{˙‰K{˙‰K{˙‰Kz˙‰Ly˙ŠLz˙ŠLz˙ŠLy˙ŠLz˙ŒMz˙Mz˙Mz˙Mz˙Mz˙Ny˙ŒMx˙ŒMw˙ŒMx˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Ox˙Ox˙ŽNv˙Mu˙ŽNv˙ŽNu˙ŽNu˙Nu˙Nt˙Ou˙‘Pv˙‘Pv˙’Pu˙’Pu˙’Pu˙’Pu˙‘Ot˙‘Os˙‘Pr˙’Ps˙“Qt˙“Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qr˙“Qp˙“Qp˙”Qq˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Sq˙—Sq˙—Sp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜So˙˜To˙˜To˙™To˙™To˙™Tn˙™Tn˙™Tn˙™Sm˙˜Sl˙˜Tk˙˜Tl˙—Sk˙™Tk˙™Tl˙˜Sj˙™Tk˙™Tk˙šTj˙šUk˙šTi˙šTi˙›Uj˙šTi˙›Ui˙Vj˙Vj˙žWj˙žWj˙žWj˙žWi˙žVh˙Ug˙Vh˙Vg˙Uf˙§et˙ĝóô˙ŭŭŭ˙•gq˙]3<˙FR˙Vd˙ĦXg˙ĦXf˙˘Yf˙˘Yf˙˘Yf˙˘Yf˙ Xd˙ĦWc˙ĦXd˙ĦXd˙ĦXd˙²t|˙üùú˙˙˙˙˙zCJ˙b6<˙MU˙£Yb˙Zc˙[c˙[c˙–X_˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ğĵş˙˙J)L˙‚G…˙‚G„˙‚G„˙‚G„˙‚G„˙‚G„˙ƒG„˙ƒGƒ˙ƒHƒ˙ƒHƒ˙ƒHƒ˙ƒHƒ˙„Hƒ˙„H‚˙„H‚˙„H‚˙„H‚˙…H‚˙…I‚˙…I˙…I˙…I˙…I˙†I˙†I€˙†I€˙†I€˙†I€˙‡J€˙‡J€˙‡J˙‡J˙‡J˙ˆJ˙ˆJ˙ˆJ˙ˆJ~˙ˆK~˙‰K~˙‰K~˙‰K~˙‰K}˙‰K}˙‰K}˙ŠK}˙ŠK}˙ŠK|˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L{˙‹L{˙ŒL{˙ŒL{˙ŒM{˙ŒMz˙ŒMz˙Mz˙Mz˙Mz˙Mz˙My˙ŽMy˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Nx˙Nw˙Nw˙Ow˙Ow˙Ow˙Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Pv˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Pt˙“Pt˙“Pt˙“Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Qr˙•Rr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Rp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜So˙˜So˙˜So˙™So˙™So˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙šTm˙›Um˙›Um˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUk˙œUk˙Vk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žWi˙¨gw˙ûùù˙ŭüŭ˙|Yb˙5#˙f7B˙™Sc˙ Wh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙²v€˙ŝŭŭ˙˙˙˙˙V/5˙:$˙xAI˙ĦWb˙¤Zd˙¤Zd˙¤Zd˙•X_˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙şĵş˙˙M*J˙†I˙†I˙†I€˙†I€˙†J€˙†J€˙‡J€˙‡J€˙‡J€˙‡J˙‡J˙‡J˙ˆJ˙ˆJ˙ˆJ~˙ˆK~˙ˆK~˙ˆK~˙‰K~˙‰K~˙‰K~˙‰K}˙‰K}˙ŠK}˙ŠK}˙ŠL}˙ŠL|˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L{˙‹L{˙ŒL{˙ŒL{˙ŒM{˙ŒM{˙ŒMz˙ŒMz˙Mz˙Mz˙Mz˙Mz˙My˙ŽMy˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙ŽNx˙Nx˙Nx˙Nx˙Nx˙Nw˙Ow˙Ow˙Ow˙Ow˙Ow˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙’Ou˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Pt˙“Pt˙“Pt˙“Pt˙“Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Qr˙•Qr˙•Qr˙•Qr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Rp˙—Rp˙—Rp˙—Sp˙˜Sp˙˜So˙˜So˙˜So˙˜So˙™So˙™So˙™Sn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙šTm˙›Tm˙›Tm˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUk˙œUk˙Uk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žVi˙ŸVi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙£\j˙äÎÒ˙÷ñò˙nOU˙-˙a5<˙›T`˙£Ye˙£Ye˙£Ye˙£Yd˙¤Yd˙¤Yd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙Şdl˙ëÚÜ˙÷óó˙I(+˙2˙u@E˙˘Y`˙§[a˙§[a˙§[a˙—Y]˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙şğı˙˙R-E˙Nx˙Nx˙Nx˙Nx˙Nw˙Ow˙Ow˙Ow˙Ow˙Ow˙Ov˙Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Pv˙‘Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Pt˙“Pt˙“Pt˙“Qt˙“Qt˙“Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Rr˙•Rr˙•Rr˙•Rr˙–Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Sq˙—Sp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙˜So˙™To˙™To˙™To˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTn˙šTm˙šTm˙šUm˙›Um˙›Um˙›Um˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUk˙œVk˙Vk˙Vk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žWj˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ Wh˙ Wh˙ Wh˙ Xh˙ Xh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙˘Yf˙˘Yf˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙Zc˙Zc˙Zc˙Zc˙Zc˙Ĥ[c˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[a˙§[a˙§[a˙§[a˙§\a˙¨\a˙¨\`˙ħmp˙ĵ‹˙f9;˙9 ˙j:;˙ĦXZ˙İ\_˙İ]_˙İ]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]]˙Ğ]]˙Ğ^]˙ĥss˙¸…„˙[11˙>!!˙}DC˙İ\Z˙­^\˙­^\˙­^[˙\X˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙şğı˙˙Z1>˙œUl˙œUl˙œUk˙œVk˙œVk˙œVk˙Vk˙Vk˙Vk˙Vj˙Vj˙Vj˙Vj˙Vj˙žVj˙žVj˙žVi˙žWi˙žWi˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ŸWh˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wh˙ Xg˙ Xg˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙ĦXf˙ĦXf˙ĦXf˙˘Xf˙˘Xf˙˘Xf˙˘Xf˙˘Ye˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Yd˙¤Yd˙¤Yd˙¤Yd˙¤Yd˙¤Zd˙¤Zd˙Zd˙Zd˙Zc˙Zc˙Zc˙Zc˙ĤZc˙ĤZc˙ĤZc˙ĤZc˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[b˙§[b˙§[b˙§[a˙§[a˙§[a˙§[a˙¨\a˙¨\a˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\`˙İ\_˙İ\_˙İ]_˙İ]_˙İ]_˙Ş]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ^^˙Ğ^]˙Ğ^]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­_\˙­_\˙­_\˙­_[˙­_[˙­_[˙­_[˙_[˙_[˙_[˙_Z˙`Z˙`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙Ż`Y˙°`Y˙‡‚˙ׯĞ˙½|u˙`W˙`W˙ħaX˙ħaX˙ħaX˙ħaX˙ħaW˙ħaW˙̘‘˙Öİ˙š^V˙n<5˙ND˙­_S˙³bV˙ɑ‰˙Ĝ¨˙ğuk˙ħaU˙ħaT˙´cU˙´cU˙´cU˙´cU˙´cU˙´dV˙Ò —˙Ö§˙‹L@˙q>4˙šTG˙³bS˙µdS˙ĥdS˙ĥdS˙`Q˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙şğı˙˙c65˙Ĵ^\˙Ĵ^\˙­^\˙­_\˙­_\˙­_\˙­_[˙­_[˙­_[˙­_[˙­_[˙­_[˙_[˙_[˙_[˙_[˙_Z˙_Z˙`Z˙`Z˙`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°aY˙°aX˙°aX˙°aX˙°aX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaW˙ħaW˙ħaW˙²aW˙²bW˙²bW˙²bW˙²bW˙²bW˙²bV˙²bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bU˙³bU˙³bU˙´bU˙´cU˙´cU˙´cU˙´cU˙´cU˙´cU˙´cT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙ĥdS˙ĥdS˙·dS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dR˙¸dR˙¸dQ˙¸dQ˙¸dQ˙¸eQ˙¸eQ˙¸eQ˙ıeQ˙ıeQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙şeP˙şfP˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙ğfO˙ğfN˙ğfN˙ğfN˙ğfN˙ğfN˙ğfN˙ğgN˙ĵgM˙ĵgM˙ĵgM˙àı­˙ŝŝŝ˙Ï ’˙™T>˙ĦXA˙¸dJ˙½gL˙½gL˙½gL˙½gL˙ÁqX˙÷íê˙ŭüû˙µxd˙‰K6˙ĦX?˙ğfI˙iL˙èÉż˙ŝŭŭ˙Ĉ|˙™S;˙§Z@˙ĵfI˙żhJ˙żhJ˙ÀhJ˙ÀhJ˙È}b˙úġò˙ŝŝŝ˙ĦX=˙ŒL5˙Ş]@˙żhH˙ÁiI˙ÁiI˙ÁiI˙fH˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙n<+˙hK˙hK˙hK˙hK˙hK˙żhK˙żhK˙żhK˙żhK˙żhK˙żhK˙żiK˙żiJ˙żiJ˙żiJ˙żiJ˙żiJ˙żiJ˙żiJ˙żiJ˙żiJ˙ÀiJ˙ÀiJ˙ÀiJ˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÁiI˙ÁiI˙ÁiI˙ÁiH˙ÁiH˙ÁjH˙ÁjH˙ÁjH˙ÁjH˙ÁjH˙ÁjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙jG˙jG˙jG˙jG˙jG˙jG˙jG˙jG˙jG˙jF˙kF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlC˙ĈmC˙ĈmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmB˙ÇmB˙ÇmB˙ÇmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈnB˙ÈnB˙ÈnA˙ÈnA˙ÈnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉoB˙ïÖÉ˙˙˙˙˙áÊ˙]4˙s>$˙¸e:˙Én?˙Êo@˙Êo@˙Êo@˙Ï}R˙ŭúù˙ŝŭü˙šiP˙T.˙ˆJ*˙j<˙ÍuG˙ôá×˙˙˙˙˙Òĥ§˙Y0˙E'˙żh;˙Ìo?˙Ìo?˙Ìo?˙Ìo?˙ĠŠb˙ŝŝŝ˙˙˙˙˙xB$˙X0˙šT.˙Èn=˙Ìp>˙Ìp>˙Íp>˙ık>˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙xB!˙r:˙r:˙r:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Òr9˙Òr9˙Òr9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós7˙Ós7˙Ós7˙Ós7˙Ós7˙Ós7˙Ós7˙Ós7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt7˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ôt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt6˙Ġt5˙Ġt5˙Ġu5˙Ġu5˙Ġu5˙Ġu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙êı˜˙ŝŝŝ˙έ—˙D%˙Y0˙´b+˙Ġt3˙×v4˙×v4˙×v4˙Ĝ|<˙÷ċĜ˙ŭüú˙ˆ_C˙=!˙‚G˙Íp0˙Ĝv3˙ïÉŻ˙ŝŭŭ˙ş–~˙?"˙f7˙Ái-˙×u2˙Ĝv3˙Ĝv3˙Ĝv3˙ۃG˙ùíċ˙ŝŭü˙`4˙B$˙™S#˙Ôs1˙Ùv2˙Ùv2˙Ùv2˙Äq4˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙G˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙á{*˙â{*˙â{*˙â{*˙â{*˙â{*˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â{)˙â|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙|)˙é™X˙ĝäÔ˙´r=˙M* ˙^3˙½g"˙á{(˙|)˙|)˙|)˙|)˙í­y˙òĜ˙‡P$˙D% ˙‹L˙Ĝv&˙|(˙ë£h˙÷á˙ _*˙F& ˙k:˙Ém#˙â{'˙|(˙|(˙|(˙|(˙︋˙íÏ·˙o<˙H' ˙˘X˙ßz'˙|(˙|(˙|(˙Îw+˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ığı˙˙‰K˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í˙í ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì‚#˙ëŠ3˙Çn˙™rO˙Ĵ~T˙Ĝz%˙ïĦZ˙î–G˙ì‹4˙ñ§d˙ì‡-˙ëƒ&˙ç‡0˙_˙m;˙§[˙ä|˙ì ˙ìƒ%˙é‰2˙ğh˙™uU˙´€Q˙à~'˙¤`˙í’?˙í;˙`˙ë„'˙ê„(˙â‚-˙ W˙o=˙şe˙ê˙ì ˙ì ˙ì ˙Ö{$˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙ŽN ˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô†˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ç‚˙ġçÚ˙ûö˙èĴq˙ûóì˙öŬÄ˙í½˙ŝüú˙ì­p˙Ôs˙Üw˙Ŭx˙Ái˙Úw˙‚˙ò„˙ò„˙ñƒ˙â‚$˙úġï˙úñé˙ĉŞq˙ü÷ó˙ó˙ïɤ˙ŭùġ˙èĦ[˙Òr˙Ŝy˙Ĝv˙Ái˙àz˙ñƒ˙ò„˙ò„˙ò„˙Û~˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙O ˙ú‰˙ú‰˙ú‰˙ú‰˙ú‰˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙úˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ùˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝˆ˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙ö‡˙ö‡˙ö‡˙ö‡˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ġ†˙ġ†˙ġ†˙ô‰˙ŭíŜ˙˙˙˙˙ßÂĤ˙ŝŝŝ˙öê˙Ŝ˸˙˙˙˙˙Öĥ•˙~E ˙›U˙|˙ñƒ˙ó„˙ġ†˙ġ†˙ġ†˙ġ†˙ô‹#˙ŝĝó˙˙˙˙˙Ùż˙˙˙˙˙îâÖ˙ĉÙÍ˙˙˙˙˙ɢz˙{C ˙¨[˙ĉ}˙‚˙ó„˙ô…˙ô…˙ô…˙ô…˙Ŭ˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙N ˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙ĝ‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷‡˙÷†˙÷†˙÷†˙÷†˙÷†˙÷†˙÷†˙÷†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ö†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ†˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ġ…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô‰!˙ŭíŬ˙˙˙˙˙Ġ½˙ŝŝŝ˙ñíé˙η˙˙˙˙˙ĵ§’˙H'˙l; ˙Ġt˙ò„˙ó…˙ó…˙ó…˙ó…˙ó…˙ó‹%˙ŝĝó˙˙˙˙˙Îı¤˙˙˙˙˙äÜÔ˙ÚÓË˙˙˙˙˙ސw˙G&˙~D ˙Ŝx˙ó„˙ó„˙ò„˙ò„˙ò„˙ò„˙Ü~˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙‹L˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ñƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙ï‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙îƒ!˙ùĠ´˙ŭ÷ñ˙³‰c˙íë˙Ċğ˙£‘€˙˙˙˙˙–{a˙A#˙e7 ˙Îp˙í˙î‚˙î‚˙î‚˙î‚˙î‚˙î„#˙ûâÊ˙ûñè˙§ƒa˙÷öġ˙Áħ£˙ħ¤—˙ùùĝ˙‡hL˙@#˙u@˙Ĝv˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙Ĝ|#˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙„H˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}'˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ĉ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙Üx$˙šT˙W/˙p=˙g8˙X0˙yB˙X0˙wA˙Íp"˙ä|%˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙Ĝv#˙ŠK˙T.˙u@˙`4˙^3˙v@˙V/˙†I˙Ôt#˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙ċ}&˙Ñx)˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙¸ş¸˙˙{C˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu5˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙Öu4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u4˙×u3˙×u3˙×u3˙×u3˙×u3˙×u3˙×u3˙×u3˙×u3˙×u3˙×u3˙×u3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv3˙Ĝv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùv2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw2˙Ùw1˙Ùw1˙Ùw1˙Ùw1˙Ùw1˙Ùw1˙Ùw1˙Ùw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Ĝv0˙Âi+˙Z%˙´b(˙Ż_'˙¨[%˙ıe)˙§[%˙´b(˙Ôs/˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Úw1˙Öu0˙ĵf*˙¤Z%˙·d)˙Ğ]%˙Ğ]%˙¸d(˙ĤZ$˙ğe)˙Öt/˙Ûw0˙Ûw0˙Ûw0˙Ûw0˙Ûw0˙Ûw0˙Çs3˙ ˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙³µ´˙˙q>(˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ÄkE˙ÄkE˙ÄkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊkE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlD˙ĊlD˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇlC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÈmB˙ÉmB˙ÉmA˙ÉmA˙ÉmA˙ÉmA˙ÉmA˙ÉmA˙ÉmA˙ÉmA˙ÉmA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÉnA˙ÊnA˙ÊnA˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Ên@˙Êo@˙Ëo@˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo?˙Ëo>˙Ìo>˙Ìo>˙Ìo>˙Ìo>˙Ìo>˙Ìo>˙Ìo>˙Ìp>˙Ìp>˙Ìp>˙Ìp>˙Ìp>˙Ìp>˙Ëo=˙Ên=˙Ëo<˙Ëo<˙Ên<˙Ëo<˙Ên<˙Ëo<˙Íp=˙Íp=˙Íp=˙Íp=˙Íp=˙Íp=˙Îp=˙Îp=˙Îp=˙Îp=˙Ìo<˙Ën<˙Ìo<˙Ën<˙Ën;˙Ìo;˙Ëo;˙Ìp;˙Îq<˙Îq<˙Îq<˙Îq<˙Îq<˙Ïq<˙Ïq<˙ĵl<˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı·˙˙f82˙²aW˙²aW˙²aW˙²aV˙²aV˙²aV˙²aV˙²aV˙³aV˙³aV˙³aV˙³aV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bV˙´bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´bU˙µbU˙µbU˙µcU˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙ĥcT˙ĥcT˙ĥcT˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥdS˙ĥdS˙ĥdS˙ĥdS˙ĥdS˙·dS˙·dS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dQ˙¸dQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eP˙¸eP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeO˙şeO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙ğfN˙ğfN˙ğfN˙ğfN˙ğfN˙ğfN˙ğfN˙ğfN˙ğfN˙ĵfN˙ĵfN˙ĵfN˙ĵfN˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙ĵgM˙½gM˙½gM˙½gM˙½gM˙½gM˙½gM˙½gL˙½gL˙½gL˙½gL˙½gL˙gL˙gL˙gL˙gL˙hL˙hL˙hL˙hK˙hK˙hK˙hK˙żhK˙żhK˙żhK˙żhK˙żhK˙żhK˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙ÀhJ˙ÀhJ˙ÀiJ˙ÀiJ˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÁiI˙ÁiI˙ÁiI˙ÁiH˙ÁiH˙ÁiH˙ÁiH˙ÁiH˙ÁjH˙ÂjH˙ÂjH˙ÂjH˙ÂjH˙ŻeF˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙·ı·˙˙\2<˙ Wh˙ Xh˙ Xh˙ Xg˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙ĦXf˙˘Xf˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙˘Yf˙˘Yf˙˘Yf˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Yd˙¤Yd˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙ĤZb˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§[a˙§[a˙§[a˙§[a˙§[a˙¨\a˙¨\a˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\`˙İ\`˙İ\_˙İ\_˙İ\_˙İ\_˙İ]_˙İ]_˙Ş]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]^˙Ğ]^˙Ğ]]˙Ğ]]˙Ğ^]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­^\˙­^\˙­_[˙­_[˙­_[˙­_[˙_[˙_[˙_[˙_[˙_Z˙_Z˙_Z˙_Z˙Ż_Z˙Ż_Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`X˙°`X˙°`X˙ħ`X˙ħaX˙ħaX˙ħaX˙ħaX˙ħaW˙ħaW˙ħaW˙²aW˙²aW˙²aW˙²aW˙²aW˙²aV˙²bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´cU˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙ĥcS˙ĥcS˙¤_Q˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙S.D˙‘Pv˙‘Pv˙’Pv˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Pu˙“Pu˙“Pt˙“Pt˙“Qt˙“Qt˙“Qt˙”Qt˙”Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qs˙•Rs˙•Rr˙•Rr˙•Rr˙•Rr˙–Rr˙–Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Sq˙—Sq˙—Sp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙˜So˙™To˙™To˙™Tn˙™Tn˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙šTm˙šTm˙šUm˙›Um˙›Um˙›Ul˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUk˙œUk˙œUk˙œUk˙Vk˙Vk˙Vk˙Vj˙Vj˙Vj˙Vj˙žVj˙žVj˙žVi˙žVi˙žVi˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wg˙ Wg˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙ĦXf˙˘Xf˙˘Xf˙˘Xf˙˘Xf˙˘Xf˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙¤Yd˙¤Yd˙¤Yd˙¤Yd˙¤Yd˙¤Zd˙Zd˙Zc˙Zc˙Zc˙Zc˙Zc˙ĤZc˙ĤZc˙ĤZb˙ĤZb˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§[a˙§[a˙§[a˙¨[a˙¨[a˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\`˙İ\`˙İ\_˙İ\_˙İ\_˙İ\_˙Ş]_˙Ş]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ]^˙Ğ]]˙Ğ]]˙Ğ]]˙š[Z˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙M*J˙†I€˙†I€˙‡J€˙‡J€˙‡J€˙‡J˙‡J˙‡J˙‡J˙ˆJ˙ˆJ˙ˆJ˙ˆJ~˙ˆK~˙ˆK~˙‰K~˙‰K~˙‰K~˙‰K}˙‰K}˙‰K}˙‰K}˙ŠK}˙ŠK}˙ŠL}˙ŠL|˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L|˙‹L{˙‹L{˙ŒL{˙ŒM{˙ŒM{˙ŒM{˙ŒM{˙ŒMz˙Mz˙Mz˙Mz˙Mz˙Mz˙My˙ŽMy˙ŽNy˙ŽNy˙ŽNy˙ŽNy˙ŽNy˙Nx˙Nx˙Nx˙Nx˙Nx˙Nx˙Ow˙Ow˙Ow˙Ow˙Ow˙Ow˙Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Pv˙‘Pv˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Pt˙“Pt˙“Pt˙“Qt˙“Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Qr˙•Rr˙•Rr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Sq˙—Sp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙™So˙™To˙™To˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTn˙šTm˙šTm˙›Tm˙›Um˙›Um˙›Um˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUl˙œUk˙œVk˙Vk˙Vk˙Vk˙Vk˙Vj˙žVj˙žVj˙žVj˙žVj˙žWj˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ Wh˙ Wh˙ Wh˙ Xh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙˘Yf˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙”W`˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙I(N˙€F†˙€F†˙€F†˙€F†˙€F†˙€G†˙G†˙G…˙G…˙G…˙G…˙G…˙‚G…˙‚G„˙‚G„˙‚G„˙‚H„˙‚H„˙‚H„˙ƒHƒ˙ƒHƒ˙ƒHƒ˙ƒHƒ˙ƒHƒ˙„Hƒ˙„Hƒ˙„H‚˙„I‚˙„I‚˙„I‚˙…I‚˙…I‚˙…I˙…I˙…I˙…I˙†I˙†I˙†J€˙†J€˙†J€˙†J€˙‡J€˙‡J€˙‡J˙‡J˙‡J˙‡J˙ˆK˙ˆK˙ˆK~˙ˆK~˙ˆK~˙‰K~˙‰K~˙‰K~˙‰K}˙‰K}˙‰L}˙ŠL}˙ŠL}˙ŠL}˙ŠL|˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L{˙‹M{˙ŒM{˙ŒM{˙ŒM{˙ŒM{˙ŒMz˙ŒMz˙Mz˙Mz˙Mz˙Ny˙Ny˙ŽNy˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙Nx˙Nx˙Ox˙Ox˙Ox˙Ow˙Ow˙Ow˙Ow˙Ow˙Ov˙‘Ov˙‘Pv˙‘Pv˙‘Pv˙‘Pv˙‘Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pt˙“Qt˙“Qt˙“Qt˙“Qt˙“Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Rr˙•Rr˙•Rr˙•Rr˙•Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Sq˙—Sp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙˜To˙™To˙™Tn˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙šUm˙›Um˙›Um˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œVk˙œVk˙Vk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙Ud˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙I(N˙E‡˙E‡˙E‡˙F‡˙€F†˙€F†˙€F†˙€F†˙€F†˙€F†˙€F†˙F…˙F…˙F…˙G…˙G…˙G…˙‚G„˙‚G„˙‚G„˙‚G„˙‚G„˙‚G„˙ƒG„˙ƒGƒ˙ƒHƒ˙ƒHƒ˙ƒHƒ˙„Hƒ˙„Hƒ˙„H‚˙„H‚˙„H‚˙„H‚˙…H‚˙…H‚˙…I˙…I˙…I˙…I˙†I˙†I˙†I€˙†I€˙†I€˙†I€˙‡J€˙‡J€˙‡J˙‡J˙‡J˙‡J˙ˆJ˙ˆJ˙ˆJ~˙ˆJ~˙ˆK~˙‰K~˙‰K~˙‰K~˙‰K}˙‰K}˙‰K}˙ŠK}˙ŠK}˙ŠK}˙ŠL|˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L{˙‹L{˙ŒL{˙ŒL{˙ŒL{˙ŒM{˙ŒMz˙Mz˙Mz˙Mz˙Mz˙Mz˙My˙ŽMy˙ŽMy˙ŽNy˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Nx˙Nx˙Nw˙Ow˙Ow˙Ow˙Ow˙Ow˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Pt˙“Pt˙“Pt˙“Pt˙“Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qr˙•Qr˙•Rr˙•Rr˙–Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Rp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙™So˙™To˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTm˙šTm˙šTm˙›Tm˙›Um˙›Um˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUk˙œUk˙œVk˙Vk˙Vk˙Vk˙Vj˙Vj˙žVj˙žVj˙žVj˙žWi˙Td˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙L)K˙ƒHƒ˙ƒHƒ˙„Hƒ˙„Hƒ˙„H‚˙„H‚˙„H‚˙„I‚˙„I‚˙…I‚˙…I‚˙…I˙…I˙…I˙…I˙†I˙†I˙†I€˙†J€˙†J€˙†J€˙†J€˙‡J€˙‡J€˙‡J˙‡J˙‡J˙‡J˙ˆJ˙ˆJ˙ˆK~˙ˆK~˙ˆK~˙ˆK~˙‰K~˙‰K~˙‰K~˙‰K}˙‰K}˙‰K}˙ŠK}˙ŠL}˙ŠL}˙ŠL}˙ŠL|˙ŠL|˙‹L|˙‹L|˙‹L|˙‹L|˙‹L{˙‹M{˙ŒM{˙ŒM{˙ŒM{˙ŒM{˙ŒM{˙ŒMz˙Mz˙Mz˙Mz˙Mz˙Nz˙Ny˙ŽNy˙ŽNy˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Ox˙Ox˙Ow˙Ow˙Ow˙Ow˙Ow˙Ow˙Ov˙‘Ov˙‘Pv˙‘Pv˙‘Pv˙‘Pv˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Qt˙“Qt˙“Qt˙“Qt˙“Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Rs˙•Rr˙•Rr˙•Rr˙•Rr˙–Rr˙–Rr˙–Rq˙–Rq˙–Sq˙–Sq˙—Sq˙—Sp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜To˙˜To˙™To˙™To˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šUn˙šUm˙šUm˙šUm˙›Um˙›Um˙›Um˙›Ul˙›Ul˙œUl˙œUl˙œVl˙œVk˙œVk˙œVk˙Vk˙Vk˙Vk˙Vj˙Vj˙žVj˙žWj˙žWj˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ Xh˙ Xh˙ Xh˙ Xh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙’Vb˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙Q,F˙Mz˙Mz˙Mz˙My˙My˙ŽMy˙ŽMy˙ŽNy˙ŽNy˙ŽNy˙ŽNy˙ŽNx˙Nx˙Nx˙Nx˙Nx˙Nx˙Nx˙Nx˙Nw˙Ow˙Ow˙Ow˙Ow˙Ow˙Ow˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Ov˙‘Pv˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙’Pu˙“Pu˙“Pt˙“Pt˙“Pt˙“Pt˙“Qt˙“Qt˙”Qt˙”Qt˙”Qs˙”Qs˙”Qs˙”Qs˙”Qs˙•Qs˙•Qs˙•Qr˙•Rr˙•Rr˙•Rr˙•Rr˙–Rr˙–Rr˙–Rq˙–Rq˙–Rq˙–Rq˙–Rq˙—Rq˙—Rq˙—Sp˙—Sp˙—Sp˙—Sp˙—Sp˙˜Sp˙˜Sp˙˜So˙˜So˙˜So˙˜So˙™To˙™To˙™To˙™Tn˙™Tn˙™Tn˙™Tn˙šTn˙šTn˙šTn˙šTm˙šTm˙šTm˙›Um˙›Um˙›Um˙›Um˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUk˙œUk˙œVk˙Vk˙Vk˙Vk˙Vj˙Vj˙Vj˙Vj˙žVj˙žVj˙žVj˙žVi˙žWi˙žWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wh˙ Xg˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙ĦXf˙˘Xf˙˘Xf˙˘Xf˙˘Xf˙˘Ye˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Yd˙£Yd˙¤Yd˙¤Yd˙¤Yd˙¤Zd˙¤Zc˙¤Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙ĤZb˙ĤZb˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[a˙§[a˙§[a˙§[a˙§[a˙¨[a˙—Y]˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙Y1?˙›Tm˙›Tm˙›Tm˙›Ul˙›Ul˙›Ul˙›Ul˙›Ul˙œUl˙œUl˙œUl˙œUl˙œUl˙œUk˙œUk˙œUk˙œUk˙Uk˙Vk˙Vk˙Vk˙Vk˙Vj˙Vj˙Vj˙žVj˙žVj˙žVj˙žVj˙žVj˙žVj˙žVj˙žVi˙žVi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWi˙ŸWh˙ Wh˙ Wh˙ Wh˙ Wh˙ Wh˙ Wh˙ Xh˙ Xh˙ Xg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXg˙ĦXf˙˘Xf˙˘Xf˙˘Xf˙˘Yf˙˘Yf˙˘Yf˙˘Ye˙˘Ye˙˘Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Ye˙£Yd˙£Yd˙£Yd˙¤Yd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zd˙¤Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙Zc˙ĤZc˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙Ĥ[b˙§[b˙§[b˙§[b˙§[b˙§[a˙§[a˙§[a˙§[a˙¨[a˙¨\a˙¨\a˙¨\a˙¨\`˙¨\`˙¨\`˙¨\`˙¨\`˙İ\`˙İ\`˙İ\`˙İ\_˙İ]_˙İ]_˙İ]_˙İ]_˙Ş]_˙Ş]_˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ş]^˙Ğ]^˙Ğ^]˙Ğ^]˙Ğ^]˙Ğ^]˙Ğ^]˙Ğ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­_\˙­_\˙­_[˙­_[˙­_[˙­_[˙­_[˙_[˙_[˙_[˙_[˙_Z˙_Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°aY˙°aX˙Ÿ]U˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙b66˙Ğ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^]˙Ĵ^\˙Ĵ^\˙Ĵ^\˙­^\˙­^\˙­^\˙­^\˙­^\˙­^\˙­_\˙­_\˙­_[˙­_[˙­_[˙­_[˙­_[˙_[˙_[˙_[˙_[˙_[˙_[˙_[˙_[˙_[˙_Z˙_Z˙_Z˙_Z˙`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Z˙Ż`Y˙Ż`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°`Y˙°aY˙°aX˙°aX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaX˙ħaW˙ħaW˙²aW˙²aW˙²aW˙²aW˙²aW˙²aW˙²aW˙²bW˙²bV˙²bV˙²bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bV˙³bU˙³bU˙³bU˙³bU˙³bU˙´bU˙´bU˙´bU˙´bU˙´bU˙´bT˙´cT˙´cT˙´cT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙µcT˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙ĥcS˙·cS˙·dS˙·dS˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙·dR˙¸dR˙¸dQ˙¸dQ˙¸dQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙¸eQ˙ıeQ˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙ıeP˙şfP˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙şfO˙ğfO˙ğfO˙ğfN˙ğfN˙ğfN˙ğfN˙ğgN˙ğgN˙İbL˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĥı·˙˙m;,˙½gL˙½gL˙½gL˙½gL˙½gL˙½gL˙½hL˙½hL˙hL˙hL˙hL˙hL˙hL˙hL˙hK˙hK˙hK˙hK˙hK˙hK˙hK˙hK˙hK˙hK˙hK˙hK˙żhK˙żhK˙żhK˙żhK˙żhK˙żhK˙żhK˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙żhJ˙ÀhJ˙ÀhJ˙ÀhJ˙ÀhJ˙ÀhJ˙ÀhJ˙ÀhJ˙ÀhJ˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÀiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiI˙ÁiH˙ÁiH˙ÁiH˙ÁiH˙ÁiH˙ÁiH˙ÁiH˙ÁiH˙ÂiH˙ÂiH˙ÂiH˙ÂiH˙ÂiH˙ÂiH˙ÂjH˙ÂjH˙ÂjH˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙ÂjG˙jG˙jG˙jG˙jG˙jG˙jG˙jG˙jG˙jG˙ÂjG˙ÂjG˙ÁkG˙ÁkG˙ÁkG˙ÁkF˙ÂlE˙kE˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkF˙ÄkE˙ÄkE˙ĊkE˙ĊkE˙ĊkE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlE˙ĊlD˙ĊlD˙ĊlD˙ĊlD˙ĊlD˙ĊlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlD˙ĈlC˙ĈlC˙ĈlC˙ĈlC˙ĈlC˙ÇlC˙ÇlC˙ÇlC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmC˙ÇmB˙ÇmB˙ÇmB˙ÇmB˙´hB˙˙XXW˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĠĠÔ˙˙ZA.˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙Ïq;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙q;˙r;˙r;˙r;˙r;˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙r:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr:˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙Ñr9˙r9˙Ïs9˙Ît9˙Ît9˙Íu9˙Íu9˙Íu9˙Íu9˙Ìu9˙Ív9˙Ît9˙Ît9˙Ïs9˙Ñr9˙Ñr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òr9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs9˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Òs8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós8˙Ós7˙Ós7˙żl6˙ ˙__^˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙)**˙)˙Ĝx.˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz,˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙ßz-˙Ŝz-˙Ŝz-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŭy-˙Û{-˙Ú|-˙Ù|.˙Ĝ}.˙×~.˙×~.˙×~.˙Ö.˙Ö.˙×~.˙׀.˙Ĝ~.˙Ù}.˙Ù|.˙Ú|-˙Ú{-˙Üz-˙Ŭy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙Ŝy-˙™\*˙˙––•˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙xyx˙˙Y"˙ì ˙ì ˙ë ˙ë ˙ë ˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ë€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€!˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙ê€"˙é€"˙é€"˙é€"˙é€"˙é€"˙é€"˙é€#˙é€#˙é€#˙é€#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙é#˙è#˙ĉ€#˙ċ#˙‚$˙âƒ$˙á„%˙à…%˙߅%˙߆%˙Ŝ†&˙܇%˙Ŭ‡&˙Ŭ†&˙Ŭˆ'˙Ŝ…&˙߅&˙à„&˙à„&˙âƒ%˙‚%˙ä$˙ĉ$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙è$˙ç$˙ç$˙ç$˙ç$˙ç%˙ç%˙ç%˙ç%˙ç%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ç~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~%˙ĉ~&˙ĉ~&˙ĉ~&˙Ŝz%˙+ ˙˙ÓÓÑ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ÜÚÖ˙,+*˙ ˙–]˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ô…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ó…˙ò…˙ò…˙ò…˙ò…˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ò„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙ñ„˙„˙„˙„˙„˙„˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ƒ˙ïƒ˙ïƒ˙ïƒ˙ïƒ˙íƒ˙ì„˙ê†˙è‡˙ĉˆ˙ċ‰ ˙Š ˙‹ ˙áŒ!˙áŒ!˙áŒ!˙ߍ!˙à!˙à!˙à"˙àŒ"˙â‹!˙âŠ!˙Š!˙ċˆ ˙ĉ‡ ˙ç†˙é„˙ëƒ˙í‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙î‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í‚˙í˙í˙í˙í˙ì˙ì˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙ì ˙x%˙H.˙˙•”’˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĈĈÄ˙(((˙˙8+˙vN˙•i4˙n8˙žo8˙Ÿo8˙Ÿo8˙ p9˙Ħp:˙Ħq:˙˘r;˙˘r:˙¤s;˙¤s;˙¤s;˙s;˙t<˙Ĥt=˙§u=˙§u=˙§u=˙¨u=˙İv>˙İv>˙İv>˙Şv?˙Şv?˙Şv?˙Şv?˙Şv?˙Şv?˙İv?˙İv?˙İv?˙İv?˙İv?˙İv?˙İv?˙İv?˙İv?˙İv>˙¨v?˙¨v?˙¨u>˙Ĥu=˙Ĥu=˙Ĥu=˙s=˙s=˙¤r=˙£r<˙£r<˙£r<˙Ħq;˙Ħq;˙ p:˙Ÿp;˙žo9˙žo:˙œn9˙œn9˙œn9˙›n9˙šm9˙šm9˙šm9˙—k7˙—j7˙•i6˙•i7˙•i7˙•i7˙•i7˙•i7˙•i7˙•i7˙•i7˙•i7˙•i7˙•i7˙•i7˙•i7˙–j8˙—j8˙—k8˙™l9˙™l9˙™l9˙šm9˙›m9˙šm9˙›o:˙šq:˙št<˙™u=˙›w=˙šx=˙›z?˙š|?˙™}?˙™~@˙™@˙›€A˙œ@˙›@˙›‚B˙ž„A˙œ€A˙A˙žA˙Ÿ~A˙ }A˙ |A˙£|B˙¤{B˙zB˙ĤxB˙§wB˙¨vB˙¨vB˙¨vB˙¨vB˙§t@˙Ĥt@˙Ĥt@˙Ĥt@˙Ĥt@˙ĤtA˙tA˙tA˙¤s@˙¤s@˙¤r?˙£r?˙Ħq>˙ q?˙ q?˙Ÿp=˙Ÿp=˙o<˙œn=˙›n<˙›m;˙™l;˙™l;˙˜k;˙—k;˙—j:˙•i9˙“h9˙“h9˙“h9˙“h9˙g8˙g8˙g8˙g8˙g8˙g8˙g8˙g8˙g8˙g8˙g8˙’h9˙’h9˙“h9˙~Y.˙_=˙ ˙˙~|y˙ßßŬ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ĠĠÔ˙||{˙)'%˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙ ˙˙˙˙˙˙˙ ˙ ˙ ˙ " ˙ ˙ ˙" ˙ ˙˙˙˙˙˙˙ ˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙CCB˙ĴĴŞ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ŬÜÙ˙ÄÄÂ˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙żÁ½˙½Âĵ˙ĵş˙şÄı˙¸Ä¸˙·Ċ·˙ĥĊĥ˙´Ĉ´˙³Ç´˙²Ç²˙ħȲ˙°Èħ˙ɰ˙ÉŻ˙ÉĴ˙­É­˙ŻÊĴ˙ŻÉ­˙ŻÉ°˙°Èħ˙ħȲ˙²Ç³˙³Ç´˙µĈµ˙ĥĈĥ˙·Ċ·˙ıĸ˙ğ¸˙ĵÂğ˙Âĵ˙ÀÁ˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÁÁż˙ÂÂÀ˙ÍÍË˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ááŜ˙àâŜ˙ŜâÜ˙ÛÚ˙Ù×˙×Ô˙ĠäĠ˙ÓäÓ˙ÑäÑ˙Ïä˙ÎċÎ˙ÌċÍ˙ÉĉÊ˙ĈĉÈ˙ĊĉÇ˙çĈ˙ċÂ˙ĉ˙ÄċÁ˙ĊĉĊ˙ĈċÇ˙ÈĉÊ˙ÉċÊ˙ÌċÍ˙ÎċÏ˙äÑ˙ÒäÒ˙ÔäÓ˙ĠâÑ˙Ĝ×˙ÚÚ˙ŬâÜ˙àâŜ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙áâŜ˙ŜáÙ˙ÜâĜ˙ÚÙ˙××˙ĠÒ˙ÒÏ˙äÑ˙ÎċÏ˙ÌċÎ˙ÉĉË˙ĈĉÈ˙çĊ˙Àç˙żçÂ˙èÁ˙½ĉ½˙ĵĉ½˙ĉğ˙żçÁ˙żċÀ˙ÂçÄ˙ÄċÄ˙ÇĉÉ˙ÊċÌ˙ÎċÏ˙Ïä˙ÑâÌ˙ÔÓ˙ÖÖ˙ÙĜ˙ÛÚ˙ŜâÜ˙àâŜ˙ââà˙ââà˙âáß˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙àâŜ˙ŬâÜ˙ÚâĠ˙ĜâÑ˙ĠäÔ˙ÓäÓ˙Í˙ÎË˙ËċÌ˙ÇĉÉ˙ÄçĈ˙ÁçÄ˙èÁ˙ğè˙¸éĵ˙ĥéş˙µè·˙µç·˙·çµ˙¸èğ˙ıĉğ˙ğĉ½˙ĉÀ˙ÂçĊ˙ĊĉÈ˙ÊĉË˙ÌâÇ˙ÏäÏ˙ÒäÒ˙ÔäÔ˙××˙ÙĜ˙ÜâÛ˙ßâŬ˙ááŬ˙âáÜ˙âáß˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙àâŜ˙ŜâÜ˙ÛÚ˙ÙĜ˙ÖÔ˙ÔâÌ˙ÑäÏ˙ÎċÏ˙ËäÈ˙ĈäÄ˙çĊ˙èÂ˙ğèż˙·èğ˙²ê·˙Żê´˙Ĵë²˙ĞêŻ˙Ğé˙é˙­è°˙°é´˙³ĉ´˙ıé½˙ĵèÀ˙Àç˙ĊÀ˙ÉċÉ˙ÍċÎ˙äÑ˙ÓäÓ˙ĠäĠ˙Ĝ×˙Ûâ×˙ŬâĠ˙àâÚ˙áâß˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ßâŬ˙ÜâÛ˙ÚÙ˙××˙ĠäĠ˙ÒäÒ˙Ê˙ÌäÇ˙ÈĉÉ˙ÂċÁ˙ċĵ˙ıè½˙´éı˙ê´˙Şë°˙ìĴ˙£ìŞ˙Ħì§˙˘ë§˙ê§˙£è§˙§éĴ˙ĞèŻ˙°éµ˙·éğ˙ĵċş˙ÀĉÁ˙ĊĉÇ˙ÊäÉ˙ÎċÏ˙ÑäÑ˙ÔäÒ˙×Î˙ÙÒ˙ÚÚ˙ŬâŬ˙àâß˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙áâß˙ŜâŬ˙ÛÚ˙ÙĜ˙ÖÖ˙ÓäÓ˙äÑ˙ÎċÏ˙ÉċÈ˙Ċċż˙żçÀ˙ıçş˙³ç³˙Ĵë²˙Ĥì­˙Ħì¨˙œí¤˙˜îĦ˙–îž˙–ìœ˙šìž˙šéŸ˙è˘˙£êİ˙¨ê˙°ç°˙·èı˙ĵĉ½˙ÀäÀ˙ĈĉÈ˙ÌċÌ˙ÑäÊ˙ÓäÌ˙ÓäÔ˙ĠäĜ˙ÙÚ˙ÜâÜ˙ßâŜ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙àáŬ˙ŬâÚ˙ÚÙ˙××˙ĠäĠ˙ÒäÒ˙Ïċ˙ËċÌ˙ĊĉÈ˙ÀçÂ˙½ĉş˙µèĥ˙ĴéŻ˙é¨˙žíĤ˙—î ˙Žï™˙‡ï‘˙„ñ˙ˆî˙ˆí˙Šì’˙’ì™˙šê ˙£êĤ˙İê­˙Żçħ˙·ĉ¸˙çÀ˙ĈĉÂ˙ËċÄ˙ÎċÍ˙ÏċÒ˙ċĠ˙Ôä×˙ĜÙ˙ÚÛ˙ŜâŬ˙áâß˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ßâŬ˙ÜâÙ˙ÙâÔ˙Öâ˙ÔÏ˙Ñä˙ÎċÏ˙ÉĉÊ˙çĊ˙½èÀ˙·éğ˙Żéħ˙İêŞ˙Ÿë¤˙–ì›˙ˆñ“˙~ò‹˙z†˙{ôˆ˙ï‰˙|ï†˙}î‡˙‚íŒ˙í–˙šë ˙Ħè¤˙ŞéŻ˙µéµ˙çı˙ÁçÁ˙ĈĉÈ˙ÊĉÎ˙ÌċÒ˙ÏċÔ˙ÒäÖ˙ÖäÙ˙ÚÛ˙ŬâŬ˙áâß˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙áâß˙ŜâŬ˙ÜâÛ˙ÙĜ˙ÖĠ˙Ó˙Ê˙ÌĈ˙ÇċÄ˙ÁçÂ˙ğè˙²ê·˙İë°˙Ħí§˙šìž˙‹ï“˙~‰˙{ò‡˙}ò‰˙ġ˙†ó˙€Š˙}ï‡˙|†˙ƒîŒ˙ë–˙žì£˙İëŞ˙°ê²˙·èş˙½ĉ˙ċÄ˙ÈĉÌ˙ËĉÑ˙ÎċÔ˙ÒäÖ˙ÖäĜ˙ÙÛ˙ÜâŬ˙àâß˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙âáŬ˙âáÜ˙ááÚ˙Ŝâ×˙ÛâÖ˙ÙĠ˙ĠäÔ˙ÒäÒ˙Ïċ˙ËċÌ˙ĊĉĊ˙żĉ½˙şĉ·˙ħèħ˙ĤëĞ˙œî¤˙˜˙‚ñ‹˙€òŠ˙ƒòŒ˙…ô‘˙Šó”˙‘ôš˙ˆ‘˙ƒñŽ˙ñŠ˙}ï‡˙Œ’˙™íž˙ é˙İçĴ˙²çµ˙ğçż˙ÂçĊ˙ĈĉÌ˙ÊĉÑ˙ÎċÓ˙ÑċĠ˙ĠäĜ˙ĜäÛ˙ÛÜ˙ßâŜ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙PPO˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙áâŜ˙ŜâÛ˙ÛâÖ˙ĜÑ˙ÖÍ˙ÓäÊ˙ÑäÈ˙ÌċĊ˙ĈĉÁ˙żç˙·éı˙­ê²˙¤ë§˙šìŸ˙Šï’˙|óˆ˙€ġŒ˙Šô”˙šó£˙żôĊ˙Ìġ˙Ĵò³˙Žò˜˙†ó˙ñ‰˙í‰˙ë–˙ë¤˙§ê­˙²éĥ˙ğè˙ÀçÄ˙ĊçÊ˙Éĉ˙ÌċÓ˙ċĠ˙Ġä×˙×äÚ˙ÛÜ˙ßâŜ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ddd˙˙˙666˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙ĵ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙àâŜ˙ŬâÜ˙ÚÚ˙××˙ÔäÔ˙ÒäÒ˙ÎċÏ˙ÉĉÊ˙çĊ˙è˙·éĥ˙ŻêŻ˙ì§˙™îž˙ˆñ˙‚ò‹˙ˆô’˙‘ġ˙ÊöÎ˙óöó˙ööġ˙äġċ˙¤óĞ˙…˙}ïˆ˙{î†˙‹ì”˙šë˘˙ëĴ˙°êµ˙ıè½˙ÀçÂ˙ĊĉÉ˙ÈĉÎ˙İÂŻ˙‘•˙“£–˙•Ħ—˙–ž—˙˜›˜˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙šš™˙DDC˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙;;;˙ÂÂÁ˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙ââà˙àâŜ˙ŬâÜ˙ÚÙ˙××˙ÔäÔ˙ÒäÒ˙ÎċÏ˙ÉĉÊ˙çĊ˙ĵèÀ˙´éı˙Şë°˙ í§˙“ïœ˙‚ò˙{ġˆ˙‚ġ“˙šġħ˙Ûöà˙ġġô˙÷÷ö˙îôî˙Żóĥ˙‡ó’˙€ñ‹˙ˆ˙Œí”˙œëĦ˙Ĥéİ˙°ç°˙ıċ·˙żċ½˙Ċä˙­È˙1&  ",8ER^is{€ƒ„‚~wod "-9FS_kt|‚…†„ypeYL>2&  "-9FS_kt|‚…†„ype "-9FS`lv}ƒ†‡…€ypeYL?2'  "-9FT`lv~ƒ†‡…€zpf "-9FT`lv~ƒ‡‡…zqfYL?2'  #-:GTalv~„‡‡…zqf #-:GTalv~„‡‡…zqfYL?2'  #.:GTamw„‡ˆ†zqf #.:GTamw„‡ˆ†zqfYL?2&  #.:GUamw„‡ˆ†zqf #.:GTamv~„‡‡…zpeYL>2&  #.:GUbmw„‡ˆ†zqe #.:GTalv~„‡‡…€ypeXK>1&  #.:HUbmw„‡ˆ…ype #-:GTalv~„‡‡…€ypeXK>1&  #.;HUbnw…‡ˆ…ype "-:GTalv~„†‡…€ypeXK>1&  #.;HUbnx…‡ˆ…ype "-9FS`lv~ƒ†‡…€yodXK>1&  #/;HUbnx…‡ˆ…€ype "-9FS`ku}ƒ††„xodXK=1&  #.;HUbnx…‡‡…€ypd "-9FS_ku}ƒ††„xodXK>1&  #/;HUbnx…‡‡…€ype ",8ER_ku|‚…†„xodXK=1&  #.;HUbnw„‡‡…€yod !,8ER_jt|‚…†„xodXK>1&  #.;HUbnw„‡‡…€ype !,8DQ^jt|‚……„xodXK>1&  #.:HUbmw„‡‡…€ypd !+7DQ^is{„…ƒxodXK>1&  #.:GTamv~„†‡„€yodÜ !+7DQ]is{„…ƒxodXK>2& é #.:GTalv~ƒ†‡„€yod  +6CP\hrz€„…ƒypeYL?2'  $.:GTalv}ƒ††„xod  *6BO[gqyƒ„ƒypfZM@4(  $/;HTalu}‚……ƒ~wnc )5ANZfpx~‚„ƒyqg[NB5*   &0JVaktz~yri^RF:/& !*5@LWcmu{~xqh^ %0;GS^hpw|~ysj`UJ>3*! %.8CNYdmu{~~{uneZ #-8CNYclsy|}}ytlcYNC8/&"*32(  #&''&#  áXL?3)" $(+,,*'#  áYL@4*"#'+.00.+&   áYM@4*# $)-1331-("  áZM@4*# $).1331-("  áZM@4*"$)-0220,'" áYM@4*""'+.00.*&   áYL@4*" %(+--+($ ù àYL?3)!"&)**)&! ó  á YL?3)! $'((&$  ñ  àXL?3)  #&''&# ñ ËXK?3)  #&((&#   !""#"!àXK?3)!"&)**)&" í "%'(*++,,-,Ŝ+*('$XK?3)!!%),..,)% ì "&*.02456677Ŭ65420-XK?3)"$).1331.)# ì %*/37:=>@AABBAÉ@><96XL?4*"#(.379973.'   %+16;?CFHIJKKLKŜJIGEA=XL?4*#!&,39=@@=93+$ ë %+17=BGJMOQRRSSĈRQPNKHDXL?4+$  $*18>CFFC>70'  $*07=BHLORTVWWXXÇWVURPLGXL?4+%! "&-44+%""%+3UI=3+%"#&,4=GOUXXUOF<2(  &,27;?BEGHIJJKKÌJIHGFDA>;7RF;1*$""&-5>HPVYYVPG=3) #*05:>BDEFGGFEÎDCBA?=:740OD90(#!"&-5?HQWZZWPH=3)!%,28=@CEFFEŝDCCBAÎ@?>=;9630-)K@6-&" "&-5?HQW[[WQH>3)! '-49>BDFFĝEDCBBAA@@Í?>=<:852/+'#F<2*$ !%,5?IQX[[XQH>3)! &-39>BDFFùEDDCBBAAË@?>=;9630,(#@7.'! %,5?IQX[[XQH>3)!%+27<@CEGGFEDCÊA@>;840+&":1)#$+5?IQX[[XQH>3)!"(/5:>BDFHIJJI€½HFEB?;72-'"3+$#+4>HQX[[XQH>3) %+06;?CFHJLMNOOPPOONMLJGD?;5/*$,%"*4>HQX[[WQH>3)  &,17<@EHLNQRTUUVVUUTRPMIE@:4-'!%!*4>HQX[[WQH>3) !'-28>CHLPSUWXYZZ—YXWURNID>82+%!)3>HQW[[WQH>3( "(.4:@FKOSVYZ\\]\\[ZXUQMHB<60) )3>HQW[[WQH>3(  ­ #)06=CHNRUXZ[\]]\\ZYVSOKF@:4. )3>HQW[[WQH=3( %+28?EJORUWYZZYWUSPLHC>93 (3>HQW[[WQH=3( "(.5;AFJNQSUUVVUÄSROMJFB=8  (3>HQW[[WQH=3(   %+17@ABCDDEEFGGHIJJüIGDÈ '2=GPVZZVPG=2( #'+/268;=?@ABCCDDEFGGHIJJIGD '1@BCDDEEFFGHHIIJJÈHFC &0;ENTWWTNE;1'!&+048;>@BDEFGHHIIJJKKLúKJIGD@71.ûù+÷÷)ö  ö 'é  &ç  %ċ  $ċ  !!  #ċ #&''&# " #'*,,*'# "  &+.00.+&  " "(-1331-(" ä "(-1331-("  ä "',0220,'" ċ  &*.00.*&   ŝċ #(+--+($ ùù ĉ !%)**)&! ġ     Û   #&((&$  ò Ú  "%''&# ï Ċ  #&((&#   !!Ĝ ! !%(**)&" í !$&()**++×*)('$")%!$),..,)% î "&)-/13455Ĝ420-*&"2-("#(-1331.)# í $).269;=>?@@Â?><:73/*%93-'!!'-379973.'   %+06:>BDFHHIIĜHGEC?;61+%>82+%%,28=@@=93+$ ì %+17CFFC>70'  í $*0682+% !(09BJPSTPKB9/& %+05:>AEHJLMOPPQQÈPOMKIFB>93-'"!)1;DMSVVSMD;1' &,16;>ACEFGHHIIJÑIHGFDA2-(#!)2BDFFDC@><:987767788:;=?ACEE%!!)3=HPWZZWPH>3*"!(07>CGIIGEA=9630/--,,-./147:>AEG )3>HQW[[WQH>4*"$,4HQX[[XQH>4*# '/8@GLOPNJD=70*%!"&+17>DI  )3>HQX[[XQH>4+#")2;CKPSRPKD<4,& €ŝ!&-5HQX[[XQH>4+##+4=FMSUTQKC;2)"#*2;CK )3>HQX[[XQH>4+#$,5?HOTWVRKC:0'  (1:CK  )3>HQW[[WQH>4+#%-6@IQVXWRLC9/&  '0:CK )3>HQW[[XQH>4+# &.7AJQWXWSLC8.% € &/9CK# )3>HQW[[XQH>4+# &.7AJRWYXSLC8.$  %/9CL(#!*3>HQW[[XQH>4+# &.8AKRWYXSLC9.%  &/9CL-(""*4>HQX[[XQH>4+# &.7AJRWYXSLC9/%  &/9CK2-'""*4>HQX[[XQH>4+# %-7@JQVXWSLC90&  '0:CK71,&!#+4>HQX[[XQH>4+#%-6?HPUWVRLD:1(! !)2;CK;60*$$+5?IQX[[WQH>4+#$,4>GNSVURLD<3+$$+393,&!$+5?HQW[[WQH>4*##*2;DKQSSPKE=6.(""(.5=DJ@:4.("$+4>HQWZZWPH>3*"!(08AHMPQOKE?92-(%"  "$(-28>DI@:4.("$+4>HPVZZVPG=3*"%,5=DILNMJFA<830-+)(''((*,/37<@EH>93-'!#+3=GOUYYUOF<2)!")08>DHJJIGD@=:7543211Î23469CEGG÷EDBA?>==<<ö;<<=>?ABDEE\ ,  ùù ú ġ     ġ  ù ò ó  ĝ ï  ÷ ï  !!î  ö í !$&()**++ì*)('$" ÷ î "&)-/13455ì420-*&" ġ ê $).269;=>?@@ê?><:73/*% ġ ê %+06:>BDFHHIIéHGEC?;61+% Ŭ%  %+17AEHJLMOPPQQÈPOMKIFB>94/)$ >:50*$ &,16;>ACEFGHHIIJÑIHGFDA>:50*$ B?;60*# &,28<@BDDCŝBAABüCDDEEÀDB?;60)" EC@;6/("$+28>BDFFDC@><:987767788:;=?ACEEŽC@;5/'  HGEA;4-& ")07>CGIIGEA=9630/--,,-./147:>AEGHGEA;4,$ KKIF@91*# %-4DIMNMID<3*! NQPMG@8/(" $+3;DKPSRPKD<4,& €>!&-5FMSUTQKC;2)"#*2;CKPSROJB8/% QTTQLD;3+%! "'.6?HPUWVRLC:0'  (1:CKQTTQKC:0& QUURME=4,&"!#(/8AJQVXWSLC9/&  &0:CKQUURME;1' RUVSNF=4,&"!#(08BJRWYWSLB8.$  %/9CKRVVSME<1' RVVTNF=4,&""$)09BKSXYXSLB8-$ €œ %.9CKRVWTNF<2' RVVSNF=4,&""$)09CLSXZXSLB8-#  $.8BKRVWTNF<2' RUUSME=4,&""$)1:CLTXZYTLB8-#  $.8CKRVWTNF<2' QTURLD<3+%"!$)1:CMTY[YTLC8-#  $.9CLRVWTNF<2' PSSPJC:2*%!!$)1:CMTY[YTLC8-#  $.9CLRVWTNF<1' PRRNIA90)$!!#)1:CMTY[YTMC8-#  $.8CKRVVTNF<1' NPOKF>6.'" #(09CLTY[YTLC8-#  $.8BKRUVSME;1' LMLHB;3,%!"(09CLSXZXTLB8-#  $.8BKQUVSME;1' JJHD>70)#!'/8BKSXZXSLB7-#  $-8BJQUURMD;0& GFD?92,%  &.7AJRWXWRKA7,"  #-7AIPTTQLD:0& DB>:4-'!%-6@IPUWUQI@6,"  #,6@IOSSPKC9/& / + ) (ö   'ó &ñ %ï %î !#%'())*$í "&*-0234566$ë %*048;>@ABCCD$é %,3:?DHKMOPQQRR#é $,493,% `_^]ç\[ZYXWTQMHB;4,$ mlkäjiihgfedb`\XRKC;2)  yxâwvvutssrpoljfaZSJA7-# ƒ‚€ä~}|{zywurmhaYPE;0& Љˆâ‡†……„ƒ‚€}{wsmf]TI>3( ŝŽŽáŒ‹‹Š‰ˆ‡†…ƒ~{vpi`VK@4)  ŝ‘àŽŒ‹Š‰ˆ‡†„‚€|wqjaWL@4)  ڑŽŽŒŒ‹Š‰ˆ‡†…ƒ{vpi`VK?4) ڎŒ‹ŠŠ‰ˆˆ‡†…„ƒ‚}{wsmf]SH=2( ډ‡†…„„ƒ‚€~}|{zxurmhaXOE:0& ڃ}|{zzyxxwvutsrpmjf`ZRI@6,# Ú{xvtsrqponnmlkkihfda]XRJB:1(  Úroljhgfeddcbba`_]\YVSNHB;3+# ŝÛjfc`^][ZZYXXWVUTSQNLHD?93,% ùÙc^ZWUSRQPOONNMKJHFDA>:50+% ô   Ç ]XTQNLKJIHHGFEDB@>;840,(#  Ù ZTPMJHGEEDCBA@><:740-)%  ò ×YSOLIGEDCCBA?><963/+'# î  !!""!Ù ZUQNKIHGFEDCA?<951-(#  "%'(*++,,++*)'%"_ZVSPOMLKJIHFC@<72-'" í "&*.024566Ù5431.+'"e`]ZXVUTSRPOLIEA;5/(! ë %*/37:=>@@AA@?=:74/*lheca_^]\[YWUQMGA:2*#  %+16;?CEGIJJÂIHFC@<71tpnljihgfdc`]YTNG?6-%  %+17=BGJMOPQRRÛQOMKGC=8{xvusrqponlifb\UMD:1' Ş $*07=BGKORTUVVWVUTROLHC=‚~|{zyxwvtqmib[RI>4*!  #)/5;AFJNQTUWXXÜWVTROKFA‡…„ƒ€~|zwtoh`WMB7," İ $)/49?CHKOQSTVVWWVVUSQOLHD‹‰ˆ‡†…„ƒ‚|xrldZOD9.#  $*/49=AEHJMNPQQRRQÈPOMKHEŒŠ‰ˆ‡††„ƒ~zune\QE:/$  $*059=@CEFHHIJJŝKJJIÑHGEŒ‹Šˆˆ‡†…ƒ~zunf\QF:/$  $*06;>ACDDCBABCD֌Љˆ†…„ƒ‚|xsldZPD9.$  !)06<@CDDĝB@><;9877Ŭ89:;=?AC‰‡…„‚€~}{xtoiaXMB7,# è &-5A„‚~|{zyxvtrnjc\SJ?5*!  !)2:AGJKJHC>940,)&%$##$%'*-15:@~{ywusrqpomjgc]VNE;2(   $-6>EKNNMIC=60*%" #',28>wtqnljihgedb_[VOH@7.&  &/9BINQQNIC;3,% #(/6>plheca`_^\[YVSNIB;3+$ (2id`]ZXWVTSRPNKGB=60)"  *3=GNSVUQKB90' &.6?c^YVSQONMLKIGEA=93.(" "+5?HPUWVRKB9/& '/8A_YTQNKJIHGFDCA>;72-(#İ#,6@IQVXWRKB8.% !)2;D]WRNKIGFEDCBA?=:73/+&"$-6@JQWYWSLB8.$  €< %-6?H^XSOLJHGFEEDCA?=:740,($ $-7AJQVXWSKB8.% #*2;DL`[VSPNLKJIIHGFDB@=:73/+'"%-7@IQVXWRKB8.% !(08AIRe`\YVTSRQPPONMLJHFC@<84/*%  &-6@HPUWVRKB9/& '.6?GPWlhda_]\[ZYYXWWUTRPNKGC>82,'"!&-6>GNSUUQKC:0(! &-5=EMU]tpmjhgeedccbba`^][XUQMGA:3-'" "&-4=ELQTSPJC;2+$ &,3;CKS[b{xvtrqponnmmlkjihfc`\WQJB:2+&"!"&+3:BINQQNIC<4-'# "&,29AHPX_e‚€~|{zyxxwwvvutsqpmje`YQI@7/)$""%*08?FKNNLIC=71,(&$%&)-28>FMT\bhˆ†…„‚‚€€~~}|{zxurmg`XOE<3+&""#'-4;AFJKJHD?:62/-,,.048=CIPW]diŒ‹Š‰ˆ‡††……„„ƒƒ‚€~{wsme]SI?5-&"!"%*06;8644é57:=BFLQW]chŽŒ‹‹ŠŠ‰‰ˆˆ‡†…„‚|wqi`VK@6-&!"&+16<@CDDúCA?>=<<ô=>@BEIMQV\af_ ŝ ùùöĝ ó   ô ÷  ñ ò ö ñ ï ġ î  !!""!ï  ô × "%'(*++,,++*)'%" ġ í "&*.024566ë5431.+'" ó% ê %*/37:=>@@AAê@?=:74/*% ó+% ë %+16;?CEGIJJÛIHFC@<71+% 2+% ê %+17=BGJMOPQRRÛQOMKGC=82+% 70*$  $*07=BGKORTUVVWVUTROLHC=70*$ ;5/)$ ë #)/5;AFJNQTUWXXƒWVTROKFA;5/)$ ?:4/)#  $)/49?CHKOQSTVVWWVVUSQOLHD?:4/)# B>94/)$ $*/49=AEHJMNPQQRRQÈPOMKHEB>94/)$ C@=94/)# %*059=@CEFHHIJJŝKJJIÑHGEC@=94/)# DCA>:5/)#$*16;>ACDDCBABCD×CA>:5/)" DEDC?;5.' ")06<@CDDĝB@><;987789:;=?ACDEDC?;5.' DGHGD@:3,$ &.5ADGHGD@:3+# DHJKIE?80(!#*2:AGJKJHC>940,)&%$##$%'*-15:@DHJKIE?7/& DIMNLIC;3+#&.6>FKNNMIC=60*%" #',28>DIMNLIC;2)! EKOQPLF>6-%!(09BIOQQNIC;3,% #(/6>EKOQPLF>5," FLQSSOIA8/' "*3FLQSSOIA7-$ GNSUUQKC:0(!$+4>GNSVUQKB90' &.6?GNSUUQKC9/% IPUXWSMD;2)"$,6?HPUWVRKB9/& '/8AIPUXWSMD:0& LSXZYUNF<2)"%-6@IQVXWRKB8.% !)2;DLSXZYUNE;1& PV[\[WPG=3*#%-7AJQWYWSLB8.$  €< %-6?HPV[\[WPF<1' TZ^_]XQH>3*#%-7@JQVXWSKB8.% #*2;DLTZ^_]XQG=2' Y^ab_ZRI>4+#%-6@IQVXWRKB8.% !(08AIRY^ab_ZRH=2( ^ceeb\TJ?5+#%,5?HPUWVRKB9/& '.6?GPW^ceeb\TI>3( cgihd^UK@5+#$+4>FNSUUQKC:0(! &-5=EMU]cgihd^UJ?3( gjljf_VL@5+##*3EJMNLIC=71,(&$%&)-28>FMT\bhloomhaWL@4) mopmhaXMA6+##*2:AFIKJHD?:62/-,,.048=CIPW]dimopmhaWL@4) lnomhaWMA6+# &.5;AEGGFDA>;8644Ê57:=BFLQW]chlnomhaWL@4) jlmkg`WLA5+"")/6;?BDDúCA?>=<<ä=>@BEIMQV\afjlmkg`WL@4) €€€ŝŝŭŭŭüüüüüüüüüüüüüüüüüü   Ñ ")19AIQX_eimnnmje_YQJB91*" Ò ")08@HOV]beggfb]WPIA91*# Ġ !(/7>FMTY]__^ZUNG@80)" × !'.6=DKPTVWUQLE>7/(" Ĝ  &-4;AGKMMKHB<5.(! Ú %,28=ACCA>93-&  Ŭ $*/4799850+% ß "'+.00.,(# á #%''%#    !ċ  $ĉ  &é )÷÷+úü-1 7–   Ï %/:CLRUURLD:0' &,27;?BEGHJKLLMMNNOONÌLJHEA= $.8AIORROIA8.&$+18=BFIKMNOPQRRSTÈSRQOMJFB>9 "+5>EKNNKF>5,$!'/5BFHJKLMMNMÉLJHD@<60*$ $(+--+($ !'-27;>@BCDDEEóDCB?<94/)$Ĝ !$%%$! "'+/3579::;;:ġ8630,(#Ú   $'*,./001ó0/.,*'$ ì  ñ !#$%%&&'&ô%$#! í  ñ  ġ Ŝ   ö ÷ùô  ö ûú÷    ÷ŭ   ƒ   Ġ82,'!!)1;DLRUURLD:0' &,28=ACEFGGF EÊDC3.(" '/9BIORROIA8.% &,17;?BEGIKLMNNOONNÄMLLKJHGEC@.)#%-6>FKNNKF>5,# %+05:?CGJMPRSTUUTÄSRPOMJGD@<)#"*2:AFIIFA:2)! %*05;@EIMQSVWXXƒWVUSPNJGB=8#&.593 ")06:==:60)"  $*0693.(  $(+--+($  $*/49=@CEFGGFEDB@=:61,'"  !$%%$!  #(-147:;<==<<:9741.*%  Ġ    $(+-/112210/-+(%"    "$%&''Ĝ&%$"   ï ó é ò ò úöó ġ ûùö   ĝ ĝŝ      €"@=94.("#+5>GNSUSOG>4*!  "+5?GMQQOIA8.% <83.(#"*36-%  &.7>CFGE@91)  -'" !)18>BCB>92*"  #+29>AB@;5-& '" %,28;<;83-&   '.48;;:60)" "   &,14541-'!  "(.2443/*$  è !&*,--*&"  #'+--,)$   "%&%#  Ŭ !#%%$"  é  Ŝ   ö ċ  ì  ö ô ÷ ġ ÷÷  ġ ö  ġ ùù÷÷÷ûüúûúü ŝ ‹   #é  *5BN[fpy€…‰ŒŽŝ"è )4@LXcmu|…ˆŠ‹Œ#ĉ '1=HT^hpv{‚„…†‡‡ˆˆ#è $.9DOYaiotxz|~€€#ç "+5?IRZagkoqsuvvww#é '09BJQX]adfhijkll$è "*2:AHMRVXZ\]^^__$è $+28>CFJLNOPQQRR$è $).37:=?@BBCCDD$ì !%),/1345566ŭ76$ë  "$&'())**&î  & ŝ&ó (ö   )ú + . €   öŽŒ‹‹ŠŠ‰‰ˆá‡†…ƒ}xrjaWLA6-& !&+05:>@BCDDCDíEFHJMPTY]bŒŒ‹‹ŠŠ‰‰ˆˆ‡Ù†…„‚€|wqjaVL@6,$ %*/484*"$).38<@CFIKLMNNMLKJIHIJLPTY€€~}|Î{zyvsoibZPF;1( #(-38=AEILNOPPOMKIGFEEGKOTwwvutsÍrpnkgb[SKA7.%#(.39>CGJMNOONLIFDA@@BEJOllkkjihŜgfda^YSLD;2)! #).4:?CGIKKóJGEB?<;;<@EK__^]\Í[ZXVSOIC<4,$ $*/49=ADEFEDB?<97557;AGRRQQPOïNMLJGC?93-&   %).37:<=>=<:7520/027=DDC BA@?=;840*%  ñ !%),/2455ó31/-+*)+.39A66 543ó1/-*&"  ñ  #&(*+,,ó*)'%$#$&*/6>** )(ò'&%#   ñ !"#$$û#"! ĝ"&,4< ç  ó#*2;ĝ ġ ġĝ")1:ù ö   ġ÷!(19   â !#%&%$"÷!(19ç "&)++*(&#÷#*1:ô  &*.00ġ.+'# ö %,3;ĉ #).245430,)%"ö $)/5<ĉ $+04799752/+(&$"!  ö!"$&).28>Ù $+159;<;97520.,+**))*+,.148<@ #*059;==÷<;986544334ĝ568:=?Bî !'-37;=?@@?>ù?@ABCDé $*/48BEHJLMOOPPĝONMLJHEç  &+16<@EILORTUVV÷UTSQOLIEè !',28>DIMQTVXYZZYĝWUSPLHCÛ !'-4:@FKORUWXYZZYXWURNJE?Ü "(.5;AFKNQSUUVVUTSPMJE@:ê ")/5;@DHKMNOO÷NLJGC?:4ë "(.38@BCDDCDÁEFHJMPTY]bfijie_VK@4) bfggc]UK@5*!$)/484)  #(-38=AEILNOPPOMKIGFEEGKOTY^aa_ZRI>3( UZ]_]XQH>3)  #(.39>CGJMNOONLIFDA@@BEJOUZ]_]XQH>3( QW[\[WPG=3( #).4:?CGIKK“JGEB?<;;<@EKQW[\[WPG=2( NTXZZVOG=2(  $*/49=ADEFEDB?<97557;AGNTXZZVOG=2( KQVYXUOF<2( ħ  %).37:<=>=<:7520/027=DKQVYXUOF<2' HOUXWTNF<2(  !%),/2455Â31/-+*)+.39AHOUXWTNF<1' FNSVVSME<1'   #&(*+,,*)'%$#$&*/6>FNSVVSME;1' ELRUVSME;1' !"#$$û#"! Ú"&,46,# BHLMMID<4+##).245430,)%" $)/5CGJKIF@90( DGHHFB<5.&%+159;<;97520.,+**))*+,.148<@DGHHFB<5-% DEFEB=81)"$*059;==÷<;986544334Í568:=?BDEFEB=71)! DDC@=82,%"'-37;=?@@?>ú?@ABCDDÑC@=82,% DB?<72-&  $*/48BEHJLMOOPPĊONMLJHEB?;72,'! @<71,&!  !&+16<@EILORTUVVUTSQOLIE@<71,&! =82,&!  !',28>DIMQTVXYZZYÜWUSPLHC=82,&! 93-'! €• !'-4:@FKORUWXYZZYXWURNJE?93-'! 4-'!  "(.5;AFKNQSUUVVUTSPMJE@:4-'! .("  ")/5;@DHKMNOONLJGC?:4.(" '"  "(.38;5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?Ż#8?‘Ĥ‰ À8Áë“Ċa`3šĈ̸u=Ži’À’ż– Xውç†oaëM=fùoµœ#aOŭ?Z’Úéí³µäz…}§ó;Šcpbl…’YíË/9Î}ëIu{È#C"ş  ĵp=µ2‘™$,ÌċĜ–9,SVÚâ&ÒŬĴŒYH$–>ŝƒŸÒŻrͤ³ËÚFbtuÁ‘@qŸ_ZĞĴ KÁn›H…Ğ·=ò}ù¤›`ĥ*ŒĈcHör äž9çü÷o ÄYbù9ÏĠOPc g‚9ġ„۟çLEȅ  ")™x|’9÷ôĊBYUPo^Bœc>ġ/pd\Çn0ÉĈBZĞxıÊÙBŬñ‡?N˙ʈĤž£W+jZt:q‚Q'™.rŜaÉoN=)·—Eä7€°”ĈrIĈpzSÜu‹ vCÊRN8ê}=jôlt3MjZBT†ˆİn2ÇSĊ Ŭ5ËÌÛEÌ[‡L€7äq“ïWijۀĦs½½¨ŠV]ʨ“'‚[8üúÒ,ğYV`2qÔvĤĈù!>hF†ôŠŞ'T‘]ËÈÁçƒÏÜîLóÛEĉiúgċNİĤ6½gˆä•$Áäˆ4’³ıšSLĴúô2Êı[T Ĵ’n!™}ıŭ1YzĤİ$óFĥŭyq6Œ{wüiĤÊÔ½3¸ĴëĞĦċ˜ÔBIĴÀ´ót>‚3ĞŞí;³f¨D–÷-I¸èGjmĴ1Ê̐FßÂOCFĜ`~ažıÇ%ÔÉ# 1wŝ9ëô Äğĥċò0 ñĦq‘ÁĊPÀžž´•sž„ô  6žYVŬnWž_ì;óüé×—aıċ\bаŬ‰6Ÿsçħß7ÊrÒ£’ÒG¸dŒ ñĵ€ÀuÉJkqXš¸hŒI™9Äj|ôü°?ZŻ hIĜÊŞÑá¸ŭîĜô£k}tgFK „D,Ê,Ä}:U5´u H ĝfĠLd~_–„ÉïŽprzp)‘ ñ×­$ę#Ù5VR0ïgÜHí™ħ–™ıïž=jÏx§”ÙÈsÓëI>¤Üè촛hš9ÖWw އÓéZ¨áĈ)'a¤$ÇqòËH?ÚŞ’[}”fLjÂÊ<ÄúzÎ…+ (Ïw'™“če‡ĉFġ¨â­ÜD7Ê·OSUÍÔW°£2Û2‰r0HŝES†K´ŭÌñ4Œ0KsÁÏùíB–£-ŬŬ§È™MĊĠ][ރŜ³5­FÊ%Tĥ ,üîéêjÓı rL÷R ĊcQÀ`-_´µŽkp°,BnŒÓIÇŭ‘Mö(“,:qïY—awìE§ D–¨#ŜC€ß*“Ôŭ*)-\•+U<{ŭM4?1×6Œ˜BÄ’ŭ Œ˜Ú5 êy$|Ŝ˙…#Y ĵ¸eAŭ=¨ĥŒÌZ< ½r{SùĦHcR ż8Üzè=İFĄ̂„zu§}ħĦBŒ[’21TÉ"Ĉ:ħÀÍ$"xìßí Ĵ$1˙U[´ŒÍrd•O—üOéCĠ lo=ŭµ³'ÚZ0÷J.GéüŞ)P5¸†×'ç §FI?UtälÚµŠ’Lĥ–3ÊĦdœŸšB0˞?CüĞ!-ž µ>0HPıçÒĦ-LM‰%ı’ċÚbTCqŜ k˜Xp˜o”ŻŜç5:ŜìžKƒ ²$i4’.ïĜäôíPÉžd2EÊò³dë˙êŞó› bäî%v’Gj‘˘+Œ•*zsĥ›`j[[I§ùƒ¤ß)ÛÈÇcšžúáTˆY•’SœЃŸĉ* ĝPçòe‚+r‘³ċWa€ûÇ u²Ì;£ž ħŒìó'éS†]-Ş4'çĝP8ʞsĝdÂ§MEL›Ë²B GŜ5ò Ĝ|ZŠÈۂÈW‘O֙wsĉÄr3ŽG_ϊ¨Ğ ½È-]\E†e Ĥ6ŻÒ\iWQżšG:Ÿ–D =ŭϽTvMiw½ĵıĦX§Ĉp£‡¨ĴËċoµ>g’R Ó×·lP–£3Ż.ŜRħy†@™¸JŠ%òĉFpO!HÈ?ZÓdİo ìí”ħȲŬFcˆ 0{‘ÏôĤî'?f(c ĵúÔħÄöħ•ĥb[¨ßë˙פö)--Ż#iQ!ûâE)ġúûTJÁXÇ4r`üĊ‹á‡Ħ÷ÇaRŸqs7ĦVyŭFŭÀ6Ží˙êŝ´Ù™Bğ’Ş°ŭŞ?ħl‘i?*ëÔĠ`üü™$ġŞ\nɰ€;ı#Ż^*Äq£Ş‰d*˜l ô8­7˘8Ô˰+ŒëJ*ùÏN˘Ç4ËnÖëÊÈyBx^ƒÖ ÁCĉ+˜Êħ œcĥsġŸjIŜ ]ĥ’ÒûÎËĉr~^çŒçjÊvÛĈ¤³:žĤ­jRĜÀĠċu_1@ áœôéY2Ë.rĦBĞ0䓁ġöŞKĞĉ›o5­ùQG?˂ۀü¨ıhĤ•Ġ­ü†R >qëŝ4_™h…Ô1M,jm9ÈÜF:ŭjî™iml7›’PĞqÁê=İ]lˆáĜŞ üOğ˙×§F ĵ}y?Z`,ċJ3Hĉ4ÇPzĠwğ‹ËcĦì{ѨX‚E2€e8‰ùrrWëëQ‹7ĈċÉQÒL`SY~˙Ŭ =*é0¤A8<€Ŭ:™JP Ÿ_½BÜ|„c“ÉÇ0Û2€ğ÷w%ı#ı˘O’ñ<”Ş3ĝQ¸À–pLÊ>^½ħH/_Ê„Ĉ½żN´0¸áXK<„ıáG½E+nÌ ó´ŭ*lIàc4GĵH Ċ~nFGĠĦ’Û÷íŸ 7םż…>X×. s"/Ĉ2sŠ@É&H"Ž'†BÒuaÛ§L~•YOÈÀç֒ÔBĈNàĜÉSœġjKv–8ä+I'׏óúÓuĵD•Ï7 V1˜†8#sDXÑb-ħÄäê9Àö‘ĵ²Ċ”mrryÉÏ×ëQa2)BCp…Ifŝ O^?ŭuvŜiG™(€4JfÎYsè} ,Ĝ’×>i‹ÌˆG´ï•Á ¸%‹cİ İ,™DÓkFğ‡îĞÇ8ìӰвZcXi\ Ì@7£cz›QH4ûC-Ԅ"Œ¸ÜÇU(]\v8ĴÉİŜˆÔ°Œ·œíıme ²yhğ—ŻÎ5/ħ,Żu;Çtc‰.:¤xaÇŻÖİŜŜÇş|´ƒ 睤ŽühZ0D˘Ŝ@Ŝ\ ½œuü1ǽN“[ïX$Œ–=ĝúTì5ĤĠWjÛ9QŝÉĤ ÉBR.:eŽ}P òld&â9.—J‘˜F$ î/?¸ċX“'Ë 'i ;ŞîLH@Î 7gÓéMj!!µ0Hr?„cñ˘[RêYP–&E…Üà‚~µ1\š!żoNßZJB3+ü¨cÛÀ,Xk™ĜŞPdzJ˘Oâ%‰û S‚ĥKĈĵLâ€êF:G'ß˙­B–‘ÙÔ*éÀÒʓŒœÒ¤NäFbF@$€ĥöòX_$yapGĤ~µ\ùqIđœjì @Ş÷986§iw‘TvÏžô–ä‹ U0äH3¸cnf ħÛ9˙=݁˜NïԊ]êàĵt84iaŠ\şİl†Üû§·S{ öä–î?•Mԑ²6rO>™í Ú7%ĥµˆÛùĤyTy†X÷rYvîÏ $úġĦ­Òĉŝ;”XĴ-öŞÂq?÷N;˙LU8î3BçX“EùotÈá.™G„˜àqùñ\Żw}ŞËĠÈ!%%a°˙µ'kşşzZyk ĦŒiŽŜ'ž{ġç†AQ·'Ï ġĴowĦ#%„Ŝ@RfuMÜ*÷>ŝµĜX-fTڃÀà|‘úÓCZċ¸Š]Ĉ9 aşĦ§EqÙX•.:+oĈŸ§l:– .ñûÇŝïjTâaéƒÇXĦġ#ßċ̓TŭvàR 9àÔ ĉ<…€ğà{ŸóĊ emĴżçùÒ2§÷Ĝût Ê£iáN:`“ùôŞRÂ0/œpî}{ B‹>\ĥsğ<ÒĊ3b@§ÉÏ=ݧq˘YtHMğ¨Ç§9÷Şò Có‚z}¨ó –2á$@Ĝ~9#“ô§ż!D½JœSb0:ç4nu”:ıV¨m4"Ür\Ώ›™BħäûTóYċ,ç$óœRê„ÚwîÂwy<İċ)û3óĠ˜÷öİĥşRşÉċ0`>ëdĉ•$]Ä`=j€L¨4ġ—ʐ²qĊ@d;vé1¸ gqÈòÊ2óžœ LLfÀqÎĞş¨RħŸ47/ğŒ`cÔQÌ;—£…JÈ·ñL1Ióô`^ñÜwĤĴ²ĜÙ<ë2Ĉ’üĤÁüĈċì=ÍZEM?/s³ œ)c‘=3éÚ­MzÍŞ<İ´n¤C”ßœ ägž•:½ı?Úî&·wHŬÁ$ïtİ|¨ÀŜ˜Ü@"CÉİOK1\§sw5ğa&‘ó\3UEäò퍛rž…i`nƒ;bcgk›˙ İ)!³Î}Í5ĉ3L˜`dRKn‡ eÂ8ġĤ3ncò'^84€I €RT“€ïB@Ĵ~‡ż­H­‚ğ<`~4ğÎq–•Ì— yíġЁF#Sğ%ù<ĥÎppzúT–ñš} Eğ9℠ӸĤŜOw ğXü0xÈ`Ôd–Êa”îÜ{Ï?SğUً†f9À9ĊPD+Ĵwޤw˙ġÔ 7sótĉİ0Ħ@ÌjĊzç½\‰fğ€•œ¸ÁèNE nÌSr•‚ñq"ǝçžëSd$<›œ‘ÁäÒG‚ŬH#P’"1)]¨}z9} cwçĦ§0)…#hhL€“µŠŽĵt§+.á•Î7Ĉh²½ÀħoyqbÌÉF“‘ǧ9úšuŽ•u|ĈeµvŒäрúÔZ-M^i,ÑB§÷€äŽ˙‡5FÎ'ŜóËón)œZI4µUŠXP*˜ñÁVŸQQ´Ğ`0Úyt=ÇġĤ•–£J™„¨ğmż{hÁÎ}{ñІhFò Á<óüê_½ĥ„½JÍ4op ™*À‘Œc˙­D‚5ĥ1$L%'ĉ$öëJÖÔ G;è8ïڑ™\ƒŽ€qT1 •^NG|S<Àà€zu¤Ä°b\#`p)Ĉlĥî;žÔĥÙʛ²zĦݤ‘3·êO˙ŻT2 ‘İç-Ž9ÍCµ@PÏ·CJ÷ Îà_j™K'–Ç<ç§˙ިh’GžKƒ ’ûN@'ŽĝTĞu.eÈ{ĉL BR&/0‡r*Ğ~§óĤLêΈŞg<H”’Ù$rzS-ä á~´ìùFäuàsRĈĥ€Ç˙×LuNŜgn§Ŝ™ċ­Œĥxoéġ¤ j…(wg#Ñğ)&"Ĉ%’%UŒü^äZcF‘çDÀ‘Ĉ{PM›Ĵo$ƒbŽ™î}İĥçnÙ¸U{Œıo3Ŭ4‘ħv,8ïÀN”îhPÈìÍÉÎ0·)ÑÀ›ĥɑ‚A#$.? 65 =-"ß"ʤ˙ÈòëšÎä3ê(’HCáĝ#>ĤŒçİ9­H‡ˆ›81•Ç÷³LgÙòı8b‹ k8ŬÈhfM£€[ܚXĥӜ §1éëZ‰Ħĥ´_ν—½ĥqÎ3Uu—ŸÙ³-´QKħ‰>lΤş¨x§Ĥ=é—ÖJLŸa¸ƒpĉ@y÷•jèQş!P Œe'<ŽÓ&г lRğF ÏŞ"î"X-$XÛΌĵ?:ËòfU(T…9Ç;½éÜd‚]˵[ zŒisŽĜ5"Íĵ|ÙÇ|­"#mX$ġ&š@X°³i×!p8ġ9öïM”ĵoµ†ÜuFíìjş BdžUÉ•"FÒ( ÇÜt˙ëÔ°dPrĜR§$ÇéQIáûñB6˜ !A\áż ÷ĤIxöÓ²3Œ½Töĉ›²0ÔdWTŽ)BµFŭǽo$:œEĦr˜x`ĈšZÜkıÒȗí#lV|0 ĈáE홣K´ IŒ˜ü3NĊ½Œ[¸Iž9](·/Dġ'ĤjùŭŬÙU’EnN06ö×ĦÍ;X‚ĴӇËc#µ›œ~ï ßo˙^“1™âÁ\<ŒŽ*·šX’@÷4$r4REci?^i!&rÙäœà~4\HÔô¸cÓċK(mĦ8ċŠĈ¸IA„…$ÁëċžžĵöĤö+3ĥîÇ­=f|Ç>•:I”1w$pI*'*îL Ö RÜLxÓÌÀÇ÷Gé1‘Ì•HcĈp Xm>á-dı R(ˆ À‚2yüúĠ en]Ġ̆ râ?3nâN3Œz:Ñ}"ñ%_š(à12:†U'‚Gż>[ŽĈŒŜ—k7ÛĠĠzä^½3ëU,4ÔµwŠÑ„€2 f?*ŸqĝSQ²¸eIX -쭓o"H]yüÏ#nàğzàÍC푟˜^ԊFsÏcHDħ<;*àqğ*>v,{£Ú€mk…#~lqŜuä¤ħ è[ĉ9î3Udk)géĊJ$R>èÜ~£5œaAEQÏ< ,3=ğf08Î?uĵbw;óXŒmFj"Ċ½²G(YA„´–çúĵúVĵİ3yw{ysÁF{gôŞHµħ ­ÌžmĴ0oùf›ölöĤÏveğ½›îÉ3ùpi”ö,Ü4şŽ›$"#‰3żxċOQƒĈOCíÍbÜ\O5ıİ7äG*ŭ:14Ù İıĵĵlêN1ŠiWoĵüúP!Ċ mıÜqÚĦX›q‚sŠ. 1B½ûçùÛ!UON›†E =*ëKÜZGşœƒüÛEq³[ÙÏŞy(Y9vwf$wÇšÓA=Y+[èÑĥë{§,:™?Mµ hÊ!Êóç(£·ëFb=ė ŒğŬ2IŒ€ċڛ)žHÖʈ *œl 5°ŠĦ'ìI•w|ıŬ…çĥi$µ(HgÉÊÉÀüj:)6/q’ġ£§Z@e+i™ÜĊħŭ9İ-A3°Ó,-ž8£ĵ•ÛnHgġcŽN ĵšž’C"ÂwE’ 9Ŭ‘ƒŸZ§t;œĦÑĵˆ$´ qq9”™AP$×İ#ŻĦ59ÒY?×Z]( ħċI¤"•ġĴÀ‹SöÚ²K'?•`ŬÍfhDl ¤‘ĝÖ³µ€!ƒ€yÉİ@İhe>bòâi0dsĊ4´UNTäŸZcaŽĉĈ}:QpÑ£qŽzġĤ–fF?*C1r=ñN,ò;ĈŒGÈ=§Ž#÷ġÈëNàMn蒏Ŭ‡ÁÏÍÈ?Q]´–â ŝlk½w/–ğAÈô5q,ݧZÀ"-çpï úg½E¨çÎENJ í‘B•÷ÈŞè Ğ›ğyĥ^5ÇBĜ5Ÿ|ĉOß! †ġ`™¨Ô¨Q”…•#ŒvdQ˙-²~ĵÒέ¸’]Uħ–ÇSUŠ0'ĉéïLÄ<çô§IÀV'Ŝ“êş„xv‡ Ĉ ɨ?S²ğµmĦÊFrCĞOĵy­z™q 3’]¤žG+œ÷÷¨TĴ’g#•œ˙žMCZˆ’$gˆB³>ÂÜFĵO|÷…m¨XžvÏԁĜÓ{ÑyöU`$D/q¸šŒfOş½{NĴĦm-~Ŭw\—8$/ ]Ž—áh˘œ;ÌìħŭĠ!Hçĥ9ĞŠÒâıÑ[ZEn€*&îì*À×µŭKJıGû%§™³{6ZO 3Ov3FÂÂŭg\ߗRw4K]ÇÁö݁éIÄĝò–áËylà.dAû¸óF<$àĤ€9ImïôÄ)”`F=)ù\vöĊH ¸•äöĤÄa‰™ ŬŜ=8ĤħĜ̝qéEÀi—î?Ê$`u­m.ĥ.íÒJ{Ç a—ñ@ĜŞK™¤´!‘RFc9ħ“ÂĥŽŒnr 1b"%WŸÖž„²žİ éħ26û˘ĞĈÈÈ'ó<×7~޲‘Î"ŝ2áħŭiJ, h“`c(Ž˜Î*{;™mÁò[ĉôĜwĉ JьŬµf‰ÙcҚY›’ȸ'ëšé4û­Bä“=˘[ 8|’+M:‚/!sÀL$‘"BîÁUA$žÂ £_[Mv,´óç\Jż#¸8Ï­cŬKY:rß8ò;"Ór•ZZ ċ‹ğûÈĴmâ†v·ó–bï\qÇĠħÛ§ÔVĥ½{ëĈ&RTĈœ7=ˆŝ‡£ ÜÊĠ#^:ŞFÈ]½ŭ*Œ„•\öâ³{&áötRFwçn9ÇiĴ§½Kb9cééV­Ô0Ép‹çÛ¸a·B)$mĵ1ÇlÒ}€IU8ó޵Z\œóH´;“hÇ'=ŭĞGGž(yí‹ħ]ÑàäqĈ9?ZßP-ÜId+4Җ8mĝËJİ.’ ¨˜çf…él|…ßu<ÂQµpû}*…áżšAuö#üh{¨—şfäŝ™=?‘üŞ3 iHça?gb[$%1•Sq‘D2ŞJ PàñŒb„·ĥóĉ;î˙hŠƒxŬëCÜBħcÛŜ‘ĜœíĈ8<Òĵ;Şjw׋èŠ*Ÿ—÷eWŻcŜ·†•‰bÒ4jä2GJ›Ĝ ×ĥ wRXö[ÊÏáA÷Éço?ÂĴû‰üM Ü*Ĝèy“’ES†,<µSĝġ­ 7MÔ´™D˘Ú ¤$†Qı÷éM$˜÷:ä’6Œ:²•=Áâ³ĵAŞÁĜ,Ò$ş…XÈıÏċSf=ŽCUñdÓ8X§’2…Ĉ"aµ'=1Ï×Ö²á#Ôĵ£ŬÊѰ!•ˆ;²9ëO›°2ŬÔvAsĤÇċjüP3ĉ £$İ?ox{W‚†ĉâgóÊïU-$Äò[ʗ~'½k—Rħ͕ġì…@ĈpéĝŠÊµûLGpÊȊ˙4­+ÉÁ÷ŜôċvÀż>£ŭĦh¨JHRÌġ'ïVLĉG fÉÇ ŽœŝµwaÌçƒĝjKĦĥR?ŻJ•¸ĈÁ=Şa$jà“‘Č ŒŽ1P^9 ÁƒÑşÒêx˜ÏĤ–à(p¤tÀ]£ìeÎÒÙè1֖7ĜêÄò P&ĵG·!I,zŽx˘K¤k5LB€\½i­M-ŞY²LFĠšgĈßAŸ­gŜ4q‹;Ĝ­è=iï F`Ÿ…É%rsÎëÒ¤ĥ‚Qtħ´lĥ ÜRiĜÌê²0rr?j޳ğħN¸9úwİݏpAâ9‚˜€ÊNsÔ÷ô§E™$Á'•€ġ="öî뛘£Hˆ'FϙÇ'iŠé–ä š\ÔXbƒKR##ĦWĈ73D–Û†6ÉlÜĴÉ×=89Ĥ·ĊÜ_Ŭ °El’TÉÈ$tÏŝ½$=Í£Z;üğüĊg§ïĝ~T]Ü ÓZË (+Ä„eèĝ8Èö¤ƒ)!܊vŭċqR÷6gı´Óíc¸šŭŠ–m…D €3ò?*Ò<@Öú"Ûİ[1vE8iç8'¸'?…UÒ`Uñˆßemm´ħ,L²n‘†ĉĈ@éĝĠ —3èqÇ2FÌÄßu· Ÿ\ƒEî].Â[k¨gškXW“ÎĠÇáP_ÌĞ}.Étó˜î6ƒœĝgŒT쀈܁)§ A;ï$7_QÒ˘ÀEÓ,F2dbHìqM¸ ÂöÍG“êh@OhûnUĜoUċ†3‘ŽJÛ/e/‡ċö-á‘Ñ·.ËqBükHùÏr(šëRĊ ³ ¨¤Ïô  3ÙYˆ—*G0Ĉ1ìy4ŭ=î#iMİÚâ<îŜ¨Œŭ?Z~‚4­Ĥżı[‹ˆċ’ùh„SŽO ŽÒŝK‘8YÈĈ|ÒĴ<À9útĤîö*ŬĊ)vfLç8¨˘€•'Ŭ‡­@„•Nò7êj0ıRqÀàzs BàE>-Ğ#)^àz‡í’&Û ː1ÊçŻçZ‚şıUíí³ÛŬڛÒó¨'à<~ƒê RġċŬĠÇÙäĠbıò†[Ë\ħö'Ĥ=êFtĠ—ĴŬ:3q, @àFèT“ġïR·Ôd6¤°]"ĉàËv„ÄcrŸ˜~@ŝ•‹.ï-aG·‚B3…’ 3İÁêŠÂĉŭ"ÎŒ0YX³4™ŝƒ˙ŻWIê ħŞAÍl—ÙEjë]ú‚¨j—ìħËĤéŜBAn73B72ï^žÔ04üläÈÒi"'‰dUGĥyÏÒ³‡.µ+vÔ ‘v\´’€ù°˙ġż:[ĈÀb:è´£ÊqċX?ÊÀ§ WxW ëƒúÖv`h—u€Ô5û!+³ ġÇO\Ġsżìßih“Êß³p=O'…r¤²,‡ċLZTħÀô&š$FB’"ĥÌ3ÁÇ˙œfyĦH^LEĉ@{×óÀĤcUhäÉ$ġçž kĤÇĈAúP1èö)! nXöġĦĤµ‹Y Ğm“c“·nAcéqІ}­nQİ€]š#‘·q^äqġİíô•Šk5aĥıÎÖQÏb3Ÿ¨Ĥ¨“\Yë:ž›`“Èm;نÖnzÄcZèunĈ)í­Íח‰|)(ŒĦ8ĜĠéò˙Œ‚–ĥˆĦg92)ì@%ö:{}ô›•ô@-ۆtĈġÈ:˙Z‚-,ÚëO}a%]Ż8úz‡ıHĠÍW½H¤ˆ,­‚<ÀàûÔ-ĈPÔ5=*7ğ…$,6²rÇqù~5%Ó&§cYĉĥˆKµˆàç 5[ 9m^óFVĵžîVĵ¸VÛ*„"`w=ùĴŬ_ÄjZE½Şa³=ÀUÚ§Ÿ”}1RßD!sƒÍ[ÓîîÖ9m-cIDàîV@ǧ$gĤBь­´“‡(#löĞĤŬŬĜ2Ü[Z$èñ´ÁT`>GcÀüŭꕵ Ì7Zp"ÒbĉC1I䌎ĜŝUN÷WmF#i QĴ^f! m* 7$ŭüİó‰5Rİċ҈€(YŽÖ`zì:Ó-uĞí68ŝÍ;ÀĈġ§ {dš9†AİuNÍûĈ”´Ž2r#ŸReÚÈ;†x=*¸µĈèF@Lcç¨É<ŝtÉ$frvġĈxÍ £e88?(nlfÍrŞÖúdĉZÒ K‰¤F‹{*ĥĠPN~ cñ˘M.~d·Ääu>£ ĜµU´+=6òúGKkwÇ÷>ïÖĦttrŽ0ËÁ”š°&áċÑ_j²Ċ˜b ?3Ž·ż#CĦéë#iùTE $@=²sÏ~ġ¤ce¨\ɟM½K_³ËeFmèÊ fêG<•A´Á†oï%‘$Àµe`N1ÏNéè)ğˆÚÑ4—@W(†êìf&‘6²œt· ×KŸ–Ğ:,²–\íëÓ4-€sŜ ’ÚÜ0m1‚í`Ż,@İáÇ·Zä#‡í7 <ŞBwĴg¸ä(îHŝbĤV;›i5rn#ÙhÒ1)8€=ĈqU.”G+€›Wq Îp;sߊ‡` Ï4ìüĵR`vž3Ŭj{çԋHħ–òóĵà‚+cV³ş\çƒìŠ7¤’q°÷VġÛĤ¤ĜÑċóôÈÛí1\Áx—jŭ1ZR“Ôv VkWċ Ü)‰é\…Ŝ.obşk‰6Baĉù¸6q“ĈHçJK`(]èîRiíàˆ­ ó™w¨1lß·oL³ĥž3qy~ì²ĥ÷EFêŜy8„µżáE…/m§Eĥ ĉ"Ìçêkš1,qI •_ µU”Àƒó~~u6°…:9$†MÈ̎8È8" cÖ]¨áAÀŬÛż×šè#֍ĥ 跁.–äħJ‰İŬŸÓôĞ„’d³'T”5é’]‡%6UI8úÔÚE‚Ê<émċv–ہx É>ÄÑnih>İj0òĴ,ⷀ‚Œr{óLÒ-ÍíÄ0­¸ı`Xù~fÎî}2JOpèGŒ²Èíx]Ĝ~@É'ÛŞ,İê Mİ4ÛË{8ï,BÄmlƒ×‘ĊW‘‘ˆĜ¤yïŽhµ€imŬ}1Vá’Üi“G*Hf-˜˜c`éœ÷Î(@W””‘”88ùr§†wFğŽÑÚâHe Ĥ2ä<òwíMhġĠö¤_\^Ĝ7áÔİl°ùı>ÇĦüit+]CÄ6ħÉr҇Č3ó0ä§^˜i½XÍ mY‡ÄQÏ$_ğIÁi ›sÏôÇjiu Ġ1jRDĞ8?şóQcŒtîĜëÁôĞĠ{’ZxušÖdi{ġEE”ÑĈ¸Â?½µqĝÒë‘ k´ĥ”[éĦX‹DaNËÓïJ´@ê &2{ §ÓCZ…n,H–O.ËJyfqŽġÇÍĤ-”ës§Ĵ\ĵ$²)o#'ïñÔmŝT5p9Ù é¨İÀĜtĊDÓ<ÒmšC‚ß3“ġĴÊËÒQŸ;È @ûıġİ%H’@mĎĦmĜà÷éڐµı–ŬÄÌğX1+ìF?Zïñ6š4ĞxŻ"ydSäȉíÔUĊĞYbÇĊ:W|Ö["½Ĉ7Äc¨ĞvÚì7ñ3éñIpŞÛK}8ÎyíU¸}ĞM֎i`–hŝôBMÊ:Ó#ĠPÁ5ӝHÁç$g‘Ÿ4úÏx£R°³YtĞeRp³JcŒ÷÷Í7Oš÷n™yù#˘FT :çħçġ¤µ`ȵ?jFl⺁Ŭ04i’Ü œž:çµsڋŜItd.eu,1‘Û§j™Jú!·”C:HÑĴ;£{’úF’é™­ÖŬ¸ÌjÇż5…qÜàĉµšdûĵ—(í ŝċc “‚XN@ŞŠ¸bĥr—p‘pwşxU­_NŽĈŜÚHĤ2yÊX‘¸íŒž”%£`eÓážKy–X]‘×£)äTŒßĥ:äsŬ\C$Ù0V=Á:tä`ò8ĴVAÜÑ2ħÁ*w 0çô?VġW²ÛÜ4&P€ĴAʑëî*&-/$ä¨ëì XË#°#ä?Z_=ôƒ²fh˘”_şH?7èh@ʒ6ĉÎ1ÇëM  wı·ħÂ),£ÎŝCòĞÚ`ğŽâKÍ=Á’ĠK’q¸ĈpzÓ[èž“ÜŜêMéžâ;¤1£$€H°JŒĝ7WûO—ä!\˙ĴŜ6ùĠ7̅ħÛĝwK}#J[i$óqf# ÏaíPkh’ëZ2:†ŭó°ĝ\çè+H 5žTĜ.zdġŞWš´vLí2%ËİÏ$¸êI§n¤–7EwÜ ŒİìG84ħÄħĵŒı̍“ϰÈS°çˆti.ŜYmôôßıI•ï[žp>žµ~môıdXtôȅD‘7…rI “íÈġâĦèî4aAq ÈDFÊÇÉ×§ù5,r[Ú,ċà´ ù|ĈHçĝĈ+"‡ÛéҒ‚VEF ‘¸}¸ìHëLŸM¸GmOŸ˜C”'iĈ1ÇQíTŻ{Ñx^ÛM[Ùn Ô2²°+ıLl‡è{Wi¸V‰hH…ëġxŻMRğŠĊ+ ıO·oĈ˜wp ˜ eŠçĝ‡Q\N½gĥ³¤ĴpŞ \ğ$9ä瞉ĦĞ :Xµ;+=:ŬŸù¨a^[œtúÓż·Ĵ2Ì%ĥ’½<ŝCŸ 4ÓBħbîù-”aKğ8PeˆÎ9öĴ-gBğş”H÷{É+07`žżÔûĉn´ĜRÎk”ĵÛivO~P70 Ż4Q\I}+Hd—"D*0ssŸÏc%ËĦDFKĞ”+ϖ¤ЃĜÖähÍo ›ÀñŒ6[ĈI àééU°g:S31(ÀÍmĝ[OynMÎÏ1c„WÚۀÈüġv=‘ψ5{{Éqzyáw 3ÀúĠ&½½žĉ[#=ÇĜ@Áè(ĉ`[[·]pO—$²+ŞmÚĵc%}5'‡,§’ĝO=Ĵ VĜq“ßžżŭz­ÚO^íšiĤî2âภȧcp~QWèÑĥYO£ TÍY‚RAÏ2Ç7™8¨À Is[Nc~˘€e‘ƒìw}ìžżçÊWۑ°`uġïúт$c==èh. +(ù²é´qƒ‘×Ïùw7'“Ôš°ÖÑ*#µÊÌ@îqíRA#i“öñI) ëĉ|ÁAè;ôĤ"çˆuġ „‰+;> )pĉs˙ÖĤhÚ-΢ ÊV8#ÉigêŸ½!lˆ5;‹wXm­c_*Üĉ )8É?J£S-Ê%ĥ‘£‘N÷TV vÏQï]FƒêWş´q$ñ äÈv{ízqvd³£Ġ´[Ĝd’[hÌĦIĵıÎxWÄRAvlġ ™‘‘³œì#Œ}ô­^ŒKTw#aÎì:ĥQ*Ş›C•=[ĉ<ÈÀÓ`ÚŻzñCË \‘œúĈ„ Ĵ^0ĠášĜĞCò<`Œ‚0AÉÏ÷ş{V÷nXÛݍs÷S<öÉÏ~OçYɎĿÚڍİîğvhÎı)=ùŝuè:mÚêzzĝkĈw‚qŸ\ӌ›zƒ<ŝŝs šîeğ.OÈĜlߜœĠtĊ’;*3ì,N½¨–;k Û[îÙ}7™Œf"ÎŻ5§om¤‰î™O,qêkuÊŝ›ç?lÓÊÜÄîúmôϧ­sú§•ì’\†yZ" 1>b9úRŭÙ\ K™>Ġ{,Šïd,ëÉĞŝžHġxÒ0XÊvœ=GáŸÖ³‹÷Šèik7q\kè>×)‚ù”‚2ġ=êŭŻöĥ¤„IpİeËÂ~r8Éŭ+Kğğ -jS[ĜiĈÊ-Jċ§1 FÙ,OLŜıí^{‹ˆ]ğ!ÀhÒa—=zĦ{óJlHËt/ċɕPÜ0[EX–¤œc·ZJ·%½²4#íÑŝñT?ğü 4€}ġş âÎüµH˙?Êİb %W ôĦè!(†.2 ÏNԙÉÉ<ŭ'Ô'(ƒô' íĵ6´iìĦ$Ë sç<óÔ֐]Ig/'‡o£žâÚ8’g Ç÷½‡QXŒĴŒUpAíS%f4h\éİme­>%xÖ@…x`{êÍtž°…­Ù-ŞùÊÄE/¨ïÇŻZ¨ÇŜz[aÔĞA ÷Ċš—w6‚DŜĝۜŞ÷Ó˙­ZÉ]ÍmĈ <­äLŒW”r½:˙ŸZ·İ4/­éħĵ{<LjÉë•8ÎĤ.ċ•ôĉÎX‡Ŝe;OĦíT#Îġk…”AµD’"r’yìôäúÖbL"Ŭċ’8<˙{?á×ëXKrˆá%d9ĉ­ĈĥĈ1‰|ÙÏ Œg×;‰=ŞO´ËöO³o>NŭûÚĈ3ùTè2êQiNEm+"rσı‰<öĉ™a­ °ËnÁ2H.~v'ĜtîkŞ÷$MSY‚]:hĉŽX'+·F{‚;Wy!gÚe2`ää`ĉ²¨ôh_²Ħĥ‚a/úÇ(û¸Çô5{L·³†sŬbeÎĊhŝCž‡9ŝu1Zƒd׺…œħĤüKrä` >żJƒNĠîìïË[ŞİS¸¤à#Ó4ġ‹Ô.£Ğ]NÒÈ/•Oú¨×nGNëÚ²BÈèÓIó ž½¸÷¤ŬĈAE@ɖx•ĵäV,C+gŒƒüê\|™÷⓭*ħS•84ŒĊ˜ħ9$äšÇZ8 CˆZĥFrAŝżçқ@85fÖŝĉÖäO çŻÖ„ÚÓɨI{ö‰‘~ÒTÉ#IħÎ:mĴBÙ­™Y$E$”ó>ñ^ĈZĈâ[U°ĵ"Ĵİç8 bÇ,§q6/ZÇTµ†÷avۜúžµŞŒW]Kچ­Şiy’[ÚHr\rs޽jŸŞĴÚµĤŞ"V?2‡ln¸Ï6ġ³FSéPiZŻ—u }=Îc“wĦ#Ħ­ eĴôŭu¨RguòÖ7܈AÈo?BVş)š3ĝ²ÚÊg·ı†e–3´œ 7Gµ\"ÒÌHĉíx+pÜûSĉ mĉÄז‰¸ó‘ġĊs*´µşÓâż´ĥ`üğzğqÁÍ'°ġóÎ.Ïڐ.X˘3œíÓ…Cl-,agä$ {çôĴŜúŒŻŽ´ğˆB½Ş@ênĵcp×$Ç k€qĉ›¤jÉÛÉ&ĉş¸w ½Olv"‡ˆoZ{–F¸óXô@ôù‡&²Gï$ċıcÉjÎZÈkbú:@(÷2÷mĊT`:ÒYMlò¨’Íò6ŝôŞœ†ž‚Ô³ru oל³2ò0GÉìoŝµfŜÎ×,ìŞ­í}éÉ ĴE$†G°`vœ²ġáyĈk1ïN@7€ÙÁô4bêĊĦıXÖW*¤ìè2ëĝġޤm$ÔÚ³ĉg0xĜwNsN)ċ,O•m%sïŜÀ‰”İÁôÍ%!‹I@ Eí§anÙĊ4lUĤҐ€T²ħ?Ä8ÇÓ5.5ğÏ,:Œĝ·xˆù†î0zŒdž*ÓĜ³Â÷VÍEm›Ŝ5ËáH“Ÿóôޞ$ÖÍìÂÈ@Éçž=şŭkkû¤[R’ŝè Böì^!fÚîHû¤öRjÏ-£Ĝ7¤ˆĠ7dŒŽs€095k”s×(žh˘s,Yù‚3ƒ×òŝu>Ÿ¨ÇPÁ4A˘+3ž¤Û›ÑŒÓÖtËíOTšK+gxU°>|Ž@lóÓ9Í[´kŬ[™n%–ŜsĠX+ĠVĉb:-3O–Ċ•‹İ,ğdœ·˙^°|eĈ„Bv#·˜ÈżĈqË}G§VĠ•Û¸,r<÷ÀÏëšn\@:íÜp}3ŭ+ê0‘”„uûĜ qÇzŒš@\ĠmšÎñĦee# >”Á$r(.ÁJ' ï7§ġĉĞf b?-ö,¤#ޏíQô¤2Ġĵ}ŠXäÀs’§ž¸àqŭj(íŬü³Â£’ƒ*nÍ+³ ɵĥıšîġï“ŝ}j‰$’O&‰= EH†9bpOAڀ7š[[í5cR£_)Yӕî2AîF3Ú°˜s×5sî‰CièċUÀU;†2FqÈ<~U §”Q}À³òú_óé@Ñ@ E,l²@#Áp7„• £ ,ab²o £ ûIÚĊI\cÜ ˆ,kfrù²? ˙ ŽŸ!UFĤÇ¤Ù·€IpÇĉ‘=GÄÓ´½JmCZ-,‘G$h%8ë~}j”´HV7µĤÑZ%ŒJ­ĉ2"½şqéĈk•.n%—í~kMċı*9#ò§5`E‰e{“ 3´Lħ.ÄĈ3è3Ŝ¨Ë²ğ^9ĥA*~ Ô5Ĉ]·×Ż-ÒŬ`›Ê1€Ĵ@ûÀŒúàÙÓ|A-Ôa&żû;³ĉIaÙPtäúĠ)½ŜÖµ$‘"Ž8£x'cÏOAR[éW2Zĵ•ş ’=sÚµ·5’Ĉc+E!WRĴ§•aƒS[EŬʣ̰ïêÌ>QY-Üh·6Ì\m‘gpè}‡­SHóÏÚĈ°Áynŭ)¸Ûq'q— š|Œù``9?ZH£à3mSüDtÔd’!·`Žw#rvàäzƒUècc#=*[¨D•S”ê­ê(è4RHùAҒ€ (Wç?… w18Ç·%RŠ‘§sn!ÏÈqÛ4Ĝöofv睽hȞ“0™ĵќ6ì>ƒÛ5T’O&›uuI#‡Ë†˘ùv†UùîÀúšŽÚŝê>Tòï½µˆÍ>klâŝċP³Ë$Œw1<Ÿ­4Ĥä2Şâ5À9<“CwweÌT;X*ùžžçµkĝlÁ& -eÎU‹,nTƒŽG¸#üóMZàö5ġ‹8mOÚäónÒɎż‡CÍQ·kq.Û[ş˙f˜dpYOñp:ÂQI‰ĝ£ŭ.ÊÖKx\2|ɰdmÇ^;+J•íŝĠۀš2ž^pwqŽ?™;4À͑gÉÇ#ÓKÀ÷ĴÊ?˙Ù˙Ĝ˙Ä ˙ĵw!1AQaq"2B‘ĦħÁ #3RbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚâäċĉçèéêòóôġö÷ĝùú˙Ä ˙ĵ}!1AQa"q2‘Ħ#BħÁRÑ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚáâäċĉçèéêñòóôġö÷ĝùú˙ÛC11gE:Egggggggggggggggggggggggggggggggggggggggggggggggggg˙ÛC  *3$&*<5?>;5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?Ż#ĵ:hĥÁŒXX ĉÓíKçŻÓxĉ™%ĵrÉċĴ+1pd<3{{Óğ$ÌòÛip§ y8éW~×8‰THÀÚFìJĦ•TĞI3Œó|Tr#&‚ ü)Üddüĵ÷ ç<úzÓQ‹nËPyúŝŸ­KivöıÚò*NĈÚÙúÒĈ#ĉ7,Ħċ‘ŜŬWœŸÎ´×Yğ‚! LŽħàoۜOCġ ¤fI4’NÒyıŽK‚MZ{ˆßH޲1`I$ħŝƒŸÒ“&ċ›Y&–ŬmPC"0ĉ6@7 öo\ĠMaW_gELBĦ2Ğ·=ò}ùĦ62Ğ4f=‘9Éê}żÏ­!Ĝ<Ĥflœäc·OV&4x+Ϩ¤ {˙:aÔ· ‘jƒó/ßÎG'×Ò˘,ˆÎŞ7Ż pF} KZƒ%·¸ŠŬC0ÏĜz1­hNİ|ğ˘D³ˆ˙ûçéŜˆé{‚ı[RÓcÓü™šS4›²ÂSŜœzuĤŜÎmîĦ•TylDĈûg#tÎċOqġµ:.Ê0‹¸…ÇSž•i~Ên&´o9ˆmÑ*· `7ûŝ´'­ƒrĊ•ÌÓíÛ<Àò².òàçŜŻĴ“ pßusŒ=)A$´Ší°eB‘߃Ï­5eùĜm,£$nóŞÔa"ÀŠXÄ b9j·ŸRÊĴğ—ÙÇİëÍ-\ŜäĉâŜ(72gu8÷úS·el–dr8B¤•Ì×2!Ç+„ĥanĴ’Vr \ö§ôĴ}WSiċŽ8h1²6A·__Ç֚lвôçrzŭk:êèyF%\ñÙİ‘›§¨é¤гÌÈŝóf˜‰-îL1˸.:œŸjmĴ (}îħ°.î‡Ú†0ާpÏ$qR]N’wòÇáE€€˜—v2ùñĝ„8àšĦˆáÏOZqeTÚFî´ Ċ›E‘‹F²Á˙Y`1ŽyŝtéċŜÀ2$xċ\`Tµv>˘Mar'*ħwͅ Â˘–ÒF•Ĝ \‘ôĦ ̞Ü\4LL äíTÈ|÷úŒÖиŽw2Ñï™÷l}h[utwÄ“E"ĨY€ ³: tŞ‹já_€pB· G=PùaP™#nápqÉŝtĜD›ŝQóRL.HZY£p‡™0É=ñéšIs!vQäǒQIÉëÓ?OċFÀhèPÂò0šwA1à~ğ-ϗ HÄg€2z’p?SQ-YHÂż˜Gs# YßÊÜ íYî“Jd §#.Ŭ€÷¤™:+-eŽ=ÀÏÊ>R?ŭUŞŠğ‡¤ŸB“Ûp@š5|t,9üêĴ–òZ`½( À[½~™ê?ZĴ€qy'› ÌH†xÎĝÛ×Ü~"­‹˜5t•şZkj+ĜimHaÈĈG’*¤܀b¸…žE–ô4sk ËwW(BİĜX¸W @)‘œšËÖŻ,`ÂÀ#šÌ ŝ&­;“0ŜWşu"*ŒĞöĥ‘ÍlżfŒ4ŬË ?ìŽôüŠ4\g>•—xÌ(ˆOzÍè"KTT·y% òİ<ŝU –ÎYvDž<_İŞCCîmLd"fÀÉ|ĉ£&6T²žIûעâ#PŻW” G?J-˘iËF#ğLcĤaU#/Î v'Pè e™Qì:ÓLdn­F,2F@ôĤ*™$XÇV8¤„O£yìŒ?1­ZµÎş2L1~gè&†µFü—–vċi)9]İÇçŭ* e‹Íĥ1DMÉË<1àŽIŝŞÑÈĠµkä•lígU$œ’<Üa”ž? ĈKY €]8I <òéR–ĤFܗ2Ĉ“"´1…$á\zûŠ÷1\œ³Ĵd7ÊŻùĉĤò½Ù(İqċË"F.$‘w|îĜôÂ&ùàGXÓċ’W9ġâ¨hƒÍ}ûĜî$`’*FˆĞĜÛëœíĤĜv–òĜ4›ä8çŽÇ5fòċ„UÒ\?‰qÏċ‘PÊÙ V ­á·ò£y78Xĵs˙Ÿz[ħ.!Äc;<ÉéïÍNéX€‚ċm"h˜³ùmµvŸá<ƒĝg…O˘ĤB|Ò°¨î>ñô¨“Ô/bDÔVGD…1’@áOù5ċÉ{p9!‡<Œüp*Òĉ‹îAhĈèˆŝv„chۏİï˙ÖĤÍĤ]C'›kÊNÒĞò¸÷ġÍ h"ĊâRHV)ñı”taê+2÷Íû[¤<„£ċ+ßvĤ–£3ŻïgTi<̓hô˙רb_*Ty?pĴ2ëZl€µ-ÒÜ4,(Ħ˜ħĵ€p>œÓc·k„wÌJĦiħùǧµ+Ĵï…$•zĠfHä˜ËÈŬñôZâħ9…Ħ;Ë#ĥ1ÎF ¨ĈġŜJñĦŒŽú_ÜìQıOVŠÍLéBùY·Ó4Ħ[rŒX~tÀ òàÙ¸žù#§ÒŞ‹}í÷ò>”k&Ò}:{S‘Ò[¨ÌQ€ êG?Қ_žç6Ċ´ŜˆF€6\‚ d)ŝ*ÂĦ'³ÈÇQKp%Žy…ı·rıáşsÚ¤WiĦ#ËġëŸÈ~Tt*÷E„ƒížGòÉ#şÇ֙'œ‡ÁŬ‚A ô˙"£—Be™aaµÖf’?™1ŝŻ˙‰İ<ğn$#)ž=ĝú~”r¤‚ÂĊpcd^§Şü½şĉĈĈ+ùl¤Ş)d~”Żxˆ½lmoFÉ\,$ˆÛêëĈ+RMËo’ÌÀr[½ZÔ´`j“I‰pUò>„c½dË4şÒĴj°ÁçœuöĤ—V½6Ŝ[k‡ l—o'#ô˘ä,§}œİ¸;—§o֝ïŞq sÍĞŞŸ{1É÷Ğş]½´m/ÚBĴ{ ˙ZK°"&ËħĞğğ0Îßŝ½>#*çמM0pÙV.|¤ÇPj´·p˜Ôùdİç€yüèĵŠÒ…2ƒDáry_Ż­0Yıǒü´Ĉ=†ULoċwŭŞëR’#wPÄÈ ĊL.zç;İRçàS·ŠîI”iž 3gŽĉ‘˙uv†%Sµ8½¨Né2¨PƒœqŠöA‘Œ=hc¸›áş´²Jq„ê {Ô2’Éĉ†Ë·ĉ£[’@xâˆË,”*s‚28ĉ´C%·1Û6Fî7ŽvŝécQ¸Bŝb݁Žĝ¤Á’ÊħB‘É˜vǧôŞÈp­œç¨¤µħħŜ•=CíVd·yV7 ­ĉ’Ŝ?ÏëHĈÙ •PŬqGÒЉXÜ3 ğXàŒqÏZiÜh³ ħ†ŽOn>€S[ËŬ½AW'$ç-ŸoĈ˘Â"”,3ĈA.q†ġ~ ‚Ĵò|ÂŞŞ[vY3ÜÇéCÔ F–n$Cĉ˘ĦRWR޸$–ÇÓ İ,üż2O.ÎK´ûĦaŒñŸ—°˙ ğ% ìjĥ‹ĜÄolçŜݐÓ_!3‚òİ˞FHàNJHño"·—$ÙÇ_}jÂK| É9=X˙úŞmky +£ĈjBÇ>Bi˘bÈJÄÌĈXàfİ€ J1ħ ‘ÉfÎ>…L˜ÑS"2Uäŝ&Š# & Òg‰‰"Ħg1GŒç<(ÜqŸóژ Ż‘!ïòŒSg€. p ¤" …ä8Á5chŠBíÏ·ÛëJâ–I7€Ħ@1SE“s+;m* |£ŠjD4äĥXŸş*9·qtQÇĤqO¨25px* ƒ“ŝJ—”şO ¤eIïšrĈÇRr20:ÓËBÏiRĴù#`LŭjcŠHĜn?.N ·4&1Û|Ò€½Ï86§k;È ǂßJ•Ĝ‘au;SDƒ9ú~tyŻ’ÊÛY³Û§9ü)Û¨ĈyĴÄn=H¤ÜŒ àžyŝT$’ĊËŞç‘C‘—$zÈİşB½†>r$ÇÍX†öhpRMݜŒAê;û)Ĝf̖ĥ<纑 ħ–0H¨=ñœŭAól³êĞ4ÇaÀ 6‰•‡İĤ*œot;t45ħ˘ıŽïMò—r4{~j䵛ËŭVHċ%aÀÂñÔĈŻ™µ`6×NK0žDĦŒI·;xry9üh2y`4ƒhÎ>§zÖ;êK,2^Âb™Ú4'îŻSġ¨nĦK{iD`£~0:Ž{ŭ)Ħ˘³Î’äC7”üyôü{}=*ĵñŭ™‹|Œ)ŜnAíéçIĤÁ˘a–_Ŝ¸˙oĈ•xœ`=qTÊÄqëÓ4yŠx(ñݧ' âĦrï)9'Ü˙ž) , rĴ½wu˙9¤mƒ,Ÿĝ1BFŞŬŠ’j¤–ĝw ĝìîŬp)y€ÈäXˆs’Aĉˆ8}ĵ'<öĤ²nq"dpàu¨$Ú 1Làœ`BC,e‚:ĥN;r}0*G\Ğe2ġ*p(Ä `uë@fYC+m ġސ‹qIup݉Ae9ێ~˘ŞùÌó~§œ. NğXıÀN2äS§ž=ıû1ÁèIĊ+kp I|˘pr7P²),`&Tŭ{Ԃ_*BPŒŠ:‚#ˆ Ż—Ĉà1לb—äeê~”˜˜Ŭ™#œ™5fn?ˆcïr?ĊF“Mc§´Ë2ˆfêf!üÇîvöçÒ´JÏqĜbk¨žà ”r>LöгŬ†Ġha··û:~ä žJ玟ʣ}ŻrÀ™à,ħ´€ħ!ÜŸçJÑ&âèÀıHN*›ğXE+›Ùí‰_1#ĉÚ¸+U>Ù,ċcs¸›ÀĦ&í×6ûĵ¸œ#s¸áñôüŞœŒwdç'¨=)Ż1šœç€¤}3HŬğE0$.j íğ÷€&v)òĥÒxôDeJ1#½HĈ6<óŝyİ” …oĊqE”nšp,Ìî:bĞD`î'''ƒI-GÎİî*[tŬ1“ÀÍWB‘rÒá"}ˎ0 ’ît¨QÁïèj5’@Á`oSğw°çùĠ;¨ö³1pXž@<Ó[…aXX+9.3½êı½ê‘HFĝË9ÁĞ1$—0‘!gt‚xċúSVĞ;+ù@1Ó4ñrâ<—È<`óSd$<›ŸƒÉGŒġÁ)€é" ‰6íCïžj4ċĥŒä  sŒS™Lgi#iĜ, ÎpJŽĝéN>k.àŒW8Èè²<rZnŭÓ.áÈ#úûTšn“>£!-–3÷[ ä~œÑk™4ûËk[ƒċÊĥáĥɑÁÛÜdtĉ¨ZĈÁ2ìr”=ikmEİŞX€b”ÇŻÖ˜ÒyLŞ@#ŽAÇ#üú£mĈ•‡;BêPĉ#ĝı¨e„E 6àQF<‘ÏOi|[2wĜĴòĈ÷¤ä8#˙­K*ĖZ!ó‰ġmn\}>´×W$9ï“ĊPÁ[jœçNižb²àG&“#uf,#b:(Ï4ï7‚ĦTòqĊÙċòĥ¸\–íÏàÍ,y g˙×Ĥ>ƒ.Œ~_.]€ù~líüşUpеCI·CKqî :ÔŞÌžXyÏO˙U1Ħò<ÒOä6[aázt˙ëTéuϝYğŝó eËLcfC…PÌsïQJÊYP()LÌ[,zñLxóĵdúSó<½ĵĦĉĴÁäÛ^¸uü}İġ7‰d‘€jO½3`Úю\îç­!Œ*ÛıäQş’d– ‘âP#ĈáĜu#¸÷¨Ù&XÈ8ÈÍÑhâ6yĊŬϵ%ı &ċU{Œ½ít$Œċ\p20}MZħW›OkhŠċfŜ[#=;£§ó¤µ4ş}ĊɊĉv…ÚŜc– nÎkBKX$·^à6|…+ì˙ZİIÌŬU°´ċe+-!9'ĥ3è […‘ajL‘9ċħÓÛ§¸ĞNÂeK—…BÄħĈŒ™Ŝè3ĝ (Ċ‰ì8¨b*ƒ,Rʧ×ùŝ•$âIcVÈmۏÏó¨^D"4‘Œ„á†eäĜ˘q2ÈÊÎq÷:Œ˘Ğeĥƒ÷FA$DgîŭqéĝÔ,ûàŸB1E€aĈî~”Ġ„7,Àz _0Á²ƒŽ*N¨nqZ \Iw¸)Rb“¤žàô’€áb²LËr…vñş<x#óéVŜ(mmÚá¸RB3nßéMFÎċòÛRĦ4ßÚeqı (ÇĥFOċSDĈkgb™BpnQzç=Èëĝ{Ġ§vIZìÌ·0MêtaĜûĠs¸}ò2=)0&YcUùÁùÎjĵò£Ê̟;íŭiôĵ1´ĴIçœsĈ8)Ÿ+“òħĉáiħu2Û ƒ2³›HoċŠÏn òşÉ#4äĴ"59 ŝXœáDlXž9¨°‡Ë BÇ̌+ŽU3‚ÛT…ïŒÒ³§Ż=~´°€ùc>¤P0WUʎž şë Ĉš„qˆXÎĠ p0;ġŞ]˜†^ĊjħÁĵñLàò,EN8êOZ‡ì1+*iŝžŭ˙òĜŽ{3Ñ–i09˙=ê ™#‚6ŒxÜjV˘%ŠÖUŒ‰ĦbĤq˙ר‚ù2€ÊT…ç=ŭéÜ D…—bĜzŒr…}ıÒ$f ™9ü*³ÇmXrÌŬOjh€yO€ÁIè}éwÄ=PÇİ UÎ8 fduícĜŒ{}jX xÓ•ç>ŸMVmƒkİäñŽO½Côí„x÷şço <óïI-Û[Kŝ¨F@ìúŜÔĜÄp/œ`0Dhۅ9äŸÇż­h³´v⠐Ä?ËÁè=;~”ZÄ. €ĥÀ¤ž€ŸÒ Y9_”cۊ‰$”ƒÌh=ÀëL’çÍ#Ĉ˜ċiÜV1Íĵ pßÂOzGŭá!TÎ[§}ıp=Y¸µ’ß ݸĠĈsÚ¸‰g’)_ÉşY‚ġtäl–V,ÒIĈŸîúӜK<ÈŬOûYq<‡;Oŭ2EĥB/öxĈÔ¸ĈîUÀ{c½dÌÈoqƒĈj4èd€dŝ9¤§ó£ ÂóžA#ž‹žÂ„ÇivÀÏÓ„!_(òçÎİ42$“n29>Ġ0—;}Àĉˆ]Ç ÏlÓvà|ȧÜièŬ£È,ĴzìĊ>W"à0N7uü)Ü #Q—äd*6üĜîĈşI˘âˆHÑ0@9”¸ĈZ­hZĜ§gt–k*ŬÛâw;‹’?Ó×ñ¨'ÔŜċ óñ}{SZÇ\Ü\ßYKŞ4OĈBsŝ â³MÌÒ!’3ĉ#m™ŝ÷óÍ Ì¨HSğ8ôU“nÒ{•"ù”ÎâŽ~µ–yی@Îh¸ ˜ÎYˆĈ ÎÚL‚Ş Äq’8Ħ°;Ğż Z[Âò“,­ŒNöÀ5ʲÀderħ€~XËŸËĝĠô ħˆÈxĠĥžĈ Mmœ6Ë@z³˙,ÔĦùÀ)c9Ü$á×½2e3ÄGšDK–ÜÑrû½z*ş ­md×m2˘ ”’yTF ŒT0#8ܽŭĊCQUyZz*ÉİHašFkheŒ‚ÊÏÛ?­8î_ĤX'Ĝb‹`Q‚C*à t=99ü)ÉáиŽaĉ—Œ“–|î'İ9ëVŬ˜îbĜĝaÌ-g&Ħ+n‘ŒĦQÇ~äË5İ…­²L×7Sg³I€?*O@0ĵKkc¤´k’ ’ìO˙Ż˙Ż\Ċāäóa@¨„ †ĴÄ<!;W8<ĉœ­ü'n?ÙG/ÏÑ·#=;SĜ*ÎĠÇİ4öËàœ~”ÒğAÂĉ˜c,§‚qúRBi\áxPöÌêw+íÏ ¤FùÔ˙xœš.2kuYN …ıçp󭁛mC}j8S`GÔZD¤[C)’f•%`J€HŬèāŒ{T7LÂ4$‚‡ĝCîŭqĊP÷!7&ßc—¸B܀¤߁Ş£Ĵ ÜĊĉkƒLŸ¨?ÎĤ䕊”|¨àġŭİ|’¸+ Ü;ç­Kb"6ryϽBzrÙ?Z{2mÇSè(•†ʓÜRı·„ÄÂG“ĉà•'#òWVħĥÙÒi¨9Ŝ¸çӁ[n‰z­n²Çş2 İĈXw>§¸ĤCK1„mÈäqQmt=š+t1‡•'Ä*ŸQĝÓL­66ş¸-}ĝÏ=}(ôħJħݎ# •¸ ŒK{ŒÇüЉ˘”pQî6Ò³c°C3Ïfá˜1ùˆP6Ç½v~ħÓwy’Hı\– ~*â†ÎŠwŬ2˜8 çŜıŭoÄwú]'OÛkĵ§˜ç™>˜éJ×`_Óìġ¸Yî/AF%ž1RÇÁ>ßÒµ¨`y˙-%ĥ‘D…)´d)3Ô~?Òıµrmäˆ$zžĠC+– ÉäŒUݸQÜv/p+CpO›‹ óš`>0Ŭpx˘aĉ99 =àRòˆäÛiĴà™-ܓ@ \‚==ı§^ô:I†Aô4&ŒĜsô|­ßÓ֚n6ĥÇû½ˆïïYĜ l‰„d™ÎI˙?΢·!pTcÓŜb°ħĈ9ĉ2òí8İù$}*2›˜ġü)€Ĥ%N¤‚zŜ˜]P0ĈHî)\Yܐäċ‡sŜ´´İ˘’\I —ü(U:{÷ĤĵÀ·7îĉ. Xñü2ÜsÖ´ôëŬ9Nז%óBÊ>óZ#K…ĵ·%ĵ’=¤d˙А)cĜuôŝUKReŽ3ò|çÇĤ;ÓèJR“„; •èCϊ­#ƒ’ÄœMfÙr4PSpÜXŒ·˘ÓSvƒÁ8éŝq@.+Çñpj ×!˜w6!\íİ MÜÊ88# 5 {U’2o^dcÈö­P2Kˆ"ıˆÇ4jè…†EDñA"1ɍ¸UÖä3“Ġ"Ón&xáĥŭäg‘áż^+ fO0y`Ĉƒ gŬĝ˙*'bÈĠ[%‡ĤќŝujĠìaÜnai²2ż1^ŜŜġ*È X¸FĜéöëżĝ•Ï½uzL÷SĈÂò2'ĝ6¨öëÍZĠ]…Ëè‰vŞzàb‰eHay\€ˆ‰ô£rŽuġV6'ħ·†2ÚF2/PÍ÷şŸĈ³d˙\Dˆ!ÛÔ œU”SöÓÀh#Ž ‡ß† œ‚GLšĈ¸tĥ›r#lôgÉžÀ1üÈÙĜŞÁsÇÎ?‘ŞÒIĉH@V8÷¨ħ,—ċUÉúŽĠ‘dq„+“Œ/˙^‰š@ƒËĜŻùĉ˘bÁûS¤íŸÏҌì˜G@jZ¸ŽóÂúµíä’Ċ|Û܍ÈÊŬıÇQï]5ÒĠ’ ZŽĉŜ;¸—r0ÁĊH˙‡i$ó˜Ï ĉ dÓ9eYPáCօnoàğ%lÏ$’Ża¸üŞÌşn [½ìħa³eÏ'Žim°ËĥڜúrŬĊ\’§(¤Ÿ'Ó<úq]f”ĜE%ÜîeJŞdiÛĝœ#ôטÚġô­£¤3éïċĞÙnnROĵ}=+âŜxÒ먲³/ʲg$ ('>§· ô˘BFÓh×Óŝö35ĥNÉ-Ü— ޤœ×7öw’4¨ëÛ?‡áQ(Ĝdh€x Ĥş‹hóI\deA}1Pdb§"§Žr³!Ûß ïCÜ É žŝWĵÎWoŬ#Ó½. %–Ó(Ŭ“Žqôé.ĵÛv·râ›Z]XĦ ¤äwÛxàƒƒLfŒ·ˆ\Ì_(b[¸ëÀ¨Ŝê3f ÈW ŸäSCıb-Viía²Kt•Ç \äçħ*ÜÓn)&Ct`S{Qv+Ĵı`ЍÜNGĤ²ŠieÄp´Œ8T,qžĵR`Kğp`§$u^•PıîRTƒRd œzS|ÖÎK~U@)b “Ë7½:Lĵ‚ׄlµÄ—ġ^9Á+ÒóÔçĦŻ5ÑI4qdu@NcŒÓƒŠ› u-H°ĵY3Cb7m6C,ÏŜd- \uÇ^çz—û}Żl^Ĉí ŠÔ(*ħFA$€8ï×úĠs$3*[)ap²2!;s“÷sëDàpYTĞ.œŒö=şT5`,ë2]›ŭ÷rwLíÁÀö+KLĠŬĴšÖĉB!’ËóċŽÙÍ4ììÁ”Ż55Š1HĦw‚XÙ8ûÇܞ3VġğK—³´‹Ï·t‡ Ì0cž‡=Ꞩe+X5++ĊxŒ‘ğ(Cœ|T7,é<љ̸üĊ$žO^œ“ĊCĜEi”FNH¤•”…UP0>ïQ`¨ì8RséNT;ÂħĜG94“Hċd-ŠcM# ÔìÖmğË* k¸!8 r>Üö­†ħ´ıÚß,[.7ş[ċ$ àӌ>žġ¤UŬ€çùÛIŜ bžĵT‘E$ÙXħ< ràœ!Ĉvü˜ûÇü˙:šÍKη Ĉ7(brÇÀ F턚°›­HÍ-Ą— Ÿ(÷ÀŝuRÔXËĉܵFĊñÂv€ƒÔžı=ŞŬ­qêPı„´­ċ$œœ àŝQ2‡ÊüŬ{ÌʁdÇ Ċ4(ûǕ_Ô 1²Ĥâ0 >Ül}ǑíHSÑcšĜF^#p€yİÚ´ĥİ8é]RZrÚÔòk6*­–‘9ŜĞó¸#äOŻZƒ3KİûġHĠ[t;‰‘ğùôüš›[ĉ3´¨fĵ‚ âŠYUc„qô \e=U“RûJË£C;F žüÖG‹î#šöÖÜ[ŭŞhr ĥBqŽqïëMÇP9Ñïnîn^($}‚ƒŭӎ½ÑîĴlà6aaP…›%›=HÏN߅KLbk:­µô$Yùħ4Œ7Ċ´l t>ıàVL²ħDŒĥB nsNNì³>ħpÚşItĤTbS;ž‹=1Û[LµKĜeÍÊ$¤µ£fcžü~TžĴŠoErŞÓ]Ï2E%°ŞĴpNÇl~µ‹İŜIäĴċÁ °y{d\œäûvŞz‘sÂúeĠìo˙T\îr6ú9ÉüŞ5эŜ”·ĈYcŽvw(İĵ/ρîG½% 1&³–ÛÌ—(Y'Ŝ˘†UÁ •ĈÏZ‹> iÛéWÓĦžÖk}¤‡BÇ~OÒŞOç v•$lAòq‘ô4ıXŬ9†F 0 çĜfšĝĤx£‘.$$¨$cڞ$žóˀ7ʀí^Š$˙Zwb#‹a,².ÒxġÇ­#…Ŭògo½&û:‹he$ħ‘›!G@1ŸÇšè4 P¤ñË£Á7l'Ħö4âµMôWĥşş–$–;@ÍĉDŸĈŝżJŠ+(QbžhĤ`áĜF¤.väŭ@sO—P4´˙°Üj0YŜÛŭŠÖ̌ŻÖNxġÇzÓÔšuÄ-Ħ–)Ŭċĥìzqž?ŭtôÜ5"MjÂÚMö6+nJÊĊ–ô9ÏOjĉlġ âşó y’yaÑÎFsġ¨rV²Q¨Ïg<’l‚8a uÍEwĴŭ§Á–ÖMY Î6ÚAúÄ~˘÷γ;y5£˘Mc “˘ˆÊé…,…˜lt4–àÌá³íTf=p8ġ­m&Òî2ϜӣÂÌQ\ ËʓŽĝÉŜˆßpfµÄzM팳ĴÓĊ26cû˘7$väcéUġoìë³kŸ.ù§|Îí) cıÏçômî!š~ħ ĴéhÚĴAAù€-É<žçéT"ÔŻ,íà–ÒíÌQ‘ò3pŻ·ž=)^Û †˙XÔ.îZIî rğ>C€AàU1PÀğ&Ży4 ”ù+ŒF8Q°Î£rhm° cîƒŞĥ‡Ŝ\¤~^zóĝĈiĝ~+iPQƒ²Ġ¤BIŽƒñ8§•m-°–vLۘÄ9E7ä7ċ×úU%}fĜXÜj+h˰Á$tQ2}²j)bhehÜaàŭjl߅ôĞ‹›ènœ4v419R>QïŝÑÛjÏ£Z^Ü\ÛäIròl2€FN1¨íWép*½à—JıĄÏ|ûŜŬ~ôhĜ·ûĉ³§o2<ëtĊr"o1B²…Ç>Ŭ=*Ĵ€f˘_Ŭ\ŭ° HŽLfu2y™Èwâ·˘ĉ£fßiµ6fLܘöİÎ;úñúš”´¸\ÂÖ4÷F_>Šr~ä žĝéۓëYvúrÜÊŞ·dg*¨Ês2IÇAӓïéRÓ¸ ilbżK{˘¨²Û‹•çż8'ê Ë}ĴÓD™·.B6zŽß&€İšziĈxëIŬxWL’îGş½ıy|²"Èar+cPĝıŜ.dŽ\K'ŸBc[ßBlhiÖ`³[q<³èҜœzU úMÜv2ġëĉ³Š5HDŒçŒħ~dÖ4/­4ŞÖ0Áw —tƒa½~c“Ï=(è}b-^ÎĜI{¨ĦYWÉhç‚:öüñYÏhš™H"ş‘T&ċ·İÏp8úóE€§ŞĝfûO••íJиĵjp£Ŝ² r†ÚQ‡ĥ‘Ž=k6Ĵ25$ž˜ċHÈ ûÒb;Ù¸3£íÙpkPÖŻ4ë=46”ĥ3ûĥà/é“îi4™,ÂÔy÷Ċĵ#|ûY·`ž£óô¤µÔ$³˙W,}^0ŜżZ‹ët; q{sp›ċ˜ç íÍIĤMl“ݘùDd‰JïĤ2½ûŝcҋŬêĞGŬĥ—ΆO˜9B§'GNıéT{Ò{‚4ċŻít~èĞ08,=JâSsp]€ĥóî@çñ$~´Úh³Áĉ´¤´hü<“³L<ÉrË=G×u \ 7 2ÊRbÁÔm!¸ Ġ6¨Ñü”+nÚďŻOZ@N5™–I„Xĥ†äĦ‘a#vúw­M2=*/%ğYĵñ³ ‰š]Ù  úƒíUtÀğİèzŒ)šk}ÂPĥ“v1íÇ-ŝ‡ĞŬ´ò\4³ÂÓHŒìçíŒ;ĠYˆŽ ò ;ğĞÑ,nSo–Şĉ'NyĉĴë3Kl³››4ERKr@uQêTġö>´ÒiÖÛ@–ÑG `…Š5E'qÒĤÍ;£yf× ĉF£)…G;[×=ŝ•kħEĤêhŠ˘gpàm “ÈP>ïBh–ÀŒŬvŜ-bhíё0Ç9*YA#'Q.ˆ´kqgqϘGÌ=³éY=EvXİê8B’FF:f–ÀiişĠĉ›ròÚ˳Ì?:Ÿ˜}ëıMvò{o=Ú P ŭĤwÀ$ú(?Ħ­bîĴŜ+µ°Š1u+ÜYc ŝâAâ]*âĠ¤KĜ˘mıWĥHúìô{ˆì¤’-EŻA'ĉÀRžĜ*Ú ĥ´;Ĥs…,^VäS¸qŞÉ§6­p\½Ê˜Ż3ä>ç°ĤÛ´[›};RĎٗdĦ#Q€3“Œä8ô¨Ŭ²uWOħ’j6é“ħnYŽHƒÓżS\–˘÷ /ÚĤ2ʆ}ÙéíU;ĜHĴUƒ) ƒGQAbĜÉ$ûÖEÊìP3ż'9éŽ1ŭjŬכvŻ=ĊäryJy=§&š ‚âHÁMс¸ì:~BĦ1¸MûNÂpIĞÊ|RIP‚ ÛÓî³kö}ĥĥéğh\üÇ8÷ä“Y·Vok¨UViP.HéĈİê!í¨Ë$gšQäĈے(ÔfÏ|c"İ$ħ<–îzċp"gŬz ŝxİ⵸v"Á‘ˆ+ağĤAÇÒ É%´ÛĵÒ~}ÙÎ{ç=ê:HHx”Ĥr¸Ïz×Ñċ{mnŜġ"[€ƒw”÷iz`*ijM˙ ½ışU[+†g*ĦFä;žhñîİo´…à‰A%Û]şc#˙ŻŜ´½Ñ&—†tËğ o$–f#6áôüô¤—xÒ$Y™?ÂĊñ‘ïŠjöħš„ŬÂ.Ìdb›ÂžëëT"ĤµĤ6­n!7RÀŸÄ›ëôĴÔ²˜/npĊmÀ’¤rĥ•ÌÍÂ÷···qaär0Ş î{ ϟDZÚÒĝ'œN2ħġ%Û ÀċYÊ6Ô1î#‚Öbİ‹…È*ä@'#Ŝœ<¨Úkaşe%f$ 9ĵqŸZ‹+”T'“ÚžîĤ$U Îğ ŝݞc•T,Jp àU­.Ĉ}Fġ ·á›ĞáGݧğ´½ ,¤‘–yĠOÍ÷Cp:ÖWˆġiYĤ‚YŬ!uWÌÙMÀ}:ŝ•вBı›,Ż,öwPÀ’Áċħ[x ÎíÙëÎF}ކö]V=ĥĞr%T·ÈWkwŭz;S‘%½cžjŞ˘y˜Ĉâ1UhĐ!FxwUV9:ùQÛÉäΒmWĜÁĥ·!ħĜûP£Yêú]úBĈâŜ9çÙÓc¸÷­¨n"•ŽUqê§5Ó{­ Ĝ“ubßKċĝżMÙM ‰'T ÔTĜ y•ž&ûXô5ÉjÑjĊäħ@÷P Ï·aBOLô=şSJ/Co#ÚÊò\ĵUĉDàħÏLuĞvÚĦ–ġĦ–!“ˆÎì–ïŸ`Gò4-„hdÖığùàóîwÊñÙĈcBĈDU#ßbF}Ŝ˜ÌLTŜ BŬvÇnBù[?/NÙŞmċ*yEcw1Ï‚<`~ƒE"½ċÁğĵ–rĦLŒNĠj–ÛMışeH£Ë·E'ñI&ĈE-´ĥ³˜î#hŬy*Üè<%Ġ­ṵ̂;ZşâFÈ ĵġçӚ¨§p-xŸĊĞsAÊêĴ ‘ñƒŝísŞ·ÒĦ˜$’†Ú’ÄŠÀ]–mCO1Äê‘Nĕ™Xg‘ÊžÀUhĴîb‰.œÄTgj´€ôŸznïä-,>îÚÒm4]@&ûCħ,ü€“ÉäÖKĉĤIt”2;uİCĦĥ#İG*P£ŞĞ‚‹ OŬ9˙OĈ7Ó9l÷~éd2cßüżĈ€ b ]ĵ×4”,r•VR[iê{TÖožÛ¤û:4{KmŜAÇ8ú˙Zˆ%#™•d(èËĈx­ï =˘‹Ĥ¸eı‡ ¸ÏS÷~ıŞŠWv q#.0X‘·§^ĠsKÒfÔäa(Ĉd•Ê˘•ì/ÚK[Z‚cR7;K‘ÜzzU:,u;‹41!F…›sG"îVé׿aùW_oyáRtµÈĥ1íÜ~˘ lÄî.½á+9-džÉ)‘I Ê;cÖı\ŸG¸Â(x]‡˜„rzô=şĠ5ÊG§# cëĊ˙ +ßşEÓnGëŭj÷mñŠŞĜ=ŭê$ì }Euĵ†K ˜••Ŭ3Ÿ•Pñ³=Şi?xrĜÁô{‘umKm‘ƒú9îGòĤj[Në4a+s&òÏ·µK4lí'ıħŒĵCh9f¸mĞ# )=ñŽž••*ÚFÉċğώ\húS’ îÀ“µvŒ3RZ]Ki)’ äÎ3Á¨ĜdY¤ÍPc>%Ìm˜†[ÛséUèj (#\Jï3Ñ€úÒ£ D‘Ş6íòlÀ‚sí]nƒh’hW–v·–Ó\N‚t#Œ`çüóZAk 3Ñï4ÔŬw‹'jİa–÷ÓŜ¨G^• [p ôo [ZËÚŜ›X…ÉS™6ÙéúĠÓWb‘´ s>+èğCycn3ûÄ\ ×µ´•Ñ)êC˘x­´‹{u·iäöŬ…A“€IïŽĠvïRK­2ËVĈ ¤ŠòĈ:à§B•ΐÀrJݍÚ}şĈKc#F$,´ÀumPÌŜR´ƒċˆGÀ` ĜîOÂığ›i,Ü,ĞċÈ:Ħ ‘ŝ”“ÜĦ,^(ïayÙÖ5l’Ÿx{нk0³Ùz‹ıŸpdfI“Óœ}i 3ä˜ù²˜‹'WĤ3œ~‚šħċİÂı\Hġŭ:MŬë3.PĤ7!\lÇMDRDQ‹p2§qܧż;šéԛ‘ĝ€]KÏ*¸e9`ĝ8úµÀŜÈ 1ĈaD't `5gPh‚w•ÀĜûq¸ıŽĤĴ?Út›‘m?Ċ´Œİ˙8Ĵuï} muöYZ£°_´.ĉŠ5Pƒäu=˙gAĞ\YmŠHƒ4G*qŜŞNÌH³ĴkÒkÂÒÙâHU½XŒì*Ó›Kî;ı‚ÜŭêNì â0q~” dgfQ,ĥÍĵR—„™ÂĞe—• äçċĉÇ>”4—r”ò|Ó$HNÜôúÔ 78 “Œž‚†!:(é<ĵŻ—ğîŒîġïĝShİìĉħşK‹wÙ"t8£aş}ôĵ÷Ó=Ċı‰–32çžÒ³5 ³³Z²Mù€ˆ–Ĝ `Ó½[÷•ÀßÈltùtëtŽçféZcßħÏ|Ô֚Žħ§\ [ż³NÜ1Mà0\ġĝV‰8ê‰z,3Ċp †T)ÁÚsŠÍĵ!|GfÈĴĉ<ƒ=ù$֌”`ĝ˘ÊëI½mFŜTXiU`ġŝ´-ċ„Ú%Ùµµ’Ŝo-C4§xX+möĴ›³,렚+u0ùÀˆ”½À~<ÔĥwKuj“`Ĥġ TžVĞ`3d¸³ĵi˘¤rH!$lŝ÷ÏK_Ӈöş’‚!.<ÂĴsĵÊ; 3JIµ`(ĊlĥÌòùlJ•Ùğ÷°<ż§­A;“!¸Ü¤œàêü++XeJn*zĊË -Ġ‘ˆRÊr23Ò²íìş•Ô†èËwA>VFp1Çċ]›2 ŝ&Ôí>Çöf¸Ĝó(8ٜ ġŭ+–ŠÔê“ĴĊ`Ĉ]Ïï1üX=8Ĵgfìw7Żnî4ĝcŠĈĜI Q$„qì?‘Zĉin'/"ää…żô˘£è ıÑk‘<Ú~—u!Ŭ1ÚĴĴĵ7à+ ġb}ZU2€)Ëġ 3íéENEi#Û#ĈĴ†Ú6óğÜžġ,ÓjHIx‰\>Qœ?RJÍ ­ÔñOŠ?:PŠpH>¸éHcpyǵ"‚OŸ( )ġ4(Ëœg½:xŒ2”8Èô9¨èi(h Š×³‚(˘Žĉg™#AÁ­ê3ġ8ÍS $6%ĥ•Ŝëór8‘óÚ¨GIáŬjeı‹OĈôns‚ĞŽžç5Ż]YY…2ÚA5ĸ$A‚}ÏjÚ/Ŭ×Ħs$Ïq¨ÂVœħG1xQƒ/â˙ Ĥ‚+IŸËğ+tÒô`ë褜`t˙J–ï¨ÛŻOİÚ {û{y“;ƒ.ċe>ĵ{Sĵ5·ĥz…ŠÀhŝó›àgÓ<ŝ4ıÑEû)`—M†ïT•Ò v€Àç2) ô睪~ıĞ6·˙d•,m'YU¤òĈqìI;@=)í`7âvšÍLÈŞÌż2g WœŜÉoĦĠ oj—Y× ċhÉ`{vûVX½tÎÒêÛpb0sÉúšĥġ¸[v8ĉ–2c‘Yd(À˜u7ê”:„ía4“jR‰D/ġöŞ]Ëğ£ÎK¸Ş”ž‚H‘/P[H$‹ÎÏÈÄìíïU€ N‚“w€²>A!”ġŒ¸69Ç"¤b)*Á”AÈ#µ*6ĈÎŜÇhEp‹§"Ë ¸üñ‘½ıíUäşt…v£zġëïUqX­J­µvƒğıê>•#œÒ‚YÙ9í@ I@ NzÒPĠĞu&ŒIŽĥŬÔğ-½í½”Ö~x—ĝž“;äñùtô5VyVH-­–Nd’~POĝUj·Ĉ—İ[Z4·ÀÒÜà˜ŽFqԎġŸ<òÜJÒÍ#HìrYŽsG6– ĤšÖ׺zAó$ċ702|êH+&êÈYO)ĠVVVA²éX¸vŭ³ÇĠ£Ġ!ĥž×ĴÑĊi4R Ráċ]Ç<ŝŒvúVlĈk9ɅŜ=É·rħù†9ż#P×Q˘•ÀC¸Ÿtg§9ŝuê˘Û͊a*íÜ8ĈOŻżI;06ü+}:ßÉfòI*mÜNw*y9ô?Ö°uĞ{£{-ԊͲ‡zöŭ1Tïʁ§’KT²‘Ĝ¤lLkžçôüj,‰ ‡|Šmċ'ëP!n€r=i´†tĥŸi ól‰Âî0°$äûûûÖ<Ğ ƒ!}=ëIĊ&Jcb—bş(ĵà“éOŭŸrÊÄGıTeN@*ïD2ĵĴ'ÊŞ@Ĉ~żSQԌJQրzw§IÄ@‘JŸC@ *GzmP’ÄÈc‘J°àö5¨ éI@U‹)š•) LǀŽı˙Ż@½žsyF"Dàv#ëïU}Žj·³tĤ÷ŝ”’¸żÀL|§v?֝}ĤÌ 2Ç41q6Èa“Î?Ïjih#9C1ùA$sĊt67b-)í—róm_$ä‘ÏŜ'·˙ވğ0gIĤFtí6I'ÊYÙZMÁ}3QÔdĠ琈ĥ´„;*ò2 Ž=ħŠÖz+ íí¤ƒPX." ç˘ı#’8éßXşÒĉY`NÊÀá@äŸÓġĴ”n†[Ñ'‡NUG0Ŝn¤ċ\àŸİÈĊ[Ö54Ô­–ŬÛdÂ@›b'Ë`O 2~•jÉXfâ·¸x_ï#}+WMş´ĥdK‹w8_œ†ùXƒÄwĊBÑê ÊıĜ.dòŝĉ´g2Ŝ”€fÀ[Ë'1ÄîÏÊ ĊJÑÉg`à núQa:ü66ó~ážá ?/§>ġ]µ{Ħ –FħÄùV1¸óž½jÔ­*D÷…ĥWwÉÊĦsŽŭ¨’Š(˜Í˒w}áŸ˙ġİ]°öXċœyrJʊ$ÓU­;GżòoˆUqòIğ9ġéBµÀŬmÎ+³™Ÿ`A†>N9';5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?Ż+ázŠ`“ d;ça`3šÊËzݝsé¸sM–5•üż%#‚.7†o§­1lfùNUœ#mSÏ*ßÚĉòTq †úĠV@WuBĤD`9ĈŜ>ôÉch².ŒÓ¸È‰ùyïJl' OZ`J#A6rù.qĝûôŭjKk§ĥÎ֐!ä…r§>ı"¸Ĝß16Bĵ²0%ۖ\ġ÷­%ĠŻ!„E ‘0<ÂıÀôúSܤfHï,Ĵû˜’rNzšĥ÷’–í„xĜ²‘’\ó×súRb½Ë6“O, kFѲüѲ( 3Ï=UÖ@žD{JU۞ùúóBħPşÌiÒAêOóŝ{Ò·bSc&NàxvĤÄĈĜŽ}E!}Gë@u.E,-IQJ€y^’>osÚ ,² Ü9ŻżÖ“W`÷%‚ĉ;p†N2ôjĜ…ukÔ+e îŭ;óĝQÓw½Êş–Ÿœa•d2˜·˜r[ӏJeċǑ{ Ì`(,%1ĞîUɔu‰ K‡„ÛÄûœg¨!òx?†ZŻ hŽv2Ş´cpÜß{Ĝzš‚è̌$–'˘d 1Û§5DZş†È #Œ3zU41†?- ’2:œž˙ĤD²ï}i&+’…UŜ& ˙-7$÷ÇĤi$̌íÄ(NQ=ú~TlFŽ„‘u–$fQ0Ïá[rŬá/O@OL“Ÿlš†R1/'òç‘ĦÛ3c&fúñè+=⸐rv'§Ö„ġ"çIg¤ÚÂñÎ%g|d~VOiĤ ÔܤĴA˙,ÑĴƒŭĦšİ%żÙFağx²pQ½>ž£ó˘2²Ċîċó˘’àŽ6Úe‡ĉ½xê8Ğiw‘GÈnž´Ü´ı7°£3Z•ó6ı$ "ŞC%҃ñ4ŒÊSo|˙žÔÓ×@-]]§È™Mĉ@­ÁP{Öfµ¨XÄŞ–Á&ŸÒc„ŜĤ­;‰+o+ŬJ7z0ŻÚZÇ5°[uˆLxfšLd˙²)4$k2ìû@İ D–¨ħÛ³ÈĜvŻr~•Û³8ÚŞĞÓŻ?ST†:êÔ Ŝ#´ Ċúšš6T²…ïÇÌ)v4l²K€Tc<ú{ -a3–LqԓڙCĉ…!U* ŒŭўԎ ĈY‚!‡Z ˆŬ eÌyvĤ*™$TXàfÄO›}Ħ•Ġ€C‚@ëVìón|ɔùÄŝ”ž[’_Ú[ĵfI#dİŻJŽ{ˆƒ[ùpĉĥAû¤sÛü*´ĉ5m5b£Ê–ú|òŞ &Ï22à‚xŝ}½Ğ%-$‚ÛíOŒ/|2œÒ-L‰$¸h˘— U¸ÀÏùçúÔ ueŸfċeûüĉĤî÷d˘Ç‘$‰M#¨oĜóӌ{ …à/™MIòĵÙ˙ŸJ­FAĉ¸bÄî%v’}*VˆİäİSÔİÎÚm§mnúy·œ¸u›ċ`½0zsŜ§ĵı˰’99Á+ƒŝ#ùÔ= z!ïäM6̊ÍıTäm ˜ç× ΋䂗* 'Ëó‘ÏO~Ġ/TC°Ü‹Dh‹ò܅ q•<çÎ*xġóL›ÙbPpñ‰=Bäİİ rĈûä‘ÎEwr&„OŻ9Ċ\uL/r R÷N#ċ”6ΘÚ>żJ.4Ğ”c*¨Žu?+˘áX9÷=y§ÚŬ>\Ñ,Sv`0ġ•zŒnŸ÷òJ@Áb@ÚzŝXĦ-FgŜ]É)2Èñô¨˘TÈîŞç¨Vú֛ ,Ëvgwi£SıÚƒhÈ·4ħZ›”f¨o™ÙcôzQp5Y†Üœ­VtG˜ä>ùëíJÂDĤ?$—Ŝ$|c,¸Àô¨ÙĈG˜ğ ç'ÓéEÇıë7“°.Wİ;şVròüP€O•ŽâҞ‹(ÚFï֘Ëâß˄ĤóŽı=Ş˘[ ;ÉJ Ör…'Ž€ÒÄë-Ôf8Ġp x$sŭ(CEû›­ÖĈ<"îŝééS$k%Ĵ›˜ò7zÒ{ĥ ·ğ½G•]ŠÜ8‘A }~µŒÎ’*Ÿ›s>zr; ornŜ…+‡mŜHpÊ­’Gñ˙WġĤÍs,Êı!F?€ħö˜ĊµšF“?(ÏÊ£úġŞÊĝÎ̜ġŞ\u„ŬÉq“S¤jèc¸l ô8ôúÓnÈFĞ’]†ċF>÷ùŝ”˘@¨Ŭg=;RßpèKóĴ n9I(„ç·JĴe€ɒ =ÈçóÀü¨ĥ…^êÄñÛ-̑,LÌŝY, û¸nj7Ċ!…È|6vîçÛŜ˘ÎÄ=„–tˆĞ)•ġ+÷ô?‰§ùS‹u°ÚIƒž=OҎ[D-aÑOċ$@ww/@{ŭ)`ı(Ĉ@Ĉ6RB–Ĉ1ÜŻûROŬzÑí/G“9S/'ä8zƒß·ċZÒ[dV,ĜyZµİhçġy$UĦ Ğç°éŭ+&IfÔî”(Ufà’p:u4ÒêċşlÚ\H°Ċçiîò4ۖŽi4R7ż0˙=hnêèwş[˜"žhÔ0än+ŽOıĞÚ]µ²4˘BùBĴÙƒ×éB}Ŝ1 ŬüLGOŝ½I1ùÓn˜m&FTLuš†IâĴ‚Hnž†€*È­ aċĈÇċç%ôßħı@Äw‘ùSQ>ŝv†Ċ]>JCğ éC+´…² QŸ_½NKŒ&;şœP„I…›Y÷‹œzÒÈğO()*ĵ P0bÒfUG=ħH/\B-óĥ<`1ë˙êë@ĈĴĴNĴ^F<.xQïġ¨ä9Ì óħÀêUÉ =1ž”G¸8e+Ï=8ĉ­ –Ŭ£ßĥ`pÜo^vƒ×ƒÖŸ4hK w2"2F 9¤Á’L°ĊOĉLdŒñô#ôŞÊpĴyäRZˆXĜî Œ•ìzUİ-ŜT‰ÄŠĈRN:Š@>=öіáY¸ ÙJĴ$o=˜c pxšqwe˜ĥÄĊ˜äê9ÀöšŜ^K ĜÄäüÙ9úŭj,&E Hn#*K7ñ}ħW­$O2CnŻY‹|˟CëĝQfÀiżh2÷Fko’@Û’IÇ^XÓäÍ˜Ċi%ÜMòĞĈ@#Ĥ~S~••Ĵ‚Ĉ—ö\3¨ßlɑTް56Ĥc°³3Np¸áIÚO*”-Ğ)#‹]NôFıT'€NvÇÚ·mĴà·O-+×çÁĉéĦ,Żsq$7F(UTĠ#=OlĠ1™Ż“3ni‚çœ:Ĉ’H-ċ ċĵFO§ŜĴ$öŝ`‰By 3–ħ˙ġTÚÎV[‘Ĵ¨Ş˔Ĝ'™çî\Ç #8şgëT; äK*7ÉĉêHÉTİoĥ07#Œ˘àŝt6+‚ĴHI‚ääÂ˘‘ü…Âç-ÂäœFà6ŜÔG#l`p£İçµ%Äal ŭ¨ ‚GlI÷İöù3h€ àŸÖ—0„ŒÍ$…ۜ—,žâV-ŞAüñL^aĉġbXž•­·—EééœS°ŜÇuAÉôúP™’Ve*Ÿ $J“Ôĉ•bf *’q Mk·n1ŸSŜ &8ž&PIÇÌ3ÈlÓ¸ÇmóB€U{œœPÖÄ)wĜw5(‘:ä!J‰;‡ù4†F Ì­ħ˜?ҝş˜ÍÁïԊ]êàıƒÍb—.Ş[ŸñĦÈÁٜtöüjoal1‰È~ĵĠˆ/f€İŽRŽTŻLŭħĊ;h?CjKKKo³™˘šAµüÄßĠ—gĥ ?\ŠsÀn/Rġ->X *ĦÜ ÷ëĝbİÇF‚Ĉçˆ$шŠîÈ)h÷#£)ÉôCW½żĠfŽĉèĥÉIXá@ïŠkРێĊ-Bĥ˘íz“ëÏ44†$V‘v“À§zÖ>dŒ’ĵ€¤ċ‘wgjž™ġ¨o#Ž y6›FáÈäŽGòވÑV[˜¤Üb•£ŒĦŽŸGsÙˆ.ùX>7sŸNĜŝu-]Šö–ûçŝ:ġéêOœèŝĈK…-ó`µ3z‡çhöSHC‰Ï Ô;È\€{güñM `6Ò ŻœR ždôCݤmH°ÇĦ ŝ5NHÈèÒ`$~ĵġÇéHCEŽrNy¤ŽMÁñı‰'4Ó&xɈo"Œpàĉ —AŠÎF>ŜÔ˜É#/µ?FIİî ı8<‘Ċ0! BàcŻ^ôe„Ħƒ`zúP€µ×ĈäÜ|ÊA Ŝž˘Ğyò–’IÎìw  ƒğvÔF9ÏÒ¤šë1ċ­#ÚO\`ĉĤڈĴ$1à‚p@?çüâ•d\ž­PÄʂ)ë7—!dn@£¨!íÛ&ç#*1Ç#n)IF^sì)11›Ç8>µb7UĜU˜/žĜÀġëG0\ğt V·ħΊ¸ˆ’CĜ0Ç^ñÜwĤErÖV:\",ƒܝĉFéÊôż5˘EXŻ`YîbšáVp¤lŽW!HéÛj{ŬÚĞÏv< €²›óË(>ĠÊè[–ġ[ğG2’H‘×ú}įäÁväKœ“Q~ŒHĞwu=ı ³ 2ı`•Şbîyv£ħ*Ŭ ƒ ö˙i%¸Ċí°ż–ÙÚ˙˙ §)!³‚|ž*ÍL°öü)2Û·mzP…×oCŸÒ˘ót } vb£ C)V8 £ š”8 6ıñŸ­El—{’(•Ì“3dmżŜÏĦUېܰ皲88ïéS[Gż*:ži”‹6ÒĀšNF0x§ğ·k…n2;ç¨5X’Ŝ 2üۘ`=~ĤİŜDÉ2v<€sŠ ˆ’~\w½@pÏ>ôîá’5Ip:ààÔë™Ó*Ş9Ŭ#g<ŒSVcEvgnT/n8Í=fevŝ§êjDBC¸f$qÔÑ êA)ƒ$D~ô¨T>‡‚j4ċĥŒä `†ƒıÀßJò?—YwŞNz~ż°e°š;idˆc}Ž3€ĜïÏjİk@p‚lĥvçü8Ħ&· M%SËĉ|Oïšl’ùnWqNċç§µ 6Ĵ.ôe ͞XqéÇÒ˘–†êêU§’3˙×İĝĥ—Ċg’6ıːCž:cµ¨-|¤‹÷¤üÄġÇŻÓm¨~éûĜúóMbKdž?:c6ќ=)`p}ı4ŸaŽ\’Áì c§ùŝTy›Žv6Ġê@ïFÔdÒy8p $÷ìxİíÁĤIÀ£qô#ıò61Ü^Lpsœ…WÚĦWsí4-DDrX(ëíR‚Ê#žIéT4K3ÜKta–ÚN< ġŞEş„dž18Ŭ—␄Ù-:À dÏùÔS2´ˆĦBާ€%?0Ëu8Ċ#B€fU>ôìÉ´r(äÍX·uV`0çzû~F˜""‚fbGʃ’=i +F 3g;‡òúÒTĞnö"˘Â–ĈqÇëI2K exlÀaŒŽ˙ZŒ£ÄG›ä|ıĦŸdhўlĈLŽXÓmÎ;7;Ġ\˘ġ¤Ĥë͉˒W9Îx8üjŬ„QÉba Ğ6‘’ŽÇJH.£sĤÏ2$d4k6ÒğżúúšÒv·–<´hw¨e”Uö⚒oB™ŸĴ-À³(ŒÊë;÷6z½D–Ê#„>ѵDˆCp: öéŝEh+ݘ  ä•ííTĤPìĒ{qQ!2 ó!„fUnĵŭió´“ %ÀPq°ö÷¨W iڒ3>ï˜`;öĊ$FA"HÊÎǀ ä vúU ´Êĝ‰jigknŭ)Ĉs† =3MXAvö”„$Ħ·d6âx zTĜÊ“P1Ljĉ‘ÔšTœ³œšŠeÈX—ŒĥsĝTM !fl2ž~´ ĤuXĈÒ:óO82`äÁÀÉĤ>…´¸–A%Šn'ÇÒĞù‰$lV¤p~P}Şl DXyùr?L,^E<œJ`< í#Ĝ҄f9dÛ4]?“ò` ­ŽJóUeaä1HOȘġj°|°9\}ÒCëMŒlNÎKy`ó´ġĤJbqħbtcÓ֐?Ċûː3ô¤(ĦK6ç nêżOZ. ”ĈÖŞNYÎúâĦŽÒpQ] àM"IÊy?3ıÂ`ŭîkDi“ItA2òÉ:Ÿ^E =+èK‹\Ì[™ĠF3 ùžŸŝŞĵ%½ƒÄ–ÒCƒŸ˜gqúƒÖš]KQĥBġ ċ•–òÔ³DxĜBñùr:–Ú -É%äéƒğƒŽ?ĊŒŸÄUnI Ú2JĦYĵ½£c2ŽGŻY£î 0%(Q–ÁÂ{Uk‰ÈÇpg'íïLí!iċ,Ù<àçŽ8éïN6ñ˘Á‰ÈÏùR˘›@Œó]CŜ~PÌMbĵN‡nrG˘œšm%°ˆĠv·+ϸĉ§Ž)dpħ¨ŬÛ8ŝµ i.wŬÓ *ü[Gs@ÇîŒZ’~ëdüżNÚĉ0|ÁŸ ŭúädx=úSÜĊ 8O(v‰ŝtĴĴc\@ÀlÇ:ĠáۘÙPŜcmÊHçíôĤĠŜĊ[½9ícŽ2Îä)ĉŞó*Ş@\Ğߖi!Çi$Q7Ú!ŬŸFZ…G•(ÈĈ>ô7œÍU*0ù†94ˆÄŽqR€›ĉĜۊ`…IÍU‘#``‚ÜäôÇ˙šĠLƒŒġjqğxĜcvĠmĜö'Ö¨ FWĥġ*i‡ĉ~·¨b"Ğs°.F0<•QéĊ4šry„#Ĉ%ĜNâïŭ)²_ËkpÌ dċ€ s‘ŒÓĜa+˙hH$‘ÊŞĠ\żZܲĥ•Ĵ"šĜ+Áİ½ kqÔFKÄı›ìñĴŒ¸Y6ŻÊ?§QPΗ IátÏ˘Ġ´S2ŻmgY`i×Êì@£…\ž¤qœŸÖ´ /olÑħ²3vÉ F;ôħ%;ıœ{†À ¸çôŞé#véžÔ˜‰<ÄQ=Z„Ê\ç€:b€›–PJo ĈĜĉ•‚JÄ"Œr<“ž™ïÍÑu JÒH‹,2܌•C°rp+‰ĵgYÛ!-Î]À­TĥTnfÜXœûĉ,x<€ÜÖbc*îQžqòŻژà(,sÁÇlgüĉ'8ÁÇá@fòÎ×l‚‚ÌŻĵĥŜ§ÎŽ¤È‰$aFyä~tu‹ŬÄÂJ$Œ"3ŬïŒOà+@ĤŻo",Œém8 ƒ ‚ĥ*ĴúŬBÈÁ&ùé’7P8?ì˙*­goĦ›Ëdü§#ċİĥƒìrħúcëYÒ7 €y‘qӟj"ġÎh¸îŒ•ġÀ$~5·˜Û›’x€‘2ĥà=p8İġvHŝñÚ[hÉÈÏ1•"$ç×ÚRŜlgĥ&!Û÷/ÊiIù[ê9ĥ¨FĈU.U À ñÍKH[lñĤ#sŸ;2ÛCO,†8# Ĝgé[/wĉFŒÇ—çd~ż*¤R*ÚËuÉ´…ħn²€rûߐÍi_,öÖC홌2§sÁϵ4Q{h.!ks}FqÎ=Ç·fÛÎñC'ȲKÉ*“ǘzñöŞ Ğ&ŭŞğqêÀr~´Ĝâvpğy<àÔ|ƒĉeó…ĤBÎV€ż:°Q†íš]ğ¨ǞÔ0=VˆÛéĉ_.(Ŝîqŝ5ÊÉdU>ĈàzhĠÄÌé÷oùÙ{ àhàaYĜD˘ÎŻÓR~”Öàvz~”°ŞÀœÁËoÚü?^ıüY@Ӓšà“Ù9ġĞ“ĥƒ2ômìĥïf×.ìÒ•—€py$ÂşíÒ0AË˙½Š@qŜ4ğK[˜Z³ ¤`Ħ?Ÿé\¤Ó<Ïçİ´Ú6šÛÔäsJQ6‡ÉĴÄ@ĝĈr=ŽġĤħód·“ĜPÍ á‚cŻ كú@ {àûӋœôĈOZvè#Á 3èjHŬPü½(H#$‡ûŞÄ°Ö˜šÑbچ;pF¤ŸİëZĤC E&2Z̰²>d›vç·Nj{İŻŻŸĤ§gbÚzœT=À­(îü)£‘ÉĦ"• Ç ÷6“ğ‘è1@§ ĥqëœÒHT§³ßҐĈĞcÛµ†ġÄH€ïž½0jϗU2ŬôVc“R2ĠŒ\^˘Îd̄((àۜv­ĤÚDĦVw†ó0zuäŝ•ĴK3­-ínm¤vFy÷rĊÀ·Ŝ÷Ï5 ŬĦŠ5—ĉ ÇoÏ*ħ'ÛŞşVè~ìo53ƒ‚FÓÓÚ³fPÈTäÒ³êK)<0ÇİíR–e^J‘ìÙ¤"=›”>pzcµFßx‚4Ä)@1L0;†¨ bĴ_O·Ô'X§¸Ur>U'ŸÀVˆCQŭ†˜óùO;Dı$žO:q\[ù²1‘= ”ĵ„Xeami Œ…É ġâ˘ Ż…E#ŽOcIЊލ„ Ĵ;ԍn'ˆŭ›~ }Ğŭy¤µ§˘é÷ŻKjĥ΅‚ħ~¸Çùé]j: Œù0GpÜòĈĠ¨äġ­c êjĜKu*ıı)ëV4“Ñ[##85/} ™QrÄ;šŞuKa¨­pҘÚFÁáÇ_N´€Á·Ó-üC¨Osm›cû¸8,£ŝZŻjÈ×t6ÊGl%T–@¤‚x“ÛœÓi ˜0 G1·ÊC`ç²úÔbFYrİĈĊd4‹'kDûŭjĵ#y*˜ ġ&šBB¤ĵϘAùHçS¸Á\g“ëMbäú*²ƒ~œS|ġ@À'\ŒúP"°vQ‘œƒé[óä–R~a2“ŸÊİ-@v£g5ĵù…ĥ‘’ŠAä`ŸĈĴ[êÑ*™î‰eÁ)(m§{UÚĊ’é7°Eş…ìùr!ŬŝİİGpâ(á ŞÄ–B ·ž?ièVSvfĵ· Ž ­Q•‰ÎàݵfÄчX²JĞŠW4ĤVقŸ7r @‡˜™6ùŸw§ZŒ0ıġĊ&!N[İíMÚ #k–pF(ĜƒİèA¨ĵ¤7iU-ŒŽkU ›`Œ„I‚†ıMg]‚ÊO.ßNV}ב0?*Ğ´…ı‘/ˆonrŻŞn;vìĴùYdbĊ N8¨”ı-F–Ó1RĈ³„bĞÔíèin3sCÒî5†2]2FYĦ”dú;WWc[YróÎĚÒî ‰çğ·ĥ M2FH$8ÈMC¨ß›]6[˜N聕ëŸéSbŽXêwڅü‘\FBÄv‰¤gjïJž½Ş£F÷÷R˘EĠ · ާ·¤„Ìù|7ĤÜÊÒʒ;ħÉc!ĤIá]>_½ĉ7÷AsòÒ¸/„´Ċ ($c>a?ÎĦ¸Ò­|;g&£n³Í$ ža†prMu5˜ÂŜê;I˜\Œ…‰7ġĊdx—Z‡ìSIe ʲ’É—VíÇP:Qkn;œô·÷w×Mv$?kBŝ_ÜQÉÏo7ŒtĤHc‘K$‘Ÿ÷YÚqÀ÷ïEî5~ĤöĉÜ["Ğ.aà?ìÀġDÓlÒo-ï–â(ĜLĈŭÙëŸċM-@ŻŻÜiÖ6³[$ÒùÌL;‘ÓqbsïXڊϤ%şŭĦ%ßŬâUxíê2IŽÔ7Ô-‰5ë4q_YÜÈ#ÜÀ>ġ?c}‚ċí˘ı1–I:7gœvúT8´iâbŻ×œ2àŝF‘ĥù ƒ‚:Z€¸äM>9d3. '°ĤÂGGœġĉ˘ğRf$d)Ö7 <ñM!*`‚ĴİÄTòŬèVÇ\X ߍfßj7–“ĈDB'!C³òO Í$“ÜW$ѵC¨Äĉ@ħÈżu‚@8äġ…âfı½ûD3I€ŒċHÚ¤ç˜÷˘Ö9¸4ğĤ‚S +B +.7Ħġçŝ*Îİcq˘x~‘ai'—rÊ£-FO˙]O+Z‹ŭ óĜ=Ĵá¤;ƒFùċNyÔj³ħ #àuúÔĥQĦÚZé&#Ŭ:îYCıX1Ĥ:~š³\ı˜€W|ŽûJàçƒ×'G½=ÄoÜ]Ĥ Ğl³Â-e-d-4ûœôùˆ<˙*ÖNž‘Goa Èñ1óZfËÓŸŝŞİˆÜ%…ÁŽâUš5†L+9lŒŝ]{Ó ´ŠĞw%ş“3Ë+;’Ê b9ŻÊŞ;XKP1 É <ġQĝ Ĵw.µbĈN0ә‚Ħ<™Ñ1Wf^÷i.ŠL7rĤ`{ç·½7Ä\Kµ×5S š™m­Ŭ4¤íi]şq}CPO£^Ċ2À-%'‘„\¨ “Í&“Ĝh‚˙NݸŽâ4ì]ËzgŜħbşc"ĞP[İ ‹wab}@HcBR—+éêMQmÈ[<ëéGQ–ÁĈ8&H9? ;ßlîĦĥŽîÜ+.Z-Û¤fÇŻ@ì+ĤŜ€ŭï˜+Ğs;˜!çŠök[‰YçË"-ŽxÏnĠ…sĦÍmq䘚ßÍáeˆ;nçÑz~4¤ÎîÂÙlìq„…Ay=ÔÖ>f›R9o—Îʀ=jÔ£.äkâiˆĵ²XcQóË6{?ÏOTÔ5 {ŒùÏ3E—•bòÀlŒOQŒ}Ş´°ÎBòYoaŽâîŭdnTFI,¸tŝµ}µ)ĤzÚUñ>Ö÷•6‚¸öÈ5Ÿp0²;y>µjĈÖÚ}ĈêèA†^£9^r ΒW`F–âK‰|°ÒAY˜ü§nzóž8­>Úê YÙó!+yЍ˜ıġÜ:vüiĊ,š‘Óċ·˙H2DĊ÷ E^ONŻgۚ÷>Q 9HœŒQĜŠmŬ…Í”×ĴíħoĥŝäF!·€uŞvž#ĵħ°´•~Ë„8gîzöϝ;ëp3ġr{ûé.d‰62Öì“ğ2xÏ­6ĉĈFĉ‚ŭÂùm*B%cÇ͜Ž:~bŞ÷Ñí3—M wSŬÏ·ÌÛŜÇlœġ˙Ô_ Kpİ4šĴä•ÉÉ=˙‹]nF·¤É˘,"ĵ’yHŬµĜíQŒçż=k6ÖĈ3|İ+KÈFL6;Nĉ“€÷–mċ+|²7É # ıĈH˙[ğ2ˆîS$[rË ;³éúÔÛP(óıÇlӕ°*@ŬÓĵ?y6dÛ9¸Àü+µÔŜÑ£šîöċq1úMtFéżj YbY #qc’9ô&­`Òo¸XÀÖŻ5X.Á,Úî2ĦvQާ°ĴkTĠž9˙´ –ìFÙ\Ïċr}GL~4YŒKbQ|m’eŽ9B—6€n)Êîç$~´ë+ĞZȲë³$–Š@7 üŝ?€˘÷_ jŞ˘µ3!'k£¸zjƒi·ŠOˆùèBçë;1ìVٙĥ!êp âžd–‚Û˙x2 9íKaôŬEíïwÊ#•$ùd İż…nĝZŠÛQµ[à’Ù`Ĉ?…”°${}ÑúĠ§d+:ݲ7X&ĜŽKÏĥ “NԖÒٕßh,¸ÙŒ`OnO'󤝞ƒ,ê^*½½‰ ù"x@ SÛòĴȍ´ŒèË)Ü1Ì>SÛ>Ô7p°³ĜËÙĉFìA,ŠÙ)Žp}ê§'ŜĞ(ÛK†2ŒċÜ:óR#A:J×:ÏËêñ…öïÏҀ+ç‚*äqµĠ„$Ñ˘Û(Ĝ¸œ’={ç>ÔVhÚ nğ]zŒĠŭx­î<Ùn0Ĵı‰ÓrÈżĊĝ℉ġ“myzşky×lĴÎcHœ˙*ż›Ĥşĥ·NeI˜2Í#ŭô(NF:ĜëëWtĜuŬ0XkV–vWÒÚÇ:ô,Ä!kwûòG̀òÄÁüµˆÀ9äw'֚]„C?†-­˘Ù§ [†9ódmĊG'ä Ż­ÄñIyJ˙hĠb‰aLò'zû Ÿ­RIjM~T1§˘ÏáOÍ4Ĵ#Z´µÓ,žâ;YœHëĉ˜$öÉ^ôÚ\:GNş€(Wi zŒä†8÷ïIÚÀUÔ­- ³°½ˆŜîŬ8sÎztÀü*µĊĵv—0ÏÍğpÑĥ°ŻŻ˙Z³vLfy^NӐ;Ó˘sbœ‚>ažµ;1–îu+ğıÄÓNZT@ŠŭÓú×Rž%–ËIĥf–{™gS· ÈàöéZ)nÀÈ_jıK¸ïċ’E9‘HŭÜ|à:sZú_‰ċw¸7÷MƒŠqW`z éoÈT ŝuÍëRIuöĥ²ÔJIm7ï"@IĈtïƒŭkWĥ‚G?weĦäM‘'‘ĥO•ÂDüuôê+ëğŭ9šÙoˆÛ €§<äCMj ‘6­}§Ÿ&'†"Ş2¨ùğŒ‘Ö³§”Ï;ÊÁC9,BŒj[è4ˆêIBĞ#ĦPÀ9ÚÈÏR1ŠĊNGZ·§ß×P+êšSiŽH²*ĉ'SúĜâŻĝDÜÚK-âÚù–İgm£w xú“R°\Ġo€ÈE‰òòC˙7ĥ+ oŻÓSžö cĉ^ĦĈí ĥ@è:ÑÍĜšŝö+)4İcqq,™}ÀdçŸÌžĉ²'Yc™’pÂAÁÔTÉĥ·˜ıÒÚX!v–#ó•prû=jži4TħD%ñ÷nä€1ŭM!‘ö '”P"IdpT¨çÔëQ2H¤ ùa9=èUiäŠ2͏z:NĈlŒƒıä֗}ainÈŞÉLŭ˘TŜ˙uWúškÌF]ì‘Ëw#ğa<9'ßñëL‰U˜î`£éš]@ґ,#ŝè§`³}ܘúÖ²i´Ĵu[‹+im´3dWLîĥjäÑè“Ş:I<H2ÑĈ›Ñ Ï&šièÀуz–Ÿ$úd‰9ĈċğHÈî l[xĦíä‚ÛW­î‘#íÂ/ĦükHQ=N‰\0H òïYÚ´riÒ -â“Ĝ†_ëTôB5+Ċxm+¤LWĝO§$ÂĊxÑLĜQölá›v‚3˙}cŞÏ¨‰ìÍ´Ĉo06NG z ö÷ĴÊ?j”°;²Cò+ĵ-=ċ‘[‡24xÎÉçuÀ#Ÿz ġÔ‹‹KTı•1ÊÑñ·¤§=ŝƒù×0ŒòĈù ßtp}ˆ”÷wÖ:¨·+s(û<òòëžÄĠĝmmâ‘+xpĵ# Ċn’ĥ˘f7Š^Y> e”íV‘FXúcŻ\­Îµ¨>èĊ̑ĊZ(˜ôĴ¤í°Ò3ó[Ġż³.¤VŬ²eہOÒ˘Îàֆĉke$ĜžÖK{‡]ɵŒiJ÷ÔŒ`ú×WàEµ–âA$Q›ˆ~hÛo̓ÁŝŸ8|BgjMgëzTzĊíµÔîñ÷OĝWCWDtf ;C§ßIäÜÙ!R:¨È#×ċŭTyú Ş‹5Í‘)ç.[ ñŝÎj~É]MüĉĞ_ZEwYÔŒG*}Eq3xx4–ĥàĊ זD9ÚÜà}HŸÖıû¨ZÚîH\dĦ+éŸëXÉu(K4ŽK¸’gÙ0żğïôĜhž&ħ†Ô™­DNĦċž??•84ž˘hÄñ°Ú†¨eAˆ£ &WĉÏë’!Y–žBß@fvîÙ2G·¸&›êŜfĝA`Sp£ÚİċST]’ĥö²–íŒt›"nÌ/ĈÓê–QÈsInġçÏëQ>äšSıv)^nóĴ¤·2éSĈâ@Ï$V#6µÇköŽk4°EŽ=ÇosYĥ÷Ofî|ŭ<+ĝïŠıhîuÍÔÚê5ÔÊÈ]íÀQĝv˘áċû2ŞyŜX@ıÈ=˙ž”Żp)ÑR2TĤŽY#ĈĜ€, ç8¨R˘—`£İ d·rŬÄÎXD›v  Àۜóé@ Fs@Ú7VS†R>†•›.[,yà“ÍjX^Ce+ŜFàÊᕭö°BmŜŸáMğ´Š{%ğµ€Û¨şĵ…·f/>Rj·B6!í­£Á=´ˆ.BâBĵ.}Ç­jhZKhÓ>m·’˜ûBK{míZĈ FK} ëĥòO$r=ϙ0§ñ¤½ĵiµ [;iv‰Ìî½têjۓ#Ç jĥöòßkŬ„`:×5vâŜĉ=^\_$Ĉ—í@ŞGLŽ ‚GR×ĵZ:%@’( :†ëÍ8ñFàaŜE ]ĵžaF·_—’ óž§ç\V ·:“ÈċL˘]Ħ²ŠO1S-Ö4ŠrI‰˜àä¨ÏQĜž´*FÒ-ğ]ÀІĈ1Œž•ž+`\£²ôİÔ5;¸#ĥ!î2ĵ3ÁÍf F)ġĈµ¤ô%”'×!ĥ™áŭ)~ï–Áş6ñġŞPIäÍo7œrCx‰ ^ ëġöéVÚlV,ësÉ}áɚ$‚ĉ<3FyÈİĴë-^Ċ<%5ğħóÄe ԒpGÓŻáIµ{ħ˘Üŝ2[b‘Û"\ P7Êúġ4>5„ıy!G<’IôӘv%ğÔâğÒgĠ4ĝ‰urçg’=k˜³¸Iáışı‘<üċBħGà@é€=jıÒ 5+Ĉ•–0‚5nŒT6ÜqíÇêj(·Á²EA!V ¤z‘À>ĵXħ•‰ì Ċ'½ : sX¸{‰be aFjŠjW i,ku")\4}CÁúv­šb3z҃Ž•™F™Ġ/~òJħBÁŽĵsĝQŠâHeYĜÜuĈjċ&ɲ%ŽĉĜÛ:ËnZcœJġġ"ŞgŽ•-Ĥ2Gàd.£sE0sĈ;ŒRµ´ñH!ŜJ+î\ ö÷úÓc`’+ ÎC@-$Ü"Îà@qBpżJvĦt%ı”Dħ,y;|µÀÛüöŞ€S˘¤bTħÈĞ£Fĥ6œŭÚĥ3òçô”Q@V+ž#ĠĞkxî˘aı–UË?t.?<çĈ %ĥ•œİĉD#RʐÈFy⣳ğOĥF×QĴħ…ĜCìiÜEŬ#S“Oş‘á#€ĥíŒ İüğ♭êżo!L œg†<ž£Ĥjı­BÒU‚ċËyDá •ĜǨĜŜ [;İ­vŒ†v–ÈàçI§„ĠÉ,´uĵŽ9Żċ’gÉŸí\İa ħ›ìî[ȘĈù99*GäAúS’ĵn ””Ë3IÀ,sòŒC;1ŜÌXç9'œÖE_…u[KM&ĉ+‘´_q <`zœñĝÖ>Ğ}Ž [ÍıBċJáPžvÏĤèE [LBMù9Èlc×Ĥ)ħN°E$@ĉE"@~î;ŠŸ0!™q!*r™![ÔŝµGR÷.dÓïWÊğŒO0cò5Ç_WÒŒ*ħ½T­r"W³M˜!n6­Y´ÓÚûÇ"Px·ıĤÄâ2I@ÙsÛß CyFíV­§´Ž<Ûc,ßÀK£ê(Vêi-1ô­‹ :Y,ÀBĴ“Gçş·r0½RW`t>§ĤµœħÁ!ĥ]ß*1ù—ċŝybH£¸y£´!0AÀ,3†ÄnĥjŜħVR;{8´ZÎâF$ĜĴ˜NzdŸz–ûD¸´ˆÈÛB‚;°2=úÔrÜf†‰Ż!7Rû3?—ێè0r}˙ µâ;ÑĴ³€u%×N0ô9Ü?zÒ:GP9KˆZ ™!oĵŒVĴÙD S4›U62îo^ż­ek0)ڒÍ‹BĉDE˜$f6S÷sĠĵU}ĞŜŜÏ´§˜Al†$ž*ĠÉ´É)ì*ıta¸eOÖ¤ˆIrén…F3·8­fğ t–×Q“½\cċäŝ”ċ‘í¤ˆÊ‘[%3ŒŒô?ç½5t-’8î•íÔDĞ–Úî={óU);_AĦGéIHdˆŠÑ’È>˜˙ġÔt÷@Ş„6K ‘èrF?Ï­ ûݏ–ùÁá”4k[&ŽÔ J;PŻ\àúRPE$^^yğĞ@Ŭş•6Ìì¤r\`ƒUè`?Ëˢ+gÇ~„öİf·k9+¨XH:sÇ˙^ÍF'Rx÷­h;5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?­,@ù€úÓ<ġÀ%×ç=+ ŸäiÌêvOLg­$ ;ùoqÁ ÍôïTIš"}†@„Ş}ŞÀı}ˆf1Ê+z*­Bŝ[!t!Nq·?ZdÑ4-²E8ô˘"' ġ§3ž}=i&Äò˜Ž_ Ó˙§ëK í#.PòT9úñJ÷ÇF˙¸`6³ÈÀ³°ù—}ÏòĞUĵŽ Í˜Ó€äsôíCIî35ËJċ²ÄÉ=Í\’â 4¸ pHî~bO9ôíùRbıfÖk‰ [eŠ€ce]Ĵ3Ï$pyjĤ´Ù1++ĴJHPı{qŜ„ÇŞÒĞĦ#ÚÈî}ĈçJŝAL[·äîŬĜvŞb[<9ïHF: Ÿç@u-4F²€Ê 2G>çü* Ĝ  d@È˙<Ôµ¨Ct–ên[¨R2 lÇĞ{%u²„˙ Œ?ĝŠ#tŬĈUÔl-ôÉ!’&/ 9"B o|zTww+ ô7Qˆ‘Ñ[pRs•çŒàô§¸ šĊŜJÚ,H^8É'íÖŻâûÊ--ğ4„ƒ']ÇgOQ{°½Éln¤i‚ŭŞ0Ŭž=­ù7_´L²· dáFùÍ8íd !@·˙qÇĦëLINç;29= cŬ‘cÉ1ät?…UóàNĜö‚2iŽĵ}?*zĥ-nJóÛEŝòs…ΐ0ĝ‚Öò¤˜HAÏéI+;™dU—ÄO.Ĝˆĥ…”ĴŒ8g_AèO­eêzĴ×7HäĊ6=żĈ‹²ġĜ½3äzVmŬÖôòÔ x÷¨Ĥ?8$uâ‰YYFÔ*}Û9Ş,´1ş¨ Î03ƒIm.ĉÉċ?I{Ѱö¸GC¸ŻB­:âd‘†ŬÇûò7V¤%n ıÈÀ'·½*ĠÚ@é×Ġ•äqK¸ nsÜô˘ÀY´1í9; `6AÉ·żNžf‘ÀpƒƒRÖĦÔ|Ú]ɜ…†!†ÙôŞóÚH×f5V^xVûÀc#>ĵQÔm2x#žH ´o½Á?şèAî~˜Ż­U‚– Ĝʨр@'–öGqCExÜȖTL˜•²ÌqëġŝUHZ4aĠ†ÙAcaËj˜<&8ɒ2§°èi°Ĵ‹'ÊÁXsÉĊ$îş!ràżî§úf›&d,ÄĴJrUžŭ=¨Ĝ ]EóĴħĈ΃*ìı?JךèErÀž$dœsì3Pġ)·sˆĤ˜Úípy2°ù›żùúV|ÎĈBàœ|ĊCž˙ ġ"ú-Ĥ“i ¤ĦžF# ç Àû}+I-Sr’h£›ä–5z0ÍR’Ġm˜.ž žŝxŝ˜ì?Ĵ‚ö(Íu1š9gP#‰°e‡ĉCëÁäU¨ï – èü1àµ\ÖWB½‡ŒÍjT>×#á8ސÉvŠaš&•ÇB¤sï“BzjĉíÈ÷ 0+ĞuƒÍeëz’*ÇhY°CK·…Ŝġ˘w&*ÈĊ.÷“~òDˆĈF{qW­mcžÜ%şÂ’ôfùcŝÈíCìQ~Pŭk6ìî}€Ğè:Ôl+’Û"ĊlĊË!ÂŞŽMFöŽ]pŞ ñŒòİŞCîٔ~ĉ%TQ’ŻëP—ŒŞo”uä~>ġ(Djc(Êò0Ç*1Ŝm —r3QÉÉ…PĜù˘Ž 3)<3˙ZšávĊU‡eîN› ùb3Ú‘É*ǐ7dö¤€ħ ›yíĉ+mRrGĤ Ğv™.ĵٗ1ç–÷ëCĜkcnmJÚÜ#LÇ’Œ£"Ħı™b6ñĊûBċ°ÈWR ÔÚĞšíĜÙ´R{‘oM·+1 ä òHëëŝžĥrZÛ}İñó›\2œóéR–Ĥ&ĴÏ9†ß1&̂ Çzn¸ ğ8+Ġ{uüju½ÉêTŸìòʉI°½™²[˙Ĵ*)aóKT+ò™ úŭ~”Ĉ@%ubĊ³ıvħ=ĊJ”#,Œ‡İS´ÛNÚħh'Ŝ$IC´ñ튞êì$Ğ‘,2rÀŽWüœT>…5d9ŒR,6͵uSĵ ğġġ§iÌ`LN‰ç1l?Î*^¨°Ü‹Hš—ò܅Áçiç?*xġ™c…Süf˘OPı$z•Ë,NP.IĦô¨nnĵèY’}ó¸uÏóŞZÄ/r+]×GÊÁ'vϛĝGġ¸Òn‘š`Ħ.ed@aŝ'Ż5QÚ[[Ŭ37•4B)öîùG qY7¨~ÔàÍ$§€YÈ=*Ô ûĞı&!7™p¤ößç½2%ò'G`ÜÜÖ´Ùb[ǝÙçE|°;Ú23Ĝvĉ– O´†!USËó7' }j4ŠäïU’L| ]û’8_h°"Q”÷nb9,ĵê*6‘úĊÁë‘óŝÇıû3E€`ç$àŝUœŸ{Bn ۈJp‰‹ #ħƒëEĈ_òR( È9ŞħÛ !²(M„›X‘{R –écDÀĦĈMrĉ6ŝ^#]Ç Š™!’Ú"-_œ‚H Ċt ĥžö&›p Œs 3ížĤ˘S0Í üÙ2sÏ~;ԧъïbœÎی!²ˆÇñ>ż$·JwfÀÇ_zĞŸí0‹ ‡Ì2“Ĉ[ċúĠpäĤyäç'4 ìH'=ML¨Ž£{¸8çŸL}hĜŒ*’ÌÀárƒnsŝzÒĴ›Q†>lç$rN hÊ9ċO@sÛÒ¤MÒÂ[p ƒĦnžĵ{ñùRĥš{Ğa.eEŒ–a܇ËÓüÍBD‘HaÜg``rzqïQ­ˆ{²Ĵn)D†D.‘è?ʞ`m’BàîèĦ·qëG*H-aÑÍħħ2î éÇ@})`ı(ĈRĉ6)<Œ zúûRMòè.…Û)moɸ*ÒóÊñŸp}y­yú2.K`IäĠ§rÑÏjÒʋĉ‚ÂAFŬϧOqYO$şÚµ pI8:š¤şħôÈ'µžE‚(ç·Ÿ2é’wmˆÜĦ~aEܕÂĉ§¸D„UäWÎŻéĥĥvÈÒ,…‹.Ö,Ûr_§JWè jW'~|ûÎ:ŸaRFB(ÛòûS.]ĉWÂÀàÔ/."GX$*Œ7ZŻ$lĊ~Ñò!<(9+ĝSMŸÈX+ïn˙…1•bÎâBÁqŒ Ì`@féIˆîÈŞÁBŒœc½*Ü|›pKwĉ€%9ŠŞ#'v9É"–PÂí|ħ’İÀÇùġŞ , œ”}(ûd†·fÙ8n˙ŭ!ħĞ$ ‚ŒÒcò¨úzÔRc­óħĈßëR‘$$`bˆĠ÷nAÊüÙôĞC%·(l ín7Ġ$ÉıÌ΀…ÉêO=ғéÖŽ6…ó&2qÓñüjş„~"’%‰ˆpàT‚ïVZÙ¤H™ddËġà˙ú¨è^Ú3Î×'‘ÔUƒ·œÌwsܝĈ‹1Œ–a²LçôÒ#qvŸcÎ~•$²)<¸nǒ‹'ÚŻZÏ,[œ[ĞÇ’èŬGċKQŽ]<Ì$`<”BğIĵ"à“ŝñéÒ­iÓù 6&ĉ&8Ž”qÔÜUĞm`ĜÔm½ÄašÙ׸*Ê Ÿ^*MRh4û_2}¤cċC–>ƒÖ­E[b’8Äê—Ħ2V2zg;ñö­Û{Hm“ˍ2½~nyİ{Ĝ–Uıžh# Ş ‘í ö=j˘§xŸ ĉ '8b:^GëIn• ”7”§$2Œ“ôÇŝş.-÷”ù<…^22XÔÚV[‰†ßġr€  CpÌżğŒ ô/Î~•v€A)R§`Ü>fÇ_ÇúSÖ /˜ŝ˜\/˙^“Ç XĈ4Sœî ó~u ĥĊĴpÇ G˙ú…€‘BÌÂ6nëÁ“BŞċûâžàT[wfä“ŜĤ'ʕŸË_0.O==ênÄ$bg”î8väçŒb…KË3–( ñïEµ+ȋ!1,OJ‰ŽÖ;rê:zŠ­GĈIPAĈ2×ڕ7M)}ʤġ'€)¤HÊç9§GÈÁQIb2Ħmíä{{x„…œDcnj³(§!yÏ]Ô\c&#•P:ä4Ù UÉ2İúµ(’kvB4EZ>DŞáéíÖ£.Ùbc, wç§Ò˜ÈüĈ<7~Ĥĵ>ĉĜ0z˙ŜYTGaC‘qŭÓÚĤö ;ƒdœÔ^KnÊÑHÉ*ò=iħĜÙx-m€=İ”FŻĉo˜‘Ùí‚qèÙ,ħ4ú‘Ô˘°MŞ bT)pT=0};Urèì.ŜëÓiŒVúÓ ñMÁ¸÷íšċu7½ż’Ëċˆ‹žÂîÖc6ÖÄZ„0³ µw gż>½¨i6.0ÍÀ_ïjɢFInאìıb ş­×ŸSQ_"C˜Ġ#Ûóƒ$ŝ=)Ħ˘œ³Ċ);£ FS§Óñ¨î"ÌHfîĝŬÈöíŝ5 \¤ÁYÎww°F>oŜÇ95`K÷N2Í!uċ%ϰ¤!Qž½@K4Œàƒ·*¸}–AÏÏ´Tc4ì;àŻ–sÎ1@ş\:•.Úİ<1в™Ġᘠäú})yşÇ…Qğı= ÉıX ħ'žj“M"1Œ€Ş†S“PKò€v6ŭî2~ž”ĵÀl‘)"ƒûŒgœÔ²’Áˆ÷ŻR Ĥ2H pi2D· ġôĦµ“Kïş!”çc£ÔUa#´…¤É=wzSu9/ğ žFÑÁúTÒ^8„´ˆïâ9ëQm@Ĥ$(r3׀{P² ‘Á­PTNlv(ĜÀê)u6-_s@ʌ}‘Ç·ı—œç·411ğ#œ{Ôñ8B§fíğŞ‘Œ~żıvñ­JċuqħHMѰlzSÏ_ö@¨áı“O´i’áSÎê0HG¨è=êÇb 8•¸ŠâeYÙHÙ¤íàŒgÛĥ*w½/ŞIw ÛÛĵCh ¤÷*·:ğĦġđHéa‰`î¸=sǽ?h2}öçÌ1?Ò’ka.în ,‹7™–Âò3ïU>Ó<ğĜyùÍ+$–Ü6!m÷\|ĝ˙ġU9 ƒžrsLfžÖ8 .>e#Ž£À”J@Ĉ>ı¨·89Ü9¤f;€PçqèW·İ§lŽ27gQ@ ¸n À=†=NϽ9eŒ…'êĈ€)],ı ÏòúîÍDjŜšÂ#íÇ55Ĵ[ŝPp[ıĤQbŜHâ;?=7еyh×<ğß9â§ÔC%‰DöİUĜ eûcĤ~Ĥİ]˘+>ö' 9Ċ0„K(Wˤw¨rĵÀ皯 $†UU‹~ÑÍXYšXĈ%Úsó)Xˆ>iPžÇİïQ ËíĈ3Ċ=A ÉàÓÜyd)> ġ˘Á`S(%ĥħQŒœt§çhüÑlŬ´SŒÑa“Çq=‰}m¸çŒg××½-†%ÙyUnWqÀcžƒġü¨µ‚̳%¤ħÚ4ĊJĴoóÂÙ‡÷ˆ=GQUlào2$˜Öağv̜sÏӊ}Efi*Ü3|gî¸GCQĵž[o”F;z <£JÂğǵLc?ß,8'=>˜ŝµˆ°Â$Èڟ*ŒgŻ5?ĞB^¤DkŸ² ’:ÛúPûVÔÀħ¨r~n>b:ç=¨·P,´ò4““ɨaż È^QSž§óŜöÈùbJ`ôŸş)Ŝn[m£Ĥ É\ÇódġaÓËħ~Tú·O˜È&h°g?ĊŜ£!FĉaǧZEÉ| çڏ-sžIéLh’C<·-…›Ÿ˜;˙*rM•óÇ#ž…™Ï5"ĦT4Émc… 7mżçQÍ&ùP1LbI÷Ç=N1MhTœ4ĦN3ġ˘Â"ÂğG*Ş•çÚ§·ŸË KŜ)  !e‘‰82Ĥ5Áç;ëŽÔş U9F ×#ojŒ…-Ž˜“%·šñ/Ëò°ċèHŝµ#Ċ·ÌOĵ8?hÑBd›äŝè=I¤ĥbX `OJĞÜeĞi^èK–bFsœômDŝ[£îœ#ñ€[ë>{…`VUtlİ5³%´RÚyÑS’Ğò9ÇtŞM6RkĦ™ĴÇ/ ¤+Ĵg–ÚONIçßYŠV†/Ŭ_—Ĥхĥ{ŸZµ Š÷N€İ•Ê~™ïĝĠ9Ô;rr1ô¨jâ)2BÀx4ùŒ³fşĜÚF1ïz„™!ò¤ŽÎÌĴT•$dätǽ2Ë"K°³@>•C.˜$ÚÌ"8_ĵĜéQœ }Ni4ŒŒg#Ĥi‹cÎHXĜċ·ġöİ€%01ĝS* ŽĤ”˜Ú¸ÈîM #¸Ŭ sğ9ú ­Ŝ"ĊÔŒi­7!ƒ8U]ğz˙Z~Uù·`uÛÖ¨} iq4ݽZ=ÉŬŽ }EWóħĥ-“ĈA5)l1‚ †'’1´ŭ 4ħ’PFĉÀèhüíû¸4ŞĴpJİ\P²+Hż2€qÔ7jĞ#*“ĥMÛşŒb’aÉQħާ=jĈ?vî‘÷qڛ‘Hî ï´òĠğdo-mö>xĉ“w-Nġ\â”Ç€Ä~•#“’>”YÙÙIVg 8îjìn>GŒ)ç F\(_ĵŬ2qW­ì„’‰$!>`|·lô<—@Jċ—µóZ—gW)#ŭĴzzĠ”k{k)bŠ)Wpà0¤Ĵî]­İNŝòd-\ ħ&Eûĵu#Ôsǵ\£Z4Ù̅>w@I,9éËêÓğÊw&6hX3èó9#ƒßUfîœúÔ½ÄN­ü FÌó°€Zİ.àäŒîÏ%7° ´ˆÌì_ĉ$àîÔRˆb‚H'òp´ĴEsá[›u-=Ċ°œá‰ÇVSÛË/œ…͒0[éùÓjÈD Ng?+rF@ÇĤMf!œá@ôÁ¨‚y—ë÷Ïü 4ĦwĦĊ0œJáN=ùĉ(ç—éÓژ§•c†"Ì“µrBÖÂĝ2ċ"0Ĉàp€ċ˙vmĦ“y§Ilâ8ápÌyŸ^ĠQ™FĊ=vïĝRW‰ÖH˘"hƒ鎢£ŒĤù^ŬM/œZ2ŠûUşƒŽiħdZH `ġĠI#G!cRù‹J °G…SÉ÷ݘlR£+´÷>ġC²ŭŭ€‚3OF‹~2{dtİ`#F$~#ڕ³–QÀùG?ç! ´U0ïd=œġíڛ5ìħÊǏ›OŻĜDz­ôÔyo´!‡LĈĥí,ĉ{dM‹ÇqÏ\dçúP–·]H͜Âicˆ—\î@ÈġÏAô¨ĤÓçܲ–Éù›ŞírÚ3Ż —ípÉtžPùjUĈÈïZ +[î*ÊßıÉ ~AÇҙ(O3166{ „1ŬŒ{Ԉ|ĴT21Ĉ3PĞœ’yúÓx˜‹ñŒ&œ[ϛnÑċİä/ozž‰u}qmK=ğ”9bŠP~f¸Ğ…ÚITIyÌ ħoÂİĜ–TÊzäwíR2DSä8_BsYéÔ $†ÑJHr‚8éġ޲3gäc9Ŭŝì†FNymÄÑÇ$7ài t!LŠÙbtjġĜB¤M°`’£'ßëM]á­néŜè`›Œ£=ĥF*ôÚöĤ.GqäĊ‘•”tŽäĠ]A¨ÉqvL÷ms"għ„qw¨ìĴZ8̞TêÄô1œéQĞ@$ğ‘·ñÁ?P|›Ħ‘É­aPT–{Ó˘F\`;‚(v*H wô¨ï¤Î[ú “…QÛçĊŒòJ^Š=:ĞŒ‰ĥô#ŸJ“ ¤`z÷İ`)`Ŭ 銌Œ¨À|{ž(@YŜİnL{?)RĵŽùĤÀ‘³İrŸĊÇjmˆ²c€2-ıÁJ#­kI=ǒĴÖÍ#§Ê>œçôŞE˘+q4×%à_]òD£9>ÌyúÔ2ˆä”nžĉV-̏À?AڙObÔÚ`ıħxÖB"pKŞ6‘ŝŭ+&Ösmk+'Í26ÉFñ€£ŒöàŠd“İ$™ĈOÈ?Ÿ½2)c xb1“Pïq ‘”ƒĈ>µŸÂ˜ ċH’0 H~X•!xôĊ& êŬܤ‰*ÀÇ#1ġ^òĈòÉÌŒİŽğ“;?ZÒJÊ蛙ÒÏó…Ô"Ë ;#,~â³Ôʗhge ׂòİ'‰!ˆ¤¨$™ħ‚3´QêúôíĈ@H,9è<ŝTÖxù0}1I€‘È äİ*=O£˘F'IPħG÷7Ħ*~µQW`v6JBĈÔ­³!fäçqàcÓıüŞÚhz|rG"Û¨hÔŞŸcœŭzšĤú £ĦibÊYy†LIĉÎÄcĉ =¸ÏÓë[¸â“ŽñÄ–J߉‰<ğqÏŻé\„²I3 Û+°˙?ÎĤ[ˆ™ħçe•ÉĊ!EĜvç$ô8Ċ@8Ï^€(x  — ßëқ!>iQœNôÀ ;†ŜÜô§ïTÏ$QèĞc&€Û›ĉâĴȃ?ZXĉhÂç šáBLU7qžëW<´Hò…ÀÉ2äú~µ˘)ĈÍ êÌĵÄl€~ësüŞŝ8¸Œ4¨#•°Bˆ°ïŻJ˘‡ĦÓĝgpŒ;´˜'Û§­ekR[gµœ ċ0Ú0èG'§PIü¨ş!”@Ù`‡béO.ÛĈS`Ï]ŠÍˆlŒJħ ğ'ŻÔ$žñß4ĜCòúGnvûçšL]›g”Ûŝî9;Äq™!*]-Ô|ğ~¸ïĊj“hLÁq+LByĴFU˜ëè*hĤ´‚™ÈFŒŽOùÍNÌExüĝ×w•µdÈÜÊ9Ĥ)àĵ†5D$o,ĝA<~T³I4íEPĜÁ<R?­/ ÎŬġ •‰ıäÇwïGR6ŝ\˘WşŞ}:Vİiv ف&P|éžÛWW9­ëzĈ{}š4ĥw1Ĉ>ûHŬ•;°4ì4ĞĞyiu ċ#sym€¤·\ŻZҍ¤<:ŝ"†Ĉyߋ5Ar‘$~SËuÚGŠ™x$RѨĈr펜à{ÔËQˆ– ç‚*™Ġœžvü[jşuÜÊ?JbFpWz”ÛŻÓL€q’ҀÎVÈSœzŽ´ 1íڀĉž­•#êYXg·jÔvÎ>[?ˆ#KVÀ}ħ‚;€2FíÙé]#hĥóŞİyq‚U@íÓµkídgZépÈ\"òÛagŸççġïQßCm„‰BËÔâRÀŬx4ô#>ጀ £*†[f@ġhŭX/pÜı 1œġe#ġÔ‚ò°éLVÁÇ>ÔÀqÎÓÇ×mE!Ç4ö&P @ÚÚŬÜ2ÍkğËîëòŸk37Ċ/•ŠF¨KòáŠâ^âEw ]Kq…dz–À`,î2ĊħÍX¸Ĝ¨6FċÛİu–ƒ#1ìb˘=œx"—ÉŽ` qÀàÑkµ ™F)Ӂ#È1ìqW´ôĠ.Z4ĵYŜd/ÓŞ$êmcxĦU‘ƒ0$wİJ†Ĉ@8äfĦ½nZ+ŬßÚĜĈdı¸H”ǽUĥ×ì.î%Ž ƒ¤)IGÜ_lúġü¨JàgévÖúġÔúÔQȄ˜ †@@~ñ˙hšÈñ.—gezYm‘VDÊ"6ŜŸxıûĵqCHf0‘Ğ Ccž¤}=i…˙қaàž7t$Y•Û(9…zQUQ—Ŭ,=¨àÊ[:!’Ç ÎEH}2͏ċQ°@-ž€SĦ£Ï<ŭ ^GAï@îb ÙŒWE¤Â?³Lí}9Œq"'O§5QCEy·2?ÎQ|¨pIü¨K€ÄùĞ•ĈÜ+‘Çš­‹.ĴVIf>x— ‚ê>˙àGċYÓ-ŸžL Ĥ?áŽ?o`FQP.zŽ˘ŞLzĞr^k2XÈĝşİ=ϧ´²p6İ÷ŬœÒ>BHê• *‡hlġ4À~d/OnôĦ£,ĜÇŻ4ĴÚŬĊwn“Àáq•aŜ™²G#8g%Žp[[-¸Ëë'ğ,íöPpŜ#³·ÓÌ@Hî%Ŭ°Rnê3m­/e\o;Ħ•?:™­/AđHÄz)l{\Ĵ˙fß˖³v\:ĠÓĵ;{s˜n'6ñŸ›`!³ĝgúvŞP}BĉĠ‡„,mŬžä›Ĥ< …Jğ<‘èñùvzt’ ıÄ*1ôè2ĵúġÄW+iW2)PÛ€éžż•iN÷2[+Úyjäç÷ ‡zv°ÎKWŭûÇu=ÔşĴžjHÇŽ›Xp:#ëXPĵWzĊœNŞ–Ż*¨‰Oġ GĦC6Ÿi;¸DiÜ3÷ ÏÖıßéÖSŬ ı]üĊÄlsÔàßİĤÓ{ÉŜÀö×8m€À'üj´ÌÑ8ÊŬH?ZÉĦ‹%ËĞÇÊs‘üİ…ŒXòÉPiUȘŒœ{U¨£É$·ƒŒQdKÀgôĤ\J¨=z1éIX Ĵ&‘YµÀ@IòÜ:s‘ĝÔ·sié§²Ág'šÌ’f ´wĈ*•ş—ÍÊIÈéÏ^Óġ(­ĉ“ψËœl Ĉ?úÔl4[dĥrÌİ$cĝPñÛ­D¤$ “Œ“Ž@Ğ,ٟDˆÄ³*[Ŝ‹œ{˙a\'•6˜ïġèjÂ*›İ– ònÁÇòĤĞ——'%˜ôìÏJ2[,’äĜ°ŞîZ)>FÛÛ#Ò,ï@ğŽğŞ2à3L™TJ7òĉŸ¨ĥœ’x ·ëÛÇoŽ$XtU˘ş{eÑ#‚~bǵµùž˘ħ%şÌĞûçVoöFĴBò!İt—WÀϓ•Qġŭi§¨™ı gL”)赝q ´2-ÓÄìċ'üİır脕Ç[xrÚc²ÜN[Ğ<­ŸÒ£m2ÏD&ö1pÄûÔİjQ$g²Q†I's^$ĠïĴ58"ù6Ó)£@ï¸{~B„ğ—Œe¸{‡tĴŭᴞF?àBĴ7Ä5¸ħ;yŬóóíEâÊWŝ#ĵÔĥž9Ù¸1“ıq‚ ‘ߎ€÷wĥħGŞĊÑ]Z$~aS…d>¤~#ŻŻµ5µĵSvĤĈ xÙešàU6²/!{Œœqï\äĤ{+Ĉ’e¸ŽwV-½v6NyçŻcC`HJŞÍ áäê}‡SÓġŞîĤEID›Ĝ˜?ZÌ™AvÂó֝"2 à ê|€‰N׊‘duçyñ€h~ÈĝP1Œ)ÖñÛ\ÎĈêäÀ¤…Îxô˙˙ӊhM­Ë5ŞĊċĈ‚5 '˙ĠÏĉj)nĉŒÄÊŞĵ†=èÉ'ı™Ë$ĦIĈn#ŒŞóIsĴi!ù™ëŒ˙,ĉ›XäŒsSÄÛĉ^0TÀëPÄ[”\篿Z Í’{ç§µż$sĜ p”Ğî:`Ów€á½i|ÎX“Ç'ŜŸ…5&Ö¤“I.A,ĤLl>ëëôËunֈ‹™ÚŜħŭ“$@ÓĵݵQÜÑ˘êßÚÈòĴ `áwġ>˙J:^µ ĉĠ nó•žúeŽGđ"íÏÊıèzuĞĥ×ìV–6h-n ĴËk—o/ıŝU‰ïEóR¤Ç!"#ÊúzçúU;$"ç‡tÔÔŻ-™–o¸ŝlhуĈvŒäJÎÒ&[K™üèŜ8.^ Ħ6“ŽN=²HĊO-րdHûYJĦäc4Yç?6;Ö[ rÁ¸½A9§ĴäLòM/ +H$!Ġ•‡b0iĦıäUĝ‘}‘İb}]‡Hžî)&‚X]#eGmĜ OŻlÓJáħJ95)ᆽ46¸¤“ŸZrĞ? cœš`9$‘[ï˜9ôôİ‹†.›0ƒ<)ϧ~˙!—¤²6ñĉhänHŜ„nôZ³c¤ §iá²Ĝ2clïP=GżÖŞÀkGá­-äWşĠ" ı?U“HP,‹¨M;²œ€ĊHìÏjj*Âf&ĦmmŒŬ­Êg#TŸj§°a‘PôòÊíÈû܊–Eˆİê{f§p='š‚ŜÀUH€Ż"ĤŸcŜµnm*Äû$d![tƒ]R×S4sWħOc£1[ÖiQ²÷+‘ÏP(ÎŻ*Ñ<ŽÖáATˆŒäóÉíC] ıĠĞ@ÊrÈ5Zk‰ÒàCùBÂNgÔ[]@u¤²›uĈ[O\~5ŞiI77“ĴR¤13ˆömYrħԎ:°È´ëĝ§·ĥĥâYyL¨n{úqùW7ât‹y ¸ÑĠKgğIˆ·=ŝ”dµ?´Aq´hΖ?(l P{tĴÙċgvÜĊ‰9b{ŸZMÜfĴş”ĥú[H°Ì.mvċ p?Ĉ·<7­iÖÚB}˘Ò%’,à[ġ=Îj–öbhMvŝ×UKHÍÀ†j¨qŒàä7÷N1İĴ E­n­£šÒÇìħĦ–Ŭç““ïJM0GWàŭ>ĊĵpO$Нó?ÊŞG`3SÛĉ_™B³0’fÄ³żR?*iÙ óۙŒÓ³'…^Š=µ$@—0\÷&ħl ¤bo ä°N†– ™!>jÖ߸7Ħ9€fĦ}.Ħ8–w,ĝĈMUĞnú=”óÛÜĞ[𣓷ä<Ÿj°—J4ái ìyäÌìxF6 9?ŝŞh q€_ N9éôÄx<ĥqùš’Ö¸GĵĞħ ƒÜāÈŸÊğ sKo4BĝHé"Ĉƒx`q×éüê˘€ĉVÁ…¤·.|¸À ğÎ7ĥ@8ġÁ­‹XÖÈeK™\8¸eo›vH`GĦR:vĦG¨ˆ˘Óµ ry Ä1ɽ˜9 όċšş<9¨½ËDòÂdÚ•ä'h$×ŻCùRiÈwDW~ş°µid–ÜĈ£-óàĤkûg–Ĉ5*NçSıp9=:Òph Öĥ–vM,ÓO ²KċĈ=ÈŬ1“ÛŻ­VĠ´‹)À•ƒçkİëŽÇò)òép3÷SíOLƒëPEáŭvTĠ•Jcb.áq§N•ÔÏ­<7ËnĥäĞ É"°(Gıí]1•Ö¤ĜŻĤéé¨jWÜ@ñܐıV'?6NÒ>°7Iqċĥġ;ħĵí'9é҆ì·¨Ms“µœ 4î£6ÑùĠ_ĥ(ÓâÌVÓħĥJ$ĈĦw‡}èOpİq{s+JÄçn}éŠĞ'Œš+ˆ-­¤LcaÎĉ7?·+Ħ™.ĠĉUV¸QŒƒ„`}E,Úüמ–Êċ•ċ2†T}ŜsúMîàı ß½O‰mıe´YÔĵŸ—#¨Çħ§fV%¸)û½À{žÀ×Bĥ÷şuĈ£äÙÇ7–QË  >ĠI0)´Ú}Á*ÒÈf·Ĝá*1ġĊCv–ۛ{§1r›pêp9<ĉ-`GImâ›-;NH%‘Ö6P˜85_û{O:Ĥ“$LÑñcÛ=•„rÚöĵÓ5˘YĦT$Ÿ,Üòük7OŽÛûQ†£d‘‰„BÙ*FAíÉړwBŽ e²3ÛF%Kc.ä xż˜Ïµ6ò{ı`ŒÜK,‘Œ0,ĵsßñÇéYğÜfvy§†!x, +2hġ·@B,p0 “Úş×Òîî#²’Aö”B´6ò…AïƒÛĴVŒ—ݽaow²5ԑĥîôŭ*ġTÁ$·Hħ~$˜[ĝŠŽ W;m¤_Ċxĥz~ >Ï!ǚ˒„žÇòÎ=ê/a›6sO{q{i MonĞ·2ÌòzN{çókY½ÔcĠŒw7^lö¤ “h‰Hfl2˜&Y£•çğ”ŭE5Üğ–8Žxô°y̖ëı c’8ú ~ĤĴZ4?Ù·Ë$[ڍî|ÀĤsNâ*eM½‰Î?ÏSÚFóÎŞ™RÈ9È۞ô€ÌÌÙbXžäĉŸˆeŠ@Cm!ˆú” ½†êÖxMĵl˙ëDç‡P8=~öġŞ‹p>S–ÏNE1?aU.ż|¸ùşuϧ˙^ ¤0#5½Ċ&™ÁN=OAú-ôÚÜk” $Ci}{}j½ ]nFÔıúÇŻj…@’È¤àŽ‡‘˙×ĦfkSQRŝpİÓ/Òş8üs¨ÛAs-ŝd‘IrX¸<ä>˜Ğ‹l[NĤ2ĠâiÚw‘÷³°ĈNŝ•R[4†ïfÛ}É|˙%ĞÙĜÈ˘¨C]Ókt5›m§u'`ğmâQä¨éıñġ' ühž¨Ömu%ĵ›mYTÈĦȐí?0ú~|U‹,î­tĝ.<¨Z¸rzĈ@á<œœCCJàŽb;˛`Ë/œĥ·K†ÀċĈIàŸv?Iäicím‘—˃™G “éŠÉğ–AzĞoİ΄ħ™Gzf­‹ëW£ƒÉfş› Çċ zŸ~{RMŸ<ŝvÜ(TA€ü˙Zéĵ'Ì)(‘ÖMÁÂJ§ËmĴ9ëĝӎĴ”dçŜ²µ=JÊÎ;Ĥ¸ŞFEmÄg–*Ŝ‚8ğyĈ£ŞO%³ÜZÎld((£`p™iĞ:ÑPX;ç!°KäqÏ×97ĥ¨edĠÖÖxî­#"ìîi$sĈâz;üê•ŭüú…ǝráäĈ7` Ô·u`+Ә(U*Ù'¨ôİÑV­ïäĥ´–ĠA—‚ĝù€#}•4ì"$xˆPɆ“ž§‰#‰ V.Ò ‘żz°>ĠT\ò[=3Ú£¤Éy§Ğ¤Œ!‰ŽyÁ9Ü~µPġöĤÀ;U›kay%ĵèí;ħ 8ÁôÇáH µ­5tğï%%óc*_'×#·9ŞñŜK Œ+rl`½Ĉ)½}Ħžà"Ĉ€Ú <ĥ~Ÿ­@Ï=)zÛO’òŜ 4ŽÒhĠI1Ž0O×?Vŭċ­ÁV\:6 ¸ïî)µÀëĵ9mkdµxî P[iÂ}:íTmPAÒµŠVı#³X÷€Aâˇ&ĉ !9ŝż8#ùS°ÄÖ,YàÚš+„ŬµÙOpzdSt;ïô{[7g”Fĸ=T)>ĝ"Ÿ]I5ـœT+s£4mĵ+;Fy~tÄf^xŠ;Ybƒì“ùÒĥ$ıu!kI0r…_l :Œċu [EÔÖîl*Ĉ¨·òí=GĤ@ĜĴğq<$şĉGÎŬûˆçcšÊI"‘§ĤĝrT-rfŒäí’ÄN?t_Ù ojñÏ ÜĞŒ‘…òĈ1•úUÂ\Mœ4ñğ{xxÔż 'Ŝ™ü몟J}7E’m>kˆċlV`|µÏ=:üzTÁnû ħ­â§°ÒĦX/öóï7Ĉq·ŽŬñÍ`Ŝ^›Ĉı½ı…g””à+z 4NIô ˜n.žˆöŸŬ–È {ûûŭk>cel†$;äY~gÇÌ@ô9Ĉ)ik$ş}ÓéqŬ,Qy!ɉWĉ|°÷ġĴ·…Ó~ċĈ†ÏcŝEK‹@ˆêh<­’™’íçF?­HȀÏéÎğXİĈGRE2Š)XmrıdÔĥñĊ4e˜B?ĵA ~TB<ĴŸ=6àb´´MNêÖp–0[‰ ’YÇÌ@<“ÇJ£ÔĞݤâpóĦ@üŞ—ŬŠ‚၍7’n{…'Ğ[Ĉ"ÖÖŞ )9äž¸Ş”0,Ù_\XËĉ[ÈUżOÊş]/PÒeÒIÖÖ7šIİ óm'9§ÌZŞۉ’hú9KŻíôıÇċüé×M$ˆ²4k¨ôç˙ŻP2µ†.~\RPVáğ¸³eh!ˆ‘½{îà)­V,\|ìā…Í6“wQ@VÌ~%ĵ]m£‚ç'bwġĉŞ2ċÔFŜ‡d×úÛĉœÏ$‰# ‚@¸ëÚħôŽvŞŝ5Óx{òAuöëkÈe ¸GŬı˙ ˜FîàÙı6§w žGÙĦšáWs"HW#ž™Ĉ ]bWÔQÌĥédÀ&bÜd:x†íħ&İe-żŠ9Ûĥí×ÊlĉuÇ~ߎk ı„ŭğI7 ‘ì•ÇÊÙùĥœ úÒĦnÊ6ÏJBxĤ/l–²‰…µĵkv’$•20p܎œdúW¨ZMeu$3¨YïryœġZ ::Ĝ›Y#•c{™cŜ”žwžüĠ OĜï[Êr+œt Žj òLòÉàœ:f£ÏéRŬĈu—$Ô³Ċn¨Š¤#O$~UDkÓ.b–$“z’YGñçۚŬOÈV0Ég%‰ÏsH5F€´³µ;oĤ‘¤ÚˇĚmĴ–†xÔ@Ŭ÷bÀóÜqôĞJ)ê#Rĉk”›ÉZ8È À~ìqÀÚ:1ǧ½sϞws×֝Dş "LJ‘Û œgQ:4s4nrPíÏÒ˘Ú e†_²Ó$ğh’>^l9Tcĉ÷ç#Ş×˙g‘°b w§ÊÒ¸C@¤0ï@è3@1ž(˘€ R {‘@îîÚ3j<İ!8/mgp:ŭ}êüÚĵĥúĜˆ˙y6ZI _'9ĞŒĴ ğż¸Ġn ŠS‚еbA·öçżNkÒvé:jÁtDn¤g’OAï隸;Êâd~$ƒ1uçˆ|°Êù8%`ԊçġTšäÜéÓ9˜ów+ß'‘œwŞ’¸“,kzŠOĵÄEíĴžfġÔc¨È°?ŝşĊ ¨]Ĝ˘b,[äŜğˆÀ u˙ġÒĉIŽÚ[ĝžö]Ifşı"Á&8†ĝ˙=ëbËĈBêġ"kALy‘¤hġİç ³ZÇoòŬÂĦRÒĦ‡\B9ü둽Ġ£¸ı•Ä€ Éà\ı8ËëU'd+ÌÒ#H5 í!ŻċÔSN×ËyŞÒ;ĵ1×½eäQ\ġ¤İjóMşÓ› 1bès•ïôސ—²H$ŽX„Í·~yĈ;œÖ–iĜH¤rҝ£’sÚ„vÁú†³…[ñ{òi§˜ûB—88iġÔ ]>4ƒFı’PQùWqùXAëšËı*fb¤yÊôŞ’²B[‘‚T‚8#Kyr×wVbÀŭ*:DğCÀ‘Ü #` .ìv= k藏 \Hŝs" QħA 2HÎz ÖT²4²v,Iêǚı;ĊÔe OGĜĴn3éBv”PE-H²² EĈ܃‚Z·¨Ĉ C4lż4`şŻñïTnp3sMî…bXU”óp§–§—]š[DÜŝl m"eÜ~Ş{}*ıÄg^ŬOu6û—fq7EúĠĞ£ê—i GŒBŞşdHìŬÏ2yôĦIŜàuv².Ÿ¤(.GÙı•0Ħŝ™ö ˙ÊW VU'i ‚Tò3ïÍ\ôHKq--ÖUf7ĈÀ+[ÛñĦ­óBħ ÏġµŸ.ƒ;hYŻĉKħŞÌòÏÓËÏq޵ÇkVĉÛUž<7œ9Ğ’÷@£JċJĤ zÈO¨G‘XFàOñ ġüóQPqİY#J—Ó\8裠¨]‹ğ1êÇ4Û¸„ÉĈ;RRĦˆ@=G­%-€žĦy‘Çġ (U,À(É4S£rŒx#żj_Ç ÀӁòQ}ÇŻZÉĤÄĴĜÍ4S"…f(ı!—pQœĉĈ]Ì÷7 q)ËÌKœ §§µnÍ ³ĜM-²¨Z!P§’çĜŸPüŭê·l ëqív‰4ñEċ£žŒ;dzûĠ+YRYYYC$˜q÷I~4îM…Ñ™è,D`Œàû{ñW5ı"2´0Ç ùk‘,dœü˙…kRΑŞÍEœGr‰aÇ¨o^zÂŞë‚kŭNĉHTH9Ú=IġÏjÚO˜•ĦDrjŭ…×î^ÖXšhœäĠ¨ĴâìÊeԍmíÌñ|ÑGê¸;ħûV=Ğl­!9g9;5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?­,FwLóĝ¸Ç|…€Î1iĈ@nO <Y@y<İ8íӅ ĉúwŞš!ĞH¨HCósÈİ…ËìRÓ,cV#§òŞÜ¤òŬKĦr\dŭsLš'…ĥH¸lg”8SïJlÎ~oJc%Ù–Ŭß Ó˙çֈ0Ž7=WqŝT!Ñ>-Ŭ@RÒ0,Ì9sÁúĠċÔîâˆGäĈ¸ˆùż öĦĞî3>Bevc““É=ê]BÚJÛ>‘·.ĠÎÏZL.Xµšy#ÑO”a·Ë` 8ÏNœüĠmhĉóÊI<ĉĞ` ޽´˘úUĤG‹ÊHö`äw'Žy˙=éÀя(0|’wt°Ğb[ħûÒè2ECİn9ÛŞH•Ac 2G9îsú ‹~Ö`ƒ+ȇoñ¤ĠÁ‚é-€pż>8È?Q[QÛj·ÑââU´„˙€ŝT˘šmħ˘amĤù/ >p;ˆr*˄Šî ¨v‡$I"İÈS“òóìzv§£µn¤‘ŝÎŞ…‰ÀÀÏ'5jY2Ä%vrHqÀ=³Ċğ Ü}Ô‹0OµùN6\ǃôç­h'˜Û–.3ƒ·ÚœtV@‚I™”€>>ĵwĤ‰X;ü€ġ8'?ÏŜì9R,ˆÔ–ÁÁ§V3Äżw´°ù°^üz…=n.¤­-´vÈÄÜdġH^}ıĊFŜ!†Ôy/+ħĉ 8Ç­$­İ’eYĵF· m·„†Vp§s/ ÇB}{V^§ŞMsp†ŬÙa‡R6=ĝîÙZšĥċÁĴËĞ­Éċ¨é“Pât“w>ôĠżúÔ hÁ`¨H#·ozöŒ0JĦ€9^G‚.6ç>½9˘Â,Z4aI>Sƒó‚9ĈoCĝÓî%yl€)jÔ½XúŽ—L¸yÎͤ6<6}*le{Ĉ…İÉÂ1ù€Ĉ(Öábkxg’6µÉ—'czœöùš­oMÛTt\ 9;Ï Ħn#KûÛ+Ċ¸*dÄĴIbŻĝzUħşVù$àŞ0ċżTĈF˜ùħ`öŽıĉ£\1‚‘êqI;ˆ‘¤CrHy}2FëíšII”ğħX•‰*‰Ó9éì(Ĝ =F$t’8ٕr†H­yĵ¸ ³ ñŒŽ2N}ı¨z²‘yqċÍ1µÚÀŒ´Ĵ9'9$~5A­î%23‚pُCïĝÒNڑÔèĴôğÙ2Hò’28 ôúVœX-êi'b’TY~I:ú0ÈŞRZĊh Cq-ĥO|è>Ş{QYĊ)î&2G,Ëş8ÛmżCÈÎTóӊħüDS£“˙Ö§Íet+CçZ•ór¸$uRETï">DËç`|¤0ıġ4ÔµĠċâÄg@ĊÂş·8ݵ™­j–hŠ–x’\҅ƒßŜ.ä¤bĵŻw(ó$½*ĠëH!šĜE‚)³‚Ó1Ëŭ=?oħFƒ€xÍfŬòŝXô°‰-TCnÌÄĉC…P>côĤKhì˄TŒÎ=iĦ‹yj@Lj¨Kgš€ĵEYÈQĠq’=Á÷ DJcĜÊò0ÈïNĥÌ,ŒÁW‚súUl1òđ…h”şç†?Ċ˙Ö¤`Y,U\áE"tÙµ·d‘ž;SUKÈݐ79íBil]'pèÛà·b?Î*͌--ϛ*î8'İŭ)=PÖ¨ŬıÔ-­LrJ V9WUÈ×½A-ÒDĴp;ïa†ä’GżAŜĞ›SVʲŬ,lċĵ„üÌHÎOż—µe­£[[ Ĥa¸°Q|2œÒ-LşšÓ´ÒClʕ'êı½Šàƒ#m¸ÙÁç5Ŝä”î ĵ’˘EżbŸ™™‰-˙êĤ<>|~lpˆa†“q;ùÇ~§éT†WH¤Ääm$úTĤ-¤èÈy;NJŝÛJÚÛì+ÒȲ$‡km<`Ô÷·ñÈrTŽSŝ¸¨eÚȐÉH­›²…w^ê@ŭh²o³1Žp‘ĤIŒÎ9ŝ_áRö Dı[8Ŝ w…|§8ʞsùäTË|`•‹Ĵ`ĦżŞ$û ²H5+ñ*$Ž ú d÷"ĉ6>g³g#9ߎj£ĴB÷ ĥ?h“Ë#+ğfbû~ʟs£\£7be?ğ•08÷ô5QVBKkı ÜÄħÌA ŽŽ;ŝ>Ġ•}û[3ÉÀ¤=_ʄµ:êêIJĤ §ŻŜĠja™!Ÿ†\a†kM•€³5ì·Zà 9nnİÖöŸjF*ñ…SÉ<ğ~ëúQ}ıĤò*Œ³ġ5ó~éL’wÈá~´Ĵ4Jb038}Îz–ŝDÒ•JƒÜr0܎ĝ—‡ċĜPu$óùVjrüRA° ۘOċħdÈ7qߚ`_Ċ%D„ñ’EUŽÙ$lï8Ħj›'ɳÏj"“ÍşŒŞ*`88çúP.n ĥ(@]ÇÒĤŠo[i@s˜œŒ˙JĊ%£ ĥšú%;·)ùd20aĝgİĤ&#Ì2À<ĵ#ÌÁúñŜ>‚ĉ{Ĥvϓ¸”F?‰ġĤÉ<’ FrBôް‰ĊÌBĞ+™ ùNì(ü;÷¨ı%çzRhVG•Î:“ôİÒ8Ĝ+ma냏O­ €È‚)ÜíÑr‹Œäû˙žÔfĠ`F9éFàIMċ´KÊÈ~`OÊx>ÜÔİ™?2(IùŸġúž”­ ÷V&Šîċ…bl°FÜúv>ıb°” œŸñ¨w°žÁ,â)`ı‘@€lÄÓĊ´ÂÙe2I£?éEĴĴ+ ̟ëFġb€}>´ħ\o3{FTás´Óxĉ’~èt.Ù\ZŜ~âä£ı'ĥdö>ĵÖğa-crvñ–êjÓıHçġ‡‘P¸|²ĴğxéYM$ڝҏ•Iàħ8:ši%Ğö›o=µÄ‹l"—Œ'½‡%ä‹4’,ÖâÀ/ÍùÓĉĵn ıŠ ĤƒËU;²JùûUÍ:ÖÊŒÂ@[n rGòu°-ÈI#yÀçè)ñxÇ0 ŬB“;‡œc¨äş"$u†MĴ8 }(ĴˆÍ†Ÿ„ äŻáIö ÊJĞĈŬŝ‚˜Ê‘ä9!C{šĥ^ƒfÜÈô¤ÄBò4jUTvÇzU¸ù6•ÜŬùëO  I€EˆĞu$vÓ¤Vûbˆ†YS c0BŒŭ goPi>Ù"Âĥäì‹˙ŭqíIŒjIn‘0(ĊĜ`3Ÿ•G=j'ÚÑnVùÉÀZ›2HO” `ۓŞóŸLsV†K"°İ(ŬJGÒ¤™#v+lY”a~nĴ}İ0cĉò4hX™@=ştŞË°>™¤µħ–.rËÈ5i­ŒħĈË&K’Nîĵ‘ùhÉäKžAZŞXùċêy­$Û,İD$¸Ù)ä}‡!òñÀN:“ġ¤É"—dSĈcÉ |Ù=xĞĥÓN›ä#ǀósèzƒB¸ÇĤùë+ D݆,_pEäŸ÷cMş‘^O²Z}Ş3À!ö8àsĝ˙Jµ˘°ÍUӒċ@’Ìò2ppÊzġéÚ³f'›jŒaPĥKğ.R’8Ġóu[à¸Ú„çjôAí[ĥö°Û(Ž$ùsŸœçš†&Vğ–u¸)áĈċ]¤÷ğóT‚‰‘Œ¤‡i û¤Ž‡=y¤–˘Dém(c‘)Œç•ċ³ì_ÒĤ[¨Ħ …W8+–b;RiDkB;(Ǘ&=€‚y~ípOBÇŻÓV2l&IK #9ü:8ŠŒ,Œıp%@‘‚(Á'ïmËĦ¨&;S Ԝ/ŞŸïN÷°DğlÉùG^£­FŽŒUrŝ”0)ğğtÎ}jrLR–(h˙ëÒ¸†ÇĉK.YĈöêOlT°İ{™Xì!T AJĦĝÉ-žFĝWù2È:zcc#|‘•‘ŒçëKf”ħuCêz~”Òr§ıÍ:8^GŠKÀè@\kYÚÖËĊÈXÈàg˙ŻUX,R üÀeoïr?­à ʂȃMhPd™TžżZ•kˆ’…ÚÑà§Ì$ Ÿ­4ğnfŜQ˜qßëL÷ħàò;ӃoÉòÁġëù’°ĊŜ]TœĜÇJ† AŭÓTŜÁ{ v%ƒ‚3×òİc×n×a&rĴ„ŒôŞh,oOkehöáìšO,9‘d?30ÚN{/>„5>u7wŸÚ2Ûf$MѲIü{öÍrş‰şxï'UE¸bħÀÀëè)ó7¸Ëf$~Peò× ~9üyĊ#HcÛż˜à(ŝ#íYïİ#f·ûLn E`xn£ñÈĤ–£E "™·o1î#+Àġúĉ£ı% À!ˆ,r=ğcùÔ5pjäÀ÷ÎìtàS‘‰—ğzU/#œ{zӋ·|ħġ R!ú}x¨X™$,£;xPz{ŝĵSCEŒ–ÚÙĈW< 8Q‰?~ ?OJqˆñU$EûÄ)ç?ŭéRJIŜcŜ§“‚ =@ mÀĈ3ùnYd†9ô4iĤı!Ç8c€żUCıcż$zúP„!‹Â瑴pjYŻg0àÂğsÜsŸZ”µĤŭ‡p@=¨IÜ´À2ŞÔċ›c–F ŻA ‡fs‘•ÀûÇ#Ê—1²œġǤÄĈìsŒwİ‘€ „ùó˖Ç`{ġèR –îe„ÉreE">âÑB{òñÑMKŸ²@÷]ù?B|ĊÏrGEúĠĜ˘ <0™nĤO4FWh|•<íÁ÷öĞß<š´—*°ÛË•ÌCŬ ž{qSvÄZû}̑ÈÑĞäò`ŝònèĠ†ygĉ>üÔ'}Š··3BDpÜ´ĵe°¸Ç5Mn§`ˆÄíc‘¸äßUmCRkfxĦÏîógd‰óŽ?OċTd$AÎ}iŒÔ)ž &šƒ,H%Oı î?O_zn~l–8ôɤM‡PŞì 8ñ§QhÁë@ŬÁˌŽƒôİG£żsCĜ”Í&T÷Ïô¨UB˘yaÍ D;ĉµw˜n8ÉíLhžŽ07´Ğî+VîlžxÁ/9çĦ¨ÉQKhĠBüۛc˙ŻTnU2Ì31íT†"DÊ#l°äš€ĤᐧósNŭKo8Œİ0ĴĦ ÷İá‘ĤNZ4ù³ÊÛÖ+HìË· !p;âœ%u‹psœàŠVB"!ß.[Ħä÷4‰‚pr=(Y˘lùÌi<íîjù¤wqLv'"œa ÇÔw˘À9D-µŠŒdžÔï*gO1cm›ĥçÔ2X縲rŝIGQX`ÙÇz[ş”Ë"ŞĦı;GáNÖä–9'+ċĴC•Àŝ#ÏÖŞX[É,¨X v*ı zÔ¤ú‹SAcxı™1ò1֒Y%`äo˜`t˙=:#J¤–‘F˙(Á%€ç5 Ñ%ĵ!Àe ĈÒAñùX[•ÚhÍÈ-’Ĵ 6GB;JdƒmğD oĵ1Î:ç4ZځeCžFqéHÈşsLb—`ż2EĉÏc¤ûĥXíÚzOAŝ•Iç’ĜÚÛGpŬh{Ù¤x—r!É<“ĜÒîg¤}œÌÙ§˘;†‡c|âIFüjŞĦwnq@ˆı.äԘ*t äñšcDÎ'{£qÈ NŜŸáH’ǰ—ˆÉêÌĉ–‚&Œ"ĞͲ`Ħ†à£ıúĉĦžMò"jç8 Oĵ9ÎN0)­’1ëÁ§`‘‚*Ŭ½Û$f €FĜ*÷ŝĵSê |é “p)ğݍ0sÈnç´†1(Èäîġ ğ8¤™$ĝ•á^Vàqŭj3Ċ11ž™ `ÖmM$ß'÷AêĈ›lĊş¨ qT˜Ë–Î÷’ÈŽÌK îcĜ?[³TžĜÙG!R²n$ĥ7Ħèx´İ-Ċŭ„ú€–\Ü&6·˜ż*û v­;‰­üŸ1RÚd~V<€>£żÖš’lĞĤPÔÖ/ì¨a†(š{— ğnŽçòݐ„Œ‡÷|0_“ċú~u \.ULaĈ89<ê9ĊRž0äîžÙà{TÉ\LĤXċaċ 0pzġ?ҝ0–Lb ‘ò‘Ó=ë$™mŽRÒ+üê@Ï9=ħL‹pu›ËÜÄä(è9éV3AtûıT•·‘€ô_ñ¨™]0Œ¤z”Y –İäŭiܒ2>bxöİIÁ#$ĉ {zT›UTn60Q‚ß!…´ı–eÜŻä'Îż ƒÌóQˆ·UÎ ñëSa _Ŭ ê2y i $R2H0$9 ¸ÇjTħ“ÇjH„á·dQU$eBJàzŒb„ÀX~bâjU|²§€:îÓ°_vĠ@GR3QHD‡Êû6Ç'ċÁĉ¤²­ċc<¨8§ù#0¸Ĉ¨µÙJ5š1Vv8Pqßéó…ŽXʞA8£aÚbœygÊIÇçZ6şzÏ#I t ƒ§’}?$Ż ’-]Z)ı·KâîT#àà÷Ğ%Mµ´˘4c'çêy#5ijZKs:öHĠ”XPP|œŽäwñôĞ֗@ÀŻ#Q²Î,Wħż5IŬ“rÌİĥ Ѝ¨>QœIïí×ëPoŜğŭ=¨`Np˕U+ÛwñŞ“‰­ò `p@< :ş´ƒ'8w҃ qƒ¸ ÀyÈ4ĥĦşî¨‘İ–HÀŝZH~_ĦÏJ˚ÔFĊLŸ0ëûĊ#óì.¤JŞ?‹ëžiËä–3mJġŭjihÔáA ÷#íÙŠL3ž´oVR ġë@ûĠúßJ~DŸ.Kcž8§`”·s,6Ño!n;ElÂcŠ6o83ƒğnïéúÓµú׺lĥîyK1Á2OòŞl|ĠTä }[ü1I_¨ĴI ´İoD`xdTH\#½z.ĈLĦ*älCŠ”°ÜGœ“êàĠY\`wŒ4*mÀ`š–teĴ ĈÀŭĈÀŞnA‚9A"¤ŒÄ\•ÉnÀqRÄ‘q…M½0´Ñ*oa#àÓóĦĥ!<–/*+Gʆ–>ƒÓ˙×L{ւzF„uÚ*{dŠm%Ûò+òÏO‘ל‘îùâ·ml]4ĝ_ÌÚä ްñ§­ÊKİ_Z^:G:÷K0>ŸŭjeÄ^{İışŽa4`ŸO—µVE½ŒĞÛiYšt(…ö mQ“ÜqžE_ĥ‘”²n`†)Ç3ùùÑħ;‡$|ÌÄçĝşŠˆÒC{óHBÈäe#Ĥ @8  QH‘vÛ0OzSóË´SwÌsò“ž€ŭh`zˆ!ŽKgY„“’„JŠÛ}ùW,ԗVRŒ9Xş?˙\U5vI^A޲£½¸SDT‰ħŝÈÍ@‹{EM>8ì Ċ5ÛNKwl‹.~Vò=ÇJz ¤BŸ™Kß=݈Ɇ*@UC½YËp8ô­)elkÉĦÄd ^ŒqÀ>ǁTž VÒnc³—íwqÁˋĴƒ<‚}8Ĉ+Bojád·ŸÉ)ÁÚ?şq×éNöĜc/u+ۍŜmìċsó`í AéÏ?JĵXEÌ6Ç €€:âsIO²Éŝö mżŭz˸·h9p8Á£–È@Ñç!œ`uëDqƒƒž;ÊP8È÷éïPĈ|Ĉ,ü“ü¨@MlµĈebŞCÎ>˘£¸-$ĈC''ŬX~4Ĉ66x#ŝùİÀ'ùf“Œ|Ê>™¨Ù0APŝIc2çâœUĜf‘\Áöy dħdR¤ö{ġ>Ĝ£‹§Á$/²+BC鞿^µrÓA”4]";šÑI™ Ìì<*ŭ3ôúÖàP{T°9´ƒ÷ÏĞ·ËÁÜ8<ñÔWvŝtÏ2>QçüiK ‡—.ÑǜѷhĈ}+6NCdÏ1zòHÔ,AKXò9úÔ 0HÁëĊ0—,XÜpiü¨Ï'¸Ç)àö£# –Ĝ¤"X¤PĜ%Tv$J‹€ûÎ>SÉ cŬ‘$˙TÊ;kZÄÇq$‘Üı$üħŭÊÒ;”‚hġ5Â##”,$¸í˙ÖĞw÷QOhéċˆ]FN×àóéÍPÈYĴbróÜ"ä•àċ°=Ç{v™Ki*ùÖ²èğO'.§¨Éúŝ‡Ö•Ñ%eq˜ÀeÀ0éN–LÈĦò¨ŽX.ጷ^j>YHÚ?TuÛHç;zq@\iY",ëóv¸;ÈIÍĵm8ŬÎÖ,ĥinÀĈj:~{îⷅF2ÛÔĤk:êX (Oğ·n=Iġ&“B#†gŒ•Mß0 œƒÔSöH8pês˙-?*Jì’4vL!`yÚ3O™$Ž4ß‘‚3ûîżP=)XdV}aH3Ô³ĥĠĜXYßÚGĊ:4lDLŞŞ=yëZ@ÒXÖù Xää–Ŭú×?â c[Ón–D·‰m ìL|í!íŸLġ-;HıŠHî.5 ™ĉ6Ú'@ëÖµ:ƒ“ğÓµ[ áüs$rħşÈ`Şù|=êyŭk™hŬ!"H@*H 7§ê%¨‚3#`ċyigÀ.íÇŻ_ΚmċPÂkhÄ|˘GôĤĈ˙ĵ;ÓÌ™Iċ××5E—›ì֐ùQn]ç8-¸'ı<ûtĴ뽄ڨWTÌ?´Ĝ‘œÒˉ‚1Úqçµ)vwW~­Ÿ_Z†Ie]Ùq)=j32Ċ/NJ¸‚Y"'!<ŒŠEäûÓ`+JĞıKğñÇ֑FìŜÜcÓ-Àö G¨ŞÚ‡Ú ³ < ÏBŬÖµKQ´ğèŸÍĵş‘Ÿûü1UĵAŬjw18ú|/żĉ›³aĥµmŽh8ÚĊWğ‹\–1—–ñ2°mÈûHöнĉîcˆ´z•Ô#·‹y?Γ÷ڕĈ ÉzJĤÎ#hÈaӒ@Ċ&µ(èë#WÖìtĞ ³#I<‰òĴqîcŽŜĠg>ž;cĵed á—ĝO ¨úñŒöÍW—âáÙ²Ö%!²Ù$îžÔ;t+ßjÑ6áy"5$ß'Óòë[~´aHŒŝ\~RHèŬógĝŭr úUG‹ĠY"í}á™GÜÇorÁëœûÀ²‘-µT’Ñn;KŞr9ÏLƒŒûÒwÜ çŠ[|Jb˜í8`qŒ–î:Ĉo´F'-ŸNĠ ˆƒ0 “€=…$ÙÜT‘Ĉ•ÀH_ctÎiË6ÙCŒŒu¤µĈĉçvG|ŝTDâ጖àüĜíÇ4ÀIU­¤PT4lxVÈëÓ=éÓŬ³]âŒD­ĈÁ’½0G?çš{0Âêáf·™#*üQĥ8"Ğ£PyÜ 6ôiġ'k_(§$œRÜOş*NOcÏBCóíïR vʨŝ觤ğ_½U„ĝ qëOµËÊXzŭi×xV´ìñ\÷)#JYô>§ü+ĥÍoml‚úú>ÔÏrĊc“úTħH%]À§}iX“ÇÏêş%Χt$Û Ĉĉ\•Ÿ4Ġ–54.=2B„Ŭ€Ĉk+Ċ:ÓÚ°²·w‚W_0N0WŒċ~ĵR½Ĝя7ž†Éò‹‚nGċXz…ëj²ù¨ \-ò’§ßŽžŭi\fuĊĵÖÌd(H >†›!·2‚1ÈaÖĤÖ¤° cË$QAq4‰ċÎÄnÎp0HÀïëTôٌml‘HñÈáÏŜSòŽ៧CV· ËšSÛÙŭşê8Ìi!H×sdŒ1wĤëúƒŬè–iœ°ZŻîÀôùGÓ­9h˜· ‡ĵÖ£d²ŽP  ;Lk·nG5%üRÙÙê)ĴrAö‡E‘WQ'óÈéĜÒ[ ç%yd2F,íÎIĉ– ¸ÉŒİŻ­f‘Œ)ÏQŒŸN´²òŝP6“÷‡UúԁQ{§ Pf !#½>;ygDĴċFâŞ3ë@G%ĴïŠĤUçx aNËÛÎ8  `”$ŠÒê½zRà;ğà€&€, P-¤•’@ċ$<.=éÖö3G"ÈNÀéızÊ•62U†+—ŭì²F˜áĠ7ŝj‚e*²4Ù8W Wô=*tHDWbB„rp;T CƒŠVˆ+`ž1œŠ’dn‡­!Ħ+1óÍ䲉"&÷ ֕uKs2­ìħGo,m*oe$+ŸÈs\׆u;Ùo ħ{µF¤ùjƒ…ĈíǧÔgePO É!"âHİRŞ_\ö5+rŠÉŭ[ĞÑ2ݤÚF?Z£¨hz\qɨğ´ÁsB[ z§Œĉž)[è:Kya6ùÄ ÄÈ|ċ“Ż·jċ5;yL÷:sIäÇËĴÜ{QD—A\ŠßR·0ĴOceç’pìżNĉîY_÷’à)Ï è*¸Ñ}µWƒBŠĈ7Y7†'ƒşž€ûç[Z_‰e°RŜ s4ÑĈĊƒe‚/'Ĝ‚j#‹SĠĉ7i˜…CÚĈ­†ëúò{ôĴ™§–îÉUÙĉòH*dÚ¤tìç?¤î÷…f‚çLÚEnËûµqOçT!ğ à·ş’Dĉyd·pV.ÇĦÏÒİç×, ̌\$9-ïŠH%ʇçÛŜ²`I‚Ò–ùlr=êE‘YUêyÉëR7ĴŠğGN99¨;S@: *ğ uS’¤à7µ\·ö— íšçägì‘H^ŸJ¤ìÀĤ…Cüù+ßMJÁ"E*‡$IË}û~T+ Hbób™żçšn˙ǀŝµhzN:ĴkÛfs+`~zqÜFci2ˆt+2Ĉċ Á A<ŸlµfËLµ1ÍŭúÛ6A2·Î{Ž >]u „V^Î,íÜËo 섔'œ;Œ{z֋è7jË;ş3ece`ż^>”XĞèE¤]ZÚŭ˘XÈQ÷¸ WÊħ 3ĵé ÄîÌÀ…QœäqúTrXEë{EĵžiEıŠM‚-…™Ĝv"¨_Ĝŭ’@‘L&ĈAŽ£İòéqDƒ'ŒïĊ(ŭĉCTìĤ¨IoލëBò°ÜHà×h—ڍŭ˘Ë°—Ï Œ?İÖñzcNÎÁÒS-̂VÀĜc \H"Œċ#E>Ħ@)]è;z£zš´ŠH­ŽU‘”ż˜ĵ‚¸jeñĤĝacÏ/ÊŬ£>ùéÓĥ€eŜx­y#]-™c'|݃µAÁl ô­üWĈŞwph˜cŽüQmròĝ˘ =ZîêÂÔ™ÁÜ\…`8Î0:ġĉ’Ŝ]Ĝ\ÛÉoóTáHÁúšž`ħÍĦ]áwmòĝέKd×+$˘ÔáŒmı°>î2zûTކÔAqÀ玪rGĝ~u1şÓç-w·ıĜÄyxóU†sÓ¸üj’ĥÀnjQOgâ‘+Ŭ%­µÔ{…B‚;rO_ëWµ½=5Á2VGll\íZZé˘LĞ!ċ´w#\;ŜğE@@ĈB}ıïZ~DŜ …üĊaX1Ĉì÷Ç={RJ8K¸¤ŠĉHĉdCµ‡Ħ )G*ÀİÈĴma31U\á@Ĉ*2Ā; ,qÎ:T‘ÛğÛÉ?#À$°É'ĥ)zÈAa%Ò_ĈrĊ˜yŬóñÇ{Ġ­;O°ĠĦ*² kÂÈdHpxôíß½RIè4MŜjs[Ŝ–·êZEaƒùöúĠmf++k‘Ÿ0ž-ı2u$“Ó[@%Ó¤µÓ%G½³‘îĞ(“ċT\ƒğIÓTş{W·K[¨£’ĉ`%Ĉ +×@?!W /Q3'CZDa·ħ”ˆgŽ@v³œŒö$~ UŸ™³Ĵ "4oŬÈÈLcĉÇĤéMhƒİÒXÚC ´käĈ6dGò•rqúb­`z q>7·Ÿnĉ·#Ŝ8s¸ġìxĴ9D6ûÖ$xĈ„3r?à_&ġ#şFÓ5xĤGŞÊá”òzdóùġüiš¤âP–Q¸,œĤö°G5œ´fzpġàTħsgq§jI!W ’ùO§ ͳıÉh2R@äzcœÚ§´TĵÑ˘‰„1A4k“Žy8Ü}1OVĜXÏñ…ċÑí…ÌsĴ§+†_ÎıĴ’yĴÚ°ûÄS£‘â$£AÇp{RSDğ°ŒË4! ËɍŽ9ÇŻò­½JâËNÓìa–G¸âhÙBìs ƒìC?ÑYĦ=̽\½Ŭĵ7k4²ÂĤ× ²Ż9y?ÊÜĝİXÛOrħĵeŜPĈŝ÷ÓĦüéŬ+ħWwóÀ‘Ï1`eʆaòħçİîmíÒdÓl$3‡3Ԑ=ħԟZ—wıVQÓ­ÓH7ñˆ{“m#gz…?7â,VL>SL ɓaäìĈùÒi·1$rŸ&O6,ü݌g€z~5Hj@#ò Éàv#úcúÒ3ZZ=´S‰œÊĉ-­e‚‡9ç$úcÚİ-@èub|A¨ħùħ$g™˙3Œô=q˙5Í,6÷‰á-ÖiT·–3ßÚVNçH[­J$·Ô šÔ*¨•äÁQŽxúäĠñ“ԓ_ꑴ’ÍĉŝèTgîçúûP£ÜLé´aky`ŝLa­ÄĊı‹nĈ>cŸö³ù Ż KÚÉFd+9ïÇŝ÷:lnEó@óԎçùÓ£ĥµ³‘ŝËkJW9QÜôĞĥ rž#ÔZĉh쵂>ċò˜OĞvïU,Ô`†9„·ŸbBí3DÀ£`òTž ŸçíR·—šÂklş}ĵÛ@î6uÜë’9Ïnk'XÓÛHÔZĠ˜HÈXĤϧ¨¨o¨Êĥs‹k”˜Ĉ$Ĝrž3Ĝŝšd’4²4ŽrÌrN;҂TGß~ U”{RHm‹ %Ĵl타3·'·§Ö…}—P!ógŠ%MΈÄ8§ĤE ìѲàI–ÈÎ8ÁüóùR¸Èä–IœĵÎÇĝ˜äÑ Ĥ–E*r7 Ê‹µİZɇĦc%ÓFÒTp `ê铞=ë ĠÉXHž9ìR#FĴA[€Àœ~$`~µ@ÀŒT‚ŜF·3*–E8l íú€q*`sF8úPòòÜzTö–Ĉè¸\ĉ4.p2N: }ÏÄD‹ıÂúœWzŝ´“Ëo´H¤ĦFôÏġ§ÜÒÚZAen°[DħF½Eg a‹ŒëÀžîĴĵŝD~U¨Z3ïL‘3HIϵ02µt½Y–K;u¸ Y\Œ.3ê è=+˜Öf:ĵÖ÷v2[İ ħŒ”ó’AžĵuÚ=êdì4sĥ×AqˆÂÈĴ18Ê?üÖĈm<úI"™ıòc1³¨#Ï­ VĈužĥÔí­ÔNĠ˙–jH-ÉïZۖK—Eq˜”:‚úĜüëOQw¨ĝrĉ=RXĊÌ36K÷„c9+ëU Ô%‰Ĉĉ/´Û!%cċHÏĦ¨JÌ V7V:4–×Âp҆o!ÈŭŬÁıÒŞx‡\“\ğI^1"íE?™ĦÙ+—S\ˆñE‘ı`½“ŸÂ d'ƒVmݤĥĥžÂâ|b2@ééքìbš5„Ĵħ,‡ĝIb LœÓ3F8q&~_@?Î)ŬÉu8?˜Í À<ŒŠ@]½½ó­ ·ŠIĵ¤É16İöÇ^=j;K ›ċqm™ċà‘?çô§¸ĥ,KĦŜ[éÒŜ\ …#`ğ\üÌO3M†Ŝòâ.eX1-37EëŒzġü赞 I­éöúuŠŜc*‘É$çÒŞ™×í~d!­, TlíúPôv×Ĵ÷WOr~T‘ŽĈ~2ŸJĴ2;LeˆšYm$ lR$Ú~ñ9ǽJ[aum9ò˘K‚ î^‡#ŝtïqzn’5›¸Š\w9¸…u÷¸ŻJ…<¨0Ċĥ(]ÍÔÖ´Šê&>²Úmŝ*XP"³'ÜîqüĥŝµB*k÷SC8·I³ö¨R>C*Tûž9>•=ž§ş´–Ĥy]€˜üż–>Ĉ}j—aıâšM ş½Š×crA8qëYş˜—ĥ†K†1Ï0T$ržÜf£ĵÒŬĤó•$Jdd_˜2’6ŝúÁúVuÉh—ÛÚFŜ@àû+.RÍĉħsnΌ”‘·GıÇ5Ğáëm‘ŜOîŭÛF’3áwžž*àÄbXu­ŻdŽÇûÀúqÇLû×WfħĜ–’ÚŬ H%t,á†GLwöĊ8G—V'İ‹¨ĝ³RÔ hí£6è™ŜÑäœOjÎÑġ ×mîn%r7€ìXôéÏĥ*9›jċ$lBşLZk dığ–_‘ñÄ °ÁÁûÄ*{ \jħD„­ü’2ÍĵüħúÓ·?…6•´_WÒÚ+ħmg’F§û?Ödóô==+$ĈÂFFeÎA¨’³RA2Ĥ@ó’êjF3€HŭiÒ`c~tÊy_Ŭo$rÄc<( ´l5[­4Ħ…#;”ıs¸ŝ4Ó³?PÖŻ`{YŠˆ›iێ@ê?˜üĞ3Œ‚3DÄjkËìĥŸd+żfd ›yê?Îj…Ĵus|ŒdàsCÜ ÚĊ—ölqÛ‚ì0̅q‚GoQïY”I[@B£²8dbĴAEvŜ•ŝÏ{$ÒċK¨Ûzûcò§ˆĈݧBыÛE1ŬĈr’[€IÏ\Ž„U]/ĊMçžĞ[Ü3mWÚBżĦöí[= Zî+ í>1 3ğìD6:œŭh°Wñ\ÄRhİì{W+y£è]ĈóM$™Ú@ žż0š ŠĈWqĵK&Ïúk˜°ßAÏAOµñ„ê"kµ‘P˘*ò “÷¸İsAÊLÚí£İXí.Œ²ù‡‘‚ĴŒgÜ×I4…Ö3$È\ç8¸÷IÜ68;ËŞÍq8„f0‚ `b:~Ž'‘E),ˆşġÇëÚ²›ĵŠ-GħLĝ Çh~yÏöÊX5 $Ĵ1*ĈĈŒ) r0qĈ+J{ žyrżéòĠُŜù°=Èí]†‡}Žß6(r| YYOĥzóJV3œóEŝŻvVñlÖry|…až‡˙ŻTġĦ·ĵ1Cqö…PH:ߢ³zЁ³ ÖvşWö„Ûu†6 ó†Û’ùĞ>ÒígŽ[‹€<Òħà?ô5–ˆW WXħKf’Í3FëăÁÁÇé‘ù×9ö•]Gí Œ+n\ 853’cHŠêdšgxâX”ħ!W·µCYŒ’sI˜‘08c“œsM'#0=¨µħk£F/µÜʲ,[Ê ó‘…É$sUó ™SĈ"¸’0AÚÄdƒĝ÷ĤRjÌaV-í{[™Á PI=É`úġ?… !|I99ġ§Ü\ËráĤrċT(Ï`: ŽĤ·‚In(ѝĜŒYÖï´5”" U6ô85@‚:ӓÔ@oMXgğŠŜîWKvnJŸşOĦhÀôŭ>Î :Í-­—liÓ'$ûšÇñÄ{ô-â0û$\·÷L˙OĈşZ´HêZ´ş–ĉ΃ u–Va’ŭŠƒÓŻZ™ÚĝŒœ˙Çô9#ѓò*Jž…LMbĝŠÈÏs¤~kĊ*³+7{ġéĊ;hKÜádBĥ²É+Òa£,2òsÎnAÉŞĴĜƒkǒGÈǨŝ]k nY9NW!àŽĠ­£kwz|ìauHyo!*Ç{ÒNÀÊúô·³O(‰c†WŜB__~šĤ w°,ıBS‘œŝĤŬĜ#Óîî,ìP$Ĥ)l:gÓêk6 Bù4ĥğ˜ÇÎx[ŽGœŒÖ÷} ħÎÜxŽg¸ym7FÎhÀ 1ÜóŽĵV\Ó ĉQ˜7d…ü++&ŠÛËó6™ĈìqšB Ĥj,Qı ‡"’97¸˜+ÁŬ‚zz Ɋê{KNÊːOl˙*ÒZ%a!ג}ĤċĜyŻ!,Ää`œŝtۋo³˘npĈEÜôĈHŝbĦ^ŠCò•`1ġĤ‘ŒrğP‘!Œ$ÒĈZĊsëÇ8÷ĉ™#´ŽÎçq'“ëO`”ó‚èi´˜N%ó-<–r6˘ƒ×9÷éB8|ħ*™ƒyyçoSNı•&œĵpĴ*z"’@üèZ4Ks¸RÑnÀëŽ˙uV%Òlwii,q÷p£Ÿ×?­\$£¸=J2D\KA3ċctù$‰nĈ²î4û¨gX"d#*ĉz‚:Ñ$Ŝ _4ĝġ+µħ•ˆX‹K'=q´c׎kfßÁçí<²ĊJßğ‰GiĈÈM›—wréè²OqDNġ( f³ŻµŬ3Q·{9<Ï"R¨ÓòĦ<İÏÔ~•³ihÉHĞ­Şè·‘é÷0Ĵñ Ù CLĵc×ħ žgŠƒ‘³uŠpÊK“Œ?Bz[ħV62Şz­ö†-°Ĉ\p×ü*Żažım{q<Ô|€L‚?Şç<çĞUÓd‚á’(ܢG+žqĝg…e(ĥ4ʖ$üÉV-¨YKtr?†ŬÍĵâxÜОê÷éP†E$Ìû†vƒü>½zŝuc·ooçJàjÜI,wŒ5 äf µ–Ĉ=zT7qŜ[˘CtïċÈĤ[ ŠÑ6"ž€9)Ï>˘”2É"‰…nššÉŞYXÀ°ÚÄ×!_qóë\TkrKtdhb[p]€í8ĈF{֒šÙbekE%gŽut†-œóÏAôÀĴwXŠ™ÙÙĦЍİ'–6uËlAëô¨JċъĠµ³ĥ¸³yVŒGò §–sÈü$šÌ|+°F%zgÖŞIY1!71@Žrx cœúTŒC׊(£8 ħ dç (äsĞ Sœ‘@şN£qml¨žPœœ3Nѵ :òàە Şt9ä{wĞMèKBiúÍÌ<ħ%şHÄı(ÀÚÙÇZê-5 è-žçUp˘5ܨ€.쎄uÍ\%}£‘Önµ ß6f.›ò°çäÓJÔÒ-#žËĉ€Jñ†eŽ\ŭÜ˙,qïRŸ3Ô Ħß]hÌĤí”0ó#ĥ 8CĠT1äV …Ñ–îVżY¤y­ŠDÀe¸èGÓooJrşË~Ön-/ÒÑÁx%}­ğ9Cŭ+°„Çsİ5Í½ÛşĈ[Ċ˙,óœä{Ӄo@dZœÖ÷z=Ó3 1ù—”aœp}ĊqúĤ°·wŞîw(O(í%Nç>ǑNNÀd]I½UPâNÄÎJóŜ’më&ٔÁ€ +Ĉ@O4”†jë×\êD­ğ@ëîêO)ĥ·Ó&ž²‰£S”GÚ}ĞKû̞…$tŒ\œX3M8Q‚ĵóQ~£y‰ XÙßíÍD#8¤͗Ÿ§ésÍċü²ƒr§éÍdK+Í+I#nfêM\›²B[Œ§#´m•88ÇçPŠAbNhQ/Íĥ ^RħbŭON9 u9ŭ+.İ‚ *F%8‚IèzPh ŠZtn@ĊCü-ùn-î•<¸ ĵ¨0 —ÉïTċžGŒFÍòƒžOiß°…ÌħĈ2vĤLywœä~5tĜ^jĥ¤È†&lHUÀ>ç¨W{žX+ċ3ÁàÖ֓tmŻâá„r\ĉ<:’ äzgôöĤ´`tpÏoiáĥÛ.T£àƒŽyàf¸ëÖ{‰`òHaAWgQ·İüòÒz$$C/t͵ÓwĞ> {óZV×PêĥħÍq4jHPÈÇgĤGéùÖjûİwé×&Ùc0ÄyÜÜÜ@'Ü ŝxLïç9<òjĤ’ÍK¸ÒRDe€rAžµwWĥ‚ÌEċ3Hğ™†ÀúR–›$ĤL *ÙF)#Rò*€I'MH.5şu’áCJ£ÇÛ>µ”E ˘ŞĞ‘Ë‚rAíUÍ­Ċa÷r¨”,mQ€@íŝyüj°<ô˘[ SH>ÔçänPB€>¸˙ġԌ‘o'CĈwŭżH^êqͤCmx•xxzİîXÀŽ1ègÁ †bPʓŽ£ŸÓ#ñŞoTéWّ7¨Sœ˙×Ĥ5ÖE‹x…Imğ³Š].€&ŒĊrIK†UÇıéùô˙ ŽHc“OûPg2Ù >§CFà;D‰gĠí˘p]T÷Ġ¤Ž]Q‚†HG §ŞƒÏó$Ñö@˘P€89úPӚ5ġŒR_,<ĜŠ€œú˙áY².ċ-ħԏn?úĠ¤–˘D9ÇJ~ÒSvGk2‹ eû‚\H'lÛÔw'T2Bé(‰ÀSú}jœl!’Y‹(èOzHy[j)c‚pOԌ€'` cZm÷(@Ĝġµ&ĈÙż§Ò‚ŒXİ Ŭ Lqš\,’~`@G­OBı\?‰Ħ aĉ”’@””PEOm'ÙċY°ŝÍBI''İ ŝìGĈâäsè)éĴfG‚ghb03וEÀwÏj0AÁ]ÌQS<HçáV­S|]“†¸@_]‡Ĥ„U—i•ü°BdíÏ\Vĥ‹:E Ĵ¤ –'Ù듁Ÿ ?…5ñ(sGóèi­XËóİi^ŬX•xÎ×l·ZmÄħ\Ü=ËÈK;e³ĠIŝb•ĠĴk‰ÌĴ§Ĥ ŝ}Mĥ\ĦàH@$.HíIğ˙Ù˙Ĝ˙Ä ˙ĵw!1AQaq"2B‘ĦħÁ #3RbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚâäċĉçèéêòóôġö÷ĝùú˙Ä ˙ĵ}!1AQa"q2‘Ħ#BħÁRÑ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚáâäċĉçèéêñòóôġö÷ĝùú˙ÛC11gE:Egggggggggggggggggggggggggggggggggggggggggggggggggg˙ÛC  *3$&*<5?>;5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?­,€C i”m¸ÛŽr+ äéÍ"Ż“ÓşÒJ‚G1şG1ä&@ÜÇùĠÍ>(BUÍê*Àş“ËPó1ˆŽQ[ÓùUY0D/ħş§ mĈO֙M2ċ§Â¨!ˆ?!ûÙôŞóYÈnÌaJüĜ ܲŽ£>ĵQ­ĈÓ'‚;‰!6Èċ܈ş{ŸĤëëUa…e‚bÒŞ2@9Ëû âF’è²FĈW…™2b –cQÓת+jQ\7Ë( Ş0ċ‡?ŭj§ ĵ-y’2§ĥx4ĜDŠ˙+aÏ'“¸\xx…ʳÁòżî§úf›&d,çlJI*‹Ï~”m¸ş‹.²BŽê2Œš×šèC>à€7tÉ síPÊF%ÜŝTÓm&b9nügßùU !Œ…|ìǧ=˙êGS³ÒĴ˘e•diX‚rx ·Ò´Á5)Ĝ¤„š(ĉùeEz0ÍS{eµ‚éàÉá_çéŽ ~4FVAħJ[İLÑË:â8›XyCëòžEZŽö aWFḚ|ÖÔW°á™­YD›d#á$UH^î0aš&•—*G>ù4ÔµŬÍÚe#ßo0#Ğ@ óYZŜdc³ $¸!ċÇ =ż½hÉJĈ)wĵ—÷’$`20·~ÖÚ9íÄvë J~Viߖ?ìŽßħE÷†+2~ĈP§ÒĦ’Kl˘vŬÖNĵj9-Èż*¨<`@Ş[…ĵµeǕXÔdżĝÔLÑP_ Üc$~>ô·˜ÌlŻ# r£éÖÑC#0UëɘÇKE°¤e<1ŝ/ŝµ#ŞùE˜¨qü S€Dé°İߖ#o“g|2œ„ĴÌMY¤£Žáǔğs•cŽġ\ŬÇpàÈÁA'x+ÛúÔë{“r¤˙g–THÙö);™›$˙ġ…E$tEŠùZBI }ŭTö–EbĊ³¸mb{Š•˘(ydd=JœíĤĜv°5‚}Ë"Kò§l~U=ÍÖÉ7"H_–}ßòpj^–)臷•"lvħ.Ş|À ߑÇëFœŝLxR5ëfÉÇĝT_ħ"Ct- hsğËrdgiù³ĝg2j $23(#ï‰=ErHµ!+äDÛä;úTW7^t,‹Ëz+çpê RĠîEm›ĤòÎOͳ-ü"–}*ċĤ\-ÂĥVD9÷=j£˘¸ÖÄÖ÷LíċMŠ}ğ^Œ=EdŜĤnŸ3É/AıĜ ĵûP– gŬ]<Ĵ#d žĵ{žôȔÁ29ÚíÁPFàkM•€ħ-Îìó*żÌ@ğFyì;S ´ûH,)ù˜œ³rz WF“ÈŞĵ°Z…U\D<É;“÷WëŸċ@$J#ò7¸;Ûĝ·pHúŽĠH eâdŜÎE܂ŭ‰ˆLç$óùVzŸÏ4$X; })Â2΀ŒÇ4Ûˎ( +ħı˙8ŞħÛ$‡;ĝĦÉĠ 8€šX\IrŒ.1€Gš"íĊÀ6Û*ħ§˙ĤHÊ[ĴŬĜô?JÊKB½ğŬÁ$Ŝb‡R ı“ 3ížĤ˜›#S °\˙Y†9èxêzT§mwħJiq‡q)½ÏLŝ@RMq,ß}Ù°1É÷Şĥ˘'70‹0§Í2ç-„úĠur9LóÉÏJM ĦgbAéÉİ•Ġ|Ĉ!ppÎ8úÑ{‘F,Ì2Pc9?çùR‰6£ |ÙÏJ[‹rHŜo(ÂĵОA<׏J–%i£fÜ  ÏÌĝÇŻ×<~TY—ñ+"‚+™#HÛsyGpfċ9Ĉˆ‡ŠCġpvÎON1ŜĦŜÄ1%™b$R‰ ˆ7‚0Cß½<Á:Û$ÇÌxPÀñëE•XtSìlL›Ġħӎ€ú}i\˜Ŭ.Ѹû‡¨Àà‚ŻŻ¨¤Ÿğ ‹vRÚŜŻ“pUĤç0¸#İö­yÛhÓ%°IêjÓıkSŸĠ‘WÍ ´ÄAF-Ï×È Żħ”qž9Фş!ìkG§ĊpĦ^ËËîmĴ§×§\ÑĴ2éÖbIÙ‘ò€y'+NTĠú#Ž_7U >T-À!G[ĥöÛ.(ŝ\ççùŽj„Ê·sÍí(U‚‰µÇ=ùށ×Iûw œ1Ż#ġ¤$îòž!°ò ħÇĤ8˙ġÔÉsmĵĦ ä*äq–cRĠ†Ĵˆ<ùqħ޽)òŭڀOBÇŻÒĴ,T§{ Ì0[–üiñĥĠ{,WS Dıb#Ç{NiŜëT3u,…ıUˆcË]£pëġġ.T)ĵÜ(XûVWı$r[›˜6\³€‡żżİ¨ïU!‚F@İ·ĉ²AÏôŞJE)gŠVù£ÜFS§·œÓ'Œ[ÊÌvĝÜr=ğcùÔZâdŞ2ِ†ÇAŽ9I2@ÒĴd޸|Ç׊RŽŸˆİŜŸ‘íPşBèıÚp ÷ġ˙ he•;›Ì8ÁQĞġÜíĈô80Ĝ˘+§ħĥi#›Ê¨IĂR:’:(úĠ•b7xş†y\2° §ċëĈIííV^ìĥİ5ÔbÚÚXF#ÎÖ= QÎOjXŻrÇö…ÛĥÄlX4ƒžżÎžUnL†<‰3É˙"6ô½ÄTĵğ’0+†“ óüğH?çSí3Éħħ ÈßÎîÔ[P%·vHË(sµ×çÇ˙ŞİHpùÁ=Îjĵ€Ó} ǽ&ä-‘Ž 1û²™Ĉ{žµŽI BÌ2Uˆf8ŭM*ĨÀ˘Ž>ġ!ŽQ)?'B: zšVŞeÊ ÷  W>il™ß\ñùTAB˘óËM D+ ŝ9İm£ß•ݍÛĵQ{ÊıîGjĉÉçDÛü'ݍ5 6dD–Ŝ ÊĤ0[,:c§ëTnBd°}ÌÇ0#XYB6[œŸZ—pÈŽĵÓż@%Šà.Ó䣕éÔúšħ I</¤6v²ŭôĤ¤wYw.ŜÇnċ@™•79éŠAıàÈ[ ¤B êA)$ħ|â !=ê{ÔIó>Üž(4c'ƒOu1°B}G9˘Á`S($íb£İÇJ•; ‘bb…ĥ‚;œgùQa“Eq%§˜^Ĝçn>l€§Ôú÷¤ÓìÌò§ÊWċËçµ X,ËRÛLyíԏ£ä+üDwëUĴĦc$i eYâBò=ŝ”’—QYšb"ÚÎa!àçĤ4ĞmoQ÷Ôl†•‰hžİg?1·Njĵè"°Ü *ĥ Áä ‹UĦ;•ÚXÚë2³0p79vŝ”Žħ­ħ†0D„áĈ:Žıç=µ}ÄänĜôۆûÙ÷ġĤ1ŝSġ¨·Ğgži=D>6|’T‚8Ĉp@Ç ÇLô³ğF,}O^˜?çíÇc?ß<çéL˘+†„£a·È‹o5 ŞğË=:ѨˆNwíj`1€qÏ'µ0D’yò]4reĥ’~c•˙ëS–x|żŜ[ïÇVg<ÒèŞħ˘<ëk#œ*·;@ïĝš‚i7JŠÔ8 SóŽzñÚšñ) 3•ÏëNÁaÛ6‡1LĦHċ}}ŞämäyŞĈžT`ġé“Û4ÀŞËV2üÛx'9ĉ™°2×sžçړŠİÊ2·Q½GµD@-ŽœRLE‡óš%ù0Ĵ£cúÔl<ÄûƒF  fñBd”lìêM%³}á`œáT2Ġ´ŻteÙĜ‘’ŬxϧWĴ#[‹%·ŽP…%Üᜠŭ9)‰%½Ó%şgž6¸ÊmÜŬN£¤·@[–YáÜ˕V ó $ŜƒM3;Th$Ób‚4c,Ψ$`ŬÏ8ġÇOĈ­Ç"ĈÛ#„ ƒÊ§L{ġb+])Â’ İáŭ˙ŭUNtWf*3Ò˘Jâ*,NUwŞ·8ġëÏó§LÓLT™Èq´ğĝTY“a² Í l¸8,3“íD;’D—Ë,çAíV3R{‹–\<* ôĊ¸\ŝ•Q”ƒÜpAĦ§ÔDyÀ ÄöĤ‹vûÌ ?ÊĦĦ„°ıËsŽıôİ aAvĤ°¨8\ƒÜšr¨?E8óÙÏÒ˘02rSÀ短FpŞĦvġĉœHi9ÈúSBâ\O4aѣܜdœúŠd£nž8xçüöİ`ĊvĈaVʎĦO_§­ ˆVpT€XrżJHA9WĥV —<.G\Љlg_.D*ààà{ Z …ò˜ßtçĞöÖ <#³Ç†&ŬǞĵĉ„$Oqhĉ0ċ]:Ù·żp5xF-­ċ6ú| îgĈ=Ĉ{Ġ(ër’3î%‹ûNÈò#FyżAŒçëÁ8Ğ{•„ÒĈÂ5^Q‘¸?)8'×8ŞL 73¨"$máàO|{T·?/ô¤ÄL&”/Ë ôÏ9ŞóK+9Êc×=İÜ`C!bäħÎo9a@nvŭî¸_j@ކċî’Ìy:£FsóE-ÊıÇóü+òĜ&Räġúŝ5Rb݃Á'×&œG›ßÔV@4ùhHVolġ§s´ĝú´ÀP­ŒîÈ#ı§–Àöç4€ƒ9”`äm=½ĊJÖcÛh$ŝì^|‚8£;•NJİ$_ÂŻKŞ Ù$íl¨<û`{ì2Ŭ‘·p°İ%!‡ÍùvŞÒ8‘jmÀ Ÿï7ˆÜV'·ĥ‘ ‘%xá‹WéÚĦUòĤÁ\azô ÈY İÀ=AšíéïRğ—xĜw6쎀âŞJ#bĦy$úS@Kdğn6ˆDÜ/?)Ĵñ¸pxŞ"Ɇܠ?fġ4o ’äĉL|£ÀöİÉ6H73cnHŻtġcĜ ŭi &°Ĉğ‚RFH$İÇ·ùĉ˘šéâ”áp3ↆÉ6Ç|wħMĈT.—Ô{ĉ·I„J<ÜmSĞ°œv=hŠÖq* ˜Ùc(0C|ĜġÏéIwsÍv.!ê ĦÀ>‡°Ğ·Ş2/lĉP½Ì~@”„EAÀ\`ôëüêú£Oo!œċâm§b€Ï§Óqü¨ §tİ ƒ­€*K6cŽıö¤ÄÌN1×pßր’A´ŝ§4²˜ħ“ާÓߚµ4¸`q³n^}û~•YÎUÇïÉÏɌ=E;!˘A Oĥ/ÈInÚzÒ° ċ28 -í˙³eş7‘ħáñĈqÇŻ"œlÀnŒÏi,W󋆉œ*¤$›ħŭÜà~•Ĵ×z¤7ñbòmapDLà˜”ÔÚ¨e=B6¸ıyío"êòڋې0sÒŻiz>­c =´1De;™I¨üik¸ßèڋ떈“ȍyÏż<- ħİíŝj–Ĵ!Žż‹§h–Èݸ(ŞrĊGÎKĥrÔ •‘Éeùpx>ÜT AÉÁӟҘBœ}â^1SŞn_Ŭ‚ LCyÏNzCċ`@Z²˜[“Óî•#ûßŝ³PÄRU£S€zġŞLdŝRĊ.)#*6òCžjͰÒG¸òN>ĵtŞE"k¤šè˜aHÚ00 .}9ĉĴÜ[ĵw‰|İ„‡ĉŠ#…?QҙCî´ëy–{y—eÜdlžƒëXmpó@ÌR/2/’O˜HÏÌ=i² ŠĤŻZU8 à½CùšhßܨéÏZYwrĵ}i:†teF#ıç4ĝÈT26JLHĵĠ`‚_% ‘Élp8ŭ+–ñİĜXc³{wmêjŬÒ0 ĈyúóRˆˆĉêxÁÎjLÖ¸|E'švċıè§ZWgXYÌgĉë·żlZ¤ĴŞ‚rbsÇsÍ:Hg ûĈ$ô÷Í!‚Ú1S#HĦGv­é‘Ŝfòĉ{}¨—ĵô?xQ@tÖz]‹"E P”’òF0w˜ôŝ#ùU”´ä’7[e •SìsŸĉi(èšLv–˘ÈŸ0ĴžlìWaŒ(öÈÏ{֕Ċ­ĵ²€öċÎ8=‡µ&5â.7ž3mĠW|˜ç8ÈĊrׯĉŬ=Ä,|¸ŬTrqëžü˙:$!™ ۈ둊@OF<ŽœÖ@1•r2 Ï&š Ïj•èdÎÍĜÈġ>ŜġPİäòOòĤ1Ë´cs’>•&p>^Ŝ´˜‡qR.ċG­!ˆˆòŽ"n€uzż*ÈUŝlóêzVşÂöY ñr£ÓŠÒ.ċ!`šÉoXIh›wƒ8äwÏZğ|–N‘ĴáƒrzĊ2˜Ä´ßĉNĴ dİ^GċíXšäܷڠ܌c‚ĵ:žÓĤÚĜ†S\JIÁVìFqNò@r9 ĵV}D!cÎî7vĤ Ħî!ÈŞêO\”Žı!‰äzİŜĞ$-ä¨RŬXEqr{tZ )]—‚Û0úš× ş‘êtĥ+ĵhâ!›lEϞŸ†j„ÓÌwùqÈó–Ĝ@uút…KÓ`“틐ĵƒ÷Jŝ4Aß²/œ°ÜWĞ=yĦjÑċŞìç€IúRJ dĊħ‘ÇŜ.Î*l28Ñ%eğ7rO³A˜Co$pۙŬH%D€ÀžµqŜÀÎĥĞÀħye‡ ŒçuÍkXÓŻQÍZğ˜y¤nßJvÔfĤ›\[ʓO¨\JAf1ĥınıÇ^µĞIÀx]6 ÑĵF<ûÀ‡oÂı†F]ë ‘3´‚·ĦDüÇ<óÈÀ"¤ ¤dzjà:`‰×sgĦĈ3P‚€€üM0 Î>üP3Ÿ” ~U !%Üǚc:…Ú ûšcn0M)û¤m?ŸJKçĦúçŝwôúT€¸- D_ïgi×-¤^L‘yƒïmˆğcëÚ´‰H‘.ĜN÷!Ÿ2€V?( ŽÇ$*Žİw4³ ™g\ âDÈU½Šħ›,~QÜy<äUI£Ŝ„ġÀĴÑ toœġ§31oáħ9€Œ°*HPsß=)fΊOáL#y¤``šF`:‘é@YğŸìÑo*Y{œZ>³`)¸övÛüëhĈè]Lë,›Qáš%fÛĉscŸÒ°ŝ×k=ԄKy$Œx–MĦb>£~îĥĤ}ÜÍ#‘*–tr”‘ß=é‹3ŭ˜Dq°’FG­dĜ`'(Ŭ8§´I*Ç''‚(§Ĝ%ÚıKy䌔QŸ¨Íuš‡lí£V*Í&9$àn*׺-ÍuTt ¨ldŽFjnQ íZÙÉ:ÄÓĜ¤:̛[şĥ¸·ûN›$VÒ<ÛĝêqSHlìäÖe}Ry%„8)j¨Ĝ)~÷Ġż•bkVwqܤ 1ğ*ċÔ=żÎ§;ñOáŠd8 žY›thNÔ=yäġ¨÷lıî¸?Z Ĝ@çoçJ@WÛïëEÀbÜ:aÔú­jA0Ĵ‹"Ï+ıċ·ËëìqMDh‹Íxä6pÀ÷â´,ŜIċSwu/“ŽĴĊG·AVŠ.½â,FŜĠî"P0 m½xŝµ‘q<ò\–•ä; ÄM‡QY˘,ÍÏp¸5NU^žë7¸™ {Â÷ü@İQ‹mUċÏPFÙò_(wƒóÏëP ÷ĉ$‚xúsH[j£Üs@ż·#TÔAjÒ) ô,›ıô­°’9„µÖġ+²ÖŬ ùUA—µžƒc`BfżĵqM£2qTÀŠ? êw#l×PÁçËV.Û·ŠßËÚQ£·+ĉ.3K–árhü( n/" Ŭ•yÇĊhéšF•ç=İ„Üĵ\´’&˙^…"˘…E @.áğnyĈqS¸ Œƒ‘K@Ê÷÷ ke4Ĵ lBÁG$àv?íú†ĵĥÖî€[£vYB£09Ù×=Oz¤CıvQOu$œ"…ŬŽpÏġĴÍgĊ6sY´vR3Ü+ĞlÚAùXúE„r²ĵœ„³0s…p0¸ÀÀî+9ä-’䲜~Ü} É +œŬ{â“!3?&sRÀ" ûaÍZ‰€¨RqŠVo“Çdv¨¤ıE~ĴHàœu§ÊI*K…²:ñOû;HÀnOv’tŬ?0I#¸;¤r –ü+÷Ē=úËYV0ǎG|v9Ğs²B[—n|Yx¨ŽÙcÈ3)nqéZú&Ħw-™–rnہˆµ6L£f7wŒ3FPŸá'PÔµ?Oğ‡íe„Ò#öİmŒŽ;Ò[ŒÂıñZNñ˘Èݲ7%%ˆ€Ĝ{GíYÓxĉìl‚H™Ï—ž3Ĉ? wVğĤ§­I¨j˘xîŝU;a,ŞĈĴ0I÷äWA˘iv7ğà’ŜŜuµUԆY\Œ–ÏŻĝѝâËfÓ#‚pìq`/ˀw=°8>Ĥı˜gOí”gËv<ħĈÜú‘ġ'‚6%½il'°ÉŸfwɌîÁê@kažÜlBòrjeqˆ"Üß1ÀN9àQJ9á·üŞ/¨ …>Ôô“çÔôé@sÄOïPñèi·B"Éċ6sÁÍP|ÈN Sä‘á¸Ü’ˏ™NE: §ŠÎâÊP2 dœ{R ħ"ùqċC Á~cŸ_:G‹(âgr~#~5iîÒ0²ĈÊÎ 2ç>Ä LÙÖ5Km‚ÚH&ÜQž ûıüÏ˙ı닖*Ñàs×ڜš¸\ĴAµb Xˆ_ĵ…ŽIġÇĝTô$µ#·™ċ‚êEQ”›üÀġÎi kÈÌù,}éé.:ç>”Ä#ïuëO·bҖ'8Ï9¤á9çˆËjöò$;ÙÒAT#=ĞϽtISRışĥ€5Ħırq´0\~u d=߈ç“éé“Éyb˘‹BÔ.îµ3n!S¸ìïíҚhv4¤ĈšèGBw#`×=uİÏ˘\5­ĴbÚŜ폗ß·ZIê2)„o/ħ‚m×;D,еO?xç§ġĞ@CmĞ][İş…m˘·ŭf“yb½ħžNxĴíZ{8t‹{DòXÜĥ'<àuúÓvÜF‡‚ôzóËjŸeE ÒŭħĝUmN!µ¸]‰ċGq(ˆÈ7P{.I…OAêsŒù‘˜dd÷<Óˆ’TŒ‘ÜVl ’@<1ÔùöU!Ÿj(Í7½XV!óÁúĠ€l ‘ıƒd•ŭ3O¨ŬZ7da†S‚=)´†-(ä"Ċ´Â&é• W @'9¨œ)$.BçŒġĊ eˆ­ †f`ܨġ˘Ŝ"%,…J´ĥr҇°XIRF™Ž“í¨âŠ@Ċĥr~ï­!ıFÇ·<ûÓ7¨97ö d쭞j–Œƒ@Í.€zŽ‘w-Ġ²™mÌQÇOÓhfş¤µ3DSÊ@1 mì§ici:VŞ—{ïïHÀêOÌIĈ@Çp?3KmFcX‡J… |òÈÛR0ycŝ‰v\,E­dıĞ|ĞÓ¨8˙"ĦCiupħܖĥ‘$Àó|À LœÔ£FÓĤeıƒÌa_9†İ÷Ċ\ĝZñÌë @d †áBžFž@Ι•{§ĊssnöìöËûè‰=qúóSg¸Œċ›Mš0LwʨO–„Ù½NyÁïPĵW7İ= ÑĊ˝ÛÚٌtşƒ½Ĵ6vÒLW*ûzœd >Ĥ·Ĵ5û­‰ ­­ĵwOĥ4(§j–Ĉ3“Ž™ŞO° ‚]WTÔ$ûby²ZUT\lnıĤìÖ Ôlc„˜·GkÜôĤÀ6G1FqÁüñK2 Û´ğÉ œœž}¨°żêXlÎHc§^?é[:>u{Hb÷†ĉ^¨>aߜñB:Ŝͅ¤Ĝċ ڌ¤ğİÎ{cúUë[;Tş™/ïU_+XçêġüiĜ =Iµğĵi%š6ħ‹ĝH*&>ÙçŠßšĵècE˙GUmûB|Ŭ0>˙T£Â䧨@WìÚpKe_œ° WÜ`ñĊq÷si÷9UòÙ]X^F@út?€+ġ@‡1wYnÜ4Ñ3m2ıêŜ†¨†!HsùT>ĉ “Ž´ċ'8Ĉ=iۛPÖn݌6ĉa†â(£(?Ûñ™Ĉĵ÷–VŬyÌPdàŒñÇWB“h›#wM° 0ó^O2Bq΄{ ĥÙÁÇZ†îÊ0¸û ’,§t@ƒ TĜşIġ8Ş3ĝÊEù`ħ2Ĉ"P˜qÈġçéTöÔ#ñxšg‚ñÑUˆòÚÚ2àŸLŸÂĥ-”[Kĝv=ÒĊ$’)îäpÑÄĴOa´ç­jßIzÒÜC¤²‚Š $XwRHazj¸­‘ÛÚy—ÉhÖÑ~âĜ:Äü˘¸<çılĉİêÑĥĞyhm–4µş%#tcìG^Ü~>µVì#Żĥ²…—ÉPĝÂñ÷²óÖ­QG -!mŬîÌÒŝî! {rsö-‹y'ï6Ifo™—İàĵ(¨’Ôh}ŒuöwıĜw;ېIġġ›<‚Gc Ày8ëÍ&ĈGNçzÔŜ³=§‰lÄפŬĊJ–ê=:}s]vG×C]„‡.yÉÍ‚Œ’ġ5˜ÎkU†ĈǞm5䕘‘$£*äzz~8¨šñn ö‘2–Uĥˍıê7cŝş´Kŭĉ-2Iäĥ]…eĜÀıä0r{âİĜ[A}c*µ½Üʅ‰ŽÉ zÒ[ê>ğpK„B£Ċˆ'Iêj…¤îî8L‹c‚íÑGsùT5­†CŽHëô§#´g(ĊO¨8İħĦÚ­û}˜BÙÓ [IÒş*·´€\N·Q¸[iÁħ³Ż£?à^ĠĴU5V¸Ò(d]ÉiŝĤbŻĦ\óġ‘ĝ‹N]<@öMqqÇïJÇ=y=ÇL÷ĊÉhĊèWÖ>ÑYÛÙeç6%·sŽĝİĴĜí%šñ ³.‰ ·<:óŝxİmŒ§q ħJâPIV*[¨${ÓôûQyvħ;ùjA%¸z„µ°ÉnôánĴÑ\G8Oġ†>‘ç Ïr}Ş‘#÷ĤĠ˜„íS%-ğD@enFìü§Ô{Ԍléċ²r ‚9ìyĥ˜Á.àXp~éïÛÍ1›Vı8şˆĊ À˜ÄK)çŸÈÖΎ4Á¤¸…f’áH™7n*üÇ='ĞO¸Ż4}/ŝ9§½A ·AÓpOĤ{U½;Ä:—ZÁq#/$ÈÈO$瓏Z½;›:cEun·Ai ì|rPıÇáŒVNŒ˙ =Ô~SĴâ1İféıË q˙ ĜiiZöÒŜö/.ĉ1"zäµ=cĵwħ´t›¤Qí$r}ˆÈäŝT8ŬƒMg¨Ĉ³1‚)¸ŽIxÀuÇqÀĴùĦ•P—ˆ…@àĵN}ùĴœ]ÊĠ#óCLĴñómϏoZš£RÓì2ZĦÁÀq‘ŒġçݰĴRµ”LŠ$IŬ†Hğv烞ŭë½´¸ŠĉÑ'‚E’6 ½ o{ÜDMĞXÁ™ĦˆĥÇSÚŞMŻèóΐ´ñLH$Ş>§+j3Fâužr/š¸ÈÚ3Ç­fĊĴùèĤ w|9Rˆ%W•UÜ"“‚Äpġ<ù˄‘VP3ó6ÜöÀ>´Ö˘-éSÜéúŸÙŬ XE4$rÀžŸ_C] ŝˆj1–Òĉ‰‚ZD=ÁäUÇ]˘*ÇDPŞ£€+'M#ŝ `Îès˙|U˘MjLĉ˜‚š`sşžw¨³™âû)™eTeÉ\(óÇJÇ×%ıó5Ċĵe£Š%¸!ŽÜòÙsßĤ*uLhĦ˘]Jö³G$0½¨%™YÂ&ì7zŒùTzI‚ŝĉîÖ9£%RŸ3ݰ“ĝV}FÙk–…{*6Ÿ—9ġéW[RÔítċĥŬċZî)³³r~ĵ˙:I´€Ì,KoîNIĠAoŽ÷zkÏ FĴ~qĵ>cŒ:ġ§°%›jwwıµ-žŒ<Ċ' { ÷úWg•Kƒ²’é×ùеv—x„ÎÚĵÏ<2¸Ğ&IÀúÖĤ‡˘4şIĵI‘YÔ÷„aœp;zˆĞ°£ê°è·ñ‹›Sj|˘’2|ìç#ŒñÖ.ħ,ê“Ëm#ɍ¸3ŒyĦ½Šu3Ĉ… ĜĊ“9P:sĝÔ"ˆŽQˆèAĞV:„ĥ :ĈùÑì;†Ë?4ìîĴï"†'†Dm’‘½† Ž@Ï­GÔizÓ·)V} Rü 4ւ+w§ÂÈ­óAéïġİë‰.\A'™~VÚW?¨ĠĜ*)f=€ÍLĥMH }Š2XŒ?—Jµ·ĵğX.'+ûÎ=ħêxĤ–şˆżâ M6áÚ(ñkŒ_$“ĝ‘ùÖ+0`ĵr'֜—+İ%ˆNŜC—CÎJíŭ)"‚Yƒ˜.w1îZ‘Šao%œÀ>ŬÁż§ġİìĉ[ei…Âp€ôĦž”ÖŒEÏì鯵(ĺ˷2 ¸\$3^Ħì‰Tœ•gÖ´K[’Ċ5¤ĥíwXb…|cžà/ĝĠİŞ_Ù^ˆš$Ky :JžĵƒÚ–?oñÓL*Šƒ&F“àË‹ĜV6ó‘Çz)ˆqzŭş>ˆ÷>c LÜŻÍ`Äoġ##Ó45 ÑË^BĈy%Uŭ܌̇ĤTóùPÒ~êX£ÈF`ÁQĈ/ŝµs½Ë.iş„ᣉ×t`fÂò9ÉÇĝV´Ék}˘óm‰ra%£$}Óê?­jÖ˘ħÍĵx·ÜûċrxÏáŝzŠêü/i l÷Vñ|ġË1#Œzj`µfċÖİyĤh²Ü=ŒQĵL?vòN2+šĠĵJ÷zĤyo!„Dż:•$#óqŒSnÀ 5Ȇĥ|!Ĵ›”KYn¤¸—fı1ċgsúU|2èéVF‚Œ.uYdÉvĵeÉ?ÂÚ?#TÀӐ,ˆTސGFÏŬèĥVò’ÔÏp J˙+gÛëN×ÜW2t˙êkžk‰PÇÊÖĝô=ħ×˙×R?[ċÛdwÏïÈ…gÏaÚämâù/­••­Y²ëÍĉŻaŭ?jè.bĥĠ-ĵècÇÜ+´ħ`{x÷öĞŒıèyÜ·RË Ċ4‡†Ü§|œóÛİİ%•Ċ¤)­· ÊÈ9÷,!X·vQÖYxmÖA4“Ǹï•SXŭ{VŜcoĤB ĥÂüòçÔ×BŠDĥr^1†(c‘-Œr3Ì Ŭ:úœĉ—I¸{™K;İêœGjò|Ĵ;ġíŒÖW´Š5•ğ—Ħ plàö=ë/E}÷ú¨\…ÏóğhŬüİ´4j\w‹ä•5Hw8XˆùC·Şúvĉ†ì„cßXË&ù™–¸É<O -Xä\íÎáœç§?ŭjÂJĊĦ"m²İÚƒÀ= t:N·sĤA4Vööŝq“V sԞAç?"ì ĊÔo$ğy¤9.ĊħĜÖ˘Žo)™‚İ,8Èû§=E&îî]êĥIÇ<èĴ o ßtçdwÍT]~ÂÖŬċy ]ß*§ÌFúġĠ̑6(ßkš]ìEbžh$ç ‚9útĴ5Ž£—|²K‚$R:tŝU”¤ŻqĊhôۋ›ar‡~ö#hÉcŒsï×ô‚Òž4ŽñŒĦş,G{sÍEî —5ÈÌw4ÑH‘?Ŝf“{9îĜâ³íµ‹ µ¨ H?ŝżJ%tÁl6Kéî.L“Ï'ïÎAìzñQÜ4yQÏ3ËZ–Û šC$QÁ¸¸lúqŠŽ€%t{p7(ŭâe[ĥù"™ĠKwÏ­ … ’qΧáŠm |rĵyĜHŬÁ´ĝ †T’H|ÄFSÀ>Ĉx÷÷q"޳öQÀü¨è"½mxzûMÓÒĉċg3.FWGqß­8´ž ĊĠġKÛöh­Èß1ĵoRp)otk1l’i÷s+ úgµ[´› ƒsZ_˞Í]e¸!ÏñĞövú½•Ìï§ZÌĥo!(ı HíלS†×%WZĵvĞçiñI(3 €ĦżN)P‡QY­Ż!Xc*$§£gžzŒ`é[=…eÇѧ¸ÒµŻ³]j mI;›rÊÀÁìFŻéVĥ~!ĠÒIÑWY1ûÙ’?:Ë]™GDĦ”ċHÈ#½VÔ-mŻ­ÚÚ}§xĤáî*ÄswžŠyÒ!·ÜK$3½2;ó\µĊħkµ†Ž·äŭ}ë)E$4e,‘K4‚‡vŬı ÷¨dŒÄŞA!ŝöA ~=j°È;u˘úšĜJ7#´N ]Ü7#ŒûŠÑ²ĠK?³ŭ•D(ż3œ6Ġ÷ uĊmvD½UÌš3pí$fUÏr>£ÚĞŭ+&îQ*ŬN¨¨²şŞgh§XìûR*gĉ$ñĤÚ¸ÛC2‚@[;AíԌ#c\häž~ hu³†Gn£ò5‘Ù=}j&’z6tOŜÚ¸[›ƒ%´JFŬĦ‹€µÓÙê0^y v°Çp~d@yQġ= ¨É½ ñ4’áù܅gV=Ç gë\ “ ‚Tv0–#1œ7˙[Š™î0™8¸`ÁĉVÜKòÙ$gœUy!–) HŒ­ŒàúT0#ö˘šžĴ÷òl}ĈÀ…só~uQ]@fËÇ~†­Êîà•‡KĊ‘£ÀAŒdò}j·RĠœ08Ĝ[,NáHdéy"YIjĵG#lwÇJ€A tÓnâŽô†P­³Í&”fk8%‚½ÁÜrzq×­eğbÇıŞoD$'SĊ9*H ‚X`ü<ƒŸóëR†#1v,Ē{šv2 ÇnÔÚ(˘€ ZèYGf g‘ÖŞÀΖí´û-7ÉıòැlÚä{W¨[Á -\Ê/ĵtê:ŝ5Dĥ&#mĴ%¸·i€ÀÈSÜgŭ§˘Ġám@•†ùüӍݎ? ‘ǽd“(é5dÖíšRÌaŜWp ƒÀê>Ĥ¸‹;EȲ'Ż üçW5} gi-üêŠÉŒ°uÇ-ôqÂ#X‘Ĝ¸²•œgÚ˘Ú\ g9ĉ’¤eë› ‹uy%V'9ÜTŽüŭqUĵ_™·ċëŝ*§{ 1Pƒ\YÇ~E>ê8‘ˆxÁÀVô£K–Ċ"‘ĵär~žùݞKXĴĥ*¤³7m#hÇדĝQµ JUfÂs+Ĉ›(~ïcĜÒZ°cZÎayöePòçSœÔRFÑHUŝ8<ÑkŜô”†ié³DúmŬœÔ°óŻr£$l ÍŞ{!)c·n;ĉ¤ci[$ä÷ ˘€ (y PY‚ƒÉ=ÍO{*ğޘĈĦwgŝıüèlşx#ÔVÒGs§M:„‹ËĜĜCääÏ|sùӈŠ–@ûžK“§Ì—¸6+F+İ´EÌlJŞÓŒg žÙèqT´Ôżİô£É2„p¤ |żB;UkQ!+‡Pc Ħ ‚.?%+ÊáaĥW’ÙËş7*†êÚr³"I3)&0A*=xéTP $Dg ¤àĥ:{ÓZ0D×öMe>ÂÁԌĞâĞĦtù”°ġ"“÷Xn(vFÜĴwzƒL¤Ĥ7ŒŒŒôİn˜<¤Ĥv/ P=)ôȃ–>^w`ô4ÜgzÒïAë×4ƒ‘Ú”ħv,ܓ@ ˘€ \ÔPQ@ EKkm%ÜŜ\[w{œUËğ˸mF$¨ñ J€x#={ŽiĞ­D%Ì֖~tqÀBıUgP[qÁŝCüĉŞÏq%ŬɖwË1ä€?Ô_K,p›×ĞmX•$œg˜İĉÂìîKXp G=N1@Ĉkݲ°}Ce£ıXw` FÜ1ô fރ*[Y\éz„S\rŽF9ĊHçñéëZ­q°·÷1@fif<öÇnġJñ¸ŽnÎâkKâÖò…“ĉU“ëÇ·-ĊS„¸ŠĥÑÁ#}j/u¨Ê’6öÎ1À™;5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?­,€óĝS|ၗŬxĊa`3˧—Uóò}7uĤË‘ĥ–8"ÈRGÌßÔóT›$ÎòŸcHíSƒíVEÔ˘43y$cj·?ŭj­Ĉ@á ™€9ĈÓË}i“DĥÉ Œ4 ˆŸ”ûӂıÏ>ž´À“ËA ċòĈ=ŭú~´ĝ.Z@/°ó´9^}x{ˆHß00Âĵ’0,ì>eÇ=}Ïò­Ġâd†DÀórqŽœöĦĞîQ˜îÒğ6ĉ9<œġ5rKˆKŠÂÛċ%ĥf”°>dLŽ2ÀäñEîÂ÷%ħ¸šYB‹¨Icž<7äqšW™e#ċP;&TœÓ­d@ò@xKîÇŭiİ)Üß!#“Ê†1dòÄ`˜ÌFAçӊ­çÛĈ§leA9R:rx<£V[Ĝ‘îm˘‰G9*ıÀ^úÓ]³…|ıeI œ0òŽi%gs%̊òëÑM.Ĝµ‰”‰×zYZžİ-ĊÊî!GQ´cÛżFê_É^k2êè4~Z¨ÇsRL~pqíK3+ŞíVSê[9ŞH.p¸èE%Ĵ1HĉJ"~6úÒĜ61ŠCĦÜE:ĉdwK1èò7Vú{P%£ÂİlŒŬ½èWvqT0róҔ² ĈÜçıéE„Y´1•;’' ‚2ÄžĦ˙ëÓ§˜ğ€ê¨GjÔ½ÇÔtşmɜ…Nçä9Î}* ­$7,ŠFìmcóüAĤO NöĉŜ7ŜàœF ż­U†431‘U£Ç–öôFעş3£™$…öF…Œa²Ì@ġ9ŝF¨­³(|ü²F‘Í61 Ž<ÉĝGCÏzd"E”á‡=hNâ½Éö•g‚żl{ŭ3M“237!$˘{ô£ašş ÂKĴ°£şŒÚµĉıòag8ÏAž™'>ÜóQ+ħ£îq Ó}Ÿl¤ŽfaÉïÇòĴù"Œ…ÁÊċÉ=>ż$È:K=&Ò6I–V‘€Îs…aôúV¤3gƒI2’°“C˙,ÑĴƒŭħšĤö˙e‚ñáÉáeŭâ}=GçB•lRšî_6)gPħĈĜ2Ċó#zñÔU¤ğ†Hƒ£pŬsOšË˜W°áş[R˘M²Áaü$Šİ—h 3ÄÒ21ÏIĤ¤î𛤠‘†˜Ġ¸ yĴ­oPħU-BË7!¤Ç =İ­ı)­#ŜKóşF qĈ{qWímcžÜ%şD²Ÿ•ši9cŝÈĦö(à7šÌĵċö*€^:Ô^Â&µAğ a÷›éP½£]ŞŞ§ĥr@ġ5CBŬÚ²q$"Œ—ïQ³DQT° :ñóÇëHDK°£+ÊF9PGzu´F`ÈpS’?:ĦŽšˆ!Dg£7ñ}=İG–YĥĞz ‰°ĞËž;SL²ĴcĞ ÒB,Edŝ{G$1‚jŬŒF[Ż6UÊg–>½hzĦ­Ùġ KYÎÀŬ’FTU{‰#‰`X­óp2ûYJ•9'Û?Êİż{CfÖĊ6ıŽ 2f\<ÌNdà’G?áíYÉk%­żÚ˜ 7É´ġ)ÁİZ3ZI$Ž9ÈhcUê Ç˙U@n¸`dpĵœê;ZornîT›È–DD’FPN÷fÉïù8¨} z!Ì!–8mĥ£1uSżċ`ÜëFœ|¨ÊΊ‹œÇĵä˙ëĊKd7Ki C÷ü·!Fy*yÎ*dÔÌ23T€ûĈ˘OPı$zˆ‘÷Ÿ`\’JŽîäK P ?ìżŜUx…ÈmwŬ°Œä€Û9ÀÚ?Ż˙Ş’}.ċPá[*è0tçëך¨è†ĥ'ĥş.|İ˘Xn6îùz0ġ•z¤Ŭ8ó䗀 1ŻċBZwtò°y' zñíŝ{Ó!LèìÛ¨V”ŭkM$ğiٚXċĜ£hȰíÍZ›€HhĠAùœŸ˜ġè)_@5]ĠFYÀŞûQĉÄ`ĵÁûĞġÏò£pDÂvYñ˃N*6p0dB‡Ż##óŜÀC~çÊÚîsŭ+>3—àdöâ’2— })Á :0½6Ĉ^Ĝ‘[”WcêsŝqURÙ˙!XSg&Ò}:jXJKrS=p ŝ” Eۙìá9RǐEL–óZĈE³ryğÊKBĵ2^C$Ë*nR¤?™†ûzšE(ŞašĊ–— }ıéùTǰö(Í+܆%‰>çĤ )³\Ë7ßvl d÷Şĥ˘,¨…ˆBҙ3€7ag?SUƒîgžO'X@Ĝ°=MN‘£ ó$*˜m£9ÁÇSCvˆ ³•ëNY6ĦĊœôíKp$ĉ´e\ŭÓü'=½*XĠĤˆ• * üÌ8çóò˘ÌĞŬX³ĵw2Dħ[ËmÁ›”ÁÇĉj$‰Ì%•À9Ĝž˜Ĝ—°’Nħ0Xċ™oR¤l#÷ïO0ÎĥË)a‚xPwqëôĦʅaÑOħħ*n éòôüiÖ÷MC˜ÙI N1Žà_jW| \³’ÒôyS²™ı9^ç¨#İ­i-’=Ċ°9'½Zw)ŝĞ,ˆ<ä]­ _=úĝÖSÉ6§v…RŬI8:š¤şħtÈ&µžA1ÏòàÀgéItÑÏ#€[”#z…ùĊĉZ . Ž{„@êTrÉ\u÷5{M³´ĥˆÊ%ŜĊJ’N:Ò½´Aìv?4€sôġ$`&ži€—˜mNÜ4ÉŻÉR!rĴ2Í=Â×*HŽûMÇg; ŒZ‚ …Ä  edáó´0ô5ušƒj‚ä<ŝt˜™]¤(„ >½iDËÛ·'İ â˜(ŽeP‹"Ÿâ;³•˙ġÒÈ$‹ċYSŽŸJBĊ3€p=qzOĥ?” -µqê?úԆ5^ƒw<.NGŻÖ£”îŒ8oŽŝ´’&ÄĤ3҄ *2Wš´2[f@ÛeÈÁqÎÑô4ùcF-ä1t.HÁ$“¤¤o ›¤À$v˙9ŞËÂ0çÔT­D,lw‡%{U§·y'˖÷‪ÖñÀcÈnAJŞ|ÒF0N1Ž(NE˜ĥFK2ì“Ż\è!ƒ˜ĈĈÎzóŸ­M„E&ÈgB„ħÇ͓íWmĉ•¸·ĉŽÇ×Ħ^÷ġÓ5£ŬEµŒŽÛ‚ $ݵZÓĤc,ĈÚÇíQ6@dàŽ“Àâİ.ˆ­Oìèn##ĉHWSëġĠ_ìV~mÊĈ‚<ħÇNµ|ş\iz™uKƒ*…¸ÎÑĝÖí½œê#2½~~NjbYVĉâHîZ8‘Q@à˘a‡ Ï~jĤÁ5ìy¸ȸ.yŝ#ġĦn• “•, )ä8ŝâ§I­ĵT@АHÉcôݲCZ‰fO°L)Ğp왍>„žżLU€Ċ$€ùŒ›œ`³|Ç˙­NŽÛ‰:w×­è‘Fî”ħŝ<œñ¨¤g6~üñŭ(ÜÁÁ#màu—.ÂÂ2· ‹ŽzĝTßêĤg1 \ŸozW‘´ċ‰›ž˜Ĉ*XyĉrÀ+Œ{Ó+È˘BI9éLbd3ëLĈrT8Ç_ݵ YŬp½€ĤFW8É&œÉ#D,HÈP§‚Wĥ·Œd°$+ŒgùĠv1Ĉñ²+O!¨¸ÇàKŽU@ë“HmĈÒí(ÁéêßJ”Hĝ¤]Ş›D ÔŬä*Û‚8ŝ^Ôì ŒÇžŭH.²eĥzà÷ġ˘Ê~ċRpGaC°ÇÈ?ş{R½…°ÂNàùç54WRĤŬ’2ÈWcq“ŭqĊÉ µ´’Ŭgµ¸tEmêX‚ì1ğ úN="ž SíŠ!Óâ(˘Üċ@iÄ­Çt-ßjϤIċêZl$şnFş˙“\ĥĤ×wŻ Üшı%a@;ôc7ÀZ°˙Ë5ÛÎ9Ï<­)}ŠĤ@A'Ĵ}­e{’G-ğ][íıfTÏ žŝĤĦĵT‚ŜCŞ9Ç çĦúU!˘¤³Ċ)>[˜÷‘òŽœqĝ˙ž*;ˆÊĆ`~ëĈîĤ?CW%ĜI̘#û½‡ĝÒ£ŝ÷İäv*ĈNo$žxàóH#fçsRÀoÒĦ`drê>ç=ÏĤ€²1ܧ”` •ŝ2¤ŭ)ħáHYIsӂ?Z$ ı˙xpĵ3çQ~˘ĞŬÇ9'<Ñ„ЁÀf$óM;Ë1!kv@G Ϊˀ Ċ çpDÊ0bNcïġôĊ$wX[4ÑÈ"I—"C‰Hàävù­{•b-;qşŠy\°`)[ ÁÉ=ğbĴKtNİ,ñ­´@6â6;Kg”ĵqùTjî…{“}Şi vH˜Œ’Çéġİb_nŽO5)·ÄŠ·w’Ċ…YĵÌ/8\úU?´Í)TsŬÜ‘E˜Á•€°ħC>|cŻċTċ$?B|œĠ ÔwrçLRğÉ ´tĊK“³TK´žĝüݳç*ʳ Rˆ’,`88îr(@<4ıù1‚3ÛÔ˙ŸĈž<à?Ö üšîâ¸ûÎp™ûÙòŞÁv˘àòžiGa ç•-´{ò €OLĠ‹I`nšE'ĠxfĉÁçDÚzŝ•$‘Ü ŠH" ͓è:~µNċŜ`fcÓĥƒċ,,Ħ-ÎHïP2–ûóU~€K Á0LJûG ˙:³nfğŒŞˆA\żÎ9< ~”ÖàUvuvBWĤGĝӖĉD"CÏ#5 BC¸.HÀ8&„Á<’é@–"šTcĜġ=ê4ùŸn1ğ0CAĈ2x4ĉR0}h°XUó'kÉÇJp „Lb/°0îĜÎ?*=½Üú›˜ . ĥT}HïŜ›§ÙŭŞGi#ᔔ‚ ŝ=¨JÁİf[ˆ­FVHË!nêœM4|˘ËÉm½ŻÒ’Mn}M„âĈù•“ËĜŸ_Ö£i#³p*ytġ֎[ +œUŬ¸ÇéÛ5é* 9ڀĴ#<ŝYïKâĜ[•ÚhŜä™\.ŽF;~TIċ O"8Ȕŭóê:瞔[¨ƒžĊ!NJħ?† 0!,£Žâ˜Òù€üÌqÉÍ& ™bJô ǝĉ‚xŒ¨Ċۉ<°" r:?úÔ/0 Œ{“Ê™C.L[³3Ì{ç8¨v¨UÜĊxô<".wí}ŞQı|°9䞟ŝŞ`I#Ï%ɊRÍ´“†)‹á’F}=)hJ­ğÌǂ=ŞmğbÇ#Ó¨íŞ ñÎ;ġ§(RqÔ~´ Šá7ìE8;³Ÿ Şï!fl2žE4ÄF3…EÛ·Ż4¤†“œ ĉÇıÄΛFĊORp_ŞûÖH˜ĴIƒÀ>Ġ)""Ç, pü4òİ\qÍ0~îB‘ìhTŜß1@(M$'PÄíUä*‡+ lġc˘=O#İíïĝÔÀÀŸtŻ úU1„ğʈyÁċ•¤ùNOŠ„>_´*ÜĵĊ3j„$îrA<•Ĥ€uǖm•ŽYĜĵw"˘ŽĈq²DÚëÁ 05 +ÁrYË7Ŭ9ëWí´u>ü„ Ĵ͎ıè{ô¤—@H°tĤ7°'–Ŝ`rqžsúւÙ5¤-Ħ1àüÍ.ûŽĠJ6e$·3çıA§aT˜ÑÑx 1ÔûàùTžl7téĵ*€ğz;U^â ½ş_3ËUmݞÇ>½şúURÀŸğ×ғo60Y³·•ÏëUŸ-”U$Éȧp" KòIÁŬĝt§Ĵ(ż|Œç) :]N÷Lğp˜áp¸`ûĥ°›!—oŞ)ÇëNV$‹Ĝ]ĜîOzPÉçëP1Fìd·\R€BòĜϨ¤6×p=qNùÊrdàö‡œ °àò scĦ=:{S".ŠFx,ùÍXm>Ù]|“0Ŭo`N}°a²›‰‘`BKñórjğ5DĈ0ıŝóQĜ]IĠâB³ÇËtù†E1WʘR0½ıŬN$ĥÒŞ@Vİš\ú)àTĦ!áÓaÜ7dĵĠWXĜòXŠi ħj"Kivùĵœ³ ¤z`÷üjÍ$Á9Ĉ8`JĈ]0N0AÇ"ž€ıó2 `àñÇĝT’Ĝ 3ÎrOù5@‰0zmŸ­fÀF7 }ıçOùŝt\Í%­!ƒÂġÚŞŸl}ë„|dƒQ[ì†ßJ@˙:ÖċEudƒÍWòY@r¤Œ2}3ĜcÓÖ£›Êş]°‰ĥƒ’RÛżĤ^…4e\Fê&&%‘Š*¨*úúw­H„wpÀ P]ö;/@Gl{ĝ~4È(\yJHU 3Âç5yŜ8êN{T½ÀqÁç?ŜÍFççô .Vl€X7£`ƒëH{ì‡,™É$ġ>”0; ˙@#"ҍÁáܖÏëÇċX֓Û8Yc³.qU(èMÊn{†ÈÏÊsRmaJc¸Ëu¨° ıŠ°F?x/­6KIĜy§ħ’y&…ĵl˘31bpħŸñKylmċòŽôt.gĜŠzXvî&p0ÒŻĵë§=ď,R&DdrĴzàñBßP `ay{q(ŠIMqî2ޏ?ìµvm:wÔ‰-íí·İĜÒ2%<G;fĞ—™X§7‡,cäė §,ï0EP8#Žôŭ/@ŠÊ37ök3¸%CÊ U?OD•€Q´†\}ŠP]ŭOǜŭ+—żËÔĈï.yH_ĝ— x+‘ġĴ JŞœ1Ĉ;Ôq˙6yíŸJh U-'.Šû°Ç)ïùâŞ•È ç;Ġ zÚx ŸQOÈì:Ôħ ûğ¨Ûı8q߀t ¨ßĵE+pż=iP%ÍÁóvċ›<˙,ŠĞè2Ʌ!òÂ"Ğ‚ÊŬ³Üzօ½œĞé`b‡1ĈGàzU"‘%ş$wĊ|Ë|êM§ ù¨íKİ,(ĦħnX™"”鞕Cm’]çRŠktT1ÌıVxÈÁì3ê+ ââyÄñ,_ğ˜1Èïĝâ“$Ş›6ˆ†I<š)C‚§>˜İlC¤&Fëĉ{ŒUf]ŒAĤÉı“ld#İ8§"jÈÀ Ċ!ŞìîdòÖ5=Aç˙­\W‰.ÖûP9c1§ĞzĠÉh ÄhÊıÁÇ÷MZX˘h‹³ßŬ*Xŝ}*R4RKċ‡CH1ˆÎ uè<óPÉΞB,ß2ÉżLvëTĠÀ¨‰3°À< Ä3N–7Ê&¨ÈÛŜ£ ĊKf(_$*󓎕ŻáÛQt..6‚Äqħ'qġÇz¨-CcЇHµGÛ>ZHğ”àç˘éÉü=4 :9"‘-ÀhçA>½MS}ghúP³ħk&Üï2ÎˑŒpñ#ñüj+ĝ$’ġ™&şçîìNߟéF€gjQÏmks4˜‘ĝËdŽı#ƒìsW­'ÚÙüÏ0Fûw8¨jۀKĉn9ä˙Jb–˙g\TW’8ço"džǰ  0ÊöèJäÉÎÒqòñéŝ>•SÉlp­4ô(+÷°ÇżÍRR¸ \šLBä˙ġéBİR>ï)Eò·{ñŝ6 pĜ%‡Ĉô§q’ ìÙx܃Ü+YînÚB" £,J‚ÀzdúUD¤AÍşê ,“Èúğ6ÖÏüµHfIn·E$­y,Ò~ó#éúU °ÑÀ…”[ÌîXœ.ċÚĵ`sŠĈÖ_žxbž" $˘NC)ïŸ\K*E‡_’RğŽÔĦHĴım½8Ĉj.!·“’Ħ$šbĵôî!Á9ÉüiXiê—ħ<‘„ŝ%Q’ĠÉ "ÖmGd~|y?Ċ- VŞÍ'ğc€^Úç€>($ŝŭ{R^`UŠK\0¸fŬü*™Ë}qPı‘]—kF8'8ݲÈÄ2J<ٜ§ñ½?ɟ@{x܋#)f]ÛS‚8ëŽġq@ÎÖZ$m$r1\ŜğŻjš]älmcKVr‹“ı=ştml3KOÓo!™eıÔd”dħb¨$úúúV 8Żŭ˘ĵċ­î9T#8+Œŭr Çʕ2pFHÇ)HC­ċpà áZ²Q²OÊ1ŝȨ{ ğ ıüM1XcŻá@&Ġ$‚zf˜#żĵIü¨Kq×=ı˘L 8öÔ=>cùf´žHġĊM Œ`ä}Z¤ÛıĠFsíŜDĦŸ9]‡½tvĥ‹gG ³ŒğÈw`zqÒ%˘&Y$’yZ4IĜĥD[ qÀ §zĥş0A¸üêí ú”ĉše·Ÿ6ßyŞW/%°’g ŽçôĴÑ Dò˜ôÇäi[ vž3Ó€k7ê{Ó˜vñéL‚q’vŻ)Ĝ³ځı1p„ Ü}:W%ŞjŒw †ú uíI`;âĥOA3îêñiŻĦıġÈÙʨÁn“]ĴD½´ħ?Lwİz°%–w‰À–7Œ{‘ż>*7Èğ1³’7O=ĝİÔ Q¨ô^jO!6Ĉ€–T)9˙ëRJıż£ĝbñŬf=˜|ß˙×]”VñEPm¸­>ĝ#˘>7(lŒŽ†¤a!`„˘†`84ŒÛsĦFXž‚€9ĝmŸ[™µ9áŠHRÚAĈÏïŭXĝV½\ôk=4ÂŞü:à.1˙Ö'§­6 Á6 p§ÄAĤ,…%*ˌœk; ™ċ“(_\ŝ•^6#&ċĈ}9ĦlW“ ’=MJ=23Û5 0¸Ü@ÒŒNıö§=İĈêoÚïp+ĥ)¨ÇOĈ´Ĝ°Ó5I-G” bS³éɤĵĠ¤şPğ"UÎAĉÔï…mF Qqkö…–.y ġâ¨HUK.W“ùVmXLnÂħó)Ç' Ÿ!xµGT´µ–Ġžâ-ûyàdĉµ@r-–Şj…\>2pŠüqëġúĠÍvKhXXhér3m‘“{ ÓÙhM²Ĵ×7ëŬ·"2F{óQŜYĜ#î:Òğ·$Ç@ü¨ċKv+ŽšRqİK2ƒı‡“ƒëÁĊu~ŠĜX™-˘uB~Rë‚}ŭŭUM$´b–³((  ûŬVŜeX!7rŞ|˜OíÚĤ²dŽĉU6°ĈÍ2ĈB$„ Â<óϏLĠ$4ïuSI²†Y#³;Ġ™£/´FEİâİIŻŬj}„bâ!ĉ îWdlñùŠvî#›ÖĠR€?}ózġްkt'%‡šÍî6=§"F]Ħˆ8qLgĜ |í*X…‹“œvĞ0“ĜU֕€p!¤ô¨ċdWË0â‹ ÈxuçҔÄ]NKœg°§m@KV$É+&Ä%6Œî=‡·Ö´,Ĥ…mĈ$&”Ž##ŒġëÚİ%ğ%ş $àü§ cÍ_ÒdŽŜٝ‰&WÙċ•Ê·ĤOnµ]Jd—s8›ÉÇċ Êĉ<0úzŒ÷ĴKĉXä-İAÔÇ>ÔH ĤġĥœŞ:vÀ?Jc;K&yDNüĉ³µ‰l›\ġâ›û[ ÉÇ\ Iˆ’Bäà…##½DÒNx4 r›'…7vn 'pړB=CF×­µ˜íİFÁWŭZż !Vû§‚=k{ ħ4EڈŞ=†*“èÖ/r&kx÷öx>ĝġĤ‰ıİĤÚIn˘ĉiV4Œ@ü‡ZáïĈ—Em@ ˙ËCŝɢZ‰à¸Š8£Ó×(X–ÉúwíÚğJ†;Ĉ· Ż8çškTĜ̈́bÊ öŞĈµk£Ĵ_hŜÍ)!5É8˙#óĴĈbjšô§Nħż³¸Ûo+‘IùÜ?~5N×ĊÉk|°™. yI’yp01ŽíĠè=p‹q(”ngÌ…\ĉë´dĜúû×c˘[Ĝ5ÌÖ֎gà,£q˜ä1lÜúP´=y–Ñe¸kXßÈO.&eË7<xÀġv×]ÔaF”B‚(qğä ƒ¸gç•úSzl$WšîŜêÈÊ~Pûy`àúž*‘·’kxNwċ¸ ÛúVMuÈáŬ"‡#*pG^*)× vİÁçéK¨ R@Îzöİ ™â—vŝ:àô˙ġÒĜI,jÁr$œEr†ä!qĈÜsZ`E·a ġá9Ž`ëÏ ÷`Š}@trÂ,¤ĦŬ1#l…Ê;ŒSQö … Ÿ›ŻjI$ÎÛ%, ôÏCôĞĞ~m'ŠHċÚr n÷ ³}İAq>ûy&ó8ٌ?œšÍııÊ2–=NìÎ›ar¨ĞtàsùÔÖÇ2 ,h'$dT½‰-y̲íóÇLtŞrÈL¤ôçӐĈ™ˆÉ'>´˘fĈ4ì ߃“Ë}iÒîb0¸ëHAċÌ˙k’#,_g|´hp$íĜpt™†ˆbTµoĥŭŸ´ÎznĈçPe™Ğ^Hİ½şíéä– ԟŠéüٔħ,YÏ'ü*›V'“:L_ìáp ħCXú׈—EòíôÒıÈ•e‹ÄûFeËŬAï7ĊIx†N=Í]ñ&­mŞhŒör‰$WFq/ıÏ8ú{P­f!³ĵ…!VŭéÚİגGO~5XH›Z5Èl—èOµ!›m¤íÓòÎîc{ɸĴÉ`qW4ÍrÊbmCì²+l!™dâF#€2GsCZĜ u­jó[ÓšÖ 4Ĉ²á™‡nxĴ‰Ħӆ“ fI’ŭ™„À@Á?&=sŠĞu: iÖî%¸[)íJœ1íôíÍrzÁ6×s$eŠĉA*TnÎôÉ?•'°^s™78ÎHŞ>F(Ä`á½Ç­f1ë l°ŒŠ{Ë= -ÀĞ'F1ƒvĤïMĝœĴŞŬH=ĈkĦ°‚ÖûMşşžÖ=ÈĦm£?/׎żáWÄÎwŒG9àç'zEà)’òċW9ùOcÍ>FÜ• c z⁖a³V´••™§îmà§05 "\eWxb{sÍIW÷ِGja‘ä%TàúŠ‘ĉ1íLÛÀ8ûŬ)ÜTÀjš¨Hí×4€ì|%½%+p•2§sñc}s]d·Hí…Q’GÖ÷VlfóŸ>HLcñPġ:_ êRŬ6ĜbrY—qÙì2zŝú£ĤÇ-Úßk̅1PN:+ Şş”2@êÖğg(6Oş„ĵ=NžžġLĈ 𷜋°ž\ûRn,\j(4èlíÁ(ż3d?|Oµ˘êKi£|ñì›Ĵf5 ¨,yç!ż/z¨´ÄË6özÖĞ,:„È×"5’ Ì í, cÛö÷ĴÙ-šktû^ <ĊŞŽà¸ı‡*IƒRÚȀ¸|Fp{Ö,+HڈÇ;Ozt“C&~R­ê9İĥ U”ó´ĉšŠ]ÂŻV8hÛ8Ša#D²„çct>™üjgY h—Ò˙-<ì8Ĥt'%K`0ä‘ĝÀ`hË2èğ‚î#ŒŭjċœĈŜl­Ôf·rıì;Ĉ‘bFIèŽ˜Ž€{wİ’Ŝ+ċKİ!˜l˘ċÁÏn;Ž´ÔzˆÙ·³Ó/ġ m¨öz|Šp 9ƒchÎN1Ö·ŝ”’DñÙˆÈN‘éŒúÍZH.Wñ œ6–I{aoh–ĝŬ#˜Á$˜½ë†µı)sġó7*N7J‰X.HòG5£1…|Ŝòo9?‡JĞĉ?–ĥ}½*\Œ3ÎqŠUl`cŠ@uz–£·{Ĵ|ù“à#1ĥѐCŭ{V•Ô°Áywl"™fŠÔyeŝ`È8úœŭ+­H„Ž‹K éħÊó.ÓùvĞYĴċıHç5ŸAekfÒ31¤•v =zÖ#żná´mÈĞÊgvéۊW2xšu•oĵÙe…Ï–a“ˆŬqœsßŜµ´}~÷Qcµˆ[ùĦ\~eÎG?ĈĞ@9fâHoġ Fı‘7•˜ààŭÒó˙Ï?ÙyU¤mΤáXÁ'ıÎj.Ĝ÷Ï­Ċ$ò‰ÜôU&¤dÚmċ“ÌUhş£pHö÷öĞ–úÍĜó-Y /4ĵ´È9úOZiŜ“R‘²µòâŜRŞ\£×#'˙×Vu‹fĠ˘ÑÂí–2ÌLlÁ|§ċZÙ½SÖ4›M*YdÔ>HO!”á02ƒÏO°Öak;;6™d·hüİS>YL $äġ䞞”´LRG‹cĈˆIߕryÛ鎕\V#$dP·nݵ4í`P)GZMg¸şH‰ağĤђN8%Í1,!Ŝ"ÙŽܜ§ÍĊ1 ³³ıÔ.6Ñ4²œÀSn`6÷ gzpÑğÀÑm.Cá½}şÙïR<°’+`w;‘ê;VŭîĤšU£ÚĈû%–IPĈ XžUyïZĊXM™öÚT:Œ²Û'™äFƒğ·›–Ï u˙ëSïl-ü‹=6ĊĜÇ,ÛħÎFŬĊ—Ĝzúŝ4X.lZhöwv¤ħ–bÄëƒïƒ×ñ­“ìÚ2£ĜÓÛA>%“R²´Sbñ żïĈġÍrĥĊ&¨ËİĜ”zDеX…l’zuĊQ™fG³–X$Ž'eVAÎB“ÜzšnĦjlä]dG\†+·9ĴZOM ĞÉĵ›ÌĜÎÚLÈÛÛ ZÔĜiżi}˘I Gcèá]FĦĠĊ k! Lß*ä =qŽġğV@ˆô› ëlµŭû\¸?.ѵqî*ÔĤ÷rygUÏÏż$=ħíS¸Ê:ĠĴ÷Öğ­P“™–ÏO—ÒıÛûina·ßcr׈J$c<IÇ^)ôv_ ‹’f–=Œ TÚÛ½ÎqËwĊAĦ_ BŜHo$NÔ 8ÀÇrsġϵ ê9żÚKİ3%ŒÖñ·ÌŞ˙7Î~ Ġ;s=ÀĞùH7É´rĞëQmFV§+2ÊJŸPqR­œmyÇìͳËe?1u\qĝšĜ´ħ+Zˆ÷•ûLÊ²`áFôÉ_ÌÒb*êHÚŬÀìOú@ktVùWŻÌG~4Äñ íنĠ"• í ÌÜuĈ3ósíMI§`h‹P¸Ôġ&·ĦY'|9•P½O\à`ŸÂİ û$Hn÷;ÊİV9Ç9Èġİ–ú‚ĜŻsaslĴòÄUöÈ 63Ž;ÔQE%Ìâ8ĵŽxUïP <[0Y£d$dÄ‚By?J,¸ì+ž ÍZ[ wM^_*|òŸAByjçcƒ‚?gw%œâXĥîĈ0ʨ4 ·yĴK=Ù¸‚4´fËqÊdĉŻĝVàËâKtKhJC< –ÉïĈjŻv#´ĵÒm#ğ–ŝ+6’è÷GÚ~éçêzW<|CkĤŬOÒŜ ^?šI;ïÇ˚Ñè#´ˆ+DTĤñ“Ĉ?Öı8líZN›l·|†IŬò„Îxöo҆ëÀ’;œš\Ó$c"ğe€ltµpšïڅ̨öĝ06#óÉĉ+gŻaÀ˙×O ÌKû$YËÄñ,r–*ŠûÙ03ƒŠĦ,+eĜ“ÏSïšÂJĊ!˜Ġh“nG NŒûĠŒŠÔf_ˆ5´ët’%3`ħ :öÉz KUó[=>a$­Pà”N1·žwqê)ú·%ċċ…‰›S{bŒ0TĵžÜöJܚœao–ûšq/÷N:wİ–èœêî‰pú}üÇmó4DH{‘Ž™Ç+Šğż’êTy#ˆ2 O‘6î`gp1ùR“heJs0'€ô\°Ôî,ï<ôŭħVÎòüżמúçRÓ²Z´-™ĉﲃÄ} Éî*á‚fò\Ü,f_2S•$äž˙\Ԗé4q´°Ş·³ğ>n?*•{UĤv•¤ilŭӎ½Gҝk;[Ì$RÁ‡@¤Œûdr8Í&ÛÔf’YÚIeşmEc‘°Û$ò@<`ŸQYqÈѲş1GCıXuµ6Ĵ"Ìú”÷i'ÚĜLì +°—‘ÓŞt›¸!â"Éı>mĞıñüŸÓóİ-ĴĉğuH;ħá7~ĵѸÂŝÖâÒçÊş‹Ë‘íjŻ@ ÚڽΚßÀá9şç¨<~bšݧx“Q½×7,ËwˆU— ċ³ zU{ jIĞ=œp´Îï3˘°ġÉŞmÈ[‘e µħ‚}ĉ(Ġ ĝÍbĝ^sq¨êy¸”"ü!GĦ üĠ]>îK¸ċĥ’܆ #ĉ´ÄM4i4Mƒr0ÁĊSm&ÍŻ•ÇN§§§Ò˜÷Ŝ ,riÒ­£+1,2H°öëù×-ŞèécqqŭÍ*³n`[ôŝ^ġœ˘RfzŞ$‰ŝITç Ĉ:ŽyġâĴY²Ç¤]’Ñ·˜Bùde†9ŬíאÊaÊĥGjŬî˘×2+ÊĊn8cëŽÔï`-ĊâmFŬÜÛNÑ£sħŽ>™Ğĥ~5ÔQ™gu‘_pQ”÷2~µ|ŭÀÓÑ&ğ¸½vŝĜf…YĠıü€ğ!¤Œprüŝż4´…ñ…Ŭŭ¨ċ.ǒxXÓĝxî?Í-µŭĵÚ•g;A+§–FŞœ`eż\˜Ëâq§Ëµ¸GnK§î°ëġZĈÖ„†î 4µIK ¨û³ŒsŽÔIİ\Hͧ Pnı‘Bc Œàƒ×ҕdtRÈ 0@8ÏրÔñÄbI]Pœ•ŒÔօ<‡%ÀÚ 0òòzqÏĦbOq 'öéRE1„†ċîüİâċ‚ĉ]ÓĤĉEċàzwäŝU“Úœ·%^ÑŻ³ïĵñ••Ua‘“ÇNüf’ÑŒ××£Dĉžßg0HìÀÜÁ9ëÏ$ƒÏs›Urĥáœ÷y#ߌŝ"Ş[ˆħ{xo•d—zXqıqÇħÏçUÒ7Š['‡­Nà+DË9VòAì@Ğ:]%Ôp•’0R§§uz½§ˆ˜Á+ÌNÌlù”œñŸâÓ­vuşVÖ7…Ġ˘ħı€ĥİX ġŽ*Xż½ğ€²Áf$‡i0?!Íbyäı‚+2;™fA=ĵ‰Ê/S´÷ĤŬY^@óµşÈ рY;¨=*\ÓBbçŽ:×emnšŬü‡™~̧œÈCn ޏ>´žG%0“í$ɓqŬÎI9ŭyc"ċBîŬ| çwıE˜4ë‰öáĞœ+9À'Ûóİħn$ŠI e˜G÷‚‚üê”[ ™àŸjż˘Ċm-ÚŭĦĵ€",WúûRZ½@߸Òb²ıKÑh--#9s3y½QÏZ·yT‚ïuœH-ĴYHËöÀf´Vˆévotë›ŬIö ”ˆö Xtè3œúšĉšFžtŻ‚Ç,Àtİ“Ĝ ú˘ Xo"ğJÄ£/izÖQÈô%fR¨,À($“À#";HÚÛH<`úRIŠBŒA#äP)ò*ŬŒX2‚I縠QŜ€òÈèˆÎJ§Ŭ)Öï³yŞXÀÇcëG]Dk˙jZ[ĴxŠ;–€*Ž1Îy'ÖĞI8Ó.˘žÊtyŬ7ı Ħ<àgÒ­´j:ġî%Ë#lŬ·“ëYĠ-ÜfĤ‡=½´­5Ŭ¤s ïĠ3è;ž˙ĴéJĴò›äÜ@#ŒŒÑ„MizmĠ•˘IT‚r~\ŒcÔċéZo4QˆgıµŸ‚K è§Óħ֚jÖ`lÛĤİáÀó­´ÖÁÇÊázšè´mfjĠĤY66ÖVê8­vѓı :ġĴÍuxâŭÍÜݏO˜ŸëM‡BÍîĦmbŞn$)ğĤ’*ċmüLÒÈöòÛ İPħÜD›A½=ê\íqĜ}׎deöéwŭzÓ°–Ï^-ç‚h."Œ2çxù÷ĠÂß_-Ì0ŭâáWhëÎ:œÖu,$V·µ{™FP0 AŒŭjġ­‡“ġ^‡ o&ŽU‰S$"c%pAÎH÷ÏçUİ·q N@éÇ”†ċ˜)Á û"Iíd‚5w+; 9êWŝu aV,ŝÇ8—ÉŠ\t ­6_Ċ׏hȐ˘K‘ûĊèÓG#Úê^Öd}HÊ˘7ûóŒƒÛƒßŠÑ˛qX’Ç­}<ŞÑIn#B äaċ`ۃ[žÒotXäĵ&ñ&6N•p†·} ?Ú×]wmĥn–ͽ”ûŽż~¤­hòo)¤É,CqôÈôĞâKħ‹m}‡|A,6Ñŭ˘Ö锆WŸáġĈqĝUëmql|Uwo-ğşt!Á_”c ŭk;¤QĠuÁzħXçßLÓ~Ġ:\@  Ü£ÌÜż˙ŻÒı­BÎĊuß³ä˘#Ná†RéŽIüL’j(¸#‰’ŬĈ:H€òà¸ŞÓʲށר@Á=•ct2EHÒ\^[Ä;Ĥb€ĵçoĤj½ħ/Úós²PÇœd§¸ÏC[9Yˆ­Şj }rïΌnqÇBHïÍSĴäîĈƒp;ŝµ%¸O8 NÑô  ˙µ›ğs ­’´1'ÎC• ˙?^µÏJTÊĈ5(ıáIÎ*ĉî$4u§ÊRYXĂ5ĈvçÇ5™C€rF}ŞKY–Ŝċ%hāNv€i§`4u›I&¸ħ·Ÿ ÉÜ$OĦôĊe2”b§¨§%¨‡Ͻ=PùĦJäç§­HĈRPÒ£•e#iÈ #2…,H3Ó4””Ş Ş '€zUëŭ+H˵òMéáÑ× žG>½iĞ›GIµ=Lïı(ûĵÇ%ÈçqúóúÖŜ­â‡²Ŭi´NÀcw™ıqôÊ´ŒĴ›Wdv1ŬG5Â(s'Èó6q’3ùĉ²žvĵk†u—1ÄTüÇÑì8ôĦì7z^§ ğÉ-¤‰ 6ü‘÷sŝGċN‹P“QÖmĤš‘Sk‡!VLÉü?•MÚcÜdZÄĥw²MjH"4ffTëĈzúÖĥ“âF}J–uo5Âu8äcĦ˙9š ŝ:˘†1VÏÏĜñ˙\\…I s‘ÁÜŝ´çk€áÈVgVç•Üż+óÓùÒĞ!P˳ċ“+ ä{ŸN¨½#-^0Rħ$Œê£ŬG·çMWcím䃨÷&ŻKˆVA+mmç>Ŝµ?)SÇ>”0 ŞL(½@ĤK!šg‘° x¤Àyc FP˙{­" çn>cҖà!RZ@Hgë@µ·áıîq5ĵ- );GİÇáTnÒ2ċĠŠù wÉÎ1Ú´ 'İMc€ps‚84ĝfhXş`60fQäŝ”*G^EŠPOŠW‰÷Fvĥ1ŸJ½˘ÛC=Ùi–ßÊ—'ħöëRßıíLİĠx‡J€ ş‰£…ÎrŬġü+žx"ŽTBc* 2ŒàúVµ!fD^„ᲤCOd ¸J̰ÏÊW Ûxê 6F Ü L `w÷˘à6•Afu=)e­|›•Yä]§Ês‘íŝ{Tí°F.ıáˆĈ}ꚰ‡0Qß6âHíÛÖĦİc/iKÉ*ğìvŒˆÎqóv˙Ĉİ4ŜÈAIHaOfmФä@ô Q@R­:Ŭn.€r/'=ŭİ/˜´ŸyYr@#ĥ;})ô-%†9xĜŝ¸Îxô'j{Ám-„s[/0x‰Î3È#ÛôĦZÀXÓ,—ˁîc –Á—<˘ŒƒôÉï]…•´V1şÙ@İô$çyîI­iÇİ ç5M<ŜTQ4h„Ğİn$„ġëöIi$ŒI+ĥ4^ ü¸ÇS'wab{+èRÄÁ4{ñœ\‚:öûÇòĤÍċ¤~LlÄ.qCŭÓüÇÖğĦŸQş•W{œĜÁ<GżW5H„úm£ÚCÛ œƒÈc×9ú~”Û€PÓuì˜üĠ íž µĴîumœö gÎ;dú Ò[0 ¸µH,%Geic”**G?‡JŠ×ÉbĊ”+°ä˙ïŭ -fɽĵ°¸XÂFñÈBGnĜl9ÈïšÌĵAÄòÂMßw==°kI;˘Ji/–Á‚)aê2áZ6kypÊ7( ‘Á=qŜ˘+›BŸq/4ċ…çû;X8$'ÔñĴÊR\ …òßË/ħĥ‚Ĝ4ڑ“ÍpÓĴa”‰6£EĈyŭ)·wq2zRRRà=¨˘€ŠRrsI@8¨ ÷²} ô A p;?• “ċô8#Ŝ£Ï4fÜÛ}ĵÍÂaʜñíĊW'&€-˙i^5˘Û ?s(àóŭiZîy­Ġ&™öD‡bƒ€IcùòÎ*ÔĜˆD›²+,½Cu¤ ­I Èq‚;˙^ߕHÉ>Ë2CöÈáDĠ“éÏzêlìtŭOEŭŬĴÑ`í†9-Ó Ÿĵ:ĠÁkİ,Ê0[ÚÜ´QşÇ"²,£z:d|Óħǽ3^kƒ8ĥı•YbSċŞ‘zäÜ˙… Zö2í” ”YÁĜĴ !ïê?YŸteU#,]TsŽqÖ£[bIäóĊˆR01Hg˙Ù˙Ĝ˙Ä ˙ĵw!1AQaq"2B‘ĦħÁ #3RbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚâäċĉçèéêòóôġö÷ĝùú˙Ä ˙ĵ}!1AQa"q2‘Ħ#BħÁRÑ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚáâäċĉçèéêñòóôġö÷ĝùú˙ÛC11gE:Egggggggggggggggggggggggggggggggggggggggggggggggggg˙ÛC  *3$&*<5?>;5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?­$ w~”ß8Üü@XX ï³iìêvOĤî´Ùbĥ։c† Bf?ÌóT#8Fá Ġ8'ÒĴ‹İ|´;y$}Ġ~úÔì˜8ŒĦt!I8Úyo­2hšÙ"áñœfÀˆŸ—ëN 6ç<úzÓ&Ä’_8ĈqóëO†á Rr‡ĦÊóëĊ-Äżî³ÈÁ™Ĝ|ˏCïŭ+Au{¸£ Ħ‘8óy€ĥ*ĵˆêR4ÚÈî~™ïJŝA‰<’ÛòwnèjĤ!…²q“ÜRŒ`[ŠXŒ!e T 0É>ç¨ü* ĝBç#ŠOV š¤ĥĥċ¸!O ÖÔpê÷Ğû×[(X`*Œ6?(Ŭn5tSÔl-ôÉ!’'/&rÂF O=*+Ğ•‚ú˜‚òC²ÜœċyÎJoP³t K@"Rä…àu'ŒvëúUò·Â"ÒÂÍ!!ĵȝKqœOQ{°½É,nf’`żjˆ°êç ùż…hĞL%8 €£h§Ĵfé ċşu2gèzÓc•‹6S#ĉ=zÇ;"Ĉ?r9#9áUĵĝ#C²<2ß)Žĵz*îrG¸ĥŠ%ŭċÇÊ i a×í _*IC•၈ĉ„ĴîdıŠÒĝ‚)ċÙş•‘‡ŜqéíŸZËÔġiî/íÉDWJ5/RüϑŒÖeŬdò”qŭâjİ´)ùÁĈ3À™•ĠJĦR=[9ŞÜD\4Q:… _ħ)-aŠDo6Qñ´‘Áġ°Ĉ#‘lb)×3Ç#üğ‰èò7V˙ëP%£Âİ9ğ{Ż…Ú@uĊPù‡=)KmÎ{ž” ³hc(IXœ‚>ñ ‚zĜúŝ4³Ê]Àp¨AÁÀéR÷Qòi—>~ĠC‚sòœçéU紓íF0~loĵ£¨ÏáGQٖ!Žy-Ͳ6÷ŝëÀçŸuġްÂ%‚f2*²`€O-ì([ˆÑ]ÒV‘ĦfHÓqŒ6XœŜİ-ħUp~YAF’9˙ëU1‘ĵ&8˙yÓü=×éĊ2!"żÊpž¸¤Ċr@ŭYà;Ŝv2Ĥi²fMÌq’J çżJ6ÍmDKĴ°£ş€C‘ÏÒµ.|˜šAŒÀ$àíÍCğe#î*Y°WÈĉV3w˙?JĦ$3ħráŽ>vcӞ˙ tĥzUœL²Ĵ†FĈsœ+íô­8ĈI=ŞS)+ 4qÍòL‹ ô` S{eµ\ÁvŒ²~ò?Ĥ:Î…+ Ĝ-ÔtrθŽ&Á–™<Š´—I ş7À“O›KĦ^†é­J‰6ÈF ÂqU!’ò50ÏJˌ2‘ÏM5-@µswèó#ŬĉpŬ@ óYZĉ£dĦc´ $܆”zzÑ;îLUŒbïy.d‘#qĈöĞöÖħÜ[„·XR_şĈy9sŝÈíCìQ}ù†³/9 öĊ@‰m£ÀL„ŝó€SQIjċ×j¨SĈoݽ41níY!‡ £%ê7hÌj żO˜~?Z7ÚѰyO¨§ZÂf܄€£œœqT6:hRŒŠ\7ñġİÊ,ĊUŭ9ĈT–Ëjb)’EŒÀÍX†ÑĵĉóĠWİĜĠË̗^lİ•Ï'ß­KĠ jİġJߒjŠy‘¸†ûHË|ÊF2­–>ƒ=Şù½í [OB“ÎĥÚ\ĊHyY˜3ô<’;/jÎKIm 7,Íòm=·)Áŝ•LtfFĵÓÎë%BġRqßúUswÁI œ2ŽGnOS­îJe9ü‰eDI$d\îvl“Ç{ ŠH<ċE ŠùZBrú˙úİŒ€K bÄçpÚÄ÷İZ"‡–R‡İS´ÛNÖ°0O¸:M”8éìEOuuĥE‰™d‰ù`GŬŝĵ‡£E쇷•*Cm„f.Ş|ϕ€wëÖ9ü˜ñ:$kÖ0ç'ŝĵTô3n…¤-ċıPR§qS& ›ÌŒJÄ ¸Ĉĉ¨“Ô‰"ԄHö’@ïéQ]]y•\’{+çpê×j–ħ ܊ÛuÑĥOͳ-ü#úÑ>•rŒf\%ÈlĴˆ :sîzóUÁ[Ŭ3*hÄ3íŬÇF¸Ĵ›ä?jpf’^€ğ0„µŸutò°Mĉ@œ)>žßç½20NŽvğT¸Ód‰/yçU˜›vŒóéږO´Á §ĉbrÍÉíJú sQäP2ÄJݲ9&ÛÌçİ'…úĉ‹ÄĦ ·ĝċ›ŻÒ™#œİ’6O~ĞL7!żsċ… 6÷9éYÈrü HÇyÇҜ³¨#ħÍSc/yk‰ÉíU’Ú7oġ‡o°ëIF³p…ˆç²­:ßŬ#*ò1ôü(°"ġÌŞ-öopÌpCt*BDËjä’rğğ­'Ĝ¤´+[Ks”:nBc ížĤ‘J.b–ŬóĠ‰— }ıéI>„ßĦJyŸ'q)ÄôÏä6k™f#Ìvl džĵĠX ĉbĵÓ.xËa^ĤĞ+‘™9랔œn+;‘Éİ•of ƒ´ßÓZ/d rÌTc9ĦdڄsȤ‘ĵÂ#äĞşOûzTÑĞMÊ~gĈ=~¤? {˘ÌpEpñ$lYĵ£¸1ċF1úÔ$I˜7ĞŞœì =8÷¨w°˜K2Äû#”HdAĵ )‡żzq‚u·YK˜ îֆ­ċ[.ċoN:éN‚àĈĈ]Ĉ6Sò“Ó‚˘;ĒŬœĥ·ĞäÎÊÓsʌî­y˜}š5Ŝ[’ŬMhµ-jsúĵŽ€È¨˘|‡ÈÎzβžIµ;°*’9$àtëúU%Ġˆ½ĤA5´ÒbŽp,X ŭ)·L“ğ–€@ÈFġ ó .ä=\Ċ¨pTsI\z÷5Lµ´ĥRêKî]ĴÄà˙*WK@Es‡cċàcï¸ŭż½>% 2½)ì ¸}ŞZfUOLòĈ˘–éJÂ*€(Üi¤F}Ĥ‘ àg•ü*1iòää(ŝ3ŝĈVO½Ħ‡\f‰!Ĝò:ˆVP¤"¨öïġY˙w´/=ÈâĈmŞŞêOŜ;şŻ˙’PËx< 2İÀ&‹Œ™Ô´À£˜¤û[˜ÄŠG€?Ż×˙Ġ@Ĉ‰-ÖRîxÊ£üj)HhĞ|ìq·úÔXŸBÓ”"íÈ3·šdĥĉ=Û&Ĉñü?>d™…ğ3 !rx$äôü(I–Ò6†LɌ·V^‡>˘X˜†9)Ú­5ğJħ2Èɖ9ëÇùġGv7PyÈŞŞäJJà‚}8Ħ;Ħ˘ÔEb%˜l“9ëÁôÜF>âí9ìyÏÖ DRŠá OFÉ8ĞĥóMğˆU˘áKó}ŻáFÀK•%ȕÓ÷1dž2;î ¸$ç“ÓéV4ۇ2JmĴ…ÌNq½>VŽÇ âŬlj:)Ôo·òÇP~U` 5vŽÊÓ͸+´ŽêŜ­CK”ŽAšê§ÜŒ·@xQĝÖġ½¤ëċĄŻ_›š‡m‰eKİċŠá’5 pȘ`{ ÷ĉŞ„YÓŭ 1p\ó†#Ħġä~´Gq˘D†PÂ)"P‡'p'˜˙×V#¸ĥ”ù 2?ĵĠ6Qd@­ L,‚i3|ŒÇŻċTÁ#!·,9l?ŭj|p°P•cäñ˘à=8ÁÄK¸ô|œŠ‚Gx£Ú p¤Ÿ_§ô§¸ + ¤/$ŻúR\B6’# ŭİ0*­ĵ~ë|TÌ|İ™Ìj$ĈHô÷¤›Ôi]ËNF1Š–Ĉi¤äàıGôÁJ˘Vä’Äô¨™°Ä ²ğž‚˜ŜQÇR2 Œdݵ^Ggıè)¤Êç$Ó£‚I*#1# ž(Ԗòµµĵ`ħ`OÈWsUɎ7£RH^s×u¸j?q2¨œœgÚ‘í°›Ú@<µôİB ƒċB4|‰;şÓw°ÜCl,OċNÀGĉ1áż)Ûęm™ž­bï,ŞÜĜPì1òŭßîžĠ7ĥ‚IÜp'9İáĵ–V‰Êʧ(T öĤ3i­íí'ƒÍµ’E_r’2Ċ~#=°N?ÚÈİdnµCx<›Ѝ·$¨V`8üAéÚ­Çt;/5™´GòïôûpÍä1 ôüë–Ġ$Ô§†òë…ı%bé€è ÍUŬĴQ´–kjBÄä„]Ş{79ç֕ŸË _!›…P9cíXğ=ˆ"’w[‡`ı8TŝĤ™z WhĠtƒŸéUŠRÏĴJğG¸Œ§Žœ~5ñ‹bYY‡ĝÜsôíçPÓz‰˘M…°\çÛ°˙rœ98'ŒtĞ:nx'·LÒ0!ş ˙Œŝ”„&>näÔÉ#îp£ù˙… A–jp-†QÈZR‹ƒòŒz–ĦˆŽHò›bc“âİI+ş— / ǜŸJ^`5$X€PĦŽr[<Ñ„Ё€‰lhhžXĜ­Ê8e9?V—Ċ÷¸É˙ d‰œĈê%8<ç5$‡!*^¤qšc! Bpz÷¤–Páʰ=Gjb,¤—3Ğ3\Ès†n~˘Ğ‰ÊYóžı#Ħ  ÓiŜ[ z¨^A˘YHOġ÷ëR·“Ê;€Ï¤p>•<öĈċS óÀ#¨İۅT’”cù²Ŝßŭz:(äH˜òjvùK (WËs’;Ô 7÷ĉĞÈ a”(~ѓÏëW-‘ï"$yAÔçt™9ü¨V¸™™Y—pÛێ3NYŬP0s’qŠV]ràÈÇ òH#:HŠŸ4¨nj§½GÌÛqŒÓ4c'ƒNpc`¤sê;Ñ`°¨dċ‚–QŒœt§˜ FÛ Úîh°íŻŻ4§r°ì,¸e‘r¤Qß½2ĈÂK‚òĵ'a\APIĠ2ä4@y'§˙ިh{µÜ˜,Û 8cÀÇ?ʤ[˜š5ó"’B>ñg<ÒÇFħ*<˙fVV8@z(ŝı¨§uy"ìœRÔce?8çİĈ=)ìpúœNÂaRJ0ŽFzûUˆš6]¸*ÌO 8<ñߚ`Dñï•vi<½ÈѨÉÎww8ì)1‘@ ŜÄTdŜ˜“$°ŜkÄ ' Àŝ4ĈG„19#Œö 6mM$ßğŝꞤÒZHËĉF@Ĉàp@…È&x÷F#%z’pX}*ıu–&+o´“ŽŠV&!Œd°Üy ?McPT’î9 tPB‘ġċV`€@< â„À‘ĦUS’‘‚sš­.Ô'dê1ƒBw|Ä"68ċżÂ§vm”ŻB;Â$pÌ"N>ñ–¨ß˓÷bI3Àüö¤Ä+““È È:úS`19|‚'%hZ$ŝCZe•ÚfÀCۑÍC ŒÛâd)#£cŠ{W†á<³ó7Ŭç­hÛi<†b ¨ •‘ħžıÁ¤—@J͚›½· :rT…Îzg°ü+JÚ;{K o0O• ÏħŞQ³ıi%İBk¸…öš6äÂòd €GóŸÊĴĵÉ%ĵ²îܝ(8À9çÓ°üj“W$§rá.@L´_Žß§9ŞäñĜŸjL DÊ#Uuġ¨.&#ÉQğĦnÇŜÀŻmœìÒÉdsŽ:{ÒĴQ„ 'O’ĦĠġ-eÛk§ ˙Ŭ¤b3ä|ŞżUÍ9;ˆEáéü²ôP½gaFb N½;Roàƒ€};P1Âġ+@)ìK&íąôĤ}gÊ{¸ĞĞi ÄKëXñŽ ,>¸Ĥ’{RxáŞE"°Ĉ „"œ,aı¸äóšRqgċH‰äż÷ˆ¨i”yhxŒwj‰²š(\\C¸7u#+U”èGËÛ½/˜YH òžŜ´Ħ°{ëRğ `4d•Žx*£"JBĈ…{–4Ò‰­ìaöıÈî·żä}{ÔâF%FşĠLcŒ"òx T‘o‘ÄŠŞçsŠ‘‘€ÛÊ=³ĝS7d.џ­1…[ċ;2>n˘‰ĥ›+•îz~T0b*ŭµ÷g“ğĝ‡µjÛÜÇmFU,G$È—Jikr’ÖäÜn™dò FÊq×Û§]FgLù,`çiÎ?2üêíܳ"öŜi)&Cb#DTÀ Žzg?δf?şŽë)+0Ĉ6‘ġ÷ühħ™BvR ‘ž3ÉĊD†à~&“Ü żv˜Ì`‚wġ¨dugùTġÍ:&hCî mÎ2i7‰$Εğ,¤yéïC`zEöBRŜÖѨfĦ'Qħ’ÎVŽbŽ˜ŝ*m ™ç9ċħORBžżZşòUĥáN:ûÔsZğĦv(  ¸çëNÌaĴ²ž03Žż­G"20:€:~˘À4)óUŬ·ÀĞwˆ°ĵĊü„Upvêb3ë҄1ÚeŒ-n—·òJ°É/–İnw8ëôύh.™2ßÇıí’Ĝ8Ŭ’1şĝħïZrÜFxcK]ÒM,òFœĵ†@{qô¤´ô;0 Ĉä–A¸$Žr€öℕ2+ĥÑ-ϗl‘ÊíÀfl…>žµÊ]Išˆq÷XíïïPÄ1ÙO G|R#şİeß5˜C)-œġéœTq’ÀğÓ>”ì×í9„H]˜aU8ġ=ÈFNk89ëŸJĞuôcƒ“Ç×IÁÜáÖ¤gŒúP¨Œ>eZ@56FÛ¸ġéœSĠÖIĉ ùŝÏòĤĦ £Ĉĵn@Ú6·$úsÏ[BŜxP Vˆ/ːV‘HfŸuäßÉisĥTÜÄ26pqžzf­jÊñږFGÌLcúĉšÜğhWž¸³š [d/‘¸ÄxĈ0G=ˆŭ+ Ygž7v ÏÙ*îôxgÔf›Ĝ͕<§É“ÜŽ3Jħɑ‚=H¨m•™Üàò:Ё“i8ŽÙ˘à‹! 1ž*@qe sÎĝÀôˋkkpÒ,K$Àq½˙Ĉ¸ŬVÚFğ‘ÚDÚB§;G˙´i´K3eef —èQWb€Ek#ÁÔòŻ+ŝy¨HfXȕËà y?OOj˜ĞK…˜ä|ğĥŸlĈİm¨ÊÀï/–Ó”^„öĤÜB‘ÌÂ9ZUŒgİÒÀ5Bòĵù­}ÌjY‹îFÙ'·$wzӎĴÎ `ŠŬ‘BˆŽçQ´†è1éÜûqQÉáËċ˜$`…u<òsž½MS}aZh70Dm­ġ=„Ë2vƒžƒÏ·½Z[=niŒO¨ÛĦ6ŒŸÊ— ŠzŬ•Íš#^_,ŠÏÁH•Hl{÷÷öRċ˜Ü´žcIµ\ġ>ġ,Hçq6})޲xë‘Q|Ĉ)Ï^s@ڷً8Tv+òîŝëUŜ7#ĉeÉ$òz“ŜŸ0ÄHĜ@8êEKĈÜŭÂ;ġ¤ġeqÁ9ġĤyIğ— z .ĥ£ËpËÎq‘RïÉ$ûÂ9ŸAÀèĦ@„ĵQC ğKĜÇÌ>ucŻġ5qÔ´eĦh¤yLĤWüÎPġ× ÎÒÈÂKİÉî>¸žÔĈ:K;ıĠ^)̈sÊWëëYz”ö¨exöòıÎC)ŝ£úҳ܂Ŭ]FÖùZ|›Ŭıò=ñP÷ÌŻ¸Ż4Í£9äĠ6‚¨lîÀô4ĴÛWqHGİ_Y}¨ĉ˜Êœ†QÈÏ]ĝlBĊÖìۙĤc[-t‘%­ŻÛÙäÏħ§é“Œ}*”´ž[³xŬ1ŭ*zŒšD[xɟx2Œ£60܎€qUÚV–5Œ²íUùFӁŭ(JŠĝ‘Ġr#Ù¸Vä²Âħ/`8£d2$Vğ¸ï]Fƒ-ìJÑÇk*ĽÖ6~Ĥ ÎÎßÌ6èe˜zĉġŬwTÓn-kZ³”LÍ)íÓ> hiú5Ä7)qs|óÌû6*‚X½Î3Ç=Ğ[bnŬµwzšWÈxŝ/’Ŭže6ìċ}óéíí\„ÉċFè—K.ìĦÉëúj–ù÷L:ġéS<€˘ESÖĦî")‹2İ8ÀàQ cŜ€%ÈOġ‡-Û4ß(;d|ıì9ĥû2+¸ŸÙ@Ĉ =Ĉ5IÏúӁÉç…'…‹˜àА ƒHËÚwĜŜñċ˜&zİ ƒÛšèċ\Dc·ş1„isÇı#Ĵv-Ö+쒇hĵ̒wByĈG§ÓŜİê5¤˙*I°ŝî}qíTJ²ù{2.eF'ĦÜüEQıËĦîLŠÛ-ÏP÷!ŒVRĵr;b…WöĞp2yÎ?:H˜ Lñ?Ĉ£Ürè(˙âá=³Mfn6í úŠzäñP¨vL÷…Ğé.lY¤ši6óµ_­jŸA4rÑCurÁVهqáx˙ħšŽM:úÓt÷THċ³ğĜc­+=ÄC<òŜÂ G À˜Ş ÉïŸj[¸ ÊŻ …9АiךŒ_¸ĥyO;0úäÑfĈtz…d’{ÍĞßËĉĥMu1Ĉħ TQÚĞÈÓYñıAÁÈÈèi u6I$.ì@É$ƒgdší̝ìJ°1ÛD#f~ù÷'ôĴoÏo´[XĈĴO&9ĝ#żÊßOZ§m€çĵ„†I†6 ğïQ´Ûd# ŠOì3Y=‰\B`ó Ùê½Ĥï@”´ld)9.p}Şd=6óZ@1™ö˜ך0ğ\úb Wİo ŽŽztĤc”`yx ²‚ĉï2Cx×ĝĝú‚hJà‹“$w‘›¨QHc†Î= lÏ{>Ÿ"´ċ£=)ÜX.}x­†ˆÏ²½²†6ûDh8(ÁüÏ_6ûX7Š`Ĉ­‘ÈÏLS½ƒ¨Ao-ĠƒOñüĵ<|†^z˙Zˑ€v\ŭŜĜê}*!‘ÉŒ|…·w$50™ 5Ŭĉ(ö9ġïI `:zTj~sú!猍˜’ŒúÒĜ++[ğX<´f”aF>Ïµj†EivħHÓ˜`ôì;W'}Ğ<şË=ÄĊ‚ħùc*`GëMèÉ`n ¸·”[ĵ­9À!ĠvŸĤ*‡˜¨­ċ¨R}O8ĦôüZċÒĈÏ%²3û•Ĉ=¸ï7öb=ÍǛ#üÇ ÜSĉĉ^€iÇ2IĴ SƒƒÒœŻ§8ݰî--!˜Zçˆ`³…à†Qö—R‚@?†yôü+‘EğÖ5In'şĉ\ >˜\p}j’jçPĠ´ğ§šòÔÏq“^SaF8Uı8ëUâÔġèžÚéÑl '1ì ‚7)öç)îÄsšŸÙnYFò%?&I8Èġĉ³ċrĊIÀĈ+7¸ ³ĈÙ'~Hà.)¤²'o½ &ÚIۚ· d£31Àš6N:ô§0Vĥ²û‘F€W“Eü;ÓeR#' Á`}¨HÚXÑÔĥrò˙"Żh÷[Hßhc,rFWËßĦôïùĠ%m@ħq"ş)Ecï£ÛÒ­è³Çžì1 ò~ŸOeô,êħ1™D²¨˘ à~°.ÛɛäGEÏüµíùQ +=ääĜuSŒ‘ëÛ4'™)'œž•›%–€ğв7ıÎi-ĉTp +ä Çëڅ ¸ùnëĥĞİ IaŒâ€$3ġÂ@ıäÜÔĜGŞiúÄ”’­¸rħħ]ä|ĴG\UÎ7nÀÏ­trĜ›ŠyëQ´pä³"{’$#>î×KÔHö[HÈ0J ŝUÈŬè2ÄàÇ$HŽÛP<ŸÌôŞqş Ô,ZÀ+o‰ÁˆäÜúWAhÑkv+&£hñÈ£jH¤Ħeúzŭi[–áıŻĤxvÏMmÑ4ĴÚ~?*—U“Q‰a]2ĉC€£×ÜÒ½ô(Ëğ“TŽ=>KÙ Fiĵİb vıÏÊF;<}*+ßYX]%ĴR,°Ìá‰)€@úäқzX%wŠ8SÈp' à}pz×w˘ÛIĤùvVΒU.9w9ÀäžÔ£`⠉të[İw§”"Lnh›×'=ĞŒ7—Vñ-ÔĞá Sħ9óNìœú@ϵ6Ä_Óô¸uÌ,2”gM̆ÛÉà‚ryµl·ÚGrn"bÀÔûÔµÔdWL²œ:Q]mäzç5š@1xPÙS’V ~„hq2ä7·sLşY `ôU½ÄqòöäTÓ\+!H. uôâ˜È26ç<ôĊ*6À˜`Z}JWE/TÑëSFˆŠUIo‘ʖܐ’~èÏQŭiXË@ˆXëG˘Hûy@‘Ç`p+²şsÇ5ZîÒßPVŠc½WރÓëS° M"ɐ@›XçEWŸz|î­ċ”Uŝ8Sġ92Ĵ\ƒM²WÉ·‰vŭÒqXŝ'Ġ&´´ŒÚÎ|ĔyĞ S?Î‹Ü cÄúgöX½îN2ƒ—8Ĉ*–ğâ;wÒ˙â]|˘ĉE ¨ËžžÔ’ÔguİjLżdĜŝh|Á9üġŞ ûÂY|’{ÒwêßĜ­ Ñíġ^`íÊ Ĝ qĈ;֎•â9ZöĉyF'{|GċG˖<תzh„Ê:žĴêÖïû) È§İú˙JݍOk&‘alĤ‘Fé4$‚Os뎣ڗA'‡´‹IÌ÷–Ú”² ÷{}ïĊrW‘­•ÜÑĴ ŽfLí `ıúĉ‰-4 •ÚuûAb§iĊFA:‘ÉÁ_J̀›#¨Î)Ĉ&RŸ&{šW)€G*0¨Ĥb,HzS@In†YÂòN ÀRsž‚µçıt¨nd‚9fšGT áa@Û·Ħê Zĝ}éZ‘‹Ŝ”uö ŝ.ıIŸ4žœrR`Yû!û)‘Y0XO$v>­2Ŝ)MèT KyíCi!.ĝnŸjĞ%²rrn)! X’sŽô } ŽŜµ<<9İíڐ†—ŞĉwżKxĤ…ÌRK! ş sÓë]Dڔ…ù·ewqü+Ž ôWUˆêżÚvJ²´ĞĜSµ‡ħŞÚn‰&zÒ%ôĈ£ĉ'ı=MCihUjĦ~ڇž#ĥDhd”ĥpÑżcô¤­ÔCSoÁm"4rDX79=È=Ĉkšñ›uq}rÖâċ–QŝĞËÈf0Ŭ†pqŝ4!˜G×M2E Ì긕ĥíTlòı=qëŝ.İáÙĴ´|Ž7ÇîܖĈp3î&€˘5ë§·šÜÇ,¸Á+ó&Ĝùf ŠĈĉâÖY`MñÀ3& w8ö¤Û`YŸVG‚É\ËċÊJí1ч'¨­Ï jko¤K oJ1ĥˆĤw?͉{UEëqXŞ5iïµbšĵqJĈ†œċqÏ'=}:VL‰ww4ÛcPÀ(äqŽ&ô§{ái4è´é2[+rò,lp£óÍsÚyž‚öŜĠ.gvf•'Ê;‰éŸB?OZ}‡kË1É$äžj{)üı6’Ħ[İ5€T,û”ŒŸ Ş3)9µ6Ğì#+œúS;UcOşk;ĝ ™ċzŒŒZ· Ì) ŬÀÒ,’Ħ‰1 gqöÏ=) (‘Ù2…fä 'úSX(èÙü(è‹n]#+ËHĊBŽNx˙ӇAğ{6SUR„œܟqЏeÓgŠŬ§ğFWxRNzzŽ?Îjh µ…C_4ÑıBB.#Cɧmu šV[kóÁglZ+[X~pó[žŜĵò~µ <5 SĊ ÍrĤLá^5è:‘­RŠ’ †Ħáeµ³y­ïD ³$›Tž;cùW)mp­/ïŝêĞޤà?ÇRâ“jM>ÜéħÜâ‰_‡aà“Ó5˜dù` TĜCŬ²›½=… ÄŻ# t¤Œ:‚h[?ÙÁH¸*ÇqpI'>§ŸJé/'–ĝŬCo Ç~Œ¸ ó €Hüħ[§tÑ'_l$[hĸóĜġİ);\fGˆî."·E··²Üß4²‘œc°ġ{ÉbĠċeğ–íYˆŜ“~}=:Ò½µ~OI§ ­‡•4rI3™Ħ˙­E݈ġ†>a¸lù¸)° Xgħġ§'­×”ÓÊÛä”@ÍğÉYÑì*¨Ŝë·?(ç“À¨m°p\…ëëO†Y:BîğԇO̽óíK¨ÇYÙÜ]Ŭ LÍÉÚxè2zŭ+[ڃPY, ÚE`w£hĈR Tn„kĊ{imtş•Ô76³<ÏñàíPW‚?!úÖv­ygjĥa&¸dHvĉÜ çŸQüŞŬ­a'ñ ĠŬ„ê–öÒîÖ]ħá‘}È=;Ġ-Rµµ{T™f-ċ£,HXƒŽùè*[W)™7w‰s$­öhâópñ´tJŠxŒ²s€x$`‘ĜŝU fó ¤rw“ëLn 9hŽ…Y–4Ĉç!FN5qtĈš2Ŝhd …1‡î'×֚ŭ+DĵĠ¤BV?Ò61íġŞrÛË Á×÷ŞÛJƒž}8§f•Àéô\…ŠîKˆcdH˘VČHàĜġëNR·ŝÎM6ÀĴ²ÄE$ „êÀcžç­iµ¸1#+4újÉıL@4pŒ ÁÎíÇżÓ5[SÓa]"i’òK‡Ž-Év8¸#;]XWiá[˜ĴEŻÚ{.$1ä(ŒóŒœç[Phry0G}9ĵXùù˜ÓŒqŽż Ea^ c¸‘`Óì.x&:’}ŭóÒıİt}²´2ƒÇERrĴIÇ×ħü‡­KŠÜw+@¨%1ܳĴq.KD7r=qŽM2òÍ­˘IH[ÌPÁUò>£ħ˙Î)ĉ§…Ù6‚FyÁ“¤ÌZdZğÇs’È?vóŝwvšd #Şä*ˆÓq?•j­m³Ë<+*nÚŬ7 ÈԔ€ÌĠ´Ġž)'·ĥ·’ó)™r+–ğî'ĵKÍFî°ˆÙ!LôÉÖ BÖñ‹IcKkçŠ0Ĵ·v(Œ:J‡IÓ£Ö¤TóaoŬÄ6Fĵ›=I§k°"ı‹ÍħĊÜ$60ü aÇ 4ûf Şĵ¸èp:=ê,փ!ïĊKÒÛIı£ϸİCIß!‘R#,ŒÊ[sísž¸'ùVíšÂ?s΢Ğg™öEàĦŭ3ĥ´v&dĝžóíSĦÈĦÉ}ìÜH1ÓÓGáÛt–ñEDŠ ™ànw#ñ¤ġ’³ĴËj³MoĤD‚)UBşŒ|€e³ß“Ž}Ş“„¸ĵ…-­Ì²î "f ¤ dcŠ$2Ó'—í £Ç˔~óëTä.\ï$°“žœT5Ôh¤Œ’7POVR$… |€¨ÀêsÛüh d’zš–Úœ¸i£‹j’ “ó{ w ÊŠ"B€AƒÉç½[Ñċ‚ŜçϚċáhˆ(7ç§µ> XżÖüùïÚBÇ}´°bIBcWĵ$ö2x‰b)żĠ™ŝgÈÜdžj“Mƒ:;O Z[ê×lÒŭċ ŝĞÏrOéR]Úhĥ÷ ¨ÒNŠˆ³?\ŠÒÂÜğoBomġ ít‡`1°Ï­súÜKmŞÚèéĊ½ĠÊÌÀqò“ŸLäŝ>ԞÂG`Q<Ġ”½T¨>€?È~TğİĜD3#$ -‚+ä°Ħ'Żç\­ J7ş Ûr̄·\1%$óĈÇ4¤½Ñ£/\Œğx™çÎlœûĉ¨ĵ+eŽHüÇò”·e §Âppj@·jìfY§‡í¤ğNFϽwÚÖŻkmۛ߳˜“qHĜhÏŬ­£kcÚ͵ôM ħıgNK\rN}ëk40(k–“ßé’[[L!•ñ†ÉöĴ[ LZ}¨É/”ìSi!Ž@8'84 #ñFĦy,ÛŭžÄ"˘KóncĜ twVÉ/ÊÑI4Ş+ÉäIŒzöëIï ‰yŞj:[ÁĤ\Á d–óžDúÏ…ŻE¨IpÒj0™a_/Ìôġ9ÏÓmÚ1áqÈìĦ°%Oj–ŝëíwM(Pƒ PÀü+;é`#i]ÂlˆĈ=†IŝfŻj•öĥckƒĉ4y’~¸ŝT&öŠ NĠR"´Ö+ŭ4°„$r$~k+^ŒÏBsŝqN7z 2˜üŬsŽ3N…öJ¤– NaÁ#¸İBĈŜêêÊb‹ƒvX3…äwö#óŞyRşFÁÚY~aÁê 6ëİLC ŒŬrÌÌóÎ3ïU9Ĉ=i7p RELċîiÎÀ3‘Ü260 ûŠJ–L4Q•@6ĴGs’—òİôÛÙ4Ûĝ£U/È 84\GA§xĤkeà;e81ÄK’ĜÀ Ÿ…l݊$žU–{o)†@ê¸ä­lĤĜĴŽŽ’ŜŜ8Pa#PŞ=Ĵˆ!ŝ&žíŝhì”CĤò2Çêñ§mjKu R¤RȨò}ÀÇžô°ÜEpd:ıŠ8Âħ§a_ÙŭħŬ´q‘ÁúÖ\>„MÒM*4oğb9(ă†Î>”=U‚ĉĦáW¸eÓâšF‘Éó%™J•ġÖİ^évrjE’+Á5܍0ô“Ïó¨”lÊı‹#í&&”DA+ıĈéI%ĵ‰r>@ċ7Á#={Vm TÜPŝ(S¤ġ˙8’ĈÏJ1jw àŭĦ$SµœwŬïéUp,ĥ·cĤşÒĴ£ HE‘É%ŭ€ì1žixâúâú1²˘-È ò=3ëTċf´zĠŭħ¤Ş—"sĠpĤ>1Ÿ—ë]>$+Ĉr@ëÎÀÓ‡ÖnŻ×Q[ı&³1äÄħE'};šÀmmäòeS‘#Á.ïBHÁÎqÖĦàiÙĝ†m‚A’Œóˆß·’>ïN§ñĴ½oV—Xž9ĉ‰`ìM¸äñïĈ(“èu.Ò1èzsP1*aw2Zµ²ÈD.ۙGsEÀjÜ:ÂÑg*ŜßOİ’Yžè•‘“ù‡$猿OÔSB*TŠê"d1‚Ää>y€·äĈúq‘c̍€6…$î÷8éT°v“ƒƒŜ›@6éz€°™ËÁÄR.׎AÔ{Ĉ{F‹Mkż-£Y%Ù,9\Œuì9ިêħ·.}ͧëŸÂ‡äĵÒÎħĈíğo O^qĈ})İ9aÂíÇâ€ĵ' UJóâëùĠĞ+ù-Yˆ²Ċœí` Çħ=)èš•kmŜ Ç4ëı•›8Ï8ü+c&ĥHÎkeŜñ—Ğ]Ê['“ÏN1L µğ{yìŬ!’4 X“Ûsšĉ"½½‰ £YMç†;y;CcëÜö¤ß`GIµn%{{‰˘ÄĞĉo“qϞüSíġ›;‹ƒn²8bĤ6S@ÏċïT&>ëìİ$É#FIڛ w¸ïák´../€ ‘İ "=ÉîǏsIŝCG;{lÖÒŞğ†.Šç²:z$?’72 ÇËÔ,>¤ÊıÚħB2´³.6o@œ}hÜĥ§İ[Ċµ ¸ùQg^ĝü*•ÀϒHÚ(Ġ"*ëíĵß‡j“O‹ÎżŠ3›“ÊnۑߞԖĴÊ+EÑe´Ôu;Á;bÛ xê Ĝ{b³5ŸÊ÷÷†3 Ġb‰~겂rÇż'ù֍ò^y­žŜ͵v€Ċ‚0Œ1ǨÇZ/ĴžÙf³´a qáĤ•”e{p:‘MYŻ1’"ËĤ—ue’µYS*˞íê*†xĊdĈ%9W! ¤1; :u•$ƒlqí 2yêr*x4<7/ r ,е”ôö?\ÒE1ÙäħQ<ägnq’=ĝ•Hñ[$Ñ•ĉW\£i ÈÇ>ôÈÒášÙÁê#èzSĜD—Ú„×ì1D Ç|w>üšĴŞH$ZMŬÜfCö{"=Äcĉ-Jc¨ÚG<ç½bŬH&ş–EUܰ™5mZ"DÖWÒ[e0 ‘½7ü˙Z׆ÇEĠċŠ+)g³¸s‹ĉ)úJÍYƒ:Hïġ=,wĥżk·è.-Ç*=×ñ­?V³Ô‘ÚÒa&†Á­}I-ĉı­ôAâOO*äË!•OP8çéFÀt24‚61€_('Œ×-47CV¸Ô]ĵ›!‘4qLWž;tiğôs—Ĵn4,Hıĵg9ûùÇŝgóİobY5İD—‚ŬىYÜ “÷IŸÒ˘ZĦ—Ph–;YġšŜŜdŭÚgç ·Zî,/-o­QíŬ:£…˙ qzى£ñ^ŸeĤÎĤ-,ŠIWbO˜}ġxíš'qĈHáTóÇQ?ˆ¤vñxNrŬÜC!\FÁ>ÔäâÛDL—· ;ĥqó}{Öĵ–&äzĉ‡§%“\­ħ·òŽĉ0&N>1ŝÏézÛèħJÑÀ4Ĝ`òƒœsÏÒĤV‹ÔÎÔu+Jċç¸|³ p£8­Oj7·Z¤6ò°¸ŒŒm˜=Fz˜ğËPkCSRÓIYäĥH7!‹ĴьcİŒc×ŜĠÍYÛO¨ÍäBçtŒ>BNÒ;“ô§4Ó²ğ›Óév^‡7—M,’ĞSÇ\usPı[›£$H00Ş.{äŝ4dĴ4W$``sġĦ$tVUbĈÔg5˜Ä9{NNhšıŝ‚· rÊpÌàòyĥ;SVê"´ċ „ÄSŒg­GHaEPöÍOh"3ݜ"’Ġ`¤œúİö9!òâû%‘N ÄììŝÌG@ĴËŭ>k'Rt.3ĞʸúúĠË]„UÓÀqÁ%ĴÒâ3ÄûCmù‘ëùшOc­ı-{~ƒŻEİÙ˘ċ]³F:ıÉ,qùsë[KbQ·§x’Rıò v FWxĈî2@÷–İ^+ĵĜƒÌ–Ŭ›Ó’1ĝñùRÑ­ ħ­XúŜ•-ÍĞ­›˜ÄœIŒÉċ¸ïüñ@>kI­áŬ8+ĵ‘ŸĵÀ½LwŞÎ­ IÇ]¤ŠĊéĦAbÁ°p\qžĠ£§ß]À—]˜ ò#psÇ8˙"’Ü š”òÜŜ<—ï)qs“œsôíU‘ÙYNNAô47wp=GR{İWɲd\Kœû{}k+TµğıÓ-˙ÓüĤŒ~üîÂ}ŭkĦĤĊħ'ˆo˘‡ßf™&•c9úä× q0™ ´Ž§$çü+*PCY€ƒ·ŸÂ5„‚DùcxéQ{ Ùó5)´o$.’ Y[Ğ÷ħèzúÖxı²‘âĥ¸dEb^3ÍSov%b›ıîä/q!‘ÉÉfêjÌİmmb’E!’i‹ ÷$ġ4£Ġħ™ôâCĈъ‘‰’3ŠJPp:ç9¤ 8¤ <M#¨Ĉh Š–9œ(BIŒ0b‰ŜêßO“ìC$"îE ‘àċûwéÇċZBÎ÷%™v†Eş‚é˘YN ‰èĊKcÜöö­Û=6ĜJéwµII sĜ˙­\amDÙŝ­İOjÊÜm“;f׎ŠzyúU‘{vÑĜj/˜ğ6GûÀxû÷޽ÁXĉġ|;¨Ĉ°2Ims†C:Œ v>„gݽt3jZêVĉEXnĦhänpòçÇQ“hfĥ³au;A Ôo"ġ˙/Z·$›#fħ£İŞ@s°êhħGq”xÒfó€?:İÎİç*qÓÒ°&]ë—"ó6ö ıòi'9= ÀӚNÀfÜHxÊC rÙaŒNŝ´‰u-ÄtŒŜf‘üéY\e<.óĵ•8Ïn?:fxݽğ‚c ¸3ğ•EÀÉ{W3÷72¤0I$h>r&S=sŝ}kvġ²CP{‰/%kœùĴÇpô5^ħ{ê3J WìP5´pÛ΄pï9=˙Ï4jҙ<Ĉĥµnçˆànz%aX•žÛRŠB^EşÎ@y>VúvÚ³"òdِxìsRġWEŜ&Ŭß!ùO@{sRP"nGnp£­Ħ’@Š $0.Kd‚Ú6S‡rÄdġQßó½S–'†BŽ0E6Ĵ!ÓJf(J¨!Bü£Ċ$Q‡Ŭ– IÉŭçR1””ı£½O!ŠKDmÄL‡iSüCħŝŸ•A@‚Ž´ ’2Nˆ ˜+^×R—HÔÎĈó£…>U“éÇóú‘Uaž†]@x”§UşçóϵTĠġ¨ëĉ™Ì;Y#GBıRŝ=ŽMiwËv.¸îĥi_g{€V@íÛŬcíĈ3žùġĞ6šÚi–ùğ•.¤Tƒ …žfŽuìSsœz` VÖı;ê6ĥ–73ÇHbšĠŞ2D‹ÏċOé\OzÊ Ñ$jpΣœöÏ*ĵlWŬŽA5˜ÎÊ7A|8 Ûò’KÊħzŻÒ¸‰Ód§Œb´–ȉy8Î'…$r¤Ğ/#µ˜Éa‘9Rw‘òßCU¨b;ğıĤş –7IËG"FZçï-ÌS àHRB’?OQ]SîB3JG×$ÎF1ӜgòĉĤĥ³Ŝ$kŻ2ù>f̍µ`—BÊÏ#mù†N1“ĜzTD皆Fs@ÇŞ9]ûNÀylqOğ'ÌzÈBïRp:‹)ç6€.i÷Ëjċ&ˆMnüŭéŜúœöòEra—†N9µĤŽÚÎ%‚9¤ oŽeÉÏz”€ĈŠ1$›|ČìxĤ„ċ cġĉÎ³ ÒŞAۆÉê},PÏJ—dBÛqcĉáqÇQ˙×ü¨P3ß=½ġÍŞ·V䪞 G ž\ÈĝiÎÈ˘àIsw5ÉùÛċìŞ0£ Ü $š@äŽ;d˙ÖĦc}ό}Ġ=Ï˙Ş„"ÌIqmoڎJċN?Çü÷¨ Ħ¤ (ÜGžĥ!#1?ŜççCÇ~Ÿ•uZ†Ÿc¨XĊ¨A1HĠ:ÀŒt5qIŬ5žg$ÎRċNU8ƒÜçNĥÖ#„5£ˆŬ€Ĥ ;'ÍZJ"9­M–ÛR•‘<·?Â:!Ï\÷ġúĠUĵ¸Œ‚Ĵ2Ĵy9Ĵžú ĴĝÜvç4(%°:Ԍ˙Ù˙Ĝ˙Ä ˙ĵw!1AQaq"2B‘ĦħÁ #3RbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚâäċĉçèéêòóôġö÷ĝùú˙Ä ˙ĵ}!1AQa"q2‘Ħ#BħÁRÑ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚáâäċĉçèéêñòóôġö÷ĝùú˙ÛC11gE:Egggggggggggggggggggggggggggggggggggggggggggggggggg˙ÛC  *3$&*<5?>;5:9CK`QCGZH9:SqTZcfklk@Pv~th}`ikg˙À@!˙Ú ?­$›@Áŭ3Móò'÷(Ċa`3­u_;ŸMšl°‰[i‰c‚,€H7ĝĠ"Lï)ö4Ô<ûUŸµJ#@Ó7’F6Ğó˙ÖŞ²c p…LˆÀiûßZdÑ4MĥEc8Í8SïN 6g<úzÓM‘ùDƒ—ÈgéúÓ ¸h>Îċyġâ–â¸F˙¸a…y$`YĜe—}Ïò­ĠîáŒ$†DàHËÎ=9íFûŒÌviħ,A<œġ5rKˆ_KŠÂIvíî'×Ó·ċI…ËV“\MµGSP L‹‡çžÇ‘ÖŞkG7R•e‰) #ŻAߚè *2Ñ6àäw=9çü÷o ÄĤ"ŜfNàŬíTÄ0ĥx gÔRŽƒ'ùÒ@[ŠXÚYB•P@À ‘ÏıíĝT;ħ¸(cóÍ&ÁîK Ò[€ĜËc!zƒġ­˜áĠŻSşÙBŬFÌQĈ÷ıSQ°ƒLxd‰‹JH‘ƒ÷ÇGwr!†ê- ħ2+n I?/=zSрäÖ.²VԁbB:’z~5| ˙(ĵ°‘ˆ;â‘wqĈqÔñĊğaı-Ì­6Ï´ĈË+ˆö·äzĠò‰Nrp£§ĝâœv²†‡“j‡fÀßÎ8ô=iİ!Ŝß&GÌ{PĈ=Ù0DKó`œŽü* ¸íl)ŽĵóĊ=n-nO$ÖÑÂı{Œœ TgÄÖëċI6ò4G4’ĥĤiIfñsÊ·…”и3ݧħ>µ—İê³\Ŭ#[³bÀ6=żĈ–Ĵ½Kó6GÖeŬhüw$ԅʘüùÇ^,ÌеYHġlĉ¨ ¸h˘‘p¸èGCIm R+y’ˆŸ¤ô>´ĥ‹ˆäR‚Š}ÄÑğ ˜ôyĞ}=¨рÁTĥF=½èV ¤0:â¨`G=)KP6ç=ÏJ,"͟–PîXœï1Àħ˙ëÓ§”ğê¨Ghİ{‡QÒé—Fr8o˜<úTZIö£RĵŭÖûÀc<ŝú…™4)p›d}Î Ä\†żáßÖĞA Í ÌÒ*²@'–ö+\¤ş3£™^+ц˨÷ŝUEmYCƒòÈ0Uršldm Ž<ËĝFpyïL‰dWàá‡=qI;Šä›â7*Ï >úĈOĤi$̅Ĝâ%9(ƒžŭ(Ĝ454çY`IFC‘ÓÚĥ..ĵ˜šLsÀ'>Ù5ܤaŬÜySLmöFLĴ9'ŻP’ ÜÈ\€\ħè}˙[‘Ôé,ôĞ8ÊÌ%2ħƒœÛéZˆ9=:›Ĝ¤Ĵ$Éd¨²FĠ9-RĠI‚îH<+|ñŭ1ÔĈˆË•Jkİ|Ĝä¸_ŬĈĜó`ċOTò8Ğ1ŜÁ,BDnàÉ?áMËKĦ^ԙmYD…\ T‘U"’ò0aš3+/ŬeaÏĦÉĤ¨ÔMéżÌ êŬ@ óYzŜ§dŠħÚ–\҅ƒßŜ´‹ı1V1ZGğ›÷’,c ċ_n*ŭ­´WÂ8Ë´ï˟oOĈ‡Ĝ˘üœúƒY—œÈShP8°‰-Gi3û…ÇSô¨ŜÑٔ„ §Œ£ÜĠ!Žĵµ(‚‘FK÷¨™˘( °Ûߏ˜~4„D 4d<¤c•֝m›rÔ䁊ĦħÓD‘*B?yż‹éíHê<²ÍµXv&=ˆäM›[~XŒàvĤ"™$XÇV8¤„XŠÑĵö+…SÉŒ`ĠË(Ì×~d(OÌĜï×µa­Éġ+kVO7?*ÁxüŞİÒ6a„} eàŻU ħôŞżĵlÚjĊ7˜Z鳕ÊĊƒıàòHŝŸe­¤–Ö˙i|rví>Œ§osbi.c¸`aPıIÚzò? בܰ28Nx)Ôvçó¨Ö÷$§?‘,İnìŞN÷fÉ?ŸaQ<á|Ĝb1BŸ+H͐Ç×ëôŞĜh€K"ħbĖXŸJ•˘(ye(y%NvÓl +hÀAqı]%ù[=Ž ħwwħ„E–Hää‚>ïù5 §˘íÇ ħIJİ6Íù?Z[ò'D9òĥHİ{$WBÎ7‡ċ}ŽBŽċO9ü3Šž=EDža,€B1½Ş$˜|zŸ›&ċ‰Ê…É wô¨în…Ê2'-ÛkçrġÔñUPïrb×-ċ• ³ĉŝŝOò§\i(LÀ…¸SòJ˜Ç>ĉŞ;\H–ÚéŬĵİX§Û¸8qê?²Żc?i|Í$§r_Ë%¨ú×WO)ï2áIçÛü÷ĤF† ‘ÎÖnG ?Ód™oË\*ÉóFyôíKogö•,5U<ħ9vç°}.-Í7uQ’jħHċ›ċœġç…÷?áEŞy[Ÿ)#’ô¨ŬˆÚÏLŽ ċ>ÔĈC|çÊÚm<“ž•œœżéJ" †mÄ.Ĉ, Œnŭj†^TXá*‘ÜúUtĥIáÉJKP­krڝŬ!n0? š_¸œ}“a–\ħèÙÀİĥˆ‹9 cħéRû lWĥšî'›z e€?SLR‰ûİ Ë1“ĉö8îE ôavRšBtÈĴNqÔ˙ú‡ó¤–âI@ìp1֝„X70‹ ­ĉsÀ-ò(ŝµY_ĤNzúRkQX@ĜyêjtG˜ċW €|p1ġĦğ Š ’ÍeF3šU“jѳžİnħĵI*ç•'€sÛÒĤŒ4ÑpÊŞ€Ÿ™ñ_xü¨kBŻubx­˘ı’%‰÷?–ÛĠ›îtg×&˘!á”Â]\É@ŬON=ê5ħ I&XĜ,R‰ ¨ŠT€¤tÁïŜ¤×fî$áwǨĦĞE!Ĝ#˜Ħŭêî éO­,È£*~SÔ:‚ŻúÒOŬ$½e5­èòn ´§=úZ֓ċĥ7*1“ÔĠtZ9íYŬȨĈÀĞäg5–òMİŬ(T·“ÓİŞ]Ĝ´Ĝ&ĥžAE6,X ŭ(ğuœIl d#z…ù…şş ÄıŠ+‹ˆ×xŞ9ÈÉ\:ğĤÛÙÛ)uËeJ³ıc½+ô@@‘ˆŒGŜpä=éñ@ÀúÓgeLÒ(Oö{˙W–í<µ""CÑ` ‘ö™˙v„3’ż‡z`³'$d ŝ2?Pʨ>şĠmš‡hÈÒ¸ˆžRŠQTgSġĦg^ż7SƒŠ‰—l *RzœòW˙×I eş_, Şpü(¸.ı›µ ğa·'dd}î˙ŭq@Á$·X2ÈòħùTzÖ˘†Œ8oŽ˙Z”/BÀĈzQíÈ3·œúU-ıŒ6فÚÜ^ĞùÓċEbâ.ŠBäI¤ ’u†4á|ɀN:} V^‡IXÉ,İ^Ġi­šT‰–@ĈLħÏ^?È ĤûxÎ@ x ŒäUPäĻ‚pxâ”]Ó,ÄV2Y†Ésžĵ@1HDÀ66sלŭi1I²+ˆÙ ,>öOĊ]ĥ–d  bÌ3Ç À™4ĥıĵÖ’L–òò¤ˆl9!—–?B*eş·Y6†3˙UM’„ŜLöp'šìıŽ.ĵŬÓÖŞÀ0ÛÈÊKËIç˙ĠSE DÚ²¸‘ġëM°Ĉ„‘î=çp÷¨X˜“Çjú~?çµ$6ÂmĦèëëŝ“ #ûô€Ĥ°;ž„ŭjb|İK”Q —½$Ä"4²I¸ŸıéŒbĜÜK!f(QLh‚Qç?,K–éQħñ–UéLÄ~ä$c9úûPċ‘¤È× ĤW+œdĉHÁQ 2ô  rA+[A[z’<²¸Ĉjħ1Äñ²N9ò‹ÜÎÇÌŞ\œR=¨ YċQÜgĝŞVâCíäTl)•pż0˙ir o-˜qġĤ1žcƒÓığî;2\d~4YXŜYTœĜzPì0J?ş{TŜÂĜc¸6A9ÍOܰ:´r”£)àNħ·5•Ħĥim¤}ğüÀÍË œŒŭN=4é#š‡ÛĜĊcUXĤAü-Çòn+T4n|Ew˘—Öp èZ&…²Îı=Z{ŭRhŻ.ÉÛpĊbÉàzéÍUô°Í¨Ĵ…ĥÁœFğFF7Qžh2y{wŭĉà(ŝ#íXŬ2Koö¸BÜ3…'…Vê}MGzħk!MħànXÇ"İŠSO ­ı]£ FS€1Ç뚊tÌĊKŽŠC‘¸ä{vÇó¨jú‰˘Pğï?ìö˙ëӁÄĵvĴdіSıOçA“Ÿĵż…+‡–ëPl&Faƒ³*çżĝP€œ*4›ƒYAéJ!ç%AÏbH šÜíÄC ìŬ*Œ°¤nÈdÈ;yôq I,ğŽrNy˘)IW ò†bN 5¨Ñ<ˆíĉٔveäšĞ/6ĈĜO~2hVÜ’2û$@püc<ĉ¤rX0@ëԎ3LC0P£ġĤċ„›ƒ`zŽÔj9n%·\Êsµê*ı‘ÚBÒg'Ät4ÁĊ·-ĉ½ĈѐiÒ΂m\ôfĉnpûà:€{R¤‹’8 ġĤeAœ³v(Ĝ8ëK¨!°„Úûœ‚Tc;ŽGÜRĉ6^GQÇ=(bcv ŽqŽġ*0aîC1n£˙ŻùÑÌ;—§Kx¨Ç:Ş€#îúûó˙ށQ,óX[ž4Y~S`ĊşôükK1ĜƒO>\ésÜcj{.­-Â-´/•ÌYĜÍ܁úT]ğĦ\œ^\´ ȍ‚IÀçžĠ!HñıYw|ÌcS–‚Ekğ™íóMĉ2À(ùAéĝóTĊÔòG$İ9ùµ 5¸uĥÜ<’clìuùñŽż•Q‘ŽîAÎyÉĤ3P¸9úÓùŝ÷Ôi. ¨8Qî7kġ c܊@6}Ĝ ­‚NßçùRù+ –  TаÎ~çŜ—äpù§Ô䔜rÏòúîëPڊCr&…°†v<ç>•-´{QÁ=Í2‘b cFù%ıÎO=ħıŽ=ı<œ`ÔmÄJ†@“-¸öúT§D!²ÄôRZ¤D‘2…|°ëЁ—#8Ĥ†E—iÜ>´Ġ…HË7Ìy°İJ¸”ÜÄ{qRċR0 “CҘÀ`HSğԚq.͐lu4€ŠáYö.0Kg5 @іf09äSLĈuTvġ§`ğ· …àgäÓBÜwț“Ë,§Ğü*ıKo· •vÓÊtw-!2`XeˆêÇj“ğ$§p6Ȅ“–E-ßĦür Vb3…;ƒ­è ˜$`oUÏP5ŬÂ3)Œ‡“scüEôµ´M3;78ëğŽ8éïDqD@Ü9Ï< 6Úö9bo/FÓöŻŜÜç8öĴùÁÜ(’5?­ğ6î„@ż+}3ïNËd½+;Ħd#ċVéĈëM.!¸=Á§`3ó=)wÇċ’ĵx9¤eż| #OSJ²/³³›Pàp$3Tž‡Ӛc!œÇ4Ħb·Žû„ĥO:dq8¸bpŬzÑ+Ĝl‚{o+Ü_דPœÊŸ*à .}X˙“BԒÌ6¤L$‹yq÷T‚ÂŞŞùRᕔ…ôäĤBÈU_ G ŽM 8ċħĝÔ $?wĝˆúĉв,ĴjT’Oµ4ëŽÔ+‡?&:çßòĤJYfe`g•T1wFXô ˘¤•>Ò[ĥsò˙…HĦXċˆä¸¨üÁ°m<çHä{˙ŸJ‡Y‚QTàíl‚H>‹›İmgu]Àg€OêqCĝ˜>ŝ`sч­h[ÂÛ— tÁ ÓK[‚î+Ĵ‚n$ċàcâĴ\Ç#%‚S†& ûuv,Éż³¸%Ìf,ż–TŞIïÓİĞï<ñ[ìw@rT ùIç#·LßT2Lû‰L™$žĵĝ¨UÈ`F~´˜‰ÁU‹{Eı}OݵWy9*ğAè(ѓçCc#v:{ö/ĉÏ´¨e’ûÇ=ù Öúm8äŒÛYFá~F >W'3#.BÇœö…üݵa’Ùàgê)áÜ&ÒNÜ瞀Ô›e"ĴÉ6ĊûĦş.}=* ›yŽâa;TàŠvc³Êq$ĦïM*èĊ~R{€hbgŽádbr€íµM5ĝZ:(@I%ħÛêOóöĦjÀ—L³ĦŽöŝI 0Œ$iıœġüğqë[âò%Ĉ+8ÙO•)_1ô ާ“ß­h£qšáŬ7I4Ó`x8Íl—-ç7™×ĉQÔŝ5]]) ~X‡Ì%_š\{I$pÀöŝ§hÉÇVˆ§r9ġëTŬÀç,ô}V’ĈÚĉŒċÉô8z‘W¤Ñġ‡Pd–)ı/€>ƒ:ŠĈn§Ĥĥn²_yo½ĥŞ.O8&ı‹‚L†E >P@ŭjZ°:§#ۊb˘’wÇ9T€Ç ßëJñÜsBKo‘˨½}*)7 gÉ$œžI4î1ˆ zóÒmÁÁ˙Äׂ8öíHŞ™Éf9<i %]´'ìP‘KcĜĉ‹Œ·›‰”n XŽĴNklÛKkdî×ŜXÚ8öžIíôЉH’ÛM6Ñ4ñ<ëp,ˆ ?Z£{s8‘ \NÛNìLĦv°?ÊŞÚ bDá£ıŒèwŽ?+'S·š"ÓK4làmm‡;˙ġÔkԁ‘HLíÔT¤ À÷İzH<ÎcŞ,œ€iÜTŭç=:Ó¤|/­1ğ"oLƒëŒ×3â"[†ŬV'>çÓéZ-t9‰<¨"hÙA#‚ç'ßÚĞÀŒÒŠ=ìO *z’XF6Ò2ş.à7(ÛĉߓŭßZ#ı6ÁÍ´óu%pú}h½‚Ċdš(fÍıÈÀÎ=)Ó4Óıwxw–Ö([ >}Vaš<Ì£.KaWñí]}–ŸŻ8Û<ħCé` zqŝ5kAjméV²ÙوĤ“Ì|“œ’·5‡Żëڗu}–4µ.Qrw4§·N”hĜz~™wë5ÎĦ$ĵ–1lU‘ßqġíZ˜¤Ĉr>=—ËŠó$Žċ #ŒƒŽ¸>½ëÛĥsçeˆÉM‡#Ÿ^žŸK°……ÙÈ-"˙şGj–\ñ”ôÏó¨ğÏAô§8Ç4¤à{z ]ğ”aˆôĦ€8?3“îsQ“Ĉ2zäR¨pO4Ḟç=(há›#ċżçW#·iœ,PĜÉŜÀgéš-¨É,ÛȍZ>ÁÁsƒëۚèîÍ´xċQXd“8éüëTY[NÌ$&L€ÑÂ_ċġÈĴíBàÜ|ÒG2z´;öŝµ]bĞ-ı!¤Ü9ùNÀçñ¨/šŜHš(™63ˆvA¨zÊ˞¨IÇ<ÓYK™Ĉß|­FàtŒwmo@ëQ³añ'ĜS8Ü23êiĦ[$ĉħ@ÂFk'RÓ÷;Ş6“†ÂƒÇséZĊ¸3‡Jğıvû%şÔ|Í#Üö¨l™Xa¸óŽ|Ï'ŝYž8ÏĤ)5d"g{f…Ĥà;,? „°`Fìİ£g†{¨”1À%Ç4†şt~)‘ï/K­¨%-cS—<ıú˙JÌĠ|m§¨–;ÙX‘‡\Á=Gҝ“s‹ıH•ˆÉ<ĜÓX²NTġŬŒb³°‰&TDI0Fz‚@ÇáM;<°èsž™Ħ€ ԌúšPŻzz*ž>cÍ6EÀ›ĉîA@ fP IöĤ¸§`&ĞmglV­­Ĵ÷Ê4LƒI·Ĝ4$4:Hdĥ‘’aÛÏú܆ü+vÛÄ6ŽŞğ%…Ġ6˘lÈ'c˘V)ÚÜÚAlÒO1[–$³d‡úb³ġ A.d'£¤îŜ´úݘ6 #ŒqT¤“ïĜ۞3ÍdÉ{‘4,œğ“É)ÑàÚêA8#Ĥ)î!ÒJ]wqÀéU÷ş’@÷ DĊƒ҅FXŽô€ġúÏÔ­%ĵLS4(~ùQ’ŜÜö­P1.íŒ3ÛZD”ĜN×Ĥ“#C:Ü r %p´ï­Éı5ĉĴš”)eu?*ŬŸqž‚³d•A•_”``ÇùïJNï@JĊ˜ġ½B8ÂGvÈ tçSÛĝ‹QŠ ʌÎ9w˽ğQÌ3_EÔïcË}qŽ ¸ó׎ĈĥÓ§`µK‡ÈÀQü…SÚá…èĦòŬ˜Èïğ³=[ Fz—¨Î~ÄÑΟgŠÚešh÷/˜ żŜ#=1“ĝW+¨Dn/"³Uód³YlaÇ(êxĤğÒXŜK “Î"û.ŬĞ*\ÄıàŻıqô¤ŠüI]j°ŜĦBÀ*`r0F?•U•ÂçŞDmÀV8‘3ާàsúU<Ĉ.pÀdóŽkµ̌ıÜqïK'ÈàtZVa!dnätĞ1caîOLžô€q%NzgĦĤÈc2€H1¤0ıR@۞ıçò¨Ĥ/ÊGİĉ˜ 17Œ€q´zV–‘sj’•¸%ÑÛjĊ³8ôlĠ!–oD%™£‹nX‚0z1PÛ&ë„ ü•^¤żJ²Í=BĈà‰T#ĤJp@äúƒ˙×Ĵ2BɆn:SšW;"1ĴŒòq޽)Ħ÷Ë“–à ̖LìûrƒH²Ĉ¤ƒ‡ÏqŠ€+2XÈ ŭj)ġÈçց UœsC6~ñĉ„À‡Ĉ6d+]Jòm !…#—iÜIëê0ċ\d‘Ohĥ÷ H›ÉĵÀsîh–¨Fċ­”š£şÌbò„^@­ż${nĴu†6²YrLҐùĉ­W‰°*ĜeĴÒİ+!à 8ÇŻùëIħqnäÁµs‚C(lâ¨w'›\ż–+&>ñ\d6{wéPßÜÉ4jÏ `Ù*ĦżPÛ‰ÜWà×üŠ–ÙœJ0$`qÚĦì"w{à€@çµTcŸĈ—P|€pVS‘ÛµP % “˙Jt ĉKÈ$£ÖŽ˜ŝVħ-ÂA¸ĞĵsmDç8#{dWhÒö3)jZµiɜœF3€:š˘êZÁ0Z*‘–ŜĜÜ9üóüŞmĦI\ŬĦŒ+7ÄIš4Ñ΍"8ĈÀsےGzàeé%µ°Ô^•ŽxIŒAùŽ:`{ŒsœV‰|Oc¨éŝ]ŒòĴÊÀ†/żüÏ­7¸ì÷ $–ĈSċb 2{JĴƒw^ƒ­'qšÖÒÙĤŽìâ/´–"5h˜ħĈ0AŽĤŻEĴŜÇmu=ËDzĤÁ(HĜèŽ8ÏzjV'SğšáJIvó e*w;yçëĊnë–ħÜZi6ë*…ŽĜ;8B2 dž~=Í4Ĵ4é­¤¸³·‡QŽç#îŬ‚sŒg1Ŝħä+mu*ĈïòÈq”ĜGĝsŸÊĤ]À‹íħÜA9Ï=éŒĉIċ>Ğ0‘³}ёO8Á+úĜÈ[j‚¤£ŽµNj’HȒqĉžHì+Nk›ÒàGŠRëżhVâ<ççŻ89úúSV[“ÁBsÈè);ÒïRĊÊHEÉô pˆŸ2Hŝägİ#8'­:Ús#œmAı‰8OİĦ 4›4şsj qۓœ‡§N§šŽŜÛ{™ClLŞN[hq ɊI ÚżwÜâĞĴ6BöĈz`j”eMÄö#š°šbŒŸJ–•²O)ÚĝKÍQw0ya‹:0Ü_vġ_jènZGÉnî%R qžĠĠmˆ+KYÉÈc•fäo¸Hôî~µÏÙÁ>‰G%ĈlÊϝ²Ċ{ v¤ÓzŒîƒ(#Ħ¨.MğGûİ\à”Ûġö¨ĥĥÔĈ)žòÇ8ç#`r*·m&f°E 2Ç! ^U;ñEğ çô}ÏSóouMċâS·Ì üL}yÇqLñ=Œ:DWúmœjË(o:<#$tïÏòĤŽE5nÖĞ1òœ’T¨?İäTÛ@@xïY·qšÓjÌ4{râWí¸`Úp6žGŻhxJ++‹K·½·YDJ8‚F #ôŭ*Ġœ‚Ä×2h²-½ÂZÚÇŻ·Ê'‚<7gŸĦĴ™îoo'Џ[îòb Ĝ@ŭ@Èĉ‰; :˙é_a·yÖäJvŭÒAÁÇä+ž³ZBêBŜ$ìÏ)`Ċgb0;ŽÙöĤ֖͜§UüĊ: „s†=Ï&ħ+"ÜÏ5Ä`óÛ4$¸và†ïíHP½kÖ ċ‰ÜÄ Ù `; §Ú¨ -äNcIŝSWâıŠM*[7]îò‡·U(ǃ“èF)­À˘ˆ*†™ħóèsùÓ]vĵz­MœÓù^TeÌQ@î@¨Mġ­W˵‰Ħ1|‚|KĵsëŒûSЏ£M-šïÊßnˆ |ñ“Çèxü*öƒĤÚ\Î<ö[‚ñ³,HÄ@Ï͏ʄµÔL³|-/µ+{Y+Ha%‚aŠr@Pq’zuġŞwˆ–Ó´6ÂR™àHğ[8ÏjrIܤG$Mï"]Îâ‡n1×Q·‘ ½Àç'ĥ+;˜Ĝ8·Šäác¸È‹ĉnpsè3Ŝİ–1İŒŒÜÓ³@)}ÊX°p"’A¤] kšíàUš[ñ´vÀêkQuyċ–Éu ÷q‚cû?S€I?L~5ҝġ}IħĞ \Mw§y“ĈÊûˆÜË´·ı5ö•g¨(‚AÈeáż1S-ÇbÓ2ÁáˆIŞzŠÚjq¤‹µ3½ĉUP9ŝÍ-ġ`s7ŝ-ż[„Ù#2c?ĵÔùô§Ĝx‡Vû8k]*iž^F$IĠViâĠíü9-ÄgyaŠ0ë‚|Ĉİĥô/ÜëĴ6ílk\+â#ndÚNF:qŝ5^Ä·:uµş<Œ.àAÚeÇÊ3ì1Â‹Ù…´1fĵ3\Í4ħĞ´ĴXġI9⢖0HläÁèċÍf1RFáUA8#g4×l“ÀPc"š(Ŝl·R8–a 1Ħ’F=p;RIÇNŽĈ;ˆH'‘rñ¸ ŽqÁéúŠi\ Ĵ4[½V)î`Œ’Ëœ\T&YÚ.oäÑm.MĦh’5şÜ^䌽Ĵ9RϐN@Îz€]cj–ÚFŬ3Ĉ]UB•$îÇN+H 9Ÿ²j£MšĜÛÇm ²dù YĈA8 u ~“5ĥ˘ härże$_nâ‡pı£ĝZîòĥK+ċÀڟĈËON+~ŬÇ Ĉ5ħސ#xĠż?óڒµÌÍVç]YÊ„Ò/ÌÛŒvmŬÖYîXƒ2ħnwnô¨}˜îDŒÂH­ZUòÁ䌕¨Ża0\ş²Á m9 X ÙĞñ=ÌÉ+ı˜à –ç‡t›™.7‚ V.xb+²Ü–wN£E"ÒğfE'Ž+˘:+²M*ÙmmÄBàÎë÷˜ĥŭUwšMÜf~½}ö 6WòĉrÈÀ° ñ×'pÂáZUşûD·F-­,ñâ8×׿n?2[Á2Ä&%€™>ÎeŸ€Nğü½kY, ¸ħM:;çk¨ÑJ“)(žĵƒŻZvÜ ĉT²yŽš­ĵĦ>û`’>ĵšĉ˙³îîKtPíH8SŽù5Ĵ2ĵŠRVRH$=½Şi%–;Ñ$Á%‘HÈo™Nâ§ÌĊv¤l¸ˆH­&÷e8vġƒX½@šÂŽç{9ŝ`ŻZÒ-Y²YÎŜĤÉ+e6ĞŸşÎżĈ·t ;KËhÌ··íÄG ·:rO51ßQ‘ëÓÙ[Üŭ“Nžb<²LYqÈ#ùsġĴŬ*Ŭu FÖŬÎUŸwc Ô˙ZÖÁ¸şÎ”tëı]^-çf3mġ8éY´š° Ì0}â‘"Ŭ°9çáPi t‡$ JŒġÍIcmöğ¤€8F|…'ĤqÀüO ċ&ş„’2Q€ö=sߟċ]'6ò½üÊÂӔi€Ğ“¸£‘M-DQÔŻ µhb˘ŬJ¨Şçpç·QĊEĤèóËĴiö˜à¸À‘X|Ĝî:wÇ4ÚğrËIż‡ÄpÏ,âµù ™Aó^ÏL’8íšğİiZ–´³-ʘĜaRÀˆùç‘׏çíZ$ÄÍ=Mcw—“Lê6–ŽM£#ŽŬÇTµ{#§éüö÷NĴêüàG‚qġ~žôX•T#1Är,R“LFOˆbšK0–²¤.íûĈh˖_¸ċOìÉZ6ĥ{§ûNí£nÇ\üĵ!‹cŠ$´2µ ™nuYĉuòäv İÛÛ•DòÊÊfb&ì‚IïŠĊħ•Şky NXİçzԁ-¤žL‘È&hÈ~J}ċ÷ÍwSjñĊáÈċš6ıiFǖ ñ’:žä}kXꀋIżŝÈ6ò[;k7 µ!ŒĞ;{çž:Vĵ>*ÒĤŸÉŠrïŝÊ?:nÀT‡ÄĥÚúX _6)²|Ǩü iKµ€ùP™ÙŠİ<÷8üÎ(]ÀóŭKY¸½šHoÏÙÚ;#‰ y =rGz4ŬZm-ždOµÇÚ~âċy=şñùTój÷WşyŒB÷a ÚñÇÖĦñżÓµ(^òú)îÑF˘çż4]Ĝzċäf8ËN)µI½~ϰŭàÙLsŭ*H­š{9ç.ƒhı'üèW ÈÊêÁe ƒéSŜ˘A(Hn ŞTAîyĊ5°¨‚8?ʐÍy/7Ú*Xħ…cĤMŞ< çİä÷Ş+m"La.ŞÌU †p<ŝ]*›ğ,š•ÁŒÚÜHn`EڈìvĦĈâݨ$3á?ž?­KwĴK1f$ħ9$ġ4è£yXŽġ cašÚf†td‘:ĞvïLÜÁväíëŒñO[%Ä­q'šW ç9 c?SŒÔò[Kc32P@–<€O `úPğˆĠŝŻ|ڄqm’ä2 €nS€êš—>!:—öŬÎp<˙4‚ÒòhGkm [[¤1¨UA€ĊfHçŝ(Uè³bı=÷ŒñôĞŞÎRGoqÔ 46ÎwçÄ6xLŒ%(9ğ?_éX7Z%ċÊ2,‹ó v”çċ>üġíŽ(z ıÏx†Â[Xäžá‘™˜Dĥóë÷½xïÚ¨D-Ö§xç•Ù‰WüŞœtÉ9ŭšĊĈ̤S‚ßís$0ÎĉAçıíŒSD2lû_`ÛÈcìGZ›uÒ7*AVG"ğ_‡óË!şY>h”) ç$7µ\7Oéö“\żĠ|²I ÜQ}8èı=Ç6Î×oŠIYçÌeÈ ˙×?•U’? Ek´˙ÙÓÜOŬmèżûYô=}k¨½ša˜Üıù`69Î=魀óMKO”]I0EŠX´[ä J玙ĞwRÉh"‚öʉYŜef%˜À¨³War7PV ÔrȖÌù0İÉ+ߎ˜ÎE;Ċz•­İ%ͧ™·Ë ûĈ9Éŝ”6š°•,ñ˘yEè Èè{Ё‘ô'=jwğg²ŽÛjŞĞ$[ëôĉšvŬöŝC/”ŝaĈÖŬÀġÈÙā£l2¤nÈp3Î>Ÿž)ĞXĥP.GZmHÍm+Rû-” xdÉŜĈ@~`0qôâ¨ĒĥE\Ž˜ô?֟D" žÎÒ{ÙÄVñ4Ž{-!Ğá8´ÈÍɑ¤mиE8êÇüŝµÍ†Ìb0ƒpl†î}ޤıXŻrÍȒ÷͸`İä*‡ıf'·“TğR`h6Ÿ-ĊšÏnĦ˘f A.X|íóÀRYß]iî‰X÷ É"œ6;nZ5ZÚx7L†.ĦÌs4ùŒ` ÎqÏ9”šÖ+BX™$Ö$íäĝŜٙâĠ£SŽ„ßÊİ‚/ë¤Úlۘ!UÎŭ…ŠŝŸÊı95ĞϳÀ…°ÑLr2lIsgž¨¤ÛZÚĞ£q€ù€ìk6é°É´Ŭ#`ädí˙­·^}wN¸ÜF—ŽQ™Tó2‘…çż9ü)—ŜŬe;Û’òlo—oœ(ì:RяcŽ½Ò¤*]QÌÙ"EÇLçñ$Ġ)]¤t²:É/ ñà ĊĞjx²ÂALw~|²ċ¤|§ġŞÚSjkoqö Ŝ[²gò÷úzÓĠ=­3\ÀÒ[HX#x=[9î*˙†´™5 ôr²}ž6ùŜ6Á’ğ°úöĦmK˜JhöÊ `óë‘\òjM*Ŝj8ıgäs’=8CW'­·E&ívŒËĵI F]FĈrżCİ›¤ĵŠî„˜ÄtrGN´_Ŭ¸XSÒÖ×I·—ìsĊ;HÌá—ĤzuµŽw.PäsÈ÷İšċz÷OÚ^wċżğŻ˙[ó¨(8Ï()Ĝe@ü€Ùúú˙:m$.ŠÙ‘K.:Š}.$•£FS¸ĦÀüN(×6˙fĝÙnFSœŒœgÓ§J³£_.‘İ-ÄŞò\„‘Ĉ}İìÄlë+‡S³0Ċ ƒĦç8ġŝuË ġŞ›Mè CA ‚I–]òK&Ġ퀧\ô>•JI+,Yß\YʲA!VCı{€qŒà÷Ċvú~ğ§ê7ĜK™Âç•ÈgÀê ú Ğ”ì´[Ŭ[ûNdšÈY˘êF;ŻĝWS§êÖz–˙²LĦù†0GàjÒĥŒ[ê]Ü+ P|]§*ĵO+œóƒĈ??ë@/™.ĉ]ÀŒİÁŜı OO]uşKrÎóÈhÑñßı'œz“MìÈ:ëìY ™šYF92Âóŭ̏­PÓ1x›Éq¸G~xüë'+”MpşDS°=+(#o|m˙F¸´m>ĥ™™0B,—v?J¸Ù=Î{ĈĈ.ĤO$,!LċV9l.=N?JċĵĈk' †f|Èö9ġ9j™èÁş6ˆ.KÎñ=ÄĥĊŒÈ{ġÇ[iÖ[6aÎ# &aÁġb6·u#˙×Cwzê“MoajFXÑkmfÒyÒXœ>2ĴĊñì;ŭk˘ŭ 9MSÄڞV@ŠÛ•QzVlòHÏ#cԞġÏ)9†QR3UdTÓĴo g•wƒÚzœü>•›4O ›$]­€qġĉ] ٍ“ı#5Ìëċ$1Ş…U`9cßü? ›Y1ĵdnäzќdšC'·SċĵĊQ–.cë‘Ó½W#›ĜD8Ž@J† ƒM‘™›ĉbqÀÉíJŭ6‚y ŠRÀG^sI@-KċG—¸Éœ€Ġ§/ĞéĤpî ˙XÀ’Ì29#ñ= Rì#­Ñ´ìxy-g?ı•+Œ0Ï$–÷ìz]¨c$°.6ݏ’0 éÓ 5ÑĦÈË˙„Šçû(Ü[>ĝ÷/:€èqœü§ŸNqZòÙZjÚj5Á2! ²ġ#89ùĊ+óc•µ§ĵö¤ —ċixŽÉt5µw,1ŜipË2¨’crÌXa@^:q‚j­a³qġK4¸[vıÍq•@rOùÍDşurÖisËʔġġW@V·°K;‰’9äIfNœäìzóÏÒı½}\j6k"Ċ0‹;™£Ĝdç}úôš l‚3Ìï½ÚĞ ¸dŒzsTÒDr¨‘îECĵĜ$îúâ³Ò ‘É!nr ?Äsŝ¨jîġÙĥċ„ğĈ(6“ê3ĝÒĥž·š`[iÄ ĥġPHÏQë])ó2YÍßéKĤ ó<˙1‡ ÈÉüĞ>aH˘)²9,+­ĦF ħÓôäÚ"Y$e ċG5N ĝbVŠ;(Ù\ġ™ħéTíĞ,—ĥ–ÑQcbrƒ ¸ôÂŭ3ÉĴ™y2HċÙş³u4Ĥö5pO'•ŠH H ŽÔù"éÒ½FH#û gùSè!ŒC1 b›ƒŒƒŜ“Rƒòàôë@ E%ċ`ŞÀ¨%†ôäsŝ}i(Q@ËÚaŒIĥUB$Q˜cv>üöİ4ùċ°eg16ß+r ÀœôÏàyގâ7<9z_Pò'ĵş‘Ì“'äm<ztÍkx˜9µµ(°¸^ĦÈ#úÖÑw‹!îaYí;ı-íDqÛK…389Èıà­kÁ Ĉ“Hm–€]&;”¨82•Ö£"Ñçĥ°š[‰ ùShË Nƒóİ4˜üÍeïˆíљŬä 9=şŸ,o˜ġ;Q"İ6 ˜NĠëw³êí,ŞÂN€`g{óžkFôsq5×ï7¨ıÇğdŭMFßñê?rG?×üâ²½ĜÈäIR5Ŝ!ù—Óž˙2¤ ïZAg,fPÒtú˙fŭı–möËöfeÚŜ[3žż•i'Ë&JĠĊċô‰äKs3ŒŭÂäŠĞ‚¤ö#ŜĦŬ²‹2@ÂÌM<¤;ĞBrXzû ŠŬ˘BĈMÁ‚ċ žïOg¨ZL–òées ÌXF*GP{žĠ‰q”ŝYRĵ79ĉŞVi1-ÈİsòZÌĦ^zRñ¸…çë@WqYÛAnŒ’ Êf`FÖ˜íYĴċ€àt•R²KŸ”J‘‰NŻ'§jJJPp‘E%X´²¸½”Çm’@3´uĊi E§›…‘I|ìO ƒÈĈy˙ëV|Éöt’rÁ]*y߃Ukj"Ċ–¨ĥ— 8·G” GœíO^;ÓŻµCQ $Òf;vòAǸÏċO™ÚÈ,jhwVípÍ41ÈßêÄQ‘ `r7v#µ]½²Ôĉ¸ir$·–>ùWç#Û#â´OŬ[ÌV‘ŭ§LÔŬÛÄ6N2~cƒÀġ$×9ĐĴŠŒ@aˆêEg-…‚5wIIŬˆ'ùU˜l“ÍŒKqDHùòHägÓ ~êR¸mĴÑëžLQH³­FɇsŒ;Y4…£H6˘ù(vĦÇOóé[?„G-éOIĉXÚ5vĜsEa{ uއ—ÛSÛ88j뵝Êéò;…†Ldäü­î{ƒ\üĥËmóÌ,GC…ëÏÔÖӅÉ‹Ż,ğÈ*ާıQÂ´4û8ná—Ècöœ,ƒŽÙ9íPµc{]éWV’*K\ôlü§ñŞr#Dċ¨ëÎj\ZÜiÜhÎx§6c”ƒ‚TâÄPÀ-´w>”é#0ġXÔ`ñJĴTäuĊ ìíı˜ħġ&’€ J)ÊìĦ€8 0h´PE=ÜÖ7+=ğì‘:׏WiîQ–Ú"YCŜ1Ó°ê*Êy#žéċ—äûŠ(ìNN*›şĝîm‚ċĥÊ 7Öcû¤út§JÖÒéîÑĈau”aCn =séÖ…kcLĥ´’Ŭe”ğYĜûóŒúVĈ•ŞĜYÜÜn;A™ıóN{z öúUÂÉj&s÷7R^ŜJéòù‹‚ êéúUċŭԈPch=yëPŬĈn[KmĴ°Šâs vóm pOn?§Qe´şòâ•%Š6Uy}úĠnŭ;X‡MŠUCµÈ3ÊĈÙ?.3ÓßŜ—RĠ›Z½ĥĥ‘··ŝ"9ç“úQÍe`0כֿì°á…,1‘Ĝŝ5{BµžâF„(1|Ž8úäÔÛ[WRu{ÂЇiÚüjĴ‘´nQ†-ÀêŸV‚[p˙ge‹ş5 ŸoJÁÔs#´êÊd9nяlVÓwZ–*ÚäI/ž…_n ‡Û¸ġgˆocFKK<_orx% ŝ}>ż\Äħ˜Ĥd xÜ1UQZÌQÇɌŻÏSíL$’IäûÖV,­YÓÑ^f,ì°Ğ¸ž}*ğ…óHOğž3éMÚÀ# ÎçIHœW ­6Š|AT6Ô$nlg֑Ĝ6(é@ +€zŠJQր#†Ĉю0j͆ɉĥ|#ĴHž?˙*‹“ZX›G’Ûs:òÉ#á”zQYEúŒZm[`,ÛĈnɖR‰Êäp2?ĦÍ;TħŝÍżkq:ÊËĠ“·µÒàD™-·İ\†;‡ñ8ü:ÔlZFË7Ŝ$óÀÍ€‘ħCƒ0Üu˙ëWFŜ™´˜Ĥµĵ„oĜ9ܧ3ßµTUôfĊĤÜJÒ1ù…x_4/ùúQ@£RH'Œ—-…çî·8ĦĊ.V· —uHîŻcŽċNŠĠï{UkY[O’HĦÉw1´„êvçî“UÖáıŸ:Ï6Q ( Éè_ÂĞT=XÏ˙Ùvisionegg-1.2.1/VisionEgg/Deprecated.py0000644000076500000240000001015311224565527017206 0ustar astrawstaff# The Vision Egg: Deprecated # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Bits of code which will be removed in the future. """ import VisionEgg import sys, os import logging # available in Python 2.3 #################################################################### # # Error handling and assumption checking # #################################################################### class Message: """DEPRECATED Handles message/warning/error printing, exception raising.""" # Levels are: TRIVIAL = 0 NAG = 1 INFO = 2 DEPRECATION = 3 WARNING = 4 ERROR = 5 FATAL = 6 def __init__(self): ## script_name = sys.argv[0] ## if not script_name: ## script_name = "(interactive shell)" self.pid = os.getpid() ## self.logger.info("Script "+script_name+" started Vision Egg %s with process id %d."%(VisionEgg.release_name,self.pid)) def add(self,message,level=INFO,preserve_formatting=0,no_sys_stderr=0): level_translate = { # convert from old VisionEgg levels to new logging module levels Message.TRIVIAL : logging.DEBUG, Message.NAG : logging.DEBUG, Message.INFO : logging.INFO, Message.DEPRECATION : logging.WARNING, Message.WARNING : logging.WARNING, Message.ERROR : logging.ERROR, Message.FATAL : logging.CRITICAL, } new_level = level_translate[ level ] if not hasattr(self,"logger"): self.logger = logging.getLogger('VisionEgg.Deprecated') self.logger.log(new_level,message + '\n(sent using deprecated VisionEgg.Core.Message class)') def format_string(self,in_str): # This probably a slow way to do things, but it works! min_line_length = 70 in_list = in_str.split() out_str = "" cur_line = "" for word in in_list: cur_line = cur_line + word + " " if len(cur_line) > min_line_length: out_str = out_str + cur_line[:-1] + "\n" cur_line = " " if cur_line.strip(): # only add another newline if the last line done is non-empty out_str = out_str + cur_line + "\n" return out_str def handle(self): if not self._sent_initial_newline: self.output_stream.write("\n",_no_sys_stderr=1) self.output_stream.flush() self._sent_initial_newline = 1 while len(self.message_queue) > 0: my_str = "" level,text,preserve_formatting,date_str,no_sys_stderr = self.message_queue.pop(0) if level >= self.print_level: my_str= my_str+date_str+" " if self.pid: my_str += "(%d) "%(self.pid,) #my_str=my_str+self.prefix+" " if level == Message.TRIVIAL: my_str=my_str+"trivial" elif level == Message.INFO: my_str=my_str+"info" elif level == Message.NAG: my_str=my_str+"nag" elif level == Message.DEPRECATION: my_str=my_str+"DEPRECATION WARNING" elif level == Message.WARNING: my_str=my_str+"WARNING" elif level == Message.ERROR: my_str=my_str+"ERROR" elif level == Message.FATAL: my_str=my_str+"FATAL" my_str += ": " my_str += text if not preserve_formatting: my_str = self.format_string(my_str) self.output_stream.write(my_str,_no_sys_stderr=no_sys_stderr) self.output_stream.flush() if level >= self.exception_level: raise RuntimeError(text) if level == Message.FATAL: sys.exit(-1) visionegg-1.2.1/VisionEgg/Dots.py0000755000076500000240000002566711224565527016102 0ustar astrawstaff# The Vision Egg: Dots # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2005,2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Random dot stimuli. """ #################################################################### # # Import all the necessary packages # #################################################################### import logging import VisionEgg import VisionEgg.Core import VisionEgg.ParameterTypes as ve_types import numpy.oldnumeric as Numeric, numpy.oldnumeric.random_array as RandomArray import math, types, string import VisionEgg.GL as gl # get all OpenGL stuff in one namespace ### C version of draw_dots() isn't (yet) as fast as Python version: ##import VisionEgg._draw_in_c ##draw_dots = VisionEgg._draw_in_c.draw_dots # draw in C for speed def draw_dots(xs,ys,zs): """Python method for drawing dots. May be replaced by a faster C version.""" if not (len(xs) == len(ys) == len(zs)): raise ValueError("All input arguments must be same length") gl.glBegin(gl.GL_POINTS) for i in xrange(len(xs)): gl.glVertex3f(xs[i],ys[i],zs[i]) gl.glEnd() class DotArea2D(VisionEgg.Core.Stimulus): """Random dots of constant velocity Every dot has the same velocity. Some fraction of the dots all move in the one direction, while the rest move in random directions. Dots wrap around edges. Each dot has a lifespan. This is just one example of the endless variations on drawing random dots. Parameters ========== anchor -- (String) Default: center anti_aliasing -- (Boolean) Default: True color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) depth -- (Real) Default: (determined at runtime) dot_lifespan_sec -- (Real) Default: 5.0 dot_size -- (Real) Default: 4.0 on -- (Boolean) Default: True position -- (Sequence2 of Real) Default: (320.0, 240.0) signal_direction_deg -- (Real) Default: 90.0 signal_fraction -- (Real) Default: 0.5 size -- (Sequence2 of Real) Default: (300.0, 300.0) velocity_pixels_per_sec -- (Real) Default: 10.0 Constant Parameters =================== num_dots -- (UnsignedInteger) Default: 100 """ parameters_and_defaults = { 'on' : ( True, ve_types.Boolean ), 'position' : ( ( 320.0, 240.0 ), # in eye coordinates ve_types.Sequence2(ve_types.Real) ), 'anchor' : ('center', ve_types.String), 'size' : ( ( 300.0, 300.0 ), # in eye coordinates ve_types.Sequence2(ve_types.Real) ), 'signal_fraction' : ( 0.5, ve_types.Real ), 'signal_direction_deg' : ( 90.0, ve_types.Real ), 'velocity_pixels_per_sec' : ( 10.0, ve_types.Real ), 'dot_lifespan_sec' : ( 5.0, ve_types.Real ), 'color' : ((1.0,1.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'dot_size' : (4.0, # pixels ve_types.Real), 'anti_aliasing' : ( True, ve_types.Boolean ), 'depth' : ( None, # set for depth testing ve_types.Real ), 'center' : (None, # DEPRECATED -- don't use ve_types.Sequence2(ve_types.Real), "", VisionEgg.ParameterDefinition.DEPRECATED), } constant_parameters_and_defaults = { 'num_dots' : ( 100, ve_types.UnsignedInteger ), } __slots__ = ( 'x_positions', 'y_positions', 'random_directions_radians', 'last_time_sec', 'start_times_sec', '_gave_alpha_warning', ) def __init__(self, **kw): VisionEgg.Core.Stimulus.__init__(self,**kw) # store positions normalized between 0 and 1 so that re-sizing is ok num_dots = self.constant_parameters.num_dots # shorthand self.x_positions = RandomArray.uniform(0.0,1.0,(num_dots,)) self.y_positions = RandomArray.uniform(0.0,1.0,(num_dots,)) self.random_directions_radians = RandomArray.uniform(0.0,2*math.pi,(num_dots,)) self.last_time_sec = VisionEgg.time_func() self.start_times_sec = None # setup variable, assign later self._gave_alpha_warning = 0 def draw(self): # XXX This method is not speed-optimized. I just wrote it to # get the job done. (Nonetheless, it seems faster than the C # version commented out above.) p = self.parameters # shorthand if p.center is not None: if not hasattr(VisionEgg.config,"_GAVE_CENTER_DEPRECATION"): logger = logging.getLogger('VisionEgg.Dots') logger.warning("Specifying DotArea2D by deprecated " "'center' parameter deprecated. Use " "'position' parameter instead. (Allows " "use of 'anchor' parameter to set to " "other values.)") VisionEgg.config._GAVE_CENTER_DEPRECATION = 1 p.anchor = 'center' p.position = p.center[0], p.center[1] # copy values (don't copy ref to tuple) if p.on: # calculate center center = VisionEgg._get_center(p.position,p.anchor,p.size) if p.anti_aliasing: if len(p.color) == 4 and not self._gave_alpha_warning: if p.color[3] != 1.0: logger = logging.getLogger('VisionEgg.Dots') logger.warning("The parameter anti_aliasing is " "set to true in the DotArea2D " "stimulus class, but the color " "parameter specifies an alpha " "value other than 1.0. To " "acheive the best anti-aliasing, " "ensure that the alpha value for " "the color parameter is 1.0.") self._gave_alpha_warning = 1 gl.glEnable( gl.GL_POINT_SMOOTH ) # allow max_alpha value to control blending gl.glEnable( gl.GL_BLEND ) gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) else: gl.glDisable( gl.GL_BLEND ) now_sec = VisionEgg.time_func() if self.start_times_sec is not None: # compute extinct dots and generate new positions replace_indices = Numeric.nonzero( Numeric.greater( now_sec - self.start_times_sec, p.dot_lifespan_sec) ) Numeric.put( self.start_times_sec, replace_indices, now_sec ) new_x_positions = RandomArray.uniform(0.0,1.0, (len(replace_indices),)) Numeric.put( self.x_positions, replace_indices, new_x_positions ) new_y_positions = RandomArray.uniform(0.0,1.0, (len(replace_indices),)) Numeric.put( self.y_positions, replace_indices, new_y_positions ) new_random_directions_radians = RandomArray.uniform(0.0,2*math.pi, (len(replace_indices),)) Numeric.put( self.random_directions_radians, replace_indices, new_random_directions_radians ) else: # initialize dot extinction values to random (uniform) distribution self.start_times_sec = RandomArray.uniform( now_sec - p.dot_lifespan_sec, now_sec, (self.constant_parameters.num_dots,)) signal_num_dots = int(round(p.signal_fraction * self.constant_parameters.num_dots)) time_delta_sec = now_sec - self.last_time_sec self.last_time_sec = now_sec # reset for next loop x_increment_normalized = math.cos(p.signal_direction_deg/180.0*math.pi) * p.velocity_pixels_per_sec / p.size[0] * time_delta_sec y_increment_normalized = -math.sin(p.signal_direction_deg/180.0*math.pi) * p.velocity_pixels_per_sec / p.size[1] * time_delta_sec self.x_positions[:signal_num_dots] += x_increment_normalized self.y_positions[:signal_num_dots] += y_increment_normalized num_random_dots = self.constant_parameters.num_dots - signal_num_dots random_x_increment_normalized = Numeric.cos(self.random_directions_radians[signal_num_dots:]) * p.velocity_pixels_per_sec / p.size[0] * time_delta_sec random_y_increment_normalized = -Numeric.sin(self.random_directions_radians[signal_num_dots:]) * p.velocity_pixels_per_sec / p.size[1] * time_delta_sec self.x_positions[signal_num_dots:] += random_x_increment_normalized self.y_positions[signal_num_dots:] += random_y_increment_normalized self.x_positions = Numeric.fmod( self.x_positions, 1.0 ) # wrap self.y_positions = Numeric.fmod( self.y_positions, 1.0 ) self.x_positions = Numeric.fmod( self.x_positions+1, 1.0 ) # wrap again for values < 1 self.y_positions = Numeric.fmod( self.y_positions+1, 1.0 ) xs = (self.x_positions - 0.5) * p.size[0] + center[0] ys = (self.y_positions - 0.5) * p.size[1] + center[1] if len(p.color)==3: gl.glColor3f(*p.color) elif len(p.color)==4: gl.glColor4f(*p.color) gl.glPointSize(p.dot_size) # Clear the modeview matrix gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() gl.glDisable(gl.GL_TEXTURE_2D) if p.depth is None: depth = 0.0 else: gl.glEnable(gl.GL_DEPTH_TEST) depth = p.depth zs = (depth,)*len(xs) # make N tuple with repeat value of depth draw_dots(xs,ys,zs) if p.anti_aliasing: gl.glDisable( gl.GL_POINT_SMOOTH ) # turn off gl.glPopMatrix() visionegg-1.2.1/VisionEgg/FlowControl.py0000644000076500000240000016244411224565527017431 0ustar astrawstaff# The Vision Egg: FlowControl # # Copyright (C) 2001-2004 Andrew Straw. # Copyright (C) 2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Flow control for the Vision Egg. """ import logging import logging.handlers import VisionEgg import VisionEgg.GL as gl # get all OpenGL stuff in one namespace import VisionEgg.ParameterTypes as ve_types import numpy.oldnumeric as Numeric, math, types import pygame #################################################################### # # Presentation # #################################################################### class Presentation(VisionEgg.ClassWithParameters): """Handles the timing and coordination of stimulus presentation. This class is the key to the real-time operation of the Vision Egg. It contains the main 'go' loop, and maintains the association between 'controllers', instances of the Controller class, and the parameters they control. During the main 'go' loop and at other specific times, the parameters are updated via function calls to the controllers. Between entries into the 'go' loop, a Vision Egg application should call the method between_presentations as often as possible to ensure parameter values are kept up to date and any housekeeping done by controllers is done. No OpenGL environment I know of can guarantee that a new frame is drawn and the double buffers swapped before the monitor's next vertical retrace sync pulse. Still, although one can worry endlessly about this problem, it works. In other words, on a fast computer with a fast graphics card running even a pre-emptive multi-tasking operating system (see below for specific information), a new frame is drawn before every monitor update. If this did become a problem, the go() method could be re-implemented in C, along with the functions it calls. This would probably result in speed gains, but without skipping frames at 200 Hz, why bother? Parameters ========== check_events -- allow input event checking during 'go' loop? (Boolean) Default: True collect_timing_info -- log timing statistics during go loop? (Boolean) Default: True enter_go_loop -- test used by run_forever() to enter go loop (Boolean) Default: False go_duration -- Tuple to specify 'go' loop duration. Either (value,units) or ('forever',) (Sequence of AnyOf(Real or String)) Default: (5.0, 'seconds') handle_event_callbacks -- List of tuples to handle events. (event_type,event_callback_func) (Sequence of Sequence2 of AnyOf(Integer or Callable)) Default: (determined at runtime) override_t_abs_sec -- Override t_abs. Set only when reconstructing experiments. (units: seconds) (Real) Default: (determined at runtime) quit -- quit the run_forever loop? (Boolean) Default: False trigger_armed -- test trigger on go loop? (Boolean) Default: True trigger_go_if_armed -- trigger go loop? (Boolean) Default: True viewports -- list of Viewport instances to draw. Order is important. (Sequence of Instance of ) Default: (determined at runtime) warn_longest_frame_threshold -- threshold to print frame skipped warning (units: factor of inter-frame-interval) (Real) Default: 2.0 warn_mean_fps_threshold -- threshold to print observered vs. expected frame rate warning (fraction units) (Real) Default: 0.01 """ parameters_and_defaults = { 'viewports' : (None, # XXX should really require VisionEgg.Core.Viewport # but that would lead to circular import problem ve_types.Sequence(ve_types.Instance(VisionEgg.ClassWithParameters)), 'list of Viewport instances to draw. Order is important.'), 'collect_timing_info' : (True, ve_types.Boolean, 'log timing statistics during go loop?'), 'go_duration' : ((5.0,'seconds'), ve_types.Sequence(ve_types.AnyOf(ve_types.Real, ve_types.String)), "Tuple to specify 'go' loop duration. Either (value,units) or ('forever',)"), 'check_events' : (True, # May cause slight performance hit, but probably negligible ve_types.Boolean, "allow input event checking during 'go' loop?"), 'handle_event_callbacks' : (None, ve_types.Sequence(ve_types.Sequence2(ve_types.AnyOf(ve_types.Integer,ve_types.Callable))), "List of tuples to handle events. (event_type,event_callback_func)"), 'trigger_armed':(True, ve_types.Boolean, "test trigger on go loop?"), 'trigger_go_if_armed':(True, ve_types.Boolean, "trigger go loop?"), 'enter_go_loop':(False, ve_types.Boolean, "test used by run_forever() to enter go loop"), 'quit':(False, ve_types.Boolean, "quit the run_forever loop?"), 'warn_mean_fps_threshold':(0.01, # fraction (0.1 = 10%) ve_types.Real, "threshold to print observered vs. expected frame rate warning (fraction units)"), 'warn_longest_frame_threshold': (2.0, # fraction (set to 2.0 for no false positives) ve_types.Real, "threshold to print frame skipped warning (units: factor of inter-frame-interval)"), 'override_t_abs_sec':(None, # override t_abs (in seconds) -- set only when reconstructing experiments ve_types.Real, "Override t_abs. Set only when reconstructing experiments. (units: seconds)"), } __slots__ = ( 'controllers', 'num_frame_controllers', 'frame_draw_times', 'time_sec_absolute', 'frames_absolute', 'in_go_loop', 'frames_dropped_in_last_go_loop', 'last_go_loop_start_time_absolute_sec', 'time_sec_since_go', 'frames_since_go', ) def __init__(self,**kw): VisionEgg.ClassWithParameters.__init__(self,**kw) if self.parameters.viewports is None: self.parameters.viewports = [] if self.parameters.handle_event_callbacks is None: self.parameters.handle_event_callbacks = [] self.controllers = [] self.num_frame_controllers = 0 # reference counter for controllers that are called on frame by frame basis # A list that optionally records when frames were drawn by go() method. self.frame_draw_times = [] self.time_sec_absolute=VisionEgg.time_func() self.frames_absolute=0 self.in_go_loop = False self.frames_dropped_in_last_go_loop = False self.last_go_loop_start_time_absolute_sec = None def add_controller( self, class_with_parameters, parameter_name, controller ): """Add a controller""" # Check if type checking needed if type(class_with_parameters) != types.NoneType and type(parameter_name) != types.NoneType: # Check if return type of controller eval is same as parameter type if class_with_parameters.is_constant_parameter(parameter_name): raise TypeError("Attempt to control constant parameter '%s' of class %s."%(parameter_name,class_with_parameters)) require_type = class_with_parameters.get_specified_type(parameter_name) try: ve_types.assert_type(controller.returns_type(),require_type) except TypeError: raise TypeError("Attempting to control parameter '%s' of type %s with controller that returns type %s"%( parameter_name, require_type, controller.returns_type())) if not hasattr(class_with_parameters.parameters,parameter_name): raise AttributeError("%s has no instance '%s'"%parameter_name) self.controllers.append( (class_with_parameters.parameters,parameter_name, controller) ) else: # At least one of class_with_parameters or parameter_name is None. # Make sure they both are None. if not (type(class_with_parameters) == types.NoneType and type(parameter_name) == types.NoneType): raise ValueError("Neither or both of class_with_parameters and parameter_name must be None.") self.controllers.append( (None,None,controller) ) if controller.temporal_variables & (FRAMES_SINCE_GO|FRAMES_ABSOLUTE): self.num_frame_controllers = self.num_frame_controllers + 1 def remove_controller( self, class_with_parameters, parameter_name, controller=None ): """Remove one (or more--see below) controller(s). If controller is None, all controllers affecting the specified parameter are removed. If class_with_parameters and paramter_name are None, the controller is removed completely If class_with_parameters, paramter_name, and controller are all None, all controllers are removed. """ if class_with_parameters is None and parameter_name is None: if not isinstance(controller,Controller) and controller != None: raise TypeError( "When deleting a controller, specify an " "instance of VisionEgg.FlowControl.Controller class!") if controller == None: #Added by Tony, May30/2005 self.controllers = [] i = 0 while i < len(self.controllers): orig_parameters,orig_parameter_name,orig_controller = self.controllers[i] if controller == orig_controller: del self.controllers[i] else: i = i + 1 return if controller is None: # The controller function is not specified: # Delete all controllers that control the parameter specified. if class_with_parameters is None or parameter_name is None: raise ValueError("Must specify parameter from which controller should be removed.") i = 0 while i < len(self.controllers): orig_parameters,orig_parameter_name,orig_controller = self.controllers[i] if (orig_parameters == class_with_parameters.parameters and orig_parameter_name == parameter_name): controller = self.controllers[i][2] if controller.temporal_variables & (FRAMES_SINCE_GO|FRAMES_ABSOLUTE): self.num_frame_controllers = self.num_frame_controllers - 1 del self.controllers[i] else: i = i + 1 else: # controller is specified # Delete only that specific controller i = 0 while i < len(self.controllers): orig_parameters,orig_parameter_name,orig_controller = self.controllers[i] if (orig_parameters == class_with_parameters.parameters and orig_parameter_name == parameter_name and orig_controller == controller): if controller.temporal_variables & (FRAMES_SINCE_GO|FRAMES_ABSOLUTE): self.num_frame_controllers = self.num_frame_controllers - 1 else: i = i + 1 def __call_controllers(self, go_started=None, doing_transition=None): done_once = [] # list of ONCE contollers to switch status of for (parameters_instance, parameter_name, controller) in self.controllers: evaluate = 0 if controller.eval_frequency & ONCE: evaluate = 1 done_once.append(controller) elif doing_transition and (controller.eval_frequency & TRANSITIONS): evaluate = 1 elif controller.eval_frequency & EVERY_FRAME: evaluate = 1 if evaluate: if controller.temporal_variables & TIME_SEC_ABSOLUTE: controller.time_sec_absolute = self.time_sec_absolute if controller.temporal_variables & FRAMES_ABSOLUTE: controller.frames_absolute = self.frames_absolute if go_started: if not (controller.eval_frequency & NOT_DURING_GO): if controller.temporal_variables & TIME_SEC_SINCE_GO: controller.time_sec_since_go = self.time_sec_since_go if controller.temporal_variables & FRAMES_SINCE_GO: controller.frames_since_go = self.frames_since_go result = controller.during_go_eval() if parameter_name is not None: setattr(parameters_instance, parameter_name, result) else: if not (controller.eval_frequency & NOT_BETWEEN_GO): if controller.temporal_variables & TIME_SEC_SINCE_GO: controller.time_sec_since_go = None if controller.temporal_variables & FRAMES_SINCE_GO: controller.frames_since_go = None result = controller.between_go_eval() if parameter_name is not None: setattr(parameters_instance, parameter_name, result) for controller in done_once: #Unset ONCE flag controller.eval_frequency = controller.eval_frequency & ~ONCE if isinstance(controller,EncapsulatedController): controller.contained_controller.eval_frequency = controller.contained_controller.eval_frequency & ~ONCE def is_in_go_loop(self): """Queries if the presentation is in a go loop. This is useful to check the state of the Vision Egg application from a remote client over Pyro.""" return self.in_go_loop def were_frames_dropped_in_last_go_loop(self): return self.frames_dropped_in_last_go_loop def get_last_go_loop_start_time_absolute_sec(self): return self.last_go_loop_start_time_absolute_sec def go(self): """Main control loop during stimulus presentation. This is the heart of realtime control in the Vision Egg, and contains the main loop during a stimulus presentation. This coordinates the timing of calling the controllers. In the main loop, the current time (in absolute seconds, go-loop-start-relative seconds, and go-loop-start-relative frames) is computed, the appropriate controllers are called with this information, the screen is cleared, each viewport is drawn to the back buffer (while the video card continues painting the front buffer on the display), and the buffers are swapped. """ import VisionEgg.Core # here to prevent circular import self.in_go_loop = 1 swap_buffers = VisionEgg.Core.swap_buffers # shorthand # Clear boolean indicator self.frames_dropped_in_last_go_loop = False # Create shorthand notation, which speeds the main loop # slightly by not performing name lookup each time. p = self.parameters if p.collect_timing_info: frame_timer = VisionEgg.Core.FrameTimer() while (not p.trigger_armed) or (not p.trigger_go_if_armed): self.between_presentations() # Go! self.time_sec_absolute=VisionEgg.time_func() if p.override_t_abs_sec is not None: raise NotImplementedError("Cannot override absolute time yet") self.last_go_loop_start_time_absolute_sec = self.time_sec_absolute self.time_sec_since_go = 0.0 self.frames_since_go = 0 synclync_connection = VisionEgg.config._SYNCLYNC_CONNECTION # create shorthand if synclync_connection: import synclync synclync_connection.next_control_packet.action_flags += (synclync.SL_CLEAR_VSYNC_COUNT + synclync.SL_CLEAR_NOTIFY_SWAPPED_COUNT + synclync.SL_CLEAR_FRAMESKIP_COUNT) synclync_hack_done_once = 0 # Tell transitional controllers a presentation is starting self.__call_controllers( go_started=1, doing_transition=1) # Do the main loop start_time_absolute = self.time_sec_absolute if p.go_duration[0] == 'forever': # forever current_duration_value = 0 elif p.go_duration[1] == 'seconds': # duration units current_duration_value = self.time_sec_since_go elif p.go_duration[1] == 'frames': # duration units current_duration_value = self.frames_since_go else: raise RuntimeError("Unknown duration unit '%s'"%p.go_duration[1]) while (current_duration_value < p.go_duration[0]): # Get list of screens screens = [] for viewport in p.viewports: s = viewport.parameters.screen if s not in screens: screens.append(s) # Clear the screen(s) for screen in screens: screen.clear() # Update all the realtime parameters self.__call_controllers( go_started=1, doing_transition=0) # Draw each viewport for viewport in p.viewports: viewport.draw() # Swap the buffers if synclync_connection: if not synclync_hack_done_once: synclync_connection.next_control_packet.action_flags += (synclync.SL_NOTIFY_SWAPPED_BUFFERS + synclync.SL_NOTIFY_IN_GO_LOOP) synclync_connection.send_control_packet() synclync_hack_done_once = 1 data_packet = synclync_connection.get_latest_data_packet() swap_buffers() # Set the time variables for the next frame self.time_sec_absolute=VisionEgg.time_func() last_time_sec_since_go = self.time_sec_since_go self.time_sec_since_go = self.time_sec_absolute - start_time_absolute self.frames_absolute += 1 self.frames_since_go += 1 if p.collect_timing_info: frame_timer.tick() # Make sure we use the right value to check if we're done if p.go_duration[0] == 'forever': # forever pass # current_duration_value already set to 0 elif p.go_duration[1] == 'seconds': current_duration_value = self.time_sec_since_go elif p.go_duration[1] == 'frames': current_duration_value = self.frames_since_go else: raise RuntimeError("Unknown duration unit '%s'"%p.go_duration[1]) # Check events if requested if p.check_events: for event in pygame.event.get(): for event_type, event_callback in p.handle_event_callbacks: if event.type is event_type: event_callback(event) # Tell transitional controllers a presentation has ended self.__call_controllers( go_started=0, doing_transition=1) # Tell SyncLync we're not in go loop anymore if synclync_connection: synclync_connection.send_control_packet() # nothing in action_flags -- finishes go loop # Check to see if frame by frame control was desired # but OpenGL not syncing to vertical retrace try: mean_frame_time_sec = frame_timer.get_average_ifi_sec() calculated_fps = 1.0/mean_frame_time_sec except: # the above fails when no frames were drawn mean_frame_time_sec = 0.0 calculated_fps = 0.0 if self.num_frame_controllers: # Frame by frame control desired impossibly_fast_frame_rate = 210.0 if calculated_fps > impossibly_fast_frame_rate: # Let's assume no monitor can exceed impossibly_fast_frame_rate logger = logging.getLogger('VisionEgg.FlowControl') logger.error("Frame by frame control desired, but " "average frame rate was %.2f frames per " "second-- faster than any display device " "(that I know of). Set your drivers to " "sync buffer swapping to vertical " "retrace. (platform/driver " "dependent)"%(calculated_fps)) # Warn if > warn_mean_fps_threshold error in frame rate if abs(calculated_fps-VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ) / float(VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ) > self.parameters.warn_mean_fps_threshold: logger = logging.getLogger('VisionEgg.FlowControl') logger.warning("Calculated frames per second was %.3f, " "while the VISIONEGG_MONITOR_REFRESH_HZ " "variable is %s."%(calculated_fps, VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ)) frame_skip_fraction = self.parameters.warn_longest_frame_threshold inter_frame_inteval = 1.0/VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ if p.collect_timing_info: longest_frame_draw_time_sec = frame_timer.get_longest_frame_duration_sec() if longest_frame_draw_time_sec is not None: logger = logging.getLogger('VisionEgg.FlowControl') if longest_frame_draw_time_sec >= (frame_skip_fraction*inter_frame_inteval): self.frames_dropped_in_last_go_loop = True logger.warning("One or more frames took %.1f msec, " "which is signficantly longer than the " "expected inter frame interval of %.1f " "msec for your frame rate (%.1f Hz)."%( longest_frame_draw_time_sec*1000.0, inter_frame_inteval*1000.0, VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ)) else: logger.debug("Longest frame update was %.1f msec. " "Your expected inter frame interval is " "%f msec."%(longest_frame_draw_time_sec*1000.0, inter_frame_inteval*1000.0)) frame_timer.log_histogram() self.in_go_loop = 0 def export_movie_go(self, frames_per_sec=12.0, filename_suffix=".tif", filename_base="visionegg_movie", path="."): """Emulates method 'go' but saves a movie.""" import VisionEgg.Core # here to prevent circular import import Image # Could import this at the beginning of the file, but it breaks sometimes! import os # Could also import this, but this is the only place its needed # Create shorthand notation, which speeds the main loop # slightly by not performing name lookup each time. p = self.parameters # Switch function VisionEgg.time_func self.time_sec_absolute=VisionEgg.time_func() # Set for real once true_time_func = VisionEgg.time_func def fake_time_func(): return self.time_sec_absolute VisionEgg.time_func = fake_time_func logger = logging.getLogger('VisionEgg.FlowControl') # Go! self.time_sec_absolute=VisionEgg.time_func() self.time_sec_since_go = 0.0 self.frames_since_go = 0 # Tell transitional controllers a presentation is starting self.__call_controllers( go_started=1, doing_transition=1) # Do the main loop image_no = 1 if p.go_duration[0] == 'forever': # forever current_duration_value = 0 elif p.go_duration[1] == 'seconds': # duration units current_duration_value = self.time_sec_since_go elif p.go_duration[1] == 'frames': # duration units current_duration_value = self.frames_since_go else: raise RuntimeError("Unknown duration unit '%s'"%p.go_duration[1]) while (current_duration_value < p.go_duration[0]): # Get list of screens screens = [] for viewport in p.viewports: s = viewport.parameters.screen if s not in screens: screens.append(s) # Clear the screen(s) for screen in screens: screen.clear() # Update all the realtime parameters self.__call_controllers( go_started=1, doing_transition=0) # Draw each viewport for viewport in p.viewports: viewport.draw() # Swap the buffers VisionEgg.Core.swap_buffers() # Now save the contents of the framebuffer fb_image = screen.get_framebuffer_as_image(buffer='front',format=gl.GL_RGB) filename = "%s%04d%s"%(filename_base,image_no,filename_suffix) savepath = os.path.join( path, filename ) logger.info("Saving '%s'"%filename) fb_image.save( savepath ) image_no = image_no + 1 # Set the time variables for the next frame self.time_sec_absolute += 1.0/frames_per_sec self.time_sec_since_go += 1.0/frames_per_sec self.frames_absolute += 1 self.frames_since_go += 1 # Make sure we use the right value to check if we're done if p.go_duration[0] == 'forever': pass # current_duration_value already set to 0 elif p.go_duration[1] == 'seconds': current_duration_value = self.time_sec_since_go elif p.go_duration[1] == 'frames': current_duration_value = self.frames_since_go else: raise RuntimeError("Unknown duration unit '%s'"%p.go_duration[1]) # Check events if requested if p.check_events: for event in pygame.event.get(): for event_type, event_callback in p.handle_event_callbacks: if event.type is event_type: event_callback(event) # Tell transitional controllers a presentation has ended self.__call_controllers( go_started=0, doing_transition=1) if len(screens) > 1: logger.warning("Only saved movie from last screen.") scp = screen.constant_parameters if scp.red_bits is not None: warn_about_movie_depth = 0 if scp.red_bits > 8: warn_about_movie_depth = 1 elif scp.green_bits > 8: warn_about_movie_depth = 1 elif scp.blue_bits > 8: warn_about_movie_depth = 1 if warn_about_movie_depth: logger.warning("Only saved 8 bit per pixel movie, even " "though your framebuffer supports more!") # Restore VisionEgg.time_func VisionEgg.time_func = true_time_func def run_forever(self): """Main control loop between go loops.""" p = self.parameters # enter with transitional contoller call self.__call_controllers( go_started=0, doing_transition=1) while not p.quit: self.between_presentations() if self.parameters.enter_go_loop: self.parameters.enter_go_loop = False self.go() if p.check_events: for event in pygame.event.get(): for event_type, event_callback in p.handle_event_callbacks: if event.type is event_type: event_callback(event) def between_presentations(self): """Maintain display while between stimulus presentations. This function gets called as often as possible when in the 'run_forever' loop except when execution has shifted to the 'go' loop. Other than the difference in the time variable passed to the controllers, this routine is very similar to the inside of the main loop in the go method. """ import VisionEgg.Core # here to prevent circular import self.time_sec_absolute=VisionEgg.time_func() self.__call_controllers( go_started=0, doing_transition=0) viewports = self.parameters.viewports # Get list of screens screens = [] for viewport in viewports: s = viewport.parameters.screen if s not in screens: screens.append(s) # Clear the screen(s) for screen in screens: screen.clear() # Draw each viewport, including each stimulus for viewport in viewports: viewport.draw() VisionEgg.Core.swap_buffers() self.frames_absolute += 1 #################################################################### # # Controller # #################################################################### class Controller(object): """Control parameters. This abstract base class defines the interface to any controller. Methods: returns_type() -- Get the type of the value returned by the eval functions during_go_eval() -- Evaluate controller during the main 'go' loop. between_go_eval() -- Evaluate controller between runs of the main 'go' loop. The during_go_eval() and between_go_eval() methods are called to update a particular parameter such as the position of a stimulus on the screen. These methods must return a value specified by the returns_type() method. These methods are called at particular intervals as specified by eval_frequency and with temporal parameters specified by temporal_variables (see below for more details). Also, see the documentation for the Presentation class. Attributes: return_type -- type of the value returned by the eval functions eval_frequency -- when eval functions called (see above) temporal_variables -- what time variables used (see above) A Controller instance's attribute "eval_frequency" controls when a controller is evaluated. This variable is a bitwise "or" (the | operator) of the following flags: EVERY_FRAME -- every frame TRANSITIONS -- on enter and exit from go loop ONCE -- at the next chance possible (see below) NOT_DURING_GO -- as above, but never during go loop (see below) NOT_BETWEEN_GO -- as above, but never between go loops (see below) The ONCE flag is automatically unset after evaluation, hence its name. As an example, if eval_frequency is set to ONCE | TRANSITIONS, it will be evaluated before drawing the next frame and then only before and after the go loop. NOT_DURING_GO and NOT_BETWEEN_GO modify other behavior. For example, to evaluate a controller on every frame during go loops but not between go loops: eval_frequency = EVERY_FRAME | NOT_BETWEEN_GO If none of the above flags is set, the value is: NEVER -- this controller is never called A Controller instance's attribute "temporal_variables" controls what time variables are set for use. This variable is a bitwise "or" of the following flags: TIME_SEC_ABSOLUTE -- seconds, continuously increasing TIME_SEC_SINCE_GO -- seconds, reset to 0.0 each go loop FRAMES_ABSOLUTE -- frames, continuously increasing FRAMES_SINCE_GO -- frames, reset to 0 each go loop If none of these flags is set, the value is: TIME_INDEPENDENT -- No temporal variables. When the eval methods (during_go_eval and between_go_eval) are called, attributes are set depending on the temporal variables used: temporal_variable attribute set ----------------- ------------- TIME_SEC_ABSOLUTE self.time_sec_absolute TIME_SEC_SINCE_GO self.time_sec_since_go FRAMES_ABSOLUTE self.frames_absolute FRAMES_SINCE_GO self.frames_since_go Other information: Instances of Controller are called by instances of the Presentation class. during_go_eval() is called during a go() loop, and between_go_eval() is called by between_presentations() (during run_forever(), for example). Before calling these methods, attributes of the controller are set accoring to \attribute{temporal_variables}. """ # temporal_variables flags: TIME_INDEPENDENT = 0x00 TIME_SEC_ABSOLUTE = 0x01 TIME_SEC_SINCE_GO = 0x02 FRAMES_ABSOLUTE = 0x04 FRAMES_SINCE_GO = 0x08 # eval_frequency flags: NEVER = 0x00 EVERY_FRAME = 0x01 TRANSITIONS = 0x02 ONCE = 0x04 NOT_DURING_GO = 0x08 NOT_BETWEEN_GO = 0x10 flag_dictionary = { 'TIME_INDEPENDENT' : TIME_INDEPENDENT, 'TIME_SEC_ABSOLUTE' : TIME_SEC_ABSOLUTE, 'TIME_SEC_SINCE_GO' : TIME_SEC_SINCE_GO, 'FRAMES_ABSOLUTE' : FRAMES_ABSOLUTE, 'FRAMES_SINCE_GO' : FRAMES_SINCE_GO, 'NEVER' : NEVER, 'EVERY_FRAME' : EVERY_FRAME, 'TRANSITIONS' : TRANSITIONS, 'ONCE' : ONCE, 'NOT_DURING_GO' : NOT_DURING_GO, 'NOT_BETWEEN_GO' : NOT_BETWEEN_GO} def __init__(self, eval_frequency = EVERY_FRAME, temporal_variables = TIME_SEC_SINCE_GO, return_type = None): """Create instance of Controller. Keyword arguments: eval_frequency -- Int, bitwise "or" of flags temporal_variables -- Int, bitwise "or" of flags return_type -- a VisionEgg.ParameterTypes.ParameterTypeDef subclass If return_type is not set, it calls the function once to get a return value and then attempts to guess its type. """ if return_type is None: raise ValueError("Must set argument 'return_type' in Controller.") if not ve_types.is_parameter_type_def(return_type): raise TypeError("Argument 'return_type' in Controller must be a " "VisionEgg parameter type definition. Hint: use " "VisionEgg.ParameterTypes.get_type() to get the " "type of your value") self.return_type = return_type self.temporal_variables = temporal_variables self.eval_frequency = eval_frequency def evaluate_now(self): """Call this after updating the values of a controller if it's not evaluated EVERY_FRAME.""" self.eval_frequency = self.eval_frequency | ONCE def set_eval_frequency(self,eval_frequency): self.eval_frequency = eval_frequency def returns_type(self): """Called by Presentation. Get the return type of this controller.""" return self.return_type def during_go_eval(self): """Called by Presentation. Evaluate during the main 'go' loop. Override this method in subclasses.""" raise RuntimeError("%s: Definition of during_go_eval() in abstract base class Contoller must be overriden."%(str(self),)) def between_go_eval(self): """Called by Presentation. Evaluate between runs of the main 'go' loop. Override this method in subclasses.""" raise RuntimeError("%s: Definition of between_go_eval() in abstract base class Controller must be overriden."%(str(self),)) def _test_self(self,go_started): """Test whether a controller works. This method performs everything the Presentation go() or run_forever() methods do when calling controllers, except that the temporal variables are set to -1 and that the return value is not used to set parameters.""" if self.temporal_variables & TIME_SEC_ABSOLUTE: self.time_sec_absolute = -1.0 if self.temporal_variables & FRAMES_ABSOLUTE: self.frames_absolute = -1 if go_started: if not (self.eval_frequency & NOT_DURING_GO): if self.temporal_variables & TIME_SEC_SINCE_GO: self.time_sec_since_go = -1.0 if self.temporal_variables & FRAMES_SINCE_GO: self.frames_since_go = -1 return self.during_go_eval() else: if not (self.eval_frequency & NOT_BETWEEN_GO): if self.temporal_variables & TIME_SEC_SINCE_GO: self.time_sec_since_go = None if self.temporal_variables & FRAMES_SINCE_GO: self.frames_since_go = None return self.between_go_eval() class ConstantController(Controller): """Set parameters to a constant value.""" def __init__(self, during_go_value = None, between_go_value = None, **kw ): if kw.get('return_type',None) is None: kw.setdefault('return_type',ve_types.get_type(during_go_value)) kw.setdefault('eval_frequency',ONCE | TRANSITIONS) Controller.__init__(self,**kw) if self.return_type is not types.NoneType and during_go_value is None: raise ValueError("Must specify during_go_value") if between_go_value is None: between_go_value = during_go_value ve_types.assert_type(ve_types.get_type(during_go_value),self.return_type) ve_types.assert_type(ve_types.get_type(between_go_value),self.return_type) self.during_go_value = during_go_value self.between_go_value = between_go_value def set_during_go_value(self,during_go_value): ve_types.assert_type(ve_types.get_type(during_go_value),self.return_type) self.during_go_value = during_go_value def get_during_go_value(self): return self.during_go_value def set_between_go_value(self,between_go_value): ve_types.assert_type(ve_types.get_type(between_go_value),self.return_type) self.between_go_value = between_go_value def get_between_go_value(self): return self.between_go_value def during_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" return self.during_go_value def between_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" return self.between_go_value class EvalStringController(Controller): """Set parameters using dynamically interpreted Python string. The string, when evaluated as Python code, becomes the value used. For example, the string "1.0" would set parameter values to 1.0. To increase speed, the string is compiled to Python's bytecode format. The string can make use of temporal variables, which are made available depending on the controller's temporal_variables attribute. Note that only the absolute temporal variables are available when the go loop is not running. flag(s) present variable description TIME_SEC_ABSOLUTE t_abs seconds, continuously increasing TIME_SEC_SINCE_GO t seconds, reset to 0.0 each go loop FRAMES_ABSOLUTE f_abs frames, continuously increasing FRAMES_SINCE_GO f frames, reset to 0 each go loop """ def __init__(self, during_go_eval_string = None, between_go_eval_string = None, **kw ): import VisionEgg.Core # here to prevent circular import # Create a namespace for eval_strings to use self.eval_globals = {} if during_go_eval_string is None: raise ValueError("'during_go_eval_string' is a required argument") # Make Numeric and math modules available self.eval_globals['Numeric'] = Numeric self.eval_globals['math'] = math # Make Numeric and math modules available without module name for key in dir(Numeric): self.eval_globals[key] = getattr(Numeric,key) for key in dir(math): self.eval_globals[key] = getattr(math,key) self.during_go_eval_code = compile(during_go_eval_string,'','eval') self.during_go_eval_string = during_go_eval_string not_between_go = 0 if between_go_eval_string is None: not_between_go = 1 else: self.between_go_eval_code = compile(between_go_eval_string,'','eval') self.between_go_eval_string = between_go_eval_string # Check to make sure return_type is set set_return_type = 0 if kw.get('return_type',None) is None: set_return_type = 1 kw['return_type'] = types.NoneType # Call base class __init__ Controller.__init__(self,**kw) if not_between_go: self.eval_frequency = self.eval_frequency|NOT_BETWEEN_GO if set_return_type: logger = logging.getLogger('VisionEgg.FlowControl') if not (self.eval_frequency & NOT_DURING_GO): logger.debug( 'Executing "%s" to test for return type.'%(during_go_eval_string,)) self.return_type = ve_types.get_type(self._test_self(go_started=1)) elif not (self.eval_frequency & NOT_BETWEEN_GO): logger.debug('Executing "%s" to test for return type.'%(between_go_eval_string,)) self.return_type = ve_types.get_type(self._test_self(go_started=0)) def set_during_go_eval_string(self,during_go_eval_string): self.during_go_eval_code = compile(during_go_eval_string,'','eval') self.during_go_eval_string = during_go_eval_string def get_during_go_eval_string(self): return self.during_go_eval_string def set_between_go_eval_string(self,between_go_eval_string): self.between_go_eval_code = compile(between_go_eval_string,'','eval') self.between_go_eval_string = between_go_eval_string self.eval_frequency = self.eval_frequency & ~NOT_BETWEEN_GO def get_between_go_eval_string(self): if hasattr(self,"between_go_eval_string"): return self.between_go_eval_string else: return None def during_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" eval_locals = {} if self.temporal_variables & TIME_SEC_ABSOLUTE: eval_locals['t_abs'] = self.time_sec_absolute if self.temporal_variables & TIME_SEC_SINCE_GO: eval_locals['t'] = self.time_sec_since_go if self.temporal_variables & FRAMES_ABSOLUTE: eval_locals['f_abs'] = self.frames_absolute if self.temporal_variables & FRAMES_SINCE_GO: eval_locals['f'] = self.frames_since_go return eval(self.during_go_eval_code,self.eval_globals,eval_locals) def between_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" eval_locals = {} if self.temporal_variables & TIME_SEC_ABSOLUTE: eval_locals['t_abs'] = self.time_sec_absolute if self.temporal_variables & FRAMES_ABSOLUTE: eval_locals['f_abs'] = self.frames_absolute return eval(self.between_go_eval_code,self.eval_globals,eval_locals) class ExecStringController(Controller): """Set parameters using potentially complex Python string. You can execute arbitrarily complex Python code with this controller. The return value must be contained within the variable "x". In other words, this string must assign the variable x, so setting the string to "x=1.0" would set the parameter under control to 1.0. To increase speed, the string is compiled to Python's bytecode format. The string can make use of temporal variables, which are made available depending on the controller's temporal_variables attribute. Note that only the absolute temporal variables are available when the go loop is not running. flag(s) present variable description ----------------- -------- ---------------------------------- TIME_SEC_ABSOLUTE t_abs seconds, continuously increasing TIME_SEC_SINCE_GO t seconds, reset to 0.0 each go loop FRAMES_ABSOLUTE f_abs frames, continuously increasing FRAMES_SINCE_GO f frames, reset to 0 each go loop """ def __init__(self, during_go_exec_string = None, between_go_exec_string = None, restricted_namespace = 1, **kw ): import VisionEgg.Core # here to prevent circular import # Create a namespace for eval_strings to use self.eval_globals = {} if during_go_exec_string is None: raise ValueError, "'during_go_exec_string' is a required argument" self.restricted_namespace = restricted_namespace if self.restricted_namespace: # Make Numeric and math modules available self.eval_globals['Numeric'] = Numeric self.eval_globals['math'] = math # Make Numeric and math modules available without module name for key in dir(Numeric): self.eval_globals[key] = getattr(Numeric,key) for key in dir(math): self.eval_globals[key] = getattr(math,key) self.during_go_exec_code = compile(during_go_exec_string,'','exec') self.during_go_exec_string = during_go_exec_string not_between_go = 0 if between_go_exec_string is None: not_between_go = 1 else: self.between_go_exec_code = compile(between_go_exec_string,'','exec') self.between_go_exec_string = between_go_exec_string # Check to make sure return_type is set set_return_type = 0 if kw.get('return_type',None) is None: set_return_type = 1 kw['return_type'] = types.NoneType # Call base class __init__ Controller.__init__(self,**kw) if not_between_go: self.eval_frequency = self.eval_frequency|NOT_BETWEEN_GO if set_return_type: logger = logging.getLogger('VisionEgg.FlowControl') if not (self.eval_frequency & NOT_DURING_GO): logger.debug('Executing "%s" to test for return type.'%(during_go_exec_string,)) self.return_type = ve_types.get_type(self._test_self(go_started=1)) elif not (self.eval_frequency & NOT_BETWEEN_GO): logger.debug('Executing "%s" to test for return type.'%(between_go_exec_string,)) self.return_type = ve_types.get_type(self._test_self(go_started=0)) def set_during_go_exec_string(self,during_go_exec_string): self.during_go_exec_code = compile(during_go_exec_string,'','exec') self.during_go_exec_string = during_go_exec_string def get_during_go_exec_string(self): return self.during_go_exec_string def set_between_go_exec_string(self,between_go_exec_string): self.between_go_exec_code = compile(between_go_exec_string,'','exec') self.between_go_exec_string = between_go_exec_string self.eval_frequency = self.eval_frequency & ~NOT_BETWEEN_GO def get_between_go_exec_string(self): if hasattr(self,"between_go_exec_string"): return self.between_go_exec_string else: return None def during_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" eval_locals = {} if self.temporal_variables & TIME_SEC_ABSOLUTE: eval_locals['t_abs'] = self.time_sec_absolute if self.temporal_variables & TIME_SEC_SINCE_GO: eval_locals['t'] = self.time_sec_since_go if self.temporal_variables & FRAMES_ABSOLUTE: eval_locals['f_abs'] = self.frames_absolute if self.temporal_variables & FRAMES_SINCE_GO: eval_locals['f'] = self.frames_since_go if self.restricted_namespace: exec self.during_go_exec_code in self.eval_globals,eval_locals return eval_locals['x'] else: setup_locals_str = "\n" for local_variable_name in eval_locals.keys(): setup_locals_str = setup_locals_str + local_variable_name + "=" + repr(eval_locals[local_variable_name]) + "\n" exec setup_locals_str exec self.during_go_exec_code return x def between_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" eval_locals = {} if self.temporal_variables & TIME_SEC_ABSOLUTE: eval_locals['t_abs'] = self.time_sec_absolute if self.temporal_variables & FRAMES_ABSOLUTE: eval_locals['f_abs'] = self.frames_absolute if self.restricted_namespace: exec self.between_go_exec_code in self.eval_globals,eval_locals return eval_locals['x'] else: setup_locals_str = "\n" for local_variable_name in eval_locals.keys(): setup_locals_str = setup_locals_str + local_variable_name + "=" + repr(eval_locals[local_variable_name]) + "\n" exec setup_locals_str exec self.between_go_exec_code return x # x should be assigned by the exec string class FunctionController(Controller): """Set parameters using a Python function. This is a very commonly used subclass of Controller, because it is very intuitive and requires a minimum of code to set up. Many of the Vision Egg demo programs create instances of FunctionController. A number of parameters are passed to the function depending on the value of temporal_variables: The function can make use of temporal variables, which are made available by passing keyword argument(s) depending on the controller's temporal_variables attribute. Note that only the absolute temporal variables are available when the go loop is not running. flag(s) present argument description ----------------- -------- ---------------------------------- TIME_SEC_ABSOLUTE t_abs seconds, continuously increasing TIME_SEC_SINCE_GO t seconds, reset to 0.0 each go loop FRAMES_ABSOLUTE f_abs frames, continuously increasing FRAMES_SINCE_GO f frames, reset to 0 each go loop """ def __init__(self, during_go_func = None, between_go_func = None, **kw ): """Create an instance of FunctionController. Arguments: during_go_func -- function evaluted during go loop between_go_func -- function evaluted not during go loop Keyword arguments: temporal_variables -- a bitwise mask of constants return_type -- a VisionEgg.ParameterTypes.ParameterTypeDef subclass temporal_variables defaults to TIME_SEC_SINCE_GO. If return_type is not set, it calls the function once to get a return value and then attempts to guess its type. """ import VisionEgg.Core # here to prevent circular import if during_go_func is None: raise ValueError("Must specify during_go_func") # Set default value if not set kw.setdefault('temporal_variables',TIME_SEC_SINCE_GO) # default value # Check to make sure return_type is set if kw.get('return_type',None) is None: logger = logging.getLogger('VisionEgg.FlowControl') logger.debug('Evaluating %s to test for return type.'%(str(during_go_func),)) call_args = {} if kw['temporal_variables'] & TIME_SEC_ABSOLUTE: call_args['t_abs'] = VisionEgg.time_func() if kw['temporal_variables'] & TIME_SEC_SINCE_GO: call_args['t'] = 0.0 if kw['temporal_variables'] & FRAMES_ABSOLUTE: call_args['f_abs'] = 0 if kw['temporal_variables'] & FRAMES_SINCE_GO: call_args['f'] = 0 # Call the function with time variables kw['return_type'] = ve_types.get_type(during_go_func(**call_args)) Controller.__init__(self,**kw) self.during_go_func = during_go_func self.between_go_func = between_go_func if between_go_func is None: self.eval_frequency = self.eval_frequency|NOT_BETWEEN_GO def during_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" call_args = {} if self.temporal_variables & TIME_SEC_ABSOLUTE: call_args['t_abs'] = self.time_sec_absolute if self.temporal_variables & TIME_SEC_SINCE_GO: call_args['t'] = self.time_sec_since_go if self.temporal_variables & FRAMES_ABSOLUTE: call_args['f_abs'] = self.frames_absolute if self.temporal_variables & FRAMES_SINCE_GO: call_args['f'] = self.frames_since_go return self.during_go_func(**call_args) def between_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" call_args = {} if self.temporal_variables & TIME_SEC_ABSOLUTE: call_args['t_abs'] = self.time_sec_absolute if self.temporal_variables & FRAMES_ABSOLUTE: call_args['f_abs'] = self.frames_absolute return self.between_go_func(**call_args) class EncapsulatedController(Controller): """Set parameters by encapsulating another Controller. Allows a new instance of Controller to control the same parameter as an old instance. You probably won't ever have to use this class directly. Both the VisionEgg.TCPController.TCPController and VisionEgg.PyroHelpers.PyroEncapsulatedController classes subclass this class. """ def __init__(self,initial_controller): # Initialize base class without raising error for no return_type Controller.__init__(self,**{'return_type':types.NoneType}) self.contained_controller = initial_controller self.__sync_mimic() def __sync_mimic(self): self.return_type = self.contained_controller.return_type self.temporal_variables = self.contained_controller.temporal_variables self.eval_frequency = self.contained_controller.eval_frequency def set_new_controller(self,new_controller): """Call this to encapsulate a (new) controller.""" self.contained_controller = new_controller self.__sync_mimic() def during_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" import VisionEgg.Core # here to prevent circular import if self.temporal_variables & TIME_SEC_ABSOLUTE: self.contained_controller.time_sec_absolute = self.time_sec_absolute if self.temporal_variables & TIME_SEC_SINCE_GO: self.contained_controller.time_sec_since_go = self.time_sec_since_go if self.temporal_variables & FRAMES_ABSOLUTE: self.contained_controller.frames_absolute = self.frames_absolute if self.temporal_variables & FRAMES_SINCE_GO: self.contained_controller.frames_since_go = self.frames_since_go return self.contained_controller.during_go_eval() def between_go_eval(self): """Called by Presentation. Overrides method in Controller base class.""" import VisionEgg.Core # here to prevent circular import import VisionEgg.FlowControl if self.temporal_variables & TIME_SEC_ABSOLUTE: self.contained_controller.time_sec_absolute = self.time_sec_absolute if self.temporal_variables & FRAMES_ABSOLUTE: self.contained_controller.frames_absolute = self.frames_absolute return self.contained_controller.between_go_eval() # Constants (These are a copy of the static class variables from the # Controller class into the module-level namespace. This is done for # convenience.) # temporal_variables flags: TIME_INDEPENDENT = Controller.TIME_INDEPENDENT TIME_SEC_ABSOLUTE = Controller.TIME_SEC_ABSOLUTE TIME_SEC_SINCE_GO = Controller.TIME_SEC_SINCE_GO FRAMES_ABSOLUTE = Controller.FRAMES_ABSOLUTE FRAMES_SINCE_GO = Controller.FRAMES_SINCE_GO # eval_frequency flags: NEVER = Controller.NEVER EVERY_FRAME = Controller.EVERY_FRAME TRANSITIONS = Controller.TRANSITIONS ONCE = Controller.ONCE NOT_DURING_GO = Controller.NOT_DURING_GO NOT_BETWEEN_GO = Controller.NOT_BETWEEN_GO visionegg-1.2.1/VisionEgg/GL.py0000644000076500000240000000261111224565527015450 0ustar astrawstaff# The Vision Egg: GL # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ """ Vision Egg GL module -- lump all OpenGL names in one namespace. """ from OpenGL.GL import * # get everything from OpenGL.GL import OpenGL import numpy if OpenGL.__version__.startswith('3.0.0b'): raise RuntimeError('PyOpenGL 3beta has known incompatibilities ' 'with the Vision Egg. Please upgrade to PyOpenGL 3.') __version__ = OpenGL.__version__ # tell py2exe we want these modules try: import OpenGL.GL.GL__init___ except: pass try: import OpenGL.GL.ARB.multitexture except: pass try: import OpenGL.GL.EXT.bgra except: pass try: import SGIS.texture_edge_clamp except: pass # why doesn't PyOpenGL define this?! try: GL_UNSIGNED_INT_8_8_8_8_REV except NameError: GL_UNSIGNED_INT_8_8_8_8_REV = 0x8367 if OpenGL.__version__[0] == '3': if (OpenGL.__version__.startswith('3.0.0a')) or (OpenGL.__version__ == '3.0.0b1'): # A bug in early PyOpenGL 3.x had problems with some arrays _orig_glLoadMatrixf = glLoadMatrixf def glLoadMatrixf(M): M = numpy.array([ Mi for Mi in M ]) return _orig_glLoadMatrixf(M) visionegg-1.2.1/VisionEgg/gl_qt.c0000644000076500000240000001577311224565530016055 0ustar astrawstaff/* * Copyright (c) 2003, 2006 Andrew Straw. Distributed under the terms * of the GNU Lesser General Public License (LGPL). * * Author: Andrew Straw * */ #include "Python.h" #if defined(MS_WINDOWS) # include #endif #include #include #if defined(__APPLE__) # include # include # include #else # include # include #endif #include "gl_qt.h" int gl_qt_error = 0; const char * gl_qt_error_str= NULL; static char mac_err_str[256]; const char * MAC_OSERR_TO_STR ( int OSErr ) { // XXX could make this lookup the error using mac Estr resources snprintf(mac_err_str,256,"Mac OS error %d",OSErr); return mac_err_str; } int gl_qt_err_occurred( void ) { return gl_qt_error; } const char * gl_qt_err_message( void ) { return gl_qt_error_str; } void gl_qt_set_error(const char * errmsg) { gl_qt_error = 1; gl_qt_error_str = errmsg; } gl_qt_renderer* gl_qt_renderer_create( Movie theMovie, short tex_shape, float tex_scale ) { gl_qt_renderer * render_info = NULL; short gMovieWidth, gMovieHeight; int wOffScreenDepth; long sizeTexture; // Movie Rect gMovieRect = {0, 0, 0, 0}; Rect rectNewMovie; MatrixRecord movieMatrix; /// XXX todo: should check tex_shape is power of 2 render_info = malloc(sizeof(gl_qt_renderer)); if (render_info == NULL) { gl_qt_set_error("memory allocation failure (render_info)"); return NULL; } render_info->gl_texel_data = NULL; render_info->qt_pixel_data = NULL; render_info->offscreen_gworld = NULL; render_info->my_movie = theMovie; GetMovieBox(render_info->my_movie, &gMovieRect); gMovieRect.bottom = gMovieRect.bottom-gMovieRect.top; gMovieRect.top = 0; gMovieRect.right = gMovieRect.right-gMovieRect.left; gMovieRect.left = 0; SetMovieBox(render_info->my_movie, &gMovieRect); gMovieWidth = (short) (gMovieRect.right - gMovieRect.left); gMovieHeight = (short) (gMovieRect.bottom - gMovieRect.top); render_info->tex_shape=tex_shape; // on both sides (square) wOffScreenDepth=32; // if packed pixel implemented, this could be reduced // allocate RGB 888 texture buffer sizeTexture = 3 * tex_shape * tex_shape; // size of texture in bytes render_info->gl_texel_data = (GLubyte *)malloc(sizeTexture); if (render_info->gl_texel_data == NULL) { gl_qt_set_error("memory allocation failure (render_info->gl_texel_data)"); goto fail; } if (tex_scale == 0.0) { // auto-scale if (gMovieWidth > gMovieHeight) { tex_scale = (float)tex_shape / (float) gMovieWidth; } else { tex_scale = (float)tex_shape / (float) gMovieHeight; } } render_info->tex_width = (short) ((float)gMovieWidth * tex_scale); render_info->tex_height = (short) ((float)gMovieHeight * tex_scale); if ((render_info->tex_width > tex_shape) || (render_info->tex_height > tex_shape)) { gl_qt_set_error("movie too big for assigned texture shape"); goto fail; } SetIdentityMatrix (&movieMatrix); ScaleMatrix(&movieMatrix, X2Fix(tex_scale), // XXX where is X2Fix defined? X2Fix(tex_scale), X2Fix(0.0), X2Fix(0.0)); SetMovieMatrix(render_info->my_movie, &movieMatrix); rectNewMovie.top = 0; rectNewMovie.left = 0; rectNewMovie.bottom = render_info->tex_height; rectNewMovie.right = render_info->tex_width; render_info->row_stride = render_info->tex_width * wOffScreenDepth / 8; render_info->qt_pixel_data = (unsigned char *) malloc(render_info->row_stride * render_info->tex_height); if (render_info->qt_pixel_data == NULL) { gl_qt_set_error("memory allocation failure (render_info->qt_pixel_data)"); goto fail; } memset(render_info->qt_pixel_data, 0, render_info->row_stride * render_info->tex_height); QTNewGWorldFromPtr (&(render_info->offscreen_gworld), k32ARGBPixelFormat, &rectNewMovie, NULL, NULL, 0, render_info->qt_pixel_data, render_info->row_stride); if (render_info->offscreen_gworld == NULL) { gl_qt_set_error("error allocating offscreen GWorld"); goto fail; } SetMovieGWorld(render_info->my_movie, (CGrafPtr)render_info->offscreen_gworld, NULL); render_info->offscreen_pixmap = GetGWorldPixMap(render_info->offscreen_gworld); if (!render_info->offscreen_pixmap) { gl_qt_set_error("Could not GetGWorldPixMap"); goto fail; } if (!LockPixels(render_info->offscreen_pixmap)) { gl_qt_set_error("Could not LockPixels"); goto fail; } render_info->qt_pixel_data = (unsigned char *) GetPixBaseAddr(render_info->offscreen_pixmap); //render_info->row_stride = (unsigned long) GetPixRowBytes(render_info->offscreen_pixmap); return render_info; fail: if (render_info->gl_texel_data != NULL) { free(render_info->gl_texel_data); } if (render_info->qt_pixel_data != NULL) { free(render_info->qt_pixel_data); } if (render_info->offscreen_gworld != NULL) { DisposeGWorld(render_info->offscreen_gworld); } if (render_info != NULL) { free(render_info); } return NULL; } void gl_qt_renderer_delete( gl_qt_renderer * render_info ) { int free_warning = 0; if (render_info->offscreen_gworld != NULL) DisposeGWorld(render_info->offscreen_gworld); else free_warning = 1; if (render_info->gl_texel_data != NULL) free(render_info->gl_texel_data); else free_warning = 1; if (render_info->qt_pixel_data != NULL) free(render_info->qt_pixel_data); else free_warning = 1; if (render_info != NULL) free(render_info); else free_warning = 1; if (free_warning) { gl_qt_set_error("gl_qt_renderer_delete() called, but something was already deleted!"); } } void gl_qt_renderer_update(gl_qt_renderer * render_info) { // Despite the swizzeling, this is faster (on my PowerBook G4 ATI // Rage 128 OS X 10.2.6, anyway) than sending the data as GL_ABGR // direct to OpenGL. // Also, this way we can flip the image 'right side up' (according // to OpenGL) for free. // Step 1 - 'swizzle' data (convert ABGR to RGB) register int i,j; register unsigned char * pos; register unsigned char * pTextile; register int row; GLenum error; const char *this_msg; row = render_info->tex_height; for (j = 0; j < render_info->tex_height; j++) { row--; pTextile = render_info->gl_texel_data + row*render_info->tex_width*3; // pTextile = render_info->gl_texel_data + row*render_info->tex_shape*3; for (i = 0; i < render_info->tex_width; i++) { pos = (unsigned char *)(render_info->qt_pixel_data + (j * render_info->row_stride) + (i * 4)); *(pTextile++) = *(pos + 1); *(pTextile++) = *(pos + 2); *(pTextile++) = *(pos + 3); } } // Step 2 - send to OpenGL active 2D texture object glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, render_info->tex_width, render_info->tex_height, GL_RGB, GL_UNSIGNED_BYTE, render_info->gl_texel_data); error = glGetError(); if (GL_NO_ERROR != error) { //this_msg = gluErrorString(error); this_msg = "unknown error"; gl_qt_set_error(this_msg); } } visionegg-1.2.1/VisionEgg/gl_qt.h0000644000076500000240000000145011224565530016045 0ustar astrawstaff#ifndef _QUICKTIME_C_H_ #define _QUICKTIME_C_H_ #include "vegl.h" #if defined(__APPLE__) # include #else # include #endif typedef struct { Movie my_movie; // OpenGL info GLubyte * gl_texel_data; short tex_shape; short tex_height; short tex_width; // QuickTime offscreen info unsigned char * qt_pixel_data; unsigned long row_stride; GWorldPtr offscreen_gworld; PixMapHandle offscreen_pixmap; } gl_qt_renderer; /* Error checking */ int gl_qt_err_occurred(void); const char * gl_qt_err_message(void); /* Standard functions */ gl_qt_renderer* gl_qt_renderer_create( Movie theMovie, short tex_shape, float tex_scale ); // tex_scale = 0.0 is auto void gl_qt_renderer_delete( gl_qt_renderer *); void gl_qt_renderer_update( gl_qt_renderer *); #endif visionegg-1.2.1/VisionEgg/gl_qt.py0000644000076500000240000000253511224565530016253 0ustar astrawstaff# This file was created automatically by SWIG. # Don't modify this file, modify the SWIG interface instead. # This file is compatible with both classic and new-style classes. import _gl_qt def _swig_setattr_nondynamic(self,class_type,name,value,static=1): if (name == "this"): if isinstance(value, class_type): self.__dict__[name] = value.this if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown del value.thisown return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) if (not static) or hasattr(self,name) or (name == "thisown"): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self,class_type,name,value): return _swig_setattr_nondynamic(self,class_type,name,value,0) def _swig_getattr(self,class_type,name): method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) raise AttributeError,name import types try: _object = types.ObjectType _newclass = 1 except AttributeError: class _object : pass _newclass = 0 del types gl_qt_renderer_create = _gl_qt.gl_qt_renderer_create gl_qt_renderer_delete = _gl_qt.gl_qt_renderer_delete gl_qt_renderer_update = _gl_qt.gl_qt_renderer_update visionegg-1.2.1/VisionEgg/gl_qt_wrap.c0000644000076500000240000015532511224565530017104 0ustar astrawstaff/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.24 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #ifndef SWIG_TEMPLATE_DISAMBIGUATOR # if defined(__SUNPRO_CC) # define SWIG_TEMPLATE_DISAMBIGUATOR template # else # define SWIG_TEMPLATE_DISAMBIGUATOR # endif #endif #include /*********************************************************************** * swigrun.swg * * This file contains generic CAPI SWIG runtime support for pointer * type checking. * ************************************************************************/ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "1" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE #define SWIG_QUOTE_STRING(x) #x #define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) #define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else #define SWIG_TYPE_TABLE_NAME #endif #include #ifndef SWIGINLINE #if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline #else # define SWIGINLINE #endif #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the swig runtime code. In 99.9% of the cases, swig just needs to declare them as 'static'. But only do this if is strictly necessary, ie, if you have problems with your compiler or so. */ #ifndef SWIGRUNTIME #define SWIGRUNTIME static #endif #ifndef SWIGRUNTIMEINLINE #define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *); typedef struct swig_type_info *(*swig_dycast_func)(void **); typedef struct swig_type_info { const char *name; swig_converter_func converter; const char *str; void *clientdata; swig_dycast_func dcast; struct swig_type_info *next; struct swig_type_info *prev; } swig_type_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return *f1 - *f2; } return (l1 - f1) - (l2 - f2); } /* Check type equivalence in a name list like ||... */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te) == 0; if (*ne) ++ne; } return equiv; } /* Register a type mapping with the type-checking */ SWIGRUNTIME swig_type_info * SWIG_TypeRegisterTL(swig_type_info **tl, swig_type_info *ti) { swig_type_info *tc, *head, *ret, *next; /* Check to see if this type has already been registered */ tc = *tl; while (tc) { /* check simple type equivalence */ int typeequiv = (strcmp(tc->name, ti->name) == 0); /* check full type equivalence, resolving typedefs */ if (!typeequiv) { /* only if tc is not a typedef (no '|' on it) */ if (tc->str && ti->str && !strstr(tc->str,"|")) { typeequiv = SWIG_TypeEquiv(ti->str,tc->str); } } if (typeequiv) { /* Already exists in the table. Just add additional types to the list */ if (ti->clientdata) tc->clientdata = ti->clientdata; head = tc; next = tc->next; goto l1; } tc = tc->prev; } head = ti; next = 0; /* Place in list */ ti->prev = *tl; *tl = ti; /* Build linked lists */ l1: ret = head; tc = ti + 1; /* Patch up the rest of the links */ while (tc->name) { head->next = tc; tc->prev = head; head = tc; tc++; } if (next) next->prev = head; head->next = next; return ret; } /* Check the typename */ SWIGRUNTIME swig_type_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { swig_type_info *s; if (!ty) return 0; /* Void pointer */ s = ty->next; /* First element always just a name */ do { if (strcmp(s->name,c) == 0) { if (s == ty->next) return s; /* Move s to the top of the linked list */ s->prev->next = s->next; if (s->next) { s->next->prev = s->prev; } /* Insert s as second element in the list */ s->next = ty->next; if (ty->next) ty->next->prev = s; ty->next = s; s->prev = ty; return s; } s = s->next; } while (s && (s != ty->next)); return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_type_info *ty, void *ptr) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Search for a swig_type_info structure */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryTL(swig_type_info *tl, const char *name) { swig_type_info *ty = tl; while (ty) { if (ty->str && (SWIG_TypeEquiv(ty->str,name))) return ty; if (ty->name && (strcmp(name,ty->name) == 0)) return ty; ty = ty->prev; } return 0; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientDataTL(swig_type_info *tl, swig_type_info *ti, void *clientdata) { swig_type_info *tc, *equiv; if (ti->clientdata) return; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; equiv = ti->next; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0)) SWIG_TypeClientDataTL(tl,tc,clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static char hex[17] = "0123456789abcdef"; unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; register unsigned char uu; for (; u != eu; ++u) { uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { register unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register int d = *(c++); register unsigned char uu = 0; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* This function will propagate the clientdata field of type to any new swig_type_info structures that have been added into the list of equivalent types. It is like calling SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientDataTL(swig_type_info *tl, swig_type_info *type) { swig_type_info *equiv = type->next; swig_type_info *tc; if (!type->clientdata) return; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0) && !tc->clientdata) SWIG_TypeClientDataTL(tl,tc, type->clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /*********************************************************************** * common.swg * * This file contains generic SWIG runtime support for pointer * type checking as well as a few commonly used macros to control * external linkage. * * Author : David Beazley (beazley@cs.uchicago.edu) * * Copyright (c) 1999-2000, The University of Chicago * * This file may be freely redistributed without license or fee provided * this copyright message remains intact. ************************************************************************/ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if !defined(STATIC_LINKED) # define SWIGEXPORT(a) __declspec(dllexport) a # else # define SWIGEXPORT(a) a # endif #else # define SWIGEXPORT(a) a #endif #ifdef __cplusplus extern "C" { #endif /*************************************************************************/ /* The static type info list */ static swig_type_info *swig_type_list = 0; static swig_type_info **swig_type_list_handle = &swig_type_list; /* Register a type mapping with the type-checking */ static swig_type_info * SWIG_TypeRegister(swig_type_info *ti) { return SWIG_TypeRegisterTL(swig_type_list_handle, ti); } /* Search for a swig_type_info structure */ static swig_type_info * SWIG_TypeQuery(const char *name) { return SWIG_TypeQueryTL(*swig_type_list_handle, name); } /* Set the clientdata field for a type */ static void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientDataTL(*swig_type_list_handle, ti, clientdata); } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ static void SWIG_PropagateClientData(swig_type_info *type) { SWIG_PropagateClientDataTL(*swig_type_list_handle, type); } #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * SWIG API. Portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * for internal method declarations * ----------------------------------------------------------------------------- */ #ifndef SWIGINTERN #define SWIGINTERN static #endif #ifndef SWIGINTERNSHORT #ifdef __cplusplus #define SWIGINTERNSHORT static inline #else /* C case */ #define SWIGINTERNSHORT static #endif /* __cplusplus */ #endif /* Exception handling in wrappers */ #define SWIG_fail goto fail #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_append_errmsg(msg) SWIG_Python_AddErrMesg(msg,0) #define SWIG_preppend_errmsg(msg) SWIG_Python_AddErrMesg(msg,1) #define SWIG_type_error(type,obj) SWIG_Python_TypeError(type,obj) #define SWIG_null_ref(type) SWIG_Python_NullRef(type) /* Contract support */ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { PyErr_SetString(PyExc_RuntimeError, (char *) msg ); goto fail; } else /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_INT 1 #define SWIG_PY_FLOAT 2 #define SWIG_PY_STRING 3 #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Alloc. memory flags * ----------------------------------------------------------------------------- */ #define SWIG_OLDOBJ 1 #define SWIG_NEWOBJ SWIG_OLDOBJ + 1 #define SWIG_PYSTR SWIG_NEWOBJ + 1 #ifdef __cplusplus } #endif /*********************************************************************** * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * Author : David Beazley (beazley@cs.uchicago.edu) ************************************************************************/ /* Common SWIG API */ #define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Python_ConvertPtr(obj, pp, type, flags) #define SWIG_NewPointerObj(p, type, flags) SWIG_Python_NewPointerObj(p, type, flags) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) /* Python-specific SWIG API */ #define SWIG_ConvertPacked(obj, ptr, sz, ty, flags) SWIG_Python_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Use SWIG_NO_COBJECT_TYPES to force the use of strings to represent C/C++ pointers in the python side. Very useful for debugging, but not always safe. */ #if !defined(SWIG_NO_COBJECT_TYPES) && !defined(SWIG_COBJECT_TYPES) # define SWIG_COBJECT_TYPES #endif /* Flags for pointer conversion */ #define SWIG_POINTER_EXCEPTION 0x1 #define SWIG_POINTER_DISOWN 0x2 #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Create a new pointer string * ----------------------------------------------------------------------------- */ #ifndef SWIG_BUFFER_SIZE #define SWIG_BUFFER_SIZE 1024 #endif #if defined(SWIG_COBJECT_TYPES) #if !defined(SWIG_COBJECT_PYTHON) /* ----------------------------------------------------------------------------- * Implements a simple Swig Object type, and use it instead of PyCObject * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *ptr; const char *desc; } PySwigObject; /* Declarations for objects of type PySwigObject */ SWIGRUNTIME int PySwigObject_print(PySwigObject *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result))) { fputs("", fp); return 0; } else { return 1; } } SWIGRUNTIME PyObject * PySwigObject_repr(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromFormat("", result) : 0; } SWIGRUNTIME PyObject * PySwigObject_str(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromString(result) : 0; } SWIGRUNTIME PyObject * PySwigObject_long(PySwigObject *v) { return PyLong_FromUnsignedLong((unsigned long) v->ptr); } SWIGRUNTIME PyObject * PySwigObject_oct(PySwigObject *v) { char buf[100]; unsigned long x = (unsigned long)v->ptr; if (x == 0) strcpy(buf, "0"); else PyOS_snprintf(buf, sizeof(buf), "0%lo", x); return PyString_FromString(buf); } SWIGRUNTIME PyObject * PySwigObject_hex(PySwigObject *v) { char buf[100]; PyOS_snprintf(buf, sizeof(buf), "0x%lx", (unsigned long)v->ptr); return PyString_FromString(buf); } SWIGRUNTIME int PySwigObject_compare(PySwigObject *v, PySwigObject *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : (i > j) ? 1 : 0; } } SWIGRUNTIME void PySwigObject_dealloc(PySwigObject *self) { PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigObject_GetType() { static char PySwigObject_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods PySwigObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ (binaryfunc)0, /*nb_divide*/ (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ (coercion)0, /*nb_coerce*/ (unaryfunc)PySwigObject_long, /*nb_int*/ (unaryfunc)PySwigObject_long, /*nb_long*/ (unaryfunc)0, /*nb_float*/ (unaryfunc)PySwigObject_oct, /*nb_oct*/ (unaryfunc)PySwigObject_hex, /*nb_hex*/ #if PY_VERSION_HEX >= 0x02000000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #endif }; static int type_init = 0; static PyTypeObject PySwigObject_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigObject", /*tp_name*/ sizeof(PySwigObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigObject_dealloc, /*tp_dealloc*/ (printfunc)PySwigObject_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigObject_compare, /*tp_compare*/ (reprfunc)PySwigObject_repr, /*tp_repr*/ &PySwigObject_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigObject_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigObject_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigObject_Type = tmp; type_init = 1; } return &PySwigObject_Type; } SWIGRUNTIME PyObject * PySwigObject_FromVoidPtrAndDesc(void *ptr, const char *desc) { PySwigObject *self = PyObject_NEW(PySwigObject, PySwigObject_GetType()); if (self == NULL) return NULL; self->ptr = ptr; self->desc = desc; return (PyObject *)self; } SWIGRUNTIMEINLINE void * PySwigObject_AsVoidPtr(PyObject *self) { return ((PySwigObject *)self)->ptr; } SWIGRUNTIMEINLINE const char * PySwigObject_GetDesc(PyObject *self) { return ((PySwigObject *)self)->desc; } SWIGRUNTIMEINLINE int PySwigObject_Check(PyObject *op) { return ((op)->ob_type == PySwigObject_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; const char *desc; size_t size; } PySwigPacked; SWIGRUNTIME int PySwigPacked_print(PySwigPacked *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->desc,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * PySwigPacked_repr(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return PyString_FromFormat("", result, v->desc); } else { return PyString_FromFormat("", v->desc); } } SWIGRUNTIME PyObject * PySwigPacked_str(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return PyString_FromFormat("%s%s", result, v->desc); } else { return PyString_FromFormat("%s", v->desc); } } SWIGRUNTIME int PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : (i > j) ? 1 : 0; return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } } SWIGRUNTIME void PySwigPacked_dealloc(PySwigPacked *self) { free(self->pack); PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigPacked_GetType() { static char PySwigPacked_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static int type_init = 0; static PyTypeObject PySwigPacked_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigPacked", /*tp_name*/ sizeof(PySwigPacked), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigPacked_dealloc, /*tp_dealloc*/ (printfunc)PySwigPacked_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigPacked_compare, /*tp_compare*/ (reprfunc)PySwigPacked_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigPacked_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigPacked_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigPacked_Type = tmp; type_init = 1; } return &PySwigPacked_Type; } SWIGRUNTIME PyObject * PySwigPacked_FromDataAndDesc(void *ptr, size_t size, const char *desc) { PySwigPacked *self = PyObject_NEW(PySwigPacked, PySwigPacked_GetType()); if (self == NULL) { return NULL; } else { void *pack = malloc(size); memcpy(pack, ptr, size); self->pack = pack; self->desc = desc; self->size = size; return (PyObject *) self; } } SWIGRUNTIMEINLINE const char * PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { PySwigPacked *self = (PySwigPacked *)obj; if (self->size != size) return 0; memcpy(ptr, self->pack, size); return self->desc; } SWIGRUNTIMEINLINE const char * PySwigPacked_GetDesc(PyObject *self) { return ((PySwigPacked *)self)->desc; } SWIGRUNTIMEINLINE int PySwigPacked_Check(PyObject *op) { return ((op)->ob_type == PySwigPacked_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); } #else /* ----------------------------------------------------------------------------- * Use the old Python PyCObject instead of PySwigObject * ----------------------------------------------------------------------------- */ #define PySwigObject_GetDesc(obj) PyCObject_GetDesc(obj) #define PySwigObject_Check(obj) PyCObject_Check(obj) #define PySwigObject_AsVoidPtr(obj) PyCObject_AsVoidPtr(obj) #define PySwigObject_FromVoidPtrAndDesc(p, d) PyCObject_FromVoidPtrAndDesc(p, d, NULL) #endif #endif /* ----------------------------------------------------------------------------- * errors manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (PySwigObject_Check(obj)) { const char *otype = (const char *) PySwigObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'PySwigObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? PyString_AsString(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_DECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } SWIGRUNTIMEINLINE void SWIG_Python_NullRef(const char *type) { if (type) { PyErr_Format(PyExc_TypeError, "null reference of type '%s' was received",type); } else { PyErr_Format(PyExc_TypeError, "null reference was received"); } } SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, PyString_AsString(old_str)); } else { PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); } Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; sprintf(mesg, "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; static PyObject *SWIG_this = 0; int newref = 0; PyObject *pyobj = 0; void *vptr; if (!obj) return 0; if (obj == Py_None) { *ptr = 0; return 0; } #ifdef SWIG_COBJECT_TYPES if (!(PySwigObject_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PySwigObject_Check(obj)) { Py_DECREF(obj); goto type_error; } } vptr = PySwigObject_AsVoidPtr(obj); c = (const char *) PySwigObject_GetDesc(obj); if (newref) { Py_DECREF(obj); } goto type_check; #else if (!(PyString_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PyString_Check(obj)) { Py_DECREF(obj); goto type_error; } } c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackVoidPtr(c, &vptr, ty->name); if (newref) { Py_DECREF(obj); } if (!c) goto type_error; #endif type_check: if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; *ptr = SWIG_TypeCast(tc,vptr); } else { *ptr = vptr; } if ((pyobj) && (flags & SWIG_POINTER_DISOWN)) { PyObject_SetAttrString(pyobj,(char*)"thisown",Py_False); } return 0; type_error: PyErr_Clear(); if (pyobj && !obj) { obj = pyobj; if (PyCFunction_Check(obj)) { /* here we get the method pointer for callbacks */ char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); c = doc ? strstr(doc, "swig_ptr: ") : 0; if (c) { c = SWIG_UnpackVoidPtr(c + 10, &vptr, ty->name); if (!c) goto type_error; goto type_check; } } } if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ pointer", obj); } } return -1; } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } } return result; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) c = PySwigPacked_UnpackData(obj, ptr, sz); #else if ((!obj) || (!PyString_Check(obj))) goto type_error; c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackDataName(c, ptr, sz, ty->name); #endif if (!c) goto type_error; if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return 0; type_error: PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ packed data", obj); } } return -1; } /* Create a new array object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int own) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #ifdef SWIG_COBJECT_TYPES robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackVoidPtr(result, ptr, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif if (!robj || (robj == Py_None)) return robj; if (type->clientdata) { PyObject *inst; PyObject *args = Py_BuildValue((char*)"(O)", robj); Py_DECREF(robj); inst = PyObject_CallObject((PyObject *) type->clientdata, args); Py_DECREF(args); if (inst) { if (own) { PyObject_SetAttrString(inst,(char*)"thisown",Py_True); } robj = inst; } } return robj; } SWIGRUNTIME PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) robj = PySwigPacked_FromDataAndDesc((void *) ptr, sz, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackDataName(result, ptr, sz, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif return robj; } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_type_info ** SWIG_Python_GetTypeListHandle() { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } } #endif return (swig_type_info **) type_pointer; } /* Search for a swig_type_info structure */ SWIGRUNTIMEINLINE swig_type_info * SWIG_Python_GetTypeList() { swig_type_info **tlh = SWIG_Python_GetTypeListHandle(); return tlh ? *tlh : (swig_type_info*)0; } #define SWIG_Runtime_GetTypeList SWIG_Python_GetTypeList #ifdef __cplusplus } #endif /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_gl_qt_renderer swig_types[0] #define SWIGTYPE_p_char swig_types[1] #define SWIGTYPE_size_t swig_types[2] #define SWIGTYPE_ptrdiff_t swig_types[3] #define SWIGTYPE_p_Movie swig_types[4] static swig_type_info *swig_types[6]; /* -------- TYPES TABLE (END) -------- */ /*----------------------------------------------- @(target):= _gl_qt.so ------------------------------------------------*/ #define SWIG_init init_gl_qt #define SWIG_name "_gl_qt" #if defined(MS_WINDOWS) # include #endif #include "gl_qt.h" #include "movieconvert.h" PyObject *PyErr_GL_QTError; /* Errors generated by OpenGL/QuickTime code */ #include SWIGINTERN int SWIG_CheckLongInRange(long value, long min_value, long max_value, const char *errmsg) { if (value < min_value) { if (errmsg) { PyErr_Format(PyExc_OverflowError, "value %ld is less than '%s' minimum %ld", value, errmsg, min_value); } return 0; } else if (value > max_value) { if (errmsg) { PyErr_Format(PyExc_OverflowError, "value %ld is greater than '%s' maximum %ld", value, errmsg, max_value); } return 0; } return 1; } SWIGINTERN int SWIG_AsVal_long(PyObject * obj, long* val) { if (PyInt_Check(obj)) { if (val) *val = PyInt_AS_LONG(obj); return 1; } if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return 1; } else { if (!val) PyErr_Clear(); return 0; } } if (val) { SWIG_type_error("long", obj); } return 0; } SWIGINTERN int SWIG_AsVal_short(PyObject *obj, short *val) { const char* errmsg = val ? "short" : (char*)0; long v; if (SWIG_AsVal_long(obj, &v)) { if (SWIG_CheckLongInRange(v, SHRT_MIN, SHRT_MAX, errmsg)) { if (val) *val = (short)(v); return 1; } else { return 0; } } else { PyErr_Clear(); } if (val) { SWIG_type_error(errmsg, obj); } return 0; } SWIGINTERNSHORT short SWIG_As_short(PyObject* obj) { short v; if (!SWIG_AsVal_short(obj, &v)) { /* this is needed to make valgrind/purify happier. */ memset((void*)&v, 0, sizeof(short)); } return v; } #include SWIGINTERN int SWIG_CheckDoubleInRange(double value, double min_value, double max_value, const char* errmsg) { if (value < min_value) { if (errmsg) { PyErr_Format(PyExc_OverflowError, "value %g is less than %s minimum %g", value, errmsg, min_value); } return 0; } else if (value > max_value) { if (errmsg) { PyErr_Format(PyExc_OverflowError, "value %g is greater than %s maximum %g", value, errmsg, max_value); } return 0; } return 1; } SWIGINTERN int SWIG_AsVal_double(PyObject *obj, double *val) { if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AS_DOUBLE(obj); return 1; } if (PyInt_Check(obj)) { if (val) *val = PyInt_AS_LONG(obj); return 1; } if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return 1; } else { if (!val) PyErr_Clear(); return 0; } } if (val) { SWIG_type_error("double", obj); } return 0; } SWIGINTERN int SWIG_AsVal_float(PyObject *obj, float *val) { const char* errmsg = val ? "float" : (char*)0; double v; if (SWIG_AsVal_double(obj, &v)) { if (SWIG_CheckDoubleInRange(v, -FLT_MAX, FLT_MAX, errmsg)) { if (val) *val = (float)(v); return 1; } else { return 0; } } else { PyErr_Clear(); } if (val) { SWIG_type_error(errmsg, obj); } return 0; } SWIGINTERNSHORT float SWIG_As_float(PyObject* obj) { float v; if (!SWIG_AsVal_float(obj, &v)) { /* this is needed to make valgrind/purify happier. */ memset((void*)&v, 0, sizeof(float)); } return v; } SWIGINTERNSHORT int SWIG_Check_short(PyObject* obj) { return SWIG_AsVal_short(obj, (short*)0); } SWIGINTERNSHORT int SWIG_Check_float(PyObject* obj) { return SWIG_AsVal_float(obj, (float*)0); } #ifdef __cplusplus extern "C" { #endif static PyObject *_wrap_gl_qt_renderer_create(PyObject *self, PyObject *args) { PyObject *resultobj; Movie arg1 ; short arg2 ; float arg3 ; gl_qt_renderer *result; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; PyObject * obj2 = 0 ; if(!PyArg_ParseTuple(args,(char *)"OOO:gl_qt_renderer_create",&obj0,&obj1,&obj2)) goto fail; { MovieObj_Convert(obj0,&arg1); } { arg2 = (short)(SWIG_As_short(obj1)); if (SWIG_arg_fail(2)) SWIG_fail; } { arg3 = (float)(SWIG_As_float(obj2)); if (SWIG_arg_fail(3)) SWIG_fail; } { result = (gl_qt_renderer *)gl_qt_renderer_create(arg1,arg2,arg3); if (gl_qt_err_occurred()) { PyErr_SetString(PyErr_GL_QTError, gl_qt_err_message()); return NULL; } } resultobj = SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_gl_qt_renderer, 0); return resultobj; fail: return NULL; } static PyObject *_wrap_gl_qt_renderer_delete(PyObject *self, PyObject *args) { PyObject *resultobj; gl_qt_renderer *arg1 = (gl_qt_renderer *) 0 ; PyObject * obj0 = 0 ; if(!PyArg_ParseTuple(args,(char *)"O:gl_qt_renderer_delete",&obj0)) goto fail; SWIG_Python_ConvertPtr(obj0, (void **)&arg1, SWIGTYPE_p_gl_qt_renderer, SWIG_POINTER_EXCEPTION | 0); if (SWIG_arg_fail(1)) SWIG_fail; { gl_qt_renderer_delete(arg1); if (gl_qt_err_occurred()) { PyErr_SetString(PyErr_GL_QTError, gl_qt_err_message()); return NULL; } } Py_INCREF(Py_None); resultobj = Py_None; return resultobj; fail: return NULL; } static PyObject *_wrap_gl_qt_renderer_update(PyObject *self, PyObject *args) { PyObject *resultobj; gl_qt_renderer *arg1 = (gl_qt_renderer *) 0 ; PyObject * obj0 = 0 ; if(!PyArg_ParseTuple(args,(char *)"O:gl_qt_renderer_update",&obj0)) goto fail; SWIG_Python_ConvertPtr(obj0, (void **)&arg1, SWIGTYPE_p_gl_qt_renderer, SWIG_POINTER_EXCEPTION | 0); if (SWIG_arg_fail(1)) SWIG_fail; { gl_qt_renderer_update(arg1); if (gl_qt_err_occurred()) { PyErr_SetString(PyErr_GL_QTError, gl_qt_err_message()); return NULL; } } Py_INCREF(Py_None); resultobj = Py_None; return resultobj; fail: return NULL; } static PyMethodDef SwigMethods[] = { { (char *)"gl_qt_renderer_create", _wrap_gl_qt_renderer_create, METH_VARARGS, NULL}, { (char *)"gl_qt_renderer_delete", _wrap_gl_qt_renderer_delete, METH_VARARGS, NULL}, { (char *)"gl_qt_renderer_update", _wrap_gl_qt_renderer_update, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_gl_qt_renderer[] = {{"_p_gl_qt_renderer", 0, "gl_qt_renderer *", 0, 0, 0, 0},{"_p_gl_qt_renderer", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__p_char[] = {{"_p_char", 0, "char *", 0, 0, 0, 0},{"_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__size_t[] = {{"_size_t", 0, "size_t", 0, 0, 0, 0},{"_size_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__ptrdiff_t[] = {{"_ptrdiff_t", 0, "ptrdiff_t", 0, 0, 0, 0},{"_ptrdiff_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__p_Movie[] = {{"_p_Movie", 0, "Movie *", 0, 0, 0, 0},{"_p_Movie", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info *swig_types_initial[] = { _swigt__p_gl_qt_renderer, _swigt__p_char, _swigt__size_t, _swigt__ptrdiff_t, _swigt__p_Movie, 0 }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; static PyObject * swig_varlink_repr(swig_varlinkobject *v) { v = v; return PyString_FromString(""); } static int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) { swig_globalvar *var; flags = flags; fprintf(fp,"Swig global variables { "); for (var = v->vars; var; var=var->next) { fprintf(fp,"%s", var->name); if (var->next) fprintf(fp,", "); } fprintf(fp," }\n"); return 0; } static PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->get_attr)(); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return NULL; } static int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->set_attr)(p); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return 1; } static PyTypeObject varlinktype = { PyObject_HEAD_INIT(0) 0, /* Number of items in variable part (ob_size) */ (char *)"swigvarlink", /* Type name (tp_name) */ sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ 0, /* Itemsize (tp_itemsize) */ 0, /* Deallocator (tp_dealloc) */ (printfunc) swig_varlink_print, /* Print (tp_print) */ (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ 0, /* tp_doc */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; /* Create a variable linking object for use later */ static PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = 0; result = PyMem_NEW(swig_varlinkobject,1); varlinktype.ob_type = &PyType_Type; /* Patch varlinktype into a PyType */ result->ob_type = &varlinktype; result->vars = 0; result->ob_refcnt = 0; Py_XINCREF((PyObject *) result); return ((PyObject*) result); } static void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v; swig_globalvar *gv; v= (swig_varlinkobject *) p; gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); gv->name = (char *) malloc(strlen(name)+1); strcpy(gv->name,name); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; v->vars = gv; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ static void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_PY_INT: obj = PyInt_FromLong(constants[i].lvalue); break; case SWIG_PY_FLOAT: obj = PyFloat_FromDouble(constants[i].dvalue); break; case SWIG_PY_STRING: if (constants[i].pvalue) { obj = PyString_FromString((char *) constants[i].pvalue); } else { Py_INCREF(Py_None); obj = Py_None; } break; case SWIG_PY_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d,constants[i].name,obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ static void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { char *c = methods[i].ml_doc; if (c && (c = strstr(c, "swig_ptr: "))) { int j; swig_const_info *ci = 0; char *name = c + 10; for (j = 0; const_table[j].type; j++) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); char *buff = ndoc; void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue: (void *)(ci->lvalue); strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } /* -----------------------------------------------------------------------------* * Initialize type list * -----------------------------------------------------------------------------*/ #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ static int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return -1; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return -1; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return -1; } if (PyDict_SetItemString(dict, name, o)) return -1; Py_DECREF(o); return 0; } #endif static swig_type_info ** SWIG_Python_SetTypeListHandle(swig_type_info **type_list_handle) { static PyMethodDef swig_empty_runtime_method_table[] = { { NULL, NULL, 0, NULL } };/* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); PyObject *pointer = PyCObject_FromVoidPtr((void *) type_list_handle, NULL); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } return type_list_handle; } static swig_type_info ** SWIG_Python_LookupTypePointer(swig_type_info **type_list_handle) { swig_type_info **type_pointer; /* first check if module already created */ type_pointer = SWIG_Python_GetTypeListHandle(); if (type_pointer) { return type_pointer; } else { /* create a new module and variable */ return SWIG_Python_SetTypeListHandle(type_list_handle); } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void *) SWIG_ReturnGlobalTypeList(void *); #endif #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void) SWIG_init(void) { static PyObject *SWIG_globals = 0; static int typeinit = 0; PyObject *m, *d; int i; if (!SWIG_globals) SWIG_globals = SWIG_newvarlink(); /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_types_initial); m = Py_InitModule((char *) SWIG_name, SwigMethods); d = PyModule_GetDict(m); if (!typeinit) { #ifdef SWIG_LINK_RUNTIME swig_type_list_handle = (swig_type_info **) SWIG_ReturnGlobalTypeList(swig_type_list_handle); #else # ifndef SWIG_STATIC_RUNTIME swig_type_list_handle = SWIG_Python_LookupTypePointer(swig_type_list_handle); # endif #endif for (i = 0; swig_types_initial[i]; i++) { swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); } typeinit = 1; } SWIG_InstallConstants(d,swig_const_table); /* New exception for GL_QT code */ PyErr_GL_QTError = PyErr_NewException( "VisionEgg.QuickTime.GL_QTError", NULL, NULL ); // New reference Py_INCREF(PyErr_GL_QTError); } visionegg-1.2.1/VisionEgg/GLTrace.py0000755000076500000240000001111411224565527016430 0ustar astrawstaff# The Vision Egg: GLTrace # # Copyright (C) 2001-2004 Andrew Straw # Copyright (C) 2004,2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Trace calls to OpenGL With this module, you can trace all calls made to OpenGL through PyOpenGL. To do this, substitute import OpenGL.GL as gl with import VisionEgg.GLTrace as gl in your code. Also, trace another module's use of OpenGL by changing its reference to OpenGL.GL to a reference to VisionEgg.GLTrace. """ # Copyright (c) 2003 Andrew Straw. Distributed under the terms of the # GNU Lesser General Public License (LGPL). #################################################################### # # Import all the necessary packages # #################################################################### import OpenGL.GL as gl gl_constants = {} # functions which we don't want to translate arguments to gl constant raw_args_by_function = { 'glColor':[0,1,2,3], 'glColorf':[0,1,2,3], 'glDepthRange':[0,1], 'glGenTextures':[0], 'glGetTexLevelParameteriv':[1], 'glOrtho':[0,1,2,3,4,5], 'glPixelStorei':[1], 'glReadPixels':[0,1,2,3], 'glRotate':[0,1,2,3], 'glTexCoord2f':[0,1], 'glTexImage1D':[1,3,4], 'glTexImage2D':[1,3,4,5], 'glTexSubImage1D':[1,2,3], 'glTranslate':[0,1,2], 'glVertex2f':[0,1], 'glVertex3f':[0,1,2], 'glViewport':[0,1,2,3], } bitmasks_by_function = { 'glClear':[0], } bitmask_names_by_value = { gl.GL_COLOR_BUFFER_BIT : 'GL_COLOR_BUFFER_BIT', gl.GL_DEPTH_BUFFER_BIT : 'GL_DEPTH_BUFFER_BIT', } def arg_to_str( arg ): if isinstance(arg, int): if arg in gl_constants.keys(): return gl_constants[arg] elif type(arg) == str and len(arg) > 30: return "''" return repr(arg) class Wrapper: def __init__(self, function_name): self.function_name = function_name self.orig_func = getattr(gl,self.function_name) def run(self,*args,**kw): if kw: kw_str = " AND KEYWORDS" else: kw_str = "" if 1: ## if self.function_name in raw_args_by_function: arg_str = [] for i in range(len(args)): if self.function_name in raw_args_by_function and i in raw_args_by_function[self.function_name]: arg_str.append(str(args[i])) # don't convert to name of OpenGL constant elif self.function_name in bitmasks_by_function and i in bitmasks_by_function[self.function_name]: bitmask_strs = [] value = args[i] for bit_value in bitmask_names_by_value: if value & bit_value: value = value & ~bit_value bitmask_strs.append( bitmask_names_by_value[bit_value] ) if value != 0: bitmask_strs.append( arg_to_str(args[i]) ) arg_str.append( '|'.join(bitmask_strs) ) else: arg_str.append(arg_to_str(args[i])) # convert to name of OpenGL constant arg_str = ','.join( arg_str ) try: result = self.orig_func(*args,**kw) except: print "%s(%s)%s"%(self.function_name,arg_str,kw_str) raise if result is not None: result_str = "%s = "%(arg_to_str(result),) else: result_str = '' print "%s%s(%s)%s"%(result_str,self.function_name,arg_str,kw_str) return result def gl_trace_attach(): for attr_name in dir(gl): if callable( getattr(gl,attr_name) ): wrapper = Wrapper(attr_name) globals()[attr_name] = wrapper.run else: attr = getattr(gl,attr_name) globals()[attr_name] = attr if not attr_name.startswith('__') and not attr_name.startswith('__'): if type(getattr(gl,attr_name)) == int: gl_constants[getattr(gl,attr_name)] = attr_name if not hasattr(gl,'GL_CLAMP_TO_EDGE'): # XXX This hack requires opengl >= 1.2. See Core.py for more info. globals()['GL_CLAMP_TO_EDGE'] = 0x812F if hasattr(gl,'glActiveTexture'): # XXX Another, similar hack. globals()['glActiveTextureARB'] = gl.glActiveTexture globals()['glMultiTexCoord2fARB'] = gl.glMultiTexCoord2f globals()['GL_TEXTURE0_ARB'] = gl.GL_TEXTURE0 globals()['GL_TEXTURE1_ARB'] = gl.GL_TEXTURE1 gl_trace_attach() # attach when imported visionegg-1.2.1/VisionEgg/Gratings.py0000644000076500000240000010414111224565527016725 0ustar astrawstaff# The Vision Egg: Gratings # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2005,2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Grating stimuli. """ #################################################################### # # Import all the necessary packages # #################################################################### import logging # available in Python 2.3 import VisionEgg import VisionEgg.Core import VisionEgg.Textures import VisionEgg.ParameterTypes as ve_types import numpy import math, types, string import VisionEgg.GL as gl # get all OpenGL stuff in one namespace import _vegl def _get_type_info( bitdepth ): """Private helper function to calculate type info based on bit depth""" if bitdepth == 8: gl_type = gl.GL_UNSIGNED_BYTE numpy_dtype = numpy.uint8 max_int_val = float((2**8)-1) elif bitdepth == 12: gl_type = gl.GL_SHORT numpy_dtype = numpy.int16 max_int_val = float((2**15)-1) elif bitdepth == 16: gl_type = gl.GL_INT numpy_dtype = numpy.int32 max_int_val = float((2.**31.)-1) # do as float to avoid overflow else: raise ValueError("supported bitdepths are 8, 12, and 16.") return gl_type, numpy_dtype, max_int_val class LuminanceGratingCommon(VisionEgg.Core.Stimulus): """Base class with common code to all ways of drawing luminance gratings. Parameters ========== bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) Default: 8 """ parameters_and_defaults = VisionEgg.ParameterDefinition({ 'bit_depth':(8, ve_types.UnsignedInteger, 'precision with which grating is calculated and sent to OpenGL'), }) __slots__ = ( 'gl_internal_format', 'format', 'gl_type', 'numpy_dtype', 'max_int_val', 'cached_bit_depth', ) def calculate_bit_depth_dependencies(self): """Calculate a number of parameters dependent on bit depth.""" bit_depth_warning = False p = self.parameters # shorthand red_bits = gl.glGetIntegerv( gl.GL_RED_BITS ) green_bits = gl.glGetIntegerv( gl.GL_GREEN_BITS ) blue_bits = gl.glGetIntegerv( gl.GL_BLUE_BITS ) min_bits = min( (red_bits,green_bits,blue_bits) ) if min_bits < p.bit_depth: logger = logging.getLogger('VisionEgg.Gratings') logger.warning("Requested bit depth of %d in " "LuminanceGratingCommon, which is " "greater than your current OpenGL context " "supports (%d)."% (p.bit_depth,min_bits)) self.gl_internal_format = gl.GL_LUMINANCE self.format = gl.GL_LUMINANCE self.gl_type, self.numpy_dtype, self.max_int_val = _get_type_info( p.bit_depth ) self.cached_bit_depth = p.bit_depth class AlphaGratingCommon(VisionEgg.Core.Stimulus): """Base class with common code to all ways of drawing gratings in alpha. This class is currently not used by any other classes. Parameters ========== bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) Default: 8 """ parameters_and_defaults = VisionEgg.ParameterDefinition({ 'bit_depth':(8, ve_types.UnsignedInteger, 'precision with which grating is calculated and sent to OpenGL'), }) __slots__ = ( 'gl_internal_format', 'format', 'gl_type', 'numpy_dtype', 'max_int_val', 'cached_bit_depth', ) def calculate_bit_depth_dependencies(self): """Calculate a number of parameters dependent on bit depth.""" p = self.parameters # shorthand alpha_bit_depth = gl.glGetIntegerv( gl.GL_ALPHA_BITS ) if alpha_bit_depth < p.bit_depth: logger = logging.getLogger('VisionEgg.Gratings') logger.warning("Requested bit depth of %d, which is " "greater than your current OpenGL context " "supports (%d)."% (p.bit_depth,min_bits)) self.gl_internal_format = gl.GL_ALPHA self.format = gl.GL_ALPHA self.gl_type, self.numpy_dtype, self.max_int_val = _get_type_info( p.bit_depth ) self.cached_bit_depth = p.bit_depth class SinGrating2D(LuminanceGratingCommon): """Sine wave grating stimulus This is a general-purpose, realtime sine-wave luminace grating generator. To acheive an arbitrary orientation, this class rotates a textured quad. To draw a grating with sides that always remain horizontal and vertical, draw a large grating in a small viewport. (The viewport will clip anything beyond its edges.) Parameters ========== anchor -- specifies how position parameter is interpreted (String) Default: center bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) Inherited from LuminanceGratingCommon Default: 8 color1 -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) color2 -- optional color with which to perform interpolation with color1 in RGB space (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (determined at runtime) contrast -- (Real) Default: 1.0 depth -- (Real) Default: (determined at runtime) ignore_time -- (Boolean) Default: False mask -- optional masking function (Instance of ) Default: (determined at runtime) max_alpha -- (Real) Default: 1.0 num_samples -- (UnsignedInteger) Default: 512 on -- draw stimulus? (Boolean) Default: True orientation -- (Real) Default: 0.0 pedestal -- (Real) Default: 0.5 phase_at_t0 -- (Real) Default: 0.0 position -- (units: eye coordinates) (Sequence2 of Real) Default: (320.0, 240.0) recalculate_phase_tolerance -- (Real) Default: (determined at runtime) size -- defines coordinate size of grating (in eye coordinates) (Sequence2 of Real) Default: (640.0, 480.0) spatial_freq -- frequency defined relative to coordinates defined in size parameter (units: cycles/eye_coord_unit) (Real) Default: 0.0078125 t0_time_sec_absolute -- (Real) Default: (determined at runtime) temporal_freq_hz -- (Real) Default: 5.0 """ parameters_and_defaults = VisionEgg.ParameterDefinition({ 'on':(True, ve_types.Boolean, "draw stimulus?"), 'mask':(None, # allows window onto otherwise (tilted) rectangular grating ve_types.Instance(VisionEgg.Textures.Mask2D), "optional masking function"), 'contrast':(1.0, ve_types.Real), 'pedestal':(0.5, ve_types.Real), 'position':((320.0,240.0), # in eye coordinates ve_types.Sequence2(ve_types.Real), "(units: eye coordinates)"), 'anchor':('center', ve_types.String, "specifies how position parameter is interpreted"), 'depth':(None, # if not None, turns on depth testing and allows for occlusion ve_types.Real), 'size':((640.0,480.0), ve_types.Sequence2(ve_types.Real), "defines coordinate size of grating (in eye coordinates)", ), 'spatial_freq':(1.0/128.0, # cycles/eye coord units ve_types.Real, "frequency defined relative to coordinates defined in size parameter (units: cycles/eye_coord_unit)", ), 'temporal_freq_hz':(5.0, # hz ve_types.Real), 't0_time_sec_absolute':(None, # Will be assigned during first call to draw() ve_types.Real), 'ignore_time':(False, # ignore temporal frequency variable - allow control purely with phase_at_t0 ve_types.Boolean), 'phase_at_t0':(0.0, # degrees [0.0-360.0] ve_types.Real), 'orientation':(0.0, # 0=right, 90=up ve_types.Real), 'num_samples':(512, # number of spatial samples, should be a power of 2 ve_types.UnsignedInteger), 'max_alpha':(1.0, # controls "opacity": 1.0 = completely opaque, 0.0 = completely transparent ve_types.Real), 'color1':((1.0, 1.0, 1.0), # alpha is ignored (if given) -- use max_alpha parameter ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'color2':(None, # perform interpolation with color1 in RGB space. ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "optional color with which to perform interpolation with color1 in RGB space"), 'recalculate_phase_tolerance':(None, # only recalculate texture when phase is changed by more than this amount, None for always recalculate. (Saves time.) ve_types.Real), }) __slots__ = ( '_texture_object_id', '_last_phase', ) def __init__(self,**kw): LuminanceGratingCommon.__init__(self,**kw) p = self.parameters # shorthand self._texture_object_id = gl.glGenTextures(1) if p.mask: gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) gl.glBindTexture(gl.GL_TEXTURE_1D,self._texture_object_id) # Do error-checking on texture to make sure it will load max_dim = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE) if p.num_samples > max_dim: raise NumSamplesTooLargeError("Grating num_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) self.calculate_bit_depth_dependencies() w = p.size[0] inc = w/float(p.num_samples) phase = 0.0 # this data won't get used - don't care about phase self._last_phase = phase floating_point_sin = numpy.sin(2.0*math.pi*p.spatial_freq*numpy.arange(0.0,w,inc,dtype=numpy.float)+(phase/180.0*math.pi))*0.5*p.contrast+p.pedestal floating_point_sin = numpy.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() # Because the MAX_TEXTURE_SIZE method is insensitive to the current # state of the video system, another check must be done using # "proxy textures". gl.glTexImage1D(gl.GL_PROXY_TEXTURE_1D, # target 0, # level self.gl_internal_format, # video RAM internal format p.num_samples, # width 0, # border self.format, # format of texel data self.gl_type, # type of texel data texel_data) # texel data (irrelevant for proxy) if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_1D, # Need PyOpenGL >= 2.0 0, gl.GL_TEXTURE_WIDTH) == 0: raise NumSamplesTooLargeError("Grating num_samples is too wide for your video system!") # If we got here, it worked and we can load the texture for real. gl.glTexImage1D(gl.GL_TEXTURE_1D, # target 0, # level self.gl_internal_format, # video RAM internal format p.num_samples, # width 0, # border self.format, # format of texel data self.gl_type, # type of texel data texel_data) # texel data # Set texture object defaults gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_S,gl.GL_CLAMP_TO_EDGE) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_T,gl.GL_CLAMP_TO_EDGE) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MAG_FILTER,gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MIN_FILTER,gl.GL_LINEAR) if p.color2 is not None: if VisionEgg.Core.gl_renderer == 'ATi Rage 128 Pro OpenGL Engine' and VisionEgg.Core.gl_version == '1.1 ATI-1.2.22': logger = logging.getLogger('VisionEgg.Gratings') logger.warning("Your video card and driver have known " "bugs which prevent them from rendering " "color gratings properly.") def __del__(self): gl.glDeleteTextures( [self._texture_object_id] ) def draw(self): p = self.parameters # shorthand if p.on: # calculate center center = VisionEgg._get_center(p.position,p.anchor,p.size) if p.mask: gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) gl.glBindTexture(gl.GL_TEXTURE_1D,self._texture_object_id) gl.glEnable(gl.GL_TEXTURE_1D) gl.glDisable(gl.GL_TEXTURE_2D) if p.bit_depth != self.cached_bit_depth: self.calculate_bit_depth_dependencies() # Clear the modeview matrix gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() # Rotate about the center of the texture gl.glTranslate(center[0], center[1], 0) gl.glRotate(p.orientation,0,0,1) if p.depth is None: gl.glDisable(gl.GL_DEPTH_TEST) depth = 0.0 else: gl.glEnable(gl.GL_DEPTH_TEST) depth = p.depth # allow max_alpha value to control blending gl.glEnable( gl.GL_BLEND ) gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) if p.color2: gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_BLEND) gl.glTexEnvfv(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_COLOR, p.color2) ## alpha is ignored because the texture base internal format is luminance else: gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) if p.t0_time_sec_absolute is None and not p.ignore_time: p.t0_time_sec_absolute = VisionEgg.time_func() w = p.size[0] inc = w/float(p.num_samples) if p.ignore_time: phase = p.phase_at_t0 else: t_var = VisionEgg.time_func() - p.t0_time_sec_absolute phase = t_var*p.temporal_freq_hz*-360.0 + p.phase_at_t0 if p.recalculate_phase_tolerance is None or abs(self._last_phase - phase) > p.recalculate_phase_tolerance: self._last_phase = phase # we're re-drawing the phase at this angle floating_point_sin = numpy.sin(2.0*math.pi*p.spatial_freq*numpy.arange(0.0,w,inc,dtype=numpy.float)+(phase/180.0*math.pi))*0.5*p.contrast+p.pedestal floating_point_sin = numpy.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype) # PyOpenGL 2.0.1.09 has a bug, so use our own wrapper _vegl.veglTexSubImage1D(gl.GL_TEXTURE_1D, # target 0, # level 0, # x offset p.num_samples, # width self.format, # format of new texel data self.gl_type, # type of new texel data texel_data) # new texel data if 0: compare_array = numpy.empty(texel_data.shape,dtype=texel_data.dtype) pixels = _vegl.veglGetTexImage(gl.GL_TEXTURE_1D, # target 0, # level self.format, # format self.gl_type, # type compare_array) assert numpy.allclose( compare_array, texel_data ) h_w = p.size[0]/2.0 h_h = p.size[1]/2.0 l = -h_w r = h_w b = -h_h t = h_h # in the case of only color1, # the texel data multiplies color1 to produce a color # with color2, # the texel data linearly interpolates between color1 and color2 gl.glColor4f(p.color1[0],p.color1[1],p.color1[2],p.max_alpha) if p.mask: p.mask.draw_masked_quad(0.0,1.0,0.0,1.0, # l,r,b,t for texture coordinates l,r,b,t, # l,r,b,t in eye coordinates depth ) # also in eye coordinates else: # draw unmasked quad gl.glBegin(gl.GL_QUADS) gl.glTexCoord2f(0.0,0.0) gl.glVertex3f(l,b,depth) gl.glTexCoord2f(1.0,0.0) gl.glVertex3f(r,b,depth) gl.glTexCoord2f(1.0,1.0) gl.glVertex3f(r,t,depth) gl.glTexCoord2f(0.0,1.0) gl.glVertex3f(l,t,depth) gl.glEnd() # GL_QUADS gl.glDisable(gl.GL_TEXTURE_1D) gl.glPopMatrix() class SinGrating3D(LuminanceGratingCommon): """Sine wave grating stimulus texture mapped onto quad in 3D This is a general-purpose, realtime sine-wave luminace grating generator. This 3D version doesn't support an orientation parameter. This could be implemented, but for now should be done by orienting the quad in 3D. Parameters ========== bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) Inherited from LuminanceGratingCommon Default: 8 color1 -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) color2 -- optional color with which to perform interpolation with color1 in RGB space (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (determined at runtime) contrast -- (Real) Default: 1.0 depth -- (Real) Default: (determined at runtime) depth_test -- perform depth test? (Boolean) Default: True ignore_time -- (Boolean) Default: False lowerleft -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (0.0, 0.0, -1.0) lowerright -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 0.0, -1.0) mask -- optional masking function (Instance of ) Default: (determined at runtime) max_alpha -- (Real) Default: 1.0 num_samples -- (UnsignedInteger) Default: 512 on -- draw stimulus? (Boolean) Default: True pedestal -- (Real) Default: 0.5 phase_at_t0 -- (Real) Default: 0.0 recalculate_phase_tolerance -- (Real) Default: (determined at runtime) size -- defines coordinate size of grating (in eye coordinates) (Sequence2 of Real) Default: (1.0, 1.0) spatial_freq -- frequency defined relative to coordinates defined in size parameter (units; cycles/eye_coord_unit) (Real) Default: 4.0 t0_time_sec_absolute -- (Real) Default: (determined at runtime) temporal_freq_hz -- (Real) Default: 5.0 upperleft -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (0.0, 1.0, -1.0) upperright -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, -1.0) """ parameters_and_defaults = VisionEgg.ParameterDefinition({ 'on':(True, ve_types.Boolean, "draw stimulus?"), 'mask':(None, # allows window onto otherwise (tilted) rectangular grating ve_types.Instance(VisionEgg.Textures.Mask2D), "optional masking function"), 'contrast':(1.0, ve_types.Real), 'pedestal':(0.5, ve_types.Real), 'depth':(None, # if not None, turns on depth testing and allows for occlusion ve_types.Real), 'size':((1.0,1.0), # in eye coordinates ve_types.Sequence2(ve_types.Real), "defines coordinate size of grating (in eye coordinates)"), 'spatial_freq':(4.0, # cycles/eye coord units ve_types.Real, "frequency defined relative to coordinates defined in size parameter (units; cycles/eye_coord_unit)"), 'temporal_freq_hz':(5.0, # hz ve_types.Real), 't0_time_sec_absolute':(None, # Will be assigned during first call to draw() ve_types.Real), 'ignore_time':(False, # ignore temporal frequency variable - allow control purely with phase_at_t0 ve_types.Boolean), 'phase_at_t0':(0.0, # degrees [0.0-360.0] ve_types.Real), 'num_samples':(512, # number of spatial samples, should be a power of 2 ve_types.UnsignedInteger), 'max_alpha':(1.0, # controls "opacity": 1.0 = completely opaque, 0.0 = completely transparent ve_types.Real), 'color1':((1.0, 1.0, 1.0), # alpha is ignored (if given) -- use max_alpha parameter ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'color2':(None, # perform interpolation with color1 in RGB space. ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "optional color with which to perform interpolation with color1 in RGB space"), 'recalculate_phase_tolerance':(None, # only recalculate texture when phase is changed by more than this amount, None for always recalculate. (Saves time.) ve_types.Real), 'depth_test':(True, ve_types.Boolean, "perform depth test?"), 'lowerleft':((0.0,0.0,-1.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates)"), 'lowerright':((1.0,0.0,-1.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates)"), 'upperleft':((0.0,1.0,-1.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates)"), 'upperright':((1.0,1.0,-1.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates)"), 'polygon_offset_enabled':(False, ve_types.Boolean, "perform polygon offset?"), 'polygon_offset_factor':(1.0, ve_types.Real, "polygon factor"), 'polygon_offset_units':(1.0, ve_types.Real, "polygon units"), }) __slots__ = ( '_texture_object_id', '_last_phase', ) def __init__(self,**kw): LuminanceGratingCommon.__init__(self,**kw) p = self.parameters # shorthand self._texture_object_id = gl.glGenTextures(1) if p.mask: gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) gl.glBindTexture(gl.GL_TEXTURE_1D,self._texture_object_id) # Do error-checking on texture to make sure it will load max_dim = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE) if p.num_samples > max_dim: raise NumSamplesTooLargeError("Grating num_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) self.calculate_bit_depth_dependencies() w = p.size[0] inc = w/float(p.num_samples) phase = 0.0 # this data won't get used - don't care about phase self._last_phase = phase floating_point_sin = numpy.sin(2.0*math.pi*p.spatial_freq*numpy.arange(0.0,w,inc,dtype=numpy.float)+(phase/180.0*math.pi))*0.5*p.contrast+p.pedestal floating_point_sin = numpy.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() # Because the MAX_TEXTURE_SIZE method is insensitive to the current # state of the video system, another check must be done using # "proxy textures". gl.glTexImage1D(gl.GL_PROXY_TEXTURE_1D, # target 0, # level self.gl_internal_format, # video RAM internal format p.num_samples, # width 0, # border self.format, # format of texel data self.gl_type, # type of texel data texel_data) # texel data (irrelevant for proxy) if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_1D, # Need PyOpenGL >= 2.0 0, gl.GL_TEXTURE_WIDTH) == 0: raise NumSamplesTooLargeError("Grating num_samples is too wide for your video system!") # If we got here, it worked and we can load the texture for real. gl.glTexImage1D(gl.GL_TEXTURE_1D, # target 0, # level self.gl_internal_format, # video RAM internal format p.num_samples, # width 0, # border self.format, # format of texel data self.gl_type, # type of texel data texel_data) # texel data # Set texture object defaults gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_S,gl.GL_CLAMP_TO_EDGE) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_T,gl.GL_CLAMP_TO_EDGE) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MAG_FILTER,gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MIN_FILTER,gl.GL_LINEAR) if p.color2 is not None: if VisionEgg.Core.gl_renderer == 'ATi Rage 128 Pro OpenGL Engine' and VisionEgg.Core.gl_version == '1.1 ATI-1.2.22': logger = logging.getLogger('VisionEgg.Gratings') logger.warning("Your video card and driver have known " "bugs which prevent them from rendering " "color gratings properly.") def __del__(self): gl.glDeleteTextures( [self._texture_object_id] ) def draw(self): p = self.parameters # shorthand if p.on: if p.mask: gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) if p.depth_test: gl.glEnable(gl.GL_DEPTH_TEST) else: gl.glDisable(gl.GL_DEPTH_TEST) if p.polygon_offset_enabled: gl.glEnable(gl.GL_POLYGON_OFFSET_EXT) gl.glPolygonOffset(p.polygon_offset_factor, p.polygon_offset_units) gl.glBindTexture(gl.GL_TEXTURE_1D,self._texture_object_id) gl.glEnable(gl.GL_TEXTURE_1D) gl.glDisable(gl.GL_TEXTURE_2D) if p.bit_depth != self.cached_bit_depth: self.calculate_bit_depth_dependencies() # allow max_alpha value to control blending gl.glEnable( gl.GL_BLEND ) gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) if p.color2: gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_BLEND) gl.glTexEnvfv(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_COLOR, p.color2) ## alpha is ignored because the texture base internal format is luminance else: gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) if p.t0_time_sec_absolute is None and not p.ignore_time: p.t0_time_sec_absolute = VisionEgg.time_func() w = p.size[0] inc = w/float(p.num_samples) if p.ignore_time: phase = p.phase_at_t0 else: t_var = VisionEgg.time_func() - p.t0_time_sec_absolute phase = t_var*p.temporal_freq_hz*-360.0 + p.phase_at_t0 if p.recalculate_phase_tolerance is None or abs(self._last_phase - phase) > p.recalculate_phase_tolerance: self._last_phase = phase # we're re-drawing the phase at this angle floating_point_sin = numpy.sin(2.0*math.pi*p.spatial_freq*numpy.arange(0.0,w,inc,dtype=numpy.float)+(phase/180.0*math.pi))*0.5*p.contrast+p.pedestal floating_point_sin = numpy.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() gl.glTexSubImage1D(gl.GL_TEXTURE_1D, # target 0, # level 0, # x offset p.num_samples, # width self.format, # format of new texel data self.gl_type, # type of new texel data texel_data) # new texel data # in the case of only color1, # the texel data multiplies color1 to produce a color # with color2, # the texel data linearly interpolates between color1 and color2 gl.glColor4f(p.color1[0],p.color1[1],p.color1[2],p.max_alpha) if p.mask: p.mask.draw_masked_quad_3d(0.0,1.0,0.0,1.0, # for texture coordinates p.lowerleft,p.lowerright,p.upperright,p.upperleft) else: # draw unmasked quad gl.glBegin(gl.GL_QUADS) gl.glTexCoord2f(0.0,0.0) gl.glVertex(*p.lowerleft) gl.glTexCoord2f(1.0,0.0) gl.glVertex(*p.lowerright) gl.glTexCoord2f(1.0,1.0) gl.glVertex(*p.upperright) gl.glTexCoord2f(0.0,1.0) gl.glVertex(*p.upperleft) gl.glEnd() # GL_QUADS gl.glDisable(gl.GL_TEXTURE_1D) if p.polygon_offset_enabled: gl.glDisable(gl.GL_POLYGON_OFFSET_EXT) class NumSamplesTooLargeError( RuntimeError ): pass visionegg-1.2.1/VisionEgg/GUI.py0000644000076500000240000010242211224565527015573 0ustar astrawstaff# The Vision Egg: GUI # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Graphical user interface classes and functions. """ import VisionEgg #################################################################### # # Import all the necessary packages # #################################################################### import logging # available in Python 2.3 import VisionEgg import os import sys class _delay_import_error: """Defer import errors until they cause problems.""" def __init__(self,orig_traceback): self.orig_traceback = orig_traceback def __getattr__(self,name): raise self.orig_traceback # ImportError deferred from earlier failure try: import Tkinter except ImportError, x: # don't fail on this until it becomes a problem... Tkinter = _delay_import_error(x) try: import tkMessageBox except ImportError, x: # don't fail on this until it becomes a problem... tkMessageBox = _delay_import_error(x) try: import tkFileDialog except ImportError, x: # don't fail on this until it becomes a problem... tkFileDialog = _delay_import_error(x) def showexception(exc_type, exc_value, traceback_str): # private subclass of Tkinter.Frame class ShowExceptionFrame(Tkinter.Frame): """A window that shows a string and has a quit button.""" def __init__(self,master,exc_type, exc_value, traceback_str): VisionEgg.config._Tkinter_used = True Tkinter.Frame.__init__(self,master,borderwidth=20) title="Vision Egg: exception caught" first_str = "An unhandled exception was caught." type_value_str = "%s: %s"%(str(exc_type),str(exc_value)) frame = self top = frame.winfo_toplevel() top.title(title) top.protocol("WM_DELETE_WINDOW",self.close_window) Tkinter.Label(frame,text=first_str).pack() Tkinter.Label(frame,text=type_value_str).pack() if traceback_str: Tkinter.Label(frame,text="Traceback (most recent call last):").pack() Tkinter.Label(frame,text=traceback_str).pack() b = Tkinter.Button(frame,text="OK",command=self.close_window) b.pack() b.focus_set() b.grab_set() b.bind('',self.close_window) def close_window(self,dummy_arg=None): self.quit() # create instance of class parent = Tkinter._default_root if parent: top = Tkinter.Toplevel(parent) top.transient(parent) else: top = None f = ShowExceptionFrame(top, exc_type, exc_value, traceback_str) f.pack() f.mainloop() f.winfo_toplevel().destroy() class AppWindow(Tkinter.Frame): """A GUI Window that can be subclassed for a main application window""" def __init__(self,master=None,idle_func=lambda: None,**cnf): VisionEgg.config._Tkinter_used = True Tkinter.Frame.__init__(self,master,**cnf) self.winfo_toplevel().title('Vision Egg') self.info_frame = InfoFrame(self) self.info_frame.pack() self.idle_func = idle_func self.after(1,self.idle) # register idle function with Tkinter def idle(self): self.idle_func() self.after(1,self.idle) # (re)register idle function with Tkinter class ProgressBar(Tkinter.Frame): def __init__(self, master=None, orientation="horizontal", min=0, max=100, width=100, height=18, doLabel=1, fillColor="LightSteelBlue1", background="gray", labelColor="black", labelFont="Helvetica", labelText="", labelFormat="%d%%", value=50, **cnf): Tkinter.Frame.__init__(self,master) # preserve various values self.master=master self.orientation=orientation self.min=min self.max=max self.width=width self.height=height self.doLabel=doLabel self.fillColor=fillColor self.labelFont= labelFont self.labelColor=labelColor self.background=background self.labelText=labelText self.labelFormat=labelFormat self.value=value self.canvas=Tkinter.Canvas(self, height=height, width=width, bd=0, highlightthickness=0, background=background) self.scale=self.canvas.create_rectangle(0, 0, width, height, fill=fillColor) self.label=self.canvas.create_text(self.canvas.winfo_reqwidth() / 2, height / 2, text=labelText, anchor="c", fill=labelColor, font=self.labelFont) self.update() self.canvas.pack(side='top', fill='x', expand='no') def updateProgress(self, newValue, newMax=None): if newMax: self.max = newMax self.value = newValue self.update() def update(self): # Trim the values to be between min and max value=self.value if value > self.max: value = self.max if value < self.min: value = self.min # Adjust the rectangle if self.orientation == "horizontal": self.canvas.coords(self.scale, 0, 0, float(value) / self.max * self.width, self.height) else: self.canvas.coords(self.scale, 0, self.height - (float(value) / self.max*self.height), self.width, self.height) # Now update the colors self.canvas.itemconfig(self.scale, fill=self.fillColor) self.canvas.itemconfig(self.label, fill=self.labelColor) # And update the label if self.doLabel: if value: if value >= 0: pvalue = int((float(value) / float(self.max)) * 100.0) else: pvalue = 0 self.canvas.itemconfig(self.label, text=self.labelFormat % pvalue) else: self.canvas.itemconfig(self.label, text='') else: self.canvas.itemconfig(self.label, text=self.labelFormat % self.labelText) self.canvas.update_idletasks() class GraphicsConfigurationWindow(Tkinter.Frame): """Graphics Configuration Window""" def __init__(self,master=None,**cnf): VisionEgg.config._Tkinter_used = True Tkinter.Frame.__init__(self,master,**cnf) self.winfo_toplevel().title('Vision Egg - Graphics configuration') self.pack() self.clicked_ok = 0 # So we can distinguish between clicking OK and closing the window row = 0 Tkinter.Label(self, text="Vision Egg - Graphics configuration", font=("Helvetica",14,"bold")).grid(row=row,columnspan=2) row += 1 ################## begin topframe ############################## topframe = Tkinter.Frame(self) topframe.grid(row=row,column=0,columnspan=2) topframe_row = 0 Tkinter.Label(topframe, text=self.format_string("The default value for these variables and the presence of this dialog window can be controlled via the Vision Egg config file. If this file exists in the Vision Egg user directory, that file is used. Otherwise, the configuration file found in the Vision Egg system directory is used."), ).grid(row=topframe_row,column=1,columnspan=2,sticky=Tkinter.W) topframe_row += 1 try: import _imaging, _imagingtk import ImageFile, ImageFileIO, BmpImagePlugin, JpegImagePlugin import Image,ImageTk im = Image.open(os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,'data','visionegg.bmp')) self.tk_im=ImageTk.PhotoImage(im) Tkinter.Label(topframe,image=self.tk_im).grid(row=0,rowspan=topframe_row,column=0) except Exception,x: logger = logging.getLogger('VisionEgg.GUI') logger.info("No Vision Egg logo :( because of error while " "trying to display image in " "GUI.GraphicsConfigurationWindow: %s: " "%s"%(str(x.__class__),str(x))) ################## end topframe ############################## row += 1 ################## begin file_frame ############################## file_frame = Tkinter.Frame(self) file_frame.grid(row=row,columnspan=2,sticky=Tkinter.W+Tkinter.E,pady=5) # Script name and location file_row = 0 Tkinter.Label(file_frame, text="This script:").grid(row=file_row,column=0,sticky=Tkinter.E) Tkinter.Label(file_frame, text="%s"%(os.path.abspath(sys.argv[0]),)).grid(row=file_row,column=1,sticky=Tkinter.W) file_row += 1 # Vision Egg system dir Tkinter.Label(file_frame, text="Vision Egg system directory:").grid(row=file_row,column=0,sticky=Tkinter.E) Tkinter.Label(file_frame, text="%s"%(os.path.abspath(VisionEgg.config.VISIONEGG_SYSTEM_DIR),)).grid(row=file_row,column=1,sticky=Tkinter.W) file_row += 1 # Vision Egg user dir Tkinter.Label(file_frame, text="Vision Egg user directory:").grid(row=file_row,column=0,sticky=Tkinter.E) Tkinter.Label(file_frame, text="%s"%(os.path.abspath(VisionEgg.config.VISIONEGG_USER_DIR),)).grid(row=file_row,column=1,sticky=Tkinter.W) file_row += 1 # Config file Tkinter.Label(file_frame, text="Config file location:").grid(row=file_row,column=0,sticky=Tkinter.E) if VisionEgg.config.VISIONEGG_CONFIG_FILE: Tkinter.Label(file_frame, text="%s"%(os.path.abspath(VisionEgg.config.VISIONEGG_CONFIG_FILE),)).grid(row=file_row,column=1,sticky=Tkinter.W) else: Tkinter.Label(file_frame, text="(None)").grid(row=file_row,column=1,sticky=Tkinter.W) file_row += 1 # Log file location Tkinter.Label(file_frame, text="Log file location:").grid(row=file_row,column=0,sticky=Tkinter.E) if VisionEgg.config.VISIONEGG_LOG_FILE: Tkinter.Label(file_frame, text="%s"%(os.path.abspath(VisionEgg.config.VISIONEGG_LOG_FILE),)).grid(row=file_row,column=1,sticky=Tkinter.W) else: Tkinter.Label(file_frame, text="(stderr console)").grid(row=file_row,column=1,sticky=Tkinter.W) ################## end file_frame ############################## row += 1 ################## begin cf ############################## cf = Tkinter.Frame(self) cf.grid(row=row,column=0,padx=10) cf_row = 0 # Fullscreen self.fullscreen = Tkinter.BooleanVar() self.fullscreen.set(VisionEgg.config.VISIONEGG_FULLSCREEN) Tkinter.Checkbutton(cf, text='Fullscreen', variable=self.fullscreen, relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) cf_row += 1 self.synclync_present = Tkinter.BooleanVar() self.synclync_present.set(VisionEgg.config.SYNCLYNC_PRESENT) try: import synclync self.show_synclync_option = 1 except: self.show_synclync_option = 0 if self.show_synclync_option: Tkinter.Checkbutton(cf, text='SyncLync device present', variable=self.synclync_present, relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) cf_row += 1 # Maximum priority self.maxpriority = Tkinter.BooleanVar() self.maxpriority.set(VisionEgg.config.VISIONEGG_MAXPRIORITY) Tkinter.Checkbutton(cf, text='Maximum priority (use with caution)', variable=self.maxpriority, relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) cf_row += 1 if sys.platform=='darwin': # Only used on darwin platform self.darwin_conventional = Tkinter.IntVar() self.darwin_conventional.set(VisionEgg.config.VISIONEGG_DARWIN_MAXPRIORITY_CONVENTIONAL_NOT_REALTIME) self.darwin_priority = Tkinter.StringVar() self.darwin_priority.set(str(VisionEgg.config.VISIONEGG_DARWIN_CONVENTIONAL_PRIORITY)) self.darwin_realtime_period_denom = Tkinter.StringVar() self.darwin_realtime_period_denom.set(str(VisionEgg.config.VISIONEGG_DARWIN_REALTIME_PERIOD_DENOM)) self.darwin_realtime_computation_denom = Tkinter.StringVar() self.darwin_realtime_computation_denom.set(str(VisionEgg.config.VISIONEGG_DARWIN_REALTIME_COMPUTATION_DENOM)) self.darwin_realtime_constraint_denom = Tkinter.StringVar() self.darwin_realtime_constraint_denom.set(str(VisionEgg.config.VISIONEGG_DARWIN_REALTIME_CONSTRAINT_DENOM)) self.darwin_realtime_preemptible = Tkinter.BooleanVar() self.darwin_realtime_preemptible.set(not VisionEgg.config.VISIONEGG_DARWIN_REALTIME_PREEMPTIBLE) Tkinter.Button(cf,text="Maximum priority options...", command=self.darwin_maxpriority_tune).grid(row=cf_row,column=0) cf_row += 1 # Sync swap self.sync_swap = Tkinter.BooleanVar() self.sync_swap.set(VisionEgg.config.VISIONEGG_SYNC_SWAP) Tkinter.Checkbutton(cf, text='Attempt vsync', variable=self.sync_swap, relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) cf_row += 1 # Frameless window self.frameless = Tkinter.BooleanVar() self.frameless.set(VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW) Tkinter.Checkbutton(cf, text='No frame around window', variable=self.frameless, relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) cf_row += 1 # Hide mouse self.mouse_visible = Tkinter.BooleanVar() self.mouse_visible.set(not VisionEgg.config.VISIONEGG_HIDE_MOUSE) Tkinter.Checkbutton(cf, text='Mouse cursor visible', variable=self.mouse_visible, relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) cf_row += 1 # Stereo self.stereo = Tkinter.BooleanVar() self.stereo.set(VisionEgg.config.VISIONEGG_REQUEST_STEREO) Tkinter.Checkbutton(cf, text='Stereo', variable=self.stereo, relief=Tkinter.FLAT).grid(row=cf_row,column=0,sticky=Tkinter.W) cf_row += 1 if sys.platform == 'darwin': if sys.version == '2.2 (#11, Jan 6 2002, 01:00:42) \n[GCC 2.95.2 19991024 (release)]': if Tkinter.TkVersion == 8.4: # The Tk in Bob Ippolito's kitchensink distro had # a bug in Checkbutton Tkinter.Label(cf,text="If you want to check any buttons\n(Mac OS X Tk 8.4a4 bug workaround):").grid(row=cf_row,column=0) cf_row += 1 Tkinter.Button(cf,text="PRESS ME FIRST").grid(row=cf_row,column=0) cf_row += 1 ################## end cf ############################## ################## begin entry_frame ################### entry_frame = Tkinter.Frame(self) entry_frame.grid(row=row,column=1,padx=10,sticky="n") row += 1 ef_row = 0 # frame rate Tkinter.Label(entry_frame,text="What will your monitor refresh's rate be (Hz):").grid(row=ef_row,column=0,sticky=Tkinter.E) self.frame_rate = Tkinter.StringVar() self.frame_rate.set("%s"%str(VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ)) Tkinter.Entry(entry_frame,textvariable=self.frame_rate).grid(row=ef_row,column=1,sticky=Tkinter.W) ef_row += 1 # width Tkinter.Label(entry_frame,text="Window width (pixels):").grid(row=ef_row,column=0,sticky=Tkinter.E) self.width = Tkinter.StringVar() self.width.set("%s"%str(VisionEgg.config.VISIONEGG_SCREEN_W)) Tkinter.Entry(entry_frame,textvariable=self.width).grid(row=ef_row,column=1,sticky=Tkinter.W) ef_row += 1 # height Tkinter.Label(entry_frame,text="Window height (pixels):").grid(row=ef_row,column=0,sticky=Tkinter.E) self.height = Tkinter.StringVar() self.height.set("%s"%str(VisionEgg.config.VISIONEGG_SCREEN_H)) Tkinter.Entry(entry_frame,textvariable=self.height).grid(row=ef_row,column=1,sticky=Tkinter.W) ef_row += 1 # color depth Tkinter.Label(entry_frame,text="Requested total color depth (bits per pixel):").grid(row=ef_row,column=0,sticky=Tkinter.E) self.color_depth = Tkinter.StringVar() self.color_depth.set(str(VisionEgg.config.VISIONEGG_PREFERRED_BPP)) Tkinter.Entry(entry_frame,textvariable=self.color_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) ef_row += 1 # red depth Tkinter.Label(entry_frame,text="Requested red bits per pixel:").grid(row=ef_row,column=0,sticky=Tkinter.E) self.red_depth = Tkinter.StringVar() self.red_depth.set(str(VisionEgg.config.VISIONEGG_REQUEST_RED_BITS)) Tkinter.Entry(entry_frame,textvariable=self.red_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) ef_row += 1 # green depth Tkinter.Label(entry_frame,text="Requested green bits per pixel:").grid(row=ef_row,column=0,sticky=Tkinter.E) self.green_depth = Tkinter.StringVar() self.green_depth.set(str(VisionEgg.config.VISIONEGG_REQUEST_GREEN_BITS)) Tkinter.Entry(entry_frame,textvariable=self.green_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) ef_row += 1 # blue depth Tkinter.Label(entry_frame,text="Requested blue bits per pixel:").grid(row=ef_row,column=0,sticky=Tkinter.E) self.blue_depth = Tkinter.StringVar() self.blue_depth.set(str(VisionEgg.config.VISIONEGG_REQUEST_BLUE_BITS)) Tkinter.Entry(entry_frame,textvariable=self.blue_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) ef_row += 1 # alpha depth Tkinter.Label(entry_frame,text="Requested alpha bits per pixel:").grid(row=ef_row,column=0,sticky=Tkinter.E) self.alpha_depth = Tkinter.StringVar() self.alpha_depth.set(str(VisionEgg.config.VISIONEGG_REQUEST_ALPHA_BITS)) Tkinter.Entry(entry_frame,textvariable=self.alpha_depth).grid(row=ef_row,column=1,sticky=Tkinter.W) ef_row += 1 ################## end entry_frame ################### ################## gamma_frame ################### # gamma stuff row += 1 gamma_frame = Tkinter.Frame(self) gamma_frame.grid(row=row,columnspan=2,sticky="we") self.gamma_source = Tkinter.StringVar() self.gamma_source.set(str(VisionEgg.config.VISIONEGG_GAMMA_SOURCE).lower()) # can be 'none', 'invert', or 'file' Tkinter.Label(gamma_frame, text="Gamma:").grid(row=0,column=0) Tkinter.Radiobutton(gamma_frame, text="Native", value="none", variable = self.gamma_source).grid(row=0,column=1,padx=1) Tkinter.Radiobutton(gamma_frame, text="Quick", value="invert", variable = self.gamma_source).grid(row=0,column=2) Tkinter.Label(gamma_frame, text="R:").grid(row=0,column=3) self.gamma_invert_red = Tkinter.DoubleVar() self.gamma_invert_red.set( VisionEgg.config.VISIONEGG_GAMMA_INVERT_RED ) Tkinter.Entry(gamma_frame, textvariable=self.gamma_invert_red, width=3).grid(row=0,column=4) Tkinter.Label(gamma_frame, text="G:").grid(row=0,column=5) self.gamma_invert_green = Tkinter.DoubleVar() self.gamma_invert_green.set( VisionEgg.config.VISIONEGG_GAMMA_INVERT_GREEN ) Tkinter.Entry(gamma_frame, textvariable=self.gamma_invert_green, width=3).grid(row=0,column=6) Tkinter.Label(gamma_frame, text="B:").grid(row=0,column=7) self.gamma_invert_blue = Tkinter.DoubleVar() self.gamma_invert_blue.set( VisionEgg.config.VISIONEGG_GAMMA_INVERT_BLUE ) Tkinter.Entry(gamma_frame, textvariable=self.gamma_invert_blue, width=3).grid(row=0,column=8) Tkinter.Radiobutton(gamma_frame, text="Custom:", value="file", variable = self.gamma_source).grid(row=0,column=9) self.gamma_file = Tkinter.StringVar() if os.path.isfile(VisionEgg.config.VISIONEGG_GAMMA_FILE): self.gamma_file.set( VisionEgg.config.VISIONEGG_GAMMA_FILE ) else: self.gamma_file.set("") Tkinter.Entry(gamma_frame, textvariable=self.gamma_file, width=15).grid(row=0,column=10) Tkinter.Button(gamma_frame, command=self.set_gamma_file, text="Set...").grid(row=0,column=11) ################## end gamma_frame ################### row += 1 bf = Tkinter.Frame(self) bf.grid(row=row,columnspan=2,sticky=Tkinter.W+Tkinter.E) # Save settings to config file b = Tkinter.Button(bf,text="Save current settings to config file",command=self.save) b.grid(row=0,column=0,padx=20) b.bind('',self.start) # Start button b2 = Tkinter.Button(bf,text="ok",command=self.start) b2.grid(row=0,column=1,padx=20) b2.focus_force() b2.bind('',self.start) # Raise our application on darwin if sys.platform == 'darwin': try: # from Jack Jansen email 20 April 2003 # WMAvailable() returns true if you can use the window # manager, and as a side #effect it raises the # application to the foreground. import MacOS if not MacOS.WMAvailable(): raise "Cannot reach the window manager" except: pass def set_gamma_file(self,dummy_arg=None): filename = tkFileDialog.askopenfilename( parent=self, defaultextension=".ve_gamma", filetypes=[('Configuration file','*.ve_gamma')], initialdir=VisionEgg.config.VISIONEGG_USER_DIR) if not filename: return self.gamma_file.set(filename) def format_string(self,in_str): # This probably a slow way to do things, but it works! min_line_length = 60 in_list = in_str.split() out_str = "" cur_line = "" for word in in_list: cur_line = cur_line + word + " " if len(cur_line) > min_line_length: out_str = out_str + cur_line[:-1] + "\n" cur_line = " " out_str = out_str + cur_line + "\n" return out_str def darwin_maxpriority_tune(self): class DarwinFineTuneDialog(ToplevelDialog): def __init__(self,parent,**cnf): # Bugs in Tk 8.4a4 for Darwin seem to prevent use of "grid" in this dialog ToplevelDialog.__init__(self,**cnf) self.title("Fine tune maximum priority") f = Tkinter.Frame(self) f.pack(expand=1,fill=Tkinter.BOTH,ipadx=2,ipady=2) row = 0 Tkinter.Label(f, text=parent.format_string( """This information is used by the Vision Egg when in "maximum priority" mode. These values fine tune this behavior on the Mac OS X ("darwin") platform. For conventional priority, the valid values range from -20 (highest priority) to 20 (worst priority). In the realtime settings, the numerical values represent a fraction of the total cycles available on the computer. For more information, please refer to http://developer.apple.com/ techpubs/ macosx/ Darwin/ General/ KernelProgramming/ scheduler/ Using_Mach__pplications.html Hint: Try the realtime task method with the framerate as the denominator. """ )).grid(row=row,columnspan=4,column=0) row = 1 # Tkinter.Checkbutton(f,text="Use conventional priority",variable=parent.darwin_conventional).grid(row=row,column=0,columnspan=4) row = 2 # Tkinter.Label(f,text="Conventional priority settings").grid(row=row,column=0,columnspan=2) Tkinter.Radiobutton(f, text="Conventional priority method", variable=parent.darwin_conventional, value=1).grid(row=row,column=0,columnspan=2) row += 1 Tkinter.Label(f,text="Priority").grid(row=row,column=0,sticky=Tkinter.E) Tkinter.Entry(f,textvariable=parent.darwin_priority).grid(row=row,column=1,sticky=Tkinter.W) row = 2 Tkinter.Radiobutton(f, text="Realtime task method", variable=parent.darwin_conventional, value=0).grid(row=row,column=2,columnspan=2) # Tkinter.Label(f,text="Realtime settings").grid(row=row,column=2,columnspan=2) row += 1 Tkinter.Label(f,text="Realtime period denominator").grid(row=row,column=2,sticky=Tkinter.E) Tkinter.Entry(f,textvariable=parent.darwin_realtime_period_denom).grid(row=row,column=3,sticky=Tkinter.W) row += 1 Tkinter.Label(f,text="Realtime computation denominator").grid(row=row,column=2,sticky=Tkinter.E) Tkinter.Entry(f,textvariable=parent.darwin_realtime_computation_denom).grid(row=row,column=3,sticky=Tkinter.W) row += 1 Tkinter.Label(f,text="Realtime constraint denominator").grid(row=row,column=2,sticky=Tkinter.E) Tkinter.Entry(f,textvariable=parent.darwin_realtime_constraint_denom).grid(row=row,column=3,sticky=Tkinter.W) row += 1 Tkinter.Checkbutton(f,text="Do not preempt",variable=parent.darwin_realtime_preemptible).grid(row=row,column=2,columnspan=2) row += 1 Tkinter.Button(f, text="ok",command=self.ok).grid(row=row,column=0,columnspan=4) self.wait_window(self) def ok(self): self.destroy() DarwinFineTuneDialog(parent=self) def _set_config_values(self): VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ = float(self.frame_rate.get()) VisionEgg.config.VISIONEGG_FULLSCREEN = self.fullscreen.get() VisionEgg.config.VISIONEGG_GAMMA_SOURCE = self.gamma_source.get() VisionEgg.config.VISIONEGG_GAMMA_INVERT_RED = self.gamma_invert_red.get() VisionEgg.config.VISIONEGG_GAMMA_INVERT_GREEN = self.gamma_invert_green.get() VisionEgg.config.VISIONEGG_GAMMA_INVERT_BLUE = self.gamma_invert_blue.get() VisionEgg.config.VISIONEGG_GAMMA_FILE = self.gamma_file.get() VisionEgg.config.VISIONEGG_MAXPRIORITY = self.maxpriority.get() VisionEgg.config.VISIONEGG_SYNC_SWAP = self.sync_swap.get() VisionEgg.config.VISIONEGG_FRAMELESS_WINDOW = self.frameless.get() VisionEgg.config.VISIONEGG_HIDE_MOUSE = not self.mouse_visible.get() VisionEgg.config.VISIONEGG_REQUEST_STEREO = self.stereo.get() VisionEgg.config.VISIONEGG_SCREEN_W = int(self.width.get()) VisionEgg.config.VISIONEGG_SCREEN_H = int(self.height.get()) VisionEgg.config.VISIONEGG_PREFERRED_BPP = int(self.color_depth.get()) VisionEgg.config.VISIONEGG_REQUEST_RED_BITS = int(self.red_depth.get()) VisionEgg.config.VISIONEGG_REQUEST_GREEN_BITS = int(self.green_depth.get()) VisionEgg.config.VISIONEGG_REQUEST_BLUE_BITS = int(self.blue_depth.get()) VisionEgg.config.VISIONEGG_REQUEST_ALPHA_BITS = int(self.alpha_depth.get()) if sys.platform=='darwin': # Only used on darwin platform VisionEgg.config.VISIONEGG_DARWIN_MAXPRIORITY_CONVENTIONAL_NOT_REALTIME = self.darwin_conventional.get() VisionEgg.config.VISIONEGG_DARWIN_CONVENTIONAL_PRIORITY = int(self.darwin_priority.get()) VisionEgg.config.VISIONEGG_DARWIN_REALTIME_PERIOD_DENOM = int(self.darwin_realtime_period_denom.get()) VisionEgg.config.VISIONEGG_DARWIN_REALTIME_COMPUTATION_DENOM = int(self.darwin_realtime_computation_denom.get()) VisionEgg.config.VISIONEGG_DARWIN_REALTIME_CONSTRAINT_DENOM = int(self.darwin_realtime_constraint_denom.get()) VisionEgg.config.VISIONEGG_DARWIN_REALTIME_PREEMPTIBLE = int(not self.darwin_realtime_preemptible.get()) if self.show_synclync_option: VisionEgg.config.SYNCLYNC_PRESENT = self.synclync_present.get() def save(self,dummy_arg=None): self._set_config_values() try: VisionEgg.Configuration.save_settings() except IOError, x: try: import tkMessageBox if str(x).find('Permission denied') != -1: tkMessageBox.showerror(title="Permission denied", message="Permission denied when trying to save settings.\n\nTry making a copy of the config file in the Vision Egg user directory %s and making sure you have write permission."%(os.path.abspath(VisionEgg.config.VISIONEGG_USER_DIR),)) except: raise x def start(self,dummy_arg=None): self.clicked_ok = 1 self._set_config_values() for child in self.children.values(): child.destroy() Tkinter.Tk.destroy(self.master) # OK, now close myself class InfoFrame(Tkinter.Frame): def __init__(self,master=None,**cnf): VisionEgg.config._Tkinter_used = True Tkinter.Frame.__init__(self,master,**cnf) Tkinter.Label(self,text="Vision Egg information:").pack() self.sub_frame = Tkinter.Frame(self,relief=Tkinter.GROOVE) self.sub_frame.pack() self.update() def update(self): for child in self.sub_frame.children.values(): child.destroy() if VisionEgg.config.VISIONEGG_FULLSCREEN: Tkinter.Label(self.sub_frame,text="fullscreen mode").pack() else: Tkinter.Label(self.sub_frame,text="window mode").pack() ## if VisionEgg.config.VISIONEGG_TEXTURE_COMPRESSION: ## Tkinter.Label(self.sub_frame,text="Texture compression on").pack() ## else: ## Tkinter.Label(self.sub_frame,text="Texture compression off").pack() #Tkinter.Button(self.sub_frame,text="Update information",command=self.update).pack() class ToplevelDialog(Tkinter.Toplevel): """Base class for a dialog that runs on the top level.""" def __init__(self,**kw): VisionEgg.config._Tkinter_used = True Tkinter.Toplevel.__init__(self,**kw) self.transient(self) def destroy(self): Tkinter.Toplevel.destroy(self) class GetKeypressDialog(ToplevelDialog): """Open a dialog box which returns when a valid key is pressed. Arguments are: master - a Tkinter widget (defaults to None) title - a string for the title bar of the widget text - a string to display as the text in the body of the dialog key_list - a list of acceptable keys, e.g. ['q','1','2',''] The following example will print whatever character was pressed: d = GetKeypressDialog(key_list=['q','1','2','','']) print d.result The implementation is somewhat obscure because a new Tk/Tcl interpreter may be created if this Dialog is called with no master widget.""" def __init__(self, title="Press a key", text="Press a key", key_list=[], **kw): ToplevelDialog.__init__(self,**kw) self.title(title) self.result = None # The dialog box body Tkinter.Label(self.frame, text=text).pack() for key in key_list: self.bind(key,self.keypress) self.wait_window(self) def keypress(self,tkinter_event): self.result = tkinter_event.keysym self.destroy() visionegg-1.2.1/VisionEgg/MoreStimuli.py0000644000076500000240000005244311224565527017427 0ustar astrawstaff# The Vision Egg: MoreStimuli # # Copyright (C) 2001-2003 Andrew Straw. # (C) 2005 by Hertie Institute for Clinical Brain Research, # Department of Cognitive Neurology, University of Tuebingen # (C) 2005,2008 California Institute of Technology # (C) 2006 Peter Jurica and Gijs Plomp # # URL: http://www.visionegg.org # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Assorted stimuli. """ #################################################################### # # Import all the necessary packages # #################################################################### import logging import VisionEgg import VisionEgg.Core import VisionEgg.ParameterTypes as ve_types import numpy.oldnumeric as Numeric import math import VisionEgg.GL as gl # get all OpenGL stuff in one namespace class Target2D(VisionEgg.Core.Stimulus): """Rectanglular stimulus. Parameters ========== anchor -- specifies how position parameter is interpreted (String) Default: center anti_aliasing -- (Boolean) Default: True center -- DEPRECATED: don't use (Sequence2 of Real) Default: (determined at runtime) color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) on -- draw stimulus? (Boolean) (Boolean) Default: True orientation -- (Real) Default: 0.0 position -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) Default: (320.0, 240.0) size -- units: eye coordinates (Sequence2 of Real) Default: (64.0, 16.0) """ parameters_and_defaults = { 'on':(True, ve_types.Boolean, "draw stimulus? (Boolean)"), 'color':((1.0,1.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'anti_aliasing':(True, ve_types.Boolean), 'orientation':(0.0, ve_types.Real), 'position' : ( ( 320.0, 240.0 ), ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye coordinates"), 'anchor' : ('center', ve_types.String, "specifies how position parameter is interpreted"), 'size':((64.0,16.0), ve_types.Sequence2(ve_types.Real), "units: eye coordinates"), 'center' : (None, ve_types.Sequence2(ve_types.Real), "DEPRECATED: don't use"), } __slots__ = ( '_gave_alpha_warning', ) def __init__(self,**kw): VisionEgg.Core.Stimulus.__init__(self,**kw) self._gave_alpha_warning = 0 def draw(self): p = self.parameters # shorthand if p.center is not None: if not hasattr(VisionEgg.config,"_GAVE_CENTER_DEPRECATION"): logger = logging.getLogger('VisionEgg.MoreStimuli') logger.warning("Specifying Target2D by deprecated " "'center' parameter deprecated. Use " "'position' parameter instead. (Allows " "use of 'anchor' parameter to set to " "other values.)") VisionEgg.config._GAVE_CENTER_DEPRECATION = 1 p.anchor = 'center' p.position = p.center[0], p.center[1] # copy values (don't copy ref to tuple) if p.on: # calculate center center = VisionEgg._get_center(p.position,p.anchor,p.size) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() gl.glTranslate(center[0],center[1],0.0) gl.glRotate(p.orientation,0.0,0.0,1.0) if len(p.color)==3: gl.glColor3f(*p.color) elif len(p.color)==4: gl.glColor4f(*p.color) gl.glDisable(gl.GL_DEPTH_TEST) gl.glDisable(gl.GL_TEXTURE_2D) gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) gl.glEnable(gl.GL_BLEND) w = p.size[0]/2.0 h = p.size[1]/2.0 gl.glBegin(gl.GL_QUADS) gl.glVertex3f(-w,-h, 0.0) gl.glVertex3f( w,-h, 0.0) gl.glVertex3f( w, h, 0.0) gl.glVertex3f(-w, h, 0.0) gl.glEnd() # GL_QUADS if p.anti_aliasing: if not self._gave_alpha_warning: if len(p.color) > 3 and p.color[3] != 1.0: logger = logging.getLogger('VisionEgg.MoreStimuli') logger.warning("The parameter anti_aliasing is " "set to true in the Target2D " "stimulus class, but the color " "parameter specifies an alpha " "value other than 1.0. To " "acheive anti-aliasing, ensure " "that the alpha value for the " "color parameter is 1.0.") self._gave_alpha_warning = 1 # We've already drawn a filled polygon (aliased), now # redraw the outline of the polygon (with # anti-aliasing). (Using GL_POLYGON_SMOOTH results in # artifactual lines where triangles were joined to # create quad, at least on some OpenGL # implementations.) # Calculate coverage value for each pixel of outline # and store as alpha gl.glEnable(gl.GL_LINE_SMOOTH) # Now specify how to use the alpha value gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) gl.glEnable(gl.GL_BLEND) # Draw a second polygon in line mode, so the edges are anti-aliased gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_LINE) gl.glBegin(gl.GL_QUADS) gl.glVertex3f(-w,-h, 0.0); gl.glVertex3f( w,-h, 0.0); gl.glVertex3f( w, h, 0.0); gl.glVertex3f(-w, h, 0.0); gl.glEnd() # GL_QUADS # Set the polygon mode back to fill mode gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_FILL) gl.glDisable(gl.GL_LINE_SMOOTH) gl.glPopMatrix() class Rectangle3D(VisionEgg.Core.Stimulus): """Solid color rectangle positioned explicitly by four vertices. Parameters ========== color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0, 1.0) on -- (Boolean) Default: True vertex1 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (-10.0, 0.0, -10.0) vertex2 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (-10.0, 0.0, 10.0) vertex3 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (10.0, 0.0, 10.0) vertex4 -- units: eye coordinates (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (10.0, 0.0, -10.0) """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'blending_enabled':(False, ve_types.Boolean), # different default than TextureStimulus3D due to not break backwards compatibility 'depth_test':(False, ve_types.Boolean), 'color':((1.0,1.0,1.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'vertex1':(( -10.0, 0.0, -10.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye coordinates"), 'vertex2':(( -10.0, 0.0, 10.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye coordinates"), 'vertex3':(( 10.0, 0.0, 10.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye coordinates"), 'vertex4':(( 10.0, 0.0, -10.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye coordinates"), } def __init__(self,**kw): VisionEgg.Core.Stimulus.__init__(self,**kw) def draw(self): p = self.parameters # shorthand if p.on: if len(p.color)==3: gl.glColor3f(*p.color) elif len(p.color)==4: gl.glColor4f(*p.color) gl.glDisable(gl.GL_TEXTURE_2D) if p.depth_test: gl.glEnable(gl.GL_DEPTH_TEST) else: gl.glDisable(gl.GL_DEPTH_TEST) if p.blending_enabled: gl.glEnable(gl.GL_BLEND) else: gl.glDisable(gl.GL_BLEND) gl.glBegin(gl.GL_QUADS) gl.glVertex(*p.vertex1) gl.glVertex(*p.vertex2) gl.glVertex(*p.vertex3) gl.glVertex(*p.vertex4) gl.glEnd() # GL_QUADS class Arrow(VisionEgg.Core.Stimulus): """Arrow stimulus. Parameters ========== anchor -- (String) Default: center anti_aliasing -- (Boolean) Default: True color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) on -- (Boolean) Default: True orientation -- (Real) Default: 0.0 position -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) Default: (320.0, 240.0) size -- (Sequence2 of Real) Default: (64.0, 16.0) """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'color':((1.0,1.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'anti_aliasing':(True, ve_types.Boolean), 'orientation':(0.0, # 0.0 degrees = right, 90.0 degrees = up ve_types.Real), 'position' : ( ( 320.0, 240.0 ), # In eye coordinates ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye coordinates"), 'anchor' : ('center', ve_types.String), 'size':((64.0,16.0), # In eye coordinates ve_types.Sequence2(ve_types.Real)), } __slots__ = VisionEgg.Core.Stimulus.__slots__ + ( '_gave_alpha_warning', ) def __init__(self,**kw): VisionEgg.Core.Stimulus.__init__(self,**kw) self._gave_alpha_warning = 0 def draw(self): p = self.parameters # Shorthand if p.on: # Calculate center center = VisionEgg._get_center(p.position,p.anchor,p.size) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() gl.glTranslate(center[0],center[1],0.0) gl.glRotate(-p.orientation,0.0,0.0,1.0) if len(p.color)==3: gl.glColor3f(*p.color) elif len(p.color)==4: gl.glColor4f(*p.color) gl.glDisable(gl.GL_DEPTH_TEST) gl.glDisable(gl.GL_TEXTURE_2D) gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) gl.glEnable(gl.GL_BLEND) w = p.size[0]/2.0 h = p.size[1]/2.0 gl.glBegin(gl.GL_QUADS) # Draw Rectangle gl.glVertex3f( 0.25*w, h, 0.0) gl.glVertex3f(-w, h, 0.0) gl.glVertex3f(-w,-h, 0.0) gl.glVertex3f( 0.25*w, -h, 0.0) gl.glEnd() # GL_QUADS gl.glBegin(gl.GL_TRIANGLES) # Draw Triangle gl.glVertex3f( 1.00*w, 0.0*h, 0.0) # Top gl.glVertex3f( 0.25*w,-3.0*h, 0.0) gl.glVertex3f( 0.25*w, 3.0*h, 0.0) gl.glEnd() # GL_QUADS if p.anti_aliasing: if not self._gave_alpha_warning: if len(p.color) > 3 and p.color[3] != 1.0: logger = logging.getLogger('VisionEgg.Arrow') logger.warning("The parameter anti_aliasing is " "set to true in the Arrow " "stimulus class, but the color " "parameter specifies an alpha " "value other than 1.0. To " "acheive anti-aliasing, ensure " "that the alpha value for the " "color parameter is 1.0.") self._gave_alpha_warning = 1 # We've already drawn a filled polygon (aliased), now redraw # the outline of the polygon (with anti-aliasing). (Using # GL_POLYGON_SMOOTH results in artifactual lines where # triangles were joined to create quad, at least on some OpenGL # implementations.) # Calculate coverage value for each pixel of outline # and store as alpha gl.glEnable(gl.GL_LINE_SMOOTH) # Now specify how to use the alpha value gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) gl.glEnable(gl.GL_BLEND) # Draw a second polygon in line mode, so the edges are anti-aliased gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_LINE) gl.glBegin(gl.GL_QUADS) gl.glVertex3f( 0.25*w, h, 0.0) # Draw Rectangle gl.glVertex3f(-w, h, 0.0) gl.glVertex3f(-w,-h, 0.0) gl.glVertex3f( 0.25*w, -h, 0.0) gl.glVertex3f( 1.00*w, 0.0*h, 0.0) # Draw Triangle gl.glVertex3f( 0.25*w,-3.0*h, 0.0) gl.glVertex3f( 0.25*w, 3.0*h, 0.0) gl.glEnd() # GL_QUADS # Set the polygon mode back to fill mode gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_FILL) gl.glDisable(gl.GL_LINE_SMOOTH) gl.glPopMatrix() class FilledCircle(VisionEgg.Core.Stimulus): """ A circular stimulus, typically used as a fixation point. (Note, this implementation almost certainly could be made faster using display lists.) Parameters ========== anchor -- how position parameter is used (String) Default: center anti_aliasing -- (Boolean) Default: True color -- color (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) num_triangles -- number of triangles used to draw circle (Integer) Default: 51 on -- draw? (Boolean) Default: True position -- position in eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) Default: (320.0, 240.0) radius -- radius in eye coordinates (Real) Default: 2.0 """ parameters_and_defaults = VisionEgg.ParameterDefinition({ 'on':(True, ve_types.Boolean, 'draw?'), 'color':((1.0,1.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), 'color'), 'anti_aliasing':(True, ve_types.Boolean), 'position' : ( ( 320.0, 240.0 ), # in eye coordinates ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), 'position in eye coordinates'), 'anchor' : ('center', ve_types.String, 'how position parameter is used'), 'radius':(2.0, ve_types.Real, 'radius in eye coordinates'), 'num_triangles':(51, ve_types.Integer, 'number of triangles used to draw circle'), }) __slots__ = VisionEgg.Core.Stimulus.__slots__ + ( '_gave_alpha_warning', ) def __init__(self,**kw): VisionEgg.Core.Stimulus.__init__(self,**kw) self._gave_alpha_warning = 0 def draw(self): p = self.parameters # shorthand if p.on: # calculate center center = VisionEgg._get_center(p.position,p.anchor,(p.radius, p.radius)) gl.glDisable(gl.GL_DEPTH_TEST) gl.glDisable(gl.GL_TEXTURE_2D) gl.glDisable(gl.GL_BLEND) if len(p.color)==3: gl.glColor3f(*p.color) elif len(p.color)==4: gl.glColor4f(*p.color) # Build filled circle from points # gl.glBegin(gl.GL_POINTS) # radius = int(math.ceil(p.radius)) # for i in range(-radius, radius): # for j in range(-radius, radius): # if(i * i + j * j < radius * radius): # gl.glVertex3f(p.position[0] + i, p.position[1] + j, 0.0) # gl.glEnd() # GL_POINTS # Build filled circle from triangles (this is typically faster # then the commented code above with the points) gl.glBegin(gl.GL_TRIANGLE_FAN) gl.glVertex3f(p.position[0], p.position[1], 0.0) angles = Numeric.arange(p.num_triangles)/float(p.num_triangles)*2.0*math.pi verts = Numeric.zeros( (p.num_triangles,2), Numeric.Float ) verts[:,0] = p.position[0] + p.radius * Numeric.cos(angles) verts[:,1] = p.position[1] + p.radius * Numeric.sin(angles) for i in range(verts.shape[0]): gl.glVertex2fv(verts[i]) gl.glVertex2fv(verts[0]) gl.glEnd() # GL_TRIANGLE_FAN if p.anti_aliasing: if not self._gave_alpha_warning: if len(p.color) > 3 and p.color[3] != 1.0: logger = logging.getLogger('VisionEgg.Arrow') logger.warning("The parameter anti_aliasing is " "set to true in the Arrow " "stimulus class, but the color " "parameter specifies an alpha " "value other than 1.0. To " "acheive anti-aliasing, ensure " "that the alpha value for the " "color parameter is 1.0.") self._gave_alpha_warning = 1 # We've already drawn a filled polygon (aliased), now redraw # the outline of the polygon (with anti-aliasing). (Using # GL_POLYGON_SMOOTH results in artifactual lines where # triangles were joined to create quad, at least on some OpenGL # implementations.) # Calculate coverage value for each pixel of outline # and store as alpha gl.glEnable(gl.GL_LINE_SMOOTH) # Now specify how to use the alpha value gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) gl.glEnable(gl.GL_BLEND) # Draw a second polygon in line mode, so the edges are anti-aliased gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_LINE) gl.glBegin(gl.GL_TRIANGLE_FAN) gl.glVertex3f(p.position[0], p.position[1], 0.0) angles = Numeric.arange(p.num_triangles)/float(p.num_triangles)*2.0*math.pi verts = Numeric.zeros( (p.num_triangles,2), Numeric.Float ) verts[:,0] = p.position[0] + p.radius * Numeric.cos(angles) verts[:,1] = p.position[1] + p.radius * Numeric.sin(angles) for i in range(verts.shape[0]): gl.glVertex2fv(verts[i]) gl.glVertex2fv(verts[0]) gl.glEnd() # GL_TRIANGLE_FAN # Set the polygon mode back to fill mode gl.glPolygonMode(gl.GL_FRONT_AND_BACK,gl.GL_FILL) gl.glDisable(gl.GL_LINE_SMOOTH) visionegg-1.2.1/VisionEgg/movieconvert.c0000755000076500000240000000115211224565530017454 0ustar astrawstaff#include "Python.h" #if defined(__APPLE__) # include #else # include #endif void MovieObj_Convert(PyObject* MovieObj, Movie* outMovie) { PyObject* MovieObj_theMovie; PyObject* MovieObj_theMovie_value; Py_intptr_t ptr_as_int; MovieObj_theMovie = PyObject_GetAttrString(MovieObj,"theMovie"); if (!MovieObj_theMovie) return; MovieObj_theMovie_value = PyObject_GetAttrString(MovieObj_theMovie,"value"); if (!MovieObj_theMovie_value) return; // convert python int -> Movie* ptr_as_int = PyLong_AsLong(MovieObj_theMovie_value); (*outMovie) = (Movie)ptr_as_int; } visionegg-1.2.1/VisionEgg/movieconvert.h0000755000076500000240000000025411224565530017463 0ustar astrawstaff#include "Python.h" #if defined(__APPLE__) # include #else # include #endif void MovieObj_Convert(PyObject* MovieObj, Movie* outMovie); visionegg-1.2.1/VisionEgg/ParameterTypes.py0000644000076500000240000003215711224565527020123 0ustar astrawstaff# The Vision Egg: ParameterTypes # # Copyright (C) 2001-2003 Andrew Straw # Copyright (C) 2005,2008 California Insitute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Type checking for the Vision Egg. """ import VisionEgg import types, warnings import numpy import numpy.oldnumeric as numpyNumeric array_types = [numpy.ndarray] # Allow use of numarray and original Numeric Texture data without requiring either try: import numarray array_types.append( numarray.numarraycore.NumArray ) except ImportError: pass try: import Numeric as orig_Numeric array_types.append( orig_Numeric.ArrayType ) except ImportError: pass class ParameterTypeDef(object): """Base class for all parameter type definitions""" def verify(value): # override this method with type-checking code raise RuntimeError('must override base class method verify') verify = staticmethod(verify) def get_all_classes_list(klass): #assert(type(klass) == types.ClassType) result = [klass] for base_klass in klass.__bases__: result.extend(get_all_classes_list(base_klass)) return result def is_parameter_type_def(item_type): if type(item_type) == types.ClassType: if Sequence in get_all_classes_list(item_type): raise TypeError("Sequence definition must be an instance (with a contained type).") else: return ParameterTypeDef in get_all_classes_list(item_type) elif isinstance(item_type,ParameterTypeDef): return True elif issubclass(item_type,ParameterTypeDef): # for new style classes return True elif item_type == types.NoneType: warnings.warn("types.NoneType will stop being a supported type "+\ "argument. Please call "+\ "VisionEgg.ParameterTypes.get_type(None) to get the "+\ "supported value",DeprecationWarning,stacklevel=2) return True else: return False class AnyOf(ParameterTypeDef): def __init__(self,*item_types): for item_type in item_types: if not is_parameter_type_def(item_type): raise TypeError("%s is not a valid type definition") self.item_types = item_types def __str__(self): return 'AnyOf(%s)'%(' or '.join(map(str,self.item_types))) def verify(self,is_any_of): for item_type in self.item_types: if item_type.verify(is_any_of): return True return False def get_item_types(self): return self.item_types class NoneMC(type): """metaclass for NoneType""" def __str__(self): return 'None' class NoneType(ParameterTypeDef): __metaclass__ = NoneMC def verify(is_none): return is_none is None verify = staticmethod(verify) class BooleanMC(type): """metaclass for Boolean""" def __str__(self): return 'Boolean' class Boolean(ParameterTypeDef): __metaclass__ = BooleanMC def verify(is_boolean): if isinstance(is_boolean,(bool,int,numpy.integer)): return True else: return False verify = staticmethod(verify) class CallableMC(type): """metaclass for Callable""" def __str__(self): return 'Callable' class Callable(ParameterTypeDef): __metaclass__ = CallableMC def verify(is_callable): return callable(is_callable) verify = staticmethod(verify) class AnyClassMC(type): """metaclass for AnyClass""" def __str__(self): return 'AnyClass' class AnyClass(ParameterTypeDef): """parameter is a class""" __metaclass__ = AnyClassMC def verify(is_class): return type(is_class) == types.ClassType verify = staticmethod(verify) class SubClass(ParameterTypeDef): """parameter is derived from base_class""" def __init__(self,base_class): if type(base_class) != types.ClassType: raise TypeError("base_class must be ClassType") self.base_class = base_class def verify(self,is_class): if type(self.base_class) != types.ClassType: return False return self.base_class in get_all_classes_list(is_class) def __str__(self): return 'SubClass of %s'%str(self.base_class) class Instance(ParameterTypeDef): """parameter is an instance of class_type""" def __init__(self,class_type): if type(class_type) not in (types.ClassType, types.TypeType): raise TypeError("expected a class type") self.class_type = class_type def __str__(self): contained_string = str(self.class_type) return 'Instance of %s'%contained_string def verify(self,is_instance): return isinstance(is_instance,self.class_type) class IntegerMC(type): """metaclass for Integer""" def __str__(self): return 'Integer' class Integer(ParameterTypeDef): __metaclass__ = IntegerMC def verify(is_integer): return isinstance(is_integer,(int,numpy.integer)) verify = staticmethod(verify) class UnsignedIntegerMC(IntegerMC): """metaclass for UnsignedInteger""" def __str__(self): return 'UnsignedInteger' class UnsignedInteger(Integer): __metaclass__ = UnsignedIntegerMC def verify(is_unsigned_integer): if not Integer.verify(is_unsigned_integer): return False return is_unsigned_integer >= 0 verify = staticmethod(verify) class RealMC(type): """metaclass for Real""" def __str__(self): return 'Real' class Real(ParameterTypeDef): __metaclass__ = RealMC def verify(is_real): if isinstance(is_real, (int, float, numpy.floating, numpy.integer)): return True elif type(is_real) in array_types: # scalars can be Numeric arrays if len(is_real.shape)==0: try: float(is_real) return True except: return False return False verify = staticmethod(verify) class Sequence(ParameterTypeDef): """A tuple, list or Numeric array""" def __init__(self,item_type): if not is_parameter_type_def(item_type): raise TypeError("%s is not a valid type definition"%item_type) self.item_type = item_type def __str__(self): contained_string = str(self.item_type) return 'Sequence of %s'%contained_string def verify(self,is_sequence): try: len(is_sequence) except TypeError: return False for i in xrange(len(is_sequence)): if not self.item_type.verify(is_sequence[i]): return False return True class Sequence2(Sequence): def __str__(self): contained_string = str(self.item_type) return 'Sequence2 of %s'%contained_string def verify(self,is_sequence2): if not Sequence.verify(self,is_sequence2): return False if not len(is_sequence2) == 2: return False return True class Sequence3(Sequence): def __str__(self): contained_string = str(self.item_type) return 'Sequence3 of %s'%contained_string def verify(self,is_sequence3): if not Sequence.verify(self,is_sequence3): return False if not len(is_sequence3) == 3: return False return True class Sequence4(Sequence): def __str__(self): contained_string = str(self.item_type) return 'Sequence4 of %s'%contained_string def verify(self,is_sequence4): if not Sequence.verify(self,is_sequence4): return False if not len(is_sequence4) == 4: return False return True class Sequence4x4(Sequence4): def __str__(self): contained_string = str(self.item_type) return 'Sequence4x4 of %s'%contained_string def verify(self,is_sequence4x4): try: len(is_sequence4x4) except TypeError: return False if not len(is_sequence4x4) == 4: return False for i in range(4): if not Sequence4.verify(self,is_sequence4x4[i]): return False return True class StringMC(type): """metaclass for String""" def __str__(self): return 'String' class String(ParameterTypeDef): __metaclass__ = StringMC def verify(is_string): if isinstance(is_string,str): return True else: return False verify = staticmethod(verify) class UnicodeMC(type): """metaclass for Unicode""" def __str__(self): return 'Unicode' class Unicode(ParameterTypeDef): __metaclass__ = UnicodeMC def verify(is_unicode): if isinstance(is_unicode,unicode): return True else: return False verify = staticmethod(verify) def get_type(value): """Take a value and return best guess of ParameterTypeDef it is.""" py_type = type(value) if isinstance(value,bool): return Boolean elif value is None: return NoneType elif isinstance(value,(int,numpy.integer)): if py_type >= 0: return UnsignedInteger else: return Integer elif isinstance(value,(float,numpy.floating)): return Real elif py_type == types.InstanceType: # hmm, impossible to figure out appropriate class of all possible base classes return Instance(value.__class__) elif callable(value): return Callable elif isinstance(value,str): return String elif isinstance(value,unicode): return Unicode else: try: len(value) except TypeError: is_sequence = False else: is_sequence = True if is_sequence: if len(value) == 4: # see if it's a 4x4 sequence is_sequence4x4 = True for i in range(4): try: len(value[i]) except TypeError: is_sequence4x4 = False if is_sequence4x4: sequence4x4_type = get_type(value[0][0]) # XXX assume all same types return Sequence4x4(sequence4x4_type) if type(value) == str: return String lcd_type = get_type(value[0]) # lowest common denominator type for i in range(len(value)): this_type = get_type(value[i]) if lcd_type != this_type: # find lowest common denominator type if lcd_type.verify( this_type ): continue # covered by lowest common denominator elif this_type.verify( lcd_type ): lcd_type = this_type # new lowest common denominator else: lcd_type = AnyOf( lcd_type, this_type ) # make new lowest common denominator sequence_type = lcd_type if len(value) == 2: return Sequence2(sequence_type) elif len(value) == 3: return Sequence3(sequence_type) elif len(value) == 4: return Sequence4(sequence_type) else: return Sequence(sequence_type) # finally, one last check: if isinstance(value, object): # new style class # hmm, impossible to figure out appropriate class of all possible base classes return Instance(value.__class__) else: raise TypeError("Unable to determine type for '%s'"%value) def assert_type(check_type,require_type): if not is_parameter_type_def(check_type): raise ValueError("require a ParameterTypeDef as argument (not %s)"%check_type) if not is_parameter_type_def(require_type): raise ValueError("require a ParameterTypeDef as argument (not %s)"%require_type) if check_type == require_type: return if check_type in (Integer,UnsignedInteger) and require_type == Boolean: return # let integers pass as booleans # XXX doesn't check if Instance is actually instance of proper class if isinstance(check_type,ParameterTypeDef): check_class = check_type.__class__ else: check_class = check_type if isinstance(require_type,ParameterTypeDef): if isinstance(require_type,AnyOf): passed = False for ok_type in require_type.get_item_types(): try: assert_type(check_type, ok_type ) return # it's ok except: pass raise TypeError("%s not of type %s"%(check_type,require_type)) else: require_class = require_type.__class__ else: require_class = require_type if require_class in get_all_classes_list(check_class): return if issubclass(require_class,Real): if issubclass(check_class,Boolean): return elif issubclass(check_class,Integer): return if issubclass(require_class,Integer): if issubclass(check_class,Boolean): return raise TypeError("%s not of type %s"%(check_type,require_type)) visionegg-1.2.1/VisionEgg/PlatformDependent.py0000644000076500000240000002530611224565527020567 0ustar astrawstaff# The Vision Egg: PlatformDependent # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Implementations of functions which vary by platform. """ #################################################################### # # Import all the necessary packages # #################################################################### import logging import sys, os import VisionEgg import VisionEgg.Core import VisionEgg.GL as gl # get all OpenGL stuff in one namespace def set_priority(*args,**kw): """Set the priority of the Vision Egg application. Defaults to maximum priority, but can be changed via keyword arguments. Raises an exception on failure. """ # potential keywords parse_me = ["darwin_realtime_period_denom", "darwin_realtime_computation_denom", "darwin_realtime_constraint_denom", "darwin_realtime_preemptible", "darwin_maxpriority_conventional_not_realtime", "darwin_conventional_priority", "darwin_pthread_priority"] logger = logging.getLogger('VisionEgg.PlatformDependent') params = {} # set variable in local namespace for word in parse_me: # set the value from VisionEgg.config config_name = "VISIONEGG_"+word.upper() if hasattr(VisionEgg.config,config_name): value = getattr(VisionEgg.config,config_name) else: value = None # override default value if present in keyword arguments if word in kw.keys(): value = kw[word] if value is not None: params[word] = value if sys.platform == 'darwin': # Everything to support realtime in Apple Mac OS X is based on # the following two things: # # 1) http://developer.apple.com/techpubs/macosx/Darwin/General/KernelProgramming/scheduler/Using_Mach__pplications.html # # 2) The Mac OS X port of the Esound daemon. import darwin_maxpriority if params['darwin_maxpriority_conventional_not_realtime']: process = darwin_maxpriority.PRIO_PROCESS policy = darwin_maxpriority.SCHED_RR logger.info("Setting max priority mode for darwin platform " "using conventional priority %d."%( params['darwin_conventional_priority'],)) # set the priority of the current process darwin_maxpriority.setpriority(process,0,params['darwin_conventional_priority']) # This sets the pthread priority, which only prioritizes # threads in the process. Might as well do it, but it # shouldn't matter unless we're running multi-threaded. darwin_pthread_priority = params['darwin_pthread_priority'] if darwin_pthread_priority == "max": # should otherwise be an int darwin_pthread_priority = darwin_maxpriority.sched_get_priority_max(policy) if darwin_maxpriority.set_self_pthread_priority(policy, darwin_pthread_priority) == -1: raise RuntimeError("set_self_pthread failed.") else: bus_speed = darwin_maxpriority.get_bus_speed() logger.info("Setting max priority mode for darwin platform " "using realtime threads. ( period = %d / %d, " "computation = %d / %d, constraint = %d / %d, " "preemptible = %d )" % ( bus_speed, params['darwin_realtime_period_denom'], bus_speed, params['darwin_realtime_computation_denom'], bus_speed, params['darwin_realtime_constraint_denom'], params['darwin_realtime_preemptible'] )) period = bus_speed / params['darwin_realtime_period_denom'] computation = bus_speed / params['darwin_realtime_computation_denom'] constraint = bus_speed / params['darwin_realtime_constraint_denom'] preemptible = params['darwin_realtime_preemptible'] darwin_maxpriority.set_self_thread_time_constraint_policy( period, computation, constraint, preemptible ) elif sys.platform == 'win32': import win32_maxpriority logger.info("Setting priority for win32 platform to " "HIGH_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST. " "(This is Microsoft's maximum recommended priority, " "but you could still raise it higher.)") win32_maxpriority.set_self_process_priority_class( win32_maxpriority.HIGH_PRIORITY_CLASS ) win32_maxpriority.set_self_thread_priority( win32_maxpriority.THREAD_PRIORITY_HIGHEST) elif sys.platform.startswith('irix') or sys.platform.startswith('linux') or sys.platform.startswith('posix'): import posix_maxpriority policy = posix_maxpriority.SCHED_FIFO max_priority = posix_maxpriority.sched_get_priority_max( policy ) logger.info("Setting priority for POSIX-compatible platform to " "policy SCHED_FIFO and priority to " "%d"%max_priority) posix_maxpriority.set_self_policy_priority( policy, max_priority ) # Fails if you don't have permission (try running as root) posix_maxpriority.stop_memory_paging() else: raise RuntimeError("Cannot change priority. Unknown platform '%s'"%sys.platform) def linux_but_unknown_drivers(): """Warn that platform is linux, but drivers not known.""" # If you've added support for other drivers to sync with VBLANK under # linux, please let me know how! logger = logging.getLogger('VisionEgg.PlatformDependent') logger.warning("Could not sync buffer swapping to vblank because " "you are running linux but not known/supported " "drivers (only nVidia and recent Mesa DRI Radeon " "currently supported).") def sync_swap_with_vbl_pre_gl_init(): """Try to synchronize buffer swapping and vertical retrace before starting OpenGL.""" success = 0 if sys.platform.startswith("linux"): # Unfotunately, cannot check do glGetString(GL_VENDOR) to # check if drivers are nVidia because we have to do that requires # OpenGL context started, but this variable must be set # before OpenGL context started! # Assume drivers are nVidia or recent ATI VisionEgg.Core.add_gl_assumption("__SPECIAL__","linux_nvidia_or_new_ATI",linux_but_unknown_drivers) # Set for nVidia linux os.environ["__GL_SYNC_TO_VBLANK"] = "1" # Set for recent linux Mesa DRI Radeon os.environ["LIBGL_SYNC_REFRESH"] = "1" success = 1 elif sys.platform.startswith("irix"): # I think this is set using the GLX swap_control SGI # extension. A C extension could be to be written to change # this value. (It probably cannot be set through an OpenGL # extension or an SDL/pygame feature.) logger = logging.getLogger('VisionEgg.PlatformDependent') logger.info("IRIX platform detected, assuming retrace sync.") return success def sync_swap_with_vbl_post_gl_init(): """Try to synchronize buffer swapping and vertical retrace after starting OpenGL.""" success = 0 try: if sys.platform == "win32": import OpenGL.WGL.EXT.swap_control if OpenGL.WGL.EXT.swap_control.wglInitSwapControlARB(): # Returns 1 if it's working OpenGL.WGL.EXT.swap_control.wglSwapIntervalEXT(1) # Swap only at frame syncs if OpenGL.WGL.EXT.swap_control.wglGetSwapIntervalEXT() == 1: success = 1 elif sys.platform == "darwin": try: import _darwin_sync_swap _darwin_sync_swap.sync_swap() success = 1 except Exception,x: logger = logging.getLogger('VisionEgg.PlatformDependent') logger.warning("Failed trying to synchronize buffer " "swapping on darwin: %s: %s"%(str(x.__class__),str(x))) except: pass return success def query_refresh_rate(screen): if sys.platform == 'win32': import win32_getrefresh return win32_getrefresh.getrefresh() elif sys.platform == 'darwin': import darwin_getrefresh return darwin_getrefresh.getrefresh() else: raise NotImplementedError("Platform dependent code to query frame rate not implemented on this platform.") def attempt_to_load_multitexturing(): """Attempt to load multitexturing functions and constants. Inserts the results into the gl module, which makes them globally available.""" logger = logging.getLogger('VisionEgg.PlatformDependent') try: import ctypes if sys.platform.startswith('linux'): libGL = ctypes.cdll.LoadLibrary('/usr/lib/libGL.so') elif sys.platform == 'win32': libGL = ctypes.cdll.LoadLibrary('opengl32.dll') else: raise NotImplementedError("ctypes support not added for this platform") # make sure libGL has the appropriate functions libGL.glGetString.restype = ctypes.c_char_p vers = libGL.glGetString( ctypes.c_int( gl.GL_VERSION ) ) logger.debug("ctypes loaded OpenGL %s"%vers) gl.glActiveTexture = libGL.glActiveTexture gl.glActiveTexture.argtypes = [ctypes.c_int] gl.glMultiTexCoord2f = libGL.glMultiTexCoord2f gl.glMultiTexCoord2f.argtypes = [ctypes.c_int, ctypes.c_float, ctypes.c_float] # assign constants found by looking at gl.h gl.GL_TEXTURE0 = 0x84C0 gl.GL_TEXTURE1 = 0x84C1 logger.debug("ctypes loaded OpenGL library and multitexture names " "are present. Workaround appears successful. ") except Exception, x: logger.debug("ctypes loading of OpenGL library failed %s: " "%s"%(x.__class__, str(x))) if VisionEgg.Core.init_gl_extension('ARB','multitexture'): # copy from extenstion gl.glActiveTexture = gl.glActiveTextureARB gl.glMultiTexCoord2f = gl.glMultiTexCoord2fARB gl.GL_TEXTURE0 = gl.GL_TEXTURE0_ARB gl.GL_TEXTURE1 = gl.GL_TEXTURE1_ARB logger.debug("loaded multitexturing ARB extension") else: logger.warning("multitexturing not available after trying " "ctypes and the OpenGL ARB extension. Some " "features will not be available") visionegg-1.2.1/VisionEgg/posix_maxpriority.c0000644000076500000240000000074411224565530020550 0ustar astrawstaff#include #include #include int set_self_policy_priority( int policy, int priority ); int stop_memory_paging( void ); int set_self_policy_priority( int policy, int priority ) { struct sched_param params; params.sched_priority = priority; return sched_setscheduler(0,policy,¶ms); } int stop_memory_paging( void ) { #if defined(MCL_CURRENT) && defined(MCL_FUTURE) return mlockall( MCL_CURRENT | MCL_FUTURE ); #else return 0; #endif } visionegg-1.2.1/VisionEgg/posix_maxpriority.py0000644000076500000240000000274111224565530020755 0ustar astrawstaff# This file was created automatically by SWIG. # Don't modify this file, modify the SWIG interface instead. # This file is compatible with both classic and new-style classes. import _posix_maxpriority def _swig_setattr_nondynamic(self,class_type,name,value,static=1): if (name == "this"): if isinstance(value, class_type): self.__dict__[name] = value.this if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown del value.thisown return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) if (not static) or hasattr(self,name) or (name == "thisown"): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self,class_type,name,value): return _swig_setattr_nondynamic(self,class_type,name,value,0) def _swig_getattr(self,class_type,name): method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) raise AttributeError,name import types try: _object = types.ObjectType _newclass = 1 except AttributeError: class _object : pass _newclass = 0 del types SCHED_RR = _posix_maxpriority.SCHED_RR SCHED_FIFO = _posix_maxpriority.SCHED_FIFO set_self_policy_priority = _posix_maxpriority.set_self_policy_priority stop_memory_paging = _posix_maxpriority.stop_memory_paging sched_get_priority_max = _posix_maxpriority.sched_get_priority_max visionegg-1.2.1/VisionEgg/posix_maxpriority_wrap.c0000644000076500000240000015070111224565530021600 0ustar astrawstaff/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.24 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #ifndef SWIG_TEMPLATE_DISAMBIGUATOR # if defined(__SUNPRO_CC) # define SWIG_TEMPLATE_DISAMBIGUATOR template # else # define SWIG_TEMPLATE_DISAMBIGUATOR # endif #endif #include /*********************************************************************** * swigrun.swg * * This file contains generic CAPI SWIG runtime support for pointer * type checking. * ************************************************************************/ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "1" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE #define SWIG_QUOTE_STRING(x) #x #define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) #define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else #define SWIG_TYPE_TABLE_NAME #endif #include #ifndef SWIGINLINE #if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline #else # define SWIGINLINE #endif #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the swig runtime code. In 99.9% of the cases, swig just needs to declare them as 'static'. But only do this if is strictly necessary, ie, if you have problems with your compiler or so. */ #ifndef SWIGRUNTIME #define SWIGRUNTIME static #endif #ifndef SWIGRUNTIMEINLINE #define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *); typedef struct swig_type_info *(*swig_dycast_func)(void **); typedef struct swig_type_info { const char *name; swig_converter_func converter; const char *str; void *clientdata; swig_dycast_func dcast; struct swig_type_info *next; struct swig_type_info *prev; } swig_type_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return *f1 - *f2; } return (l1 - f1) - (l2 - f2); } /* Check type equivalence in a name list like ||... */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te) == 0; if (*ne) ++ne; } return equiv; } /* Register a type mapping with the type-checking */ SWIGRUNTIME swig_type_info * SWIG_TypeRegisterTL(swig_type_info **tl, swig_type_info *ti) { swig_type_info *tc, *head, *ret, *next; /* Check to see if this type has already been registered */ tc = *tl; while (tc) { /* check simple type equivalence */ int typeequiv = (strcmp(tc->name, ti->name) == 0); /* check full type equivalence, resolving typedefs */ if (!typeequiv) { /* only if tc is not a typedef (no '|' on it) */ if (tc->str && ti->str && !strstr(tc->str,"|")) { typeequiv = SWIG_TypeEquiv(ti->str,tc->str); } } if (typeequiv) { /* Already exists in the table. Just add additional types to the list */ if (ti->clientdata) tc->clientdata = ti->clientdata; head = tc; next = tc->next; goto l1; } tc = tc->prev; } head = ti; next = 0; /* Place in list */ ti->prev = *tl; *tl = ti; /* Build linked lists */ l1: ret = head; tc = ti + 1; /* Patch up the rest of the links */ while (tc->name) { head->next = tc; tc->prev = head; head = tc; tc++; } if (next) next->prev = head; head->next = next; return ret; } /* Check the typename */ SWIGRUNTIME swig_type_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { swig_type_info *s; if (!ty) return 0; /* Void pointer */ s = ty->next; /* First element always just a name */ do { if (strcmp(s->name,c) == 0) { if (s == ty->next) return s; /* Move s to the top of the linked list */ s->prev->next = s->next; if (s->next) { s->next->prev = s->prev; } /* Insert s as second element in the list */ s->next = ty->next; if (ty->next) ty->next->prev = s; ty->next = s; s->prev = ty; return s; } s = s->next; } while (s && (s != ty->next)); return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_type_info *ty, void *ptr) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Search for a swig_type_info structure */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryTL(swig_type_info *tl, const char *name) { swig_type_info *ty = tl; while (ty) { if (ty->str && (SWIG_TypeEquiv(ty->str,name))) return ty; if (ty->name && (strcmp(name,ty->name) == 0)) return ty; ty = ty->prev; } return 0; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientDataTL(swig_type_info *tl, swig_type_info *ti, void *clientdata) { swig_type_info *tc, *equiv; if (ti->clientdata) return; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; equiv = ti->next; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0)) SWIG_TypeClientDataTL(tl,tc,clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static char hex[17] = "0123456789abcdef"; unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; register unsigned char uu; for (; u != eu; ++u) { uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { register unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register int d = *(c++); register unsigned char uu = 0; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* This function will propagate the clientdata field of type to any new swig_type_info structures that have been added into the list of equivalent types. It is like calling SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientDataTL(swig_type_info *tl, swig_type_info *type) { swig_type_info *equiv = type->next; swig_type_info *tc; if (!type->clientdata) return; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0) && !tc->clientdata) SWIG_TypeClientDataTL(tl,tc, type->clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /*********************************************************************** * common.swg * * This file contains generic SWIG runtime support for pointer * type checking as well as a few commonly used macros to control * external linkage. * * Author : David Beazley (beazley@cs.uchicago.edu) * * Copyright (c) 1999-2000, The University of Chicago * * This file may be freely redistributed without license or fee provided * this copyright message remains intact. ************************************************************************/ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if !defined(STATIC_LINKED) # define SWIGEXPORT(a) __declspec(dllexport) a # else # define SWIGEXPORT(a) a # endif #else # define SWIGEXPORT(a) a #endif #ifdef __cplusplus extern "C" { #endif /*************************************************************************/ /* The static type info list */ static swig_type_info *swig_type_list = 0; static swig_type_info **swig_type_list_handle = &swig_type_list; /* Register a type mapping with the type-checking */ static swig_type_info * SWIG_TypeRegister(swig_type_info *ti) { return SWIG_TypeRegisterTL(swig_type_list_handle, ti); } /* Search for a swig_type_info structure */ static swig_type_info * SWIG_TypeQuery(const char *name) { return SWIG_TypeQueryTL(*swig_type_list_handle, name); } /* Set the clientdata field for a type */ static void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientDataTL(*swig_type_list_handle, ti, clientdata); } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ static void SWIG_PropagateClientData(swig_type_info *type) { SWIG_PropagateClientDataTL(*swig_type_list_handle, type); } #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * SWIG API. Portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * for internal method declarations * ----------------------------------------------------------------------------- */ #ifndef SWIGINTERN #define SWIGINTERN static #endif #ifndef SWIGINTERNSHORT #ifdef __cplusplus #define SWIGINTERNSHORT static inline #else /* C case */ #define SWIGINTERNSHORT static #endif /* __cplusplus */ #endif /* Exception handling in wrappers */ #define SWIG_fail goto fail #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_append_errmsg(msg) SWIG_Python_AddErrMesg(msg,0) #define SWIG_preppend_errmsg(msg) SWIG_Python_AddErrMesg(msg,1) #define SWIG_type_error(type,obj) SWIG_Python_TypeError(type,obj) #define SWIG_null_ref(type) SWIG_Python_NullRef(type) /* Contract support */ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { PyErr_SetString(PyExc_RuntimeError, (char *) msg ); goto fail; } else /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_INT 1 #define SWIG_PY_FLOAT 2 #define SWIG_PY_STRING 3 #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Alloc. memory flags * ----------------------------------------------------------------------------- */ #define SWIG_OLDOBJ 1 #define SWIG_NEWOBJ SWIG_OLDOBJ + 1 #define SWIG_PYSTR SWIG_NEWOBJ + 1 #ifdef __cplusplus } #endif /*********************************************************************** * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * Author : David Beazley (beazley@cs.uchicago.edu) ************************************************************************/ /* Common SWIG API */ #define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Python_ConvertPtr(obj, pp, type, flags) #define SWIG_NewPointerObj(p, type, flags) SWIG_Python_NewPointerObj(p, type, flags) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) /* Python-specific SWIG API */ #define SWIG_ConvertPacked(obj, ptr, sz, ty, flags) SWIG_Python_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Use SWIG_NO_COBJECT_TYPES to force the use of strings to represent C/C++ pointers in the python side. Very useful for debugging, but not always safe. */ #if !defined(SWIG_NO_COBJECT_TYPES) && !defined(SWIG_COBJECT_TYPES) # define SWIG_COBJECT_TYPES #endif /* Flags for pointer conversion */ #define SWIG_POINTER_EXCEPTION 0x1 #define SWIG_POINTER_DISOWN 0x2 #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Create a new pointer string * ----------------------------------------------------------------------------- */ #ifndef SWIG_BUFFER_SIZE #define SWIG_BUFFER_SIZE 1024 #endif #if defined(SWIG_COBJECT_TYPES) #if !defined(SWIG_COBJECT_PYTHON) /* ----------------------------------------------------------------------------- * Implements a simple Swig Object type, and use it instead of PyCObject * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *ptr; const char *desc; } PySwigObject; /* Declarations for objects of type PySwigObject */ SWIGRUNTIME int PySwigObject_print(PySwigObject *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result))) { fputs("", fp); return 0; } else { return 1; } } SWIGRUNTIME PyObject * PySwigObject_repr(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromFormat("", result) : 0; } SWIGRUNTIME PyObject * PySwigObject_str(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromString(result) : 0; } SWIGRUNTIME PyObject * PySwigObject_long(PySwigObject *v) { return PyLong_FromUnsignedLong((unsigned long) v->ptr); } SWIGRUNTIME PyObject * PySwigObject_oct(PySwigObject *v) { char buf[100]; unsigned long x = (unsigned long)v->ptr; if (x == 0) strcpy(buf, "0"); else PyOS_snprintf(buf, sizeof(buf), "0%lo", x); return PyString_FromString(buf); } SWIGRUNTIME PyObject * PySwigObject_hex(PySwigObject *v) { char buf[100]; PyOS_snprintf(buf, sizeof(buf), "0x%lx", (unsigned long)v->ptr); return PyString_FromString(buf); } SWIGRUNTIME int PySwigObject_compare(PySwigObject *v, PySwigObject *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : (i > j) ? 1 : 0; } } SWIGRUNTIME void PySwigObject_dealloc(PySwigObject *self) { PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigObject_GetType() { static char PySwigObject_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods PySwigObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ (binaryfunc)0, /*nb_divide*/ (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ (coercion)0, /*nb_coerce*/ (unaryfunc)PySwigObject_long, /*nb_int*/ (unaryfunc)PySwigObject_long, /*nb_long*/ (unaryfunc)0, /*nb_float*/ (unaryfunc)PySwigObject_oct, /*nb_oct*/ (unaryfunc)PySwigObject_hex, /*nb_hex*/ #if PY_VERSION_HEX >= 0x02000000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #endif }; static int type_init = 0; static PyTypeObject PySwigObject_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigObject", /*tp_name*/ sizeof(PySwigObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigObject_dealloc, /*tp_dealloc*/ (printfunc)PySwigObject_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigObject_compare, /*tp_compare*/ (reprfunc)PySwigObject_repr, /*tp_repr*/ &PySwigObject_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigObject_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigObject_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigObject_Type = tmp; type_init = 1; } return &PySwigObject_Type; } SWIGRUNTIME PyObject * PySwigObject_FromVoidPtrAndDesc(void *ptr, const char *desc) { PySwigObject *self = PyObject_NEW(PySwigObject, PySwigObject_GetType()); if (self == NULL) return NULL; self->ptr = ptr; self->desc = desc; return (PyObject *)self; } SWIGRUNTIMEINLINE void * PySwigObject_AsVoidPtr(PyObject *self) { return ((PySwigObject *)self)->ptr; } SWIGRUNTIMEINLINE const char * PySwigObject_GetDesc(PyObject *self) { return ((PySwigObject *)self)->desc; } SWIGRUNTIMEINLINE int PySwigObject_Check(PyObject *op) { return ((op)->ob_type == PySwigObject_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; const char *desc; size_t size; } PySwigPacked; SWIGRUNTIME int PySwigPacked_print(PySwigPacked *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->desc,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * PySwigPacked_repr(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return PyString_FromFormat("", result, v->desc); } else { return PyString_FromFormat("", v->desc); } } SWIGRUNTIME PyObject * PySwigPacked_str(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return PyString_FromFormat("%s%s", result, v->desc); } else { return PyString_FromFormat("%s", v->desc); } } SWIGRUNTIME int PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : (i > j) ? 1 : 0; return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } } SWIGRUNTIME void PySwigPacked_dealloc(PySwigPacked *self) { free(self->pack); PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigPacked_GetType() { static char PySwigPacked_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static int type_init = 0; static PyTypeObject PySwigPacked_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigPacked", /*tp_name*/ sizeof(PySwigPacked), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigPacked_dealloc, /*tp_dealloc*/ (printfunc)PySwigPacked_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigPacked_compare, /*tp_compare*/ (reprfunc)PySwigPacked_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigPacked_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigPacked_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigPacked_Type = tmp; type_init = 1; } return &PySwigPacked_Type; } SWIGRUNTIME PyObject * PySwigPacked_FromDataAndDesc(void *ptr, size_t size, const char *desc) { PySwigPacked *self = PyObject_NEW(PySwigPacked, PySwigPacked_GetType()); if (self == NULL) { return NULL; } else { void *pack = malloc(size); memcpy(pack, ptr, size); self->pack = pack; self->desc = desc; self->size = size; return (PyObject *) self; } } SWIGRUNTIMEINLINE const char * PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { PySwigPacked *self = (PySwigPacked *)obj; if (self->size != size) return 0; memcpy(ptr, self->pack, size); return self->desc; } SWIGRUNTIMEINLINE const char * PySwigPacked_GetDesc(PyObject *self) { return ((PySwigPacked *)self)->desc; } SWIGRUNTIMEINLINE int PySwigPacked_Check(PyObject *op) { return ((op)->ob_type == PySwigPacked_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); } #else /* ----------------------------------------------------------------------------- * Use the old Python PyCObject instead of PySwigObject * ----------------------------------------------------------------------------- */ #define PySwigObject_GetDesc(obj) PyCObject_GetDesc(obj) #define PySwigObject_Check(obj) PyCObject_Check(obj) #define PySwigObject_AsVoidPtr(obj) PyCObject_AsVoidPtr(obj) #define PySwigObject_FromVoidPtrAndDesc(p, d) PyCObject_FromVoidPtrAndDesc(p, d, NULL) #endif #endif /* ----------------------------------------------------------------------------- * errors manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (PySwigObject_Check(obj)) { const char *otype = (const char *) PySwigObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'PySwigObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? PyString_AsString(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_DECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } SWIGRUNTIMEINLINE void SWIG_Python_NullRef(const char *type) { if (type) { PyErr_Format(PyExc_TypeError, "null reference of type '%s' was received",type); } else { PyErr_Format(PyExc_TypeError, "null reference was received"); } } SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, PyString_AsString(old_str)); } else { PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); } Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; sprintf(mesg, "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; static PyObject *SWIG_this = 0; int newref = 0; PyObject *pyobj = 0; void *vptr; if (!obj) return 0; if (obj == Py_None) { *ptr = 0; return 0; } #ifdef SWIG_COBJECT_TYPES if (!(PySwigObject_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PySwigObject_Check(obj)) { Py_DECREF(obj); goto type_error; } } vptr = PySwigObject_AsVoidPtr(obj); c = (const char *) PySwigObject_GetDesc(obj); if (newref) { Py_DECREF(obj); } goto type_check; #else if (!(PyString_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PyString_Check(obj)) { Py_DECREF(obj); goto type_error; } } c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackVoidPtr(c, &vptr, ty->name); if (newref) { Py_DECREF(obj); } if (!c) goto type_error; #endif type_check: if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; *ptr = SWIG_TypeCast(tc,vptr); } else { *ptr = vptr; } if ((pyobj) && (flags & SWIG_POINTER_DISOWN)) { PyObject_SetAttrString(pyobj,(char*)"thisown",Py_False); } return 0; type_error: PyErr_Clear(); if (pyobj && !obj) { obj = pyobj; if (PyCFunction_Check(obj)) { /* here we get the method pointer for callbacks */ char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); c = doc ? strstr(doc, "swig_ptr: ") : 0; if (c) { c = SWIG_UnpackVoidPtr(c + 10, &vptr, ty->name); if (!c) goto type_error; goto type_check; } } } if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ pointer", obj); } } return -1; } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } } return result; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) c = PySwigPacked_UnpackData(obj, ptr, sz); #else if ((!obj) || (!PyString_Check(obj))) goto type_error; c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackDataName(c, ptr, sz, ty->name); #endif if (!c) goto type_error; if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return 0; type_error: PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ packed data", obj); } } return -1; } /* Create a new array object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int own) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #ifdef SWIG_COBJECT_TYPES robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackVoidPtr(result, ptr, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif if (!robj || (robj == Py_None)) return robj; if (type->clientdata) { PyObject *inst; PyObject *args = Py_BuildValue((char*)"(O)", robj); Py_DECREF(robj); inst = PyObject_CallObject((PyObject *) type->clientdata, args); Py_DECREF(args); if (inst) { if (own) { PyObject_SetAttrString(inst,(char*)"thisown",Py_True); } robj = inst; } } return robj; } SWIGRUNTIME PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) robj = PySwigPacked_FromDataAndDesc((void *) ptr, sz, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackDataName(result, ptr, sz, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif return robj; } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_type_info ** SWIG_Python_GetTypeListHandle() { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } } #endif return (swig_type_info **) type_pointer; } /* Search for a swig_type_info structure */ SWIGRUNTIMEINLINE swig_type_info * SWIG_Python_GetTypeList() { swig_type_info **tlh = SWIG_Python_GetTypeListHandle(); return tlh ? *tlh : (swig_type_info*)0; } #define SWIG_Runtime_GetTypeList SWIG_Python_GetTypeList #ifdef __cplusplus } #endif /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_char swig_types[0] #define SWIGTYPE_size_t swig_types[1] #define SWIGTYPE_ptrdiff_t swig_types[2] static swig_type_info *swig_types[4]; /* -------- TYPES TABLE (END) -------- */ /*----------------------------------------------- @(target):= _posix_maxpriority.so ------------------------------------------------*/ #define SWIG_init init_posix_maxpriority #define SWIG_name "_posix_maxpriority" #include #include #include /*@/usr/share/swig1.3/python/pymacros.swg,66,SWIG_define@*/ #define SWIG_From_int PyInt_FromLong /*@@*/ int set_self_policy_priority(int,int); #include SWIGINTERN int SWIG_CheckLongInRange(long value, long min_value, long max_value, const char *errmsg) { if (value < min_value) { if (errmsg) { PyErr_Format(PyExc_OverflowError, "value %ld is less than '%s' minimum %ld", value, errmsg, min_value); } return 0; } else if (value > max_value) { if (errmsg) { PyErr_Format(PyExc_OverflowError, "value %ld is greater than '%s' maximum %ld", value, errmsg, max_value); } return 0; } return 1; } SWIGINTERN int SWIG_AsVal_long(PyObject * obj, long* val) { if (PyInt_Check(obj)) { if (val) *val = PyInt_AS_LONG(obj); return 1; } if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return 1; } else { if (!val) PyErr_Clear(); return 0; } } if (val) { SWIG_type_error("long", obj); } return 0; } #if INT_MAX != LONG_MAX SWIGINTERN int SWIG_AsVal_int(PyObject *obj, int *val) { const char* errmsg = val ? "int" : (char*)0; long v; if (SWIG_AsVal_long(obj, &v)) { if (SWIG_CheckLongInRange(v, INT_MIN,INT_MAX, errmsg)) { if (val) *val = (int)(v); return 1; } else { return 0; } } else { PyErr_Clear(); } if (val) { SWIG_type_error(errmsg, obj); } return 0; } #else SWIGINTERNSHORT int SWIG_AsVal_int(PyObject *obj, int *val) { return SWIG_AsVal_long(obj,(long*)val); } #endif SWIGINTERNSHORT int SWIG_As_int(PyObject* obj) { int v; if (!SWIG_AsVal_int(obj, &v)) { /* this is needed to make valgrind/purify happier. */ memset((void*)&v, 0, sizeof(int)); } return v; } SWIGINTERNSHORT int SWIG_Check_int(PyObject* obj) { return SWIG_AsVal_int(obj, (int*)0); } int stop_memory_paging(); int sched_get_priority_max(int); #ifdef __cplusplus extern "C" { #endif static PyObject *_wrap_set_self_policy_priority(PyObject *self, PyObject *args) { PyObject *resultobj; int arg1 ; int arg2 ; int result; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if(!PyArg_ParseTuple(args,(char *)"OO:set_self_policy_priority",&obj0,&obj1)) goto fail; { arg1 = (int)(SWIG_As_int(obj0)); if (SWIG_arg_fail(1)) SWIG_fail; } { arg2 = (int)(SWIG_As_int(obj1)); if (SWIG_arg_fail(2)) SWIG_fail; } { errno = 0; result = (int)set_self_policy_priority(arg1,arg2); if (errno) { PyErr_SetFromErrno(PyExc_OSError); goto fail; // this line supported on swig 1.3.17 } } { resultobj = SWIG_From_int((int)(result)); } return resultobj; fail: return NULL; } static PyObject *_wrap_stop_memory_paging(PyObject *self, PyObject *args) { PyObject *resultobj; int result; if(!PyArg_ParseTuple(args,(char *)":stop_memory_paging")) goto fail; { errno = 0; result = (int)stop_memory_paging(); if (errno) { PyErr_SetFromErrno(PyExc_OSError); goto fail; // this line supported on swig 1.3.17 } } { resultobj = SWIG_From_int((int)(result)); } return resultobj; fail: return NULL; } static PyObject *_wrap_sched_get_priority_max(PyObject *self, PyObject *args) { PyObject *resultobj; int arg1 ; int result; PyObject * obj0 = 0 ; if(!PyArg_ParseTuple(args,(char *)"O:sched_get_priority_max",&obj0)) goto fail; { arg1 = (int)(SWIG_As_int(obj0)); if (SWIG_arg_fail(1)) SWIG_fail; } { errno = 0; result = (int)sched_get_priority_max(arg1); if (errno) { PyErr_SetFromErrno(PyExc_OSError); goto fail; // this line supported on swig 1.3.17 } } { resultobj = SWIG_From_int((int)(result)); } return resultobj; fail: return NULL; } static PyMethodDef SwigMethods[] = { { (char *)"set_self_policy_priority", _wrap_set_self_policy_priority, METH_VARARGS, NULL}, { (char *)"stop_memory_paging", _wrap_stop_memory_paging, METH_VARARGS, NULL}, { (char *)"sched_get_priority_max", _wrap_sched_get_priority_max, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_char[] = {{"_p_char", 0, "char *", 0, 0, 0, 0},{"_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__size_t[] = {{"_size_t", 0, "size_t", 0, 0, 0, 0},{"_size_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__ptrdiff_t[] = {{"_ptrdiff_t", 0, "ptrdiff_t", 0, 0, 0, 0},{"_ptrdiff_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info *swig_types_initial[] = { _swigt__p_char, _swigt__size_t, _swigt__ptrdiff_t, 0 }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; static PyObject * swig_varlink_repr(swig_varlinkobject *v) { v = v; return PyString_FromString(""); } static int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) { swig_globalvar *var; flags = flags; fprintf(fp,"Swig global variables { "); for (var = v->vars; var; var=var->next) { fprintf(fp,"%s", var->name); if (var->next) fprintf(fp,", "); } fprintf(fp," }\n"); return 0; } static PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->get_attr)(); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return NULL; } static int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->set_attr)(p); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return 1; } static PyTypeObject varlinktype = { PyObject_HEAD_INIT(0) 0, /* Number of items in variable part (ob_size) */ (char *)"swigvarlink", /* Type name (tp_name) */ sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ 0, /* Itemsize (tp_itemsize) */ 0, /* Deallocator (tp_dealloc) */ (printfunc) swig_varlink_print, /* Print (tp_print) */ (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ 0, /* tp_doc */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; /* Create a variable linking object for use later */ static PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = 0; result = PyMem_NEW(swig_varlinkobject,1); varlinktype.ob_type = &PyType_Type; /* Patch varlinktype into a PyType */ result->ob_type = &varlinktype; result->vars = 0; result->ob_refcnt = 0; Py_XINCREF((PyObject *) result); return ((PyObject*) result); } static void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v; swig_globalvar *gv; v= (swig_varlinkobject *) p; gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); gv->name = (char *) malloc(strlen(name)+1); strcpy(gv->name,name); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; v->vars = gv; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ static void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_PY_INT: obj = PyInt_FromLong(constants[i].lvalue); break; case SWIG_PY_FLOAT: obj = PyFloat_FromDouble(constants[i].dvalue); break; case SWIG_PY_STRING: if (constants[i].pvalue) { obj = PyString_FromString((char *) constants[i].pvalue); } else { Py_INCREF(Py_None); obj = Py_None; } break; case SWIG_PY_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d,constants[i].name,obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ static void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { char *c = methods[i].ml_doc; if (c && (c = strstr(c, "swig_ptr: "))) { int j; swig_const_info *ci = 0; char *name = c + 10; for (j = 0; const_table[j].type; j++) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); char *buff = ndoc; void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue: (void *)(ci->lvalue); strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } /* -----------------------------------------------------------------------------* * Initialize type list * -----------------------------------------------------------------------------*/ #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ static int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return -1; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return -1; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return -1; } if (PyDict_SetItemString(dict, name, o)) return -1; Py_DECREF(o); return 0; } #endif static swig_type_info ** SWIG_Python_SetTypeListHandle(swig_type_info **type_list_handle) { static PyMethodDef swig_empty_runtime_method_table[] = { { NULL, NULL, 0, NULL } };/* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); PyObject *pointer = PyCObject_FromVoidPtr((void *) type_list_handle, NULL); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } return type_list_handle; } static swig_type_info ** SWIG_Python_LookupTypePointer(swig_type_info **type_list_handle) { swig_type_info **type_pointer; /* first check if module already created */ type_pointer = SWIG_Python_GetTypeListHandle(); if (type_pointer) { return type_pointer; } else { /* create a new module and variable */ return SWIG_Python_SetTypeListHandle(type_list_handle); } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void *) SWIG_ReturnGlobalTypeList(void *); #endif #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void) SWIG_init(void) { static PyObject *SWIG_globals = 0; static int typeinit = 0; PyObject *m, *d; int i; if (!SWIG_globals) SWIG_globals = SWIG_newvarlink(); /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_types_initial); m = Py_InitModule((char *) SWIG_name, SwigMethods); d = PyModule_GetDict(m); if (!typeinit) { #ifdef SWIG_LINK_RUNTIME swig_type_list_handle = (swig_type_info **) SWIG_ReturnGlobalTypeList(swig_type_list_handle); #else # ifndef SWIG_STATIC_RUNTIME swig_type_list_handle = SWIG_Python_LookupTypePointer(swig_type_list_handle); # endif #endif for (i = 0; swig_types_initial[i]; i++) { swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); } typeinit = 1; } SWIG_InstallConstants(d,swig_const_table); { PyDict_SetItemString(d,"SCHED_RR", SWIG_From_int((int)(SCHED_RR))); } { PyDict_SetItemString(d,"SCHED_FIFO", SWIG_From_int((int)(SCHED_FIFO))); } } visionegg-1.2.1/VisionEgg/PyroApps/0000755000076500000240000000000011231315556016342 5ustar astrawstaffvisionegg-1.2.1/VisionEgg/PyroApps/__init__.py0000755000076500000240000000057311224565527020472 0ustar astrawstaff# # The Vision Egg: PyroApps # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ """ VisionEgg subpackage providing support for demo applications based on Pyro """ visionegg-1.2.1/VisionEgg/PyroApps/AST_ext.py0000644000076500000240000002056411224565527020241 0ustar astrawstaff## Automatically adapted for numpy.oldnumeric Jun 18, 2007 by alter_code1.py # The Vision Egg: AST_ext # # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd # # Authors: Imran S. Ali, Lachlan Dowd # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ # This "AST extensions" module works for Python 2.2.1 # Because the structure of code trees changes with different Python versions, this module may not work with some # previous Python releases, or future releases. import pprint import parser import symbol import token import tokenize import sys # Hopefully, the node ID numbers in the name sequence is all that # needs to be changed in order to get this module working with # different Python release versions. name_sequence = [292, 293, 294, 295, 297, 298, 299, 300, 301, 302, 303, 304, 305] # Method for generating an AST sub tree (in list form) suitable for a def gen_assign_val_subtree(assign_val, assign_val_type): name_sequence.reverse() sublist = [] if assign_val_type == 2: sublist = [2, '%(assign_val)d' % vars()] elif assign_val_type == 1: sublist = [2, '%(assign_val)f' % vars()] elif assign_val_type == 3: sublist = [3, '"%(assign_val)s"' % vars()] for val in name_sequence[0:len(name_sequence) - 1]: sublist = [val, sublist] name_sequence.reverse() return sublist class AST_Visitor: def __init__(self, modifying_AST): # Flags: # Checking assignment name (ie. "x = ..." where we are # checking if 'x' == 'assign_name'): self.checking_assign_name = 0 # Setting assignment value (we are changing a found occurrence # of "assign_name = x" to "assign_name = assign_val"): self.setting_assign_val = 0 # Index of where the AST visitor is currently at in the # 'name_sequence' defined earlier: self.name_seq_index = 0 # AST visitor expects a subtree associated with # assignment/"=": self.expecting_equals = 0 # Extracting assignment value (we are extracting the 'x' from # a found occurrence of "assign_name = x"): self.extracting_assign_val = 0 # Extracted assignment value: self.extracted_val = "not found" # Are we modifying an AST? Otherwise we're extracting # information from an AST: self.modifying_AST = modifying_AST def traverse(self, AST_sublist, assign_name, assign_val_subtree): # If we have a single element (terminating leaf node): if type(AST_sublist) != list: return AST_sublist # If we have a sub tree of the form [x, [....]]: elif len(AST_sublist) == 2: # If we are somewhere in the 'name_sequence' defined # earlier: [292, [293, [294, [295, [297, [298, [299, [300, # [301, [302, [303, [304, [305, ... if self.name_seq_index > 0: # If we are at the end of the 'name_sequence': if self.name_seq_index == len(name_sequence) - 1 and AST_sublist[0] == name_sequence[self.name_seq_index]: if len(AST_sublist[1]) == 3: if self.extracting_assign_val == 1: extracted_val = AST_sublist[1][1] self.extracted_val = extracted_val self.extracting_assign_val = 0 else: # Enter new mode: AST visitor will check # the name associated with the # 'name_sequence' to see if it will match # 'assign_name': self.checking_assign_name = 1 self.name_seq_index = 0 else: expected_val = name_sequence[self.name_seq_index] if AST_sublist[0] == expected_val: # Update position in 'name_sequence': self.name_seq_index = self.name_seq_index + 1 else: self.name_seq_index = 0 return AST_sublist[0:1] + [self.traverse(AST_sublist[1], assign_name, assign_val_subtree)] # Else we are in some arbitrary sequence: # [a, [b, [c, [d, [e, [... else: # If we are at the start of the 'name_sequence': if AST_sublist[0] == 292: if self.setting_assign_val == 1: AST_sublist[1] = assign_val_subtree self.setting_assign_val = 0 else: # Enter new mode: AST visitor will check to # see if we are progressing through the # 'name_sequence' defined earlier: self.name_seq_index = 1 return AST_sublist[0:1] + [self.traverse(AST_sublist[1], assign_name, assign_val_subtree)] else: return AST_sublist[0:1] + [self.traverse(AST_sublist[1], assign_name, assign_val_subtree)] # If we have a sub tree with 3 parent nodes: elif len(AST_sublist) == 3: # If the second parent node is a single element # (terminating leaf node): if type(AST_sublist[1]) != list: # If the current AST visitor mode is set to checking # for equality with "assign_name" (ie. "x = ..." where # we are checking if 'x' == 'assign_name'):: if self.checking_assign_name == 1: # If 'x' == 'assign_name' (see above): if AST_sublist[1] == assign_name: # Enter new mode: AST visitor will check to # see if the current sub tree is associated # with assignment/"=": self.expecting_equals = 1 self.checking_assign_name = 0 # If the current AST visitor mode is set to check if # the current sub tree is associated with # assignment/"=": elif self.expecting_equals == 1: # If the current AST sub tree is associated with # assignment/"=": if AST_sublist[1] == '=': if self.modifying_AST == 1: # Enter new mode: AST visitor will change # the assignment value to # "assign_val_subtree": self.setting_assign_val = 1 elif self.modifying_AST == 0: # Enter new mode: AST visitor will extract # the assignment value of "assign_name": self.extracting_assign_val = 1 self.expecting_equals = 0 return AST_sublist[0:2] # If we are somewhere within the 'name_sequence': if self.name_seq_index > 0 or self.name_seq_index < len(name_sequence) - 1: # If the AST visitor is extracting the value of "assign_name": if self.extracting_assign_val == 1: self.extracted_val = "compound" self.extracting_assign_val = 0 # For all other types of sub trees, AST visitor will traverse # in a depth first search pattern: sub_list = [] for x in AST_sublist: sub_list = sub_list + [self.traverse(x, assign_name, assign_val_subtree)] return sub_list def modify_AST(myAST, assign_name, assign_val): myAST_Visitor = AST_Visitor(1) old_AST_list = myAST.tolist(1) assign_val_type = 0 if isinstance(assign_val, int): assign_val_type = 2 elif isinstance(assign_val, float): assign_val_type = 1 elif type(assign_val) == str: assign_val_type = 3 new_AST_list = myAST_Visitor.traverse(old_AST_list, assign_name, gen_assign_val_subtree(assign_val, assign_val_type)) myNewAST = parser.sequence2ast(new_AST_list) return myNewAST # Extract the assigned value of a variable from an AST. Retains the type. def extract_from_AST(myAST, assign_name): myAST_Visitor = AST_Visitor(0) old_AST_list = myAST.tolist(1) new_AST_list = myAST_Visitor.traverse(old_AST_list, assign_name, 0) return myAST_Visitor.extracted_val visionegg-1.2.1/VisionEgg/PyroApps/ColorCalGUI.py0000644000076500000240000000625711227360015020764 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: ColorCalGUI # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ """Handle luminance and color calibration stimulus (client-side)""" import VisionEgg, string import sys, os import Tkinter import VisionEgg.PyroApps.EPhysGUIUtils as client_utils def get_control_list(): return [("color_cal_server",ColorCalControlFrame,ColorCalControlFrame.title)] class ColorCalMetaParameters: def __init__(self): self.color = (1.0, 1.0, 1.0, 0.0) class ColorCalControlFrame(client_utils.StimulusControlFrame): title = "Color Calibration" def __init__(self, master=None, suppress_go_buttons=0,**kw): client_utils.StimulusControlFrame.__init__(self, master, suppress_go_buttons, ColorCalControlFrame.title, ColorCalMetaParameters, **kw) param_frame = self.param_frame # shorthand for self.param_frame created in base class # Allow columns to expand param_frame.columnconfigure(0,weight=1) param_frame.columnconfigure(1,weight=1) pf_row = 0 Tkinter.Label(param_frame,text="Red:").grid(row=pf_row,column=0) self.red_tk_var = Tkinter.DoubleVar() self.red_tk_var.set(self.meta_params.color[0]) self.make_callback_entry(textvariable=self.red_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Green:").grid(row=pf_row,column=0) self.green_tk_var = Tkinter.DoubleVar() self.green_tk_var.set(self.meta_params.color[1]) self.make_callback_entry(textvariable=self.green_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Blue:").grid(row=pf_row,column=0) self.blue_tk_var = Tkinter.DoubleVar() self.blue_tk_var.set(self.meta_params.color[2]) self.make_callback_entry(textvariable=self.blue_tk_var).grid(row=pf_row,column=1) def get_shortname(self): return "color_cal" def update_tk_vars(self): self.red_tk_var.set( self.meta_params.color[0] ) self.green_tk_var.set( self.meta_params.color[1] ) self.blue_tk_var.set( self.meta_params.color[2] ) def send_values(self,dummy_arg=None): self.meta_params.color = ( self.red_tk_var.get(), self.green_tk_var.get(), self.blue_tk_var.get(), 0.0 ) if self.connected: self.meta_controller.set_parameters( self.meta_params ) def get_duration_sec(self): return 0.0 if __name__=='__main__': frame = ColorCalControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/ColorCalServer.py0000644000076500000240000000514211227360015021576 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: ColorCalServer # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ """Handle luminance and color calibration stimulus (server-side)""" import VisionEgg, string import sys, os, math import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.PyroHelpers import Pyro.core import pygame, pygame.locals from VisionEgg.PyroApps.ColorCalGUI import ColorCalMetaParameters class ColorCalMetaController( Pyro.core.ObjBase ): def __init__(self,screen,presentation,stimuli): Pyro.core.ObjBase.__init__(self) self.meta_params = ColorCalMetaParameters() if not isinstance(screen,VisionEgg.Core.Screen): raise ValueError("Expecting instance of VisionEgg.Core.Screen") if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") self.screen = screen self.p = presentation self.update() # set stimulus parameters to initial defaults def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, ColorCalMetaParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of ColorCalMetaParameters") self.update() def update(self): self.screen.parameters.bgcolor = self.meta_params.color def go(self): pass def quit_server(self): self.p.parameters.quit = 1 def get_meta_controller_class(): return ColorCalMetaController def make_stimuli(): return [] def get_meta_controller_stimkey(): return "color_cal_server" # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() screen = VisionEgg.Core.Screen.create_default() # get Vision Egg stimulus ready to go p = VisionEgg.FlowControl.Presentation() stimuli = make_stimuli() # now hand over control of grating and mask to FlatGratingExperimentMetaController meta_controller = ColorCalMetaController(screen,p,stimuli) pyro_server.connect(meta_controller,get_meta_controller_stimkey()) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/VisionEgg/PyroApps/DropinGUI.py0000644000076500000240000001105711224565527020527 0ustar astrawstaff# The Vision Egg: DropinGUI # # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd, Andrew Straw # Copyright (C) 2004 California Institute of Technology # # Authors: Imran S. Ali, Lachlan Dowd, Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ import VisionEgg, string import sys, os import Tkinter import tkMessageBox import VisionEgg.PyroApps.VarTypes as VarTypes import VisionEgg.PyroApps.EPhysGUIUtils as client_utils def get_control_list(): return [("dropin_server",DropinControlFrame,DropinControlFrame.title)] class DropinMetaParameters: def __init__(self): self.vars_list = [] class DropinControlFrame(client_utils.StimulusControlFrame): title = "Vision Egg Script" def __init__(self, master=None, suppress_go_buttons=0,**kw): client_utils.StimulusControlFrame.__init__(self, master, suppress_go_buttons, DropinControlFrame.title, DropinMetaParameters, **kw) param_frame = self.param_frame # shorthand for self.param_frame created in base class param_frame.columnconfigure(0,weight=1) param_frame.columnconfigure(1,weight=1) self.vars_list = [] self.error_names = [] def get_shortname(self): return "dropin" def update_tk_vars(self): pass def send_values(self,dummy_arg=None): self.meta_params.vars_list = [] self.error_names = [] if self.vars_list is None: return 0 for var in self.vars_list: if len(var) == 3: var_type = var[0] var_name = var[1] var_val_holder = var[2] var_val = var_val_holder.get() try: if var_val == "compound": pass else: if VarTypes.getType(var_type) == "float": var_typed_val = float(var_val) elif VarTypes.getType(var_type) == "integer": var_typed_val = int(float(var_val)) elif VarTypes.getType(var_type) == "string": var_typed_val = var_val else: raise ValueError() self.meta_params.vars_list.append([var_name, var_typed_val]) except ValueError: self.error_names.append(var_name) if len(self.error_names) == 0: self.meta_controller.set_parameters( self.meta_params ) return 1 else: all_error_names = "Invalid value(s) for the following variable(s):\n" for error_name in self.error_names: all_error_names = all_error_names + error_name + "\n" tkMessageBox.showerror("Invalid value(s)", all_error_names) return 0 def get_duration_sec(self): # XXX not implemented yet return -1 # Creates the variable Entry and Label widgets: def gen_var_widgets(self, demoscript_filename, vars_list): self.vars_list = vars_list param_frame = self.param_frame # shorthand for self.param_frame created in base class if demoscript_filename is None: label = "No demo file loaded" else: label = demoscript_filename Tkinter.Label(param_frame, text=label, font=("Helvetica",8,"bold")).grid(row=0,columnspan=2) row_num = 1 if self.vars_list is None: return for var in self.vars_list: var_label = Tkinter.Label(param_frame,text=var[1]).grid(row=row_num,column=0) # Create a Tkinter string variable holder: var_val_holder = Tkinter.StringVar() # Set to its value: var_val_holder.set(var[2]) # Create (indirectly) Entry widgets: # Render variables which were "not found" as non-modifiable for user: if var[2] == "not found": self.make_callback_entry(textvariable=var_val_holder, state="disabled").grid(row=row_num,column=1) del var[2] else: self.make_callback_entry(textvariable=var_val_holder).grid(row=row_num,column=1) var[2] = var_val_holder row_num = row_num + 1 if __name__=='__main__': frame = DropinControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/DropinServer.py0000644000076500000240000000303511224565527021346 0ustar astrawstaff# The Vision Egg: DropinServer # # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd, Andrew Straw # Copyright (C) 2004 California Institute of Technology # # Authors: Imran S. Ali, Lachlan Dowd, Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ import VisionEgg, string import sys, os, math import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.Textures import VisionEgg.SphereMap import VisionEgg.PyroHelpers import Pyro.core from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters from VisionEgg.PyroApps.DropinGUI import DropinMetaParameters class DropinMetaController( Pyro.core.ObjBase ): def __init__(self,screen,presentation,stimuli): Pyro.core.ObjBase.__init__(self) self.meta_params = DropinMetaParameters() self.p = presentation print 'DropinMetaController presentation',self.p def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): self.meta_params = new_parameters self.update() def update(self): pass def go(self): self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 def get_meta_controller_class(): return DropinMetaController def make_stimuli(): pass def get_meta_controller_stimkey(): return "dropin_server" visionegg-1.2.1/VisionEgg/PyroApps/EPhysGUI.py0000755000076500000240000023064711227360015020323 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: EPhysGUI # # Copyright (C) 2001-2004 Andrew Straw. # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd # Copyright (C) 2004, 2008 California Institute of Technology # # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # import VisionEgg import sys, socket, re, time, string, types, os import parser, symbol, token, compiler import pickle, random, math, threading import Tkinter, tkMessageBox, tkSimpleDialog, tkFileDialog import StringIO import Pyro import numpy import VisionEgg import VisionEgg.PyroClient import VisionEgg.PyroApps.ScreenPositionGUI import VisionEgg.GUI import VisionEgg.ParameterTypes as ve_types # Add your client modules here import VisionEgg.PyroApps.TargetGUI import VisionEgg.PyroApps.MouseTargetGUI import VisionEgg.PyroApps.FlatGratingGUI import VisionEgg.PyroApps.SphereGratingGUI import VisionEgg.PyroApps.SpinningDrumGUI import VisionEgg.PyroApps.GridGUI import VisionEgg.PyroApps.ColorCalGUI import VisionEgg.PyroApps.DropinGUI import VisionEgg.PyroApps.AST_ext as AST_ext import VisionEgg.PyroApps.VarTypes as VarTypes client_list = [] client_list.extend( VisionEgg.PyroApps.TargetGUI.get_control_list() ) client_list.extend( VisionEgg.PyroApps.MouseTargetGUI.get_control_list() ) client_list.extend( VisionEgg.PyroApps.FlatGratingGUI.get_control_list() ) client_list.extend( VisionEgg.PyroApps.SphereGratingGUI.get_control_list() ) client_list.extend( VisionEgg.PyroApps.SpinningDrumGUI.get_control_list() ) client_list.extend( VisionEgg.PyroApps.GridGUI.get_control_list() ) client_list.extend( VisionEgg.PyroApps.ColorCalGUI.get_control_list() ) client_list.extend( VisionEgg.PyroApps.DropinGUI.get_control_list() ) class ContainedObjectBase: """Base class to encapsulate objects, provides useful methods when used in GUI""" def __init__(self): raise RuntimeError("Abstract base class!") def get_str_30(self): return "**** this is a generic str_30 ****" def get_contained(self): return self.contained header = "unknown parameters" class ScrollListFrame(Tkinter.Frame): def __init__(self,master=None,list_of_contained_objects=None,contained_objectbject_maker=None, container_class=ContainedObjectBase, **cnf): Tkinter.Frame.__init__(self, master, **cnf) if list_of_contained_objects is None: self.list = [] else: self.list = list_of_contained_objects self.container_class = container_class # allow column to expand self.columnconfigure(0,weight=1) # The frame that has the list and the vscroll self.frame = Tkinter.Frame(self,borderwidth=2) self.frame.grid(row=0,sticky="nwes") # allow column to expand self.frame.columnconfigure(0,weight=1) self.frame.vscroll = Tkinter.Scrollbar(self.frame,orient=Tkinter.VERTICAL) self.frame.hscroll = Tkinter.Scrollbar(self.frame,orient=Tkinter.HORIZONTAL) self.frame.title = Tkinter.Listbox( self.frame, relief=Tkinter.FLAT, font=('courier',10,'bold'), height=1, # selectbackground='#eed5b7', # selectborderwidth=0, # selectmode=None, exportselection=0) self.frame.title.insert(Tkinter.END, self.container_class.header) self.frame.list = Tkinter.Listbox( self.frame, relief=Tkinter.SUNKEN, font=('courier',10,'normal'), width=40, height=10, selectbackground='#eed5b7', selectborderwidth=0, selectmode=Tkinter.BROWSE, xscroll=self.frame.hscroll.set, yscroll=self.frame.vscroll.set, exportselection=0) self.frame.hscroll['command'] = self.delegate_hscroll self.frame.hscroll.grid(row=3,column=0,sticky='we') self.frame.vscroll['command'] = self.frame.list.yview self.frame.vscroll.grid(row=2,column=1,sticky='ns') self.frame.title.grid(row=1,column=0,ipady=0,pady=0,sticky='we') self.frame.list.grid(row=2,column=0,sticky='nwes') self.frame.list.bind('',self.edit_selected) # The buttons on bottom self.bar = Tkinter.Frame(self,borderwidth=2) self.bar.grid(row=1,sticky="we") self.bar.add = Tkinter.Button(self.bar,text='Add...',command=self.add_new) self.bar.add.grid(row=0,column=0,sticky='we') self.bar.edit = Tkinter.Button(self.bar,text='Edit...',command=self.edit_selected) self.bar.edit.grid(row=0,column=1,sticky='we') self.bar.remove = Tkinter.Button(self.bar,text='Remove',command=self.remove_selected) self.bar.remove.grid(row=0,column=2,sticky='we') self.bar.move_up = Tkinter.Button(self.bar,text='Up',command=self.move_selected_up) self.bar.move_up.grid(row=0,column=3,sticky='we') self.bar.move_down = Tkinter.Button(self.bar,text='Down',command=self.move_selected_down) self.bar.move_down.grid(row=0,column=4,sticky='we') self.bar.tk_menuBar(self.bar.add,self.bar.remove) #Lachie- My bar for setting parent self.bar.merge = Tkinter.Button(self.bar,text='Merge/Unmerge',command=self.make_merge) self.bar.merge.grid(row=0,column=5,sticky='we') self.bar.tk_menuBar(self.bar.add,self.bar.remove) self.update_now() def list2D_coordinates(self, main_index, main_list): # This is a function for finding the 2-d # list coordinates of an element which may be inside a # list-nested-list. # eg. if x = [[e, e, e], [e], [e, e]] # Then the coordinates of the element at index 4 is: (2, 0) # # Initialization: i = -1 j = -1 element_count = 0 # Main body: for nested_list in main_list: j = -1 i = i + 1 for element in nested_list: j = j + 1 element_count = element_count + 1 if (element_count - 1) == main_index: return [i, j] # Unsuccessful exit: return [-1, -1] def delegate_hscroll(self,*args,**kw): self.frame.title.xview(*args,**kw) self.frame.list.xview(*args,**kw) def get_list_uncontained(self): results = [] for contained_object_item in self.list: #results.append( contained_object_item.get_contained() ) results.append( contained_object_item ) return results def update_now(self): self.frame.list.delete(0,Tkinter.END) max_len = 0 for loop_container in self.list: for loop in loop_container: item_str_30 = loop.get_str_30() max_len = max(max_len,len(item_str_30)) self.frame.list.insert(Tkinter.END,item_str_30) self.frame.list.insert(Tkinter.END,"") self.frame.title.delete(0,Tkinter.END) self.frame.title.insert(Tkinter.END, self.container_class.header.ljust(max_len)) def add_new(self): contained_object = self.make_contained_object(self.container_class) if contained_object: self.list.append( [contained_object] ) self.update_now() def edit_selected(self,dummy_arg=None): selected = self.get_selected() # Get 2-D list coordinates of selected object of class "LoopContainedObject": loop_coordinates = self.list2D_coordinates(selected, self.list) main_list_index = loop_coordinates[0] loop_list_index = loop_coordinates[1] if selected is not None: if len(self.list[main_list_index]) == 1: orig_contained_object = self.list[main_list_index][loop_list_index] modified_contained_object = self.edit_contained_object( orig_contained_object ) if modified_contained_object is not None: # "Cancel" press results in None self.list[main_list_index][loop_list_index] = modified_contained_object self.update_now() else: tkMessageBox.showerror("Cannot edit this variable", "This variable needs to be isolated/unmerged") def remove_selected(self): selected = self.get_selected() # Get 2-D list coordinates of selected object of class "LoopContainedObject": loop_coordinates = self.list2D_coordinates(selected, self.list) main_list_index = loop_coordinates[0] loop_list_index = loop_coordinates[1] if selected is not None: del self.list[main_list_index][loop_list_index] if self.list[main_list_index] == []: del self.list[main_list_index] self.update_now() def move_selected_up(self,dummy_arg=None): selected = self.get_selected() # Get 2-D list coordinates of selected object of class "LoopContainedObject": loop_coordinates = self.list2D_coordinates(selected, self.list) main_list_index = loop_coordinates[0] loop_list_index = loop_coordinates[1] new_selected_index = selected if selected is not None: # If the selected variable is first in its "loop_list": if loop_list_index == 0: # If not the first "loop_list": if main_list_index != 0: # Then we move up the entire "loop_list": selected_loop_list = self.list[main_list_index] del self.list[main_list_index] new_main_list_index = main_list_index - 1 self.list.insert(new_main_list_index, selected_loop_list) new_selected_index = selected - len(self.list[main_list_index]) self.update_now() # Else we just move up a variable within a "loop_list": else: selected_loop_container = self.list[main_list_index][loop_list_index] del self.list[main_list_index][loop_list_index] new_loop_list_index = loop_list_index - 1 self.list[main_list_index].insert(new_loop_list_index, selected_loop_container) new_selected_index = selected - 1 self.update_now() new_selected_index = self.map_to_listbox_index(new_selected_index) self.frame.list.selection_set(new_selected_index) def move_selected_down(self,dummy_arg=None): selected = self.get_selected() # Get 2-D list coordinates of selected object of class "LoopContainedObject": loop_coordinates = self.list2D_coordinates(selected, self.list) main_list_index = loop_coordinates[0] loop_list_index = loop_coordinates[1] new_selected_index = selected if selected is not None: # If the selected variable is last in its "loop_list": if loop_list_index == (len(self.list[main_list_index]) - 1): # If not the last "loop_list": if main_list_index != (len(self.list) - 1): # Then we move down the entire "loop_list": selected_loop_list = self.list[main_list_index] del self.list[main_list_index] new_main_list_index = main_list_index + 1 self.list.insert(new_main_list_index, selected_loop_list) new_selected_index = selected + len(self.list[main_list_index]) self.update_now() # Else we just move down a variable within a "loop_list": #elif loop_list_index != (len(self.list[main_list_index]) - 1): else: selected_loop_container = self.list[main_list_index][loop_list_index] del self.list[main_list_index][loop_list_index] new_loop_list_index = loop_list_index + 1 self.list[main_list_index].insert(new_loop_list_index, selected_loop_container) new_selected_index = selected + 1 self.update_now() #else: #tkMessageBox.showerror("Cannot move this variable down", "Select unmerge instead") new_selected_index = self.map_to_listbox_index(new_selected_index) self.frame.list.selection_set(new_selected_index) def make_merge(self): # Notes: # "self.list" is a list of lists, each of which, a # "loop_list", contains "LoopContainedObject" class objects: # eg. [[a], [b, c], [d]] selected = self.get_selected() merge_error = 0 merge_error_msg = "" # The purpose of this function is to "merge" selected objects of class # "LoopContainedObject" into a preceding list: # eg. [[a], [b, c], [d]] => [[a], [b, c, d]]] # where selected 'd' was "merged" into preceding list. # Note, this function can also perform the reverse, provided that the # the selected object of class "LoopContainedObject" is the LAST one # in its "loop_list". # Supported cases: # [[a], [b*, c], [d]] => [[a, b, c], [d]] merge # [[a], [b, c*], [d]] => [[a], [b], [c, d]] unmerge # Unsupported cases: # [[a], [b, c*, d], [e]] => cannot unmerge! # Get 2-D list coordinates of selected object of class "LoopContainedObject": loop_coordinates = self.list2D_coordinates(selected, self.list) main_list_index = loop_coordinates[0] loop_list_index = loop_coordinates[1] # Checking that an item is actually selected: if selected is not None: selected_loop_list = self.list[main_list_index] selected_loop_container = selected_loop_list[loop_list_index] preceding_loop_container = self.list[main_list_index - 1][0] # Trying to perform merge? if loop_list_index == 0: # Ensure selected "LoopContainerObject" is not in first "loop_list": if main_list_index > 0: # Can only carry out merge if "Loop" object sequence lengths are # the same length within a "loop_list": if len(selected_loop_container.contained.parameters.sequence) == len(preceding_loop_container.contained.parameters.sequence): # Perform the merge. All variables that are currently merged with the selected variable, # are merged with the new variable(s) as well. i = 0 max_index = len(selected_loop_list) while i < max_index: dummy_loop_container = selected_loop_list[0] del self.list[main_list_index][0] self.list[main_list_index - 1].append(dummy_loop_container) i = i + 1 # Remove the selected "loop_list" if it is now empty: if self.list[main_list_index] == []: del self.list[main_list_index] else: merge_error = 1 merge_error_msg = "Cannot merge variables with different sequence lengths" else: merge_error = 3 #merge_error_msg = "Variable is at the top level" # Trying to perform an "unmerge": else: # Ensure selected "LoopContainerObject" is last object in its "loop_list": if loop_list_index == (len(selected_loop_list) - 1): # Perform the unmerge: del self.list[main_list_index][loop_list_index] self.list.insert((main_list_index + 1), [selected_loop_container]) else: merge_error = 2 merge_error_msg = "Unmerge lowest variable in this cluster first" if merge_error == 1: tkMessageBox.showerror("Cannot perform merge", merge_error_msg) elif merge_error == 2: tkMessageBox.showerror("Cannot perform unmerge", merge_error_msg) elif merge_error == 3: # non critical errors pass else: #debugger: #print len(self.list) #print "" #for x in self.list: # print len(x) #print "--------------" self.update_now() def make_contained_object(self, container_class): """Factory function for ContainedObjectBase""" if container_class == LoopContainedObject: return self.make_loop_contained_object() params = {} p = container_class.contained_class.parameters_and_defaults keys = p.keys() keys.sort() for pname in keys: if p[pname][1] == ve_types.String: params[pname] = tkSimpleDialog.askstring(pname,pname,initialvalue=p[pname][0]) elif p[pname][1] == ve_types.Integer: params[pname] = tkSimpleDialog.askinteger(pname,pname,initialvalue=p[pname][0]) elif p[pname][1] == ve_types.Real: params[pname] = tkSimpleDialog.askfloat(pname,pname,initialvalue=p[pname][0]) elif p[pname][1] == ve_types.Sequence: params[pname] = eval("["+tkSimpleDialog.askstring(pname,pname,initialvalue="1,2,3")+"]") if type(params[pname]) is not types.ListType: raise ValueError("You must enter a list in the form of '[1,2,3]'") else: raise NotImplementedError("Don't know about type %s"%(p[pname][1],)) if params[pname] is None: raise RuntimeError("Input cancelled") contained = container_class.contained_class(**params) # call constructor return container_class(contained) def edit_contained_object(self, contained_object): if not isinstance(contained_object,LoopContainedObject): raise NotImplementedError("") orig_contained = contained_object.get_contained() d = LoopParamDialog(self, title="Loop Parameters", orig_values=orig_contained ) if d.result: return LoopContainedObject(d.result) else: return def make_loop_contained_object(self): d = LoopParamDialog(self, title="Loop Parameters" ) if d.result: return LoopContainedObject(d.result) else: return # Returns index of selected item ignoring blank listbox entries: # eg. if listbox had: # # 0 a # 1 b # 2 # 3 c # 4 d # # Then the index of element 'c' would be 2 def get_selected(self): items = self.frame.list.curselection() try: items = map(int, items) except ValueError: pass if len(items) > 0: selected_item_index = items[0] if self.frame.list.get(selected_item_index) != "": blankentrycount = 0 i = 0 while i < selected_item_index: if self.frame.list.get(i) == "": blankentrycount = blankentrycount + 1 i = i + 1 return (selected_item_index - blankentrycount) return None # Performs reverse of above: # eg. if listbox had: # # 0 a # 1 b # 2 # 3 c # 4 d # # Then "mapping" of given index 2 would result in return value of 3 def map_to_listbox_index(self, index): validentrycount = 0 i = 0 while i < self.frame.list.size(): if self.frame.list.get(i) != "": validentrycount = validentrycount + 1 if validentrycount == (index + 1): return i i = i + 1 return -1 ################################################### class Loop(VisionEgg.ClassWithParameters): parameters_and_defaults = {'variable':('', ve_types.String), 'sequence':([1, 1, 1], ve_types.Sequence(ve_types.Real)), 'rest_duration_sec':(1.0, ve_types.Real)} __slots__ = ( 'num_done', ) def __init__(self,**kw): VisionEgg.ClassWithParameters.__init__(self,**kw) self.num_done = 0 def is_done(self): return self.num_done >= len(self.parameters.sequence) def get_current(self): return self.parameters.sequence[self.num_done] def advance(self): self.num_done += 1 def reset(self): self.num_done = 0 class LoopContainedObject(ContainedObjectBase): """Container for Loop class""" contained_class = Loop header = " variable rest N values" def __init__(self,contained): self.contained = contained def get_str_30(self): p = self.contained.parameters seq_str = "" for val in p.sequence: seq_str += str(val) + " " name_str = p.variable if len(name_str) > 15: name_str = name_str[:15] return "% 15s % 4s % 4d % 4s"%(name_str, str(p.rest_duration_sec), len(p.sequence), seq_str) class LoopParamDialog(tkSimpleDialog.Dialog): def __init__(self,*args,**kw): #intercept orig_values argument if kw.has_key('orig_values'): self.orig_values = kw['orig_values'] del kw['orig_values'] else: self.orig_values = None return tkSimpleDialog.Dialog.__init__(self, *args, **kw ) def body(self,master): Tkinter.Label(master, text="Add sequence of automatic variable values", font=("Helvetica",12,"bold"),).grid(row=0,column=0,columnspan=2) var_frame = Tkinter.Frame(master, relief=Tkinter.GROOVE, borderwidth=2) var_frame.grid(row=1,column=0) sequence_frame = Tkinter.Frame(master) sequence_frame.grid(row=1,column=1) rest_dur_frame = Tkinter.Frame(master) rest_dur_frame.grid(row=2,column=0,columnspan=2) # loopable variable frame stuff global loopable_variables num_cols = int(math.ceil(len(loopable_variables)/10.0)) # 10 variables per column var_frame_row = 0 Tkinter.Label(var_frame, text="Select a variable", font=("Helvetica",12,"bold"),).grid(row=var_frame_row, column=0, columnspan=num_cols) self.var_name = Tkinter.StringVar() self.var_name.set("") var_names = loopable_variables[:] # copy var_names.sort() var_frame_row += 1 Tkinter.Radiobutton( var_frame, text="Repeat (Average)", variable=self.var_name, value="", anchor=Tkinter.W).grid(row=var_frame_row, column=0, sticky="w") var_frame_row += 1 for var_name in var_names: use_row = var_frame_row%10+1 Tkinter.Radiobutton( var_frame, text=var_name, variable=self.var_name, value=var_name, anchor=Tkinter.W).grid(row=use_row, column=int(math.floor(var_frame_row/10.)), sticky="w") var_frame_row += 1 # sequence entry frame seq_row = 0 Tkinter.Label(sequence_frame, text="Sequence values", font=("Helvetica",12,"bold"),).grid(row=seq_row,column=0,columnspan=2) seq_row += 1 self.sequence_type = Tkinter.StringVar() self.sequence_type.set("manual") Tkinter.Radiobutton( sequence_frame, text="Manual:", variable=self.sequence_type, value="manual", anchor=Tkinter.W).grid(row=seq_row,column=0,sticky="w") self.sequence_manual_string = Tkinter.StringVar() self.sequence_manual_string.set("[1,2,3]") Tkinter.Entry(sequence_frame, textvariable=self.sequence_manual_string).grid(row=seq_row,column=1) seq_row += 1 Tkinter.Radiobutton( sequence_frame, text="Linear:", variable=self.sequence_type, value="linear", anchor=Tkinter.W).grid(row=seq_row,column=0,sticky="w") self.lin_start_tk = Tkinter.DoubleVar() self.lin_start_tk.set(1.0) self.lin_stop_tk = Tkinter.DoubleVar() self.lin_stop_tk.set(100.0) self.lin_n_tk = Tkinter.IntVar() self.lin_n_tk.set(3) lin_frame = Tkinter.Frame( sequence_frame) lin_frame.grid(row=seq_row,column=1) Tkinter.Label(lin_frame,text="start:").grid(row=0,column=0) Tkinter.Entry(lin_frame,textvariable=self.lin_start_tk,width=6).grid(row=0,column=1) Tkinter.Label(lin_frame,text=" stop:").grid(row=0,column=2) Tkinter.Entry(lin_frame,textvariable=self.lin_stop_tk,width=6).grid(row=0,column=3) Tkinter.Label(lin_frame,text=" N:").grid(row=0,column=4) Tkinter.Entry(lin_frame,textvariable=self.lin_n_tk,width=6).grid(row=0,column=5) seq_row += 1 Tkinter.Radiobutton( sequence_frame, text="Log:", variable=self.sequence_type, value="log", anchor=Tkinter.W).grid(row=seq_row,column=0,sticky="w") self.log_start_tk = Tkinter.DoubleVar() self.log_start_tk.set(-1.0) self.log_stop_tk = Tkinter.DoubleVar() self.log_stop_tk.set(2.0) self.log_n_tk = Tkinter.IntVar() self.log_n_tk.set(5) log_frame = Tkinter.Frame( sequence_frame) log_frame.grid(row=seq_row,column=1) Tkinter.Label(log_frame,text="start: 10^").grid(row=0,column=0) Tkinter.Entry(log_frame,textvariable=self.log_start_tk,width=6).grid(row=0,column=1) Tkinter.Label(log_frame,text=" stop: 10^").grid(row=0,column=2) Tkinter.Entry(log_frame,textvariable=self.log_stop_tk,width=6).grid(row=0,column=3) Tkinter.Label(log_frame,text=" N:").grid(row=0,column=4) Tkinter.Entry(log_frame,textvariable=self.log_n_tk,width=6).grid(row=0,column=5) seq_row += 1 Tkinter.Radiobutton( sequence_frame, text="Log:", variable=self.sequence_type, value="logb", anchor=Tkinter.W).grid(row=seq_row,column=0,sticky="w") self.logb_start_tk = Tkinter.DoubleVar() self.logb_start_tk.set(0.1) self.logb_stop_tk = Tkinter.DoubleVar() self.logb_stop_tk.set(100.0) self.logb_n_tk = Tkinter.IntVar() self.logb_n_tk.set(5) logb_frame = Tkinter.Frame( sequence_frame) logb_frame.grid(row=seq_row,column=1) Tkinter.Label(logb_frame,text="start:").grid(row=0,column=0) Tkinter.Entry(logb_frame,textvariable=self.logb_start_tk,width=6).grid(row=0,column=1) Tkinter.Label(logb_frame,text=" stop:").grid(row=0,column=2) Tkinter.Entry(logb_frame,textvariable=self.logb_stop_tk,width=6).grid(row=0,column=3) Tkinter.Label(logb_frame,text=" N:").grid(row=0,column=4) Tkinter.Entry(logb_frame,textvariable=self.logb_n_tk,width=6).grid(row=0,column=5) # rest duration frame Tkinter.Label(rest_dur_frame, text="Other sequence parameters", font=("Helvetica",12,"bold"),).grid(row=0,column=0,columnspan=2) Tkinter.Label(rest_dur_frame, text="Interval duration (seconds)").grid(row=1,column=0) self.rest_dur = Tkinter.DoubleVar() self.rest_dur.set(0.5) Tkinter.Entry(rest_dur_frame, textvariable=self.rest_dur, width=10).grid(row=1,column=1) self.shuffle_tk_var = Tkinter.BooleanVar() self.shuffle_tk_var.set(0) Tkinter.Checkbutton( rest_dur_frame, text="Shuffle sequence order", variable=self.shuffle_tk_var).grid(row=2,column=0,columnspan=2) if self.orig_values is not None: self.var_name.set( self.orig_values.parameters.variable ) self.sequence_manual_string.set( str(self.orig_values.parameters.sequence) ) self.rest_dur.set( self.orig_values.parameters.rest_duration_sec ) def validate(self): if self.sequence_type.get() == "manual": try: seq = eval(self.sequence_manual_string.get()) except Exception, x: tkMessageBox.showwarning("Invalid sequence parameters", "Manual sequence entry: %s"%(str(x),), parent=self) return 0 if type(seq) != types.ListType: tkMessageBox.showwarning("Invalid sequence parameters", "Manual sequence entry: Not a list", parent=self) return 0 elif self.sequence_type.get() == "linear": start = self.lin_start_tk.get() stop = self.lin_stop_tk.get() n = self.lin_n_tk.get() if n < 2: tkMessageBox.showwarning("Invalid sequence parameters", "Must have n >= 2.", parent=self) return 0 incr = (stop-start)/float(n-1) seq = range(n) for i in range(n): seq[i] = i*incr + start elif self.sequence_type.get() == "log": start = self.log_start_tk.get() stop = self.log_stop_tk.get() n = self.log_n_tk.get() if n < 2: tkMessageBox.showwarning("Invalid sequence parameters", "Must have n >= 2.", parent=self) return 0 incr = (stop-start)/float(n-1) seq = range(n) for i in range(n): seq[i] = 10.0**( i*incr + start ) elif self.sequence_type.get() == "logb": start = self.logb_start_tk.get() stop = self.logb_stop_tk.get() start = math.log10(start) stop = math.log10(stop) n = self.logb_n_tk.get() if n < 2: tkMessageBox.showwarning("Invalid sequence parameters", "Must have n >= 2.", parent=self) return 0 incr = (stop-start)/float(n-1) seq = range(n) for i in range(n): seq[i] = 10.0**( i*incr + start ) else: tkMessageBox.showwarning("Invalid sequence parameters", "Invalid sequence type.", parent=self) return 0 rest_dur_sec = self.rest_dur.get() if self.shuffle_tk_var.get(): random.shuffle(seq) self.result = Loop(variable=self.var_name.get(), sequence=seq, rest_duration_sec=rest_dur_sec) return 1 def destroy(self): # clear tk variables self.var_name = None self.sequence_type = None self.sequence_manual_string = None self.rest_dur = None # call master's destroy method tkSimpleDialog.Dialog.destroy(self) def get_server(hostname="",port=7766): class ConnectWindow(Tkinter.Frame): def __init__(self,master=None,hostname="",port=7766,**kw): # Allow VisionEgg Tkinter exception window VisionEgg.config._Tkinter_used = True Tkinter.Frame.__init__(self,master, **kw) self.winfo_toplevel().title("EPhysGUI Connect - Vision Egg") current_row = 0 Tkinter.Message(self,\ text='Welcome to the "EPhys GUI" of the Vision Egg!\n\n'+\ 'Please enter the hostname '+\ 'and port number '+\ 'of the computer on which you have the '+\ '"EPhys server" running.').grid(row=current_row,column=0,columnspan=2) hostname = 'localhost' self.hostname_tk = Tkinter.StringVar() self.hostname_tk.set(hostname) current_row += 1 Tkinter.Label(self,text="Hostname:").grid(row=current_row, column=0) Tkinter.Entry(self,textvariable=self.hostname_tk).grid(row=current_row, column=1) self.port_tk = Tkinter.IntVar() self.port_tk.set(port) current_row += 1 Tkinter.Label(self,text="Port:").grid(row=current_row, column=0) Tkinter.Entry(self,textvariable=self.port_tk).grid(row=current_row, column=1) current_row += 1 bf = Tkinter.Frame(self) bf.grid(row=current_row,column=0,columnspan=2) ok=Tkinter.Button(bf,text="OK",command=self.ok) ok.grid(row=0,column=0) ok.focus_force() ok.bind('',self.ok) Tkinter.Button(bf,text="Cancel",command=self.quit).grid(row=0,column=1) self.result = None def ok(self,dummy_arg=None): self.result = (self.hostname_tk.get(),self.port_tk.get()) self.destroy() self.quit() connect_win = ConnectWindow(hostname=hostname,port=port) connect_win.pack() connect_win.mainloop() return connect_win.result class GammaFrame(Tkinter.Frame): def __init__(self, master=None, ephys_server=None,**kw): Tkinter.Frame.__init__(self,master,**kw) self.winfo_toplevel().title("Gamma - Vision Egg") self.ephys_server = ephys_server self.columnconfigure(0,weight=1) row = 0 Tkinter.Label(self, font=("Helvetica",12,"bold"), text="Load Gamma Table").grid(row=row) row += 1 Tkinter.Button(self, text="Set from .ve_gamma file...", command=self.set_from_file).grid(row=row,sticky="w") row += 1 Tkinter.Button(self, text="Set to monitor default (linear gamma table)", command=self.set_monitor_default).grid(row=row,sticky="w") row += 1 invert_frame = Tkinter.Frame(self) invert_frame.grid(row=row,sticky="we") Tkinter.Button(invert_frame, text="Linearize luminance for gammas", command=self.linearize).grid(row=0,column=0) Tkinter.Label(invert_frame, text="Red:").grid(row=0,column=1) self.red_gamma = Tkinter.DoubleVar() self.red_gamma.set(2.2) Tkinter.Entry(invert_frame, textvariable=self.red_gamma, width=5).grid(row=0,column=2) Tkinter.Label(invert_frame, text="Green:").grid(row=0,column=3) self.green_gamma = Tkinter.DoubleVar() self.green_gamma.set(2.2) Tkinter.Entry(invert_frame, textvariable=self.green_gamma, width=5).grid(row=0,column=4) Tkinter.Label(invert_frame, text="Blue:").grid(row=0,column=5) self.blue_gamma = Tkinter.DoubleVar() self.blue_gamma.set(2.2) Tkinter.Entry(invert_frame, textvariable=self.blue_gamma, width=5).grid(row=0,column=6) row += 1 self.success_label = Tkinter.Label(self) self.success_label.grid(row=row) def get_corrected_gamma_table(self,gamma): # c is a constant scale factor. It is always 1.0 when # luminance is normalized to range [0.0,1.0] and input units # in range [0.0,1.0], as is OpenGL standard. c = 1.0 inc = 1.0/255 target_luminances = numpy.arange(0.0,1.0+inc,inc) output_ramp = numpy.zeros(target_luminances.shape,dtype=numpy.int32) for i in range(len(target_luminances)): L = target_luminances[i] if L == 0.0: v_88fp = 0 else: v = math.exp( (math.log(L) - math.log(c)) /gamma) v_88fp = int(round((v*255) * 256)) # convert to from [0.0,1.0] floating point to [0.0,255.0] 8.8 fixed point output_ramp[i] = v_88fp # 8.8 fixed point format return list(output_ramp) # convert to Python list def linearize(self, dummy_arg=None): self.success_label.configure(text="Setting...") try: red = self.get_corrected_gamma_table(self.red_gamma.get()) green = self.get_corrected_gamma_table(self.green_gamma.get()) blue = self.get_corrected_gamma_table(self.blue_gamma.get()) except: self.success_label.configure(text="Calculation error") raise try: if self.ephys_server.set_gamma_ramp(red,green,blue): self.success_label.configure(text="Success") else: self.success_label.configure(text="Failed: Invalid gamma values?") except Exception,x: self.success_label.configure(text="Failed: %s: %s"%(x.__class__,str(x))) raise def set_monitor_default(self, dummy_arg=None): self.success_label.configure(text="Setting...") try: red = self.get_corrected_gamma_table(1.0) # linear gamma table except: self.success_label.configure(text="Calculation error") raise green = red blue = red try: if self.ephys_server.set_gamma_ramp(red,green,blue): self.success_label.configure(text="Success") else: self.success_label.configure(text="Failed: Invalid gamma values?") except Exception,x: self.success_label.configure(text="Failed: %s: %s"%(x.__class__,str(x))) raise def set_from_file(self): self.success_label.configure(text="Setting...") filename = tkFileDialog.askopenfilename( parent=self, defaultextension=".ve_gamma", filetypes=[('Configuration file','*.ve_gamma')], initialdir=VisionEgg.config.VISIONEGG_USER_DIR) if not filename: self.success_label.configure(text="No file given") return fd = open(filename,"r") gamma_values = [] for line in fd.readlines(): line = line.strip() # remove leading/trailing whitespace if line.startswith("#"): # comment, ignore continue try: gamma_values.append( map(int, line.split() ) ) except Exception, x: self.success_label.configure(text="File error") raise if len(gamma_values[-1]) != 3: self.success_label.configure(text="File error") raise RuntimeError("expected 3 values per gamma entry") if len(gamma_values) != 256: self.success_label.configure(text="File error") raise RuntimeError("expected 256 gamma entries") red, green, blue = zip(*gamma_values) try: if self.ephys_server.set_gamma_ramp(red,green,blue): self.success_label.configure(text="Success") else: self.success_label.configure(text="Failed: Invalid gamma values?") except Exception,x: self.success_label.configure(text="Failed: %s: %s"%(x.__class__,str(x))) raise class ImageSequenceLauncher(Tkinter.Toplevel): def __init__(self,master=None,ephys_server=None,**cnf): Tkinter.Toplevel.__init__(self,master,**cnf) if ephys_server is None: raise ValueError("Must specify ephys_server") self.ephys_server = ephys_server self.columnconfigure(1,weight=1) row = 0 Tkinter.Label(self,text="Frames per second").grid(row=row,column=0) self.fps_var = Tkinter.DoubleVar() self.fps_var.set(12.0) Tkinter.Entry(self,textvariable=self.fps_var).grid(row=row,column=1,sticky="we") row += 1 Tkinter.Label(self,text="Filename base").grid(row=row,column=0) self.filename_base = Tkinter.StringVar() self.filename_base.set("im") Tkinter.Entry(self,textvariable=self.filename_base).grid(row=row,column=1,sticky="we") row += 1 Tkinter.Label(self,text="Filename suffix").grid(row=row,column=0) self.filename_suffix = Tkinter.StringVar() self.filename_suffix.set(".tif") Tkinter.Entry(self,textvariable=self.filename_suffix).grid(row=row,column=1,sticky="we") row += 1 Tkinter.Label(self,text="Save directory on server").grid(row=row,column=0) self.server_save_dir = Tkinter.StringVar() server_dir = self.ephys_server.get_cwd() self.server_save_dir.set(server_dir) Tkinter.Entry(self,textvariable=self.server_save_dir).grid(row=row,column=1,sticky="we") row += 1 Tkinter.Button(self,text="Save movie",command=self.do_it).grid(row=row,column=0,columnspan=2) self.focus_set() self.grab_set() def do_it(self): fps = self.fps_var.get() filename_base = self.filename_base.get() filename_suffix = self.filename_suffix.get() server_save_dir = self.server_save_dir.get() self.ephys_server.save_image_sequence(fps=fps, filename_base=filename_base, filename_suffix=filename_suffix, save_dir=server_save_dir) self.destroy() class AppWindow(Tkinter.Frame): def __init__(self, master=None, client_list=None, server_hostname='', server_port=7766, **cnf): if hasattr(VisionEgg, '_exception_hook_keeper'): # Keep original exception handler self._orig_report_callback_exception = Tkinter.Tk.report_callback_exception self._tk = Tkinter.Tk # Use Vision Egg exception handler Tkinter.Tk.report_callback_exception = VisionEgg._exception_hook_keeper.handle_exception # Allow VisionEgg Tkinter exception window VisionEgg.config._Tkinter_used = True # create myself Tkinter.Frame.__init__(self,master, **cnf) self.winfo_toplevel().title("EPhysGUI - Vision Egg") self.client_list = client_list self.server_hostname = server_hostname self.server_port = server_port self.pyro_client = VisionEgg.PyroClient.PyroClient(self.server_hostname,self.server_port) self.ephys_server = self.pyro_client.get("ephys_server") self.ephys_server.first_connection() self.stim_onset_cal_tk_var = Tkinter.BooleanVar() self.stim_onset_cal_tk_var.set(0) self.autosave_dir = Tkinter.StringVar() self.autosave_dir.set( os.path.abspath(os.curdir) ) self.autosave_basename = Tkinter.StringVar() # create menu bar self.bar = Tkinter.Menu(tearoff=0) top = self.winfo_toplevel() top.configure(menu=self.bar) self.bar.file_menu = Tkinter.Menu(self.bar, name="file_menu") self.bar.add_cascade(label="File",menu=self.bar.file_menu) self.bar.file_menu.add_command(label='Save image sequence...', command=self.save_image_sequence) self.bar.file_menu.add_command(label='Save configuration file...', command=self.save_config) self.bar.file_menu.add_command(label='Load configuration file...', command=self.load_config) self.bar.file_menu.add_command(label='Load auto-saved .py parameter file...', command=self.load_params) self.bar.file_menu.add_separator() self.bar.file_menu.add_command(label='Load Vision Egg script...', command=self.load_demoscript) self.bar.file_menu.add_separator() self.quit_server_too = Tkinter.BooleanVar() self.quit_server_too.set(1) self.bar.file_menu.add_checkbutton(label='Quit server too', variable=self.quit_server_too) self.bar.file_menu.add_command(label='Quit', command=self.quit, ) stimkey = self.ephys_server.get_stimkey() self.stimulus_tk_var = Tkinter.StringVar() self.stimulus_tk_var.set( stimkey ) self.bar.stimuli_menu = Tkinter.Menu(self.bar, name="stimuli_menu") self.bar.add_cascade(label="Stimuli",menu=self.bar.stimuli_menu) for maybe_stimkey, maybe_control_frame, maybe_title in self.client_list: if maybe_title != "Vision Egg Script": self.bar.stimuli_menu.add_radiobutton(label=maybe_title, command=self.change_stimulus, variable=self.stimulus_tk_var, value=maybe_stimkey) self.bar.calibration_menu = Tkinter.Menu(self.bar, name="calibration_menu") self.bar.add_cascade(label="Configure/Calibrate", menu=self.bar.calibration_menu) self.bar.calibration_menu.add_command(label='3D Perspective...', command=self.launch_screen_pos) self.bar.calibration_menu.add_command(label='Stimulus onset timing...', command=self.launch_stim_onset_cal) self.bar.calibration_menu.add_command(label='Load gamma table...', command=self.launch_gamma_panel) self.notify_on_dropped_frames = Tkinter.BooleanVar() self.notify_on_dropped_frames.set(1) self.bar.calibration_menu.add_checkbutton(label='Warn on frame skip', variable=self.notify_on_dropped_frames) self.override_t_abs_sec = Tkinter.StringVar() # Tkinter DoubleVar loses precision self.override_t_abs_sec.set("0.0") self.override_t_abs_on = Tkinter.BooleanVar() self.override_t_abs_on.set(0) self.bar.calibration_menu.add_checkbutton(label='Override server absolute time (CAUTION)', variable=self.override_t_abs_on) row = 0 # options for self.stim_frame in grid layout manager self.stim_frame_cnf = {'row':row, 'column':0, 'columnspan':2, 'sticky':'nwes'} row += 1 Tkinter.Label(self, text="Sequence information", font=("Helvetica",12,"bold")).grid(row=row,column=0) row += 1 # options for self.loop_frame in grid layout manager self.loop_frame_cnf = {'row':row, 'column':0, 'sticky':'nwes'} row -= 1 Tkinter.Label(self, text="Parameter Save Options", font=("Helvetica",12,"bold")).grid(row=row,column=1) row += 1 self.auto_save_frame = Tkinter.Frame(self) asf = self.auto_save_frame # shorthand asf.grid(row=row,column=1,sticky="nwes") asf.columnconfigure(1,weight=1) asf.grid_row = 0 self.autosave = Tkinter.BooleanVar() self.autosave.set(1) self.auto_save_button = Tkinter.Checkbutton(asf, text="Auto save trial parameters", variable=self.autosave) self.auto_save_button.grid(row=asf.grid_row,column=0,columnspan=2) self.param_file_type_tk_var = Tkinter.StringVar() self.param_file_type_tk_var.set("Python format") filetype_bar = Tkinter.Menubutton(asf, textvariable=self.param_file_type_tk_var, relief=Tkinter.RAISED) filetype_bar.grid(row=asf.grid_row,column=2) filetype_bar.menu = Tkinter.Menu(filetype_bar,tearoff=0) filetype_bar.menu.add_radiobutton(label="Python format", value="Python format", variable=self.param_file_type_tk_var) filetype_bar.menu.add_radiobutton(label="Matlab format", value="Matlab format", variable=self.param_file_type_tk_var) filetype_bar['menu'] = filetype_bar.menu asf.grid_row += 1 Tkinter.Label(asf, text="Parameter file directory:").grid(row=asf.grid_row,column=0,sticky="e") Tkinter.Entry(asf, textvariable=self.autosave_dir).grid(row=asf.grid_row,column=1,sticky="we") Tkinter.Button(asf, text="Set...",command=self.set_autosave_dir).grid(row=asf.grid_row,column=2) asf.grid_row += 1 Tkinter.Label(asf, text="Parameter file basename:").grid(row=asf.grid_row,column=0,sticky="e") Tkinter.Entry(asf, textvariable=self.autosave_basename).grid(row=asf.grid_row,column=1,sticky="we") Tkinter.Button(asf, text="Reset",command=self.reset_autosave_basename).grid(row=asf.grid_row,column=2) row += 1 Tkinter.Button(self, text='Do single trial', command=self.do_single_trial).grid(row=row,column=0) Tkinter.Button(self, text='Do sequence', command=self.do_loops).grid(row=row,column=1) row += 1 self.progress = VisionEgg.GUI.ProgressBar(self, width=300, relief="sunken", doLabel=0, labelFormat="%s") self.progress.labelText = "Starting..." self.progress.updateProgress(0) self.progress.grid(row=row,column=0,columnspan=2)#,sticky='we') # Allow rows and columns to expand for i in range(2): self.columnconfigure(i,weight=1) for i in range(row+1): self.rowconfigure(i,weight=1) self.switch_to_stimkey( stimkey ) self.config_dir = None self.demoscript_filename = None self.vars_list = None def __del__( self ): if hasattr(self,'_orig_report_callback_exception'): self._tk.report_callback_exception = self._orig_report_callback_exception def switch_to_stimkey( self, stimkey ): success = 0 for maybe_stimkey, maybe_control_frame, maybe_title in self.client_list: if stimkey == maybe_stimkey: control_frame_klass = maybe_control_frame success = 1 if not success: raise RuntimeError("Could not find valid client for server stimkey %s"%stimkey) if hasattr(self, 'stim_frame'): # clear old frame self.stim_frame.destroy() del self.stim_frame self.stim_frame = control_frame_klass(self,suppress_go_buttons=1) if stimkey == "dropin_server": self.stim_frame.gen_var_widgets(self.demoscript_filename, self.vars_list) self.stim_frame.connect(self.server_hostname,self.server_port) self.stim_frame.grid( **self.stim_frame_cnf ) global loopable_variables loopable_variables = self.stim_frame.get_loopable_variable_names() if hasattr(self, 'loop_frame'): # clear old frame self.loop_frame.destroy() del self.loop_frame self.loop_frame = ScrollListFrame(master=self, container_class=LoopContainedObject) self.loop_frame.grid( **self.loop_frame_cnf ) self.autosave_basename.set( self.stim_frame.get_shortname() ) self.stimulus_tk_var.set( self.stim_frame.get_shortname() ) # set menuitem self.progress.labelText = "Ready" self.progress.updateProgress(0) def change_stimulus(self, dummy_arg=None, new_stimkey=None ): # if new_stimkey is None, get from the tk variable if new_stimkey is None: new_stimkey = self.stimulus_tk_var.get() found = 0 for maybe_stimkey, maybe_control_frame, maybe_title in self.client_list: if new_stimkey == maybe_stimkey: new_control_frame_klass = maybe_control_frame new_stimkey = maybe_stimkey found = 1 break if not found: raise RuntimeError("Don't know about stimkey %s"%new_stimkey) if new_control_frame_klass != self.stim_frame.__class__ or new_stimkey == "dropin_server": # make wait cursor root = self.winfo_toplevel() old_cursor = root["cursor"] root["cursor"] = "watch" root.update() try: self.progress.labelText = "Changing stimulus..." self.progress.updateProgress(0) self.ephys_server.set_next_stimkey( new_stimkey ) # new stimulus type self.stim_frame.quit_server() # disconnect # in case of loaded Vision Egg script, quit_server() # sends a signal to stop the "wait" loop, WITHOUT # raising a flag to run the script self.ephys_server.get_stimkey() # wait for server to load self.switch_to_stimkey( new_stimkey) finally: #restore cursor root["cursor"] = old_cursor root.update() def save_image_sequence(self): ImageSequenceLauncher(self,ephys_server=self.ephys_server) def save_config(self): self.stim_frame.send_values() # copy values from Tkinter to self.stim_frame.meta_params and send to server if self.config_dir is not None: initialdir = self.config_dir else: initialdir = VisionEgg.config.VISIONEGG_USER_DIR filename = tkFileDialog.asksaveasfilename( parent=self, defaultextension=".ve_cfg", filetypes=[('Configuration file','*.ve_cfg')], initialdir=initialdir) if not filename: return fd = open(filename,"wb") save_dict = {'stim_type':self.stim_frame.get_shortname(), 'loop_list':self.loop_frame.list, 'stim_frame_dict':self.stim_frame.get_parameters_dict(), 'autosave':self.autosave.get(), 'autosave_dir':self.autosave_dir.get(), 'autosave_basename':self.autosave_basename.get()} pickle.dump( save_dict, fd ) self.config_dir = os.path.split(filename)[0] # get dir def load_config(self): if self.config_dir is not None: initialdir = self.config_dir else: initialdir = VisionEgg.config.VISIONEGG_USER_DIR filename = tkFileDialog.askopenfilename( parent=self, defaultextension=".ve_cfg", filetypes=[('Configuration file','*.ve_cfg')], initialdir=initialdir, ) if not filename: return self.config_dir = os.path.split(filename)[0] # get dir fd = open(filename,"rb") file_contents = fd.read() file_contents = file_contents.replace('\r\n','\n') # deal with Windows newlines memory_file = StringIO.StringIO(file_contents) load_dict = pickle.load(memory_file) if load_dict['stim_type'] != self.stim_frame.get_shortname(): self.change_stimulus(new_stimkey=load_dict['stim_type']+"_server") self.loop_frame.list = load_dict['loop_list'] self.loop_frame.update_now() self.stim_frame.set_parameters_dict( load_dict['stim_frame_dict'] ) self.autosave.set(load_dict['autosave']) self.autosave_dir.set(load_dict['autosave_dir']) self.autosave_basename.set(load_dict['autosave_basename']) self.stim_frame.update_tk_vars() def load_params(self,orig_load_dict={}): filename = tkFileDialog.askopenfilename( parent=self, defaultextension=".py", filetypes=[('Auto-saved parameter file','*.py')]) if not filename: return locals = {} load_dict = orig_load_dict.copy() # make copy of default values execfile(filename,locals,load_dict) # execute the file if load_dict['stim_type'] != self.stim_frame.get_shortname(): self.change_stimulus(new_stimkey=load_dict['stim_type']+"_server") self.loop_frame.list = [] # clear loop list self.loop_frame.update_now() new_params = {} exception_info = [] for param_name in dir(self.stim_frame.meta_params): if param_name[:2] != "__": try: new_params[param_name] = load_dict[param_name] except Exception, x: exception_info.append(sys.exc_info()) # don't die on exception else: del load_dict[param_name] for exc_type, exc_value, exc_traceback in exception_info: # ignore actual traceback VisionEgg.GUI.showexception(exc_type,exc_value,"") self.stim_frame.set_parameters_dict( new_params ) self.autosave_basename.set(load_dict['stim_type']) try: override_t_abs_sec = load_dict['go_loop_start_time_abs_sec'] except Exception, x: tkMessageBox.showwarning("No absolute time parameter", "No absolute time parameter when loading file", parent=self) else: if not self.override_t_abs_on.get(): self.override_t_abs_on.set(1) tkMessageBox.showwarning("Overriding absolute time parameter", "Overriding absolute time parameter on server. "+\ "Remember to turn this option off (in Configure "+\ "/ Calibrate menu) when done.", parent=self) self.override_t_abs_sec.set(repr(override_t_abs_sec)) # make string self.stim_frame.update_tk_vars() return load_dict # return unused variables def load_demoscript(self): self.demoscript_filename = tkFileDialog.askopenfilename( parent=self, defaultextension=".py", filetypes=[('Vision Egg Demo Script','*.py')]) if not self.demoscript_filename: return else: # make wait cursor root = self.winfo_toplevel() old_cursor = root["cursor"] root["cursor"] = "watch" root.update() try: fd1 = open(self.demoscript_filename, 'r') demoscript = "" # List of all variables. # Each variable is a tuple of the form [x, y, z] where: # x: variable type ID, # y: variable name, # z: variable value. self.vars_list = [] lines = fd1.read().splitlines() keep_lines = [] while len(lines): myString = lines.pop(0) if myString.find("get_default_screen()") != -1: append_flag = 0 elif myString.find("watch_exceptions()") != -1: append_flag = 0 elif myString.find("start_default_logging()") != -1: append_flag = 0 elif myString.find("#%f") == 0: self.vars_list.append([VarTypes.getID("float"), myString.replace("#%f", "").split()[0]]) append_flag = 0 elif myString.find("#%i") == 0: self.vars_list.append([VarTypes.getID("integer"), myString.replace("#%i", "").split()[0]]) append_flag = 0 elif myString.find("#%s") == 0: self.vars_list.append([VarTypes.getID("string"), myString.replace("#%s", "").split()[0]]) append_flag = 0 else: append_flag = 1 if append_flag == 1: keep_lines.append( myString ) fd1.close() demoscript = '\n'.join(keep_lines) # Client side AST. Only used to extract default values # of elected variables: try: AST = parser.suite(demoscript) for var in self.vars_list: var_val = AST_ext.extract_from_AST(AST, var[1]) if var[0] == VarTypes.getID("string"): var_val = var_val[1:len(var_val) - 1] var.append(var_val) del AST # save memory # unfortunately, sending an AST object over a Pyro # connection has its complications... so we don't # do it self.ephys_server.build_AST(demoscript) self.change_stimulus(new_stimkey="dropin_server") except (parser.ParserError, SyntaxError): tkMessageBox.showerror("Error", "Invalid demo script!") err_fd = file('/home/astraw/tmp/err.py',mode='w') err_fd.write(demoscript) finally: #restore cursor root["cursor"] = old_cursor root.update() def launch_screen_pos(self, dummy_arg=None): dialog = Tkinter.Toplevel(self) frame = VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame(dialog, auto_connect=1, server_hostname=self.server_hostname, server_port=self.server_port) frame.winfo_toplevel().title("3D Calibration - Vision Egg") frame.pack(expand=1,fill=Tkinter.BOTH) def launch_stim_onset_cal(self, dummy_arg=None): dialog = Tkinter.Toplevel(self) frame = Tkinter.Frame(dialog) frame.winfo_toplevel().title("Timing Calibration - Vision Egg") Tkinter.Label(frame, font=("Helvetica",12,"bold"), text="Stimulus onset timing").grid(row=0,column=0) Tkinter.Label(frame, text="Use a light detector to verify the onset of a trial." ).grid(row=1,column=0) Tkinter.Checkbutton( frame, text="Black box (always) with white box (during trial)", variable=self.stim_onset_cal_tk_var, command=self.update_stim_onset_cal).grid(row=2,column=0) x,y,width,height = self.ephys_server.get_stim_onset_cal_location() location_frame = Tkinter.Frame(frame) location_frame.grid(row=3,column=0) self.stim_onset_x = Tkinter.DoubleVar() self.stim_onset_x.set(x) self.stim_onset_y = Tkinter.DoubleVar() self.stim_onset_y.set(y) self.stim_onset_width = Tkinter.DoubleVar() self.stim_onset_width.set(width) self.stim_onset_height = Tkinter.DoubleVar() self.stim_onset_height.set(height) Tkinter.Label( location_frame, text="Center X:").grid(row=0,column=0) Tkinter.Entry( location_frame, textvariable=self.stim_onset_x,width=5).grid(row=0,column=1) Tkinter.Label( location_frame, text="Center Y:").grid(row=0,column=2) Tkinter.Entry( location_frame, textvariable=self.stim_onset_y,width=5).grid(row=0,column=3) Tkinter.Label( location_frame, text="Width:").grid(row=1,column=0) Tkinter.Entry( location_frame, textvariable=self.stim_onset_width,width=5).grid(row=1,column=1) Tkinter.Label( location_frame, text="Height:").grid(row=1,column=2) Tkinter.Entry( location_frame, textvariable=self.stim_onset_height,width=5).grid(row=1,column=3) Tkinter.Button( frame, text="update position and size", command=self.set_stim_onset_cal_position).grid(row=4,column=0) self.set_stim_onset_cal_position() # call it once to send server our initial values frame.pack(expand=1,fill=Tkinter.BOTH) def launch_gamma_panel(self, dummy_arg=None): dialog = Tkinter.Toplevel(self) frame = GammaFrame(dialog, self.ephys_server) frame.pack(expand=1,fill=Tkinter.BOTH) def set_autosave_dir(self): self.autosave_dir.set( os.path.abspath( tkFileDialog.askdirectory() ) ) def reset_autosave_basename(self): self.autosave_basename.set( self.stim_frame.get_shortname() ) def update_stim_onset_cal(self, dummy_arg=None): on = self.stim_onset_cal_tk_var.get() self.ephys_server.set_stim_onset_cal(on) def set_stim_onset_cal_position(self, dummy_arg=None): x = self.stim_onset_x.get() y = self.stim_onset_y.get() width = self.stim_onset_width.get() height = self.stim_onset_height.get() self.ephys_server.set_stim_onset_cal_location(center=(x,y),size=(width,height)) def do_loops(self): super_loop_list = self.loop_frame.get_list_uncontained() # "super_loop_list" is a list of lists, each of which, a # "loop_list", contains "loop" class objects # eg. [[a], [b, c], [d]] # Need to test that "get_list_uncontained()" is returning a list of lists! global need_rest_period need_rest_period = 0 if not len(super_loop_list): return ############################################################ def process_loops(depth): # recursive processing of loops class LoopInfoFrame(Tkinter.Frame): def __init__(self, master=None, **kw): Tkinter.Frame.__init__(self,master,**kw) Tkinter.Label(self, text="Doing sequence").grid(row=0,column=0) self.status_tk_var = Tkinter.StringVar() Tkinter.Label(self, textvariable = self.status_tk_var).grid(row=1, column=0) self.cancel_asap = 0 Tkinter.Button(self, text="Cancel",command=self.cancel).grid(row=2,column=0) self.focus_set() self.grab_set() def cancel(self, dummy_arg=None): self.cancel_asap = 1 global need_rest_period global loop_info_frame if depth == 0: # only make one LoopInfoFrame (when depth is 0, ie. first time) top = Tkinter.Toplevel(self) loop_info_frame = LoopInfoFrame(top) loop_info_frame.pack() loop_list = super_loop_list[depth] #print "current depth" #print depth #print "Loop?" #print loop max_depth = len(super_loop_list)-1 #print "max_depth" #print max_depth loop = loop_list[0].get_contained() # "loop_list" is, for example: [a, b, c] # ie. each element is an object of class "loop". # If one element is done, then all other elements are effectively done, the way we've structured the lists to # be (they all have same 'N' value). while not loop.is_done() and not loop_info_frame.cancel_asap: for loop_element in loop_list: if loop_element.get_contained().parameters.variable != "": self.stim_frame.set_loopable_variable(loop_element.get_contained().parameters.variable,loop_element.get_contained().get_current()) if depth < max_depth: process_loops(depth+1) elif depth == max_depth: # deepest level -- do the trial if need_rest_period: self.progress.labelText = "Resting" self.sleep_with_progress(loop.parameters.rest_duration_sec) self.do_single_trial() need_rest_period = 1 else: raise RuntimeError("Called with max_depth==-1:") for loop_element in loop_list: loop_element.get_contained().advance() for loop_element in loop_list: loop_element.get_contained().reset() if depth == 0: # destroy LoopInfoFrame top.destroy() ############################################################ process_loops(0) # start recursion on top level def do_single_trial(self): # Get filename to save parameters if not self.autosave.get(): file_stream = None # not saving file else: duration_sec = self.stim_frame.get_duration_sec() (year,month,day,hour24,min,sec) = time.localtime(time.time()+duration_sec)[:6] trial_time_str = "%04d%02d%02d_%02d%02d%02d"%(year,month,day,hour24,min,sec) if self.param_file_type_tk_var.get() == "Python format": # Figure out filename to save parameters in filename = self.autosave_basename.get() + trial_time_str + "_params.py" fullpath_filename = os.path.join( self.autosave_dir.get(), filename) file_stream = open(fullpath_filename,"w") elif self.param_file_type_tk_var.get() == "Matlab format": # Figure out filename to save results in filename = self.autosave_basename.get() + trial_time_str + "_params.m" fullpath_filename = os.path.join( self.autosave_dir.get(), filename) file_stream = open(fullpath_filename,"w") else: raise ValueError('Unknown file format: "%s"'%(self.param_file_type_tk_var.get(),)) # this class is broken into parts so it can be subclassed more easily self.do_single_trial_pre(file_stream) self.do_single_trial_work() self.do_single_trial_post(file_stream) # Close parameter save file if self.autosave.get(): file_stream.close() def do_single_trial_pre(self, file_stream): # Ensure that we have the most up-to-date values self.stim_frame.send_values() # copy values from Tkinter to self.stim_frame.meta_params and send to server # if file_stream is None, open default file if self.autosave.get(): duration_sec = self.stim_frame.get_duration_sec() (year,month,day,hour24,min,sec) = time.localtime(time.time()+duration_sec)[:6] if self.param_file_type_tk_var.get() == "Python format": file_stream.write("stim_type = '%s'\n"%self.stim_frame.get_shortname()) file_stream.write("finished_time = %04d%02d%02d%02d%02d%02d\n"%(year,month,day,hour24,min,sec)) parameter_list = self.stim_frame.get_parameters_as_py_strings() for parameter_name, parameter_value in parameter_list: file_stream.write("%s = %s\n"%(parameter_name, parameter_value)) elif self.param_file_type_tk_var.get() == "Matlab format": file_stream.write("stim_type = '%s';\n"%self.stim_frame.get_shortname()) file_stream.write("finished_time = %04d%02d%02d%02d%02d%02d;\n"%(year,month,day,hour24,min,sec)) parameter_list = self.stim_frame.get_parameters_as_m_strings() for parameter_name, parameter_value in parameter_list: file_stream.write("%s = %s;\n"%(parameter_name, parameter_value)) else: raise RuntimeError("Unknown parameter file type") # Should never get here def do_single_trial_work(self): # make wait cursor root = self.winfo_toplevel() self.old_cursor = root["cursor"] root["cursor"] = "watch" root.update() try: self.progress.labelText = "Doing trial..." self.progress.updateProgress(0) duration_sec = self.stim_frame.get_duration_sec() if duration_sec > 0: if self.override_t_abs_on.get(): new_t_abs_str = self.override_t_abs_sec.get() self.ephys_server.set_override_t_abs_sec( new_t_abs_str ) self.stim_frame.go() # start server going, but this return control immediately self.sleep_with_progress(duration_sec) while self.ephys_server.is_in_go_loop(): # make sure go loop is really done time.sleep(0.1) # wait 100 msec for end of go loop and try again if self.notify_on_dropped_frames.get(): if self.ephys_server.were_frames_dropped_in_last_go_loop(): tkMessageBox.showwarning("Dropped frame(s)", "During the last trial, at least 1 frame was dropped.", parent=self) else: if self.stim_frame.send_values(): self.ephys_server.run_demoscript() self.stim_frame.quit_server() finally: root["cursor"] = self.old_cursor root.update() # restore status bar self.progress.labelText = "Ready" self.progress.updateProgress(0) def do_single_trial_post(self, file_stream): # if file_stream is None, open default file if self.autosave.get(): frames_dropped = self.ephys_server.were_frames_dropped_in_last_go_loop() go_loop_start_time = self.ephys_server.get_last_go_loop_start_time_absolute_sec() if self.param_file_type_tk_var.get() == "Python format": file_stream.write("frames_dropped = %s # boolean\n"%str(frames_dropped)) file_stream.write("go_loop_start_time_abs_sec = %s\n"%repr(go_loop_start_time)) elif self.param_file_type_tk_var.get() == "Matlab format": file_stream.write("frames_dropped = %s; %% boolean\n"%str(frames_dropped)) file_stream.write("go_loop_start_time_abs_sec = %s;\n"%repr(go_loop_start_time)) else: raise RuntimeError("Unknown parameter file type") # Should never get here def sleep_with_progress(self, duration_sec): if duration_sec == 0.0: return # don't do anything start_time = time.time() stop_time = start_time + duration_sec percent_done = 0 while percent_done < 100: if sys.platform != 'darwin': # Mac OS X Tk bug... sigh... self.progress.updateProgress(percent_done) time.sleep(0.01) # wait 10 msec percent_done = (time.time() - start_time)/duration_sec*100 def quit(self): if self.quit_server_too.get(): self.ephys_server.set_quit_status(1) # call parent class Tkinter.Frame.quit(self) def destroy(self): try: if self.quit_server_too.get(): self.ephys_server.set_quit_status(1) except: pass Tkinter.Frame.destroy(self) class BarButton(Tkinter.Menubutton): # Taken from Guido van Rossum's Tkinter svkill demo def __init__(self, master=None, **cnf): Tkinter.Menubutton.__init__(self, master, **cnf) self.pack(side=Tkinter.LEFT) self.menu = Tkinter.Menu(self, name='menu', tearoff=0) self['menu'] = self.menu if __name__ == '__main__': hostname = os.getenv("ephys_server_hostname","") port = int(os.getenv("ephys_server_port","7766")) result = get_server(hostname=hostname,port=port) if result: hostname,port = result app_window = AppWindow(client_list=client_list, server_hostname=hostname, server_port=port) app_window.winfo_toplevel().wm_iconbitmap() app_window.pack(expand=1,fill=Tkinter.BOTH) app_window.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/EPhysGUIUtils.py0000755000076500000240000002204511227360015021333 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: EPhysGUIUtils # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. import sys, os, time, types, socket import Tkinter import Pyro.core import VisionEgg.PyroClient class StimulusControlFrame(Tkinter.Frame): def __init__(self, master=None, suppress_go_buttons=0, title="Stimulus Control", meta_params_class=None, **kw): Tkinter.Frame.__init__(self,master,**kw) self.pyro_client = None self.entry_width = 10 self.connected = 0 if meta_params_class is not None: self.meta_params = meta_params_class() self.loopable_variables = {} Tkinter.Label(self, text=title, font=("Helvetica",12,"bold")).pack(expand=Tkinter.YES, fill=Tkinter.X) if not suppress_go_buttons: connected_frame = Tkinter.Frame(self) connected_frame.pack(expand=Tkinter.YES, fill=Tkinter.X) self.connected_text = Tkinter.StringVar() self.connected_text.set("Server status: Not connected") self.server_hostname = Tkinter.StringVar() self.server_hostname.set( socket.getfqdn('') ) self.server_port = Tkinter.IntVar() self.server_port.set( 7766 ) Tkinter.Label(connected_frame, text="Server hostname").grid(row=0, column=0) Tkinter.Entry(connected_frame, textvariable=self.server_hostname).grid(row=0, column=1, columnspan=2) Tkinter.Label(connected_frame, textvariable=self.connected_text).grid(row=1, column=0) Tkinter.Button(connected_frame, text="Connect", command=self.standalone_connect).grid(row=1, column=1) Tkinter.Button(connected_frame, text="Quit server", command=self.quit_server).grid(row=1, column=2) self.param_frame = Tkinter.Frame(self) self.param_frame.pack(expand=Tkinter.YES,fill=Tkinter.BOTH) if not suppress_go_buttons: Tkinter.Button(self,text="Begin Trial",command=self.go).pack()#expand=Tkinter.YES,fill=Tkinter.BOTH) def make_callback_entry(self, master=None, **kw): if 'width' not in kw.keys(): kw['width'] = self.entry_width if master==None: master=self.param_frame e = Tkinter.Entry(master,**kw) e.bind('',self.send_values) e.bind('',self.send_values) return e def get_shortname(self): """Used as basename for saving parameter files and other ID purposes""" raise NotImplementedError("Must be overriden by derived class") def set_param_dict(self,new_param_dict): orig_params = dir(self.meta_params) for new_param_name in new_param_dict.keys(): if new_param_name[:2] != '__' and new_param_name[-2:] != '__': if new_param_name not in orig_params: raise ValueError('Gave parameter "%s", which I do not know about.'%(new_param_name,)) setattr(self.meta_params,new_param_name,new_param_dict[new_param_name]) self.update_tk_vars() self.update() # update screen with new tk_var value def update_tk_vars(self): """Update Tkinter variables with (new) values from meta_params""" raise NotImplementedError("Must be overriden by derived class") def get_parameters_dict(self): result = {} for param_name in dir(self.meta_params): if param_name[:2] != '__' and param_name[-2:] != '__': result[param_name] = getattr(self.meta_params,param_name) return result def get_parameters_as_py_strings(self): """Return parameter values as Python-executable strings""" result = [] for param_name in dir(self.meta_params): if param_name[:2] != '__' and param_name[-2:] != '__': value = getattr(self.meta_params,param_name) value_string = repr(value) result.append((param_name,value_string)) return result def get_parameters_as_m_strings(self): """Return parameter values as Matlab-executable strings""" result = [] for param_name in dir(self.meta_params): if param_name[:2] != '__' and param_name[-2:] != '__': value = getattr(self.meta_params,param_name) value_string = self.get_matlab_string(value) result.append((param_name,value_string)) return result def get_matlab_string(self, value): # I'm no Matlab whiz, so you may have to modify this!! if type(value) in [types.IntType, types.FloatType]: return str(value) elif type(value) in [types.ListType, types.TupleType]: s = "[ " for v in value: s += str(v) + " " s += "]" return s elif type(value) == types.StringType: s = "'%s'"%value return s else: raise NotImplementedError("No support for converting %s to Matlab format."%str(type(value))) def set_parameters_dict(self, dict): for key in dict.keys(): if not key in dir(self.meta_params): raise RuntimeError("Parameter %s not in %s"%(key, str(self.meta_params))) setattr(self.meta_params,key,dict[key]) def get_loopable_variable_names(self): return self.loopable_variables.keys() def set_loopable_variable(self,easy_name,value): meta_param_var_name,tk_var = self.loopable_variables[easy_name] setattr(self.meta_params,meta_param_var_name,value) tk_var.set(value) self.update() # update screen with new tk_var value def send_values(self,dummy_arg=None): """Update meta_params variables with values from Tkinter fields""" raise NotImplementedError("Must be overriden by derived class") def get_duration_sec(self): """Calculate total duration in go loop""" raise NotImplementedError("Must be overriden by derived class") def go(self,dummy_arg=None): self.send_values() if not self.connected: raise RuntimeError("must be connected to run trial") root = self.winfo_toplevel() old_cursor = root["cursor"] root["cursor"] = "watch" root.update() self.meta_controller.go() root["cursor"] = old_cursor root.update() def standalone_connect(self): self.connect(self.server_hostname.get(),self.server_port.get()) def connect(self,server_hostname,server_port): self.pyro_client = VisionEgg.PyroClient.PyroClient(server_hostname,server_port) shortname = self.get_shortname() meta_controller_name = shortname + "_server" timeout_seconds = 60.0 retry_interval_seconds = 0.1 start_time = time.time() if hasattr(self,"meta_controller"): del self.meta_controller # get rid of old meta_controller # get new meta_controller while not hasattr(self,"meta_controller"): try: self.meta_controller = self.pyro_client.get(meta_controller_name) except Pyro.errors.NamingError, x: if str(x) == "name not found": if (time.time()-start_time) >= timeout_seconds: raise # Couldn't find experiment controller on Pyro network time.sleep(retry_interval_seconds) else: raise # unknown error # attribute error: check: stimkey == short_name + "_server" self.meta_params = self.meta_controller.get_parameters() self.connected = 1 if hasattr(self,'connected_text'): # EPhysGUI client suppresses this self.connected_text.set("Server status: Connected") def quit_server(self,dummy=None): self.meta_controller.quit_server() self.connected = 0 if hasattr(self,'connected_text'): # EPhysGUI client suppresses this label self.connected_text.set("Server status: Not connected") if __name__=='__main__': frame = StimulusControlFrame() frame.pack(expand=Tkinter.YES,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/EPhysServer.py0000755000076500000240000003167011227360015021140 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: EPhysServer # # Copyright (C) 2001-2004 Andrew Straw, # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd # Copyright (C) 2004 California Institute of Technology # # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. import VisionEgg import sys, os, math import parser, symbol, token, compiler import tkMessageBox import pygame.display import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.SphereMap import VisionEgg.Text import VisionEgg.Textures import VisionEgg.PyroHelpers import Pyro, Pyro.core # AST extensions: import VisionEgg.PyroApps.AST_ext as AST_ext # Add your stimulus modules here import VisionEgg.PyroApps.TargetServer import VisionEgg.PyroApps.MouseTargetServer import VisionEgg.PyroApps.FlatGratingServer import VisionEgg.PyroApps.SphereGratingServer import VisionEgg.PyroApps.SpinningDrumServer import VisionEgg.PyroApps.GridServer import VisionEgg.PyroApps.ColorCalServer import VisionEgg.PyroApps.DropinServer server_modules = [ VisionEgg.PyroApps.TargetServer, VisionEgg.PyroApps.MouseTargetServer, VisionEgg.PyroApps.FlatGratingServer, VisionEgg.PyroApps.SphereGratingServer, VisionEgg.PyroApps.SpinningDrumServer, VisionEgg.PyroApps.GridServer, VisionEgg.PyroApps.ColorCalServer, VisionEgg.PyroApps.DropinServer ] # 3D screen positioning parameters from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters class EPhysServer( Pyro.core.ObjBase ): def __init__(self, presentation, server_modules ): Pyro.core.ObjBase.__init__(self) self.stimdict = {} self.stimkey = server_modules[0].get_meta_controller_stimkey() # first stimulus will be this self.quit_status = False self.exec_demoscript_flag = False self.presentation = presentation # target for stimulus onset calibration self.onset_cal_bg = VisionEgg.MoreStimuli.Target2D(color=(0.0,0.0,0.0,1.0), position=(30.0,30.0), anchor='center', size=(50.0,50.0)) self.onset_cal_fg = VisionEgg.MoreStimuli.Target2D(on=0, color=(1.0,1.0,1.0,1.0), position=(30.0,30.0), anchor='center', size=(50.0,50.0)) self.presentation.add_controller(self.onset_cal_fg,'on',VisionEgg.FlowControl.ConstantController(during_go_value=1, between_go_value=0)) # get screen (hack) self.onset_cal_screen = self.presentation.parameters.viewports[0].parameters.screen self.onset_cal_viewport = VisionEgg.Core.Viewport(screen=self.onset_cal_screen, stimuli=[self.onset_cal_bg, self.onset_cal_fg] ) for server_module in server_modules: stimkey = server_module.get_meta_controller_stimkey() klass = server_module.get_meta_controller_class() make_stimuli = server_module.make_stimuli self.stimdict[stimkey] = (klass, make_stimuli) def __del__(self): self.presentation.remove_controller(self.onset_cal_fg,'on') Pyro.core.ObjBase.__del__(self) def get_quit_status(self): return self.quit_status def set_quit_status(self,quit_status): self.quit_status = quit_status self.presentation.parameters.quit = quit_status def first_connection(self): # break out of initial run_forever loop self.presentation.parameters.quit = True def set_stim_onset_cal(self, on): if on: if self.onset_cal_viewport not in self.presentation.parameters.viewports: self.presentation.parameters.viewports.append(self.onset_cal_viewport) else: if self.onset_cal_viewport in self.presentation.parameters.viewports: self.presentation.parameters.viewports.remove(self.onset_cal_viewport) def set_stim_onset_cal_location(self, center, size): self.onset_cal_bg.parameters.position = center self.onset_cal_fg.parameters.position = center self.onset_cal_bg.parameters.size = size self.onset_cal_fg.parameters.size = size[0]-2,size[1]-2 def get_stim_onset_cal_location(self): x,y = self.onset_cal_bg.parameters.position width,height = self.onset_cal_bg.parameters.size return x,y,width,height def set_gamma_ramp(self, red, blue, green): return pygame.display.set_gamma_ramp(red,green,blue) def is_in_go_loop(self): return self.presentation.is_in_go_loop() def were_frames_dropped_in_last_go_loop(self): return self.presentation.were_frames_dropped_in_last_go_loop() def get_last_go_loop_start_time_absolute_sec(self): return self.presentation.get_last_go_loop_start_time_absolute_sec() def set_override_t_abs_sec(self, value_sec_string): value_sec = float(value_sec_string) # Pyro loses precision self.presentation.parameters.override_t_abs_sec = value_sec def get_next_stimulus_meta_controller(self): if self.stimkey: klass, make_stimuli = self.stimdict[self.stimkey] stimuli = make_stimuli() return self.stimkey, klass, stimuli else: raise RuntimeError("No stimkey") def get_stimkey(self): return self.stimkey def set_next_stimkey(self,stimkey): self.stimkey = stimkey def get_cwd(self): return os.path.abspath(os.curdir) def save_image_sequence(self,fps=12.0,filename_base="im",filename_suffix=".tif",save_dir="."): try: self.presentation.export_movie_go(frames_per_sec=fps, filename_base=filename_base, filename_suffix=filename_suffix, path=save_dir ) except Exception,x: # do this because Pyro doesn't (by default) print a traceback import traceback traceback.print_exc() raise def build_AST(self, source): AST = parser.suite(source) self.AST = AST def exec_AST(self, screen, dropin_meta_params): if dropin_meta_params.vars_list is not None: for var in dropin_meta_params.vars_list: self.AST = AST_ext.modify_AST(self.AST, var[0], var[1]) code_module = self.AST.compile() exec code_module in locals() self.script_dropped_frames = p.were_frames_dropped_in_last_go_loop() self.presentation.last_go_loop_start_time_absolute_sec = p.last_go_loop_start_time_absolute_sec # evil hack... self.exec_demoscript_flag = False def run_demoscript(self): self.exec_demoscript_flag = True def start_server( server_modules, server_class=EPhysServer ): loadNewExpr = True pyro_server = VisionEgg.PyroHelpers.PyroServer() # get Vision Egg stimulus ready to go screen = VisionEgg.Core.Screen.create_default() temp = ScreenPositionParameters() projection = VisionEgg.Core.PerspectiveProjection(temp.left, temp.right, temp.bottom, temp.top, temp.near, temp.far) perspective_viewport = VisionEgg.Core.Viewport(screen=screen, projection=projection) overlay2D_viewport = VisionEgg.Core.Viewport(screen=screen) p = VisionEgg.FlowControl.Presentation(viewports=[perspective_viewport, overlay2D_viewport]) # 2D overlay on top print 'main Presentation',p wait_text = VisionEgg.Text.Text( text = "Starting up...", position = (screen.size[0]/2.0,5), anchor='bottom', color = (1.0,0.0,0.0,0.0)) overlay2D_viewport.parameters.stimuli = [wait_text] p.between_presentations() # draw wait_text # now hand over control of projection to ScreenPositionMetaController projection_controller = ScreenPositionMetaController(p,projection) pyro_server.connect(projection_controller,"projection_controller") ephys_server = server_class(p, server_modules) pyro_server.connect(ephys_server,"ephys_server") hostname,port = pyro_server.get_hostname_and_port() wait_text.parameters.text = "Waiting for connection at %s port %d"%(hostname,port) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) p.run_forever() # run until we get first connnection, which breaks out immmediately wait_text.parameters.text = "Loading new experiment, please wait." while not ephys_server.get_quit_status(): # this flow control configuration SEEMS to be stable for # contiguously loaded scripts more rigorous testing would be # appreciated if loadNewExpr: wait_text.parameters.text = "Loading new experiment, please wait." perspective_viewport.parameters.stimuli = [] overlay2D_viewport.parameters.stimuli = [wait_text] p.between_presentations() # draw wait_text pyro_name, meta_controller_class, stimulus_list = ephys_server.get_next_stimulus_meta_controller() stimulus_meta_controller = meta_controller_class(screen, p, stimulus_list) # instantiate meta_controller pyro_server.connect(stimulus_meta_controller, pyro_name) if ephys_server.get_stimkey() == "dropin_server": wait_text.parameters.text = "Vision Egg script mode" p.parameters.enter_go_loop = False p.parameters.quit = False p.run_forever() # At this point quit signal was sent by client to either: # 1) Execute the script (ie. "exec_demoscript_flag" has # been set) # 2) Load a DIFFERENT script ("loadNewExpr" should be set # to False in this event) # 3) Load a BUILT IN experiment ("loadNewExpr" should be # set to True in this event) if ephys_server.exec_demoscript_flag: dropin_meta_params = stimulus_meta_controller.get_parameters() ephys_server.exec_AST(screen, dropin_meta_params) if ephys_server.get_stimkey() == "dropin_server": # Either: # 1) Same script (just finished executing) # 2) Loading a new script loadNewExpr = False else: # 3) load a BUILT IN experiment pyro_server.disconnect(stimulus_meta_controller) del stimulus_meta_controller # we have to do this explicitly because Pyro keeps a copy of the reference loadNewExpr = True else: overlay2D_viewport.parameters.stimuli = [] # clear wait_text for stim in stimulus_list: if stim[0] == '3d_perspective': perspective_viewport.parameters.stimuli.append(stim[1]) elif stim[0] == '3d_perspective_with_set_viewport_callback': key, stimulus, callback_function = stim callback_function(perspective_viewport) perspective_viewport.parameters.stimuli.append(stimulus) elif stim[0] == '2d_overlay': overlay2D_viewport.parameters.stimuli.append(stim[1]) else: raise RuntimeError("Unknown viewport id %s"%stim[0]) # enter loop p.parameters.enter_go_loop = False p.parameters.quit = False p.run_forever() # At this point quit signal was sent by client to either: # 1) Load a script ("loadNewExpr" should be set to 1 in # this event) # 2) Load a BUILT IN experiment ("loadNewExpr" should be # set to 1 in this event) pyro_server.disconnect(stimulus_meta_controller) del stimulus_meta_controller # we have to do this explicitly because Pyro keeps a copy of the reference if __name__ == '__main__': start_server( server_modules ) visionegg-1.2.1/VisionEgg/PyroApps/FlatGratingGUI.py0000755000076500000240000001742111227360015021466 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: FlatGratingGUI # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """Handle sinusoidal gratings (client-side)""" import VisionEgg, string import sys, os import Tkinter import VisionEgg.PyroApps.EPhysGUIUtils as client_utils def get_control_list(): return [("flat_grating_server",FlatGratingControlFrame,FlatGratingControlFrame.title)] class FlatGratingMetaParameters: def __init__(self): self.contrast = 1.0 self.orient = 0.0 self.sf = 0.01 # cycles per pixel self.tf = 1.0 self.size_x = 200.0 self.size_y = 200.0 self.center_x = 320.0 self.center_y = 240.0 self.pre_stim_sec = 1.0 self.stim_sec = 2.0 self.post_stim_sec = 1.0 class FlatGratingControlFrame(client_utils.StimulusControlFrame): title = "Grating (2D) Experiment" def __init__(self, master=None, suppress_go_buttons=0,**kw): client_utils.StimulusControlFrame.__init__(self, master, suppress_go_buttons, FlatGratingControlFrame.title, FlatGratingMetaParameters, **kw) param_frame = self.param_frame # shorthand for self.param_frame created in base class # Allow columns to expand param_frame.columnconfigure(0,weight=1) param_frame.columnconfigure(1,weight=1) pf_row = 0 Tkinter.Label(param_frame,text="Contrast:").grid(row=pf_row,column=0) self.contrast_tk_var = Tkinter.DoubleVar() self.contrast_tk_var.set(self.meta_params.contrast) self.make_callback_entry(textvariable=self.contrast_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Contrast"] = ("contrast",self.contrast_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Orientation (deg):").grid(row=pf_row,column=0) self.orient_tk_var = Tkinter.DoubleVar() self.orient_tk_var.set(self.meta_params.orient) self.make_callback_entry(textvariable=self.orient_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Orientation"] = ("orient",self.orient_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Spatial frequency (Cpp):").grid(row=pf_row,column=0) self.sf_tk_var = Tkinter.DoubleVar() self.sf_tk_var.set(self.meta_params.sf) self.make_callback_entry(textvariable=self.sf_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Spatial frequency"] = ("sf",self.sf_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Temporal frequency (Hz):").grid(row=pf_row,column=0) self.tf_tk_var = Tkinter.DoubleVar() self.tf_tk_var.set(self.meta_params.tf) self.make_callback_entry(textvariable=self.tf_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Temporal frequency"] = ("tf",self.tf_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Size X (pixels):").grid(row=pf_row,column=0) self.size_x_tk_var = Tkinter.DoubleVar() self.size_x_tk_var.set(self.meta_params.size_x) self.make_callback_entry(textvariable=self.size_x_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Size X"] = ("size_x",self.size_x_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Size Y (pixels):").grid(row=pf_row,column=0) self.size_y_tk_var = Tkinter.DoubleVar() self.size_y_tk_var.set(self.meta_params.size_y) self.make_callback_entry(textvariable=self.size_y_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Size Y"] = ("size_y",self.size_y_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Center X (pixels):").grid(row=pf_row,column=0) self.center_x_tk_var = Tkinter.DoubleVar() self.center_x_tk_var.set(self.meta_params.center_x) self.make_callback_entry(textvariable=self.center_x_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Center X"] = ("center_x",self.center_x_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Center Y (pixels):").grid(row=pf_row,column=0) self.center_y_tk_var = Tkinter.DoubleVar() self.center_y_tk_var.set(self.meta_params.center_y) self.make_callback_entry(textvariable=self.center_y_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Center Y"] = ("center_y",self.center_y_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0) self.prestim_dur_tk_var = Tkinter.DoubleVar() self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0) self.stim_dur_tk_var = Tkinter.DoubleVar() self.stim_dur_tk_var.set(self.meta_params.stim_sec) self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0) self.poststim_dur_tk_var = Tkinter.DoubleVar() self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=1) def get_shortname(self): return "flat_grating" def update_tk_vars(self): self.contrast_tk_var.set( self.meta_params.contrast ) self.orient_tk_var.set( self.meta_params.orient ) self.sf_tk_var.set( self.meta_params.sf ) self.tf_tk_var.set( self.meta_params.tf ) self.size_x_tk_var.set( self.meta_params.size_x ) self.size_y_tk_var.set( self.meta_params.size_y ) self.center_x_tk_var.set( self.meta_params.center_x ) self.center_y_tk_var.set( self.meta_params.center_y ) self.prestim_dur_tk_var.set( self.meta_params.pre_stim_sec ) self.stim_dur_tk_var.set( self.meta_params.stim_sec ) self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec ) def send_values(self,dummy_arg=None): self.meta_params.contrast = self.contrast_tk_var.get() self.meta_params.orient = self.orient_tk_var.get() self.meta_params.sf = self.sf_tk_var.get() self.meta_params.tf = self.tf_tk_var.get() self.meta_params.size_x = self.size_x_tk_var.get() self.meta_params.size_y = self.size_y_tk_var.get() self.meta_params.center_x = self.center_x_tk_var.get() self.meta_params.center_y = self.center_y_tk_var.get() self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() if self.connected: self.meta_controller.set_parameters( self.meta_params ) def get_duration_sec(self): self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec if __name__=='__main__': frame = FlatGratingControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/FlatGratingServer.py0000755000076500000240000001110711227360015022303 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: FlatGratingServer # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """Handle sinusoidal gratings (server-side)""" import VisionEgg, string import sys, os, math import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.Gratings import VisionEgg.PyroHelpers import Pyro.core from VisionEgg.PyroApps.FlatGratingGUI import FlatGratingMetaParameters class FlatGratingExperimentMetaController( Pyro.core.ObjBase ): def __init__(self,screen,presentation,stimuli): # get stimulus assert( stimuli[0][0] == '2d_overlay') grating = stimuli[0][1] Pyro.core.ObjBase.__init__(self) self.meta_params = FlatGratingMetaParameters() if not isinstance(screen,VisionEgg.Core.Screen): raise ValueError("Expecting instance of VisionEgg.Core.Screen") if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") if not isinstance(grating,VisionEgg.Gratings.SinGrating2D): raise ValueError("Expecting instance of VisionEgg.Gratings.SinGrating2D") self.p = presentation self.stim = grating screen.parameters.bgcolor = (0.5, 0.5, 0.5, 0.0) self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController( during_go_func=self.on_function_during_go, between_go_func=self.on_function_between_go)) def __del__(self): self.p.remove_controller(self.stim,'on') Pyro.core.ObjBase.__del__(self) # call base class def on_function_during_go(self,t): """Compute when the grating is on""" if t <= self.meta_params.pre_stim_sec: return 0 # not on yet elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): return 1 # on else: return 0 # off again def on_function_between_go(self): """Compute when the grating is off""" return 0 # off again def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, FlatGratingMetaParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of FlatGratingMetaParameters") self.update() def update(self): stim_params = self.stim.parameters # shorthand meta_params = self.meta_params # shorthand stim_params.contrast = meta_params.contrast stim_params.orientation = meta_params.orient stim_params.spatial_freq = meta_params.sf stim_params.temporal_freq_hz = meta_params.tf stim_params.size = (meta_params.size_x, meta_params.size_y) stim_params.position = (meta_params.center_x, meta_params.center_y) self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds') def go(self): self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 def get_meta_controller_class(): return FlatGratingExperimentMetaController def make_stimuli(): stimulus = VisionEgg.Gratings.SinGrating2D( spatial_freq=1.0/100.0, # wavelength = 100 pixels temporal_freq_hz = 1.0, anchor='center', ) return [('2d_overlay',stimulus)] def get_meta_controller_stimkey(): return "flat_grating_server" # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() screen = VisionEgg.Core.Screen.create_default() # get Vision Egg stimulus ready to go stimuli = make_stimuli() stimulus = stimuli[0][1] viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus]) p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) # now hand over control of grating and mask to FlatGratingExperimentMetaController meta_controller = FlatGratingExperimentMetaController(screen,p,stimuli) pyro_server.connect(meta_controller,get_meta_controller_stimkey()) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/VisionEgg/PyroApps/GridGUI.py0000755000076500000240000000341611227360015020150 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: GridGUI # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. import VisionEgg, string import sys, os import Tkinter import VisionEgg.PyroApps.EPhysGUIUtils as client_utils def get_control_list(): return [("grid_server",GridControlFrame,GridControlFrame.title)] class GridMetaParameters: def __init__(self): pass class GridControlFrame(client_utils.StimulusControlFrame): title = "Grid for 3D calibration" def __init__(self, master=None, suppress_go_buttons=0,**kw): client_utils.StimulusControlFrame.__init__(self, master, suppress_go_buttons, GridControlFrame.title, GridMetaParameters, **kw) Tkinter.Label( self.param_frame, text="No variables to control" ).grid() def get_shortname(self): """Used as basename for saving parameter files""" return "grid" def update_tk_vars(self): pass def send_values(self,dummy_arg=None): pass if self.connected: self.meta_controller.set_parameters( self.meta_params ) def get_duration_sec(self): return 0.0 if __name__=='__main__': frame = GridControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/GridServer.py0000755000076500000240000000772211227360015020776 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: GridServer # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. import VisionEgg, string import sys, os, math import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.Textures import VisionEgg.SphereMap import VisionEgg.PyroHelpers import Pyro.core from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters from VisionEgg.PyroApps.GridGUI import GridMetaParameters class GridMetaController( Pyro.core.ObjBase ): def __init__(self,screen,presentation,stimuli): # get the instance of Stimulus that was created assert( stimuli[0][0] == '3d_perspective_with_set_viewport_callback' ) grid = stimuli[0][1] Pyro.core.ObjBase.__init__(self) self.meta_params = GridMetaParameters() if not isinstance(screen,VisionEgg.Core.Screen): raise ValueError("Expecting instance of VisionEgg.Core.Screen") if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") if not isinstance(grid,VisionEgg.SphereMap.AzElGrid): raise ValueError("Expecting instance of VisionEgg.SphereMap.SphereMap") self.p = presentation self.stim = grid screen.parameters.bgcolor = (1.0, 1.0, 1.0, 0.0) def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, GridMetaParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of GridMetaParameters") self.update() def update(self): self.p.parameters.go_duration = ( 0.0, 'seconds') def go(self): self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 def get_meta_controller_class(): return GridMetaController def make_stimuli(): stimulus = VisionEgg.SphereMap.AzElGrid() def set_az_el_grid_viewport(viewport): stimulus.parameters.my_viewport = viewport return [('3d_perspective_with_set_viewport_callback',stimulus,set_az_el_grid_viewport)] # return ordered list of tuples def get_meta_controller_stimkey(): return "grid_server" # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() screen = VisionEgg.Core.Screen.create_default() # get Vision Egg stimulus ready to go stimuli = make_stimuli() stimulus = stimuli[0][1] temp = ScreenPositionParameters() projection = VisionEgg.Core.PerspectiveProjection(temp.left, temp.right, temp.bottom, temp.top, temp.near, temp.far) viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus],projection=projection) p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) # now hand over control of projection to ScreenPositionMetaController projection_controller = ScreenPositionMetaController(p,projection) pyro_server.connect(projection_controller,"projection_controller") # now hand over control of drum to GridMetaController meta_controller = GridMetaController(screen,p,stimuli) pyro_server.connect(meta_controller,get_meta_controller_stimkey()) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/VisionEgg/PyroApps/MouseTargetGUI.py0000755000076500000240000000723711227360015021527 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: MouseTargetGUI # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """Handle mouse controlled small target stimulus (client-side)""" import VisionEgg, string import sys, os import Tkinter import VisionEgg.PyroApps.EPhysGUIUtils as client_utils def get_control_list(): return [("mouse_target_server",MouseTargetControlFrame,MouseTargetControlFrame.title)] class MouseTargetMetaParameters: def __init__(self): # colors self.color = (0.0, 0.0, 0.0, 1.0) self.bgcolor = (1.0, 1.0, 1.0, 0.0) class MouseTargetControlFrame(client_utils.StimulusControlFrame): title = "Mouse Controlled Moving Target" def __init__(self, master=None, suppress_go_buttons=0,**kw): client_utils.StimulusControlFrame.__init__(self, master, suppress_go_buttons, MouseTargetControlFrame.title, MouseTargetMetaParameters, **kw) param_frame = self.param_frame # shorthand for self.param_frame created in base class # Allow columns to expand param_frame.columnconfigure(0,weight=1) param_frame.columnconfigure(1,weight=1) pf_row = 0 Tkinter.Label(param_frame,text="Color:").grid(row=pf_row,column=0) self.color_tk_var = Tkinter.StringVar() self.color_tk_var.set("black on white") bar = Tkinter.Menubutton(param_frame, textvariable=self.color_tk_var, relief=Tkinter.RAISED) bar.grid(row=pf_row, column=2, sticky=Tkinter.W+Tkinter.E, pady=2, padx=2) bar.menu = Tkinter.Menu(bar,tearoff=0) bar.menu.add_radiobutton(label="white on black", value="white on black", variable=self.color_tk_var, command=self.send_values) bar.menu.add_radiobutton(label="black on white", value="black on white", variable=self.color_tk_var, command=self.send_values) bar['menu'] = bar.menu def get_shortname(self): return "mouse_target" def update_tk_vars(self): if self.meta_params.color == (0.0,0.0,0.0,1.0) and self.meta_params.bgcolor == (1.0,1.0,1.0,0.0): self.color_tk_var.set( "black on white" ) elif self.meta_params.color == (1.0,1.0,1.0,1.0) and self.meta_params.bgcolor == (0.0,0.0,0.0,0.0): self.color_tk_var.set( "white on black" ) else: raise RuntimeError("Cannot set tk variable for color") def send_values(self,dummy_arg=None): if self.color_tk_var.get() == "black on white": self.meta_params.color = (0.0,0.0,0.0,1.0) self.meta_params.bgcolor = (1.0,1.0,1.0,0.0) elif self.color_tk_var.get() == "white on black": self.meta_params.color = (1.0,1.0,1.0,1.0) self.meta_params.bgcolor = (0.0,0.0,0.0,0.0) if self.connected: self.meta_controller.set_parameters( self.meta_params ) def get_duration_sec(self): return 0.0 if __name__=='__main__': frame = MouseTargetControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/MouseTargetServer.py0000755000076500000240000002074711227360015022352 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: MouseTargetServer # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """Handle mouse-controlled small targets (server-side)""" import VisionEgg, string import VisionEgg.ParameterTypes as ve_types import sys, os, math import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.MoreStimuli import VisionEgg.PyroHelpers import Pyro.core import pygame, pygame.locals from VisionEgg.PyroApps.MouseTargetGUI import MouseTargetMetaParameters # Variables to store the mouse position mouse_position = (320.0, 240.0) last_mouse_position = (0.0,0.0) # target size global variables target_w = 50.0 target_h = 10.0 # key state global variables up = 0 down = 0 left = 0 right = 0 def keydown(event): global up, down, left, right if event.key == pygame.locals.K_UP: up = 1 elif event.key == pygame.locals.K_DOWN: down = 1 elif event.key == pygame.locals.K_RIGHT: right = 1 elif event.key == pygame.locals.K_LEFT: left = 1 def keyup(event): global up, down, left, right if event.key == pygame.locals.K_UP: up = 0 elif event.key == pygame.locals.K_DOWN: down = 0 elif event.key == pygame.locals.K_RIGHT: right = 0 elif event.key == pygame.locals.K_LEFT: left = 0 handle_event_callbacks = [(pygame.locals.KEYDOWN, keydown), (pygame.locals.KEYUP, keyup)] class MouseTargetExperimentMetaController( Pyro.core.ObjBase ): def __init__(self,screen,presentation,stimuli): global screen_global screen_global = screen # get stimulus assert( stimuli[0][0] == '2d_overlay') target = stimuli[0][1] Pyro.core.ObjBase.__init__(self) self.meta_params = MouseTargetMetaParameters() if not isinstance(screen,VisionEgg.Core.Screen): raise ValueError("Expecting instance of VisionEgg.Core.Screen") if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") if not isinstance(target,VisionEgg.MoreStimuli.Target2D): raise ValueError("Expecting instance of VisionEgg.MoreStimuli.Target2D") self.screen = screen self.p = presentation self.stim = target self.p.add_controller(target,'position', TargetPositionController()) self.p.add_controller(target,'size', VisionEgg.FlowControl.FunctionController(during_go_func=get_target_size, between_go_func=get_target_size) ) self.p.add_controller(target,'orientation', TargetOrientationController() ) self.mouse_position_controller = MousePositionController() self.p.add_controller(None,None,self.mouse_position_controller) self.orig_event_handlers = self.p.parameters.handle_event_callbacks self.p.parameters.handle_event_callbacks = handle_event_callbacks self.update() # set stimulus parameters to initial defaults def __del__(self): self.p.parameters.handle_event_callbacks = self.orig_event_handlers self.p.remove_controller(None,None,self.mouse_position_controller) self.p.remove_controller(self.stim,'position') self.p.remove_controller(self.stim,'size') self.p.remove_controller(self.stim,'orientation') def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, MouseTargetMetaParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of MouseTargetMetaParameters") self.update() def update(self): stim_params = self.stim.parameters # shorthand meta_params = self.meta_params # shorthand # colors stim_params.color = meta_params.color self.screen.parameters.bgcolor = meta_params.bgcolor def go(self): pass #self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 def get_meta_controller_class(): return MouseTargetExperimentMetaController def make_stimuli(): stimulus = VisionEgg.MoreStimuli.Target2D(anchor='center') return [('2d_overlay',stimulus)] def get_meta_controller_stimkey(): return "mouse_target_server" ######################## # Define controllers # ######################## class MousePositionController( VisionEgg.FlowControl.Controller ): def __init__(self): global mouse_position VisionEgg.FlowControl.Controller.__init__(self, return_type=ve_types.get_type(None), eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) self.between_go_eval = self.during_go_eval def during_go_eval(self,t=None): # Convert pygame mouse position to OpenGL position global mouse_position, last_mouse_position, screen_global just_current_pos = mouse_position (x,y) = pygame.mouse.get_pos() y = screen_global.size[1]-y mouse_position = (x,y) if just_current_pos != mouse_position: last_mouse_position = just_current_pos return None class TargetPositionController( VisionEgg.FlowControl.Controller ): def __init__(self): global mouse_position VisionEgg.FlowControl.Controller.__init__(self, return_type=ve_types.Sequence2(ve_types.Real), eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) self.between_go_eval = self.during_go_eval def during_go_eval(self,t=None): global mouse_position return mouse_position def cross_product(b,c): """Cross product between vectors, represented as tuples of length 3.""" det_i = b[1]*c[2] - b[2]*c[1] det_j = b[0]*c[2] - b[2]*c[0] det_k = b[0]*c[1] - b[1]*c[0] return (det_i,-det_j,det_k) def mag(b): """Magnitude of a vector.""" return b[0]**2.0 + b[1]**2.0 + b[2]**2.0 class TargetOrientationController( VisionEgg.FlowControl.Controller ): def __init__(self): VisionEgg.FlowControl.Controller.__init__(self, return_type=ve_types.Real, eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME) self.c = (0.0,0.0,1.0) self.last_orientation = 0.0 self.between_go_eval = self.during_go_eval def during_go_eval(self): global mouse_position, last_mouse_position b = (float(last_mouse_position[0]-mouse_position[0]), float(last_mouse_position[1]-mouse_position[1]), 0.0) if mag(b) > 1.0: # Must mouse 1 pixel before changing orientation (supposed to reject noise) # find cross product b x c. assume b and c are 3-vecs, b has # 3rd component 0. orientation_vector = cross_product(b,self.c) self.last_orientation = math.atan2(orientation_vector[1],orientation_vector[0])/math.pi*180.0 return self.last_orientation def get_target_size(t=None): global target_w, target_h global up, down, left, right amount = 0.02 if up: target_w = target_w+(amount*target_w) elif down: target_w = target_w-(amount*target_w) elif right: target_h = target_h+(amount*target_h) elif left: target_h = target_h-(amount*target_h) target_w = max(target_w,0.0) target_h = max(target_h,0.0) return (target_w, target_h) # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() screen = VisionEgg.Core.Screen.create_default() # get Vision Egg stimulus ready to go stimuli = make_stimuli() stimulus = stimuli[0][1] viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus]) p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) # now hand over control of grating and mask to FlatGratingExperimentMetaController meta_controller = MouseTargetExperimentMetaController(screen,p,stimuli) pyro_server.connect(meta_controller,get_meta_controller_stimkey()) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/VisionEgg/PyroApps/ScreenPositionGUI.py0000755000076500000240000005660711227360015022241 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: ScreenPositionGUI # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """Handle 3D perspective projection (client-side)""" import sys, os, pickle, math, string import Tkinter, tkFileDialog import Pyro.core import VisionEgg.PyroClient import StringIO class ScreenPositionParameters: def __init__(self): # frustum (initial values - view portion of unit sphere) self.left = -0.2 self.right = 0.2 self.top = 0.2 self.bottom = -0.2 self.near = 0.2 self.far = 20.0 # position/orientation self.eye = (0.0, 0.0, 0.0) # observer position self.center = (0.0, 0.0, -1.0) # center of gaze self.up = (0.0, 1.0, 0.0) # up vector class CallbackEntry(Tkinter.Entry): def __init__(self,master=None,callback=None,**kw): Tkinter.Entry.__init__(self,master, **kw) self.bind('',callback) self.bind('',callback) class ScreenPositionControlFrame(Tkinter.Frame): def __init__(self, master=None, auto_connect=0, server_hostname='', server_port=7766, **kw): Tkinter.Frame.__init__(self,master,**kw) self.pyro_client = None self.entry_width = 10 self.connected = 0 self.meta_params = ScreenPositionParameters() self.loopable_variables = {} row = 0 Tkinter.Label(self, text="3D Perspective Calibration", font=("Helvetica",12,"bold")).grid(row=row,column=0,columnspan=2) row += 1 Tkinter.Label(self, text="This dialog allows you to enter acheive "+\ "the proper perspective distortion for 3D scenes." ).grid(row=row,column=0,columnspan=2) if not auto_connect: row += 1 # let columns expand connected_frame = Tkinter.Frame(self) connected_frame.grid(row=row,column=0,columnspan=2,sticky=Tkinter.W+Tkinter.E) connected_frame.columnconfigure(0,weight=1) connected_frame.columnconfigure(1,weight=1) connected_frame.columnconfigure(2,weight=1) self.connected_label = Tkinter.Label(connected_frame,text="Server status: Not connected") self.connected_label.grid(row=0,column=0) Tkinter.Button(connected_frame,text="Connect",command=self.connect).grid(row=0,column=1) Tkinter.Button(connected_frame,text="Quit server",command=self.quit_server).grid(row=0,column=2) row += 1 param_frame = Tkinter.Frame(self) param_frame.grid(row=row,column=0,sticky=Tkinter.N) param_frame.columnconfigure(0,weight=1) param_frame.columnconfigure(1,weight=1) pf_row = 0 frustum_frame = Tkinter.Frame(param_frame) frustum_frame.grid(row=pf_row,column=0,columnspan=2,ipady=5) ff_row = 0 Tkinter.Label(frustum_frame, text="Viewing volume size", font=("Helvetica",12,"bold")).grid(row=ff_row,column=0,columnspan=3,ipady=5) ff_row += 1 Tkinter.Label(frustum_frame,text="Left:").grid(row=ff_row,column=0) self.left_tk_var = Tkinter.DoubleVar() self.left_tk_var.set(self.meta_params.left) CallbackEntry(frustum_frame, self.send_values, width=self.entry_width, textvariable=self.left_tk_var).grid(row=ff_row,column=1) ff_row += 1 Tkinter.Label(frustum_frame,text="Right:").grid(row=ff_row,column=0) self.right_tk_var = Tkinter.DoubleVar() self.right_tk_var.set(self.meta_params.right) CallbackEntry(frustum_frame, self.send_values, width=self.entry_width, textvariable=self.right_tk_var).grid(row=ff_row,column=1) ff_row += 1 Tkinter.Label(frustum_frame,text="Top:").grid(row=ff_row,column=0) self.top_tk_var = Tkinter.DoubleVar() self.top_tk_var.set(self.meta_params.top) CallbackEntry(frustum_frame, self.send_values, width=self.entry_width, textvariable=self.top_tk_var).grid(row=ff_row,column=1) ff_row += 1 Tkinter.Label(frustum_frame,text="Bottom:").grid(row=ff_row,column=0) self.bottom_tk_var = Tkinter.DoubleVar() self.bottom_tk_var.set(self.meta_params.bottom) CallbackEntry(frustum_frame, self.send_values, width=self.entry_width, textvariable=self.bottom_tk_var).grid(row=ff_row,column=1) ff_row += 1 Tkinter.Label(frustum_frame,text="Near:").grid(row=ff_row,column=0) self.near_tk_var = Tkinter.DoubleVar() self.near_tk_var.set(self.meta_params.near) CallbackEntry(frustum_frame, self.send_values, width=self.entry_width, textvariable=self.near_tk_var).grid(row=ff_row,column=1) ff_row += 1 Tkinter.Label(frustum_frame,text="Far:").grid(row=ff_row,column=0) self.far_tk_var = Tkinter.DoubleVar() self.far_tk_var.set(self.meta_params.far) CallbackEntry(frustum_frame, self.send_values, width=self.entry_width, textvariable=self.far_tk_var).grid(row=ff_row,column=1) # quick frustum frame qf_frame = Tkinter.Frame(frustum_frame) qf_frame.grid(row=1,column=2,rowspan=ff_row) qf_row = 0 Tkinter.Button(qf_frame,text="Taller",command=self.frustum_taller).grid(row=qf_row,column=0,columnspan=2) qf_row += 1 Tkinter.Button(qf_frame,text="Narrower",command=self.frustum_narrower).grid(row=qf_row,column=0) Tkinter.Button(qf_frame,text="Wider",command=self.frustum_wider).grid(row=qf_row,column=1) qf_row += 1 Tkinter.Button(qf_frame,text="Shorter",command=self.frustum_shorter).grid(row=qf_row,column=0,columnspan=2) qf_row = 0 Tkinter.Button(qf_frame,text="Up",command=self.frustum_up).grid(row=qf_row,column=2,columnspan=2) qf_row += 1 Tkinter.Button(qf_frame,text="Left",command=self.frustum_left).grid(row=qf_row,column=2) Tkinter.Button(qf_frame,text="Right",command=self.frustum_right).grid(row=qf_row,column=3) qf_row += 1 Tkinter.Button(qf_frame,text="Down",command=self.frustum_down).grid(row=qf_row,column=2,columnspan=2) pf_row += 1 lookat_frame = Tkinter.Frame(param_frame) lookat_frame.grid(row=pf_row,column=0,columnspan=2,ipady=5) la_row = 0 Tkinter.Label(lookat_frame, text="Viewing volume orientation", font=("Helvetica",12,"bold")).grid(row=la_row,column=0,columnspan=3,ipady=5) la_row += 1 Tkinter.Label(lookat_frame,text="eye X:").grid(row=la_row,column=0) self.eye_x_tk_var = Tkinter.DoubleVar() self.eye_x_tk_var.set(self.meta_params.eye[0]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.eye_x_tk_var).grid(row=la_row,column=1) la_row += 1 Tkinter.Label(lookat_frame,text="eye Y:").grid(row=la_row,column=0) self.eye_y_tk_var = Tkinter.DoubleVar() self.eye_y_tk_var.set(self.meta_params.eye[1]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.eye_y_tk_var).grid(row=la_row,column=1) la_row += 1 Tkinter.Label(lookat_frame,text="eye Z:").grid(row=la_row,column=0) self.eye_z_tk_var = Tkinter.DoubleVar() self.eye_z_tk_var.set(self.meta_params.eye[2]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.eye_z_tk_var).grid(row=la_row,column=1) la_row += 1 Tkinter.Label(lookat_frame,text="look at X:").grid(row=la_row,column=0) self.center_x_tk_var = Tkinter.DoubleVar() self.center_x_tk_var.set(self.meta_params.center[0]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.center_x_tk_var).grid(row=la_row,column=1) quick_la_frame = Tkinter.Frame(lookat_frame) quick_la_frame.grid(row=la_row,column=2,rowspan=3) qla_row = 0 Tkinter.Button(quick_la_frame,text="Look at az -",command=self.az_decrease).grid(row=qla_row,column=0) Tkinter.Button(quick_la_frame,text="Look at az +",command=self.az_increase).grid(row=qla_row,column=1) self.look_at_az_str = Tkinter.StringVar() Tkinter.Label(quick_la_frame,textvariable=self.look_at_az_str).grid(row=qla_row,column=2) qla_row += 1 Tkinter.Button(quick_la_frame,text="Look at el -",command=self.el_decrease).grid(row=qla_row,column=0) Tkinter.Button(quick_la_frame,text="Look at el +",command=self.el_increase).grid(row=qla_row,column=1) self.look_at_el_str = Tkinter.StringVar() Tkinter.Label(quick_la_frame,textvariable=self.look_at_el_str).grid(row=qla_row,column=2) az,el = self.get_az_el(self.meta_params.center) self.look_at_az_str.set("%.1f"%az) self.look_at_el_str.set("%.1f"%el) la_row += 1 Tkinter.Label(lookat_frame,text="look at Y:").grid(row=la_row,column=0) self.center_y_tk_var = Tkinter.DoubleVar() self.center_y_tk_var.set(self.meta_params.center[1]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.center_y_tk_var).grid(row=la_row,column=1) la_row += 1 Tkinter.Label(lookat_frame,text="look at Z:").grid(row=la_row,column=0) self.center_z_tk_var = Tkinter.DoubleVar() self.center_z_tk_var.set(self.meta_params.center[2]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.center_z_tk_var).grid(row=la_row,column=1) la_row += 1 Tkinter.Label(lookat_frame,text="up X:").grid(row=la_row,column=0) self.up_x_tk_var = Tkinter.DoubleVar() self.up_x_tk_var.set(self.meta_params.up[0]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.up_x_tk_var).grid(row=la_row,column=1) quick_up_frame = Tkinter.Frame(lookat_frame) quick_up_frame.grid(row=la_row,column=2,rowspan=3) qup_row = 0 Tkinter.Button(quick_up_frame,text="Up az -",command=self.up_az_decrease).grid(row=qup_row,column=0) Tkinter.Button(quick_up_frame,text="Up az +",command=self.up_az_increase).grid(row=qup_row,column=1) self.up_az_str = Tkinter.StringVar() Tkinter.Label(quick_up_frame,textvariable=self.up_az_str).grid(row=qup_row,column=2) qup_row += 1 Tkinter.Button(quick_up_frame,text="Up el -",command=self.up_el_decrease).grid(row=qup_row,column=0) Tkinter.Button(quick_up_frame,text="Up el +",command=self.up_el_increase).grid(row=qup_row,column=1) self.up_el_str = Tkinter.StringVar() Tkinter.Label(quick_up_frame,textvariable=self.up_el_str).grid(row=qup_row,column=2) az,el = self.get_az_el(self.meta_params.up) self.up_az_str.set("%.1f"%az) self.up_el_str.set("%.1f"%el) la_row += 1 Tkinter.Label(lookat_frame,text="up Y:").grid(row=la_row,column=0) self.up_y_tk_var = Tkinter.DoubleVar() self.up_y_tk_var.set(self.meta_params.up[1]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.up_y_tk_var).grid(row=la_row,column=1) la_row += 1 Tkinter.Label(lookat_frame,text="up Z:").grid(row=la_row,column=0) self.up_z_tk_var = Tkinter.DoubleVar() self.up_z_tk_var.set(self.meta_params.up[2]) CallbackEntry(lookat_frame, self.send_values, width=self.entry_width, textvariable=self.up_z_tk_var).grid(row=la_row,column=1) row += 1 button_row_frame = Tkinter.Frame(self) button_row_frame.grid(row=row,column=0,ipady=5) Tkinter.Label(button_row_frame, text="File operations", font=("Helvetica",12,"bold")).grid(row=0,column=0,columnspan=2,ipady=5) Tkinter.Button(button_row_frame,text="Save...",command=self.save).grid(row=1,column=0) Tkinter.Button(button_row_frame,text="Load...",command=self.load).grid(row=1,column=1) if auto_connect: self.connect(server_hostname,server_port) def frustum_narrower(self,dummy_arg=None): # callback self.left_tk_var.set(self.meta_params.left*(1.0/1.05)) self.right_tk_var.set(self.meta_params.right*(1.0/1.05)) self.send_values() def frustum_wider(self,dummy_arg=None): # callback self.left_tk_var.set(self.meta_params.left*1.05) self.right_tk_var.set(self.meta_params.right*1.05) self.send_values() def frustum_shorter(self,dummy_arg=None): # callback self.bottom_tk_var.set(self.meta_params.bottom*(1.0/1.05)) self.top_tk_var.set(self.meta_params.top*(1.0/1.05)) self.send_values() def frustum_taller(self,dummy_arg=None): # callback self.bottom_tk_var.set(self.meta_params.bottom*1.05) self.top_tk_var.set(self.meta_params.top*1.05) self.send_values() def frustum_left(self,dummy_arg=None): # callback self.left_tk_var.set(self.meta_params.left*1.025) self.right_tk_var.set(self.meta_params.right*(1.0/1.025)) self.send_values() def frustum_right(self,dummy_arg=None): # callback self.left_tk_var.set(self.meta_params.left*(1.0/1.025)) self.right_tk_var.set(self.meta_params.right*1.025) self.send_values() def frustum_down(self,dummy_arg=None): # callback self.bottom_tk_var.set(self.meta_params.bottom*1.025) self.top_tk_var.set(self.meta_params.top*(1.0/1.025)) self.send_values() def frustum_up(self,dummy_arg=None): # callback self.bottom_tk_var.set(self.meta_params.bottom*(1.0/1.025)) self.top_tk_var.set(self.meta_params.top*1.025) self.send_values() def get_az_el(self,xyz_tuple): x,y,z = xyz_tuple r = math.sqrt(x*x + y*y + z*z) theta = math.acos(-y/r) rh = r * math.sin(theta) phi = math.atan2(-z,x) az = -(phi * 180.0/math.pi - 90.0) el = theta * 180.0/math.pi - 90.0 return az,el def get_xyz(self,az_el): az,el = az_el theta = (el + 90.0) / 180.0 * math.pi phi = (az + 90.0) / 180.0 * math.pi y = -math.cos(theta) rh = math.sin(theta) x = -rh * math.cos(phi) z = -rh * math.sin(phi) return x,y,z def az_increase(self,dummy_arg=None): # callback az,el = self.get_az_el(self.meta_params.center) az = az + 5.0 self.look_at_az_str.set("%.1f"%az) x,y,z = self.get_xyz((az,el)) self.center_x_tk_var.set("%.4f"%x) self.center_y_tk_var.set("%.4f"%y) self.center_z_tk_var.set("%.4f"%z) self.send_values() def az_decrease(self,dummy_arg=None): # callback az,el = self.get_az_el(self.meta_params.center) az = az - 5.0 self.look_at_az_str.set("%.1f"%az) x,y,z = self.get_xyz((az,el)) self.center_x_tk_var.set("%.4f"%x) self.center_y_tk_var.set("%.4f"%y) self.center_z_tk_var.set("%.4f"%z) self.send_values() def el_increase(self,dummy_arg=None): # callback az,el = self.get_az_el(self.meta_params.center) el = el + 5.0 el = min(el,90.0) self.look_at_el_str.set("%.1f"%el) x,y,z = self.get_xyz((az,el)) self.center_x_tk_var.set("%.4f"%x) self.center_y_tk_var.set("%.4f"%y) self.center_z_tk_var.set("%.4f"%z) self.send_values() def el_decrease(self,dummy_arg=None): # callback az,el = self.get_az_el(self.meta_params.center) el = el - 5.0 el = max(el,-90.0) self.look_at_el_str.set("%.1f"%el) x,y,z = self.get_xyz((az,el)) self.center_x_tk_var.set("%.4f"%x) self.center_y_tk_var.set("%.4f"%y) self.center_z_tk_var.set("%.4f"%z) self.send_values() def up_az_increase(self,dummy_arg=None): # callback az,el = self.get_az_el(self.meta_params.up) az = az + 5.0 self.up_az_str.set("%.1f"%az) x,y,z = self.get_xyz((az,el)) self.up_x_tk_var.set("%.4f"%x) self.up_y_tk_var.set("%.4f"%y) self.up_z_tk_var.set("%.4f"%z) self.send_values() def up_az_decrease(self,dummy_arg=None): # callback az,el = self.get_az_el(self.meta_params.up) az = az - 5.0 self.up_az_str.set("%.1f"%az) x,y,z = self.get_xyz((az,el)) self.up_x_tk_var.set("%.4f"%x) self.up_y_tk_var.set("%.4f"%y) self.up_z_tk_var.set("%.4f"%z) self.send_values() def up_el_increase(self,dummy_arg=None): # callback az,el = self.get_az_el(self.meta_params.up) el = el + 5.0 el = min(el,90.0) self.up_el_str.set("%.1f"%el) x,y,z = self.get_xyz((az,el)) self.up_x_tk_var.set("%.4f"%x) self.up_y_tk_var.set("%.4f"%y) self.up_z_tk_var.set("%.4f"%z) self.send_values() def up_el_decrease(self,dummy_arg=None): # callback az,el = self.get_az_el(self.meta_params.up) el = el - 5.0 el = max(el,-90.0) self.up_el_str.set("%.1f"%el) x,y,z = self.get_xyz((az,el)) self.up_x_tk_var.set("%.4f"%x) self.up_y_tk_var.set("%.4f"%y) self.up_z_tk_var.set("%.4f"%z) self.send_values() def save(self): filename = tkFileDialog.asksaveasfilename(defaultextension=".ve_3dproj",filetypes=[('Projection file','*.ve_3dproj')]) fd = open(filename,"wb") save_dict = self.get_param_dict() pickle.dump( save_dict, fd ) def load(self): filename = tkFileDialog.askopenfilename(defaultextension=".ve_3dproj",filetypes=[('Projection file','*.ve_3dproj')]) if not filename: return fd = open(filename,"rb") file_contents = fd.read() file_contents = file_contents.replace('\r\n','\n') # deal with Windows newlines memory_file = StringIO.StringIO(file_contents) load_dict = pickle.load(memory_file) self.set_param_dict( load_dict ) self.send_values() def get_shortname(self): """Used as basename for saving parameter files""" return "screen_position" def get_param_dict(self): result = {} for param_name in dir(self.meta_params): if param_name[:2] != '__' and param_name[-2:] != '__': result[param_name] = getattr(self.meta_params,param_name) return result def get_type(self): return "screenPositionGUI" def set_param_dict(self,new_param_dict): orig_params = dir(self.meta_params) for new_param_name in new_param_dict.keys(): if new_param_name[:2] != '__' and new_param_name[-2:] != '__': if new_param_name not in orig_params: raise ValueError('Gave parameter "%s", which I do not know about.'%(new_param_name,)) setattr(self.meta_params,new_param_name,new_param_dict[new_param_name]) self.left_tk_var.set( self.meta_params.left ) self.right_tk_var.set( self.meta_params.right ) self.top_tk_var.set( self.meta_params.top ) self.bottom_tk_var.set( self.meta_params.bottom ) self.near_tk_var.set( self.meta_params.near ) self.far_tk_var.set( self.meta_params.far ) self.eye_x_tk_var.set( self.meta_params.eye[0] ) self.eye_y_tk_var.set( self.meta_params.eye[1] ) self.eye_z_tk_var.set( self.meta_params.eye[2] ) self.center_x_tk_var.set( self.meta_params.center[0] ) self.center_y_tk_var.set( self.meta_params.center[1] ) self.center_z_tk_var.set( self.meta_params.center[2] ) self.up_x_tk_var.set( self.meta_params.up[0] ) self.up_y_tk_var.set( self.meta_params.up[1] ) self.up_z_tk_var.set( self.meta_params.up[2] ) def get_parameters_as_strings(self): result = [] for param_name in dir(self.meta_params): if param_name[:2] != '__' and param_name[-2:] != '__': value = getattr(self.meta_params,param_name) value_string = str(value) result.append((param_name,value_string)) return result def get_loopable_variable_names(self): return self.loopable_variables.keys() def set_loopable_variable(self,easy_name,value): meta_param_var_name,tk_var = self.loopable_variables[easy_name] setattr(self.meta_params,meta_param_var_name,value) tk_var.set(value) self.update() # update screen with new tk_var value def send_values(self,dummy_arg=None): self.meta_params.left = self.left_tk_var.get() self.meta_params.right = self.right_tk_var.get() self.meta_params.top = self.top_tk_var.get() self.meta_params.bottom = self.bottom_tk_var.get() self.meta_params.near = self.near_tk_var.get() self.meta_params.far = self.far_tk_var.get() self.meta_params.eye = (self.eye_x_tk_var.get(), self.eye_y_tk_var.get(), self.eye_z_tk_var.get()) self.meta_params.center = (self.center_x_tk_var.get(), self.center_y_tk_var.get(), self.center_z_tk_var.get()) self.meta_params.up = (self.up_x_tk_var.get(), self.up_y_tk_var.get(), self.up_z_tk_var.get()) if self.connected: self.projection_controller.set_parameters( self.meta_params ) def connect(self,server_hostname='',server_port=7766): self.pyro_client = VisionEgg.PyroClient.PyroClient(server_hostname,server_port) self.projection_controller = self.pyro_client.get("projection_controller") self.connected = 1 if hasattr(self, 'connected_label'): self.connected_label.config(text="Server status: Connected") self.send_values() # send values only when running this way, otherwise get values else: self.meta_params = self.projection_controller.get_parameters() self.set_param_dict( {} ) # updates screen values to self.meta_params def quit_server(self,dummy=None): self.projection_controller.quit_server() self.connected = 0 self.connected_label.config(text="Server status: Not connected") if __name__=='__main__': frame = ScreenPositionControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/ScreenPositionServer.py0000755000076500000240000001007411227360015023047 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: ScreenPositionServer # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """Handle 3D perspective projection (server-side)""" import Pyro.core import sys, os, string import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.SphereMap import VisionEgg.Textures import VisionEgg.PyroHelpers from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters class ScreenPositionMetaController( Pyro.core.ObjBase ): """Encapsulates all parameters controlling screen position""" def __init__(self,presentation,projection): Pyro.core.ObjBase.__init__(self) self.meta_params = ScreenPositionParameters() if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") if not isinstance(projection,VisionEgg.Core.PerspectiveProjection): raise ValueError("Expecting instance of VisionEgg.Core.PerspectiveProjection") self.p = presentation self.proj = projection def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, ScreenPositionParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of ScreenPositionParameters") self.update() def update(self): left = self.meta_params.left right = self.meta_params.right bottom = self.meta_params.bottom top = self.meta_params.top near = self.meta_params.near far = self.meta_params.far eye = (self.meta_params.eye[0], self.meta_params.eye[1], self.meta_params.eye[2]) center = (self.meta_params.center[0], self.meta_params.center[1], self.meta_params.center[2]) up = (self.meta_params.up[0], self.meta_params.up[1], self.meta_params.up[2]) temp = VisionEgg.Core.PerspectiveProjection(left,right,bottom,top,near,far) temp.look_at(eye,center,up) self.proj.parameters.matrix = temp.get_matrix() def go(self): self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() # get Vision Egg stimulus ready to go screen = VisionEgg.Core.Screen.create_default() filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data/az_el.png") texture = VisionEgg.Textures.Texture(filename) sphere_map = VisionEgg.SphereMap.SphereMap(texture=texture, shrink_texture_ok=1, stacks=100, slices=100) temp = ScreenPositionParameters() projection = VisionEgg.Core.PerspectiveProjection(temp.left, temp.right, temp.bottom, temp.top, temp.near, temp.far) viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[sphere_map],projection=projection) p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) # now hand over control of stimulus to GratingExperimentMetaController projection_controller = ScreenPositionMetaController(p,projection) pyro_server.connect(projection_controller,"projection_controller") # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/VisionEgg/PyroApps/SphereGratingGUI.py0000755000076500000240000002043611227360015022026 0ustar astrawstaff#!/usr/bin/env python """Handle perspective-distorted sinusoidal gratings (client-side)""" # Copyright (c) 2002-2003 Andrew Straw. Distributed under the terms # of the GNU Lesser General Public License (LGPL). import VisionEgg, string import sys, os import Tkinter import VisionEgg.PyroApps.EPhysGUIUtils as client_utils def get_control_list(): return [("sphere_grating_server",SphereGratingControlFrame,SphereGratingControlFrame.title)] class SphereGratingMetaParameters: def __init__(self): self.contrast = 1.0 self.orient = 0.0 self.sf = 0.1 # cycles per degree self.tf = 1.0 self.pre_stim_sec = 1.0 self.stim_sec = 2.0 self.post_stim_sec = 1.0 self.window_func = 'gaussian' self.window_radius = 10.0 self.window_az = 0.0 self.window_el = 0.0 class SphereGratingControlFrame(client_utils.StimulusControlFrame): title = "Grating (Perspective-distorted) Experiment" def __init__(self, master=None, suppress_go_buttons=0,**kw): client_utils.StimulusControlFrame.__init__(self, master, suppress_go_buttons, SphereGratingControlFrame.title, SphereGratingMetaParameters, **kw) param_frame = self.param_frame # shorthand for self.param_frame created in base class # Allow columns to expand param_frame.columnconfigure(0,weight=1) param_frame.columnconfigure(1,weight=1) pf_row = 0 Tkinter.Label(param_frame,text="Contrast:").grid(row=pf_row,column=0) self.contrast_tk_var = Tkinter.DoubleVar() self.contrast_tk_var.set(self.meta_params.contrast) self.make_callback_entry(textvariable=self.contrast_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Contrast"] = ("contrast",self.contrast_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Orientation (deg):").grid(row=pf_row,column=0) self.orient_tk_var = Tkinter.DoubleVar() self.orient_tk_var.set(self.meta_params.orient) self.make_callback_entry(textvariable=self.orient_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Orientation"] = ("orient",self.orient_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Spatial frequency (Cpd):").grid(row=pf_row,column=0) self.sf_tk_var = Tkinter.DoubleVar() self.sf_tk_var.set(self.meta_params.sf) self.make_callback_entry(textvariable=self.sf_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Spatial frequency"] = ("sf",self.sf_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Temporal frequency (Hz):").grid(row=pf_row,column=0) self.tf_tk_var = Tkinter.DoubleVar() self.tf_tk_var.set(self.meta_params.tf) self.make_callback_entry(textvariable=self.tf_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Temporal frequency"] = ("tf",self.tf_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0) self.prestim_dur_tk_var = Tkinter.DoubleVar() self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0) self.stim_dur_tk_var = Tkinter.DoubleVar() self.stim_dur_tk_var.set(self.meta_params.stim_sec) self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0) self.poststim_dur_tk_var = Tkinter.DoubleVar() self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Window function:").grid(row=pf_row,column=0) self.window_func_tk_var = Tkinter.StringVar() self.window_func_tk_var.set(self.meta_params.window_func) bar = Tkinter.Menubutton(param_frame, textvariable=self.window_func_tk_var, relief=Tkinter.RAISED) bar.grid(row=pf_row, column=1, sticky=Tkinter.W+Tkinter.E, pady=2, padx=2) bar.menu = Tkinter.Menu(bar,tearoff=0) bar.menu.add_radiobutton(label='circle', value='circle', variable=self.window_func_tk_var, command=self.send_values) bar.menu.add_radiobutton(label='gaussian', value='gaussian', variable=self.window_func_tk_var, command=self.send_values) bar['menu'] = bar.menu pf_row += 1 Tkinter.Label(param_frame,text="Window radius/sigma (deg):").grid(row=pf_row,column=0) self.window_radius_tk_var = Tkinter.DoubleVar() self.window_radius_tk_var.set(self.meta_params.window_radius) self.make_callback_entry(textvariable=self.window_radius_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Window azimuth (deg):").grid(row=pf_row,column=0) self.window_az_tk_var = Tkinter.DoubleVar() self.window_az_tk_var.set(self.meta_params.window_az) self.make_callback_entry(textvariable=self.window_az_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Window azimuth"] = ("window_az",self.window_az_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Window elevation (deg):").grid(row=pf_row,column=0) self.window_el_tk_var = Tkinter.DoubleVar() self.window_el_tk_var.set(self.meta_params.window_el) self.make_callback_entry(textvariable=self.window_el_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Window elevation"] = ("window_el",self.window_el_tk_var) def get_shortname(self): return "sphere_grating" def update_tk_vars(self): self.contrast_tk_var.set( self.meta_params.contrast ) self.orient_tk_var.set( self.meta_params.orient ) self.sf_tk_var.set( self.meta_params.sf ) self.tf_tk_var.set( self.meta_params.tf ) self.prestim_dur_tk_var.set( self.meta_params.pre_stim_sec ) self.stim_dur_tk_var.set( self.meta_params.stim_sec ) self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec ) self.window_func_tk_var.set( self.meta_params.window_func ) self.window_radius_tk_var.set( self.meta_params.window_radius ) self.window_az_tk_var.set( self.meta_params.window_az ) self.window_el_tk_var.set( self.meta_params.window_el ) def send_values(self,dummy_arg=None): self.meta_params.contrast = self.contrast_tk_var.get() self.meta_params.orient = self.orient_tk_var.get() self.meta_params.sf = self.sf_tk_var.get() self.meta_params.tf = self.tf_tk_var.get() self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() self.meta_params.window_func = self.window_func_tk_var.get() self.meta_params.window_radius = self.window_radius_tk_var.get() self.meta_params.window_az = self.window_az_tk_var.get() self.meta_params.window_el = self.window_el_tk_var.get() if self.connected: self.meta_controller.set_parameters( self.meta_params ) def get_duration_sec(self): self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec if __name__=='__main__': frame = SphereGratingControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/SphereGratingServer.py0000755000076500000240000001407211227360015022647 0ustar astrawstaff#!/usr/bin/env python """Handle perspective-distorted sinusoidal gratings (server-side)""" # Copyright (c) 2002-2003 Andrew Straw. Distributed under the terms # of the GNU Lesser General Public License (LGPL). import VisionEgg, string import sys, os, math import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.SphereMap import VisionEgg.PyroHelpers import Pyro.core from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters from VisionEgg.PyroApps.SphereGratingGUI import SphereGratingMetaParameters class SphereGratingExperimentMetaController( Pyro.core.ObjBase ): def __init__(self,screen,presentation,stimuli): # get stimuli assert( stimuli[0][0] == '3d_perspective') assert( stimuli[1][0] == '3d_perspective') sphere_grating = stimuli[0][1] sphere_window = stimuli[1][1] Pyro.core.ObjBase.__init__(self) self.meta_params = SphereGratingMetaParameters() if not isinstance(screen,VisionEgg.Core.Screen): raise ValueError("Expecting instance of VisionEgg.Core.Screen") if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") if not isinstance(sphere_grating,VisionEgg.SphereMap.SphereGrating): raise ValueError("Expecting instance of VisionEgg.SphereMap.SphereGrating") if not isinstance(sphere_window,VisionEgg.SphereMap.SphereWindow): raise ValueError("Expecting instance of VisionEgg.SphereMap.SphereWindow") self.p = presentation self.stim = sphere_grating self.window = sphere_window screen.parameters.bgcolor = (0.5, 0.5, 0.5, 0.0) self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController( during_go_func=self.on_function_during_go, between_go_func=self.on_function_between_go)) def __del__(self): self.p.remove_controller(self.stim,'on') Pyro.core.ObjBase.__del__(self) # call base class def on_function_during_go(self,t): """Compute when the grating is on""" if t <= self.meta_params.pre_stim_sec: return 0 # not on yet elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): return 1 # on else: return 0 # off again def on_function_between_go(self): """Compute when the grating is off""" return 0 # off again def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, SphereGratingMetaParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of SphereGratingMetaParameters") # self.meta_params = new_parameters self.update() def update(self): stim_params = self.stim.parameters # shorthand window_params = self.window.parameters # shorthand meta_params = self.meta_params # shorthand stim_params.contrast = meta_params.contrast stim_params.orientation = meta_params.orient stim_params.spatial_freq_cpd = meta_params.sf stim_params.temporal_freq_hz = meta_params.tf stim_params.grating_center_azimuth = meta_params.window_az stim_params.grating_center_elevation = meta_params.window_el self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds') window_params.window_shape = meta_params.window_func window_params.window_shape_radius_parameter = meta_params.window_radius window_params.window_center_azimuth = meta_params.window_az window_params.window_center_elevation = meta_params.window_el def go(self): self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 def get_meta_controller_class(): return SphereGratingExperimentMetaController def make_stimuli(): stimulus = VisionEgg.SphereMap.SphereGrating(radius=1.0, spatial_freq_cpd=1.0/9.0, temporal_freq_hz = 1.0) mask = VisionEgg.SphereMap.SphereWindow(radius=0.95) return [('3d_perspective',stimulus),('3d_perspective',mask)] def get_meta_controller_stimkey(): return "sphere_grating_server" # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() screen = VisionEgg.Core.Screen.create_default() # get Vision Egg stimulus ready to go stimuli = make_stimuli() stimulus = stimuli[0][1] mask = stimuli[1][1] temp = ScreenPositionParameters() left = temp.left right = temp.right bottom = temp.bottom top = temp.top near = temp.near far = temp.far projection = VisionEgg.Core.PerspectiveProjection(left, right, bottom, top, near, far) viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus,mask],projection=projection) p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) # now hand over control of projection to ScreenPositionMetaController projection_controller = ScreenPositionMetaController(p,projection) pyro_server.connect(projection_controller,"projection_controller") # now hand over control of grating and mask to SphereGratingExperimentMetaController meta_controller = SphereGratingExperimentMetaController(screen,p,stimuli) pyro_server.connect(meta_controller,get_meta_controller_stimkey()) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/VisionEgg/PyroApps/SpinningDrumGUI.py0000755000076500000240000001236711227360015021705 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: SpinningDrumGUI # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. import VisionEgg, string import sys, os import Tkinter import VisionEgg.PyroApps.EPhysGUIUtils as client_utils def get_control_list(): return [("spinning_drum_server",SpinningDrumControlFrame,SpinningDrumControlFrame.title)] class SpinningDrumMetaParameters: def __init__(self): self.contrast = 1.0 self.velocity_dps = 100.0 self.startpos_deg = 0.0 self.pre_stim_sec = 1.0 self.stim_sec = 5.0 self.post_stim_sec = 1.0 class SpinningDrumControlFrame(client_utils.StimulusControlFrame): title = "Spinning Drum Experiment" def __init__(self, master=None, suppress_go_buttons=0,**kw): client_utils.StimulusControlFrame.__init__(self, master, suppress_go_buttons, SpinningDrumControlFrame.title, SpinningDrumMetaParameters, **kw) param_frame = self.param_frame # shorthand for self.param_frame created in base class # Allow columns to expand param_frame.columnconfigure(0,weight=1) param_frame.columnconfigure(1,weight=1) pf_row = 0 Tkinter.Label(param_frame,text="Contrast:").grid(row=pf_row,column=0) self.contrast_tk_var = Tkinter.DoubleVar() self.contrast_tk_var.set(self.meta_params.contrast) self.make_callback_entry(textvariable=self.contrast_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Contrast"] = ("contrast",self.contrast_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Velocity (dps):").grid(row=pf_row,column=0) self.velocity_tk_var = Tkinter.DoubleVar() self.velocity_tk_var.set(self.meta_params.velocity_dps) self.make_callback_entry(textvariable=self.velocity_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Velocity"] = ("velocity_dps",self.velocity_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Start position (deg):").grid(row=pf_row,column=0) self.startpos_tk_var = Tkinter.DoubleVar() self.startpos_tk_var.set(self.meta_params.startpos_deg) self.make_callback_entry(textvariable=self.startpos_tk_var).grid(row=pf_row,column=1) self.loopable_variables["Start position"] = ("startpos_deg",self.startpos_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0) self.prestim_dur_tk_var = Tkinter.DoubleVar() self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0) self.stim_dur_tk_var = Tkinter.DoubleVar() self.stim_dur_tk_var.set(self.meta_params.stim_sec) self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=1) pf_row += 1 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0) self.poststim_dur_tk_var = Tkinter.DoubleVar() self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=1) def get_shortname(self): """Used as basename for saving parameter files""" return "spinning_drum" def update_tk_vars(self): self.contrast_tk_var.set( self.meta_params.contrast ) self.velocity_tk_var.set( self.meta_params.velocity_dps ) self.startpos_tk_var.set( self.meta_params.startpos_deg ) self.stim_dur_tk_var.set( self.meta_params.stim_sec ) self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec ) def send_values(self,dummy_arg=None): self.meta_params.contrast = self.contrast_tk_var.get() self.meta_params.velocity_dps = self.velocity_tk_var.get() self.meta_params.startpos_deg = self.startpos_tk_var.get() self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() if self.connected: self.meta_controller.set_parameters( self.meta_params ) def get_duration_sec(self): self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec if __name__=='__main__': frame = SpinningDrumControlFrame() frame.pack(expand=1,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/SpinningDrumServer.py0000755000076500000240000001305111227360015022516 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: SpinningDrumServer # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. import VisionEgg, string import sys, os, math import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.Textures import VisionEgg.PyroHelpers import Pyro.core from VisionEgg.PyroApps.ScreenPositionServer import ScreenPositionMetaController from VisionEgg.PyroApps.ScreenPositionGUI import ScreenPositionParameters from VisionEgg.PyroApps.SpinningDrumGUI import SpinningDrumMetaParameters class SpinningDrumExperimentMetaController( Pyro.core.ObjBase ): def __init__(self,screen,presentation,stimuli): # get the instance of Stimulus that was created assert( stimuli[0][0] == '3d_perspective' ) spinning_drum = stimuli[0][1] Pyro.core.ObjBase.__init__(self) self.meta_params = SpinningDrumMetaParameters() if not isinstance(screen,VisionEgg.Core.Screen): raise ValueError("Expecting instance of VisionEgg.Core.Screen") if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") if not isinstance(spinning_drum,VisionEgg.Textures.SpinningDrum): raise ValueError("Expecting instance of VisionEgg.Textures.SpinningDrum") self.p = presentation self.stim = spinning_drum screen.parameters.bgcolor = (0.5, 0.5, 0.5, 0.0) self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController( during_go_func=self.on_function_during_go, between_go_func=self.on_function_between_go)) self.p.add_controller(self.stim,'angular_position',VisionEgg.FlowControl.FunctionController( during_go_func=self.angular_position_during_go, between_go_func=self.angular_position_between_go)) def __del__(self): self.p.remove_controller(self.stim,'on') self.p.remove_controller(self.stim,'angular_position') Pyro.core.ObjBase.__del__(self) # call base class def on_function_during_go(self,t): if t <= self.meta_params.pre_stim_sec: return 0 # not on yet elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): return 1 # on else: return 0 # off again def on_function_between_go(self): return 0 # off def angular_position_during_go(self,t): adjusted_t = t - self.meta_params.pre_stim_sec return (adjusted_t * self.meta_params.velocity_dps) + self.meta_params.startpos_deg def angular_position_between_go(self): return 0.0 # doesn't matter -- stimulus off def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, SpinningDrumMetaParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of SpinningDrumMetaParameters") self.update() def update(self): stim_params = self.stim.parameters # shorthand meta_params = self.meta_params # shorthand stim_params.contrast = meta_params.contrast self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds') def go(self): self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 def get_meta_controller_class(): return SpinningDrumExperimentMetaController def make_stimuli(): filename = os.path.join(VisionEgg.config.VISIONEGG_SYSTEM_DIR,"data/panorama.jpg") texture = VisionEgg.Textures.Texture(filename) stimulus = VisionEgg.Textures.SpinningDrum(texture=texture) # could add shrink_texture_ok=1 return [('3d_perspective',stimulus)] # return ordered list of tuples def get_meta_controller_stimkey(): return "spinning_drum_server" # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() screen = VisionEgg.Core.Screen.create_default() # get Vision Egg stimulus ready to go stimuli = make_stimuli() stimulus = stimuli[0][1] temp = ScreenPositionParameters() projection = VisionEgg.Core.PerspectiveProjection(temp.left, temp.right, temp.bottom, temp.top, temp.near, temp.far) viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus],projection=projection) p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) # now hand over control of projection to ScreenPositionMetaController projection_controller = ScreenPositionMetaController(p,projection) pyro_server.connect(projection_controller,"projection_controller") # now hand over control of drum to SpinningDrumExperimentMetaController meta_controller = SpinningDrumExperimentMetaController(screen,p,stimuli) pyro_server.connect(meta_controller,get_meta_controller_stimkey()) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/VisionEgg/PyroApps/TargetGUI.py0000755000076500000240000002407711227360015020517 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: TargetGUI # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """Handle small target stimulus (client-side)""" import VisionEgg import sys, os, math import Tkinter import VisionEgg.PyroApps.EPhysGUIUtils as client_utils def get_control_list(): return [("target_server",TargetControlFrame,TargetControlFrame.title)] class TargetMetaParameters: def __init__(self): # colors self.color = (0.0, 0.0, 0.0, 1.0) self.bgcolor = (1.0, 1.0, 1.0, 0.0) # motion parameters self.start_x = 10.0 self.start_y = 50.0 self.velocity_pps = 100.0 # pixels per second self.direction_deg = 0.0 # size and orientation self.width = 10.0 self.height = 30.0 self.orientation_deg = 0.0 self.pre_stim_sec = 1.0 self.stim_sec = 2.0 self.post_stim_sec = 1.0 class TargetControlFrame(client_utils.StimulusControlFrame): title = "Moving Target Experiment" def __init__(self, master=None, suppress_go_buttons=0,**kw): client_utils.StimulusControlFrame.__init__(self, master, suppress_go_buttons, TargetControlFrame.title, TargetMetaParameters, **kw) param_frame = self.param_frame # shorthand for self.param_frame created in base class pf_row = 0 Tkinter.Label(param_frame,text="Start X (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.start_x_tk_var = Tkinter.DoubleVar() self.start_x_tk_var.set(self.meta_params.start_x) self.make_callback_entry(textvariable=self.start_x_tk_var).grid(row=pf_row,column=2) self.loopable_variables["Start X"] = ("start_x",self.start_x_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Start Y (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.start_y_tk_var = Tkinter.DoubleVar() self.start_y_tk_var.set(self.meta_params.start_y) self.make_callback_entry(textvariable=self.start_y_tk_var).grid(row=pf_row,column=2) self.loopable_variables["Start Y"] = ("start_y",self.start_y_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Velocity (pixels/sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.velocity_tk_var = Tkinter.DoubleVar() self.velocity_tk_var.set(self.meta_params.velocity_pps) self.make_callback_entry(textvariable=self.velocity_tk_var).grid(row=pf_row,column=2) self.loopable_variables["Velocity"] = ("velocity_pps",self.velocity_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Direction (degrees):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.direction_tk_var = Tkinter.DoubleVar() self.direction_tk_var.set(self.meta_params.direction_deg) self.make_callback_entry(textvariable=self.direction_tk_var).grid(row=pf_row,column=2) self.loopable_variables["Direction"] = ("direction_deg",self.direction_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Color:").grid(row=pf_row,column=0,sticky=Tkinter.E) self.color_tk_var = Tkinter.StringVar() self.color_tk_var.set("black on white") bar = Tkinter.Menubutton(param_frame, textvariable=self.color_tk_var, relief=Tkinter.RAISED) bar.grid(row=pf_row, column=2, sticky=Tkinter.W+Tkinter.E, pady=2, padx=2) bar.menu = Tkinter.Menu(bar,tearoff=0) bar.menu.add_radiobutton(label="white on black", value="white on black", variable=self.color_tk_var, command=self.send_values) bar.menu.add_radiobutton(label="black on white", value="black on white", variable=self.color_tk_var, command=self.send_values) bar['menu'] = bar.menu pf_row += 1 Tkinter.Label(param_frame,text="Orientation (degrees):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.ortho_tk_var = Tkinter.StringVar() self.ortho_tk_var.set("ortho") manual = Tkinter.Radiobutton( param_frame, text="Manual", variable=self.ortho_tk_var, value="manual") manual.grid(row=pf_row,column=1) self.orient_tk_var = Tkinter.DoubleVar() self.orient_tk_var.set(self.meta_params.orientation_deg) manual_entry = Tkinter.Entry( param_frame, textvariable=self.orient_tk_var, width=self.entry_width ) manual_entry.grid(row=pf_row,column=2) ortho = Tkinter.Radiobutton( param_frame, text="Orthogonal to motion", variable=self.ortho_tk_var, value="ortho") ortho.grid(row=pf_row,column=3) self.loopable_variables["Orientation"] = ("orientation_deg",self.orient_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Width (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.width_tk_var = Tkinter.DoubleVar() self.width_tk_var.set(self.meta_params.width) self.make_callback_entry(textvariable=self.width_tk_var).grid(row=pf_row,column=2) self.loopable_variables["Width"] = ("width",self.width_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Height (pixels):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.height_tk_var = Tkinter.DoubleVar() self.height_tk_var.set(self.meta_params.height) self.make_callback_entry(textvariable=self.height_tk_var).grid(row=pf_row,column=2) self.loopable_variables["Height"] = ("height",self.height_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Pre stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.prestim_dur_tk_var = Tkinter.DoubleVar() self.prestim_dur_tk_var.set(self.meta_params.pre_stim_sec) self.make_callback_entry(textvariable=self.prestim_dur_tk_var).grid(row=pf_row,column=2) pf_row += 1 Tkinter.Label(param_frame,text="Stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.stim_dur_tk_var = Tkinter.DoubleVar() self.stim_dur_tk_var.set(self.meta_params.stim_sec) self.make_callback_entry(textvariable=self.stim_dur_tk_var).grid(row=pf_row,column=2) self.loopable_variables["Duration"] = ("stim_sec",self.stim_dur_tk_var) pf_row += 1 Tkinter.Label(param_frame,text="Post stimulus duration (sec):").grid(row=pf_row,column=0,sticky=Tkinter.E) self.poststim_dur_tk_var = Tkinter.DoubleVar() self.poststim_dur_tk_var.set(self.meta_params.post_stim_sec) self.make_callback_entry(textvariable=self.poststim_dur_tk_var).grid(row=pf_row,column=2) def get_shortname(self): return "target" def update_tk_vars(self): self.start_x_tk_var.set( self.meta_params.start_x ) self.start_y_tk_var.set( self.meta_params.start_y ) self.velocity_tk_var.set( self.meta_params.velocity_pps ) self.direction_tk_var.set( self.meta_params.direction_deg ) self.orient_tk_var.set( self.meta_params.orientation_deg ) self.width_tk_var.set( self.meta_params.width ) self.height_tk_var.set( self.meta_params.height ) self.prestim_dur_tk_var.set( self.meta_params.pre_stim_sec ) self.stim_dur_tk_var.set( self.meta_params.stim_sec ) self.poststim_dur_tk_var.set( self.meta_params.post_stim_sec ) if self.meta_params.color == (0.0,0.0,0.0,1.0) and self.meta_params.bgcolor == (1.0,1.0,1.0,0.0): self.color_tk_var.set( "black on white" ) elif self.meta_params.color == (1.0,1.0,1.0,1.0) and self.meta_params.bgcolor == (0.0,0.0,0.0,0.0): self.color_tk_var.set( "white on black" ) else: raise RuntimeError("Cannot set tk variable for color") def send_values(self,dummy_arg=None): self.meta_params.start_x = self.start_x_tk_var.get() self.meta_params.start_y = self.start_y_tk_var.get() self.meta_params.velocity_pps = self.velocity_tk_var.get() self.meta_params.direction_deg = self.direction_tk_var.get() if self.color_tk_var.get() == "black on white": self.meta_params.color = (0.0,0.0,0.0,1.0) self.meta_params.bgcolor = (1.0,1.0,1.0,0.0) elif self.color_tk_var.get() == "white on black": self.meta_params.color = (1.0,1.0,1.0,1.0) self.meta_params.bgcolor = (0.0,0.0,0.0,0.0) if self.ortho_tk_var.get() == "ortho": self.meta_params.orientation_deg = math.fmod(self.meta_params.direction_deg,360.0) else: # it's "manual" self.meta_params.orientation_deg = self.orient_tk_var.get() self.meta_params.width = self.width_tk_var.get() self.meta_params.height = self.height_tk_var.get() self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() if self.connected: self.meta_controller.set_parameters( self.meta_params ) def get_duration_sec(self): self.meta_params.pre_stim_sec = self.prestim_dur_tk_var.get() self.meta_params.stim_sec = self.stim_dur_tk_var.get() self.meta_params.post_stim_sec = self.poststim_dur_tk_var.get() return self.meta_params.pre_stim_sec + self.meta_params.stim_sec + self.meta_params.post_stim_sec if __name__=='__main__': frame = TargetControlFrame() frame.pack(expand=Tkinter.YES,fill=Tkinter.BOTH) frame.winfo_toplevel().title("%s"%(os.path.basename(os.path.splitext(sys.argv[0])[0]),)) frame.mainloop() visionegg-1.2.1/VisionEgg/PyroApps/TargetServer.py0000755000076500000240000001166511227360015021340 0ustar astrawstaff#!/usr/bin/env python # # The Vision Egg: TargetServer # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """Handle small targets gratings (server-side)""" import VisionEgg import sys, os, math import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.MoreStimuli import VisionEgg.PyroHelpers import Pyro.core from VisionEgg.PyroApps.TargetGUI import TargetMetaParameters class TargetExperimentMetaController( Pyro.core.ObjBase ): def __init__(self,screen,presentation,stimuli): Pyro.core.ObjBase.__init__(self) # get stimulus assert( stimuli[0][0] == '2d_overlay') target = stimuli[0][1] self.meta_params = TargetMetaParameters() if not isinstance(screen,VisionEgg.Core.Screen): raise ValueError("Expecting instance of VisionEgg.Core.Screen") if not isinstance(presentation,VisionEgg.FlowControl.Presentation): raise ValueError("Expecting instance of VisionEgg.FlowControl.Presentation") if not isinstance(target,VisionEgg.MoreStimuli.Target2D): raise ValueError("Expecting instance of VisionEgg.MoreStimuli.Target2D") self.screen = screen self.p = presentation self.stim = target self.p.add_controller(self.stim,'on',VisionEgg.FlowControl.FunctionController( during_go_func=self.on_function_during_go, between_go_func=self.on_function_between_go)) self.p.add_controller(self.stim,'position',VisionEgg.FlowControl.FunctionController( during_go_func=self.center_during_go, between_go_func=self.center_between_go)) self.update() # set stimulus parameters to initial defaults def __del__(self): self.p.remove_controller(self.stim,'on') self.p.remove_controller(self.stim,'position') Pyro.core.ObjBase.__del__(self) # call base class def on_function_during_go(self,t): if t <= self.meta_params.pre_stim_sec: return 0 # not on yet elif t <= (self.meta_params.pre_stim_sec + self.meta_params.stim_sec): return 1 # on else: return 0 # off again def on_function_between_go(self): return 0 def center_during_go(self,t): t_adjusted = t - self.meta_params.pre_stim_sec distance = self.meta_params.velocity_pps * t_adjusted x_offset = math.cos(self.meta_params.direction_deg / 180.0 * math.pi)*distance y_offset = math.sin(self.meta_params.direction_deg / 180.0 * math.pi)*distance return (self.meta_params.start_x + x_offset, self.meta_params.start_y + y_offset) def center_between_go(self): return (0.0, 0.0) # doesn't matter -- it's off def get_parameters(self): return self.meta_params def set_parameters(self, new_parameters): if isinstance(new_parameters, TargetMetaParameters): self.meta_params = new_parameters else: raise ValueError("Argument to set_parameters must be instance of TargetMetaParameters") self.update() def update(self): stim_params = self.stim.parameters # shorthand meta_params = self.meta_params # shorthand # colors stim_params.color = meta_params.color self.screen.parameters.bgcolor = meta_params.bgcolor # size and orientation stim_params.size = (meta_params.width, meta_params.height) stim_params.orientation = meta_params.orientation_deg self.p.parameters.go_duration = ( meta_params.pre_stim_sec + meta_params.stim_sec + meta_params.post_stim_sec, 'seconds') def go(self): self.p.parameters.enter_go_loop = 1 def quit_server(self): self.p.parameters.quit = 1 def get_meta_controller_class(): return TargetExperimentMetaController def make_stimuli(): stimulus = VisionEgg.MoreStimuli.Target2D(anchor='center') return [('2d_overlay',stimulus)] def get_meta_controller_stimkey(): return "target_server" # Don't do anything unless this script is being run if __name__ == '__main__': pyro_server = VisionEgg.PyroHelpers.PyroServer() screen = VisionEgg.Core.Screen.create_default() # get Vision Egg stimulus ready to go stimuli = make_stimuli() stimulus = stimuli[0][1] viewport = VisionEgg.Core.Viewport(screen=screen,stimuli=[stimulus]) p = VisionEgg.FlowControl.Presentation(viewports=[viewport]) # now hand over control of grating and mask to FlatGratingExperimentMetaController meta_controller = TargetExperimentMetaController(screen,p,stimuli) pyro_server.connect(meta_controller,get_meta_controller_stimkey()) # get listener controller and register it p.add_controller(None,None, pyro_server.create_listener_controller()) # enter endless loop p.run_forever() visionegg-1.2.1/VisionEgg/PyroApps/VarTypes.py0000644000076500000240000000131111227360015020460 0ustar astrawstaff# The Vision Egg: VarTypes # # Copyright (C) 2004 Imran S. Ali, Lachlan Dowd # # Author: Imran S. Ali, Lachlan Dowd # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # Add your supported supported demo script "variable types" here: def getID(var_type): if var_type == "float": return 1 elif var_type == "int" or var_type == "integer": return 2 elif var_type == "string" or var_type == "str": return 3 else: return -1 def getType(ID): if ID == 1: return "float" elif ID == 2: return "integer" elif ID == 3: return "string" else: return "undefined type" visionegg-1.2.1/VisionEgg/PyroClient.py0000755000076500000240000000252211224565527017242 0ustar astrawstaff# The Vision Egg: PyroClient # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2008 California Insitute of Technology # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ """ Python Remote Objects support - Client side. """ import socket import VisionEgg import logging # available in Python 2.3 import Pyro.core class PyroClient: """Simplifies getting PyroControllers from a remote computer.""" def __init__(self,server_hostname='',server_port=7766): """Initialize Pyro client.""" Pyro.core.initClient() try: self.server_hostname = socket.getfqdn(server_hostname) except Exception, x: logger = logging.getLogger('VisionEgg.PyroClient') logger.warning("while getting fully qualified domain name: %s: %s"% (str(x.__class__),str(x))) self.server_hostname = server_hostname self.server_port = server_port def get(self,name): """Return a remote Pyro object being served by Pyro server.""" URI = "PYROLOC://%s:%d/%s" % (self.server_hostname, self.server_port, name) return Pyro.core.getProxyForURI(URI) visionegg-1.2.1/VisionEgg/PyroHelpers.py0000644000076500000240000001501711224565527017426 0ustar astrawstaff# The Vision Egg: PyroHelpers # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ """ Python Remote Objects support. Use this class if you don't want to deal with TCP directly and Python is the program on both ends of the network. The module provides some Vision Egg specific code for Pyro. Pyro allows you to call python objects on remote machines just like they are on the local machine. This makes the task of writing a two computer Vision Egg application quite easy, because one can mostly ignore the network-based intermediate stage. PyroControllers are run on the computer performing the presentation. The PyroServer class also runs on this computer, and allows these controllers to be changed from a computer running PyroClient. To listen to the network PyroListenerController must be instantiated by the PyroServer -- this checks for any requests coming over the network, but only at times specified because it is a subclass of VisionEgg.FlowControl.Controller. Just like TCPControllers, don't use this class for realtime control unless you think your network is that fast and reliable. It's great for setting up parameters in advance and sending a trigger pulse, though!""" import VisionEgg import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.ParameterTypes as ve_types import Pyro.core import Pyro.errors Pyro.config.PYRO_MULTITHREADED = 0 # No multithreading! class PyroServer: """Set up a Pyro server for your PyroControllers and PyroGoClass. This class is analagous to VisionEgg.TCPController.TCPServer. """ def __init__(self): # Start Pyro Pyro.core.initServer() self.daemon = Pyro.core.Daemon() self.ok_to_run = 1 def get_hostname_and_port(self): return self.daemon.hostname, self.daemon.port def connect(self,object,name): """Serve an object under a name""" URI=self.daemon.connect(object,name) return URI def disconnect(self,object): if Pyro.core.constants.VERSION >= '3.2': self.daemon.disconnect(object) else: # workaround bug in Pyro pre-3.2 del self.daemon.implementations[object.GUID()] object.setDaemon(None) def create_listener_controller(self): if hasattr(self,'listen_controller'): raise RuntimeError("Only one pyro listen controller allowed per server!") self.listen_controller = PyroListenController(self) return self.listen_controller def handleRequests(self, timeout=0): """Only use this if you don't use the PyroListenerController. A timeout of 0 specifies return immediately.""" self.daemon.handleRequests(timeout) class PyroConstantController(VisionEgg.FlowControl.ConstantController,Pyro.core.ObjBase): def __init__(self, **kw): VisionEgg.FlowControl.ConstantController.__init__(self,**kw) Pyro.core.ObjBase.__init__(self) class PyroEvalStringController(VisionEgg.FlowControl.EvalStringController,Pyro.core.ObjBase): def __init__(self, **kw): VisionEgg.FlowControl.EvalStringController.__init__(self,**kw) Pyro.core.ObjBase.__init__(self) class PyroExecStringController(VisionEgg.FlowControl.ExecStringController,Pyro.core.ObjBase): def __init__(self, **kw): VisionEgg.FlowControl.ExecStringController.__init__(self,**kw) Pyro.core.ObjBase.__init__(self) class PyroEncapsulatedController(VisionEgg.FlowControl.EncapsulatedController,Pyro.core.ObjBase): """Create the instance of Controller on client, and send it to server. This class is analagous to VisionEgg.TCPController.TCPController. """ def __init__(self,initial_controller=None,**kw): VisionEgg.FlowControl.EncapsulatedController.__init__(self,initial_controller) Pyro.core.ObjBase.__init__(self) class PyroLocalDictController(VisionEgg.FlowControl.EncapsulatedController,Pyro.core.ObjBase): """Contain several dictionary entries, set controller accordingly. """ def __init__(self, dict=None, key=None, **kw): if dict is None: self.dict = {} initial_controller = VisionEgg.FlowControl.ConstantController(during_go_value=0, between_go_value=0, eval_frequency=VisionEgg.FlowControl.Controller.NEVER) else: self.dict = dict if key is None: if len(self.dict.keys()): key = self.dict.keys()[0] initial_controller = self.dict[key] else: initial_controller = VisionEgg.FlowControl.ConstantController(during_go_value=0, between_go_value=0, eval_frequency=VisionEgg.FlowControl.Controller.NEVER) else: initial_controller = dict[key] VisionEgg.FlowControl.EncapsulatedController.__init__(self,initial_controller) Pyro.core.ObjBase.__init__(self) def use_controller(self,key): self.set_new_controller(self.dict[key]) def add_controller(self,key,new_controller): self.dict[key] = new_controller class PyroListenController(VisionEgg.FlowControl.Controller): """Handle connection from remote machine, control PyroControllers. This meta controller handles a Pyro daemon, which checks the TCP socket for new input and acts accordingly. This class is analagous to VisionEgg.TCPController.SocketListenController. """ def __init__(self,server=None,**kw): """Called by PyroServer. Creates a PyroListenerController instance.""" if not isinstance(server,PyroServer): raise ValueError("Must specify a Pyro Server.") if 'eval_frequency' not in kw.keys(): kw['eval_frequency'] = VisionEgg.FlowControl.Controller.EVERY_FRAME if 'return_type' not in kw.keys(): kw['return_type'] = ve_types.get_type(None) VisionEgg.FlowControl.Controller.__init__(self,**kw) self.server=server def during_go_eval(self): # setting timeout = 0 means return ASAP self.server.daemon.handleRequests(timeout=0) def between_go_eval(self): # setting timeout = 0 means return ASAP self.server.daemon.handleRequests(timeout=0) visionegg-1.2.1/VisionEgg/qtlowlevel.py0000755000076500000240000002000011224565530017331 0ustar astrawstaffimport os, sys import ctypes if os.name=='nt': QTMLClient = ctypes.CDLL(r'C:\Program Files\QuickTime\QTSystem\QTMLClient.dll') elif sys.platform.startswith('darwin'): # There was once a functional Mac QuickTime implementation, but it # used a combination of the Python stdlib's quicktime module and # some C extensions based on the Carbon QuickTime interface. Given # the inevitable long-term ultimate demise of Carbon, it would be # foolish to spend much time on the Carbon implementation. On the # other hand, the newer implementation will require someone who # knows or learns the new QTKit bindings, which come included with PyObjC. raise NotImplementedError('QuickTime support is not implemented for Mac OS X.') # OSErr SInt16 MacTypes.h # OSStatus SInt32 MacTypes.h # ItemCount UInt32 MacTypes.h # FourCharCode SInt32 MacTypes.h # OSType FourCharCode MacTypes.h # QTNewMoviePropertyElement struct Movies.h # QTPropertyClass OSType Movies.h # QTPropertyID OSType Movies.h # ByteCount UInt32 MacTypes.h # QTPropertyValuePtr void* Movies.h # Movie OSErr = ctypes.c_short OSStatus = ctypes.c_int ItemCount = ctypes.c_uint FourCharCode = ctypes.c_int OSType = FourCharCode QTPropertyClass = OSType QTPropertyID = OSType ByteCount = ctypes.c_uint QTPropertyValuePtr = ctypes.c_void_p QTVisualContextRef = ctypes.c_void_p class Rect(ctypes.Structure): _fields_ = [("top", ctypes.c_short), ("left", ctypes.c_short), ("bottom",ctypes.c_short), ("right", ctypes.c_short)] Movie = ctypes.c_void_p # not done class QTNewMoviePropertyElement(ctypes.Structure): _fields_ = [("propClass",QTPropertyClass), ("propID",QTPropertyID), ("propValueSize",ByteCount), ("propValueAddress",QTPropertyValuePtr), ("propStatus",OSStatus)] def FOUR_CHAR_CODE(code): assert isinstance(code,str) assert len(code)==4 val = 0 for i in range(4): c = code[i] ordc = ord(c) addval = ordc << (3-i)*8 #print '%d: %s %x %x'%(i,c,ordc,addval) val += addval #print '%x\n'%val return val if 1: kQTPropertyClass_DataLocation = FOUR_CHAR_CODE('dloc') kQTDataLocationPropertyID_DataReference = FOUR_CHAR_CODE('dref') # DataReferenceRecord (for semantics of NewMovieFromDataRef) kQTDataLocationPropertyID_CFStringNativePath = FOUR_CHAR_CODE('cfnp') kQTDataLocationPropertyID_CFStringPosixPath = FOUR_CHAR_CODE('cfpp') kQTDataLocationPropertyID_CFStringHFSPath = FOUR_CHAR_CODE('cfhp') kQTDataLocationPropertyID_CFStringWindowsPath = FOUR_CHAR_CODE('cfwp') kQTDataLocationPropertyID_CFURL = FOUR_CHAR_CODE('cfur') kQTDataLocationPropertyID_QTDataHandler = FOUR_CHAR_CODE('qtdh') # for semantics of NewMovieFromStorageOffset kQTDataLocationPropertyID_Scrap = FOUR_CHAR_CODE('scrp') kQTDataLocationPropertyID_LegacyMovieResourceHandle = FOUR_CHAR_CODE('rezh') # QTNewMovieUserProcInfo * (for semantics of NewMovieFromHandle) kQTDataLocationPropertyID_MovieUserProc = FOUR_CHAR_CODE('uspr') # for semantics of NewMovieFromUserProc kQTDataLocationPropertyID_ResourceFork = FOUR_CHAR_CODE('rfrk') # for semantics of NewMovieFromFile kQTDataLocationPropertyID_DataFork = FOUR_CHAR_CODE('dfrk') # for semantics of NewMovieFromDataFork64 kQTPropertyClass_Context = FOUR_CHAR_CODE('ctxt') # Media Contexts kQTContextPropertyID_AudioContext = FOUR_CHAR_CODE('audi') kQTContextPropertyID_VisualContext = FOUR_CHAR_CODE('visu') kQTPropertyClass_MovieResourceLocator = FOUR_CHAR_CODE('rloc') kQTMovieResourceLocatorPropertyID_LegacyResID = FOUR_CHAR_CODE('rezi') # (input/result property) kQTMovieResourceLocatorPropertyID_LegacyResName = FOUR_CHAR_CODE('rezn') # (result property) kQTMovieResourceLocatorPropertyID_FileOffset = FOUR_CHAR_CODE('foff') # NewMovieFromDataFork[64] kQTMovieResourceLocatorPropertyID_Callback = FOUR_CHAR_CODE('calb') # NewMovieFromUserProc(getProcrefcon) # Uses kQTMovieDefaultDataRefPropertyID for default dataref kQTPropertyClass_MovieInstantiation = FOUR_CHAR_CODE('mins') kQTMovieInstantiationPropertyID_DontResolveDataRefs = FOUR_CHAR_CODE('rdrn') kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs = FOUR_CHAR_CODE('aurn') kQTMovieInstantiationPropertyID_DontAutoAlternates = FOUR_CHAR_CODE('aaln') kQTMovieInstantiationPropertyID_DontUpdateForeBackPointers = FOUR_CHAR_CODE('fbpn') kQTMovieInstantiationPropertyID_AsyncOK = FOUR_CHAR_CODE('asok') kQTMovieInstantiationPropertyID_IdleImportOK = FOUR_CHAR_CODE('imok') kQTMovieInstantiationPropertyID_DontAutoUpdateClock = FOUR_CHAR_CODE('aucl') kQTMovieInstantiationPropertyID_ResultDataLocationChanged = FOUR_CHAR_CODE('dlch') # (result property) kQTPropertyClass_NewMovieProperty = FOUR_CHAR_CODE('mprp') kQTNewMoviePropertyID_DefaultDataRef = FOUR_CHAR_CODE('ddrf') # DataReferenceRecord kQTNewMoviePropertyID_Active = FOUR_CHAR_CODE('actv') kQTNewMoviePropertyID_DontInteractWithUser = FOUR_CHAR_CODE('intn') class qtlowlevelError(RuntimeError): pass noErr = 0 paramErr = -50 movieToolboxUninitialized = -2020 def GetErrorString(value): if value == paramErr: return 'paramErr' elif value == movieToolboxUninitialized: return 'movieToolboxUninitialized' elif value != noErr: return 'error value: %d'%value else: return 'noErr' def CheckOSStatus(value): if value != noErr: raise qtlowlevelError(GetErrorString(value)) return value NewMovieFromFile = QTMLClient.NewMovieFromFile NewMovieFromProperties = QTMLClient.NewMovieFromProperties #NewMovieFromProperties.restype = OSStatus NewMovieFromProperties.restype = CheckOSStatus NewMovieFromProperties.argtypes = [ItemCount, ctypes.POINTER(QTNewMoviePropertyElement), ItemCount, ctypes.POINTER(QTNewMoviePropertyElement), ctypes.POINTER(Movie)] InitializeQTML = QTMLClient.InitializeQTML EnterMovies = QTMLClient.EnterMovies QTGetCFConstant = QTMLClient.QTGetCFConstant GetMovieBox = QTMLClient.GetMovieBox GetMovieBox.argtypes = [Movie, ctypes.POINTER(Rect)] SetMovieBox = QTMLClient.SetMovieBox SetMovieBox.argtypes = [Movie, ctypes.POINTER(Rect)] StartMovie = QTMLClient.StartMovie StartMovie.argtypes = [Movie] MoviesTask = QTMLClient.MoviesTask MoviesTask.argtypes = [Movie,ctypes.c_long] IsMovieDone = QTMLClient.IsMovieDone IsMovieDone.argtypes = [Movie] GoToBeginningOfMovie = QTMLClient.GoToBeginningOfMovie GoToBeginningOfMovie.argtypes = [Movie] FSSpec = ctypes.c_void_p CFStringRef = ctypes.c_void_p CFStringEncoding = ctypes.c_uint CFAllocatorRef = ctypes.c_void_p CFIndex = ctypes.c_int if 1: CFStringCreateWithCharacters = QTMLClient.CFStringCreateWithCharacters CFStringCreateWithCharacters.restype = CFStringRef CFStringCreateWithCharacters.argtypes = [CFAllocatorRef, ctypes.c_wchar_p, CFIndex] CFStringCreateWithCString = QTMLClient.CFStringCreateWithCString CFStringCreateWithCString.restype = CFStringRef CFStringCreateWithCString.argtypes = [CFAllocatorRef, ctypes.c_char_p, CFStringEncoding] CFStringGetCString = QTMLClient.CFStringGetCString CFStringGetCStringPtr = QTMLClient.CFStringGetCStringPtr CFStringGetCStringPtr.restype = ctypes.c_char_p NativePathNameToFSSpec = QTMLClient.NativePathNameToFSSpec NativePathNameToFSSpec.restype = OSErr NativePathNameToFSSpec.argtypes = [ctypes.c_char_p, ctypes.POINTER(FSSpec), ctypes.c_long] OpenMovieFile = QTMLClient.OpenMovieFile if 1: kCFAllocatorDefault = 0 kCFStringEncodingMacRoman = 0 # CoreFoundation/CFString.h visionegg-1.2.1/VisionEgg/qtmovie.py0000755000076500000240000000752611224565530016641 0ustar astrawstaff"""high level QuickTime Movie wrapper""" import qtlowlevel import ctypes qtlowlevel.InitializeQTML(0) qtlowlevel.EnterMovies() def new_movie_from_filename(filename, MAX_PATH=255): """create a Movie from filename""" movieProps = (qtlowlevel.QTNewMoviePropertyElement * 5)() filename = unicode(filename) movieFilePathRef = qtlowlevel.CFStringRef() movieFilePathRef.value = qtlowlevel.CFStringCreateWithCharacters(qtlowlevel.kCFAllocatorDefault, filename, len(filename)) moviePropCount = 0 movieProps[moviePropCount].propClass = qtlowlevel.kQTPropertyClass_DataLocation movieProps[moviePropCount].propID = qtlowlevel.kQTDataLocationPropertyID_CFStringWindowsPath movieProps[moviePropCount].propValueSize = ctypes.sizeof(ctypes.c_void_p) movieProps[moviePropCount].propValueAddress = ctypes.cast(ctypes.byref(movieFilePathRef),ctypes.c_void_p) movieProps[moviePropCount].propStatus = 0 moviePropCount += 1 boolTrue = ctypes.c_ubyte(1) movieProps[moviePropCount].propClass = qtlowlevel.kQTPropertyClass_MovieInstantiation movieProps[moviePropCount].propID = qtlowlevel.kQTMovieInstantiationPropertyID_DontAskUnresolvedDataRefs movieProps[moviePropCount].propValueSize = ctypes.sizeof(boolTrue) movieProps[moviePropCount].propValueAddress = ctypes.cast(ctypes.pointer(boolTrue),ctypes.c_void_p) movieProps[moviePropCount].propStatus = 0 moviePropCount += 1 movieProps[moviePropCount].propClass = qtlowlevel.kQTPropertyClass_NewMovieProperty movieProps[moviePropCount].propID = qtlowlevel.kQTNewMoviePropertyID_Active movieProps[moviePropCount].propValueSize = ctypes.sizeof(boolTrue) movieProps[moviePropCount].propValueAddress = ctypes.cast(ctypes.pointer(boolTrue),ctypes.c_void_p) movieProps[moviePropCount].propStatus = 0 moviePropCount += 1 movieProps[moviePropCount].propClass = qtlowlevel.kQTPropertyClass_NewMovieProperty movieProps[moviePropCount].propID = qtlowlevel.kQTNewMoviePropertyID_DontInteractWithUser movieProps[moviePropCount].propValueSize = ctypes.sizeof(boolTrue) movieProps[moviePropCount].propValueAddress = ctypes.cast(ctypes.pointer(boolTrue),ctypes.c_void_p) movieProps[moviePropCount].propStatus = 0 moviePropCount += 1 theMovie = qtlowlevel.Movie() qtlowlevel.NewMovieFromProperties( moviePropCount, movieProps, 0, None, ctypes.byref(theMovie)) return Movie(theMovie) class Rect: def __init__(self,top=0,left=0,bottom=0,right=0): self.top = top self.left = left self.bottom = bottom self.right = right class Movie: """An encapsulated QuickTime Movie""" def __init__(self,theMovie): self.theMovie = theMovie def GetMovieBox(self): movieBounds = qtlowlevel.Rect() qtlowlevel.GetMovieBox(self.theMovie, ctypes.byref(movieBounds)) return Rect(top=movieBounds.top, left=movieBounds.left, bottom=movieBounds.bottom, right=movieBounds.right) def SetMovieBox(self,bounds): if not isinstance(bounds,Rect): raise ValueError('bounds argument must be instance of VisionEgg.qtmovie.Rect') b = qtlowlevel.Rect() (b.top, b.left, b.bottom, b.right) = (bounds.top, bounds.left, bounds.bottom, bounds.right) qtlowlevel.SetMovieBox(self.theMovie, ctypes.byref(b)) def StartMovie(self): qtlowlevel.StartMovie(self.theMovie) def MoviesTask(self,value): qtlowlevel.MoviesTask(self.theMovie, value) def IsMovieDone(self): return qtlowlevel.IsMovieDone(self.theMovie) def GoToBeginningOfMovie(self): qtlowlevel.GoToBeginningOfMovie(self.theMovie) visionegg-1.2.1/VisionEgg/QuickTime.py0000644000076500000240000000635711224565527017054 0ustar astrawstaff# The Vision Egg: QuickTime # # Copyright (C) 2001-2003, 2006 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ QuickTime movies in the Vision Egg. """ import VisionEgg import VisionEgg.gl_qt # C implementation of GL/QT interface import VisionEgg.qtmovie as qtmovie import VisionEgg.Textures import numpy.oldnumeric as Numeric import os import VisionEgg.GL as gl # get all OpenGL stuff in one namespace __version__ = VisionEgg.release_name __author__ = 'Andrew Straw ' ####################################################### new_movie_from_filename = qtmovie.new_movie_from_filename class MovieTexture(VisionEgg.Textures.Texture): __slots__ = ( 'movie', 'size', 'scale', 'gl_qt_renderer', ) def __init__(self, movie=None, texture_size=None, # be default will be big enough for full movie, otherwise 2-tuple ): if not isinstance(movie,qtmovie.Movie): if isinstance(movie,str) or isinstance(movie,unicode): movie = new_movie_from_filename(filename=movie) self.movie = movie bounds = self.movie.GetMovieBox() height = bounds.bottom-bounds.top width = bounds.right-bounds.left self.movie.SetMovieBox(qtmovie.Rect(top=0,left=0,bottom=height,right=width)) self.size = (width,height) self.scale = 1.0 def make_half_size(self): self.size = self.size[0]/2, self.size[1]/2 self.scale = self.scale/2 def unload(self): raise NotImplementedError('') def get_texels_as_image(self): raise NotImplementedError('') def load(self, texture_object, build_mipmaps=False, rescale_original_to_fill_texture_object = False, internal_format=gl.GL_RGB, ): if build_mipmaps: raise ValueError('cannot build mipmaps for QuickTime movies') if rescale_original_to_fill_texture_object: raise NotImplementedError('') width,height = self.size tex_shape = VisionEgg.Textures.next_power_of_2(max(width,height)) # fractional coverage self.buf_lf = 0.0 self.buf_rf = float(width)/tex_shape self.buf_bf = 0.0 self.buf_tf = float(height)/tex_shape # absolute (texel units) coverage self._buf_l = 0 self._buf_r = width self._buf_b = 0 self._buf_t = height buffer = Numeric.zeros( (tex_shape,tex_shape), Numeric.UInt8 ) texture_object.put_new_image( buffer, internal_format=gl.GL_RGB, mipmap_level=0 ) self.texture_object = texture_object self.gl_qt_renderer = VisionEgg.gl_qt.gl_qt_renderer_create(self.movie,tex_shape,self.scale) def update(self): # only call this when my texture unit is active VisionEgg.gl_qt.gl_qt_renderer_update(self.gl_qt_renderer) def __del__(self): VisionEgg.gl_qt.gl_qt_renderer_delete(self.gl_qt_renderer) visionegg-1.2.1/VisionEgg/ResponseControl.py0000644000076500000240000001404211224565527020306 0ustar astrawstaff# The Vision Egg: ResponseControl # # Author(s): Hubertus Becker # Copyright: (C) 2005 by Hertie Institute for Clinical Brain Research, # Department of Cognitive Neurology, University of Tuebingen # URL: http://www.hubertus-becker.de/resources/visionegg/ # # This library is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of # the License, or (at your option) any later version. """ Response control during a presentation is running. """ #################################################################### # # Import all the necessary packages # #################################################################### import logging import logging.handlers import VisionEgg import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.DaqKeyboard import VisionEgg.ParameterTypes as ve_types import pygame __version__ = VisionEgg.release_name #################################################################### # # ResponseController # #################################################################### class ResponseController(VisionEgg.FlowControl.Controller): """This abstract base class defines the interface to any ResponseController. This module provides an interface to collect responses during a presentation is running. To interface with real data acquisition devices, use a module that subclasses the classes defined here. """ def _reset(self): self.responses = [] self.responses_since_go = [] self.time_responses_since_go = [] self.first_responses_since_go = [] self.time_first_responses_since_go = None self.status_first_responses_since_go = False self.last_responses_since_go = [] self.time_last_responses_since_go = None def __init__(self, **kw): self._reset() def get_responses(self): """Returns the responses in the current frame.""" return self.responses get_data = get_responses # For backward compatibility def get_responses_since_go(self): """Returns all responses since the main 'go' loop has been started.""" return self.responses_since_go def get_time_responses_since_go(self): """Returns the time stamps for all responses since the main 'go' loop has been started.""" return self.time_responses_since_go def get_first_response_since_go(self, index=0): """Returns the first response since the main 'go' loop has been started.""" if self.first_responses_since_go == []: return [] else: return self.first_responses_since_go[index] def get_first_responses_since_go(self): """Returns the first responses since the main 'go' loop has been started.""" return self.first_responses_since_go def get_time_first_response_since_go(self): """Returns the time stamp for first responses since the main 'go' loop has been started.""" return self.time_first_responses_since_go get_time_first_responses_since_go = get_time_first_response_since_go def get_last_response_since_go(self, index=0): """Returns the last response since the main 'go' loop has been started.""" if self.last_responses_since_go == []: return [] else: return self.last_responses_since_go[index] def get_last_responses_since_go(self): """Returns the last responses since the main 'go' loop has been started.""" return self.last_responses_since_go def get_time_last_response_since_go(self): """Returns the time stamp for last response since the main 'go' loop has been started.""" return self.time_last_responses_since_go get_time_last_responses_since_go = get_time_last_response_since_go def between_go_eval(self): """Evaluate between runs of the main 'go' loop. Override this method in subclasses.""" raise RuntimeError("%s: Definition of between_go_eval() in abstract base class ResponseController must be overriden."%(str(self),)) def during_go_eval(self): """Evaluate during the main 'go' loop. Override this method in subclasses.""" raise RuntimeError("%s: Definition of during_go_eval() in abstract base class ResponseController must be overriden."%(str(self),)) #################################################################### # # KeyboardResponseController # #################################################################### #class KeyboardResponseController(VisionEgg.ReponseController): class KeyboardResponseController(ResponseController): """Use the keyboard to collect responses during a presentation is running.""" def __init__(self): VisionEgg.FlowControl.Controller.__init__(self, return_type=ve_types.get_type(None), eval_frequency=VisionEgg.FlowControl.Controller.EVERY_FRAME, temporal_variables=VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO ) self.input = VisionEgg.DaqKeyboard.KeyboardInput() def between_go_eval(self): return None # Ignore keyboard def during_go_eval(self): if self.time_sec_since_go <= 0.01: # Reset it every presentation self._reset() # self.responses = self.input.get_pygame_data() self.responses = self.input.get_string_data() if len(self.responses) > 0: self.responses_since_go.append(self.responses) self.time_responses_since_go.append(self.time_sec_since_go) if self.status_first_responses_since_go == False: self.time_first_responses_since_go = self.time_sec_since_go self.first_responses_since_go = self.responses self.status_first_responses_since_go = True self.time_last_responses_since_go = self.time_sec_since_go self.last_responses_since_go = self.responses return None visionegg-1.2.1/VisionEgg/SphereMap.py0000644000076500000240000015537211224565527017047 0ustar astrawstaff# The Vision Egg: SphereMap # # Copyright (C) 2001-2004 Andrew Straw. # Copyright (C) 2005-2008 California Institute of Technology # # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Stimuli on spheres, including texture maps. """ import math, types import logging import VisionEgg.Core import VisionEgg.Textures import VisionEgg.Text import VisionEgg.Gratings import VisionEgg.ThreeDeeMath import VisionEgg.ParameterTypes as ve_types import numpy import numpy.oldnumeric as Numeric import Image import VisionEgg.GL as gl # get all OpenGL stuff in one namespace __version__ = VisionEgg.release_name class AzElGrid(VisionEgg.Core.Stimulus): """Spherical grid of iso-azimuth and iso-elevation lines. Parameters ========== anti_aliasing -- (Boolean) Default: True center_azimuth -- (Real) Default: 0.0 center_elevation -- (Real) Default: 0.0 major_line_color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (0.0, 0.0, 0.0) major_line_width -- (Real) Default: 2.0 minor_line_color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (0.0, 0.0, 1.0) minor_line_width -- (Real) Default: 1.0 my_viewport -- (Instance of ) Default: (determined at runtime) on -- (Boolean) Default: True text_offset -- (Sequence2 of Real) Default: (3, -2) Constant Parameters =================== az_major_spacing -- (Real) Default: 30.0 az_minor_spacing -- (Real) Default: 10.0 el_major_spacing -- (Real) Default: 30.0 el_minor_spacing -- (Real) Default: 10.0 font_size -- (UnsignedInteger) Default: 24 num_samples_per_circle -- (UnsignedInteger) Default: 100 radius -- (Real) Default: 1.0 text_anchor -- (String) Default: lowerleft text_color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (0.0, 0.0, 0.0) use_text -- (Boolean) Default: True """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'center_azimuth':(0.0, # 0=right, 90=right ve_types.Real), 'center_elevation':(0.0, # 0=right, 90=up ve_types.Real), 'minor_line_width':(1.0, ve_types.Real), 'major_line_width':(2.0, ve_types.Real), 'minor_line_color':((0.0,0.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'major_line_color':((0.0,0.0,0.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'my_viewport':(None, # viewport I'm in ve_types.Instance(VisionEgg.Core.Viewport)), 'text_offset':((3,-2), # offset (x,y) to nudge text labels ve_types.Sequence2(ve_types.Real)), 'anti_aliasing' : ( True, ve_types.Boolean ), } constant_parameters_and_defaults = { 'use_text':(True, ve_types.Boolean), 'radius':(1.0, ve_types.Real), 'az_minor_spacing':(10.0, ve_types.Real), 'az_major_spacing':(30.0, ve_types.Real), 'el_minor_spacing':(10.0, ve_types.Real), 'el_major_spacing':(30.0, ve_types.Real), 'num_samples_per_circle':(100, ve_types.UnsignedInteger), 'font_size':(24, ve_types.UnsignedInteger), 'text_color':((0.0,0.0,0.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'text_anchor':('lowerleft', ve_types.String), } __slots__ = ( 'cached_minor_lines_display_list', 'cached_major_lines_display_list', 'text_viewport', 'text_viewport_orig', '_gave_alpha_warning', 'labels', 'labels_xyz', ) def __init__(self,**kw): VisionEgg.Core.Stimulus.__init__(self,**kw) self.cached_minor_lines_display_list = gl.glGenLists(1) # Allocate a new display list self.cached_major_lines_display_list = gl.glGenLists(1) # Allocate a new display list self.__rebuild_display_lists() self.text_viewport = None # not set yet self._gave_alpha_warning = False def __rebuild_display_lists(self): def get_xyz(theta,phi,radius): # theta normally between 0 and pi (north pole to south pole) # phi between -pi and pi y = radius * math.cos( theta ) w = radius * math.sin( theta ) x = w * math.cos( phi ) z = w * math.sin( phi ) return x,y,z def draw_half_great_circle(az): for i in range(cp.num_samples_per_circle/2): # let theta exceed 1 pi to draw 2nd half of circle theta_start = i/float(cp.num_samples_per_circle)*2*math.pi theta_stop = (i+1)/float(cp.num_samples_per_circle)*2*math.pi phi_start = phi_stop = (az-90.0)/180.0*math.pi x_start,y_start,z_start = get_xyz(theta_start,phi_start,cp.radius) x_stop,y_stop,z_stop = get_xyz(theta_stop,phi_stop,cp.radius) gl.glVertex3f(x_start, y_start, z_start) gl.glVertex3f(x_stop, y_stop, z_stop) def draw_iso_elevation_circle(el): # el from -90 = pi to el 90 = 0 theta_start = theta_stop = -(el-90) / 180.0 * math.pi for i in range(cp.num_samples_per_circle): phi_start = i/float(cp.num_samples_per_circle)*2*math.pi phi_stop = (i+1)/float(cp.num_samples_per_circle)*2*math.pi x_start,y_start,z_start = get_xyz(theta_start,phi_start,cp.radius) x_stop,y_stop,z_stop = get_xyz(theta_stop,phi_stop,cp.radius) gl.glVertex3f(x_start, y_start, z_start) gl.glVertex3f(x_stop, y_stop, z_stop) cp = self.constant_parameters # Weird range construction to be sure to include zero. azs_major = numpy.concatenate(( numpy.arange(0.0,180.0,cp.az_major_spacing), -numpy.arange(0.0,180.0,cp.az_major_spacing)[1:])) azs_minor = numpy.concatenate(( numpy.arange(0.0,180.0,cp.az_minor_spacing), -numpy.arange(0.0,180.0,cp.az_minor_spacing)[1:])) els_major = numpy.concatenate(( numpy.arange(0.0,90.0,cp.el_major_spacing), -numpy.arange(0.0,90.0,cp.el_major_spacing)[1:])) els_minor = numpy.concatenate(( numpy.arange(0.0,90.0,cp.el_minor_spacing), -numpy.arange(0.0,90.0,cp.el_minor_spacing)[1:])) gl.glNewList(self.cached_minor_lines_display_list,gl.GL_COMPILE) gl.glBegin(gl.GL_LINES) # az minor for az in azs_minor: if az in azs_major: continue # draw only once as major draw_half_great_circle(az) for el in els_minor: if el in els_major: continue # draw only once as major draw_iso_elevation_circle(el) gl.glEnd() gl.glEndList() gl.glNewList(self.cached_major_lines_display_list,gl.GL_COMPILE) gl.glBegin(gl.GL_LINES) for az in azs_major: draw_half_great_circle(az) for el in els_major: draw_iso_elevation_circle(el) gl.glEnd() gl.glEndList() if cp.use_text: self.labels = [] self.labels_xyz = [] els_major = list(els_major)+[90.0] # make sure we have north pole for el in els_major: for az in azs_major: theta = -(el-90) / 180.0 * math.pi phi = (az-90.0)/180.0*math.pi x,y,z = get_xyz(theta,phi,cp.radius) self.labels_xyz.append((x,y,z)) self.labels.append( VisionEgg.Text.Text( text = '%.0f, %.0f'%(az,el), font_size = cp.font_size, color = cp.text_color, anchor = cp.text_anchor, ) ) if (el == -90) or (el == 90): self.labels[-1].parameters.text = 'x, %.0f'%(el,) break # only one label at the poles self.labels_xyz = Numeric.array(self.labels_xyz) def draw(self): p = self.parameters cp = self.constant_parameters if p.on: # Set OpenGL state variables gl.glDisable( gl.GL_DEPTH_TEST ) gl.glDisable( gl.GL_TEXTURE_2D ) # Make sure textures are not drawn gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() gl.glRotatef(p.center_azimuth,0.0,-1.0,0.0) gl.glRotatef(p.center_elevation,1.0,0.0,0.0) if p.anti_aliasing: if len(p.minor_line_color) == 4 and not self._gave_alpha_warning: if p.minor_line_color[3] != 1.0: logger = logging.getLogger('VisionEgg.SphereMap') logger.warning("The parameter anti_aliasing is " "set to true in the AzElGrid " "stimulus class, but the color " "parameter specifies an alpha " "value other than 1.0. To " "acheive the best anti-aliasing, " "ensure that the alpha value for " "the color parameter is 1.0.") self._gave_alpha_warning = 1 if len(p.major_line_color) == 4 and not self._gave_alpha_warning: if p.major_line_color[3] != 1.0: logger = logging.getLogger('VisionEgg.SphereMap') logger.warning("The parameter anti_aliasing is " "set to true in the AzElGrid " "stimulus class, but the color " "parameter specifies an alpha " "value other than 1.0. To " "acheive the best anti-aliasing, " "ensure that the alpha value for " "the color parameter is 1.0.") self._gave_alpha_warning = 1 gl.glEnable( gl.GL_LINE_SMOOTH ) # allow max_alpha value to control blending gl.glEnable( gl.GL_BLEND ) gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) else: gl.glDisable( gl.GL_BLEND ) if len(p.minor_line_color)==3: gl.glColor3f(*p.minor_line_color) elif len(p.minor_line_color)==4: gl.glColor4f(*p.minor_line_color) gl.glLineWidth(p.minor_line_width) gl.glCallList(self.cached_minor_lines_display_list) if len(p.major_line_color)==3: gl.glColor3f(*p.major_line_color) elif len(p.major_line_color)==4: gl.glColor4f(*p.major_line_color) gl.glLineWidth(p.major_line_width) gl.glCallList(self.cached_major_lines_display_list) if p.anti_aliasing: gl.glDisable( gl.GL_LINE_SMOOTH ) # turn off if cp.use_text: my_view = p.my_viewport if (my_view is None) or (not my_view._is_drawing): raise ValueError('use_text is True, but my_viewport not (properly) assigned') if self.text_viewport is None or self.text_viewport_orig != my_view: # make viewport for text (uses default orthographic projection) vp = my_view.parameters self.text_viewport = VisionEgg.Core.Viewport(screen=vp.screen, position=vp.position, size=vp.size, anchor=vp.anchor, ) lowerleft = VisionEgg._get_lowerleft(vp.position,vp.anchor,vp.size) self.text_viewport.parameters.projection.stateless_translate(-lowerleft[0],-lowerleft[1],0) self.text_viewport_orig = p.my_viewport # in case my_viewport changes, change text_viewport # draw text labels my_proj = my_view.parameters.projection xyz = self.labels_xyz t = VisionEgg.ThreeDeeMath.TransformMatrix() t.rotate( p.center_azimuth,0.0,-1.0,0.0 ) # acheive same transforms as the lines t.rotate( p.center_elevation,1.0,0.0,0.0 ) xyz = t.transform_vertices(self.labels_xyz) clip = my_proj.eye_2_clip(xyz) try: # this is much faster when no OverflowError... window_coords = my_view.clip_2_window(clip) all_at_once = True except OverflowError: all_at_once = False draw_labels = [] for i in range(len(self.labels)): if clip[i,3] < 0: continue # this vertex is not on screen label = self.labels[i] if all_at_once: this_pos = window_coords[i,:2] else: try: window_coords = my_view.clip_2_window(clip[i,:]) except OverflowError: continue # not much we can do with this vertex, either this_pos = window_coords[:2] label.parameters.position = (this_pos[0] + p.text_offset[0], this_pos[1] + p.text_offset[1]) draw_labels.append(label) self.text_viewport.parameters.stimuli = draw_labels self.text_viewport.draw() my_view.make_current() # restore viewport gl.glPopMatrix() class SphereMap(VisionEgg.Textures.TextureStimulusBaseClass): """Mercator mapping of rectangular texture onto sphere. Parameters ========== center_azimuth -- (Real) Default: 0.0 center_elevation -- (Real) Default: 0.0 contrast -- (Real) Default: 1.0 on -- (Boolean) Default: True radius -- (Real) Default: 1.0 slices -- (UnsignedInteger) Default: 30 stacks -- (UnsignedInteger) Default: 30 texture -- source of texture data (Instance of ) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: (determined at runtime) texture_mag_filter -- OpenGL filter enum (Integer) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: GL_LINEAR (9729) texture_min_filter -- OpenGL filter enum (Integer) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_s -- OpenGL texture wrap enum (Integer) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_t -- OpenGL texture wrap enum (Integer) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: (GL enum determined at runtime) Constant Parameters =================== internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) Default: GL_RGB (6407) mipmaps_enabled -- Are mipmaps enabled? (Boolean) Default: True shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) Default: False """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'contrast':(1.0, ve_types.Real), 'center_azimuth':(0.0, # 0=right, 90=right ve_types.Real), 'center_elevation':(0.0, # 0=right, 90=up ve_types.Real), # Changing these parameters will cause re-computation of display list (may cause frame skip) 'radius':(1.0, ve_types.Real), 'slices':(30, ve_types.UnsignedInteger), 'stacks':(30, ve_types.UnsignedInteger)} __slots__ = ( 'cached_display_list', '_cached_radius', '_cached_slices', '_cached_stacks', ) def __init__(self,**kw): VisionEgg.Textures.TextureStimulusBaseClass.__init__(self,**kw) self.cached_display_list = gl.glGenLists(1) # Allocate a new display list self.__rebuild_display_list() def __rebuild_display_list(self): p = self.parameters s_gain = p.texture.buf_rf - p.texture.buf_lf t_gain = p.texture.buf_bf - p.texture.buf_tf s_offs = p.texture.buf_lf t_offs = p.texture.buf_tf gl.glNewList(self.cached_display_list,gl.GL_COMPILE) gl.glBegin(gl.GL_QUADS) for stack in range(p.stacks): stack_upper_frac = float(stack+1)/p.stacks stack_lower_frac = float(stack)/p.stacks theta_upper = stack_upper_frac * math.pi theta_lower = stack_lower_frac * math.pi y_upper = p.radius * math.cos( theta_upper ) w_upper = p.radius * math.sin( theta_upper ) y_lower = p.radius * math.cos( theta_lower ) w_lower = p.radius * math.sin( theta_lower ) for slice in range(p.slices): slice_start_frac = float(slice)/p.slices slice_stop_frac = float(slice+1)/p.slices phi_start = slice_start_frac * 2 * math.pi phi_stop = slice_stop_frac * 2 * math.pi x_start_upper = w_upper * math.cos(phi_start) x_start_lower = w_lower * math.cos(phi_start) x_stop_upper = w_upper * math.cos(phi_stop) x_stop_lower = w_lower * math.cos(phi_stop) z_start_upper = w_upper * math.sin(phi_start) z_start_lower = w_lower * math.sin(phi_start) z_stop_upper = w_upper * math.sin(phi_stop) z_stop_lower = w_lower * math.sin(phi_stop) tex_l = slice_start_frac*s_gain+s_offs tex_r = slice_stop_frac*s_gain+s_offs tex_b = stack_lower_frac*t_gain+t_offs tex_t = stack_upper_frac*t_gain+t_offs gl.glTexCoord2f(tex_l,tex_t) gl.glVertex3f(x_start_upper, y_upper, z_start_upper) gl.glTexCoord2f(tex_r,tex_t) gl.glVertex3f(x_stop_upper, y_upper, z_stop_upper) gl.glTexCoord2f(tex_r,tex_b) gl.glVertex3f(x_stop_lower, y_lower, z_stop_lower) gl.glTexCoord2f(tex_l,tex_b) gl.glVertex3f(x_start_lower, y_lower, z_start_lower) gl.glEnd() gl.glEndList() self._cached_radius = p.radius self._cached_slices = p.slices self._cached_stacks = p.stacks def draw(self): """Redraw the scene on every frame. """ p = self.parameters if self._cached_radius != p.radius or self._cached_slices != p.slices or self._cached_stacks != p.stacks: self.__rebuild_display_list() if p.on: # Set OpenGL state variables gl.glEnable( gl.GL_DEPTH_TEST ) gl.glEnable( gl.GL_TEXTURE_2D ) # Make sure textures are drawn gl.glEnable( gl.GL_BLEND ) # Contrast control implemented through blending # All of the contrast control stuff is somewhat arcane and # not very clear from reading the code, so here is how it # works in English. (Not that it makes it any more clear!) # # In the final "textured fragment" (before being blended # to the framebuffer), the color values are equal to those # of the texture (with the exception of pixels around the # edges which have their amplitudes reduced due to # anti-aliasing and are intermediate between the color of # the texture and mid-gray), and the alpha value is set to # the contrast. Blending occurs, and by choosing the # appropriate values for glBlendFunc, adds the product of # fragment alpha (contrast) and fragment color to the # product of one minus fragment alpha (contrast) and what # was already in the framebuffer. gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_DECAL) # clear modelview matrix gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() gl.glColor4f(0.5,0.5,0.5,p.contrast) # Set the polygons' fragment color (implements contrast) if not self.constant_parameters.mipmaps_enabled: if p.texture_min_filter in VisionEgg.Textures.TextureStimulusBaseClass._mipmap_modes: raise RuntimeError("Specified a mipmap mode in texture_min_filter, but mipmaps not enabled.") self.texture_object.set_min_filter( p.texture_min_filter ) self.texture_object.set_mag_filter( p.texture_mag_filter ) self.texture_object.set_wrap_mode_s( p.texture_wrap_s ) self.texture_object.set_wrap_mode_t( p.texture_wrap_t ) # center the texture map gl.glRotatef(p.center_azimuth,0.0,-1.0,0.0) gl.glRotatef(p.center_elevation,1.0,0.0,0.0) gl.glCallList(self.cached_display_list) gl.glPopMatrix() class SphereGrating(VisionEgg.Gratings.LuminanceGratingCommon): """Map 2D sinusoidal grating onto sphere. Parameters ========== bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) Inherited from VisionEgg.Gratings.LuminanceGratingCommon Default: 8 check_texture_size -- (Boolean) Default: True contrast -- (Real) Default: 1.0 grating_center_azimuth -- (Real) Default: 0.0 grating_center_elevation -- (Real) Default: 0.0 ignore_time -- (Boolean) Default: False lowpass_cutoff_cycles_per_texel -- helps prevent spatial aliasing (Real) Default: 0.5 min_filter -- OpenGL filter enum (Integer) Default: GL_LINEAR (9729) num_samples -- (UnsignedInteger) Default: 1024 on -- (Boolean) Default: True orientation -- (Real) Default: 0.0 phase_at_t0 -- (Real) Default: 0.0 radius -- (Real) Default: 1.0 slices -- (UnsignedInteger) Default: 30 spatial_freq_cpd -- (Real) Default: 0.0277777777778 stacks -- (UnsignedInteger) Default: 30 t0_time_sec_absolute -- (Real) Default: (determined at runtime) temporal_freq_hz -- (Real) Default: 5.0 """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'contrast':(1.0, ve_types.Real), 'spatial_freq_cpd':(1.0/36.0, # cycles/degree ve_types.Real), 'temporal_freq_hz':(5.0, # hz ve_types.Real), 't0_time_sec_absolute':(None, ve_types.Real), 'ignore_time':(False, # ignore temporal frequency variable - allow control purely with phase_at_t0 ve_types.Boolean), 'phase_at_t0':(0.0, # degrees ve_types.Real), 'orientation':(0.0, # 0=right, 90=up ve_types.Real), 'grating_center_azimuth':(0.0, # 0=right, 90=down ve_types.Real), 'grating_center_elevation':(0.0, # 0=right, 90=down ve_types.Real), 'check_texture_size':(True, # slows down drawing but catches errors ve_types.Boolean), 'lowpass_cutoff_cycles_per_texel':(0.5, ve_types.Real, 'helps prevent spatial aliasing'), 'min_filter':(gl.GL_LINEAR, ve_types.Integer, "OpenGL filter enum", VisionEgg.ParameterDefinition.OPENGL_ENUM), # changing this parameters causes re-drawing of the texture object and may cause frame skipping 'num_samples':(1024, # number of spatial samples, should be a power of 2 ve_types.UnsignedInteger), # Changing these parameters will cause re-computation of display list (may cause frame skip) 'radius':(1.0, ve_types.Real), 'slices':(30, ve_types.UnsignedInteger), 'stacks':(30, ve_types.UnsignedInteger), } __slots__ = ( 'texture_object_id', 'cached_display_list_id', '_cached_num_samples', '_cached_radius', '_cached_slices', '_cached_stacks', ) def __init__(self,**kw): VisionEgg.Gratings.LuminanceGratingCommon.__init__(self,**kw) if self.parameters.t0_time_sec_absolute is None: self.parameters.t0_time_sec_absolute = VisionEgg.time_func() self.texture_object_id = gl.glGenTextures(1) # Allocate a new texture object self.__rebuild_texture_object() self.cached_display_list_id = gl.glGenLists(1) # Allocate a new display list self.__rebuild_display_list() def __rebuild_texture_object(self): gl.glBindTexture(gl.GL_TEXTURE_1D,self.texture_object_id) p = self.parameters # shorthand # Do error-checking on texture to make sure it will load max_dim = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE) if p.num_samples > max_dim: raise VisionEgg.Gratings.NumSamplesTooLargeError("Grating num_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) self.calculate_bit_depth_dependencies() l = 0.0 r = 360.0 mipmap_level = 0 this_mipmap_level_num_samples = p.num_samples while this_mipmap_level_num_samples >= 1: inc = 360.0/float(this_mipmap_level_num_samples) # degrees per pixel cycles_per_texel = p.spatial_freq_cpd * inc if cycles_per_texel < p.lowpass_cutoff_cycles_per_texel: # sharp cutoff lowpass filter # below cutoff frequency - draw sine wave if p.ignore_time: phase = p.phase_at_t0 else: t_var = VisionEgg.time_func() - p.t0_time_sec_absolute phase = t_var*p.temporal_freq_hz*360.0 + p.phase_at_t0 floating_point_sin = Numeric.sin(2.0*math.pi*p.spatial_freq_cpd*Numeric.arange(l,r,inc,'d')-(phase/180.0*math.pi))*0.5*p.contrast+0.5 floating_point_sin = Numeric.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() else: # above cutoff frequency - blank texel_data = (self.max_int_val*0.5)*Numeric.ones((this_mipmap_level_num_samples,),self.numpy_dtype) if p.check_texture_size: # Because the MAX_TEXTURE_SIZE method is insensitive to the current # state of the video system, another check must be done using # "proxy textures". gl.glTexImage1D(gl.GL_PROXY_TEXTURE_1D, # target mipmap_level, # level self.gl_internal_format, # video RAM internal format: RGB this_mipmap_level_num_samples, # width 0, # border self.format, # format of image data self.gl_type, # type of image data texel_data) # texel data if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_1D,0,gl.GL_TEXTURE_WIDTH) == 0: raise NumSamplesTooLargeError("Grating num_samples is too wide for your video system!") # If we got here, it worked and we can load the texture for real. gl.glTexImage1D(gl.GL_TEXTURE_1D, # target mipmap_level, # level self.gl_internal_format, # video RAM internal format: RGB this_mipmap_level_num_samples, # width 0, # border self.format, # format of image data self.gl_type, # type of image data texel_data) # texel data # prepare for next mipmap level this_mipmap_level_num_samples = this_mipmap_level_num_samples/2 # integer division mipmap_level += 1 # Set some texture object defaults gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_S,gl.GL_REPEAT) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_WRAP_T,gl.GL_REPEAT) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MAG_FILTER,gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MIN_FILTER,p.min_filter) self._cached_num_samples = p.num_samples def __rebuild_display_list(self): gl.glNewList(self.cached_display_list_id,gl.GL_COMPILE) p = self.parameters gl.glBegin(gl.GL_QUADS) for stack in range(p.stacks): stack_upper_frac = float(stack+1)/p.stacks stack_lower_frac = float(stack)/p.stacks theta_upper = stack_upper_frac * math.pi theta_lower = stack_lower_frac * math.pi y_upper = p.radius * math.cos( theta_upper ) w_upper = p.radius * math.sin( theta_upper ) y_lower = p.radius * math.cos( theta_lower ) w_lower = p.radius * math.sin( theta_lower ) for slice in range(p.slices): slice_start_frac = float(slice)/p.slices slice_stop_frac = float(slice+1)/p.slices phi_start = slice_start_frac * 2 * math.pi phi_stop = slice_stop_frac * 2 * math.pi x_start_upper = w_upper * math.cos(phi_start) x_start_lower = w_lower * math.cos(phi_start) x_stop_upper = w_upper * math.cos(phi_stop) x_stop_lower = w_lower * math.cos(phi_stop) z_start_upper = w_upper * math.sin(phi_start) z_start_lower = w_lower * math.sin(phi_start) z_stop_upper = w_upper * math.sin(phi_stop) z_stop_lower = w_lower * math.sin(phi_stop) tex_l = slice_start_frac tex_r = slice_stop_frac tex_b = 0.0#stack_lower_frac tex_t = 1.0#stack_upper_frac gl.glTexCoord2f(tex_l,tex_t) gl.glVertex3f(x_start_upper, y_upper, z_start_upper) gl.glTexCoord2f(tex_r,tex_t) gl.glVertex3f(x_stop_upper, y_upper, z_stop_upper) gl.glTexCoord2f(tex_r,tex_b) gl.glVertex3f(x_stop_lower, y_lower, z_stop_lower) gl.glTexCoord2f(tex_l,tex_b) gl.glVertex3f(x_start_lower, y_lower, z_start_lower) gl.glEnd() gl.glEndList() self._cached_radius = p.radius self._cached_slices = p.slices self._cached_stacks = p.stacks def draw(self): """Redraw the scene on every frame. """ p = self.parameters if self._cached_radius != p.radius or self._cached_slices != p.slices or self._cached_stacks != p.stacks: self.__rebuild_display_list() if self._cached_num_samples != p.num_samples: self.__rebuild_texture_object() if p.on: if p.bit_depth != self.cached_bit_depth: self.calculate_bit_depth_dependencies() # Set OpenGL state variables gl.glEnable( gl.GL_DEPTH_TEST ) gl.glEnable( gl.GL_TEXTURE_1D ) # Make sure textures are drawn gl.glDisable( gl.GL_TEXTURE_2D ) gl.glDisable( gl.GL_BLEND ) gl.glBindTexture(gl.GL_TEXTURE_1D,self.texture_object_id) gl.glTexParameteri(gl.GL_TEXTURE_1D,gl.GL_TEXTURE_MIN_FILTER,p.min_filter) l = 0.0 r = 360.0 mipmap_level = 0 this_mipmap_level_num_samples = p.num_samples while this_mipmap_level_num_samples >= 1: inc = 360.0/float(this_mipmap_level_num_samples)# degrees per pixel cycles_per_texel = p.spatial_freq_cpd * inc if cycles_per_texel < p.lowpass_cutoff_cycles_per_texel: # sharp cutoff lowpass filter if p.ignore_time: phase = p.phase_at_t0 else: t_var = VisionEgg.time_func() - p.t0_time_sec_absolute phase = t_var*p.temporal_freq_hz*360.0 + p.phase_at_t0 floating_point_sin = Numeric.sin(2.0*math.pi*p.spatial_freq_cpd*Numeric.arange(l,r,inc,'d')-(phase/180.0*math.pi))*0.5*p.contrast+0.5 floating_point_sin = Numeric.clip(floating_point_sin,0.0,1.0) # allow square wave generation if contrast > 1 texel_data = (floating_point_sin*self.max_int_val).astype(self.numpy_dtype).tostring() else: blank = 0.5*Numeric.ones((this_mipmap_level_num_samples,),'d') texel_data = (blank*self.max_int_val).astype(self.numpy_dtype).tostring() gl.glTexSubImage1D(gl.GL_TEXTURE_1D, # target mipmap_level, # level 0, # x offset this_mipmap_level_num_samples, # width self.format, # data format self.gl_type, # data type texel_data) # prepare for next mipmap level this_mipmap_level_num_samples = this_mipmap_level_num_samples/2 # integer division mipmap_level += 1 gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_REPLACE) # clear modelview matrix gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() # center the grating gl.glRotatef(p.grating_center_azimuth,0.0,-1.0,0.0) gl.glRotatef(p.grating_center_elevation,1.0,0.0,0.0) # do the orientation gl.glRotatef(p.orientation,0.0,0.0,1.0) gl.glCallList(self.cached_display_list_id) gl.glDisable( gl.GL_TEXTURE_1D ) gl.glPopMatrix() class SphereWindow(VisionEgg.Gratings.LuminanceGratingCommon): """This draws an opaque sphere with a single window in it. This is useful when you need to have a viewport on a 3D scene. Parameters ========== bit_depth -- precision with which grating is calculated and sent to OpenGL (UnsignedInteger) Inherited from VisionEgg.Gratings.LuminanceGratingCommon Default: 8 num_s_samples -- (UnsignedInteger) Default: 512 num_t_samples -- (UnsignedInteger) Default: 512 on -- (Boolean) Default: True opaque_color -- (Sequence4 of Real) Default: (0.5, 0.5, 0.5, 0.0) radius -- (Real) Default: 1.0 slices -- (UnsignedInteger) Default: 30 stacks -- (UnsignedInteger) Default: 30 window_center_azimuth -- (Real) Default: 0.0 window_center_elevation -- (Real) Default: 0.0 window_shape -- can be 'circle', 'gaussian', or 'lat-long rectangle' (String) Default: gaussian window_shape_parameter2 -- (currently only used for) height of lat-long rectangle (in degrees) (Real) Default: 30.0 window_shape_radius_parameter -- radius of circle, sigma of gaussian, width of lat-long rectangle (in degrees) (Real) Default: 36.0 """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'window_center_elevation':(0.0, ve_types.Real), 'window_center_azimuth':(0.0, ve_types.Real), 'opaque_color':((0.5,0.5,0.5,0.0), ve_types.Sequence4(ve_types.Real)), # changing these parameters causes re-drawing of the texture object and may cause frame skipping 'window_shape':('gaussian', # can be 'circle' or 'gaussian' ve_types.String, "can be 'circle', 'gaussian', or 'lat-long rectangle'", ), 'window_shape_radius_parameter':(36.0, ve_types.Real, 'radius of circle, sigma of gaussian, width of lat-long rectangle (in degrees)', ), 'window_shape_parameter2':(30.0, ve_types.Real, '(currently only used for) height of lat-long rectangle (in degrees)', ), 'num_s_samples':(512, # number of horizontal spatial samples, should be a power of 2 ve_types.UnsignedInteger), 'num_t_samples':(512, # number of vertical spatial samples, should be a power of 2 ve_types.UnsignedInteger), # Changing these parameters will cause re-computation of display list (may cause frame skip) 'radius':(1.0, # XXX could modify code below to use scaling, thus avoiding need for recomputation ve_types.Real), 'slices':(30, ve_types.UnsignedInteger), 'stacks':(30, ve_types.UnsignedInteger), } __slots__ = ( 'texture_object_id', 'windowed_display_list_id', 'opaque_display_list_id', '_cached_window_shape', '_cached_shape_radius_parameter', '_cached_shape_parameter2', '_cached_num_s_samples', '_cached_num_t_samples', '_cached_radius', '_cached_slices', '_cached_stacks', '_texture_s_is_azimuth', ) def __init__(self, **kw): VisionEgg.Gratings.LuminanceGratingCommon.__init__(self, **kw ) p = self.parameters # set self._texture_s_is_azimuth in advance if p.window_shape == 'lat-long rectangle': self._texture_s_is_azimuth = True else: self._texture_s_is_azimuth = False self.texture_object_id = gl.glGenTextures(1) self.__rebuild_texture_object() self.windowed_display_list_id = gl.glGenLists(1) # Allocate a new display list self.opaque_display_list_id = gl.glGenLists(1) # Allocate a new display list self.__rebuild_display_lists() def __rebuild_texture_object(self): gl.glBindTexture(gl.GL_TEXTURE_2D,self.texture_object_id) p = self.parameters # Do error-checking on texture to make sure it will load max_dim = gl.glGetIntegerv(gl.GL_MAX_TEXTURE_SIZE) if p.num_s_samples > max_dim: raise VisionEgg.Gratings.NumSamplesTooLargeError("SphereWindow num_s_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) if p.num_t_samples > max_dim: raise VisionEgg.Gratings.NumSamplesTooLargeError("SphereWindow num_t_samples too large for video system.\nOpenGL reports maximum size of %d"%(max_dim,)) self.calculate_bit_depth_dependencies() self.gl_internal_format = gl.GL_ALPHA # change from luminance to alpha self.format = gl.GL_ALPHA # texture coordinates are Mercator: (determined when building display list) # s: x within sphere # t: z within sphere if p.window_shape == 'circle': if self._texture_s_is_azimuth: self.__rebuild_display_lists() # XXX this is aliased s_axis = (Numeric.arange(p.num_s_samples)/float(p.num_s_samples)-0.5)**2 t_axis = (Numeric.arange(p.num_t_samples)/float(p.num_t_samples)-0.5)**2 mask = s_axis[Numeric.NewAxis,:] + t_axis[:,Numeric.NewAxis] angle_deg = min(180,p.window_shape_radius_parameter) # clip angle cartesian_radius = 0.5*math.sin(p.window_shape_radius_parameter/180.0*math.pi) floating_point_window = Numeric.less(mask,cartesian_radius**2) elif p.window_shape == 'gaussian': if self._texture_s_is_azimuth: self.__rebuild_display_lists() MIN_EXP = -745.0 MAX_EXP = 709.0 s = Numeric.arange(0.0,p.num_s_samples,1.0,'f')/p.num_s_samples t = Numeric.arange(0.0,p.num_t_samples,1.0,'f')/p.num_t_samples sigma_normalized = p.window_shape_radius_parameter / 90.0 * 0.5 check_s = -((s-0.5)**2/(2.0*sigma_normalized**2)) try: # some platforms raise OverflowError when doing this on small numbers val_s = Numeric.exp( check_s ) except OverflowError: check_s = Numeric.clip(check_s,MIN_EXP,MAX_EXP) val_s = Numeric.exp( check_s ) check_t = -((t-0.5)**2/(2.0*sigma_normalized**2)) try: val_t = Numeric.exp( check_t ) except OverflowError: check_t = Numeric.clip(check_t,MIN_EXP,MAX_EXP) val_t = Numeric.exp( check_t ) floating_point_window = Numeric.outerproduct(val_t,val_s) elif p.window_shape == 'lat-long rectangle': if not self._texture_s_is_azimuth: self.__rebuild_display_lists() # s coordinate represents -90 to +90 degrees (azimuth). s_axis = (Numeric.arange(p.num_s_samples)/float(p.num_s_samples)-0.5)*180 s_axis = Numeric.less( abs(s_axis), p.window_shape_radius_parameter*0.5 ) # t coordinate represents height. # Convert angle to height. angle_deg = min(90,p.window_shape_parameter2*0.5) # clip angle desired_height = math.sin(angle_deg/180.0*math.pi)*0.5 t_axis = Numeric.arange(p.num_t_samples)/float(p.num_t_samples)-0.5 t_axis = Numeric.less(abs(t_axis),desired_height) floating_point_window = Numeric.outerproduct(t_axis,s_axis) else: raise RuntimeError('Unknown window_shape "%s"'%(p.window_shape,)) texel_data = (floating_point_window * self.max_int_val).astype(self.numpy_dtype).tostring() # Because the MAX_TEXTURE_SIZE method is insensitive to the current # state of the video system, another check must be done using # "proxy textures". gl.glTexImage2D(gl.GL_PROXY_TEXTURE_2D, # target 0, # mipmap_level self.gl_internal_format, # video RAM internal format p.num_s_samples, # width p.num_t_samples, # height 0, # border self.format, # format of image data self.gl_type, # type of image data texel_data) # texel data if (gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_2D, # Need PyOpenGL >= 2.0 0, gl.GL_TEXTURE_WIDTH) == 0) or ( gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_2D, 0, gl.GL_TEXTURE_HEIGHT) == 0): raise VisionEgg.Gratings.NumSamplesTooLargeError("SphereWindow num_s_samples or num_t_samples is too large for your video system!") gl.glTexImage2D(gl.GL_TEXTURE_2D, # target 0, # mipmap_level self.gl_internal_format, # video RAM internal format p.num_s_samples, # width p.num_t_samples, # height 0, # border self.format, # format of image data self.gl_type, # type of image data texel_data) # texel data # Set some texture object defaults gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_WRAP_S,gl.GL_CLAMP_TO_EDGE) gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_WRAP_T,gl.GL_CLAMP_TO_EDGE) gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_MAG_FILTER,gl.GL_LINEAR) gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_MIN_FILTER,gl.GL_LINEAR) self._cached_window_shape = p.window_shape self._cached_shape_radius_parameter = p.window_shape_radius_parameter self._cached_shape_parameter2 = p.window_shape_parameter2 self._cached_num_s_samples = p.num_s_samples self._cached_num_t_samples = p.num_t_samples def __rebuild_display_lists(self): gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() p = self.parameters if p.window_shape == 'lat-long rectangle': self._texture_s_is_azimuth = True else: self._texture_s_is_azimuth = False gl.glNewList(self.windowed_display_list_id,gl.GL_COMPILE) gl.glBegin(gl.GL_QUADS) for stack in range(p.stacks): stack_upper_frac = float(stack+1)/p.stacks stack_lower_frac = float(stack)/p.stacks theta_upper = stack_upper_frac * math.pi theta_lower = stack_lower_frac * math.pi y_upper = p.radius * math.cos( theta_upper ) w_upper = p.radius * math.sin( theta_upper ) y_lower = p.radius * math.cos( theta_lower ) w_lower = p.radius * math.sin( theta_lower ) for slice in range(p.slices/2,p.slices): # only do half of sphere (other half has no window) slice_start_frac = float(slice)/p.slices slice_stop_frac = float(slice+1)/p.slices phi_start = slice_start_frac * 2 * math.pi phi_stop = slice_stop_frac * 2 * math.pi x_start_upper = w_upper * math.cos(phi_start) x_start_lower = w_lower * math.cos(phi_start) x_stop_upper = w_upper * math.cos(phi_stop) x_stop_lower = w_lower * math.cos(phi_stop) z_start_upper = w_upper * math.sin(phi_start) z_start_lower = w_lower * math.sin(phi_start) z_stop_upper = w_upper * math.sin(phi_stop) z_stop_lower = w_lower * math.sin(phi_stop) o = 0.5 g = 0.5 / p.radius if self._texture_s_is_azimuth: tex_s_start = slice_start_frac*2-1 tex_s_stop = slice_stop_frac*2-1 else: tex_s_start = x_start_upper*g+o tex_s_stop = x_stop_upper*g+o gl.glTexCoord2f(tex_s_start,y_upper*g+o) gl.glVertex3f(x_start_upper, y_upper, z_start_upper) gl.glTexCoord2f(tex_s_stop,y_upper*g+o) gl.glVertex3f(x_stop_upper, y_upper, z_stop_upper) gl.glTexCoord2f(tex_s_stop,y_lower*g+o) gl.glVertex3f(x_stop_lower, y_lower, z_stop_lower) gl.glTexCoord2f(tex_s_start,y_lower*g+o) gl.glVertex3f(x_start_lower, y_lower, z_start_lower) gl.glEnd() gl.glEndList() gl.glNewList(self.opaque_display_list_id,gl.GL_COMPILE) gl.glBegin(gl.GL_QUADS) for stack in range(p.stacks): stack_upper_frac = float(stack+1)/p.stacks stack_lower_frac = float(stack)/p.stacks theta_upper = stack_upper_frac * math.pi theta_lower = stack_lower_frac * math.pi y_upper = p.radius * math.cos( theta_upper ) w_upper = p.radius * math.sin( theta_upper ) y_lower = p.radius * math.cos( theta_lower ) w_lower = p.radius * math.sin( theta_lower ) for slice in range(p.slices/2): # half of sphere with no window slice_start_frac = float(slice)/p.slices slice_stop_frac = float(slice+1)/p.slices phi_start = slice_start_frac * 2 * math.pi phi_stop = slice_stop_frac * 2 * math.pi x_start_upper = w_upper * math.cos(phi_start) x_start_lower = w_lower * math.cos(phi_start) x_stop_upper = w_upper * math.cos(phi_stop) x_stop_lower = w_lower * math.cos(phi_stop) z_start_upper = w_upper * math.sin(phi_start) z_start_lower = w_lower * math.sin(phi_start) z_stop_upper = w_upper * math.sin(phi_stop) z_stop_lower = w_lower * math.sin(phi_stop) gl.glVertex3f(x_start_upper, y_upper, z_start_upper) gl.glVertex3f(x_stop_upper, y_upper, z_stop_upper) gl.glVertex3f(x_stop_lower, y_lower, z_stop_lower) gl.glVertex3f(x_start_lower, y_lower, z_start_lower) gl.glEnd() gl.glEndList() self._cached_radius = p.radius self._cached_slices = p.slices self._cached_stacks = p.stacks gl.glPopMatrix() def draw(self): """Redraw the scene on every frame. """ p = self.parameters if self._cached_radius != p.radius or self._cached_slices != p.slices or self._cached_stacks != p.stacks: self.__rebuild_display_lists() if self._cached_window_shape != p.window_shape or self._cached_shape_radius_parameter != p.window_shape_radius_parameter: self.__rebuild_texture_object() if p.window_shape == 'lat-long rectangle' and self._cached_shape_parameter2 != p.window_shape_parameter2: self.__rebuild_texture_object() if self._cached_num_s_samples != p.num_s_samples or self._cached_num_t_samples != p.num_t_samples: self.__rebuild_texture_object() if p.on: #gl.glPolygonMode( gl.GL_FRONT_AND_BACK, gl.GL_LINE ) if p.bit_depth != self.cached_bit_depth: self.calculate_bit_depth_dependencies() self.gl_internal_format = gl.GL_ALPHA # change from luminance to alpha self.format = gl.GL_ALPHA # Set OpenGL state variables gl.glEnable( gl.GL_DEPTH_TEST ) gl.glEnable( gl.GL_TEXTURE_2D ) gl.glEnable( gl.GL_BLEND ) gl.glBlendFunc( gl.GL_ONE_MINUS_SRC_ALPHA, gl.GL_SRC_ALPHA ) # alpha 1.0 = transparent gl.glBindTexture(gl.GL_TEXTURE_2D,self.texture_object_id) gl.glColor4f( *p.opaque_color ) gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_REPLACE) # clear modelview matrix gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() # do the window position gl.glRotatef(p.window_center_azimuth,0.0,-1.0,0.0) gl.glRotatef(p.window_center_elevation,1.0,0.0,0.0) gl.glCallList(self.windowed_display_list_id) gl.glCallList(self.opaque_display_list_id) gl.glPopMatrix() visionegg-1.2.1/VisionEgg/TCPController.py0000644000076500000240000010503111231311031017611 0ustar astrawstaff# The Vision Egg: TCPController # # Copyright (C) 2001-2003 Andrew Straw. # Author: Andrew Straw # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # $Id$ """ Allows control of parameter values over the network. Don't use for realtime control unless you think your network is that fast and reliable. Also, this code has not been optimized for speed, and I think it is unwise to attempt to change the value of controllers in realtime. In other words, do not design an experiment where, on a remote computer, you have determined that a certain amount of time has passed, and you require a certain new controller value NOW. In this case, it would be better to use parameter=eval_str() with an if statement involving time. To control parameters over a network, start a server with an instance of TCPServer. The server spawns an instance of SocketListenController for each connected socket. (Most commonly you will only want connection over a single socket.) The instance of SocketListenController handles all communication for that connection and serves as a container and (meta) controller for instances of TCPController. This module contains ABSOLUTELY NO SECURITY FEATURES, and could easily allow arbitrary execution of code on your computer. For this reason, if you use this module, I recommend operating behind a firewall. This could be an inexpensive "routing switch" used for cable modems, which would provide the added benefit that your local network would be isolated. This would elimate all traffic not to or from computers on the switch and therefore reduce/eliminate packet collisions, decrease latency, and providing a network performance and reliability. To address security concerns, you could also write code that implements IP address checking or other security features. """ import VisionEgg import VisionEgg.Core import VisionEgg.FlowControl import VisionEgg.ParameterTypes as ve_types import socket, select, re, string, types import numpy.oldnumeric as Numeric, math # for eval try: import Tkinter except: pass import logging __version__ = VisionEgg.release_name class TCPServer: """TCP server creates SocketListenController upon connection. This class is analagous to VisionEgg.PyroHelpers.PyroServer. """ def __init__(self, hostname="", port=7834, single_socket_but_reconnect_ok=0, dialog_ok=1, confirm_address_with_gui=1): """Bind to hostname and port, but don't listen yet. """ server_address = (socket.getfqdn(hostname),port) self.dialog_ok = dialog_ok self.single_socket_but_reconnect_ok = single_socket_but_reconnect_ok self.buffer = "" self.server_socket=None if not globals().has_key("Tkinter") or (VisionEgg.config.VISIONEGG_TKINTER_OK==0): self.dialog_ok = 0 class GetServerAddressWindow(Tkinter.Frame): def __init__(self,server_address,**kw): try: Tkinter.Frame.__init__(self,**kw) except AttributeError,x: tk=Tkinter.Tk() # restart Tk and see if that helps Tkinter.Frame.__init__(self,tk,**kw) self.winfo_toplevel().title("Vision Egg: TCP Server get address") self.server_address = server_address hostname,port = self.server_address self.clicked_ok = 0 self.hostname = Tkinter.StringVar() self.hostname.set(hostname) self.port = Tkinter.StringVar() self.port.set(port) row = 0 Tkinter.Label(self, text="Please enter the hostname and port you would like to listen for connections on.", ).grid(row=row,columnspan=2) row += 1 Tkinter.Label(self, text="Hostname (blank means localhost):", ).grid(row=row,column=0,sticky=Tkinter.E) Tkinter.Entry(self,textvariable=self.hostname).grid(row=row,column=1,sticky=Tkinter.W+Tkinter.E,padx=10) row += 1 Tkinter.Label(self, text="Port:", ).grid(row=row,column=0,sticky=Tkinter.E) Tkinter.Entry(self,textvariable=self.port).grid(row=row,column=1,sticky=Tkinter.W+Tkinter.E,padx=10) row += 1 b = Tkinter.Button(self, text="Bind port and listen for connections", command=self.click_ok) b.grid(row=row,columnspan=2) b.focus_force() b.bind('',self.click_ok) def click_ok(self,dummy_arg=None): hostname = self.hostname.get() try: port = int(self.port.get()) except: port = self.port.get() self.server_address = (hostname,port) self.clicked_ok = 1 self.winfo_toplevel().destroy() bound = 0 if not bound: # while not bound: # don't loop until the code is cleaner if confirm_address_with_gui and self.dialog_ok: window = GetServerAddressWindow(server_address) window.pack() window.mainloop() if not window.clicked_ok: return # User wants to quit server_address = window.server_address self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.bind(server_address) bound = 1 def create_listener_once_connected(self,eval_frequency=None): """Wait for connection and spawn instance of SocketListenController.""" if eval_frequency is None: # Don't listen to socket during go loop -- especially don't want to skip frames then eval_frequency = VisionEgg.FlowControl.Controller.EVERY_FRAME | VisionEgg.FlowControl.Controller.NOT_DURING_GO host,port = self.server_socket.getsockname() fqdn = socket.getfqdn(host) logger = logging.getLogger('VisionEgg.TCPController') logger.info("Awaiting connection to TCP Server at '%s', port %d"%(fqdn,port)) self.server_socket.listen(1) if self.dialog_ok: # Make a Tkinter dialog box class WaitingDialog(Tkinter.Frame): def __init__(self,server_socket=None,**kw): Tkinter.Frame.__init__(self,**kw) self.winfo_toplevel().title('Vision Egg TCP Server') self.server_socket = server_socket host,port = self.server_socket.getsockname() fqdn = socket.getfqdn(host) spacer = Tkinter.Frame(self,borderwidth=30) spacer.pack() Tkinter.Label(spacer,text= """Awaiting connection to TCP Server at "%s", port %d"""%(fqdn,port) ).pack() b = Tkinter.Button(self,text="Cancel",command=self.stop_listening) b.pack(side=Tkinter.BOTTOM) b.focus_force() b.bind('',self.stop_listening) self.winfo_toplevel().protocol("WM_DELETE_WINDOW", self.stop_listening) self.server_socket.setblocking(0) self.after(1,self.idle_func) def stop_listening(self,dummy=None): raise SystemExit def idle_func(self): try: # This line raises an exception unless there's an incoming connection self.accepted = self.server_socket.accept() self.quit() except socket.error, x: self.after(1,self.idle_func) dialog = WaitingDialog(server_socket = self.server_socket) dialog.pack() dialog.mainloop() client, client_address = dialog.accepted dialog.winfo_toplevel().destroy() else: client, client_address = self.server_socket.accept() if self.single_socket_but_reconnect_ok: return SocketListenController(client, disconnect_ok = 1, server_socket = self.server_socket) else: return SocketListenController(client) class SocketListenController(VisionEgg.FlowControl.Controller): r"""Handle connection from remote machine, control TCPControllers. This meta controller handles a TCP socket to control zero to many instances of TCPController. As a subclass of Controller, it gets called at specified moments in time via the Presentation class. When called in this way, it checks for any strings from the TCP socket. It parses this information into a command or fails and sends an error. This class is analagous to VisionEgg.PyroHelpers.PyroListenController. TCP commands (sent over network socket) ======================================= close -- close the connection exit -- close the connection quit -- quit the server program help -- print help message -- show the value of the controller of =const() -- assign a new ConstantController to =eval_str() -- assign a new EvalStringController to =exec_str() -- assign a new ExecStringController to =exec_str(*) -- assign a new unrestricted namespace ExecStringController to TCP commands are always on a single line. (Newlines in string literals can be specified by using "\n" without the quotes.) The assignment commands share common behavior: -- value passed as argument "tcp_name" to method create_tcp_controller -- during_go [, between_go [, eval_frequency [, temporal_variables [, return_type ]]]] The string is parsed by the Python's eval() function. If you don't want to explicitly set an argument early in the argument list, but you need to set one late in the list, use "None". If not set, the optional arguments default to: eval_frequency = EVERY_FRAME temporal_variables = TIME_SEC_SINCE_GO return_type = (evaluates during_go function to find) between_go = (see below, depends on assignment type) The only difference between the assignment commands are in the first two arguments. For "const(...)", the first two arguments are constant values, for "eval_str(...)" they are strings that evaluate to a single variable, and for "exec_str(...)", they are strings that set the variable "x" in their local namespace, which is then returned. (An unrestricted namespace is available with "exec_str(*...)".) If the argument between_go is set to None or is not defined, the behavior depends on the assignment command. If this is a =const(...) assignment, between_go_value is set to during_go_value. If this is a =eval_str(...) or =exec_str(...) assignment, the correct value cannot be guessed, and therefore the between_go_eval function will never be called (the eval_frequency flag NOT_BETWEEN_GO is set). Because the default value for temporal_variables is TIME_SEC_SINCE_GO, the variable "t" may be safely used in the during_go string for the eval_str or exec_str assignment commands. See the documentation for VisionEgg.FlowControl.EvalStringController for more information. Example commands from TCP port (try with telnet): =const(1.0) =eval_str("t*360.0") =exec_str("x=t*360.0") =const(0.,1.,EVERY_FRAME) =const(1,None,ONCE) =const(1.0,0.0,EVERY_FRAME,TIME_INDEPENDENT,types.FloatType) =eval_str("t*360.0","t_abs*360.0",None,TIME_SEC_ABSOLUTE|TIME_SEC_SINCE_GO) =eval_str("t_abs*360.0","t_abs*360.0",EVERY_FRAME,TIME_SEC_ABSOLUTE,types.FloatType) =exec_str("x=t*360.0","x=0.0",EVERY_FRAME,TIME_SEC_SINCE_GO) =exec_str("print 'Time since go=%f'%(t,)\nx=t*360.0","x=0.0",EVERY_FRAME,TIME_SEC_SINCE_GO) """ help_string = r""" TCP commands (sent over network socket): close -- close the connection exit -- close the connection quit -- quit the server program help -- print this message -- show the value of the controller of =const() -- assign a new ConstantController to =eval_str() -- assign a new EvalStringController to =exec_str() -- assign a new ExecStringController to =exec_str(*) -- assign a new unrestricted namespace ExecStringController to TCP commands are always on a single line. (Newlines in string literals can be specified by using "\n" without the quotes.) The assignment commands share common behavior: -- value passed as argument "tcp_name" to method create_tcp_controller -- during_go [, between_go [, eval_frequency [, temporal_variables [, return_type ]]]] """ _re_line = re.compile(r"^(.*)\n",re.MULTILINE) _re_x_finder = re.compile(r'\A|\Wx\s?=[^=]') # The real newlines have already been parsed by the time the buffer gets to these statements: _re_const = re.compile(r'^const\(\s?(.*)\s?\)$',re.DOTALL) _re_eval_str = re.compile(r'^eval_str\(\s?(.*)\s?\)$',re.DOTALL) _re_exec_str = re.compile(r'^exec_str\(\s?(\*)?\s?(.*)\s?\)$',re.DOTALL) _parse_args_globals = {'types':types} _parse_args_locals = VisionEgg.FlowControl.Controller.flag_dictionary def __init__(self, socket, disconnect_ok = 0, server_socket = None, # Only needed if reconnecting ok temporal_variables = VisionEgg.FlowControl.Controller.TIME_INDEPENDENT, eval_frequency = VisionEgg.FlowControl.Controller.EVERY_FRAME): """Instantiated by TCPServer.""" VisionEgg.FlowControl.Controller.__init__(self, return_type = types.NoneType, temporal_variables = temporal_variables, eval_frequency = eval_frequency) self.socket = socket self.disconnect_ok = disconnect_ok if self.disconnect_ok and server_socket is None: # Warning -- no ability to accept further incoming sockets... pass self.server_socket = server_socket logger = logging.getLogger('VisionEgg.TCPController') logger.info("Handling connection from %s"%(self.socket.getsockname(),)) self.socket.setblocking(0) # don't block on this socket self.socket.send("Hello. This is %s version %s.\n"%(self.__class__,__version__)) self.socket.send(SocketListenController.help_string+"\n") self.socket.send("Begin sending commands now.\n") self.buffer = "" self.last_command = {} self.names = {} # ( controller, name_re, parser, require_type ) def send_raw_text(self,text): """Send text over the TCP socket.""" self.socket.send(text) def __check_socket(self): if self.socket is not None: # Normal, connected behavior # First, update the buffer ready_to_read, temp, temp2 = select.select([self.socket],[],[],0) new_info = 0 while len(ready_to_read): try: new = self.socket.recv(1024) # When disconnected, this fails on Win32 except socket.error, x: if not self.disconnect_ok: raise else: self.socket.close() self.socket = None if self.server_socket is not None: self.server_socket.setblocking(0) return if len(new) == 0: # When disconnected, this happens on unix # Disconnected self.socket.close() # close socket self.socket = None if not self.disconnect_ok: raise RuntimeError("Socket disconnected!") else: if self.server_socket is not None: self.server_socket.setblocking(0) return # don't do any more #assert(ready_to_read[0] == self.socket) self.buffer += new new_info = 1 ready_to_read, temp, temp2 = select.select([self.socket],[],[],0) # Second, convert the buffer to command_queue entries if new_info: # Handle variations on newlines: self.buffer = string.replace(self.buffer,chr(0x0D),"") # no CR self.buffer = string.replace(self.buffer,chr(0x0A),"\n") # LF = newline # Handle each line for which we have a tcp_name for tcp_name in self.names.keys(): (controller, name_re_str, parser, require_type) = self.names[tcp_name] # If the following line makes a match, it # sticks the result in self.last_command[tcp_name] by calling the parser function. self.buffer = name_re_str.sub(parser,self.buffer) # Now act based on the command parsed command = self.last_command[tcp_name] if command is not None: self.__do_assignment_command(tcp_name,command,require_type) self.last_command[tcp_name] = None # Clear any complete lines for which we don't have a tcp_name self.buffer = SocketListenController._re_line.sub(self.__unprocessed_line,self.buffer) elif self.server_socket is not None: # Not connected on self.socket, check self.server_socket for new connection try: # This line raises an exception unless there's an incoming connection (if server is not blocking, which it shouldn't be) (client, client_address) = self.server_socket.accept() self.socket = client self.socket.send("Hello. This is %s version %s.\n"%(self.__class__,__version__)) self.socket.send(SocketListenController.help_string+"\n") self.socket.send("Begin sending commands now.\n") for tcp_name in self.names.keys(): (controller, name_re_str, parser, require_type) = self.names[tcp_name] self.socket.send('"%s" controllable with this connection.\n'%tcp_name) except socket.error, x: pass def __unprocessed_line(self,match): text = match.group(1) text = string.strip(text).lower() if text=="quit": # this a hack, really (should be a controller in charge of Presentation.parameters.quit) raise SystemExit elif text=="close" or text=="exit": self.socket = None # close socket if not self.disconnect_ok: raise RuntimeError("Socket disconnected!") else: if self.server_socket is not None: self.server_socket.setblocking(0) return "" elif text=="help": self.socket.send(SocketListenController.help_string+"\n") return "" elif text in self.names.keys(): (controller, name_re_str, parser, require_type) = self.names[text] self.socket.send(text+"="+str(controller)+"\n") return "" self.socket.send("Error: Invalid command line \""+text+"\"\n") logger = logging.getLogger('VisionEgg.TCPController') logger.warning('Invalid command line: "%s"'%(text,)) return '' def create_tcp_controller(self, tcp_name=None, initial_controller=None, require_type=None): """Create new instance of TCPController. Arguments: tcp_name -- String to reference new TCPController over TCP Optional arguments: initial_controller -- Initial value of TCPController instance require_type -- force this as TCPController instance's return_type """ class Parser: def __init__(self,tcp_name,most_recent_command): self.tcp_name = tcp_name self.most_recent_command = most_recent_command def parse_func(self,match): # Could make this into a lambda function self.most_recent_command[self.tcp_name] = match.groups()[-1] return "" if tcp_name is None: raise ValueError("Must specify tcp_name") if tcp_name in self.names.keys(): raise ValueError('tcp_name "%s" already in use.'%tcp_name) if string.count(tcp_name,' '): raise ValueError('tcp_name "%s" cannot have spaces.'%tcp_name) if tcp_name == "quit": raise ValueError('tcp_name "%s" conflicts with reserved word.'%tcp_name) if initial_controller is None: # create default controller initial_controller = VisionEgg.FlowControl.ConstantController( during_go_value=1.0, between_go_value=0.0) else: if not isinstance(initial_controller,VisionEgg.FlowControl.Controller): print initial_controller raise ValueError('initial_controller not an instance of VisionEgg.FlowControl.Controller') if require_type is None: require_type = initial_controller.returns_type() # Create initial None value for self.last_command dict self.last_command[tcp_name] = None # Create values for self.names dict tuple ( controller, name_re, most_recent_command, parser ) controller = TCPController( tcp_name=tcp_name, initial_controller=initial_controller ) name_re_str = re.compile("^"+tcp_name+r"\s*=\s*(.*)\s*\n$",re.MULTILINE) parser = Parser(tcp_name,self.last_command).parse_func self.names[tcp_name] = (controller, name_re_str, parser, require_type) self.socket.send('"%s" controllable with this connection.\n'%tcp_name) return controller def __get_five_args(self,arg_string): args = eval("("+arg_string+",)",SocketListenController._parse_args_globals,SocketListenController._parse_args_locals) num_args = len(args) if num_args == 0: args = (None,None,None,None,None) elif num_args == 1: args = (args[0],None,None,None,None) elif num_args == 2: args = (args[0],args[1],None,None,None) elif num_args == 3: args = (args[0],args[1],args[2],None,None) elif num_args == 4: args = (args[0],args[1],args[2],args[3],None) elif num_args > 5: raise ValueError("Too many arguments!") if args[0] is None: raise ValueError("First argument must be set.") return args def __process_common_args(self,kw_args,match_groups): if match_groups[2] is not None: kw_args['eval_frequency'] = match_groups[2] if match_groups[3] is not None: kw_args['temporal_variables'] = match_groups[3] if match_groups[4] is not None: kw_args['return_type'] = match_groups[4] def __do_assignment_command(self,tcp_name,command,require_type): new_contained_controller = None match = SocketListenController._re_const.match(command) if match is not None: try: match_groups = self.__get_five_args(match.group(1)) kw_args = {} kw_args['during_go_value'] = match_groups[0] if match_groups[1] is not None: kw_args['between_go_value'] = match_groups[1] self.__process_common_args(kw_args,match_groups) kw_args.setdefault('return_type',require_type) new_contained_controller = VisionEgg.FlowControl.ConstantController(**kw_args) new_type = new_contained_controller.returns_type() ve_types.assert_type( new_type, require_type) except Exception, x: import traceback traceback.print_exc() self.socket.send("Error %s parsing const for %s: %s\n"%(x.__class__,tcp_name,x)) logger = logging.getLogger('VisionEgg.TCPController') logger.info("%s parsing const for %s: %s"%(x.__class__,tcp_name,x)) else: match = SocketListenController._re_eval_str.match(command) if match is not None: try: match_groups = self.__get_five_args(match.group(1)) kw_args = {} kw_args['during_go_eval_string'] = string.replace(match_groups[0],r"\n","\n") if match_groups[1] is not None: kw_args['between_go_eval_string'] = string.replace(match_groups[1],r"\n","\n") self.__process_common_args(kw_args,match_groups) kw_args.setdefault('return_type',require_type) new_contained_controller = VisionEgg.FlowControl.EvalStringController(**kw_args) if not (new_contained_controller.eval_frequency & VisionEgg.FlowControl.Controller.NOT_DURING_GO): logger = logging.getLogger('VisionEgg.TCPController') logger.debug('Executing "%s" as safety check.'%(kw_args['during_go_eval_string'],)) new_contained_controller._test_self(1) if not (new_contained_controller.eval_frequency & VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO): logger = logging.getLogger('VisionEgg.TCPController') logger.debug('Executing "%s" as safety check.'%(kw_args['between_go_eval_string'],)) new_contained_controller._test_self(0) new_type = new_contained_controller.returns_type() ve_types.assert_type( new_type, require_type) except Exception, x: new_contained_controller = None self.socket.send("Error %s parsing eval_str for %s: %s\n"%(x.__class__,tcp_name,x)) logger = logging.getLogger('VisionEgg.TCPController') logger.info("%s parsing eval_str for %s: %s"%(x.__class__,tcp_name,x)) else: match = SocketListenController._re_exec_str.match(command) if match is not None: try: kw_args = {} match_groups = match.groups() if match_groups[0] == '*': kw_args['restricted_namespace'] = 0 else: kw_args['restricted_namespace'] = 1 match_groups = self.__get_five_args(match_groups[1]) tmp = string.replace(match_groups[0],r"\n","\n") if not SocketListenController._re_x_finder.match(tmp): raise ValueError("x is not defined for during_go_exec_string") kw_args['during_go_exec_string'] = tmp if match_groups[1] is not None: tmp = string.replace(match_groups[1],r"\n","\n") if not SocketListenController._re_x_finder.match(tmp): raise ValueError("x is not defined for between_go_exec_string") kw_args['between_go_exec_string'] = tmp self.__process_common_args(kw_args,match_groups) kw_args.setdefault('return_type',require_type) new_contained_controller = VisionEgg.FlowControl.ExecStringController(**kw_args) if not (new_contained_controller.eval_frequency & VisionEgg.FlowControl.Controller.NOT_DURING_GO): logger = logging.getLogger('VisionEgg.TCPController') logger.debug('Executing "%s" as safety check.'%(kw_args['during_go_exec_string'],)) new_contained_controller._test_self(1) if not (new_contained_controller.eval_frequency & VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO): logger = logging.getLogger('VisionEgg.TCPController') logger.debug('Executing "%s" as safety check.'%(kw_args['between_go_exec_string'],)) new_contained_controller._test_self(0) new_type = new_contained_controller.returns_type() ve_types.assert_type( new_type, require_type) except Exception, x: new_contained_controller = None self.socket.send("Error %s parsing exec_str for %s: %s\n"%(x.__class__,tcp_name,x)) logger = logging.getLogger('VisionEgg.TCPController') logger.debug("%s parsing exec_str for %s: %s"%(x.__class__,tcp_name,x)) else: self.socket.send("Error: Invalid assignment command for %s: %s\n"%(tcp_name,command)) logger = logging.getLogger('VisionEgg.TCPController') logger.info("Invalid assignment command for %s: %s"%(tcp_name,command)) # create controller based on last command_queue if new_contained_controller is not None: (controller, name_re_str, parser, require_type) = self.names[tcp_name] controller.set_new_controller(new_contained_controller) def during_go_eval(self): """Check socket and act accordingly. Called by instance of Presentation. Overrides base class Controller method.""" self.__check_socket() return None def between_go_eval(self): """Check socket and act accordingly. Called by instance of Presentation. Overrides base class Controller method.""" self.__check_socket() return None class TCPController(VisionEgg.FlowControl.EncapsulatedController): """Control a parameter from a network (TCP) connection. Subclass of Controller to allow control of Parameters via the network. This class is analagous to VisionEgg.PyroHelpers.PyroEncapsulatedController. """ # Contains another controller... def __init__(self, tcp_name, initial_controller): """Instantiated by SocketListenController. Users should create instance by using method create_tcp_controller of class SocketListenController.""" VisionEgg.FlowControl.EncapsulatedController.__init__(self,initial_controller) self.tcp_name = tcp_name def __str__(self): value = "" my_class = self.contained_controller.__class__ if my_class == VisionEgg.FlowControl.ConstantController: value += "const( " value += str(self.contained_controller.get_during_go_value()) + ", " value += str(self.contained_controller.get_between_go_value()) + ", " elif my_class == VisionEgg.FlowControl.EvalStringController: value += "eval_str( " str_val = self.contained_controller.get_during_go_eval_string() if str_val is None: value += "None, " else: value += '"' + string.replace(str_val,"\n",r"\n") + '", ' str_val = self.contained_controller.get_between_go_eval_string() if str_val is None: value += "None, " else: value += '"' + string.replace(str_val,"\n",r"\n") + '", ' elif my_class == VisionEgg.FlowControl.ExecStringController: value += "exec_str(" if self.contained_controller.restricted_namespace: value += " " else: # unrestricted value += "* " str_val = self.contained_controller.get_during_go_exec_string() if str_val is None: value += "None, " else: value += '"' + string.replace(str_val,"\n",r"\n") + '", ' str_val = self.contained_controller.get_between_go_exec_string() if str_val is None: value += "None, " else: value += '"' + string.replace(str_val,"\n",r"\n") + '", ' never = 1 ef = self.contained_controller.eval_frequency if ef & VisionEgg.FlowControl.Controller.EVERY_FRAME: value += "EVERY_FRAME | " never = 0 if ef & VisionEgg.FlowControl.Controller.TRANSITIONS: value += "TRANSITIONS | " never = 0 if ef & VisionEgg.FlowControl.Controller.ONCE: value += "ONCE | " never = 0 if ef & VisionEgg.FlowControl.Controller.NOT_DURING_GO: value += "NOT_DURING_GO | " never = 0 if ef & VisionEgg.FlowControl.Controller.NOT_BETWEEN_GO: value += "NOT_BETWEEN_GO | " never = 0 if never: value += "NEVER" else: value = value[:-3] # get rid of trailing "| " value += ", " time_indep = 1 tv = self.contained_controller.temporal_variables if tv & VisionEgg.FlowControl.Controller.TIME_SEC_ABSOLUTE: value += "TIME_SEC_ABSOLUTE | " time_indep = 0 if tv & VisionEgg.FlowControl.Controller.TIME_SEC_SINCE_GO: value += "TIME_SEC_SINCE_GO | " time_indep = 0 if tv & VisionEgg.FlowControl.Controller.FRAMES_ABSOLUTE: value += "FRAMES_ABSOLUTE | " time_indep = 0 if tv & VisionEgg.FlowControl.Controller.FRAMES_SINCE_GO: value += "FRAMES_SINCE_GO | " time_indep = 0 if time_indep: value += "TIME_INDEPENDENT" else: value = value[:-3] # get rid of trailing "| " value += ", " my_type = self.contained_controller.returns_type() if my_type == types.ClassType: value += str(my_type) else: for t in dir(types): if my_type == getattr(types,t): value += "types."+t break value += " )" return value visionegg-1.2.1/VisionEgg/test_Core.py0000644000076500000240000000024211224565530017065 0ustar astrawstafffrom VisionEgg.Core import FrameTimer def test_FrameTimer(): ft = FrameTimer() ft.tick() ft.tick() result = ft.get_longest_frame_duration_sec() visionegg-1.2.1/VisionEgg/Text.py0000644000076500000240000003412011224565527016072 0ustar astrawstaff# The Vision Egg: Text # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2005,2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Text stimuli. """ #################################################################### # # Import all the necessary packages # #################################################################### import logging import logging.handlers import VisionEgg.Core import VisionEgg.Textures import VisionEgg.ParameterTypes as ve_types import VisionEgg.GL as gl # get all OpenGL stuff in one namespace import pygame try: import OpenGL.GLUT as glut have_glut = True except: have_glut = False _font_objects = {} # global variable to cache pygame font objects def delete_font_objects(): for key in _font_objects.keys(): del _font_objects[key] VisionEgg.Core.pygame_keeper.register_func_to_call_on_quit(delete_font_objects) class Text(VisionEgg.Textures.TextureStimulus): """Single line of text rendered using pygame/SDL true type fonts. Parameters ========== anchor -- specifies how position parameter is interpreted (String) Inherited from VisionEgg.Textures.TextureStimulus Default: lowerleft angle -- units: degrees, 0=right, 90=up (Real) Inherited from VisionEgg.Textures.TextureStimulus Default: 0.0 color -- texture environment color. alpha ignored (if given) for max_alpha parameter (AnyOf(Sequence3 of Real or Sequence4 of Real)) Inherited from VisionEgg.Textures.TextureStimulus Default: (1.0, 1.0, 1.0) depth_test -- perform depth test? (Boolean) Inherited from VisionEgg.Textures.TextureStimulus Default: False ignore_size_parameter -- (Boolean) Default: True mask -- optional masking function (Instance of ) Inherited from VisionEgg.Textures.TextureStimulus Default: (determined at runtime) max_alpha -- controls opacity. 1.0=copletely opaque, 0.0=completely transparent (Real) Inherited from VisionEgg.Textures.TextureStimulus Default: 1.0 on -- draw stimulus? (Boolean) Inherited from VisionEgg.Textures.TextureStimulus Default: True position -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) Inherited from VisionEgg.Textures.TextureStimulus Default: (0.0, 0.0) size -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real) Inherited from VisionEgg.Textures.TextureStimulus Default: (determined at runtime) text -- (AnyOf(String or Unicode)) Default: the string to display texture -- source of texture data (Instance of ) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: (determined at runtime) texture_mag_filter -- OpenGL filter enum (Integer) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: GL_LINEAR (9729) texture_min_filter -- OpenGL filter enum (Integer) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_s -- OpenGL texture wrap enum (Integer) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_t -- OpenGL texture wrap enum (Integer) Inherited from VisionEgg.Textures.TextureStimulusBaseClass Default: (GL enum determined at runtime) Constant Parameters =================== font_name -- (AnyOf(String or Unicode)) Default: (determined at runtime) font_size -- (UnsignedInteger) Default: 30 internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) Inherited from VisionEgg.Textures.TextureStimulus Default: GL_RGB (6407) mipmaps_enabled -- Are mipmaps enabled? (Boolean) Inherited from VisionEgg.Textures.TextureStimulus Default: True shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) Inherited from VisionEgg.Textures.TextureStimulus Default: False """ parameters_and_defaults = { 'text': ( 'the string to display', #changing this redraws texture, may cause slowdown ve_types.AnyOf(ve_types.String,ve_types.Unicode)), 'ignore_size_parameter':(True, # when true, draws text at 100% size ve_types.Boolean), } constant_parameters_and_defaults = { 'font_size':(30, ve_types.UnsignedInteger), 'font_name':(None, # None = use default font ve_types.AnyOf(ve_types.String,ve_types.Unicode)), } __slots__ = ( 'font', '_text', ) def __init__(self,**kw): if not pygame.font: raise RuntimeError("no pygame font module") if not pygame.font.get_init(): pygame.font.init() if not pygame.font.get_init(): raise RuntimeError("pygame doesn't init") # override some defaults if 'internal_format' not in kw.keys(): kw['internal_format'] = gl.GL_RGBA if 'mipmaps_enabled' not in kw.keys(): kw['mipmaps_enabled'] = 0 if 'texture_min_filter' not in kw.keys(): kw['texture_min_filter'] = gl.GL_LINEAR VisionEgg.Textures.TextureStimulus.__init__(self,**kw) cp = self.constant_parameters fontobject_args = (cp.font_name,cp.font_size) if fontobject_args not in _font_objects: # make global cache of font objects fontobject = pygame.font.Font(*fontobject_args) _font_objects[fontobject_args] = fontobject # get font object from global cache self.font = _font_objects[fontobject_args] self._render_text() def _render_text(self): p = self.parameters rendered_surf = self.font.render(p.text, 1, (255,255,255)) # pygame.Surface object # we could use put_new_image for speed (or put_sub_image for more) p.texture = VisionEgg.Textures.Texture(rendered_surf) self._reload_texture() self._text = p.text # cache string so we know when to re-render if p.ignore_size_parameter: p.size = p.texture.size def draw(self): p = self.parameters if p.texture != self._using_texture: # self._using_texture is from TextureStimulusBaseClass raise RuntimeError("my texture has been modified, but it shouldn't be") if p.text != self._text: # new text self._render_text() if p.ignore_size_parameter: p.size = p.texture.size VisionEgg.Textures.TextureStimulus.draw(self) # call base class if have_glut: class GlutTextBase(VisionEgg.Core.Stimulus): """DEPRECATED. Base class: don't instantiate this class directly. Base class that defines the common interface between the other glut-based text stimuli. Parameters ========== color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) lowerleft -- (Sequence2 of Real) Default: (320, 240) on -- (Boolean) Default: True text -- (String) Default: the string to display """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'color':((1.0,1.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'lowerleft':((320,240), ve_types.Sequence2(ve_types.Real)), 'text':('the string to display', ve_types.String)} def __init__(self,**kw): if not hasattr(VisionEgg.config,"_GAVE_GLUT_TEXT_DEPRECATION"): logger = logging.getLogger('VisionEgg.Text') logger.warning("Using GlutTextBase class. This will be " "removed in a future release. Use " "VisionEgg.Text.Text instead.") VisionEgg.config._GAVE_GLUT_TEXT_DEPRECATION = 1 VisionEgg.Core.Stimulus.__init__(self,**kw) class BitmapText(GlutTextBase): """DEPRECATED. Bitmap fonts from GLUT. Parameters ========== color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Inherited from GlutTextBase Default: (1.0, 1.0, 1.0) font -- (Integer) Default: 5 lowerleft -- (Sequence2 of Real) Inherited from GlutTextBase Default: (320, 240) on -- (Boolean) Inherited from GlutTextBase Default: True text -- (String) Inherited from GlutTextBase Default: the string to display """ parameters_and_defaults = { 'font':(glut.GLUT_BITMAP_TIMES_ROMAN_24, ve_types.Integer), } def __init__(self,**kw): GlutTextBase.__init__(self,**kw) def draw(self): if self.parameters.on: gl.glDisable(gl.GL_TEXTURE_2D) gl.glDisable(gl.GL_BLEND) gl.glDisable(gl.GL_DEPTH_TEST) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() gl.glTranslate(self.parameters.lowerleft[0],self.parameters.lowerleft[1],0.0) c = self.parameters.color if len(c)==3: gl.glColor3f(*c) elif len(c)==4: gl.glColor4f(*c) gl.glDisable(gl.GL_TEXTURE_2D) gl.glRasterPos3f(0.0,0.0,0.0) for char in self.parameters.text: glut.glutBitmapCharacter(self.parameters.font,ord(char)) gl.glPopMatrix() class StrokeText(GlutTextBase): """DEPRECATED. Text rendered by GLUT using stroke fonts. Parameters ========== anti_aliasing -- (Boolean) Default: True color -- (AnyOf(Sequence3 of Real or Sequence4 of Real)) Inherited from GlutTextBase Default: (1.0, 1.0, 1.0) font -- (Integer) Default: 0 linewidth -- (Real) Default: 3.0 lowerleft -- (Sequence2 of Real) Inherited from GlutTextBase Default: (320, 240) on -- (Boolean) Inherited from GlutTextBase Default: True orientation -- (Real) Default: 0.0 text -- (String) Inherited from GlutTextBase Default: the string to display """ parameters_and_defaults = { 'font':(glut.GLUT_STROKE_ROMAN, ve_types.Integer), 'orientation':(0.0, ve_types.Real), 'linewidth':(3.0, # pixels ve_types.Real), 'anti_aliasing':(True, ve_types.Boolean), } def __init__(self,**kw): raise NotImplementedError("There's something broken with StrokeText, and I haven't figured it out yet!") GlutTextBase.__init__(self,**kw) def draw(self): if self.parameters.on: gl.glDisable(gl.GL_TEXTURE_2D) gl.glDisable(gl.GL_DEPTH_TEST) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() gl.glTranslate(self.parameters.lowerleft[0],self.parameters.lowerleft[1],0.0) gl.glRotate(self.parameters.orientation,0.0,0.0,1.0) c = self.parameters.color if len(c)==3: gl.glColor3f(*c) elif len(c)==4: gl.glColor4f(*c) gl.glLineWidth(self.parameters.linewidth) if self.parameters.anti_aliasing: gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(gl.GL_SRC_ALPHA,gl.GL_ONE_MINUS_SRC_ALPHA) gl.glEnable(gl.GL_LINE_SMOOTH) else: gl.glDisable(gl.GL_BLEND) ## # This code successfully draws a box... ## gl.glBegin(gl.GL_QUADS) ## gl.glVertex2f(0.0,0.0) ## gl.glVertex2f(0.0,0.1) ## gl.glVertex2f(0.1,0.1) ## gl.glVertex2f(0.1,0.0) ## gl.glEnd() # But this code does not draw the string!?! for char in self.parameters.text: glut.glutStrokeCharacter(self.parameters.font,ord(char)) gl.glPopMatrix() visionegg-1.2.1/VisionEgg/Textures.py0000644000076500000240000026501611231303024016757 0ustar astrawstaff# The Vision Egg: Textures # # Copyright (C) 2001-2004 Andrew Straw # Copyright (C) 2004-2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Texture (images mapped onto polygons) stimuli. """ #################################################################### # # Import all the necessary packages # #################################################################### import logging # available in Python 2.3 import VisionEgg import VisionEgg.Core import VisionEgg.ParameterTypes as ve_types import Image, ImageDraw # Python Imaging Library packages import pygame.surface, pygame.image # pygame import math, types, os import numpy import numpy.oldnumeric as numpyNumeric, numpy.oldnumeric.mlab as MLab import VisionEgg.GL as gl # get all OpenGL stuff in one namespace import OpenGL.GLU as glu # These modules are part of PIL and get loaded as needed by Image. # They are listed here so that Gordon McMillan's Installer properly # locates them. You will not hurt anything other than your ability to # make executables using Intaller if you remove these lines. import _imaging import ImageFile, ImageFileIO, BmpImagePlugin, JpegImagePlugin, PngImagePlugin if Image.VERSION >= '1.1.3': shrink_filter = Image.ANTIALIAS # Added in PIL 1.1.3 else: shrink_filter = Image.BICUBIC # Fallback filtering array_types = [numpy.ndarray] # Allow use of numarray and original Numeric texels without requiring either try: import numarray array_types.append( numarray.numarraycore.NumArray ) except ImportError: pass try: import Numeric as orig_Numeric array_types.append( orig_Numeric.ArrayType ) except ImportError: pass def convert_to_numpy_if_array(A): if type(A) in array_types: # with late release Numeric and numarray this is a view of the data return numpy.asarray(A) else: return A #################################################################### # # XXX ToDo: # The main remaining feature to add to this module is automatic # management of texture objects. This would allow many small images # (e.g. a bit of text) to live in one large texture object. This # would be much faster when many small textures are drawn in rapid # succession. (Apparently this might not be such a big improvement on # OS X. (See http://crystal.sourceforge.net/phpwiki/index.php?MacXGL) # Here's a sample from Apple's TextureRange demo which is supposed # to speed up texture transfers. # glBindTextures( target, &texID); # glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, 1); # glTexImage2D(target, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,image_ptr); # Update the texture with: # glTexSubImage2D(target, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,image_ptr); #################################################################### #################################################################### # # Textures # #################################################################### def next_power_of_2(f): return int(math.pow(2.0,math.ceil(math.log(f)/math.log(2.0)))) def is_power_of_2(f): return f == next_power_of_2(f) class Texture(object): """A 2 dimensional texture. The pixel data can come from an image file, an image file stream, an instance of Image from the Python Imaging Library, a numpy array, or None. If the data is a numpy array, floating point numbers are assumed to be in the range 0.0 to 1.0, and integers are assumed to be in the range 0 to 255. The first index is the row (y position), the second index is the column (x position), and if it's RGB or RGBA data, the third index specifies the color band. Thus, if the texel data was 640 pixels wide by 480 pixels tall, the array would have shape (480,640) for luminance information, (480,640,3) for RGB information, and (480,640,4) for RGBA information. The 2D texture data is not sent to OpenGL (video texture memory) until the load() method is called. The unload() method may be used to remove the data from OpenGL. A reference to the original image data is maintained.""" __slots__ = ('texels', 'texture_object', 'size', '_filename', '_file_stream', 'buf_lf', 'buf_rf', 'buf_bf', 'buf_tf', '_buf_l', '_buf_r', '_buf_b', '_buf_t', ) def __init__(self,texels=None,size=None): """Creates instance of Texture object. texels -- Texture data. If not specified, a blank white texture is created. size -- If a tuple, force size of texture data if possible, raising an exception if not. If None, has no effect. """ if texels is None: # no texel data: make default if size is None: size = (256,256) # an arbitrary default size texels = Image.new("RGB",size,(255,255,255)) # white if type(texels) == types.FileType: texels = Image.open(texels) # Attempt to open as an image file elif type(texels) in (types.StringType,types.UnicodeType): # is this string a filename or raw image data? if os.path.isfile(texels): # cache filename and file stream for later use (if possible) self._filename = texels self._file_stream = open(texels,"rb") texels = Image.open(texels) # Attempt to open as an image stream texels = convert_to_numpy_if_array(texels) if isinstance(texels, Image.Image): # PIL Image if texels.mode == 'P': # convert from paletted texels = texels.convert('RGBX') self.size = texels.size elif isinstance(texels, pygame.surface.Surface): # pygame surface self.size = texels.get_size() elif isinstance(texels,numpy.ndarray): # numpy array if len(texels.shape) == 3: if texels.shape[2] not in [3,4]: raise ValueError("Only luminance (rank 2), and RGB, RGBA (rank 3) arrays allowed") elif len(texels.shape) != 2: raise ValueError("Only luminance (rank 2), and RGB, RGBA (rank 3) arrays allowed") self.size = ( texels.shape[1], texels.shape[0] ) else: raise TypeError("texel data could not be recognized. (Use a PIL Image, numpy array, or pygame surface.)") self.texels = texels self.texture_object = None if size is not None and size != self.size: raise ValueError("size was specified, but data could not be rescaled") def update(self): """Update texture data This method does nothing, but may be overriden in classes that need to update their texture data whenever drawn. It it called by the draw() method of any stimuli using textures when its texture object is active, so it can safely use put_sub_image() to manipulate its own texture data. """ pass def make_half_size(self): if self.texture_object is not None: raise RuntimeError("make_half_size() only available BEFORE texture loaded to OpenGL.") if isinstance(self.texels,Image.Image): w = self.size[0]/2 h = self.size[1]/2 small_texels = self.texels.resize((w,h),shrink_filter) self.texels = small_texels self.size = (w,h) else: raise NotImplementedError("Texture too large, but rescaling only implemented for PIL images.") def unload(self): """Unload texture data from video texture memory. This only removes data from the video texture memory if there are no other references to the TextureObject instance. To ensure this, all references to the texture_object argument passed to the load() method should be deleted.""" self.texture_object = None def get_texels_as_image(self): """Return texel data as PIL image""" if isinstance(self.texels,numpy.ndarray): if len(self.texels.shape) == 2: a = self.texels if a.dtype == numpy.uint8: mode = "L" elif a.dtype == numpy.float32: mode = "F" else: raise ValueError("unsupported image mode") return Image.fromstring(mode, (a.shape[1], a.shape[0]), a.tostring()) else: raise NotImplementedError("Currently only luminance data can be converted to images") elif isinstance(self.texels, Image.Image): return self.texels elif isinstance(self.texels, pygame.surface.Surface): width, height = self.texels.get_size() if self.texels.get_alpha(): raw_data = pygame.image.tostring(self.texels,'RGBA',1) return Image.fromstring('RGBA', (width, height), raw_data) else: raw_data = pygame.image.tostring(self.texels,'RGB',1) return Image.fromstring('RGB', (width, height), raw_data) else: raise NotImplementedError("Don't know how to convert texel data %s " "to PIL image"%(self.texels,)) def get_texels_as_array(self): """Return texel data as numpy array""" if isinstance(self.texels,numpy.ndarray): return self.texels elif isinstance(self.texels, Image.Image): width, height = self.texels.size if self.texels.mode == 'P': texel_data=self.texels.convert('RGBA') # convert to RGBA from paletted data_format = gl.GL_RGBA else: texel_data = self.texels raw_data = texel_data.tostring('raw',texel_data.mode,0,-1) if texel_data.mode == 'L': shape = (height,width) elif texel_data.mode == 'RGB': shape = (height,width,3) elif texel_data.mode in ('RGBA','RGBX'): shape = (height,width,4) else: raise NotImplementedError('mode %s not supported'%( texel_data.mode,)) arr = numpy.fromstring( raw_data, dtype=numpy.uint8 ) arr.shape = shape return arr elif isinstance(self.texels, pygame.surface.Surface): width, height = self.texels.get_size() if self.texels.get_alpha(): raw_data = pygame.image.tostring(self.texels,'RGBA',1) arr = numpy.fromstring( raw_data, dtype=numpy.uint8 ) arr.shape = (height,width,4) return arr else: raw_data = pygame.image.tostring(self.texels,'RGB',1) arr = numpy.fromstring( raw_data, dtype=numpy.uint8 ) arr.shape = (height,width,3) return arr else: raise NotImplementedError("Don't know how to convert texel data %s " "to numpy array"%(self.texels,)) def get_pixels_as_image(self): logger = logging.getLogger('VisionEgg.Textures') logger.warning("Using deprecated method get_pixels_as_image(). " "Use get_texels_as_image() instead.") return self.get_texels_as_image() def load(self, texture_object, build_mipmaps = True, rescale_original_to_fill_texture_object = False, internal_format=gl.GL_RGB): """Load texture data to video texture memory. This will cause the texture data to become resident in OpenGL video texture memory, enabling fast drawing. The texture_object argument is used to specify an instance of the TextureObject class, which is a wrapper for the OpenGL texture object holding the resident texture. To remove a texture from OpenGL's resident textures: TextureObject passed as the texture_object argument and 2) call the unload() method""" assert( isinstance( texture_object, TextureObject )) assert( texture_object.dimensions == 2 ) width, height = self.size width_pow2 = next_power_of_2(width) height_pow2 = next_power_of_2(height) if rescale_original_to_fill_texture_object: if not isinstance(self.texels,Image.Image): raise NotImplementedError("Automatic rescaling not implemented for this texel data type.") # fractional coverage self.buf_lf = 0.0 self.buf_rf = float(width)/width_pow2 self.buf_bf = 0.0 self.buf_tf = float(height)/height_pow2 # absolute (texel units) coverage self._buf_l = 0 self._buf_r = width self._buf_b = 0 self._buf_t = height if width != width_pow2 or height != height_pow2: if isinstance(self.texels,numpy.ndarray): if len(self.texels.shape) == 2: buffer = numpy.zeros( (height_pow2,width_pow2), dtype=self.texels.dtype ) buffer[0:height,0:width] = self.texels elif len(self.texels.shape) == 3: buffer = numpy.zeros( (height_pow2,width_pow2,self.texels.shape[2]), dtype=self.texels.dtype ) buffer[0:height,0:width,:] = self.texels else: raise RuntimeError("Unexpected shape for self.texels") elif isinstance(self.texels, Image.Image): # PIL Image if rescale_original_to_fill_texture_object: # reset coverage values self.buf_lf = 0.0 self.buf_rf = 1.0 self.buf_bf = 0.0 self.buf_tf = 1.0 self._buf_l = 0 self._buf_r = width_pow2 self._buf_t = 0 self._buf_b = height_pow2 buffer = self.texels.resize((width_pow2,height_pow2),shrink_filter) self.size = (width_pow2, height_pow2) else: buffer = Image.new(self.texels.mode,(width_pow2, height_pow2)) buffer.paste( self.texels, (0,height_pow2-height,width,height_pow2)) elif isinstance(self.texels, pygame.surface.Surface): # pygame surface buffer = pygame.surface.Surface( (width_pow2, height_pow2), self.texels.get_flags(), self.texels.get_bitsize() ) buffer.blit( self.texels, (0,height_pow2-height) ) else: raise RuntimeError("texel data not recognized - changed?") else: buffer = self.texels # Put data in texture object if not build_mipmaps: texture_object.put_new_image( buffer, internal_format=internal_format, mipmap_level=0 ) else: if 0: # Build mipmaps with GLU (faster, but currently broken) texture_object.put_new_image_build_mipmaps( buffer, internal_format=internal_format ) else: # Build mipmaps in PIL texture_object.put_new_image( buffer, internal_format=internal_format, mipmap_level=0 ) if not isinstance(self.texels, Image.Image): # PIL Image raise NotImplementedError( "Building of mipmaps not implemented for this texel "+\ "data type. (Use PIL Images or set parameter "+\ "mipmaps_enabled = False.)") this_width, this_height = self.size biggest_dim = max(this_width,this_height) mipmap_level = 1 while biggest_dim > 1: this_width = this_width/2.0 this_height = this_height/2.0 width_pix = int(math.ceil(this_width)) height_pix = int(math.ceil(this_height)) shrunk = self.texels.resize((width_pix,height_pix),shrink_filter) width_pow2 = next_power_of_2(width_pix) height_pow2 = next_power_of_2(height_pix) im = Image.new(shrunk.mode,(width_pow2,height_pow2)) im.paste(shrunk,(0,height_pow2-height_pix,width_pix,height_pow2)) texture_object.put_new_image( im, mipmap_level=mipmap_level, internal_format = internal_format, check_opengl_errors = False, # no point -- we've already seen biggest texture work, we're just making mipmap ) mipmap_level += 1 biggest_dim = max(this_width,this_height) # Keep reference to texture_object self.texture_object = texture_object def get_texture_object(self): return self.texture_object class TextureFromFile( Texture ): """DEPRECATED.""" def __init__(self, filename ): logger = logging.getLogger('VisionEgg.Textures') logger.warning("class TextureFromFile deprecated, use class " "Texture instead.") Texture.__init__(self, filename) class TextureObject(object): """Texture data in OpenGL. Potentially resident in video texture memory. This class encapsulates the state variables in OpenGL texture objects. Do not change attribute values directly. Use the methods provided instead.""" __slots__ = ( 'min_filter', 'mag_filter', 'wrap_mode_r', # if dimensions > 2 'wrap_mode_s', 'wrap_mode_t', # if dimensions > 1 'border_color', 'target', 'dimensions', 'gl_id', '__gl_module__', ) _cube_map_side_names = ['positive_x', 'negative_x', 'positive_y', 'negative_y', 'positive_z', 'negative_z'] def __init__(self, dimensions = 2): if dimensions not in [1,2,3,'cube']: raise ValueError("TextureObject dimensions must be 1,2,3, or 'cube'") # default OpenGL values for these values self.min_filter = gl.GL_NEAREST_MIPMAP_LINEAR self.mag_filter = gl.GL_LINEAR self.wrap_mode_s = gl.GL_REPEAT if dimensions != 1: self.wrap_mode_t = gl.GL_REPEAT if dimensions == 3: self.wrap_mode_r = gl.GL_REPEAT self.border_color = (0, 0, 0, 0) if dimensions == 1: self.target = gl.GL_TEXTURE_1D elif dimensions == 2: self.target = gl.GL_TEXTURE_2D elif dimensions == 3: self.target = gl.GL_TEXTURE_3D elif dimensions == 'cube': self.target = gl.GL_TEXTURE_CUBE self.dimensions = dimensions self.gl_id = gl.glGenTextures(1) self.__gl_module__ = gl # keep so we there's no error in __del__ def __del__(self): self.__gl_module__.glDeleteTextures(self.gl_id) def is_resident(self): return gl.glAreTexturesResident( self.gl_id ) def set_priority(self, priority): gl.glPrioritizeTextures( [self.gl_id], [priority] ) def set_min_filter(self, filter): gl.glBindTexture(self.target, self.gl_id) gl.glTexParameteri( self.target, gl.GL_TEXTURE_MIN_FILTER,filter) self.min_filter = filter def set_mag_filter(self, filter): gl.glBindTexture( self.target, self.gl_id) gl.glTexParameteri( self.target, gl.GL_TEXTURE_MAG_FILTER, filter) self.mag_filter = filter def set_wrap_mode_s(self, wrap_mode): """Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER""" gl.glBindTexture( self.target, self.gl_id) gl.glTexParameteri( self.target, gl.GL_TEXTURE_WRAP_S, wrap_mode) self.wrap_mode_s = wrap_mode def set_wrap_mode_t(self, wrap_mode): """Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER""" gl.glBindTexture( self.target, self.gl_id) gl.glTexParameteri( self.target, gl.GL_TEXTURE_WRAP_T, wrap_mode) self.wrap_mode_t = wrap_mode def set_wrap_mode_r(self, wrap_mode): """Set to GL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEAT, or GL_CLAMP_TO_BORDER""" gl.glBindTexture( self.target, self.gl_id) gl.glTexParameteri( self.target, gl.GL_TEXTURE_WRAP_R, wrap_mode) self.wrap_mode_r = wrap_mode def set_border_color(self, border_color): """Set to a sequence of 4 floats in the range 0.0 to 1.0""" gl.glBindTexture( self.target, self.gl_id) gl.glTexParameteriv( self.target, gl.GL_TEXTURE_BORDER_COLOR, border_color) self.border_color = border_color def put_new_image(self, texel_data, mipmap_level = 0, border = 0, check_opengl_errors = True, internal_format = gl.GL_RGB, data_format = None, # automatic guess unless set explicitly data_type = None, # automatic guess unless set explicitly cube_side = None, ): """Put numpy array or PIL Image into OpenGL as texture data. The texel_data parameter contains the texture data. If it is a numpy array, it must be 1D, 2D, or 3D data in grayscale or color (RGB or RGBA). Remember that OpenGL begins its textures from the lower left corner, so texel_data[0,:] = 1.0 would set the bottom line of the texture to white, while texel_data[:,0] = 1.0 would set the left line of the texture to white. The mipmap_level parameter specifies which of the texture object's mipmap arrays you are filling. The border parameter specifies the width of the border. The check_opengl_errors parameter turns on (more comprehensible) error messages when something goes wrong. It also slows down performance a little bit. The internal_format parameter specifies the format in which the image data is stored on the video card. See the OpenGL specification for all possible values. If the data_format parameter is None (the default), an attempt is made to guess data_format according to the following description. For numpy arrays: If texel_data.shape is equal to the dimensions of the texture object, texel_data is assumed to contain luminance (grayscale) information and data_format is set to GL_LUMINANCE. If texel_data.shape is equal to one plus the dimensions of the texture object, texel_data is assumed to contain color information. If texel_data.shape[-1] is 3, this is assumed to be RGB data and data_format is set to GL_RGB. If, texel_data.shape[-1] is 4, this is assumed to be RGBA data and data_format is set to GL_RGBA. For PIL images: the "mode" attribute is queried. If the data_type parameter is None (the default), it is set to GL_UNSIGNED_BYTE. For numpy arrays: texel_data is (re)cast to UInt8 and, if it is a floating point type, values are assumed to be in the range 0.0-1.0 and are scaled to the range 0-255. If the data_type parameter is not None, the texel_data is not rescaled or recast. Currently only GL_UNSIGNED_BYTE is supported. For PIL images: texel_data is used as unsigned bytes. This is the usual format for common computer graphics files.""" texel_data = convert_to_numpy_if_array(texel_data) if isinstance(texel_data,numpy.ndarray): if self.dimensions != 'cube': assert(cube_side == None) data_dimensions = len(texel_data.shape) assert((data_dimensions == self.dimensions) or (data_dimensions == self.dimensions+1)) else: assert(cube_side in TextureObject._cube_map_side_names) elif isinstance(texel_data,Image.Image): assert( self.dimensions == 2 ) elif isinstance(texel_data,pygame.surface.Surface): assert( self.dimensions == 2 ) else: raise TypeError("Expecting numpy array, PIL image, or pygame surface") # make myself the active texture gl.glBindTexture(self.target, self.gl_id) # Determine the data_format, data_type and rescale the data if needed if data_format is None: # guess the format of the data if isinstance(texel_data,numpy.ndarray): if len(texel_data.shape) == self.dimensions: data_format = gl.GL_LUMINANCE elif len(texel_data.shape) == (self.dimensions+1): if texel_data.shape[-1] == 3: data_format = gl.GL_RGB elif texel_data.shape[-1] == 4: data_format = gl.GL_RGBA else: raise RuntimeError("Couldn't determine a format for your texel_data.") else: raise RuntimeError("Couldn't determine a format for your texel_data.") elif isinstance(texel_data,Image.Image): if texel_data.mode == 'L': data_format = gl.GL_LUMINANCE elif texel_data.mode == 'RGB': data_format = gl.GL_RGB elif texel_data.mode in ('RGBA','RGBX'): data_format = gl.GL_RGBA elif texel_data.mode == 'P': texel_data=texel_data.convert('RGBA') # convert to RGBA from paletted data_format = gl.GL_RGBA else: raise RuntimeError("Couldn't determine format for your texel_data. (PIL mode = '%s')"%texel_data.mode) elif isinstance(texel_data,pygame.surface.Surface): if texel_data.get_alpha(): data_format = gl.GL_RGBA else: data_format = gl.GL_RGB if data_type is None: # guess the data type data_type = gl.GL_UNSIGNED_BYTE if isinstance(texel_data,numpy.ndarray): if texel_data.dtype == numpy.float: texel_data = texel_data*255.0 if data_type == gl.GL_UNSIGNED_BYTE: if isinstance(texel_data,numpy.ndarray): texel_data = texel_data.astype(numpy.uint8) # (re)cast if necessary else: raise NotImplementedError("Only data_type GL_UNSIGNED_BYTE currently supported") # determine size and make sure its power of 2 if self.dimensions == 1: # must be numpy array width = texel_data.shape[0] if not is_power_of_2(width): raise ValueError("texel_data does not have all dimensions == n^2") else: if isinstance(texel_data,numpy.ndarray): width = texel_data.shape[1] height = texel_data.shape[0] elif isinstance(texel_data,Image.Image): width, height = texel_data.size elif isinstance(texel_data,pygame.surface.Surface): width, height = texel_data.get_size() if not is_power_of_2(width): raise ValueError("texel_data does not have all dimensions == n^2") if not is_power_of_2(height): raise ValueError("texel_data does not have all dimensions == n^2") if self.dimensions == 3: # must be numpy array depth = texel_data.shape[2] if not is_power_of_2(depth): raise ValueError("texel_data does not have all dimensions == n^2") if self.dimensions in [2,'cube']: if isinstance(texel_data,numpy.ndarray): raw_data = texel_data.tostring() elif isinstance(texel_data,Image.Image): raw_data = texel_data.tostring('raw',texel_data.mode,0,-1) elif isinstance(texel_data,pygame.surface.Surface): if texel_data.get_alpha(): raw_data = pygame.image.tostring(texel_data,'RGBA',1) else: raw_data = pygame.image.tostring(texel_data,'RGB',1) # check for OpenGL errors if check_opengl_errors: max_dim = gl.glGetIntegerv( gl.GL_MAX_TEXTURE_SIZE ) if width > max_dim: raise TextureTooLargeError("texel_data is too wide for your video system.") if self.dimensions == 1: gl.glTexImage1Dub(gl.GL_PROXY_TEXTURE_1D, mipmap_level, internal_format, border, data_format, texel_data) if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_1D,mipmap_level,gl.GL_TEXTURE_WIDTH) == 0: raise TextureTooLargeError("texel_data is too wide for your video system.") elif self.dimensions in [2,'cube']: if height > max_dim: raise TextureTooLargeError("texel_data is too tall for your video system.") if self.dimensions == 2: target = gl.GL_PROXY_TEXTURE_2D else: target = gl.GL_PROXY_CUBE_MAP gl.glTexImage2D(target, mipmap_level, internal_format, width, height, border, data_format, data_type, raw_data) if gl.glGetTexLevelParameteriv(target, # Need PyOpenGL >= 2.0 mipmap_level, gl.GL_TEXTURE_WIDTH) == 0: raise TextureTooLargeError("texel_data is too wide for your video system.") if gl.glGetTexLevelParameteriv(target,mipmap_level,gl.GL_TEXTURE_HEIGHT) == 0: raise TextureTooLargeError("texel_data is too tall for your video system.") elif self.dimensions == 3: if max(height,depth) > max_dim: raise TextureTooLargeError("texel_data is too large for your video system.") gl.glTexImage3Dub(gl.GL_PROXY_TEXTURE_3D, mipmap_level, internal_format, border, data_format, texel_data) if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_3D,mipmap_level,gl.GL_TEXTURE_WIDTH) == 0: raise TextureTooLargeError("texel_data is too wide for your video system.") if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_3D,mipmap_level,gl.GL_TEXTURE_HEIGHT) == 0: raise TextureTooLargeError("texel_data is too tall for your video system.") if gl.glGetTexLevelParameteriv(gl.GL_PROXY_TEXTURE_3D,mipmap_level,gl.GL_TEXTURE_DEPTH) == 0: raise TextureTooLargeError("texel_data is too deep for your video system.") else: raise RuntimeError("Unknown number of dimensions.") # No OpenGL error, put the texture in! if self.dimensions == 1: gl.glTexImage1Dub(gl.GL_TEXTURE_1D, mipmap_level, internal_format, border, data_format, texel_data) elif self.dimensions in [2,'cube']: if self.dimensions == 2: target = gl.GL_TEXTURE_2D else: target_name = 'GL_CUBE_MAP_'+cube_side.upper() target = getattr(gl,target_name) gl.glTexImage2D(target, mipmap_level, internal_format, width, height, border, data_format, data_type, raw_data) elif self.dimensions == 3: gl.glTexImage3Dub(gl.GL_TEXTURE_3D, mipmap_level, internal_format, border, data_format, texel_data) else: raise RuntimeError("Unknown number of dimensions.") def put_new_image_build_mipmaps(self, texel_data, internal_format = gl.GL_RGB, data_format = None, # automatic guess unless set explicitly data_type = None, # automatic guess unless set explicitly cube_side = None, ): """Similar to put_new_image(), but builds mipmaps.""" if self.dimensions != 2: raise ValueError("can only handle 2D texel data for automatic mipmap building") texel_data = convert_to_numpy_if_array(texel_data) if isinstance(texel_data,numpy.ndarray): assert(cube_side == None) data_dimensions = len(texel_data.shape) assert((data_dimensions == self.dimensions) or (data_dimensions == self.dimensions+1)) elif isinstance(texel_data,Image.Image): assert( self.dimensions == 2 ) elif isinstance(texel_data,pygame.surface.Surface): assert( self.dimensions == 2 ) else: raise TypeError("Expecting numpy array, PIL image, or pygame surface") # make myself the active texture gl.glBindTexture(self.target, self.gl_id) # Determine the data_format, data_type and rescale the data if needed if data_format is None: # guess the format of the data if isinstance(texel_data,numpy.ndarray): if len(texel_data.shape) == self.dimensions: data_format = gl.GL_LUMINANCE elif len(texel_data.shape) == (self.dimensions+1): if texel_data.shape[-1] == 3: data_format = gl.GL_RGB elif texel_data.shape[-1] == 4: data_format = gl.GL_RGBA else: raise RuntimeError("Couldn't determine a format for your texel_data.") else: raise RuntimeError("Couldn't determine a format for your texel_data.") elif isinstance(texel_data,Image.Image): if texel_data.mode == 'L': data_format = gl.GL_LUMINANCE elif texel_data.mode == 'RGB': data_format = gl.GL_RGB elif texel_data.mode in ['RGBA','RGBX']: data_format = gl.GL_RGBA elif texel_data.mode == 'P': texel_data=texel_data.convert('RGBA') # convert to RGBA from paletted data_format = gl.GL_RGBA else: raise RuntimeError("Couldn't determine format for your texel_data. (PIL mode = '%s')"%texel_data.mode) elif isinstance(texel_data,pygame.surface.Surface): if texel_data.get_alpha(): data_format = gl.GL_RGBA else: data_format = gl.GL_RGB if data_type is None: # guess the data type data_type = gl.GL_UNSIGNED_BYTE if isinstance(texel_data,numpy.ndarray): if texel_data.dtype == numpy.float: texel_data = texel_data*255.0 if data_type == gl.GL_UNSIGNED_BYTE: if isinstance(texel_data,numpy.ndarray): texel_data = texel_data.astype(numpy.uint8) # (re)cast if necessary else: raise NotImplementedError("Only data_type GL_UNSIGNED_BYTE currently supported") if isinstance(texel_data,numpy.ndarray): width = texel_data.shape[1] height = texel_data.shape[0] elif isinstance(texel_data,Image.Image): width, height = texel_data.size elif isinstance(texel_data,pygame.surface.Surface): width, height = texel_data.get_size() if not is_power_of_2(width): raise ValueError("texel_data does not have all dimensions == n^2") if not is_power_of_2(height): raise ValueError("texel_data does not have all dimensions == n^2") if isinstance(texel_data,numpy.ndarray): raw_data = texel_data.tostring() elif isinstance(texel_data,Image.Image): raw_data = texel_data.tostring('raw',texel_data.mode,0,-1) elif isinstance(texel_data,pygame.surface.Surface): if texel_data.get_alpha(): raw_data = pygame.image.tostring(texel_data,'RGBA',1) else: raw_data = pygame.image.tostring(texel_data,'RGB',1) args = (self.target, internal_format, width, # XXX should be width_pow2? height,# XXX should be height_pow2? data_format, data_type) #raw_data) print 'args',args glu.gluBuild2DMipmaps(self.target, internal_format, width, # XXX should be width_pow2? height,# XXX should be height_pow2? data_format, data_type, raw_data) def put_sub_image(self, texel_data, mipmap_level = 0, offset_tuple = None, data_format = None, # automatic guess unless set explicitly data_type = None, # automatic guess unless set explicitly cube_side = None, ): """Replace all or part of a texture object. This is faster that put_new_image(), and can be used to rapidly update textures. The offset_tuple parameter determines the lower left corner (for 2D textures) of your data in pixel units. For example, (0,0) would be no offset and thus the new data would be placed in the lower left of the texture. For an explanation of most parameters, see the put_new_image() method.""" texel_data = convert_to_numpy_if_array(texel_data) if isinstance(texel_data,numpy.ndarray): if self.dimensions != 'cube': assert(cube_side == None) data_dimensions = len(texel_data.shape) assert((data_dimensions == self.dimensions) or (data_dimensions == self.dimensions+1)) else: assert(cube_side in TextureObject._cube_map_side_names) elif isinstance(texel_data,Image.Image): assert( self.dimensions == 2 ) elif isinstance(texel_data,pygame.surface.Surface): assert( self.dimensions == 2 ) else: raise TypeError("Expecting numpy array, PIL image, or pygame surface") # make myself the active texture gl.glBindTexture(self.target, self.gl_id) # Determine the data_format, data_type and rescale the data if needed if data_format is None: # guess the format of the data if isinstance(texel_data,numpy.ndarray): if len(texel_data.shape) == self.dimensions: data_format = gl.GL_LUMINANCE elif len(texel_data.shape) == (self.dimensions+1): if texel_data.shape[-1] == 3: data_format = gl.GL_RGB elif texel_data.shape[-1] == 4: data_format = gl.GL_RGBA else: raise RuntimeError("Couldn't determine a format for your texel_data.") else: raise RuntimeError("Couldn't determine a format for your texel_data.") elif isinstance(texel_data,Image.Image): if texel_data.mode == 'L': data_format = gl.GL_LUMINANCE elif texel_data.mode == 'RGB': data_format = gl.GL_RGB elif texel_data.mode in ['RGBA','RGBX']: data_format = gl.GL_RGBA elif texel_data.mode == 'P': texel_data=texel_data.convert('RGBA') # convert to RGBA from paletted data_format = gl.GL_RGBA else: raise RuntimeError("Couldn't determine format for your texel_data. (PIL mode = '%s')"%texel_data.mode) elif isinstance(texel_data,pygame.surface.Surface): if texel_data.get_alpha(): data_format = gl.GL_RGBA else: data_format = gl.GL_RGB if data_type is None: # guess the data type data_type = gl.GL_UNSIGNED_BYTE if isinstance(texel_data,numpy.ndarray): if texel_data.dtype == numpy.float: texel_data = texel_data*255.0 if data_type == gl.GL_UNSIGNED_BYTE: if isinstance(texel_data,numpy.ndarray): texel_data = texel_data.astype(numpy.uint8) # (re)cast if necessary else: raise NotImplementedError("Only data_type GL_UNSIGNED_BYTE currently supported") if self.dimensions == 1: if offset_tuple is None: x_offset = 0 else: x_offset = offset_tuple[0] width = texel_data.shape[0] raw_data = texel_data.astype(numpy.uint8).tostring() gl.glTexSubImage1D(gl.GL_TEXTURE_1D, mipmap_level, x_offset, width, data_format, data_type, raw_data) elif self.dimensions in [2,'cube']: if self.dimensions == 2: target = gl.GL_TEXTURE_2D else: target_name = 'GL_CUBE_MAP_'+cube_side.upper() target = getattr(gl,target_name) if offset_tuple is None: x_offset = y_offset = 0 else: x_offset, y_offset = offset_tuple if isinstance(texel_data,numpy.ndarray): width = texel_data.shape[1] height = texel_data.shape[0] raw_data = texel_data.astype(numpy.uint8).tostring() elif isinstance(texel_data,Image.Image): width = texel_data.size[0] height = texel_data.size[1] raw_data = texel_data.tostring('raw',texel_data.mode,0,-1) elif isinstance(texel_data,pygame.surface.Surface): width, height = texel_data.get_size() if texel_data.get_alpha(): raw_data = pygame.image.tostring(texel_data,'RGBA',1) else: raw_data = pygame.image.tostring(texel_data,'RGB',1) gl.glTexSubImage2D(target, mipmap_level, x_offset, y_offset, width, height, data_format, data_type, raw_data) elif self.dimensions == 3: raise RuntimeError("Cannot put_sub_image on 3D texture_object.") else: raise RuntimeError("Unknown number of dimensions.") def put_new_framebuffer(self, buffer='back', mipmap_level = 0, border = 0, framebuffer_lowerleft = None, size = None, internal_format = gl.GL_RGB, cube_side = None, ): """Replace texture object with the framebuffer contents. The framebuffer_lowerleft parameter determines the lower left corner of the framebuffer region from which to copy texel data in pixel units. For example, (0,0) would be no offset and thus the new data would be placed from the lower left of the framebuffer. For an explanation of most parameters, see the put_new_image() method.""" if self.dimensions != 2: raise RuntimeError("put_new_framebuffer only supported for 2D textures.") if buffer == 'front': gl.glReadBuffer( gl.GL_FRONT ) elif buffer == 'back': gl.glReadBuffer( gl.GL_BACK ) else: raise ValueError('No support for "%s" framebuffer'%buffer) # make myself the active texture gl.glBindTexture(self.target, self.gl_id) if framebuffer_lowerleft is None: framebuffer_lowerleft = (0,0) x,y = framebuffer_lowerleft if size is None: raise ValueError("Must specify size for put_new_framebuffer(): cannot guess") # determine size and make sure its power of 2 width, height = size if not is_power_of_2(width): raise ValueError("texel_data does not have all dimensions == n^2") if not is_power_of_2(height): raise ValueError("texel_data does not have all dimensions == n^2") target = gl.GL_TEXTURE_2D gl.glCopyTexImage2D(target, mipmap_level, internal_format, x, y, width, height, border) #################################################################### # # Stimulus - TextureStimulus # #################################################################### class TextureStimulusBaseClass(VisionEgg.Core.Stimulus): """Parameters common to all stimuli that use textures. Don't instantiate this class directly. Parameters ========== texture -- source of texture data (Instance of ) Default: (determined at runtime) texture_mag_filter -- OpenGL filter enum (Integer) Default: GL_LINEAR (9729) texture_min_filter -- OpenGL filter enum (Integer) Default: (GL enum determined at runtime) texture_wrap_s -- OpenGL texture wrap enum (Integer) Default: (GL enum determined at runtime) texture_wrap_t -- OpenGL texture wrap enum (Integer) Default: (GL enum determined at runtime) Constant Parameters =================== internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) Default: GL_RGB (6407) mipmaps_enabled -- Are mipmaps enabled? (Boolean) Default: True shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) Default: False """ parameters_and_defaults = { 'texture':(None, ve_types.Instance(Texture), "source of texture data"), 'texture_mag_filter':(gl.GL_LINEAR, ve_types.Integer, "OpenGL filter enum", VisionEgg.ParameterDefinition.OPENGL_ENUM), 'texture_min_filter':(None, # defaults to gl.GL_LINEAR_MIPMAP_LINEAR (unless mipmaps_enabled False, then gl.GL_LINEAR) ve_types.Integer, "OpenGL filter enum", VisionEgg.ParameterDefinition.OPENGL_ENUM), 'texture_wrap_s':(None, # set to gl.GL_CLAMP_TO_EDGE below ve_types.Integer, "OpenGL texture wrap enum", VisionEgg.ParameterDefinition.OPENGL_ENUM), 'texture_wrap_t':(None, # set to gl.GL_CLAMP_TO_EDGE below ve_types.Integer, "OpenGL texture wrap enum", VisionEgg.ParameterDefinition.OPENGL_ENUM), } constant_parameters_and_defaults = { 'internal_format':(gl.GL_RGB,#None, ve_types.Integer, "format with which OpenGL uses texture data (OpenGL data type enum)", VisionEgg.ParameterDefinition.OPENGL_ENUM), 'mipmaps_enabled':(True, ve_types.Boolean, "Are mipmaps enabled?"), 'shrink_texture_ok':(False, ve_types.Boolean, "Allow automatic shrinking of texture if too big?"), } __slots__ = ( 'texture_object', '_using_texture', ) _mipmap_modes = [gl.GL_LINEAR_MIPMAP_LINEAR,gl.GL_LINEAR_MIPMAP_NEAREST, gl.GL_NEAREST_MIPMAP_LINEAR,gl.GL_NEAREST_MIPMAP_NEAREST] def __init__(self,**kw): VisionEgg.Core.Stimulus.__init__(self,**kw) if self.parameters.texture is None: # generate default texture self.parameters.texture = Texture() if self.parameters.texture_min_filter is None: # generate default texture minimization filter if self.constant_parameters.mipmaps_enabled: self.parameters.texture_min_filter = gl.GL_LINEAR_MIPMAP_LINEAR else: self.parameters.texture_min_filter = gl.GL_LINEAR if not self.constant_parameters.mipmaps_enabled: if self.parameters.texture_min_filter in TextureStimulusBaseClass._mipmap_modes: raise ValueError("texture_min_filter cannot be a mipmap type if mipmaps not enabled.") # We have to set these parameters here because we may have # re-assigned gl.GL_CLAMP_TO_EDGE. This allows us to use # symbol gl.GL_CLAMP_TO_EDGE even if our version of OpenGL # doesn't support it. if self.parameters.texture_wrap_s is None: self.parameters.texture_wrap_s = gl.GL_CLAMP_TO_EDGE if self.parameters.texture_wrap_t is None: self.parameters.texture_wrap_t = gl.GL_CLAMP_TO_EDGE # Create an OpenGL texture object this instance "owns" self.texture_object = TextureObject(dimensions=2) self._reload_texture() def _reload_texture(self): """(Re)load texture to OpenGL""" p = self.parameters self._using_texture = p.texture if not self.constant_parameters.shrink_texture_ok: # send texture to OpenGL p.texture.load( self.texture_object, internal_format = self.constant_parameters.internal_format, build_mipmaps = self.constant_parameters.mipmaps_enabled ) else: max_dim = gl.glGetIntegerv( gl.GL_MAX_TEXTURE_SIZE ) resized = 0 while max(p.texture.size) > max_dim: p.texture.make_half_size() resized = 1 loaded_ok = 0 while not loaded_ok: try: # send texture to OpenGL p.texture.load( self.texture_object, internal_format = self.constant_parameters.internal_format, build_mipmaps = self.constant_parameters.mipmaps_enabled ) except TextureTooLargeError: p.texture.make_half_size() resized = 1 else: loaded_ok = 1 if resized: logger = logging.getLogger('VisionEgg.Textures') logger.warning("Resized texture in %s to %d x %d"%( str(self),p.texture.size[0],p.texture.size[1])) class Mask2D(VisionEgg.ClassWithParameters): """A mask for windowing a portion of a texture. Thanks to the author, Jon Peirce, of the AlphaStim class from the PsychoPy package from which the idea to do this came. Constant Parameters =================== function -- 'gaussian' or 'circle' (String) Default: gaussian num_samples -- size of mask texture data (units: number of texels) (Sequence2 of Real) Default: (256, 256) radius_parameter -- radius for circle, sigma for gaussian (Real) Default: 25.0 """ # All of these parameters are constant -- if you need a new mask, create a new instance constant_parameters_and_defaults = { 'function':('gaussian', # can be 'gaussian' or 'circle' ve_types.String, "'gaussian' or 'circle'"), 'radius_parameter':(25.0, # radius for circle, sigma for gaussian, same units as num_samples ve_types.Real, "radius for circle, sigma for gaussian"), 'num_samples':((256,256), # size of mask data in texels ve_types.Sequence2(ve_types.Real), "size of mask texture data (units: number of texels)"), } def __init__(self,**kw): VisionEgg.ClassWithParameters.__init__(self,**kw) cp = self.constant_parameters # shorthand width,height = cp.num_samples if width != next_power_of_2(width): raise RuntimeError("Mask must have width num_samples power of 2") if height != next_power_of_2(height): raise RuntimeError("Mask must have height num_samples power of 2") gl.glActiveTextureARB(gl.GL_TEXTURE1_ARB) # Need PyOpenGL >= 2.0 self.texture_object = TextureObject(dimensions=2) if cp.function == "gaussian": xx = numpyNumeric.outerproduct(numpyNumeric.ones((1,cp.num_samples[1])), numpyNumeric.arange(0,cp.num_samples[0],1.0)-cp.num_samples[0]/2) yy = numpyNumeric.outerproduct(numpyNumeric.arange(0,cp.num_samples[1],1.0)-cp.num_samples[1]/2, numpyNumeric.ones((1,cp.num_samples[0]))) dist_from_center = numpyNumeric.sqrt(xx**2 + yy**2) sigma = cp.radius_parameter data = numpyNumeric.exp( -dist_from_center**2.0 / (2.0*sigma**2.0) ) elif cp.function == "circle": data = numpyNumeric.zeros(cp.num_samples,numpyNumeric.Float) # perform anti-aliasing in circle computation by computing # at several slightly different locations and averaging oversamples = 4 x_offsets = numpyNumeric.arange(0.0,1.0,1.0/oversamples) x_offsets = x_offsets - MLab.mean(x_offsets) y_offsets = x_offsets for x_offset in x_offsets: for y_offset in y_offsets: xx = numpyNumeric.outerproduct(numpyNumeric.ones((1,cp.num_samples[1])), numpyNumeric.arange(0,cp.num_samples[0],1.0)-cp.num_samples[0]/2+0.5)+x_offset yy = numpyNumeric.outerproduct(numpyNumeric.arange(0,cp.num_samples[1],1.0)-cp.num_samples[1]/2+0.5, numpyNumeric.ones((1,cp.num_samples[0])))+y_offset dist_from_center = numpyNumeric.sqrt(xx**2 + yy**2) data += dist_from_center <= cp.radius_parameter data = data / float( len(x_offsets)*len(y_offsets) ) else: raise RuntimeError("Don't know about window function %s"%self.constant_parameters.function) self.texture_object.put_new_image(data, data_format=gl.GL_ALPHA, internal_format=gl.GL_ALPHA) self.texture_object.set_min_filter(gl.GL_LINEAR) # turn off mipmaps for mask self.texture_object.set_wrap_mode_s(gl.GL_CLAMP_TO_EDGE) self.texture_object.set_wrap_mode_t(gl.GL_CLAMP_TO_EDGE) gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) # reset active texture unit to 0 gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) def draw_masked_quad_3d(self,lt,rt,bt,tt,v1,v2,v3,v4): # The *t parameters are the texture coordinates. # By the time this method is called, GL_TEXTURE0_ARB should be # loaded as the texture object to be masked. gl.glActiveTextureARB(gl.GL_TEXTURE1_ARB) # bind 2nd texture unit to mask texture gl.glBindTexture(gl.GL_TEXTURE_2D, self.texture_object.gl_id) gl.glEnable(gl.GL_TEXTURE_2D) # The normal TEXTURE2D object is the 1st (TEXTURE0) texture unit gl.glBegin(gl.GL_QUADS) gl.glMultiTexCoord2fARB(gl.GL_TEXTURE0_ARB,lt,bt) gl.glMultiTexCoord2fARB(gl.GL_TEXTURE1_ARB,0.0,0.0) gl.glVertex(*v1) gl.glMultiTexCoord2fARB(gl.GL_TEXTURE0_ARB,rt,bt) gl.glMultiTexCoord2fARB(gl.GL_TEXTURE1_ARB,1.0,0.0) gl.glVertex(*v2) gl.glMultiTexCoord2fARB(gl.GL_TEXTURE0_ARB,rt,tt) gl.glMultiTexCoord2fARB(gl.GL_TEXTURE1_ARB,1.0,1.0) gl.glVertex(*v3) gl.glMultiTexCoord2fARB(gl.GL_TEXTURE0_ARB,lt,tt) gl.glMultiTexCoord2fARB(gl.GL_TEXTURE1_ARB,0.0,1.0) gl.glVertex(*v4) gl.glEnd() # GL_QUADS gl.glDisable(gl.GL_TEXTURE_2D) # turn off texturing in this texture unit gl.glActiveTextureARB(gl.GL_TEXTURE0_ARB) # return to 1st texture unit def draw_masked_quad(self,lt,rt,bt,tt,le,re,be,te,depth): # The *t parameters are the texture coordinates. The *e # parameters are the eye coordinates for the vertices of the # quad. v1 = (le,be,depth) v2 = (re,be,depth) v3 = (re,te,depth) v4 = (le,te,depth) self.draw_masked_quad_3d(lt,rt,bt,tt,v1,v2,v3,v4) class TextureStimulus(TextureStimulusBaseClass): """A textured rectangle. This is mainly for 2D use (z coordinate fixed to 0.0 and w coordinated fixed to 1.0 if not given). Parameters ========== anchor -- specifies how position parameter is interpreted (String) Default: lowerleft angle -- units: degrees, 0=right, 90=up (Real) Default: 0.0 color -- texture environment color. alpha ignored (if given) for max_alpha parameter (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, 1.0) depth_test -- perform depth test? (Boolean) Default: False mask -- optional masking function (Instance of ) Default: (determined at runtime) max_alpha -- controls opacity. 1.0=copletely opaque, 0.0=completely transparent (Real) Default: 1.0 on -- draw stimulus? (Boolean) Default: True position -- units: eye coordinates (AnyOf(Sequence2 of Real or Sequence3 of Real or Sequence4 of Real)) Default: (0.0, 0.0) size -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real) Default: (determined at runtime) texture -- source of texture data (Instance of ) Inherited from TextureStimulusBaseClass Default: (determined at runtime) texture_mag_filter -- OpenGL filter enum (Integer) Inherited from TextureStimulusBaseClass Default: GL_LINEAR (9729) texture_min_filter -- OpenGL filter enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_s -- OpenGL texture wrap enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_t -- OpenGL texture wrap enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) Constant Parameters =================== internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) Default: GL_RGB (6407) mipmaps_enabled -- Are mipmaps enabled? (Boolean) Default: True shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) Default: False """ parameters_and_defaults = { 'on':(True, ve_types.Boolean, "draw stimulus?"), 'mask':(None, # texture mask ve_types.Instance(Mask2D), "optional masking function"), 'position':((0.0,0.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "units: eye coordinates"), 'anchor':('lowerleft', ve_types.String, "specifies how position parameter is interpreted"), 'lowerleft':(None, # DEPRECATED -- don't use ve_types.Sequence2(ve_types.Real), "", VisionEgg.ParameterDefinition.DEPRECATED), 'angle':(0.0, # in degrees ve_types.Real, "units: degrees, 0=right, 90=up"), 'size':(None, ve_types.Sequence2(ve_types.Real), "defaults to texture data size (units: eye coordinates)"), 'max_alpha':(1.0, # controls "opacity": 1.0 = completely opaque, 0.0 = completely transparent ve_types.Real, "controls opacity. 1.0=copletely opaque, 0.0=completely transparent"), 'color':((1.0,1.0,1.0), # texture environment color. alpha is ignored (if given) -- use max_alpha parameter ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "texture environment color. alpha ignored (if given) for max_alpha parameter"), 'depth_test':(False, ve_types.Boolean, "perform depth test?"), } def draw(self): p = self.parameters if p.texture != self._using_texture: # self._using_texture is from TextureStimulusBaseClass self._reload_texture() if p.lowerleft != None: if not hasattr(VisionEgg.config,"_GAVE_LOWERLEFT_DEPRECATION"): logger = logging.getLogger('VisionEgg.Textures') logger.warning("Specifying texture by 'lowerleft' " "deprecated parameter deprecated. Use " "'position' parameter instead. (Allows " "use of 'anchor' parameter to set to " "other values.)") VisionEgg.config._GAVE_LOWERLEFT_DEPRECATION = 1 p.anchor = 'lowerleft' p.position = p.lowerleft[0], p.lowerleft[1] # copy values (don't copy ref to tuple) if p.on: tex = p.texture if p.size is None: # Note: 'size' attribute is not supposed to be part of the API, # so this is naughty. size = tex.size else: size = p.size # calculate lowerleft corner lowerleft = VisionEgg._get_lowerleft(p.position,p.anchor,size) # Clear the modelview matrix gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() try: if p.depth_test: gl.glEnable(gl.GL_DEPTH_TEST) else: gl.glDisable(gl.GL_DEPTH_TEST) gl.glEnable( gl.GL_TEXTURE_2D ) # allow max_alpha value to control blending gl.glEnable( gl.GL_BLEND ) gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) if not self.constant_parameters.mipmaps_enabled: if p.texture_min_filter in TextureStimulusBaseClass._mipmap_modes: raise RuntimeError("Specified a mipmap mode in texture_min_filter, but mipmaps not enabled.") self.texture_object.set_min_filter( p.texture_min_filter ) self.texture_object.set_mag_filter( p.texture_mag_filter ) self.texture_object.set_wrap_mode_s( p.texture_wrap_s ) self.texture_object.set_wrap_mode_t( p.texture_wrap_t ) gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) translate_vector = p.position if len(translate_vector) == 2: translate_vector = translate_vector[0], translate_vector[1], 0 gl.glTranslate(*translate_vector) gl.glRotate(p.angle,0,0,1) gl.glColor4f(p.color[0],p.color[1],p.color[2],p.max_alpha) # Test to draw only if all values are finite is # disabled for performance reasons. #if numpy.alltrue( numpy.isfinite( numpy.concatenate((lowerleft,p.position)) ) ): try: l = lowerleft[0] - p.position[0] r = l + size[0] b = lowerleft[1] - p.position[1] t = b + size[1] except FloatingPointError: # don't draw texture return tex.update() if p.mask: p.mask.draw_masked_quad(tex.buf_lf,tex.buf_rf,tex.buf_bf,tex.buf_tf, # l,r,b,t for texture coordinates l,r,b,t,0.0) # l,r,b,t in eye coordinates else: gl.glBegin(gl.GL_QUADS) gl.glTexCoord2f(tex.buf_lf,tex.buf_bf) gl.glVertex2f(l,b) gl.glTexCoord2f(tex.buf_rf,tex.buf_bf) gl.glVertex2f(r,b) gl.glTexCoord2f(tex.buf_rf,tex.buf_tf) gl.glVertex2f(r,t) gl.glTexCoord2f(tex.buf_lf,tex.buf_tf) gl.glVertex2f(l,t) gl.glEnd() # GL_QUADS finally: gl.glPopMatrix() class TextureStimulus3D(TextureStimulusBaseClass): """A textured rectangle placed arbitrarily in 3 space. Parameters ========== depth_test -- perform depth test? (Boolean) Default: True lowerleft -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (0.0, 0.0, -1.0) lowerright -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 0.0, -1.0) on -- (Boolean) Default: True texture -- source of texture data (Instance of ) Inherited from TextureStimulusBaseClass Default: (determined at runtime) texture_mag_filter -- OpenGL filter enum (Integer) Inherited from TextureStimulusBaseClass Default: GL_LINEAR (9729) texture_min_filter -- OpenGL filter enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_s -- OpenGL texture wrap enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_t -- OpenGL texture wrap enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) upperleft -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (0.0, 1.0, -1.0) upperright -- vertex position (units: eye coordinates) (AnyOf(Sequence3 of Real or Sequence4 of Real)) Default: (1.0, 1.0, -1.0) Constant Parameters =================== internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) Default: GL_RGB (6407) mipmaps_enabled -- Are mipmaps enabled? (Boolean) Default: True shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) Default: False """ parameters_and_defaults = {'on':(True, ve_types.Boolean), 'lowerleft':((0.0,0.0,-1.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates)"), 'lowerright':((1.0,0.0,-1.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates)"), 'upperleft':((0.0,1.0,-1.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates)"), 'upperright':((1.0,1.0,-1.0), # in eye coordinates ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real)), "vertex position (units: eye coordinates)"), 'depth_test':(True, ve_types.Boolean, "perform depth test?"), } def draw(self): p = self.parameters if p.texture != self._using_texture: # self._using_texture is from TextureStimulusBaseClass self._reload_texture() if p.on: if p.depth_test: gl.glEnable(gl.GL_DEPTH_TEST) else: gl.glDisable(gl.GL_DEPTH_TEST) gl.glEnable(gl.GL_TEXTURE_2D) gl.glBindTexture(gl.GL_TEXTURE_2D,self.texture_object.gl_id) gl.glColor4f(1,1,1,1) # set fragment color to white if not self.constant_parameters.mipmaps_enabled: if p.texture_min_filter in TextureStimulusBaseClass._mipmap_modes: raise RuntimeError("Specified a mipmap mode in texture_min_filter, but mipmaps not enabled.") self.texture_object.set_min_filter( p.texture_min_filter ) self.texture_object.set_mag_filter( p.texture_mag_filter ) self.texture_object.set_wrap_mode_s( p.texture_wrap_s ) self.texture_object.set_wrap_mode_t( p.texture_wrap_t ) # allow max_alpha value to control blending gl.glEnable( gl.GL_BLEND ) gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) tex = self.parameters.texture tex.update() gl.glBegin(gl.GL_QUADS) gl.glTexCoord2f(tex.buf_lf,tex.buf_bf) gl.glVertex(*p.lowerleft) gl.glTexCoord2f(tex.buf_rf,tex.buf_bf) gl.glVertex(*p.lowerright) gl.glTexCoord2f(tex.buf_rf,tex.buf_tf) gl.glVertex(*p.upperright) gl.glTexCoord2f(tex.buf_lf,tex.buf_tf) gl.glVertex(*p.upperleft) gl.glEnd() # GL_QUADS #################################################################### # # Stimulus - Spinning Drum # #################################################################### class SpinningDrum(TextureStimulusBaseClass): """Panoramic image texture mapped onto flat rectangle or 3D cylinder. Parameters ========== anchor -- only used when flat: same as anchor parameter of TextureStimulus (String) Default: center angular_position -- may be best to clamp in range [0.0,360.0] (Real) Default: 0.0 contrast -- (Real) Default: 1.0 drum_center_azimuth -- changes orientation of drum in space (Real) Default: 0.0 drum_center_elevation -- changes orientation of drum in space (Real) Default: 0.0 flat -- toggles flat vs. cylinder (Boolean) Default: False flat_size -- defaults to texture data size (units: eye coordinates) (Sequence2 of Real) Default: (determined at runtime) flip_image -- toggles normal vs. horizonally flipped image (Boolean) Default: False height -- height of cyliner, automatically set by texel aspect ratio if < 0. (Real) Default: -1 num_sides -- (UnsignedInteger) Default: 50 on -- (Boolean) Default: True orientation -- 0=right, 90=up (Real) Default: 0.0 position -- 3D: position of drum center, 2D (flat): same as position parameter for TextureStimulus (AnyOf(Sequence2 of Real or Sequence3 of Real)) Default: (0.0, 0.0, 0.0) radius -- radius if cylinder (not used if flat) (Real) Default: 1.0 texture -- source of texture data (Instance of ) Inherited from TextureStimulusBaseClass Default: (determined at runtime) texture_mag_filter -- OpenGL filter enum (Integer) Inherited from TextureStimulusBaseClass Default: GL_LINEAR (9729) texture_min_filter -- OpenGL filter enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_s -- OpenGL texture wrap enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) texture_wrap_t -- OpenGL texture wrap enum (Integer) Inherited from TextureStimulusBaseClass Default: (GL enum determined at runtime) Constant Parameters =================== internal_format -- format with which OpenGL uses texture data (OpenGL data type enum) (Integer) Default: GL_RGB (6407) mipmaps_enabled -- Are mipmaps enabled? (Boolean) Default: True shrink_texture_ok -- Allow automatic shrinking of texture if too big? (Boolean) Default: False """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'height':(-1, ve_types.Real, 'height of cyliner, automatically set by texel aspect ratio if < 0.', ), 'num_sides':(50, ve_types.UnsignedInteger), 'angular_position':(0.0, # may be best to clamp [0.0,360.0] ve_types.Real, 'may be best to clamp in range [0.0,360.0]'), 'contrast':(1.0, ve_types.Real), 'flat':(False, ve_types.Boolean, 'toggles flat vs. cylinder'), 'flat_size':(None, ve_types.Sequence2(ve_types.Real), "defaults to texture data size (units: eye coordinates)"), 'flip_image':(False, ve_types.Boolean, 'toggles normal vs. horizonally flipped image'), 'radius':(1.0, ve_types.Real, 'radius if cylinder (not used if flat)'), 'position':( (0.0,0.0,0.0), ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real)), '3D: position of drum center, 2D (flat): same as position parameter for TextureStimulus'), 'anchor':( 'center', ve_types.String, 'only used when flat: same as anchor parameter of TextureStimulus', ), 'drum_center_azimuth':(0.0, ve_types.Real, 'changes orientation of drum in space', ), 'drum_center_elevation':(0.0, ve_types.Real, 'changes orientation of drum in space'), 'orientation':(0.0, ve_types.Real, '0=right, 90=up'), } __slots__ = ( 'cached_display_list_normal', 'cached_display_list_mirror', 'cached_display_list_num_sides', 'cached_display_list_radius', 'cached_display_list_height', 'texture_stimulus', ) def __init__(self,**kw): TextureStimulusBaseClass.__init__(self,**kw) self.cached_display_list_normal = gl.glGenLists(1) # Allocate a new display list self.cached_display_list_mirror = gl.glGenLists(1) # Allocate a new display list self.rebuild_display_list() def draw(self): """Redraw the stimulus on every frame. """ p = self.parameters if p.texture != self._using_texture: # self._using_texture is from TextureStimulusBaseClass self._reload_texture() self.rebuild_display_list() if p.on: # Set OpenGL state variables gl.glEnable( gl.GL_DEPTH_TEST ) gl.glEnable( gl.GL_TEXTURE_2D ) # Make sure textures are drawn gl.glEnable( gl.GL_BLEND ) # Contrast control implemented through blending # All of the contrast control stuff is somewhat arcane and # not very clear from reading the code, so here is how it # works in English. (Not that it makes it any more clear!) # # In the final "textured fragment" (before being blended # to the framebuffer), the color values are equal to those # of the texture (with the exception of texels around the # edges which have their amplitudes reduced due to # anti-aliasing and are intermediate between the color of # the texture and mid-gray), and the alpha value is set to # the contrast. Blending occurs, and by choosing the # appropriate values for glBlendFunc, adds the product of # fragment alpha (contrast) and fragment color to the # product of one minus fragment alpha (contrast) and what # was already in the framebuffer. gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA ) gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_DECAL) # clear modelview matrix gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPushMatrix() try: gl.glColor4f(0.5,0.5,0.5,p.contrast) # Set the polygons' fragment color (implements contrast) if not self.constant_parameters.mipmaps_enabled: if p.texture_min_filter in TextureStimulusBaseClass._mipmap_modes: raise RuntimeError("Specified a mipmap mode in texture_min_filter, but mipmaps not enabled.") self.texture_object.set_min_filter( p.texture_min_filter ) self.texture_object.set_mag_filter( p.texture_mag_filter ) self.texture_object.set_wrap_mode_s( p.texture_wrap_s ) self.texture_object.set_wrap_mode_t( p.texture_wrap_t ) if p.flat: # draw as flat texture on a rectange lowerleft = VisionEgg._get_lowerleft(p.position,p.anchor,p.texture.size) translate_vector = p.position if len(translate_vector) == 2: translate_vector = translate_vector[0], translate_vector[1], 0 gl.glTranslate(*translate_vector) gl.glRotatef(p.orientation,0,0,1) if p.flip_image: raise NotImplementedError("flip_image not yet supported for flat spinning drums.") w,h = p.texture.size # calculate texture coordinates based on current angle tex_phase = p.angular_position/360.0 + 0.5 # offset to match non-flat tex_phase = tex_phase % 1.0 # make 0 <= tex_phase < 1.0 TINY = 1.0e-10 tex = p.texture tex.update() if p.flat_size is None: size = tex.size else: size = p.flat_size l = lowerleft[0] - p.position[0] r = l + size[0] b = lowerleft[1] - p.position[1] t = b + size[1] #tex_phase = 0.0 if tex_phase < TINY: # it's effectively zero gl.glBegin(gl.GL_QUADS) gl.glTexCoord2f(tex.buf_lf,tex.buf_bf) gl.glVertex2f(l,b) gl.glTexCoord2f(tex.buf_rf,tex.buf_bf) gl.glVertex2f(r,b) gl.glTexCoord2f(tex.buf_rf,tex.buf_tf) gl.glVertex2f(r,t) gl.glTexCoord2f(tex.buf_lf,tex.buf_tf) gl.glVertex2f(l,t) gl.glEnd() # GL_QUADS else: # Convert tex_phase into texture buffer fraction buf_break_f = ( (tex.buf_rf - tex.buf_lf) * (1.0-tex_phase) ) + tex.buf_lf # Convert tex_phase into object coords value quad_x_break = (r-l) * tex_phase + l ## quad_x_break = w * tex_phase gl.glBegin(gl.GL_QUADS) # First quad gl.glTexCoord2f(buf_break_f,tex.buf_bf) gl.glVertex2f(l,b) gl.glTexCoord2f(tex.buf_rf,tex.buf_bf) gl.glVertex2f(quad_x_break,b) gl.glTexCoord2f(tex.buf_rf,tex.buf_tf) gl.glVertex2f(quad_x_break,t) gl.glTexCoord2f(buf_break_f,tex.buf_tf) gl.glVertex2f(l,t) # Second quad gl.glTexCoord2f(tex.buf_lf,tex.buf_bf) gl.glVertex2f(quad_x_break,b) gl.glTexCoord2f(buf_break_f,tex.buf_bf) gl.glVertex2f(r,b) gl.glTexCoord2f(buf_break_f,tex.buf_tf) gl.glVertex2f(r,t) gl.glTexCoord2f(tex.buf_lf,tex.buf_tf) gl.glVertex2f(quad_x_break,t) gl.glEnd() # GL_QUADS else: # draw as cylinder gl.glTranslatef(p.position[0],p.position[1],p.position[2]) # center the drum on new coordinates gl.glRotatef(p.drum_center_azimuth,0,-1,0) gl.glRotatef(p.drum_center_elevation,1,0,0) # do the orientation gl.glRotatef(p.orientation,0,0,1) # turn the coordinate system so we don't have to deal with # figuring out where to draw the texture relative to drum gl.glRotatef(p.angular_position,0,-1,0) if ((p.num_sides != self.cached_display_list_num_sides) or (p.radius != self.cached_display_list_radius) or (p.height != self.cached_display_list_height)): self.rebuild_display_list() if not p.flip_image: gl.glCallList(self.cached_display_list_normal) else: gl.glCallList(self.cached_display_list_mirror) finally: gl.glMatrixMode(gl.GL_MODELVIEW) gl.glPopMatrix() def rebuild_display_list(self): # (Re)build the display list # # A "display list" is a series of OpenGL commands that is # cached in a list for rapid re-drawing of the same object. # # This draws a display list for an approximation of a cylinder. # The cylinder has "num_sides" sides. The following code # generates a list of vertices and the texture coordinates # to be used by those vertices. r = self.parameters.radius # in OpenGL (arbitrary) units circum = 2.0*math.pi*r tex = self.parameters.texture if self.parameters.height < 0: h = circum/float(tex.size[0])*float(tex.size[1])/2.0 else: h = self.parameters.height num_sides = self.parameters.num_sides self.cached_display_list_num_sides = num_sides self.cached_display_list_radius = r self.cached_display_list_height = self.parameters.height deltaTheta = 2.0*math.pi / num_sides for direction in ['normal','mirror']: if direction == 'normal': gl.glNewList(self.cached_display_list_normal,gl.GL_COMPILE) else: gl.glNewList(self.cached_display_list_mirror,gl.GL_COMPILE) gl.glBegin(gl.GL_QUADS) for i in range(num_sides): # angle of sides theta1 = i*deltaTheta theta2 = (i+1)*deltaTheta # fraction of texture if direction == 'normal': frac1 = (tex.buf_lf + (float(i)/num_sides*tex.size[0]))/float(tex.size[0]) frac2 = (tex.buf_lf + (float(i+1)/num_sides*tex.size[0]))/float(tex.size[0]) else: j = num_sides-i-1 frac1 = (tex.buf_lf + (float(j+1)/num_sides*tex.size[0]))/float(tex.size[0]) frac2 = (tex.buf_lf + (float(j)/num_sides*tex.size[0]))/float(tex.size[0]) # location of sides x1 = r*math.cos(theta1) z1 = r*math.sin(theta1) x2 = r*math.cos(theta2) z2 = r*math.sin(theta2) #Bottom left of quad gl.glTexCoord2f(frac1, tex.buf_bf) gl.glVertex4f( x1, -h, z1, 1.0 ) #Bottom right of quad gl.glTexCoord2f(frac2, tex.buf_bf) gl.glVertex4f( x2, -h, z2, 1.0 ) #Top right of quad gl.glTexCoord2f(frac2, tex.buf_tf); gl.glVertex4f( x2, h, z2, 1.0 ) #Top left of quad gl.glTexCoord2f(frac1, tex.buf_tf) gl.glVertex4f( x1, h, z1, 1.0 ) gl.glEnd() gl.glEndList() class FixationCross(VisionEgg.Core.Stimulus): """Cross useful for fixation point. Parameters ========== on -- (Boolean) Default: True position -- (Sequence2 of Real) Default: (320, 240) size -- (Sequence2 of Real) Default: (64, 64) Constant Parameters =================== texture_size -- (Sequence2 of Real) Default: (64, 64) """ parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'position':((320,240), ve_types.Sequence2(ve_types.Real)), 'size':((64,64), ve_types.Sequence2(ve_types.Real)), } constant_parameters_and_defaults = { 'texture_size':((64,64), ve_types.Sequence2(ve_types.Real)), } __slots__ = ( 'texture_stimulus', ) def __init__(self,**kw): VisionEgg.Core.Stimulus.__init__(self,**kw) s = self.constant_parameters.texture_size mid_x = s[0]/2.0 mid_y = s[1]/2.0 texels = Image.new("RGBX",s,(0,0,0,0)) texels_draw = ImageDraw.Draw(texels) texels_draw.rectangle( (mid_x-1, 0, mid_x+1, s[1]), fill=(0,0,0,255) ) texels_draw.rectangle( (0, mid_y-1, s[0], mid_y+1), fill=(0,0,0,255) ) texels_draw.line( (mid_x, 0, mid_x, s[1]), fill=(255,255,255,255) ) texels_draw.line( (0, mid_y, s[0], mid_y), fill=(255,255,255,255) ) self.texture_stimulus = TextureStimulus( texture = Texture(texels), position = self.parameters.position, anchor = 'center', size = self.parameters.size, internal_format = gl.GL_RGBA, mipmaps_enabled = False, texture_min_filter = gl.GL_NEAREST, texture_mag_filter = gl.GL_NEAREST, ) def draw(self): contained = self.texture_stimulus.parameters #shorthand my = self.parameters #shorthand contained.position = my.position contained.size = my.size contained.on = my.on self.texture_stimulus.draw() class TextureTooLargeError( RuntimeError ): pass visionegg-1.2.1/VisionEgg/ThreeDeeMath.py0000644000076500000240000000610111224565530017435 0ustar astrawstaff# The Vision Egg: ThreeDeeMath # # Copyright (C) 2001-2003 Andrew Straw. # Copyright (C) 2008 California Institute of Technology # # URL: # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. """ Vertex and matrix operations - simulate OpenGL transforms. """ import math import numpy import numpy.oldnumeric as Numeric, numpy.oldnumeric.mlab as MLab def make_homogeneous_coord_rows(v): """Convert vertex (or row-wise vertices) into homogeneous coordinates.""" v = Numeric.array(v,typecode=Numeric.Float) # copy if len(v.shape) == 1: v = v[Numeric.NewAxis,:] # make a rank-2 array if v.shape[1] == 3: ws = Numeric.ones((v.shape[0],1),typecode=Numeric.Float) v = Numeric.concatenate( (v,ws), axis=1 ) return v def normalize_homogeneous_rows(v): v = Numeric.asarray(v) homog = make_homogeneous_coord_rows(v) r = (homog/homog[:,3,Numeric.NewAxis])[:,:3] if len(homog.shape) > len(v.shape): r = Numeric.reshape(r,(3,)) return r class TransformMatrix: def __init__(self,matrix=None): if matrix is None: self.matrix = MLab.eye(4,typecode=Numeric.Float) else: self.matrix = matrix def __make_normalized_vert3(self, x, y, z ): mag = math.sqrt( x**2 + y**2 + z**2 ) return Numeric.array((x,y,z))/mag def rotate(self, angle_degrees, axis_x, axis_y, axis_z ): """Follows the right hand rule. I visualize the right hand rule most easily as follows: Naturally, using your right hand, wrap it around the axis of rotation. Your fingers now point in the direction of rotation. """ angleRadians = angle_degrees / 180.0 * math.pi u = self.__make_normalized_vert3(axis_x, axis_y, axis_z ) u=-u #follow right hand rule S = Numeric.zeros( (3,3), Numeric.Float ) S[0,1] = -u[2] S[0,2] = u[1] S[1,0] = u[2] S[1,2] = -u[0] S[2,0] = -u[1] S[2,1] = u[0] U = Numeric.outerproduct(u,u) R = U + math.cos(angleRadians)*(MLab.eye(3)-U) + math.sin(angleRadians)*S R = Numeric.concatenate( (R,Numeric.zeros( (3,1), Numeric.Float)), axis=1) R = Numeric.concatenate( (R,Numeric.zeros( (1,4), Numeric.Float)), axis=0) R[3,3] = 1.0 self.matrix = numpy.dot(R,self.matrix) def translate(self, x, y, z): T = MLab.eye(4,typecode=Numeric.Float) T[3,0] = x T[3,1] = y T[3,2] = z self.matrix = numpy.dot(T,self.matrix) def scale(self, x, y, z): T = MLab.eye(4,typecode=Numeric.Float) T[0,0] = x T[1,1] = y T[2,2] = z self.matrix = numpy.dot(T,self.matrix) def get_matrix(self): return self.matrix def transform_vertices(self,verts): v = Numeric.asarray(verts) homog = make_homogeneous_coord_rows(v) r = numpy.dot(homog,self.matrix) if len(homog.shape) > len(v.shape): r = Numeric.reshape(r,(4,)) return r visionegg-1.2.1/VisionEgg/vegl.h0000644000076500000240000000021111224565530015666 0ustar astrawstaff#if defined(MS_WINDOWS) # include #endif #if defined(__APPLE__) # include #else # include #endif visionegg-1.2.1/VisionEgg/VisionEgg.cfg0000644000076500000240000000712711224565530017150 0ustar astrawstaff# This is the default Vision Egg configuration file # Edit these values to something appropriate for your # system. [General] # Use a GUI to configure window/screen parameters VISIONEGG_GUI_INIT = 1 # What will the monitor's vertical refresh rate be when initialized # into this video mode? IMPORTANT - The VisionEgg has no way to # access this value or set it. If frame rate is significant in # calculating your stimulus presentations, set this value to what the # display gives you. VISIONEGG_MONITOR_REFRESH_HZ = 60.0 # Attempt to synchronize buffer swaps with vertical retrace? This is # necessary for controlling stimuli on a frame-by-frame basis and # prevents "tearing" of the display. Not implemented on all platforms, # and on Windows, this can be set from the Display control panel. VISIONEGG_SYNC_SWAP = 1 # Screen width/height VISIONEGG_SCREEN_W = 640 VISIONEGG_SCREEN_H = 480 # Number of samples for full-screen anti-aliasing (0 = No FSAA) VISIONEGG_MULTISAMPLE_SAMPLES = 0 # Use fullscreen? VISIONEGG_FULLSCREEN = 0 # Automatically call VisionEgg.start_default_logging() and watch_exceptions() VISIONEGG_ALWAYS_START_LOGGING = 0 # Source of gamma information VISIONEGG_GAMMA_SOURCE = none # Only used if VISIONEGG_GAMMA_SOURCE is "invert" VISIONEGG_GAMMA_INVERT_RED = 2.1 VISIONEGG_GAMMA_INVERT_GREEN = 2.1 VISIONEGG_GAMMA_INVERT_BLUE = 2.1 # Only used if VISIONEGG_GAMMA_SOURCE is "file" VISIONEGG_GAMMA_FILE = custom.ve_gamma # Make the mouse cursor invisible VISIONEGG_HIDE_MOUSE = 1 # Open a window without a surrounding frame? VISIONEGG_FRAMELESS_WINDOW = 0 # Request maximum priority from the OS? Only supported on some # platforms, only necessary on some platforms. VISIONEGG_MAXPRIORITY = 0 # Request framebuffer depth, channel by channel. The more bits the # better, especially on the RGB channels. The Vision Egg specifies # color in floating point values, and OpenGL quantizes this color # depth. VISIONEGG_REQUEST_RED_BITS = 8 VISIONEGG_REQUEST_GREEN_BITS = 8 VISIONEGG_REQUEST_BLUE_BITS = 8 VISIONEGG_REQUEST_ALPHA_BITS = 0 # Request OpenGL stereo VISIONEGG_REQUEST_STEREO = 0 # Is it OK to ever open a GUI window with Tkinter? VISIONEGG_TKINTER_OK = 1 # Threshold for message printing -- decrease to print more VISIONEGG_MESSAGE_LEVEL = 1 # Log to the console? Log messages can still go to the log file. VISIONEGG_LOG_TO_STDERR = 1 # Where is the log file saved? This can be an absolute path. If this # is set to nothing ("" without the quotes), no log file is used (but # the log messages can still go to the console.) VISIONEGG_LOG_FILE = VisionEgg.log # Do errors open a GUI window or only to the log file? VISIONEGG_GUI_ON_ERROR = 1 # Use double buffering VISIONEGG_DOUBLE_BUFFER = 1 # Look for SyncLync USB device? SYNCLYNC_PRESENT = 0 [darwin] # This determines whether conventional priority setting is used or the # Mach realtime method. VISIONEGG_DARWIN_MAXPRIORITY_CONVENTIONAL_NOT_REALTIME = 1 # The lower this value, the higher the priority. VISIONEGG_DARWIN_CONVENTIONAL_PRIORITY = -20 # These variables are used to set the thread policy for the Vision Egg # See this URL for more info: # http://developer.apple.com/techpubs/macosx/Darwin/General/KernelProgramming/scheduler/Using_Mach__pplications.html VISIONEGG_DARWIN_REALTIME_PERIOD_DENOM = 120 VISIONEGG_DARWIN_REALTIME_COMPUTATION_DENOM = 2400 VISIONEGG_DARWIN_REALTIME_CONSTRAINT_DENOM = 1200 VISIONEGG_DARWIN_REALTIME_PREEMPTIBLE = 0 # This value can be "max" (without the quotes) or a number VISIONEGG_DARWIN_PTHREAD_PRIORITY = max [win32] # No win32 specific options in this release [linux2] # No linux specific options in this release visionegg-1.2.1/VisionEgg/win32_getrefresh.c0000644000076500000240000000050511224565530020112 0ustar astrawstaff#include #ifndef ENUM_CURRENT_SETTINGS #define ENUM_CURRENT_SETTINGS ((DWORD)-1) #endif double getrefresh() { DEVMODE DevMode; DevMode.dmDriverExtra = 0; if (EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&DevMode)) { return (double)DevMode.dmDisplayFrequency; } else { return 0; } } visionegg-1.2.1/VisionEgg/win32_getrefresh.py0000644000076500000240000000236111224565530020322 0ustar astrawstaff# This file was created automatically by SWIG. # Don't modify this file, modify the SWIG interface instead. # This file is compatible with both classic and new-style classes. import _win32_getrefresh def _swig_setattr_nondynamic(self,class_type,name,value,static=1): if (name == "this"): if isinstance(value, class_type): self.__dict__[name] = value.this if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown del value.thisown return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) if (not static) or hasattr(self,name) or (name == "thisown"): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self,class_type,name,value): return _swig_setattr_nondynamic(self,class_type,name,value,0) def _swig_getattr(self,class_type,name): method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) raise AttributeError,name import types try: _object = types.ObjectType _newclass = 1 except AttributeError: class _object : pass _newclass = 0 del types getrefresh = _win32_getrefresh.getrefresh visionegg-1.2.1/VisionEgg/win32_getrefresh_wrap.c0000644000076500000240000014074611224565530021157 0ustar astrawstaff/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.24 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #ifndef SWIG_TEMPLATE_DISAMBIGUATOR # if defined(__SUNPRO_CC) # define SWIG_TEMPLATE_DISAMBIGUATOR template # else # define SWIG_TEMPLATE_DISAMBIGUATOR # endif #endif #include /*********************************************************************** * swigrun.swg * * This file contains generic CAPI SWIG runtime support for pointer * type checking. * ************************************************************************/ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "1" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE #define SWIG_QUOTE_STRING(x) #x #define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) #define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else #define SWIG_TYPE_TABLE_NAME #endif #include #ifndef SWIGINLINE #if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline #else # define SWIGINLINE #endif #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the swig runtime code. In 99.9% of the cases, swig just needs to declare them as 'static'. But only do this if is strictly necessary, ie, if you have problems with your compiler or so. */ #ifndef SWIGRUNTIME #define SWIGRUNTIME static #endif #ifndef SWIGRUNTIMEINLINE #define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *); typedef struct swig_type_info *(*swig_dycast_func)(void **); typedef struct swig_type_info { const char *name; swig_converter_func converter; const char *str; void *clientdata; swig_dycast_func dcast; struct swig_type_info *next; struct swig_type_info *prev; } swig_type_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return *f1 - *f2; } return (l1 - f1) - (l2 - f2); } /* Check type equivalence in a name list like ||... */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te) == 0; if (*ne) ++ne; } return equiv; } /* Register a type mapping with the type-checking */ SWIGRUNTIME swig_type_info * SWIG_TypeRegisterTL(swig_type_info **tl, swig_type_info *ti) { swig_type_info *tc, *head, *ret, *next; /* Check to see if this type has already been registered */ tc = *tl; while (tc) { /* check simple type equivalence */ int typeequiv = (strcmp(tc->name, ti->name) == 0); /* check full type equivalence, resolving typedefs */ if (!typeequiv) { /* only if tc is not a typedef (no '|' on it) */ if (tc->str && ti->str && !strstr(tc->str,"|")) { typeequiv = SWIG_TypeEquiv(ti->str,tc->str); } } if (typeequiv) { /* Already exists in the table. Just add additional types to the list */ if (ti->clientdata) tc->clientdata = ti->clientdata; head = tc; next = tc->next; goto l1; } tc = tc->prev; } head = ti; next = 0; /* Place in list */ ti->prev = *tl; *tl = ti; /* Build linked lists */ l1: ret = head; tc = ti + 1; /* Patch up the rest of the links */ while (tc->name) { head->next = tc; tc->prev = head; head = tc; tc++; } if (next) next->prev = head; head->next = next; return ret; } /* Check the typename */ SWIGRUNTIME swig_type_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { swig_type_info *s; if (!ty) return 0; /* Void pointer */ s = ty->next; /* First element always just a name */ do { if (strcmp(s->name,c) == 0) { if (s == ty->next) return s; /* Move s to the top of the linked list */ s->prev->next = s->next; if (s->next) { s->next->prev = s->prev; } /* Insert s as second element in the list */ s->next = ty->next; if (ty->next) ty->next->prev = s; ty->next = s; s->prev = ty; return s; } s = s->next; } while (s && (s != ty->next)); return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_type_info *ty, void *ptr) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Search for a swig_type_info structure */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryTL(swig_type_info *tl, const char *name) { swig_type_info *ty = tl; while (ty) { if (ty->str && (SWIG_TypeEquiv(ty->str,name))) return ty; if (ty->name && (strcmp(name,ty->name) == 0)) return ty; ty = ty->prev; } return 0; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientDataTL(swig_type_info *tl, swig_type_info *ti, void *clientdata) { swig_type_info *tc, *equiv; if (ti->clientdata) return; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; equiv = ti->next; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0)) SWIG_TypeClientDataTL(tl,tc,clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static char hex[17] = "0123456789abcdef"; unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; register unsigned char uu; for (; u != eu; ++u) { uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { register unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register int d = *(c++); register unsigned char uu = 0; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* This function will propagate the clientdata field of type to any new swig_type_info structures that have been added into the list of equivalent types. It is like calling SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientDataTL(swig_type_info *tl, swig_type_info *type) { swig_type_info *equiv = type->next; swig_type_info *tc; if (!type->clientdata) return; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0) && !tc->clientdata) SWIG_TypeClientDataTL(tl,tc, type->clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /*********************************************************************** * common.swg * * This file contains generic SWIG runtime support for pointer * type checking as well as a few commonly used macros to control * external linkage. * * Author : David Beazley (beazley@cs.uchicago.edu) * * Copyright (c) 1999-2000, The University of Chicago * * This file may be freely redistributed without license or fee provided * this copyright message remains intact. ************************************************************************/ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if !defined(STATIC_LINKED) # define SWIGEXPORT(a) __declspec(dllexport) a # else # define SWIGEXPORT(a) a # endif #else # define SWIGEXPORT(a) a #endif #ifdef __cplusplus extern "C" { #endif /*************************************************************************/ /* The static type info list */ static swig_type_info *swig_type_list = 0; static swig_type_info **swig_type_list_handle = &swig_type_list; /* Register a type mapping with the type-checking */ static swig_type_info * SWIG_TypeRegister(swig_type_info *ti) { return SWIG_TypeRegisterTL(swig_type_list_handle, ti); } /* Search for a swig_type_info structure */ static swig_type_info * SWIG_TypeQuery(const char *name) { return SWIG_TypeQueryTL(*swig_type_list_handle, name); } /* Set the clientdata field for a type */ static void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientDataTL(*swig_type_list_handle, ti, clientdata); } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ static void SWIG_PropagateClientData(swig_type_info *type) { SWIG_PropagateClientDataTL(*swig_type_list_handle, type); } #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * SWIG API. Portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * for internal method declarations * ----------------------------------------------------------------------------- */ #ifndef SWIGINTERN #define SWIGINTERN static #endif #ifndef SWIGINTERNSHORT #ifdef __cplusplus #define SWIGINTERNSHORT static inline #else /* C case */ #define SWIGINTERNSHORT static #endif /* __cplusplus */ #endif /* Exception handling in wrappers */ #define SWIG_fail goto fail #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_append_errmsg(msg) SWIG_Python_AddErrMesg(msg,0) #define SWIG_preppend_errmsg(msg) SWIG_Python_AddErrMesg(msg,1) #define SWIG_type_error(type,obj) SWIG_Python_TypeError(type,obj) #define SWIG_null_ref(type) SWIG_Python_NullRef(type) /* Contract support */ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { PyErr_SetString(PyExc_RuntimeError, (char *) msg ); goto fail; } else /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_INT 1 #define SWIG_PY_FLOAT 2 #define SWIG_PY_STRING 3 #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Alloc. memory flags * ----------------------------------------------------------------------------- */ #define SWIG_OLDOBJ 1 #define SWIG_NEWOBJ SWIG_OLDOBJ + 1 #define SWIG_PYSTR SWIG_NEWOBJ + 1 #ifdef __cplusplus } #endif /*********************************************************************** * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * Author : David Beazley (beazley@cs.uchicago.edu) ************************************************************************/ /* Common SWIG API */ #define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Python_ConvertPtr(obj, pp, type, flags) #define SWIG_NewPointerObj(p, type, flags) SWIG_Python_NewPointerObj(p, type, flags) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) /* Python-specific SWIG API */ #define SWIG_ConvertPacked(obj, ptr, sz, ty, flags) SWIG_Python_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Use SWIG_NO_COBJECT_TYPES to force the use of strings to represent C/C++ pointers in the python side. Very useful for debugging, but not always safe. */ #if !defined(SWIG_NO_COBJECT_TYPES) && !defined(SWIG_COBJECT_TYPES) # define SWIG_COBJECT_TYPES #endif /* Flags for pointer conversion */ #define SWIG_POINTER_EXCEPTION 0x1 #define SWIG_POINTER_DISOWN 0x2 #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Create a new pointer string * ----------------------------------------------------------------------------- */ #ifndef SWIG_BUFFER_SIZE #define SWIG_BUFFER_SIZE 1024 #endif #if defined(SWIG_COBJECT_TYPES) #if !defined(SWIG_COBJECT_PYTHON) /* ----------------------------------------------------------------------------- * Implements a simple Swig Object type, and use it instead of PyCObject * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *ptr; const char *desc; } PySwigObject; /* Declarations for objects of type PySwigObject */ SWIGRUNTIME int PySwigObject_print(PySwigObject *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result))) { fputs("", fp); return 0; } else { return 1; } } SWIGRUNTIME PyObject * PySwigObject_repr(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromFormat("", result) : 0; } SWIGRUNTIME PyObject * PySwigObject_str(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromString(result) : 0; } SWIGRUNTIME PyObject * PySwigObject_long(PySwigObject *v) { return PyLong_FromUnsignedLong((unsigned long) v->ptr); } SWIGRUNTIME PyObject * PySwigObject_oct(PySwigObject *v) { char buf[100]; unsigned long x = (unsigned long)v->ptr; if (x == 0) strcpy(buf, "0"); else PyOS_snprintf(buf, sizeof(buf), "0%lo", x); return PyString_FromString(buf); } SWIGRUNTIME PyObject * PySwigObject_hex(PySwigObject *v) { char buf[100]; PyOS_snprintf(buf, sizeof(buf), "0x%lx", (unsigned long)v->ptr); return PyString_FromString(buf); } SWIGRUNTIME int PySwigObject_compare(PySwigObject *v, PySwigObject *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : (i > j) ? 1 : 0; } } SWIGRUNTIME void PySwigObject_dealloc(PySwigObject *self) { PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigObject_GetType() { static char PySwigObject_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods PySwigObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ (binaryfunc)0, /*nb_divide*/ (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ (coercion)0, /*nb_coerce*/ (unaryfunc)PySwigObject_long, /*nb_int*/ (unaryfunc)PySwigObject_long, /*nb_long*/ (unaryfunc)0, /*nb_float*/ (unaryfunc)PySwigObject_oct, /*nb_oct*/ (unaryfunc)PySwigObject_hex, /*nb_hex*/ #if PY_VERSION_HEX >= 0x02000000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #endif }; static int type_init = 0; static PyTypeObject PySwigObject_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigObject", /*tp_name*/ sizeof(PySwigObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigObject_dealloc, /*tp_dealloc*/ (printfunc)PySwigObject_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigObject_compare, /*tp_compare*/ (reprfunc)PySwigObject_repr, /*tp_repr*/ &PySwigObject_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigObject_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigObject_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigObject_Type = tmp; type_init = 1; } return &PySwigObject_Type; } SWIGRUNTIME PyObject * PySwigObject_FromVoidPtrAndDesc(void *ptr, const char *desc) { PySwigObject *self = PyObject_NEW(PySwigObject, PySwigObject_GetType()); if (self == NULL) return NULL; self->ptr = ptr; self->desc = desc; return (PyObject *)self; } SWIGRUNTIMEINLINE void * PySwigObject_AsVoidPtr(PyObject *self) { return ((PySwigObject *)self)->ptr; } SWIGRUNTIMEINLINE const char * PySwigObject_GetDesc(PyObject *self) { return ((PySwigObject *)self)->desc; } SWIGRUNTIMEINLINE int PySwigObject_Check(PyObject *op) { return ((op)->ob_type == PySwigObject_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; const char *desc; size_t size; } PySwigPacked; SWIGRUNTIME int PySwigPacked_print(PySwigPacked *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->desc,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * PySwigPacked_repr(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return PyString_FromFormat("", result, v->desc); } else { return PyString_FromFormat("", v->desc); } } SWIGRUNTIME PyObject * PySwigPacked_str(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return PyString_FromFormat("%s%s", result, v->desc); } else { return PyString_FromFormat("%s", v->desc); } } SWIGRUNTIME int PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : (i > j) ? 1 : 0; return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } } SWIGRUNTIME void PySwigPacked_dealloc(PySwigPacked *self) { free(self->pack); PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigPacked_GetType() { static char PySwigPacked_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static int type_init = 0; static PyTypeObject PySwigPacked_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigPacked", /*tp_name*/ sizeof(PySwigPacked), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigPacked_dealloc, /*tp_dealloc*/ (printfunc)PySwigPacked_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigPacked_compare, /*tp_compare*/ (reprfunc)PySwigPacked_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigPacked_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigPacked_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigPacked_Type = tmp; type_init = 1; } return &PySwigPacked_Type; } SWIGRUNTIME PyObject * PySwigPacked_FromDataAndDesc(void *ptr, size_t size, const char *desc) { PySwigPacked *self = PyObject_NEW(PySwigPacked, PySwigPacked_GetType()); if (self == NULL) { return NULL; } else { void *pack = malloc(size); memcpy(pack, ptr, size); self->pack = pack; self->desc = desc; self->size = size; return (PyObject *) self; } } SWIGRUNTIMEINLINE const char * PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { PySwigPacked *self = (PySwigPacked *)obj; if (self->size != size) return 0; memcpy(ptr, self->pack, size); return self->desc; } SWIGRUNTIMEINLINE const char * PySwigPacked_GetDesc(PyObject *self) { return ((PySwigPacked *)self)->desc; } SWIGRUNTIMEINLINE int PySwigPacked_Check(PyObject *op) { return ((op)->ob_type == PySwigPacked_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); } #else /* ----------------------------------------------------------------------------- * Use the old Python PyCObject instead of PySwigObject * ----------------------------------------------------------------------------- */ #define PySwigObject_GetDesc(obj) PyCObject_GetDesc(obj) #define PySwigObject_Check(obj) PyCObject_Check(obj) #define PySwigObject_AsVoidPtr(obj) PyCObject_AsVoidPtr(obj) #define PySwigObject_FromVoidPtrAndDesc(p, d) PyCObject_FromVoidPtrAndDesc(p, d, NULL) #endif #endif /* ----------------------------------------------------------------------------- * errors manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (PySwigObject_Check(obj)) { const char *otype = (const char *) PySwigObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'PySwigObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? PyString_AsString(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_DECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } SWIGRUNTIMEINLINE void SWIG_Python_NullRef(const char *type) { if (type) { PyErr_Format(PyExc_TypeError, "null reference of type '%s' was received",type); } else { PyErr_Format(PyExc_TypeError, "null reference was received"); } } SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, PyString_AsString(old_str)); } else { PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); } Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; sprintf(mesg, "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; static PyObject *SWIG_this = 0; int newref = 0; PyObject *pyobj = 0; void *vptr; if (!obj) return 0; if (obj == Py_None) { *ptr = 0; return 0; } #ifdef SWIG_COBJECT_TYPES if (!(PySwigObject_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PySwigObject_Check(obj)) { Py_DECREF(obj); goto type_error; } } vptr = PySwigObject_AsVoidPtr(obj); c = (const char *) PySwigObject_GetDesc(obj); if (newref) { Py_DECREF(obj); } goto type_check; #else if (!(PyString_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PyString_Check(obj)) { Py_DECREF(obj); goto type_error; } } c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackVoidPtr(c, &vptr, ty->name); if (newref) { Py_DECREF(obj); } if (!c) goto type_error; #endif type_check: if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; *ptr = SWIG_TypeCast(tc,vptr); } else { *ptr = vptr; } if ((pyobj) && (flags & SWIG_POINTER_DISOWN)) { PyObject_SetAttrString(pyobj,(char*)"thisown",Py_False); } return 0; type_error: PyErr_Clear(); if (pyobj && !obj) { obj = pyobj; if (PyCFunction_Check(obj)) { /* here we get the method pointer for callbacks */ char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); c = doc ? strstr(doc, "swig_ptr: ") : 0; if (c) { c = SWIG_UnpackVoidPtr(c + 10, &vptr, ty->name); if (!c) goto type_error; goto type_check; } } } if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ pointer", obj); } } return -1; } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } } return result; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) c = PySwigPacked_UnpackData(obj, ptr, sz); #else if ((!obj) || (!PyString_Check(obj))) goto type_error; c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackDataName(c, ptr, sz, ty->name); #endif if (!c) goto type_error; if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return 0; type_error: PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ packed data", obj); } } return -1; } /* Create a new array object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int own) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #ifdef SWIG_COBJECT_TYPES robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackVoidPtr(result, ptr, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif if (!robj || (robj == Py_None)) return robj; if (type->clientdata) { PyObject *inst; PyObject *args = Py_BuildValue((char*)"(O)", robj); Py_DECREF(robj); inst = PyObject_CallObject((PyObject *) type->clientdata, args); Py_DECREF(args); if (inst) { if (own) { PyObject_SetAttrString(inst,(char*)"thisown",Py_True); } robj = inst; } } return robj; } SWIGRUNTIME PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) robj = PySwigPacked_FromDataAndDesc((void *) ptr, sz, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackDataName(result, ptr, sz, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif return robj; } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_type_info ** SWIG_Python_GetTypeListHandle() { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } } #endif return (swig_type_info **) type_pointer; } /* Search for a swig_type_info structure */ SWIGRUNTIMEINLINE swig_type_info * SWIG_Python_GetTypeList() { swig_type_info **tlh = SWIG_Python_GetTypeListHandle(); return tlh ? *tlh : (swig_type_info*)0; } #define SWIG_Runtime_GetTypeList SWIG_Python_GetTypeList #ifdef __cplusplus } #endif /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_char swig_types[0] #define SWIGTYPE_size_t swig_types[1] #define SWIGTYPE_ptrdiff_t swig_types[2] static swig_type_info *swig_types[4]; /* -------- TYPES TABLE (END) -------- */ /*----------------------------------------------- @(target):= _win32_getrefresh.so ------------------------------------------------*/ #define SWIG_init init_win32_getrefresh #define SWIG_name "_win32_getrefresh" double getrefresh(); /*@/usr/share/swig1.3/python/pymacros.swg,66,SWIG_define@*/ #define SWIG_From_double PyFloat_FromDouble /*@@*/ #ifdef __cplusplus extern "C" { #endif static PyObject *_wrap_getrefresh(PyObject *self, PyObject *args) { PyObject *resultobj; double result; if(!PyArg_ParseTuple(args,(char *)":getrefresh")) goto fail; result = (double)getrefresh(); { resultobj = SWIG_From_double((double)(result)); } return resultobj; fail: return NULL; } static PyMethodDef SwigMethods[] = { { (char *)"getrefresh", _wrap_getrefresh, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_char[] = {{"_p_char", 0, "char *", 0, 0, 0, 0},{"_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__size_t[] = {{"_size_t", 0, "size_t", 0, 0, 0, 0},{"_size_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__ptrdiff_t[] = {{"_ptrdiff_t", 0, "ptrdiff_t", 0, 0, 0, 0},{"_ptrdiff_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info *swig_types_initial[] = { _swigt__p_char, _swigt__size_t, _swigt__ptrdiff_t, 0 }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; static PyObject * swig_varlink_repr(swig_varlinkobject *v) { v = v; return PyString_FromString(""); } static int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) { swig_globalvar *var; flags = flags; fprintf(fp,"Swig global variables { "); for (var = v->vars; var; var=var->next) { fprintf(fp,"%s", var->name); if (var->next) fprintf(fp,", "); } fprintf(fp," }\n"); return 0; } static PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->get_attr)(); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return NULL; } static int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->set_attr)(p); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return 1; } static PyTypeObject varlinktype = { PyObject_HEAD_INIT(0) 0, /* Number of items in variable part (ob_size) */ (char *)"swigvarlink", /* Type name (tp_name) */ sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ 0, /* Itemsize (tp_itemsize) */ 0, /* Deallocator (tp_dealloc) */ (printfunc) swig_varlink_print, /* Print (tp_print) */ (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ 0, /* tp_doc */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; /* Create a variable linking object for use later */ static PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = 0; result = PyMem_NEW(swig_varlinkobject,1); varlinktype.ob_type = &PyType_Type; /* Patch varlinktype into a PyType */ result->ob_type = &varlinktype; result->vars = 0; result->ob_refcnt = 0; Py_XINCREF((PyObject *) result); return ((PyObject*) result); } static void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v; swig_globalvar *gv; v= (swig_varlinkobject *) p; gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); gv->name = (char *) malloc(strlen(name)+1); strcpy(gv->name,name); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; v->vars = gv; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ static void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_PY_INT: obj = PyInt_FromLong(constants[i].lvalue); break; case SWIG_PY_FLOAT: obj = PyFloat_FromDouble(constants[i].dvalue); break; case SWIG_PY_STRING: if (constants[i].pvalue) { obj = PyString_FromString((char *) constants[i].pvalue); } else { Py_INCREF(Py_None); obj = Py_None; } break; case SWIG_PY_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d,constants[i].name,obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ static void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { char *c = methods[i].ml_doc; if (c && (c = strstr(c, "swig_ptr: "))) { int j; swig_const_info *ci = 0; char *name = c + 10; for (j = 0; const_table[j].type; j++) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); char *buff = ndoc; void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue: (void *)(ci->lvalue); strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } /* -----------------------------------------------------------------------------* * Initialize type list * -----------------------------------------------------------------------------*/ #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ static int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return -1; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return -1; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return -1; } if (PyDict_SetItemString(dict, name, o)) return -1; Py_DECREF(o); return 0; } #endif static swig_type_info ** SWIG_Python_SetTypeListHandle(swig_type_info **type_list_handle) { static PyMethodDef swig_empty_runtime_method_table[] = { { NULL, NULL, 0, NULL } };/* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); PyObject *pointer = PyCObject_FromVoidPtr((void *) type_list_handle, NULL); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } return type_list_handle; } static swig_type_info ** SWIG_Python_LookupTypePointer(swig_type_info **type_list_handle) { swig_type_info **type_pointer; /* first check if module already created */ type_pointer = SWIG_Python_GetTypeListHandle(); if (type_pointer) { return type_pointer; } else { /* create a new module and variable */ return SWIG_Python_SetTypeListHandle(type_list_handle); } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void *) SWIG_ReturnGlobalTypeList(void *); #endif #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void) SWIG_init(void) { static PyObject *SWIG_globals = 0; static int typeinit = 0; PyObject *m, *d; int i; if (!SWIG_globals) SWIG_globals = SWIG_newvarlink(); /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_types_initial); m = Py_InitModule((char *) SWIG_name, SwigMethods); d = PyModule_GetDict(m); if (!typeinit) { #ifdef SWIG_LINK_RUNTIME swig_type_list_handle = (swig_type_info **) SWIG_ReturnGlobalTypeList(swig_type_list_handle); #else # ifndef SWIG_STATIC_RUNTIME swig_type_list_handle = SWIG_Python_LookupTypePointer(swig_type_list_handle); # endif #endif for (i = 0; swig_types_initial[i]; i++) { swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); } typeinit = 1; } SWIG_InstallConstants(d,swig_const_table); } visionegg-1.2.1/VisionEgg/win32_load_driver.c0000644000076500000240000000211611224565530020246 0ustar astrawstaff/* This file modified from the original distribution available at http://www.compuphase.com/vretrace.htm */ #include HANDLE LoadDriver(LPSTR DriverName) { OSVERSIONINFO VerInfo; char DevicePath[64]; // Check operating system VerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&VerInfo); if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { wsprintf(DevicePath, "\\\\.\\%s", (LPSTR)DriverName); return CreateFile(DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, // Default security OPEN_EXISTING, FILE_FLAG_OVERLAPPED, // Perform asynchronous I/O 0); // No template } else { // Otherwise, assume Windows95/98 wsprintf(DevicePath, "\\\\.\\%s.vxd", (LPSTR)DriverName); return CreateFile(DevicePath, 0,0,0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_OVERLAPPED, 0); } } visionegg-1.2.1/VisionEgg/win32_load_driver.h0000644000076500000240000000007311224565530020253 0ustar astrawstaff#include HANDLE LoadDriver(LPSTR DriverName); visionegg-1.2.1/VisionEgg/win32_maxpriority.c0000644000076500000240000000064311224565530020346 0ustar astrawstaff#include // winbase.h is all we really want, but it doesn't include all the headers it needs #include unsigned short set_self_process_priority_class( int priority_class ) { return (unsigned short)SetPriorityClass( GetCurrentProcess(), priority_class ); } unsigned short set_self_thread_priority( int priority ) { return (unsigned short)SetThreadPriority( GetCurrentThread(), priority ); } visionegg-1.2.1/VisionEgg/win32_maxpriority.py0000644000076500000240000000413611224565530020555 0ustar astrawstaff# This file was created automatically by SWIG. # Don't modify this file, modify the SWIG interface instead. # This file is compatible with both classic and new-style classes. import _win32_maxpriority def _swig_setattr_nondynamic(self,class_type,name,value,static=1): if (name == "this"): if isinstance(value, class_type): self.__dict__[name] = value.this if hasattr(value,"thisown"): self.__dict__["thisown"] = value.thisown del value.thisown return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) if (not static) or hasattr(self,name) or (name == "thisown"): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self,class_type,name,value): return _swig_setattr_nondynamic(self,class_type,name,value,0) def _swig_getattr(self,class_type,name): method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) raise AttributeError,name import types try: _object = types.ObjectType _newclass = 1 except AttributeError: class _object : pass _newclass = 0 del types IDLE_PRIORITY_CLASS = _win32_maxpriority.IDLE_PRIORITY_CLASS NORMAL_PRIORITY_CLASS = _win32_maxpriority.NORMAL_PRIORITY_CLASS HIGH_PRIORITY_CLASS = _win32_maxpriority.HIGH_PRIORITY_CLASS REALTIME_PRIORITY_CLASS = _win32_maxpriority.REALTIME_PRIORITY_CLASS THREAD_PRIORITY_IDLE = _win32_maxpriority.THREAD_PRIORITY_IDLE THREAD_PRIORITY_LOWEST = _win32_maxpriority.THREAD_PRIORITY_LOWEST THREAD_PRIORITY_BELOW_NORMAL = _win32_maxpriority.THREAD_PRIORITY_BELOW_NORMAL THREAD_PRIORITY_NORMAL = _win32_maxpriority.THREAD_PRIORITY_NORMAL THREAD_PRIORITY_ABOVE_NORMAL = _win32_maxpriority.THREAD_PRIORITY_ABOVE_NORMAL THREAD_PRIORITY_HIGHEST = _win32_maxpriority.THREAD_PRIORITY_HIGHEST THREAD_PRIORITY_TIME_CRITICAL = _win32_maxpriority.THREAD_PRIORITY_TIME_CRITICAL set_self_process_priority_class = _win32_maxpriority.set_self_process_priority_class set_self_thread_priority = _win32_maxpriority.set_self_thread_priority visionegg-1.2.1/VisionEgg/win32_maxpriority_wrap.c0000644000076500000240000015142311224565530021402 0ustar astrawstaff/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 1.3.24 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ #define SWIGPYTHON #ifndef SWIG_TEMPLATE_DISAMBIGUATOR # if defined(__SUNPRO_CC) # define SWIG_TEMPLATE_DISAMBIGUATOR template # else # define SWIG_TEMPLATE_DISAMBIGUATOR # endif #endif #include /*********************************************************************** * swigrun.swg * * This file contains generic CAPI SWIG runtime support for pointer * type checking. * ************************************************************************/ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "1" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE #define SWIG_QUOTE_STRING(x) #x #define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) #define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else #define SWIG_TYPE_TABLE_NAME #endif #include #ifndef SWIGINLINE #if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline #else # define SWIGINLINE #endif #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the swig runtime code. In 99.9% of the cases, swig just needs to declare them as 'static'. But only do this if is strictly necessary, ie, if you have problems with your compiler or so. */ #ifndef SWIGRUNTIME #define SWIGRUNTIME static #endif #ifndef SWIGRUNTIMEINLINE #define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *); typedef struct swig_type_info *(*swig_dycast_func)(void **); typedef struct swig_type_info { const char *name; swig_converter_func converter; const char *str; void *clientdata; swig_dycast_func dcast; struct swig_type_info *next; struct swig_type_info *prev; } swig_type_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return *f1 - *f2; } return (l1 - f1) - (l2 - f2); } /* Check type equivalence in a name list like ||... */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { int equiv = 0; const char* te = tb + strlen(tb); const char* ne = nb; while (!equiv && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te) == 0; if (*ne) ++ne; } return equiv; } /* Register a type mapping with the type-checking */ SWIGRUNTIME swig_type_info * SWIG_TypeRegisterTL(swig_type_info **tl, swig_type_info *ti) { swig_type_info *tc, *head, *ret, *next; /* Check to see if this type has already been registered */ tc = *tl; while (tc) { /* check simple type equivalence */ int typeequiv = (strcmp(tc->name, ti->name) == 0); /* check full type equivalence, resolving typedefs */ if (!typeequiv) { /* only if tc is not a typedef (no '|' on it) */ if (tc->str && ti->str && !strstr(tc->str,"|")) { typeequiv = SWIG_TypeEquiv(ti->str,tc->str); } } if (typeequiv) { /* Already exists in the table. Just add additional types to the list */ if (ti->clientdata) tc->clientdata = ti->clientdata; head = tc; next = tc->next; goto l1; } tc = tc->prev; } head = ti; next = 0; /* Place in list */ ti->prev = *tl; *tl = ti; /* Build linked lists */ l1: ret = head; tc = ti + 1; /* Patch up the rest of the links */ while (tc->name) { head->next = tc; tc->prev = head; head = tc; tc++; } if (next) next->prev = head; head->next = next; return ret; } /* Check the typename */ SWIGRUNTIME swig_type_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { swig_type_info *s; if (!ty) return 0; /* Void pointer */ s = ty->next; /* First element always just a name */ do { if (strcmp(s->name,c) == 0) { if (s == ty->next) return s; /* Move s to the top of the linked list */ s->prev->next = s->next; if (s->next) { s->next->prev = s->prev; } /* Insert s as second element in the list */ s->next = ty->next; if (ty->next) ty->next->prev = s; ty->next = s; s->prev = ty; return s; } s = s->next; } while (s && (s != ty->next)); return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_type_info *ty, void *ptr) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Search for a swig_type_info structure */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryTL(swig_type_info *tl, const char *name) { swig_type_info *ty = tl; while (ty) { if (ty->str && (SWIG_TypeEquiv(ty->str,name))) return ty; if (ty->name && (strcmp(name,ty->name) == 0)) return ty; ty = ty->prev; } return 0; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientDataTL(swig_type_info *tl, swig_type_info *ti, void *clientdata) { swig_type_info *tc, *equiv; if (ti->clientdata) return; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; equiv = ti->next; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0)) SWIG_TypeClientDataTL(tl,tc,clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static char hex[17] = "0123456789abcdef"; unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; register unsigned char uu; for (; u != eu; ++u) { uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { register unsigned char *u = (unsigned char *) ptr; register const unsigned char *eu = u + sz; for (; u != eu; ++u) { register int d = *(c++); register unsigned char uu = 0; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* This function will propagate the clientdata field of type to any new swig_type_info structures that have been added into the list of equivalent types. It is like calling SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientDataTL(swig_type_info *tl, swig_type_info *type) { swig_type_info *equiv = type->next; swig_type_info *tc; if (!type->clientdata) return; while (equiv) { if (!equiv->converter) { tc = tl; while (tc) { if ((strcmp(tc->name, equiv->name) == 0) && !tc->clientdata) SWIG_TypeClientDataTL(tl,tc, type->clientdata); tc = tc->prev; } } equiv = equiv->next; } } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /*********************************************************************** * common.swg * * This file contains generic SWIG runtime support for pointer * type checking as well as a few commonly used macros to control * external linkage. * * Author : David Beazley (beazley@cs.uchicago.edu) * * Copyright (c) 1999-2000, The University of Chicago * * This file may be freely redistributed without license or fee provided * this copyright message remains intact. ************************************************************************/ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if !defined(STATIC_LINKED) # define SWIGEXPORT(a) __declspec(dllexport) a # else # define SWIGEXPORT(a) a # endif #else # define SWIGEXPORT(a) a #endif #ifdef __cplusplus extern "C" { #endif /*************************************************************************/ /* The static type info list */ static swig_type_info *swig_type_list = 0; static swig_type_info **swig_type_list_handle = &swig_type_list; /* Register a type mapping with the type-checking */ static swig_type_info * SWIG_TypeRegister(swig_type_info *ti) { return SWIG_TypeRegisterTL(swig_type_list_handle, ti); } /* Search for a swig_type_info structure */ static swig_type_info * SWIG_TypeQuery(const char *name) { return SWIG_TypeQueryTL(*swig_type_list_handle, name); } /* Set the clientdata field for a type */ static void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientDataTL(*swig_type_list_handle, ti, clientdata); } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ static void SWIG_PropagateClientData(swig_type_info *type) { SWIG_PropagateClientDataTL(*swig_type_list_handle, type); } #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * SWIG API. Portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * for internal method declarations * ----------------------------------------------------------------------------- */ #ifndef SWIGINTERN #define SWIGINTERN static #endif #ifndef SWIGINTERNSHORT #ifdef __cplusplus #define SWIGINTERNSHORT static inline #else /* C case */ #define SWIGINTERNSHORT static #endif /* __cplusplus */ #endif /* Exception handling in wrappers */ #define SWIG_fail goto fail #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_append_errmsg(msg) SWIG_Python_AddErrMesg(msg,0) #define SWIG_preppend_errmsg(msg) SWIG_Python_AddErrMesg(msg,1) #define SWIG_type_error(type,obj) SWIG_Python_TypeError(type,obj) #define SWIG_null_ref(type) SWIG_Python_NullRef(type) /* Contract support */ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { PyErr_SetString(PyExc_RuntimeError, (char *) msg ); goto fail; } else /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_INT 1 #define SWIG_PY_FLOAT 2 #define SWIG_PY_STRING 3 #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Alloc. memory flags * ----------------------------------------------------------------------------- */ #define SWIG_OLDOBJ 1 #define SWIG_NEWOBJ SWIG_OLDOBJ + 1 #define SWIG_PYSTR SWIG_NEWOBJ + 1 #ifdef __cplusplus } #endif /*********************************************************************** * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * Author : David Beazley (beazley@cs.uchicago.edu) ************************************************************************/ /* Common SWIG API */ #define SWIG_ConvertPtr(obj, pp, type, flags) SWIG_Python_ConvertPtr(obj, pp, type, flags) #define SWIG_NewPointerObj(p, type, flags) SWIG_Python_NewPointerObj(p, type, flags) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) /* Python-specific SWIG API */ #define SWIG_ConvertPacked(obj, ptr, sz, ty, flags) SWIG_Python_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Use SWIG_NO_COBJECT_TYPES to force the use of strings to represent C/C++ pointers in the python side. Very useful for debugging, but not always safe. */ #if !defined(SWIG_NO_COBJECT_TYPES) && !defined(SWIG_COBJECT_TYPES) # define SWIG_COBJECT_TYPES #endif /* Flags for pointer conversion */ #define SWIG_POINTER_EXCEPTION 0x1 #define SWIG_POINTER_DISOWN 0x2 #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Create a new pointer string * ----------------------------------------------------------------------------- */ #ifndef SWIG_BUFFER_SIZE #define SWIG_BUFFER_SIZE 1024 #endif #if defined(SWIG_COBJECT_TYPES) #if !defined(SWIG_COBJECT_PYTHON) /* ----------------------------------------------------------------------------- * Implements a simple Swig Object type, and use it instead of PyCObject * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *ptr; const char *desc; } PySwigObject; /* Declarations for objects of type PySwigObject */ SWIGRUNTIME int PySwigObject_print(PySwigObject *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result))) { fputs("", fp); return 0; } else { return 1; } } SWIGRUNTIME PyObject * PySwigObject_repr(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromFormat("", result) : 0; } SWIGRUNTIME PyObject * PySwigObject_str(PySwigObject *v) { char result[SWIG_BUFFER_SIZE]; return SWIG_PackVoidPtr(result, v->ptr, v->desc, sizeof(result)) ? PyString_FromString(result) : 0; } SWIGRUNTIME PyObject * PySwigObject_long(PySwigObject *v) { return PyLong_FromUnsignedLong((unsigned long) v->ptr); } SWIGRUNTIME PyObject * PySwigObject_oct(PySwigObject *v) { char buf[100]; unsigned long x = (unsigned long)v->ptr; if (x == 0) strcpy(buf, "0"); else PyOS_snprintf(buf, sizeof(buf), "0%lo", x); return PyString_FromString(buf); } SWIGRUNTIME PyObject * PySwigObject_hex(PySwigObject *v) { char buf[100]; PyOS_snprintf(buf, sizeof(buf), "0x%lx", (unsigned long)v->ptr); return PyString_FromString(buf); } SWIGRUNTIME int PySwigObject_compare(PySwigObject *v, PySwigObject *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : (i > j) ? 1 : 0; } } SWIGRUNTIME void PySwigObject_dealloc(PySwigObject *self) { PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigObject_GetType() { static char PySwigObject_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods PySwigObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ (binaryfunc)0, /*nb_divide*/ (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ (coercion)0, /*nb_coerce*/ (unaryfunc)PySwigObject_long, /*nb_int*/ (unaryfunc)PySwigObject_long, /*nb_long*/ (unaryfunc)0, /*nb_float*/ (unaryfunc)PySwigObject_oct, /*nb_oct*/ (unaryfunc)PySwigObject_hex, /*nb_hex*/ #if PY_VERSION_HEX >= 0x02000000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #endif }; static int type_init = 0; static PyTypeObject PySwigObject_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigObject", /*tp_name*/ sizeof(PySwigObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigObject_dealloc, /*tp_dealloc*/ (printfunc)PySwigObject_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigObject_compare, /*tp_compare*/ (reprfunc)PySwigObject_repr, /*tp_repr*/ &PySwigObject_as_number, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigObject_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigObject_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigObject_Type = tmp; type_init = 1; } return &PySwigObject_Type; } SWIGRUNTIME PyObject * PySwigObject_FromVoidPtrAndDesc(void *ptr, const char *desc) { PySwigObject *self = PyObject_NEW(PySwigObject, PySwigObject_GetType()); if (self == NULL) return NULL; self->ptr = ptr; self->desc = desc; return (PyObject *)self; } SWIGRUNTIMEINLINE void * PySwigObject_AsVoidPtr(PyObject *self) { return ((PySwigObject *)self)->ptr; } SWIGRUNTIMEINLINE const char * PySwigObject_GetDesc(PyObject *self) { return ((PySwigObject *)self)->desc; } SWIGRUNTIMEINLINE int PySwigObject_Check(PyObject *op) { return ((op)->ob_type == PySwigObject_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigObject") == 0); } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; const char *desc; size_t size; } PySwigPacked; SWIGRUNTIME int PySwigPacked_print(PySwigPacked *v, FILE *fp, int flags) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->desc,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * PySwigPacked_repr(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return PyString_FromFormat("", result, v->desc); } else { return PyString_FromFormat("", v->desc); } } SWIGRUNTIME PyObject * PySwigPacked_str(PySwigPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return PyString_FromFormat("%s%s", result, v->desc); } else { return PyString_FromFormat("%s", v->desc); } } SWIGRUNTIME int PySwigPacked_compare(PySwigPacked *v, PySwigPacked *w) { int c = strcmp(v->desc, w->desc); if (c) { return c; } else { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : (i > j) ? 1 : 0; return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } } SWIGRUNTIME void PySwigPacked_dealloc(PySwigPacked *self) { free(self->pack); PyObject_DEL(self); } SWIGRUNTIME PyTypeObject* PySwigPacked_GetType() { static char PySwigPacked_Type__doc__[] = "Swig object carries a C/C++ instance pointer"; static int type_init = 0; static PyTypeObject PySwigPacked_Type; if (!type_init) { PyTypeObject tmp = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ "PySwigPacked", /*tp_name*/ sizeof(PySwigPacked), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PySwigPacked_dealloc, /*tp_dealloc*/ (printfunc)PySwigPacked_print, /*tp_print*/ (getattrfunc)0, /*tp_getattr*/ (setattrfunc)0, /*tp_setattr*/ (cmpfunc)PySwigPacked_compare, /*tp_compare*/ (reprfunc)PySwigPacked_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)PySwigPacked_str, /*tp_str*/ /* Space for future expansion */ 0L,0L,0L,0L, PySwigPacked_Type__doc__, /* Documentation string */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; PySwigPacked_Type = tmp; type_init = 1; } return &PySwigPacked_Type; } SWIGRUNTIME PyObject * PySwigPacked_FromDataAndDesc(void *ptr, size_t size, const char *desc) { PySwigPacked *self = PyObject_NEW(PySwigPacked, PySwigPacked_GetType()); if (self == NULL) { return NULL; } else { void *pack = malloc(size); memcpy(pack, ptr, size); self->pack = pack; self->desc = desc; self->size = size; return (PyObject *) self; } } SWIGRUNTIMEINLINE const char * PySwigPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { PySwigPacked *self = (PySwigPacked *)obj; if (self->size != size) return 0; memcpy(ptr, self->pack, size); return self->desc; } SWIGRUNTIMEINLINE const char * PySwigPacked_GetDesc(PyObject *self) { return ((PySwigPacked *)self)->desc; } SWIGRUNTIMEINLINE int PySwigPacked_Check(PyObject *op) { return ((op)->ob_type == PySwigPacked_GetType()) || (strcmp((op)->ob_type->tp_name,"PySwigPacked") == 0); } #else /* ----------------------------------------------------------------------------- * Use the old Python PyCObject instead of PySwigObject * ----------------------------------------------------------------------------- */ #define PySwigObject_GetDesc(obj) PyCObject_GetDesc(obj) #define PySwigObject_Check(obj) PyCObject_Check(obj) #define PySwigObject_AsVoidPtr(obj) PyCObject_AsVoidPtr(obj) #define PySwigObject_FromVoidPtrAndDesc(p, d) PyCObject_FromVoidPtrAndDesc(p, d, NULL) #endif #endif /* ----------------------------------------------------------------------------- * errors manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (PySwigObject_Check(obj)) { const char *otype = (const char *) PySwigObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'PySwigObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? PyString_AsString(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_DECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } SWIGRUNTIMEINLINE void SWIG_Python_NullRef(const char *type) { if (type) { PyErr_Format(PyExc_TypeError, "null reference of type '%s' was received",type); } else { PyErr_Format(PyExc_TypeError, "null reference was received"); } } SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, PyString_AsString(old_str)); } else { PyErr_Format(type, "%s %s", PyString_AsString(old_str), mesg); } Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; sprintf(mesg, "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; static PyObject *SWIG_this = 0; int newref = 0; PyObject *pyobj = 0; void *vptr; if (!obj) return 0; if (obj == Py_None) { *ptr = 0; return 0; } #ifdef SWIG_COBJECT_TYPES if (!(PySwigObject_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PySwigObject_Check(obj)) { Py_DECREF(obj); goto type_error; } } vptr = PySwigObject_AsVoidPtr(obj); c = (const char *) PySwigObject_GetDesc(obj); if (newref) { Py_DECREF(obj); } goto type_check; #else if (!(PyString_Check(obj))) { if (!SWIG_this) SWIG_this = PyString_FromString("this"); pyobj = obj; obj = PyObject_GetAttr(obj,SWIG_this); newref = 1; if (!obj) goto type_error; if (!PyString_Check(obj)) { Py_DECREF(obj); goto type_error; } } c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackVoidPtr(c, &vptr, ty->name); if (newref) { Py_DECREF(obj); } if (!c) goto type_error; #endif type_check: if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; *ptr = SWIG_TypeCast(tc,vptr); } else { *ptr = vptr; } if ((pyobj) && (flags & SWIG_POINTER_DISOWN)) { PyObject_SetAttrString(pyobj,(char*)"thisown",Py_False); } return 0; type_error: PyErr_Clear(); if (pyobj && !obj) { obj = pyobj; if (PyCFunction_Check(obj)) { /* here we get the method pointer for callbacks */ char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); c = doc ? strstr(doc, "swig_ptr: ") : 0; if (c) { c = SWIG_UnpackVoidPtr(c + 10, &vptr, ty->name); if (!c) goto type_error; goto type_check; } } } if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ pointer", obj); } } return -1; } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int argnum, int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } } return result; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty, int flags) { swig_type_info *tc; const char *c = 0; #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) c = PySwigPacked_UnpackData(obj, ptr, sz); #else if ((!obj) || (!PyString_Check(obj))) goto type_error; c = PyString_AS_STRING(obj); /* Pointer values must start with leading underscore */ c = SWIG_UnpackDataName(c, ptr, sz, ty->name); #endif if (!c) goto type_error; if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return 0; type_error: PyErr_Clear(); if (flags & SWIG_POINTER_EXCEPTION) { if (ty) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); } else { SWIG_Python_TypeError("C/C++ packed data", obj); } } return -1; } /* Create a new array object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(void *ptr, swig_type_info *type, int own) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #ifdef SWIG_COBJECT_TYPES robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackVoidPtr(result, ptr, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif if (!robj || (robj == Py_None)) return robj; if (type->clientdata) { PyObject *inst; PyObject *args = Py_BuildValue((char*)"(O)", robj); Py_DECREF(robj); inst = PyObject_CallObject((PyObject *) type->clientdata, args); Py_DECREF(args); if (inst) { if (own) { PyObject_SetAttrString(inst,(char*)"thisown",Py_True); } robj = inst; } } return robj; } SWIGRUNTIME PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { PyObject *robj = 0; if (!ptr) { Py_INCREF(Py_None); return Py_None; } #if defined(SWIG_COBJECT_TYPES) && !defined(SWIG_COBJECT_PYTHON) robj = PySwigPacked_FromDataAndDesc((void *) ptr, sz, (char *)type->name); #else { char result[SWIG_BUFFER_SIZE]; robj = SWIG_PackDataName(result, ptr, sz, type->name, sizeof(result)) ? PyString_FromString(result) : 0; } #endif return robj; } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_type_info ** SWIG_Python_GetTypeListHandle() { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } } #endif return (swig_type_info **) type_pointer; } /* Search for a swig_type_info structure */ SWIGRUNTIMEINLINE swig_type_info * SWIG_Python_GetTypeList() { swig_type_info **tlh = SWIG_Python_GetTypeListHandle(); return tlh ? *tlh : (swig_type_info*)0; } #define SWIG_Runtime_GetTypeList SWIG_Python_GetTypeList #ifdef __cplusplus } #endif /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_char swig_types[0] #define SWIGTYPE_size_t swig_types[1] #define SWIGTYPE_ptrdiff_t swig_types[2] static swig_type_info *swig_types[4]; /* -------- TYPES TABLE (END) -------- */ /*----------------------------------------------- @(target):= _win32_maxpriority.so ------------------------------------------------*/ #define SWIG_init init_win32_maxpriority #define SWIG_name "_win32_maxpriority" #include // winbase.h is all we really want, but it doesn't include all the headers it needs #include /*@/usr/share/swig1.3/python/pymacros.swg,66,SWIG_define@*/ #define SWIG_From_int PyInt_FromLong /*@@*/ unsigned short set_self_process_priority_class(int); #include SWIGINTERN int SWIG_CheckLongInRange(long value, long min_value, long max_value, const char *errmsg) { if (value < min_value) { if (errmsg) { PyErr_Format(PyExc_OverflowError, "value %ld is less than '%s' minimum %ld", value, errmsg, min_value); } return 0; } else if (value > max_value) { if (errmsg) { PyErr_Format(PyExc_OverflowError, "value %ld is greater than '%s' maximum %ld", value, errmsg, max_value); } return 0; } return 1; } SWIGINTERN int SWIG_AsVal_long(PyObject * obj, long* val) { if (PyInt_Check(obj)) { if (val) *val = PyInt_AS_LONG(obj); return 1; } if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return 1; } else { if (!val) PyErr_Clear(); return 0; } } if (val) { SWIG_type_error("long", obj); } return 0; } #if INT_MAX != LONG_MAX SWIGINTERN int SWIG_AsVal_int(PyObject *obj, int *val) { const char* errmsg = val ? "int" : (char*)0; long v; if (SWIG_AsVal_long(obj, &v)) { if (SWIG_CheckLongInRange(v, INT_MIN,INT_MAX, errmsg)) { if (val) *val = (int)(v); return 1; } else { return 0; } } else { PyErr_Clear(); } if (val) { SWIG_type_error(errmsg, obj); } return 0; } #else SWIGINTERNSHORT int SWIG_AsVal_int(PyObject *obj, int *val) { return SWIG_AsVal_long(obj,(long*)val); } #endif SWIGINTERNSHORT int SWIG_As_int(PyObject* obj) { int v; if (!SWIG_AsVal_int(obj, &v)) { /* this is needed to make valgrind/purify happier. */ memset((void*)&v, 0, sizeof(int)); } return v; } SWIGINTERNSHORT int SWIG_Check_int(PyObject* obj) { return SWIG_AsVal_int(obj, (int*)0); } /*@/usr/share/swig1.3/python/pymacros.swg,66,SWIG_define@*/ #define SWIG_From_unsigned_SS_short PyInt_FromLong /*@@*/ unsigned short set_self_thread_priority(int); #ifdef __cplusplus extern "C" { #endif static PyObject *_wrap_set_self_process_priority_class(PyObject *self, PyObject *args) { PyObject *resultobj; int arg1 ; unsigned short result; PyObject * obj0 = 0 ; if(!PyArg_ParseTuple(args,(char *)"O:set_self_process_priority_class",&obj0)) goto fail; { arg1 = (int)(SWIG_As_int(obj0)); if (SWIG_arg_fail(1)) SWIG_fail; } result = (unsigned short)set_self_process_priority_class(arg1); { resultobj = SWIG_From_unsigned_SS_short((unsigned short)(result)); } return resultobj; fail: return NULL; } static PyObject *_wrap_set_self_thread_priority(PyObject *self, PyObject *args) { PyObject *resultobj; int arg1 ; unsigned short result; PyObject * obj0 = 0 ; if(!PyArg_ParseTuple(args,(char *)"O:set_self_thread_priority",&obj0)) goto fail; { arg1 = (int)(SWIG_As_int(obj0)); if (SWIG_arg_fail(1)) SWIG_fail; } result = (unsigned short)set_self_thread_priority(arg1); { resultobj = SWIG_From_unsigned_SS_short((unsigned short)(result)); } return resultobj; fail: return NULL; } static PyMethodDef SwigMethods[] = { { (char *)"set_self_process_priority_class", _wrap_set_self_process_priority_class, METH_VARARGS, NULL}, { (char *)"set_self_thread_priority", _wrap_set_self_thread_priority, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_char[] = {{"_p_char", 0, "char *", 0, 0, 0, 0},{"_p_char", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__size_t[] = {{"_size_t", 0, "size_t", 0, 0, 0, 0},{"_size_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info _swigt__ptrdiff_t[] = {{"_ptrdiff_t", 0, "ptrdiff_t", 0, 0, 0, 0},{"_ptrdiff_t", 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0}}; static swig_type_info *swig_types_initial[] = { _swigt__p_char, _swigt__size_t, _swigt__ptrdiff_t, 0 }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; static PyObject * swig_varlink_repr(swig_varlinkobject *v) { v = v; return PyString_FromString(""); } static int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) { swig_globalvar *var; flags = flags; fprintf(fp,"Swig global variables { "); for (var = v->vars; var; var=var->next) { fprintf(fp,"%s", var->name); if (var->next) fprintf(fp,", "); } fprintf(fp," }\n"); return 0; } static PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->get_attr)(); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return NULL; } static int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { return (*var->set_attr)(p); } var = var->next; } PyErr_SetString(PyExc_NameError,"Unknown C global variable"); return 1; } static PyTypeObject varlinktype = { PyObject_HEAD_INIT(0) 0, /* Number of items in variable part (ob_size) */ (char *)"swigvarlink", /* Type name (tp_name) */ sizeof(swig_varlinkobject), /* Basic size (tp_basicsize) */ 0, /* Itemsize (tp_itemsize) */ 0, /* Deallocator (tp_dealloc) */ (printfunc) swig_varlink_print, /* Print (tp_print) */ (getattrfunc) swig_varlink_getattr, /* get attr (tp_getattr) */ (setattrfunc) swig_varlink_setattr, /* Set attr (tp_setattr) */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ 0, /* tp_doc */ #if PY_VERSION_HEX >= 0x02000000 0, /* tp_traverse */ 0, /* tp_clear */ #endif #if PY_VERSION_HEX >= 0x02010000 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #endif #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #ifdef COUNT_ALLOCS 0,0,0,0 /* tp_alloc -> tp_next */ #endif }; /* Create a variable linking object for use later */ static PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = 0; result = PyMem_NEW(swig_varlinkobject,1); varlinktype.ob_type = &PyType_Type; /* Patch varlinktype into a PyType */ result->ob_type = &varlinktype; result->vars = 0; result->ob_refcnt = 0; Py_XINCREF((PyObject *) result); return ((PyObject*) result); } static void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v; swig_globalvar *gv; v= (swig_varlinkobject *) p; gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); gv->name = (char *) malloc(strlen(name)+1); strcpy(gv->name,name); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; v->vars = gv; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ static void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_PY_INT: obj = PyInt_FromLong(constants[i].lvalue); break; case SWIG_PY_FLOAT: obj = PyFloat_FromDouble(constants[i].dvalue); break; case SWIG_PY_STRING: if (constants[i].pvalue) { obj = PyString_FromString((char *) constants[i].pvalue); } else { Py_INCREF(Py_None); obj = Py_None; } break; case SWIG_PY_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d,constants[i].name,obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ static void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { char *c = methods[i].ml_doc; if (c && (c = strstr(c, "swig_ptr: "))) { int j; swig_const_info *ci = 0; char *name = c + 10; for (j = 0; const_table[j].type; j++) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); char *buff = ndoc; void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue: (void *)(ci->lvalue); strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } /* -----------------------------------------------------------------------------* * Initialize type list * -----------------------------------------------------------------------------*/ #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ static int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return -1; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return -1; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return -1; } if (PyDict_SetItemString(dict, name, o)) return -1; Py_DECREF(o); return 0; } #endif static swig_type_info ** SWIG_Python_SetTypeListHandle(swig_type_info **type_list_handle) { static PyMethodDef swig_empty_runtime_method_table[] = { { NULL, NULL, 0, NULL } };/* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); PyObject *pointer = PyCObject_FromVoidPtr((void *) type_list_handle, NULL); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } return type_list_handle; } static swig_type_info ** SWIG_Python_LookupTypePointer(swig_type_info **type_list_handle) { swig_type_info **type_pointer; /* first check if module already created */ type_pointer = SWIG_Python_GetTypeListHandle(); if (type_pointer) { return type_pointer; } else { /* create a new module and variable */ return SWIG_Python_SetTypeListHandle(type_list_handle); } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void *) SWIG_ReturnGlobalTypeList(void *); #endif #ifdef __cplusplus extern "C" #endif SWIGEXPORT(void) SWIG_init(void) { static PyObject *SWIG_globals = 0; static int typeinit = 0; PyObject *m, *d; int i; if (!SWIG_globals) SWIG_globals = SWIG_newvarlink(); /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_types_initial); m = Py_InitModule((char *) SWIG_name, SwigMethods); d = PyModule_GetDict(m); if (!typeinit) { #ifdef SWIG_LINK_RUNTIME swig_type_list_handle = (swig_type_info **) SWIG_ReturnGlobalTypeList(swig_type_list_handle); #else # ifndef SWIG_STATIC_RUNTIME swig_type_list_handle = SWIG_Python_LookupTypePointer(swig_type_list_handle); # endif #endif for (i = 0; swig_types_initial[i]; i++) { swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]); } typeinit = 1; } SWIG_InstallConstants(d,swig_const_table); { PyDict_SetItemString(d,"IDLE_PRIORITY_CLASS", SWIG_From_int((int)(IDLE_PRIORITY_CLASS))); } { PyDict_SetItemString(d,"NORMAL_PRIORITY_CLASS", SWIG_From_int((int)(NORMAL_PRIORITY_CLASS))); } { PyDict_SetItemString(d,"HIGH_PRIORITY_CLASS", SWIG_From_int((int)(HIGH_PRIORITY_CLASS))); } { PyDict_SetItemString(d,"REALTIME_PRIORITY_CLASS", SWIG_From_int((int)(REALTIME_PRIORITY_CLASS))); } { PyDict_SetItemString(d,"THREAD_PRIORITY_IDLE", SWIG_From_int((int)(THREAD_PRIORITY_IDLE))); } { PyDict_SetItemString(d,"THREAD_PRIORITY_LOWEST", SWIG_From_int((int)(THREAD_PRIORITY_LOWEST))); } { PyDict_SetItemString(d,"THREAD_PRIORITY_BELOW_NORMAL", SWIG_From_int((int)(THREAD_PRIORITY_BELOW_NORMAL))); } { PyDict_SetItemString(d,"THREAD_PRIORITY_NORMAL", SWIG_From_int((int)(THREAD_PRIORITY_NORMAL))); } { PyDict_SetItemString(d,"THREAD_PRIORITY_ABOVE_NORMAL", SWIG_From_int((int)(THREAD_PRIORITY_ABOVE_NORMAL))); } { PyDict_SetItemString(d,"THREAD_PRIORITY_HIGHEST", SWIG_From_int((int)(THREAD_PRIORITY_HIGHEST))); } { PyDict_SetItemString(d,"THREAD_PRIORITY_TIME_CRITICAL", SWIG_From_int((int)(THREAD_PRIORITY_TIME_CRITICAL))); } } visionegg-1.2.1/VisionEgg/win32_vretrace.c0000644000076500000240000006051711224565530017600 0ustar astrawstaff/* Generated by Pyrex 0.9.3 on Fri Jul 01 13:46:48 2005 */ #include "Python.h" #include "structmember.h" #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #include "windows.h" #include "win32_load_driver.h" #include "win32_vretrace_orig.h" typedef struct {PyObject **p; char *s;} __Pyx_InternTabEntry; /*proto*/ typedef struct {PyObject **p; char *s; long n;} __Pyx_StringTabEntry; /*proto*/ static PyObject *__Pyx_UnpackItem(PyObject *, int); /*proto*/ static int __Pyx_EndUnpack(PyObject *, int); /*proto*/ static int __Pyx_PrintItem(PyObject *); /*proto*/ static int __Pyx_PrintNewline(void); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static void __Pyx_ReRaise(void); /*proto*/ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/ static PyObject *__Pyx_GetExcValue(void); /*proto*/ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, char *name); /*proto*/ static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ static int __Pyx_GetStarArgs(PyObject **args, PyObject **kwds, char *kwd_list[], int nargs, PyObject **args2, PyObject **kwds2); /*proto*/ static void __Pyx_WriteUnraisable(char *name); /*proto*/ static void __Pyx_AddTraceback(char *funcname); /*proto*/ static PyTypeObject *__Pyx_ImportType(char *module_name, char *class_name, long size); /*proto*/ static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/ static int __Pyx_GetVtable(PyObject *dict, void *vtabptr); /*proto*/ static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name, char *modname); /*proto*/ static int __Pyx_InternStrings(__Pyx_InternTabEntry *t); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static PyObject *__pyx_m; static PyObject *__pyx_b; static int __pyx_lineno; static char *__pyx_filename; staticforward char **__pyx_f; /* Declarations from win32_vretrace */ staticforward PyTypeObject __pyx_type_14win32_vretrace_VRetraceHandleKeeper; struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper { PyObject_HEAD HANDLE VRetrace_Handle; }; static PyTypeObject *__pyx_ptype_14win32_vretrace_VRetraceHandleKeeper = 0; static struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *__pyx_v_14win32_vretrace_hk; static PyObject *__pyx_k1; /* Implementation of win32_vretrace */ static PyObject *__pyx_n_WAIT_INSIDE; static PyObject *__pyx_n_WAIT_START; static PyObject *__pyx_n_WAIT_END; static PyObject *__pyx_n_LoadVRetraceDriver; static PyObject *__pyx_n_WaitForRetrace; static PyObject *__pyx_n_RuntimeError; static PyObject *__pyx_k2p; static PyObject *__pyx_k3p; static PyObject *__pyx_k4p; static char (__pyx_k2[]) = "Could not load driver VRETRACE.SYS"; static char (__pyx_k3[]) = "Invalid version (%lx) returned"; static char (__pyx_k4[]) = "No vertical retrace detected"; static PyObject *__pyx_f_14win32_vretrace_LoadVRetraceDriver(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_14win32_vretrace_LoadVRetraceDriver(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { BOOL __pyx_v_success; HANDLE __pyx_v_VRetrace_Handle; DWORD __pyx_v_dwVersion; DWORD __pyx_v_dwCycles; DWORD __pyx_v_dwRetCount; DWORD __pyx_v_dwReturned; struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *__pyx_v_hk; PyObject *__pyx_r; int __pyx_1; PyObject *__pyx_2 = 0; PyObject *__pyx_3 = 0; PyObject *__pyx_4 = 0; static char *__pyx_argnames[] = {0}; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "", __pyx_argnames)) return 0; ((PyObject*)__pyx_v_hk) = Py_None; Py_INCREF(((PyObject*)__pyx_v_hk)); /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":50 */ __pyx_v_VRetrace_Handle = LoadDriver(VRETRACE_NAME); /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":51 */ __pyx_1 = (__pyx_v_VRetrace_Handle == INVALID_HANDLE_VALUE); if (__pyx_1) { /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":52 */ __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_RuntimeError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; goto __pyx_L1;} __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; goto __pyx_L1;} Py_INCREF(__pyx_k2p); PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k2p); __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; goto __pyx_L1;} Py_DECREF(__pyx_2); __pyx_2 = 0; Py_DECREF(__pyx_3); __pyx_3 = 0; __Pyx_Raise(__pyx_4, 0, 0); Py_DECREF(__pyx_4); __pyx_4 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; goto __pyx_L1;} goto __pyx_L2; } __pyx_L2:; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":55 */ __pyx_v_dwVersion = 0; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":56 */ __pyx_v_success = DeviceIoControl(__pyx_v_VRetrace_Handle,IOCTL_VRETRACE_VERSION,0,0,(&__pyx_v_dwVersion),(sizeof(__pyx_v_dwVersion)),(&__pyx_v_dwReturned),0); /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":61 */ __pyx_1 = (!__pyx_v_success); if (!__pyx_1) { __pyx_1 = (__pyx_v_dwVersion < 256); } if (__pyx_1) { /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":62 */ CloseHandle(__pyx_v_VRetrace_Handle); /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":63 */ __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_RuntimeError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; goto __pyx_L1;} __pyx_3 = PyInt_FromLong(__pyx_v_dwVersion); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; goto __pyx_L1;} __pyx_4 = PyNumber_Remainder(__pyx_k3p, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; goto __pyx_L1;} Py_DECREF(__pyx_3); __pyx_3 = 0; __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; goto __pyx_L1;} PyTuple_SET_ITEM(__pyx_3, 0, __pyx_4); __pyx_4 = 0; __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; goto __pyx_L1;} Py_DECREF(__pyx_2); __pyx_2 = 0; Py_DECREF(__pyx_3); __pyx_3 = 0; __Pyx_Raise(__pyx_4, 0, 0); Py_DECREF(__pyx_4); __pyx_4 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; goto __pyx_L1;} goto __pyx_L3; } __pyx_L3:; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":67 */ __pyx_v_dwCycles = 0; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":68 */ __pyx_v_success = DeviceIoControl(__pyx_v_VRetrace_Handle,IOCTL_VRETRACE_TEST,(&__pyx_v_dwCycles),(sizeof(__pyx_v_dwCycles)),(&__pyx_v_dwRetCount),(sizeof(__pyx_v_dwRetCount)),(&__pyx_v_dwReturned),0); /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":73 */ __pyx_1 = (!__pyx_v_success); if (!__pyx_1) { __pyx_1 = (__pyx_v_dwRetCount == 0); } if (__pyx_1) { /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":74 */ CloseHandle(__pyx_v_VRetrace_Handle); /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":75 */ __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_RuntimeError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;} __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;} Py_INCREF(__pyx_k4p); PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k4p); __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;} Py_DECREF(__pyx_2); __pyx_2 = 0; Py_DECREF(__pyx_3); __pyx_3 = 0; __Pyx_Raise(__pyx_4, 0, 0); Py_DECREF(__pyx_4); __pyx_4 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; goto __pyx_L1;} goto __pyx_L4; } __pyx_L4:; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":78 */ __pyx_2 = PyTuple_New(0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; goto __pyx_L1;} __pyx_3 = PyObject_CallObject(((PyObject*)__pyx_ptype_14win32_vretrace_VRetraceHandleKeeper), __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; goto __pyx_L1;} Py_DECREF(__pyx_2); __pyx_2 = 0; if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_14win32_vretrace_VRetraceHandleKeeper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 78; goto __pyx_L1;} Py_DECREF(((PyObject *)__pyx_v_hk)); ((PyObject *)__pyx_v_hk) = __pyx_3; __pyx_3 = 0; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":79 */ __pyx_v_hk->VRetrace_Handle = __pyx_v_VRetrace_Handle; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":80 */ Py_INCREF(((PyObject *)__pyx_v_hk)); __pyx_r = ((PyObject *)__pyx_v_hk); goto __pyx_L0; __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; Py_XDECREF(__pyx_2); Py_XDECREF(__pyx_3); Py_XDECREF(__pyx_4); __Pyx_AddTraceback("win32_vretrace.LoadVRetraceDriver"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_hk); return __pyx_r; } static PyObject *__pyx_f_14win32_vretrace_WaitForRetrace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_14win32_vretrace_WaitForRetrace[] = "Wait for a vertical retrace signal\n\n Arguments:\n wait_start -- if true, will wait for the next retrace if one is already active\n\n "; static PyObject *__pyx_f_14win32_vretrace_WaitForRetrace(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_wait_start = 0; DWORD __pyx_v_dwWaitCode; DWORD __pyx_v_dwReturned; PyObject *__pyx_r; DWORD __pyx_1; static char *__pyx_argnames[] = {"wait_start",0}; __pyx_v_wait_start = __pyx_k1; if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "|O", __pyx_argnames, &__pyx_v_wait_start)) return 0; Py_INCREF(__pyx_v_wait_start); /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":93 */ __pyx_1 = PyInt_AsLong(__pyx_v_wait_start); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 93; goto __pyx_L1;} __pyx_v_dwWaitCode = __pyx_1; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":94 */ DeviceIoControl(__pyx_v_14win32_vretrace_hk->VRetrace_Handle,IOCTL_VRETRACE_WAIT,(&__pyx_v_dwWaitCode),(sizeof(__pyx_v_dwWaitCode)),0,0,(&__pyx_v_dwReturned),0); __pyx_r = Py_None; Py_INCREF(__pyx_r); goto __pyx_L0; __pyx_L1:; __Pyx_AddTraceback("win32_vretrace.WaitForRetrace"); __pyx_r = 0; __pyx_L0:; Py_DECREF(__pyx_v_wait_start); return __pyx_r; } static __Pyx_InternTabEntry __pyx_intern_tab[] = { {&__pyx_n_LoadVRetraceDriver, "LoadVRetraceDriver"}, {&__pyx_n_RuntimeError, "RuntimeError"}, {&__pyx_n_WAIT_END, "WAIT_END"}, {&__pyx_n_WAIT_INSIDE, "WAIT_INSIDE"}, {&__pyx_n_WAIT_START, "WAIT_START"}, {&__pyx_n_WaitForRetrace, "WaitForRetrace"}, {0, 0} }; static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_k2p, __pyx_k2, sizeof(__pyx_k2)}, {&__pyx_k3p, __pyx_k3, sizeof(__pyx_k3)}, {&__pyx_k4p, __pyx_k4, sizeof(__pyx_k4)}, {0, 0, 0} }; static PyObject *__pyx_tp_new_14win32_vretrace_VRetraceHandleKeeper(PyTypeObject *t, PyObject *a, PyObject *k) { PyObject *o = (*t->tp_alloc)(t, 0); struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *p = (struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *)o; return o; } static void __pyx_tp_dealloc_14win32_vretrace_VRetraceHandleKeeper(PyObject *o) { struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *p = (struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *)o; (*o->ob_type->tp_free)(o); } static int __pyx_tp_traverse_14win32_vretrace_VRetraceHandleKeeper(PyObject *o, visitproc v, void *a) { int e; struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *p = (struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *)o; return 0; } static int __pyx_tp_clear_14win32_vretrace_VRetraceHandleKeeper(PyObject *o) { struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *p = (struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper *)o; return 0; } static struct PyMethodDef __pyx_methods_14win32_vretrace_VRetraceHandleKeeper[] = { {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_VRetraceHandleKeeper = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ 0, /*nb_divide*/ 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ 0, /*nb_coerce*/ 0, /*nb_int*/ 0, /*nb_long*/ 0, /*nb_float*/ 0, /*nb_oct*/ 0, /*nb_hex*/ 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ 0, /*nb_inplace_divide*/ 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ }; static PySequenceMethods __pyx_tp_as_sequence_VRetraceHandleKeeper = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_VRetraceHandleKeeper = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_VRetraceHandleKeeper = { 0, /*bf_getreadbuffer*/ 0, /*bf_getwritebuffer*/ 0, /*bf_getsegcount*/ 0, /*bf_getcharbuffer*/ }; statichere PyTypeObject __pyx_type_14win32_vretrace_VRetraceHandleKeeper = { PyObject_HEAD_INIT(0) 0, /*ob_size*/ "win32_vretrace.VRetraceHandleKeeper", /*tp_name*/ sizeof(struct __pyx_obj_14win32_vretrace_VRetraceHandleKeeper), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_14win32_vretrace_VRetraceHandleKeeper, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ &__pyx_tp_as_number_VRetraceHandleKeeper, /*tp_as_number*/ &__pyx_tp_as_sequence_VRetraceHandleKeeper, /*tp_as_sequence*/ &__pyx_tp_as_mapping_VRetraceHandleKeeper, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_VRetraceHandleKeeper, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE, /*tp_flags*/ 0, /*tp_doc*/ __pyx_tp_traverse_14win32_vretrace_VRetraceHandleKeeper, /*tp_traverse*/ __pyx_tp_clear_14win32_vretrace_VRetraceHandleKeeper, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_14win32_vretrace_VRetraceHandleKeeper, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_14win32_vretrace_VRetraceHandleKeeper, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ }; static struct PyMethodDef __pyx_methods[] = { {"LoadVRetraceDriver", (PyCFunction)__pyx_f_14win32_vretrace_LoadVRetraceDriver, METH_VARARGS|METH_KEYWORDS, 0}, {"WaitForRetrace", (PyCFunction)__pyx_f_14win32_vretrace_WaitForRetrace, METH_VARARGS|METH_KEYWORDS, __pyx_doc_14win32_vretrace_WaitForRetrace}, {0, 0, 0, 0} }; DL_EXPORT(void) initwin32_vretrace(void); /*proto*/ DL_EXPORT(void) initwin32_vretrace(void) { PyObject *__pyx_1 = 0; PyObject *__pyx_2 = 0; PyObject *__pyx_3 = 0; PyObject *__pyx_4 = 0; __pyx_m = Py_InitModule4("win32_vretrace", __pyx_methods, 0, 0, PYTHON_API_VERSION); if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; __pyx_b = PyImport_AddModule("__builtin__"); if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; if (__Pyx_InternStrings(__pyx_intern_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; goto __pyx_L1;}; ((PyObject*)__pyx_v_14win32_vretrace_hk) = Py_None; Py_INCREF(((PyObject*)__pyx_v_14win32_vretrace_hk)); if (PyType_Ready(&__pyx_type_14win32_vretrace_VRetraceHandleKeeper) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; goto __pyx_L1;} if (PyObject_SetAttrString(__pyx_m, "VRetraceHandleKeeper", (PyObject *)&__pyx_type_14win32_vretrace_VRetraceHandleKeeper) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; goto __pyx_L1;} __pyx_ptype_14win32_vretrace_VRetraceHandleKeeper = &__pyx_type_14win32_vretrace_VRetraceHandleKeeper; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":36 */ __pyx_1 = PyInt_FromLong(VRETRACE_WAIT_INSIDE); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;} if (PyObject_SetAttr(__pyx_m, __pyx_n_WAIT_INSIDE, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":37 */ __pyx_1 = PyInt_FromLong(VRETRACE_WAIT_START); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; goto __pyx_L1;} if (PyObject_SetAttr(__pyx_m, __pyx_n_WAIT_START, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":38 */ __pyx_1 = PyInt_FromLong(VRETRACE_WAIT_END); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; goto __pyx_L1;} if (PyObject_SetAttr(__pyx_m, __pyx_n_WAIT_END, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; goto __pyx_L1;} Py_DECREF(__pyx_1); __pyx_1 = 0; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":82 */ __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_WAIT_START); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; goto __pyx_L1;} __pyx_k1 = __pyx_1; __pyx_1 = 0; /* "C:\Documents and Settings\astraw\Desktop\visionegg-devel\src\win32_vretrace.pyx":101 */ __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_LoadVRetraceDriver); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; goto __pyx_L1;} __pyx_3 = PyTuple_New(0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; goto __pyx_L1;} __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; goto __pyx_L1;} Py_DECREF(__pyx_2); __pyx_2 = 0; Py_DECREF(__pyx_3); __pyx_3 = 0; if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_14win32_vretrace_VRetraceHandleKeeper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; goto __pyx_L1;} Py_DECREF(((PyObject *)__pyx_v_14win32_vretrace_hk)); ((PyObject *)__pyx_v_14win32_vretrace_hk) = __pyx_4; __pyx_4 = 0; return; __pyx_L1:; Py_XDECREF(__pyx_1); Py_XDECREF(__pyx_2); Py_XDECREF(__pyx_3); Py_XDECREF(__pyx_4); __Pyx_AddTraceback("win32_vretrace"); } static char *__pyx_filenames[] = { "win32_vretrace.pyx", }; statichere char **__pyx_f = __pyx_filenames; /* Runtime support code */ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) PyErr_SetObject(PyExc_NameError, name); return result; } static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (!type) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (obj == Py_None || PyObject_TypeCheck(obj, type)) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %s to %s", obj->ob_type->tp_name, type->tp_name); return 0; } static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { Py_XINCREF(type); Py_XINCREF(value); Py_XINCREF(tb); /* First, check the traceback argument, replacing None with NULL. */ if (tb == Py_None) { Py_DECREF(tb); tb = 0; } else if (tb != NULL && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } /* Next, replace a missing value with None */ if (value == NULL) { value = Py_None; Py_INCREF(value); } /* Next, repeatedly, replace a tuple exception with its first item */ while (PyTuple_Check(type) && PyTuple_Size(type) > 0) { PyObject *tmp = type; type = PyTuple_GET_ITEM(type, 0); Py_INCREF(type); Py_DECREF(tmp); } if (PyString_Check(type)) ; else if (PyClass_Check(type)) ; /*PyErr_NormalizeException(&type, &value, &tb);*/ else if (PyInstance_Check(type)) { /* Raising an instance. The value should be a dummy. */ if (value != Py_None) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } else { /* Normalize to raise , */ Py_DECREF(value); value = type; type = (PyObject*) ((PyInstanceObject*)type)->in_class; Py_INCREF(type); } } else { /* Not something you can raise. You get an exception anyway, just not what you specified :-) */ PyErr_Format(PyExc_TypeError, "exceptions must be strings, classes, or " "instances, not %s", type->ob_type->tp_name); goto raise_error; } PyErr_Restore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } static int __Pyx_InternStrings(__Pyx_InternTabEntry *t) { while (t->p) { *t->p = PyString_InternFromString(t->s); if (!*t->p) return -1; ++t; } return 0; } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); if (!*t->p) return -1; ++t; } return 0; } #include "compile.h" #include "frameobject.h" #include "traceback.h" static void __Pyx_AddTraceback(char *funcname) { PyObject *py_srcfile = 0; PyObject *py_funcname = 0; PyObject *py_globals = 0; PyObject *empty_tuple = 0; PyObject *empty_string = 0; PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; py_srcfile = PyString_FromString(__pyx_filename); if (!py_srcfile) goto bad; py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; empty_tuple = PyTuple_New(0); if (!empty_tuple) goto bad; empty_string = PyString_FromString(""); if (!empty_string) goto bad; py_code = PyCode_New( 0, /*int argcount,*/ 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ empty_string, /*PyObject *code,*/ empty_tuple, /*PyObject *consts,*/ empty_tuple, /*PyObject *names,*/ empty_tuple, /*PyObject *varnames,*/ empty_tuple, /*PyObject *freevars,*/ empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ __pyx_lineno, /*int firstlineno,*/ empty_string /*PyObject *lnotab*/ ); if (!py_code) goto bad; py_frame = PyFrame_New( PyThreadState_Get(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = __pyx_lineno; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); Py_XDECREF(empty_tuple); Py_XDECREF(empty_string); Py_XDECREF(py_code); Py_XDECREF(py_frame); } visionegg-1.2.1/VisionEgg/win32_vretrace.pyx0000644000076500000240000000617411224565530020175 0ustar astrawstaff# emacs, this is -*-Python-*- mode # See http://www.compuphase.com/vretrace.htm cdef extern from "windows.h": ctypedef void* HANDLE ctypedef void* LPVOID ctypedef char* LPSTR ctypedef int BOOL ctypedef int DWORD ctypedef DWORD* LPDWORD ctypedef void* LPOVERLAPPED ctypedef int size_t cdef HANDLE INVALID_HANDLE_VALUE cdef size_t sizeof(DWORD) cdef BOOL DeviceIoControl(HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPOVERLAPPED) #int, void*, size_t, void*, size_t, void*, size_t) cdef void CloseHandle(HANDLE) cdef extern from "win32_load_driver.h": HANDLE LoadDriver(LPSTR DriverName) cdef extern from "win32_vretrace_orig.h": cdef char * VRETRACE_NAME # "VRETRACE" cdef int IOCTL_VRETRACE_VERSION cdef int IOCTL_VRETRACE_TEST cdef int IOCTL_VRETRACE_WAIT cdef DWORD VRETRACE_WAIT_INSIDE cdef DWORD VRETRACE_WAIT_START cdef DWORD VRETRACE_WAIT_END # some constants WAIT_INSIDE = VRETRACE_WAIT_INSIDE WAIT_START = VRETRACE_WAIT_START WAIT_END = VRETRACE_WAIT_END cdef class VRetraceHandleKeeper: cdef HANDLE VRetrace_Handle def LoadVRetraceDriver(): cdef BOOL success cdef HANDLE VRetrace_Handle cdef DWORD dwVersion cdef DWORD dwCycles, dwRetCount, dwReturned cdef VRetraceHandleKeeper hk VRetrace_Handle = LoadDriver(VRETRACE_NAME) if VRetrace_Handle == INVALID_HANDLE_VALUE: raise RuntimeError('Could not load driver VRETRACE.SYS') # check the version (should be non-zero) dwVersion = 0 success = DeviceIoControl(VRetrace_Handle, IOCTL_VRETRACE_VERSION, NULL, 0, &dwVersion, sizeof(dwVersion), &dwReturned, NULL) if not success or dwVersion < 0x100: CloseHandle(VRetrace_Handle) raise RuntimeError('Invalid version (%lx) returned'%dwVersion) # if we got the vertical retrace driver, check whether the video # card vertical retraces at all dwCycles = 0 success = DeviceIoControl(VRetrace_Handle, IOCTL_VRETRACE_TEST, &dwCycles, sizeof(dwCycles), &dwRetCount, sizeof(dwRetCount), &dwReturned, NULL); if not success or dwRetCount == 0: CloseHandle(VRetrace_Handle) raise RuntimeError('No vertical retrace detected') # return the handle for later use hk = VRetraceHandleKeeper() hk.VRetrace_Handle = VRetrace_Handle return hk def WaitForRetrace(wait_start=WAIT_START): """Wait for a vertical retrace signal Arguments: wait_start -- if true, will wait for the next retrace if one is already active """ cdef DWORD dwWaitCode, dwReturned global hk dwWaitCode = wait_start DeviceIoControl(hk.VRetrace_Handle, IOCTL_VRETRACE_WAIT, &dwWaitCode, sizeof(dwWaitCode), NULL, 0, &dwReturned, NULL) cdef VRetraceHandleKeeper hk hk = LoadVRetraceDriver() # initialize driver and keep handle to it visionegg-1.2.1/VisionEgg/win32_vretrace_orig.h0000644000076500000240000000450611224565530020621 0ustar astrawstaff/* This file from the original distribution available at http://www.compuphase.com/vretrace.htm */ ;/*`........................... assembly language ................... ; ; Constants ; ; #define CTL_CODE( DeviceType, Function, Method, Access ) ( \ ; ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \ ; ) ; ; #define METHOD_BUFFERED 0 ; #define METHOD_IN_DIRECT 1 ; #define METHOD_OUT_DIRECT 2 ; #define METHOD_NEITHER 3 ; ; #define FILE_ANY_ACCESS 0 ; #define FILE_READ_ACCESS ( 0x0001 ) // file & pipe ; #define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe METHOD_BUFFERED EQU 0t METHOD_IN_DIRECT EQU 1t METHOD_OUT_DIRECT EQU 2t METHOD_NEITHER EQU 3t FILE_ANY_ACCESS EQU 0t FILE_READ_ACCESS EQU 000000001h FILE_WRITE_ACCESS EQU 000000002h VR_TYPE EQU 00000c000h IOCTL_CLOSE_HANDLE EQU -1 IOCTL_OPEN_HANDLE EQU 0 IOCTL_VRETRACE_VERSION EQU 0c0002000h IOCTL_VRETRACE_TEST EQU 0c0002004h IOCTL_VRETRACE_WAIT EQU 0c0002008h VRETRACE_WAIT_INSIDE EQU 0 VRETRACE_WAIT_START EQU 1 VRETRACE_WAIT_END EQU 2 comment `..................... C language ......................... */ #if !defined _NTDDK_ #include #endif // Driver names, add extensions .VXD and .SYS for the filenames #define VRETRACE_NAME "VRETRACE" // Device type --- in the "User Defined" range." #define VR_TYPE 0xc000 // IOCTL commands for both the VxD and the Kernel Mode driver // IOCTL_CLOSE_HANDLE // predefined for VxDs at -1 // IOCTL_OPEN_HANDLE // predefined for VxDs at 0 // get the version of the driver #define IOCTL_VRETRACE_VERSION CTL_CODE(VR_TYPE, 0x0800, METHOD_BUFFERED, FILE_ANY_ACCESS) // check whether Vertical Retrace is available #define IOCTL_VRETRACE_TEST CTL_CODE(VR_TYPE, 0x0801, METHOD_BUFFERED, FILE_ANY_ACCESS) // test if vertical retraces are supported // wait for vertical retrace #define IOCTL_VRETRACE_WAIT CTL_CODE(VR_TYPE, 0x0802, METHOD_BUFFERED, FILE_ANY_ACCESS) enum { VRETRACE_WAIT_INSIDE, VRETRACE_WAIT_START, VRETRACE_WAIT_END }; //`........................... END ................................. visionegg-1.2.1/VisionEgg/WrappedText.py0000644000076500000240000001224411224565530017412 0ustar astrawstaff#!/usr/bin/env python """Module containing the Multi-line text stimulus class WrappedText, as well as a simple example of its use.""" # Copyright (c) 2007 Eamon Caddigan, University of Illinois # License: LGPL (see LICENSE.txt distributed with this file) # Created on 2007-11-15 # # TODO: (more of a wishlist) # * anchor parameter # * angle parameter (I dunno, maybe you want some paragraphs tilted) # * more robust line length calculation # * wholesale replacement of this module with *real* formatted text (e.g., # ghostscript). The kerning of pygame's text is atrocious. import VisionEgg.Core import VisionEgg.Text import VisionEgg.Textures import VisionEgg.ParameterTypes as ve_types import textwrap class WrappedText(VisionEgg.Core.Stimulus): """Multi-line text stimulus. No fancy formatting, but line breaks ('\\n') are preserved, and text is wrapped to fit within the stimulus boundaries.""" parameters_and_defaults = { 'on':(True, ve_types.Boolean), 'position':((0.0,0.0), ve_types.AnyOf(ve_types.Sequence2(ve_types.Real), ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))), 'size':(None, ve_types.Sequence2(ve_types.Real), """Defaults to the size of the screen."""), 'text':('hello', ve_types.AnyOf(ve_types.String,ve_types.Unicode)), 'color':((1.0,1.0,1.0), ve_types.AnyOf(ve_types.Sequence3(ve_types.Real), ve_types.Sequence4(ve_types.Real))) } constant_parameters_and_defaults = { 'font_name':(None, ve_types.AnyOf(ve_types.String,ve_types.Unicode), "Name of font to use. If None, use the default font"), 'font_size':(30, ve_types.UnsignedInteger) } def __init__(self, **kw): """Initialize the object, perform the initial line-splitting""" VisionEgg.Core.Stimulus.__init__(self, **kw) if self.parameters.size is None: self.parameters.size = (VisionEgg.config.VISIONEGG_SCREEN_W, VisionEgg.config.VISIONEGG_SCREEN_H) self._splitText() def _splitText(self): """Split a single string into multiple lines of text, storing each as a VisionEgg.Text.Text instance""" p = self.parameters cp = self.constant_parameters self._text = p.text textAreaWidth = None maxLineLength = len(self._text) minLineLength = 1 lineLength = maxLineLength while ((textAreaWidth > p.size[0]) or ((maxLineLength-minLineLength) > 1)) and (maxLineLength > 1): nextPosition = p.position self._textLines = [] try: textLineList = [] for text in self._text.split("\n"): if text == "": textLineList.append("") else: textLineList.extend(textwrap.wrap(text, lineLength)) textAreaWidth = None for textLine in textLineList: if textLine != "": line = VisionEgg.Text.Text(text=textLine, position = nextPosition, anchor = "upperleft", ignore_size_parameter = True, color = p.color, font_name = cp.font_name, font_size = cp.font_size) textAreaWidth = max(textAreaWidth, line.parameters.size[0]) self._textLines.append(line) nextPosition = (nextPosition[0], nextPosition[1]-line.parameters.size[1]) # Stop adding lines if the text area's height has been reached if (p.position[1] - nextPosition[1]) > p.size[1]: break except VisionEgg.Textures.TextureTooLargeError: textAreaWidth = p.size[0]+1 if textAreaWidth > p.size[0]: maxLineLength = lineLength else: minLineLength = lineLength lineLength = (maxLineLength+minLineLength)/2 def draw(self): """Draw the lines of text on the screen""" p = self.parameters if p.on: if p.text != self._text: self._splitText() for line in self._textLines: line.parameters.color = p.color line.draw() def main(): """Launch VisionEgg and demo the WrappedText object""" import VisionEgg VisionEgg.start_default_logging(); VisionEgg.watch_exceptions() import VisionEgg.FlowControl screen = VisionEgg.Core.get_default_screen() message="""Hello. This is a demonstration of the WrappedText object, which was created to allow users of VisionEgg to include large blocks of text in their programs. While this stimulus has many limitations, it should be useful for presenting on-screen instructions in experiments. While you are welcome to modify this file to extend its functionality, I hope you consider sharing any such modifications with the VisionEgg community. Eamon Caddigan,\nUniversity of Illinois\n15 November 2007""" wt = WrappedText(text=message, position=(50,screen.size[1]-50), size=(screen.size[0]-100, screen.size[1]-100)) viewport = VisionEgg.Core.Viewport(screen=screen, stimuli=[wt]) # Frame-based presentation duration makes it easier to use pdb p = VisionEgg.FlowControl.Presentation(viewports=[viewport], go_duration=(VisionEgg.config.VISIONEGG_MONITOR_REFRESH_HZ*30,'frames')) p.go() screen.close() # Called explicitly to behave better in interactive shells if __name__ == "__main__": main() visionegg-1.2.1/visionegg.egg-info/0000755000076500000240000000000011231315557016360 5ustar astrawstaffvisionegg-1.2.1/visionegg.egg-info/dependency_links.txt0000644000076500000240000000000111231315556022425 0ustar astrawstaff visionegg-1.2.1/visionegg.egg-info/PKG-INFO0000644000076500000240000000412111231315556017452 0ustar astrawstaffMetadata-Version: 1.0 Name: visionegg Version: 1.2.1 Summary: 2D/3D visual stimulus generation Home-page: http://www.visionegg.org/ Author: Andrew Straw Author-email: astraw@users.sourceforge.net License: LGPL Description: The Vision Egg is a programming library (with demo applications) that uses standard, inexpensive computer graphics cards to produce visual stimuli for vision research experiments. For more information, visit the website at www.visionegg.org Any feedback, questions, or comments, should go to the mailing list at visionegg@freelists.org The Vision Egg is Copyright (c) by its authors and is distributed under the GNU Lesser General Public License (LGPL). This software comes with absolutely no warranties, either expressed or implied. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Environment :: MacOS X Classifier: Environment :: Other Environment Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) Classifier: Natural Language :: English Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: POSIX :: IRIX Classifier: Programming Language :: Python Classifier: Programming Language :: C Classifier: Topic :: Multimedia :: Graphics Classifier: Topic :: Multimedia :: Graphics :: 3D Rendering Classifier: Topic :: Multimedia :: Graphics :: Presentation Classifier: Topic :: Multimedia :: Video :: Display Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Scientific/Engineering :: Human Machine Interfaces Classifier: Topic :: Scientific/Engineering :: Medical Science Apps. Classifier: Topic :: Scientific/Engineering :: Visualization Classifier: Topic :: Software Development :: Libraries visionegg-1.2.1/visionegg.egg-info/SOURCES.txt0000644000076500000240000006551511231315556020257 0ustar astrawstaff.gitignore CHANGELOG.txt LICENSE.txt MANIFEST.in README-BINARY-DEMOS.txt README-DEMOS.txt README.txt bootstrap.py build-demo-dir.py build-win-exe-demos.py buildout.cfg check-config.py makepimp.py pyz_support.py setup.py update_docstrings.py upload_to_pypi.sh vc7.bat VisionEgg/Configuration.py VisionEgg/Core.py VisionEgg/Daq.py VisionEgg/DaqKeyboard.py VisionEgg/DaqLPT.py VisionEgg/Deprecated.py VisionEgg/Dots.py VisionEgg/FlowControl.py VisionEgg/GL.py VisionEgg/GLTrace.py VisionEgg/GUI.py VisionEgg/Gratings.py VisionEgg/MoreStimuli.py VisionEgg/ParameterTypes.py VisionEgg/PlatformDependent.py VisionEgg/PyroClient.py VisionEgg/PyroHelpers.py VisionEgg/QuickTime.py VisionEgg/ResponseControl.py VisionEgg/SphereMap.py VisionEgg/TCPController.py VisionEgg/Text.py VisionEgg/Textures.py VisionEgg/ThreeDeeMath.py VisionEgg/VisionEgg.cfg VisionEgg/WrappedText.py VisionEgg/__init__.py VisionEgg/_darwin_sync_swap.m VisionEgg/_draw_in_c.c VisionEgg/_lib3ds.c VisionEgg/_raw_lpt_linux.c VisionEgg/_raw_plp_irix.c VisionEgg/_vegl.c VisionEgg/_vegl.pyx VisionEgg/darwin_getrefresh.m VisionEgg/darwin_getrefresh.py VisionEgg/darwin_getrefresh_wrap.c VisionEgg/darwin_maxpriority.c VisionEgg/darwin_maxpriority.pyx VisionEgg/darwinsys.pxd VisionEgg/darwinsys_compat.h VisionEgg/gl_qt.c VisionEgg/gl_qt.h VisionEgg/gl_qt.py VisionEgg/gl_qt_wrap.c VisionEgg/movieconvert.c VisionEgg/movieconvert.h VisionEgg/posix_maxpriority.c VisionEgg/posix_maxpriority.py VisionEgg/posix_maxpriority_wrap.c VisionEgg/qtlowlevel.py VisionEgg/qtmovie.py VisionEgg/test_Core.py VisionEgg/vegl.h VisionEgg/win32_getrefresh.c VisionEgg/win32_getrefresh.py VisionEgg/win32_getrefresh_wrap.c VisionEgg/win32_load_driver.c VisionEgg/win32_load_driver.h VisionEgg/win32_maxpriority.c VisionEgg/win32_maxpriority.py VisionEgg/win32_maxpriority_wrap.c VisionEgg/win32_vretrace.c VisionEgg/win32_vretrace.pyx VisionEgg/win32_vretrace_orig.h VisionEgg/PyroApps/AST_ext.py VisionEgg/PyroApps/ColorCalGUI.py VisionEgg/PyroApps/ColorCalServer.py VisionEgg/PyroApps/DropinGUI.py VisionEgg/PyroApps/DropinServer.py VisionEgg/PyroApps/EPhysGUI.py VisionEgg/PyroApps/EPhysGUIUtils.py VisionEgg/PyroApps/EPhysServer.py VisionEgg/PyroApps/FlatGratingGUI.py VisionEgg/PyroApps/FlatGratingServer.py VisionEgg/PyroApps/GridGUI.py VisionEgg/PyroApps/GridServer.py VisionEgg/PyroApps/MouseTargetGUI.py VisionEgg/PyroApps/MouseTargetServer.py VisionEgg/PyroApps/ScreenPositionGUI.py VisionEgg/PyroApps/ScreenPositionServer.py VisionEgg/PyroApps/SphereGratingGUI.py VisionEgg/PyroApps/SphereGratingServer.py VisionEgg/PyroApps/SpinningDrumGUI.py VisionEgg/PyroApps/SpinningDrumServer.py VisionEgg/PyroApps/TargetGUI.py VisionEgg/PyroApps/TargetServer.py VisionEgg/PyroApps/VarTypes.py VisionEgg/PyroApps/__init__.py VisionEgg/data/VisionEggTitle.xcf VisionEgg/data/az_el.png VisionEgg/data/monitor.xcf VisionEgg/data/panorama.jpg VisionEgg/data/spiral.png VisionEgg/data/visionegg.bmp VisionEgg/data/visionegg.tif VisionEgg/data/water.mov demo/README.txt demo/alpha_texture.py demo/az_el_grid.py demo/color_grating.py demo/convert3d_to_2d.py demo/demo_arrow.py demo/demo_fixationpoint.py demo/demo_keyboardresponse.py demo/demo_keyboardtrigger.py demo/displayText.py demo/displayUnicode.py demo/dots.py demo/dots_pyro_client.py demo/dots_pyro_server.py demo/dots_simple_loop.py demo/ephys_gui.pyw demo/ephys_server.py demo/flames_pygame.py demo/flames_visionegg.py demo/framecount.py demo/gabor.py demo/gamma.py demo/grating.py demo/gratings_multi.py demo/image_sequence_fast.py demo/image_sequence_slow.py demo/makeMovie.py demo/makeMovie2.py demo/mouseTarget.py demo/mouseTarget_user_loop.py demo/mouse_gabor_2d.py demo/mouse_gabor_perspective.py demo/movingPOV.py demo/mpeg.py demo/multi_stim.py demo/plaid.py demo/project_linear_grating_on_cylinder.py demo/put_pixels.py demo/pygame_texture.py demo/quicktime.py demo/sphereMap.py demo/spiral.py demo/target.py demo/targetBackground.py demo/targetBackground2D.py demo/texture.py demo/texture3D.py demo/texture3D_alpha.py demo/textureDrum.py demo/texture_as_numpy_array.py demo/visual_jitter.py demo/wrapped_text.py demo/GUI/drumDemoGUI.py demo/Pyro/gratingPyroGUI.py demo/Pyro/gratingPyroServer.py demo/Pyro/metaPyroGUI.py demo/Pyro/metaPyroServer.py demo/Pyro/simpleClient.py demo/Pyro/simpleServer.py demo/daq/simple_lpt_out.py demo/daq/trigger_in.py demo/daq/trigger_out.py demo/tcp/gratingGUI.py demo/tcp/gratingTCP.py doc/BUILD.sh doc/BUILD.txt doc/index.html doc/visionegg.pdf doc/visionegg.tex doc/reference/epydoc doc/reference/make_epy.sh doc/reference/html/VisionEgg-module.html doc/reference/html/VisionEgg-pysrc.html doc/reference/html/VisionEgg.ClassWithParameters-class.html doc/reference/html/VisionEgg.Configuration-module.html doc/reference/html/VisionEgg.Configuration-pysrc.html doc/reference/html/VisionEgg.Configuration.Config-class.html doc/reference/html/VisionEgg.Core-module.html doc/reference/html/VisionEgg.Core-pysrc.html doc/reference/html/VisionEgg.Core.FixationSpot-class.html doc/reference/html/VisionEgg.Core.FrameTimer-class.html doc/reference/html/VisionEgg.Core.ModelView-class.html doc/reference/html/VisionEgg.Core.OrthographicProjection-class.html doc/reference/html/VisionEgg.Core.OrthographicProjectionNoZClip-class.html doc/reference/html/VisionEgg.Core.PerspectiveProjection-class.html doc/reference/html/VisionEgg.Core.Projection-class.html doc/reference/html/VisionEgg.Core.ProjectionBaseClass-class.html doc/reference/html/VisionEgg.Core.Screen-class.html doc/reference/html/VisionEgg.Core.SimplePerspectiveProjection-class.html doc/reference/html/VisionEgg.Core.Stimulus-class.html doc/reference/html/VisionEgg.Core.Viewport-class.html doc/reference/html/VisionEgg.Daq-module.html doc/reference/html/VisionEgg.Daq-pysrc.html doc/reference/html/VisionEgg.Daq.Analog-class.html doc/reference/html/VisionEgg.Daq.Buffered-class.html doc/reference/html/VisionEgg.Daq.Channel-class.html doc/reference/html/VisionEgg.Daq.ChannelParameters-class.html doc/reference/html/VisionEgg.Daq.DaqMode-class.html doc/reference/html/VisionEgg.Daq.Device-class.html doc/reference/html/VisionEgg.Daq.Digital-class.html doc/reference/html/VisionEgg.Daq.Functionality-class.html doc/reference/html/VisionEgg.Daq.Immediate-class.html doc/reference/html/VisionEgg.Daq.Input-class.html doc/reference/html/VisionEgg.Daq.Output-class.html doc/reference/html/VisionEgg.Daq.SignalType-class.html doc/reference/html/VisionEgg.Daq.Trigger-class.html doc/reference/html/VisionEgg.DaqKeyboard-module.html doc/reference/html/VisionEgg.DaqKeyboard-pysrc.html doc/reference/html/VisionEgg.DaqKeyboard.KeyboardInput-class.html doc/reference/html/VisionEgg.DaqKeyboard.KeyboardTriggerInController-class.html doc/reference/html/VisionEgg.DaqLPT-module.html doc/reference/html/VisionEgg.DaqLPT-pysrc.html doc/reference/html/VisionEgg.DaqLPT.LPTChannel-class.html doc/reference/html/VisionEgg.DaqLPT.LPTDevice-class.html doc/reference/html/VisionEgg.DaqLPT.LPTInput-class.html doc/reference/html/VisionEgg.DaqLPT.LPTOutput-class.html doc/reference/html/VisionEgg.DaqLPT.LPTTriggerInController-class.html doc/reference/html/VisionEgg.DaqLPT.LPTTriggerOutController-class.html doc/reference/html/VisionEgg.Deprecated-module.html doc/reference/html/VisionEgg.Deprecated-pysrc.html doc/reference/html/VisionEgg.Deprecated.Message-class.html doc/reference/html/VisionEgg.Dots-module.html doc/reference/html/VisionEgg.Dots-pysrc.html doc/reference/html/VisionEgg.Dots.DotArea2D-class.html doc/reference/html/VisionEgg.FlowControl-module.html doc/reference/html/VisionEgg.FlowControl-pysrc.html doc/reference/html/VisionEgg.FlowControl.ConstantController-class.html doc/reference/html/VisionEgg.FlowControl.Controller-class.html doc/reference/html/VisionEgg.FlowControl.EncapsulatedController-class.html doc/reference/html/VisionEgg.FlowControl.EvalStringController-class.html doc/reference/html/VisionEgg.FlowControl.ExecStringController-class.html doc/reference/html/VisionEgg.FlowControl.FunctionController-class.html doc/reference/html/VisionEgg.FlowControl.Presentation-class.html doc/reference/html/VisionEgg.GL-module.html doc/reference/html/VisionEgg.GL-pysrc.html doc/reference/html/VisionEgg.GLTrace-module.html doc/reference/html/VisionEgg.GLTrace-pysrc.html doc/reference/html/VisionEgg.GLTrace.Wrapper-class.html doc/reference/html/VisionEgg.GUI-module.html doc/reference/html/VisionEgg.GUI-pysrc.html doc/reference/html/VisionEgg.GUI.AppWindow-class.html doc/reference/html/VisionEgg.GUI.GetKeypressDialog-class.html doc/reference/html/VisionEgg.GUI.GraphicsConfigurationWindow-class.html doc/reference/html/VisionEgg.GUI.InfoFrame-class.html doc/reference/html/VisionEgg.GUI.ProgressBar-class.html doc/reference/html/VisionEgg.GUI.ToplevelDialog-class.html doc/reference/html/VisionEgg.Gratings-module.html doc/reference/html/VisionEgg.Gratings-pysrc.html doc/reference/html/VisionEgg.Gratings.AlphaGratingCommon-class.html doc/reference/html/VisionEgg.Gratings.LuminanceGratingCommon-class.html doc/reference/html/VisionEgg.Gratings.NumSamplesTooLargeError-class.html doc/reference/html/VisionEgg.Gratings.SinGrating2D-class.html doc/reference/html/VisionEgg.Gratings.SinGrating3D-class.html doc/reference/html/VisionEgg.MoreStimuli-module.html doc/reference/html/VisionEgg.MoreStimuli-pysrc.html doc/reference/html/VisionEgg.MoreStimuli.Arrow-class.html doc/reference/html/VisionEgg.MoreStimuli.FilledCircle-class.html doc/reference/html/VisionEgg.MoreStimuli.Rectangle3D-class.html doc/reference/html/VisionEgg.MoreStimuli.Target2D-class.html doc/reference/html/VisionEgg.ParameterDefinition-class.html doc/reference/html/VisionEgg.ParameterTypes-module.html doc/reference/html/VisionEgg.ParameterTypes-pysrc.html doc/reference/html/VisionEgg.ParameterTypes.AnyClass-class.html doc/reference/html/VisionEgg.ParameterTypes.AnyClassMC-class.html doc/reference/html/VisionEgg.ParameterTypes.AnyOf-class.html doc/reference/html/VisionEgg.ParameterTypes.Boolean-class.html doc/reference/html/VisionEgg.ParameterTypes.BooleanMC-class.html doc/reference/html/VisionEgg.ParameterTypes.Callable-class.html doc/reference/html/VisionEgg.ParameterTypes.CallableMC-class.html doc/reference/html/VisionEgg.ParameterTypes.Instance-class.html doc/reference/html/VisionEgg.ParameterTypes.Integer-class.html doc/reference/html/VisionEgg.ParameterTypes.IntegerMC-class.html doc/reference/html/VisionEgg.ParameterTypes.NoneMC-class.html doc/reference/html/VisionEgg.ParameterTypes.NoneType-class.html doc/reference/html/VisionEgg.ParameterTypes.ParameterTypeDef-class.html doc/reference/html/VisionEgg.ParameterTypes.Real-class.html doc/reference/html/VisionEgg.ParameterTypes.RealMC-class.html doc/reference/html/VisionEgg.ParameterTypes.Sequence-class.html doc/reference/html/VisionEgg.ParameterTypes.Sequence2-class.html doc/reference/html/VisionEgg.ParameterTypes.Sequence3-class.html doc/reference/html/VisionEgg.ParameterTypes.Sequence4-class.html doc/reference/html/VisionEgg.ParameterTypes.Sequence4x4-class.html doc/reference/html/VisionEgg.ParameterTypes.String-class.html doc/reference/html/VisionEgg.ParameterTypes.StringMC-class.html doc/reference/html/VisionEgg.ParameterTypes.SubClass-class.html doc/reference/html/VisionEgg.ParameterTypes.Unicode-class.html doc/reference/html/VisionEgg.ParameterTypes.UnicodeMC-class.html doc/reference/html/VisionEgg.ParameterTypes.UnsignedInteger-class.html doc/reference/html/VisionEgg.ParameterTypes.UnsignedIntegerMC-class.html doc/reference/html/VisionEgg.Parameters-class.html doc/reference/html/VisionEgg.PlatformDependent-module.html doc/reference/html/VisionEgg.PlatformDependent-pysrc.html doc/reference/html/VisionEgg.PyroApps-module.html doc/reference/html/VisionEgg.PyroApps-pysrc.html doc/reference/html/VisionEgg.PyroApps.AST_ext-module.html doc/reference/html/VisionEgg.PyroApps.AST_ext-pysrc.html doc/reference/html/VisionEgg.PyroApps.AST_ext.AST_Visitor-class.html doc/reference/html/VisionEgg.PyroApps.ColorCalGUI-module.html doc/reference/html/VisionEgg.PyroApps.ColorCalGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.ColorCalGUI.ColorCalControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.ColorCalGUI.ColorCalMetaParameters-class.html doc/reference/html/VisionEgg.PyroApps.ColorCalServer-module.html doc/reference/html/VisionEgg.PyroApps.ColorCalServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.ColorCalServer.ColorCalMetaController-class.html doc/reference/html/VisionEgg.PyroApps.DropinGUI-module.html doc/reference/html/VisionEgg.PyroApps.DropinGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.DropinGUI.DropinControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.DropinGUI.DropinMetaParameters-class.html doc/reference/html/VisionEgg.PyroApps.DropinServer-module.html doc/reference/html/VisionEgg.PyroApps.DropinServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.DropinServer.DropinMetaController-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI-module.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.AppWindow-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.BarButton-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.ContainedObjectBase-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.GammaFrame-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.ImageSequenceLauncher-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.Loop-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.LoopContainedObject-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.LoopParamDialog-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUI.ScrollListFrame-class.html doc/reference/html/VisionEgg.PyroApps.EPhysGUIUtils-module.html doc/reference/html/VisionEgg.PyroApps.EPhysGUIUtils-pysrc.html doc/reference/html/VisionEgg.PyroApps.EPhysGUIUtils.StimulusControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.EPhysServer-module.html doc/reference/html/VisionEgg.PyroApps.EPhysServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.EPhysServer.EPhysServer-class.html doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI-module.html doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI.FlatGratingControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.FlatGratingGUI.FlatGratingMetaParameters-class.html doc/reference/html/VisionEgg.PyroApps.FlatGratingServer-module.html doc/reference/html/VisionEgg.PyroApps.FlatGratingServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.FlatGratingServer.FlatGratingExperimentMetaController-class.html doc/reference/html/VisionEgg.PyroApps.GridGUI-module.html doc/reference/html/VisionEgg.PyroApps.GridGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.GridGUI.GridControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.GridGUI.GridMetaParameters-class.html doc/reference/html/VisionEgg.PyroApps.GridServer-module.html doc/reference/html/VisionEgg.PyroApps.GridServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.GridServer.GridMetaController-class.html doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI-module.html doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI.MouseTargetControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.MouseTargetGUI.MouseTargetMetaParameters-class.html doc/reference/html/VisionEgg.PyroApps.MouseTargetServer-module.html doc/reference/html/VisionEgg.PyroApps.MouseTargetServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.MousePositionController-class.html doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.MouseTargetExperimentMetaController-class.html doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.TargetOrientationController-class.html doc/reference/html/VisionEgg.PyroApps.MouseTargetServer.TargetPositionController-class.html doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI-module.html doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI.CallbackEntry-class.html doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.ScreenPositionGUI.ScreenPositionParameters-class.html doc/reference/html/VisionEgg.PyroApps.ScreenPositionServer-module.html doc/reference/html/VisionEgg.PyroApps.ScreenPositionServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.ScreenPositionServer.ScreenPositionMetaController-class.html doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI-module.html doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI.SphereGratingControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.SphereGratingGUI.SphereGratingMetaParameters-class.html doc/reference/html/VisionEgg.PyroApps.SphereGratingServer-module.html doc/reference/html/VisionEgg.PyroApps.SphereGratingServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.SphereGratingServer.SphereGratingExperimentMetaController-class.html doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI-module.html doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.SpinningDrumGUI.SpinningDrumMetaParameters-class.html doc/reference/html/VisionEgg.PyroApps.SpinningDrumServer-module.html doc/reference/html/VisionEgg.PyroApps.SpinningDrumServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.SpinningDrumServer.SpinningDrumExperimentMetaController-class.html doc/reference/html/VisionEgg.PyroApps.TargetGUI-module.html doc/reference/html/VisionEgg.PyroApps.TargetGUI-pysrc.html doc/reference/html/VisionEgg.PyroApps.TargetGUI.TargetControlFrame-class.html doc/reference/html/VisionEgg.PyroApps.TargetGUI.TargetMetaParameters-class.html doc/reference/html/VisionEgg.PyroApps.TargetServer-module.html doc/reference/html/VisionEgg.PyroApps.TargetServer-pysrc.html doc/reference/html/VisionEgg.PyroApps.TargetServer.TargetExperimentMetaController-class.html doc/reference/html/VisionEgg.PyroApps.VarTypes-module.html doc/reference/html/VisionEgg.PyroApps.VarTypes-pysrc.html doc/reference/html/VisionEgg.PyroClient-module.html doc/reference/html/VisionEgg.PyroClient-pysrc.html doc/reference/html/VisionEgg.PyroClient.PyroClient-class.html doc/reference/html/VisionEgg.PyroHelpers-module.html doc/reference/html/VisionEgg.PyroHelpers-pysrc.html doc/reference/html/VisionEgg.PyroHelpers.PyroConstantController-class.html doc/reference/html/VisionEgg.PyroHelpers.PyroEncapsulatedController-class.html doc/reference/html/VisionEgg.PyroHelpers.PyroEvalStringController-class.html doc/reference/html/VisionEgg.PyroHelpers.PyroExecStringController-class.html doc/reference/html/VisionEgg.PyroHelpers.PyroListenController-class.html doc/reference/html/VisionEgg.PyroHelpers.PyroLocalDictController-class.html doc/reference/html/VisionEgg.PyroHelpers.PyroServer-class.html doc/reference/html/VisionEgg.QuickTime-module.html doc/reference/html/VisionEgg.QuickTime-pysrc.html doc/reference/html/VisionEgg.QuickTime.MovieTexture-class.html doc/reference/html/VisionEgg.ResponseControl-module.html doc/reference/html/VisionEgg.ResponseControl-pysrc.html doc/reference/html/VisionEgg.ResponseControl.KeyboardResponseController-class.html doc/reference/html/VisionEgg.ResponseControl.ResponseController-class.html doc/reference/html/VisionEgg.SphereMap-module.html doc/reference/html/VisionEgg.SphereMap-pysrc.html doc/reference/html/VisionEgg.SphereMap.AzElGrid-class.html doc/reference/html/VisionEgg.SphereMap.SphereGrating-class.html doc/reference/html/VisionEgg.SphereMap.SphereMap-class.html doc/reference/html/VisionEgg.SphereMap.SphereWindow-class.html doc/reference/html/VisionEgg.TCPController-module.html doc/reference/html/VisionEgg.TCPController-pysrc.html doc/reference/html/VisionEgg.TCPController.SocketListenController-class.html doc/reference/html/VisionEgg.TCPController.TCPController-class.html doc/reference/html/VisionEgg.TCPController.TCPServer-class.html doc/reference/html/VisionEgg.Text-module.html doc/reference/html/VisionEgg.Text-pysrc.html doc/reference/html/VisionEgg.Text.BitmapText-class.html doc/reference/html/VisionEgg.Text.GlutTextBase-class.html doc/reference/html/VisionEgg.Text.StrokeText-class.html doc/reference/html/VisionEgg.Text.Text-class.html doc/reference/html/VisionEgg.Textures-module.html doc/reference/html/VisionEgg.Textures-pysrc.html doc/reference/html/VisionEgg.Textures.FixationCross-class.html doc/reference/html/VisionEgg.Textures.Mask2D-class.html doc/reference/html/VisionEgg.Textures.SpinningDrum-class.html doc/reference/html/VisionEgg.Textures.Texture-class.html doc/reference/html/VisionEgg.Textures.TextureFromFile-class.html doc/reference/html/VisionEgg.Textures.TextureObject-class.html doc/reference/html/VisionEgg.Textures.TextureStimulus-class.html doc/reference/html/VisionEgg.Textures.TextureStimulus3D-class.html doc/reference/html/VisionEgg.Textures.TextureStimulusBaseClass-class.html doc/reference/html/VisionEgg.Textures.TextureTooLargeError-class.html doc/reference/html/VisionEgg.ThreeDeeMath-module.html doc/reference/html/VisionEgg.ThreeDeeMath-pysrc.html doc/reference/html/VisionEgg.ThreeDeeMath.TransformMatrix-class.html doc/reference/html/VisionEgg.WrappedText-module.html doc/reference/html/VisionEgg.WrappedText-pysrc.html doc/reference/html/VisionEgg.WrappedText.WrappedText-class.html doc/reference/html/VisionEgg.darwin_getrefresh-module.html doc/reference/html/VisionEgg.darwin_getrefresh-pysrc.html doc/reference/html/VisionEgg.gl_qt-module.html doc/reference/html/VisionEgg.gl_qt-pysrc.html doc/reference/html/VisionEgg.posix_maxpriority-module.html doc/reference/html/VisionEgg.posix_maxpriority-pysrc.html doc/reference/html/VisionEgg.qtlowlevel-module.html doc/reference/html/VisionEgg.qtlowlevel-pysrc.html doc/reference/html/VisionEgg.qtlowlevel.QTNewMoviePropertyElement-class.html doc/reference/html/VisionEgg.qtlowlevel.Rect-class.html doc/reference/html/VisionEgg.qtlowlevel.qtlowlevelError-class.html doc/reference/html/VisionEgg.qtmovie-module.html doc/reference/html/VisionEgg.qtmovie-pysrc.html doc/reference/html/VisionEgg.qtmovie.Movie-class.html doc/reference/html/VisionEgg.qtmovie.Rect-class.html doc/reference/html/VisionEgg.win32_getrefresh-module.html doc/reference/html/VisionEgg.win32_getrefresh-pysrc.html doc/reference/html/VisionEgg.win32_maxpriority-module.html doc/reference/html/VisionEgg.win32_maxpriority-pysrc.html doc/reference/html/api-objects.txt doc/reference/html/class-tree.html doc/reference/html/crarr.png doc/reference/html/epydoc.css doc/reference/html/epydoc.js doc/reference/html/float-class.html doc/reference/html/frames.html doc/reference/html/help.html doc/reference/html/identifier-index.html doc/reference/html/index.html doc/reference/html/int-class.html doc/reference/html/module-tree.html doc/reference/html/redirect.html doc/reference/html/toc-VisionEgg-module.html doc/reference/html/toc-VisionEgg.Configuration-module.html doc/reference/html/toc-VisionEgg.Core-module.html doc/reference/html/toc-VisionEgg.Daq-module.html doc/reference/html/toc-VisionEgg.DaqKeyboard-module.html doc/reference/html/toc-VisionEgg.DaqLPT-module.html doc/reference/html/toc-VisionEgg.Deprecated-module.html doc/reference/html/toc-VisionEgg.Dots-module.html doc/reference/html/toc-VisionEgg.FlowControl-module.html doc/reference/html/toc-VisionEgg.GL-module.html doc/reference/html/toc-VisionEgg.GLTrace-module.html doc/reference/html/toc-VisionEgg.GUI-module.html doc/reference/html/toc-VisionEgg.Gratings-module.html doc/reference/html/toc-VisionEgg.MoreStimuli-module.html doc/reference/html/toc-VisionEgg.ParameterTypes-module.html doc/reference/html/toc-VisionEgg.PlatformDependent-module.html doc/reference/html/toc-VisionEgg.PyroApps-module.html doc/reference/html/toc-VisionEgg.PyroApps.AST_ext-module.html doc/reference/html/toc-VisionEgg.PyroApps.ColorCalGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.ColorCalServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.DropinGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.DropinServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.EPhysGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.EPhysGUIUtils-module.html doc/reference/html/toc-VisionEgg.PyroApps.EPhysServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.FlatGratingGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.FlatGratingServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.GridGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.GridServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.MouseTargetGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.MouseTargetServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.ScreenPositionGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.ScreenPositionServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.SphereGratingGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.SphereGratingServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.SpinningDrumGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.SpinningDrumServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.TargetGUI-module.html doc/reference/html/toc-VisionEgg.PyroApps.TargetServer-module.html doc/reference/html/toc-VisionEgg.PyroApps.VarTypes-module.html doc/reference/html/toc-VisionEgg.PyroClient-module.html doc/reference/html/toc-VisionEgg.PyroHelpers-module.html doc/reference/html/toc-VisionEgg.QuickTime-module.html doc/reference/html/toc-VisionEgg.ResponseControl-module.html doc/reference/html/toc-VisionEgg.SphereMap-module.html doc/reference/html/toc-VisionEgg.TCPController-module.html doc/reference/html/toc-VisionEgg.Text-module.html doc/reference/html/toc-VisionEgg.Textures-module.html doc/reference/html/toc-VisionEgg.ThreeDeeMath-module.html doc/reference/html/toc-VisionEgg.WrappedText-module.html doc/reference/html/toc-VisionEgg.darwin_getrefresh-module.html doc/reference/html/toc-VisionEgg.gl_qt-module.html doc/reference/html/toc-VisionEgg.posix_maxpriority-module.html doc/reference/html/toc-VisionEgg.qtlowlevel-module.html doc/reference/html/toc-VisionEgg.qtmovie-module.html doc/reference/html/toc-VisionEgg.win32_getrefresh-module.html doc/reference/html/toc-VisionEgg.win32_maxpriority-module.html doc/reference/html/toc-everything.html doc/reference/html/toc.html doc/visionegg/about.html doc/visionegg/contents.html doc/visionegg/controllers.html doc/visionegg/front.html doc/visionegg/hierarchy.html doc/visionegg/index.html doc/visionegg/node3.html doc/visionegg/node6.html doc/visionegg/visionegg.css doc/visionegg/visionegg.html swig_src/darwin_getrefresh.i swig_src/darwin_getrefresh.m swig_src/gl_qt.c swig_src/gl_qt.h swig_src/gl_qt.i swig_src/make.py swig_src/posix_maxpriority.c swig_src/posix_maxpriority.i swig_src/win32_getrefresh.c swig_src/win32_getrefresh.i swig_src/win32_maxpriority.c swig_src/win32_maxpriority.i test/conform.py test/display_dc_restoration.py test/display_voltage_regulation.py test/font_torture.py test/opengl_info.py test/reopen_screen.py test/unittests.py visionegg.egg-info/PKG-INFO visionegg.egg-info/SOURCES.txt visionegg.egg-info/dependency_links.txt visionegg.egg-info/top_level.txtvisionegg-1.2.1/visionegg.egg-info/top_level.txt0000644000076500000240000000013211231315556021105 0ustar astrawstaff_vegl darwin_maxpriority VisionEgg _darwin_getrefresh _darwin_sync_swap _gl_qt _draw_in_c