pax_global_header00006660000000000000000000000064112761734170014523gustar00rootroot0000000000000052 comment=365f8e3f4a9407551c2412d6010fd64f79d192ec pyepl-1.1.0+git12-g365f8e3/000077500000000000000000000000001127617341700147455ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/.gitignore000066400000000000000000000010221127617341700167300ustar00rootroot00000000000000*~ \#* \.\#* *.py[co] build *.so *.o *.bak code/hardware/eeg/pulse/parallel.py code/hardware/eeg/pulse/parallel_wrap.cxx code/hardware/eeg/pulse/pulse.c code/hardware/eeg/scalp/scalp.c code/hardware/eventpoll.c code/hardware/joystick.c code/hardware/keyboard.c code/hardware/mouse.c code/hardware/sound/eplSound.py code/hardware/sound/eplSound_wrap.cxx code/hardware/sound/soundFile.py code/hardware/sound/soundFile_wrap.cxx code/hardware/timing.c code/hardware/vr/avatar.c code/hardware/vr/environment.c code/hardware/vr/eyes.c pyepl-1.1.0+git12-g365f8e3/changelog.txt000066400000000000000000000021711127617341700174360ustar00rootroot00000000000000Version ?.?.? ------------- - Fixed a sound bug that cleared the recording buffer when you played a sound while trying to record. - Added ability to flush the recording buffer. Version 1.1.0 -------------- - Code now moved to git and hosted on alioth.debian.org. - We now have a change log. - New low-level screen flipping code that should more-accurately block on calls to updateScreen. - Removed spurious Numeric and replaced it with numpy. - New audio functionality to allow for looping and combining of audio clips. - Now can play movies via a pygame.Movie interface. - Convenience functions (such as micTest) no longer pass a color to clear so that you can customize your own color background. - showProportional now can either constrain that the showable stay in the screen (original/default behavior) or place the showable exactly where you ask, ignoring the size of the object. Thanks to fredclipr for pointing this out and providing the fix. - Added --show-fps option to show your frames per second. - Fixed anti-aliasing of text for non-black backgrounds. - Updated to use RtAudio version 4.0.5. pyepl-1.1.0+git12-g365f8e3/code/000077500000000000000000000000001127617341700156575ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/Makefile000066400000000000000000000023651127617341700173250ustar00rootroot00000000000000# PyEPL: Makefile # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. all: pyepl #manual #someday someone should make the manual work under OS X manual: FORCE $(MAKE) -C manual #pyepl: deps hardware pyepl: hardware deps: $(MAKE) -C dependencies hardware: FORCE $(MAKE) -C hardware clean: # quick and dirty find -iname \*.o -o -iname \*.so -exec rm \{\} \; #$(MAKE) -C hardware clean PLATFORM = $(shell uname) ifeq ($(PLATFORM), Linux) #mechinput.so: mechinput.o # gcc -shared mechinput.o -o mechinput.so #mechinput.o: mechinput.c # gcc -c -fPIC -I/usr/include/python2.3/ mechinput.c #mechinput.c: mechinput.pyx # pyrexc mechinput.pyx endif ifeq ($(PLATFORM), Darwin) #mechinput.so: mechinput.o # gcc -bundle -flat_namespace -undefined suppress mechinput.o -o mechinput.so #mechinput.o: mechinput.c # gcc -fPIC -c mechinput.c -I/System/Library/Frameworks/Python.framework/Versions/2.3/include/python2.3/ #mechinput.c: mechinput.pyx # pyrexc mechinput.pyx endif FORCE: docs: $(MAKE) -C documentation pyepl-1.1.0+git12-g365f8e3/code/__init__.py000066400000000000000000000021401127617341700177650ustar00rootroot00000000000000# PyEPL: __init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ PyEPL (Python Experiment Programming Library) is a package meant for programming psychology experiments. """ import hardware import timing import display import eeg import keyboard import joystick import sound import textlog import stimulus import transarchive import repository import pool import vr import os from version import vstr as __version__ initialized = False def initialize(**options): """ Prepare the PyEPL repository and hardware interfaces for use. """ global initialized if not initialized: initialized = True hardware.initialize(**options) def finalize(): """ Cleanly shut down the PyEPL repository and hardware interfaces. """ global initialized if initialized: hardware.finalize() initialized = False pyepl-1.1.0+git12-g365f8e3/code/base.py000066400000000000000000000135531127617341700171520ustar00rootroot00000000000000# PyEPL: base.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module defines useful base classes for objects to be stored in a repository. """ import pyepl.exceptions from transarchive import Archive import weakref import os class CarveError(pyepl.exceptions.EPLError): """ """ def __init__(self, obj): """ """ self.obj = obj def __str__(self): """ """ return "Attempt to modify a carved Carvable: %r" % self.obj class Carvable: """ This is a super-class for all objects that can be "carved in stone". In other words, they can be solidified so that their contents can never be changed again. """ def __init__(self): """ """ self.carved_in_stone = False def carve(self): """ """ self.carved_in_stone = True def isCarved(self): """ """ return self.carved_in_stone def aboutToChange(self): """ """ if self.carved_in_stone: raise CarveError(self) class Registry(type): """ Metaclass for classes to be registered for common services. """ extensionRegistry = {} encodeRegistry = {} decodeRegistry = {} trackTypes = {} def __new__(cls, name, bases, dict): """ """ t = type.__new__(cls, name, bases, dict) if hasattr(t, "logExtension"): Registry.extensionRegistry[t.logExtension] = t if hasattr(t, "trackTypeName"): Registry.trackTypes[t.trackTypeName] = t return t def loadFile(filename): """ Load the indicated file using the correct registered class. Return the resulting object. """ cls = Registry.extensionRegistry(os.path.splitext(filename)) directory, filename = os.path.split(filename) return cls(Archive(directory), os.path.splitext(filename)[0]) loadFile = staticmethod(loadFile) class Registered(object): """ Base instance of Registry metaclass. """ __metaclass__ = Registry class MediaFile(Registered): """ """ def load(self): # To be overridden """ """ pass def unload(self): # To be overridden """ """ pass def isLoaded(self): # To be overridden """ """ return True def loadedCall(self, f, *targs, **dargs): """ """ if self.isLoaded(): return f(*targs, **dargs) self.load() r = f(*targs, **dargs) return r class Track(Registered): """ This is a super-class for all formats that have values varying with time. These include sound, video, eeg, and textual logging. """ def __new__(cls, *targs, **dargs): """ Call Format constructor and then set most recently constructed instance. """ self = object.__new__(cls, *targs, **dargs) self.__class__.last_instance = weakref.ref(self) return self def __iter__(self): """ Generator to iterate through marked events in the track. Generates 3-tuples of (time stamps, maximum latencies), within tick order numbers, texts. """ return iter(lambda: None, None) # No marked events by default (better way?) def __del__(self): """ Clean up the Track """ self.stopLogging() self.flush() self.stopService() def export(self, archive, basename): """ Iterate through marked events writing string form to file. """ filename = basename + self.__class__.logExtension of = archive.createFile(filename) for (timestamp, maxlat), withintick, txt in self: of.write("%s\t%s\t%s\n" % (timestamp, maxlat, txt)) return filename def flush(self): # To be overridden """ """ pass def startLogging(self): # To be overridden """ """ pass def stopLogging(self): # To be overridden """ """ pass def startService(self): # To be overridden """ """ pass def stopService(self): # To be overridden """ """ pass def doAction(self, dotime, name, context): # To be overridden """ """ pass def getActions(self): # To be overridden """ """ pass def lastInstance(cls): """ Return the last constructed instance of this class (this class refers to the class it's called on, not just Track. If last instance does not exist, return None. """ try: return cls.__dict__["last_instance"]() except KeyError: return None lastInstance = classmethod(lastInstance) class MetaUniquelyConstructed(type): """ """ def __new__(cls, name, bases, dict): """ """ dict["loaded"] = weakref.WeakValueDictionary() return type.__new__(cls, name, bases, dict) class UniquelyConstructed(object): """ """ __metaclass__ = MetaUniquelyConstructed def __new__(cls, *targs, **dargs): """ """ try: return cls.loaded[(targs, tuple(dargs.items()))] except KeyError: return object.__new__(cls, *targs, **dargs) def __init__(self, *targs, **dargs): """ """ if not self in self.__class__.loaded.values(): self.__class__.loaded[(targs, tuple(dargs.items()))] = self self.__uinit__(*targs, **dargs) def __uinit__(self, *targs, **dargs): # to be overridden """ """ pass pyepl-1.1.0+git12-g365f8e3/code/calibration.py000066400000000000000000000042741127617341700205270ustar00rootroot00000000000000# PyEPL: calibration.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides a uniform way to calibrate devices which may differ in performance across machines and over time. """ from repository import reposRoot class Calibrator: """ This is a super-class for classes designed to calibrate a certain type of device. """ def __init__(self, name): """ Initialize. """ self.name = name def restoreCalibration(self): """ Restore correctly calibrated hardware and software settings. """ if self.isCalibrated(): self.restore(reposRoot["calibration"][self.name]()) def testCalibration(self): """ Verify that the current settings are correct. """ if not self.isCalibrated(): return False return self.test(reposRoot["calibration"][self.name]()) def calibrate(self): """ Determine the correct calibration settings (perhaps interactively). """ if not reposRoot.exists("calibration"): reposRoot["calibration"] = Directory() reposRoot["calibration"][self.name] = Wrap(self.cal()) def isCalibrated(self): """ Return True if a calibration has be stored for this device. Otherwise return False. """ if not reposRoot.exists("calibration"): reposRoot["calibration"] = Directory() return False return reposRoot["calibration"].exists(self.name) # Methods to be overridden by inheritor: def restore(self, cal): """ Restore calibration indicated by object cal. """ pass def test(self, cal): """ Test calibration indicated by object cal. """ pass def cal(self): """ Calibrate, return a picklable object that will be 'understood' by the restore and test methods. """ pass pyepl-1.1.0+git12-g365f8e3/code/convenience.py000066400000000000000000001123021127617341700205240ustar00rootroot00000000000000# PyEPL: convenience.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides onvenience functions for writing experiments with pyepl. """ import display import sound from keyboard import Key, KeyTrack import joystick from mouse import MouseRoller, MouseButton import keyboard import mechinput import hardware from textlog import LogTrack import exputils import math, numpy, pygame import timing # method for setting realtime def setRealtime(period=120, computation=9600, constraint=1200): """ Turns on realtime priority and attempts to keep the processor percentage below 100% so that the scheduler does not deplete the resources. VR experiments tend to maintain too high use of the processor to make realtime worthwhile. You can optionally tweak the RT configuration with period, computation, and constraint as a function of the bus speed of the machine. Be careful not to make the ratio between period and computation too large or you will prevent the sound from functioning properly. Please see this website for minimal details on RT priority on OSX: http://developer.apple.com/documentation/Darwin/Conceptual/KernelProgramming/scheduler/chapter_8_section_4.html """ hardware.rt.set_realtime_priority(period,computation,constraint) hardware.eventpoll.isRealtime = 1 instructing = False def getInstructing(): global instructing return instructing # Instruction functions: def instructBegin(text, font = None, size = None, color = None, scroll = None, requireseenall = True, page_amount = None, scroll_speed = 0.2, leftmargin = 0.05, rightmargin = 0.05, topmargin = 0.05, justification = "LEFT"): """ Initialize and draw the instruction text on the screen. This function is normally called by the wrapper function instruct, but you could implement it on your own if needed. INPUT ARGS: (Please see the instruct method.) """ # set up globals (used to remember status between insruct-related calls)... global inst_v global inst_resx global inst_resy global inst_font global inst_size global inst_color global inst_lines global inst_seenall global inst_position global inst_lastrend global inst_drawn global inst_scroll global inst_maxpos global inst_log global inst_topmargin global instructing assert not instructing, "instructBegin cannot be called while instructions are already shown" instructing = True # get the VideoTrack inst_v = display.VideoTrack.lastInstance() # get the screen resolution inst_resx, inst_resy = inst_v.getResolution() # calculate the top margin in pixels inst_topmargin = topmargin * inst_resy # use the font defaults where needed... if font: inst_font = font else: inst_font = display.defaultFont if size: inst_size = size else: inst_size = display.defaultFontSize if color: inst_color = color else: inst_color = display.defaultFontColor # use the font's wordWrap method to get a list of Text objects, each representing a line of text line_texts = inst_font.wordWrap(text, inst_size, inst_color, inst_resx - (inst_resy * (leftmargin + rightmargin))) # start with an empty list for 2-tuples of line Text objects and left padding amounts inst_lines = [] # calculate left padding for each line... if justification == "LEFT": # if the justification is "left" put the left side of the texts at the left margin... for line_text in line_texts: inst_lines.append((line_text, leftmargin * inst_resy)) elif justification == "RIGHT": # if the justification is "right" put the right side of the texts at the right margin... for line_text in line_texts: inst_lines.append((line_text, inst_resx - rightmargin * inst_resy - line_text.getSize()[0])) elif justification == "CENTER": # uf the justification is "center" center the texts between the margins... for line_text in line_texts: inst_lines.append((line_text, (leftmargin * inst_resy) + (inst_resx - (leftmargin + rightmargin) * inst_resy) / 2 - line_text.getSize()[0] / 2)) # persistently load texts for line_text in line_texts: line_text.requireLoaded() # at start, the user has not seen all of the text inst_seenall = False # we start with position 0.0 at the top of the screen inst_position = 0.0 # last position rendered starts as -1 (nothing rendered yet) inst_lastrend = -1 # start with nothing drawn on the screen inst_drawn = [] # if scroll is not given, create our own roller... if scroll == None: if not page_amount: # if page amount is not given generate one based on the hight of the screen page_amount = inst_resy * 0.75 # initialize a list of component scollers to empty scrollers = [] # append a vertical mouse roller scrollers.append(MouseRoller(1)) # append the keyboard paging controls scrollers.append(mechinput.NotchRoller((Key("PAGE UP"), -page_amount), (Key("PAGE DOWN"), page_amount), (Key("SPACE"), page_amount))) # append the keyboard smooth scrolling scrollers.append(mechinput.ButtonRoller(Key("DOWN"), Key("UP"), scroll_speed)) # append the joystick speed controlled scrolling scrollers.append(mechinput.AxisRoller(joystick.JoyAxis(0, 1))) # put all those rollers together inst_scroll = mechinput.JointRoller(*scrollers) else: # scroll was given, so just use it inst_scroll = scroll.echo() # we want to fill a screenfull before maxpos becomes positive inst_maxpos = -inst_resy + inst_topmargin for line, leftpadding in inst_lines: # increase maxpos by the vertical size of all the lines combined inst_maxpos += line.getSize()[1] # if maxpos is still negative (i.e. there was less than a screenfull)... if inst_maxpos < 0.0: # ...make it zero inst_maxpos = 0.0 # create a log for the instructions inst_log = LogTrack("instruct") # mark the start of the instructions in the log inst_log.logMessage("INSTRUCTIONSTART\t%s\t%s\t%d\t%r\t%r" % (inst_scroll.name, inst_font.filename, int(inst_resy * inst_size), inst_color, text)) def instructStep(): """ This method waits for a keypress and will handle the scrolling of the instruction text. """ # set up globals (used to remember status between insruct-related calls)... global inst_v global inst_resx global inst_resy global inst_font global inst_size global inst_color global inst_lines global inst_seenall global inst_position global inst_lastrend global inst_drawn global inst_scroll global inst_maxpos global inst_log global inst_topmargin # poll for events at each step hardware.pollEvents() # update position based on how much the scroll roller has moved inst_position += inst_scroll.getChange() # if position has become negative... if inst_position < 0.0: # ...clamp it to zero inst_position = 0.0 # if it's gone above the maximum position... elif inst_position > inst_maxpos: # ...clamp it to the maximum position inst_position = inst_maxpos # we're at the maximum position... if inst_position == inst_maxpos: # ...then we've shown all the text - set seenall to True inst_seenall = True # round position to an integer for rendering thisrend = int(inst_position) # if the integer position (pixel position) has changed since the last step... if thisrend != inst_lastrend: # set lastrend to thisrend inst_lastrend = thisrend # unshow all the drawn text inst_v.unshow(*inst_drawn) # clear the drawn list inst_drawn = [] # the top of the first line is thisrend pixels above the top of the screen index = -thisrend + inst_topmargin # iterate through the lines (Text objects)... for line, leftpadding in inst_lines: if index >= inst_resy: # if we've gone off the end of the screen, break the loop, since no more text will be visible break # get the height of the line lh = line.getSize()[1] # if the index is greater than minus the line height (i.e. if any part of the text is low enough to be visible)... if index > -lh: # show the line inst_drawn.append(inst_v.show(line, leftpadding, index)) # increment index by the line height index += lh # update the screen, noting the timestamp timestamp = inst_v.updateScreen() # note the scrolling in the log inst_log.logMessage("INSTRUCTIONSCROLL\t%d" % thisrend, timestamp) def instructSeenAll(): """ Return if they have seen all the instructions. """ global inst_seenall # return the seenall global variable return inst_seenall def instructEnd(exitbutton = None, clk = None): """ Clean up after seeing all the instructions. INPUT ARGS: exitbutton- Optional exit button that was pressed. """ # set up globals (used to remember status between insruct-related calls)... global inst_v global inst_resx global inst_resy global inst_font global inst_size global inst_color global inst_lines global inst_seenall global inst_position global inst_lastrend global inst_drawn global inst_scroll global inst_maxpos global inst_log global instructing # unshow all drawn text inst_v.unshow(*inst_drawn) # allow texts to be unloaded for line, leftpadding in inst_lines: line.unrequireLoaded() # update the screen, noting the timestamp timestamp = inst_v.updateScreen(clk) # tare the clock to the screen update time... # This is now done in the call to updateScreen #if clk: # clk.tare(timestamp) if exitbutton: # if exitbutton is given, mark the end of the instructions in the log along with the exitbutton inst_log.logMessage("INSTRUCTIONSTOP\t%s" % exitbutton.name, timestamp) else: # otherwise, just mark the end of the instructions in the log inst_log.logMessage("INSTRUCTIONSTOP", timestamp) # clean up all the global variables used for instructions... del inst_v del inst_resx del inst_resy del inst_font del inst_size del inst_color del inst_lines del inst_seenall del inst_position del inst_lastrend del inst_drawn del inst_scroll del inst_maxpos del inst_log instructing = False def instruct(text, font = None, size = None, color = None, scroll = None, exitbutton = None, requireseenall = True, pausevideolog = True, page_amount = None, scroll_speed = 0.2, leftmargin = 0.1, rightmargin = 0.1, topmargin = 0.1, justification = "LEFT", clk = None): """ Display text on the screen, usually the instructions for your experiment. INPUT ARGS: text- Instructions to show. font/size/color- Font attibutes of the text scroll- Optional roller object to override keyboard scrolling. exitbutton- Optional alternative Button object used for exiting. requireseenall- False will let the user exit without viewing the entire text. pausevideolog- False will continue to log all refreshes of the screen during scrolling (It's usually good to keep this as True). page_amount- Optionally indicate the number of pixels of displacement for page ups and downs. scroll_speed- Optionally override the default scroll speed in pixels per millisecond of scrolling with the up and down arrow keys. leftmargin- left margin as a fraction of the height of the display. rightmargin- right margin as a fraction of the height of hte display. topmargin- top margin as a fraction of the height of the display. justification- Justification mode: "LEFT" - left justified "RIGHT" - right justified "CENTER" - centered """ # set up globals (used to remember status between insruct-related calls)... #global inst_v #global inst_seenall # set up the instructions instructBegin(text, font, size, color, scroll, requireseenall, page_amount, scroll_speed) if exitbutton == None: # if the exit button is not given, use our own exitbutton = Key("RETURN") | joystick.JoyButton(0, 0) | MouseButton(0) # if we want to pause video logging... if pausevideolog: # remember whether or not it was logging already videowaslogging = inst_v.logall # stop the VideoTrack logging inst_v.stopLogging() # keep looping... #while True: # if (inst_seenall or not requireseenall) and exitbutton.isPressed(): # # ...until the exit button is pressed and any seenall requirement is met # break # # do an instruction step at each iteration # instructStep() inst_v.renderLoop(instructLoopCallback, requireseenall, exitbutton) if pausevideolog and videowaslogging: # unpause video logging inst_v.startLogging() # finalize the instrucitons instructEnd(exitbutton, clk = clk) def instructLoopCallback(ts, requireseenall, exitbutton): # set up globals (used to remember status between insruct-related calls)... global inst_v global inst_seenall if (inst_seenall or not requireseenall) and exitbutton.isPressed(): return False instructStep() return True def waitForAnyKey(clk = None, showable = None, x = 0.5, y = 0.5, excludeKeys=None): """ Wait for any key to be pressed. Optionally you can pass in a showable to be displayed at the coordinants x,y. (Where is the Any key???) INPUT ARGS: clk- Optional PresentationClock for timing. showable- Text/Image object to display. x,y- Proportional coordinants of where to display the showable. excludeKeys- Optional keys to ignore, such as ['T','Q'] """ if excludeKeys: # decide which keys to wait for knames = [] for kname in hardware.keyNames(): if kname not in excludeKeys: knames.append(kname) # if a showable is given... if showable: # get the VideoTrack v = display.VideoTrack.lastInstance() # show the showable shown = v.showProportional(showable, x, y) # update the screen (using the clock object) v.updateScreen(clk) # get the keytrack k = KeyTrack.lastInstance() # wait for a key press if excludeKeys: bc = k.keyChooser(*knames) else: bc = k.keyChooser() but,timestamp = bc.waitWithTime(clock=clk) # if we displayed a showable... if showable: # ...unshow it v.unshow(shown) # and update the screen again v.updateScreen(clk) def buttonChoice(clk = None, **buttons): """ Wait for a combination of buttons, returning which one was pressed. See the example below to see how to use it. INPUT ARGS: clk- Optional PresentationClock for timing. **buttons- Keyword args, where the arg. name is the name for the button and the arg is the button itself. EXAMPLE: response = buttonChoice(clk=clock, yes=Key('Y'), no=Key('N')) if response == "yes" # they pressed Y pass else # the pressed N pass """ # wait for one of the buttons to be pressed button, timestamp = mechinput.ButtonChooser(*buttons.values()).waitWithTime(clock=clk) # iterate over the keyword arguments searching for the button that was pressed... for key, value in buttons.items(): # when we find it... if value is button: # ...return the keyword name return key def micTest(recDuration = 2000, ampFactor = 1.0, clk = None, excludeKeys=None): """ Microphone test function. Requires VideoTrack, AudioTrack, KeyTrack to already exist. INPUT ARGS: recDuration- Duration to record during the test. ampFactor- Amplification factor for playback of the sound. clk- Optional PresentationClock for timing. OUTPUT ARGS: status- True if you should continue the experiment. False if the sound was not good and you should quit the program. """ v = display.VideoTrack.lastInstance() a = sound.AudioTrack.lastInstance() k = keyboard.KeyTrack.lastInstance() if clk is None: clk = exputils.PresentationClock() done = False while not done: v.clear() v.showProportional(display.Text("Microphone Test",size = .1), .5, .1) waitForAnyKey(clk,showable=display.Text("Press any key to\nrecord a sound after the beep."), excludeKeys=excludeKeys) # clear screen and say recording beep1 = sound.Beep(400, 500, 100) beep1.present(clk) t = v.showCentered(display.Text("Recording...",color=(1,0,0))) v.updateScreen(clk) (testsnd,x) = a.record(recDuration, t=clk) v.unshow(t) v.updateScreen(clk) # play sound t = v.showCentered(display.Text("Playing...")) v.updateScreen(clk) a.play(testsnd,t=clk, ampFactor=ampFactor) v.unshow(t) v.updateScreen(clk) # ask if they were happy with the sound t = v.showCentered(display.Text("Did you hear the recording?")) v.showRelative(display.Text("(Y=Continue / N=Try Again / C=Cancel)"),display.BELOW,t) v.updateScreen(clk) response = buttonChoice(clk, yes = (Key('Y') | Key('RETURN')), no = Key('N'), cancel = Key('C')) status = True if response == "cancel": status = False elif response == "no": # do it again continue done = True # clear before returning v.clear() return status def presentStimuli(stimuli, attribute, duration, clk = None, on_jitter = None, ISI = None, ISI_jitter = None): """ Present stimuli using their default present method. INPUT ARGS: stimuli- A Pool of stimuli to present. attribute- The attribute to present, like 'image', 'sound', or 'stimtext' duration/on_jitter- The duration to display the stimulus. ISI/ISI_jitter- The blank ISI between stimuli. """ if clk is None: clk = exputils.PresentationClock() # loop over the stimuli for stim in stimuli.iterAttr(attribute): # show the stimuli stim.present(clk, duration, on_jitter) # do the isi between stimuli if ISI is not None: clk.delay(ISI,ISI_jitter) def flashStimulus(showable, duration = 1000, x = 0.5, y = 0.5, jitter = None, clk = None): """ Flash a showable on the screen for a specified duration. INPUT ARGS: showable- Object to display. duration- Duration to display the image. x,y- Location of the showable. jitter- Amount to jitter the presentation duration. clk- PresentationClock for timing. OUTPUT ARGS: timestamp- Time/latency when stimulus was presented on the screen. """ if clk is None: # if no PresentationClock is given, create one clk = exputils.PresentationClock() # get the VideoTrack v = display.VideoTrack.lastInstance() # show the stimulus shown = v.showProportional(showable, x, y) # update the screen timestamp = v.updateScreen(clk) # delay clk.delay(duration, jitter) # unshow the stimulus v.unshow(shown) # update the screen v.updateScreen(clk) # return ontime return timestamp def recognition(targets,lures,attribute, clk = None, log = None, duration = None, jitter = None, minDuration = None, ISI = None, ISI_jitter = None, targetKey = "RCTRL", lureKey = "LCTRL", judgeRange = None): """ Run a generic recognition task. You supply the targets and lures as Pools, which get randomized and presented one at a time awaiting a user response. The attribute defines which present method is used, such as image, sound, or stimtext This function generates two types of log lines, one for the presentation (RECOG_PRES) and the other for the response (RECOG_RESP). The columns in the log files are as follows: RECOG_PRES -> ms_time, max dev., RECOG_PRES, Pres_type, What_present, isTarget RECOG_RESP -> ms_time, max dev., RECOG_RESP, key_pressed, RT, max dev. isCorrect INPUT ARGS: targets- Pool of targets. lures- Pool of lures. attribute- String representing the Pool attribute to present. clk- Optional PresentationClock log- Log to put entries in. If no log is specified, the method will log to recognition.log. duration/jitter- Passed into the attribute's present method. Jitter will be ignored since we wait for a keypress. minDuration- Passed into the present method as a min time they must wait before providing a response. ISI/ISI_jitter- Blank ISI and jitter between stimuli, after a response if given. targetKey- String representing the key representing targets. lureKey- String representing the key for the lure response. judgeRange- Tuple of strings representing keys for confidence judgements. If provided will replace targetKey and lureKey OUTPUT ARGS: TO DO: Try and see if mixed up the keys (lots wrong in a row) Pick percentage of targets from each list. """ # get the tracks v = display.VideoTrack.lastInstance() a = sound.AudioTrack.lastInstance() k = keyboard.KeyTrack.lastInstance() # see if there is a presentation clock if not clk: clk = exputils.PresentationClock() # see if need logtrack if log is None: log = LogTrack('recognition') # Log start of recognition log.logMessage('RECOG_START') # add an attribute to keep track of them for stim in targets: stim.isTarget = True for stim in lures: stim.isTarget = False # concatenate the targets and lures stims = targets + lures # randomize them stims.shuffle() # make the ButtonChooser if not judgeRange: # use the target and lure keys provided bc = mechinput.ButtonChooser(Key(targetKey), Key(lureKey)) else: # use the range #bc = mechinput.ButtonChooser(*map(lambda x: Key(str(x)), xrange(*judgeRange))) bc = mechinput.ButtonChooser(*map(Key,judgeRange)) # delay before first stim if wanted if ISI: clk.delay(ISI,ISI_jitter) # present and wait for response for stim in stims: # optionally put answer choices up # present stimulus prestime,button,bc_time = getattr(stim,attribute).present(clk = clk, duration = duration, jitter = jitter, bc = bc, minDuration = minDuration) # clear the optional answer choices # see if target or not if stim.isTarget: isT = 1 else: isT = 0 # Process the response if button is None: # They did not respone in time # Must give message or something bname = "None" #isCorrect = -1 else: # get the button name bname = button.name #isCorrect = -1 # delay if wanted if ISI: clk.delay(ISI,ISI_jitter) # Log it, once for the presentation, one for the response log.logMessage('RECOG_PRES\t%s\t%s\t%d' % (attribute,stim.name,isT), prestime) log.logMessage('RECOG_RESP\t%s\t%ld\t%d' % (bname,bc_time[0]-prestime[0],bc_time[1]+prestime[1]),bc_time) # Log end of recognition log.logMessage('RECOG_END') def mathDistract(clk = None, mathlog = None, problemTimeLimit = None, numVars = 2, maxNum = 9, minNum = 1, maxProbs = 50, plusAndMinus = False, minDuration = 20000, textSize = None, correctBeepDur = 500, correctBeepFreq = 400, correctBeepRF = 50, correctSndFile = None, incorrectBeepDur = 500, incorrectBeepFreq = 200, incorrectBeepRF = 50, incorrectSndFile = None, tfKeys = None, ansMod = [0,1,-1,10,-10], ansProb = [.5,.125,.125,.125,.125], visualFeedback = False): """ Math distractor for specified period of time. Logs to a math_distract.log if no log is passed in. INPUT ARGS: clk - Optional PresentationClock for timing. mathlog - Optional Logtrack for logging. problemTimeLimit - set this param for non-self-paced distractor; buzzer sounds when time's up; you get at least minDuration/problemTimeLimit problems. numVars - Number of variables in the problem. maxNum - Max possible number for each variable. minNum - Min possible number for each varialbe. maxProbs - Max number of problems. plusAndMinus - True will have both plus and minus. minDuration - Minimum duration of distractor. textSize - Vertical height of the text. correctBeepDur - Duration of correct beep. correctBeepFreq - Frequency of correct beep. correctBeepRF - Rise/Fall of correct beep. correctSndFile - Optional Audio clip to use for correct notification. incorrectBeepDur - Duration of incorrect beep. incorrectBeepFreq - Frequency of incorrect beep. incorrectBeepRF - Rise/Fall of incorrect beep incorrectSndFile - Optional AudioClip used for incorrect notification. tfKeys - Tuple of keys for true/false problems. e.g., tfKeys = ('T','F') ansMod - For True/False problems, the possible values to add to correct answer. ansProb - The probability of each modifer on ansMod (must add to 1). visualFeedback - Whether to provide visual feedback to indicate correctness. """ # start the timing start_time = timing.now() # get the tracks v = display.VideoTrack.lastInstance() a = sound.AudioTrack.lastInstance() k = keyboard.KeyTrack.lastInstance() # see if need logtrack if mathlog is None: mathlog = LogTrack('math_distract') # log the start mathlog.logMessage('START') # start timing if clk is None: clk = exputils.PresentationClock() # set the stop time if not minDuration is None: stop_time = start_time + minDuration else: stop_time = None # generate the beeps correctBeep = sound.Beep(correctBeepFreq,correctBeepDur,correctBeepRF) incorrectBeep = sound.Beep(incorrectBeepFreq,incorrectBeepDur,incorrectBeepRF) # clear the screen (now left up to caller of function) #v.clear("black") # generate a bunch of math problems vars = numpy.random.randint(minNum,maxNum+1,[maxProbs, numVars]) if plusAndMinus: pm = numpy.sign(numpy.random.uniform(-1,1,[maxProbs, numVars-1])) else: pm = numpy.ones([maxProbs, numVars-1]) # see if T/F or numeric answers if isinstance(tfKeys,tuple): # do true/false problems tfProblems = True # check the ansMod and ansProb if len(ansMod) != len(ansProb): # raise error pass if sum(ansProb) != 1.0: # raise error pass ansProb = numpy.cumsum(ansProb) else: # not t/f problems tfProblems = False # set up the answer button if tfProblems: # set up t/f keys ans_but = k.keyChooser(*tfKeys) else: # set up numeric entry ans_but = k.keyChooser('0','1','2','3','4','5','6','7','8','9','-','RETURN', '[0]','[1]','[2]','[3]','[4]','[5]','[6]', '[7]','[8]','[9]','[-]','ENTER','BACKSPACE') # do equations till the time is up curProb = 0 while not (not stop_time is None and timing.now() >= stop_time) and curProb < maxProbs: # generate the string and result # loop over each variable to generate the problem probtxt = '' for i,x in enumerate(vars[curProb,:]): if i > 0: # add the sign if pm[curProb,i-1] > 0: probtxt += ' + ' else: probtxt += ' - ' # add the number probtxt += str(x) # calc the correct answer cor_ans = eval(probtxt) # add the equal sign probtxt += ' = ' # do tf or numeric problem if tfProblems: # determine the displayed answer # see which answermod ansInd = numpy.nonzero(ansProb >= numpy.random.uniform(0,1)) if isinstance(ansInd,tuple): ansInd = ansInd[0] ansInd = min(ansInd) disp_ans = cor_ans + ansMod[ansInd] # see if is True or False if disp_ans == cor_ans: # correct response is true corRsp = tfKeys[0] else: # correct response is false corRsp = tfKeys[1] # set response str rstr = str(disp_ans) else: rstr = '' # display it on the screen pt = v.showProportional(display.Text(probtxt,size = textSize),.4,.5) rt = v.showRelative(display.Text(rstr, size = textSize),display.RIGHT,pt) probstart = v.updateScreen(clk) # wait for input answer = .12345 # not an int hasMinus = False if problemTimeLimit: probStart = timing.now() probEnd = probStart + problemTimeLimit curProbTimeLimit = probEnd - probStart else: curProbTimeLimit = None # wait for keypress kret,timestamp = ans_but.waitWithTime(maxDuration = curProbTimeLimit, clock=clk) # process as T/F or as numeric answer if tfProblems: # check the answer if not kret is None and kret.name == corRsp: isCorrect = 1 else: isCorrect = 0 else: # is part of numeric answer while kret and \ ((kret.name != "RETURN" and kret.name != "ENTER") or \ (hasMinus is True and len(rstr)<=1) or (len(rstr)==0)): # process the response if kret.name == 'BACKSPACE': # remove last char if len(rstr) > 0: rstr = rstr[:-1] if len(rstr) == 0: hasMinus = False elif kret.name == '-' or kret.name == '[-]': if len(rstr) == 0 and plusAndMinus: # append it rstr = '-' hasMinus = True elif kret.name == 'RETURN' or kret.name == 'ENTER': # ignore cause have minus without number pass elif len(rstr) == 0 and (kret.name == '0' or kret.name == '[0]'): # Can't start a number with 0, so pass pass else: # if its a number, just append numstr = kret.name.strip('[]') rstr = rstr + numstr # update the text rt = v.replace(rt,display.Text(rstr,size = textSize)) v.updateScreen(clk) # wait for another response if problemTimeLimit: curProbTimeLimit = probEnd - timing.now() else: curProbTimeLimit = None kret,timestamp = ans_but.waitWithTime(maxDuration = curProbTimeLimit,clock=clk) # check the answer if len(rstr)==0 or eval(rstr) != cor_ans: isCorrect = 0 else: isCorrect = 1 # give feedback if isCorrect == 1: # play the beep pTime = a.play(correctBeep,t=clk,doDelay=False) #clk.tare(pTime[0]) #correctBeep.present(clk) # see if set color of text if visualFeedback: pt = v.replace(pt,display.Text(probtxt,size=textSize,color='green')) rt = v.replace(rt,display.Text(rstr, size=textSize, color='green')) v.updateScreen(clk) clk.delay(correctBeepDur) else: # play the beep pTime = a.play(incorrectBeep,t=clk,doDelay=False) #clk.tare(pTime[0]) #incorrectBeep.present(clk) # see if set color of text if visualFeedback: pt = v.replace(pt,display.Text(probtxt,size=textSize,color='red')) rt = v.replace(rt,display.Text(rstr, size=textSize, color='red')) v.updateScreen(clk) clk.delay(incorrectBeepDur) # calc the RT as (RT, maxlatency) prob_rt = (timestamp[0]-probstart[0],timestamp[1]+probstart[1]) # log it # probstart, PROB, prob_txt, ans_txt, Correct(1/0), RT mathlog.logMessage('PROB\t%r\t%r\t%d\t%ld\t%d' % (probtxt,rstr,isCorrect,prob_rt[0],prob_rt[1]), probstart) # clear the problem v.unshow(pt,rt) v.updateScreen(clk) # increment the curprob curProb+=1 # log the end mathlog.logMessage('STOP',timestamp) # tare the clock # PBS: Why set the time back to when the last button was pressed? #clk.tare(timestamp) class StatusBar: """ Manages two rectangles, one drawn inside the other. The inner rectange shrinks to show progress. The recangles may be oriented vertically, in which case progress occurs from bottom to top, or horizontally, in which case progress occurs from right to left. """ def __init__(self, width, height, startFraction=.5, totalSteps = 100, fullColor=(255, 255, 255), emptyColor=(0, 0, 0), fringeWidthPx=2): # do the full part self.fullDim = (width, height) self.fullColor = fullColor # do the empty part self.emptyDim = [0, 0] self.emptyOffset = [fringeWidthPx, fringeWidthPx] self.emptyColor = emptyColor self.fringeWidthPx = fringeWidthPx if width>height: # it's horizontal # assuming we fill from L to R self.fillDimension = 0 self.staticDimension = 1 else: # it's vertical # assuming we fill bottom to top self.fillDimension = 1 self.staticDimension = 0 self.emptyDim[self.fillDimension] = int(self.fullDim[self.fillDimension]*startFraction - fringeWidthPx) self.emptyDim[self.staticDimension] = int(self.fullDim[self.staticDimension] - 2*fringeWidthPx) if self.fillDimension==0: self.emptyOffset[self.fillDimension] = int(startFraction* (self.fullDim[self.fillDimension] - 2*fringeWidthPx) + fringeWidthPx) self.pixelsPerStep = int(math.ceil((1-startFraction)*(self.fullDim[self.fillDimension] - 2*fringeWidthPx)/totalSteps)) def getImage(self): # draw the larger rectangle self.fullSurf = pygame.Surface(self.fullDim) self.fullSurf.fill(self.fullColor) # draw the smaller rectangle self.emptySurf = pygame.Surface(tuple(self.emptyDim)) self.emptySurf.fill(self.emptyColor) # superimpose the smaller one on the larger one self.fullSurf.blit(self.emptySurf, tuple(self.emptyOffset)) return display.Image(hardware.graphics.LowImage(self.fullSurf)) def increment(self, coefficient=1): # we always want to decrease emptyDim if self.emptyDim[self.fillDimension] > coefficient*self.pixelsPerStep and \ self.emptyDim[self.fillDimension] < self.fullDim[self.fillDimension] - coefficient*self.pixelsPerStep: self.emptyDim[self.fillDimension] -= coefficient*self.pixelsPerStep if self.fillDimension==0: # if it's horizontal, we also want to increase emptyOffset if self.emptyOffset[self.fillDimension] < self.fullDim[self.fillDimension] - (self.fringeWidthPx + coefficeint*self.pixelsPerStep) and \ self.emptyOffset[self.fillDimension] > coefficient*self.pixelsPerStep: self.emptyOffset[self.fillDimension] += coefficient*self.pixelsPerStep pyepl-1.1.0+git12-g365f8e3/code/display.py000066400000000000000000002144001127617341700176770ustar00rootroot00000000000000# PyEPL: display.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides graphics abstractions. """ import textlog from base import Carvable, Track, Registered, MediaFile, UniquelyConstructed import hardware import timing import threading #import PIL.Image # catch error here! import os import weakref import exputils from stimulus import Stimulus import pygame # Get the PyEPL directory (used below to find the default font) pyepldir = os.path.abspath(os.path.dirname(__file__)) # Use the Color class from the hardware.graphics.image module Color = hardware.graphics.image.Color # Define positional relations: NORTH = 0 NORTHEAST = 1 EAST = 2 SOUTHEAST = 3 SOUTH = 4 SOUTHWEST = 5 WEST = 6 NORTHWEST = 7 CENTER = 8 BELOW = 9 ABOVE = 10 LEFT = 11 RIGHT = 12 OVER = 13 class Showable: """ An object which may be displayed in the basic video output layer. """ def __init__(self): self.loadRequireCount = 0 def requireLoaded(self): self.loadRequireCount += 1 if not self.isLoaded(): self.load() def unrequireLoaded(self): self.loadRequireCount -= 1 if self.loadRequireCount < 0: self.loadRequireCount = 0 if self.loadRequireCount == 0 and \ self.isLoaded() and \ (hasattr(self,'filename') and not self.filename is None): self.unload() def show(self, x, y): # to be overridden """ Draw this object. """ pass def getSize(self): # to be overridden """ Return a 2-tuple representing the X and Y dimensions of this showable in pixels. """ return (0, 0) def logLine(self): # to be overridden """ Log the object. """ return "SHOWABLE" def isLoaded(self): """ Returns true if the showable is loaded in memory, otherwise returns false. """ return True def load(self): """ Loads the object into memory. """ pass def unload(self): """ Unloads the object from memory. """ pass class Shown: """ Instances of this class are meant to act as unique identifiers for an instance of a showable on the screen. They also provide information for the size and placement of the showable, as well as a dictionary of anchor points (anchor[NORTH], anchor[SOUTHWEST], ...) for use in placing other showables. """ def __init__(self, x, y, width, height): """ Create a shown object. """ # set up the values self.x = x self.y = y self.width = width self.height = height # calculate the anchors self.anchor = {} self.anchor[CENTER] = (x + (width / 2), y + (height / 2)) self.anchor[NORTH] = (x + (width / 2), y) self.anchor[NORTHEAST] = (x + width, y) self.anchor[EAST] = (x + width, y + (height / 2)) self.anchor[SOUTHEAST] = (x + width, y + height) self.anchor[SOUTH] = (x + (width / 2), y + height) self.anchor[SOUTHWEST] = (x, y + height) self.anchor[WEST] = (x, y + (height / 2)) self.anchor[NORTHWEST] = (x, y) class ActiveShowable(Showable): """ Showable that must be continually refreshed. """ def logLine(self): # to be overridden """ Log the object. """ return "ACTIVESHOWABLE" class Image(UniquelyConstructed, Carvable, Showable, Stimulus): """ Represents an image. """ # def __uinit__(self, x, propxsize = 0.5, propysize = 0.5): def __uinit__(self, x, propxsize = None, propysize = None): """ Creates a new Image object. INPUT ARGS: x- Data used to construct Image. Can be the filename of an image file, or a LowImage object. propxsize- (optional) size of the X dimension of the Image. specified as a fraction of the Y dimension of the screen. propysize- (optional) size of the y dimension of the Image. specified as a fraction of the Y dimension of the screen. ... """ Carvable.__init__(self) Showable.__init__(self) # save the proportional dimensions... self.propxsize = propxsize self.propysize = propysize if isinstance(x, hardware.graphics.LowImage): # if the parameter is a LowImage object, just wrap it self.img = x self.img_unscaled = x self.filename = None else: # otherwise, assume it's a filename self.filename = x self.img = None self.img_unscaled = None # set empty logline self.logLineStr = 'IMAGE' def getLow(self): """ Returns the LowImage object associated with this Image. OUTPUT ARGS: r- a reference to the new LowImage object. """ if self.img: # if it's loaded, just return it return self.img # otherwise, load it, unload it (keeping a reference), and return it self.load() r = self.img self.unload() return r def getLowUnscaled(self): """ """ if self.img: return self.img_unscaled self.load() r = self.img_unscaled self.unload() return r def load(self): """ After calling this method, the image data is gauranteed to be loaded into primary memory. If keepLoadedAfterSmartShow is set to True, the image will not be unloaded after it is shown with SmartShow. """ if not self.img: # if it's not already loaded, load it by constructing a LowImage object... # if there are no proportional dimensions... if self.propxsize is None or self.propysize is None: # construct the LowImage without scaling self.img = hardware.graphics.LowImage(self.filename) # set the unscaled image to be the normal one self.img_unscaled = self.img # and we're done return # try to get the VideoTrack v = VideoTrack.lastInstance() # if there is a VideoTrack... if v: # get the screen's vertical resolution yres = v.getResolution()[1] # calculate the pixel dimensions for the image based on the vertical resolution and the proportional dimensions xs = int(yres * self.propxsize) ys = int(yres * self.propysize) # construct the LowImage self.img_unscaled = hardware.graphics.LowImage(self.filename) # scale it self.img = self.img_unscaled.scale(xs, ys) else: # no VideoTrack... # construct the LowImage without scaling self.img = hardware.graphics.LowImage(self.filename) # set the unscaled image to be the normal one self.img_unscaled = self.img # set the proportional dimensions to None... self.propxsize = None self.propysize = None def unload(self): """ After calling this method, the Image's data is unloaded from memory. """ # unload by removing our internal reference to the LowImage object self.img = None self.img_unscaled = None def isLoaded(self): """ Checks if this object is actually loaded into memory. OUTPUT ARGS: b- True if the object is loaded in memory, False if not. """ # check whether or not it's loaded by seeing if we have an internal reference to a LowImage object return not self.img is None def __getstate__(self): """ Don't give the image data to pickle. """ # remove the LowImage object before pickle looks at the data (because LowImages are not picklable) d = self.__dict__.copy() del d["img"] try: del d["img_unscaled"] except KeyError: pass return d def __setstate__(self, state): """ After unpickling, the image is NOT loaded. """ # unpickle with None as self.image (since we left it out when we pickled) self.__dict__.update(state) self.img = None def export(self, archive, namehint): """ Export image. """ pass #... def setLogLine(self): """ Set the ID for the video log. XXX IMPORTANT XXX We will eventually have to call this every time the image is changed. XXX IMPORTANT XXX """ # get the image's pixel size xs, ys = self.getSize() # return the log line self.logLineStr = "IMAGE\t%s\t%d\t%d" % (self.filename, xs, ys) def logLine(self): """ Identify this image for the video log. """ return self.logLineStr def __getitem__(self, index): """ Two dimensional indexing and slicing. """ # make sure it's loaded first self.load() # index or slice the LowImage r = self.img[index] # if we get a LowImage back, wrap it with a new Image object and return that if isinstance(r, hardware.graphics.LowImage): return Image(r) # otherwise, return the color value we got from it return r def __setitem__(self, index, value): """ Index and slice assignment. """ # make sure the image is not "carved in stone" self.aboutToChange() # make sure it's loaded already self.load() # Set the value or slice in the LowImage self.img[index] = value def __mul__(self, x): """ Color multiplication. """ # make sure the image is loaded self.load() # multiply the LowImages and return the result wrapped in an Image object return Image(self.img * x) def __div__(self, x): """ Color division. """ # make sure the image is loaded self.load() # divide the LowImages and return the result wrapped in an Image object return Image(self.img / x) def __add__(self, x): """ Color addition. """ # make sure the image is loaded self.load() # add the LowImages and return the result wrapped in an Image object return Image(self.img + x) def __sub__(self, x): """ Color subtraction. """ # make sure the image is loaded self.load() # subtract the LowImages and return the result wrapped in an Image object return Image(self.img - x) def __neg__(self): """ Color inversion. """ # make sure the image is loaded self.load() # negate the LowImages and return the result wrapped in an Image object return Image(-self.img) def scale(self, x, y): """ Rescales the image to the specified x, y proportions of the screen. """ # make sure the image is loaded self.load() # try to get the VideoTrack v = VideoTrack.lastInstance() # if there is a VideoTrack... if v: # get the screen's vertical resolution yres = v.getResolution()[1] # calculate the pixel dimensions for the image based on the vertical resolution and the proportional dimensions xs = int(yres * x) ys = int(yres * y) # scale the LowImages and return the result wrapped in an Image object return Image(self.img_unscaled.scale(int(xs), int(ys)), x, y) def apply(self, f): """ Apply function f to all pixels of image for result. f can accept just a Color or a Color and and x, y tuple for position. """ # make sure the image is loaded self.load() # apply the LowImage and function and return the result wrapped in an Image object return Image(self.img.apply(x)) def getSize(self): """ Return an x, y tuple for image dimensions. """ # make sure the image is loaded self.load() # return the size of the LowImage return self.img.getSize() def show(self, x, y): """ Put this image on the screen at x, y. """ # make sure the image is loaded self.load() # have the LowImage draw itself at the specified coordinates self.img.show(x, y) # set the logLine self.setLogLine() def present(self, clk = None, duration = None, jitter = None, bc = None, minDuration = None): """ Present an image on the screen. If a ButtonChooser is provided, present ignores the jitter and clears the stimulus once a button is pressed or the duration waiting for a response is exceeded. INPUT ARGS: clk- Optional PresentationClock to update. duration/jitter- Duration to display the stimulus. bc- Optional ButtonChooser object. minDuration- Used in combination with bc to specify a minimum time that a stimulus must be presented before a keypress to the bc is accepted. OUTPUT ARGS: timestamp- time and latency of when the image came on the screen. button- Button pressed if we passed in bc. bc_time- Time and latency of when the button was pressed (if provided) """ v = VideoTrack.lastInstance() # get the clock if needed if clk is None: clk = exputils.PresentationClock() # show the image t = v.showCentered(self) timestamp = v.updateScreen(clk) if bc: # wait for button press button,bc_time = bc.waitWithTime(minDuration,duration,clk) else: clk.delay(duration,jitter) # unshow that image v.unshow(t) v.updateScreen(clk) if bc: return timestamp,button,bc_time else: return timestamp # New Movie Class class Movie(UniquelyConstructed, Showable, Stimulus): """ Represents a movie. In PyEPL, movies are rendered onto an image surface, which you must first show (via one of the many show methods in the VideoTrack). Once a movie surface is shown, you can start and stop playback with the playMovie and stopMovie methods of the VideoTrack. When you are done playing a movie, you can then unshow the image where the movie was projected. """ def __uinit__(self, x): """ Creates a new Movie object. It uses pygame to play the movie, so it only supports mpg files. INPUT ARGS: x- Data used to construct Movie. Can be the filename of an movie file, or a pygame.movie.Movie object. ... """ Showable.__init__(self) if isinstance(x, pygame.movie.MovieType): # if the parameter is a Movie object, just wrap it self.movie = x self.filename = None self.img = None else: # otherwise, assume it's a filename self.filename = x self.movie = None self.img = None # set empty logline self.logLineStr = 'MOVIE' def load(self): """ After calling this method, the image data is gauranteed to be loaded into primary memory. If keepLoadedAfterSmartShow is set to True, the image will not be unloaded after it is shown with SmartShow. """ if self.movie is None: # create the movie instance self.movie = pygame.movie.Movie(self.filename) if self.img is None: # Create a surface where pygame will render the movie self._render_surf = pygame.Surface(self.movie.get_size()) # Tell the movie to render frames to that new surface self.movie.set_display(self._render_surf) # Create a LowImage for performing the OpenGL blitting of the # movie frames to the actual OpenGL surface that we use self.img = hardware.graphics.LowImage(self._render_surf) def unload(self): """ After calling this method, the Movie's data is unloaded from memory. """ # stop playing if we are self.stop() # unload by removing our internal reference to the LowImage object self._render_surf = None self.img = None self.movie = None def isLoaded(self): """ Checks if this object is actually loaded into memory. OUTPUT ARGS: b- True if the object is loaded in memory, False if not. """ # check whether or not it's loaded by seeing if we have an # internal reference to a LowImage object return not self.img is None def __getstate__(self): """ Don't give the image data to pickle. """ # remove the Movie and LowImage objects before pickle looks at # the data (because LowImages are not picklable) d = self.__dict__.copy() for todel in ['img','movie','_render_surf']: try: del d[todel] except KeyError: pass return d def __setstate__(self, state): """ After unpickling, the movie is NOT loaded. """ # unpickle with None as self.image (since we left it out when # we pickled) self.__dict__.update(state) self.img = None self.movie = None self._render_surf = None def export(self, archive, namehint): """ Export image. """ raise NotImplementedError #... def setLogLine(self): """ Set the ID for the video log. XXX IMPORTANT XXX We will eventually have to call this every time the movie is changed. XXX IMPORTANT XXX """ # get the movie's pixel size xs, ys = self.getSize() # return the log line self.logLineStr = "MOVIE\t%s\t%d\t%d\t%d" % \ (self.filename, xs, ys, self.getTotalTime()) def logLine(self): """ Identify this movie for the video log. """ return self.logLineStr def getSize(self): """ Return an x, y tuple for movie dimensions. """ # make sure the image is loaded self.load() # return the size of the LowImage return self.img.getSize() def show(self, x, y): """ Put this image on the screen at x, y. """ # make sure the image is loaded self.load() # see if we have to update the frame if self.hasNewFrame(): self._updateFrame() # have the LowImage draw itself at the specified coordinates self.img.show(x, y) # set the logLine self.setLogLine() def hasNewFrame(self): """ See if the movie has a new frame ready. """ if not self.isLoaded(): self.load() return self.movie.get_frame() != self._prevFrame def _updateFrame(self): """ Update the surface with the current movie frame. """ # set the gl_texture to be dirty so it can be updated self.img.gl_texture_dirty = True # clean the image to which the movie will render # this will render the new frame to the surface self.img.cleanGLTexture() # save the current frame self._prevFrame = self.movie.get_frame() def play(self,loops=0): # make sure we are loaded self.load() # reset the previous frame self._prevFrame = None self._latest_timestamp = None # start playing self.movie.play(loops) def pause(self): # only pause if was running if self.movie and self.movie.get_busy(): # pause it self.movie.pause() # # remove the playing callback # removePollCallback(self._playMovieCallback) def stop(self): # stop the movie if playing if self.movie and self.movie.get_busy(): self.movie.stop() # # remove the poll callback # removePollCallback(self._playMovieCallback) # reset the previous frame self._prevFrame = None def getCurrentFrame(self): if self.movie: return self.movie.get_frame() def getElapsedTime(self): if self.movie: return long(self.movie.get_time()*1000) def getTotalTime(self): if self.movie: return long(self.movie.get_length()*1000) def getRemainingTime(self): if self.movie: return long((self.movie.get_length() - self.movie.get_time())*1000) def present(self, clk = None, duration = None, jitter = None, bc = None, minDuration = None): """ Present an movie on the screen. If a ButtonChooser is provided, present ignores the jitter and clears the stimulus once a button is pressed or the duration waiting for a response is exceeded. INPUT ARGS: clk- Optional PresentationClock to update. duration/jitter- Duration to display the stimulus. bc- Optional ButtonChooser object. minDuration- Used in combination with bc to specify a minimum time that a stimulus must be presented before a keypress to the bc is accepted. OUTPUT ARGS: timestamp- time and latency of when the movie came on the screen. button- Button pressed if we passed in bc. bc_time- Time and latency of when the button was pressed (if provided) """ v = VideoTrack.lastInstance() # get the clock if needed if clk is None: clk = exputils.PresentationClock() # do the auto delay if no duration is provided if not bc and not duration: doDelay = True else: doDelay = False # show the image shown_movie = v.showCentered(self) # show the movie timestamp = v.playMovie(self,t=clk,doDelay=doDelay) if bc: # wait for button press button,bc_time = bc.waitWithTime(minDuration,duration,clk) elif duration: clk.delay(duration,jitter) # stop the movie v.stopMovie(self,t=clk) # unshow that image v.unshow(shown_movie) v.updateScreen(clk) if bc: return timestamp,button,bc_time else: return timestamp class Font(MediaFile): """ Represents a graphical font. """ def __init__(self, filename): """ Create font object from TrueType font file. """ # save the filename self.filename = filename # while the font is not loaded, self.font is None self.font = None def load(self): """ After this call, the font is guaranteed to be loaded into primary memory. """ if not self.font: # if it's not loaded already, set self.font to a LowFont object from the saved filename self.font = hardware.graphics.LowFont(self.filename) def unload(self): """ """ # remove the internal reference to the LowFont object self.font = None def isLoaded(self): """ """ # do we have a LowFont object? return bool(self.font) def __getstate__(self): """ Don't give the internal font object to pickle. """ # LowFont objects are not picklable, so we remove them before pickle does its thang d = self.__dict__.copy() del d["font"] return d def __setstate__(self, state): """ After unpickling, the font is NOT loaded. """ # since we excluded self.font from the pickle, we need to set self.font to None when we unpickle self.__dict__.update(state) self.font = None def export(self, archive, namehint): """ Export font. """ pass #... def write(self, text, size, color): """ Return an object representing a rendition of the string text with the specified size and color in this font. """ # return a text object return Text(text, self, size, color) def wordWrap(self, text, size, color, width): """ Like write, but instead return a list of text objects where each item represents a line with text word wrapped to width. """ # make sure we can access the global variables dealing with font defaults global defaultFont global defualtFontSize global defaultFontColor # use font defaults where needed if color: color = Color(color) else: color = defaultFontColor if not size: size = defaultFontSize # calculate the font size in pixels (from its proportional size) truesize = int(VideoTrack.lastInstance().getResolution()[1] * size) # make sure the font is loaded self.load() # split up the text by paragraph breaks para = text.split("\n\n") # start a list of paragraphs paragraphs = [] # for each paragraph (between paragraph breaks)... for p in para: # remove leading and trailing white space and replace newlines with spaces p = p.lstrip().rstrip().replace("\n", " ") # if there anything left after that... if len(p): # start a list of words in the paragraph words = [] # split up the paragraph at spaces for word in p.split(" "): # for each resulting string that's not empty... if len(word): # add the word to the word list words.append(word) # add the word list to the paragraph list paragraphs.append(words) # start a list to hold the text objects result = [] # iterate over the paragraphs (each one is a list of words)... for words in paragraphs: # start with the first word of the paragraph wordbase = 0 # set the limit to the length of the paragraph (in words) wordlimit = len(words) # as long as we haven't placed all the words yet... while wordbase != wordlimit: # construct a string - a potential line line = " ".join(words[wordbase : wordlimit]) # find out how long it would be if we rendered it lwidth, lheight = self.font.getSize(line, truesize) if lwidth > width: # if it's to big for our width, take off one of the words and try again wordlimit -= 1 else: # otherwise, append the appropriate Text object to the result result.append(Text(line, self, size, color)) # reset the word base so only the remaining words of the paragraph will be placed wordbase = wordlimit # reset the word limit so the rest of the paragraph will be placed wordlimit = len(words) # add a blank line after each paragraph result.append(Text("", self, size, color)) # return the lines return result # create the initial font defaults... defaultFont = Font(os.path.join(pyepldir, "resources", "vera.ttf")) defaultFontSize = 0.0625 defaultFontColor = Color("white") def setDefaultFont(font = None, size = None, color = None): global defaultFont global defaultFontSize global defaultFontColor # set the defaults given... if font: defaultFont = font if size: defaultFontSize = size if color: defaultFontColor = color class Text(Showable, Stimulus): """ Represents a string of text rendered with a certain font, color, and size. """ def __init__(self, text, font = None, size = None, color = None): """ Create text object. """ # make sure we can access the global variables dealing with font defaults global defaultFont global defualtFontSize global defaultFontColor Showable.__init__(self) # split the text into lines self.text = text.split("\n") # use the font defaults where needed... if color: self.color = Color(color) else: self.color = defaultFontColor if not size: self.propsize = defaultFontSize else: self.propsize = size if font: self.font = font else: self.font = defaultFont # set the rendered text to None (not rendered) self.rendered = None def __getstate__(self): """ Don't give the rendered form to pickle. """ # remove the LowImage object before pickle looks at the data (because LowImages are not picklable) d = self.__dict__.copy() del d["rendered"] return d def __setstate__(self, state): """ After unpickling, the text should NOT be rendered. """ # unpickle with None as self.image (since we left it out when we pickled) self.__dict__.update(state) self.rendered = None def render(self): # make sure the font is loaded self.font.load() # calculate the pixel size of the text (from the given proportional size) self.size = int(VideoTrack.lastInstance().getResolution()[1] * self.propsize) # start rendered as an empty list self.rendered = [] # for each line of text... for t in self.text: # ...append the rendered line self.rendered.append(self.font.font.write(t, self.size, self.color.getTuple())) def unrender(self): """ Delete all the rendered text. """ self.rendered = [] def load(self): """ Wrapper to render. """ self.render() def unload(self): """ Wrapper to unrender. """ self.unrender() def isLoaded(self): """ Tell if the text is rendered. """ return bool(self.rendered) def show(self, x, y): """ Draw the image on the screen. """ # if the text isn't yet rendered... if not self.rendered: self.render() # get the size of the rendered text xsize, ysize = self.getSize() # calculate the horizontal center of the text area xplushalfxsize = x + (xsize / 2) # for each rendered line of text... for i in self.rendered: # get the size of the line ixsize, iysize = i.getSize() # show the line in a position such that it is horizontally centered in the text area i.show(xplushalfxsize - (ixsize / 2), y) # move the y position down the correct amount for the next line y += iysize def setXYSize(self): if self.rendered: # if it's been rendered, we'll get the size from the LowImage objects... self.xsize = 0 self.ysize = 0 for i in self.rendered: # iterate through the LowImage objects, getting the sum of y sizes and the maximum of x sizes x, y = i.getSize() self.xsize = max(self.xsize, x) self.ysize += y else: # in it hasn't been rendered... # make sure the font is loaded self.font.load() self.xsize = 0 self.ysize = 0 for t in self.text: # iterate through the lines of text, getting the sum of y sizes and the maximum of x sizes # we query the font object for how large the text would be if rendered x, y = self.font.font.getSize(t, self.size) self.xsize = max(self.xsize, x) self.ysize += y return self.xsize, self.ysize def getSize(self): """ Return x, y dimensions of text. """ try: # if we've already calculated the size of the text, just return it return self.xsize, self.ysize except AttributeError: # othersize... self.render() return self.setXYSize() def setColor(self, color): #set the color self.color = Color(color) #re-render self.render() def setSize(self, size): self.propsize = size self.render() self.setXYSize() def setFont(self, font): self.font = font self.render() self.setXYSize() def logLine(self): """ Identify this text for the video log. """ return "TEXT\t%s\t%d\t%s\t%r" % (self.font.filename, self.size, self.color, "\n".join(self.text)) def present(self, clk = None, duration = None, jitter = None, bc = None, minDuration = None): """ Present an text on the screen. If a ButtonChooser is provided, present ignores the jitter and clears the stimulus once a button is pressed or the duration is exceeded. INPUT ARGS: clk- Optional PresentationClock to update. duration/jitter- Duration to display the stimulus. bc- Optional ButtonChooser object OUTPUT ARGS: timestamp- time and latency of when the text came on the screen. button- Button pressed if we passed in bc. bc_time- Time and latency of when the button was pressed (if provided) """ v = VideoTrack.lastInstance() # get the clock if needed if clk is None: clk = exputils.PresentationClock() # show the image t = v.showCentered(self) timestamp = v.updateScreen(clk) if bc: # wait for button press button,bc_time = bc.waitWithTime(minDuration,duration,clk) else: clk.delay(duration,jitter) v.unshow(t) v.updateScreen(clk) if bc: return timestamp,button,bc_time else: return timestamp class CompoundStimulus(Stimulus): """ Comibine multiple stimuli into a single compound stimulus that you can present at once. """ def __init__(self,stimuli): """ stimuli = [(Name,[Text,Image],[ABS,PROP,REL],[LOC,(Relation,Name)]), ...] Create a CompoundStimulus object, which groups a set of showable objects. The constructor taks a single argument, which is a list of 4-tuples. The 4-tuples are of the form: string-label, stimulus-object, location-specification-mode, location. The string-label can be any string. The stimulus-object can be an instance of Text or Image. Location-specification-mode can be one of: 'ABS', 'PROP', and 'REL'. The form of the location field will depend on the value of location-specification-mode. If location-specification-mode is 'ABS', then the fourth field must be a 2-tuple containing the x- and y-coordinates (in pixels) for displaying the the showable. If location-specification-mode is 'PROP', then the fourth field must be a 2-tuple containing the x- and y screen fractions for displaying the the showable (e.g., (.6, .1) puts the showable 3/5ths of the way from the left edge, and 1/10th down from the top edge). If location-specification-mode is 'REL', the fourth field must be a 2- (or 3-) tuple whose first dimension contains the one of the relations: BELOW, ABOVE, LEFT, RIGHT, OVER. The second dimension of must be the text-label of another showable in the list. The (optional) 3rd dimension is used as the offset to adjust the relational location. The first stimulus in the list can not be displayed using relative location-specification. If location-specification-mode is 'ANCHOR', the fourth field must be a 2- (up to 4-) tuple specifying first, the anchor on the stim to show with CENTER, NORTH, NORTHWEST, ..., second, the relative starting position as a 2-tuple of an (x,y) location or the text-label and anchor point of a shown ('jubba',NORTHEAST). You can optionally provide an offset in proportional units or pixels as the third part of the tuple, but the fourth part must be set to False if you want to provide the offset in pixels and not proportional units. ('cool',stim,'ANCHOR',(CENTER, propToPixel(.25,.75), (.1,.15), True)) Example: """ self.stimuli = stimuli def show(self): # loop and show the stimuli, keeping track of the showns in a # dictionary referenced by Name self.showns = {} v = VideoTrack.lastInstance() for label, stim, specMode, location in self.stimuli: if specMode=='ABS': self.showns[label] = v.show(stim, location[0], location[1]) elif specMode=='PROP': self.showns[label] = v.showProportional(stim, location[0], location[1]) elif specMode=='REL': # check that relatum-label exists relatum = location[1] if relatum not in self.showns.keys(): raise ValueError, "Invalid target for relative location: " % relatum if len(location)==2: self.showns[label] = v.showRelative(stim, location[0], self.showns[relatum]) elif len(location)==3: self.showns[label] = v.showRelative(stim, location[0], self.showns[relatum], location[2]) elif specMode=='ANCHOR': # get the anchor of the stim anchor = location[0] # determine the relative position relPos = location[1] if type(relPos[0]) is str: # must determine based on a shown and relPos = self.showns[relPos[0]].anchor[relPos[1]] # see about offset and isProportional offset = (0,0) isProp = True if len(location) > 2: offset = location[2] if len(location) > 3: isProp = location[3] # show the showable with all the anchor info self.showns[label] = v.showAnchored(stim, anchor, relPos, offset, isProp) else: raise ValueError, "Invalid location specification mode %s" % specMode def unshow(self): v = VideoTrack.lastInstance() # loop and unshow the showns keyslist = self.showns.keys() for key in keyslist: v.unshow(self.showns[key]) def present(self, clk = None, duration = None, jitter = None, bc = None, minDuration = None): """ Present a CompoundStimulus on the screen. If a ButtonChooser is provided, present ignores the jitter and clears the stimulus once a button is pressed or the duration is exceeded. INPUT ARGS: clk- Optional PresentationClock to update. duration/jitter- Duration to display the stimulus. bc- Optional ButtonChooser object OUTPUT ARGS: timestamp- time and latency of when the text came on the screen. button- Button pressed if we passed in bc. bc_time- Time and latency of when the button was pressed (if provided) """ v = VideoTrack.lastInstance() # get the clock if needed if clk is None: clk = exputils.PresentationClock() self.show() timestamp = v.updateScreen(clk) if bc: # wait for button press button,bc_time = bc.waitWithTime(minDuration,duration,clk) else: clk.delay(duration,jitter) self.unshow() v.updateScreen(clk) if bc: return timestamp,button,bc_time else: return timestamp class SolidBackground(Showable): # change this to handle any rectangular region """ Draw the same color to every pixel on the screen regardless of showing position. """ def __init__(self, color): """ Create SolidBackground object. """ Showable.__init__(self) # save the color self.color = color def show(self, x, y): """ Clear the screen to the correct color. """ # paint the whole screen with the saved color hardware.clearScreen(self.color) def logLine(self): """ Log the background color. """ return "BG\t%s" % (self.color,) class VideoTrack(textlog.LogTrack): """ A track for video output. """ # set the track's registry info... logExtension = ".vidlog" trackTypeName = "VideoTrack" def __init__(self, basename, archive = None, autoStart = True): """ Create the VideoTrack. """ # call the LogTrack constructor textlog.LogTrack.__init__(self, basename, archive, autoStart) # list of things that should be displayed when the screen is next updated self.pending = [] # list of things on the screen now self.onscreen = [] # number of active showables represented in the onscreen list self.activepending = 0 # default to no minimum frame duration (no maximum framerate) self.minframeduration = 0L # initialize the last_updated timestamp self.last_updated = (0L, 0L) # start with no update callbacks self.update_callbacks = [] # list of calls to make after the screen is updated self.do_after_update = [] # list of currently playing movies self._playing_movies = [] def startLogging(self): """ Begin logging all basic video output. """ # call the LogTrack's startLogging method textlog.LogTrack.startLogging(self) # log the current resolution self.logResolution() def startService(self): """ Initialize video output. """ # create the window hardware.startVideo() # save the resolution self.screensize = hardware.getResolution() self.showFPS = hardware.getShowFPS() def stopService(self): """ Finalize video output. """ # close the window hardware.stopVideo() def logResolution(self): """ Note the resolution and windowedness in the video log. """ # figure out if we're full screen or in a window and set fs to be an appropriate string in a tuple to note the mode in the log message if hardware.getFullscreen(): fs = ("Fullscreen",) else: fs = ("Window",) # log the resolution and mode self.logMessage("R\t%d\t%d\t%s" % (self.screensize + fs)) def toggleFullscreen(self): """ Toggle the fullscreen status of the display. """ # toggle hardware.toggleFullscreen() # log the resolution again self.logResolution() def setCaption(self, caption): """ Set window caption. """ # set the caption hardware.setCaption(caption) def setMaximumFramerate(self, fps = None): """ Set a framerate limit. None means no limit. This can be used to enforce a particular framerate. """ if fps: # if fps is provided, calculate and set the minimum frame duration self.minframeduration = 1000L / fps else: # otherwise, set it to zero self.minframeduration = 0L def getResolution(self): """ Return an x, y tuple of the screen's resolution. """ # return the saved resolution return self.screensize def clear(self, color = None, keep_background=True): """ Clear basic video. Make a color background or no background in unspecified. """ # clear by unshowing all the pending items # get list of pending items if color != None or keep_background==False: # remove them all toclear = [p[0] for p in self.pending] else: # keep any background color they have set toclear = [] for p in self.pending: if not isinstance(p[1], SolidBackground): toclear.append(p[0]) # unshow what we've selected self.unshow(*toclear) # if a color is provided we want to show that after we've removed everything else... if color != None: # create a SolidBackground object bg = SolidBackground(Color(color)) # show the background, returning the shown object return self.show(bg, 0, 0) def show(self, showable, x, y): """ Draw a basic video element. """ # persistently load the showable showable.requireLoaded() # create a new Shown object to represent this instance of the showable on the screen shown = Shown(x,y,*showable.getSize()) # add the shown, showable, and position to the pending list self.pending.append((shown, showable, x, y)) if isinstance(showable, ActiveShowable): # if it's an active showable, increment the activingpending count self.activepending += 1 # return the shown return shown def showProportional(self, showable, x, y, constrain=True): """ showProportional displays a showable, with its position specified as a proportion of the width and height of the whole screen, such that (0.5,0.5) is the center. The original (default) implementation of this was designed so that objects would be placed at the edge (but not spilling out) of the screen when the proportion was set to 0 or 1. Leave constrain=True to keep this behavior. However, in retrospect, it makes more sense for these proportion values to refer to the center of the object, such that the object is 50% off the screen when the proportions are 0 or 1. For this behavior, set constrain=False. See http://sourceforge.net/forum/forum.php?thread_id=1871462&forum_id=548620 for a clear demonstration of these two behaviors. """ # get the size of the showable objectsize = showable.getSize() if constrain: # calculate the correct pixel position (for the upper left corner) based on the showable size and the screen size position = (int((self.screensize[0] - objectsize[0]) * x), int((self.screensize[1] - objectsize[1]) * y)) else: # center the object at the specified position without the # constraint that the object must be fully in the screen position = (int((self.screensize[0] * x) - (objectsize[0] / 2)), int((self.screensize[1] * y) - (objectsize[1] / 2))) # show the showable at the calculated position, returning the Shown object return self.show(showable, *position) def showCentered(self, showable): """ """ # do a showProportional with coordinates (0.5, 0.5) return self.showProportional(showable, 0.5, 0.5) def showRelative(self, showable, relation, shown, offset = 0): """ Show a showable relative to another shown object. You can optionally specify an offset in the relative direction. Relations can be one of BELOW, ABOVE, LEFT, RIGHT, OVER. The offset does not apply to the OVER relation. """ # iterate through the pending list looking for the shown specified... for xshown, xshowable, x, y in self.pending: # when we find it... if xshown is shown: # get the size of the associated showable xs, ys = xshowable.getSize() # get the size of the new showable xs2, ys2 = showable.getSize() # calculate the pixel position based on the sizes and positions of the showables and which relation is used... if relation is BELOW: position = (x + (xs / 2) - (xs2 / 2), y + ys + offset) elif relation is ABOVE: position = (x + (xs / 2) - (xs2 / 2), y - ys2 - offset) elif relation is LEFT: position = (x - xs2 - offset, y + (ys / 2) - (ys2 / 2)) elif relation is RIGHT: position = (x + xs + offset, y + (ys / 2) - (ys2 / 2)) elif relation is OVER: position = (x + (xs / 2) - (xs2 / 2), y + (ys / 2) - (ys2 / 2)) else: # raise an exception if the relation provided is not recognized raise ValueError, "Invalid positional relation: %r" % relation # show the new showable at the calculated position, returning the Shown object return self.show(showable, *position) # if we never found a matching Shown, raise an exception raise ValueError, "Shown not present." def propToPixel(self, x, y): """ Convert proportional coordinates to actual pixel values. Returns a tuple for the actal position in pixels. """ return (int(self.screensize[0]*x),int(self.screensize[1]*y)) def showAnchored(self, showable, anchor, relPosition, offset = (0,0), isProp = True): """ Place a showable relative to any point on the screen or another showable, using anchor points on the showable. FUNCTION: shown = showAnchored(showable,anchor,relPosition, offset=(0,0), isProp=True) INPUT ARGS: showable - Showable to place. anchor - Anchor point on the showable (NORTH, SOUTH, EAST, WEST, NORTHWEST, NORTHEAST, SOUTHWEST, SOUTHEAST, CENTER) relPosition - Screen position in pixels. You can use propToPixel or a shown object (shown.NorthWest, shown.Center) to specify the pixel position. offset - Offset in pixels or proportional units (see isProp arg) from the relPosition to place the showable by its anchor. isProp - Whether the offset is in pixels or proportional units. OUTPUT ARGS: shown - The object that was shown. """ # get the width and height of the showable width, height = showable.getSize() # see if must convert offset from proportional units if isProp: offset = (int(self.screensize[0] * offset[0]), int(self.screensize[1] * offset[1])) # adjust the position based on the desired anchor if anchor is SOUTHWEST: adjust = (0, -height) elif anchor is WEST: adjust = (0, -(height/2)) elif anchor is NORTHWEST: adjust = (0, 0) elif anchor is NORTH: adjust = (-(width/2), 0) elif anchor is NORTHEAST: adjust = (-width, 0) elif anchor is EAST: adjust = (-width, -(height/2)) elif anchor is SOUTHEAST: adjust = (-width, -height) elif anchor is SOUTH: adjust = (-(width/2), -height) elif anchor is CENTER: adjust = (-(width/2), -(height/2)) else: # raise an exception if the relation provided is not recognized raise ValueError, "Invalid positional relation: %r" % relation # calculate the position to add the object based on the offset and adjustment position = (relPosition[0]+offset[0]+adjust[0],relPosition[1]+offset[1]+adjust[1]) # show the showable and return the shown return self.show(showable, *position) def unshow(self, *showns): """ Remove showables from display. """ # keep a list of the indices of the entries in the pending list to be deleted # we don't delete as we find them because changing the size of the list would corrupt the iterater deletes = [] # iterate through the pending list searching for the given Shown... for n, (shown, showable, x, y) in enumerate(self.pending): # when we find it... if shown in showns: if isinstance(showable, ActiveShowable): # decrement the active pending count, if the showable is active self.activepending -= 1 # allow showable to be unloaded showable.unrequireLoaded() # append the index to the deletion list deletes.append(n) # reverse the deletion list so that we delete from later in the list first # this way, the indices for the remaining items to be deleted are still correct deletes.reverse() # iterate through the deletion list... for n in deletes: # ...deleting as we go del self.pending[n] def getPosition(self, shown): """ Return the position of the Shown on the screen. """ # iterate through the pending list searching for the shown provided... for xshown, showable, x, y in self.pending: # when we find it... if xshown is shown: # ...return its position return x, y # if we never found it, raise an exception raise ValueError, "Shown not present." def replace(self, shown, showable): """ Replace a shown object with a new object. """ # iterate through the pending list searching for the shown provided... for xshown, xshowable, x, y in self.pending: # when we find it... if xshown is shown: # ...unshow it self.unshow(shown) # ...and show the new showable at the same coordinates return self.show(showable, x, y) # if we never found it, raise an exception raise ValueError, "Shown not present." def updateScreen(self, t = None, force = False): """ Change the screen output to refect all basic video elements drawn. If t is a PresentationClock, updateScreen will tare the time to represent the time the update occured, which is critical for timing events based on actual screen refreshes as opposed to times those refreshes were requested. """ # update the onscreen list to match the pending list self.onscreen = self.pending[:] if self.activepending and not force: # if we're in activing mode (and not being forced to ignore it), then we're done return # handle timing clock = None if t is None: # if t is None, use the current time t = timing.now() elif isinstance(t, exputils.PresentationClock): # if t is a PresentationClock, use the time from that clock clock = t t = t.get() # calculate the earliest allowable update time, based on the minimum frame duration mintime = self.last_updated[0] + self.minframeduration if t < mintime: # if t is before the the earliest allowable time, set t to the earliest allowable time t = mintime # iterate through the onscreen list... for shown, showable, x, y in self.onscreen: # ...showing everything in order showable.show(x, y) # update the screen at the calculated time # now passes in self as a video track instance #r = hardware.makeVideoChanges(t,self) r = hardware.makeVideoChanges(t) for fnc, targs, dargs in self.do_after_update: # perform all waiting do_after_update calls fnc(*targs, **dargs) # ...and clear the do_after_update list self.do_after_update = [] for cb in self.update_callbacks: # call all update callbacks cb()(r) # log the contents of the display self.logDisplay(r) # save the update timestamp as the time of last update self.last_updated = r # see if we should tare the time if clock is not None: # we have a clock # accumulate errors clock.accumulatedTimingError += r[0]-t #so tare the clock to the presentation time clock.tare(r) # return the timestamp return r def renderLoop(self, f, *pargs, **kwargs): """ There has to be a render loop when active drawables are displayed. """ # mark the start of the render loop in the log self.logMessage("ENTERLOOP") prev_last_updated = self.last_updated fpsFrameCount = 1 fpsMinimumFrames = 50 fpsText = None t_delta = 0.0 # keep calling f until it returns a false value... while f(self.last_updated, *pargs, **kwargs): # after each call to f: # poll for events hardware.pollEvents() # calculate the earliest allowable update time, based on the minimum frame duration mintime = self.last_updated[0] + self.minframeduration # get the current time t = timing.now() if t < mintime: # if the current time is earlier than the earliest allowable time, use the earliest allowable time instead t = mintime # iterate through the onscreen list... for shown, showable, x, y in self.onscreen: # ...showing everything in order showable.show(x, y) # Show FPS if self.showFPS: t1 = prev_last_updated[0] t2 = self.last_updated[0] t_delta += t2 - t1 if t_delta and fpsFrameCount >= fpsMinimumFrames: fps = fpsFrameCount * 1000.0 / t_delta fpsText = Text("%.1fFPS" % fps) fpsFrameCount = 1 t_delta = 0.0 else: fpsFrameCount += 1 if fpsText: fpsText.show(0, 0) # update the screen at the calculated time prev_last_updated = self.last_updated #self.last_updated = hardware.makeVideoChanges(t, self) self.last_updated = hardware.makeVideoChanges(t) # log the contents of the display self.logDisplay(self.last_updated) for cb in self.update_callbacks: # call all update callbacks cb()(self.last_updated) for fnc, targs, dargs in self.do_after_update: # perform any waiting do_after_update calls fnc(*targs, **dargs) # ...and clear the do_after_update list self.do_after_update = [] # mark the end of the render loop in the log self.logMessage("EXITLOOP") def doAfterUpdate(self, f, *targs, **dargs): """ """ # append the call to the do_after_update list self.do_after_update.append((f, targs, dargs)) def logDisplay(self, timestamp = None): """ Log the basic video components currently displayed. """ # if we are currently logging... if self.logall: if timestamp == None: # if the timestamp is not given, use the current time timestamp = (timing.now(), 0L) # get the number of showables on screen t = len(self.onscreen) # log a header message for this update self.logMessage("D\t0/%d\t0\t0\tUPDATE" % t, timestamp) for n, (showable, showable, x, y) in enumerate(self.onscreen): # log each showable on the screen self.logMessage("D\t%d/%d\t%d\t%d\t%s" % (n + 1, t, x, y, showable.logLine()), timestamp) def toFront(self, shown): """ """ # iterate through the pending list searching for the given shown... for n, (xshown, showable, x, y) in enumerate(self.pending): # when we find it... if xshown is shown: # remove it from the pending list del self.pending[n] # ...and append it to the end of the list self.pending.append((xshown, showable, x, y)) # then return return # if we never found a matching Shown, raise an exception raise ValueError, "Shown not present." def toBack(self, shown): """ """ # iterate through the pending list searching for the given shown... for n, (xshown, showable, x, y) in enumerate(self.pending): # when we find it... if xshown is shown: # remove it from the pending list del self.pending[n] # ...and insert it at the beginning of the list self.pending.insert(0, (xshown, showable, x, y)) # then return return # if we never found a matching Shown, raise an exception raise ValueError, "Shown not present." def putBehind(self, shown1, shown2): """ """ # iterate through the pending list searching for shown2... for n2, (shown, showable, x, y) in enumerate(self.pending): # when we find it... if shown is shown2: # go on to the next loop break else: # if we never found a matching Shown, raise an exception raise ValueError, "Shown (#2) not present." # iterate through the pending list searching for shown1... for n1, (shown, showable, x, y) in enumerate(self.pending): # when we find it... if shown is shown1: # remove it from the pending list del self.pending[n1] # ...and insert it before the position of shown2 self.pending.insert(n2, (shown1, showable, x, y)) # then return return # if we never found a matching Shown, raise an exception raise ValueError, "Shown (#1) not present." def putInFrontOf(self, shown1, shown2): """ """ # iterate through the pending list searching for shown2... for n2, (shown, showable, x, y) in enumerate(self.pending): # when we find it... if shown is shown2: # go on to the next loop break else: # if we never found a matching Shown, raise an exception raise ValueError, "Shown (#2) not present." # iterate through the pending list searching for shown1... for n1, (shown, showable, x, y) in enumerate(self.pending): # when we find it... if shown is shown1: # remove it from the pending list del self.pending[n1] # ...and insert it after the position of shown2 self.pending.insert(n2 + 1, (shown1, showable, x, y)) # then return return # if we never found a matching Shown, raise an exception raise ValueError, "Shown (#1) not present." def addUpdateCallback(self, cb): """ Call cb whenever the screen is updated. """ # append an update callback using a weak reference, so that it cleans itself up self.update_callbacks.append(weakref.ref(cb, self.removeUpdateCallback)) def removeUpdateCallback(self, cbref): """ This method is used to clean up callbacks that no longer exist. """ try: # try to remove an update callback self.update_callbacks.remove(cbref) except ValueError: # if it fails, it must have cleaned itself up automatically, and that's fine pass def setGammaRamp(self,red,green,blue): """ Sets the gamma ramp to correct monitor distortions. Returns True on success. """ # Call the set_gamma_ramp function return hardware.setGammaRamp(red,green,blue) def loadGammaRampFile(self,filename): """ Load gamma ramp information from a file. Returns red,green,blue lists. If the file only contains a single column, it will be replicated into the other two columns. """ # Function inspired by VisionEgg function fid = open(filename,'r') gvals = [] for line in fid.readlines(): # clean up the line line = line.strip() # convert strings to numbers and append gvals.append(map(int,line.split())) # make sure we got three values if len(gvals[-1]) != 3: raise ValueError("Expected 3 values per row") # make sure we got 256 lines if len(gvals) != 256: raise ValueError("Expected 256 rows") # split out to three rgb red, green, blue = zip(*gvals) return red,green,blue def playMovie(self,movie,t=None,doDelay=True,loops=0): """ Start playback of a movie object. INPUT ARGS: movie- Instance of a Movie object. t- Time or presentation clock instance to control onset time. doDelay- Whether to advance the clock the length of the movie. Defaults to True loops- Number of times the movie will be repeated. A value of -1 will repeat forever. OUTPUT ARGS: timestamp- When the first frame played """ # make sure it's not in the playing movies if movie in self._playing_movies: raise RuntimeError('You can only play a movie instance once.') # handle timing clk = None if t is None: # if t is None, use the current time t = timing.now() elif isinstance(t, exputils.PresentationClock): # if t is a PresentationClock, use the time from that clock clk = t t = t.get() # are there any movies already playing numPlaying = len(self._playing_movies) (timeInterval, start_timestamp) = timing.timedCall(t, self._startMovie, movie,loops) # start the callback if it's not already started if numPlaying == 0: hardware.addPollCallback(self._playingMovieCallback) # log it self.logMessage("%s\t%s\t%s" % \ ("MOVIE_PLAY",movie.filename, movie.getRemainingTime()), timeInterval) # tare the clock to the start time if we have a clock if doDelay and clk: # accumulate the error clk.accumulatedTimingError += start_timestamp[0]-t # tare the clock and delay the proper amount. # I'm basing this on when the movie.play began, not when # the first frame was rendered. clk.tare(timeInterval[0]) clk.delay(movie.getRemainingTime()) # return the start time return start_timestamp def _startMovie(self,movie,loops=0): # start playing the movie movie.play(loops) # add it to the playing movies self._playing_movies.append(movie) # call the callback once to get the starting time self._playingMovieCallback() return self.last_frame_timestamp def _playingMovieCallback(self): # loop over playing movies to see if we have a new frame hasNewFrame = False for mov in self._playing_movies: if mov.movie.get_busy(): if mov.hasNewFrame(): hasNewFrame = True else: # we are done with this movie, so remove it from the # list and tell it to stop self.stopMovie(mov) # see if we need to refresh the screen if hasNewFrame: # see if restart logging if self.logall: self.logall = False restartLogging = True else: restartLogging = False self.last_frame_timestamp = self.updateScreen() if restartLogging: self.logall = True def stopMovie(self,movie,t=None): # make sure it was playing if movie in self._playing_movies: # stop the movie at the specified time (timeInterval,res) = timing.timedCall(t, movie.stop) # remove it from the playlist # not sure why it's sometimes not there to remove try: self._playing_movies.remove(movie) except: print self._playing_movies pass # see if remove callback if len(self._playing_movies) == 0: # none left to play, so stop callback hardware.removePollCallback(self._playingMovieCallback) self.logMessage("%s\t%s\t%s" % \ ("MOVIE_STOP",movie.filename, movie.getRemainingTime()), timeInterval) def stopAllMovies(self): for movie in self._playing_movies: # stop the movie (timeInterval,res) = timing.timedCall(t, movie.stop) # remove it from the playlist self._playing_movies.remove(movie) # see if remove callback if len(self._playing_movies) == 0: # none left to play, so stop callback hardware.removePollCallback(self._playingMovieCallback) self.logMessage("%s\t%s\t%s" % \ ("MOVIE_STOP",movie.filename, movie.getRemainingTime()), timeInterval) def pauseMovie(self,movie,t=None): # make sure it was playing if movie in self._playing_movies: # pause the movie (timeInterval,res) = timing.timedCall(t, movie.pause) # remove it from the playlist self._playing_movies.remove(movie) # see if remove callback if len(self._playing_movies) == 0: # none left to play, so stop callback hardware.removePollCallback(self._playingMovieCallback) self.logMessage("%s\t%s\t%s" % \ ("MOVIE_PAUSE",movie.filename, movie.getRemainingTime()), timeInterval) pyepl-1.1.0+git12-g365f8e3/code/eeg.py000066400000000000000000000244061127617341700167770ustar00rootroot00000000000000# PyEPL: eeg.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides EEG sync pulsing and logging. """ from textlog import LogTrack from hardware import addPollCallback, removePollCallback import timing import exceptions import exputils # import python modules import random import sys class EEGTrack(LogTrack): """ This track recognizes if you are sending sync pulses via USB or through a parallel port or if you are connected directly to the data access (Like in the RTLinux scalp EEG setup) and automatically starts sending pulses and logging the times of the pulses. """ logExtension = ".eeglog" def __init__(self, basename, archive = None, autoStart = True): """ Set up the EEGTrack. INPUT ARGS: basename- The name of the log. archive- Directory to put the log. autoStart- Whether to automatically start the service and logging. """ self.eeg_files = [] self.record_mode = "N" # N: neither, S: scalp, P: pulse self.do_log = False self.dat_file = None self.EEG_sync_thread = None self.awCard = None if not archive: self.archive = exputils.session else: self.archive = archive LogTrack.__init__(self, basename, archive, autoStart) def startService(self): """ Start the EEG service, testing what type of synching to do and opening ports as necessary. """ # If Darwin, then only check pulse if sys.platform == 'darwin': # see if can open Pulse port try: from hardware import AWCard self.awCard = AWCard() self.record_mode = "P" except: # both failed so neither # report / raise something self.record_mode = "N" exceptions.eplWarn("Neither Scalp nor Pulse EEG syncing was initialized.") else: # import eeg stuph from hardware import Parallel, EEGShmAttached, EEGShmAttach, \ EEGShmDetach, EEGRecStart, EEGRecStop, EEGGetOffset, EPLScalpEEGException # see if can attach to shared memory try: EEGShmAttach() self.record_mode = "S" except EPLScalpEEGException: # did not attach # see if can open Pulse port try: self.parallel = Parallel() self.record_mode = "P" except: # both failed so neither # report / raise something self.record_mode = "N" exceptions.eplWarn("Neither Scalp nor Pulse EEG syncing was initialized.") def stopService(self): """ Stop the EEG syncing. """ # clean up if self.record_mode == "S": EEGRecStop() EEGShmDetach() elif self.record_mode == "P": if self.awCard: # on darwin del self.awCard else: del self.parallel def startLogging(self): """ Start sending synchs and logging. """ # start logging LogTrack.startLogging(self) # check record state, maybe get new file, start recording if self.record_mode == "S": # is scalp, so start recording to new file self.dat_filename = 'eeg0.dat' # make sure we have a file name that doesn't already exist... n = 0 while self.archive.exists(self.dat_filename): n += 1 self.dat_filename = 'eeg%d.dat' % n self.dat_file = self.archive.createFile(self.dat_filename) self.dat_file.close() EEGRecStart(self.dat_file.name) # setup scalp callback self.last_align = timing.now() self.align_interval = 1000 addPollCallback(self.scalpCallback) elif self.record_mode == "P": # is pulse, so setup pulse callback self.last_align = timing.now() self.align_interval = 1000 self.pulseTrain(10,"EXPSTART_") addPollCallback(self.pulseCallback) def newTarget(self, archive): """ Switch to a new archive location for this EEG log. """ # first update the archive that will be used for the EEG data file self.archive = archive LogTrack.newTarget(self, archive) def stopLogging(self): """ Stop sending syncs and logging them. """ # clean up recording # stop logging/ remove callbacks removePollCallback(self.scalpCallback) removePollCallback(self.pulseCallback) if self.record_mode == "S": # stop recording EEGRecStop() elif self.record_mode == "P": self.pulseTrain(5,"EXPEND_") # stop logging LogTrack.stopLogging(self) def scalpCallback(self): """ Callback to make logs using the real-time scalp interface. """ # is it time to do another alignment? if timing.now() >= self.last_align + self.align_interval: # query for offset (timeInterval,offset) = timing.timedCall(None, EEGGetOffset) # get info for log message self.logMessage("%s\t%s" % (self.dat_filename,offset),timeInterval) # update last_align self.last_align = timeInterval[0] def timedPulse(self, pulseTime, pulsePrefix='', signal='', clk=None): """ Send a pulse and log it. INPUT ARGS: pulseTime- Duration of pulse. pulsePrefix- Name to log the pulse. """ # see if using clock usingClock = True if clk is None: # no clock, so use time clk = timing.now() usingClock = False if self.awCard: if len(signal)>0: (timeInterval,returnValue)=timing.timedCall(clk, self.awCard.write, signal) else: (timeInterval,returnValue)=timing.timedCall(clk, self.awCard.allOn) else: if len(signal)>0: (timeInterval,returnValue)=timing.timedCall(clk, self.parallel.setSignal, True, signal) else: (timeInterval,returnValue)=timing.timedCall(clk, self.parallel.setState, True) self.logMessage("%s" % pulsePrefix+"UP",timeInterval) # wait for the pulse time if usingClock: clk.delay(pulseTime) else: clk = clk + pulseTime if self.awCard: (timeInterval,returnValue)=timing.timedCall(clk, self.awCard.allOff) else: (timeInterval,returnValue)=timing.timedCall(clk, self.parallel.setState, False) self.logMessage("%s" % pulsePrefix+"DN",timeInterval) # I'm not sure when if you want this to be the start or end of the pulse return timeInterval def pulseTrain(self, numPulses,trainName=""): """ Send a train of pulses. INPUT ARGS: numPulses- Number of pulses in train. trainName- Name to use in the log. """ #trainLen denotes the number of pulses in this train pulseLen=10 #in milliseconds interPulseInterval=5 self.logMessage(trainName+"TRAIN") # set the desired pulsetime pulseTime = timing.now() for i in range(numPulses): # send a pulse (timeInterval,returnValue)=timing.timedCall(pulseTime, self.timedPulse, pulseLen,'TRAIN_') # pause for the next pulse pulseTime += interPulseInterval def pulseCallback(self): """ Callback to manage sending pulses. """ minInterPulsetime=750 maxInterPulseTime=1250 pulseLen=10 #in milliseconds if timing.now() >= self.last_align + self.align_interval: timeInterval = self.timedPulse(pulseLen) # randomize the alignment interval self.align_interval = random.uniform(minInterPulsetime, maxInterPulseTime) # update last_align self.last_align = timeInterval[0] def calcOffset(eventTime): """ Return a two tuple of the offset in to the file and a maximum latency value. The offset into the file is a string representation of "FILENAME\tOffset". The maximum latency is simply a number in ms. """ # keep the last startTime = None endTime = None for (timeStamp,withinTick,logMessage) in self: if timeStamp[0] >= eventTime[0]: # we have passed the time endTime = timeStamp endLog = logMessage break else: # save as last time startTime = timeStamp startLog = logMessage # set defaults filename = "" offset = "" ml = 0 # see if found if startTime is not None and endTime is not None: # get the filenames and offsets [startFile,startOffset] = startLog.split('\t') [endFile,endOffset] = startLog.split('\t') if startFile == endFile: filename = startFile # calc the slope slope = float(endOffset - startOffset)/float(endTime[0] - startTime[0]) # calc the offset offset = (slope * (eventTime[0] - startTime[0]) + startOffset) # eventually, we'll add in a maximum latency in the offset # using the ml values from the start and end times. Thus, # we'll calculate four lines, return the min value as the # offset and the max-min as the latency in samples # return what we gots return ("%s\t%s" % (filename,offset),ml) pyepl-1.1.0+git12-g365f8e3/code/exceptions.py000066400000000000000000000034121127617341700204120ustar00rootroot00000000000000# PyEPL: exceptions.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module defines some base exceptions for PyEPL. """ import warnings class EPLException(Exception): """ Base exception class for PyEPL. """ def __init__(self, desc): """ Initialize exception with a description. """ self.desc = desc def __str__(self): """ Get a string representation of this exception. """ return "EPL Exception: %s" % self.desc class EPLError(EPLException): """ Base class for PyEPL errors (i.e. normal execution cannot continue). """ def __str__(self): """ Get a string representation of this error. """ return "EPL Error: %s" % self.desc def eplWarn(message, category = UserWarning, stackLevel = 1): """ Issue a warning. Execution continues normally. """ warnings.warn("EPL Warning: %s" % message, category, stackLevel + 1) class EPLFatalError(EPLError): """ An error so serious that execution cannot continue at all. """ def __str__(self): """ Get a string representation of this error. """ return "EPL FATAL ERROR: %s" % self.desc class BadFileExtension(EPLError): """ Error indicating that a filename extension was not understood. """ def __init__(self, ext): """ Get a string representation of this error. """ EPLError.__init__(self, "The file extension %s is not recognized in context." % ext); pyepl-1.1.0+git12-g365f8e3/code/exputils.py000066400000000000000000001024411127617341700201100ustar00rootroot00000000000000# PyEPL: exputils.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module implements fundamental features used in most experiments. """ import pyepl import cPickle import timing from eeg import EEGTrack from textlog import LogTrack from optparse import OptionParser, OptionGroup, Option, OptionValueError import os, sys, imp, atexit import hardware import keyboard import joystick import mouse import display import sound import pool import exceptions from transarchive import Archive import random import time import weakref session = None # set up custom option types... class EPLOption(Option): """ """ otypes = {} def check_resolution(option, opt, value): """ """ try: # separate the x and y components of the resolution xy = value.split("x") if len(xy) != 2: # make sure there are only 2 components (only one 'x' in the string) raise ValueError, value # return the value as a 2-tuple of integers return (int(xy[0]), int(xy[1])) except ValueError: # if it couldn't be turned into a 2-tuple of integers, raise an exception raise OptionValueError("option %s: invalid resolution value: %r" % (opt, value)) otypes["resolution"] = check_resolution TYPES = Option.TYPES + tuple(otypes.keys()) TYPE_CHECKER = Option.TYPE_CHECKER.copy() TYPE_CHECKER.update(otypes) class Experiment: """ ... archive - Directory name for storing all collected data - DEFAULT: "data" subject - String identifier for the current subject config - File name for the global configuration to be used sconfig - File name for the individual subject configuration to be used resolution - 2-tuple of the screen resolution to be used - DEFAULT: (640, 480) fullscreen - Boolean, if True, the graphics are run in full screen mode - DEFAULT: True joystick_zero_threshold - The range of small axis position values to be reported as 0.0 for joystick axes - DEFAULT 0.2 use_opengl - Boolean, if True, use OpenGL for graphics DEFAULT: True use_eeg - Boolean, if True, automatically create an EEG track for while the experiment runs - DEFAULT: True sync_to_vbl - Boolean, if True, waits for screen's vertical retrace before drawing - DEFAULT: True max_facet_length - The maximum length, in VR units, for 3D facets. Larger facets will be broken into smaller pieces for display. DEFAULT: 0.0 (do not break up larger facets) show_fps - Boolean, if True the display frames per second is shown in the corner of the the screen during render loops. DEFAULT: False """ # set the default options... defaults = { "archive": "data", "subject": None, "config": None, "sconfig": None, "resolution": (640, 480), "fullscreen": True, "joystick_zero_threshold": 0.2, "use_eeg": True, "sync_to_vbl": True, "max_facet_length": 0.0, "show_fps": False } def __init__(self, **options): """ Construct the Experiment object. INPUT ARGS: options- keyword arguments are used to set the initial experiment options. """ self.options = Experiment.defaults.copy() self.options.update(options) self.data = None self.experiment = None self.subject = None self.session = None self.state = None self.configbackup = None self.sconfigbackup = None self.eegtrack = None self.explog = None self.didParse = False # for backwards compatibility self.didSetup = False self.parseArgs() self.setup() def __del__(self): """ Cleanly shut down PyEPL. """ # log if self.explog: self.explog.logMessage("EXIT") # if there's an EEGTrack, delete it self.eegtrack = None # delete the experiment log self.explog = None # finalize PyEPL pyepl.finalize() def getOptions(self): """ Return a PoolDict of the options associated with this Experiment. """ return pool.PoolDict(**self.options) def parseArgs(self, optparser = None, version = None): """ Updates the experiment options using the command line arguments. The positional argument "version" indicates the version of the experiment. The second positional argument, "optparser", is optional and can be used to pass in an optparse.OptionParser object to specify per-experiment command line options. A group of PyEPL options will be appended to it. A passed in OptionParser must use the EPLOption option class or one derived from it. """ if not self.didParse: # bring the defaults into the local scope defaults = Experiment.defaults.copy() # update the default options with any options provided as keyword arguments defaults.update(self.options) if optparser: # if an optparser was specified, use it... parser = optparser else: # ...otherwise, create a new one parser = OptionParser(option_class = EPLOption, version = version) # create an option group for PyEPL Options eplopts = OptionGroup(parser, "PyEPL Options") # add the options to the group... eplopts.add_option("-a", "--archive", dest = "archive", metavar = "DIRECTORY", default = defaults["archive"], help = "Specify alternative path for data storage. Default: data") eplopts.add_option("-s", "--subject", dest = "subject", metavar = "SUBJECTID", default = defaults["subject"], help = "Indicate a subject to use.") eplopts.add_option("--config", dest = "config", metavar = "CONFIGFILE", default = defaults["config"], help = "Specify the path of the configuration file.") eplopts.add_option("--sconfig", dest = "sconfig", metavar = "CONFIGFILE", default = defaults["sconfig"], help = "Specify the path of the subject configuration file to be copied in.") eplopts.add_option("--resolution", type = "resolution", default = defaults["resolution"], dest = "resolution", metavar = "WIDTHxHEIGHT", help = "Set the graphical resolution for the session.") eplopts.add_option("--no-fs", action = "store_false", default = defaults["fullscreen"], dest = "fullscreen", help = "Run the experiment in a window (not fullscreen).") eplopts.add_option("--js-zero-threshold", type = "float", default = defaults["joystick_zero_threshold"], dest = "joystick_zero_threshold", metavar = "THRESHOLD", help = "Set the range of small axis position values to be reported as 0.0 for joystick axes.") eplopts.add_option("--no-eeg", action = "store_false", default = defaults["use_eeg"], dest = "use_eeg", help = "Run the experiment without automatically creating an EEGTrack.") eplopts.add_option("--no-screen-sync", action = "store_false", default = defaults["sync_to_vbl"], dest = "sync_to_vbl", help = "Do not enable synchronization with the screen's vertical retrace.") eplopts.add_option("--max-facet-length", type = "float", default = defaults["max_facet_length"], dest = "max_facet_length", metavar = "MAXLENGTH", help = "Set the maximum length, in VR units, for 3D facets. Larger facets will be broken into smaller pieces for display.") eplopts.add_option("--show-fps", action = "store_true", default = defaults["show_fps"], dest = "show_fps", help = "Display frames per second in the corner of the screen during render loops.") # add the group to the optparser parser.add_option_group(eplopts) # parse the command line arguments opts, args = parser.parse_args(sys.argv) if len(args) > 1: # exit if positional arguments (not options) are detected sys.stderr.write("This program takes no commandline arguments, only options!\n") sys.exit(1) # update the options dictionary with the command line arguments self.options.update(opts.__dict__) self.didParse = True def setup(self): """ Set up the current subject for logging based on the current experiment options. Initialize PyEPL's hardware interface and create an EEGTrack if the option "use_eeg" is true. """ if not self.didSetup: # create the main archive self.data = Archive(self.options["archive"]) if self.options["subject"]: # if a subject identifier is given, create the subject archive self.subject = self.data.createDirectory(self.options["subject"]) # to begin with, the session archive is the same as the subject archive self.session = self.subject global session session = self.session # read the global configuration file if self.options["config"]: try: self.globalconfig = ConfigurationFile(self.options["config"]) except IOError, e: if self.options["config"] != "config.py": raise e self.options["config"] = None # no config, use a blank one self.globalconfig = Configuration() # if there is a subject archive if self.subject: # create the state archive self.state = self.subject.createDirectory("state") # create the global configuration backup archive self.configbackup = self.subject.createDirectory("configbackup") # create the subject configuration backup archive self.sconfigbackup = self.subject.createDirectory("sconfigbackup") # produce the config backup file name to use fn = str(int(time.time())) + "XXX.py" if self.options["config"]: # if there is a global configuration file specified, copy it into the subject archive self.subject.createFile("config.py").write(open(self.options["config"]).read()) # now back it up self.configbackup.createFile(fn).write(open(self.options["config"]).read()) else: # otherwise try using config.py... try: self.subject.createFile("config.py").write(open("config.py").read()) # now back it up self.configbackup.createFile(fn).write(open("config.py").read()) except: # no config.py? fine. we'll deal pass if self.options["sconfig"]: # if there is a subject configuration file specified, copy it into the subject archive self.subject.createFile("sconfig.py").write(open(self.options["sconfig"]).read()) # now back it up self.sconfigbackup.createFile(fn).write(open(self.options["sconfig"]).read()) # initialize PyEPL pyepl.initialize(**self.options) # log if self.session: self.explog = LogTrack("experiment") self.explog.logMessage("SETUP") self.didSetup = True def getConfig(self): """ Return the Configuration object for the current subject. """ # is there a subect set up? if self.subject: # if so, use the config files from the subject directory return parentChildFileConfig(self.subject.createFile("config.py"), self.subject.createFile("sconfig.py")) else: # otherwise... if self.options["config"]: # if a global config file is in the options, use it return ConfigurationFile(self.options["config"]) try: # none specified? try config.py return ConfigurationFile("config.py") except IOError: # no config.py? use a blank configuration return Configuration() def setSession(self, sessionname): """ Specify a session name to be used for subsequently created tracks. Data will be stored in an appropriately named subdirectory of the subject directory rather than directly in the subject directory. INPUT ARGS: sessionname- A string which names this session. This string is used to name the directory containing this run's data files. """ # create and set the session archive self.session = self.subject.createDirectory("session_%s" % sessionname) global session session = self.session # make an eeg track if needed... if self.options["use_eeg"] and not self.eegtrack: self.eegtrack = EEGTrack("eeg") # move the eeg log target... elif self.eegtrack: self.eegtrack.newTarget(self.session) # log if self.explog: self.explog.logMessage("SESSION\t%s" % sessionname) def breakfunc(self, pressed, timestamp, expcb): # we only care if the button is pressed, not released... if pressed: # if there is an EEGTrack, delete it self.eegtrack = None # log if self.explog: self.explog.logMessage("BREAK") # delete the experiment log self.explog = None # if there is an experiment break callback... if expcb: # ...call it... if expcb(): # ...and if it returns a true value, exit print "BREAK!" pyepl.finalize() sys.exit() else: # if there was no experiment break callback, just exit print "BREAK!" pyepl.finalize() sys.exit() def setBreak(self, button = None, callback = None): """ After this call, PyEPL will flush all tracks on exit, even if the program crashes. If the argument "button" is given, then pressing the specified button will cause the program to exit. If the argument "callback" is given, the provided callable will be called prior to exitting. If the exit was triggered by the break button, the callback must return a true value, or the program will not exit. INPUT ARGS: button- The Button object which represents the keyboard button that when pressed triggers a break. (Default: button=Key("ESCAPE") & Key("F1")) callback- A callable which is called prior to exitting. """ if button is None: button = keyboard.Key("ESCAPE") & keyboard.Key("F1") atexit.register(self.__del__) if callback: atexit.register(callback) self.breakcb = self.breakfunc button.addCallback(self.breakcb, callback) self.breakButton = button def saveState(self, instate, **items): """ Save any picklable objects as the state for the current subject. The optional positional argument "instate" takes a State object. The call will save all the data in the State object except that any values in the State object may be overridden by providing the new values as keyword arguments. Returns the state as it was saved. INPUT ARGS: instate- The State object """ # if there is a state archive... if not self.state is None: # combine instate with items instate = State(instate, **items) # pickle the state to a file named after the current time cPickle.dump(instate, self.state.createFile(str(timing.now()) + ".pickle"), -1) # log if self.explog: self.explog.logMessage("SAVESTATE") # return the saved state return instate def restoreState(self): """ Return a State object for the most recently saved state. """ # log if self.explog: self.explog.logMessage("RESTORESTATE") # if there is a state archive... if not self.state is None: # get the file names in the state archive listing = self.state.listDir() # if there are any files in the archive... if len(listing): # calculate the timestamp of the most recently saved state based on the file names statetime = max(map(lambda filename: long(os.path.splitext(filename)[0]), listing)) # unpickle the file named after the calculated timestamp, returning the result return cPickle.load(self.state.open(str(statetime) + ".pickle")) # if there is no state archive, or no state files, return None return None class PresentationClock: """ A presentation clock is an abstraction used for timing to keep the timing of input and output as accurate as possible. The clock keeps a virtual time which does not advance with the real time. Instead, it advances when you tell it to. You can pass the PresentationClock into timed output routines and they will not perform the actual output until the real time has caught up the the virtual time. A good way to think about it is that the time in the PresentationClock is when you want the next output action (presentation) to occur. Passing the PresentationClock into input routines will advance the virtual clock to the moment of the input that the routine waited for. """ def __init__(self,correctAccumulatedErrors=False): """ Create a PresentationClock set to the time of its creation. """ # start the clock at the current time self.tare() # save whether to correct the accumulated errors self.correctAccumulatedErrors=correctAccumulatedErrors # keep track of the accumulated timing error in ms # is in terms of (Actual - Expected) self.resetAccumulatedTimingError() def resetAccumulatedTimingError(self): """ Reset the accumulated timing error to zero. """ self.accumulatedTimingError = 0 def tare(self, t = None): """ Set the clock to the current time, or to the time specified. INPUT PARAMS: t- the time in milliseconds to set the clock to. (alternatively, this can be a 2-tuple, the first element contains time in milliseconds.) """ if t is None: # if called with no parameters, set the clock to the current time self.virtualtime = timing.now() elif isinstance(t, tuple): # if called with a tuple, set the clock to the first element of the tuple (to support timestamps with maximum latency) self.virtualtime = t[0] else: # otherwise, set the time to the given paramenter (in milliseconds) self.virtualtime = t def delay(self, milliseconds, jitter = None, resolveTimingError=False): """ Advance the clock by the number of milliseconds given. Optionally add a random amount of time up to the given jitter (in milliseconds). INPUT ARGS: milliseconds- number of milliseconds to advance the clock jitter- if this OPTIONAL argument is specified, then the clock is advanced a random number of milliseconds between 0 and the value of this parameter, in addition to the clock advance due to the milliseconds parameter. resolveTimingError- Optional argument that defaults to False. This will adjust the requested milliseconds by the accumulated error from previous timedCalls with this clock. Accumulated error can occur in a number of ways. For example, if you requested an updateScreen to occur at a specific time t based on the presentation clock's virtual time, but the updateScreen actually occurred at time t+5 because it is timed to the screen refresh, you would have an accumulated error of 5ms. In this case, you would need to subtract 5ms from the milliseconds delay to make sure that the next stimulus comes on the screen when you desire. """ if jitter: # if jitter is given, translate this into a call to jitter # and set actual milliseconds used milliseconds = self.jitter(milliseconds, milliseconds + jitter, resolveTimingError) else: # otherwise, add milliseconds to the virtual time # see if we must resolve the timing error if self.correctAccumulatedErrors or resolveTimingError: # adjust the milliseconds and reset the accumulatedTimingError milliseconds -= self.accumulatedTimingError if milliseconds < 0: self.accumulatedTimingError = -milliseconds milliseconds = 0 exceptions.eplWarn("Unable to account for %dms of timing error." % (self.accumulatedTimingError)) else: self.accumulatedTimingError = 0 # extend the virtual time self.virtualtime += milliseconds # return the milliseconds (to see if changed) return milliseconds def jitter(self, low_milliseconds, high_milliseconds = None, resolveTimingError=False): """ Advances the clock by a random number of milliseconds. INPUT ARGS: ms1 & ms2- If one argument is specified, delay a random amount of time between 0 and the value of the parameter (in milliseconds). if two parameters, delay a random amount of time between the values of the first and second parameters (in milliseconds) resolveTimingError- see the help for delay. """ if high_milliseconds is None: # if called with only one parameter, delay a random amount of time between 0 and the value of the parameter (in milliseconds) t = random.randint(0, low_milliseconds) else: # if two parameters, delay a random amount of time between the values of the first and second parameters (in milliseconds) t = random.randint(low_milliseconds, high_milliseconds) # return the amount of time actually delayed return self.delay(t,resolveTimingError=resolveTimingError) def get(self): """ Retrieves the clock's virtual time. OUTPUT ARGS: time- time in milliseconds when the clock is set for. """ # return the clock's virtual time return self.virtualtime def wait(self): """ Wait until the current time catches up to the clock. """ # as long as the current time is less than (earlier than) the virtual time... while timing.now() < self.virtualtime: # do nothing (poll for events) hardware.pollEvents() class Configuration: """ """ def overlay(self, config): """ """ # return a ConfigurationOverlayed object made from this Configuration and the given config return ConfigurationOverlayed(self, config) def sequence(self, sequenceposition): """ """ # return a ConfigurationSequenced object made from this Configuration and the given config return ConfigurationSequenced(self, sequenceposition) def domain(self, domainname): """ """ # return a ConfigurationDomained object made from this Configuration and the given config return ConfigurationDomained(self, domainname) class ConfigurationFile(Configuration): """ """ def __init__(self, filenameorfile, extra_locals = None): """ """ if isinstance(filenameorfile, file): # if this is a file, get its name filename = filenameorfile.name else: # otherwise, use the parameter directly as a file name filename = filenameorfile # create the globals for the config execution environment g = {"__builtins__": __builtins__, "Key": keyboard.Key, "JoyButton": joystick.JoyButton, "JoyAxis": joystick.JoyAxis, "JoyBall": joystick.JoyBall, "JoyHat": joystick.JoyHat, "MouseButton": mouse.MouseButton, "MouseAxis": mouse.MouseAxis, "MouseRoller": mouse.MouseRoller, "Text": display.Text, "Image": display.Image, "SolidBackground": display.SolidBackground, "Font": display.Font, "Color": display.Color, "AudioClip": sound.AudioClip, "PoolDict": pool.PoolDict, "Pool": pool.Pool, "TextPool": pool.TextPool, "ImagePool": pool.ImagePool, "SoundPool": pool.SoundPool, "Sequence": Sequence, "passive": self.passiveSet} if extra_locals: # if locals were passed in, copy them self.config = extra_locals.copy() else: # otherwise, create an empty dictionary as the locals self.config = {} # execute the config module execfile(filename, g, self.config) def passiveSet(self, **kw): """ """ for name, value in kw.iteritems(): if not self.config.has_key(name): self.config[name] = value def __getattr__(self, name): """ """ try: # try looking up the name in the config dictionary and returning the value return self.config[name] except KeyError: # if it wasn't found, raise an exception raise AttributeError, "Configuration has no attribute: %s" % name class ConfigurationOverlayed(Configuration): """ """ def __init__(self, config1, config2): """ """ # save the two source configs... self.config1 = config1 self.config2 = config2 def __getattr__(self, name): """ """ if hasattr(self.config2, name): # try returning the value from config2 return getattr(self.config2, name) # didn't work? try from config1. return getattr(self.config1, name) def parentChildFileConfig(parent, child): """ """ return ConfigurationFile(parent, extra_locals = ConfigurationFile(child).config).overlay(ConfigurationFile(child)) class ConfigurationSequenced(Configuration): """ """ def __init__(self, config, seqpos): """ """ # save the source config and the sequence position... self.config = config self.seqpos = seqpos def __getattr__(self, name): """ """ # if we're looking for "seq" and our config has a "seq"... if name == "seq" and hasattr(self.config, "seq"): # return the sequence at our sequence position return self.config.seq[self.seqpos] # if our config has a "seq"... if hasattr(self.config, "seq"): try: # attempt to return the value from self.seq return getattr(self.seq, name) except AttributeError: pass except IndexError: pass # not there? try getting from self.config return getattr(self.config, name) class ConfigurationDomained(Configuration): """ """ def __init__(self, config, domainname): """ """ # save the source config and domainname self.config = config self.domainname = domainname def __getattr__(self, name): """ """ # calculate the qualified name to look for first n = "%s_%s" % (self.domainname, name) if hasattr(self.config, n): # try returning the value of the qualified name return getattr(self.config, n) # not there? try the original name. return getattr(self.config, name) class State: """ """ def __init__(self, instate = None, **items): """ """ # if instate is given... if instate: # set self.items to a copy of the items dictionary of instate self.__dict__["items"] = instate.items.copy() # update self.items with the keyword arguments (items) self.items.update(items) else: # otherwise, set self.items to the keyword arguments (items) self.__dict__["items"] = items def __getstate__(self): """ """ # return the items dictionary return self.items def __setstate__(self, s): """ """ # set the items dictionary to the state value self.__dict__["items"] = s def __getattr__(self, name): """ """ try: # try looking up and returning the value from the items dictionary return self.items[name] except KeyError: # if it's not there, raise an exception raise AttributeError, "No such state attribute: %s" % name def __setattr__(self, name, value): """ """ # set the value in the items dictionary self.items[name] = value def update(self, **items): """ """ # just use the update method of the items dictionary self.items.update(items) class Sequence: """ """ def __init__(self, *dimensions): """ """ # create the sequence list self.__dict__["sequ"] = [] # if there are any dimensions to this sequence... if len(dimensions): # iterate over the elements of the first one... for x in xrange(dimensions[0]): # ...appending Sequences to the sequence list for each # the appended Sequences take the remaining dimensions self.sequ.append(Sequence(*dimensions[1:])) # create an emtpy dictionary to hold the attributes set on this Sequence self.__dict__["items"] = {} def __len__(self): """ """ # return the length of the sequence list return len(self.sequ) def __getitem__(self, index): """ """ # if the index is a tuple (multidimensional index)... if isinstance(index, tuple): if not isinstance(index[0], int): # if the first element of the index is not an integer, return a SequenceSlice return SequenceSlice(self, index) if len(index) == 2: # there's only one dimension left, so index the sub-Sequence without a tuple return self.sequ[index[0]][index[1]] else: # there are more dimensions, use a tuple return self.sequ[index[0]][index[1:]] # if the index is not an integer... if not isinstance(index, int): # return a SequenceSlice return SequenceSlice(self, (index,)) # otherwise, return the sub-Sequence found at that index return self.sequ[index] def __getattr__(self, name): """ """ try: # try returning the value from the items dictionary return self.items[name] except KeyError: # if it's not there, raise an exception raise AttributeError, "No such sequence attribute: %s" % name def __setattr__(self, name, value): """ """ # set the attribute as an item in the items dictionary self.items[name] = value class SequenceSlice: """ """ def __init__(self, seq, index): """ """ # save the sequence and the index self.__dict__["seq"] = seq self.__dict__["index"] = index def __getattr__(self, name): """ """ # start with an empty list r = [] # if our index is multidimensional... if len(self.index) > 1: # iterate over the integers appropriate for the slice object in the first dimension... for x in xrange(*self.index[0].indices(len(self.seq))): # index the element of the sequence with the remaining dimensions, appending the result r.append(getattr(self.seq[x][self.index[1:]], name)) else: # only one dimension - iterate over the integers appropriate for the slice object... for x in xrange(*self.index[0].indices(len(self.seq))): # append the element of the sequence r.append(getattr(self.seq[x], name)) # return the list return r def __setattr__(self, name, value): """ """ # if isinstance(value, tuple) or isinstance(value, list): i = iter(value) if len(self.index) > 1: for x in xrange(*self.index[0].indices(len(self.seq))): setattr(self.seq[x][self.index[1:]], name, i.next()) else: for x in xrange(*self.index[0].indices(len(self.seq))): setattr(self.seq[x], name, i.next()) else: if len(self.index) > 1: for x in xrange(*self.index[0].indices(len(self.seq))): setattr(self.seq[x][self.index[1:]], name, value) else: for x in xrange(*self.index[0].indices(len(self.seq))): setattr(self.seq[x], name, value) pyepl-1.1.0+git12-g365f8e3/code/hardware/000077500000000000000000000000001127617341700174545ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/Makefile000066400000000000000000000057751127617341700211320ustar00rootroot00000000000000# PyEPL: hardware/Makefile # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. all: eeg sound vr rt eventpoll.so timing.so keyboard.so joystick.so mouse.so eeg: FORCE $(MAKE) -C eeg sound: FORCE $(MAKE) -C sound vr: FORCE $(MAKE) -C vr rt: FORCE $(MAKE) -C rt clean: rm -f *.o *.so for d in eeg sound vr rt; do $(MAKE) -C $$d clean; done # very cruel I know for f in `find -iname \*.pyx`; do rm -f "$${f//.pyx/.c}"; done for f in `find -iname \*.i`; do rm -f "$${f//.i/.py}"; done FORCE: PLATFORM = $(shell uname) ifeq ($(PLATFORM), Linux) eventpoll.so: eventpoll.o gcc -shared eventpoll.o -o eventpoll.so eventpoll.o: eventpoll.c gcc -c -fPIC -I/usr/include/python2.3/ eventpoll.c eventpoll.c: eventpoll.pyx pyrexc eventpoll.pyx timing.so: timing.o gcc -shared timing.o -o timing.so timing.o: timing.c gcc -c -fPIC -I/usr/include/python2.3/ timing.c timing.c: timing.pyx pyrexc timing.pyx keyboard.so: keyboard.o gcc -shared keyboard.o -o keyboard.so keyboard.o: keyboard.c gcc -c -fPIC -I/usr/include/python2.3/ keyboard.c keyboard.c: keyboard.pyx pyrexc keyboard.pyx joystick.so: joystick.o gcc -shared joystick.o -o joystick.so joystick.o: joystick.c gcc -c -fPIC -I/usr/include/python2.3/ joystick.c joystick.c: joystick.pyx pyrexc joystick.pyx mouse.so: mouse.o gcc -shared mouse.o -o mouse.so mouse.o: mouse.c gcc -c -fPIC -I/usr/include/python2.3/ mouse.c mouse.c: mouse.pyx pyrexc mouse.pyx endif ifeq ($(PLATFORM), Darwin) eventpoll.so: eventpoll.o gcc -bundle -flat_namespace -undefined suppress eventpoll.o -o eventpoll.so eventpoll.o: eventpoll.c gcc -fPIC -c eventpoll.c -I/System/Library/Frameworks/Python.framework/Versions/2.3/include/python2.3// eventpoll.c: eventpoll.pyx pyrexc eventpoll.pyx timing.so: timing.o gcc -bundle -flat_namespace -undefined suppress timing.o -o timing.so timing.o: timing.c gcc -fPIC -c timing.c -I/System/Library/Frameworks/Python.framework/Versions/2.3/include/python2.3// timing.c: timing.pyx pyrexc timing.pyx keyboard.so: keyboard.o gcc -bundle -flat_namespace -undefined suppress keyboard.o -o keyboard.so keyboard.o: keyboard.c gcc -fPIC -c keyboard.c -I/System/Library/Frameworks/Python.framework/Versions/2.3/include/python2.3// keyboard.c: keyboard.pyx pyrexc keyboard.pyx joystick.so: joystick.o gcc -bundle -flat_namespace -undefined suppress joystick.o -o joystick.so joystick.o: joystick.c gcc -fPIC -c joystick.c -I/System/Library/Frameworks/Python.framework/Versions/2.3/include/python2.3// joystick.c: joystick.pyx pyrexc joystick.pyx mouse.so: mouse.o gcc -bundle -flat_namespace -undefined suppress mouse.o -o mouse.so mouse.o: mouse.c gcc -fPIC -c mouse.c -I/System/Library/Frameworks/Python.framework/Versions/2.3/include/python2.3// mouse.c: mouse.pyx pyrexc mouse.pyx endif pyepl-1.1.0+git12-g365f8e3/code/hardware/__init__.py000066400000000000000000000051641127617341700215730ustar00rootroot00000000000000# PyEPL: hardware/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This package provides an interface to all the hardware and platform specific functionality that pyEPL needs. The interface should always work the same regardless of the underlying implementation. """ import eventpoll import keyboard import graphics import mouse import joystick import timing import vr import rt import eeg import sound import pygame import sys modules = [timing, keyboard, mouse, joystick, graphics, eventpoll, vr, eeg, sound] def initialize(**options): global modules pygame.init() pygame.mixer.quit() for m in modules: m.initialize(**options) def finalize(): global modules rmodules = modules[:] rmodules.reverse() for m in rmodules: m.finalize() pygame.quit() # Timing Features universal_time = timing.universal_time timedCall = timing.timedCall pollEvents = eventpoll.pollEvents addPollCallback = eventpoll.addPollCallback removePollCallback = eventpoll.removePollCallback delay = timing.delay wait = timing.wait uSleep = timing.uSleep # Keyboard Features nameToKey = keyboard.nameToKey keyToName = keyboard.keyToName keyNames = keyboard.keyNames setKeyboardCallback = keyboard.setKeyboardCallback # Mouse Features setMousePosition = mouse.setMousePosition setMouseVisibility = mouse.setMouseVisibility setMouseCallbacks = mouse.setMouseCallbacks getMouseRange = mouse.getMouseRange # Joystick Features getJoystickFeatures = joystick.getJoystickFeatures setJoystickCallbacks = joystick.setJoystickCallbacks # Graphics Features toggleFullscreen = graphics.toggleFullscreen getFullscreen = graphics.getFullscreen getResolution = graphics.getResolution setVideoCaption = graphics.setVideoCaption clearScreen = graphics.clearScreen makeVideoChanges = graphics.makeVideoChanges startVideo = graphics.startVideo stopVideo = graphics.stopVideo setGammaRamp = graphics.setGammaRamp getShowFPS = graphics.getShowFPS # EEG Features if sys.platform=='darwin': AWCard = eeg.awCard else: Parallel = eeg.Parallel EEGShmAttached = eeg.shmAttached EEGShmAttach = eeg.shmAttach EEGShmDetach = eeg.shmDetach EEGRecStart = eeg.recStart EEGRecStop = eeg.recStop EEGGetOffset = eeg.getOffset EPLScalpEEGException = eeg.EPLScalpEEGException # Sound Features EPLSound = sound.EPLSound SoundFile = sound.SoundFile # VR Features # GUI Features pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/000077500000000000000000000000001127617341700202145ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/Makefile000066400000000000000000000006421127617341700216560ustar00rootroot00000000000000# PyEPL: hardware/eeg/Makefile # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. all: pulse scalp pulse: FORCE $(MAKE) -C pulse scalp: FORCE $(MAKE) -C scalp FORCE: pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/__init__.py000066400000000000000000000013241127617341700223250ustar00rootroot00000000000000# PyEPL: hardware/eeg/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. from scalp import shmAttached, shmAttach, shmDetach, recStart, recStop, getOffset, EPLScalpEEGException import sys if sys.platform=='darwin': from pulse import awCard else: from pulse import Parallel # from pulse import openPort, closePort, setState, setSignal, EPLPulseEEGException def initialize(**options): """ """ pass def finalize(): """ """ pass pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/000077500000000000000000000000001127617341700213445ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/Makefile000066400000000000000000000034631127617341700230120ustar00rootroot00000000000000# PyEPL: hardware/eeg/pulse/Makefile # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. PLATFORM = $(shell uname) INCLUDEPY=$(shell python -c "import distutils.sysconfig;print distutils.sysconfig.get_config_var('INCLUDEPY')") include ../../../../Makefile.common ifeq ($(PLATFORM), Linux) all: _parallel.so _parallel.so: parallel.o parallel.i swig -c++ -python parallel.i g++ -pthread -fno-strict-aliasing -DNDEBUG -O2 -Wall -fPIC -I$(INCLUDEPY) -c parallel_wrap.cxx -o parallel_wrap.o g++ -lpthread -shared parallel_wrap.o parallel.o -o _parallel.so parallel.o: parallel.cpp parallel.h g++ -pthread -fno-strict-aliasing -DNDEBUG -O2 -Wall -fPIC -I$(INCLUDEPY) -c parallel.cpp -o parallel.o endif ifeq ($(PLATFORM), Darwin) all: _awCard.so INCLUDEPY=$(shell python -c "import distutils.sysconfig;print distutils.sysconfig.get_config_var('INCLUDEPY')") LIBPY=$(shell python -c "import distutils.sysconfig;print distutils.sysconfig.get_config_var('LIBPL')") PYTHON_INC = $(INCLUDEPY) PYTHON_LIB = $(LIBPY) FLAGS1 = -Wno-long-double -DHAVE_CONFIG_H FLAGS2 = -bundle -undefined suppress -flat_namespace -lpthread FLAGS3 = -fno-strict-aliasing -Wno-long-double -no-cpp-precomp \ -mno-fused-madd -fno-common -dynamic -DNDEBUG -O2 -Wall _awCard.so: awCard.o awCard.i swig -c++ -python awCard.i g++ $(FLAGS1) -I$(PYTHON_INC) -L$(PYTHON_LIB) -c awCard_wrap.cxx g++ $(FLAGS2) awCard.o awCard_wrap.o -o $@ -law awCard.o: awCard.cpp awCard.h g++ $(FLAGS3) -I$(PYTHON_INC) -c $*.cpp -o $@ awctest: awCard.cpp awCard.h g++ -g -o $@ awCard.cpp -law endif clean: rm -f *.o *.so *.cxx pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/__init__.py000066400000000000000000000007521127617341700234610ustar00rootroot00000000000000# PyEPL: hardware/eeg/pulse/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. import sys from pulseexc import EPLPulseEEGException if sys.platform=='darwin': from awCard import awCard else: from parallel import Parallel pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/awCard.cpp000066400000000000000000000073551127617341700232630ustar00rootroot00000000000000#include "awCard.h" using std::cout; awCard::awCard(bool debugmode, unsigned char *pinDirections, int mode):debug(debugmode), eventsmode(mode){ try{ if (aw_init()){ throw AWCException("Unable to initialize driver. Exiting."); } else if (debug){ cout << "Initialized driver." << endl; } number_of_boards = 0; if (aw_numberOfConnectedBoards(&number_of_boards)){ throw AWCException("Unable to retrieve number of boards connected. Exiting."); } if (!number_of_boards){ throw AWCException("No ActiveWire boards connected. Exiting."); } cout << static_cast(number_of_boards) << " ActiveWire USB board connected." << endl; allOff_str = ALLOFF; allOn_str = ALLON; //set mode to output aw_binaryToDecimal(pinDirections, 2, decimal_array); if (aw_setDirectionsOfPinSets(0, decimal_array[0], decimal_array[1])){ throw AWCException("Unable to set the IO pins' directions. Exiting."); } else if (debug){ cout << "Set IO pins' directions." << endl; } if (aw_setEventDeliveryMethod(eventsmode, //defaults to AW_EVENT_DELIV_BUFFER NULL, NULL, NULL, 0)){ throw AWCException("Unable to set event delivery method. Exiting."); } allOff(); if (eventsmode==AW_EVENT_DELIV_BUFFER){ clearEvents(); } } catch (AWCException &e){ e.debug_print(); throw; } } awCard::~awCard(){ aw_close(); cout << "Closed ActiveWire board(s)." << endl; } void awCard::write(unsigned char *s){ try{ aw_binaryToDecimal(s, 2, decimal_array); if (aw_writeData(0, decimal_array, 2)){ throw AWCException("Unable to write data. Exiting."); } } catch (AWCException &e){ e.debug_print(); throw; //rethrow so the exception appears in python } } void awCard::allOn(){ write(allOn_str); } void awCard::allOff(){ write(allOff_str); } bool awCard::anyEvents(){ if (eventsmode!=AW_EVENT_DELIV_BUFFER){ throw AWCException("Wrong event delivery mode for anyEvents()."); } AW_EVENT_LIST eventList = aw_getEvents(); int numEvents = eventList->numberOfEvents; if (debug) { if (numEvents > 0){ cout << "numEvents: " << numEvents << endl; for (int i=0; ievents[i]->boardData, 1, binary_read_buffer); printf("Last event:\n Board: %d\n Type: %d\n Time: (s: %d, ns: %d)\n IO Pin 0: %d\n", eventList->events[i]->boardNumber, eventList->events[i]->eventType, (int)eventList->events[i]->timestamp.tv_sec, (int)eventList->events[i]->timestamp.tv_nsec, binary_read_buffer[0]); } cout << endl << "*******" << endl; } } aw_clearEvents(); return (numEvents > 0); } bool awCard::anyBitVal(int bit, int val){ if (eventsmode!=AW_EVENT_DELIV_BUFFER){ throw AWCException("Wrong event delivery mode for anyEvents()."); } // get the events AW_EVENT_LIST eventList = aw_getEvents(); int numEvents = eventList->numberOfEvents; bool answer = false; // traverse the event list and look for val on pin # bit for (int i=0; ievents[i]->boardData, 1, binary_read_buffer); if (static_cast(binary_read_buffer[bit])==val){ answer = true; break; } } // clear the events aw_clearEvents(); return answer; } bool awCard::anyLowEvents(){ return anyBitVal(0, 0); } bool awCard::anyHighEvents(){ return anyBitVal(0, 1); } void awCard::clearEvents(){ if (eventsmode!=AW_EVENT_DELIV_BUFFER){ throw AWCException("Wrong event delivery mode for anyEvents()."); } aw_clearEvents(); } int main(){ awCard a(true); while (true){ if (a.anyLowEvents()){ cout << "got a low signal." << endl; } } } pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/awCard.h000066400000000000000000000017571127617341700227300ustar00rootroot00000000000000#ifndef AWCARD_H #define AWCARD_H #include #include #include "aw_lib.h" #define ALLON (unsigned char *)"1111111111111111" #define ALLOFF (unsigned char *)"0000000000000000" using std::cerr; using std::endl; using std::string; class awCard{ bool debug; int eventsmode; unsigned char number_of_boards; static const int binary_length = 8; unsigned char decimal_array[2], binary_array[binary_length]; unsigned char decimal_read_buffer[2], binary_read_buffer[binary_length]; unsigned char *allOn_str, *allOff_str; public: awCard(bool debug=false, unsigned char *pinDirections=ALLON, int mode=AW_EVENT_DELIV_BUFFER); ~awCard(); void write(unsigned char *s); void allOn(); void allOff(); bool anyEvents(); bool anyBitVal(int, int); bool anyLowEvents(); bool anyHighEvents(); void clearEvents(); }; class AWCException{ string msg; public: AWCException(string s):msg(s){} void debug_print(){ cerr << "ActiveWire error: " << msg << endl; } }; #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/awCard.i000066400000000000000000000006021127617341700227150ustar00rootroot00000000000000%module awCard %{ #include "awCard.h" %} %typemap(python, in) unsigned char * { $1 = (unsigned char *)PyString_AsString($input); } %include exception.i %exception { try { $function } catch(AWCException) { SWIG_exception(SWIG_RuntimeError, "Uncaught exception from ActiveWire card interface!\nSee line beginning \"ActiveWire error\" above for details."); } } %include "awCard.h" pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/aw_lib.h000066400000000000000000000101371127617341700227540ustar00rootroot00000000000000/* Copyright (C) 2006 Dave Keck This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #ifdef __cplusplus extern "C" { #endif #include #include /* Event stuff */ enum event_types { AW_EVENT_BOARD_CONNECTED = 1, AW_EVENT_BOARD_DISCONNECTED, AW_EVENT_BOARD_DATA_CHANGED }; typedef unsigned char AW_EVENT_TYPE; /* aw_event structure is aligned and size is divisible by 4; should be portable, to both 32- and 64-bit machines. */ typedef struct aw_event { struct timespec timestamp; /* The time the event occurred. */ unsigned char boardNumber; /* Board that the event applies to. */ unsigned char boardData[2]; /* A two-byte array containing the board's state when the event occurred. */ AW_EVENT_TYPE eventType; /* Event type; see event_types above. */ } aw_event, * AW_EVENT; /* aw_event_list structure is aligned and and padded so size is divisible by 4; should be portable to both 32- and 64-bit machines. */ typedef struct aw_event_list { AW_EVENT *events; unsigned short numberOfEvents; unsigned char pad[2]; } aw_event_list, * AW_EVENT_LIST; /* Event delivery methods */ enum aw_delivery_methods { AW_EVENT_DELIV_NONE = 0, /* Disregard all events. */ AW_EVENT_DELIV_CALLBACK, /* Deliver events immediatley via the three callbacks. */ AW_EVENT_DELIV_BUFFER /* Buffer events until they're acquired using aw_getEvents. */ }; typedef unsigned char AW_EVENT_DELIV_METHOD; /* Define the possible errors, which hopefully never see the light of day. */ enum aw_err { AW_ERR_NONE = 0, /* No error */ AW_ERR_NOT_INIT, /* Not initialized */ AW_ERR_ALREADY_INIT, /* Already initialized */ AW_ERR_INTERNAL, /* Internal error */ AW_ERR_LOCAL_SOCKET, /* Unable to create socket to interface with server */ AW_ERR_CONTACT_SERV, /* Unable to contact server */ AW_ERR_AUTH, /* Unable to authorize client, password is probably incorrect */ AW_ERR_ENCRYPT, /* Unable to encrypt password for transit to server */ AW_ERR_LEN_NOT_DIV_2 /* Length is not divisible by two. */ }; typedef unsigned char AW_ERR; /* Callback Typedefs */ typedef void (*BoardConnectedCallback) (AW_EVENT event); typedef void (*BoardDisconnectedCallback) (AW_EVENT event); typedef void (*BoardDataChangedCallback) (AW_EVENT event); /* Functions */ AW_ERR aw_init(); AW_ERR aw_initWithAddress(char *address, char *password); void aw_close(); AW_ERR aw_setDirectionsOfPinSets(unsigned char boardNumber, unsigned char firstPinSetDirections, unsigned char secondPinSetDirections); AW_ERR aw_readData(unsigned char boardNumber, unsigned char *buffer, unsigned short length); AW_ERR aw_writeData(unsigned char boardNumber, unsigned char *data, unsigned short length); AW_ERR aw_setEventDeliveryMethod(AW_EVENT_DELIV_METHOD newDeliveryMethod, BoardConnectedCallback newBoardConnectedCallback, /* Callbacks only used when deliveryMethod == AW_DELIV_CALLBACK */ BoardDisconnectedCallback newBoardDisconnectedCallback, BoardDataChangedCallback newBoardDataChangedCallback, unsigned short newMaxEvents); /* maxEvents is only used when deliveryMethod == AW_DELIV_BUFFER. */ AW_EVENT_LIST aw_getEvents(); void aw_clearEvents(); AW_ERR aw_numberOfConnectedBoards(unsigned char *numberOfBoards); void aw_decimalToBinary(unsigned char *decimalArray, unsigned short arrayLength, unsigned char *binaryArray); void aw_binaryToDecimal(unsigned char *binaryArray, unsigned short arrayLength, unsigned char *decimalArray); #ifdef __cplusplus } #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/eplPulse.c000066400000000000000000000025531127617341700233060ustar00rootroot00000000000000// PyEPL: hardware/eeg/pulse/eplPulse.c // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #include "eplPulse.h" // File descriptor int fd = -1; int eplOpenPort() { int failure = 0; fd = open("/dev/parport0",O_WRONLY,0); if (fd != -1) { // claim the port failure = ioctl(fd,PPCLAIM); // close if failed if (failure) { // close the port eplClosePort(); } } else { failure = -1; } return failure; } void eplClosePort() { if (fd != -1) { // release the port ioctl(fd, PPRELEASE); // close the port close(fd); fd = -1; } } int eplSetPortState(int state) { struct ppdev_frob_struct frob; unsigned char data; int failure = 0; // standard mask frob.mask = PARPORT_CONTROL_STROBE; // check what state to set if (state == 0) { // turn it off frob.val = 0; data = 0; } else { // turn it on frob.val = PARPORT_CONTROL_STROBE; data = 0xFF; } // talk to the port failure = ioctl(fd, PPWDATA, &data); if (!failure) { failure = ioctl(fd, PPFCONTROL, &frob); } return failure; } pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/eplPulse.h000066400000000000000000000010651127617341700233100ustar00rootroot00000000000000// PyEPL: hardware/eeg/pulse/eplPulse.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #ifndef _EPLPULSE_H_ #define _EPLPULSE_H_ #include #include #include #include int eplOpenPort(); void eplClosePort(); int eplSetPortState(int state); #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/macpulse.py000066400000000000000000000032621127617341700235320ustar00rootroot00000000000000# PyEPL: hardware/eeg/pulse/macpulse.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ Sends out synch pulses via the ActiveWire USB device for macs only. """ from pulseexc import EPLPulseEEGException import objc board=None def initialize(**options): pass def finalize(): pass def openPort(): global board objc.loadBundle('ActiveWireBoard',globals(),bundle_path='/Library/Frameworks/ActiveWireBoard.framework'); board=ActiveWireBoard.alloc() board.init() if board.openBoard()==False: print 'error opening board' raise EPLPulseEEGException("Couldn't open ActiveWire Board") if board.setBinaryPinDirections_("1111111111111111") == False: raise EPLPulseEEGException("Couldn't set pin directions") setState(False) #force the board to always start low def closePort(): global board board.closeBoard() board=None def setState(state): global board if state: ret=board.writeBinaryData_length_("1111111111111111",2) else: ret=board.writeBinaryData_length_("0000000000000000",2) if not ret: raise EPLPulseEEGException("Error writing to the Activewireboard") def setSignal(state, signal): global board if state: ret=board.writeBinaryData_length_(signal, 2) else: ret=board.writeBinaryData_length_("0000000000000000",2) if not ret: raise EPLPulseEEGException("Error writing to the Activewireboard") pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/parallel.cpp000066400000000000000000000041271127617341700236500ustar00rootroot00000000000000#include "parallel.h" const char *Parallel::devstr = "/dev/parport0"; const unsigned int Parallel::numPins = 8;\ Parallel::Parallel(){ int failure = 0; fd = open(devstr, O_WRONLY, 0); if (fd != -1){ // claim the port failure = ioctl(fd, PPCLAIM); // close if failed if (failure){ throw ParallelException("Failed to claim parallel port."); } } else{ throw ParallelException("Failed to open parallel port device " + string(devstr)); } } Parallel::~Parallel(){ // release the port ioctl(fd, PPRELEASE); // close the port close(fd); } void Parallel::setState(int state){ struct ppdev_frob_struct frob; unsigned char data; int failure = 0; // standard mask frob.mask = PARPORT_CONTROL_STROBE; // check what state to set if (state == 0){ // turn it off frob.val = 0; data = 0; } else { // turn it on frob.val = PARPORT_CONTROL_STROBE; data = 0xFF; } // talk to the port failure = ioctl(fd, PPWDATA, &data); if (!failure){ failure = ioctl(fd, PPFCONTROL, &frob); } if (failure){ throw ParallelException("Failed to set pin state in ioctl."); } } unsigned char Parallel::binaryStringToNum(unsigned char *str){ if (strlen((const char *)str)!=numPins){ throw ParallelException("Invalid signal string."); } unsigned char numVal = 0; for (unsigned int i=0; i(atoi(&thisone)*pow(2, i)); } return numVal; } void Parallel::setSignal(unsigned char *signal){ struct ppdev_frob_struct frob; unsigned char data = binaryStringToNum(signal); int failure = 0; // standard mask frob.mask = PARPORT_CONTROL_STROBE; // turn it on frob.val = PARPORT_CONTROL_STROBE; // talk to the port failure = ioctl(fd, PPWDATA, &data); if (!failure){ failure = ioctl(fd, PPFCONTROL, &frob); } if (failure){ throw ParallelException("Failed to set pin state in ioctl."); } } pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/parallel.h000066400000000000000000000013371127617341700233150ustar00rootroot00000000000000#ifndef PARALLEL_H #define PARALLEL_H #include #include #include #include #include #include #include #include #include using namespace std; /* using std::string; */ /* using std::cerr; */ /* using std::endl; */ class Parallel { int fd; static const char *devstr; static const unsigned int numPins; unsigned char binaryStringToNum(unsigned char *); public: Parallel(); ~Parallel(); void setState(int); void setSignal(unsigned char *); }; class ParallelException{ string msg; public: ParallelException(string s):msg(s){} void debug_print(){ cerr << "Parallel port error: " << msg << endl; } }; #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/parallel.i000066400000000000000000000010141127617341700233060ustar00rootroot00000000000000%module parallel %{ #include "parallel.h" %} #ifdef SWIGPYTHON %typemap(in) unsigned char * { $1 = (unsigned char *)PyString_AsString($input); } #endif /* %typemap(python, in) unsigned char * { */ /* $1 = (unsigned char *)PyString_AsString($input); */ /* } */ %include exception.i %exception { try { $function } catch(ParallelException) { SWIG_exception(SWIG_RuntimeError, "Uncaught exception from Parallel port interface!\nSee line beginning \"Parallel port error\" above for details."); } } %include "parallel.h" pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/pulse.pyx000066400000000000000000000024201127617341700232340ustar00rootroot00000000000000# PyEPL: hardware/eeg/pulse/pulse.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ Module to send synch pulses out the parallel port. """ # Sync Pulse Module from pulseexc import EPLPulseEEGException # file descriptor object #cdef object f cdef extern int eplOpenPort() cdef extern void eplClosePort() cdef extern int eplSetPortState(int state) def openPort(): """ Opens the /dev/parport file object """ #f = open("/dev/parport0","w") failure = eplOpenPort() if failure: raise EPLPulseEEGException("Couldn't open parport.") def closePort(): """ Closes the /dev/parport file object """ #f.close() eplClosePort() def setState(state): """ Turns the pulse on(1) or off(0) depending on the state parameter. """ failure = eplSetPortState(state) if failure: raise EPLPulseEEGException("Couldn't set parport state.") def setSignal(signal): """ Sends a specific signal to the parpoprt. """ raise EPLPulseEEGException("Not implemented yet.") pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/pulse/pulseexc.py000066400000000000000000000010561127617341700235500ustar00rootroot00000000000000# PyEPL: hardware/eeg/pulse/pulseexc.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. from pyepl.exceptions import EPLException class EPLPulseEEGException(EPLException): def __init__(self, desc): self.desc = desc def __str__(self): return "EPL Pulse EEG Exception: %s" % self.desc pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/000077500000000000000000000000001127617341700213165ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/Makefile000066400000000000000000000021731127617341700227610ustar00rootroot00000000000000# PyEPL: hardware/eeg/scalp/Makefile # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. all: scalp.so include ../../../../Makefile.common PLATFORM = $(shell uname) ifeq ($(PLATFORM), Linux) scalp.so: scalp.o epleeg.o epleeg_wrapper.o c++ -shared scalp.o epleeg.o epleeg_wrapper.o -o scalp.so epleeg.o: epleeg.cpp g++ -c -fPIC epleeg.cpp epleeg_wrapper.o: epleeg_wrapper.cpp g++ -c -fPIC epleeg_wrapper.cpp scalp.o: scalp.c gcc -c -fPIC -I$(INCLUDEPY) scalp.c scalp.c: scalp.pyx pyrexc scalp.pyx endif ifeq ($(PLATFORM), Darwin) scalp.so: scalp.o epleeg.o epleeg_wrapper.o c++ -bundle -flat_namespace -undefined suppress scalp.o epleeg.o epleeg_wrapper.o -o scalp.so epleeg.o: epleeg.cpp g++ -fPIC -c epleeg.cpp epleeg_wrapper.o: epleeg_wrapper.cpp g++ -fPIC -c epleeg_wrapper.cpp scalp.o: scalp.c gcc -fPIC -c scalp.c -I$(INCLUDEPY) scalp.c: scalp.pyx pyrexc scalp.pyx endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/__init__.py000066400000000000000000000005461127617341700234340ustar00rootroot00000000000000# PyEPL: hardware/eeg/scalp/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. from scalp import * pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/cardinfo.h000066400000000000000000000017411127617341700232570ustar00rootroot00000000000000// PyEPL: hardware/eeg/scalp/cardinfo.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #ifndef _CARDINFO_H_ #define _CARDINFO_H_ /*--------------------- Share Memory Declaration ----------------------------*/ #define S_S 2 /* sample size */ /*--------------------- Channel Information ---------------------------------*/ #define NCARDS 1 /* total number of cards in system */ #define CH_PER_CARD 64 /* total channels per card */ #define CH NCARDS*CH_PER_CARD /* total number of channels recording from */ /* -------------------- Sampling Rates --------------------------------------*/ #define SR 256 /* Sampling Rate */ #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/epleeg.cpp000066400000000000000000000057741127617341700233000ustar00rootroot00000000000000// PyEPL: hardware/eeg/scalp/epleeg.cpp // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #include "epleeg.h" EEG::EEG() { // not attached share = NULL; } EEG::~EEG() { // Stop recording if recording RecStop(); // Detach ShmDetach(); } int EEG::Attached() { return (share != NULL); } int EEG::ShmAttach() { void *shared_memory = (void *) 0; int shm_id; if (share == NULL) { // attach to the KERNEL module's shared memory rt_shm = (struct SharedMem *) mbuff_attach(SHARED_MEM_NAME, sizeof(struct SharedMem)); if (!rt_shm || rt_shm->magic != SHARED_MEM_MAGIC ) { //fprintf(stderr, "Cannot attach to shared memory.. " // "load rt_broker_module.o!\n"); rt_shm=NULL; return ERROR_MBUFF_ATTACH; } // attach to BROKER's shared memory shm_id = shmget((key_t)SHARE_KEY, sizeof(struct shared_use_st), 0666); // Checking shared memory if(shm_id == -1) { //cerr << "SHMGET: Did not attach to EEG shared memory.\n"; share = NULL; return ERROR_SHMEM_ATTACH; } // Make broker's shared memory accessible by program shared_memory = (struct shared_use_st*)shmat(shm_id,(void *)0, 0); if(shared_memory == (void *)-1) { //cerr << "SHMAT: Did not attach to EEG shared memory.\n"; share = NULL; return ERROR_SHMEM_ACCESS; } // Make pointer to the broker's share memory share = (struct shared_use_st *)shared_memory; if (share->magic !=SHARED_MEM_MAGIC){ //cerr << "Shared memory does not have the right magic key. Check that the header versions are all in sync\n"; share = NULL; return ERROR_SHMEM_MAGIC; } } return 0; } int EEG::ShmDetach() { // Clean shared memory if needed if (share != NULL) { if (shmdt(share) == -1) { //cerr << "Failed to detach from shared memory.\n"; return -1; } share=NULL; } return 0; } int EEG::RecStart(char *filename) { // make sure that we are attached if (share == NULL) { return -1; } // we are attached, so go for it! // set the filename strncpy(share->file_name,filename,FILE_NAME_SIZE); // set the record state share->file_state = FILE_REC_START; start_rec_time = rt_shm->scan_index; // sleep for a tiny bit to allow for recording to start //usleep(1000*500); return 0; } int EEG::RecStop() { // make sure that we are attached if (share == NULL) { return -1; } // we are attached, set the record state share->file_state = FILE_REC_STOP; return 0; } long EEG::GetOffset() { // make sure that we are attached if (share == NULL) { return 0; } // return the offset into the eeg file return rt_shm->scan_index - start_rec_time + 1; } pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/epleeg.h000066400000000000000000000017521127617341700227350ustar00rootroot00000000000000// PyEPL: hardware/eeg/scalp/epleeg.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #ifndef __EPLEEG_H #define __EPLEEG_H #include "mbuff.h" #include #include #include #include #include "shmem_struct.h" #include "rt_broker_module.h" using namespace std; // Defines for error catching #define ERROR_MBUFF_ATTACH -1 #define ERROR_SHMEM_ATTACH -2 #define ERROR_SHMEM_ACCESS -3 #define ERROR_SHMEM_MAGIC -4 class EEG { public: EEG(); ~EEG(); int Attached(); int ShmAttach(); int ShmDetach(); int RecStart(char *filename); int RecStop(); long GetOffset(); private: struct shared_use_st *share; struct SharedMem *rt_shm; unsigned long long start_rec_time; }; #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/epleeg_wrapper.cpp000066400000000000000000000014571127617341700250320ustar00rootroot00000000000000// PyEPL: hardware/eeg/scalp/epleeg_wrapper.cpp // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #include "epleeg.h" // create instance of class EEG eeg; // Wrapped methods extern "C" int eegAttached() { return eeg.Attached(); } extern "C" int eegShmAttach() { return eeg.ShmAttach(); } extern "C" int eegShmDetach() { return eeg.ShmDetach(); } extern "C" int eegRecStart(char *filename) { return eeg.RecStart(filename); } extern "C" int eegRecStop() { return eeg.RecStop(); } extern "C" long eegGetOffset() { return eeg.GetOffset(); } pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/mbuff.h000066400000000000000000000150331127617341700225700ustar00rootroot00000000000000// PyEPL: hardware/eeg/scalp/mbuff.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #ifndef __MBUFF_H #define __MBUFF_H #ifdef __cplusplus extern "C" { #endif #define RTL_SHM_MISC_MINOR 254 /* max length of the name of the shared memory area */ #define MBUFF_NAME_LEN 32 /* max number of attached mmaps per one area */ #define MBUFF_MAX_MMAPS 16 #ifdef SHM_DEMO #define MBUFF_DEV_NAME "./mbuff" #else #define MBUFF_DEV_NAME "/dev/mbuff" #endif #ifdef __KERNEL__ #include #include #else #include #include #include #include #include #include #include #include #endif #define MBUFF_VERSION "0.7.2" /* All ioctl()s are called with name filled in with the appropriate name for the mbuff to be referenced. Calls to any ioctl() makes that mbuff "active", i.e., read(), write(), and mmap() use that mbuff. I didn't do this yet. ioctl()s: ALLOCATE: Call with size=0 to just find out if the area exists; no mbuff will be allocated. Otherwise, allocate an mbuff with that size. DEALLOCATE: Decrease reference count for an mbuff. issues: - using this method, it is *really* easy to get dangling mbuffs, i.e., mbuffs that nobody owns. When you close /dev/mbuff, it would be a good idea to decrease the ref count of the active mbuff. */ #define IOCTL_MBUFF_INFO 0 #define IOCTL_MBUFF_ALLOCATE 1 #define IOCTL_MBUFF_DEALLOCATE 2 #define IOCTL_MBUFF_SELECT 3 #define IOCTL_MBUFF_LAST IOCTL_MBUFF_SELECT struct mbuff_request_struct{ unsigned int flags; char name[MBUFF_NAME_LEN+1]; size_t size; unsigned int reserved[4]; }; #ifndef __KERNEL__ /* you can use mbuff_alloc several times, the buffer will be deallocated when mbuff_free was called the same number of times AND area is not mmaped anywhere anymore AND it is not used in the kernel as well */ /* if you have a need to mmap the area at the specific address, use * mbuff_alloc_at */ inline void * mbuff_alloc_at(const char *name, int size, void * addr) { int fd; struct mbuff_request_struct req={0,"default",0,{0}}; void * mbuf; if(name) strncpy(req.name,name,sizeof(req.name)); req.name[sizeof(req.name)-1]='\0'; req.size = size; if(( fd = open(MBUFF_DEV_NAME,O_RDWR) ) < 0 ){ perror("open failed"); return NULL; } size=ioctl(fd,IOCTL_MBUFF_ALLOCATE,&req); if(size 0) munmap( mbuf, size); close(fd); /* in general, it could return size, but typical "free" is void */ return; } /* mbuff_attach and mbuff_detach do not change usage counters - area allocated using mbuff_attach will be deallocated on program exit/kill if nobody else uses it - mbuff_detach is not needed - the only lock keeping area allocated is mmap */ inline void * mbuff_attach_at(const char *name, int size, void * addr) { int fd; struct mbuff_request_struct req={0, "default", 0, {0}}; void * mbuf; if(name) strncpy(req.name, name, sizeof(req.name)); req.name[sizeof(req.name)-1]='\0'; req.size = size; if(( fd = open(MBUFF_DEV_NAME, O_RDWR) ) < 0 ){ perror("open failed"); return NULL; } ioctl(fd,IOCTL_MBUFF_ALLOCATE,&req); mbuf=mmap(addr, size, PROT_WRITE|PROT_READ, MAP_SHARED|MAP_FILE, fd, 0); /* area will be deallocated on the last munmap, not now */ ioctl(fd, IOCTL_MBUFF_DEALLOCATE, &req); if( mbuf == (void *) -1) mbuf=NULL; close(fd); return mbuf; } inline void * mbuff_attach(const char *name, int size) { return mbuff_attach_at(name, size, NULL); } inline void mbuff_detach(const char *name, void * mbuf) { int fd; struct mbuff_request_struct req={0,"default",0,{0}}; int size; if(name) strncpy(req.name,name,sizeof(req.name)); req.name[sizeof(req.name)-1]='\0'; if(( fd = open(MBUFF_DEV_NAME,O_RDWR) ) < 0 ){ perror("open failed"); return; } size=ioctl(fd,IOCTL_MBUFF_SELECT,&req); if(size > 0) munmap( mbuf, size); close(fd); /* in general, it could return size, but typical "free" is void */ return; } #else struct mbuff{ struct mbuff *next; struct mbuff *prev; char name[MBUFF_NAME_LEN+1]; struct vm_area_struct *(vm_area[MBUFF_MAX_MMAPS]); struct file *file; unsigned char *buf; unsigned long size; int count; /* number of allocations from user space */ int kcount; /* number of allocations from kernel space */ int open_cnt; /* #times opened */ int open_mode; }; extern struct mbuff * mbuff_list_lookup_name(const char *name,int priority); extern struct mbuff * mbuff_list_lookup_buf(void *buf); extern int shm_allocate(const char *name,unsigned int size, void **shm); extern int shm_deallocate(void * shm); static inline void * mbuff_alloc(const char *name, int size) { void *tmp=NULL; if( shm_allocate(name, size, &tmp) > 0 ) return tmp; else return NULL; } static inline void mbuff_free(const char *name, void * mbuf) { /* it would be no problem to deallocate using only name */ shm_deallocate(mbuf); } /* in kernel space implementing "nonlocking" attach and detach would be very unsafe (deallocation from user space possible at any time) */ #define mbuff_attach(name,size) mbuff_alloc(name,size) #define mbuff_detach(name,mbuf) mbuff_free(name,mbuf) extern char mbuff_default_name[]; extern int mbuff_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); #ifdef LINUX_V22 extern int mbuff_mmap(struct file *file, struct vm_area_struct *vma); #else extern int mbuff_mmap(struct inode *inode, struct file *file, struct vm_area_struct *vma); #endif extern int mbuff_open_with_name( struct inode *inode, struct file *file, const char * name); #endif #ifdef __cplusplus } #endif #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/rt_broker_module.h000066400000000000000000000021441127617341700250260ustar00rootroot00000000000000// PyEPL: hardware/eeg/scalp/rt_broker_module.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #ifndef _RT_BROKER_MODULE_H #define _RT_BROKER_MODULE_H #ifdef __cplusplus extern "C" { #endif #include "cardinfo.h" #define DEFAULT_RANGE 1 /* [-5,5] range */ #define DEFAULT_AREF AREF_GROUND #define MAX_SAMPLES 1000 #define DEFAULT_SAMPLING_RATE_HZ SR #define DEFAULT_FIFO_MINOR 0 // /dev/rtf0 #define DEFAULT_FIFO_SIZE (MAX_SAMPLES * sizeof(sampl_t) * CH_PER_CARD) #define STR_(x) #x #define STR(x) "" STR_(x) "" #ifdef __KERNEL__ #define const_ #else #define const_ const #endif #define SHARED_MEM_MAGIC (0xdeadbeef) // Mmmmm, delicious struct SharedMem { const_ unsigned int ai_subdev; const_ unsigned long long scan_index; const_ int magic; }; #define SHARED_MEM_NAME "Shared Memory Jubba Jubba" #ifdef __cplusplus } #endif #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/scalp.pyx000066400000000000000000000050261127617341700231650ustar00rootroot00000000000000# PyEPL: hardware/eeg/scalp/scalp.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ Module to communicate with a scalp EEG shared memory. """ from pyepl.exceptions import EPLException class EPLScalpEEGException(EPLException): def __init__(self, desc): self.desc = desc def __str__(self): return "EPL EEG Exception: %s" % self.desc # external declarations cdef extern int eegAttached() cdef extern int eegShmAttach() cdef extern int eegShmDetach() cdef extern int eegRecStart(char *filename) cdef extern int eegRecStop() cdef extern long eegGetOffset() # error defines ERROR_MBUFF_ATTACH = -1 ERROR_SHMEM_ATTACH = -2 ERROR_SHMEM_ACCESS = -3 ERROR_SHMEM_MAGIC = -4 # python wrappers def shmAttached(): """ Check to see if the object is attached to shared memory. """ return eegAttached() def shmAttach(): """ Attach to the shared memory for communcation. """ ret = eegShmAttach() if ret != 0: # error, so raise exception if ret == ERROR_MBUFF_ATTACH: raise EPLScalpEEGException("Unable to attach to kernel shared memory. Load rt_broker_module.o") elif ret == ERROR_SHMEM_ATTACH: raise EPLScalpEEGException("SHMGET: Did not attach to EEG shared memory.") elif ret == ERROR_SHMEM_ACCESS: raise EPLScalpEEGException("SHMAT: Could not access EEG shared memory.") elif ret == ERRO_SHMEM_MAGIC: raise EPLScalpEEGException("Shared memory does not have the right magic key. Check that the header versions are all in sync.") def shmDetach(): """ Detach from shared memory. """ ret = eegShmDetach() if ret != 0: raise EPLScalpEEGException("Did not detach from shared memory") def recStart(char *filename): """ Start recording to a file. You must specify the FULL PATH to the file! """ ret = eegRecStart(filename) if ret != 0: raise EPLScalpEEGException("Could not start recording.") def recStop(): """ Stop recording of a file is currently recording. """ ret = eegRecStop() if ret != 0: raise EPLScalpEEGException("Could not stop recording.") def getOffset(): """ Returns the offset into the file since starting recording. """ return eegGetOffset() pyepl-1.1.0+git12-g365f8e3/code/hardware/eeg/scalp/shmem_struct.h000066400000000000000000000035131127617341700242060ustar00rootroot00000000000000// PyEPL: hardware/eeg/scalp/shmem_struct.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #ifndef _SHMEM_STRUCT_H_ #define _SHMEM_STRUCT_H_ #include "cardinfo.h" #define DUR 100 /* Size of circular buffer in seconds */ #define HIST SR/SR /* history buffer size in elements */ #define SHARE_SEM 312 /* The Key to create sempahore */ #define SHARE_KEY 316 /* The Key to create share memory */ /*---------------------------------------------------------------------------*/ #define FILE_STOPPED 0 #define FILE_REC_START 1 #define FILE_RECORDING 2 #define FILE_REC_STOP 3 #define FILE_NAME_SIZE 1024 typedef struct shared_use_st { short int file_state; char file_name[FILE_NAME_SIZE]; unsigned long int time; unsigned long int raw_pos; /* when C arrays are stored in row major order. ie. the first dimension varies most slowly, and the last dimension varies most quickly. SO, we make CH the second dimension in this array so that we can easily memcpy data, as we get data from the card with channels contiguously. */ unsigned short int raw[DUR*SR][CH]; int magic; } shared_use_st; /*----------------------------------------------------------------------*/ /* to be removed after we test josh's row major order changes #define RAW_OUTER CH /* Width of raw circular buffer #define RAW_INNER DUR*SR /* Length of raw circular buffer unsigned short int raw[RAW_OUTER][RAW_INNER]; */ #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/eventpoll.pyx000066400000000000000000000235051127617341700222330ustar00rootroot00000000000000# PyEPL: hardware/eventpoll.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module is responsible for continual event polling for input devices. """ # import the pygame package import pygame # have certain pygame event constants in this namespace from pygame.locals import KEYDOWN, KEYUP, MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN, JOYAXISMOTION, JOYBALLMOTION, JOYHATMOTION, JOYBUTTONUP, JOYBUTTONDOWN, USEREVENT # import the pyepl timing module import timing # declare python variables to hold callbacks for particular kinds of events... cdef object keyboard_callback cdef object mouse_movement_callback cdef object mouse_buttons_callback cdef object joystick_axis_callback cdef object joystick_balls_callback cdef object joystick_buttons_callback cdef object joystick_hats_callback cdef object poll_callbacks # this one is called at every iteration of the event loop # declare a variable for a python list - it will be a queue for events read # from pygame, but not yet processed cdef object event_queue # declare an integer which holds the number of times the pollEvents function is # currently in the call stack cdef int recurse_level # declare a python object for store the time of the last event polling cdef object last_poll # declare a floating point variable to store the threshold below which the # absolute value of a joystick axis is considered to be zero cdef float js_zero_threshold def setJSZeroThreshold(float x): """ Set the joystick zero threshold to x. """ global js_zero_threshold js_zero_threshold = x def setJoystickCallbacks(axis, balls, buttons, hats): """ Set the four callbacks for joystick-related events... axis - Called when a joystick axis changes position balls - Called when a joystick ball is moved buttons - Called when a joystick button is pressed or released hats - Called when a joystick hat is moved from one position to another """ # set variables as global in this function... global joystick_axis_callback global joystick_balls_callback global joystick_buttons_callback global joystick_hats_callback # assign variables... joystick_axis_callback = axis joystick_balls_callback = balls joystick_buttons_callback = buttons joystick_hats_callback = hats def setKeyboardCallback(c): """ After this call, any keyboard event will result in the call "c(key, pressed, timestamp)", where key is a key identifier and pressed is True or False for depressed and released, respectively. """ global keyboard_callback keyboard_callback = c def setMouseCallbacks(movement, buttons): """ After this call, any mouse movement event will result in the call "movement(absolute_position, position_change, timestamp)" and any mouse button event will result in the call "buttons(button, pressed, timestamp)". """ # set variables as global in this function... global mouse_movement_callback global mouse_buttons_callback # assign variables... mouse_movement_callback = movement mouse_buttons_callback = buttons def addPollCallback(c, *targs, **dargs): """ Call function c at every polling of events. All remaining parameters, both positional and keyword, will be passed to c when it is called. """ global poll_callbacks poll_callbacks.append((c, targs, dargs)) def removePollCallback(c): """ Stop calling function c at each polling of events. """ global poll_callbacks # for every registered poll callback... for n, (cb, targs, dargs) in enumerate(poll_callbacks): # if the associated function is c... if cb==c: # remove the callback del poll_callbacks[n] # and exit this function return def initialize(**options): """ Do any preparation necessary for event polling. """ # set variables as global in this function... global recurse_level global last_poll global event_queue global poll_callbacks # initialize recursion level to zero recurse_level = 0 # set the time of the last polling to now last_poll = timing.universal_time() # create an empty list to store queued events event_queue = [] # create an empty list to store poll callbacks poll_callbacks = [] def finalize(): """ Shut down event polling. """ # presently, nothing needs to be done to finalize this module pass # global variables to implemets periodic sleeps to make Macs happy in realtime mode isRealtime = 0 sleepTime = 500 # in uSec def pollEvents(): # set the realtime mode related variables as global... global isRealtime global sleepTime # set remaining variables as global in this function... global keyboard_callback global mouse_movement_callback global mouse_buttons_callback global joystick_axis_callback global joystick_balls_callback global joystick_buttons_callback global joystick_hats_callback global poll_callbacks global event_queue global recurse_level global last_poll global js_zero_threshold # declare variable to store current time cdef object now # declare variable for timestamp with maximum latency cdef object t # declare variable to store events read from pygame cdef object evs # temporary float variable (used for joystick axis events) cdef float v # get the current time now = timing.universal_time() # calculate maximum latency based on current time and last polling time t = (last_poll, now - last_poll) # update last polling time last_poll = now # get all waiting events from pygame evs = pygame.event.get() # for all the events we just read... for ev in evs: # ...put them into the event queue along with the timestamp event_queue.append((t, ev)) # see if we should add sleep to lower CPU use if isRealtime: if len(event_queue)==0: #and timing.universal_time()-lastSleep >= sleepDelay: # Do the sleep timing.uSleep(sleepTime) #lastSleep = timing.universal_time() # don't allow the rest of this to be called recursively... if not recurse_level: # set the recurse level so that we do not get loops recurse_level = 1 # for all registered polling callbacks... for c, targs, dargs in poll_callbacks: # ...call them with the registered parameters c(*targs, **dargs) # process events until the queue is empty (even if more are added)... while len(event_queue): # read an event and timestamp from the queue [is it a stack now?] t, e = event_queue.pop(0) # recurse_level = 1 # was here, but we moved it up # SEE IF WE HAVE AN EVENT TYPE WE CARE ABOUT... if e.type == KEYDOWN: # if it's a keydown event... if keyboard_callback: # call the keyboard callback with relevent info keyboard_callback(e.key, True, t) elif e.type == KEYUP: # if it's a key up event... if keyboard_callback: # call the keyboard callback with relevent info keyboard_callback(e.key, False, t) elif e.type == MOUSEMOTION: # if it's a mouse motion event... if mouse_movement_callback: # call the mouse movement callback with relevent info mouse_movement_callback(e.pos, e.rel, t) elif e.type == MOUSEBUTTONUP: # if it's a mouse button up event... if mouse_buttons_callback: # ...mouse buttons callback mouse_buttons_callback(e.button, False, t) elif e.type == MOUSEBUTTONDOWN: # mouse down event?... if mouse_buttons_callback: # ...mouse buttons callback mouse_buttons_callback(e.button, True, t) elif e.type == JOYAXISMOTION: # mouse axis motion?... if joystick_axis_callback: # put the axis value into a local variable v = e.value # if it's absolute value is less than the threshold... if v < js_zero_threshold and v > -js_zero_threshold: # ...use zero instead v = 0.0 # joystick axis callback joystick_axis_callback(e.joy, e.axis, v, t) elif e.type == JOYBALLMOTION: # joystick ball motion?... if joystick_balls_callback: # ...joystick balls callback joystick_balls_callback(e.joy, e.ball, e.rel, t) elif e.type == JOYHATMOTION: # joystick hat motion?... if joystick_hats_callback: # ...joystick hats callback joystick_hats_callback(e.joy, e.hat, e.value, t) elif e.type == JOYBUTTONUP: # joystick button up?... if joystick_buttons_callback: # ...joystick buttons callback joystick_buttons_callback(e.joy, e.button, False, t) elif e.type == JOYBUTTONDOWN: # joystick button down?... if joystick_buttons_callback: # ...joystick buttons callback joystick_buttons_callback(e.joy, e.button, True, t) # all done, set recursion level back to zero recurse_level = 0 pyepl-1.1.0+git12-g365f8e3/code/hardware/graphics/000077500000000000000000000000001127617341700212545ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/graphics/__init__.py000066400000000000000000000172521127617341700233740ustar00rootroot00000000000000# PyEPL: hardware/graphics/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides 2D graphics functionality. """ import pygame from pygame.locals import * from OpenGL.GL import * import os import time import pyepl import pyepl.hardware.eventpoll import pyepl.hardware.timing from image import LowImage from font import LowFont import screensync pyepldir = os.path.abspath(os.path.dirname(pyepl.__file__)) def initialize(**options): """ Do anything that needs to happen before 2D graphics output can happen. """ global init_options init_options = options # see if set the linux screen sync platform = os.uname()[0] if platform =='Linux': screensync.linuxSetRefreshBlock(init_options["sync_to_vbl"]) # init the pygame display pygame.display.init() pygame.font.init() def finalize(): """ Clean up. """ pygame.display.quit() pygame.font.quit() def toggleFullscreen(): """ """ global fullscreen fullscreen = not fullscreen pygame.display.toggle_fullscreen() def getFullscreen(): """ """ global fullscreen return fullscreen def getShowFPS(): """ """ global init_options return init_options["show_fps"] def getResolution(): """ Return a 2-tuple of the X, Y resolution of the window. """ return pygame.display.get_surface().get_size() def setVideoCaption(caption): """ Set the window caption. """ pygame.display.set_caption(caption) lastclearcolor = None lastclearimage = None def clearScreen(color): """ Set the whole window to RGB 3-tuple color. """ global lastclearcolor global lastclearimage try: alpha = color[3] except IndexError: alpha = 255 if alpha == 255: glClearColor(color[0] / 255.0, color[1] / 255.0, color[2] / 255.0, alpha / 255.0) glClear(GL_COLOR_BUFFER_BIT) else: if lastclearcolor != color: x, y = pygame.display.get_surface().get_size() lastclearimage = LowImage(x + 1, y + 1) lastclearimage.fill(color[0], color[1], color[2], alpha) lastclearcolor = color lastclearimage.show(0, 0) # thresh is set to 250 microseconds because tests have shown that a # non-blocking flip takes less than that. It will be necessary to # test this more. Keep in mind that if it does block, but takes less # than 250us, then we will essentially miss a frame, reporting that # the image came on the screen one frame after it actually did. blockThresh = .000250 # max number of flips to prevent loop. If we don't block after 5, # then something is wrong. maxFlips = 5 def doMultiFlips(vTrack): """ In order to block correctly, we must call a second flip if the first flip did not block. The only issue is that we have to copy the front buffer to the back buffer before we call flip again. It passes in the instance of the video track so that it can redraw the pending showables on the back buffer to enable multiple flips. """ # get thresh for if blocking global blockThresh global maxFlips # time the first flip starttime = time.time() #pyepl.hardware.timing.universal_time() pygame.display.flip() endtime = time.time() #pyepl.hardware.timing.universal_time() # see if the flip took no time if endtime - starttime < blockThresh: # Must call the flip again # copy front buffer to back # get the screen size #w, h = pygame.display.get_surface().get_size() # draw everything to back buffer # iterate through the onscreen pending list... for shown, showable, x, y in vTrack.pending: # ...showing everything in order showable.show(x, y) # flip until blocked starttime = time.time() pygame.display.flip() endtime = time.time() count = 0 while (endtime-starttime) 255: self.alpha = 255 elif self.alpha < 0: self.alpha = 0 def __getitem__(self, index): """ """ if index == 0: return self.red if index == 1: return self.green if index == 2: return self.blue if index == 3: return self.alpha raise IndexError, "Color indeces must be 0, 1, 2, or 3." def __repr__(self): """ """ return "(%f, %f, %f, %f)" % (self.red / 255.0, self.green / 255.0, self.blue / 255.0, self.alpha / 255.0) class OGLSprite: """Implement the ugly details of "blitting" to OpenGL""" def __init__(self, surf, mipmap=None): """OGLSprite(self, surf, mipmap=None) -> OGLSprite Create a drawable texture out of a given surface.""" w, h = surf.get_width(), surf.get_height() w2, h2 = 1, 1 while w2 < w: w2 <<= 1 while h2 < h: h2 <<= 1 img = pygame.Surface((w2, h2), SRCALPHA, 32) img.blit(surf, (0,0)) rgba = pygame.image.tostring(img, "RGBA", 0) #assign a texture texid = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, texid) if mipmap: if not GLU: raise NotImplementedError("OGLSprite mipmaps require OpenGL.GLU") #build MIPMAP levels. Ths is another slow bit gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, w2, h2, GL_RGBA, GL_UNSIGNED_BYTE, rgba) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT) else: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w2, h2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) self.mipmap = mipmap self.srcsize = w, h self.texsize = w2, h2 self.coords = float(w)/w2, float(h)/h2 self.texid = texid def __del__(self): """ """ try: glDeleteTextures([self.texid]) except NameError: pyepl.exceptions.eplWarn("glDeleteTextures function not present.") def update(self, surf): """update(self, surf) -> None """ if self.mipmap: raise TypeError("Cannot update a mipmap enabled OGLSprite") w, h = surf.get_width(), surf.get_height() w2, h2 = 1, 1 while w2 < w: w2 <<= 1 while h2 < h: h2 <<= 1 img = pygame.Surface((w2, h2), SRCALPHA, surf) img.blit(surf, (0,0)) rgba = pygame.image.tostring(img, "RGBA", 0) glBindTexture(GL_TEXTURE_2D, self.texid) if 'glTexSubImage2D' in dir() and w2 <= self.texsize[0] and h2 <= self.texsize[1]: # untested; i suspect it doesn't work w2, h2 = self.texsize glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, w2, h2, GL_RGBA, GL_UNSIGNED_BYTE, rgba); if (w, h) != self.srcsize: self.coords = float(w)/w2, float(h)/h2 else: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w2, h2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba) self.coords = float(w)/w2, float(h)/h2 self.texsize = w2, h2 self.srcsize = w, h #print "TEX", self.srcsize, self.texsize, self.coords def blit_at(self, *rects): """blit_at(self, *rects) -> self Draw the texture at the supplied position(s). If a tuple and width and height are not specified, the original size is used (just like you'd expect). Returns self so ogs.enter().blit().exit() works""" for rect in rects: x0, y0 = rect[0:2] try: x1, y1 = x0 + rect[2], y0 + rect[3] except IndexError: x1, y1 = x0 + self.srcsize[0] - 1, y0 + self.srcsize[1] - 1 glBindTexture(GL_TEXTURE_2D, self.texid) glBegin(GL_TRIANGLE_STRIP) glTexCoord2f(0, 0); glVertex2f(x0, y0) glTexCoord2f(self.coords[0], 0); glVertex2f(x1, y0) glTexCoord2f(0, self.coords[1]); glVertex2f(x0, y1) glTexCoord2f(self.coords[0], self.coords[1]); glVertex2f(x1, y1) glEnd() return self def enter(self, xres, yres): """enter(self) -> self Set up OpenGL for drawing textures; do this once per batch of textures. Returns self so ogs.enter().blit().exit() works""" glViewport(0, 0, xres, yres) glPushAttrib(GL_ENABLE_BIT) # save old enables glDisable(GL_DEPTH_TEST) glDisable(GL_CULL_FACE) glColor4f(1,1,1,1) glEnable(GL_TEXTURE_2D) # XXX: in pre pygame1.5, there is no proper alpha, so this makes # the entire texture transparent. in 1.5 and forward, it works. if pygame.version.ver >= '1.4.9': glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) #glEnable(GL_ALPHA_TEST) #glAlphaFunc(GL_GREATER, 0.5) glMatrixMode(GL_PROJECTION) glPushMatrix() glLoadIdentity() glOrtho(0.0, xres, yres, 0.0, 0.0, 1.0) glMatrixMode(GL_MODELVIEW) glPushMatrix() glLoadIdentity() #glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL) return self def exit(self): """exit(self) -> None Return OpenGL to previous settings; do this once per batch.""" glMatrixMode(GL_PROJECTION) glPopMatrix() glMatrixMode(GL_MODELVIEW) glPopMatrix() glPopAttrib() def get_width(self): """get_width(self) -> int""" return self.srcsize[0] def get_height(self): """get_height(self) -> int""" return self.srcsize[1] class LowImage: """ Low level representation of an image. """ def __init__(self, *args): """ Create LowImage. """ if len(args) == 2: self.surf = pygame.Surface(args) elif len(args) == 1: param = args[0] if isinstance(param, pygame.Surface): self.surf = param elif isinstance(param, str): self.surf = pygame.image.load(param) else: raise ValueError, "Invalid type for LowImage constructor argument." else: raise ValueError, "Invalid number of arguments for LowImage constructor." self.gl_texture = OGLSprite(self.surf) self.gl_texture_dirty = False # this next line supposedly breaks on OSX, set to none if this is the case #self.surfarray = pygame.surfarray.pixels3d(self.surf) # fix for the mac (breaks other stuff) self.surfarray = None def dataString(self): """ Return an RGBA string of the image data. """ return pygame.image.tostring(self.surf, "RGBA") def cleanGLTexture(self): """ """ if self.gl_texture_dirty: self.gl_texture.update(self.surf) self.gl_texture_dirty = False def show(self, x, y): """ """ self.cleanGLTexture() self.gl_texture.enter(*pygame.display.get_surface().get_size()) self.gl_texture.blit_at((x, y)) self.gl_texture.exit() def fill(self, r, g, b, a): """ """ self.surf = self.surf.convert_alpha() self.surf.fill((int(r), int(g), int(b), int(a))) self.gl_texture_dirty = True def __getitem__(self, index): """ Two dimensional indexing and slicing. """ return pygame.surfarray.make_surface(self.surfarray[index]) def __setitem__(self, index, value): """ Index and slice assignment. """ if isinstance(value, LowImage): self.surfarray[index] = value.surfarray else: self.surfarray[index] = value self.gl_texture_dirty = True def __mul__(self, x): """ Color multiplication. """ if isinstance(x, LowImage): return pygame.surfarray.make_surface(self.surfarray * x.surfarray) else: return pygame.surfarray.make_surface(self.surfarray * x) def __div__(self, x): """ Color division. """ if isinstance(x, LowImage): return pygame.surfarray.make_surface(self.surfarray / x.surfarray) else: return pygame.surfarray.make_surface(self.surfarray / x) def __add__(self, x): """ Color addition. """ if isinstance(x, LowImage): return pygame.surfarray.make_surface(self.surfarray + x.surfarray) else: return pygame.surfarray.make_surface(self.surfarray + x) def __sub__(self, x): """ Color subtraction. """ if isinstance(x, LowImage): return pygame.surfarray.make_surface(self.surfarray - x.surfarray) else: return pygame.surfarray.make_surface(self.surfarray - x) def __neg__(self): """ Color inversion. """ return pygame.surfarray.make_surface(-self.surfarray) def scale(self, x, y): """ Get scaled image. """ return LowImage(pygame.transform.scale(self.surf, (x, y))) def getSize(self): """ Return an x, y tuple for image dimensions. """ return self.surf.get_size() pyepl-1.1.0+git12-g365f8e3/code/hardware/graphics/screensync/000077500000000000000000000000001127617341700234305ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/graphics/screensync/__init__.py000066400000000000000000000015571127617341700255510ustar00rootroot00000000000000# PyEPL: hardware/graphics/screensync/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This package implements blocking the monitor's Vertical Blanking Loop. """ import os def initialize(**options): """ """ pass def finalize(): """ """ pass def linuxSetRefreshBlock(tf): if tf: val = "1" else: val = "0" # Set for nVidia linux os.environ["__GL_SYNC_TO_VBLANK"] = val # Set for recent linux Mesa DRI Radeon os.environ["LIBGL_SYNC_REFRESH"] = val if os.uname()[0]=='Darwin': import _refreshBlock setRefreshBlock = _refreshBlock.sync_swap pyepl-1.1.0+git12-g365f8e3/code/hardware/graphics/screensync/refreshBlock.m000066400000000000000000000021251127617341700262170ustar00rootroot00000000000000#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: 1.1 $ * $Date: 2005/11/18 16:40:54 $ * 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 _refreshBlock_methods[] = { { "sync_swap", sync_swap, METH_VARARGS, sync_swap__doc__}, { NULL, NULL} /* sentinel */ }; DL_EXPORT(void) init_refreshBlock(void) { Py_InitModule("_refreshBlock", _refreshBlock_methods); return; } pyepl-1.1.0+git12-g365f8e3/code/hardware/joystick.pyx000066400000000000000000000027631127617341700220650ustar00rootroot00000000000000# PyEPL: hardware/joystick.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides low-level joystick functionality. """ import pygame import eventpoll cdef object joysticks def initialize(**options): """ Do any preparation necessary before using joystick features. """ global joysticks global zero_threshold if options.has_key("joystick_zero_threshold"): eventpoll.setJSZeroThreshold(options["joystick_zero_threshold"]) else: eventpoll.setJSZeroThreshold(0.0) pygame.joystick.init() joysticks = [] for n in xrange(pygame.joystick.get_count()): # so that joystick events will be generated x = pygame.joystick.Joystick(n) x.init() joysticks.append(x) def finalize(): """ Shut down joystick features. """ pygame.joystick.quit() def getJoystickFeatures(): """ Returns a list with one tuple for each joystick. Each tuple specifies the number of axes, balls, buttons and hats for the joystick (in that order). """ global joysticks r = [] for js in joysticks: r.append((js.get_numaxes(), js.get_numballs(), js.get_numbuttons(), js.get_numhats())) return r setJoystickCallbacks = eventpoll.setJoystickCallbacks pyepl-1.1.0+git12-g365f8e3/code/hardware/keyboard.pyx000066400000000000000000000031521127617341700220170ustar00rootroot00000000000000# PyEPL: hardware/keyboard.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides low-level keyboard functionality. """ import pygame import eventpoll import sys def initialize(**options): """ Do any preparation necessary before using keyboard input. """ global nametokeydict global keytonamedict nametokeydict = {} # dictionary mapping key names to identifiers that can be used with keyboard functions keytonamedict = {} # ...opposite for x in xrange(512): name = pygame.key.name(x).upper() nametokeydict[name] = x keytonamedict[x] = name ## if sys.platform == "darwin": ## nametokeydict["RETURN"] = nametokeydict["ENTER"] ## else: ## nametokeydict["ENTER"] = nametokeydict["RETURN"] def finalize(): """ Shut down keyboard features. """ setKeyboardCallback(None) def nameToKey(name): """ Returns the key identifier for the given name. """ global nametokeydict return nametokeydict[name.upper()] def keyToName(k): """ Returns the name for the given key identifier. """ global keytonamedict return keytonamedict[k] def keyNames(): """ Returns an iterator over the names of all the available keys. """ global nametokeydict return nametokeydict.iterkeys() setKeyboardCallback = eventpoll.setKeyboardCallback pyepl-1.1.0+git12-g365f8e3/code/hardware/mouse.pyx000066400000000000000000000017421127617341700213520ustar00rootroot00000000000000# PyEPL: hardware/mouse.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides low-level mouse functionality. """ import pygame import eventpoll import timing def initialize(**options): """ Do any preparation necessary before using mouse features. """ # moved call to setMouseVisibility to hardware.graphics.startVideo() pass def finalize(): """ Shut down mouse features. """ setMouseCallbacks(None, None) setMousePosition = pygame.mouse.set_pos setMouseVisibility = pygame.mouse.set_visible # True corrupts position change, False corrupts absolute position def getMouseRange(): return pygame.display.get_surface().get_size() setMouseCallbacks = eventpoll.setMouseCallbacks pyepl-1.1.0+git12-g365f8e3/code/hardware/rt/000077500000000000000000000000001127617341700201015ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/rt/Makefile000066400000000000000000000022401127617341700215370ustar00rootroot00000000000000# PyEPL: hardware/rt/Makefile # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. PLATFORM = $(shell uname) INCLUDEPY=$(shell python -c "import distutils.sysconfig;print distutils.sysconfig.get_config_var('INCLUDEPY')") LIBPY=$(shell python -c "import distutils.sysconfig;print distutils.sysconfig.get_config_var('LIBPL')") ifeq ($(PLATFORM), Linux) all: # Do nothing for now clean: rm -f *.so *.o endif ifeq ($(PLATFORM), Darwin) all: _realtime.so _realtime.so: realtime.o realtime.i swig -c++ -python realtime.i g++ -c -Wno-long-double realtime_wrap.cxx -DHAVE_CONFIG_H -I$(INCLUDEPY) g++ -bundle -undefined suppress -flat_namespace realtime.o realtime_wrap.o -o _realtime.so -lpthread realtime.o: realtime.cpp g++ -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -D__MACOSX_CORE__ -I$(INCLUDEPY) -c realtime.cpp -o realtime.o endif pyepl-1.1.0+git12-g365f8e3/code/hardware/rt/__init__.py000066400000000000000000000011141127617341700222070ustar00rootroot00000000000000# PyEPL: hardware/rt/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This package implements realtime functions. """ import sys if sys.platform=='darwin': from realtime import * else: from linux_realtime import * def initialize(**options): """ """ pass def finalize(): """ """ pass pyepl-1.1.0+git12-g365f8e3/code/hardware/rt/linux_realtime.py000066400000000000000000000006611127617341700234770ustar00rootroot00000000000000# PyEPL: hardware/rt/linux_realtime.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. # make a fake set priority def set_realtime_priority(period, computation, constraint): pass pyepl-1.1.0+git12-g365f8e3/code/hardware/rt/realtime.cpp000066400000000000000000000025361127617341700224150ustar00rootroot00000000000000// PyEPL: hardware/rt/realtime.cpp // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #include "realtime.h" #include using std::cout; using std::cerr; using std::endl; void set_realtime_priority(int period, int computation, int constraint) { struct thread_time_constraint_policy ttcpolicy; int bus_speed, mib [2] = { CTL_HW, HW_BUS_FREQ }; size_t len; int ret; len = sizeof (bus_speed); sysctl (mib, 2, &bus_speed, &len, NULL, 0); // 120, 2400, 1200 original // 120, 9600, 1200 on Powerbook /* Is it enough? */ ttcpolicy.period = bus_speed / period; ttcpolicy.computation = bus_speed / computation; ttcpolicy.constraint = bus_speed / constraint; ttcpolicy.preemptible = 1; ret = thread_policy_set(mach_thread_self (), THREAD_TIME_CONSTRAINT_POLICY, (int*)&ttcpolicy, THREAD_TIME_CONSTRAINT_POLICY_COUNT); if (ret != KERN_SUCCESS) { // it failed cerr << "Set realtime priority failed" << endl; } } pyepl-1.1.0+git12-g365f8e3/code/hardware/rt/realtime.h000066400000000000000000000007471127617341700220640ustar00rootroot00000000000000// PyEPL: hardware/rt/realtime.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #include #include #include #include void set_realtime_priority(int, int, int); pyepl-1.1.0+git12-g365f8e3/code/hardware/rt/realtime.i000066400000000000000000000006301127617341700220540ustar00rootroot00000000000000// PyEPL: hardware/rt/realtime.i // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. %module realtime %{ #include "realtime.h" %} %include "realtime.h" pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/000077500000000000000000000000001127617341700206045ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/Makefile000066400000000000000000000070751127617341700222550ustar00rootroot00000000000000# PyEPL: hardware/sound/Makefile # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. all: _eplSound.so _soundFile.so include ../../../Makefile.common PLATFORM = $(shell uname) ifeq ($(PLATFORM), Linux) ######################################################## # # Make rules for linux # ######################################################## SOUND_DRIVER=ALSA _eplSound.so: eplSound.o eplSound.i RtAudio.o fifo.o swig -c++ -python eplSound.i g++ -pthread -fno-strict-aliasing -DNDEBUG -O2 -Wall -fPIC -I$(INCLUDEPY) -c eplSound_wrap.cxx -o eplSound_wrap.o g++ -lpthread -lasound -shared eplSound_wrap.o eplSound.o RtAudio.o fifo.o -o _eplSound.so eplSound.o: eplSound.cpp eplSound.h g++ -pthread -fno-strict-aliasing -DNDEBUG -O2 -Wall -fPIC -I$(INCLUDEPY) -c eplSound.cpp -o eplSound.o fifo.o: fifo.cpp g++ -pthread -fno-strict-aliasing -DNDEBUG -O2 -Wall -fPIC -I$(INCLUDEPY) -c fifo.cpp -o fifo.o RtAudio.o: RtAudio.cpp g++ -O2 -Wall -fPIC -D__LINUX_$(SOUND_DRIVER)__ -c RtAudio.cpp -o RtAudio.o soundFile.o: soundFile.cpp soundFile.h g++ -pthread -fno-strict-aliasing -DNDEBUG -O2 -Wall -fPIC -c soundFile.cpp -o soundFile.o _soundFile.so: soundFile.i soundFile.o swig -c++ -python soundFile.i g++ -pthread -fno-strict-aliasing -DNDEBUG -O2 -Wall -fPIC -I$(INCLUDEPY) -c soundFile_wrap.cxx -o soundFile_wrap.o g++ -lpthread -shared soundFile_wrap.o soundFile.o -lsndfile -lsamplerate -o _soundFile.so endif ifeq ($(PLATFORM), Darwin) ######################################################## # # Make rules for mac # ######################################################## LIBDIR = -L/usr/local/lib -L/opt/local/lib -L/sw/lib INCLUDEDIR = -I/usr/local/include -I/opt/local/include -I/sw/include INCLUDEPY=$(shell python -c "import distutils.sysconfig;print distutils.sysconfig.get_config_var('INCLUDEPY')") LIBPY=$(shell python -c "import distutils.sysconfig;print distutils.sysconfig.get_config_var('LIBPL')") PYTHON_INC = $(INCLUDEPY) PYTHON_LIB = $(LIBPY) FLAGS1 = -Wno-long-double -DHAVE_CONFIG_H FLAGS2 = -bundle -undefined suppress -flat_namespace -lpthread -framework CoreAudio FLAGS3 = -fno-strict-aliasing -Wno-long-double -no-cpp-precomp \ -mno-fused-madd -fno-common -dynamic -DNDEBUG -O2 -Wall _eplSound.so: eplSound.o eplSound.i RtAudio.o fifo.o swig -c++ -python eplSound.i g++ $(FLAGS1) -I$(PYTHON_INC) -L$(PYTHON_LIB) -c eplSound_wrap.cxx g++ $(FLAGS2) eplSound.o eplSound_wrap.o RtAudio.o fifo.o -o _eplSound.so eplSound.o: eplSound.cpp eplSound.h g++ $(FLAGS3) -I$(PYTHON_INC) -c eplSound.cpp -o eplSound.o fifo.o: fifo.cpp fifo.h g++ $(FLAGS3) -I$(PYTHON_INC) -c fifo.cpp -o fifo.o RtAudio.o: RtAudio.cpp g++ -O2 -Wall -D__MACOSX_CORE__ -c RtAudio.cpp -o RtAudio.o soundFile.o: soundFile.cpp soundFile.h g++ -O2 -W -Wall -Wcast-align -Wcast-qual -Wwrite-strings -pipe -fpascal-strings -c soundFile.cpp -o soundFile.o $(LIBDIR) $(INCLUDEDIR) _soundFile.so: soundFile.i soundFile.o swig -c++ -python soundFile.i g++ -Wno-long-double -c soundFile_wrap.cxx -DHAVE_CONFIG_H -I$(PYTHON_INC) g++ -bundle -undefined suppress -flat_namespace soundFile_wrap.o soundFile.o -lsndfile -lsamplerate -o _soundFile.so $(LIBDIR) $(INCLUDEDIR) test_epl: eplSound.o RtAudio.o test_epl.cpp g++ -O2 -I../ -D__MACOSX_CORE__ -o test_epl test_epl.cpp eplSound.o RtAudio.o -lstdc++ -lpthread -framework CoreAudio endif clean: rm -f *.o *.so *.cxx pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/MyType.h000066400000000000000000000006351127617341700222100ustar00rootroot00000000000000// PyEPL: hardware/sound/MyType.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #ifndef INC_MYTYPE #define INC_MYTYPE typedef short int MY_TYPE; #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/RtAudio.cpp000066400000000000000000010324101127617341700226600ustar00rootroot00000000000000/************************************************************************/ /*! \class RtAudio \brief Realtime audio i/o C++ classes. RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), Macintosh OS X (CoreAudio and Jack), and Windows (DirectSound and ASIO) operating systems. RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes Copyright (c) 2001-2009 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /************************************************************************/ // RtAudio: Version 4.0.6 #include "RtAudio.h" #include #include #include #include // Static variable definitions. const unsigned int RtApi::MAX_SAMPLE_RATES = 14; const unsigned int RtApi::SAMPLE_RATES[] = { 4000, 5512, 8000, 9600, 11025, 16000, 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) #define MUTEX_INITIALIZE(A) InitializeCriticalSection(A) #define MUTEX_DESTROY(A) DeleteCriticalSection(A) #define MUTEX_LOCK(A) EnterCriticalSection(A) #define MUTEX_UNLOCK(A) LeaveCriticalSection(A) #elif defined(__LINUX_ALSA__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) // pthread API #define MUTEX_INITIALIZE(A) pthread_mutex_init(A, NULL) #define MUTEX_DESTROY(A) pthread_mutex_destroy(A) #define MUTEX_LOCK(A) pthread_mutex_lock(A) #define MUTEX_UNLOCK(A) pthread_mutex_unlock(A) #else #define MUTEX_INITIALIZE(A) abs(*A) // dummy definitions #define MUTEX_DESTROY(A) abs(*A) // dummy definitions #endif // *************************************************** // // // RtAudio definitions. // // *************************************************** // void RtAudio :: getCompiledApi( std::vector &apis ) throw() { apis.clear(); // The order here will control the order of RtAudio's API search in // the constructor. #if defined(__UNIX_JACK__) apis.push_back( UNIX_JACK ); #endif #if defined(__LINUX_ALSA__) apis.push_back( LINUX_ALSA ); #endif #if defined(__LINUX_OSS__) apis.push_back( LINUX_OSS ); #endif #if defined(__WINDOWS_ASIO__) apis.push_back( WINDOWS_ASIO ); #endif #if defined(__WINDOWS_DS__) apis.push_back( WINDOWS_DS ); #endif #if defined(__MACOSX_CORE__) apis.push_back( MACOSX_CORE ); #endif #if defined(__RTAUDIO_DUMMY__) apis.push_back( RTAUDIO_DUMMY ); #endif } void RtAudio :: openRtApi( RtAudio::Api api ) { #if defined(__UNIX_JACK__) if ( api == UNIX_JACK ) rtapi_ = new RtApiJack(); #endif #if defined(__LINUX_ALSA__) if ( api == LINUX_ALSA ) rtapi_ = new RtApiAlsa(); #endif #if defined(__LINUX_OSS__) if ( api == LINUX_OSS ) rtapi_ = new RtApiOss(); #endif #if defined(__WINDOWS_ASIO__) if ( api == WINDOWS_ASIO ) rtapi_ = new RtApiAsio(); #endif #if defined(__WINDOWS_DS__) if ( api == WINDOWS_DS ) rtapi_ = new RtApiDs(); #endif #if defined(__MACOSX_CORE__) if ( api == MACOSX_CORE ) rtapi_ = new RtApiCore(); #endif #if defined(__RTAUDIO_DUMMY__) if ( api == RTAUDIO_DUMMY ) rtapi_ = new RtApiDummy(); #endif } RtAudio :: RtAudio( RtAudio::Api api ) throw() { rtapi_ = 0; if ( api != UNSPECIFIED ) { // Attempt to open the specified API. openRtApi( api ); if ( rtapi_ ) return; // No compiled support for specified API value. Issue a debug // warning and continue as if no API was specified. std::cerr << "\nRtAudio: no compiled support for specified API argument!\n" << std::endl; } // Iterate through the compiled APIs and return as soon as we find // one with at least one device or we reach the end of the list. std::vector< RtAudio::Api > apis; getCompiledApi( apis ); for ( unsigned int i=0; igetDeviceCount() ) break; } if ( rtapi_ ) return; // It should not be possible to get here because the preprocessor // definition __RTAUDIO_DUMMY__ is automatically defined if no // API-specific definitions are passed to the compiler. But just in // case something weird happens, we'll print out an error message. std::cerr << "\nRtAudio: no compiled API support found ... critical error!!\n\n"; } RtAudio :: ~RtAudio() throw() { delete rtapi_; } void RtAudio :: openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options ) { return rtapi_->openStream( outputParameters, inputParameters, format, sampleRate, bufferFrames, callback, userData, options ); } // *************************************************** // // // Public RtApi definitions (see end of file for // private or protected utility functions). // // *************************************************** // RtApi :: RtApi() { stream_.state = STREAM_CLOSED; stream_.mode = UNINITIALIZED; stream_.apiHandle = 0; stream_.userBuffer[0] = 0; stream_.userBuffer[1] = 0; MUTEX_INITIALIZE( &stream_.mutex ); showWarnings_ = true; } RtApi :: ~RtApi() { MUTEX_DESTROY( &stream_.mutex ); } void RtApi :: openStream( RtAudio::StreamParameters *oParams, RtAudio::StreamParameters *iParams, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options ) { if ( stream_.state != STREAM_CLOSED ) { errorText_ = "RtApi::openStream: a stream is already open!"; error( RtError::INVALID_USE ); } if ( oParams && oParams->nChannels < 1 ) { errorText_ = "RtApi::openStream: a non-NULL output StreamParameters structure cannot have an nChannels value less than one."; error( RtError::INVALID_USE ); } if ( iParams && iParams->nChannels < 1 ) { errorText_ = "RtApi::openStream: a non-NULL input StreamParameters structure cannot have an nChannels value less than one."; error( RtError::INVALID_USE ); } if ( oParams == NULL && iParams == NULL ) { errorText_ = "RtApi::openStream: input and output StreamParameters structures are both NULL!"; error( RtError::INVALID_USE ); } if ( formatBytes(format) == 0 ) { errorText_ = "RtApi::openStream: 'format' parameter value is undefined."; error( RtError::INVALID_USE ); } unsigned int nDevices = getDeviceCount(); unsigned int oChannels = 0; if ( oParams ) { oChannels = oParams->nChannels; if ( oParams->deviceId >= nDevices ) { errorText_ = "RtApi::openStream: output device parameter value is invalid."; error( RtError::INVALID_USE ); } } unsigned int iChannels = 0; if ( iParams ) { iChannels = iParams->nChannels; if ( iParams->deviceId >= nDevices ) { errorText_ = "RtApi::openStream: input device parameter value is invalid."; error( RtError::INVALID_USE ); } } clearStreamInfo(); bool result; if ( oChannels > 0 ) { result = probeDeviceOpen( oParams->deviceId, OUTPUT, oChannels, oParams->firstChannel, sampleRate, format, bufferFrames, options ); if ( result == false ) error( RtError::SYSTEM_ERROR ); } if ( iChannels > 0 ) { result = probeDeviceOpen( iParams->deviceId, INPUT, iChannels, iParams->firstChannel, sampleRate, format, bufferFrames, options ); if ( result == false ) { if ( oChannels > 0 ) closeStream(); error( RtError::SYSTEM_ERROR ); } } stream_.callbackInfo.callback = (void *) callback; stream_.callbackInfo.userData = userData; if ( options ) options->numberOfBuffers = stream_.nBuffers; stream_.state = STREAM_STOPPED; } unsigned int RtApi :: getDefaultInputDevice( void ) { // Should be implemented in subclasses if possible. return 0; } unsigned int RtApi :: getDefaultOutputDevice( void ) { // Should be implemented in subclasses if possible. return 0; } void RtApi :: closeStream( void ) { // MUST be implemented in subclasses! return; } bool RtApi :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { // MUST be implemented in subclasses! return FAILURE; } void RtApi :: tickStreamTime( void ) { // Subclasses that do not provide their own implementation of // getStreamTime should call this function once per buffer I/O to // provide basic stream time support. stream_.streamTime += ( stream_.bufferSize * 1.0 / stream_.sampleRate ); #if defined( HAVE_GETTIMEOFDAY ) gettimeofday( &stream_.lastTickTimestamp, NULL ); #endif } long RtApi :: getStreamLatency( void ) { verifyStream(); long totalLatency = 0; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) totalLatency = stream_.latency[0]; if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) totalLatency += stream_.latency[1]; return totalLatency; } double RtApi :: getStreamTime( void ) { verifyStream(); #if defined( HAVE_GETTIMEOFDAY ) // Return a very accurate estimate of the stream time by // adding in the elapsed time since the last tick. struct timeval then; struct timeval now; if ( stream_.state != STREAM_RUNNING || stream_.streamTime == 0.0 ) return stream_.streamTime; gettimeofday( &now, NULL ); then = stream_.lastTickTimestamp; return stream_.streamTime + ((now.tv_sec + 0.000001 * now.tv_usec) - (then.tv_sec + 0.000001 * then.tv_usec)); #else return stream_.streamTime; #endif } unsigned int RtApi :: getStreamSampleRate( void ) { verifyStream(); return stream_.sampleRate; } // *************************************************** // // // OS/API-specific methods. // // *************************************************** // #if defined(__MACOSX_CORE__) // The OS X CoreAudio API is designed to use a separate callback // procedure for each of its audio devices. A single RtAudio duplex // stream using two different devices is supported here, though it // cannot be guaranteed to always behave correctly because we cannot // synchronize these two callbacks. // // A property listener is installed for over/underrun information. // However, no functionality is currently provided to allow property // listeners to trigger user handlers because it is unclear what could // be done if a critical stream parameter (buffer size, sample rate, // device disconnect) notification arrived. The listeners entail // quite a bit of extra code and most likely, a user program wouldn't // be prepared for the result anyway. However, we do provide a flag // to the client callback function to inform of an over/underrun. // // The mechanism for querying and setting system parameters was // updated (and perhaps simplified) in OS-X version 10.4. However, // since 10.4 support is not necessarily available to all users, I've // decided not to update the respective code at this time. Perhaps // this will happen when Apple makes 10.4 free for everyone. :-) // A structure to hold various information related to the CoreAudio API // implementation. struct CoreHandle { AudioDeviceID id[2]; // device ids #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) AudioDeviceIOProcID procId[2]; #endif UInt32 iStream[2]; // device stream index (or first if using multiple) UInt32 nStreams[2]; // number of streams to use bool xrun[2]; char *deviceBuffer; pthread_cond_t condition; int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. CoreHandle() :deviceBuffer(0), drainCounter(0), internalDrain(false) { nStreams[0] = 1; nStreams[1] = 1; id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } }; RtApiCore :: RtApiCore() { // Nothing to do here. } RtApiCore :: ~RtApiCore() { // The subclass destructor gets called before the base class // destructor, so close an existing stream before deallocating // apiDeviceId memory. if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiCore :: getDeviceCount( void ) { // Find out how many audio devices there are, if any. UInt32 dataSize; OSStatus result = AudioHardwareGetPropertyInfo( kAudioHardwarePropertyDevices, &dataSize, NULL ); if ( result != noErr ) { errorText_ = "RtApiCore::getDeviceCount: OS-X error getting device info!"; error( RtError::WARNING ); return 0; } return dataSize / sizeof( AudioDeviceID ); } unsigned int RtApiCore :: getDefaultInputDevice( void ) { unsigned int nDevices = getDeviceCount(); if ( nDevices <= 1 ) return 0; AudioDeviceID id; UInt32 dataSize = sizeof( AudioDeviceID ); OSStatus result = AudioHardwareGetProperty( kAudioHardwarePropertyDefaultInputDevice, &dataSize, &id ); if ( result != noErr ) { errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device."; error( RtError::WARNING ); return 0; } dataSize *= nDevices; AudioDeviceID deviceList[ nDevices ]; result = AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::getDefaultInputDevice: OS-X system error getting device IDs."; error( RtError::WARNING ); return 0; } for ( unsigned int i=0; i= nDevices ) { errorText_ = "RtApiCore::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } AudioDeviceID deviceList[ nDevices ]; UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; OSStatus result = AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::getDeviceInfo: OS-X system error getting device IDs."; error( RtError::WARNING ); return info; } AudioDeviceID id = deviceList[ device ]; // Get the device name. info.name.erase(); char name[256]; dataSize = 256; result = AudioDeviceGetProperty( id, 0, false, kAudioDevicePropertyDeviceManufacturer, &dataSize, name ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device manufacturer."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } info.name.append( (const char *)name, strlen(name) ); info.name.append( ": " ); dataSize = 256; result = AudioDeviceGetProperty( id, 0, false, kAudioDevicePropertyDeviceName, &dataSize, name ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceInfo: system error (" << getErrorCode( result ) << ") getting device name."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } info.name.append( (const char *)name, strlen(name) ); // Get the output stream "configuration". AudioBufferList *bufferList = nil; result = AudioDeviceGetPropertyInfo( id, 0, false, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (result != noErr || dataSize == 0) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::getDeviceInfo: memory error allocating output AudioBufferList."; error( RtError::WARNING ); return info; } result = AudioDeviceGetProperty( id, 0, false, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if ( result != noErr ) { free( bufferList ); errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting output stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Get output channel information. unsigned int i, nStreams = bufferList->mNumberBuffers; for ( i=0; imBuffers[i].mNumberChannels; free( bufferList ); // Get the input stream "configuration". result = AudioDeviceGetPropertyInfo( id, 0, true, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (result != noErr || dataSize == 0) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::getDeviceInfo: memory error allocating input AudioBufferList."; error( RtError::WARNING ); return info; } result = AudioDeviceGetProperty( id, 0, true, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if ( result != noErr ) { free( bufferList ); errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting input stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Get input channel information. nStreams = bufferList->mNumberBuffers; for ( i=0; imBuffers[i].mNumberChannels; free( bufferList ); // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Probe the device sample rates. bool isInput = false; if ( info.outputChannels == 0 ) isInput = true; // Determine the supported sample rates. result = AudioDeviceGetPropertyInfo( id, 0, isInput, kAudioDevicePropertyAvailableNominalSampleRates, &dataSize, NULL ); if ( result != kAudioHardwareNoError || dataSize == 0 ) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rate info."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } UInt32 nRanges = dataSize / sizeof( AudioValueRange ); AudioValueRange rangeList[ nRanges ]; result = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyAvailableNominalSampleRates, &dataSize, &rangeList ); if ( result != kAudioHardwareNoError ) { errorStream_ << "RtApiCore::getDeviceInfo: system error (" << getErrorCode( result ) << ") getting sample rates."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } Float64 minimumRate = 100000000.0, maximumRate = 0.0; for ( UInt32 i=0; i maximumRate ) maximumRate = rangeList[i].mMaximum; } info.sampleRates.clear(); for ( unsigned int k=0; k= (unsigned int) minimumRate && SAMPLE_RATES[k] <= (unsigned int) maximumRate ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } if ( info.sampleRates.size() == 0 ) { errorStream_ << "RtApiCore::probeDeviceInfo: No supported sample rates found for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // CoreAudio always uses 32-bit floating point data for PCM streams. // Thus, any other "physical" formats supported by the device are of // no interest to the client. info.nativeFormats = RTAUDIO_FLOAT32; if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; info.probed = true; return info; } OSStatus callbackHandler( AudioDeviceID inDevice, const AudioTimeStamp* inNow, const AudioBufferList* inInputData, const AudioTimeStamp* inInputTime, AudioBufferList* outOutputData, const AudioTimeStamp* inOutputTime, void* infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiCore *object = (RtApiCore *) info->object; if ( object->callbackEvent( inDevice, inInputData, outOutputData ) == false ) return kAudioHardwareUnspecifiedError; else return kAudioHardwareNoError; } OSStatus deviceListener( AudioDeviceID inDevice, UInt32 channel, Boolean isInput, AudioDevicePropertyID propertyID, void* handlePointer ) { CoreHandle *handle = (CoreHandle *) handlePointer; if ( propertyID == kAudioDeviceProcessorOverload ) { if ( isInput ) handle->xrun[1] = true; else handle->xrun[0] = true; } return kAudioHardwareNoError; } static bool hasProperty( AudioDeviceID id, UInt32 channel, bool isInput, AudioDevicePropertyID property ) { OSStatus result = AudioDeviceGetPropertyInfo( id, channel, isInput, property, NULL, NULL ); return result == 0; } bool RtApiCore :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { // Get device ID unsigned int nDevices = getDeviceCount(); if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiCore::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiCore::probeDeviceOpen: device ID is invalid!"; return FAILURE; } AudioDeviceID deviceList[ nDevices ]; UInt32 dataSize = sizeof( AudioDeviceID ) * nDevices; OSStatus result = AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &dataSize, (void *) &deviceList ); if ( result != noErr ) { errorText_ = "RtApiCore::probeDeviceOpen: OS-X system error getting device IDs."; return FAILURE; } AudioDeviceID id = deviceList[ device ]; // Setup for stream mode. bool isInput = false; if ( mode == INPUT ) isInput = true; // Set or disable "hog" mode. dataSize = sizeof( UInt32 ); UInt32 doHog = 0; if ( options && options->flags & RTAUDIO_HOG_DEVICE ) doHog = 1; result = AudioHardwareSetProperty( kAudioHardwarePropertyHogModeIsAllowed, dataSize, &doHog ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting 'hog' state!"; errorText_ = errorStream_.str(); return FAILURE; } // Get the stream "configuration". AudioBufferList *bufferList; result = AudioDeviceGetPropertyInfo( id, 0, isInput, kAudioDevicePropertyStreamConfiguration, &dataSize, NULL ); if (result != noErr || dataSize == 0) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration info for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Allocate the AudioBufferList. bufferList = (AudioBufferList *) malloc( dataSize ); if ( bufferList == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: memory error allocating AudioBufferList."; return FAILURE; } result = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyStreamConfiguration, &dataSize, bufferList ); if ( result != noErr ) { free( bufferList ); errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream configuration for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Search for one or more streams that contain the desired number of // channels. CoreAudio devices can have an arbitrary number of // streams and each stream can have an arbitrary number of channels. // For each stream, a single buffer of interleaved samples is // provided. RtAudio prefers the use of one stream of interleaved // data or multiple consecutive single-channel streams. However, we // now support multiple consecutive multi-channel streams of // interleaved data as well. UInt32 iStream, offsetCounter = firstChannel; UInt32 nStreams = bufferList->mNumberBuffers; bool monoMode = false; bool foundStream = false; // First check that the device supports the requested number of // channels. UInt32 deviceChannels = 0; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; if ( deviceChannels < ( channels + firstChannel ) ) { free( bufferList ); errorStream_ << "RtApiCore::probeDeviceOpen: the device (" << device << ") does not support the requested channel count."; errorText_ = errorStream_.str(); return FAILURE; } // Look for a single stream meeting our needs. UInt32 firstStream, streamCount = 1, streamChannels = 0, channelOffset = 0; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; if ( streamChannels >= channels + offsetCounter ) { firstStream = iStream; channelOffset = offsetCounter; foundStream = true; break; } if ( streamChannels > offsetCounter ) break; offsetCounter -= streamChannels; } // If we didn't find a single stream above, then we should be able // to meet the channel specification with multiple streams. if ( foundStream == false ) { monoMode = true; offsetCounter = firstChannel; for ( iStream=0; iStreammBuffers[iStream].mNumberChannels; if ( streamChannels > offsetCounter ) break; offsetCounter -= streamChannels; } firstStream = iStream; channelOffset = offsetCounter; Int32 channelCounter = channels + offsetCounter - streamChannels; if ( streamChannels > 1 ) monoMode = false; while ( channelCounter > 0 ) { streamChannels = bufferList->mBuffers[++iStream].mNumberChannels; if ( streamChannels > 1 ) monoMode = false; channelCounter -= streamChannels; streamCount++; } } free( bufferList ); // Determine the buffer size. AudioValueRange bufferRange; dataSize = sizeof( AudioValueRange ); result = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &dataSize, &bufferRange ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting buffer size range for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ( bufferRange.mMinimum > *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMinimum; else if ( bufferRange.mMaximum < *bufferSize ) *bufferSize = (unsigned long) bufferRange.mMaximum; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) *bufferSize = (unsigned long) bufferRange.mMinimum; // Set the buffer size. For multiple streams, I'm assuming we only // need to make this setting for the master channel. UInt32 theSize = (UInt32) *bufferSize; dataSize = sizeof( UInt32 ); result = AudioDeviceSetProperty( id, NULL, 0, isInput, kAudioDevicePropertyBufferFrameSize, dataSize, &theSize ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting the buffer size for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // If attempting to setup a duplex stream, the bufferSize parameter // MUST be the same in both directions! *bufferSize = theSize; if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.bufferSize = *bufferSize; stream_.nBuffers = 1; // Get the stream ID(s) so we can set the stream format. We'll have // to do this for each stream. AudioStreamID streamIDs[ nStreams ]; dataSize = nStreams * sizeof( AudioStreamID ); result = AudioDeviceGetProperty( id, 0, isInput, kAudioDevicePropertyStreams, &dataSize, &streamIDs ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream ID(s) for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Now set the stream format. Also, check the physical format of the // device and change that if necessary. AudioStreamBasicDescription description; dataSize = sizeof( AudioStreamBasicDescription ); bool updateFormat; for ( UInt32 i=0; i 1.0 ) { description.mSampleRate = (double) sampleRate; updateFormat = true; } if ( description.mFormatID != kAudioFormatLinearPCM ) { description.mFormatID = kAudioFormatLinearPCM; updateFormat = true; } if ( updateFormat ) { result = AudioStreamSetProperty( streamIDs[firstStream+i], NULL, 0, kAudioStreamPropertyVirtualFormat, dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting sample rate or data format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Now check the physical format. result = AudioStreamGetProperty( streamIDs[firstStream+i], 0, kAudioStreamPropertyPhysicalFormat, &dataSize, &description ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream physical format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Snow Leopard / Leopard Fix ================================================= /**/description.mSampleRate = sampleRate; /**/result = AudioDeviceSetProperty( streamIDs[firstStream+i], NULL, 0, isInput, /**/ kAudioDevicePropertyStreamFormat, /**/ dataSize, &description ); if ( description.mFormatID != kAudioFormatLinearPCM || description.mBitsPerChannel < 24 ) { description.mFormatID = kAudioFormatLinearPCM; AudioStreamBasicDescription testDescription = description; unsigned long formatFlags; // We'll try higher bit rates first and then work our way down. testDescription.mBitsPerChannel = 32; /**/ testDescription.mBytesPerFrame = testDescription.mBitsPerChannel/8 * testDescription.mChannelsPerFrame; /**/ testDescription.mBytesPerPacket = testDescription.mBytesPerFrame * testDescription.mFramesPerPacket; formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsFloat) & ~kLinearPCMFormatFlagIsSignedInteger; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[firstStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if ( result == noErr ) continue; testDescription = description; testDescription.mBitsPerChannel = 32; /**/ testDescription.mBytesPerFrame = testDescription.mBitsPerChannel/8 * testDescription.mChannelsPerFrame; /**/ testDescription.mBytesPerPacket = testDescription.mBytesPerFrame * testDescription.mFramesPerPacket; formatFlags = (description.mFormatFlags | kLinearPCMFormatFlagIsSignedInteger) & ~kLinearPCMFormatFlagIsFloat; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[firstStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if ( result == noErr ) continue; testDescription = description; testDescription.mBitsPerChannel = 24; /**/ testDescription.mBytesPerFrame = testDescription.mBitsPerChannel/8 * testDescription.mChannelsPerFrame; /**/ testDescription.mBytesPerPacket = testDescription.mBytesPerFrame * testDescription.mFramesPerPacket; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[firstStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if ( result == noErr ) continue; testDescription = description; testDescription.mBitsPerChannel = 16; /**/ testDescription.mBytesPerFrame = testDescription.mBitsPerChannel/8 * testDescription.mChannelsPerFrame; /**/ testDescription.mBytesPerPacket = testDescription.mBytesPerFrame * testDescription.mFramesPerPacket; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[firstStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if ( result == noErr ) continue; testDescription = description; testDescription.mBitsPerChannel = 8; /**/ testDescription.mBytesPerFrame = testDescription.mBitsPerChannel/8 * testDescription.mChannelsPerFrame; /**/ testDescription.mBytesPerPacket = testDescription.mBytesPerFrame * testDescription.mFramesPerPacket; testDescription.mFormatFlags = formatFlags; result = AudioStreamSetProperty( streamIDs[firstStream+i], NULL, 0, kAudioStreamPropertyPhysicalFormat, dataSize, &testDescription ); if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") setting physical data format for device (" << device << ")."; errorText_ = errorStream_.str(); return FAILURE; // End Snow Leopard / Leopard Fix ============================================= } } } // Get the stream latency. There can be latency in both the device // and the stream. First, attempt to get the device latency on the // master channel or the first open channel. Errors that might // occur here are not deemed critical. // ***** CHECK THIS ***** // UInt32 latency, channel = 0; dataSize = sizeof( UInt32 ); AudioDevicePropertyID property = kAudioDevicePropertyLatency; if ( hasProperty( id, channel, isInput, property ) == true ) { result = AudioDeviceGetProperty( id, channel, isInput, property, &dataSize, &latency ); if ( result == kAudioHardwareNoError ) stream_.latency[ mode ] = latency; else { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting device latency for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); } } // Now try to get the stream latency. For multiple streams, I assume the // latency is equal for each. result = AudioStreamGetProperty( streamIDs[firstStream], 0, property, &dataSize, &latency ); if ( result == kAudioHardwareNoError ) stream_.latency[ mode ] += latency; else { errorStream_ << "RtApiCore::probeDeviceOpen: system error (" << getErrorCode( result ) << ") getting stream latency for device (" << device << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); } // Byte-swapping: According to AudioHardware.h, the stream data will // always be presented in native-endian format, so we should never // need to byte swap. stream_.doByteSwap[mode] = false; // From the CoreAudio documentation, PCM data must be supplied as // 32-bit floats. stream_.userFormat = format; stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; if ( streamCount == 1 ) stream_.nDeviceChannels[mode] = description.mChannelsPerFrame; else // multiple streams stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; stream_.channelOffset[mode] = channelOffset; // offset within a CoreAudio stream if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; stream_.deviceInterleaved[mode] = true; if ( monoMode == true ) stream_.deviceInterleaved[mode] = false; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( streamCount == 1 ) { if ( stream_.nUserChannels[mode] > 1 && stream_.userInterleaved != stream_.deviceInterleaved[mode] ) stream_.doConvertBuffer[mode] = true; } else if ( monoMode && stream_.userInterleaved ) stream_.doConvertBuffer[mode] = true; // Allocate our CoreHandle structure for the stream. CoreHandle *handle = 0; if ( stream_.apiHandle == 0 ) { try { handle = new CoreHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating CoreHandle memory."; goto error; } if ( pthread_cond_init( &handle->condition, NULL ) ) { errorText_ = "RtApiCore::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) handle; } else handle = (CoreHandle *) stream_.apiHandle; handle->iStream[mode] = firstStream; handle->nStreams[mode] = streamCount; handle->id[mode] = id; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating user buffer memory."; goto error; } // If possible, we will make use of the CoreAudio stream buffers as // "device buffers". However, we can't do this if using multiple // streams. if ( stream_.doConvertBuffer[mode] && handle->nStreams[mode] > 1 ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiCore::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.sampleRate = sampleRate; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; stream_.callbackInfo.object = (void *) this; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) { if ( streamCount > 1 ) setConvertInfo( mode, 0 ); else setConvertInfo( mode, channelOffset ); } if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device ) // Only one callback procedure per device. stream_.mode = DUPLEX; else { #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) result = AudioDeviceCreateIOProcID( id, callbackHandler, (void *) &stream_.callbackInfo, &handle->procId[mode] ); #else // deprecated in favor of AudioDeviceCreateIOProcID() result = AudioDeviceAddIOProc( id, callbackHandler, (void *) &stream_.callbackInfo ); #endif if ( result != noErr ) { errorStream_ << "RtApiCore::probeDeviceOpen: system error setting callback for device (" << device << ")."; errorText_ = errorStream_.str(); goto error; } if ( stream_.mode == OUTPUT && mode == INPUT ) stream_.mode = DUPLEX; else stream_.mode = mode; } // Setup the device property listener for over/underload. result = AudioDeviceAddPropertyListener( id, 0, isInput, kAudioDeviceProcessorOverload, deviceListener, (void *) handle ); return SUCCESS; error: if ( handle ) { pthread_cond_destroy( &handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiCore :: closeStream( void ) { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( stream_.state == STREAM_RUNNING ) AudioDeviceStop( handle->id[0], callbackHandler ); #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) AudioDeviceDestroyIOProcID( handle->id[0], handle->procId[0] ); #else // deprecated in favor of AudioDeviceDestroyIOProcID() AudioDeviceRemoveIOProc( handle->id[0], callbackHandler ); #endif } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { if ( stream_.state == STREAM_RUNNING ) AudioDeviceStop( handle->id[1], callbackHandler ); #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) AudioDeviceDestroyIOProcID( handle->id[1], handle->procId[1] ); #else // deprecated in favor of AudioDeviceDestroyIOProcID() AudioDeviceRemoveIOProc( handle->id[1], callbackHandler ); #endif } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } // Destroy pthread condition variable. pthread_cond_destroy( &handle->condition ); delete handle; stream_.apiHandle = 0; stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiCore :: startStream( void ) { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiCore::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); OSStatus result = noErr; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = AudioDeviceStart( handle->id[0], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::startStream: system error (" << getErrorCode( result ) << ") starting callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { result = AudioDeviceStart( handle->id[1], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::startStream: system error starting input callback procedure on device (" << stream_.device[1] << ")."; errorText_ = errorStream_.str(); goto unlock; } } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( result == noErr ) return; error( RtError::SYSTEM_ERROR ); } void RtApiCore :: stopStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiCore::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } OSStatus result = noErr; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 1; pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled } result = AudioDeviceStop( handle->id[0], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { result = AudioDeviceStop( handle->id[1], callbackHandler ); if ( result != noErr ) { errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping input callback procedure on device (" << stream_.device[1] << ")."; errorText_ = errorStream_.str(); goto unlock; } } stream_.state = STREAM_STOPPED; unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( result == noErr ) return; error( RtError::SYSTEM_ERROR ); } void RtApiCore :: abortStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiCore::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } CoreHandle *handle = (CoreHandle *) stream_.apiHandle; handle->drainCounter = 1; stopStream(); } bool RtApiCore :: callbackEvent( AudioDeviceID deviceId, const AudioBufferList *inBufferList, const AudioBufferList *outBufferList ) { if ( stream_.state == STREAM_STOPPED ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > 3 ) { if ( handle->internalDrain == false ) pthread_cond_signal( &handle->condition ); else stopStream(); return SUCCESS; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return SUCCESS; } AudioDeviceID outputDevice = handle->id[0]; // Invoke user callback to get fresh output data UNLESS we are // draining stream or duplex mode AND the input/output devices are // different AND this function is called for the input device. if ( handle->drainCounter == 0 && ( stream_.mode != DUPLEX || deviceId == outputDevice ) ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } handle->drainCounter = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( handle->drainCounter == 2 ) { MUTEX_UNLOCK( &stream_.mutex ); abortStream(); return SUCCESS; } else if ( handle->drainCounter == 1 ) handle->internalDrain = true; } if ( stream_.mode == OUTPUT || ( stream_.mode == DUPLEX && deviceId == outputDevice ) ) { if ( handle->drainCounter > 1 ) { // write zeros to the output stream if ( handle->nStreams[0] == 1 ) { memset( outBufferList->mBuffers[handle->iStream[0]].mData, 0, outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); } else { // fill multiple streams with zeros for ( unsigned int i=0; inStreams[0]; i++ ) { memset( outBufferList->mBuffers[handle->iStream[0]+i].mData, 0, outBufferList->mBuffers[handle->iStream[0]+i].mDataByteSize ); } } } else if ( handle->nStreams[0] == 1 ) { if ( stream_.doConvertBuffer[0] ) { // convert directly to CoreAudio stream buffer convertBuffer( (char *) outBufferList->mBuffers[handle->iStream[0]].mData, stream_.userBuffer[0], stream_.convertInfo[0] ); } else { // copy from user buffer memcpy( outBufferList->mBuffers[handle->iStream[0]].mData, stream_.userBuffer[0], outBufferList->mBuffers[handle->iStream[0]].mDataByteSize ); } } else { // fill multiple streams Float32 *inBuffer = (Float32 *) stream_.userBuffer[0]; if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); inBuffer = (Float32 *) stream_.deviceBuffer; } if ( stream_.deviceInterleaved[0] == false ) { // mono mode UInt32 bufferBytes = outBufferList->mBuffers[handle->iStream[0]].mDataByteSize; for ( unsigned int i=0; imBuffers[handle->iStream[0]+i].mData, (void *)&inBuffer[i*stream_.bufferSize], bufferBytes ); } } else { // fill multiple multi-channel streams with interleaved data UInt32 streamChannels, channelsLeft, inJump, outJump, inOffset; Float32 *out, *in; bool inInterleaved = ( stream_.userInterleaved ) ? true : false; UInt32 inChannels = stream_.nUserChannels[0]; if ( stream_.doConvertBuffer[0] ) { inInterleaved = true; // device buffer will always be interleaved for nStreams > 1 and not mono mode inChannels = stream_.nDeviceChannels[0]; } if ( inInterleaved ) inOffset = 1; else inOffset = stream_.bufferSize; channelsLeft = inChannels; for ( unsigned int i=0; inStreams[0]; i++ ) { in = inBuffer; out = (Float32 *) outBufferList->mBuffers[handle->iStream[0]+i].mData; streamChannels = outBufferList->mBuffers[handle->iStream[0]+i].mNumberChannels; outJump = 0; // Account for possible channel offset in first stream if ( i == 0 && stream_.channelOffset[0] > 0 ) { streamChannels -= stream_.channelOffset[0]; outJump = stream_.channelOffset[0]; out += outJump; } // Account for possible unfilled channels at end of the last stream if ( streamChannels > channelsLeft ) { outJump = streamChannels - channelsLeft; streamChannels = channelsLeft; } // Determine input buffer offsets and skips if ( inInterleaved ) { inJump = inChannels; in += inChannels - channelsLeft; } else { inJump = 1; in += (inChannels - channelsLeft) * inOffset; } for ( unsigned int i=0; idrainCounter ) { handle->drainCounter++; goto unlock; } } AudioDeviceID inputDevice; inputDevice = handle->id[1]; if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && deviceId == inputDevice ) ) { if ( handle->nStreams[1] == 1 ) { if ( stream_.doConvertBuffer[1] ) { // convert directly from CoreAudio stream buffer convertBuffer( stream_.userBuffer[1], (char *) inBufferList->mBuffers[handle->iStream[1]].mData, stream_.convertInfo[1] ); } else { // copy to user buffer memcpy( stream_.userBuffer[1], inBufferList->mBuffers[handle->iStream[1]].mData, inBufferList->mBuffers[handle->iStream[1]].mDataByteSize ); } } else { // read from multiple streams Float32 *outBuffer = (Float32 *) stream_.userBuffer[1]; if ( stream_.doConvertBuffer[1] ) outBuffer = (Float32 *) stream_.deviceBuffer; if ( stream_.deviceInterleaved[1] == false ) { // mono mode UInt32 bufferBytes = inBufferList->mBuffers[handle->iStream[1]].mDataByteSize; for ( unsigned int i=0; imBuffers[handle->iStream[1]+i].mData, bufferBytes ); } } else { // read from multiple multi-channel streams UInt32 streamChannels, channelsLeft, inJump, outJump, outOffset; Float32 *out, *in; bool outInterleaved = ( stream_.userInterleaved ) ? true : false; UInt32 outChannels = stream_.nUserChannels[1]; if ( stream_.doConvertBuffer[1] ) { outInterleaved = true; // device buffer will always be interleaved for nStreams > 1 and not mono mode outChannels = stream_.nDeviceChannels[1]; } if ( outInterleaved ) outOffset = 1; else outOffset = stream_.bufferSize; channelsLeft = outChannels; for ( unsigned int i=0; inStreams[1]; i++ ) { out = outBuffer; in = (Float32 *) inBufferList->mBuffers[handle->iStream[1]+i].mData; streamChannels = inBufferList->mBuffers[handle->iStream[1]+i].mNumberChannels; inJump = 0; // Account for possible channel offset in first stream if ( i == 0 && stream_.channelOffset[1] > 0 ) { streamChannels -= stream_.channelOffset[1]; inJump = stream_.channelOffset[1]; in += inJump; } // Account for possible unread channels at end of the last stream if ( streamChannels > channelsLeft ) { inJump = streamChannels - channelsLeft; streamChannels = channelsLeft; } // Determine output buffer offsets and skips if ( outInterleaved ) { outJump = outChannels; out += outChannels - channelsLeft; } else { outJump = 1; out += (outChannels - channelsLeft) * outOffset; } for ( unsigned int i=0; i #include // A structure to hold various information related to the Jack API // implementation. struct JackHandle { jack_client_t *client; jack_port_t **ports[2]; std::string deviceName[2]; bool xrun[2]; pthread_cond_t condition; int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. JackHandle() :client(0), drainCounter(0), internalDrain(false) { ports[0] = 0; ports[1] = 0; xrun[0] = false; xrun[1] = false; } }; void jackSilentError( const char * ) {}; RtApiJack :: RtApiJack() { // Nothing to do here. #if !defined(__RTAUDIO_DEBUG__) // Turn off Jack's internal error reporting. jack_set_error_function( &jackSilentError ); #endif } RtApiJack :: ~RtApiJack() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiJack :: getDeviceCount( void ) { // See if we can become a jack client. jack_options_t options = (jack_options_t) ( JackNoStartServer | JackUseExactName ); //JackNullOption; jack_status_t *status = NULL; jack_client_t *client = jack_client_open( "RtApiJackCount", options, status ); if ( client == 0 ) return 0; const char **ports; std::string port, previousPort; unsigned int nChannels = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). size_t iColon = 0; do { port = (char *) ports[ nChannels ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon + 1 ); if ( port != previousPort ) { nDevices++; previousPort = port; } } } while ( ports[++nChannels] ); free( ports ); } jack_client_close( client ); return nDevices; } RtAudio::DeviceInfo RtApiJack :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; jack_options_t options = (jack_options_t) ( JackNoStartServer | JackUseExactName ); //JackNullOption jack_status_t *status = NULL; jack_client_t *client = jack_client_open( "RtApiJackInfo", options, status ); if ( client == 0 ) { errorText_ = "RtApiJack::getDeviceInfo: Jack server not found or connection error!"; error( RtError::WARNING ); return info; } const char **ports; std::string port, previousPort; unsigned int nPorts = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). size_t iColon = 0; do { port = (char *) ports[ nPorts ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon ); if ( port != previousPort ) { if ( nDevices == device ) info.name = port; nDevices++; previousPort = port; } } } while ( ports[++nPorts] ); free( ports ); } if ( device >= nDevices ) { errorText_ = "RtApiJack::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } // Get the current jack server sample rate. info.sampleRates.clear(); info.sampleRates.push_back( jack_get_sample_rate( client ) ); // Count the available ports containing the client name as device // channels. Jack "input ports" equal RtAudio output channels. unsigned int nChannels = 0; ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsInput ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); info.outputChannels = nChannels; } // Jack "output ports" equal RtAudio input channels. nChannels = 0; ports = jack_get_ports( client, info.name.c_str(), NULL, JackPortIsOutput ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); info.inputChannels = nChannels; } if ( info.outputChannels == 0 && info.inputChannels == 0 ) { jack_client_close(client); errorText_ = "RtApiJack::getDeviceInfo: error determining Jack input/output channels!"; error( RtError::WARNING ); return info; } // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Jack always uses 32-bit floats. info.nativeFormats = RTAUDIO_FLOAT32; // Jack doesn't provide default devices so we'll use the first available one. if ( device == 0 && info.outputChannels > 0 ) info.isDefaultOutput = true; if ( device == 0 && info.inputChannels > 0 ) info.isDefaultInput = true; jack_client_close(client); info.probed = true; return info; } int jackCallbackHandler( jack_nframes_t nframes, void *infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiJack *object = (RtApiJack *) info->object; if ( object->callbackEvent( (unsigned long) nframes ) == false ) return 1; return 0; } void jackShutdown( void *infoPointer ) { CallbackInfo *info = (CallbackInfo *) infoPointer; RtApiJack *object = (RtApiJack *) info->object; // Check current stream state. If stopped, then we'll assume this // was called as a result of a call to RtApiJack::stopStream (the // deactivation of a client handle causes this function to be called). // If not, we'll assume the Jack server is shutting down or some // other problem occurred and we should close the stream. if ( object->isStreamRunning() == false ) return; object->closeStream(); std::cerr << "\nRtApiJack: the Jack server is shutting down this client ... stream stopped and closed!!\n" << std::endl; } int jackXrun( void *infoPointer ) { JackHandle *handle = (JackHandle *) infoPointer; if ( handle->ports[0] ) handle->xrun[0] = true; if ( handle->ports[1] ) handle->xrun[1] = true; return 0; } bool RtApiJack :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { JackHandle *handle = (JackHandle *) stream_.apiHandle; // Look for jack server and try to become a client (only do once per stream). jack_client_t *client = 0; if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) { jack_options_t jackoptions = (jack_options_t) ( JackNoStartServer | JackUseExactName ); //JackNullOption; jack_status_t *status = NULL; if ( options && !options->streamName.empty() ) client = jack_client_open( options->streamName.c_str(), jackoptions, status ); else client = jack_client_open( "RtApiJack", jackoptions, status ); if ( client == 0 ) { errorText_ = "RtApiJack::probeDeviceOpen: Jack server not found or connection error!"; error( RtError::WARNING ); return FAILURE; } } else { // The handle must have been created on an earlier pass. client = handle->client; } const char **ports; std::string port, previousPort, deviceName; unsigned int nPorts = 0, nDevices = 0; ports = jack_get_ports( client, NULL, NULL, 0 ); if ( ports ) { // Parse the port names up to the first colon (:). size_t iColon = 0; do { port = (char *) ports[ nPorts ]; iColon = port.find(":"); if ( iColon != std::string::npos ) { port = port.substr( 0, iColon ); if ( port != previousPort ) { if ( nDevices == device ) deviceName = port; nDevices++; previousPort = port; } } } while ( ports[++nPorts] ); free( ports ); } if ( device >= nDevices ) { errorText_ = "RtApiJack::probeDeviceOpen: device ID is invalid!"; return FAILURE; } // Count the available ports containing the client name as device // channels. Jack "input ports" equal RtAudio output channels. unsigned int nChannels = 0; unsigned long flag = JackPortIsInput; if ( mode == INPUT ) flag = JackPortIsOutput; ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); if ( ports ) { while ( ports[ nChannels ] ) nChannels++; free( ports ); } // Compare the jack ports for specified client to the requested number of channels. if ( nChannels < (channels + firstChannel) ) { errorStream_ << "RtApiJack::probeDeviceOpen: requested number of channels (" << channels << ") + offset (" << firstChannel << ") not found for specified device (" << device << ":" << deviceName << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Check the jack server sample rate. unsigned int jackRate = jack_get_sample_rate( client ); if ( sampleRate != jackRate ) { jack_client_close( client ); errorStream_ << "RtApiJack::probeDeviceOpen: the requested sample rate (" << sampleRate << ") is different than the JACK server rate (" << jackRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.sampleRate = jackRate; // Get the latency of the JACK port. ports = jack_get_ports( client, deviceName.c_str(), NULL, flag ); if ( ports[ firstChannel ] ) stream_.latency[mode] = jack_port_get_latency( jack_port_by_name( client, ports[ firstChannel ] ) ); free( ports ); // The jack server always uses 32-bit floating-point data. stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; stream_.userFormat = format; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // Jack always uses non-interleaved buffers. stream_.deviceInterleaved[mode] = false; // Jack always provides host byte-ordered data. stream_.doByteSwap[mode] = false; // Get the buffer size. The buffer size and number of buffers // (periods) is set when the jack server is started. stream_.bufferSize = (int) jack_get_buffer_size( client ); *bufferSize = stream_.bufferSize; stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate our JackHandle structure for the stream. if ( handle == 0 ) { try { handle = new JackHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating JackHandle memory."; goto error; } if ( pthread_cond_init(&handle->condition, NULL) ) { errorText_ = "RtApiJack::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) handle; handle->client = client; } handle->deviceName[mode] = deviceName; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; if ( mode == OUTPUT ) bufferBytes = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); else { // mode == INPUT bufferBytes = stream_.nDeviceChannels[1] * formatBytes( stream_.deviceFormat[1] ); if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes(stream_.deviceFormat[0]); if ( bufferBytes < bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } // Allocate memory for the Jack ports (channels) identifiers. handle->ports[mode] = (jack_port_t **) malloc ( sizeof (jack_port_t *) * channels ); if ( handle->ports[mode] == NULL ) { errorText_ = "RtApiJack::probeDeviceOpen: error allocating port memory."; goto error; } stream_.device[mode] = device; stream_.channelOffset[mode] = firstChannel; stream_.state = STREAM_STOPPED; stream_.callbackInfo.object = (void *) this; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up the stream for output. stream_.mode = DUPLEX; else { stream_.mode = mode; jack_set_process_callback( handle->client, jackCallbackHandler, (void *) &stream_.callbackInfo ); jack_set_xrun_callback( handle->client, jackXrun, (void *) &handle ); jack_on_shutdown( handle->client, jackShutdown, (void *) &stream_.callbackInfo ); } // Register our ports. char label[64]; if ( mode == OUTPUT ) { for ( unsigned int i=0; iports[0][i] = jack_port_register( handle->client, (const char *)label, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); } } else { for ( unsigned int i=0; iports[1][i] = jack_port_register( handle->client, (const char *)label, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0 ); } } // Setup the buffer conversion information structure. We don't use // buffers to do channel offsets, so we override that parameter // here. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); return SUCCESS; error: if ( handle ) { pthread_cond_destroy( &handle->condition ); jack_client_close( handle->client ); if ( handle->ports[0] ) free( handle->ports[0] ); if ( handle->ports[1] ) free( handle->ports[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiJack :: closeStream( void ) { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiJack::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( handle ) { if ( stream_.state == STREAM_RUNNING ) jack_deactivate( handle->client ); jack_client_close( handle->client ); } if ( handle ) { if ( handle->ports[0] ) free( handle->ports[0] ); if ( handle->ports[1] ) free( handle->ports[1] ); pthread_cond_destroy( &handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiJack :: startStream( void ) { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiJack::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK(&stream_.mutex); JackHandle *handle = (JackHandle *) stream_.apiHandle; int result = jack_activate( handle->client ); if ( result ) { errorText_ = "RtApiJack::startStream(): unable to activate JACK client!"; goto unlock; } const char **ports; // Get the list of available ports. if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = 1; ports = jack_get_ports( handle->client, handle->deviceName[0].c_str(), NULL, JackPortIsInput); if ( ports == NULL) { errorText_ = "RtApiJack::startStream(): error determining available JACK input ports!"; goto unlock; } // Now make the port connections. Since RtAudio wasn't designed to // allow the user to select particular channels of a device, we'll // just open the first "nChannels" ports with offset. for ( unsigned int i=0; iclient, jack_port_name( handle->ports[0][i] ), ports[ stream_.channelOffset[0] + i ] ); if ( result ) { free( ports ); errorText_ = "RtApiJack::startStream(): error connecting output ports!"; goto unlock; } } free(ports); } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { result = 1; ports = jack_get_ports( handle->client, handle->deviceName[1].c_str(), NULL, JackPortIsOutput ); if ( ports == NULL) { errorText_ = "RtApiJack::startStream(): error determining available JACK output ports!"; goto unlock; } // Now make the port connections. See note above. for ( unsigned int i=0; iclient, ports[ stream_.channelOffset[1] + i ], jack_port_name( handle->ports[1][i] ) ); if ( result ) { free( ports ); errorText_ = "RtApiJack::startStream(): error connecting input ports!"; goto unlock; } } free(ports); } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; unlock: MUTEX_UNLOCK(&stream_.mutex); if ( result == 0 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiJack :: stopStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiJack::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 1; pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled } } jack_deactivate( handle->client ); stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); } void RtApiJack :: abortStream( void ) { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiJack::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } JackHandle *handle = (JackHandle *) stream_.apiHandle; handle->drainCounter = 1; stopStream(); } // This function will be called by a spawned thread when the user // callback function signals that the stream should be stopped or // aborted. It is necessary to handle it this way because the // callbackEvent() function must return before the jack_deactivate() // function will return. extern "C" void *jackStopStream( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiJack *object = (RtApiJack *) info->object; object->stopStream(); pthread_exit( NULL ); } bool RtApiJack :: callbackEvent( unsigned long nframes ) { if ( stream_.state == STREAM_STOPPED ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiCore::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return FAILURE; } if ( stream_.bufferSize != nframes ) { errorText_ = "RtApiCore::callbackEvent(): the JACK buffer size has changed ... cannot process!"; error( RtError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; JackHandle *handle = (JackHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > 3 ) { if ( handle->internalDrain == true ) { ThreadHandle id; pthread_create( &id, NULL, jackStopStream, info ); } else pthread_cond_signal( &handle->condition ); return SUCCESS; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return SUCCESS; } // Invoke user callback first, to get fresh output data. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } handle->drainCounter = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( handle->drainCounter == 2 ) { MUTEX_UNLOCK( &stream_.mutex ); ThreadHandle id; pthread_create( &id, NULL, jackStopStream, info ); return SUCCESS; } else if ( handle->drainCounter == 1 ) handle->internalDrain = true; } jack_default_audio_sample_t *jackbuffer; unsigned long bufferBytes = nframes * sizeof( jack_default_audio_sample_t ); if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter > 0 ) { // write zeros to the output stream for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memset( jackbuffer, 0, bufferBytes ); } } else if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memcpy( jackbuffer, &stream_.deviceBuffer[i*bufferBytes], bufferBytes ); } } else { // no buffer conversion for ( unsigned int i=0; iports[0][i], (jack_nframes_t) nframes ); memcpy( jackbuffer, &stream_.userBuffer[0][i*bufferBytes], bufferBytes ); } } if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { if ( stream_.doConvertBuffer[1] ) { for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); memcpy( &stream_.deviceBuffer[i*bufferBytes], jackbuffer, bufferBytes ); } convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } else { // no buffer conversion for ( unsigned int i=0; iports[1][i], (jack_nframes_t) nframes ); memcpy( &stream_.userBuffer[1][i*bufferBytes], jackbuffer, bufferBytes ); } } } unlock: MUTEX_UNLOCK(&stream_.mutex); RtApi::tickStreamTime(); return SUCCESS; } //******************** End of __UNIX_JACK__ *********************// #endif #if defined(__WINDOWS_ASIO__) // ASIO API on Windows // The ASIO API is designed around a callback scheme, so this // implementation is similar to that used for OS-X CoreAudio and Linux // Jack. The primary constraint with ASIO is that it only allows // access to a single driver at a time. Thus, it is not possible to // have more than one simultaneous RtAudio stream. // // This implementation also requires a number of external ASIO files // and a few global variables. The ASIO callback scheme does not // allow for the passing of user data, so we must create a global // pointer to our callbackInfo structure. // // On unix systems, we make use of a pthread condition variable. // Since there is no equivalent in Windows, I hacked something based // on information found in // http://www.cs.wustl.edu/~schmidt/win32-cv-1.html. #include "asiosys.h" #include "asio.h" #include "iasiothiscallresolver.h" #include "asiodrivers.h" #include AsioDrivers drivers; ASIOCallbacks asioCallbacks; ASIODriverInfo driverInfo; CallbackInfo *asioCallbackInfo; bool asioXRun; struct AsioHandle { int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. ASIOBufferInfo *bufferInfos; HANDLE condition; AsioHandle() :drainCounter(0), internalDrain(false), bufferInfos(0) {} }; // Function declarations (definitions at end of section) static const char* getAsioErrorString( ASIOError result ); void sampleRateChanged( ASIOSampleRate sRate ); long asioMessages( long selector, long value, void* message, double* opt ); RtApiAsio :: RtApiAsio() { // ASIO cannot run on a multi-threaded appartment. You can call // CoInitialize beforehand, but it must be for appartment threading // (in which case, CoInitilialize will return S_FALSE here). coInitialized_ = false; HRESULT hr = CoInitialize( NULL ); if ( FAILED(hr) ) { errorText_ = "RtApiAsio::ASIO requires a single-threaded appartment. Call CoInitializeEx(0,COINIT_APARTMENTTHREADED)"; error( RtError::WARNING ); } coInitialized_ = true; drivers.removeCurrentDriver(); driverInfo.asioVersion = 2; // See note in DirectSound implementation about GetDesktopWindow(). driverInfo.sysRef = GetForegroundWindow(); } RtApiAsio :: ~RtApiAsio() { if ( stream_.state != STREAM_CLOSED ) closeStream(); if ( coInitialized_ ) CoUninitialize(); } unsigned int RtApiAsio :: getDeviceCount( void ) { return (unsigned int) drivers.asioGetNumDev(); } RtAudio::DeviceInfo RtApiAsio :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; // Get device ID unsigned int nDevices = getDeviceCount(); if ( nDevices == 0 ) { errorText_ = "RtApiAsio::getDeviceInfo: no devices found!"; error( RtError::INVALID_USE ); } if ( device >= nDevices ) { errorText_ = "RtApiAsio::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } // If a stream is already open, we cannot probe other devices. Thus, use the saved results. if ( stream_.state != STREAM_CLOSED ) { if ( device >= devices_.size() ) { errorText_ = "RtApiAsio::getDeviceInfo: device ID was not present before stream was opened."; error( RtError::WARNING ); return info; } return devices_[ device ]; } char driverName[32]; ASIOError result = drivers.asioGetDriverName( (int) device, driverName, 32 ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::getDeviceInfo: unable to get driver name (" << getAsioErrorString( result ) << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } info.name = driverName; if ( !drivers.loadDriver( driverName ) ) { errorStream_ << "RtApiAsio::getDeviceInfo: unable to load driver (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } result = ASIOInit( &driverInfo ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Determine the device channel information. long inputChannels, outputChannels; result = ASIOGetChannels( &inputChannels, &outputChannels ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::getDeviceInfo: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } info.outputChannels = outputChannels; info.inputChannels = inputChannels; if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // Determine the supported sample rates. info.sampleRates.clear(); for ( unsigned int i=0; iobject; object->callbackEvent( index ); } void RtApiAsio :: saveDeviceInfo( void ) { devices_.clear(); unsigned int nDevices = getDeviceCount(); devices_.resize( nDevices ); for ( unsigned int i=0; isaveDeviceInfo(); // Only load the driver once for duplex stream. if ( mode != INPUT || stream_.mode != OUTPUT ) { if ( !drivers.loadDriver( driverName ) ) { errorStream_ << "RtApiAsio::probeDeviceOpen: unable to load driver (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } result = ASIOInit( &driverInfo ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") initializing driver (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Check the device channel count. long inputChannels, outputChannels; result = ASIOGetChannels( &inputChannels, &outputChannels ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: error (" << getAsioErrorString( result ) << ") getting channel count (" << driverName << ")."; errorText_ = errorStream_.str(); return FAILURE; } if ( ( mode == OUTPUT && (channels+firstChannel) > (unsigned int) outputChannels) || ( mode == INPUT && (channels+firstChannel) > (unsigned int) inputChannels) ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested channel count (" << channels << ") + offset (" << firstChannel << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nDeviceChannels[mode] = channels; stream_.nUserChannels[mode] = channels; stream_.channelOffset[mode] = firstChannel; // Verify the sample rate is supported. result = ASIOCanSampleRate( (ASIOSampleRate) sampleRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") does not support requested sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Get the current sample rate ASIOSampleRate currentRate; result = ASIOGetSampleRate( ¤tRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error getting sample rate."; errorText_ = errorStream_.str(); return FAILURE; } // Set the sample rate only if necessary if ( currentRate != sampleRate ) { result = ASIOSetSampleRate( (ASIOSampleRate) sampleRate ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error setting sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } } // Determine the driver data type. ASIOChannelInfo channelInfo; channelInfo.channel = 0; if ( mode == OUTPUT ) channelInfo.isInput = false; else channelInfo.isInput = true; result = ASIOGetChannelInfo( &channelInfo ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting data format."; errorText_ = errorStream_.str(); return FAILURE; } // Assuming WINDOWS host is always little-endian. stream_.doByteSwap[mode] = false; stream_.userFormat = format; stream_.deviceFormat[mode] = 0; if ( channelInfo.type == ASIOSTInt16MSB || channelInfo.type == ASIOSTInt16LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT16; if ( channelInfo.type == ASIOSTInt16MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTInt32MSB || channelInfo.type == ASIOSTInt32LSB ) { stream_.deviceFormat[mode] = RTAUDIO_SINT32; if ( channelInfo.type == ASIOSTInt32MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTFloat32MSB || channelInfo.type == ASIOSTFloat32LSB ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; if ( channelInfo.type == ASIOSTFloat32MSB ) stream_.doByteSwap[mode] = true; } else if ( channelInfo.type == ASIOSTFloat64MSB || channelInfo.type == ASIOSTFloat64LSB ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; if ( channelInfo.type == ASIOSTFloat64MSB ) stream_.doByteSwap[mode] = true; } if ( stream_.deviceFormat[mode] == 0 ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; } // Set the buffer size. For a duplex stream, this will end up // setting the buffer size based on the input constraints, which // should be ok. long minSize, maxSize, preferSize, granularity; result = ASIOGetBufferSize( &minSize, &maxSize, &preferSize, &granularity ); if ( result != ASE_OK ) { drivers.removeCurrentDriver(); errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting buffer size."; errorText_ = errorStream_.str(); return FAILURE; } if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; else if ( granularity == -1 ) { // Make sure bufferSize is a power of two. int log2_of_min_size = 0; int log2_of_max_size = 0; for ( unsigned int i = 0; i < sizeof(long) * 8; i++ ) { if ( minSize & ((long)1 << i) ) log2_of_min_size = i; if ( maxSize & ((long)1 << i) ) log2_of_max_size = i; } long min_delta = std::abs( (long)*bufferSize - ((long)1 << log2_of_min_size) ); int min_delta_num = log2_of_min_size; for (int i = log2_of_min_size + 1; i <= log2_of_max_size; i++) { long current_delta = std::abs( (long)*bufferSize - ((long)1 << i) ); if (current_delta < min_delta) { min_delta = current_delta; min_delta_num = i; } } *bufferSize = ( (unsigned int)1 << min_delta_num ); if ( *bufferSize < (unsigned int) minSize ) *bufferSize = (unsigned int) minSize; else if ( *bufferSize > (unsigned int) maxSize ) *bufferSize = (unsigned int) maxSize; } else if ( granularity != 0 ) { // Set to an even multiple of granularity, rounding up. *bufferSize = (*bufferSize + granularity-1) / granularity * granularity; } if ( mode == INPUT && stream_.mode == OUTPUT && stream_.bufferSize != *bufferSize ) { drivers.removeCurrentDriver(); errorText_ = "RtApiAsio::probeDeviceOpen: input/output buffersize discrepancy!"; return FAILURE; } stream_.bufferSize = *bufferSize; stream_.nBuffers = 2; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // ASIO always uses non-interleaved buffers. stream_.deviceInterleaved[mode] = false; // Allocate, if necessary, our AsioHandle structure for the stream. AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( handle == 0 ) { try { handle = new AsioHandle; } catch ( std::bad_alloc& ) { //if ( handle == NULL ) { drivers.removeCurrentDriver(); errorText_ = "RtApiAsio::probeDeviceOpen: error allocating AsioHandle memory."; return FAILURE; } handle->bufferInfos = 0; // Create a manual-reset event. handle->condition = CreateEvent( NULL, // no security TRUE, // manual-reset FALSE, // non-signaled initially NULL ); // unnamed stream_.apiHandle = (void *) handle; } // Create the ASIO internal buffers. Since RtAudio sets up input // and output separately, we'll have to dispose of previously // created output buffers for a duplex stream. long inputLatency, outputLatency; if ( mode == INPUT && stream_.mode == OUTPUT ) { ASIODisposeBuffers(); if ( handle->bufferInfos ) free( handle->bufferInfos ); } // Allocate, initialize, and save the bufferInfos in our stream callbackInfo structure. bool buffersAllocated = false; unsigned int i, nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; handle->bufferInfos = (ASIOBufferInfo *) malloc( nChannels * sizeof(ASIOBufferInfo) ); if ( handle->bufferInfos == NULL ) { errorStream_ << "RtApiAsio::probeDeviceOpen: error allocating bufferInfo memory for driver (" << driverName << ")."; errorText_ = errorStream_.str(); goto error; } ASIOBufferInfo *infos; infos = handle->bufferInfos; for ( i=0; iisInput = ASIOFalse; infos->channelNum = i + stream_.channelOffset[0]; infos->buffers[0] = infos->buffers[1] = 0; } for ( i=0; iisInput = ASIOTrue; infos->channelNum = i + stream_.channelOffset[1]; infos->buffers[0] = infos->buffers[1] = 0; } // Set up the ASIO callback structure and create the ASIO data buffers. asioCallbacks.bufferSwitch = &bufferSwitch; asioCallbacks.sampleRateDidChange = &sampleRateChanged; asioCallbacks.asioMessage = &asioMessages; asioCallbacks.bufferSwitchTimeInfo = NULL; result = ASIOCreateBuffers( handle->bufferInfos, nChannels, stream_.bufferSize, &asioCallbacks ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") creating buffers."; errorText_ = errorStream_.str(); goto error; } buffersAllocated = true; // Set flags for buffer conversion. stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiAsio::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiAsio::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.sampleRate = sampleRate; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; asioCallbackInfo = &stream_.callbackInfo; stream_.callbackInfo.object = (void *) this; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; // Determine device latencies result = ASIOGetLatencies( &inputLatency, &outputLatency ); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::probeDeviceOpen: driver (" << driverName << ") error (" << getAsioErrorString( result ) << ") getting latency."; errorText_ = errorStream_.str(); error( RtError::WARNING); // warn but don't fail } else { stream_.latency[0] = outputLatency; stream_.latency[1] = inputLatency; } // Setup the buffer conversion information structure. We don't use // buffers to do channel offsets, so we override that parameter // here. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, 0 ); return SUCCESS; error: if ( buffersAllocated ) ASIODisposeBuffers(); drivers.removeCurrentDriver(); if ( handle ) { CloseHandle( handle->condition ); if ( handle->bufferInfos ) free( handle->bufferInfos ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiAsio :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAsio::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } if ( stream_.state == STREAM_RUNNING ) { stream_.state = STREAM_STOPPED; ASIOStop(); } ASIODisposeBuffers(); drivers.removeCurrentDriver(); AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( handle ) { CloseHandle( handle->condition ); if ( handle->bufferInfos ) free( handle->bufferInfos ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiAsio :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiAsio::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); AsioHandle *handle = (AsioHandle *) stream_.apiHandle; ASIOError result = ASIOStart(); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::startStream: error (" << getAsioErrorString( result ) << ") starting device."; errorText_ = errorStream_.str(); goto unlock; } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; asioXRun = false; unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( result == ASE_OK ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAsio :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAsio::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } AsioHandle *handle = (AsioHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 1; MUTEX_UNLOCK( &stream_.mutex ); WaitForMultipleObjects( 1, &handle->condition, FALSE, INFINITE ); // block until signaled ResetEvent( handle->condition ); MUTEX_LOCK( &stream_.mutex ); } } ASIOError result = ASIOStop(); if ( result != ASE_OK ) { errorStream_ << "RtApiAsio::stopStream: error (" << getAsioErrorString( result ) << ") stopping device."; errorText_ = errorStream_.str(); } stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( result == ASE_OK ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAsio :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAsio::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } // The following lines were commented-out because some behavior was // noted where the device buffers need to be zeroed to avoid // continuing sound, even when the device buffers are completely // disposed. So now, calling abort is the same as calling stop. // AsioHandle *handle = (AsioHandle *) stream_.apiHandle; // handle->drainCounter = 1; stopStream(); } bool RtApiAsio :: callbackEvent( long bufferIndex ) { if ( stream_.state == STREAM_STOPPED ) return SUCCESS; if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAsio::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return FAILURE; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; AsioHandle *handle = (AsioHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > 3 ) { if ( handle->internalDrain == false ) SetEvent( handle->condition ); else stopStream(); return SUCCESS; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) goto unlock; // Invoke user callback to get fresh output data UNLESS we are // draining stream. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && asioXRun == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; asioXRun = false; } if ( stream_.mode != OUTPUT && asioXRun == true ) { status |= RTAUDIO_INPUT_OVERFLOW; asioXRun = false; } handle->drainCounter = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( handle->drainCounter == 2 ) { MUTEX_UNLOCK( &stream_.mutex ); abortStream(); return SUCCESS; } else if ( handle->drainCounter == 1 ) handle->internalDrain = true; } unsigned int nChannels, bufferBytes, i, j; nChannels = stream_.nDeviceChannels[0] + stream_.nDeviceChannels[1]; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { bufferBytes = stream_.bufferSize * formatBytes( stream_.deviceFormat[0] ); if ( handle->drainCounter > 1 ) { // write zeros to the output stream for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memset( handle->bufferInfos[i].buffers[bufferIndex], 0, bufferBytes ); } } else if ( stream_.doConvertBuffer[0] ) { convertBuffer( stream_.deviceBuffer, stream_.userBuffer[0], stream_.convertInfo[0] ); if ( stream_.doByteSwap[0] ) byteSwapBuffer( stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[0], stream_.deviceFormat[0] ); for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memcpy( handle->bufferInfos[i].buffers[bufferIndex], &stream_.deviceBuffer[j++*bufferBytes], bufferBytes ); } } else { if ( stream_.doByteSwap[0] ) byteSwapBuffer( stream_.userBuffer[0], stream_.bufferSize * stream_.nUserChannels[0], stream_.userFormat ); for ( i=0, j=0; ibufferInfos[i].isInput != ASIOTrue ) memcpy( handle->bufferInfos[i].buffers[bufferIndex], &stream_.userBuffer[0][bufferBytes*j++], bufferBytes ); } } if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { bufferBytes = stream_.bufferSize * formatBytes(stream_.deviceFormat[1]); if (stream_.doConvertBuffer[1]) { // Always interleave ASIO input data. for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) memcpy( &stream_.deviceBuffer[j++*bufferBytes], handle->bufferInfos[i].buffers[bufferIndex], bufferBytes ); } if ( stream_.doByteSwap[1] ) byteSwapBuffer( stream_.deviceBuffer, stream_.bufferSize * stream_.nDeviceChannels[1], stream_.deviceFormat[1] ); convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } else { for ( i=0, j=0; ibufferInfos[i].isInput == ASIOTrue ) { memcpy( &stream_.userBuffer[1][bufferBytes*j++], handle->bufferInfos[i].buffers[bufferIndex], bufferBytes ); } } if ( stream_.doByteSwap[1] ) byteSwapBuffer( stream_.userBuffer[1], stream_.bufferSize * stream_.nUserChannels[1], stream_.userFormat ); } } unlock: // The following call was suggested by Malte Clasen. While the API // documentation indicates it should not be required, some device // drivers apparently do not function correctly without it. ASIOOutputReady(); MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); return SUCCESS; } void sampleRateChanged( ASIOSampleRate sRate ) { // The ASIO documentation says that this usually only happens during // external sync. Audio processing is not stopped by the driver, // actual sample rate might not have even changed, maybe only the // sample rate status of an AES/EBU or S/PDIF digital input at the // audio device. RtApi *object = (RtApi *) asioCallbackInfo->object; try { object->stopStream(); } catch ( RtError &exception ) { std::cerr << "\nRtApiAsio: sampleRateChanged() error (" << exception.getMessage() << ")!\n" << std::endl; return; } std::cerr << "\nRtApiAsio: driver reports sample rate changed to " << sRate << " ... stream stopped!!!\n" << std::endl; } long asioMessages( long selector, long value, void* message, double* opt ) { long ret = 0; switch( selector ) { case kAsioSelectorSupported: if ( value == kAsioResetRequest || value == kAsioEngineVersion || value == kAsioResyncRequest || value == kAsioLatenciesChanged // The following three were added for ASIO 2.0, you don't // necessarily have to support them. || value == kAsioSupportsTimeInfo || value == kAsioSupportsTimeCode || value == kAsioSupportsInputMonitor) ret = 1L; break; case kAsioResetRequest: // Defer the task and perform the reset of the driver during the // next "safe" situation. You cannot reset the driver right now, // as this code is called from the driver. Reset the driver is // done by completely destruct is. I.e. ASIOStop(), // ASIODisposeBuffers(), Destruction Afterwards you initialize the // driver again. std::cerr << "\nRtApiAsio: driver reset requested!!!" << std::endl; ret = 1L; break; case kAsioResyncRequest: // This informs the application that the driver encountered some // non-fatal data loss. It is used for synchronization purposes // of different media. Added mainly to work around the Win16Mutex // problems in Windows 95/98 with the Windows Multimedia system, // which could lose data because the Mutex was held too long by // another thread. However a driver can issue it in other // situations, too. // std::cerr << "\nRtApiAsio: driver resync requested!!!" << std::endl; asioXRun = true; ret = 1L; break; case kAsioLatenciesChanged: // This will inform the host application that the drivers were // latencies changed. Beware, it this does not mean that the // buffer sizes have changed! You might need to update internal // delay data. std::cerr << "\nRtApiAsio: driver latency may have changed!!!" << std::endl; ret = 1L; break; case kAsioEngineVersion: // Return the supported ASIO version of the host application. If // a host application does not implement this selector, ASIO 1.0 // is assumed by the driver. ret = 2L; break; case kAsioSupportsTimeInfo: // Informs the driver whether the // asioCallbacks.bufferSwitchTimeInfo() callback is supported. // For compatibility with ASIO 1.0 drivers the host application // should always support the "old" bufferSwitch method, too. ret = 0; break; case kAsioSupportsTimeCode: // Informs the driver whether application is interested in time // code info. If an application does not need to know about time // code, the driver has less work to do. ret = 0; break; } return ret; } static const char* getAsioErrorString( ASIOError result ) { struct Messages { ASIOError value; const char*message; }; static Messages m[] = { { ASE_NotPresent, "Hardware input or output is not present or available." }, { ASE_HWMalfunction, "Hardware is malfunctioning." }, { ASE_InvalidParameter, "Invalid input parameter." }, { ASE_InvalidMode, "Invalid mode." }, { ASE_SPNotAdvancing, "Sample position not advancing." }, { ASE_NoClock, "Sample clock or rate cannot be determined or is not present." }, { ASE_NoMemory, "Not enough memory to complete the request." } }; for ( unsigned int i = 0; i < sizeof(m)/sizeof(m[0]); ++i ) if ( m[i].value == result ) return m[i].message; return "Unknown error."; } //******************** End of __WINDOWS_ASIO__ *********************// #endif #if defined(__WINDOWS_DS__) // Windows DirectSound API // Modified by Robin Davies, October 2005 // - Improvements to DirectX pointer chasing. // - Backdoor RtDsStatistics hook provides DirectX performance information. // - Bug fix for non-power-of-two Asio granularity used by Edirol PCR-A30. // - Auto-call CoInitialize for DSOUND and ASIO platforms. // Various revisions for RtAudio 4.0 by Gary Scavone, April 2007 #include #include #if defined(__MINGW32__) // missing from latest mingw winapi #define WAVE_FORMAT_96M08 0x00010000 /* 96 kHz, Mono, 8-bit */ #define WAVE_FORMAT_96S08 0x00020000 /* 96 kHz, Stereo, 8-bit */ #define WAVE_FORMAT_96M16 0x00040000 /* 96 kHz, Mono, 16-bit */ #define WAVE_FORMAT_96S16 0x00080000 /* 96 kHz, Stereo, 16-bit */ #endif #define MINIMUM_DEVICE_BUFFER_SIZE 32768 #ifdef _MSC_VER // if Microsoft Visual C++ #pragma comment( lib, "winmm.lib" ) // then, auto-link winmm.lib. Otherwise, it has to be added manually. #endif static inline DWORD dsPointerDifference( DWORD laterPointer, DWORD earlierPointer, DWORD bufferSize ) { if ( laterPointer > earlierPointer ) return laterPointer - earlierPointer; else return laterPointer - earlierPointer + bufferSize; } static inline DWORD dsPointerBetween( DWORD pointer, DWORD laterPointer, DWORD earlierPointer, DWORD bufferSize ) { if ( pointer > bufferSize ) pointer -= bufferSize; if ( laterPointer < earlierPointer ) laterPointer += bufferSize; if ( pointer < earlierPointer ) pointer += bufferSize; return pointer >= earlierPointer && pointer < laterPointer; } // A structure to hold various information related to the DirectSound // API implementation. struct DsHandle { unsigned int drainCounter; // Tracks callback counts when draining bool internalDrain; // Indicates if stop is initiated from callback or not. void *id[2]; void *buffer[2]; bool xrun[2]; UINT bufferPointer[2]; DWORD dsBufferSize[2]; DWORD dsPointerLeadTime[2]; // the number of bytes ahead of the safe pointer to lead by. HANDLE condition; DsHandle() :drainCounter(0), internalDrain(false) { id[0] = 0; id[1] = 0; buffer[0] = 0; buffer[1] = 0; xrun[0] = false; xrun[1] = false; bufferPointer[0] = 0; bufferPointer[1] = 0; } }; /* RtApiDs::RtDsStatistics RtApiDs::statistics; // Provides a backdoor hook to monitor for DirectSound read overruns and write underruns. RtApiDs::RtDsStatistics RtApiDs::getDsStatistics() { RtDsStatistics s = statistics; // update the calculated fields. if ( s.inputFrameSize != 0 ) s.latency += s.readDeviceSafeLeadBytes * 1.0 / s.inputFrameSize / s.sampleRate; if ( s.outputFrameSize != 0 ) s.latency += (s.writeDeviceSafeLeadBytes + s.writeDeviceBufferLeadBytes) * 1.0 / s.outputFrameSize / s.sampleRate; return s; } */ // Declarations for utility functions, callbacks, and structures // specific to the DirectSound implementation. static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, LPCTSTR description, LPCTSTR module, LPVOID lpContext ); static char* getErrorString( int code ); extern "C" unsigned __stdcall callbackHandler( void *ptr ); struct EnumInfo { bool isInput; bool getDefault; bool findIndex; unsigned int counter; unsigned int index; LPGUID id; std::string name; EnumInfo() : isInput(false), getDefault(false), findIndex(false), counter(0), index(0) {} }; RtApiDs :: RtApiDs() { // Dsound will run both-threaded. If CoInitialize fails, then just // accept whatever the mainline chose for a threading model. coInitialized_ = false; HRESULT hr = CoInitialize( NULL ); if ( !FAILED( hr ) ) coInitialized_ = true; } RtApiDs :: ~RtApiDs() { if ( coInitialized_ ) CoUninitialize(); // balanced call. if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiDs :: getDefaultInputDevice( void ) { // Count output devices. EnumInfo info; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultOutputDevice: error (" << getErrorString( result ) << ") counting output devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return 0; } // Now enumerate input devices until we find the id = NULL. info.isInput = true; info.getDefault = true; result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultInputDevice: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return 0; } if ( info.counter > 0 ) return info.counter - 1; return 0; } unsigned int RtApiDs :: getDefaultOutputDevice( void ) { // Enumerate output devices until we find the id = NULL. EnumInfo info; info.getDefault = true; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDefaultOutputDevice: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return 0; } if ( info.counter > 0 ) return info.counter - 1; return 0; } unsigned int RtApiDs :: getDeviceCount( void ) { // Count DirectSound devices. EnumInfo info; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceCount: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); } // Count DirectSoundCapture devices. info.isInput = true; result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &info ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceCount: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); } return info.counter; } RtAudio::DeviceInfo RtApiDs :: getDeviceInfo( unsigned int device ) { // Because DirectSound always enumerates input and output devices // separately (and because we don't attempt to combine devices // internally), none of our "devices" will ever be duplex. RtAudio::DeviceInfo info; info.probed = false; // Enumerate through devices to find the id (if it exists). Note // that we have to do the output enumeration first, even if this is // an input device, in order for the device counter to be correct. EnumInfo dsinfo; dsinfo.findIndex = true; dsinfo.index = device; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); } if ( dsinfo.name.empty() ) goto probeInput; LPDIRECTSOUND output; DSCAPS outCaps; result = DirectSoundCreate( dsinfo.id, &output, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening output device (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } outCaps.dwSize = sizeof( outCaps ); result = output->GetCaps( &outCaps ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting capabilities!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Get output channel information. info.outputChannels = ( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ? 2 : 1; // Get sample rate information. info.sampleRates.clear(); for ( unsigned int k=0; k= (unsigned int) outCaps.dwMinSecondarySampleRate && SAMPLE_RATES[k] <= (unsigned int) outCaps.dwMaxSecondarySampleRate ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } // Get format information. if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT ) info.nativeFormats |= RTAUDIO_SINT16; if ( outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) info.nativeFormats |= RTAUDIO_SINT8; output->Release(); if ( getDefaultOutputDevice() == device ) info.isDefaultOutput = true; // Copy name and return. info.name = dsinfo.name; info.probed = true; return info; probeInput: dsinfo.isInput = true; result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); } if ( dsinfo.name.empty() ) return info; LPDIRECTSOUNDCAPTURE input; result = DirectSoundCaptureCreate( dsinfo.id, &input, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") opening input device (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } DSCCAPS inCaps; inCaps.dwSize = sizeof( inCaps ); result = input->GetCaps( &inCaps ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::getDeviceInfo: error (" << getErrorString( result ) << ") getting object capabilities (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Get input channel information. info.inputChannels = inCaps.dwChannels; // Get sample rate and format information. if ( inCaps.dwChannels == 2 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( info.nativeFormats & RTAUDIO_SINT16 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S16 ) info.sampleRates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2S16 ) info.sampleRates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4S16 ) info.sampleRates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96S16 ) info.sampleRates.push_back( 96000 ); } else if ( info.nativeFormats & RTAUDIO_SINT8 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1S08 ) info.sampleRates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2S08 ) info.sampleRates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4S08 ) info.sampleRates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96S08 ) info.sampleRates.push_back( 44100 ); } } else if ( inCaps.dwChannels == 1 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) info.nativeFormats |= RTAUDIO_SINT16; if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) info.nativeFormats |= RTAUDIO_SINT8; if ( info.nativeFormats & RTAUDIO_SINT16 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M16 ) info.sampleRates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2M16 ) info.sampleRates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4M16 ) info.sampleRates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96M16 ) info.sampleRates.push_back( 96000 ); } else if ( info.nativeFormats & RTAUDIO_SINT8 ) { if ( inCaps.dwFormats & WAVE_FORMAT_1M08 ) info.sampleRates.push_back( 11025 ); if ( inCaps.dwFormats & WAVE_FORMAT_2M08 ) info.sampleRates.push_back( 22050 ); if ( inCaps.dwFormats & WAVE_FORMAT_4M08 ) info.sampleRates.push_back( 44100 ); if ( inCaps.dwFormats & WAVE_FORMAT_96M08 ) info.sampleRates.push_back( 96000 ); } } else info.inputChannels = 0; // technically, this would be an error input->Release(); if ( info.inputChannels == 0 ) return info; if ( getDefaultInputDevice() == device ) info.isDefaultInput = true; // Copy name and return. info.name = dsinfo.name; info.probed = true; return info; } bool RtApiDs :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { if ( channels + firstChannel > 2 ) { errorText_ = "RtApiDs::probeDeviceOpen: DirectSound does not support more than 2 channels per device."; return FAILURE; } // Enumerate through devices to find the id (if it exists). Note // that we have to do the output enumeration first, even if this is // an input device, in order for the device counter to be correct. EnumInfo dsinfo; dsinfo.findIndex = true; dsinfo.index = device; HRESULT result = DirectSoundEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") enumerating output devices!"; errorText_ = errorStream_.str(); return FAILURE; } if ( mode == OUTPUT ) { if ( dsinfo.name.empty() ) { errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support output!"; errorText_ = errorStream_.str(); return FAILURE; } } else { // mode == INPUT dsinfo.isInput = true; HRESULT result = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK) deviceQueryCallback, &dsinfo ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") enumerating input devices!"; errorText_ = errorStream_.str(); return FAILURE; } if ( dsinfo.name.empty() ) { errorStream_ << "RtApiDs::probeDeviceOpen: device (" << device << ") does not support input!"; errorText_ = errorStream_.str(); return FAILURE; } } // According to a note in PortAudio, using GetDesktopWindow() // instead of GetForegroundWindow() is supposed to avoid problems // that occur when the application's window is not the foreground // window. Also, if the application window closes before the // DirectSound buffer, DirectSound can crash. However, for console // applications, no sound was produced when using GetDesktopWindow(). HWND hWnd = GetForegroundWindow(); // Check the numberOfBuffers parameter and limit the lowest value to // two. This is a judgement call and a value of two is probably too // low for capture, but it should work for playback. int nBuffers = 0; if ( options ) nBuffers = options->numberOfBuffers; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) nBuffers = 2; if ( nBuffers < 2 ) nBuffers = 3; // Create the wave format structure. The data format setting will // be determined later. WAVEFORMATEX waveFormat; ZeroMemory( &waveFormat, sizeof(WAVEFORMATEX) ); waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.nChannels = channels + firstChannel; waveFormat.nSamplesPerSec = (unsigned long) sampleRate; // Determine the device buffer size. By default, 32k, but we will // grow it to make allowances for very large software buffer sizes. DWORD dsBufferSize = 0; DWORD dsPointerLeadTime = 0; long bufferBytes = MINIMUM_DEVICE_BUFFER_SIZE; // sound cards will always *knock wood* support this void *ohandle = 0, *bhandle = 0; if ( mode == OUTPUT ) { LPDIRECTSOUND output; result = DirectSoundCreate( dsinfo.id, &output, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening output device (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } DSCAPS outCaps; outCaps.dwSize = sizeof( outCaps ); result = output->GetCaps( &outCaps ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting capabilities (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Check channel information. if ( channels + firstChannel == 2 && !( outCaps.dwFlags & DSCAPS_PRIMARYSTEREO ) ) { errorStream_ << "RtApiDs::getDeviceInfo: the output device (" << dsinfo.name << ") does not support stereo playback."; errorText_ = errorStream_.str(); return FAILURE; } // Check format information. Use 16-bit format unless not // supported or user requests 8-bit. if ( outCaps.dwFlags & DSCAPS_PRIMARY16BIT && !( format == RTAUDIO_SINT8 && outCaps.dwFlags & DSCAPS_PRIMARY8BIT ) ) { waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } stream_.userFormat = format; // Update wave format structure and buffer information. waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; // If the user wants an even bigger buffer, increase the device buffer size accordingly. while ( dsPointerLeadTime * 2U > (DWORD) bufferBytes ) bufferBytes *= 2; // Set cooperative level to DSSCL_EXCLUSIVE ... sound stops when window focus changes. // result = output->SetCooperativeLevel( hWnd, DSSCL_EXCLUSIVE ); // Set cooperative level to DSSCL_PRIORITY ... sound remains when window focus changes. result = output->SetCooperativeLevel( hWnd, DSSCL_PRIORITY ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting cooperative level (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Even though we will write to the secondary buffer, we need to // access the primary buffer to set the correct output format // (since the default is 8-bit, 22 kHz!). Setup the DS primary // buffer description. DSBUFFERDESC bufferDescription; ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSBUFFERDESC ); bufferDescription.dwFlags = DSBCAPS_PRIMARYBUFFER; // Obtain the primary buffer LPDIRECTSOUNDBUFFER buffer; result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") accessing primary buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Set the primary DS buffer sound format. result = buffer->SetFormat( &waveFormat ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") setting primary buffer format (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Setup the secondary DS buffer description. dsBufferSize = (DWORD) bufferBytes; ZeroMemory( &bufferDescription, sizeof( DSBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSBUFFERDESC ); bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE ); // Force hardware mixing bufferDescription.dwBufferBytes = bufferBytes; bufferDescription.lpwfxFormat = &waveFormat; // Try to create the secondary DS buffer. If that doesn't work, // try to use software mixing. Otherwise, there's a problem. result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { bufferDescription.dwFlags = ( DSBCAPS_STICKYFOCUS | DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCSOFTWARE ); // Force software mixing result = output->CreateSoundBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { output->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating secondary buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } } // Get the buffer size ... might be different from what we specified. DSBCAPS dsbcaps; dsbcaps.dwSize = sizeof( DSBCAPS ); result = buffer->GetCaps( &dsbcaps ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } bufferBytes = dsbcaps.dwBufferBytes; // Lock the DS buffer LPVOID audioPtr; DWORD dataLen; result = buffer->Lock( 0, bufferBytes, &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { output->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } dsBufferSize = bufferBytes; ohandle = (void *) output; bhandle = (void *) buffer; } if ( mode == INPUT ) { LPDIRECTSOUNDCAPTURE input; result = DirectSoundCaptureCreate( dsinfo.id, &input, NULL ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") opening input device (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } DSCCAPS inCaps; inCaps.dwSize = sizeof( inCaps ); result = input->GetCaps( &inCaps ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting input capabilities (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Check channel information. if ( inCaps.dwChannels < channels + firstChannel ) { errorText_ = "RtApiDs::getDeviceInfo: the input device does not support requested input channels."; return FAILURE; } // Check format information. Use 16-bit format unless user // requests 8-bit. DWORD deviceFormats; if ( channels + firstChannel == 2 ) { deviceFormats = WAVE_FORMAT_1S08 | WAVE_FORMAT_2S08 | WAVE_FORMAT_4S08 | WAVE_FORMAT_96S08; if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } else { // assume 16-bit is supported waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } } else { // channel == 1 deviceFormats = WAVE_FORMAT_1M08 | WAVE_FORMAT_2M08 | WAVE_FORMAT_4M08 | WAVE_FORMAT_96M08; if ( format == RTAUDIO_SINT8 && inCaps.dwFormats & deviceFormats ) { waveFormat.wBitsPerSample = 8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } else { // assume 16-bit is supported waveFormat.wBitsPerSample = 16; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } } stream_.userFormat = format; // Update wave format structure and buffer information. waveFormat.nBlockAlign = waveFormat.nChannels * waveFormat.wBitsPerSample / 8; waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; dsPointerLeadTime = nBuffers * (*bufferSize) * (waveFormat.wBitsPerSample / 8) * channels; // If the user wants an even bigger buffer, increase the device buffer size accordingly. while ( dsPointerLeadTime * 2U > (DWORD) bufferBytes ) bufferBytes *= 2; // Setup the secondary DS buffer description. dsBufferSize = bufferBytes; DSCBUFFERDESC bufferDescription; ZeroMemory( &bufferDescription, sizeof( DSCBUFFERDESC ) ); bufferDescription.dwSize = sizeof( DSCBUFFERDESC ); bufferDescription.dwFlags = 0; bufferDescription.dwReserved = 0; bufferDescription.dwBufferBytes = bufferBytes; bufferDescription.lpwfxFormat = &waveFormat; // Create the capture buffer. LPDIRECTSOUNDCAPTUREBUFFER buffer; result = input->CreateCaptureBuffer( &bufferDescription, &buffer, NULL ); if ( FAILED( result ) ) { input->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") creating input buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Get the buffer size ... might be different from what we specified. DSCBCAPS dscbcaps; dscbcaps.dwSize = sizeof( DSCBCAPS ); result = buffer->GetCaps( &dscbcaps ); if ( FAILED( result ) ) { input->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") getting buffer settings (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } bufferBytes = dscbcaps.dwBufferBytes; // Lock the capture buffer LPVOID audioPtr; DWORD dataLen; result = buffer->Lock( 0, bufferBytes, &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { input->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") locking input buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } // Zero the buffer ZeroMemory( audioPtr, dataLen ); // Unlock the buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { input->Release(); buffer->Release(); errorStream_ << "RtApiDs::probeDeviceOpen: error (" << getErrorString( result ) << ") unlocking input buffer (" << dsinfo.name << ")!"; errorText_ = errorStream_.str(); return FAILURE; } dsBufferSize = bufferBytes; ohandle = (void *) input; bhandle = (void *) buffer; } // Set various stream parameters DsHandle *handle = 0; stream_.nDeviceChannels[mode] = channels + firstChannel; stream_.nUserChannels[mode] = channels; stream_.bufferSize = *bufferSize; stream_.channelOffset[mode] = firstChannel; stream_.deviceInterleaved[mode] = true; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; // Set flag for buffer conversion stream_.doConvertBuffer[mode] = false; if (stream_.nUserChannels[mode] != stream_.nDeviceChannels[mode]) stream_.doConvertBuffer[mode] = true; if (stream_.userFormat != stream_.deviceFormat[mode]) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= (long) bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } // Allocate our DsHandle structures for the stream. if ( stream_.apiHandle == 0 ) { try { handle = new DsHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiDs::probeDeviceOpen: error allocating AsioHandle memory."; goto error; } // Create a manual-reset event. handle->condition = CreateEvent( NULL, // no security TRUE, // manual-reset FALSE, // non-signaled initially NULL ); // unnamed stream_.apiHandle = (void *) handle; } else handle = (DsHandle *) stream_.apiHandle; handle->id[mode] = ohandle; handle->buffer[mode] = bhandle; handle->dsBufferSize[mode] = dsBufferSize; handle->dsPointerLeadTime[mode] = dsPointerLeadTime; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT && mode == INPUT ) // We had already set up an output stream. stream_.mode = DUPLEX; else stream_.mode = mode; stream_.nBuffers = nBuffers; stream_.sampleRate = sampleRate; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup the callback thread. unsigned threadId; stream_.callbackInfo.object = (void *) this; stream_.callbackInfo.isRunning = true; stream_.callbackInfo.thread = _beginthreadex( NULL, 0, &callbackHandler, &stream_.callbackInfo, 0, &threadId ); if ( stream_.callbackInfo.thread == 0 ) { errorText_ = "RtApiDs::probeDeviceOpen: error creating callback thread!"; goto error; } // Boost DS thread priority SetThreadPriority( (HANDLE) stream_.callbackInfo.thread, THREAD_PRIORITY_HIGHEST ); return SUCCESS; error: if ( handle ) { if ( handle->buffer[0] ) { // the object pointer can be NULL and valid LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( buffer ) buffer->Release(); object->Release(); } if ( handle->buffer[1] ) { LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; if ( buffer ) buffer->Release(); object->Release(); } CloseHandle( handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiDs :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiDs::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } // Stop the callback thread. stream_.callbackInfo.isRunning = false; WaitForSingleObject( (HANDLE) stream_.callbackInfo.thread, INFINITE ); CloseHandle( (HANDLE) stream_.callbackInfo.thread ); DsHandle *handle = (DsHandle *) stream_.apiHandle; if ( handle ) { if ( handle->buffer[0] ) { // the object pointer can be NULL and valid LPDIRECTSOUND object = (LPDIRECTSOUND) handle->id[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( buffer ) { buffer->Stop(); buffer->Release(); } object->Release(); } if ( handle->buffer[1] ) { LPDIRECTSOUNDCAPTURE object = (LPDIRECTSOUNDCAPTURE) handle->id[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; if ( buffer ) { buffer->Stop(); buffer->Release(); } object->Release(); } CloseHandle( handle->condition ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiDs :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiDs::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } // Increase scheduler frequency on lesser windows (a side-effect of // increasing timer accuracy). On greater windows (Win2K or later), // this is already in effect. MUTEX_LOCK( &stream_.mutex ); DsHandle *handle = (DsHandle *) stream_.apiHandle; timeBeginPeriod( 1 ); /* memset( &statistics, 0, sizeof( statistics ) ); statistics.sampleRate = stream_.sampleRate; statistics.writeDeviceBufferLeadBytes = handle->dsPointerLeadTime[0]; */ buffersRolling = false; duplexPrerollBytes = 0; if ( stream_.mode == DUPLEX ) { // 0.5 seconds of silence in DUPLEX mode while the devices spin up and synchronize. duplexPrerollBytes = (int) ( 0.5 * stream_.sampleRate * formatBytes( stream_.deviceFormat[1] ) * stream_.nDeviceChannels[1] ); } HRESULT result = 0; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { //statistics.outputFrameSize = formatBytes( stream_.deviceFormat[0] ) * stream_.nDeviceChannels[0]; LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; result = buffer->Play( 0, 0, DSBPLAY_LOOPING ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting output buffer!"; errorText_ = errorStream_.str(); goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { //statistics.inputFrameSize = formatBytes( stream_.deviceFormat[1]) * stream_.nDeviceChannels[1]; LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; result = buffer->Start( DSCBSTART_LOOPING ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::startStream: error (" << getErrorString( result ) << ") starting input buffer!"; errorText_ = errorStream_.str(); goto unlock; } } handle->drainCounter = 0; handle->internalDrain = false; stream_.state = STREAM_RUNNING; unlock: MUTEX_UNLOCK( &stream_.mutex ); if ( FAILED( result ) ) error( RtError::SYSTEM_ERROR ); } void RtApiDs :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiDs::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } HRESULT result = 0; LPVOID audioPtr; DWORD dataLen; DsHandle *handle = (DsHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( handle->drainCounter == 0 ) { handle->drainCounter = 1; MUTEX_UNLOCK( &stream_.mutex ); WaitForMultipleObjects( 1, &handle->condition, FALSE, INFINITE ); // block until signaled ResetEvent( handle->condition ); MUTEX_LOCK( &stream_.mutex ); } // Stop the buffer and clear memory LPDIRECTSOUNDBUFFER buffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; result = buffer->Stop(); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") stopping output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock( 0, handle->dsBufferSize[0], &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") locking output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") unlocking output buffer!"; errorText_ = errorStream_.str(); goto unlock; } // If we start playing again, we must begin at beginning of buffer. handle->bufferPointer[0] = 0; } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { LPDIRECTSOUNDCAPTUREBUFFER buffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; audioPtr = NULL; dataLen = 0; result = buffer->Stop(); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") stopping input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Lock the buffer and clear it so that if we start to play again, // we won't have old data playing. result = buffer->Lock( 0, handle->dsBufferSize[1], &audioPtr, &dataLen, NULL, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") locking input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // Zero the DS buffer ZeroMemory( audioPtr, dataLen ); // Unlock the DS buffer result = buffer->Unlock( audioPtr, dataLen, NULL, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::stopStream: error (" << getErrorString( result ) << ") unlocking input buffer!"; errorText_ = errorStream_.str(); goto unlock; } // If we start recording again, we must begin at beginning of buffer. handle->bufferPointer[1] = 0; } unlock: timeEndPeriod( 1 ); // revert to normal scheduler frequency on lesser windows. stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( FAILED( result ) ) error( RtError::SYSTEM_ERROR ); } void RtApiDs :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiDs::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } DsHandle *handle = (DsHandle *) stream_.apiHandle; handle->drainCounter = 1; stopStream(); } void RtApiDs :: callbackEvent() { if ( stream_.state == STREAM_STOPPED ) { Sleep(50); // sleep 50 milliseconds return; } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiDs::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return; } CallbackInfo *info = (CallbackInfo *) &stream_.callbackInfo; DsHandle *handle = (DsHandle *) stream_.apiHandle; // Check if we were draining the stream and signal is finished. if ( handle->drainCounter > stream_.nBuffers + 2 ) { if ( handle->internalDrain == false ) SetEvent( handle->condition ); else stopStream(); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } // Invoke user callback to get fresh output data UNLESS we are // draining stream. if ( handle->drainCounter == 0 ) { RtAudioCallback callback = (RtAudioCallback) info->callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } handle->drainCounter = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, info->userData ); if ( handle->drainCounter == 2 ) { MUTEX_UNLOCK( &stream_.mutex ); abortStream(); return; } else if ( handle->drainCounter == 1 ) handle->internalDrain = true; } HRESULT result; DWORD currentWritePos, safeWritePos; DWORD currentReadPos, safeReadPos; DWORD leadPos; UINT nextWritePos; #ifdef GENERATE_DEBUG_LOG DWORD writeTime, readTime; #endif LPVOID buffer1 = NULL; LPVOID buffer2 = NULL; DWORD bufferSize1 = 0; DWORD bufferSize2 = 0; char *buffer; long bufferBytes; if ( stream_.mode == DUPLEX && !buffersRolling ) { //assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); // It takes a while for the devices to get rolling. As a result, // there's no guarantee that the capture and write device pointers // will move in lockstep. Wait here for both devices to start // rolling, and then set our buffer pointers accordingly. // e.g. Crystal Drivers: the capture buffer starts up 5700 to 9600 // bytes later than the write buffer. // Stub: a serious risk of having a pre-emptive scheduling round // take place between the two GetCurrentPosition calls... but I'm // really not sure how to solve the problem. Temporarily boost to // Realtime priority, maybe; but I'm not sure what priority the // DirectSound service threads run at. We *should* be roughly // within a ms or so of correct. LPDIRECTSOUNDBUFFER dsWriteBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; LPDIRECTSOUNDCAPTUREBUFFER dsCaptureBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; DWORD initialWritePos, initialSafeWritePos; DWORD initialReadPos, initialSafeReadPos; result = dsWriteBuffer->GetCurrentPosition( &initialWritePos, &initialSafeWritePos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } result = dsCaptureBuffer->GetCurrentPosition( &initialReadPos, &initialSafeReadPos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } while ( true ) { result = dsWriteBuffer->GetCurrentPosition( ¤tWritePos, &safeWritePos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } result = dsCaptureBuffer->GetCurrentPosition( ¤tReadPos, &safeReadPos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } if ( safeWritePos != initialSafeWritePos && safeReadPos != initialSafeReadPos ) break; Sleep( 1 ); } //assert( handle->dsBufferSize[0] == handle->dsBufferSize[1] ); buffersRolling = true; handle->bufferPointer[0] = ( safeWritePos + handle->dsPointerLeadTime[0] ); handle->bufferPointer[1] = safeReadPos; } if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { LPDIRECTSOUNDBUFFER dsBuffer = (LPDIRECTSOUNDBUFFER) handle->buffer[0]; if ( handle->drainCounter > 1 ) { // write zeros to the output stream bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; bufferBytes *= formatBytes( stream_.userFormat ); memset( stream_.userBuffer[0], 0, bufferBytes ); } // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[0]; bufferBytes *= formatBytes( stream_.deviceFormat[0] ); } else { buffer = stream_.userBuffer[0]; bufferBytes = stream_.bufferSize * stream_.nUserChannels[0]; bufferBytes *= formatBytes( stream_.userFormat ); } // No byte swapping necessary in DirectSound implementation. // Ahhh ... windoze. 16-bit data is signed but 8-bit data is // unsigned. So, we need to convert our signed 8-bit data here to // unsigned. if ( stream_.deviceFormat[0] == RTAUDIO_SINT8 ) for ( int i=0; idsBufferSize[0]; nextWritePos = handle->bufferPointer[0]; DWORD endWrite; while ( true ) { // Find out where the read and "safe write" pointers are. result = dsBuffer->GetCurrentPosition( ¤tWritePos, &safeWritePos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current write position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } leadPos = safeWritePos + handle->dsPointerLeadTime[0]; if ( leadPos > dsBufferSize ) leadPos -= dsBufferSize; if ( leadPos < nextWritePos ) leadPos += dsBufferSize; // unwrap offset endWrite = nextWritePos + bufferBytes; // Check whether the entire write region is behind the play pointer. if ( leadPos >= endWrite ) break; // If we are here, then we must wait until the play pointer gets // beyond the write region. The approach here is to use the // Sleep() function to suspend operation until safePos catches // up. Calculate number of milliseconds to wait as: // time = distance * (milliseconds/second) * fudgefactor / // ((bytes/sample) * (samples/second)) // A "fudgefactor" less than 1 is used because it was found // that sleeping too long was MUCH worse than sleeping for // several shorter periods. double millis = ( endWrite - leadPos ) * 900.0; millis /= ( formatBytes( stream_.deviceFormat[0]) * stream_.nDeviceChannels[0] * stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; if ( millis > 50.0 ) { static int nOverruns = 0; ++nOverruns; } Sleep( (DWORD) millis ); } //if ( statistics.writeDeviceSafeLeadBytes < dsPointerDifference( safeWritePos, currentWritePos, handle->dsBufferSize[0] ) ) { // statistics.writeDeviceSafeLeadBytes = dsPointerDifference( safeWritePos, currentWritePos, handle->dsBufferSize[0] ); //} if ( dsPointerBetween( nextWritePos, safeWritePos, currentWritePos, dsBufferSize ) || dsPointerBetween( endWrite, safeWritePos, currentWritePos, dsBufferSize ) ) { // We've strayed into the forbidden zone ... resync the read pointer. //++statistics.numberOfWriteUnderruns; handle->xrun[0] = true; nextWritePos = safeWritePos + handle->dsPointerLeadTime[0] - bufferBytes + dsBufferSize; while ( nextWritePos >= dsBufferSize ) nextWritePos -= dsBufferSize; handle->bufferPointer[0] = nextWritePos; endWrite = nextWritePos + bufferBytes; } // Lock free space in the buffer result = dsBuffer->Lock( nextWritePos, bufferBytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking buffer during playback!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } // Copy our buffer into the DS buffer CopyMemory( buffer1, buffer, bufferSize1 ); if ( buffer2 != NULL ) CopyMemory( buffer2, buffer+bufferSize1, bufferSize2 ); // Update our buffer offset and unlock sound buffer dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking buffer during playback!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } nextWritePos = ( nextWritePos + bufferSize1 + bufferSize2 ) % dsBufferSize; handle->bufferPointer[0] = nextWritePos; if ( handle->drainCounter ) { handle->drainCounter++; goto unlock; } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; bufferBytes = stream_.bufferSize * stream_.nDeviceChannels[1]; bufferBytes *= formatBytes( stream_.deviceFormat[1] ); } else { buffer = stream_.userBuffer[1]; bufferBytes = stream_.bufferSize * stream_.nUserChannels[1]; bufferBytes *= formatBytes( stream_.userFormat ); } LPDIRECTSOUNDCAPTUREBUFFER dsBuffer = (LPDIRECTSOUNDCAPTUREBUFFER) handle->buffer[1]; long nextReadPos = handle->bufferPointer[1]; DWORD dsBufferSize = handle->dsBufferSize[1]; // Find out where the write and "safe read" pointers are. result = dsBuffer->GetCurrentPosition( ¤tReadPos, &safeReadPos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } if ( safeReadPos < (DWORD)nextReadPos ) safeReadPos += dsBufferSize; // unwrap offset DWORD endRead = nextReadPos + bufferBytes; // Handling depends on whether we are INPUT or DUPLEX. // If we're in INPUT mode then waiting is a good thing. If we're in DUPLEX mode, // then a wait here will drag the write pointers into the forbidden zone. // // In DUPLEX mode, rather than wait, we will back off the read pointer until // it's in a safe position. This causes dropouts, but it seems to be the only // practical way to sync up the read and write pointers reliably, given the // the very complex relationship between phase and increment of the read and write // pointers. // // In order to minimize audible dropouts in DUPLEX mode, we will // provide a pre-roll period of 0.5 seconds in which we return // zeros from the read buffer while the pointers sync up. if ( stream_.mode == DUPLEX ) { if ( safeReadPos < endRead ) { if ( duplexPrerollBytes <= 0 ) { // Pre-roll time over. Be more agressive. int adjustment = endRead-safeReadPos; handle->xrun[1] = true; //++statistics.numberOfReadOverruns; // Two cases: // - large adjustments: we've probably run out of CPU cycles, so just resync exactly, // and perform fine adjustments later. // - small adjustments: back off by twice as much. if ( adjustment >= 2*bufferBytes ) nextReadPos = safeReadPos-2*bufferBytes; else nextReadPos = safeReadPos-bufferBytes-adjustment; //statistics.readDeviceSafeLeadBytes = currentReadPos-nextReadPos; //if ( statistics.readDeviceSafeLeadBytes < 0) statistics.readDeviceSafeLeadBytes += dsBufferSize; if ( nextReadPos < 0 ) nextReadPos += dsBufferSize; } else { // In pre=roll time. Just do it. nextReadPos = safeReadPos-bufferBytes; while ( nextReadPos < 0 ) nextReadPos += dsBufferSize; } endRead = nextReadPos + bufferBytes; } } else { // mode == INPUT while ( safeReadPos < endRead ) { // See comments for playback. double millis = (endRead - safeReadPos) * 900.0; millis /= ( formatBytes(stream_.deviceFormat[1]) * stream_.nDeviceChannels[1] * stream_.sampleRate); if ( millis < 1.0 ) millis = 1.0; Sleep( (DWORD) millis ); // Wake up, find out where we are now result = dsBuffer->GetCurrentPosition( ¤tReadPos, &safeReadPos ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") getting current read position!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } if ( safeReadPos < (DWORD)nextReadPos ) safeReadPos += dsBufferSize; // unwrap offset } } //if (statistics.readDeviceSafeLeadBytes < dsPointerDifference( currentReadPos, nextReadPos, dsBufferSize ) ) // statistics.readDeviceSafeLeadBytes = dsPointerDifference( currentReadPos, nextReadPos, dsBufferSize ); // Lock free space in the buffer result = dsBuffer->Lock( nextReadPos, bufferBytes, &buffer1, &bufferSize1, &buffer2, &bufferSize2, 0 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") locking capture buffer!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } if ( duplexPrerollBytes <= 0 ) { // Copy our buffer into the DS buffer CopyMemory( buffer, buffer1, bufferSize1 ); if ( buffer2 != NULL ) CopyMemory( buffer+bufferSize1, buffer2, bufferSize2 ); } else { memset( buffer, 0, bufferSize1 ); if ( buffer2 != NULL ) memset( buffer + bufferSize1, 0, bufferSize2 ); duplexPrerollBytes -= bufferSize1 + bufferSize2; } // Update our buffer offset and unlock sound buffer nextReadPos = ( nextReadPos + bufferSize1 + bufferSize2 ) % dsBufferSize; dsBuffer->Unlock( buffer1, bufferSize1, buffer2, bufferSize2 ); if ( FAILED( result ) ) { errorStream_ << "RtApiDs::callbackEvent: error (" << getErrorString( result ) << ") unlocking capture buffer!"; errorText_ = errorStream_.str(); error( RtError::SYSTEM_ERROR ); } handle->bufferPointer[1] = nextReadPos; // No byte swapping necessary in DirectSound implementation. // If necessary, convert 8-bit data from unsigned to signed. if ( stream_.deviceFormat[1] == RTAUDIO_SINT8 ) for ( int j=0; jobject; bool* isRunning = &info->isRunning; while ( *isRunning == true ) { object->callbackEvent(); } _endthreadex( 0 ); return 0; } #include "tchar.h" std::string convertTChar( LPCTSTR name ) { std::string s; #if defined( UNICODE ) || defined( _UNICODE ) // Yes, this conversion doesn't make sense for two-byte characters // but RtAudio is currently written to return an std::string of // one-byte chars for the device name. for ( unsigned int i=0; iisInput == true ) { DSCCAPS caps; LPDIRECTSOUNDCAPTURE object; hr = DirectSoundCaptureCreate( lpguid, &object, NULL ); if ( hr != DS_OK ) return TRUE; caps.dwSize = sizeof(caps); hr = object->GetCaps( &caps ); if ( hr == DS_OK ) { if ( caps.dwChannels > 0 && caps.dwFormats > 0 ) info->counter++; } object->Release(); } else { DSCAPS caps; LPDIRECTSOUND object; hr = DirectSoundCreate( lpguid, &object, NULL ); if ( hr != DS_OK ) return TRUE; caps.dwSize = sizeof(caps); hr = object->GetCaps( &caps ); if ( hr == DS_OK ) { if ( caps.dwFlags & DSCAPS_PRIMARYMONO || caps.dwFlags & DSCAPS_PRIMARYSTEREO ) info->counter++; } object->Release(); } if ( info->getDefault && lpguid == NULL ) return FALSE; if ( info->findIndex && info->counter > info->index ) { info->id = lpguid; info->name = convertTChar( description ); return FALSE; } return TRUE; } static char* getErrorString( int code ) { switch ( code ) { case DSERR_ALLOCATED: return "Already allocated"; case DSERR_CONTROLUNAVAIL: return "Control unavailable"; case DSERR_INVALIDPARAM: return "Invalid parameter"; case DSERR_INVALIDCALL: return "Invalid call"; case DSERR_GENERIC: return "Generic error"; case DSERR_PRIOLEVELNEEDED: return "Priority level needed"; case DSERR_OUTOFMEMORY: return "Out of memory"; case DSERR_BADFORMAT: return "The sample rate or the channel format is not supported"; case DSERR_UNSUPPORTED: return "Not supported"; case DSERR_NODRIVER: return "No driver"; case DSERR_ALREADYINITIALIZED: return "Already initialized"; case DSERR_NOAGGREGATION: return "No aggregation"; case DSERR_BUFFERLOST: return "Buffer lost"; case DSERR_OTHERAPPHASPRIO: return "Another application already has priority"; case DSERR_UNINITIALIZED: return "Uninitialized"; default: return "DirectSound unknown error"; } } //******************** End of __WINDOWS_DS__ *********************// #endif #if defined(__LINUX_ALSA__) #include #include // A structure to hold various information related to the ALSA API // implementation. struct AlsaHandle { snd_pcm_t *handles[2]; bool synchronized; bool xrun[2]; pthread_cond_t runnable; AlsaHandle() :synchronized(false) { xrun[0] = false; xrun[1] = false; } }; extern "C" void *alsaCallbackHandler( void * ptr ); RtApiAlsa :: RtApiAlsa() { // Nothing to do here. } RtApiAlsa :: ~RtApiAlsa() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiAlsa :: getDeviceCount( void ) { unsigned nDevices = 0; int result, subdevice, card; char name[64]; snd_ctl_t *handle; // Count cards and devices card = -1; snd_card_next( &card ); while ( card >= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &handle, name, 0 ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceCount: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto nextcard; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( handle, &subdevice ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceCount: control next device, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); break; } if ( subdevice < 0 ) break; nDevices++; } nextcard: snd_ctl_close( handle ); snd_card_next( &card ); } return nDevices; } RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; unsigned nDevices = 0; int result, subdevice, card; char name[64]; snd_ctl_t *chandle; // Count cards and devices card = -1; snd_card_next( &card ); while ( card >= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto nextcard; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( chandle, &subdevice ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: control next device, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); break; } if ( subdevice < 0 ) break; if ( nDevices == device ) { sprintf( name, "hw:%d,%d", card, subdevice ); goto foundDevice; } nDevices++; } nextcard: snd_ctl_close( chandle ); snd_card_next( &card ); } if ( nDevices == 0 ) { errorText_ = "RtApiAlsa::getDeviceInfo: no devices found!"; error( RtError::INVALID_USE ); } if ( device >= nDevices ) { errorText_ = "RtApiAlsa::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } foundDevice: // If a stream is already open, we cannot probe the stream devices. // Thus, use the saved results. if ( stream_.state != STREAM_CLOSED && ( stream_.device[0] == device || stream_.device[1] == device ) ) { if ( device >= devices_.size() ) { errorText_ = "RtApiAlsa::getDeviceInfo: device ID was not present before stream was opened."; error( RtError::WARNING ); return info; } return devices_[ device ]; } int openMode = SND_PCM_ASYNC; snd_pcm_stream_t stream; snd_pcm_info_t *pcminfo; snd_pcm_info_alloca( &pcminfo ); snd_pcm_t *phandle; snd_pcm_hw_params_t *params; snd_pcm_hw_params_alloca( ¶ms ); // First try for playback stream = SND_PCM_STREAM_PLAYBACK; snd_pcm_info_set_device( pcminfo, subdevice ); snd_pcm_info_set_subdevice( pcminfo, 0 ); snd_pcm_info_set_stream( pcminfo, stream ); result = snd_ctl_pcm_info( chandle, pcminfo ); if ( result < 0 ) { // Device probably doesn't support playback. goto captureProbe; } result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto captureProbe; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto captureProbe; } // Get output channel information. unsigned int value; result = snd_pcm_hw_params_get_channels_max( params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") output channels, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); goto captureProbe; } info.outputChannels = value; snd_pcm_close( phandle ); captureProbe: // Now try for capture stream = SND_PCM_STREAM_CAPTURE; snd_pcm_info_set_stream( pcminfo, stream ); result = snd_ctl_pcm_info( chandle, pcminfo ); snd_ctl_close( chandle ); if ( result < 0 ) { // Device probably doesn't support capture. if ( info.outputChannels == 0 ) return info; goto probeParameters; } result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } result = snd_pcm_hw_params_get_channels_max( params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: error getting device (" << name << ") input channels, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); if ( info.outputChannels == 0 ) return info; goto probeParameters; } info.inputChannels = value; snd_pcm_close( phandle ); // If device opens for both playback and capture, we determine the channels. if ( info.outputChannels > 0 && info.inputChannels > 0 ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; // ALSA doesn't provide default devices so we'll use the first available one. if ( device == 0 && info.outputChannels > 0 ) info.isDefaultOutput = true; if ( device == 0 && info.inputChannels > 0 ) info.isDefaultInput = true; probeParameters: // At this point, we just need to figure out the supported data // formats and sample rates. We'll proceed by opening the device in // the direction with the maximum number of channels, or playback if // they are equal. This might limit our sample rate options, but so // be it. if ( info.outputChannels >= info.inputChannels ) stream = SND_PCM_STREAM_PLAYBACK; else stream = SND_PCM_STREAM_CAPTURE; snd_pcm_info_set_stream( pcminfo, stream ); result = snd_pcm_open( &phandle, name, stream, openMode | SND_PCM_NONBLOCK); if ( result < 0 ) { errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // The device is open ... fill the parameter structure. result = snd_pcm_hw_params_any( phandle, params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::getDeviceInfo: snd_pcm_hw_params error for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Test our discrete set of sample rate values. info.sampleRates.clear(); for ( unsigned int i=0; i= 0 ) sprintf( name, "hw:%s,%d", cardname, subdevice ); info.name = name; // That's all ... close the device and return snd_pcm_close( phandle ); info.probed = true; return info; } void RtApiAlsa :: saveDeviceInfo( void ) { devices_.clear(); unsigned int nDevices = getDeviceCount(); devices_.resize( nDevices ); for ( unsigned int i=0; i= 0 ) { sprintf( name, "hw:%d", card ); result = snd_ctl_open( &chandle, name, SND_CTL_NONBLOCK ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::probeDeviceOpen: control open, card = " << card << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } subdevice = -1; while( 1 ) { result = snd_ctl_pcm_next_device( chandle, &subdevice ); if ( result < 0 ) break; if ( subdevice < 0 ) break; if ( nDevices == device ) { sprintf( name, "hw:%d,%d", card, subdevice ); snd_ctl_close( chandle ); goto foundDevice; } nDevices++; } snd_ctl_close( chandle ); snd_card_next( &card ); } if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiAlsa::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiAlsa::probeDeviceOpen: device ID is invalid!"; return FAILURE; } foundDevice: // The getDeviceInfo() function will not work for a device that is // already open. Thus, we'll probe the system before opening a // stream and save the results for use by getDeviceInfo(). if ( mode == OUTPUT || ( mode == INPUT && stream_.mode != OUTPUT ) ) // only do once this->saveDeviceInfo(); snd_pcm_stream_t stream; if ( mode == OUTPUT ) stream = SND_PCM_STREAM_PLAYBACK; else stream = SND_PCM_STREAM_CAPTURE; snd_pcm_t *phandle; int openMode = SND_PCM_ASYNC; result = snd_pcm_open( &phandle, name, stream, openMode ); if ( result < 0 ) { if ( mode == OUTPUT ) errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for output."; else errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device (" << name << ") won't open for input."; errorText_ = errorStream_.str(); return FAILURE; } // Fill the parameter structure. snd_pcm_hw_params_t *hw_params; snd_pcm_hw_params_alloca( &hw_params ); result = snd_pcm_hw_params_any( phandle, hw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") parameters, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf( stderr, "\nRtApiAlsa: dump hardware params just after device open:\n\n" ); snd_pcm_hw_params_dump( hw_params, out ); #endif // Set access ... check user preference. if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) { stream_.userInterleaved = false; result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); if ( result < 0 ) { result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); stream_.deviceInterleaved[mode] = true; } else stream_.deviceInterleaved[mode] = false; } else { stream_.userInterleaved = true; result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ); if ( result < 0 ) { result = snd_pcm_hw_params_set_access( phandle, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED ); stream_.deviceInterleaved[mode] = false; } else stream_.deviceInterleaved[mode] = true; } if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") access, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine how to set the device format. stream_.userFormat = format; snd_pcm_format_t deviceFormat = SND_PCM_FORMAT_UNKNOWN; if ( format == RTAUDIO_SINT8 ) deviceFormat = SND_PCM_FORMAT_S8; else if ( format == RTAUDIO_SINT16 ) deviceFormat = SND_PCM_FORMAT_S16; else if ( format == RTAUDIO_SINT24 ) deviceFormat = SND_PCM_FORMAT_S24; else if ( format == RTAUDIO_SINT32 ) deviceFormat = SND_PCM_FORMAT_S32; else if ( format == RTAUDIO_FLOAT32 ) deviceFormat = SND_PCM_FORMAT_FLOAT; else if ( format == RTAUDIO_FLOAT64 ) deviceFormat = SND_PCM_FORMAT_FLOAT64; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat) == 0) { stream_.deviceFormat[mode] = format; goto setFormat; } // The user requested format is not natively supported by the device. deviceFormat = SND_PCM_FORMAT_FLOAT64; if ( snd_pcm_hw_params_test_format( phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT64; goto setFormat; } deviceFormat = SND_PCM_FORMAT_FLOAT; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_FLOAT32; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S32; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT32; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S24; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT24; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S16; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT16; goto setFormat; } deviceFormat = SND_PCM_FORMAT_S8; if ( snd_pcm_hw_params_test_format(phandle, hw_params, deviceFormat ) == 0 ) { stream_.deviceFormat[mode] = RTAUDIO_SINT8; goto setFormat; } // If we get here, no supported format was found. errorStream_ << "RtApiAlsa::probeDeviceOpen: pcm device " << device << " data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; setFormat: result = snd_pcm_hw_params_set_format( phandle, hw_params, deviceFormat ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting pcm device (" << name << ") data format, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine whether byte-swaping is necessary. stream_.doByteSwap[mode] = false; if ( deviceFormat != SND_PCM_FORMAT_S8 ) { result = snd_pcm_format_cpu_endian( deviceFormat ); if ( result == 0 ) stream_.doByteSwap[mode] = true; else if (result < 0) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting pcm device (" << name << ") endian-ness, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } } // Set the sample rate. result = snd_pcm_hw_params_set_rate_near( phandle, hw_params, (unsigned int*) &sampleRate, 0 ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting sample rate on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Determine the number of channels for this device. We support a possible // minimum device channel number > than the value requested by the user. stream_.nUserChannels[mode] = channels; unsigned int value; result = snd_pcm_hw_params_get_channels_max( hw_params, &value ); unsigned int deviceChannels = value; if ( result < 0 || deviceChannels < channels + firstChannel ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: requested channel parameters not supported by device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } result = snd_pcm_hw_params_get_channels_min( hw_params, &value ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error getting minimum channels for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } deviceChannels = value; if ( deviceChannels < channels + firstChannel ) deviceChannels = channels + firstChannel; stream_.nDeviceChannels[mode] = deviceChannels; // Set the device channels. result = snd_pcm_hw_params_set_channels( phandle, hw_params, deviceChannels ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting channels for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // Set the buffer number, which in ALSA is referred to as the "period". int totalSize, dir = 0; unsigned int periods = 0; if ( options ) periods = options->numberOfBuffers; totalSize = *bufferSize * periods; // Set the buffer (or period) size. snd_pcm_uframes_t periodSize = *bufferSize; result = snd_pcm_hw_params_set_period_size_near( phandle, hw_params, &periodSize, &dir ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting period size for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } *bufferSize = periodSize; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) periods = 2; else periods = totalSize / *bufferSize; // Even though the hardware might allow 1 buffer, it won't work reliably. if ( periods < 2 ) periods = 2; result = snd_pcm_hw_params_set_periods_near( phandle, hw_params, &periods, &dir ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error setting periods for device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } // If attempting to setup a duplex stream, the bufferSize parameter // MUST be the same in both directions! if ( stream_.mode == OUTPUT && mode == INPUT && *bufferSize != stream_.bufferSize ) { errorStream_ << "RtApiAlsa::probeDeviceOpen: system error setting buffer size for duplex stream on device (" << name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.bufferSize = *bufferSize; // Install the hardware configuration result = snd_pcm_hw_params( phandle, hw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing hardware configuration on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump hardware params after installation:\n\n"); snd_pcm_hw_params_dump( hw_params, out ); #endif // Set the software configuration to fill buffers with zeros and prevent device stopping on xruns. snd_pcm_sw_params_t *sw_params = NULL; snd_pcm_sw_params_alloca( &sw_params ); snd_pcm_sw_params_current( phandle, sw_params ); snd_pcm_sw_params_set_start_threshold( phandle, sw_params, *bufferSize ); snd_pcm_sw_params_set_stop_threshold( phandle, sw_params, ULONG_MAX ); snd_pcm_sw_params_set_silence_threshold( phandle, sw_params, 0 ); // The following two settings were suggested by Theo Veenker //snd_pcm_sw_params_set_avail_min( phandle, sw_params, *bufferSize ); //snd_pcm_sw_params_set_xfer_align( phandle, sw_params, 1 ); // here are two options for a fix //snd_pcm_sw_params_set_silence_size( phandle, sw_params, ULONG_MAX ); snd_pcm_uframes_t val; snd_pcm_sw_params_get_boundary( sw_params, &val ); snd_pcm_sw_params_set_silence_size( phandle, sw_params, val ); result = snd_pcm_sw_params( phandle, sw_params ); if ( result < 0 ) { snd_pcm_close( phandle ); errorStream_ << "RtApiAlsa::probeDeviceOpen: error installing software configuration on device (" << name << "), " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); return FAILURE; } #if defined(__RTAUDIO_DEBUG__) fprintf(stderr, "\nRtApiAlsa: dump software params after installation:\n\n"); snd_pcm_sw_params_dump( sw_params, out ); #endif // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate the ApiHandle if necessary and then save. AlsaHandle *apiInfo = 0; if ( stream_.apiHandle == 0 ) { try { apiInfo = (AlsaHandle *) new AlsaHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating AlsaHandle memory."; goto error; } if ( pthread_cond_init( &apiInfo->runnable, NULL ) ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) apiInfo; apiInfo->handles[0] = 0; apiInfo->handles[1] = 0; } else { apiInfo = (AlsaHandle *) stream_.apiHandle; } apiInfo->handles[mode] = phandle; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiAlsa::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.sampleRate = sampleRate; stream_.nBuffers = periods; stream_.device[mode] = device; stream_.state = STREAM_STOPPED; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup thread if necessary. if ( stream_.mode == OUTPUT && mode == INPUT ) { // We had already set up an output stream. stream_.mode = DUPLEX; // Link the streams if possible. apiInfo->synchronized = false; if ( snd_pcm_link( apiInfo->handles[0], apiInfo->handles[1] ) == 0 ) apiInfo->synchronized = true; else { errorText_ = "RtApiAlsa::probeDeviceOpen: unable to synchronize input and output devices."; error( RtError::WARNING ); } } else { stream_.mode = mode; // Setup callback thread. stream_.callbackInfo.object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority (optional). The higher priority will only take affect // if the program is run as root or suid. Note, under Linux // processes with CAP_SYS_NICE privilege, a user can change // scheduling policy and priority (thus need not be root). See // POSIX "capabilities". pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); #ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { struct sched_param param; int priority = options->priority; int min = sched_get_priority_min( SCHED_RR ); int max = sched_get_priority_max( SCHED_RR ); if ( priority < min ) priority = min; else if ( priority > max ) priority = max; param.sched_priority = priority; pthread_attr_setschedparam( &attr, ¶m ); pthread_attr_setschedpolicy( &attr, SCHED_RR ); } else pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #else pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #endif stream_.callbackInfo.isRunning = true; result = pthread_create( &stream_.callbackInfo.thread, &attr, alsaCallbackHandler, &stream_.callbackInfo ); pthread_attr_destroy( &attr ); if ( result ) { stream_.callbackInfo.isRunning = false; errorText_ = "RtApiAlsa::error creating callback thread!"; goto error; } } return SUCCESS; error: if ( apiInfo ) { pthread_cond_destroy( &apiInfo->runnable ); if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); delete apiInfo; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiAlsa :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAlsa::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; stream_.callbackInfo.isRunning = false; MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) pthread_cond_signal( &apiInfo->runnable ); MUTEX_UNLOCK( &stream_.mutex ); pthread_join( stream_.callbackInfo.thread, NULL ); if ( stream_.state == STREAM_RUNNING ) { stream_.state = STREAM_STOPPED; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) snd_pcm_drop( apiInfo->handles[0] ); if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) snd_pcm_drop( apiInfo->handles[1] ); } if ( apiInfo ) { pthread_cond_destroy( &apiInfo->runnable ); if ( apiInfo->handles[0] ) snd_pcm_close( apiInfo->handles[0] ); if ( apiInfo->handles[1] ) snd_pcm_close( apiInfo->handles[1] ); delete apiInfo; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiAlsa :: startStream() { // This method calls snd_pcm_prepare if the device isn't already in that state. verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiAlsa::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); int result = 0; snd_pcm_state_t state; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { state = snd_pcm_state( handle[0] ); if ( state != SND_PCM_STATE_PREPARED ) { result = snd_pcm_prepare( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::startStream: error preparing output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { state = snd_pcm_state( handle[1] ); if ( state != SND_PCM_STATE_PREPARED ) { result = snd_pcm_prepare( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::startStream: error preparing input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } } stream_.state = STREAM_RUNNING; unlock: MUTEX_UNLOCK( &stream_.mutex ); pthread_cond_signal( &apiInfo->runnable ); if ( result >= 0 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAlsa :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAlsa::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } int result = 0; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { if ( apiInfo->synchronized ) result = snd_pcm_drop( handle[0] ); else result = snd_pcm_drain( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::stopStream: error draining output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { result = snd_pcm_drop( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::stopStream: error stopping input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } unlock: stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( result >= 0 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAlsa :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiAlsa::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } int result = 0; AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; snd_pcm_t **handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = snd_pcm_drop( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::abortStream: error aborting output pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } if ( ( stream_.mode == INPUT || stream_.mode == DUPLEX ) && !apiInfo->synchronized ) { result = snd_pcm_drop( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::abortStream: error aborting input pcm device, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); goto unlock; } } unlock: stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( result >= 0 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiAlsa :: callbackEvent() { AlsaHandle *apiInfo = (AlsaHandle *) stream_.apiHandle; if ( stream_.state == STREAM_STOPPED ) { MUTEX_LOCK( &stream_.mutex ); pthread_cond_wait( &apiInfo->runnable, &stream_.mutex ); if ( stream_.state != STREAM_RUNNING ) { MUTEX_UNLOCK( &stream_.mutex ); return; } MUTEX_UNLOCK( &stream_.mutex ); } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiAlsa::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return; } int doStopStream = 0; RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && apiInfo->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; apiInfo->xrun[0] = false; } if ( stream_.mode != OUTPUT && apiInfo->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; apiInfo->xrun[1] = false; } doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); if ( doStopStream == 2 ) { abortStream(); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) goto unlock; int result; char *buffer; int channels; snd_pcm_t **handle; snd_pcm_sframes_t frames; RtAudioFormat format; handle = (snd_pcm_t **) apiInfo->handles; if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; channels = stream_.nDeviceChannels[1]; format = stream_.deviceFormat[1]; } else { buffer = stream_.userBuffer[1]; channels = stream_.nUserChannels[1]; format = stream_.userFormat; } // Read samples from device in interleaved/non-interleaved format. if ( stream_.deviceInterleaved[1] ) result = snd_pcm_readi( handle[1], buffer, stream_.bufferSize ); else { void *bufs[channels]; size_t offset = stream_.bufferSize * formatBytes( format ); for ( int i=0; ixrun[1] = true; result = snd_pcm_prepare( handle[1] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after overrun, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: audio read error, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } error( RtError::WARNING ); goto tryOutput; } // Do byte swapping if necessary. if ( stream_.doByteSwap[1] ) byteSwapBuffer( buffer, stream_.bufferSize * channels, format ); // Do buffer conversion if necessary. if ( stream_.doConvertBuffer[1] ) convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); // Check stream latency result = snd_pcm_delay( handle[1], &frames ); if ( result == 0 && frames > 0 ) stream_.latency[1] = frames; } tryOutput: if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); channels = stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; channels = stream_.nUserChannels[0]; format = stream_.userFormat; } // Do byte swapping if necessary. if ( stream_.doByteSwap[0] ) byteSwapBuffer(buffer, stream_.bufferSize * channels, format); // Write samples to device in interleaved/non-interleaved format. if ( stream_.deviceInterleaved[0] ) result = snd_pcm_writei( handle[0], buffer, stream_.bufferSize ); else { void *bufs[channels]; size_t offset = stream_.bufferSize * formatBytes( format ); for ( int i=0; ixrun[0] = true; result = snd_pcm_prepare( handle[0] ); if ( result < 0 ) { errorStream_ << "RtApiAlsa::callbackEvent: error preparing device after underrun, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: error, current state is " << snd_pcm_state_name( state ) << ", " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } } else { errorStream_ << "RtApiAlsa::callbackEvent: audio write error, " << snd_strerror( result ) << "."; errorText_ = errorStream_.str(); } error( RtError::WARNING ); goto unlock; } // Check stream latency result = snd_pcm_delay( handle[0], &frames ); if ( result == 0 && frames > 0 ) stream_.latency[0] = frames; } unlock: MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); if ( doStopStream == 1 ) this->stopStream(); } extern "C" void *alsaCallbackHandler( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiAlsa *object = (RtApiAlsa *) info->object; bool *isRunning = &info->isRunning; while ( *isRunning == true ) { pthread_testcancel(); object->callbackEvent(); } pthread_exit( NULL ); } //******************** End of __LINUX_ALSA__ *********************// #endif #if defined(__LINUX_OSS__) #include #include #include #include #include "soundcard.h" #include #include extern "C" void *ossCallbackHandler(void * ptr); // A structure to hold various information related to the OSS API // implementation. struct OssHandle { int id[2]; // device ids bool xrun[2]; bool triggered; pthread_cond_t runnable; OssHandle() :triggered(false) { id[0] = 0; id[1] = 0; xrun[0] = false; xrun[1] = false; } }; RtApiOss :: RtApiOss() { // Nothing to do here. } RtApiOss :: ~RtApiOss() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } unsigned int RtApiOss :: getDeviceCount( void ) { int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::getDeviceCount: error opening '/dev/mixer'."; error( RtError::WARNING ); return 0; } oss_sysinfo sysinfo; if ( ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ) == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceCount: error getting sysinfo, OSS version >= 4.0 is required."; error( RtError::WARNING ); return 0; } close( mixerfd ); return sysinfo.numaudios; } RtAudio::DeviceInfo RtApiOss :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; info.probed = false; int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::getDeviceInfo: error opening '/dev/mixer'."; error( RtError::WARNING ); return info; } oss_sysinfo sysinfo; int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); if ( result == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: error getting sysinfo, OSS version >= 4.0 is required."; error( RtError::WARNING ); return info; } unsigned nDevices = sysinfo.numaudios; if ( nDevices == 0 ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: no devices found!"; error( RtError::INVALID_USE ); } if ( device >= nDevices ) { close( mixerfd ); errorText_ = "RtApiOss::getDeviceInfo: device ID is invalid!"; error( RtError::INVALID_USE ); } oss_audioinfo ainfo; ainfo.dev = device; result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); close( mixerfd ); if ( result == -1 ) { errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Probe channels if ( ainfo.caps & PCM_CAP_OUTPUT ) info.outputChannels = ainfo.max_channels; if ( ainfo.caps & PCM_CAP_INPUT ) info.inputChannels = ainfo.max_channels; if ( ainfo.caps & PCM_CAP_DUPLEX ) { if ( info.outputChannels > 0 && info.inputChannels > 0 && ainfo.caps & PCM_CAP_DUPLEX ) info.duplexChannels = (info.outputChannels > info.inputChannels) ? info.inputChannels : info.outputChannels; } // Probe data formats ... do for input unsigned long mask = ainfo.iformats; if ( mask & AFMT_S16_LE || mask & AFMT_S16_BE ) info.nativeFormats |= RTAUDIO_SINT16; if ( mask & AFMT_S8 ) info.nativeFormats |= RTAUDIO_SINT8; if ( mask & AFMT_S32_LE || mask & AFMT_S32_BE ) info.nativeFormats |= RTAUDIO_SINT32; if ( mask & AFMT_FLOAT ) info.nativeFormats |= RTAUDIO_FLOAT32; if ( mask & AFMT_S24_LE || mask & AFMT_S24_BE ) info.nativeFormats |= RTAUDIO_SINT24; // Check that we have at least one supported format if ( info.nativeFormats == 0 ) { errorStream_ << "RtApiOss::getDeviceInfo: device (" << ainfo.name << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); error( RtError::WARNING ); return info; } // Probe the supported sample rates. info.sampleRates.clear(); if ( ainfo.nrates ) { for ( unsigned int i=0; i= (int) SAMPLE_RATES[k] ) info.sampleRates.push_back( SAMPLE_RATES[k] ); } } if ( info.sampleRates.size() == 0 ) { errorStream_ << "RtApiOss::getDeviceInfo: no supported sample rates found for device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); error( RtError::WARNING ); } else { info.probed = true; info.name = ainfo.name; } return info; } bool RtApiOss :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { int mixerfd = open( "/dev/mixer", O_RDWR, 0 ); if ( mixerfd == -1 ) { errorText_ = "RtApiOss::probeDeviceOpen: error opening '/dev/mixer'."; return FAILURE; } oss_sysinfo sysinfo; int result = ioctl( mixerfd, SNDCTL_SYSINFO, &sysinfo ); if ( result == -1 ) { close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: error getting sysinfo, OSS version >= 4.0 is required."; return FAILURE; } unsigned nDevices = sysinfo.numaudios; if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: no devices found!"; return FAILURE; } if ( device >= nDevices ) { // This should not happen because a check is made before this function is called. close( mixerfd ); errorText_ = "RtApiOss::probeDeviceOpen: device ID is invalid!"; return FAILURE; } oss_audioinfo ainfo; ainfo.dev = device; result = ioctl( mixerfd, SNDCTL_AUDIOINFO, &ainfo ); close( mixerfd ); if ( result == -1 ) { errorStream_ << "RtApiOss::getDeviceInfo: error getting device (" << ainfo.name << ") info."; errorText_ = errorStream_.str(); return FAILURE; } // Check if device supports input or output if ( ( mode == OUTPUT && !( ainfo.caps & PCM_CAP_OUTPUT ) ) || ( mode == INPUT && !( ainfo.caps & PCM_CAP_INPUT ) ) ) { if ( mode == OUTPUT ) errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support output."; else errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support input."; errorText_ = errorStream_.str(); return FAILURE; } int flags = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( mode == OUTPUT ) flags |= O_WRONLY; else { // mode == INPUT if (stream_.mode == OUTPUT && stream_.device[0] == device) { // We just set the same device for playback ... close and reopen for duplex (OSS only). close( handle->id[0] ); handle->id[0] = 0; if ( !( ainfo.caps & PCM_CAP_DUPLEX ) ) { errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support duplex mode."; errorText_ = errorStream_.str(); return FAILURE; } // Check that the number previously set channels is the same. if ( stream_.nUserChannels[0] != channels ) { errorStream_ << "RtApiOss::probeDeviceOpen: input/output channels must be equal for OSS duplex device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } flags |= O_RDWR; } else flags |= O_RDONLY; } // Set exclusive access if specified. if ( options && options->flags & RTAUDIO_HOG_DEVICE ) flags |= O_EXCL; // Try to open the device. int fd; fd = open( ainfo.devnode, flags, 0 ); if ( fd == -1 ) { if ( errno == EBUSY ) errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") is busy."; else errorStream_ << "RtApiOss::probeDeviceOpen: error opening device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // For duplex operation, specifically set this mode (this doesn't seem to work). /* if ( flags | O_RDWR ) { result = ioctl( fd, SNDCTL_DSP_SETDUPLEX, NULL ); if ( result == -1) { errorStream_ << "RtApiOss::probeDeviceOpen: error setting duplex mode for device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } } */ // Check the device channel support. stream_.nUserChannels[mode] = channels; if ( ainfo.max_channels < (int)(channels + firstChannel) ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: the device (" << ainfo.name << ") does not support requested channel parameters."; errorText_ = errorStream_.str(); return FAILURE; } // Set the number of channels. int deviceChannels = channels + firstChannel; result = ioctl( fd, SNDCTL_DSP_CHANNELS, &deviceChannels ); if ( result == -1 || deviceChannels < (int)(channels + firstChannel) ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting channel parameters on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nDeviceChannels[mode] = deviceChannels; // Get the data format mask int mask; result = ioctl( fd, SNDCTL_DSP_GETFMTS, &mask ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error getting device (" << ainfo.name << ") data formats."; errorText_ = errorStream_.str(); return FAILURE; } // Determine how to set the device format. stream_.userFormat = format; int deviceFormat = -1; stream_.doByteSwap[mode] = false; if ( format == RTAUDIO_SINT8 ) { if ( mask & AFMT_S8 ) { deviceFormat = AFMT_S8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } } else if ( format == RTAUDIO_SINT16 ) { if ( mask & AFMT_S16_NE ) { deviceFormat = AFMT_S16_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else if ( mask & AFMT_S16_OE ) { deviceFormat = AFMT_S16_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } } else if ( format == RTAUDIO_SINT24 ) { if ( mask & AFMT_S24_NE ) { deviceFormat = AFMT_S24_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; } else if ( mask & AFMT_S24_OE ) { deviceFormat = AFMT_S24_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; stream_.doByteSwap[mode] = true; } } else if ( format == RTAUDIO_SINT32 ) { if ( mask & AFMT_S32_NE ) { deviceFormat = AFMT_S32_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; } else if ( mask & AFMT_S32_OE ) { deviceFormat = AFMT_S32_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } } if ( deviceFormat == -1 ) { // The user requested format is not natively supported by the device. if ( mask & AFMT_S16_NE ) { deviceFormat = AFMT_S16_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; } else if ( mask & AFMT_S32_NE ) { deviceFormat = AFMT_S32_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; } else if ( mask & AFMT_S24_NE ) { deviceFormat = AFMT_S24_NE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; } else if ( mask & AFMT_S16_OE ) { deviceFormat = AFMT_S16_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT16; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S32_OE ) { deviceFormat = AFMT_S32_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT32; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S24_OE ) { deviceFormat = AFMT_S24_OE; stream_.deviceFormat[mode] = RTAUDIO_SINT24; stream_.doByteSwap[mode] = true; } else if ( mask & AFMT_S8) { deviceFormat = AFMT_S8; stream_.deviceFormat[mode] = RTAUDIO_SINT8; } } if ( stream_.deviceFormat[mode] == 0 ) { // This really shouldn't happen ... close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") data format not supported by RtAudio."; errorText_ = errorStream_.str(); return FAILURE; } // Set the data format. int temp = deviceFormat; result = ioctl( fd, SNDCTL_DSP_SETFMT, &deviceFormat ); if ( result == -1 || deviceFormat != temp ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting data format on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Attempt to set the buffer size. According to OSS, the minimum // number of buffers is two. The supposed minimum buffer size is 16 // bytes, so that will be our lower bound. The argument to this // call is in the form 0xMMMMSSSS (hex), where the buffer size (in // bytes) is given as 2^SSSS and the number of buffers as 2^MMMM. // We'll check the actual value used near the end of the setup // procedure. int ossBufferBytes = *bufferSize * formatBytes( stream_.deviceFormat[mode] ) * deviceChannels; if ( ossBufferBytes < 16 ) ossBufferBytes = 16; int buffers = 0; if ( options ) buffers = options->numberOfBuffers; if ( options && options->flags & RTAUDIO_MINIMIZE_LATENCY ) buffers = 2; if ( buffers < 2 ) buffers = 3; temp = ((int) buffers << 16) + (int)( log10( (double)ossBufferBytes ) / log10( 2.0 ) ); result = ioctl( fd, SNDCTL_DSP_SETFRAGMENT, &temp ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting buffer size on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.nBuffers = buffers; // Save buffer size (in sample frames). *bufferSize = ossBufferBytes / ( formatBytes(stream_.deviceFormat[mode]) * deviceChannels ); stream_.bufferSize = *bufferSize; // Set the sample rate. int srate = sampleRate; result = ioctl( fd, SNDCTL_DSP_SPEED, &srate ); if ( result == -1 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: error setting sample rate (" << sampleRate << ") on device (" << ainfo.name << ")."; errorText_ = errorStream_.str(); return FAILURE; } // Verify the sample rate setup worked. if ( abs( srate - sampleRate ) > 100 ) { close( fd ); errorStream_ << "RtApiOss::probeDeviceOpen: device (" << ainfo.name << ") does not support sample rate (" << sampleRate << ")."; errorText_ = errorStream_.str(); return FAILURE; } stream_.sampleRate = sampleRate; if ( mode == INPUT && stream_.mode == OUTPUT && stream_.device[0] == device) { // We're doing duplex setup here. stream_.deviceFormat[0] = stream_.deviceFormat[1]; stream_.nDeviceChannels[0] = deviceChannels; } // Set interleaving parameters. stream_.userInterleaved = true; stream_.deviceInterleaved[mode] = true; if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; // Set flags for buffer conversion stream_.doConvertBuffer[mode] = false; if ( stream_.userFormat != stream_.deviceFormat[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] && stream_.nUserChannels[mode] > 1 ) stream_.doConvertBuffer[mode] = true; // Allocate the stream handles if necessary and then save. if ( stream_.apiHandle == 0 ) { try { handle = new OssHandle; } catch ( std::bad_alloc& ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating OssHandle memory."; goto error; } if ( pthread_cond_init( &handle->runnable, NULL ) ) { errorText_ = "RtApiOss::probeDeviceOpen: error initializing pthread condition variable."; goto error; } stream_.apiHandle = (void *) handle; } else { handle = (OssHandle *) stream_.apiHandle; } handle->id[mode] = fd; // Allocate necessary internal buffers. unsigned long bufferBytes; bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); stream_.userBuffer[mode] = (char *) calloc( bufferBytes, 1 ); if ( stream_.userBuffer[mode] == NULL ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating user buffer memory."; goto error; } if ( stream_.doConvertBuffer[mode] ) { bool makeBuffer = true; bufferBytes = stream_.nDeviceChannels[mode] * formatBytes( stream_.deviceFormat[mode] ); if ( mode == INPUT ) { if ( stream_.mode == OUTPUT && stream_.deviceBuffer ) { unsigned long bytesOut = stream_.nDeviceChannels[0] * formatBytes( stream_.deviceFormat[0] ); if ( bufferBytes <= bytesOut ) makeBuffer = false; } } if ( makeBuffer ) { bufferBytes *= *bufferSize; if ( stream_.deviceBuffer ) free( stream_.deviceBuffer ); stream_.deviceBuffer = (char *) calloc( bufferBytes, 1 ); if ( stream_.deviceBuffer == NULL ) { errorText_ = "RtApiOss::probeDeviceOpen: error allocating device buffer memory."; goto error; } } } stream_.device[mode] = device; stream_.state = STREAM_STOPPED; // Setup the buffer conversion information structure. if ( stream_.doConvertBuffer[mode] ) setConvertInfo( mode, firstChannel ); // Setup thread if necessary. if ( stream_.mode == OUTPUT && mode == INPUT ) { // We had already set up an output stream. stream_.mode = DUPLEX; if ( stream_.device[0] == device ) handle->id[0] = fd; } else { stream_.mode = mode; // Setup callback thread. stream_.callbackInfo.object = (void *) this; // Set the thread attributes for joinable and realtime scheduling // priority. The higher priority will only take affect if the // program is run as root or suid. pthread_attr_t attr; pthread_attr_init( &attr ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE ); #ifdef SCHED_RR // Undefined with some OSes (eg: NetBSD 1.6.x with GNU Pthread) if ( options && options->flags & RTAUDIO_SCHEDULE_REALTIME ) { struct sched_param param; int priority = options->priority; int min = sched_get_priority_min( SCHED_RR ); int max = sched_get_priority_max( SCHED_RR ); if ( priority < min ) priority = min; else if ( priority > max ) priority = max; param.sched_priority = priority; pthread_attr_setschedparam( &attr, ¶m ); pthread_attr_setschedpolicy( &attr, SCHED_RR ); } else pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #else pthread_attr_setschedpolicy( &attr, SCHED_OTHER ); #endif stream_.callbackInfo.isRunning = true; result = pthread_create( &stream_.callbackInfo.thread, &attr, ossCallbackHandler, &stream_.callbackInfo ); pthread_attr_destroy( &attr ); if ( result ) { stream_.callbackInfo.isRunning = false; errorText_ = "RtApiOss::error creating callback thread!"; goto error; } } return SUCCESS; error: if ( handle ) { pthread_cond_destroy( &handle->runnable ); if ( handle->id[0] ) close( handle->id[0] ); if ( handle->id[1] ) close( handle->id[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } return FAILURE; } void RtApiOss :: closeStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiOss::closeStream(): no open stream to close!"; error( RtError::WARNING ); return; } OssHandle *handle = (OssHandle *) stream_.apiHandle; stream_.callbackInfo.isRunning = false; MUTEX_LOCK( &stream_.mutex ); if ( stream_.state == STREAM_STOPPED ) pthread_cond_signal( &handle->runnable ); MUTEX_UNLOCK( &stream_.mutex ); pthread_join( stream_.callbackInfo.thread, NULL ); if ( stream_.state == STREAM_RUNNING ) { if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); else ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); stream_.state = STREAM_STOPPED; } if ( handle ) { pthread_cond_destroy( &handle->runnable ); if ( handle->id[0] ) close( handle->id[0] ); if ( handle->id[1] ) close( handle->id[1] ); delete handle; stream_.apiHandle = 0; } for ( int i=0; i<2; i++ ) { if ( stream_.userBuffer[i] ) { free( stream_.userBuffer[i] ); stream_.userBuffer[i] = 0; } } if ( stream_.deviceBuffer ) { free( stream_.deviceBuffer ); stream_.deviceBuffer = 0; } stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; } void RtApiOss :: startStream() { verifyStream(); if ( stream_.state == STREAM_RUNNING ) { errorText_ = "RtApiOss::startStream(): the stream is already running!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); stream_.state = STREAM_RUNNING; // No need to do anything else here ... OSS automatically starts // when fed samples. MUTEX_UNLOCK( &stream_.mutex ); OssHandle *handle = (OssHandle *) stream_.apiHandle; pthread_cond_signal( &handle->runnable ); } void RtApiOss :: stopStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiOss::stopStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } int result = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Flush the output with zeros a few times. char *buffer; int samples; RtAudioFormat format; if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; samples = stream_.bufferSize * stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; samples = stream_.bufferSize * stream_.nUserChannels[0]; format = stream_.userFormat; } memset( buffer, 0, samples * formatBytes(format) ); for ( unsigned int i=0; iid[0], buffer, samples * formatBytes(format) ); if ( result == -1 ) { errorText_ = "RtApiOss::stopStream: audio write error."; error( RtError::WARNING ); } } result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::stopStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } handle->triggered = false; } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::stopStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } unlock: stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( result != -1 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiOss :: abortStream() { verifyStream(); if ( stream_.state == STREAM_STOPPED ) { errorText_ = "RtApiOss::abortStream(): the stream is already stopped!"; error( RtError::WARNING ); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) { MUTEX_UNLOCK( &stream_.mutex ); return; } int result = 0; OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { result = ioctl( handle->id[0], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::abortStream: system error stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } handle->triggered = false; } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && handle->id[0] != handle->id[1] ) ) { result = ioctl( handle->id[1], SNDCTL_DSP_HALT, 0 ); if ( result == -1 ) { errorStream_ << "RtApiOss::abortStream: system error stopping input callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); goto unlock; } } unlock: stream_.state = STREAM_STOPPED; MUTEX_UNLOCK( &stream_.mutex ); if ( result != -1 ) return; error( RtError::SYSTEM_ERROR ); } void RtApiOss :: callbackEvent() { OssHandle *handle = (OssHandle *) stream_.apiHandle; if ( stream_.state == STREAM_STOPPED ) { MUTEX_LOCK( &stream_.mutex ); pthread_cond_wait( &handle->runnable, &stream_.mutex ); if ( stream_.state != STREAM_RUNNING ) { MUTEX_UNLOCK( &stream_.mutex ); return; } MUTEX_UNLOCK( &stream_.mutex ); } if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApiOss::callbackEvent(): the stream is closed ... this shouldn't happen!"; error( RtError::WARNING ); return; } // Invoke user callback to get fresh output data. int doStopStream = 0; RtAudioCallback callback = (RtAudioCallback) stream_.callbackInfo.callback; double streamTime = getStreamTime(); RtAudioStreamStatus status = 0; if ( stream_.mode != INPUT && handle->xrun[0] == true ) { status |= RTAUDIO_OUTPUT_UNDERFLOW; handle->xrun[0] = false; } if ( stream_.mode != OUTPUT && handle->xrun[1] == true ) { status |= RTAUDIO_INPUT_OVERFLOW; handle->xrun[1] = false; } doStopStream = callback( stream_.userBuffer[0], stream_.userBuffer[1], stream_.bufferSize, streamTime, status, stream_.callbackInfo.userData ); if ( doStopStream == 2 ) { this->abortStream(); return; } MUTEX_LOCK( &stream_.mutex ); // The state might change while waiting on a mutex. if ( stream_.state == STREAM_STOPPED ) goto unlock; int result; char *buffer; int samples; RtAudioFormat format; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { // Setup parameters and do buffer conversion if necessary. if ( stream_.doConvertBuffer[0] ) { buffer = stream_.deviceBuffer; convertBuffer( buffer, stream_.userBuffer[0], stream_.convertInfo[0] ); samples = stream_.bufferSize * stream_.nDeviceChannels[0]; format = stream_.deviceFormat[0]; } else { buffer = stream_.userBuffer[0]; samples = stream_.bufferSize * stream_.nUserChannels[0]; format = stream_.userFormat; } // Do byte swapping if necessary. if ( stream_.doByteSwap[0] ) byteSwapBuffer( buffer, samples, format ); if ( stream_.mode == DUPLEX && handle->triggered == false ) { int trig = 0; ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); result = write( handle->id[0], buffer, samples * formatBytes(format) ); trig = PCM_ENABLE_INPUT|PCM_ENABLE_OUTPUT; ioctl( handle->id[0], SNDCTL_DSP_SETTRIGGER, &trig ); handle->triggered = true; } else // Write samples to device. result = write( handle->id[0], buffer, samples * formatBytes(format) ); if ( result == -1 ) { // We'll assume this is an underrun, though there isn't a // specific means for determining that. handle->xrun[0] = true; errorText_ = "RtApiOss::callbackEvent: audio write error."; error( RtError::WARNING ); // Continue on to input section. } } if ( stream_.mode == INPUT || stream_.mode == DUPLEX ) { // Setup parameters. if ( stream_.doConvertBuffer[1] ) { buffer = stream_.deviceBuffer; samples = stream_.bufferSize * stream_.nDeviceChannels[1]; format = stream_.deviceFormat[1]; } else { buffer = stream_.userBuffer[1]; samples = stream_.bufferSize * stream_.nUserChannels[1]; format = stream_.userFormat; } // Read samples from device. result = read( handle->id[1], buffer, samples * formatBytes(format) ); if ( result == -1 ) { // We'll assume this is an overrun, though there isn't a // specific means for determining that. handle->xrun[1] = true; errorText_ = "RtApiOss::callbackEvent: audio read error."; error( RtError::WARNING ); goto unlock; } // Do byte swapping if necessary. if ( stream_.doByteSwap[1] ) byteSwapBuffer( buffer, samples, format ); // Do buffer conversion if necessary. if ( stream_.doConvertBuffer[1] ) convertBuffer( stream_.userBuffer[1], stream_.deviceBuffer, stream_.convertInfo[1] ); } unlock: MUTEX_UNLOCK( &stream_.mutex ); RtApi::tickStreamTime(); if ( doStopStream == 1 ) this->stopStream(); } extern "C" void *ossCallbackHandler( void *ptr ) { CallbackInfo *info = (CallbackInfo *) ptr; RtApiOss *object = (RtApiOss *) info->object; bool *isRunning = &info->isRunning; while ( *isRunning == true ) { pthread_testcancel(); object->callbackEvent(); } pthread_exit( NULL ); } //******************** End of __LINUX_OSS__ *********************// #endif // *************************************************** // // // Protected common (OS-independent) RtAudio methods. // // *************************************************** // // This method can be modified to control the behavior of error // message printing. void RtApi :: error( RtError::Type type ) { errorStream_.str(""); // clear the ostringstream if ( type == RtError::WARNING && showWarnings_ == true ) std::cerr << '\n' << errorText_ << "\n\n"; else throw( RtError( errorText_, type ) ); } void RtApi :: verifyStream() { if ( stream_.state == STREAM_CLOSED ) { errorText_ = "RtApi:: a stream is not open!"; error( RtError::INVALID_USE ); } } void RtApi :: clearStreamInfo() { stream_.mode = UNINITIALIZED; stream_.state = STREAM_CLOSED; stream_.sampleRate = 0; stream_.bufferSize = 0; stream_.nBuffers = 0; stream_.userFormat = 0; stream_.userInterleaved = true; stream_.streamTime = 0.0; stream_.apiHandle = 0; stream_.deviceBuffer = 0; stream_.callbackInfo.callback = 0; stream_.callbackInfo.userData = 0; stream_.callbackInfo.isRunning = false; for ( int i=0; i<2; i++ ) { stream_.device[i] = 11111; stream_.doConvertBuffer[i] = false; stream_.deviceInterleaved[i] = true; stream_.doByteSwap[i] = false; stream_.nUserChannels[i] = 0; stream_.nDeviceChannels[i] = 0; stream_.channelOffset[i] = 0; stream_.deviceFormat[i] = 0; stream_.latency[i] = 0; stream_.userBuffer[i] = 0; stream_.convertInfo[i].channels = 0; stream_.convertInfo[i].inJump = 0; stream_.convertInfo[i].outJump = 0; stream_.convertInfo[i].inFormat = 0; stream_.convertInfo[i].outFormat = 0; stream_.convertInfo[i].inOffset.clear(); stream_.convertInfo[i].outOffset.clear(); } } unsigned int RtApi :: formatBytes( RtAudioFormat format ) { if ( format == RTAUDIO_SINT16 ) return 2; else if ( format == RTAUDIO_SINT24 || format == RTAUDIO_SINT32 || format == RTAUDIO_FLOAT32 ) return 4; else if ( format == RTAUDIO_FLOAT64 ) return 8; else if ( format == RTAUDIO_SINT8 ) return 1; errorText_ = "RtApi::formatBytes: undefined format."; error( RtError::WARNING ); return 0; } void RtApi :: setConvertInfo( StreamMode mode, unsigned int firstChannel ) { if ( mode == INPUT ) { // convert device to user buffer stream_.convertInfo[mode].inJump = stream_.nDeviceChannels[1]; stream_.convertInfo[mode].outJump = stream_.nUserChannels[1]; stream_.convertInfo[mode].inFormat = stream_.deviceFormat[1]; stream_.convertInfo[mode].outFormat = stream_.userFormat; } else { // convert user to device buffer stream_.convertInfo[mode].inJump = stream_.nUserChannels[0]; stream_.convertInfo[mode].outJump = stream_.nDeviceChannels[0]; stream_.convertInfo[mode].inFormat = stream_.userFormat; stream_.convertInfo[mode].outFormat = stream_.deviceFormat[0]; } if ( stream_.convertInfo[mode].inJump < stream_.convertInfo[mode].outJump ) stream_.convertInfo[mode].channels = stream_.convertInfo[mode].inJump; else stream_.convertInfo[mode].channels = stream_.convertInfo[mode].outJump; // Set up the interleave/deinterleave offsets. if ( stream_.deviceInterleaved[mode] != stream_.userInterleaved ) { if ( ( mode == OUTPUT && stream_.deviceInterleaved[mode] ) || ( mode == INPUT && stream_.userInterleaved ) ) { for ( int k=0; k 0 ) { if ( stream_.deviceInterleaved[mode] ) { if ( mode == OUTPUT ) { for ( int k=0; k>= 8; } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i> 8) & 0x0000ffff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; for (unsigned int i=0; i> 16) & 0x0000ffff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i> 8) & 0x00ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT24) { Int32 *in = (Int32 *)inBuffer; for (unsigned int i=0; i> 16) & 0x000000ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; for (unsigned int i=0; i> 24) & 0x000000ff); } in += info.inJump; out += info.outJump; } } else if (info.inFormat == RTAUDIO_FLOAT32) { Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i>8) | (x<<8); } //static inline uint32_t bswap_32(uint32_t x) { return (bswap_16(x&0xffff)<<16) | (bswap_16(x>>16)); } //static inline uint64_t bswap_64(uint64_t x) { return (((unsigned long long)bswap_32(x&0xffffffffull))<<32) | (bswap_32(x>>32)); } void RtApi :: byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ) { register char val; register char *ptr; ptr = buffer; if ( format == RTAUDIO_SINT16 ) { for ( unsigned int i=0; i #include #include "RtError.h" /*! \typedef typedef unsigned long RtAudioFormat; \brief RtAudio data format type. Support for signed integers and floats. Audio data fed to/from an RtAudio stream is assumed to ALWAYS be in host byte order. The internal routines will automatically take care of any necessary byte-swapping between the host format and the soundcard. Thus, endian-ness is not a concern in the following format definitions. - \e RTAUDIO_SINT8: 8-bit signed integer. - \e RTAUDIO_SINT16: 16-bit signed integer. - \e RTAUDIO_SINT24: Upper 3 bytes of 32-bit signed integer. - \e RTAUDIO_SINT32: 32-bit signed integer. - \e RTAUDIO_FLOAT32: Normalized between plus/minus 1.0. - \e RTAUDIO_FLOAT64: Normalized between plus/minus 1.0. */ typedef unsigned long RtAudioFormat; static const RtAudioFormat RTAUDIO_SINT8 = 0x1; // 8-bit signed integer. static const RtAudioFormat RTAUDIO_SINT16 = 0x2; // 16-bit signed integer. static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // Lower 3 bytes of 32-bit signed integer. static const RtAudioFormat RTAUDIO_SINT32 = 0x8; // 32-bit signed integer. static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0. static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0. /*! \typedef typedef unsigned long RtAudioStreamFlags; \brief RtAudio stream option flags. The following flags can be OR'ed together to allow a client to make changes to the default stream behavior: - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with \c nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index \c nFrames (assuming the \c buffer pointer was recast to the correct data type for the stream). Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance. If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs. If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt to select realtime scheduling (round-robin) for the callback thread. */ typedef unsigned int RtAudioStreamFlags; static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1; // Use non-interleaved buffers (default = interleaved). static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2; // Attempt to set stream parameters for lowest possible latency. static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4; // Attempt grab device and prevent use by others. static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread. /*! \typedef typedef unsigned long RtAudioStreamStatus; \brief RtAudio stream status (over- or underflow) flags. Notification of a stream over- or underflow is indicated by a non-zero stream \c status argument in the RtAudioCallback function. The stream status can be one of the following two options, depending on whether the stream is open for output and/or input: - \e RTAUDIO_INPUT_OVERFLOW: Input data was discarded because of an overflow condition at the driver. - \e RTAUDIO_OUTPUT_UNDERFLOW: The output buffer ran low, likely producing a break in the output sound. */ typedef unsigned int RtAudioStreamStatus; static const RtAudioStreamStatus RTAUDIO_INPUT_OVERFLOW = 0x1; // Input data was discarded because of an overflow condition at the driver. static const RtAudioStreamStatus RTAUDIO_OUTPUT_UNDERFLOW = 0x2; // The output buffer ran low, likely causing a gap in the output sound. //! RtAudio callback function prototype. /*! All RtAudio clients must create a function of type RtAudioCallback to read and/or write data from/to the audio stream. When the underlying audio system is ready for new input or output data, this function will be invoked. \param outputBuffer For output (or duplex) streams, the client should write \c nFrames of audio sample frames into this buffer. This argument should be recast to the datatype specified when the stream was opened. For input-only streams, this argument will be NULL. \param inputBuffer For input (or duplex) streams, this buffer will hold \c nFrames of input audio sample frames. This argument should be recast to the datatype specified when the stream was opened. For output-only streams, this argument will be NULL. \param nFrames The number of sample frames of input or output data in the buffers. The actual buffer size in bytes is dependent on the data type and number of channels in use. \param streamTime The number of seconds that have elapsed since the stream was started. \param status If non-zero, this argument indicates a data overflow or underflow condition for the stream. The particular condition can be determined by comparison with the RtAudioStreamStatus flags. \param userData A pointer to optional data provided by the client when opening the stream (default = NULL). To continue normal stream operation, the RtAudioCallback function should return a value of zero. To stop the stream and drain the output buffer, the function should return a value of one. To abort the stream immediately, the client should return a value of two. */ typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void *userData ); // **************************************************************** // // // RtAudio class declaration. // // RtAudio is a "controller" used to select an available audio i/o // interface. It presents a common API for the user to call but all // functionality is implemented by the class RtApi and its // subclasses. RtAudio creates an instance of an RtApi subclass // based on the user's API choice. If no choice is made, RtAudio // attempts to make a "logical" API selection. // // **************************************************************** // class RtApi; class RtAudio { public: //! Audio API specifier arguments. enum Api { UNSPECIFIED, /*!< Search for a working compiled API. */ LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */ LINUX_OSS, /*!< The Linux Open Sound System API. */ UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */ MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */ WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */ WINDOWS_DS, /*!< The Microsoft Direct Sound API. */ RTAUDIO_DUMMY /*!< A compilable but non-functional API. */ }; //! The public device information structure for returning queried values. struct DeviceInfo { bool probed; /*!< true if the device capabilities were successfully probed. */ std::string name; /*!< Character string device identifier. */ unsigned int outputChannels; /*!< Maximum output channels supported by device. */ unsigned int inputChannels; /*!< Maximum input channels supported by device. */ unsigned int duplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ bool isDefaultOutput; /*!< true if this is the default output device. */ bool isDefaultInput; /*!< true if this is the default input device. */ std::vector sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ // Default constructor. DeviceInfo() :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {} }; //! The structure for specifying input or ouput stream parameters. struct StreamParameters { unsigned int deviceId; /*!< Device index (0 to getDeviceCount() - 1). */ unsigned int nChannels; /*!< Number of channels. */ unsigned int firstChannel; /*!< First channel index on device (default = 0). */ // Default constructor. StreamParameters() : deviceId(0), nChannels(0), firstChannel(0) {} }; //! The structure for specifying stream options. /*! The following flags can be OR'ed together to allow a client to make changes to the default stream behavior: - \e RTAUDIO_NONINTERLEAVED: Use non-interleaved buffers (default = interleaved). - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. - \e RTAUDIO_SCHEDULE_REALTIME: Attempt to select realtime scheduling for callback thread. By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the RTAUDIO_NONINTERLEAVED flag to the openStream() function, audio data will instead be presented in non-interleaved buffers. In this case, each buffer argument in the RtAudioCallback function will point to a single array of data, with \c nFrames samples for each channel concatenated back-to-back. For example, the first sample of data for the second channel would be located at index \c nFrames (assuming the \c buffer pointer was recast to the correct data type for the stream). Certain audio APIs offer a number of parameters that influence the I/O latency of a stream. By default, RtAudio will attempt to set these parameters internally for robust (glitch-free) performance (though some APIs, like Windows Direct Sound, make this difficult). By passing the RTAUDIO_MINIMIZE_LATENCY flag to the openStream() function, internal stream settings will be influenced in an attempt to minimize stream latency, though possibly at the expense of stream performance. If the RTAUDIO_HOG_DEVICE flag is set, RtAudio will attempt to open the input and/or output stream device(s) for exclusive use. Note that this is not possible with all supported audio APIs. If the RTAUDIO_SCHEDULE_REALTIME flag is set, RtAudio will attempt to select realtime scheduling (round-robin) for the callback thread. The \c priority parameter will only be used if the RTAUDIO_SCHEDULE_REALTIME flag is set. It defines the thread's realtime priority. The \c numberOfBuffers parameter can be used to control stream latency in the Windows DirectSound, Linux OSS, and Linux Alsa APIs only. A value of two is usually the smallest allowed. Larger numbers can potentially result in more robust stream performance, though likely at the cost of stream latency. The value set by the user is replaced during execution of the RtAudio::openStream() function by the value actually used by the system. The \c streamName parameter can be used to set the client name when using the Jack API. By default, the client name is set to RtApiJack. However, if you wish to create multiple instances of RtAudio with Jack, each instance must have a unique client name. */ struct StreamOptions { RtAudioStreamFlags flags; /*!< A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE). */ unsigned int numberOfBuffers; /*!< Number of stream buffers. */ std::string streamName; /*!< A stream name (currently used only in Jack). */ int priority; /*!< Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME). */ // Default constructor. StreamOptions() : flags(0), numberOfBuffers(0), priority(0) {} }; //! A static function to determine the available compiled audio APIs. /*! The values returned in the std::vector can be compared against the enumerated list values. Note that there can be more than one API compiled for certain operating systems. */ static void getCompiledApi( std::vector &apis ) throw(); //! The class constructor. /*! The constructor performs minor initialization tasks. No exceptions can be thrown. If no API argument is specified and multiple API support has been compiled, the default order of use is JACK, ALSA, OSS (Linux systems) and ASIO, DS (Windows systems). */ RtAudio( RtAudio::Api api=UNSPECIFIED ) throw(); //! The destructor. /*! If a stream is running or open, it will be stopped and closed automatically. */ ~RtAudio() throw(); //! Returns the audio API specifier for the current instance of RtAudio. RtAudio::Api getCurrentApi( void ) throw(); //! A public function that queries for the number of audio devices available. /*! This function performs a system query of available devices each time it is called, thus supporting devices connected \e after instantiation. If a system error occurs during processing, a warning will be issued. */ unsigned int getDeviceCount( void ) throw(); //! Return an RtAudio::DeviceInfo structure for a specified device number. /*! Any device integer between 0 and getDeviceCount() - 1 is valid. If an invalid argument is provided, an RtError (type = INVALID_USE) will be thrown. If a device is busy or otherwise unavailable, the structure member "probed" will have a value of "false" and all other members are undefined. If the specified device is the current default input or output device, the corresponding "isDefault" member will have a value of "true". */ RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); //! A function that returns the index of the default output device. /*! If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream. */ unsigned int getDefaultOutputDevice( void ) throw(); //! A function that returns the index of the default input device. /*! If the underlying audio API does not provide a "default device", or if no devices are available, the return value will be 0. Note that this is a valid device identifier and it is the client's responsibility to verify that a device is available before attempting to open a stream. */ unsigned int getDefaultInputDevice( void ) throw(); //! A public function for opening a stream with the specified parameters. /*! An RtError (type = SYSTEM_ERROR) is thrown if a stream cannot be opened with the specified parameters or an error occurs during processing. An RtError (type = INVALID_USE) is thrown if any invalid device ID or channel number parameters are specified. \param outputParameters Specifies output stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For input-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1. \param inputParameters Specifies input stream parameters to use when opening a stream, including a device ID, number of channels, and starting channel number. For output-only streams, this argument should be NULL. The device ID is an index value between 0 and getDeviceCount() - 1. \param format An RtAudioFormat specifying the desired sample data format. \param sampleRate The desired sample rate (sample frames per second). \param *bufferFrames A pointer to a value indicating the desired internal buffer size in sample frames. The actual value used by the device is returned via the same pointer. A value of zero can be specified, in which case the lowest allowable value is determined. \param callback A client-defined function that will be invoked when input data is available and/or output data is needed. \param userData An optional pointer to data that can be accessed from within the callback function. \param options An optional pointer to a structure containing various global stream options, including a list of OR'ed RtAudioStreamFlags and a suggested number of stream buffers that can be used to control stream latency. More buffers typically result in more robust performance, though at a cost of greater latency. If a value of zero is specified, a system-specific median value is chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the lowest allowable value is used. The actual value used is returned via the structure argument. The parameter is API dependent. */ void openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData = NULL, RtAudio::StreamOptions *options = NULL ); //! A function that closes a stream and frees any associated stream memory. /*! If a stream is not open, this function issues a warning and returns (no exception is thrown). */ void closeStream( void ) throw(); //! A function that starts a stream. /*! An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already running. */ void startStream( void ); //! Stop a stream, allowing any samples remaining in the output queue to be played. /*! An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped. */ void stopStream( void ); //! Stop a stream, discarding any samples remaining in the input/output queue. /*! An RtError (type = SYSTEM_ERROR) is thrown if an error occurs during processing. An RtError (type = INVALID_USE) is thrown if a stream is not open. A warning is issued if the stream is already stopped. */ void abortStream( void ); //! Returns true if a stream is open and false if not. bool isStreamOpen( void ) const throw(); //! Returns true if the stream is running and false if it is stopped or not open. bool isStreamRunning( void ) const throw(); //! Returns the number of elapsed seconds since the stream was started. /*! If a stream is not open, an RtError (type = INVALID_USE) will be thrown. */ double getStreamTime( void ); //! Returns the internal stream latency in sample frames. /*! The stream latency refers to delay in audio input and/or output caused by internal buffering by the audio system and/or hardware. For duplex streams, the returned value will represent the sum of the input and output latencies. If a stream is not open, an RtError (type = INVALID_USE) will be thrown. If the API does not report latency, the return value will be zero. */ long getStreamLatency( void ); //! Returns actual sample rate in use by the stream. /*! On some systems, the sample rate used may be slightly different than that specified in the stream parameters. If a stream is not open, an RtError (type = INVALID_USE) will be thrown. */ unsigned int getStreamSampleRate( void ); //! Specify whether warning messages should be printed to stderr. void showWarnings( bool value = true ) throw(); protected: void openRtApi( RtAudio::Api api ); RtApi *rtapi_; }; // Operating system dependent thread functionality. #if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) #include #include typedef unsigned long ThreadHandle; typedef CRITICAL_SECTION StreamMutex; #elif defined(__LINUX_ALSA__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) // Using pthread library for various flavors of unix. #include typedef pthread_t ThreadHandle; typedef pthread_mutex_t StreamMutex; #else // Setup for "dummy" behavior #define __RTAUDIO_DUMMY__ typedef int ThreadHandle; typedef int StreamMutex; #endif // This global structure type is used to pass callback information // between the private RtAudio stream structure and global callback // handling functions. struct CallbackInfo { void *object; // Used as a "this" pointer. ThreadHandle thread; void *callback; void *userData; void *apiInfo; // void pointer for API specific callback information bool isRunning; // Default constructor. CallbackInfo() :object(0), callback(0), userData(0), apiInfo(0), isRunning(false) {} }; // **************************************************************** // // // RtApi class declaration. // // Subclasses of RtApi contain all API- and OS-specific code necessary // to fully implement the RtAudio API. // // Note that RtApi is an abstract base class and cannot be // explicitly instantiated. The class RtAudio will create an // instance of an RtApi subclass (RtApiOss, RtApiAlsa, // RtApiJack, RtApiCore, RtApiAl, RtApiDs, or RtApiAsio). // // **************************************************************** // #if defined( HAVE_GETTIMEOFDAY ) #include #endif #include class RtApi { public: RtApi(); virtual ~RtApi(); virtual RtAudio::Api getCurrentApi( void ) = 0; virtual unsigned int getDeviceCount( void ) = 0; virtual RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) = 0; virtual unsigned int getDefaultInputDevice( void ); virtual unsigned int getDefaultOutputDevice( void ); void openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, RtAudioFormat format, unsigned int sampleRate, unsigned int *bufferFrames, RtAudioCallback callback, void *userData, RtAudio::StreamOptions *options ); virtual void closeStream( void ); virtual void startStream( void ) = 0; virtual void stopStream( void ) = 0; virtual void abortStream( void ) = 0; long getStreamLatency( void ); unsigned int getStreamSampleRate( void ); virtual double getStreamTime( void ); bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; }; bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; }; void showWarnings( bool value ) { showWarnings_ = value; }; protected: static const unsigned int MAX_SAMPLE_RATES; static const unsigned int SAMPLE_RATES[]; enum { FAILURE, SUCCESS }; enum StreamState { STREAM_STOPPED, STREAM_RUNNING, STREAM_CLOSED = -50 }; enum StreamMode { OUTPUT, INPUT, DUPLEX, UNINITIALIZED = -75 }; // A protected structure used for buffer conversion. struct ConvertInfo { int channels; int inJump, outJump; RtAudioFormat inFormat, outFormat; std::vector inOffset; std::vector outOffset; }; // A protected structure for audio streams. struct RtApiStream { unsigned int device[2]; // Playback and record, respectively. void *apiHandle; // void pointer for API specific stream handle information StreamMode mode; // OUTPUT, INPUT, or DUPLEX. StreamState state; // STOPPED, RUNNING, or CLOSED char *userBuffer[2]; // Playback and record, respectively. char *deviceBuffer; bool doConvertBuffer[2]; // Playback and record, respectively. bool userInterleaved; bool deviceInterleaved[2]; // Playback and record, respectively. bool doByteSwap[2]; // Playback and record, respectively. unsigned int sampleRate; unsigned int bufferSize; unsigned int nBuffers; unsigned int nUserChannels[2]; // Playback and record, respectively. unsigned int nDeviceChannels[2]; // Playback and record channels, respectively. unsigned int channelOffset[2]; // Playback and record, respectively. unsigned long latency[2]; // Playback and record, respectively. RtAudioFormat userFormat; RtAudioFormat deviceFormat[2]; // Playback and record, respectively. StreamMutex mutex; CallbackInfo callbackInfo; ConvertInfo convertInfo[2]; double streamTime; // Number of elapsed seconds since the stream started. #if defined(HAVE_GETTIMEOFDAY) struct timeval lastTickTimestamp; #endif RtApiStream() :apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; } }; typedef signed short Int16; typedef signed int Int32; typedef float Float32; typedef double Float64; std::ostringstream errorStream_; std::string errorText_; bool showWarnings_; RtApiStream stream_; /*! Protected, api-specific method that attempts to open a device with the given parameters. This function MUST be implemented by all subclasses. If an error is encountered during the probe, a "warning" message is reported and FAILURE is returned. A successful probe is indicated by a return value of SUCCESS. */ virtual bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); //! A protected function used to increment the stream time. void tickStreamTime( void ); //! Protected common method to clear an RtApiStream structure. void clearStreamInfo(); /*! Protected common method that throws an RtError (type = INVALID_USE) if a stream is not open. */ void verifyStream( void ); //! Protected common error method to allow global control over error handling. void error( RtError::Type type ); /*! Protected method used to perform format, channel number, and/or interleaving conversions between the user and device buffers. */ void convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info ); //! Protected common method used to perform byte-swapping on buffers. void byteSwapBuffer( char *buffer, unsigned int samples, RtAudioFormat format ); //! Protected common method that returns the number of bytes for a given format. unsigned int formatBytes( RtAudioFormat format ); //! Protected common method that sets up the parameters for buffer conversion. void setConvertInfo( StreamMode mode, unsigned int firstChannel ); }; // **************************************************************** // // // Inline RtAudio definitions. // // **************************************************************** // inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); } inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); } inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); } inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); } inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); } inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); } inline void RtAudio :: stopStream( void ) { return rtapi_->stopStream(); } inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); } inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); } inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); } inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); } inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); }; inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); } inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); } // RtApi Subclass prototypes. #if defined(__MACOSX_CORE__) #include class RtApiCore: public RtApi { public: RtApiCore(); ~RtApiCore(); RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); unsigned int getDefaultOutputDevice( void ); unsigned int getDefaultInputDevice( void ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( AudioDeviceID deviceId, const AudioBufferList *inBufferList, const AudioBufferList *outBufferList ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); static const char* getErrorCode( OSStatus code ); }; #endif #if defined(__UNIX_JACK__) class RtApiJack: public RtApi { public: RtApiJack(); ~RtApiJack(); RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( unsigned long nframes ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__WINDOWS_ASIO__) class RtApiAsio: public RtApi { public: RtApiAsio(); ~RtApiAsio(); RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! bool callbackEvent( long bufferIndex ); private: std::vector devices_; void saveDeviceInfo( void ); bool coInitialized_; bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__WINDOWS_DS__) class RtApiDs: public RtApi { public: RtApiDs(); ~RtApiDs(); RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; }; unsigned int getDeviceCount( void ); unsigned int getDefaultOutputDevice( void ); unsigned int getDefaultInputDevice( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); long getStreamLatency( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: bool coInitialized_; bool buffersRolling; long duplexPrerollBytes; bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__LINUX_ALSA__) class RtApiAlsa: public RtApi { public: RtApiAlsa(); ~RtApiAlsa(); RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: std::vector devices_; void saveDeviceInfo( void ); bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__LINUX_OSS__) class RtApiOss: public RtApi { public: RtApiOss(); ~RtApiOss(); RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; }; unsigned int getDeviceCount( void ); RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); void closeStream( void ); void startStream( void ); void stopStream( void ); void abortStream( void ); // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function // will most likely produce highly undesireable results! void callbackEvent( void ); private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); }; #endif #if defined(__RTAUDIO_DUMMY__) class RtApiDummy: public RtApi { public: RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtError::WARNING ); }; RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; }; unsigned int getDeviceCount( void ) { return 0; }; RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; return info; }; void closeStream( void ) {}; void startStream( void ) {}; void stopStream( void ) {}; void abortStream( void ) {}; private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ) { return false; }; }; #endif #endif // Indentation settings for Vim and Emacs // // Local Variables: // c-basic-offset: 2 // indent-tabs-mode: nil // End: // // vim: et sts=2 sw=2 pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/RtAudio_readme000066400000000000000000000066671127617341700234320ustar00rootroot00000000000000RtAudio - a set of C++ classes that provide a common API for realtime audio input/output across Linux (native ALSA, JACK, and OSS), Macintosh OS X (CoreAudio and JACK), and Windows (DirectSound and ASIO) operating systems. By Gary P. Scavone, 2001-2009. This distribution of RtAudio contains the following: doc: RtAudio documentation (see doc/html/index.html) tests: example RtAudio programs asio: header and source files necessary for ASIO compilation tests/Windows: Visual C++ .net test program workspace and projects OVERVIEW: RtAudio is a set of C++ classes that provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, JACK, and OSS), Macintosh OS X, SGI, and Windows (DirectSound and ASIO) operating systems. RtAudio significantly simplifies the process of interacting with computer audio hardware. It was designed with the following objectives: - object-oriented C++ design - simple, common API across all supported platforms - only one source and two header files for easy inclusion in programming projects - allow simultaneous multi-api support - support dynamic connection of devices - provide extensive audio device parameter control - allow audio device capability probing - automatic internal conversion for data format, channel number compensation, (de)interleaving, and byte-swapping RtAudio incorporates the concept of audio streams, which represent audio output (playback) and/or input (recording). Available audio devices and their capabilities can be enumerated and then specified when opening a stream. Where applicable, multiple API support can be compiled and a particular API specified when creating an RtAudio instance. See the \ref apinotes section for information specific to each of the supported audio APIs. FURTHER READING: For complete documentation on RtAudio, see the doc directory of the distribution or surf to http://www.music.mcgill.ca/~gary/rtaudio/. LEGAL AND ETHICAL: The RtAudio license is similar to the MIT License. RtAudio: a set of realtime audio i/o C++ classes Copyright (c) 2001-2009 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/RtError.h000066400000000000000000000041061127617341700223550ustar00rootroot00000000000000/************************************************************************/ /*! \class RtError \brief Exception handling class for RtAudio & RtMidi. The RtError class is quite simple but it does allow errors to be "caught" by RtError::Type. See the RtAudio and RtMidi documentation to know which methods can throw an RtError. */ /************************************************************************/ #ifndef RTERROR_H #define RTERROR_H #include #include #include class RtError : public std::exception { public: //! Defined RtError types. enum Type { WARNING, /*!< A non-critical error. */ DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */ UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ MEMORY_ERROR, /*!< An error occured during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ INVALID_USE, /*!< The function was called incorrectly. */ DRIVER_ERROR, /*!< A system driver error occured. */ SYSTEM_ERROR, /*!< A system error occured. */ THREAD_ERROR /*!< A thread error occured. */ }; //! The constructor. RtError( const std::string& message, Type type = RtError::UNSPECIFIED ) throw() : message_(message), type_(type) {} //! The destructor. virtual ~RtError( void ) throw() {} //! Prints thrown error message to stderr. virtual void printMessage( void ) throw() { std::cerr << '\n' << message_ << "\n\n"; } //! Returns the thrown error message type. virtual const Type& getType(void) throw() { return type_; } //! Returns the thrown error message string. virtual const std::string& getMessage(void) throw() { return message_; } //! Returns the thrown error message as a c-style string. virtual const char* what( void ) const throw() { return message_.c_str(); } protected: std::string message_; Type type_; }; #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/__init__.py000066400000000000000000000010461127617341700227160ustar00rootroot00000000000000# PyEPL: hardware/sound/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This package implements sound functions. """ from eplSound import eplSound as EPLSound import soundFile as SoundFile def initialize(**options): """ """ pass def finalize(): """ """ pass pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/constants.h000066400000000000000000000074701127617341700230010ustar00rootroot00000000000000// PyEPL: hardware/sound/constants.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. // constants.h // #ifndef __CONSTANTS_H #define __CONSTANTS_H // // below are ENUMs and defines that we need to expose // // From sndfile.h /* The following file types can be read and written. ** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise ** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and ** SF_FORMAT_SUBMASK can be used to separate the major and minor file ** types. */ enum { /* Major formats. */ SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian). */ SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ SF_FORMAT_VOC = 0x080000, /* VOC files. */ SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */ SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */ /* Subtypes from here on. */ SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */ SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */ SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */ SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */ SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */ SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */ SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */ SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */ SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */ SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */ SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */ SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */ SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */ SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */ SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */ SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */ SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */ SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */ /* Endian-ness options. */ SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */ SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */ SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */ SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */ SF_FORMAT_SUBMASK = 0x0000FFFF, SF_FORMAT_TYPEMASK = 0x0FFF0000, SF_FORMAT_ENDMASK = 0x30000000 } ; enum { /* True and false */ SF_FALSE = 0, SF_TRUE = 1, /* Modes for opening files. */ SFM_READ = 0x10, SFM_WRITE = 0x20, SFM_RDWR = 0x30 } ; #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/eplSound.cpp000066400000000000000000000212411127617341700231010ustar00rootroot00000000000000// PyEPL: hardware/sound/eplSound.cpp // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #include "eplSound.h" #include #include #include using namespace std; eplSound::eplSound(long recLen, long playLen, unsigned int sampRate, unsigned int bufSize) { // get audio instance RtAudio audio; playAudio = NULL; recAudio = NULL; // let's see warnings audio.showWarnings( true ); // make sure there are audio devices if ( audio.getDeviceCount() < 1 ) { cerr << "\nNo audio devices found!\n"; exit( EXIT_FAILURE ); } // must find default input/output device/s and channels playDevice = 0; recDevice = 0; playChans = 0; recChans = 0; // set some vars to defaults sampleRate = sampRate; bufferSize = bufSize; // set up the stream parameters RtAudio::StreamParameters iParams, oParams; RtAudio::StreamOptions options; // set the options //options.flags |= RTAUDIO_HOG_DEVICE; options.flags |= RTAUDIO_SCHEDULE_REALTIME; // Verify that the default devices will work for us RtAudio::DeviceInfo info; // Check and set up the play device try { playDevice = audio.getDefaultOutputDevice(); info = audio.getDeviceInfo( playDevice ); oParams.deviceId = playDevice; oParams.nChannels = info.outputChannels; playChans = oParams.nChannels; } catch ( RtError& e ) { e.printMessage(); //exit( EXIT_FAILURE ); } // Check and set up the rec device try { recDevice = audio.getDefaultInputDevice(); info = audio.getDeviceInfo( recDevice ); iParams.deviceId = recDevice; iParams.nChannels = info.inputChannels; recChans = iParams.nChannels; } catch ( RtError& e ) { e.printMessage(); //exit( EXIT_FAILURE ); } // allocate space for data data = new audioBuffer(recLen,playLen, recChans,playChans, sampleRate); try { // open the proper stream if ((playChans>0) && (recChans>0) && (iParams.deviceId == oParams.deviceId)) { // it's duplex isDuplex = 1; // open both playAudio = new RtAudio(); playAudio->showWarnings( true ); playAudio->openStream( &oParams, &iParams, FORMAT, sampleRate, &bufferSize, &inout, (void *)data ); recAudio = playAudio; } else { // not full duplex isDuplex = 0; if (playChans>0) { // open output playAudio = new RtAudio(); playAudio->showWarnings( true ); playAudio->openStream( &oParams, NULL, FORMAT, sampleRate, &bufferSize, &inout, (void *)data ); } if (recChans>0) { // open input recAudio = new RtAudio(); recAudio->showWarnings( true ); recAudio->openStream( NULL, &iParams, FORMAT, sampleRate, &bufferSize, &inout, (void *)data ); } } if (playChans==0) { // No input chans discovered cerr << "No default input device with correct channel info was found!" << endl; cerr << "You will only be able to record sound." << endl; } if (recChans==0) { // No output chans discovered cerr << "No default output device with correct channel info was found!" << endl; cerr << "You will not be able to play sound." << endl; } } catch ( RtError& e ) { e.printMessage(); exit( EXIT_FAILURE ); } // set to be not streaming yet streaming = 0; } eplSound::~eplSound() { // stop streaming stopstream(1); // close the play stream if (playAudio != NULL) { if (playAudio->isStreamOpen() > 0) playAudio->closeStream(); // clean it up delete playAudio; } // see if should clean up record stream if ((!isDuplex) && (recAudio != NULL)) { if (recAudio->isStreamOpen() > 0) recAudio->closeStream(); // clean it up delete recAudio; } delete data; } void eplSound::clear() { data->playBuf->clear(); data->recBuf->clear(); return; } void eplSound::clearPlayBuffer() { data->playBuf->clear(); return; } void eplSound::clearRecBuffer() { data->recBuf->clear(); return; } int eplSound::recstart() { // first clear (is there any case where we don't want to do this?) data->recBuf->clear(); // set to recording data->recording = 1; // must start streaming (will only start if not already started) startstream(); return 0; } int eplSound::recstop() { // stop recording data->recording = 0; return 0; } int eplSound::startstream() { //if (!(audio.isStreamOpen()) && (streaming == 0)) if (streaming == 0) { // start playing if (playAudio != NULL) { try { playAudio->startStream(); } catch (RtError &error) { error.printMessage(); exit(EXIT_FAILURE); } } if ((recAudio != NULL) && (recAudio != playAudio)) { try { recAudio->startStream(); } catch (RtError &error) { error.printMessage(); exit(EXIT_FAILURE); } } // say we are streaming streaming = 1; } return 0; } int eplSound::stopstream(int abort) { //if (audio.isStreamOpen() && streaming == 1)) if (streaming == 1) { // stop playing if (playAudio != NULL) { try { if (abort) playAudio->abortStream(); else playAudio->stopStream(); } catch (RtError &error) { error.printMessage(); exit(EXIT_FAILURE); } } // stop playing if ((recAudio != NULL) && (recAudio != playAudio)) { try { if (abort) recAudio->abortStream(); else recAudio->stopStream(); } catch (RtError &error) { error.printMessage(); exit(EXIT_FAILURE); } } streaming = 0; data->recording = 0; } return 0; } long eplSound::append(MY_TYPE *newdata, long length, int overwrite, float ampFactor) { long i; // apply amplification if necessary if (ampFactor != 1.0) { // Apply the factor for (i=0;iplayBuf->append(newdata,length,overwrite); } long eplSound::consume(MY_TYPE *newdata, long length) { // consume from the recBuf return data->recBuf->consume(newdata,length); } int eplSound::getBufferSize() { return bufferSize; } long eplSound::getSamplesPlayed() { return data->samplesPlayed; } void eplSound::resetSamplesPlayed() { data->samplesPlayed = 0; } int eplSound::getRecChans() { return recChans; } int eplSound::getPlayChans() { return playChans; } int eplSound::getSampleRate() { return sampleRate; } unsigned int eplSound::getPlayStreamSampleRate() { return playAudio->getStreamSampleRate(); } unsigned int eplSound::getRecStreamSampleRate() { return recAudio->getStreamSampleRate(); } long eplSound::getBufferUsed() { return data->playBuf->getUsed(); } long eplSound::getPlayStreamLatency() { return playAudio->getStreamLatency(); } long eplSound::getRecStreamLatency() { return recAudio->getStreamLatency(); } int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *data ) { audioBuffer *mydata = (audioBuffer *)data; MY_TYPE *inbuffer = (MY_TYPE *) inputBuffer; MY_TYPE *outbuffer = (MY_TYPE *) outputBuffer; unsigned int written = 0; // check the status if ( status ) cerr << "Stream overflow detected!" << endl; // handle recording if ((inputBuffer != NULL) && (mydata->recording)) { // read in from buffer to recBuf mydata->recBuf->append(inbuffer,nBufferFrames*mydata->recChans); } // handle playing if (outputBuffer != NULL) { // write from playBuf to buffer written = mydata->playBuf->consume(outbuffer,nBufferFrames*mydata->playChans); // Append samples played mydata->samplesPlayed += written/(mydata->playChans); // if we wrote less than buffer, append silence if (written < nBufferFrames * mydata->playChans) { // append zeros memset((void *)&outbuffer[written],0, sizeof(MY_TYPE)*((nBufferFrames*mydata->playChans)-written)); } } return 0; } audioBuffer::audioBuffer(long reclen, long playlen, unsigned int inrecChans, unsigned int inplayChans, unsigned int samprate) { // Allocate space for the two buffers recBuf = new fifo(reclen*inrecChans*samprate); playBuf = new fifo(playlen*inplayChans*samprate); //chans = numchans; recChans = inrecChans; playChans = inplayChans; rate = samprate; recording = 0; samplesPlayed = 0; } audioBuffer::~audioBuffer() { // clear the buffer memory delete recBuf; delete playBuf; } pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/eplSound.h000066400000000000000000000052501127617341700225500ustar00rootroot00000000000000// PyEPL: hardware/sound/eplSound.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. /* - Allow for resampling on append to fifo. - Separate recstart and playstart */ #ifndef __EPLSOUND_H #define __EPLSOUND_H #include "RtAudio.h" #include "MyType.h" #include "fifo.h" class audioBuffer { public: audioBuffer(long recLen, long playLen, unsigned int inRecChans, unsigned int inPlayChans, unsigned int samprate); ~audioBuffer(); fifo *recBuf; fifo *playBuf; int recChans; int playChans; int rate; int recording; long samplesPlayed; }; // This should probably match what's in MyType.h #define FORMAT RTAUDIO_SINT16 class eplSound { public: eplSound(long recLen=REC_BUF_LEN, long playLen=PLAY_BUF_LEN, unsigned int sampleRate=SAMPLE_RATE, unsigned int bufSize=BUF_SIZE); ~eplSound(); long append(MY_TYPE *newdata, long length, int overwrite, float ampFactor); long consume(MY_TYPE *newdata, long length); void clear(); void clearPlayBuffer(); void clearRecBuffer(); int recstart(); int recstop(); int startstream(); int stopstream(int abort=0); int getBufferSize(); long getSamplesPlayed(); void resetSamplesPlayed(); int getRecChans(); int getPlayChans(); int getSampleRate(); unsigned int getPlayStreamSampleRate(); unsigned int getRecStreamSampleRate(); long getBufferUsed(); long getPlayStreamLatency(); long getRecStreamLatency(); static const int SCALE=32767; static const unsigned int SAMPLE_RATE=44100; static const int SAMPLE_SILENCE=0; static const unsigned int BUF_SIZE=256; static const int NUM_INTERNAL_BUFF=4; static const int DEVICE=0; static const int FORMAT_SIZE=2; static const long PLAY_BUF_LEN=60; static const long REC_BUF_LEN=60; static const int NUM_CHANNELS=2; private: //RtAudio audio; RtAudio *playAudio; RtAudio *recAudio; int isDuplex; unsigned int playChans; unsigned int recChans; //int rate; unsigned int bufferSize; unsigned int playDevice; unsigned int recDevice; unsigned int sampleRate; unsigned int streaming; audioBuffer *data; }; // audio callback function int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *data ); //int inout(char *buffer, int buffer_size, void *data); //int playcall(char *buffer, int buffer_size, void *data); //int reccall(char *buffer, int buffer_size, void *data); #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/eplSound.i000066400000000000000000000010401127617341700225420ustar00rootroot00000000000000// PyEPL: hardware/sound/eplSound.i // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. %module eplSound #ifdef SWIGPYTHON %typemap(in) MY_TYPE * { char *buffer; buffer = PyString_AsString($input); $1 = (MY_TYPE *)buffer; } #endif %{ #include "eplSound.h" %} %include "eplSound.h" pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/fifo.cpp000066400000000000000000000063171127617341700222420ustar00rootroot00000000000000// // Fifo class definition // #include "fifo.h" #include using namespace std; fifo::fifo(long length) { // allocate for new vector capacity = length; data = new MY_TYPE[length]; // set to be empty clear(); } fifo::~fifo() { // clean up data delete [] data; } void fifo::clear() { // set to be empty startInd = 0; endInd = 0; isFull = 0; used = 0; } long fifo::append(MY_TYPE *newdata, long length, int overwrite) { // append data to the fifo, returning amount appended long toappend = length; long appended = 0; long space = 0; // append until done, full overwriting, until done while (appended < length && !(isFull && !overwrite)) { // see how much space we have if (!overwrite && startInd > endInd) { // can only write up to startInd space = startInd - endInd; } else { // can write up to the end of buffer space = capacity - endInd; } // see if the amount to append is less than the space if (toappend > space) { // can only append space amount toappend = space; } // append that amount memcpy(&data[endInd],&newdata[appended],toappend*sizeof(MY_TYPE)); // See if crossed the start if ((startInd > endInd) && (endInd+toappend >= startInd)) { // we are full isFull = 1; } // update values appended += toappend; endInd += toappend; toappend = length-appended; // See if we must wrap around if (endInd == capacity) { // we are at the end of the buffer, so wrap endInd = 0; } // see if did not cross, but are still full if (startInd == endInd) { // we filled the buffer isFull = 1; } // if we are full, then start and end must be equal if (isFull) { // set start to be end startInd = endInd; } } // done, return the amount appended used+=appended; if (used > capacity) { used = capacity; } return appended; } long fifo::consume(MY_TYPE *newdata, long length) { // fill newdata with values from the fifo long consumed = 0; long toconsume = length; long space = 0; // consume while there is data and we have not filled the newdata while ((consumed < length) && !(!isFull && startInd==endInd)) { // see how much we can consume if (endInd > startInd) { // can consume up to the endInd space = endInd - startInd; } else { // can consume up to end of buffer space = capacity - startInd; } // see if have less space than needed if (space < toconsume) { // Only consume amount needed toconsume = space; } // consume it memcpy(&newdata[consumed],&data[startInd],toconsume*sizeof(MY_TYPE)); // see if no longer full if (toconsume > 0 && isFull) { // no longer full isFull = 0; } // update values consumed += toconsume; startInd += toconsume; toconsume = length - consumed; // see if at end and must loop if (startInd == capacity) { // loop to beginning startInd = 0; } } // done, return the amount consumed used-=consumed; return consumed; } long fifo::getUsed() { return used; } pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/fifo.h000066400000000000000000000007311127617341700217010ustar00rootroot00000000000000// // Fifo class using the STL queue // #ifndef FIFO_H #define FIFO_H #include "MyType.h" #include #include using namespace std; class fifo { public: fifo(long length); ~fifo(); long append(MY_TYPE *newdata, long length, int overwrite = 1); long consume(MY_TYPE *newdata, long length); void clear(); long getUsed(); private: MY_TYPE *data; long used; long capacity; long startInd; long endInd; int isFull; }; #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/setup.py000066400000000000000000000032011127617341700223120ustar00rootroot00000000000000# PyEPL: hardware/sound/setup.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. from distutils.core import setup from distutils.extension import Extension from Pyrex.Distutils import build_ext import sys # #+++HACK: replace linker gcc with g++ +++++++++++ # gpp_exe = 'g++' # gcc_exe = 'g++' # from distutils import sysconfig # save_init_posix = sysconfig._init_posix # def my_init_posix(): # save_init_posix() # g = sysconfig._config_vars # for n,r in [('LDSHARED',gpp_exe),('CC',gcc_exe)]: # if g[n][:3]=='gcc': # print 'my_init_posix: changing %s = %r'%(n,g[n]), # g[n] = r+g[n][3:] # print 'to',`g[n]` # sysconfig._init_posix = my_init_posix # #++++++++++++++++++++++++++++++++++++++++++++++++ sndSources = ["sound.pyx","eplsound_wrapper.cpp","eplSound.cpp","RtAudio.cpp"] if sys.platform == "darwin": defines = [('__MACOSX_CORE__', None)] libs = ["pthread"] x_link_args = ["-framework CoreAudio"] elif sys.platform.find('linux') != -1: defines = [('__LINUX_OSS__', None)] libs = ["pthread"] x_link_args = [] ext_sound = [Extension("sound", sndSources, libraries = libs, define_macros=defines, extra_link_args=x_link_args) ] setup( name = "sound", ext_modules=ext_sound, cmdclass = {'build_ext': build_ext} ) pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/sound.pyx000066400000000000000000000122451127617341700225020ustar00rootroot00000000000000# PyEPL: hardware/sound/sound.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ Module for sound functionality. """ import eplSound cdef extern from "Python.h": int PyString_AsStringAndSize(object, char **, int *) object PyString_FromStringAndSize(char *, int) cdef extern from "stdlib.h": void *malloc(int) void free(void *) # some declarations FORMAT_SIZE = 2 SCALE = 32767.0 SAMPLE_RATE = (44100) PLAY_BUF_LEN = 60 # in seconds REC_BUF_LEN = 60 # in seconds NUM_CHANNELS = 2 # Assumes 2 # Added for easy external sound interface import time import threading snd = None numInitialized = 0 # python wrappers def construct(recBufLen=REC_BUF_LEN, playBufLen=PLAY_BUF_LEN, sampleRate=SAMPLE_RATE): """ """ global REC_BUF_LEN global PLAY_BUF_LEN global SAMPLE_RATE global snd snd = eplSound.eplSound(recBufLen,playBufLen,sampleRate) # Update the globals for other functions REC_BUF_LEN = recBufLen PLAY_BUF_LEN = playBufLen SAMPLE_RATE = sampleRate def eplSound_delete(): """ """ global snd del snd def append(s, int ow=0, float ampFactor=1.0): """ Convert Python string to array, pass on to C++ append. """ global snd return snd.append(s, len(s)/sizeof(short), ow, ampFactor) def consume(long leng): """ Get a C-array from C++ consume, convert to a Python string. """ global snd s = PyString_FromStringAndSize(NULL, leng*sizeof(short)) consumed = snd.consume(s,leng) #print consumed return s[0:consumed*sizeof(short)] def clear(): """ """ global snd return snd.clear() def recstart(): """ """ global snd return snd.recstart() def recstop(): """ """ global snd return snd.recstop() def startstream(): """ """ global snd return snd.startstream() def stopstream(): """ """ global snd return snd.stopstream() def getSamplesPlayed(): """ """ global snd return snd.getSamplesPlayed() def resetSamplesPlayed(): """ """ global snd snd.resetSamplesPlayed() def getRecChans(): """ """ global snd return snd.getRecChans() def getPlayChans(): """ """ global snd return snd.getPlayChans() def getSampleRate(): """ """ global snd return snd.getSampleRate() # Easy interface to outside def init(recBufLen=REC_BUF_LEN, playBufLen=PLAY_BUF_LEN, sampleRate=SAMPLE_RATE): """ Construct, allocate, and start the sound stream. """ global numInitialized if numInitialized == 0: numInitialized = numInitialized + 1 construct(recBufLen, playBufLen, sampleRate) startstream() # threadin stuph __playThreadActive__ = 0 def __playThread__(s, int ow, float ampFactor=1.0): """ Thread to append data periodically if play fifo is full. """ global __playThreadActive__ #print "In thread" # try and append ind = 0 s = s[ind::] #appended = append(s, ow, ampFactor) appended = 0 while appended < len(s)/FORMAT_SIZE and __playThreadActive__==1: # try and append again appended = append(s, ow, ampFactor) #print "Appended %d" % (appended) # reset start index ind = appended*FORMAT_SIZE s = s[ind::] # Wait for .25 the bufferlen time.sleep(PLAY_BUF_LEN*.25) #print "Thread Complete" __playThreadActive__ = 0 def playStart(s, int ow=0, float ampFactor=1.0): """ Append data to the stream, optionally overwriting the fifo and/or applying a gain factor. This function resets the samples played. """ cdef long appended global __playThreadActive__ # reset the samples resetSamplesPlayed() # append the data appended = append(s, ow, ampFactor) # check to see if all was appended if appended < len(s)/FORMAT_SIZE: # must start thread to append #print "Not all appended" if __playThreadActive__ == 0: playThread = threading.Thread(name="eplSound play thread", target=__playThread__, args = (s[(appended*FORMAT_SIZE)::],ow,1)) # amp factor is already applied __playThreadActive__ = 1 playThread.start() #print "Started thread" return appended def playStop(): """ Stop playing immediately and return the number of samples played. """ global __playThreadActive__ # see if thread going if __playThreadActive__==1: # stop it __playThreadActive__ = 0 # stop playing clear() # return the number of samples return getSamplesPlayed() def deinit(): """ Stop and destruct the sound stream. """ global numInitialized numInitialized = numInitialized - 1 playStop() if numInitialized == 0: stopstream() eplSound_delete() pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/soundFile.cpp000066400000000000000000000123511127617341700232420ustar00rootroot00000000000000// PyEPL: hardware/sound/soundFile.cpp // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. // soundFile class // #include "soundFile.h" #include using std::cout; using std::cerr; using std::endl; soundFile::soundFile(const char *filename, int mode, int format, int channels, int samplerate) { file = NULL; // call the open method open(filename,mode,format,channels,samplerate); } soundFile::~soundFile() { close(); } int soundFile::open(const char *filename, int mode, int format, int channels, int samplerate) { // see if should use provided info if (format != 0 ) { info.format = format; } if (channels != 0) { info.channels = channels; } if (samplerate != 0) { info.samplerate = samplerate; } // open the file filling the info file = sf_open(filename, mode, &info); if (file == NULL) { cerr << "ERROR: sf_open failed." << endl; cerr << sf_strerror(file) << endl; return -1; } return 0; } int soundFile::close() { // close the sndfile if it exists if (file) { return sf_close(file); } return 0; } long soundFile::getTotalSamples() { return (long)(info.channels * info.frames); } int soundFile::getChannels() { return info.channels; } int soundFile::getSamplerate() { return info.samplerate; } int soundFile::getFormat() { return info.format; } long soundFile::getFrames() { return info.frames; } float *soundFile::readfile_float(int resampledrate) { long toread = info.channels*info.frames; long numread; // allocate the space for the data float *data = new float[toread]; // read in the data from the entire file numread = sf_readf_float(file,data,info.frames); if (numread != info.frames) { // Did not read in all that was expected cerr << "WARNING: sf_read only read " << numread << " out of " << info.frames << " frames." << endl; info.frames = numread; } // see if resample if (resampledrate > 0 && resampledrate != info.samplerate) { // resample the data to the new rate float *newdata = NULL; newdata = resample(data,(double)resampledrate/info.samplerate); // move the data around and delete the old data float *tempdata = data; data = newdata; newdata = tempdata; delete newdata; // set the new samplerate info.samplerate = resampledrate; } return data; } short *soundFile::readfile_short(int resampledrate) { long toread; long numread; short *shortdata; // see if resample if (resampledrate > 0 && resampledrate != info.samplerate) { // we will resample, so should read in floats // get the data float *floatdata = NULL; floatdata = readfile_float(resampledrate); // convert the data to a float toread = info.channels*info.frames; shortdata = new short[toread]; long i; for (i=0; i(floatdata[i] * SHORT_RANGE); } // delete the float data delete floatdata; } else { // can just read short data toread = info.channels*info.frames; shortdata = new short[toread]; // read in shorts from the entire file numread = sf_readf_short(file,shortdata,info.frames); if (numread != info.frames) { // Did not read in all that was expected cerr << "WARNING: sf_read only read " << numread << " out of " << info.frames << " frames." << endl; info.frames = numread; } } // return the short data return shortdata; } int soundFile::append_float(float *data, long numSamples) { long ret; // File must be open // seek to the end ret = sf_seek(file, 0, SEEK_END); // append the float data ret = sf_write_float(file, data, numSamples); if (ret != numSamples) { // Did not write everything for some reason cerr << "WARNING: sf_write only appended " << ret << " out of " << numSamples << " samples." << endl; } return 0; } int soundFile::append_short(short *data, long numSamples) { long ret; // File must be open // seek to the end ret = sf_seek(file, 0, SEEK_END); // append the float data ret = sf_write_short(file, data, numSamples); if (ret != numSamples) { // Did not write everything for some reason cerr << "WARNING: sf_write only appended " << ret << " out of " << numSamples << " samples." << endl; } return 0; } float *soundFile::resample(float *indata, double ratio) { SRC_DATA sdata; // allocate space for new data long newsize = (long)(info.channels * ratio * info.frames); float *outdata = new float[newsize]; // set up the struct sdata.data_in = indata; sdata.data_out = outdata; sdata.input_frames = info.frames; sdata.output_frames = (long)newsize/info.channels; sdata.src_ratio = ratio; int res = src_simple(&sdata, SRC_SINC_FASTEST, info.channels); if (res != 0) { cerr << "ERROR: Resampling failed." << endl; cerr << src_strerror(res) << endl; return NULL; } // update the frames to be the new number of samples info.frames = sdata.output_frames_gen; return outdata; } pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/soundFile.h000066400000000000000000000026621127617341700227130ustar00rootroot00000000000000// PyEPL: hardware/sound/soundFile.h // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. // soundFile class header // #ifndef __SOUNDFILE_H #define __SOUNDFILE_H #include #include // From stdio.h #ifndef SEEK_SET #define SEEK_SET 0 /* set file offset to offset */ #endif #ifndef SEEK_CUR #define SEEK_CUR 1 /* set file offset to current plus offset */ #endif #ifndef SEEK_END #define SEEK_END 2 /* set file offset to EOF plus offset */ #endif #define SHORT_RANGE 32767 class soundFile { public: soundFile(const char *filename, int mode=SFM_READ, int format=0, int channels=0, int samplerate=0); ~soundFile(); long getTotalSamples(); int getChannels(); int getSamplerate(); int getFormat(); long getFrames(); float *readfile_float(int resampledrate=0); short *readfile_short(int resampledrate=0); int append_float(float *data, long numSamples); int append_short(short *data, long numSamples); private: int open(const char *filename, int mode=SFM_READ, int format=0, int channels=0,int samplerate=0); int close(); float *resample(float *indata, double ratio); SF_INFO info; SNDFILE *file; }; #endif pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/soundFile.i000066400000000000000000000022631127617341700227110ustar00rootroot00000000000000// PyEPL: hardware/sound/soundFile.i // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. %module soundFile // Must be careful with this typemap because other float * will be converted, // but this typemap requires that it only apply to the readfile method. #ifdef SWIGPYTHON %typemap(out) float * { // set the result, getting the numread from the class $result = PyString_FromStringAndSize((char *)$1,((arg1)->getTotalSamples())*sizeof(float)); delete $1; } %typemap(out) short * { // set the result, getting the numread from the class $result = PyString_FromStringAndSize((char *)$1,((arg1)->getTotalSamples())*sizeof(short)); delete $1; } %typemap(in) float * { char *buffer; buffer = PyString_AsString($input); $1 = (float *)buffer; } %typemap(in) short * { char *buffer; buffer = PyString_AsString($input); $1 = (short *)buffer; } #endif %{ #include "soundFile.h" %} %include "soundFile.h" %include "constants.h" pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/test.cpp000066400000000000000000000013211127617341700222640ustar00rootroot00000000000000// PyEPL: hardware/sound/test.cpp // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. extern "C" void play_wave(); extern "C" void eplSound_wcreate(long,long); extern "C" void client_code(); extern "C" void eplSound_wdelete(); int main(int argc, char *argv[]){ if (argc==2){ int size = 20*2*44100; eplSound_wcreate(size,size); switch(atoi(argv[1])){ case 1: play_wave(); break; case 2: client_code(); break; } } } pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/test_epl.cpp000066400000000000000000000020671127617341700231340ustar00rootroot00000000000000// PyEPL: hardware/sound/test_epl.cpp // // Copyright (C) 2003-2005 Michael J. Kahana // Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs // URL: http://memory.psych.upenn.edu/programming/pyepl // // Distributed under the terms of the GNU Lesser General Public License // (LGPL). See the license.txt that came with this file. #include using std::cout; using std::endl; int main(int argc, char *argv[]) { int maxsecs = 60; int secs = 10; int chans = 2; int rate = 44100; long buflen = secs*chans*rate; long maxbuflen = maxsecs*chans*rate; eplSound *sound = new eplSound(maxsecs,maxsecs,rate); MY_TYPE *data = new MY_TYPE[buflen]; int i; long consumed; sound->startstream(); sound->recstart(); cout << "recording...\n"; sleep(secs); sound->recstop(); consumed = sound->consume(data,buflen); cout << consumed << endl; for (i=0;i<20;i++) { sound->append(data,consumed,0); cout << "playing ... \n"; sleep(secs); } sound->stopstream(); delete sound; delete[] data; } pyepl-1.1.0+git12-g365f8e3/code/hardware/sound/testsound.py000066400000000000000000000020341127617341700232050ustar00rootroot00000000000000# PyEPL: hardware/sound/testsound.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. import sound import time import Numeric import struct secs = 5 formatsize = 2 sound.init(60,2) print "Recording for %d seconds..." % secs sound.recstart() time.sleep(secs) sound.recstop() s = sound.consume(secs*44100*2) # duplicate it print sound.getRecChans() if sound.getRecChans() == 1: buff = Numeric.array(struct.unpack(str(len(s)/formatsize) + 'h', s),typecode=Numeric.Int16) xbuff = Numeric.zeros((len(buff)*2),typecode=Numeric.Int16) xbuff[::2] = buff; xbuff[1::2] = buff; # convert to a string s = str(buffer(xbuff)) # clean up del xbuff del buff print len(s) for i in range(5): print "Playing sound" sound.playStart(s,0,1) time.sleep(secs) sound.deinit() pyepl-1.1.0+git12-g365f8e3/code/hardware/timing.pyx000066400000000000000000000037111127617341700215070ustar00rootroot00000000000000# PyEPL: hardware/timing.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides low-level timing functionality. """ import pygame from pygame.time import get_ticks, delay, wait import time from eventpoll import pollEvents cdef object basetime basetime = long(0) cdef extern from "unistd.h": int usleep (long) def initialize(**options): """ Do any preparation necessary before using timing features. """ global basetime basetime = long(round(time.time() * 1000)) - get_ticks() def finalize(): """ Shut down timing features. """ pass def universal_time(): """ Returns the number of milliseconds elapsed since the unix epoch. """ global basetime return basetime + get_ticks() def timedCall(t, f, *targs, **dargs): """ At time t, call f with any remaining arguments. Returns a 2-tuple of a timestamp for the time and maximum latency of the actual call to f, and the return value of the call. If t is None or 0, the call is made immediately. INPUT ARGS: t- time at which to execute call. This can be specified as an integer specifying a millisecond time to run, OR as a PresentationClock object. f- a callable to run at the specified time args- arguments to pass to f when it is called. """ if t: # if t is a PresentationClock, then (we think) the t.get() # method is called during the comparison while t > universal_time(): pollEvents() before = universal_time() r = f(*targs, **dargs) after = universal_time() return ((before, after - before + 1), r) def uSleep(usec): """ Force a usec sleep. """ usleep(usec) pyepl-1.1.0+git12-g365f8e3/code/hardware/vr/000077500000000000000000000000001127617341700201035ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/hardware/vr/Makefile000066400000000000000000000031601127617341700215430ustar00rootroot00000000000000# PyEPL: hardware/vr/Makefile # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. all: avatar.so environment.so include ../../../Makefile.common PLATFORM = $(shell uname) clean: rm -fr *.o *.so pyODE-0.35cvs-2 ifeq ($(PLATFORM), Linux) avatar.so: avatar.o gcc -shared avatar.o -o avatar.so avatar.o: avatar.c gcc -c -fPIC -I$(INCLUDEPY) avatar.c avatar.c: avatar.pyx pyrexc avatar.pyx eyes.so: eyes.o gcc -shared eyes.o -o eyes.so eyes.o: eyes.c gcc -c -fPIC -I$(INCLUDEPY) eyes.c eyes.c: eyes.pyx pyrexc eyes.pyx environment.so: environment.o gcc -shared environment.o -o environment.so environment.o: environment.c gcc -c -fPIC -I$(INCLUDEPY) environment.c environment.c: environment.pyx pyrexc environment.pyx endif ifeq ($(PLATFORM), Darwin) avatar.so: avatar.o gcc -bundle -flat_namespace -undefined suppress avatar.o -lode -L/opt/local/lib -o avatar.so avatar.o: avatar.c gcc -fPIC -c avatar.c -I$(INCLUDEPY) avatar.c: avatar.pyx pyrexc avatar.pyx eyes.so: eyes.o gcc -bundle -flat_namespace -undefined suppress eyes.o -o eyes.so eyes.o: eyes.c gcc -fPIC -c eyes.c -I$(INCLUDEPY) eyes.c: eyes.pyx pyrexc eyes.pyx environment.so: environment.o gcc -bundle -flat_namespace -undefined suppress environment.o -o environment.so environment.o: environment.c gcc -fPIC -c environment.c -I$(INCLUDEPY) environment.c: environment.pyx pyrexc environment.pyx endif pyepl-1.1.0+git12-g365f8e3/code/hardware/vr/__init__.py000066400000000000000000000015721127617341700222210ustar00rootroot00000000000000# PyEPL: hardware/vr/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This package provides abstracted access to Crystal Space's 3D world rendering features. """ from avatar import LowVAvatarSpeedBubble from eyes import LowVEye #from ears import LowVEars from environment import LowVEnvironment, setMaxFacetLength from environment import SphereGeom, BoxGeom, PlaneGeom, Sphere, FloorBox, Sprite, SkyBox from environment import BuildingBox def initialize(**options): """ """ if options.has_key("max_facet_length"): setMaxFacetLength(options["max_facet_length"]) def finalize(): """ """ pass pyepl-1.1.0+git12-g365f8e3/code/hardware/vr/avatar.pyx000066400000000000000000000113651127617341700221310ustar00rootroot00000000000000# PyEPL: hardware/vr/avatar.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This modules contains the LowVAvatar class. """ import pyepl.hardware.vr import eyes import itertools import math import ode import numpy cdef object unitz unitz = numpy.array((0.0, 0.0, 1.0)) cdef extern from "ode/ode.h": ctypedef double dReal ctypedef dReal dMatrix3[4*3] void dRFromEulerAngles(dMatrix3 R, dReal phi, dReal theta, dReal psi) def RFromEulerAngles(phi, theta, psi): """ Calculate the rotation matrix for the given Euler angles. """ cdef dMatrix3 R dRFromEulerAngles(R, phi, theta, psi) return [R[0], R[1], R[2], R[4], R[5], R[6], R[8], R[9], R[10]] class LowVAvatar: """ A LowVAvatar represents a user's position, orientation, and body shape in the virtual environment. """ def __init__(self, env, posorient = None): """ Create a LowVAvatar. """ self.env = env self.eyevector = (0, 0, 0) self.eyes = [] if posorient is not None: self.posorient = posorient else: self.posorient = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0) def travel(self, **controls): """ """ self.posorient = self.getNewPosOrient(**controls) if controls.has_key("view_pitch"): vp = controls["view_pitch"] else: vp = 0.0 self.posorient = (self.posorient[0] + self.eyevector[0], self.posorient[1] + self.eyevector[1], self.posorient[2] + self.eyevector[2], self.posorient[3], self.posorient[4] + vp, self.posorient[5]) for eye in self.eyes: eye.reposition(*self.posorient) def getNewPosOrient(self): # To be overridden """ """ pass def positionOrientation(self): """ Return a 6-tuple of position and orientation data: x, y, z, yaw, pitch, roll. """ return self.posorient def teleport(self, pos = None, angle = None, tilt = None, roll = None):#FIX!! """ Set the absolute position, angle, tilt, and roll. """ pass #... def attachEye(self, eye): """ Lock motion of eye with the position of this avatar. """ self.eyes.append(eye) def dettachEye(self, eye): """ Unlock motion of eye. """ self.eyes.remove(eye) class LowVAvatarSpeedBubble(LowVAvatar): """ A LowVAvatar represents a user's position, orientation, and body shape in the virtual environment. """ def __init__(self, env, posorient = None, radius = 0.5, eyeheight = 3.8, density = 1.0): """ Create a LowVAvatar. """ LowVAvatar.__init__(self, env, posorient) self.eyevector = (0, eyeheight - radius, 0) self.body = ode.Body(env.world) M = ode.Mass() M.setSphere(density, radius) self.body.setMass(M) self.geom = ode.GeomSphere(env.space, radius) self.geom.setBody(self.body) self.body.setPosition((self.posorient[0], self.posorient[1] + radius, self.posorient[2])) self.body.setRotation(RFromEulerAngles(self.posorient[4] * (numpy.pi / 180.0), self.posorient[3] * (numpy.pi / 180.0), self.posorient[5] * (numpy.pi / 180.0) ) # order...? Only sure about yaw... ) self.geom.mu = 0 def getNewPosOrient(self, forward_speed = 0.0, yaw_speed = 0.0): """ """ global unitz cdef float x cdef float y cdef float z cdef float yaw cdef float pitch cdef float roll rot = numpy.reshape(numpy.array(self.body.getRotation()), (3, 3)) unitdir = -numpy.dot(rot, unitz) self.body.setLinearVel(unitdir * forward_speed) self.body.setAngularVel((0.0, -yaw_speed, 0.0)) self.env.dynamicStep(30) rot = numpy.reshape(numpy.array(self.body.getRotation()), (3, 3)) unitdir = numpy.dot(rot, unitz) # NB. for now all this only works for yaw xunit, yunit, zunit = unitdir # the following gives yaw values ranging from -90 to 270 deg., # with 90 directly ahead, and -90 directly behind yaw = numpy.arctan(xunit/zunit) * (180.0 / numpy.pi) if zunit < 0.0: yaw = yaw + 180.0 roll=0 pitch=0 x, y, z = self.body.getPosition() return (x, y, z, yaw, pitch, roll) pyepl-1.1.0+git12-g365f8e3/code/hardware/vr/ears.py000066400000000000000000000005071127617341700214110ustar00rootroot00000000000000# PyEPL: hardware/vr/ears.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. pyepl-1.1.0+git12-g365f8e3/code/hardware/vr/environment.pyx000066400000000000000000001023751127617341700232210ustar00rootroot00000000000000# PyEPL: hardware/vr/environment.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. from OpenGL.GL import glGenLists, glNewList, glEndList, glEnable, glDisable, glViewport, glMatrixMode, glLoadIdentity, glClear, glRotatef, glTranslatef, glCallLists, glBindTexture, glBegin, glTexCoord2f, glVertex3f, glEnd, GL_COMPILE, GL_TEXTURE_2D, GL_PROJECTION, GL_MODELVIEW, GL_DEPTH_BUFFER_BIT, GL_QUADS, glCallList, GL_DEPTH_TEST, GL_TRUE, glPushMatrix, glPopMatrix, glDeleteLists, GL_CULL_FACE, glCullFace, GL_FRONT, glGetFloatv, GL_MODELVIEW_MATRIX, GL_TRIANGLE_STRIP, glVertex2f, GL_BLEND, glBlendFunc, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, glFogi, glFogf, glFogfv, GL_FOG, GL_FOG_MODE, GL_FOG_DENSITY, GL_FOG_START, GL_FOG_END, GL_FOG_COLOR, GL_LINEAR, GL_EXP, GL_EXP2, glHint, GL_FOG_HINT, GL_NICEST, glColor4f, glTexParameteri, GL_TEXTURE_WRAP_S from OpenGL.GLU import gluPerspective, gluSphere, gluNewQuadric, gluQuadricNormals, gluQuadricTexture, GLU_SMOOTH, gluQuadricOrientation, GLU_INSIDE import ode from pyepl.hardware.timing import universal_time from numpy import reshape, asarray from math import sqrt, ceil cdef object collattrs cdef float maxfacetlength # OSX glLoadMatrixf fix import OpenGL.GL cdef object glLoadMatrixf if hasattr(OpenGL.GL,"glLoadMatrixf"): glLoadMatrixf = OpenGL.GL.glLoadMatrixf else: glLoadMatrixf = OpenGL.GL.glLoadMatrix collattrs = [ ("mu", "setMu", 0), ("mu2", "setMu2", ode.ContactMu2), ("bounce", "setBounce", ode.ContactBounce), ("bounce_vel", "setBounceVel", ode.ContactBounce), ("soft_erp", "setSoftERP", ode.ContactSoftERP), ("soft_cfm", "setSoftCFM", ode.ContactSoftCFM), ("motion1", "setMotion1", ode.ContactMotion1), ("motion2", "setMotion2", ode.ContactMotion2), ("slip1", "setSlip1", ode.ContactSlip1), ("slip2", "setSlip2", ode.ContactSlip2), ("contact_approx1_1", None, ode.ContactApprox1_1), ("contact_approx1_2", None, ode.ContactApprox1_2), ("contact_approx1", None, ode.ContactApprox1) ] def setMaxFacetLength(float x): global maxfacetlength maxfacetlength = x cdef class VREntity: pass cdef class VRShape(VREntity): def getODEGeometries(self, world, space): # To be overridden pass cdef class VRVisible(VREntity): def prepare(self): # To be overridden pass def construct(self): # To be overridden pass def clean(self): # To be overridden pass cdef class VRDynamic(VREntity): def liveConstruct(self, float x, float y, float z, float yaw, float pitch, float roll, float fovy, float aspect, int width, int height): # To be overridden pass cdef class LowVEnvironment: cdef object entities cdef object gl_lists cdef object gl_live_constructs cdef object ode_geometries cdef readonly object world cdef object contactgroup cdef readonly object space cdef object ode_to_remove cdef object ode_to_add cdef object laststep cdef int stepping cdef int fogmode cdef object fogcolor cdef float fogfar cdef float fognear cdef float fogdensity def __init__(self): """ """ self.entities = {} self.gl_lists = [] self.gl_live_constructs = [] self.fogmode = 0 # create ODE world... self.world = ode.World() self.contactgroup = ode.JointGroup() self.space = ode.Space() self.ode_to_remove = [] self.ode_to_add = [] self.laststep = None self.stepping = 0 def __del__(self): """ """ for entity in self.entities.keys(): self.removeEntity(entity) def addEntity(self, entity): """ """ if isinstance(entity, VRShape): self.ode_to_add.append(entity) geoms = [] if isinstance(entity, VRVisible): listnum = glGenLists(1) entity.prepare() glNewList(listnum, GL_COMPILE) entity.construct() glEndList() else: listnum = None if isinstance(entity, VRDynamic): self.gl_live_constructs.append(entity) self.entities[entity] = (listnum, geoms) if not listnum is None: self.gl_lists.append(listnum) return entity def removeEntity(self, entity): """ """ listnum, geoms = self.entities.pop(entity) if not listnum is None: glDeleteLists(listnum, 1) self.gl_lists.remove(listnum) for geom in geoms: self.ode_to_remove.append(geom) if entity in self.gl_live_constructs: self.gl_live_constructs.remove(entity) def render(self, float x, float y, float z, float yaw, float pitch, float roll, float fovy, float aspect, float zNear, float zFar, int lowerleftx, int lowerlefty, int width, int height): """ """ cdef object i glEnable(GL_TEXTURE_2D) glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) #glCullFace(GL_FRONT) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) if self.fogmode: glFogi(GL_FOG_MODE, self.fogmode) glFogf(GL_FOG_DENSITY, self.fogdensity) glFogf(GL_FOG_START, self.fognear) glFogf(GL_FOG_END, self.fogfar) glFogfv(GL_FOG_COLOR, self.fogcolor) glHint(GL_FOG_HINT, GL_NICEST) glEnable(GL_FOG) else: glDisable(GL_FOG) glViewport(lowerleftx, lowerlefty, width, height) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(fovy, aspect, zNear, zFar) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glClear(GL_DEPTH_BUFFER_BIT) glRotatef(yaw, 0.0, -1.0, 0.0) glRotatef(pitch, -1.0, 0.0, 0.0) glRotatef(roll, 0.0, 0.0, -1.0) glTranslatef(-x, -y, -z) #for i in self.gl_lists: # glCallList(i) glCallLists(self.gl_lists) for i in self.gl_live_constructs: i.liveConstruct(x, y, z, yaw, pitch, roll, fovy, aspect, width, height) def near_callback(self, args, geom1, geom2): """ """ global collattrs cdef object contacts cdef object world cdef object contactgroup cdef long mode cdef object x cdef object attrname cdef object setfuncname cdef long modebit contacts=ode.collide(geom1,geom2) if not len(contacts): return # Callbacks: try: if hasattr(geom1, "callback"): try: cbargs = geom1.cbargs except AttributeError: cbargs = () geom1.callback(*cbargs) if hasattr(geom2, "callback"): try: cbargs = geom2.cbargs except AttributeError: cbargs = () geom2.callback(*cbargs) except: import traceback traceback.print_exc() if (hasattr(geom1, "permeable") and geom1.permeable) or (hasattr(geom2, "permeable") and geom2.permeable): return #create the contact joints world, contactgroup = args for c in contacts: mode = 0 for attrname, setfuncname, modebit in collattrs: try: x = getattr(geom1, attrname) mode = mode | modebit if setfuncname: getattr(c, setfuncname)(x) except AttributeError: try: x = getattr(geom2, attrname) mode = mode | modebit if setfuncname: getattr(c, setfuncname)(x) except AttributeError: pass c.setMode(mode) j=ode.ContactJoint(world, contactgroup, c) j.attach(geom1.getBody(), geom2.getBody()) cdef updateGeoms(self): cdef object geoms cdef object geom cdef object x for geom in self.ode_to_remove: # this is ugly but necesssary if we're going to use # plain PyODE for key in ode._geom_c2py_lut.keys(): if ode._geom_c2py_lut[key]==geom: del ode._geom_c2py_lut[key] for x in self.ode_to_add: geoms = x.getODEGeometries(self.world, self.space) self.entities[x] = (self.entities[x][0], geoms) self.ode_to_remove = [] self.ode_to_add = [] def dynamicStep(self, float substep): """ Update the dynamics simulation by the amount of time specified. """ cdef int x cdef object steptime cdef float milliseconds if self.stepping: return self.stepping = 1 self.updateGeoms() steptime = universal_time() if self.laststep: milliseconds = steptime - self.laststep else: milliseconds = 0.0 self.laststep = steptime if milliseconds: self.laststep = steptime while milliseconds > 0.0: self.space.collide((self.world, self.contactgroup), self.near_callback) self.updateGeoms() self.world.step(min(milliseconds, substep)) self.contactgroup.empty() milliseconds = milliseconds - substep self.stepping = 0 def setGravity(self, x, y, z): """ """ self.world.setGravity((x, y, z)) def setFog(self, mode = None, color = (0.5, 0.5, 0.5), far = 1.0, near = 0.0, density = 1.0): if mode is None: mode = 0 elif mode == "linear": mode = GL_LINEAR elif mode == "exponential": mode = GL_EXP elif mode == "exponential^2": mode = GL_EXP2 else: raise ValueError, "Invalid fog mode: %r" % mode self.fogmode = mode self.fogcolor = color self.fogfar = far self.fognear = near self.fogdensity = density cdef class SphereGeom(VRShape): """ """ cdef float x cdef float y cdef float z cdef float radius cdef object surface_options def __init__(self, x, y, z, radius, **surface_options): """ """ self.x = x self.y = y self.z = z self.radius = radius self.surface_options = surface_options def getODEGeometries(self, world, space): """ """ #make a geom box for collision detection geom=ode.GeomSphere(space, self.radius) geom.setBody(None) geom.setPosition((self.x, self.y, self.z)) geom.setCategoryBits(0x00000001) geom.setCollideBits(long('0xFFFFFFFE', 16)) for key, value in self.surface_options.iteritems(): setattr(geom, key, value) return (geom,) cdef class BoxGeom(VRShape): """ """ cdef float x cdef float y cdef float z cdef float xsize cdef float ysize cdef float zsize cdef object surface_options def __init__(self, x, y, z, xsize, ysize, zsize, **surface_options): """ """ self.x = x self.y = y self.z = z self.xsize = xsize self.ysize = ysize self.zsize = zsize self.surface_options = surface_options def getODEGeometries(self, world, space): """ """ #make a geom box for collision detection geom=ode.GeomBox(space, (self.xsize, self.ysize, self.zsize)) geom.setBody(None) geom.setPosition((self.x, self.y, self.z)) geom.setCategoryBits(0x00000001) geom.setCollideBits(long('0xFFFFFFFE', 16)) for key, value in self.surface_options.iteritems(): setattr(geom, key, value) return (geom,) cdef class PlaneGeom(VRShape): """ """ cdef float a cdef float b cdef float c cdef float d cdef object surface_options def __init__(self, a, b, c, d, **surface_options): """ """ self.a = a self.b = b self.c = c self.d = d self.surface_options = surface_options def getODEGeometries(self, world, space): """ """ #make a geom box for collision detection geom=ode.GeomPlane(space, (self.a, self.b, self.c), self.d) geom.setCategoryBits(0x00000001) geom.setCollideBits(long('0xFFFFFFFE', 16)) for key, value in self.surface_options.iteritems(): setattr(geom, key, value) return (geom,) cdef class Sphere(VRVisible): """ """ cdef object image cdef float radius cdef int slices cdef int stacks cdef float x cdef float y cdef float z def __init__(self, x, y, z, image, radius, slices = 16, stacks = 16): self.image = image self.radius = radius self.slices = slices self.stacks = stacks self.x = x self.y = y self.z = z def construct(self): cdef object quad quad = gluNewQuadric() gluQuadricNormals(quad, GLU_SMOOTH) gluQuadricTexture(quad, GL_TRUE) gluQuadricOrientation(quad, GLU_INSIDE) glPushMatrix() glTranslatef(self.x, self.y, self.z) glBindTexture(GL_TEXTURE_2D, self.image.gl_texture.texid) gluSphere(quad, self.radius, self.slices, self.stacks) glPopMatrix() cdef class Sprite(VRDynamic): """ """ cdef float x cdef float y cdef float z cdef object texture cdef object image cdef float lowx cdef float highx cdef float lowy cdef float highy def __init__(self, float x, float y, float z, image, float xsize, float ysize): """ """ self.x = x self.y = y self.z = z self.image = image self.texture = image.gl_texture.texid self.highx = xsize / 2.0 self.highy = ysize / 2.0 lowx = -self.highx lowy = -self.highy def liveConstruct(self, float x, float y, float z, float yaw, float pitch, float roll, float fovy, float aspect, int width, int height): """ """ cdef object modelview cdef int i cdef int j glPushMatrix() glTranslatef(self.x, self.y, self.z) modelview = glGetFloatv(GL_MODELVIEW_MATRIX) if isinstance(modelview, list): modelview = asarray(modelview) for i from 0 <= i < 3: for j from 0 <= j < 3: if i == j: modelview[i, j] = 1.0 else: modelview[i, j] = 0.0 glLoadMatrixf(reshape(modelview, (16,))) glBindTexture(GL_TEXTURE_2D, self.texture) glBegin(GL_QUADS) glTexCoord2f(0.0, 1.0); glVertex2f(self.lowx, self.lowy) glTexCoord2f(1.0, 1.0); glVertex2f(self.highx, self.lowy) glTexCoord2f(1.0, 0.0); glVertex2f(self.highx, self.highy) glTexCoord2f(0.0, 0.0); glVertex2f(self.lowx, self.highy) glEnd() glPopMatrix() cdef gridQuad( float Ax, float Ay, float Az, float Au, float Av, float Bx, float By, float Bz, float Bu, float Bv, float Cx, float Cy, float Cz, float Cu, float Cv, float Dx, float Dy, float Dz, float Du, float Dv, float maxfacet): cdef float abLength cdef float bcLength cdef float cdLength cdef float daLength cdef int abFacets cdef int bcFacets cdef int abFacet cdef int bcFacet cdef float prop cdef float comp cdef float ab_cd_1a_x cdef float ab_cd_1a_y cdef float ab_cd_1a_z cdef float ab_cd_1a_u cdef float ab_cd_1a_v cdef float ab_cd_1b_x cdef float ab_cd_1b_y cdef float ab_cd_1b_z cdef float ab_cd_1b_u cdef float ab_cd_1b_v cdef float ab_cd_2a_x cdef float ab_cd_2a_y cdef float ab_cd_2a_z cdef float ab_cd_2a_u cdef float ab_cd_2a_v cdef float ab_cd_2b_x cdef float ab_cd_2b_y cdef float ab_cd_2b_z cdef float ab_cd_2b_u cdef float ab_cd_2b_v cdef float subAx cdef float subAy cdef float subAz cdef float subAu cdef float subAv cdef float subBx cdef float subBy cdef float subBz cdef float subBu cdef float subBv cdef float subCx cdef float subCy cdef float subCz cdef float subCu cdef float subCv cdef float subDx cdef float subDy cdef float subDz cdef float subDu cdef float subDv if maxfacet: abLength = sqrt((Bx - Ax) ** 2 + (By - Ay) ** 2 + (Bz - Az) ** 2) bcLength = sqrt((Cx - Bx) ** 2 + (Cy - By) ** 2 + (Cz - Bz) ** 2) cdLength = sqrt((Dx - Cx) ** 2 + (Dy - Cy) ** 2 + (Dz - Cz) ** 2) daLength = sqrt((Ax - Dx) ** 2 + (Ay - Dy) ** 2 + (Az - Dz) ** 2) abFacets = int(ceil(max(abLength, cdLength) / maxfacet)) bcFacets = int(ceil(max(bcLength, daLength) / maxfacet)) else: abFacets = 1 bcFacets = 1 for abFacet from 0 <= abFacet < abFacets: prop = abFacet / float(abFacets) comp = 1.0 - prop ab_cd_1a_x = Ax * prop + Bx * comp ab_cd_1a_y = Ay * prop + By * comp ab_cd_1a_z = Az * prop + Bz * comp ab_cd_1a_u = Au * prop + Bu * comp ab_cd_1a_v = Av * prop + Bv * comp ab_cd_1b_x = Dx * prop + Cx * comp ab_cd_1b_y = Dy * prop + Cy * comp ab_cd_1b_z = Dz * prop + Cz * comp ab_cd_1b_u = Du * prop + Cu * comp ab_cd_1b_v = Dv * prop + Cv * comp prop = (abFacet + 1) / float(abFacets) comp = 1.0 - prop ab_cd_2a_x = Ax * prop + Bx * comp ab_cd_2a_y = Ay * prop + By * comp ab_cd_2a_z = Az * prop + Bz * comp ab_cd_2a_u = Au * prop + Bu * comp ab_cd_2a_v = Av * prop + Bv * comp ab_cd_2b_x = Dx * prop + Cx * comp ab_cd_2b_y = Dy * prop + Cy * comp ab_cd_2b_z = Dz * prop + Cz * comp ab_cd_2b_u = Du * prop + Cu * comp ab_cd_2b_v = Dv * prop + Cv * comp for bcFacet from 0 <= bcFacet < bcFacets: prop = bcFacet / float(bcFacets) comp = 1.0 - prop subAx = ab_cd_1a_x * prop + ab_cd_1b_x * comp subAy = ab_cd_1a_y * prop + ab_cd_1b_y * comp subAz = ab_cd_1a_z * prop + ab_cd_1b_z * comp subAu = ab_cd_1a_u * prop + ab_cd_1b_u * comp subAv = ab_cd_1a_v * prop + ab_cd_1b_v * comp subBx = ab_cd_2a_x * prop + ab_cd_2b_x * comp subBy = ab_cd_2a_y * prop + ab_cd_2b_y * comp subBz = ab_cd_2a_z * prop + ab_cd_2b_z * comp subBu = ab_cd_2a_u * prop + ab_cd_2b_u * comp subBv = ab_cd_2a_v * prop + ab_cd_2b_v * comp prop = (bcFacet + 1) / float(bcFacets) comp = 1.0 - prop subDx = ab_cd_1a_x * prop + ab_cd_1b_x * comp subDy = ab_cd_1a_y * prop + ab_cd_1b_y * comp subDz = ab_cd_1a_z * prop + ab_cd_1b_z * comp subDu = ab_cd_1a_u * prop + ab_cd_1b_u * comp subDv = ab_cd_1a_v * prop + ab_cd_1b_v * comp subCx = ab_cd_2a_x * prop + ab_cd_2b_x * comp subCy = ab_cd_2a_y * prop + ab_cd_2b_y * comp subCz = ab_cd_2a_z * prop + ab_cd_2b_z * comp subCu = ab_cd_2a_u * prop + ab_cd_2b_u * comp subCv = ab_cd_2a_v * prop + ab_cd_2b_v * comp glTexCoord2f(subAu, subAv); glVertex3f(subAx, subAy, subAz) glTexCoord2f(subBu, subBv); glVertex3f(subBx, subBy, subBz) glTexCoord2f(subCu, subCv); glVertex3f(subCx, subCy, subCz) glTexCoord2f(subDu, subDv); glVertex3f(subDx, subDy, subDz) cdef class SkyBox(VRVisible): """ """ cdef float x cdef float y cdef float z cdef float xsize cdef float ysize cdef float zsize cdef object imageFront cdef object imageRear cdef object imageLeft cdef object imageRight cdef float xwalltiletimesFront cdef float ywalltiletimesFront cdef float xwalltiletimesRear cdef float ywalltiletimesRear cdef float xwalltiletimesLeft cdef float ywalltiletimesLeft cdef float xwalltiletimesRight cdef float ywalltiletimesRight def __init__(self, imageFront, imageRear, imageLeft, imageRight, x = 0.0, y = 0.0, z = 0.0, xsize = 500.0, ysize = 500.0, zsize = 500.0, texlenFront = 500.0, texlenRear = 500.0, texlenLeft = 500.0, texlenRight = 500.0, xTileFactorFront = 1, xTileFactorRear = 1, xTileFactorLeft = 1, xTileFactorRight = 1, yTileFactorFront = 1, yTileFactorRear = 1, yTileFactorLeft = 1, yTileFactorRight = 1): """ """ self.x = x self.y = y self.z = z self.xsize = xsize self.ysize = ysize self.zsize = zsize self.imageFront = imageFront self.imageRear = imageRear self.imageLeft = imageLeft self.imageRight = imageRight self.xwalltiletimesFront = (xsize / texlenFront)*xTileFactorFront self.ywalltiletimesFront = (ysize / texlenFront)*yTileFactorFront self.xwalltiletimesRear = (xsize / texlenRear)*xTileFactorRear self.ywalltiletimesRear = (ysize / texlenRear)*yTileFactorRear self.xwalltiletimesLeft = (xsize / texlenLeft)*xTileFactorLeft self.ywalltiletimesLeft = (ysize / texlenLeft)*yTileFactorLeft self.xwalltiletimesRight = (xsize / texlenRight)*xTileFactorRight self.ywalltiletimesRight = (ysize / texlenRight)*yTileFactorRight def construct(self): global maxfacetlength cdef float lowx cdef float highx cdef float lowy cdef float highy cdef float lowz cdef float highz cdef float halfxsize cdef float halfzsize halfxsize = self.xsize / 2.0 halfzsize = self.zsize / 2.0 lowx = self.x - halfxsize highx = self.x + halfxsize lowy = self.y highy = self.y + self.ysize lowz = self.z - halfzsize highz = self.z + halfzsize # don't use border color when filtering texture edges GL_CLAMP_TO_EDGE = 0x812F # Walls... # Front face glBindTexture(GL_TEXTURE_2D, self.imageFront.gl_texture.texid) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) glBegin(GL_QUADS) gridQuad( highx, highy, lowz, 0, 0, lowx, highy, lowz, self.xwalltiletimesFront, 0, lowx, lowy, lowz, self.xwalltiletimesFront, self.ywalltiletimesFront, highx, lowy, lowz, 0, self.ywalltiletimesFront, maxfacetlength) glEnd() # Rear face glBindTexture(GL_TEXTURE_2D, self.imageRear.gl_texture.texid) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) glBegin(GL_QUADS) gridQuad( lowx, highy, highz, 0, 0, highx, highy, highz, self.xwalltiletimesRear, 0, highx, lowy, highz, self.xwalltiletimesRear, self.ywalltiletimesRear, lowx, lowy, highz, 0, self.ywalltiletimesRear, maxfacetlength) glEnd() # Left face glBindTexture(GL_TEXTURE_2D, self.imageLeft.gl_texture.texid) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) glBegin(GL_QUADS) gridQuad( lowx, highy, lowz, 0, 0, lowx, highy, highz, self.xwalltiletimesLeft, 0, lowx, lowy, highz, self.xwalltiletimesLeft, self.ywalltiletimesLeft, lowx, lowy, lowz, 0, self.ywalltiletimesLeft, maxfacetlength) glEnd() # Right face glBindTexture(GL_TEXTURE_2D, self.imageRight.gl_texture.texid) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) glBegin(GL_QUADS) gridQuad( highx, highy, highz, 0, 0, highx, highy, lowz, self.xwalltiletimesRight, 0, highx, lowy, lowz, self.xwalltiletimesRight, self.ywalltiletimesRight, highx, lowy, highz, 0, self.ywalltiletimesRight, maxfacetlength) glEnd() cdef class FloorBox(VRVisible): """ """ cdef float x cdef float y cdef float z cdef float xsize cdef float ysize cdef float zsize cdef object floorimage cdef float xfloortiletimes cdef float yfloortiletimes cdef object wallimageFront cdef object wallimageRear cdef object wallimageLeft cdef object wallimageRight cdef float xwallFrontTiletimes cdef float ywallFrontTiletimes cdef float xwallRearTiletimes cdef float ywallRearTiletimes cdef float xwallLeftTiletimes cdef float ywallLeftTiletimes cdef float xwallRightTiletimes cdef float ywallRightTiletimes def __init__(self, x, y, z, xsize, ysize, zsize, floorimage, floortexlen = None, wallimageFront = None, walltexlenFront = None, wallimageRear = None, walltexlenRear = None, wallimageLeft = None, walltexlenLeft = None, wallimageRight = None, walltexlenRight = None): """ """ self.x = x self.y = y self.z = z self.xsize = xsize self.ysize = ysize self.zsize = zsize self.floorimage = floorimage if floortexlen: self.xfloortiletimes = xsize / floortexlen self.yfloortiletimes = zsize / floortexlen else: self.xfloortiletimes = 1.0 self.yfloortiletimes = 1.0 self.wallimageFront = wallimageFront self.wallimageRear = wallimageRear self.wallimageLeft = wallimageLeft self.wallimageRight = wallimageRight self.xwallFrontTiletimes = 1.0 self.ywallFrontTiletimes = 1.0 self.xwallRearTiletimes = 1.0 self.ywallRearTiletimes = 1.0 self.xwallLeftTiletimes = 1.0 self.ywallLeftTiletimes = 1.0 self.xwallRightTiletimes = 1.0 self.ywallRightTiletimes = 1.0 if walltexlenFront: self.xwallFrontTiletimes = (xsize / walltexlenFront)#/14.5 self.ywallFrontTiletimes = ysize / walltexlenFront if walltexlenRear: self.xwallRearTiletimes = (xsize / walltexlenRear)#/14.5 self.ywallRearTiletimes = ysize / walltexlenRear if walltexlenLeft: self.xwallLeftTiletimes = (xsize / walltexlenLeft)#/14.5 self.ywallLeftTiletimes = ysize / walltexlenLeft if walltexlenRight: self.xwallRightTiletimes = (xsize / walltexlenRight)#/14.5 self.ywallRightTiletimes = ysize / walltexlenRight def construct(self): global maxfacetlength cdef float lowx cdef float highx cdef float lowy cdef float highy cdef float lowz cdef float highz cdef float halfxsize cdef float halfzsize cdef int x cdef int y halfxsize = self.xsize / 2.0 halfzsize = self.zsize / 2.0 lowx = self.x - halfxsize highx = self.x + halfxsize lowy = self.y highy = self.y + self.ysize lowz = self.z - halfzsize highz = self.z + halfzsize # Floor... glBindTexture(GL_TEXTURE_2D, self.floorimage.gl_texture.texid) glBegin(GL_QUADS) gridQuad( lowx, lowy, highz, 0, 0, highx, lowy, highz, self.xfloortiletimes, 0, highx, lowy, lowz, self.xfloortiletimes, self.yfloortiletimes, lowx, lowy, lowz, 0, self.yfloortiletimes, maxfacetlength) glEnd() # Walls... if self.wallimageFront: # Front face glBindTexture(GL_TEXTURE_2D, self.wallimageFront.gl_texture.texid) glBegin(GL_QUADS) gridQuad( highx, highy, lowz, 0, 0, lowx, highy, lowz, self.xwallFrontTiletimes, 0, lowx, lowy, lowz, self.xwallFrontTiletimes, self.ywallFrontTiletimes, highx, lowy, lowz, 0, self.ywallFrontTiletimes, maxfacetlength) if self.wallimageRear: # Rear face glEnd() glBindTexture(GL_TEXTURE_2D, self.wallimageRear.gl_texture.texid) glBegin(GL_QUADS) gridQuad( lowx, highy, highz, 0, 0, highx, highy, highz, self.xwallRearTiletimes, 0, highx, lowy, highz, self.xwallRearTiletimes, self.ywallRearTiletimes, lowx, lowy, highz, 0, self.ywallRearTiletimes, maxfacetlength) glEnd() if self.wallimageLeft: glBindTexture(GL_TEXTURE_2D, self.wallimageLeft.gl_texture.texid) glBegin(GL_QUADS) # Left face gridQuad( lowx, highy, lowz, 0, 0, lowx, highy, highz, self.xwallLeftTiletimes, 0, lowx, lowy, highz, self.xwallLeftTiletimes, self.ywallLeftTiletimes, lowx, lowy, lowz, 0, self.ywallLeftTiletimes, maxfacetlength) # Right face glEnd() if self.wallimageRight: glBindTexture(GL_TEXTURE_2D, self.wallimageRight.gl_texture.texid) glBegin(GL_QUADS) gridQuad( highx, highy, highz, 0, 0, highx, highy, lowz, self.xwallRightTiletimes, 0, highx, lowy, lowz, self.xwallRightTiletimes, self.ywallRightTiletimes, highx, lowy, highz, 0, self.ywallRightTiletimes, maxfacetlength) glEnd() cdef class BuildingBox(VRVisible): """ """ cdef float x cdef float y cdef float z cdef object image cdef float width cdef float height cdef object roofimage cdef float xrooftiletimes cdef float xtiletimes cdef float yrooftiletimes cdef float ytiletimes def __init__(self, x, y, z, image, width, height, roofimage = None, rooftexlen = None, texlen = None): """ """ self.x = x self.y = y self.z = z self.image = image self.width = width self.height = height self.roofimage = roofimage if rooftexlen: self.xrooftiletimes = width / rooftexlen self.yrooftiletimes = width / rooftexlen else: self.xrooftiletimes = 1.0 self.yrooftiletimes = 1.0 if texlen: self.xtiletimes = height / texlen self.ytiletimes = height / texlen else: self.xtiletimes = 1.0 self.ytiletimes = 1.0 def construct(self): cdef float lowx cdef float highx cdef float lowy cdef float highy cdef float lowz cdef float highz cdef float halfwidth halfwidth = self.width / 2.0 lowx = self.x - halfwidth highx = self.x + halfwidth lowy = self.y highy = self.y + self.height lowz = self.z - halfwidth highz = self.z + halfwidth # Walls... glBindTexture(GL_TEXTURE_2D, self.image.gl_texture.texid) glBegin(GL_QUADS) # Front face gridQuad( lowx, highy, lowz, self.xtiletimes, 0, highx, highy, lowz, 0, 0, highx, lowy, lowz, 0, self.ytiletimes, lowx, lowy, lowz, self.xtiletimes, self.ytiletimes, maxfacetlength) # Rear face gridQuad( highx, highy, highz, self.xtiletimes, 0, lowx, highy, highz, 0, 0, lowx, lowy, highz, 0, self.ytiletimes, highx, lowy, highz, self.xtiletimes, self.ytiletimes, maxfacetlength) # Left face gridQuad( lowx, highy, highz, self.xtiletimes, 0, lowx, highy, lowz, 0, 0, lowx, lowy, lowz, 0, self.ytiletimes, lowx, lowy, highz, self.xtiletimes, self.ytiletimes, maxfacetlength) # Right face gridQuad( highx, highy, lowz, self.xtiletimes, 0, highx, highy, highz, 0, 0, highx, lowy, highz, 0, self.ytiletimes, highx, lowy, lowz, self.xtiletimes, self.ytiletimes, maxfacetlength) glEnd() # Roof... if self.roofimage: glBindTexture(GL_TEXTURE_2D, self.roofimage.gl_texture.texid) glBegin(GL_QUADS) gridQuad( lowx, highy, highz, 0, 0, highx, highy, highz, self.xrooftiletimes, 0, highx, highy, lowz, self.xrooftiletimes, self.yrooftiletimes, lowx, highy, lowz, 0, self.yrooftiletimes, maxfacetlength) glEnd() pyepl-1.1.0+git12-g365f8e3/code/hardware/vr/eyes.pyx000066400000000000000000000034721127617341700216200ustar00rootroot00000000000000# PyEPL: hardware/vr/eyes.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module contains the LowVEye class. """ import pygame class LowVEye: """ A LowVEye represents a camera view of the virtual environment. """ def __init__(self, env, xsize = None, ysize = None): """ Create a LowVEye of the specified dimensions. """ self.env = env self.xsize = xsize self.ysize = ysize self.fov = 60.0 self.x = 0 self.y = 0 self.z = 0 self.yaw = 0 self.pitch = 0 self.roll = 0 self.near_clipping = 0.1 self.far_clipping = 10000.0 def getSize(self): """ Return a 2-tuple representing the dimensions of this eye's view. """ return self.xsize, self.ysize def reposition(self, x, y, z, yaw, pitch, roll): """ Position the camera. """ self.x = x self.y = y self.z = z self.yaw = yaw self.pitch = pitch self.roll = roll def setFOV(self, fov): """ Set the camera's field of view without moving it. """ self.fov = fov def draw(self, x, y): """ Render what this eye sees to the screen. """ resx, resy = pygame.display.get_surface().get_size() self.env.render(self.x, self.y, self.z, self.yaw, self.pitch, self.roll, (self.fov * resy) / resx, resx / resy, self.near_clipping, self.far_clipping, x, resy - (y + self.ysize), self.xsize, self.ysize) pyepl-1.1.0+git12-g365f8e3/code/joystick.py000066400000000000000000000352361127617341700201010ustar00rootroot00000000000000# PyEPL: joystick.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides access to joysticks. """ import weakref from textlog import LogTrack from base import UniquelyConstructed import convenience import hardware import mechinput import timing import sys import keyboard from display import VideoTrack class JoyButton(UniquelyConstructed, mechinput.Button): """ Button representing a joystick button. Gets its callback functionality from the mechinput.Button class. """ waiting = [] def __uinit__(self, joysticknum, buttonnum): """ Construct JoyButton. INPUT ARGS: joysticknum- Number of the joystick of interest buttonnum- Button number on that joystick. OUTPUT ARGS: jb- JoyButton object. """ mechinput.Button.__init__(self, "Button %d of Joystick %d" % (buttonnum, joysticknum)) self.joysticknum = joysticknum self.buttonnum = buttonnum track = JoyTrack.lastInstance() if track: track.assignButton(self, joysticknum, buttonnum) else: JoyButton.waiting.append(self) def __setstate__(self, state): """ Attach to JoyTrack upon unpickling. """ self.__dict__.update(state) track = JoyTrack.lastInstance() if track: track.assignButton(self, self.joysticknum, self.buttonnum) else: JoyButton.waiting.append(self) def __getstate__(self): """ """ d = self.__dict__.copy() try: del d["track"] except KeyError: pass return d class JoyAxis(UniquelyConstructed, mechinput.Axis): """ Button representing a joystick axis. """ waiting = [] def __uinit__(self, joysticknum, axisnum): """ Construct JoyAxis. """ mechinput.Axis.__init__(self, "Axis %d of Joystick %d" % (axisnum, joysticknum)) self.joysticknum = joysticknum self.axisnum = axisnum track = JoyTrack.lastInstance() if track: track.assignAxis(self, joysticknum, axisnum) else: JoyAxis.waiting.append(self) def __setstate__(self, state): """ Attach to JoyTrack upon unpickling. """ self.__dict__.update(state) track = JoyTrack.lastInstance() if track: track.assignAxis(self, self.joysticknum, self.axisnum) else: JoyAxis.waiting.append(self) def __getstate__(self): """ """ d = self.__dict__.copy() try: del d["track"] except KeyError: pass return d class JoyBall(UniquelyConstructed, mechinput.Roller): """ Button representing a joystick ball axis. """ waiting = [] def __uinit__(self, joysticknum, ballnum, ballaxis): """ Construct JoyBall. """ mechinput.Axis.__init__(self, "Ball %d of Joystick %d, Axis #%d" % (ballnum, joysticknum, ballaxis)) self.joysticknum = joysticknum self.ballnum = ballnum self.ballaxis = ballaxis track = JoyTrack.lastInstance() if track: track.assignBall(self, joysticknum, ballnum, ballaxis) else: JoyBall.waiting.append(self) def __setstate__(self, state): """ Attach to JoyTrack upon unpickling. """ self.__dict__.update(state) track = JoyTrack.lastInstance() if track: track.assignBall(self, self.joysticknum, self.ballnum, self.ballaxis) else: JoyBall.waiting.append(self) def __getstate__(self): """ """ d = self.__dict__.copy() try: del d["track"] except KeyError: pass return d class JoyHat(UniquelyConstructed, mechinput.Button): """ Button representing a joystick ball axis. """ waiting = [] def __uinit__(self, joysticknum, hatnum, hatposx, hatposy): """ Construct JoyHat. """ mechinput.Axis.__init__(self, "Hat %d of Joystick %d in Position %s" % (hatnum, joysticknum, (hatposx, hatposy))) self.joysticknum = joysticknum self.hatnum = hatnum self.hatpos = (hatposx, hatposy) track = JoyTrack.lastInstance() if track: track.assignHat(self, joysticknum, hatnum, hatpos) else: JoyHat.waiting.append(self) def __setstate__(self, state): """ Attach to JoyTrack upon unpickling. """ self.__dict__.update(state) track = JoyTrack.lastInstance() if track: track.assignHat(self, self.joysticknum, self.hatnum, self.hatpos) else: JoyHat.waiting.append(self) def __getstate__(self): """ """ d = self.__dict__.copy() try: del d["track"] except KeyError: pass return d class JoyTrack(LogTrack): """ A Track for joystick input. """ trackTypeName = "JoyTrack" logExtension = ".joylog" def __init__(self, basename, archive = None, autoStart = True): """ Create the JoyTrack. INPUT ARGS: basename- filename base for joystick log. archive- OPTIONAL directory to put logfile in. autoStart- (default is True) If False, does startService and startLogging are not called and must be done manually. """ LogTrack.__init__(self, basename,archive,autoStart) self.buttons = weakref.WeakValueDictionary() self.axes = weakref.WeakValueDictionary() self.balls = weakref.WeakValueDictionary() self.hats = weakref.WeakValueDictionary() self.hatlast = weakref.WeakValueDictionary() for x in JoyButton.waiting: self.assignButton(x, x.joysticknum, x.buttonnum) JoyButton.waiting = [] for x in JoyAxis.waiting: self.assignAxis(x, x.joysticknum, x.axisnum) JoyAxis.waiting = [] for x in JoyBall.waiting: self.assignBall(x, x.joysticknum, x.ballnum, x.ballaxis) JoyBall.waiting = [] for x in JoyHat.waiting: self.assignHat(x, x.joysticknum, x.hatnum, x.hatpos) JoyHat.waiting = [] def startService(self): """ Starts the JoyTrack service. """ hardware.setJoystickCallbacks(self.axis_callback, self.ball_callback, self.button_callback, self.hat_callback) def stopService(self): """ Stops the JoyTrack service. """ hardware.setJoystickCallbacks(None, None, None, None) def calibrate(self): """ Perform interactive joystick calibration if needed. """ if sys.platform == "darwin": self.logMessage("CALIBRATE_START\tCalibration begins") VideoTrack.lastInstance().clear("black") convenience.instruct( """ Please calibrate the JOYSTICK(S) now... Move the JOYSTICK(S) all the way UP. Move the JOYSTICK(S) all the way DOWN. Move the JOYSTICK(S) all the way LEFT. Move the JOYSTICK(S) all the way RIGHT. Press the 0 button on JOYSTICK 0 when finished. If no JOYSTICK, press SPACE. """, exitbutton = self.button(0, 0) | keyboard.Key("SPACE"), size = 0.04 ) self.logMessage("CALIBRATE_END\tCalibration ends") def button(self, joysticknum, buttonnum): """ Returns a Button object mapped to the button specified. This is identical to calling the JoyButton constructor directly. """ return JoyButton(joysticknum, buttonnum) def assignButton(self, button, joysticknum, buttonnum): """ For internal use only. Send all events for indicated joystick button to button object. """ if self.buttons.has_key((joysticknum, buttonnum)): raise ValueError, "Button %d of joystick %d already bound" % (buttonnum, joysticknum) self.buttons[(joysticknum, buttonnum)] = button def axis(self, joysticknum, axisnum): """ Return an Axis object mapped to the joystick axis specified. This is identical to calling the JoyAxis constructor directly. """ return JoyAxis(joysticknum, axisnum) def assignAxis(self, axis, joysticknum, axisnum): """ For internal use only. Send all events for indicated joystick axis to axis object. """ if self.axes.has_key((joysticknum, axisnum)): raise ValueError, "Axis %d of joystick %d already bound" % (axisnum, joysticknum) self.axes[(joysticknum, axisnum)] = axis def ball(self, joysticknum, ballnum, ballaxis): """ Return a Roller object mapped to the joystick ball specified. This is identical to calling the JoyBall constructor directly. """ return JoyBall(joysticknum, ballnum, ballaxis) def assignBall(self, ball, joysticknum, ballnum, ballaxis): """ For internal use only. Send all events for indicated joystick ball axis to roller object. """ if self.axes.has_key((joysticknum, axisnum, ballaxis)): raise ValueError, "Axis %d of ball %d of joystick %d already bound" % (ballaxis, ballnum, joysticknum) self.balls[(joysticknum, ballnum, ballaxis)] = ball def hat(self, joysticknum, hatnum, hatpos): """ Return a Button object mapped to the joystick hat and hat position specified. This is identical to calling the JoyHat constructor directly. """ return JoyHat(joysticknum, hatnum, hatpos) def assignHat(self, hat, joysticknum, hatnum, hatpos): """ For internal use only. Send all events for indicated joystick hat position to roller object. """ if self.axes.has_key((joysticknum, hatnum, hatpos)): raise ValueError, "Position %r of hat %d of joystick %d already bound" % (hatpos, hatnum, joysticknum) self.balls[(joysticknum, ballnum, ballaxis)] = ball self.hats[(joysticknum, hatnum, hatpos)] = hat def joyButtonChooser(self): """ Return a ButtonChooser object for all joystick hats and buttons. OUTPUT ARGS: buttonChooser- a mechinput.ButtonChoser object. """ allbuttons = [] features = hardware.getJoystickFeatures() for jn, js in enumerate(features): for hn in xrange(js[3]): allbuttons.append(self.hat(jn, hn, (1, 0))) allbuttons.append(self.hat(jn, hn, (-1, 0))) allbuttons.append(self.hat(jn, hn, (1, 1))) allbuttons.append(self.hat(jn, hn, (1, -1))) allbuttons.append(self.hat(jn, hn, (0, 1))) allbuttons.append(self.hat(jn, hn, (0, -1))) allbuttons.append(self.hat(jn, hn, (-1, -1))) allbuttons.append(self.hat(jn, hn, (-1, 1))) # hats at position (0, 0) are excluded from the returned button chooser for bn in xrange(js[2]): allbuttons.append(self.button(jn, bn)) return mechinput.ButtonChooser(*allbuttons) def joyAxisChooser(self): """ Return an AxisChooser object for all joystick axes. OUTPUT ARGS: axisChooser- a mechinput.ButtonChoser object. """ allaxes = [] features = hardware.getJoystickFeatures() for jn, js in enumerate(features): for an in xrange(js[0]): allaxes.append(self.axis(jn, an)) return mechinput.AxisChooser(*allaxes) def joyBallChooser(self): """ Return a RollerChooser object for all joystick balls. OUTPUT ARGS: joyBallChooser- a mechinput.ButtonChoser object. """ allballs = [] features = hardware.getJoystickFeatures() for jn, js in enumerate(features): for bn in xrange(js[2]): allballs.append(self.ball(jn, bn, 0)) allballs.append(self.ball(jn, bn, 1)) return mechinput.RollerChooser(*allballs) def button_callback(self, joysticknum, buttonnum, pressed, timestamp): """ For internal use only. This callback is called for every joystick button event. """ if self.logall: if pressed: self.logMessage("P\t%d\t%d" % (joysticknum, buttonnum), timestamp) else: self.logMessage("R\t%d\t%d" % (joysticknum, buttonnum), timestamp) try: self.buttons[(joysticknum, buttonnum)].setPressed(pressed, timestamp) except KeyError: pass def axis_callback(self, joysticknum, axisnum, position, timestamp): """ For internal use only. This callback is called for every joystick axis event. """ if self.logall: self.logMessage("A\t%d\t%d\t%f" % (joysticknum, axisnum, position), timestamp) try: self.axes[(joysticknum, axisnum)].setPosition(position, timestamp) except KeyError: pass def ball_callback(self, joysticknum, ballnum, relpos, timestamp): """ For internal use only. This callback is called for every joystick ball event. """ if self.logall: self.logMessage("L\t%d\t%d\t%f" % (joysticknum, ballnum, relpos), timestamp) try: self.balls[(joysticknum, ballnum, 0)].move(relpos[0]) except KeyError: pass try: self.balls[(joysticknum, ballnum, 1)].move(relpos[1]) except KeyError: pass def hat_callback(self, joysticknum, hatnum, position, timestamp): """ For internal use only. This callback is called for every joystick hat event. """ if self.logall: self.logMessage("H\t%d\t%d\t%s" % (joysticknum, hatnum, position), timestamp) try: self.hatlast[(joysticknum, hatnum)].setPressed(False, timestamp) except KeyError: pass try: self.hatlast[(joystick, hatnum)] = self.hats[(joysticknum, hatnum, position)] except KeyError: pass try: self.hats[(joysticknum, hatnum, position)].setPressed(True, timestamp) except KeyError: pass pyepl-1.1.0+git12-g365f8e3/code/keyboard.py000066400000000000000000000101721127617341700200320ustar00rootroot00000000000000# PyEPL: keyboard.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ The module provides access to the keyboard. """ import weakref from textlog import LogTrack from base import UniquelyConstructed import hardware import mechinput import timing import types class Key(UniquelyConstructed, mechinput.Button): """ Button representing a keyboard key. """ waiting = [] def __uinit__(self, keyname): """ Construct Key from keyname. """ mechinput.Button.__init__(self, keyname) self.keyname = keyname track = KeyTrack.lastInstance() if track: track.assignButton(self, keyname) else: Key.waiting.append(self) def __setstate__(self, state): """ Attach to KeyTrack upon unpickling. """ self.__dict__.update(state) track = KeyTrack.lastInstance() if track: track.assignButton(self, self.keyname) else: Key.waiting.append(self) def __getstate__(self): """ Don't let pickle try and save the track that the key is associated with. """ d = self.__dict__.copy() try: del d["track"] except KeyError: pass return d class KeyTrack(LogTrack): """ A Track for keyboard input. """ trackTypeName = "KeyTrack" logExtension = ".keylog" def __init__(self, basename, archive = None, autoStart = True): """ Create the KeyTrack. INPUT ARGS: basename- The name of the log. archive- Directory to put the log. autoStart- Whether to automatically start the service and logging. """ LogTrack.__init__(self, basename, archive, autoStart) self.keys = weakref.WeakValueDictionary() for k in Key.waiting: self.assignButton(k, k.keyname) Key.waiting = [] def startService(self): """ Start the KeyTrack service. """ hardware.setKeyboardCallback(self.callback) def stopService(self): """ Stop the KeyTrack service """ hardware.setKeyboardCallback(None) def key(self, keyname): """ Return a Button object mapped to the named key. """ return Key(keyname) def assignButton(self, button, keyname): """ Trigger button for all events for the indicated key. Binds the button object to the KeyTrack. INPUT ARGS: button- Button object to bind. keyname- Key to bind the button to. """ keyval = hardware.nameToKey(keyname) if self.keys.has_key(keyval): raise ValueError, "Key already bound." self.keys[keyval] = button def keyChooser(self, *keys): """ Return a ButtonChooser object for the specified keys. If there are no keys specified, then return all keys. INPUT ARGS: *keys- The names of keys you want to look up. """ allkeys = [] if keys: # add specified keys for keyname in keys: allkeys.append(self.key(keyname)) else: # get all keys for keyname in hardware.keyNames(): allkeys.append(self.key(keyname)) # make button chooser and return return mechinput.ButtonChooser(*allkeys) #return allkeys def callback(self, k, pressed, timestamp): """ This callback is called for every keyboard event and precipitates all pyEPL keyboard input. """ if pressed: self.logMessage("P\t%s" % hardware.keyToName(k), timestamp) else: self.logMessage("R\t%s" % hardware.keyToName(k), timestamp) try: self.keys[k].setPressed(pressed, timestamp) except KeyError: pass pyepl-1.1.0+git12-g365f8e3/code/license.txt000066400000000000000000000641771127617341700200610ustar00rootroot00000000000000# PyEPL: license.txt # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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! pyepl-1.1.0+git12-g365f8e3/code/locals.py000066400000000000000000000034471127617341700175160ustar00rootroot00000000000000# PyEPL: locals.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module imports the most commonly used features of pyEPL. Experimenters should include the line 'from pyepl.locals import *' at the beginning of their experiments. """ import pyepl from timing import now, wait from display import Image from display import Movie from display import Font, setDefaultFont from display import SolidBackground from display import VideoTrack from display import Color from display import Text from display import ABOVE, BELOW, LEFT, RIGHT, OVER, NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, NORTHWEST, CENTER from display import CompoundStimulus from sound import AudioClip, FileAudioClip, Beep from sound import AudioTrack from keyboard import KeyTrack, Key from joystick import JoyTrack, JoyButton, JoyAxis, JoyHat, JoyBall from mouse import MouseTrack, MouseButton, MouseAxis, MouseRoller from textlog import LogTrack from eeg import EEGTrack from pool import Pool, PoolDict, TextPool, ImagePool, SoundPool from vr import VRTrack from vr.randomposition import * #... from mechinput import * #... from pyepl import initialize from pyepl import finalize from exputils import Experiment, EPLOption, PresentationClock, State from convenience import setRealtime, instruct, getInstructing, instructBegin, instructStep, instructEnd, instructSeenAll, waitForAnyKey, buttonChoice, micTest, flashStimulus, presentStimuli, mathDistract,recognition from optparse import make_option from virtualtrack import VirtualTrack from version import checkVersion, checkVersionRange pyepl-1.1.0+git12-g365f8e3/code/mechinput.py000066400000000000000000001050721127617341700202320ustar00rootroot00000000000000# PyEPL: mechinput.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides a layer of abstraction to the input data of mechanical input devices (i.e. mouse, keyboard, joystick). """ from repository import WeakKeyDictionary, MethodCallback import sys import timing import hardware class Roller: """ Abstraction to any continuous motion component without bounds. """ def __init__(self, name = None): """ Set up housekeeping. """ if name == None: self.name = repr(self) else: self.name = name self.callbacks = WeakKeyDictionary() # callback -> args self.counter = 0.0 self.parents = () def __mul__(self, x): """ Return a ScaledRoller. """ return ScaledRoller(self, x) __rmul__ = __mul__ def move(self, amount): """ Add to cumulative change in position. INPUT ARGS: amount- The amount to move (arbitrary units). """ if amount: self.counter = self.counter + amount for c, args in self.callbacks.items(): c(amount, *args) def update(self): # to be overridden """ Keep the value up to date. """ for parent in self.parents: parent.update() def getChange(self): """ Get cumulative change since last getChange (or since initialization). """ self.update() c = self.counter self.counter = 0.0 return c def addCallback(self, c, *args): """ Call c(change, *args) whenever the position changes. This Roller's reference to c will be weak. """ self.callbacks[c] = args def echo(self): """ Return an EchoRoller of this Roller. """ return EchoRoller(self) Roller.__module__ = "pyepl.mechinput" # cope with pyrex bug class EchoRoller(Roller): """ """ def __init__(self, roller): """ """ Roller.__init__(self, "EchoRoller for %s" % roller.name) self.roller = roller self.parents = (roller,) self.cb = MethodCallback(self.move) roller.addCallback(self.cb) def echo(self): """ Return an EchoRoller of this Roller. """ return EchoRoller(self.roller) EchoRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class ThrottledRoller(Roller): """ Roller based on another Roller, but throttled by a maximum velocity and/or a maximum acceleration. """ def __init__(self, roller, maxAccel = None, maxVel = None, name = None): """ Create a ThrottledRoller with maxAccel roller units per millisecond per millisecond maximum acceleration and maxVel roller units per millisecond maximum velocity. None for either of those values means that the constraint will not be applied. """ if name == None: name = "ThrottledRoller from %s" % roller.name else: name = name Roller.__init__(self, name) self.roller = roller self.parents = [roller] self.maxAccel = maxAccel self.maxVel = maxVel self.accum = 0.0 self.lastvelocity = 0.0 self.lasttime = timing.now() self.cb = MethodCallback(self.callback) roller.addCallback(self.cb) def update(self): """ Keep the value up to date. """ Roller.update(self) self.callback(0.0) def callback(self, change): """ Callback used to communicate with parent Roller. The parent roller passes the amount that it is changeing to the callback. """ thistime = timing.now() elapsed = thistime - self.lasttime if not elapsed: self.accum = self.accum + change return change = change + self.accum self.accum = 0.0 thisvelocity = change / elapsed if self.maxAccel: if abs(thisvelocity - self.lastvelocity) / elapsed > self.maxAccel: if thisvelocity < self.lastvelocity: thisvelocity = self.lastvelocity - self.maxAccel * elapsed else: thisvelocity = self.lastvelocity + self.maxAccel * elapsed if self.maxVel: if thisvelocity > self.maxVel: thisvelocity = self.maxVel elif thisvelocity < -self.maxVel: thisvelocity = -self.maxVel self.lasttime = thistime self.lastvelocity = thisvelocity self.move(thisvelocity * elapsed) ThrottledRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class ScaledRoller(Roller): """ Roller based on another roller such that all positive motion is proportional to all positive motion in the parent and all negative motion is proportional to all motion of the parent. """ def __init__(self, roller, scale, reverse_scale = None, name = None): """ Create ScaledRoller with 'scale' and optionally different 'reverse_scale'. """ if name == None: name = "ScaledRoller from %s" % roller.name else: name = name Roller.__init__(self, name) if reverse_scale == None: self.reverse_scale = scale else: self.reverse_scale = reverse_scale self.forward_scale = scale self.roller = roller self.parents = [roller] self.cb = MethodCallback(self.callback) roller.addCallback(self.cb) def callback(self, change): """ Callback used to communicate with parent Roller. """ if change < 0: self.move(change * self.reverse_scale) else: self.move(change * self.forward_scale) ScaledRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class JointRoller(Roller): """ Roller whose motion equals the sum of the motions of certain other Rollers. """ def __init__(self, *rollers): """ Create JointRoller based on rollers. """ Roller.__init__(self, "JointRoller") self.rollers = rollers self.parents = rollers self.cb = MethodCallback(self.move) for roller in rollers: roller.addCallback(self.cb) JointRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class Axis: """ Abstraction to any continuous motion component with bounds. """ def __init__(self, name = None, posmin = -1.0, posmax = 1.0): """ Set up housekeeping. """ if name == None: self.name = repr(self) else: self.name = name self.callbacks = WeakKeyDictionary() # callback -> args self.position = 0.0 self.posmin = posmin self.posmax = posmax self.parents = () def halt(self): # To be overridden pass def setPosition(self, p, timestamp = None): """ Set the position of this axis between 1.0 and -1.0. """ if p != self.position: if timestamp == None: timestamp = (timing.now(), long(0)) self.position = p for c, args in self.callbacks.items(): c(p, timestamp, *args) def update(self): # to be overridden """ Keep the value up to date. """ for parent in self.parents: parent.update() def getPosition(self): """ Return position. """ self.update() return self.position def normalize(self, pos): """ Return pos normalized between -1.0 and 1.0. """ return 2 * (pos - self.posmin) / (self.posmax - self.posmin) - 1 def getNormalized(self): """ Return position normalized between -1.0 and 1.0. """ self.update() return self.normalize(self.position) def addCallback(self, c, *args): """ Call c(position, timestamp, *args) whenever the position changes. This axis' reference to c will be weak. """ self.callbacks[c] = args def __mul__(self, other): """ """ return ScaledAxis(self, other) Axis.__module__ = "pyepl.mechinput" # cope with pyrex bug class ScaledAxis(Axis): """ A virtual Axis whose position is always equal to the position of a source Axis times a constant. """ def __init__(self, axis, scale, rscale = None, name = None): """ Create ScaledAxis based on axis with specified scale. """ if name == None: name = "ScaledAxis (%s * %f)" % (axis.name, scale) else: name = name if rscale is None: rscale = scale Axis.__init__(self, name, axis.posmin * scale, axis.posmax * scale) self.axis = axis self.scale = scale self.rscale = rscale self.cb = MethodCallback(self.callback) axis.addCallback(self.cb) self.parents = (axis,) def callback(self, position, timestamp): """ This method accepts information from the source axis. """ if position > 0: self.setPosition(position * self.scale, timestamp) else: self.setPosition(position * self.rscale, timestamp) ScaledAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class AxisScaledAxis(Axis): """ """ def __init__(self, axis1, axis2, name = None): """ """ if name == None: name = "AxisScaledAxis (%s * %s)" % (axis1, axis2) else: name = name Axis.__init__(self, name, axis1.posmin * axis2.posmin, axis1.posmax * axis2.posmax) self.axis1 = axis1 self.axis2 = axis2 self.cb = MethodCallback(self.callback) axis1.addCallback(self.cb) axis2.addCallback(self.cb) self.parents = (axis1, axis2) def callback(self, position, timestamp): """ """ self.setPosition(self.axis1.getPosition() * self.axis2.getPosition()) AxisScaledAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug def getPosMin(x): return x.posmin def getPosMax(x): return x.posmax class JointAxis(Axis): """ A virtual Axis whose position is always equal to the sum of its source axes. Its normalized position is always equal to the mean of the normalized positions of it source axes. """ def __init__(self, *axes): """ Arguments are taken as source axes. """ Axis.__init__(self, "JointAxis", min(map(getPosMin, axes)), max(map(getPosMax, axes))) self.axes = axes self.cb = MethodCallback(self.callback) self.positions = [] for n, axis in enumerate(axes): axis.addCallback(self.cb, n) self.positions.append(0.0) self.parents = axes self.sum = 0.0 def callback(self, position, timestamp, n): """ Callback used for communication with source axes. """ self.sum = self.sum + (position - self.positions[n]) self.positions[n] = position self.setPosition(self.sum, timestamp) JointAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class ThrottledAxis(Axis): """ """ def __init__(self, axis, maxVel = None, maxAccel = None, name = None): """ """ if name == None: name = "ThrottledAxis from %s" % axis.name else: name = name Axis.__init__(self, name, axis.posmin, axis.posmax) self.axis = axis self.lasttime = timing.now() self.lastpos = axis.getPosition() self.lastspeed = 0.0 self.maxVel = maxVel self.maxAccel = maxAccel self.cb = MethodCallback(self.callback) axis.addCallback(self.cb) self.parents = (axis,) def halt(self): """ """ self.lastspeed = 0.0 self.lastpos = 0.0 def update(self): """ """ self.callback(self.axis.getPosition(), (timing.now(), long(0))) def callback(self, position, timestamp): """ """ thistime = timestamp[0] interval = thistime - self.lasttime if not interval: return speed = (position - self.lastpos) / interval accel = (speed - self.lastspeed) / interval if not self.maxAccel is None: if accel > self.maxAccel: speed = self.lastspeed + (self.maxAccel * interval) elif accel < -self.maxAccel: speed = self.lastspeed - (self.maxAccel * interval) if not self.maxVel is None: if speed > self.maxVel: speed = self.maxVel elif speed < -self.maxVel: speed = -self.maxVel position = self.lastpos + (speed * interval) self.setPosition(position, timestamp) self.lasttime = thistime self.lastpos = position self.lastspeed = speed ThrottledAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class RollerAxis(Axis): """ A virtual Axis whose position is controlled by the movement of a Roller. """ def __init__(self, roller, min = -1.0, max = 1.0, start = 0.0, name = None): """ Create RollerAxis from roller. min, max, and start may be used to specify minimum position, maximum position, and starting position, respectively. """ if name == None: name = "RollerAxis from %s" % roller.name else: name = name Axis.__init__(self, name, min, max) self.roller = roller self.min = min self.max = max self.setPosition(start) self.cb = MethodCallback(self.callback) roller.addCallback(self.cb) def callback(self, delta): """ Callback for communicating with the attached roller. """ newpos = self.getPosition() + delta if newpos > max: newpos = max elif newpos < min: newpos = min self.setPosition(newpos) def getPosition(self): """ Update roller first! """ self.roller.update() return Axis.getPosition(self) RollerAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class AxisRoller(Roller): """ Roller whose rate of change is controlled by the position of an axis. """ def __init__(self, axis, speedfactor = 1.0, backwardspeedfactor = None, name = None): """ Create AxisRoller from axis with specified speedfactor (defaults to 1.0). Speedfactor units are roller units per millisecond per axis unit. """ if name == None: name = "AxisRoller from %s" % axis.name else: name = name if backwardspeedfactor is None: backwardspeedfactor = speedfactor Roller.__init__(self, name) self.axis = axis self.speedfactor = speedfactor self.backwardspeedfactor = backwardspeedfactor self.lasttime = timing.now() def update(self): """ Update the change for this roller in a time-consistent manner. """ Roller.update(self) thistime = timing.now() elapsed = thistime - self.lasttime if elapsed: norm = self.axis.getNormalized() if norm > 0: self.move(elapsed * self.speedfactor * norm) else: self.move(elapsed * self.backwardspeedfactor * norm) self.lasttime = thistime AxisRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug def derivativeAxis(axis, speedfactor = 1.0, min = -1.0, max = 1.0, start = 0.0, name = None): """ Get an axis whose position's rate of change is proportional to the position of the input axis within min and max absolute position boundaries. """ if name == None: name = "Axis derived from %s" % axis.name else: name = name return RollerAxis(AxisRoller(axis, speedfactor), min, max, start, name) class AxisScaledRoller(Roller): """ Movement of parent roller scaled by the normalized position of the parent axis and a constant (factor). """ def __init__(self, roller, axis, factor = 1.0, name = None): """ Create AxisScaledRoller. """ if name == None: name = "AxisScaledRoller (%s * %s * %f)" % (roller.name, axis.name, factor) else: name = name Roller.__init__(self, name) self.roller = roller self.parents = [roller] self.axis = axis self.factor = factor self.cb = MethodCallback(self.callback) roller.addCallback(self.cb) def callback(self, delta): """ Callback for communicating with the attached roller. """ self.move(delta * self.axis.getNormalized() * self.factor) AxisScaledRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class Button: """ Abstraction to any on/off input component. """ def __init__(self, name = None): """ Set up housekeeping. """ if name == None: self.name = repr(self) else: self.name = name self.callbacks = WeakKeyDictionary() # callback -> args self.pressed = False self.presstime = None def __getstate__(self): """ Don't give pickle hardware states. """ return self.name, self.callbacks # return self.name def __setstate__(self, state): """ Reset hardware states when unpickled. """ self.name, self.callbacks = state # self.name = state self.pressed = False self.presstime = None def __and__(self, x): """ And operator creates a ButtonCombo. """ return ButtonCombo(self, x) def __or__(self, x): """ Or operator creates an EitherCombo. """ return EitherButton(self, x) def setPressed(self, p, timestamp = None): """ Set the pressed state of this button (True or False). """ if p != self.pressed: if timestamp == None: timestamp = (timing.now(), long(0)) self.presstime = timestamp self.pressed = p for c, args in self.callbacks.items(): c(p, timestamp, *args) def isPressed(self): """ Return True if pressed. Otherwise return False. """ return self.pressed def wait(self, clk = None, pressed = True): """ Wait until this button's pressed state matches the argument pressed. Returns the time at which the state matched. If clk is supplied (a PresentationClock), it will be updated to the time at which the state became matching. """ while pressed != self.pressed: hardware.pollEvents() if clk: clk.tare(self.presstime) return self.presstime def addCallback(self, c, *args): """ Call c(pressed, timestamp, *args) whenever the state changes. This button's reference to c will be weak. """ self.callbacks[c] = args Button.__module__ = "pyepl.mechinput" # cope with pyrex bug class ButtonCombo(Button): """ Vitrual button that is considered pressed when a combination of other buttons is pressed. """ def __init__(self, *combo): """ Create ButtonCombo. Arguments of buttons to be included in the combination. """ Button.__init__(self, "Button combination (AND)") self.state = [] self.combo = combo self.cb = MethodCallback(self.callback) for n, button in enumerate(combo): button.addCallback(self.cb, n) self.state.append(button.isPressed()) def callback(self, pressed, timestamp, n): """ Callback used for communication with the buttons which are a part if this combination. """ self.state[n] = pressed if False in self.state: self.setPressed(False, timestamp) else: self.setPressed(True, timestamp) ButtonCombo.__module__ = "pyepl.mechinput" # cope with pyrex bug class EitherButton(Button): """ Virtual button this is considered pressed when any one of a set of other buttons is pressed. """ def __init__(self, *set): """ Create EitherButton. Arguments of buttons to be included in the set. """ Button.__init__(self, "Button set (OR)") self.state = [] self.set = set self.cb = MethodCallback(self.callback) for n, button in enumerate(set): button.addCallback(self.cb, n) self.state.append(button.isPressed()) def callback(self, pressed, timestamp, n): """ Callback used for communication with the buttons which are a part if this set. """ self.state[n] = pressed if True in self.state: self.setPressed(True, timestamp) else: self.setPressed(False, timestamp) EitherButton.__module__ = "pyepl.mechinput" # cope with pyrex bug class NotchRoller(Roller): """ Roller whose position is changed in discreet amounts upon the depression of certain buttons. """ def __init__(self, *buttonamounts): """ Constructor takes any number of 2-tuples: (Button, amount). """ Roller.__init__(self, "NotchRoller") self.buttonamounts = buttonamounts self.cb = MethodCallback(self.callback) for buttonamount in buttonamounts: buttonamount[0].addCallback(self.cb, buttonamount[1]) def callback(self, pressed, timestamp, amount): """ Callback used for communication with the Buttons. """ if pressed: self.move(amount) NotchRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class ButtonRoller(Roller): """ Roller whose rate of change is controlled by two buttons. """ def __init__(self, inc_button, dec_button, speed = 1.0, backspeed = None, name = None): """ Create ButtonRoller where inc_button being pressed causes positive movement at speed roller units per millisecond and dec_button being pressed causes negative movement at speed roller units per millisecond. """ if name is None: name = "ButtonRoller from %s and %s" % (inc_button.name, dec_button.name) else: name = name if backspeed is None: backspeed = speed Roller.__init__(self, name) self.inc_button = inc_button self.dec_button = dec_button self.speed = speed self.backspeed = backspeed self.lasttime = timing.now() def update(self): """ Update the Roller's movement in a time-consistent manner. """ Roller.update(self) thistime = timing.now() elapsed = thistime - self.lasttime if elapsed: if(self.inc_button.isPressed()): self.move(elapsed * self.speed) if(self.dec_button.isPressed()): self.move(elapsed * -self.backspeed) self.lasttime = thistime ButtonRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class ButtonAxis(Axis): """ Axis whose position is controlled by two buttons. """ def __init__(self, high_button, low_button, magnitude = 1.0, lmagnitude = None, name = None, minpos = -1.0, maxpos = 1.0): """ Create ButtonAxis where pressing high_button sets the axis position to magnitude. Pressing low_button sets the position to negative magnitude. Both or neither button sets the position to 0.0. """ if name == None: name = "ButtonAxis from %s and %s" % (high_button.name, low_button.name) else: name = name if lmagnitude is None: lmagnitude = magnitude Axis.__init__(self, name, minpos, maxpos) self.high_button = high_button self.low_button = low_button self.magnitude = magnitude self.lmagnitude = lmagnitude self.cb = MethodCallback(self.callback) high_button.addCallback(self.cb) low_button.addCallback(self.cb) def callback(self, pressed, timestamp): """ Callback to communicate with buttons. """ if self.high_button.isPressed(): value = self.magnitude else: value = 0 if self.low_button.isPressed(): value = value - self.lmagnitude self.setPosition(value, timestamp) ButtonAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class AxisButton(Button): """ Button which is considered pressed when a certain axis' position falls within a certain range and not otherwise. """ def __init__(self, axis, low = 0.9, high = 1.0, name = None): """ Create AxisButton from axis such that this Button is considered pressed when the position of axis falls between low and high. """ if name == None: name = "AxisButton from %s" % (axis.name) else: name = name Button.__init__(self, name) self.axis = axis self.low = low self.high = high self.cb = MethodCallback(self.callback) axis.addCallback(self.cb) def callback(self, position, timestamp): """ Callback used to communicate with the axis. """ if self.low <= self.axis.normalize(position) <= self.high: self.setPressed(True, timestamp) else: self.setPressed(False, timestamp) AxisButton.__module__ = "pyepl.mechinput" # cope with pyrex bug class ChooserIter: def __init__(self, chooser): self.chooser = chooser self.iterators = [iter(self.chooser.items)] def next(self): while True: try: r = self.iterators[-1].next() except StopIteration: self.iterators.pop() continue except IndexError: raise StopIteration if isinstance(r, self.chooser.__class__): self.iterators.append(iter(r)) continue break return r ChooserIter.__module__ = "pyepl.mechinput" # cope with pyrex bug class Chooser: """ Super-class for input component choosers. """ def __init__(self, *items): """ Initialize. """ self.items = items self.chosen = None self.timestamp = None def __and__(self, x): """ And operator produces a Chooser including the mechanical input abstraction objects from both operands. """ return self.__class__(self, x) def __iter__(self): """ Get all items in this Chooser, including items within child Choosers. """ return ChooserIter(self) def choose(self, chosen, timestamp): """ Indicate that an item has been chosen. """ self.chosen = chosen self.timestamp = timestamp def waitChoice(self, minDuration=None, maxDuration=None, clock=None): """ Wait for an item to be chosen. """ if clock: startTime = clock.get() else: startTime = hardware.universal_time() # set up minDuration if minDuration: # will wait for minDuration before accepting key presses minStart = minDuration + startTime else: minStart = startTime # see if set up maxTime if maxDuration: stopTime = startTime + maxDuration else: stopTime = 0 # wait for a keypress that occured after start of wait while (self.chosen is None) or (self.timestamp[0] < minStart): if maxDuration and stopTime <= hardware.universal_time(): # we had a max duration, so break break hardware.pollEvents() chosen = self.chosen timestamp = self.timestamp # if nothing chosen or we are not in the correct range if timestamp is None or timestamp[0]= self.minTime and \ (self.maxTime is None or timestamp[0] < self.maxTime): self.choose(b, timestamp) FirstButtonChooser.__module__ = "pyepl.mechinput" # cope with pyrex bug class AxisChooser(Chooser): """ This class represents a set of axes. It can be used to determine which axis, out of the set, has been moved to indicate deliberate selection. """ def __init__(self, *axes): """ Constructs AxisChooser from a list of possible Axes and other AxisChoosers. """ Chooser.__init__(self, *axes) self.extrema = [] self.cb = MethodCallback(self.callback) for n, a in enumerate(self): a.addCallback(self.cb, n, a) self.extrema.append([0, 0]) def wait(self): """ Wait until an axis has been moved to within ten percent of both unit extremes. Return the axis that first meets this criterion. """ self.reset() return self.waitChange()[0] def reset(self): """ Forget any movement accumulated so far. """ for n in xrange(len(self.extrema)): self.extrema[n] = [0, 0] def callback(self, position, timestamp, n, a): """ Callback used to get information from axes. """ nposition = a.normalize(position) if nposition < self.extrema[n][0]: self.extrema[n][0] = nposition elif nposition > self.extrema[n][1]: self.extrema[n][1] = nposition if self.extrema[n][0] < -0.9 and self.extrema[n][1] > 0.9: self.choose(a, timestamp) AxisChooser.__module__ = "pyepl.mechinput" # cope with pyrex bug class RollerChooser(Chooser): """ This class represents a set of rollers. It can be used to determine which roller, out of the set, has been moved to indicate deliberate selection. """ def __init__(self, *rollers): """ Constructs RollerChooser from a list of possible Rollers and other RollerChoosers. """ Chooser.__init__(self, *rollers) self.totals = [] self.cb = MethodCallback(self.callback) for n, r in enumerate(self): r.addCallback(self.cb, n, r) self.totals.append(0.0) def wait(self): """ Wait until a roller has been moved five times as much as any other roller in the set and at least ten units. Return that roller. """ self.reset() return self.waitChoice()[0] def reset(self): """ Forget any movement accumulated so far. """ for n in xrange(len(self.totals)): self.totals[n] = 0.0 def callback(self, amount, n, r): """ Callback used to get information from rollers. """ self.totals[n] = self.totals[n] + amount for x in self.totals: if self.totals[n] > 10 and (self.totals[n] < (x * 5)): return self.choose(r, None) RollerChooser.__module__ = "pyepl.mechinput" # cope with pyrex bug pyepl-1.1.0+git12-g365f8e3/code/mechinput.pyx000066400000000000000000000776441127617341700204370ustar00rootroot00000000000000# PyEPL: mechinput.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. # PyEPL: mechinput.pyx # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See LICENSE.TXT that came with this file. # # v. 1.12 Wed Apr 28 15:41:50 2004 """ This module provides a layer of abstraction to the input data of mechanical input devices (i.e. mouse, keyboard, joystick). """ from repository import WeakKeyDictionary, MethodCallback import sys import timing import hardware class Roller: """ Abstraction to any continuous motion component without bounds. """ def __init__(self, name = None): """ Set up housekeeping. """ if name == None: self.name = repr(self) else: self.name = name self.callbacks = WeakKeyDictionary() # callback -> args self.counter = 0.0 self.parents = () def __mul__(self, x): """ Return a ScaledRoller. """ return ScaledRoller(self, x) __rmul__ = __mul__ def move(self, amount): """ Add to cumulative change in position. INPUT ARGS: amount- The amount to move (arbitrary units). """ if amount: self.counter = self.counter + amount for c, args in self.callbacks.items(): c(amount, *args) def update(self): # to be overridden """ Keep the value up to date. """ for parent in self.parents: parent.update() def getChange(self): """ Get cumulative change since last getChange (or since initialization). """ self.update() c = self.counter self.counter = 0.0 return c def addCallback(self, c, *args): """ Call c(change, *args) whenever the position changes. This Roller's reference to c will be weak. """ self.callbacks[c] = args def echo(self): """ Return an EchoRoller of this Roller. """ return EchoRoller(self) Roller.__module__ = "pyepl.mechinput" # cope with pyrex bug class EchoRoller(Roller): """ """ def __init__(self, roller): """ """ Roller.__init__(self, "EchoRoller for %s" % roller.name) self.roller = roller self.parents = (roller,) self.cb = MethodCallback(self.move) roller.addCallback(self.cb) def echo(self): """ Return an EchoRoller of this Roller. """ return EchoRoller(self.roller) EchoRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class ThrottledRoller(Roller): """ Roller based on another Roller, but throttled by a maximum velocity and/or a maximum acceleration. """ def __init__(self, roller, maxAccel = None, maxVel = None, name = None): """ Create a ThrottledRoller with maxAccel roller units per millisecond per millisecond maximum acceleration and maxVel roller units per millisecond maximum velocity. None for either of those values means that the constraint will not be applied. """ if name == None: name = "ThrottledRoller from %s" % roller.name else: name = name Roller.__init__(self, name) self.roller = roller self.parents = [roller] self.maxAccel = maxAccel self.maxVel = maxVel self.accum = 0.0 self.lastvelocity = 0.0 self.lasttime = timing.now() self.cb = MethodCallback(self.callback) roller.addCallback(self.cb) def update(self): """ Keep the value up to date. """ Roller.update(self) self.callback(0.0) def callback(self, change): """ Callback used to communicate with parent Roller. The parent roller passes the amount that it is changeing to the callback. """ thistime = timing.now() elapsed = thistime - self.lasttime if not elapsed: self.accum = self.accum + change return change = change + self.accum self.accum = 0.0 thisvelocity = change / elapsed if self.maxAccel: if abs(thisvelocity - self.lastvelocity) / elapsed > self.maxAccel: if thisvelocity < self.lastvelocity: thisvelocity = self.lastvelocity - self.maxAccel * elapsed else: thisvelocity = self.lastvelocity + self.maxAccel * elapsed if self.maxVel: if thisvelocity > self.maxVel: thisvelocity = self.maxVel elif thisvelocity < -self.maxVel: thisvelocity = -self.maxVel self.lasttime = thistime self.lastvelocity = thisvelocity self.move(thisvelocity * elapsed) ThrottledRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class ScaledRoller(Roller): """ Roller based on another roller such that all positive motion is proportional to all positive motion in the parent and all negative motion is proportional to all motion of the parent. """ def __init__(self, roller, scale, reverse_scale = None, name = None): """ Create ScaledRoller with 'scale' and optionally different 'reverse_scale'. """ if name == None: name = "ScaledRoller from %s" % roller.name else: name = name Roller.__init__(self, name) if reverse_scale == None: self.reverse_scale = scale else: self.reverse_scale = reverse_scale self.forward_scale = scale self.roller = roller self.parents = [roller] self.cb = MethodCallback(self.callback) roller.addCallback(self.cb) def callback(self, change): """ Callback used to communicate with parent Roller. """ if change < 0: self.move(change * self.reverse_scale) else: self.move(change * self.forward_scale) ScaledRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class JointRoller(Roller): """ Roller whose motion equals the sum of the motions of certain other Rollers. """ def __init__(self, *rollers): """ Create JointRoller based on rollers. """ Roller.__init__(self, "JointRoller") self.rollers = rollers self.parents = rollers self.cb = MethodCallback(self.move) for roller in rollers: roller.addCallback(self.cb) JointRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class Axis: """ Abstraction to any continuous motion component with bounds. """ def __init__(self, name = None, posmin = -1.0, posmax = 1.0): """ Set up housekeeping. """ if name == None: self.name = repr(self) else: self.name = name self.callbacks = WeakKeyDictionary() # callback -> args self.position = 0.0 self.posmin = posmin self.posmax = posmax self.parents = () def halt(self): # To be overridden pass def setPosition(self, p, timestamp = None): """ Set the position of this axis between 1.0 and -1.0. """ if p != self.position: if timestamp == None: timestamp = (timing.now(), long(0)) self.position = p for c, args in self.callbacks.items(): c(p, timestamp, *args) def update(self): # to be overridden """ Keep the value up to date. """ for parent in self.parents: parent.update() def getPosition(self): """ Return position. """ self.update() return self.position def normalize(self, pos): """ Return pos normalized between -1.0 and 1.0. """ return 2 * (pos - self.posmin) / (self.posmax - self.posmin) - 1 def getNormalized(self): """ Return position normalized between -1.0 and 1.0. """ self.update() return self.normalize(self.position) def addCallback(self, c, *args): """ Call c(position, timestamp, *args) whenever the position changes. This axis' reference to c will be weak. """ self.callbacks[c] = args def __mul__(self, other): """ """ return ScaledAxis(self, other) Axis.__module__ = "pyepl.mechinput" # cope with pyrex bug class ScaledAxis(Axis): """ A virtual Axis whose position is always equal to the position of a source Axis times a constant. """ def __init__(self, axis, scale, rscale = None, name = None): """ Create ScaledAxis based on axis with specified scale. """ if name == None: name = "ScaledAxis (%s * %f)" % (axis.name, scale) else: name = name if rscale is None: rscale = scale Axis.__init__(self, name, axis.posmin * scale, axis.posmax * scale) self.axis = axis self.scale = scale self.rscale = rscale self.cb = MethodCallback(self.callback) axis.addCallback(self.cb) self.parents = (axis,) def callback(self, position, timestamp): """ This method accepts information from the source axis. """ if position > 0: self.setPosition(position * self.scale, timestamp) else: self.setPosition(position * self.rscale, timestamp) ScaledAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class AxisScaledAxis(Axis): """ """ def __init__(self, axis1, axis2, name = None): """ """ if name == None: name = "AxisScaledAxis (%s * %s)" % (axis1, axis2) else: name = name Axis.__init__(self, name, axis1.posmin * axis2.posmin, axis1.posmax * axis2.posmax) self.axis1 = axis1 self.axis2 = axis2 self.cb = MethodCallback(self.callback) axis1.addCallback(self.cb) axis2.addCallback(self.cb) self.parents = (axis1, axis2) def callback(self, position, timestamp): """ """ self.setPosition(self.axis1.getPosition() * self.axis2.getPosition()) AxisScaledAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug def getPosMin(x): return x.posmin def getPosMax(x): return x.posmax class JointAxis(Axis): """ A virtual Axis whose position is always equal to the sum of its source axes. Its normalized position is always equal to the mean of the normalized positions of it source axes. """ def __init__(self, *axes): """ Arguments are taken as source axes. """ Axis.__init__(self, "JointAxis", min(map(getPosMin, axes)), max(map(getPosMax, axes))) self.axes = axes self.cb = MethodCallback(self.callback) self.positions = [] for n, axis in enumerate(axes): axis.addCallback(self.cb, n) self.positions.append(0.0) self.parents = axes self.sum = 0.0 def callback(self, position, timestamp, n): """ Callback used for communication with source axes. """ self.sum = self.sum + (position - self.positions[n]) self.positions[n] = position self.setPosition(self.sum, timestamp) JointAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class ThrottledAxis(Axis): """ """ def __init__(self, axis, maxVel = None, maxAccel = None, name = None): """ """ if name == None: name = "ThrottledAxis from %s" % axis.name else: name = name Axis.__init__(self, name, axis.posmin, axis.posmax) self.axis = axis self.lasttime = timing.now() self.lastpos = axis.getPosition() self.lastspeed = 0.0 self.maxVel = maxVel self.maxAccel = maxAccel self.cb = MethodCallback(self.callback) axis.addCallback(self.cb) self.parents = (axis,) def halt(self): """ """ self.lastspeed = 0.0 self.lastpos = 0.0 def update(self): """ """ self.callback(self.axis.getPosition(), (timing.now(), long(0))) def callback(self, position, timestamp): """ """ thistime = timestamp[0] interval = thistime - self.lasttime if not interval: return speed = (position - self.lastpos) / interval accel = (speed - self.lastspeed) / interval if not self.maxAccel is None: if accel > self.maxAccel: speed = self.lastspeed + (self.maxAccel * interval) elif accel < -self.maxAccel: speed = self.lastspeed - (self.maxAccel * interval) if not self.maxVel is None: if speed > self.maxVel: speed = self.maxVel elif speed < -self.maxVel: speed = -self.maxVel position = self.lastpos + (speed * interval) self.setPosition(position, timestamp) self.lasttime = thistime self.lastpos = position self.lastspeed = speed ThrottledAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class RollerAxis(Axis): """ A virtual Axis whose position is controlled by the movement of a Roller. """ def __init__(self, roller, min = -1.0, max = 1.0, start = 0.0, name = None): """ Create RollerAxis from roller. min, max, and start may be used to specify minimum position, maximum position, and starting position, respectively. """ if name == None: name = "RollerAxis from %s" % roller.name else: name = name Axis.__init__(self, name, min, max) self.roller = roller self.min = min self.max = max self.setPosition(start) self.cb = MethodCallback(self.callback) roller.addCallback(self.cb) def callback(self, delta): """ Callback for communicating with the attached roller. """ newpos = self.getPosition() + delta if newpos > max: newpos = max elif newpos < min: newpos = min self.setPosition(newpos) def getPosition(self): """ Update roller first! """ self.roller.update() return Axis.getPosition(self) RollerAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class AxisRoller(Roller): """ Roller whose rate of change is controlled by the position of an axis. """ def __init__(self, axis, speedfactor = 1.0, backwardspeedfactor = None, name = None): """ Create AxisRoller from axis with specified speedfactor (defaults to 1.0). Speedfactor units are roller units per millisecond per axis unit. """ if name == None: name = "AxisRoller from %s" % axis.name else: name = name if backwardspeedfactor is None: backwardspeedfactor = speedfactor Roller.__init__(self, name) self.axis = axis self.speedfactor = speedfactor self.backwardspeedfactor = backwardspeedfactor self.lasttime = timing.now() def update(self): """ Update the change for this roller in a time-consistent manner. """ Roller.update(self) thistime = timing.now() elapsed = thistime - self.lasttime if elapsed: norm = self.axis.getNormalized() if norm > 0: self.move(elapsed * self.speedfactor * norm) else: self.move(elapsed * self.backwardspeedfactor * norm) self.lasttime = thistime AxisRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug def derivativeAxis(axis, speedfactor = 1.0, min = -1.0, max = 1.0, start = 0.0, name = None): """ Get an axis whose position's rate of change is proportional to the position of the input axis within min and max absolute position boundaries. """ if name == None: name = "Axis derived from %s" % axis.name else: name = name return RollerAxis(AxisRoller(axis, speedfactor), min, max, start, name) class AxisScaledRoller(Roller): """ Movement of parent roller scaled by the normalized position of the parent axis and a constant (factor). """ def __init__(self, roller, axis, factor = 1.0, name = None): """ Create AxisScaledRoller. """ if name == None: name = "AxisScaledRoller (%s * %s * %f)" % (roller.name, axis.name, factor) else: name = name Roller.__init__(self, name) self.roller = roller self.parents = [roller] self.axis = axis self.factor = factor self.cb = MethodCallback(self.callback) roller.addCallback(self.cb) def callback(self, delta): """ Callback for communicating with the attached roller. """ self.move(delta * self.axis.getNormalized() * self.factor) AxisScaledRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class Button: """ Abstraction to any on/off input component. """ def __init__(self, name = None): """ Set up housekeeping. """ if name == None: self.name = repr(self) else: self.name = name self.callbacks = WeakKeyDictionary() # callback -> args self.pressed = False self.presstime = None def __getstate__(self): """ Don't give pickle hardware states. """ return self.name, self.callbacks # return self.name def __setstate__(self, state): """ Reset hardware states when unpickled. """ self.name, self.callbacks = state # self.name = state self.pressed = False self.presstime = None def __and__(self, x): """ And operator creates a ButtonCombo. """ return ButtonCombo(self, x) def __or__(self, x): """ Or operator creates an EitherCombo. """ return EitherButton(self, x) def setPressed(self, p, timestamp = None): """ Set the pressed state of this button (True or False). """ if p != self.pressed: if timestamp == None: timestamp = (timing.now(), long(0)) self.presstime = timestamp self.pressed = p for c, args in self.callbacks.items(): c(p, timestamp, *args) def isPressed(self): """ Return True if pressed. Otherwise return False. """ return self.pressed def wait(self, clk = None, pressed = True): """ Wait until this button's pressed state matches the argument pressed. Returns the time at which the state matched. If clk is supplied (a PresentationClock), it will be updated to the time at which the state became matching. """ while pressed != self.pressed: hardware.pollEvents() if clk: clk.tare(self.presstime) return self.presstime def addCallback(self, c, *args): """ Call c(pressed, timestamp, *args) whenever the state changes. This button's reference to c will be weak. """ self.callbacks[c] = args Button.__module__ = "pyepl.mechinput" # cope with pyrex bug class ButtonCombo(Button): """ Vitrual button that is considered pressed when a combination of other buttons is pressed. """ def __init__(self, *combo): """ Create ButtonCombo. Arguments of buttons to be included in the combination. """ Button.__init__(self, "Button combination (AND)") self.state = [] self.combo = combo self.cb = MethodCallback(self.callback) for n, button in enumerate(combo): button.addCallback(self.cb, n) self.state.append(button.isPressed()) def callback(self, pressed, timestamp, n): """ Callback used for communication with the buttons which are a part if this combination. """ self.state[n] = pressed if False in self.state: self.setPressed(False, timestamp) else: self.setPressed(True, timestamp) ButtonCombo.__module__ = "pyepl.mechinput" # cope with pyrex bug class EitherButton(Button): """ Virtual button this is considered pressed when any one of a set of other buttons is pressed. """ def __init__(self, *set): """ Create EitherButton. Arguments of buttons to be included in the set. """ Button.__init__(self, "Button set (OR)") self.state = [] self.set = set self.cb = MethodCallback(self.callback) for n, button in enumerate(set): button.addCallback(self.cb, n) self.state.append(button.isPressed()) def callback(self, pressed, timestamp, n): """ Callback used for communication with the buttons which are a part if this set. """ self.state[n] = pressed if True in self.state: self.setPressed(True, timestamp) else: self.setPressed(False, timestamp) EitherButton.__module__ = "pyepl.mechinput" # cope with pyrex bug class NotchRoller(Roller): """ Roller whose position is changed in discreet amounts upon the depression of certain buttons. """ def __init__(self, *buttonamounts): """ Constructor takes any number of 2-tuples: (Button, amount). """ Roller.__init__(self, "NotchRoller") self.buttonamounts = buttonamounts self.cb = MethodCallback(self.callback) for buttonamount in buttonamounts: buttonamount[0].addCallback(self.cb, buttonamount[1]) def callback(self, pressed, timestamp, amount): """ Callback used for communication with the Buttons. """ if pressed: self.move(amount) NotchRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class ButtonRoller(Roller): """ Roller whose rate of change is controlled by two buttons. """ def __init__(self, inc_button, dec_button, speed = 1.0, backspeed = None, name = None): """ Create ButtonRoller where inc_button being pressed causes positive movement at speed roller units per millisecond and dec_button being pressed causes negative movement at speed roller units per millisecond. """ if name is None: name = "ButtonRoller from %s and %s" % (inc_button.name, dec_button.name) else: name = name if backspeed is None: backspeed = speed Roller.__init__(self, name) self.inc_button = inc_button self.dec_button = dec_button self.speed = speed self.backspeed = backspeed self.lasttime = timing.now() def update(self): """ Update the Roller's movement in a time-consistent manner. """ Roller.update(self) thistime = timing.now() elapsed = thistime - self.lasttime if elapsed: if(self.inc_button.isPressed()): self.move(elapsed * self.speed) if(self.dec_button.isPressed()): self.move(elapsed * -self.backspeed) self.lasttime = thistime ButtonRoller.__module__ = "pyepl.mechinput" # cope with pyrex bug class ButtonAxis(Axis): """ Axis whose position is controlled by two buttons. """ def __init__(self, high_button, low_button, magnitude = 1.0, lmagnitude = None, name = None, minpos = -1.0, maxpos = 1.0): """ Create ButtonAxis where pressing high_button sets the axis position to magnitude. Pressing low_button sets the position to negative magnitude. Both or neither button sets the position to 0.0. """ if name == None: name = "ButtonAxis from %s and %s" % (high_button.name, low_button.name) else: name = name if lmagnitude is None: lmagnitude = magnitude Axis.__init__(self, name, minpos, maxpos) self.high_button = high_button self.low_button = low_button self.magnitude = magnitude self.lmagnitude = lmagnitude self.cb = MethodCallback(self.callback) high_button.addCallback(self.cb) low_button.addCallback(self.cb) def callback(self, pressed, timestamp): """ Callback to communicate with buttons. """ if self.high_button.isPressed(): value = self.magnitude else: value = 0 if self.low_button.isPressed(): value = value - self.lmagnitude self.setPosition(value, timestamp) ButtonAxis.__module__ = "pyepl.mechinput" # cope with pyrex bug class AxisButton(Button): """ Button which is considered pressed when a certain axis' position falls within a certain range and not otherwise. """ def __init__(self, axis, low = 0.9, high = 1.0, name = None): """ Create AxisButton from axis such that this Button is considered pressed when the position of axis falls between low and high. """ if name == None: name = "AxisButton from %s" % (axis.name) else: name = name Button.__init__(self, name) self.axis = axis self.low = low self.high = high self.cb = MethodCallback(self.callback) axis.addCallback(self.cb) def callback(self, position, timestamp): """ Callback used to communicate with the axis. """ if self.low <= self.axis.normalize(position) <= self.high: self.setPressed(True, timestamp) else: self.setPressed(False, timestamp) AxisButton.__module__ = "pyepl.mechinput" # cope with pyrex bug class ChooserIter: def __init__(self, chooser): self.chooser = chooser self.iterators = [iter(self.chooser.items)] def next(self): while True: try: r = self.iterators[-1].next() except StopIteration: self.iterators.pop() continue except IndexError: raise StopIteration if isinstance(r, self.chooser.__class__): self.iterators.append(iter(r)) continue break return r ChooserIter.__module__ = "pyepl.mechinput" # cope with pyrex bug class Chooser: """ Super-class for input component choosers. """ def __init__(self, *items): """ Initialize. """ self.items = items self.chosen = None self.timestamp = None def __and__(self, x): """ And operator produces a Chooser including the mechanical input abstraction objects from both operands. """ return self.__class__(self, x) def __iter__(self): """ Get all items in this Chooser, including items within child Choosers. """ return ChooserIter(self) def choose(self, chosen, timestamp): """ Indicate that an item has been chosen. """ self.chosen = chosen self.timestamp = timestamp def waitChoice(self): """ Wait for an item to be chosen. """ while self.chosen is None: hardware.pollEvents() chosen = self.chosen timestamp = self.timestamp self.chosen = None self.timestamp = None return chosen, timestamp Chooser.__module__ = "pyepl.mechinput" # cope with pyrex bug class ButtonChooser(Chooser): """ This class represents a set of buttons. It can be used to determine which button, out of the set, has been pressed. """ def __init__(self, *buttons): """ Constructs ButtonChooser from a list of possible Buttons and other ButtonChoosers. """ Chooser.__init__(self, *buttons) self.cb = MethodCallback(self.callback) for n, b in enumerate(self): b.addCallback(self.cb, n, b) def waitWithTime(self): """ Wait until a button is _newly_ pressed. Return a 2-tuple of the Button and the time at which it was pressed. """ return self.waitChoice() def wait(self): """ Like wait_with_time, but returns only the Button object. """ return self.waitWithTime()[0] def callback(self, pressed, timestamp, n, b): """ Callback used to get information from buttons. """ if pressed: self.choose(b, timestamp) ButtonChooser.__module__ = "pyepl.mechinput" # cope with pyrex bug class AxisChooser(Chooser): """ This class represents a set of axes. It can be used to determine which axis, out of the set, has been moved to indicate deliberate selection. """ def __init__(self, *axes): """ Constructs AxisChooser from a list of possible Axes and other AxisChoosers. """ Chooser.__init__(self, *axes) self.extrema = [] self.cb = MethodCallback(self.callback) for n, a in enumerate(self): a.addCallback(self.cb, n, a) self.extrema.append([0, 0]) def wait(self): """ Wait until an axis has been moved to within ten percent of both unit extremes. Return the axis that first meets this criterion. """ self.reset() return self.waitChange()[0] def reset(self): """ Forget any movement accumulated so far. """ for n in xrange(len(self.extrema)): self.extrema[n] = [0, 0] def callback(self, position, timestamp, n, a): """ Callback used to get information from axes. """ nposition = a.normalize(position) if nposition < self.extrema[n][0]: self.extrema[n][0] = nposition elif nposition > self.extrema[n][1]: self.extrema[n][1] = nposition if self.extrema[n][0] < -0.9 and self.extrema[n][1] > 0.9: self.choose(a, timestamp) AxisChooser.__module__ = "pyepl.mechinput" # cope with pyrex bug class RollerChooser(Chooser): """ This class represents a set of rollers. It can be used to determine which roller, out of the set, has been moved to indicate deliberate selection. """ def __init__(self, *rollers): """ Constructs RollerChooser from a list of possible Rollers and other RollerChoosers. """ Chooser.__init__(self, *rollers) self.totals = [] self.cb = MethodCallback(self.callback) for n, r in enumerate(self): r.addCallback(self.cb, n, r) self.totals.append(0.0) def wait(self): """ Wait until a roller has been moved five times as much as any other roller in the set and at least ten units. Return that roller. """ self.reset() return self.waitChoice()[0] def reset(self): """ Forget any movement accumulated so far. """ for n in xrange(len(self.totals)): self.totals[n] = 0.0 def callback(self, amount, n, r): """ Callback used to get information from rollers. """ self.totals[n] = self.totals[n] + amount for x in self.totals: if self.totals[n] > 10 and (self.totals[n] < (x * 5)): return self.choose(r, None) RollerChooser.__module__ = "pyepl.mechinput" # cope with pyrex bug pyepl-1.1.0+git12-g365f8e3/code/mouse.py000066400000000000000000000226141127617341700173660ustar00rootroot00000000000000# PyEPL: mouse.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides access to the mouse. """ import weakref from textlog import LogTrack from base import UniquelyConstructed import hardware import mechinput import timing class MouseButton(UniquelyConstructed, mechinput.Button): """ Button representing a mouse button. """ waiting = [] def __uinit__(self, buttonnum): """ Construct MouseButton. INPUT ARGS: buttonnum- mouse button this object should correspond to """ mechinput.Button.__init__(self, "Mouse button %d" % buttonnum) self.buttonnum = buttonnum track = MouseTrack.lastInstance() if track: track.assignButton(self, buttonnum) else: MouseButton.waiting.append(self) def __setstate__(self, state): """ Attach to MouseTrack upon unpickling. """ self.__dict__.update(state) track = MouseTrack.lastInstance() if track: track.assignButton(self, self.buttonnum) else: MouseButton.waiting.append(self) def __getstate__(self): """ """ d = self.__dict__.copy() try: del d["track"] except KeyError: pass return d class MouseAxis(UniquelyConstructed, mechinput.Axis): """ Axis representing a mouse axis. MouseAxis represents a mouse's position on the screen. """ waiting = [] def __uinit__(self, axisnum): """ Construct MouseAxis. INPUT ARGS: axisnum- mouse axis this object should correspond to """ mechinput.Axis.__init__(self, "Mouse axis %d" % axisnum, 0, mousetrack.screensize[axisnum]) self.axisnum = axisnum track = MouseTrack.lastInstance() if track: track.assignAxis(self, axisnum) else: MouseAxis.waiting.append(self) def __setstate__(self, state): """ Attach to MouseTrack upon unpickling. """ self.__dict__.update(state) track = MouseTrack.lastInstance() if track: track.assignAxis(self, self.axisnum) else: MouseAxis.waiting.append(self) def __getstate__(self): """ """ d = self.__dict__.copy() try: del d["track"] except KeyError: pass return d class MouseRoller(UniquelyConstructed, mechinput.Roller): """ Roller representing a mouse axis. Mouserollers represent a mouse's relative movement. It differs from a MouseAxis because it is NOT limited by the edges of the screen. """ waiting = [] def __uinit__(self, axisnum): """ Construct MouseRoller. INPUT ARGS: rollernum- mouse roller this object should correspond to """ mechinput.Roller.__init__(self, "Roller for mouse axis %d" % axisnum) self.axisnum = axisnum track = MouseTrack.lastInstance() if track: track.assignRoller(self, axisnum) else: MouseRoller.waiting.append(self) def __setstate__(self, state): """ Attach to MouseTrack upon unpickling. """ self.__dict__.update(state) track = MouseTrack.lastInstance() if track: track.assignRoller(self, self.axisnum) else: MouseRoller.waiting.append(self) def __getstate__(self): """ """ d = self.__dict__.copy() try: del d["track"] except KeyError: pass return d class MouseTrack(LogTrack): """ A Track for mouse input. """ trackTypeName = "MouseTrack" logExtension = ".mouselog" def __init__(self, basename, archive = None, autoStart = True): """ Create the MouseTrack. INPUT ARGS: basename- filename base for mouse log. archive- OPTIONAL directory to put logfile in. autoStart- (default is True) If False, does startService and startLogging are not called and must be done manually. """ LogTrack.__init__(self, basename, archive, autoStart) self.buttons = weakref.WeakValueDictionary() self.axes = weakref.WeakValueDictionary() self.rollers = weakref.WeakValueDictionary() for x in MouseButton.waiting: self.assignButton(x, x.buttonnum) MouseButton.waiting = [] for x in MouseAxis.waiting: self.assignAxis(x, x.axisnum) MouseAxis.waiting = [] for x in MouseRoller.waiting: self.assignRoller(x, x.axisnum) MouseRoller.waiting = [] def startService(self): """ Starts the mouse service. """ self.screensize = hardware.getMouseRange() self.screensize = (float(self.screensize[0]), float(self.screensize[1])) hardware.setMouseCallbacks(self.move_callback, self.button_callback) def stopService(self): """ Starts the mouse service. """ hardware.setMouseCallbacks(None, None) def button(self, buttonnum): """ Return a Button object mapped to the button specified. Identical to calling MouseButton's constructor. """ try: return self.buttons[buttonnum] except KeyError: return MouseButton(buttonnum) def assignButton(self, button, buttonnum): """ Internal use only. Send all events for indicated mouse button to button object. """ self.buttons[buttonnum] = button def getButtons(self): """ Return a 3-tuple of the the mouse buttons. OUTPUT ARGS: buttons- a 3-tuple of the button objects on this mouse. """ return self.button(1), self.button(2), self.button(3) def axis(self, axisnum): """ Return an Axis object mapped to the axis specified. This is identical to calling MouseAxis directly! """ try: return self.axes[axisnum] except KeyError: return MouseAxis(axisnum) def assignAxis(self, axis, axisnum): """ Internal use only. Send all events for indicated mouse axis to axis object. """ self.axes[axisnum] = axis def getAxes(self): """ Return a 2-tuple of the X and Y axes. OUTPUT ARGS: axes- a 2-tuple of the two mouse axes objects. """ return self.axis(0), self.axis(1) def roller(self, axisnum): """ Return an Roller object mapped to the axis specified. Same as calling MouseRoller's constructor directly. """ try: return self.rollers[axisnum] except KeyError: return MouseRoller(axisnum) def assignRoller(self, roller, axisnum): """ Internal use only. Send all events for indicated mouse axis to roller object. """ self.rollers[axisnum] = roller def getRollers(self): """ Return a 2-tuple of the X and Y rollers (mapped to the axes). OUTPUT ARGS: axes- a 2-tuple of the two mouse Roller objects. """ return self.roller(0), self.roller(1) def mouseButtonChooser(self): """ Return a ButtonChooser object for all mouse buttons. OUTPUT ARGS: bc- a ButtonChooser object """ return mechinput.ButtonChooser(*self.getButtons()) def mouseAxisChooser(self): """ Return an AxisChooser object for both mouse axes. OUTPUT ARGS: ac- an AxisChooser object """ return mechinput.AxisChooser(*self.getAxes()) def mouseRollerChooser(self): """ Return a RollerChooser object for both mouse rollers. OUTPUT ARGS: rc- a RollerChooser object """ return mechinput.RollerChooser(*self.getRollers()) setPosition = staticmethod(hardware.setMousePosition) setVisibility = staticmethod(hardware.setMouseVisibility) def button_callback(self, buttonnum, pressed, timestamp): """ For internal use only. This callback is called for every mouse button event. """ if pressed: self.logMessage("P\t%d" % buttonnum, timestamp) else: self.logMessage("R\t%d" % buttonnum, timestamp) try: self.buttons[buttonnum].setPressed(pressed, timestamp) except KeyError: pass def move_callback(self, pos, rel, timestamp): """ For internal use only. This callback is called for every mouse movement event. """ self.logMessage("M\t%s\t%s" % (pos, rel), timestamp) try: self.axes[0].setPosition(pos[0], timestamp) except KeyError: pass try: self.axes[1].setPosition(pos[1], timestamp) except KeyError: pass try: self.rollers[0].move(rel[0]) except KeyError: pass try: self.rollers[1].move(rel[1]) except KeyError: pass pyepl-1.1.0+git12-g365f8e3/code/pool.py000066400000000000000000000444731127617341700172160ustar00rootroot00000000000000# PyEPL: pool.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides tools for manipulating collections of stimuli. """ import sound import display from exceptions import BadFileExtension from base import MediaFile import os import copy import random import itertools IMAGE_EXTS = ["bmp", "png", "jpg", "jpeg", "tif", "xpm"] TEXT_EXTS = ["txt"] def compoundCompare(x, y, *attr): """ Loops through the specified attributes for x and y and returns the result of comparing them. Will return the first time the comparison is not equal to zero. INPUT ARGS: x and y- Two objects to compare. *attr- List of attributes to compare. """ for a in attr: r = cmp(getattr(x, a), getattr(y, a)) if r != 0: return r return 0 class PoolDict(dict): """ Dictionary where you can access the values as attributes. """ def copy(self): """ Like the copy method of dict, but returns a PoolDict. """ return PoolDict(self) def __getattr__(self, name): """ Get a value from the dictionary as an attribute. INPUT ARGS: name- name of the dictionary entry OUTPUT ARGS: val- value of that entry. """ try: return self[name] except KeyError: raise AttributeError, name def __setattr__(self, name, value): """ Set a value in the dictionary as an attribute. INPUT ARGS: name- name of the dictionary entry val- value of that entry. """ self[name] = value def __delattr__(self, name): """ Delete a value from the dictionary as an attribute. INPUT ARGS: name- name of the dictionary entry to delete """ try: del self[name] except KeyError: raise AttributeError, name def __eq__(self, other): """ PoolDicts are equal if they are the same object OR, it they have the same "name" attribute. """ try: return self.name == other.name except AttributeError: try: return dict.__eq__(other) except TypeError: return False class Pool(list): """ An ordered collection of PoolDicts. """ def __init__(self, *tdicts, **ddicts): """ Create the Pool. The first argument can optionally be a string containing a path to a file or directory from which stimuli should be read. All remaining positional arguments will initially populate the Pool in order. They will be followed by the values of all keyword arguments, where the name of each keyword argument has been included in the corresponding value as the attribute "name". INPUT ARGS: tdicts- PoolDicts to initially populate the pool, excepting the first item, if it is a string, in which case it will be used as a path to a file or directory from which to read stimuli ddicts- PoolDicts to initially populate the pool where the name attributes will be taken from the names of the keyword arguments """ list.__init__(self) self.SOUND_EXTS = sound.formatDict.keys() if len(tdicts) and isinstance(tdicts[0], str): self.loadFromSourcePath(tdicts[0]) tdicts = tdicts[1:] for d in tdicts: list.append(self, PoolDict(d)) for name, d in ddicts.iteritems(): d = PoolDict(d) d.name = name list.append(self, d) def loadFromSourcePath(self, sourcepath): """ """ if os.path.isdir(sourcepath): # is a directory, loop over files for stimfile in os.listdir(sourcepath): # strip off filename and extension name, ext = os.path.splitext(stimfile) ext = ext.lower() if not name or not ext: continue # process based on extension ext = ext[1:] try: stimobj = self.findBy(name = name) except LookupError: stimobj = self.append(name = name) if ext == "dummy": pass elif ext in self.SOUND_EXTS: stimobj.content = sound.FileAudioClip(os.path.abspath(os.path.join(sourcepath, stimfile)), format=ext) elif ext in IMAGE_EXTS: stimobj.content = display.Image(os.path.abspath(os.path.join(sourcepath, stimfile))) elif ext in TEXT_EXTS: # load file as a textpool #stimobj.content = display.Text(open(os.path.abspath(os.path.join(sourcepath, stimfile))).read()) stimobj.content = TextPool(os.path.abspath(os.path.join(sourcepath,stimfile))) else: raise BadFileExtension, ext else: # assumes text file for line in open(sourcepath, "r"): textval = line.strip() self.append(name = textval, content = display.Text(textval)) def append(self, actualpooldict = None, **items): """ Append a pooldir to a pool, returning the new one. INPUT ARGS: item- the pooldir to add to the pool. """ if actualpooldict: if not isinstance(actualpooldict, PoolDict): raise TypeError, "Pools may only contain PoolDicts" if len(items): items.update(actualpooldict) r = PoolDict(**items) else: r = actualpooldict else: r = PoolDict(**items) list.append(self, r) return r def insert(self, n, actualpooldict = None, **items): """ Inserts a pooldir into the pool at a specified position. INPUT ARGS: n- the position in pool to add the specified pooldir items- the pooldir to add to the pool. """ if actualpooldict: if len(items): items.update(actualpooldict) r = PoolDict(**items) else: r = actualpooldict else: r = PoolDict(**items) list.insert(self, n, r) return r def extend(self, p): """ Adds the contents of another pool to this pool's contents. INPUT ARGS: p- the new pool whose contents will be added to this pool """ l = list(p) for x in l: if not isinstance(x, PoolDict): raise ValueError, "Pools may only contain PoolDicts" list.extend(self, l) def uniqueExtend(self, other): """ Like extend, but do not append items when an equal item is already in the Pool. """ # for each item in the source list... for x in other: # ...check if it's already in the target list if not x in self: if not isinstance(x, PoolDict): raise ValueError, "Pools may only contain PoolDicts" # if not, add it self.append(x) def __getitem__(self, index): """ Retrieves the PoolDir(s) at the specified index. If a slice of indices is specified, multiple PoolDirs are returned in the form of another pool. INPUT ARGS: index- the index of the desired PoolDir. This can be a slice (referencing multiple PoolDirs). OUTPUT ARGS: The PoolDir at the specified index. If the user specified a slice of indices, then the PoolDirs for those indices are returned as a single Pool object """ r = list.__getitem__(self, index) if isinstance(r, list): return Pool(*r) return r def __getslice__(self, i, j): """ """ return Pool(*list.__getslice__(self, i, j)) def __setitem__(self, index, value): """ Sets the value of the PoolDir at the specified index INPUT ARGS: index- index of Pooldir to modify value- PoolDir to be set at that position. """ if isinstance(index, slice): for v in value: if not isinstance(v, PoolDict): raise TypeError, "Pools may only contain PoolDicts" if not isinstance(value, PoolDict): raise TypeError, "Pools may only contain PoolDicts" list.__setitem__(self, index, value) def __setslice__(self, i, j, values): """ """ for v in values: if not isinstance(v, PoolDict): raise TypeError, "Pools may only contain PoolDicts" list.__setslice__(self, i, j, values) def __add__(self, other): """ """ return Pool(*list.__add__(self, other)) def iterAttr(self, *attr): """ """ if len(attr) == 1: for x in self: yield getattr(x, attr[0]) else: for x in self: yield tuple(map(lambda ga: getattr(x, ga), attr)) def shuffle(self): """ Shuffles the order of the PoolDirs in this pool """ random.shuffle(self) def randomChoice(self): """ Return a random element from the Pool. """ return random.choice(self) def sample(self, k = None): """ Returns a random non-repeating sample of the PoolDirs in this pool. INPUT ARGS: k- number of samples requested. (if omitted, k is set to the number of items in the pool) OUTPUT ARGS: sample- a Pool object containing a random sample of the elements in the Pool """ if k is None: k = len(self) return Pool(*random.sample(self, k)) def sortBy(self, *attr): """ Orders the PoolDirs in the Pool by the specified attribute(s). attr- A list of strings containing the names of the attributes to sort the PoolDirs by. The PoolDirs are sorted in the order the attributes are specified in. """ list.sort(self, lambda x, y: compoundCompare(x, y, *attr)) def sort(self): """ Sort the stimuli by the name attribute. """ self.sortBy("name") def iterFindBy(self, **attrvalues): """ Generate all PoolDicts in this Pool for which the pairings between name and value given in this call's keyword arguments are all true. """ for d in self: for name, value in attrvalues.iteritems(): try: if getattr(d, name) != value: break except AttributeError: break else: yield d def findAllBy(self, **attrvalues): """ Return a Pool of the results from iterFindBy. """ return Pool(*self.iterFindBy(**attrvalues)) def findBy(self, **attrvalues): """ Return the first PoolDict found by a call to iterFindBy with the same arguments. Raises a LookupError, if no match is found. """ try: return self.iterFindBy(**attrvalues).next() except StopIteration: raise LookupError, "No matching PoolDict found (%r)" % attrvalues def removeBy(self, **attrvalues): """ Remove all PoolDicts in this Pool for which the pairings between name and value given in this call's keyword arguments are all true. """ removelist = [] for d in self.iterFindBy(**attrvalues): removelist.append(d) for d in removelist: self.remove(d) def makeTexts(self, sourceattr = "name", targetattr = "text", font = None, size = None, color = None): """ For every PoolDict in this Pool which has an attribute named as the string sourceattr, create a new attribute named as the string targetattr whose value is a Text object made a string version of the value of the existing attribute. """ for d in self: try: setattr(d, targetattr, display.Text(str(getattr(d, sourceattr)), font = font, size = size, color = color)) except AttributeError: pass def middleDepthCopy(self): """ Return a copy of this Pool containing shallow copies of the contained PoolDicts. """ r = Pool() for d in self: r.append(d.copy()) return r class ImagePool(Pool): """ Pool subclass for images. """ def __init__(self, dirname, xscale=None, yscale=None, *tdicts, **ddicts): """ Constructor assumes it will at least receive a directory from which to load images, and optionally scale factor(s) to apply to all images in the directory. """ list.__init__(self) self.loadFromSourcePath(dirname, xscale, yscale) for d in tdicts: list.append(self, PoolDict(d)) for name, d in ddicts.iteritems(): d = PoolDict(d) d.name = name list.append(self, d) def loadFromSourcePath(self, sourcepath, xscale, yscale): """ """ if os.path.isdir(sourcepath): for stimfile in os.listdir(sourcepath): name, ext = os.path.splitext(stimfile) ext = ext.lower() if not name or not ext: continue try: stimobj = self.findBy(name = name) except LookupError: stimobj = self.append(name = name) if ext == ".dummy": pass elif ext[1:] in IMAGE_EXTS: if xscale: if yscale: stimobj.content = display.Image(os.path.abspath(os.path.join(sourcepath, stimfile)), xscale, yscale) else: stimobj.content = display.Image(os.path.abspath(os.path.join(sourcepath, stimfile)), xscale, xscale) elif yscale: stimobj.content = display.Image(os.path.abspath(os.path.join(sourcepath, stimfile)), yscale, yscale) else: stimobj.content = display.Image(os.path.abspath(os.path.join(sourcepath, stimfile))) else: raise BadFileExtension, ext else: raise ValueError("Directory %s not found." % sourcepath) class TextPool(Pool): """ Pool subclass for text. """ def __init__(self, fileordir, size=None, color=None, font=None, *tdicts, **ddicts): """ Constructor assumes it will at least receive a directory from which to load images, and optionally scale factor(s) to apply to all images in the directory. """ list.__init__(self) self.loadFromSourcePath(fileordir, size, color, font) for d in tdicts: list.append(self, PoolDict(d)) for name, d in ddicts.iteritems(): d = PoolDict(d) d.name = name list.append(self, d) def loadFromSourcePath(self, sourcepath, size, color, font): """ """ if os.path.isdir(sourcepath): for stimfile in os.listdir(sourcepath): name, ext = os.path.splitext(stimfile) ext = ext.lower() if not name or not ext: continue try: stimobj = self.findBy(name = name) except LookupError: stimobj = self.append(name = name) if ext == ".dummy": pass elif ext[1:] in TEXT_EXTS: # load text file as TextPool stimobj.content = TextPool(os.path.abspath(os.path.join(sourcepath,stimfile))) #stimobj.content = display.Text(open(os.path.abspath(os.path.join(sourcepath, stimfile))).read(), size=size, color=color, font=font) else: raise BadFileExtension, ext else: for line in open(sourcepath, "r"): textval = line.strip() self.append(name = textval, content = display.Text(textval, size=size, color=color, font=font)) class SoundPool(Pool): """ Pool subclass for soundfiles. """ def __init__(self, dirname, *tdicts, **ddicts): """ """ self.SOUND_EXTS = sound.formatDict.keys() self.soundArgs = copy.copy(sound.defaultFileSettings) # always set format based of file extensions: soundFields = self.soundArgs.keys() del self.soundArgs['format'] list.__init__(self) self.loadFromSourcePath(dirname) for d in tdicts: list.append(self, PoolDict(d)) for name, d in ddicts.iteritems(): print name print soundFields if name not in soundFields: d = PoolDict(d) d.name = name list.append(self, d) else: self.soundArgs[name] = d def loadFromSourcePath(self, sourcepath): """ """ if os.path.isdir(sourcepath): for stimfile in os.listdir(sourcepath): name, ext = os.path.splitext(stimfile) ext = ext.lower() if not name or not ext: continue ext = ext[1:] try: stimobj = self.findBy(name = name) except LookupError: stimobj = self.append(name = name) if ext == "dummy": pass elif ext in self.SOUND_EXTS: self.soundArgs['format'] = ext stimobj.content = sound.FileAudioClip(os.path.abspath(os.path.join(sourcepath, stimfile)), self.soundArgs) else: raise BadFileExtension, ext else: raise ValueError("Directory %s not found." % sourcepath) pyepl-1.1.0+git12-g365f8e3/code/reposinit.py000066400000000000000000000006611127617341700202500ustar00rootroot00000000000000# PyEPL: reposinit.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This package implements the EPL data repository system. """ import transarchive import os import repository pyepl-1.1.0+git12-g365f8e3/code/repository.py000066400000000000000000000044551127617341700204600ustar00rootroot00000000000000# PyEPL: repository.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ The repository module. """ import weakref nopickle = [] class WeakRef: """ An extension of the ref class that can be pickled. """ def __init__(self, *targs, **dargs): """ """ self.r = weakref.ref(*targs, **dargs) def __getattr__(self, name): """ """ return getattr(self.r, name) def __getstate__(self): """ """ return self.r() def __setstate__(self, state): """ """ self.r = weakref.ref(state) class WeakKeyDictionary(weakref.WeakKeyDictionary): """ An extension of the WeakKeyDictionary class that can be pickled. """ def __getstate__(self): """ Returns a regular dictionary version of the WeakKeyDictionary. """ global nopickle d = dict(self) for key, value in d.items(): if type(key) in nopickle: del d[key] return d def __setstate__(self, state): """ Constructs WeakKeyDictionary from state dictionary. """ weakref.WeakKeyDictionary.__init__(self, state) class WeakValueDictionary(weakref.WeakValueDictionary): """ An extension of the WeakValueDictionary class that can be pickled. """ def __getstate__(self): """ Returns a regular dictionary version of the WeakKeyDictionary. """ global nopickle d = dict(self) for key, value in d.items(): if type(value) in nopickle: del self[key] return dict(self) def __setstate__(self, state): """ Constructs WeakKeyDictionary from state dictionary. """ weakref.WeakValueDictionary.__init__(self, state) class MethodCallback: """ """ def __init__(self, m): """ """ self.name = m.im_func.__name__ self.obj = m.im_self def __call__(self, *targs, **dargs): """ """ getattr(self.obj, self.name)(*targs, **dargs) pyepl-1.1.0+git12-g365f8e3/code/repospool.py000066400000000000000000000111631127617341700202550ustar00rootroot00000000000000# PyEPL: repospool.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. import pyepl from repository import ReposDir, ReposRef import random def compoundCompare(x, y, *attr): """ """ for a in attr: r = cmp(getattr(x, a), getattr(y, a)) if r != 0: return r return 0 class ReposPool: """ """ def __init__(self, repos = None, size = 0): """ """ if repos: self.repos = repos else: self.repos = pyepl.repository.mainRepository self.pool = [None for x in xrange(size)] def append(self): """ """ r = self.repos.newDir() self.pool.append(r) return r def insert(self, n): """ """ r = self.repos.newDir() self.pool.insert(n, r) return r def extend(self, p): """ """ if not isinstance(p, ReposPool): raise ValueError, "ReposPool can only be extended with another ReposPool" self.pool.extend(p) def __getitem__(self, index): """ """ return self.pool[index] def __delitem__(self, index): """ """ del self.pool[index] def __len__(self): """ """ return len(self.pool) def __iter__(self): """ """ return iter(self.pool) def iterAttr(self, *attr): """ """ if len(attr) == 1: for x in self: yield getattr(x, attr[0]) else: for x in self: yield tuple(map(lambda ga: getattr(x, ga), attr)) def shuffle(self): """ """ random.shuffle(self.pool) def reverse(self): """ """ self.pool.reverse() def sortBy(self, *attr): """ """ self.pool.sort(lambda x, y: compoundCompare(x, y, *attr)) class ReposList: """ """ def __init__(self, repos = None, lst = None): """ """ if repos: self.repos = repos else: self.repos = pyepl.repository.mainRepository if lst: self.lst = lst else: self.lst = [] def __len__(self): """ """ return len(self.lst) def __add__(self, other): """ """ return ReposList(self.repos, self.lst + other.lst) def __contains__(self, other): """ """ for x in self: if x == other: return True return False def __delitem__(self, index): """ """ del self.lst[index] def __cmp__(self, other): """ """ for n in xrange(min(len(self), len(other))): r = cmp(self[n], other[n]) if r != 0: return r return 0 def __iadd__(self, other): """ """ for x in other: self.append(x) def __getitem__(self, index): """ """ if isinstance(index, slice): return map(lambda c: c(), self.lst[index]) else: return self.lst[index]() def __setitem__(self, index, x): """ """ if isinstance(index, slice): self.lst[index] = map(lambda i: ReposRef(self.repos, i), x) else: self.lst[index] = ReposRef(self.repos, x) def append(self, obj): """ """ self.lst.append(ReposRef(self.repos, obj)) def count(self, obj): """ """ c = 0 for x in self.lst: if x.name == self.repos.getID(obj): c += 1 return c def extend(self, l): self += l def index(self, obj, start = None, stop = None): """ """ for n in xrange(start, stop): if self.lst[n].name == self.repos.getID(obj): return n return -1 def insert(self, index, obj): """ """ self.lst.insert(index, ReposRef(self.repos, obj)) def pop(self, n = None): """ """ return self.lst.pop(n)() def remove(self, obj): """ """ del self.lst[self.find(obj)] def reverse(self): """ """ self.lst.reverse() def sort(self, cmpfunc = None): """ """ if not cmpfunc: cmpfunc = cmp self.lst.sort(lambda x, y: cmpfunc(x(), y())) pyepl-1.1.0+git12-g365f8e3/code/resources/000077500000000000000000000000001127617341700176715ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/resources/icon.png000066400000000000000000001020131127617341700213240ustar00rootroot00000000000000‰PNG  IHDR–1:VŒbKGDÿÿÿ ½§“ pHYs  ­#½utIMEÔ7M}?è IDATxœì½w”fé]ßùy½oªÔ]¦óLõ$eÄ ÄX%¬„0ñ°k fAØÂ°Ç,&¶0Çkî ÌZX< „„RK£‘f4#M윪+‡7Ýð„ßþqߪNUÕ=A¤úžS§û}o~Þûû>¿üÀ&6±‰Mlb›øÚƒz¶o`Ͼ°ÀmÀ+ÖØþðYàpM<‹Ø$€¯ì¥p€ƒÀ]ƒÿàŸ¾»x*ø,)Ìw¶åÀÔS¾ÓMŒ1$Öb VK©ÕR”ª~fÁ9wž,/@ÀZCY:Ò4AkQZ‘& 6±ë^|n¹ä¾ãmÎÏŸ.97ïé_M §€ï¾ü•€M•óáû9>Upv®Xë2sT„ðq*"¸›ÊŒ8uÍÑÚÄua“ž~øQ€¯›hð׿r£-CŒB7b„ÑV•س|þô£ |à³Ë<>Y09uЮ±„Ûö6xÓ[8¸ãªD„¢(q¥Ciˆ| Š€ÔjiåŒ4¦ )êõÉDD8~!ç ÇÚ|öñÞõ$%}øªPã&ž6 ๻¨„ÿeP©üŸý½[¹iWººCŒ‚RêšÂ¿î?žñ{–yï§—˜Yräî*•œÛö6xÕm#¼òÖ!ÆZ¶øÈúJ+Š¢D+…µ›TaE‰‚M,Éào=X!üBéd‘‡Î—œ÷|ét`®s•æ2|#› GO ›ðÜÆð%yüwÞÜäÏ~þ»Ç“ z2ÉÇ{,qïÑ>þB{M2ص%áŽCCìO¸}OB3Q(­PJá½§^«B%ÐF¥ MÓu£ "B¿—Q%"¬& ­hÞy’Ä2ÛÌõûr—/žì­žÿ7°<øü*¿A÷i ¯RlÀscPÔóƒwmá·~d7£-³ºQúE¤–(¬yò?¥óB¿Zõ‹ç93[òɇzœ˜*ø«{–yüüš6:7ßPãÆu¾õ…Cìß–¢P  øPå$ ƒëA¢ÐÏrD‘ƒ¢Äƒ1?ˆJÐlÔ±‰AiÃï¾’ûޝ+ãž*¬øß©‰›Q… °IÏMXàÏ€·B5óÿÃÿuèªò22½XÀŽ1½î,{-®"€Ò ÛGÖ>ÏýÇ3>ùp—}¡Ã#gsæ¯VÉØ·-妕ßàΛ‡iZnÚU#µë˜Q([ )zçW•´V ÖêõÚey ºo‘Ï>ÖafÙ!"ÌwÖ||ø`é Ë×6 ็1ªPߪ·ÿã¿uˆýÛÓ«v QXìF$ÂÖy’ ,â¼ R9»þ¹|>õp»ï]æK§r>óhoÝ}††‰]unÞÝàÅšìÚ’0ÖªÒŒcŒUþAzýl5ûЕc4$¶rvÖë5ÒÚEó§,Þ²~ÆT[XêE»v¢ßpÃpûžßxsƒ—h`lUÔtiucY:B¸ÒS:‡µ†"1Dlb > "cè;á}Ÿëò©ËÍÏEÁ×dä`“ž}쥪ëß ðãß>Îoýèî«…? ”Ý*Ñ[4±‘v‚$) l µÞáK§×ö'ìÙšøï¾s̾òÖ!êõ‹¾²(‰Qªâ&¥ƒ¢¦<+Vû¬Ô6ÔÒ„#Ç/äü?ÿ¸Ìlû2§áS%}Í¥oÀ³‹QÙüþÏ·íâíoÞ±öž>¢bArk »÷„©/P>²„P‡u<ìOy)ø(4SµJ>a 5k ÉÀĈˆ¬îç|¥}ÔSE³v¯TˆP:ì®Õlà/ µŒe¾ãù«Ï,sÏYÇ_ÿã½âbm#6Üqhȼæ%cÜQ£(ʪ¬Ù˜ÕœAAD)E’X¼«B’FW&Sé§æ<￷˱©Õðæð‡Àoñ5Dë{—6ñ•ÆAàÃyç[wñ/¿gáAI@Dt’»‹ÄEØU à© t•ùåâl¯”¢t‚ÑjÀ1Õ÷ËÝJ(æb³ªc7ò?¬<e@×KìÁ­¨f éÏ¡Ó!@ÃÂ׿¨ÁwÝÙ⟿n &>ýPÕ[ _D}ìBÎßq‰O>Üf¡mh†š–à 8õ´Ê¨'•© Tu0e#ºy‰ 9fK‰Ý»“pá‹„™ÇˆSŽÐÓ`,fkÕªÛÕ¼,0#ž—ÞžðÖ[º¼õŽ&;w[’†áø¹ªh¨›GÎÍ{>w¬ÏÇé3³èda¬e1¦ê“¨´Æ‡€6E•¡˜¦ vÔyõ GédÓ3"«ë'¼8ÊWqõá¦à†VìˆÂß/yÃËZü·ŸÛGRSè­MÂB†R)uåé@0¥+§•ªt§ ¹ÚPý/P8¡Q[;UØù*‡`ì•„ë9/«|¥×ËÈ:ôQ#ÝÌ—€žÀŸ¸›8«‰ª5 Z£bH Ê—¨f„o‘TQµÈñ3ž»ïÏøÜ£¼¯»fÞÁHSó’ýu^v Æ;ƆRÜ ¾Àh]…}Ž]Èøã¿›æÄôªo §Š|`ýÑyþb“žY|ð½ÀOo¯ÕüÏ70â-zÏü¹º1[·"sÓæP«Ovg0û¶3O,fL¡ZCø©n¥“¯ç……N¬Šq¬blèjM¡òòG¬Q†E ôBb®Ž.ÐË+U»Y×(*‡bbK€¨0û-¢¶ìGû!¢=ýQüä b;…V Y«Ñp.z"„ª²c”£ª.D!ò‰‡{üÇ¿çK§ó5Ëœ«xÍ [|ï7Œ`LU½¨µºZ(#Ëÿõ£³|úñË| ¼¯²pᦠðÌá_ ¼²^ÓÉûÞý-ju¶%vKTÑÍ:áÄ,f/¤/|ª¾¥»˜Ô»Ð-P¹ [½¥E˜ê•†A5Þ•¨ÞiÅHK]–õwéöĪk¦‡A–`é+'ߥ§RT£5”¥¢ÐËïÃwD—]T~º¡ƒÞnQµ!ð Äé@ð¶ÊiXo.Rª2sLõœ¨ \úY)úvlIyë«·ð³ßµyÍVìHI¬bfÉS¸ªgÂñé’ÎäÔ-ÜÙ@k]!QUe–yÁ×O ±{‹áÓƒ¦E/ÞDåh_ã·~Þ`“¾ò¨ÿøM@Õ¥þò—oàÕûzĶAL‚nÙ*.^«!…«È`ûVdaâøÃ¤/¾‘äæ·9=¹aÄHÌ2:‹D!Z£WTt‘Uu¼YÓk ÿAE.BzeÕ¡€Jâ#ºé0ÞQ³¤âPÓ H!Ä~¤˜ „î2fÿVìÖ7ûgñÇç¡VJ~ŒÕ{¤r3„A$b¸i¸ãæ&ßûªQþÙ·ñŠ[›|ô.Yi÷#÷̹çhŸVÝ26d©§Uc“•êCk ;F5¯¸eˆÓK½° ø>ª¼¯Š*ÃMøÊâªPß›ZuÍÿø×yõ¡!$· ,$÷  ÒÂÌYâ¹)Èö` =t²xŒðø<$½}½}Í2ybš€/1AÀ‡ŠP¨fKeUå_ ÂÊtvé4^z!„ʉçý`>¶b¥+]™v )èºF|DE‡VÄTt4¿þ…Ð[Æ6ê¤ÛÇл¶;†‡$7Œ#ÙñA\½*Jx¢F+R[9)/ÅJ„âÐ 5~òMÛªkŸ,èd‘N¸÷X—Ý¿ÄÙ¹çaç¨Eë*µ8„ÈpCsçM)óÈùE0BÕ™é(_õ›ð•Ã쀪×ßüú/¹±¹s«²k.Ó§+u6DÎ@¡1Öc¶B˜$žŸ!Î*Ìþ½(#Ø]ßM2Ö#É»ØÑ”‚ñfÜc†"‚xU ½PzLSC¿¬> èçB¬)p;¬D£µAåvï0²Ø¥Ðuj$ˆ÷Pì8¨á­Äåe-áÜ R*$óÄ¥>d¤T{ŒÎH_¾3ôFâÜiâ\F”AóiÂzk¬ÀÅ7ÞÖâÇ^3¾—íçþ/ÎÑË#1ÂÙ¹’ÏíòÑ/u˜iFêší£5jµî6´†‡Ï•8Le<¯KÝ$€¯ Þü7 ©'Šó}»øƒŸÜwuaÏpAXÎÀ$ºòïz’[^b?îÔ£@Jœ^DëŒØ9J˜&NåUmPÏcƵox=z×âÌIèGìžaT™¡“.f ¥3ìÄAâüˆ`•¯Bx¡â$D¡†RtÈ!­¡GZˆ+ wâ Z;ìÄ~ü‰óˆªJtUZi2h Æ Ñ@;Ñ[5zlŒX>@85M¹hp&Aéµý_ ЍR wRüÌ· ó‡÷R,,)œš)ùä£}r'ÜzC²ÚçðÐÎCu×ÏPõl8DÕ·áy‹Mxúqˆjføõ¼ŸóŽ'Ô±GVbîV!}O,áæO"K <˜5>J˜ž…%M4 À -([bv„à“g‘\£› º–`_4L2ñ–ø£³=f¨Ý².,“Ž×ð.RvõÑ OìDb·É-HQ ^¡š ÒɉY%øÊ€J-â¯ÅEè±·îÃŽ¾ž8ý(þtÎR™²X(@¥ª7¸Ö þ„!r1Š  ›Á£$»¥aÏž&ozAw¼ånÙSc¹85SåþŸ.99ãxñþ:#­ªÕÙÄ®ÝQ]-ü+È=–ˆþ$az™X¦HšºrKÄÊm±Q&áJÔïº!…¯üu*ªQGYOòÒ[1Ã)Òí:Õª^°¯Î|ë^û²a9›3¹à˜m>ò¥.sÏíûšh„±áŸy¬G¬Ü%oþÏÓŒÁMxú`©zøüò÷íä‡_3ŽbãûZX‰Ië–A•B>;‡2uLb xt­j™pa†¢cè{ƒ P¯iÀ"=MìDS+hCì qêq¡$Ä-µº¦YÓ4Òê˜Zº~82ay5ùZc©üÛj˜mäÅPΡGw¦– Ó Äù6’j|® ®=ã ßÿê-œ˜*yälŽœ™sœ÷Ü1Ñà†­uƆ,÷Uë/4û‡ŸÐüÁóŠ™0»¾µµ­y@ךû•M¶Dmj¢P¨(<Ûž¾ øq€w|ï~éûv‘Úk éªV¯¡û(´NPÚ€V=A‰%NÏ!mƒN°&º²ãµª^êKŒƒ8y¿Ô±he!±/ä9¤ µ^r øTÓó®ñœO¶<ù’§›Ê,àŠ^HQ4¬¦f5V_!ÄQ0£ ³s;a¦Þi< ÔàVÕ5s„*ÄWúª-úºš€šˆ2)AiìCØ]‡‰í gæˆ!›¢›¶Š¾¬s2ko~å(oxù_8ž1³ä™YöD /?4Ì»¼÷ÈüÊîËótôk{¥že>21B•“ýÀuChÝ”ž£!g¥OIZžŒ‰œe‘)ߣKrJ"‘uôѯ^KµjõDñƒwm®Oeu¡ªÂ†—ÆØ=ÞÀlßNøòYH4>‚ª'dK‘´VÃ$¥¡1¨XÅ×µVá‚&‹0<(vN(8%Œ¶.†Ï"ð™¦ç½#Ž)[eá5Jh0"šf µT¡­¡H5½¬¢Á Ø-uÂrÜŠBc,xWe^¯id´b¨ÁÅ<‡µ  ¤ÄÞ8 é(î¡IâlŸ>Œ¸%Ât—˜'èK,„˜¯/ü—â–¶ð®ÞÇÛþý\Xîð·÷-ñ¢-î¼yèºîý‰âð‘‰Ø4ÏUf‹Î÷Îç¡7S†ÞLúg ŸOÅXÎÊy¢ï!Oî}NÀá#7R…Y¾øV ˆ^:> ø,IJr׉}ד¾/ȽÇG!Vöh5¯yßzs—5@2ø3\lIÕüÛ  뤀-–\Þ™Ìóîù±ã@×§à 'cŒŠ¢Hèguz½yžâœ¥Óm)í¬äÞ“ÇxtjŽ>z±uà=uá;+R,núTµ×…ÃG&šÀÿüç&‹E7íÛ~6ödAB”Wh¦×…§™xðÃTUo×ÃnÏ=(’æÎä®´Ë¢vYT®½ï1´ù&ªŽ²cÿô®-üä·­®ˆ{©˜+U…¡s'´°®F ƒŒ=ïÑ:ƒªBqúŠb£q¯Î¡WÆÅ™‘Àg‡_lÚæ© |½€‘¹@«Ù^À¸×Œ+Ͷ†…–a®)kD¾Xä×A.ý†"»Ù²u\'=y7Ðs‘nˆìô ãuËp½r,!@á<5[u÷!I‰KRz@CªpŸFШš½J#ZĨ‰Q¢&Ëjt» ²Bè—Ÿ;¾ÄŸ|úAŽÍÌ_vœQ–T×ÈBÕ¯ðÎCCÌ.]¢ìš‚‡Ll¡j9ö× +P.‡½Éâl¾è.ä‹~¦X³ù¢,”‹,».]q")Šò‰‘ÀÓB‡LXªû—ÀKŸàádTŠnmƒ½\(ârôÒ—(™] « ƒVËJÑCÑUZ-£è!”(Jm•RFíVŠ7w^ïM™T7mSד¦jØšªÙ¦²Í0Tœã%DÞÍ@øüÛÇùÝÛMˆk×´TËv]l–ÑÏ+E£¶F\ˆ()Ñ[fÇvÔðîËg¹˜/_zÁJ¤6±e#å#óP«|…‚·ò\°kkƒi„¤ÒBhdB«Nß`(Óõµ“4jÈP;2\(¶"ìH;fÌjQ󯾢ÔÂǶ+Þk{ô®Qß# æÇ5‰J`ÚW¦NÑ…Ç*°Úb”Â&Š‘$;𨡔°˜ÚQUŽƒ®ÌÎí¸“sè–%fþ*v Mð4ÞÊ2¡×kÐé6øòÙ~÷ƒ÷plúò"¿ýÍÛ¹}ôÜ8òBú±ÍŸý·Lìªóÿ~dfe·ø½žõð‘‰o¤š0öo<*W#zYîO—góe¿/¸ùbÑÏ–Ëq&ÌGMGY¼8Õß3o>2ñ=À¿c»]]ìø<.ú^˜.;áœë…I× çÊN8ÍøÉbÑÏßöC;~³±=ùÞõ®ãzñÔܽûzSÅ™î…ât6]ž.æâùr‘ßa9æd”Ä Ô _=|dâ£JÚ¸føÓgqÁuüïÇÅècOb(ËYî 9¿Œb_ùþ¼ýÍ;HŒb½å:•º»^ILËËJko\ê+*¤/û'(P>p7Ò‚fuüJY®Q õØj7 ¬'Ëßîn9ÚWÌÀ6B½iv"#Ë‘-]aG©Ù© ;Ó„n ¸wã÷&íGt/V¤ª°_ÓhêV“šÊf/\åsxÃTäLƒßÛ^p2½öû8½U!¥A‚¯š~8Áx0¾ZéHI&”…nF!6]í3L.€VÄü’®J„´D¥c IDAT qÞàÅ9CéæÛðžOOñèùŒ{Ï2ÛÉ.þ^höÔoæ–¡;²[°*¡[´9Þ»å;5Sp|jµWÀS­E¸&™ø)àßú¯Èú\ï\ùPoº¼ÐŸ).d3åÙ|Ö_(dεYö9}J J"þŽ>2q€jeÖ7\±)„2Ε0ÝŸ-OtÎä'zSå™þ”;ẎóåBœ+—X }2)ñôˆ#·¦ª±-ùÆ®ÊèuºJUM'$JaT%ˆŠÁ¿† t÷«ŽÿÑá#;€ßØh?× çº“ÅÉl±œïÏ•ÓýéòüÒ}qw9ÅoH EàŸ¿i¿ð¿ì¼ž¡Z…ÄÛ³¢*@‰ñÒ‚i¦ç5ŒH¨"€@}UHqÇÚ|ª¥ø‹í9 öâ£+ ÙZóÑÅÀ¶ vÍmÙžZÆG-CµJÅþ;[Íú‚ª¤/ॊ:(PZ@"¹W(U]»t Eضw„_š‰¼s×Å0âz`i\3º¨P*T= pà EžÓ<´ ¦ˆ*AÙ4¨ÐC–Љ Wü%—Ïú!hŠ2Á9‹+-¥³,uûò¿ÿ72³|yã_¥4·ÝÉÞÚm¤ªˆà|IÐz®Z€x|ز}tU–—€³Ös ´âÿü³+6ÅèdÙõÂlÙñ3e7œeœU¨“ên2l%61iéf(ŹžŸ™_ª&£°$…,ãéâé“S>Q¯ÿ•x²á‹<ÜðÊw%/Ûá|ç\q´{>?Õ=ŸŸì/çSñL¹À”ë²32 ü•‚úêwï;ܰÑ5];,…<–! …ï†Ìõ¤ï22_Rôuw7úmàÛ×¼N'œ]>•?Ò=—ŸjŸ)ŽöÏ•'Ú†å<¿B$­'Šw¼yïxËþh¥hÖ>pù DA5RdÑá>ÿô¾=ÄYIÕÏ®“Eؙӎÿ²SørýrÎkö…¡ùÀÐB`h)²Íinª[ö4S¶5-­š&1Í3ÃOi.¨(UŒtHÑ4Œ¢n5u[õ%¸5QZÞòSý:¿6Ò¿æÔT$Ðß–’K-mb&P‹9$š¤ mEkA–Jª–ÚaµZˆšàõ`5E‘ zï-Ç.d|øs¼÷sg˜ï^\å¸i‡¯íæÆá²·q+yQ»ŒxIL5Æ€ Ž«ïôEÏ?Tp•ýøÈD‹ªùË/ýÞõâéÞdñhçl~¢s®8Ù›,Oå3þ\¹(\ŸEŸSPâpÈêßWOˆqË?dñ6@,;áøò±ì3³ùÉÎÙâdÿ|y¦˜Ón™Eߣ2rJüÉ9wmt]‰ô$ŠÅbÑb”%1VjÚjÁDY-غ&î~ÕqøÈįï¹r[Ù'Û§òGº“Å©î…òt>ïÎåS¡ï–øU¤Jñý•ÿuœŸ}ý(R¸ªTz½0˜áb#Ï«¡4yþ«“ÖJÇÍÄ!­ˆ,âcsˆ®ƒ5(µúƒˆÂgGïÞÉ.Ñv£³-³¡vd§×Ü`Sv4,Û[–‘š¡žèËBlœhnlíÃXÐìL;­e[j­éà|T™V fG³£J^:Ô^œ¬_{’Zn j.‡éº4444µ¦1ÙE#èº%I+Ë­ªA¨Â9Kž'eBQ¤E‚óï,y©x÷'åO?õèeײ*ebè¥ò²­¯¡nš*1 ¥/ɸ‚–Vš„Tßw³0÷.ªöU8|dbŒjµ¡W\r’˜/úÇÛ§ó£Ýóùéîùâdÿ|y2ŸçËEf}—v,Èq8Ê'nÇ?\7>21NUßþM+߉àòY÷Pûl~²s¾˜ïž+fû“åL1Ê%–B‡vÌÈq×TSîÚhcÈãB>ïOgÓîT>çÏ‹á¬ë0ås–ƒ£ \­U\ï£jèpóÊ®.,ŸÌwÏåçºç‹3ýéòt>N÷翈g?ýÖqþÕ/܈,ÏC'Á-T ,• ƒ¸ÈJ­¿5ë6ì¼*e<öæí$ß@yô¯ñ´YkÕ.i¢ÐþtKÉ? ]žó\Ë#[Ï{F–„Ѿ°;jnH«øúXÝÐJ«„›_Dˆƒ À:\H6~ßt)äFÈU$ šeH¼¢i55+D©/£*f½E8y¨‡oîèë"€R Þ‚Q8-"x£e 6¢Ö+% «pÞ0¿0Œs yž’Uß{Ãr?ð«ïÿ8Ÿ]ÝKºS¶^ÄžÚ­¬Ê‹>¥*Hm £-JéÕ:ŒÕߊjMŪv[V®ŽÙ§.}†ÃG&¶ÿ¼ä²gk‡Çºçócý©ütoª8•M—gÊÅ8íÚ,†˜ÑDñŸQá‡ë$€ÃG&våRµYðýÉòöÙüTw²8Ý;_Ϧܩb&ž+—™ =ºÑQ¢®K0¿u£®g£—B¼¸XH.™dR1f©N<á‰8Aî~ÕñpøÈÄ»€?(—±¥ãÙƒÝÉüL÷Byº?YžÊfÂéþüMÏæÜr6íæŠÙ8_.°ìÛtcNA \gAÎ]m”@ÇuBò˜ù,ö|?vbOz’QÆ '9ž’‹¿èuâîWï¼þïnü¥£ùpç|±ÐŸ.³Y×ÉgC¯ýyÞ.ž·#Ъiþìç`œÆï¢'E …è´ŠG÷ûÐzÉ'«~~aqA(˜Û èAØC{ðÇÞ²³kþñû G»°Í"%(W#NhÔWWü‘šðÛJÎ^!ü6Àøœg$´Ø¢Úl¯ ;E3Þ´ ×MåœÓ£ !Èj.‚D#Ž56~ïl.ØB°AU/ÊŠ«•wƒY9‚Ò³KH_úÄéûN‰ÙÿF|ë£ /M1 І hzh¡Òš¡Ä0\ÓƒÌ@MéïáüÒ§ÏîQ|þÔ$w?ðMÎÒ+.–ä7L‹—oû6^¶õ.¢D\(ñÁ%^õªDB D hmHªÒ¬I¨' êI“Û¶ÜÁ½s¾ô°K›‚þW8üBç˶ï»^È]?ä¾ó˜K.žœ@!~5¥üYõ4€ß§Z+í2¸N8ŸÏù3ýw:ŸõgŠ?é–dÎW6!÷ì®6†<. ÉEI© AY”®“è:V—$(“©†úðëN~ðН^IõÌ«¡ÍßûñÝÜ´§^Õœ$ ÑQ¹ÂiªÑ{dfPÚAó<ÑÕ(|‚6ÈÙåÊ®TuÊ/MR*Cktf쵄ô’—ìBo?ˆëž„"E?[­q—(‚ ¼k‡ãlýê¡Ü2Hæ Òò$­\3RÆF¶6,# s•Ú¤ªÂ³FatUö"ÝØ6oôbeƒ{!6`c¤>fIB²õª}˜QEtMPÐ[÷ï#,ÜKœE¬±>t„h«„)mÀ*E¢Õª•´BZS ‘?ÿ°ç‹§?ËÓ3«:+Ø^ßËK¶~ †nGEC;["HµXhˆ+¾“[bðIUÕ˜¹ÏaàôÓÊ µA+Q«.+ðz'ƒ…B™ø'À/¬õL®g\?ÌË~ª\ “n)N¹6ó¾K'dxf«V¯ÂºpøÈÄë©ÖH» e;œuý0ò0}\$Ð ¥ •˶*Íy:4€PÄ2ú؈NÒòHèãC†%^ñi —ŒqIn?ÀïüÐoû†&!m×X9G©E‚A$­û}@iJ1jVQO4A¬¦èjâCÀÒâ¹z¸Þv¢Å;ƒÅnÅå/Æ=_ZCø‡óHcÙÑj £™bL—Œ¨ZªÕo ÌEÛ»ê¸S Q%L 6TËÐèGšh¡%ŠºŠ¤[è-#èz‚œ_„D#QPE@Åþ±?%œiç ÒxÄR^GÖ»‚×i¡ôBdÑyJ/|æÑ>÷<Úç3ôxàdvÕ±FYnýz&F^ÌÄÈKñÁÑ+»ôŠ%J_Têü 2£”B+¬®B¢P•?„€Hd%ª% •Æê„+¢Ÿü@Cþ#Ö¢7Ám?òØNòXÄ\‚‰•›C"òl ?¬Cƒ$†w­wëbZ ¤Ñ‹‰1PO9×ÉlûßFû”ݰìz¡]vý²ë‡v(¤#™€ÁÃu›×Â]\"üßñú þÅ/ï#ÞwªššÔ:S˜R rW/¾# š¶ZH#Ì. Ð5KÃZð¸¥%”«ó€E¢B»:~9G·û¢š‚¨üçNM«r€ZCŒÐÕW íU×Ë…F_.Á->v´Ç¹³Ž#öégñÊè\•±×8ÄöÚ>´^ÈhmœFÒ Ä@ úE—ÜeøèYT µF+CbªÅC+NX‰Œâ%¾…Ïq¡DÔš¯ØÏkmðYœ*–ü\¾&]/ÌÆ—¢Ð¡59–H@žZ"ÏSÅzÀ[©Êv×B&\‚t£“ž/¤ç{Ò=²˜S‚r×+wm´Q‚ôB} ÅKe¦EQX…þž®Ùÿ0ðî•ÛÆ4þŸî"m$C§PýjñËk¦©‹3­5ŠúŠÖ(+϶n!âÙ‰€+Ñûv£†ÆXüÌQ”Mˆ þ3k'Ð4½Æ.t©Ï´‚¥…!ߣ>6‚œë`ZŠtû0áä"É­ãøÇgÑc5šYNÖ3HÉz<¶½ÅF¯žéGŒ×ÔiÄÓhˆ‚(°Éj†¢N#âüÔzÄRòXÆ$:IÅK¢ Õ‰ª©TÚ’Å:N B~]>€»6Úèsi»^Xt0_vã¼o‡Y·ÌLè³(ŽR"ñiXÝpUkç1€ýã–ýú8õÓÅMìDôuer‹@7«^”¡ÆýëVó¨þèÑÏaÓ”^wïtÌ­S­ÐX(i-{šÁ0¤4Cu½°Lº+µFBkk‚Ì-ƒ1¸£ ˆN(N·IŒa¸©Õ‰u);VDŒu­¶§™?ÊX^°£‘0\³ ×4­¦ÆH¥NÇ\P!böŒ`ü jè„é{‰½©eòy¡îy´Ëâã9íóY?"f8ìnN˜ÛG¾½C7cUJVöXÎÉ\ŸJ\]ág-X“0T!1 .8¢D Ÿ£PW‘€R­4áêí'©zY¬ ߥˆX‰¢b<Õ_¨Ú8 âŒW_ðÆUpøÈÄ>Öpü­B‘˜ºnغjêTÕµQ5¥$U‚!¥$R\·ðÕm yÌ$Š%©ÒÒP C:eMè¡6œÉ®?Á@øÇ‡-ïyÇö¶ BuIê×Ç2JU!¶å² Â ÎW=®\\¢J Õ$"˜šnY[eVÀ–e) c[fkb®¥Ôzýê6û F€G×5Y©è—šÄÀð#“uEgáW€ о(:ó‹¥"5šzZ užÇÕ£R …t#aöý¸Sç èÕ§®ƒúçÝóŽ|ÆãÚ‘”Æ#¯Üñú7Ö^2œHÝXR ‘ˆ ®ÚKCy1|tøè1ÚTÉ;áŠ$”ýoµ%1 Ö$ƒ•ƒj$>8 «Ü5 “•¿xi5v]ià§×{žè¥í³à}/ôË^ì¸N\öY}££#žxäê+µ4€×°²«•˜ºÒ¦®µi(k›$¶E- ÑŒŽ!‰¸‰×Êþ;|dâ ×hŠÏû³ùB8_Ì…3Å\8[ÎËY·Ä”ï±óA†áS £ QÕðηîä7µª¤–Ò‘Ü~÷àIbÙ‚Ô^×vÖpUž´½î—÷ýSZ0;‡‰ŒþLŽ­[>œdëŒ~­„¡ŽP ø(x-¥çÚ cÈä¾T¨š%:°ƒÖ_V+$TvÌ£fãî©õ\Êa«3lS†íuͶ´ /&—T6ƒ5Áü©>þôã•3´Q_mÐúHíÚìÜ;W҈ÌÔöÓܶ½½£5q¨–&ÞyBÌPR`´Å(S è:³» *¦“’ÚÿŸ¹7²ìºïû>眻¼¥»gÁ2Ø·!H, ¢¨Å²(Yr9öT¬H.[‘í’íJÅJl—å(R”Ø*ÇQœÕ•x)»b)NdG±%YV"…¢¨&å!i à 8Àì½oo½÷ží—?Î}¯»g¦{ ù›ôàÝ~÷ÝûÞ;¿ó[¾ß﯃¾ý,¨ÇèŒ"+)²­M{ù†nÞÅGŸ@Ø6šH%¦B¢Þ›6üø_8ùG8â»ë§qÛÃ57 «ÑÆmDFÊ`UÊ T†Fõ ·rºÍs ©ƒr1ª! 1&¹¹#F½°uP¼Œ$J‹n‘ØN"x,G+ìò&^ç0›kùüÅï8É_üÎV°HqBܼ€¹¿„í ±ê@¯s(¼wf!&Ûz$œ\JäŸn¡ÈÍ-Rmˆ›Ûˆ8:xŒÍ®ó[îÏ +ô-ô£â˜RË Çrà #×5ýû5ү׈íB™a4ô:êÀr®<Úgæ5ÐÑ „¤d”+M¡L%Xñ~Ù.£¢@l–Š¡!‚28à•[t1ØvÉÃS(é‹V‹ñØbæº+4Í„ˆJ¢¦˜Ãu5êÀ£”Â(ƒÑ9…I *DhTƒìõ” ”y7Eß­˳’¾1úÔ2 é—ð «R›¢ý^¢ü³GÝ’ŸÄÐDçki|%Ó0•‰Ÿ2ôSFÑQ‰´°ß¯Ñ.À£·yŽRFE 4*Јe"NUb¥¦Æ¶½Í7³+ ÿõuÛ‘ßn†aËî† 7Û¡’a Œ1Ôdoÿ¿ßHº€c=Í|÷-©GÀ” ˜ûÅ<ð8þò§±Ÿ¯‘&K #œ@‘)l;Šz\ K=5Ã}£‰u  öüU^[T ŽPïÑдȸÆ'ü|e#ÎÂ)w<9¶J¬Ïvs(˜èÆW>›þ§’ycÈJ°1bƒ¦ ‚ѳuödœÀ]¡rͯ??æ/ ù·¹çÑÿòÎ#_+\í¤á¢S¥ôT µ!4WWxH›±BãðÑQ˜£s2“†—J›ûgíîžë¼mûA‘uæÞ´û䦄ÚWHLŽ!ñ c<#¥Õ™¢¦†¨Êt'Þ_…\¡‰•(Ñ š•¸(8DEƒ|5ÑûíVය}Y©—t¦ ]ªn¶ –ò K±b-u ؘ€ÛÝàG:­TY_ŸÈÔn~\ÝUÔj¦±¡Vi „`gS Þ²ý-Ò/þÚéq_ѦI­« J*ˆßŠ:þ A}5œ¢ºE"å·H=$°W´‹MèwÆÞ&ÁÁ+Ò8ðn‡b«æÜÉ£Cs„¨„(‚ŸAeE3©#ýÆGk˜ì>t~ïÞåd…9à¶Œ°‘~eŠêÔBß+–Hu†“Œce"å™N>P¥"Cà7ÿÍ„_ýÕë|ò• ×·R¸ü‘ÿõH†7j­‡\êaÖú˜EŠjIå¾'ÁCŽf5Þ´Û'=C'ï’é -1”ÒûÂþÊMp!µŒÎèäºyÌä¸`©ì¤­ü§>ž•á£#J8Ð9„ƒñÐw}¤‡éž F+ocˆ>Ú¢.Úài¢§‘ˆ¹IUú«j·r·Õ´ÎúúÎ|ÁÜŸ/hgvu¥´‚ì(™bÄæ·ùÿ#G½††µfÛ¯Ô[a¥ÙŠ×›xÅí²æ† ü˜‡ÿ ¼hüMà?蔆?w¦Ï_ù#Ù}T/_¢œ¢Š.ÔŽ¸ódgt¾×“ßu ÷å]Tž|Á¸Q”¥¡S€ª<ø€BW+œÒX Ú¨›Ã¥ˆ;S²»Ø]O(2ÎuŽž.•Yè:E?Â’Òô¡›ir¡¶ áúE²{w ÆRy…›:J¹uî69y×¶q®VhR>7Cåå-÷_+xõjÍ¿þ~ó¼ã…WoÏ\zoÉ]_ß»éñ¹y»–㛀ԞXL¥¤h2”ýM<2‘H”€Q†nÙG$JhÁ:Ziå‚eÒŒ±¾!´œ~£L è1D‰L혉ã¼EH!ãsЬh9‡YÊîù–£§CwíÐï6Ûa£Ùkv7nº]¶Ý¡3ÅR¥ê=ï„ÝÊÜvÆ™.Tir%:ÓèL+•kE! ÉTN!I¡ÇrŠu~ 2ôM41Æ<ƘDzèEG‡ƒÂ¡Û&Ê[y3ÿ!-ºñá;5ÿßß¿÷±%ô—p7Pz—âÉS˜Þ»w.~:9½gߺûIˆSÂòocž|ùò%:A§nÁ(’•Ì$±Ø–‰«–zÐM½ý;ªŽ=€ã5¦YÁõüè[‘˜r•ª©PôµÆjCôaÜ@ÿaÊñ¼rh1ä¦eJÑÊ©(’ru“Ó-úRf´øS¿¦u¿ÏY—J) SŠÑ™ âQ(2“I'ë©+×Í]_³›Û{  IDATû~‹N¾‰Ó`e"!Ö£#Š#ÁÖãWúsÐnå^¼Ý“B×Ý$lø*®û*n‡*ÅJ%‘† §Ž$&mÅsŸµ@£[â§gæÆqS‚4⥎V*¢ÔJáuÒÔ"þ-åÿÿ3 ñÇÿðCrOñCAõó#­Å“È=Æ ¡dRG(EôúóàƒH5EL¹!V™&†N’óÚ®p¯>>ÕEú_ lM‘J‘ø½„s¯'vÔö•娠‰[ËdÏ8”ц"ëµx‚Re&GµºóëŽÿCGÑÆ&4¡vÓ8qÚ?f7ŒŠ¥úýŠx¾Ýv+ð©Ã~YÛìúKƒ Õ‹ÃkÍ…ñµæbµb/Û¸jGl…Šqlhĺ@?zÔ‰—QtQ¢“] (h¿"¤ÝèÍÃ(øA€¯¢ÃŸþÖS έRôzäûŒI"3 ÕöÀÊL˜Ôä èñù7ÿšÏ½²ïôííÌšqUò#˜ulÌè,vñ/^DTNvÇâ(cPYŒ§øŸ'ÿºïÇ—9p´p…¢O%‘ZvIÁ1P£Š0Ì‘»rX°Ä1dwôª"øNJ“EøÒâÑÉg³å‘½|“½;yàÔÓÜ¡—(è`TA”@í¦Œ›aÐl g:WÔÿéYâã«·<·¿ž3})Ã_QèM¾U`&%Ø  Œ2¨=‰ÒJSf D$(VyV¨ÄÌCÛÐPÙ‰ª]­BLà´xÓWz–ÛÂÓ)zä:W1&|¿Ãqcª`½UN9Œ6”Ò!7¹É1:CçŠãèp”¹qØQ˜ÖÛa·Ù »v7üˆq¨qmMìkÎnrû¦×/œ9{úûÚd¡‘µá¥úùñµúÚèjóÆøzs±Zö—› –ýˆXSѼ©[üèQ}-; v6í8nÙIÜ´SÙ´Iÿo#)}s‹ÿYÚÐÿ¡»2þÅ¿‡Ü5Ô*£vr 7?m">¦_§’‘ÅR6Œ.ðkµú<: RG$/öFpk•z–„$–Ñi‰ìÒ†á~m”vcëÑY¾¿:¸×~† ÌlÌï¡Öt:FŠH|à½Äã÷ã§çQ(¶Éßÿ-påUÔpuÌ¢bF¸^C×p®wt„\4 ÜÛ¿Yè@ÕCÔnJ&ŒÊQ!9€ÆÕ-z.BÏ£~äeâs·(EóR—úå%GÖ:˜á"™í£C™>Dµ‡Sj¦Á§• Ö¸àTˆ^¡”*BN'ïatFe'Œ›‘rÁ¶*¾{0ß2kªjñ¦@£ñѧbÞ%Ó9AÂ,ŠØ+ Šj[BŠJŒ6²ƒ)ü|ÄWa*QUÚž<‚{¾6zÿûí02ÐÏ? €àêm~ðFõ¥ñõúòèZózµæ.6›ñš±<“¨hP·¿¹3gOŸ&Mü=ü‚ºêäɧ{ßpü‰î$J­ R™®t¦)§ô›Ï ¶_ª?¸þ™ÉÕŠå{>ÐçÕÕËîýʱÔIwg¨¶N¡¨š›O½?‡£ì”â#Ïâ^ü±1ùÞh_Eú2Ö&nEDˆ>)äO}'*;AóÙF9â6Âhà LzŠÒTÖRÙ!ãIA¶µT õX‡nïè­‹Šâ±?IÜø~¸Êÿò¹1W=vô lt #A #jâh|MÇx0³P9¦ÓöËÕc#ô¿ŒºzÓédª©_)¨Î)Üe…¬f˜ÝU•ºtTh’Ï Ðc´!× jjÇÆz«f ¼Ñ¹)¨]•Ú}³Ý•„(Ê<§›÷0ÚÌ¡¼ãf81:#Ï µ›âƒß·Ÿ$œE ¶urpâÙœáMw¸gÑËv³–›]Õý57ËÑÊŽ¤ÉAI%ã­–­ß;Ìü_À†:®¯6_-7WÆ×š7FW› Ó«þu»!ËnÈvL“IÞT`sæìé‡HÚ‚GÎ TFõ²®::ÙzæF‘jÍâ]à=^òì3')ªÈÂVÉ~‡~™-g£©3£Xè>•Öɽ!®|ìɇÒ0Êu…D}[ˆðŸw^¼Ol4ÇÈx3¬¦ê¸apÙ‘EÃîåUò|C”Œâª¥ÃÿŒž>ÍËŸÚæÓ¿¶Ê¿þØ2ÃÇ:|ÝŸ<ÜÈ ÃM~bˆSAU kÁù@Ì#ºc0:ëTcÁ£¿çúß¿7¢½"\íP¿TP_Ô„ëz«‹÷Èma$ôYJ‡2ë ”¾Q hþÍR'ü{7ü\¢•˜-¨MO9ÝQΙ茱2Œ•f’UùšjÂ!àcßôú«ô7ýs»ç§vt½Þ®ÚaµÞŒìf…1Óh©$¶J|oÂZ¹ä_ç6âo—UkÞ.rX /6<„â=Ûᾊ“ºàÄB‘†cÌÐlûì°Å/’ˆ<¡‰,ö4åýïÁÜñQ¤ùyâæ˜Å—ôû÷Ïÿ›3T©‰ÓûÂ¥„>­ §:oŽÖ躚N¡Éó Sed^Ñ)sŽõ2¨…Ÿüç;üÆ'|êKgiÜ¿?ï©ï9: Sˆ: ""Ñ !¬²‰„c„xÿÿ /÷½Žîßó ÷zIóÅájI¼^¢¶JŠq‡Ìv0±@“€"™.èd]ЬÄ·Ïd¸èöê 7sBôh¥¹ÝFªßžçÆH!FAù&É~Í ‡ûJJ3& ÑY" )¨O¯ùzv®UkþËõ–¿ì¶Ãn;^t;¬„!;2e¬ñúíxV6é9\`ä­Zg N¢4"T¥Š^F♌¯XuåcÃoš®XzSøÑkǟ{ˆÞ¥ :Å­Py·1¥ [(¬htÔøKA ¬ æ¨öãU|Hj@´°à™9ŸÄ1ò,Gù¡Lâš 9wzXŒŠÑ!Óupr$ܹ8^ÃQsg¡),|î|Å/|zÀ^¯hÜÁçk¥¹£¸ŸSÏ-ÿ¨Œ¢8¡Pw¢ÕH.艅b€{`Ìîco°ù¡eܽ;7=W¼Â],¨_ÉqJâJ‰Ùé“M{d¶‹9Z j+ò…)Èt¢ãªÙbkÎ(¹‡-ññ'D}`h‡nÏMžd¾ZÇrë¾@ˆ¦dÖó1uUR˱ “wRçàþmb·¹õÅ´æëèPR)bB"%Ã,[z‹S{ß-{Ûǃï·3gO+à§€oz3¿ï§qÓUa䫰긚¸"e„ÕèXVÖýÄïÖÛ~4Ý´õøš¯ª߸-lp|3)}1ÿÛ<Âw¤çϺ3a­S´aµ!F™§é: …)æu€"ë$@K ÊM *òÙõ_Fîz5œ¢8´…ê8ñÓ nˆMÌØS†%U0VGøjkÿfï¨øØ7½îi‘…­Êð¡ }†nÖìЯøaX „1UãbÒË ‹ÿ¯×Ý(g +SÂz¦@å©<·Õ¨>ÊfÀ#Äñ$}/T¦‘–!x«4£WÎê‚­A^9‡Ò%ÒJN]e(‹áÎõÀÒNäxÛW"ÿü3Û|þK5ÕtO$óŽò~ž\øŽg§æ9í°Ú¥W.ÐÍJ/¾ÿèÖ‘÷j5a3ïeøkñzI¶¶Dwx'ýú$¹ía«@å¦ nËÁz( S°Ð9FÖ†ù‚0iF)?Ÿïà$ ‚Öš^±@¿X ÓY»3Kë ´2d­¢OnÊy[2ˆ§vS\°Ø¬¡Ì:”y— ÆÕ{‘B»Ãwò.™ÉçŽCra6-èüà÷øÜú¯°k7øè“Ù? uÜôu'¾Š?•A˜0ˆ#qLZð×Üîï|°ß¾ý¨ƒ¾ŠÛ¾Ž_ÇÚWÒ¸I¬Ýˆ©¯˜FK#ñPúß“€>€ûÞ´øñsªƒ¾ûÜ+hÔßn{˜…(„RÙˆ*sê$a}7åÿ^ˆ }x'afuªGöØ£Ä — öHPtEqf˜³1õä«9²Ö§ÙÈù—Ÿ¼È‹¯¯œÌ~Çôyîäæ¾ò½éËߊY(¥æ“lJóîäv Ê`’!ƒ ÙÍ‘Íj«ÂzNØÌQNns²XRè. å‹eZÔ3&èHÔ2Ïß9×>7EÊùMBú9o÷&ôÜ@½úŠnÙ'ÏJ*;™ €6®NB âéd šë‚¥i; IÓ_͵þzE¿Õÿ+ðÑ¡Pm~ߥ“wÛ‚bºV…bìwù­åŸåâèeòEÍÂCGdC=H!"&FQ±k±8ñDn;ºþ«eïŠhG'ýá£~ÇOãX¼d£AI¦2r]`tމZyÍPŠ`†W`ßΟ+t'¢Nœ ~ñUÊçžÂ½t™7¥ì   “ï-æªiÇ_G¡ß׈¿2Beis(ruóæwˆi£‘í)vç‹(Êù9¾ýÚ1~æ72~õåmÆÍ6/][fX§”Q9ï;þ.½Ÿ‡ûO1®G ëy¡ ÚÖUôØÐàBCy"#GywcõÞo_ø Šÿàз/ÒØIhÜ4Vv†nÆ¡‘F4*äâ)ˆ\+–ÿ5fïVð%4"¸zË­5»~¥Þ —›ð†]oØ-VýAœRÝB`ä ípÏ;3~îGáÃ÷ ¯ö©v®²;éÓýÌ%ò7µ÷‹€õi"iü­è– e…Ü(Ä'èpí„2*Œ„¤¢Ûš“u0ÇvùØg|â…!Ÿ97amG˜47³¨[|†o¹ç»9VÜR ßöÁg ¸ï!í¤Q"î‰U¸µ¦}²AŽÔ ¦º)ÈBA¦ò´Ð¤Á† ÷‚/A­8§õ–2ó•Ñ+PJÚÈLžrpßPÙ)’(·äºh52OöÐ|Y«ìӸ뛿ŸRŸ™à”j y)’Øm$! å×’|˜iî÷ÒA/o†¶~“¡Ýž=ìI`¸þÀq×÷Ãá 4qÛŠÝõ×Ü(¬ÆiÜ”š]™0TSÆÔÔXÜׂü×­ìÝrGîþÁÊPåª#šRe)¢PHÀHª ©€?O’ôÊúÍ/ýØ£<óH7­^Qâ1Eˆ™Iøþ7á•J¹úŽ*›¤½úÞßÒ 1MÙuµåÎÞM\FÂÞÀ¼ƒ¶¾q‚/¼tšõœ<¹É€WøøK¯ñÉW& &7g7¹.¹³¼Bwy´÷ ÷õÞƒx¨Ô4A]•šçü32ËÞ=Ìm õ“Gó d»@ƺÎ1¶ s%yè’K/‚ÆÌsóùsDˆ1b}ͤIa¾ÑY»ÓöæE»(‘ÊMiÚ‚´mº‚"+)³’DêÙ+æYA'ï‘g1Æ´Ó§{¯OJ5B ‡ê´Îºjõifÿ7³*L¸8z™/nÿ«ÓKûŸú{ÀÒþøÈQï_˜Æ­ØÈN´ŒÄ3 £`™ÆH-‚CÈx*_{·ÀG:è§a×îú-7ð›¡òC|¨µAtL{²(Ñm.•f÷ýàì¹ûûîI‹’š/s?è“'˜¾±I¿[’ß4ÙéhË2E¿“¢€<„Î ñCfÝrÑÄÍâú•ç&=©Ö7NðÂçÒµE¾´~‘WÖ~—Ï/ ¶ûº¦Ïƒ Op²<ÅR~÷w§qÍ\ÿ~\Ð:£ô ¥DS¤>vl§ ·¡÷,ïÎMÁè‰ÛŒ¦× J”*Ï1¾ƒRfÞ£¿ÉÁB¤ö56ØýT]ºyŸÌd„è×#šˆ[½ ÒbÖJÏ1ù.ìµˬC·è“ëœ&6s$ÞÖ*°atÖVþ1FfÚZ™I˜|Ær±áÜîï²<}ƒ×‡/áâÞþ*ð€¿K‚ïÎìëzÿ|ƒh9%v½‹&XQ³K™ëÿ ¶ÿföŽ;€tøœÀâV "щ ‡ »a NÑP‰Ç·‹ÿÏÒ.þ“‹?þgîåO}Ëñ½EAåì‘’Ýó~÷Ú‘ì-9EDYäIëï&-öfà5q«ÆÞ³ô¡yNêƒcT¿ Éd‰DŒÖ L“uè• é÷$¢I¡w‘•„Å î¾mµ¨°W ~Õ`63Êa—²Y¤ð]´ŒVd&…âìSЙ)êÎÚf{ýøØ.¼~’Øn±ôû8ÒNâõÑÑÓ©Ò?#ß(ÂE*âÙÐÌ#ƒýäÏ™*Pf ºy£5XpÊÍ«ø¹)è}JS²c7x~ã×9?xa~?³1ð÷€¿ÃÁ…?“®;uØÛ'‘ÊWq'Ø8ˆž‰Dlð¸èhZEŒ¯ÙÅïNð ´ú[Yt2òMPÁF£¨ˆ˜Å´ßß’Œx€ÄëçŽÅŒý­Ç¸÷DAÕÈzšVÚj¶«¥—|ôXŸ cݬ˜·Ê˜&ÌóÕãWŽ,J†]C4ž4Ñ9‚ó-Û¯F9‡DÕVÍsŒ6­*ÞÞ(íay¬oh|E'ëì“鸢Oö$¹MŽRåüˆŽ©´í¼¤ŒJ9€èæ=ºEŸ"vÈtNã÷$ÀWš7¸P­±e—Y™¾qcáñð2iÇÿÄáïÐÑW¨ãŽú©‡ÊM|íÇ~*•4x‚šÁ¾ ògΞþðʧǧÇËõÎd¹Ù™\·ÍfÚ*?ÆRí1Þ ptõ¿Š›nvÝ4 ]†¡Ž“P15ULÅÞHÃû€OwüÃx€§êàü |£æá¿.5Œsš/|ž»x F½õæ_ž©4x#È\T3FEU•lï.P5Âñ¥¼ã×^ÿ“ÎËÄpÁµ;{’¶iµðäæå³Wà“¶H™·}í.>$EÜ™0f|zùÈ{ŒCE)ÂD¡'ŠPi|#¸¦&zP’ÀÏ-¸›÷ÚT'9’nôLÜ_[þg¬×WouË? üSà“·ý$û棺qØŒAbtbC-#ISƦZãD¿JÛÿ?9ùLwAwäe•ËdrQåö’2rMg¬ùŒa;X'¾à;Ž:Øìú 7»n¶ý(lúIܘ¨Q £aøÚÅÿcß{g>¼ÔÚWMCñõã^x{a a‘ÅÔAW³7¨“6½Ïβ¿v—ÅB'µ½7ŒÆ]¶¶Ž±3X ~÷Òu~õó;<i ëpíÀ}-æ'yïÒsFeTnÊ´¥¶Y»Û+¥Ó¿çpÔ¢Ýñ[Õ¥ÓP áƒcÜfÒœ»=®q÷î9b,·€ßTÄFAmÐÞ€€‹‰:‘wTÂ'Äð*kò¦ë‚C¢ÌÃòYÁ0DϸÎYvEëÌB‹æ›E"‘I3¦ÒSò’¢Ç…týÕzd>7ýn:çÌÖ««ñ·W~ŽÕé¥ýÉÚÿNªæEÜ–ÁúÌaÇC·}‚«¢÷uôÁÆÁ×ÔÑÑàðíüŸw;ø~‡1JŒ>Æ`ƒ÷Ó`ÃHê8¥¢j[“ïBð‘fØ]¿]Ô¾ŽÑ×ч:Zi˜©dÌÝDþ;àOCÊûÿëï;dЄ‚Ød¸—¿Œè4³^w44‘~'-ò5ÁBЄ`Q!±Ý?[ tú9©Ÿ97å¥×k^¹²ÃùÕ/rqóæbZ®Kž:ñ]|?'ŠSôóE†ÊNÕƒ$6Ó€ ­Lš3/B™uÒ.=CÃÍsü@àt– |ÅBÚ÷ôïq3œÅÈMN7ï§Pº µÕŽ(þq;CV:èÍ3éÓu'èÆãx±EÆ%“6g‰d:£[ôçB)LgÞŽ´Áb}Í r›rõ.Z-H”¨\°)J‰-?_)2ÏwY­U3`Ö^ôñÚày÷+WJØ›gñ{ÀóæÃüÃìÛ8"stã¸j‡aà úŸ„í0‰Û±a¨DðG '~ÇìÌÙÓßI"ÞÅfVC¬¯Â(62 ÈP%NWZqýÎ×þøa¢“a3 ocåšXù:Öщ è‡,ù€ô;šñÃsêø!—+’*ä>©Ê 4±I˜…ç²ù_ï³Tøj#¥ ²žOnnpkz.¿2`HÃDYê"`– ÖPHGûOóÔ‰p_ï=u&ñ«æ•qHà¡jóÞY®|SŽOZhZiºE—2O$•YQÍú&{"ïUà;ywoˆæ³7Óv¼ÿ‚“Æ UyTôi´sÓ‚ÖEÏ™t©êžvîÌää-c¯ñ¡•ÙNƒ8-~¼×·tÝLçt;}B 4¾š €ÌêA§ô Ko^7ˆûfì {f-¼YáÅ}ùìê/éÏo}ò $íôøoy{d7þ½ÃH`Rmº 7 ? #? £PÇ*ÖøØ“ýªìþÿ €¯âòtÍ®T[~µÞò«õ¦[o¶eÛŽù†i ­j·@ ÿ=ÔÔ[þKÕ†½Òì¸U7pqì·¥a"5HÅß§]üßñÁE~ì{ïáC§dö‘ü‰{QÇú¸—^'† H Ü{Ccsš&§i ¬Í“‰šóƒÏ߱ɋ§vYúÖTÎ1tîʘ®;:ý.½IŸ…xŠ“ûy¸÷4ÇŠ“tòÞ(éÌ‚$µš ¡8‘,áÜ>xBŒm.cŽ¿_ŒÂg%eRºiA5•ÏÁ1³ÝrVÏtÛþO}›@Mr²P }<,Ò Kä,ààuJ9fõ­ …))²Î¼xg”¦“w1`}è´ÅÉ}¨AIí>lâ*´J>7{bûxaBÂ5d<¦û$Eà?»þËÓ—·?sbâÇHøîMR´ù…#oúMÚ™³§5G|wíÀ_·#¿Û üv½ã¶ì l»]¶ý˜]ŸÄñÝ» û=söôŸ íZ4ÛþНânûwäÇ2ôvÈÝX3¥!5)yg#€?D[¸»ÑB7ªM;²ßÔC?nvàޕ;dÛ®òãßðáÓ%ÿò¯ÜK¹xÃÌ8A™‰ IDATÉwî:`,âœÙ⯪’ñ4çß½6æ —†\Û­<âà4ýæèB±Dyà´wÜ{ ë|]]‰a²^dlIÑf_!ë-™jsù¬l2á@ À˜ÔßÏM1'¨• Ç³bÚ¬¿4³Y^$Rf%<:¤>vèÙv‰™v0®K»d*ÝO^d8ñæ9{nò9ÊoƳ×Ú 1dsЭ;^3‚Ϭ{qãµÏ~g $~~žÚ€-X*×öZóÙ_ª¯NÎ Ðz$Üå'¿Jjë½]ö[›@¼Lê]¿á›`]j_Çi¨¥ŠÓ¤Š4÷÷]ìÿŸ9{:#‘âˆNvä}°Á„&l‰(Qdj}ÿµ½“à?¼Õƒ©GW›sÓ5·<]q׫wÍnû0fh¯ñßð‘çNòó?ÔañÑûp×—‘Ø%¨LÐò׈9u‚°]“ ÉBöÿúçÇüÚ®óñÖÙ¤EñÁ¿q7þñÅ#/^Ç ÉQy"9¨Ô“ö’0ð!†[2ÄgŠ4©ýåçQÀ|gW†Ì´X÷2åÀû»eÖiùîùAçÒ:µOAw~ˆ=\|fršgo3ÜÉÄªÔæ‹í3´/(¥G™÷MŠT$Ì‹ŒEÖ!Ó·øº(æéA’õûµmD> ‰Ò«”> ¡´?ÅHL½ô>ñŒÝ€/î|:¼:8K”Ø'iL(àwH-½Ÿ:úf¿"û3‡<§kî¥éª½8]±—ªU{©Y÷—›mYv6ر4©½ö\ÓQöW€'!µ&}ƒ«ƒsup¾Ž.ÔâBK§hêÌíqgΞîê‡\µnwºî¾4ÝroL7ÜÅzÃ_iÖY®/ñW‘vhg¡ø‰ÿênN*GœŽPªÝ]"ˆ{¤”7Õ¶†üñ ~ú··XÙ9¸j¥‘­ühÞžÕ¸ëqÝ Û%z\`ê:äéií<š÷òTݶíÒܺ.6·©%Æ¢›¸ç.$!”dlž7Ï3”RXo1:$}ÛîJí³Ý_ŸhЬÀèŒú©[öÀç&ƒŒ8Ò0(Ðã¦%iIÃEL–Sf3ø¯´J<ú€Bò̉õ—›b®Â»ÿ=i+ü2sŠåLxCÒvy«c¥zƒåÉë\™œŸxf’𻤶Þ?åhÏWlíw÷OßꘆËÕŽkš‘sÍØ[7 M¨¤‰58<Éû}e|ó¯üz¦Íý%2™®ºKÍŽ_ivÂ²Ý Ën+^wÛ,‡!›2eŒ;Xy§"€?Ü(A'ËöÅsÕ…ÑÕúêäzs­Zó+vG6ë+ü „ÿRÁï_ýð½<æ|ÊåCƒ„¥-JÑš4´>7 üÓ+ÁA[ÇOüÚ6ÿøã›6FeñžÞ#ÓgN|³}téUóåþ¿qh^WJÄAt  b»[îÛ]°óܘç߉Û„Ll°s¶š mÝÎ\ÒÍû,”‰@Óø:Q[ç¡o>ç­ÏRŽNÞÇt\ZÀͬ2ßÉ»èR¨¿H…¶í2L(ÈbINA¦ŠVo/åï3¦uŠlf:~ûMZQT5wég®sºEOºEŸLçˆúÅ‚蘥èÈó›¿Îç6~åV”áOÚz—޼¹ß¿ýynþîâ&ñåÑåú…ѵæÊøzserÝ^mÖŠÝaÓ†š Ox7qÿmퟋn6‚ ø*Ô¾ U¨Ã4:*ÀëŒH'|ì'}ÛÀ™³§sà‡nx8Tî¥ñJsÙNÜ®«ýÐ×aä§2®¯ðiñ?õ`‡ø—îçÃvˆJ£2ÒîÙÝ‹¨~$¬¬#cC´‰ú«Ê‚ÁÕ÷ç7ùÇŸØJã¼Z;YÞ³ñÔ‰oXýàÉo±™.N>ؾß]8\`šÎõaÙ 6’޽™ö)\‚¥î`Tjõíw©ÏŸ„2ʶß?ë—×nJe§mõ{“ªûiæ}Ï´Ïé´éœmë”ôÎZ†™ÉæùvÖ¾n·èQdêǯ"ùÑEp?\íÉj¡ðZRgbV¨Œ1¶×<Á¶­ËŽ¡W,´2Z3ôž§vµ›î«ì˯?“îR*U4:y­ 6kæ)FÀr­~»ö‹Ôa²ÿR´ãÿß¼½9þ-­å­üÈMï×4^Ø~uòÒx¥Y™,7«Óe»Ü¬Ç;`ÓÄ4òû]]ü­ýOÌí ¶Zw—›¡_®~ÅüªÅM_3ž&8‚X"7(¿À_fÿT!!4;þµÑÕúÊx¹¾6Yi®OWìr³%Í™8~’øÆÏýè#ܽ´Àö¸¤® î»wkvðæž'ÈÞûíÄë§ù½šm ~òg+þÞÿyñ>¿»:l=wç·Ÿâø‡$‚$¹° P6»u˜ñÕEÂfƒ‚lšëK—\w)u‡N–F¤Vœu´N|õYŽ?£¼*¥çtØý´…¿Æ×Io?:j_µ<ÿ=|A0Ö h|ÓNäI„Ó¢ Ë<éìk¥©ž¾|ô§n(xçç(½ C†‘Cª;Ô®b\§Ñ_A|ë¤:¬"+ZD££²“yä²À“¦î8¢Äy³TkC©:YÉÔøìú/óÚð…Ñ{_þoSUÿ-ØíÀOâòðru±ÞuÓjÓîN×ÝF½×›-6ØÝXS¿É‰Xo«9{úoÿÙìÿí(\m†~Üìú†¡ŸÄQ¬KÅD¦TØV•à{[À™³§Ÿ$õa“ nºæ^]­/ŽW›kã«öÒøŠûrµ"—í«q›–þÉ_~ŒÅì¶¶Jš&µê† K‹SPv&˜jˆZ ,ŸóþÕˆúɃéÞ=ê<Ô<{Ç·o>¶øþíLg}ÒŽßb Ç‚„"ƨlvóâk Ô×~¶B r×¥ÃÝ|‘~¾€V†i3iô^E;Í~N“tº¡¿*·úQg¿Ef.í­ÛcmÕ¿ñ)rH郛C€CLõ°Â'n=J3½9a5G¶s˜dhŸäºÓ[úùµ¯Ú½çŒfÕûÚ™¹\6$F`"-ÝJÃ?àƒS!r³Wv‰x®ŒÏóë×~šêàŽ¿ üufÿ]µ3gO?üØþÇì0\Ø}múòh¹¹4¾V¿1¹nßhÖå²°kFÑ%4Ý»| À? 9HD°õ†[ö?pÓ°í¦a3Lãv¨Ï$F „[áÞ6ÐNýý”(7Y±¿³s¾:?ºZ__³oT«îb³)+~ÈvÜa‰T½äÃïY⛿Ÿá(íüÖåxo¸|åî½g‹;ïð©—?ùÎòÛ_øMvGßó;Ëû㎫»»x( œV»K¼ë:y7å>ú~í¦ù,¼v÷Þ\$‹{Ø îªÁ/Ø,ÈFŒïé$cÝËӎȘÙdÞ=KSifJ|‰±; Söó$¬þ'¼øwÈΜ=ýà—`Þ 7¯®Õª]·Qï¸õjÓ/ÛmYöS¶½efõôw ìsæìé‰ÿc$fìÜì \_·¯¯»ËÓ±^÷×êuY³;l‡ ci°‡±Þpæìéo#yíûìdÙ~ix¥Þž¬7ƒéºÝi6ÝÐíJ&H´„¤UñýÁ3PU%Óª¤i ¼O@ª.øÔoæüÜó—ùüÅÑM¯û@ÿqùÀño Kæ.U»i>±cÕul$Y'«ÝTOšQ껟"ßù当ˆ"~¹ÿü"îr†¿f`»C6í’û.šœHZ€It³­ˆ3(ÜÇrc¯ZžvC=¯„g:'è0B¹?G.LÙŠY6·œP£•ÞA\”Ò.Ê#ÍÓ—nûYÅ m4èŒLd´Õ1í„Ùk+ ߚ}PÜÖqí××»•†¦sv“×>ÅùÁïÞXÜ“ {ïúŽ?³3gOð“ìaV¤ÞöoŒ.םޮח&+ÍÕjÍ^uÛq#T4¡!ƘÂ;¹ûŸ9{z xð –üÇh‹}L°ÓUûº¯Cð6„è<щÁˆ!ýÑèÀI¿/pæìé¯'ᮿ‡v“ Íèª}~÷Bun²\_ž,ÛKÕš¿b·eÝÙ ™°Doðu§—øÐÃw2™4MÁ¥õšW®íðÂå5~ïÒ ;“=BK+ !÷ô‘S݇8žßͰÚ5ãf¨¬·í¢%"ZkCŒ©Q?²F|v õǯ $þ•>ñÜ"q¹ ë½›¡ªís”¤Šÿl}ˆ>IMgT#î«h2“¤±|pLÚV3ünч6gNך”s€MÂü§Ü>¶E@Ýj×ç-h(¥{ï¿jâ¬ú>}ÿ¥Û~f¡D'dˆ4¾;&ˆV˜ÌõfÁò z`¤šè< §Õ¹rJ«Ù ú߯e¤¨£ MUI5«SÀñ#ž77; ×íØ×® #7 »n·ÃTvâ”m™0)ÕQŽê-õ,[ÄчI8éïž¾ñw¢—It2‘ µµRÔ:Sµ.t£tÚ2í ½nŸxø®.w-u‰QóÚÊ€q}³ æÌîî=$….ç×cÄǃ„²ˆ*Õ°h‘…[ â¼¢~±C¸Ð%[>ŽY_Ä­kü@£mŽ‘¤?ŸU§ÞþñÞ úÅ"6XÆM[$k»‰î›òþ÷d¯ŠVãÎ(ÓešòW¼Gnrv?ò2»â³óvaºI5O„ýâŸ{Qìa≠bŽÞ”¤QˆW(I0d4i¸§Èßd-k\üÿí][ˆdÇyþþª:çômfW²­(F$;ÜñK.`ç)yP ä9ƒñ[Bä5@ ì¿%Á`Nˆ‰ŽÛ’c[[^Ëø"Y^iïÚÙ¹ìÎew.=}NŸK]òðWÓÝÓ3»RVÓ«Õùv‡™íéž>Ý;õWÕ_ßîÚæh£lö½„·:Æv¾:Ú*V«ÙÅIÖ‰Ïôÿ€·.Ë}ËðIÔ/‚ó(5}ÀÉ!‰ï"8‹ñðFþ£Ñ­bu´‘¯Œ6Š7Ç›z¥ØvëÕwì#[ ônZsqß+€gÎ?ýg`±ÅòI÷ŠúB±8÷8Äg$Þ÷›Ìíùà©ä1…ä„K2Ø¡ã®ó*Ùq¯ÚùŠ+´ž Úí#.C ÚZ8ŽþLšQ!‘>KT§­€R—Þ£¿ª­±ù¨Ðòñ ¬rÞ:‹s"Œ~ëv?ñ­#é=óÝðŽâ­¬C)q Ä½ÅGùëÙ`×:°Wû Õe¨­3è>†8`/»ƒ«¯`=½‚± &vªž9ÿô1F«pº§‚üNu)Û.oeÛåêøNµVìêÛÕÐíécË‹S‚›¡gÎàžoŠF|Ü}×ÃJŒ ¸ÁÝê¡»ÿ8ÅÏ §ƒ%B! ”.Øk5l6ž©“º0$ªãr¸é7.3d6­W$€ã¿^±'¼ ¶6Ü@BÂXôc—±û‰\t׃F)`·Ø«}¸+K[ËèíEg|]½Œ­t _»õÏH«ƒÙGŽÀMá¿Å) | fòý€Ÿ?­ç\\94onWò½j­Ø-7ÊÝê¶Þw[v„-ŒqèRxÏŸ“ç À3çŸî‚«÷?È«_ôÍãŨ®'p·{è<ŽÇÌÏâ1ù$у‹rK€á£/wöYc¬fHí“×¼çÜ9¯0®²Z´„?ùï\ƒþä+ÕàwÁ %Üp» ·Ò‡Ø¸äîtÒ³Hªb×£16Ò7ñüê³0®&?ý¯øÏïØþþ|Ü83κÂV.3•ÚÒîéÜÞuÛ$h[Æ´/1–‰°2& BÞwÀB£îÌGï„Sƒ3.ßÕ‡7ÇoŽ6ŠÕÃõâFv«\)6Ýz¹‹-bˆ %Êû[âÛðçÿŠÆáÄeýC‘By5AþZ ½š€¶{èžÅ²}gäГH ûw[»ÙÞ‹`¬Áa~€ƒñJ¡±JbLàÉ;8ÐϧŸ¼!<çåÂG½¤˜ó/§îk,›xZø¬@M€%ÀùÞ#ÀxGÀPJP¡àJ—l.€T¦î@‚F zåYœ¡'\'m AT;+nf+xåî‹t}øÓಛƒ›ºÏùú Á3çŸ~Bíïú0½]f·‹4½U¤éf•;&+wQ”û(Í!ÌýûxNîÎf>–üGâ¶þÌ縸ôý瘒¥çP8íRÛýòP亂Åúèvqk¼Ynd[Õf¾e¶Š-ìVûHmŠrN€Î‰xÛÂOùäÓw0º9[0zèdzõùŽþT·×s¿öþE±" t,D u’n Äš ‘¡œÒ@låå@Ò"x ”ñ€@Å>wn¤`7x&Ã.è L»ˆMÑGGõ‰8Ýóâƒÿ‚.0ÿ ÎY¤eŠƒl·n :ÿØ ûw@} |*í™îcXê,Cýñ.FÅÐóýÞw©³ŒnÔ÷Ï9Â(zºðdÁ ¯Î£#’ªNÔi®‰j ¯åηÔ9ãÔÄŠgk¼J÷¿à 4¬¦¼rˆ““Ÿ[<¤xÛ‘ÿþíë€É–}:s—cz…?åô‘Ç—(‰_]‚ I²äÎv9Il|—ªüÆNŸHTgzc)YæL8XkPnÆ…:î‰ê@*ŠÂ)w «ê:7® “8*»=D‰Lj«¬ÊP½÷ηAÀ3‰P´š³ó¦ñ8{ïSƒó2C©ùTÃú0Pògð˜-:Îa–}ž7¸ëhjœ…”TèD]—D]'…¨ÚÇõákôã;ßœôüÃ)6÷Z]—3äâZY'gôïµAç„UupR2B?@’¨=A©gÁØe3tàà j·`A‘Š¡*U%6I7g-r—×·…‚¡„„q\2X¯êXmÞvL4‰¼,—†ÚTõkdìºqßÝ-oÑùõ/ÓLdVÀ—¼^î¿ÍÜñ Q~Žazò@ïà线ä‚ǽÊ%ªã’¨ã¤PpÎ…£2º—sÀRyå›xÇÄQÅ2†Œ$P#ŒŠCï©ÇÒÔR> “ÐÛ/äà Ê~ɘl| èû;¶Çg0Þ›>Ïôz"Â:$ø¼GBêÕÏÉšÈÁ:ç9÷Á‰×iʱ¿Î°Œ—Bb\½M·«‹VÈæëÆ=NÌuÖùkuëÙzqýEÚÈ®Ï.}.ø,xðo¾³¿-N‹:½àI!ݸo5äg ôâ¾ë(xŽ:QÏùЦœs¢zIÊ–ËZãSsæÇQU¦bï9eQéã*óZOÜׂ@ˆÛO ÉV×ã2EZ¢ð6^\z¶~¼„HÅõ€HÀ‰fJ!üVDø[§ç ÈJÖ5‘_RDµ2Ð:㯳ñÊwþZ©¨üÏc5"o?8zÍIÕ…Òme7ñÆÞ˸9º(2=E·ø x¦Ç¥¸-ƒ…’#b•àlï}0V»0›ygÏ8ç‘’寋Þ'è$*8È4¾\÷Ž£²5^‡½¿›nÌYTŒ=¥S(uÁöeÖ|„lî̃•.kÝ@ÍŒdìSlšAíyæÚ»ûC°øîÆýÚ<#hí¹N¿¦ ½g#’.&›–D}H!§V-ÖÇ—±?ÜÁk»ß¡.Ðdå}íÿ‘ÇB € Iݨ'¸Å5åù^/A‰ø—[ÉÈYk'Èð¼çµ~Ææ¼ùû‰£R÷ìêOÂ:[SxÃÊË|ŸûX%0F#-ÙÔ#xöÇ2F/ õÙ1H&5q¨4÷ Œ®÷õÖ7ä8&»ë…@RdTbJpãûž¡è|XFýâ”PQB¶Çë¸>ü ^ßûÞä¹}€7ô¾ žñ曵x$±ÐÀJY^(sƒÍ±Ç5‰F&ëÏwä´ÕTêœW¾ÁÇ+®›[¥*æÄQñ~=–qí¡§„Bå‚aP‰zŸyÏÿÆÍöȺÂ5ÙJÈÊ Y9š0Æ žñá}þEŸ{ ¾YY™jêh0œb+mëŒ7ÊŒÐñùáz@ é¸Ptœ7ì ‡ëéU\Úÿn¾ŽLçýœCÙú÷ ZJ^~/oKT¦rÖY ªHÅÔdsW¦BVº¬Lôñ;ãøå6€ú,] …$êÔûd"Hñý¸7@u08ì$Š­«à\-¶¡Y Xðö'ʰˆö[‡mÊJ PÕa)n½I™/Ò®ïü7•ˆÐ‹Î9çòJ: ‘S2r½¸g;QÏ !ÅN¾.¯_·²7‘é!îæ·ç½íσé¹/¿Íÿ¶UÖàæè"'ÅèY1BiJ <ùDuÐ.xÈkWÒbD¹û™ Vä9ÔŽ:ÚKqc•øÍ€æ|ߪd":æ°ã <±·÷bÎÀÑŽz,£&2{fH7©¹MNHº jÃI¥ùŸ;±UqDdÕ±‚„N¢®1¦ÒÚis§X—Wö¯'׆?IR}p\ˆù<è¿¶Òn»ø-j,ª|ÀŸT¶Àêá ÄãÈËq×f:Bº„:°Ö Ð9•¦¨÷Ì€—9Y`\“ÎÆ~K /þfð‡%¿úñÕå%û"PÓƒè'nnG=‰ºÈ«10×DcÂȯeBÓ.‰8¶!)¡G •8Á NÀiWÚbÍn¤×±š^êlWcmËãýËà“–×Á¾ùm3¯Å\,ªœ _ìæ[ˆ£þ”ÿܤaf© ŠeìÂq˜µG÷âÖ±71Ì„/½ñùÌJ(ÞNø™:Øk5&žbÕò¾¯­½¼¬·ÑôåH¡89WF|J`\Càñ>‘Œë´Ý°ÒÄK PÝ44Й]ÜÊv°³·F¡Y§]%·Ç«Ê:;_ÄÐà™ý?Ð(ðÚßâ¾°¨P7œ˜à3ß0³þ‘ Î7GYgÝ$ï}Ö¨“@>–{äÕ~SÛ ŒÆÎ™%¸™¯ø£È C½‹µô26²k(ìÃÒyG—ÀËúo‚‹iÛÀkñ¶°p“„Æõfööú»œúX&ŽY¶¶Í ä`žyFcÔÂ)GÅpþv¬ü Äœ¬H¹ÀzG ýd ½¸I‘L€ ½x ‚$J×þ±äx옉Bn'_§ÿYÿìäë÷zk.aºQ· ¦à^@;÷x@Xx>'o¾a&Ga "t£.ŒÕ h[ÕZå#©Jø½zçœØ¯LVŒlïüÜÄm+âýlÑâ­`á@Ƀd R(”¦`ª/IÄÞ0S Å=p V‰S2r6æPP"""A¥Ì€òJ‰ëêÅýZ–{ìvƒØa7¨ð0S$…ØÎ#aæ®@qmøªyyë«ý»ÅíÙ'|œØòë[, /6ºP¾Cï<ñFç€Ò4 5ÅT^'…tQ3’¨ "a•Pe4@@$ÅŠc¨œs÷ðçê´› 1ž,!4H“ç!ÓC\Ø;O?¹ûî ónœhû%œ~ÜU‹ÇbáÀó!IÕúû ÕÏËlR[O±JÐz”D'ˆýàǦ AÁ¨3†UƒWåQGu¡cfÎõç÷úBòs¾˜ºøÊ1ÑôñûÖx?Øyׇ¯ÍV†;`'åÄbüñZ´8‹/s M…´!õZý@Ò)uc598¡øì,bR"‚ª^Æ{ñ‘ï$’-¸OÚnDžd Í9øÀOç;ù:¾»ùeÜ]œ} ?sì[aM‹‡]p΢ðN=“Z}ÁYK çœc›­ŠfC6œ³ÈÊ´N¶ ûnÜG? beáÌvCÖ²bvöY‚Ñ 5XÉ. åØÍocetqV`3³îž€-zP[…íV·psï§Ø-nãÆáë˜ã‡÷%ÿV×µÝû<_æê /³•蚌³lÕ%sŠ& 4#£õ¡¤B.r:ÇV~C½ƒÍâªmh77züx‰ÿ´Ëûï1,ª¼ò“ûùpÆ}"£‰èò_bšoðþÇ€Ý¸Ì qáðÛØÉ×±ÏíÜkpïeð‘ÝKh²ã[´xOaQàÂ=¹äòjLW¾š â¤Æ …ôØûä;°Nã•Ýoá‡w¾>¯‘w ¬´û_´˜-ZÔXT¨ŸwY|ûÙÝ:,#Ìä‰÷ä›.+齑^Û߯½;_ø<ß/í–XÛ¢ÅÃŒ…÷‹!±!‡eB—â‘—Ý6³ÿؤØH¯butëéUì[ 3Û ðÀÿZµ]‹÷Ä¢ À |Q™Ɔs{ ‹¼â• o˜Å·–^Æ kÏGÎyÉ|\Ú=}‹÷Eà“‹Ž7ïM@k­·ßf*ïÆè¾¾ñŒª©Uü>x ÿ'€Ï¡ð-Z¼-,¢<à×àÉäN¼ãN¾¯­}~rÖßðç`çÛv_ߢÅÿ‹( _<Õý0„[Î÷Ó(ñÚþ·qaÿ¥É»¿³òÚߢÅÂ" À/€$…'zŒ¡iVÈñGfj©­ðipbm‹- Q$ôÔ2žè=…q™r0†³Èí/m?79øÏÍ3_ZÀu¶hñÈcà¦öt¢.”Tèš>2}ˆçW?‡Ô„ûý5€¿[ÀõµhñžÁqÙrï$ðôò¯Öæš |ãö0Òõö¾ü-ZœN{ à @"9ÂûVö&^XÃr7ÜçÚÁߢÅ#‰ÃfüþSê~åñߌòqþ$¡-ZŽéߨð䯩E‹÷,Nµ ø‹g?úôÌMÏø pòm‹-q|Í’ÿ‹½”-Z,Ï€·-Z´X0þë¡#¶îÃFIEND®B`‚pyepl-1.1.0+git12-g365f8e3/code/resources/splash.png000066400000000000000000030170261127617341700217020ustar00rootroot00000000000000‰PNG  IHDR²§Ó0bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÔ7&†Cƒ› IDATxœìÝOŽãøyÇá—ŠfÖ^fåËå¾J–¼È- ø¹BÖ^Æ#O¦»D/ªÕ­”HŠÉ/Ÿg1讑HV¡U¨ú½þÔüóï~jmUUUÛ¶ÕVUµUmUµÇWûýÏuòñoýöŸóµíÅ;4MSÍÕëìcMsþçã3>mýÏ/½ÎÄé·9ÌÕr%¬ÅþÐöüÿøXýXÝgØù¿OúßÏ}úÿ/~Ænëü§î¶ÚjšªÿûÕð6ì¸lx½Äx­O,`øÀªíÛösÈßwðß5ðïjºvèúIºi®£€ïA@óãX_?Úúzèü¼€í8Y9ì^z<ùó­ÕLÃVïÛŸ¹üŸï/ÿÞà®¶ûá—qÀipº3Àß3ý¾2À¿|ì+ÞJÞnÿ9è¿=øïú÷ø·õyÜ{š«Íþë*8>x8T}˜ÿÓp÷?öÇáÿ£Á×пsÐç.ÿÓµ7~´> NŽsŒ~ýbú§ö§ÃÿÏ??üŸ ý{ úoëÞIàGp|´mlÈgö‡ÏiþÙ]ÿÿO ýû8?÷g p ~ûjú—ö—wýƒ€£¾wû·Í囋·hOþóÑ–»ÿà†ý½»þ»ôú·ì Ð\þýämU}q÷?Ü´¯ºs×ÿ¡þÔCÿ³cŸÿ28þàÚþtøßgð?õпËe ðõÃøºìφÿ7¶û=ø¿óÖGMÕù>ÿ=Ž[¶¯º=ü4ø¿Ü}ZU5ϼ[¶ïþü÷öß9Äùßë3 8†·v%ÎíÿOÿÌàÿžãù›jëÃÝÿðÐþr˜ß9üŸànÿ¡lýýì«úÝõ˜a~[ÿ@?û»Ãÿîú?95ÐÓþÞðŽ»þ¿Ÿ~¾SÀêì9ü7ý€AöW™pøß¹»@U5UÕ4Ï›æô°çÀ“Ãÿ{ÿ«ÇÖùþÇ ÀÝÿ0Ü`äðÈÐÿîqÊðÆÚUÕìÃà9û1ÃX–ÝÐA¾á?,Ï®0Í7ü€eÚõ} á?,W¯Àð–ía`øËw70ü€u¸¼ë*€§t­é?¬ÆÍÀÖÿ°.·€w_ð”ηÖã*hÝþ«sÌqÀS¼@€³ µÿ?¬Òy0×UOñ@@à,hæº à)ç€VÉ[@¸ ¼ ¬Ïu €Õñàf`X—Û@#€5é| €F«ÑTÙÖâ~à­`îU"Xƒ‡@•–®WP%€%Û5¦úC ¼ÏnÈL¿m_vÀvÕ4½+óX¦]UUŸÀÝÿ°\»ïz˜ÿÀríÎþÖLÿ`ÑvW¹ˆlýËw{×ÿ“Àü–o×4U]°ûïsþöânÿ¶­ƒÛÿ`öU?nöoªªý|æ»(`˜}SŸÿÓÿÛC[nþ€õØ5MS'³ÿjšª¯îþ€UÙ5Uu||¸÷ÖfWUuŒªÜýk´;ÞúßTÕWwÿÀ*í>ß êжõáîX¥]UÕ®©úÿ/îþ€µÚ5MS_>Ú2þ€õÚU¹ûÖn÷ëo‡¹¯xRSe÷X»ÝÜŸq¬#¼ÞÐ×S½¦X9}\þî8vÈØçwÐ>Çs=†¤ÃX/˜×å¿Ñ©v" ˜€-9þ¼õ©µ€|Ïì"0æù,€òùÝ»ì$°!Èáw|¦öìNcŽÀHØ&ëôõÌ.]Çà@kLIðb`jÖ;ý×g¶0 ßÂç0ð.Ö ëúœÿàkÐA,Á»Ö'.ÏÓg˜|y·~ßóL1¨^úºÍÜÃø¹Ï°(` ^¹>1f€ßuŒ)ÖR¦Z¯ymgª¯… À²LµN1vèëüC×O.Ï×÷¹Çç=z¼aw7_`ÓÀ’½zÝbŠãŸomý?ö}Ž3æ1é¶öù|'–n굋)‡þmÝ~{€9‡ÐÖ{î]Û­€a­R>€ÞÀ’½rÝâUaÁ³ƒç¹†ð©óÔÏ àŠX‹)×0¦:Öéq† šÇÞ¡ÿÇõ¢!ëFs_ó=K¾6€Iíç¾€'œnÅ?õ1ïwÌàÿÑï=®Ï×t Ãõ¤·5¸ËÀZ< Yã¸7È?=ß3ë']è>o0ä¼S ¹û Ë×:L_ëu³>¢f#R ]ãè3€sÜWž÷ÖZÎØã 56T¸¼æ¹£sŸŸ<ïu “Hñª5޾Ç}´ÎÒwðß÷üò}À¾wü÷ ú˜{:÷ùY¿©¿ß lüà&ækÇú£AÜ«Î}<ÎÔkGKZ.å:X‡w­Ÿý^âß1]¼ l˜HôªAýЭìûñ=îÙaÎÜ[ð¿ûœ—çú¶ dú:ZÛº©×ó»ÓËésOÍy`¥@¢GC˜gÖC¦"vE K[³¹÷6}ž÷n†]Ü2$YÒëo¨±ÿþŸ^Ïiʻݟ‰…ú~¯úܾÇyæü@¥ý2 ðNïX9N ° ÙüÖþC>·{Çz¬Ëç¾’¡Cmm-ôÙÈaÊר+v"éú¦ºs¾ï1Ç|¿ú¼gãû%l„غw®¼j÷€!Ïrœ¡Çês¼)h1ÔV×BëÀÏ®¿b°>öØS~oû5Yòúºï°QKþà]ÆlÓ?‡±Á­5 ±Ç¹üؘãMÍ ‹¾æ~ §yåÛ(¤¾EÃ#}>oßó€N€únQ½Öõ”©†G¯ØÊ{¬¹ÏO޵¾®—f«kÎ÷À"lõ‡1€g ÝÖÚÌk¨ñ^¿¹ î€(€çÝZ_y40LÇpŽW»|û ¯Ç÷ó:èA01wŠÞ[—¹uœ1ë8SK[G2 dI–ôÚX¯U€7ZÚ/n[s¹6ÓwXöhM§Ï¶Ö}Luœ>Çœêºà]’×V½ÆVH°ncÞ~àÞs‡gèºÒT»# =L­+ÜYÂZ«×À† 2\¾Gù˜ç=N×:“$[0ÅÛlÀS=qÊP“­è»Îê5ÀË Ànî ž'€ € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € € €û¹/€·iïü¿æmWÀKØÃ€€mèºûßð „·Ø&ƒ€0€\îúØ@ž®Á•á?@¬ÝÜÀ¤ ÿ6Êëwoè_eð° vX7êÊkõhð_eø°)vÈdø°1€õ±í?WY ÿ6JÃð`à ÿ6n?÷0H{ñwƒªÊkbø@'À:þpF°>†ÿ\iêz I`eì@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@À?Ø{»_۶쪯õ>Æ\ûÜB„¯¨ÀÆÆà@ù)Hù?òl‡`Cl¨r\¶± ØÏy‚Œ\¸ \66ò)J"å!ÊCÞ’—’ð!F !˜{öšcôž‡Þû˜sí»ï9çÖ=÷ìÛ~Ò>{íµçšßûHkµÖ[#„B!„ò €B!„B!„B!„ByÐ@!„B!„B!„B!„<h „B!„B!„B!„Bž4B!„B!„B!„B!O!„B!„B!„B!„' „B!„B!„B!„BÈ€B!„B!„B!„B!ä @!„B!„B!„B!„ò €B!„B!„B!„ByÐ@!„B!„B!„B!„<h „B!„B!„B!„Bž4B!„B!„B!„B!O!„B!„B!„B!„' „B!„B!„B!„BÈ€B!„B!„B!„B!ä @!„B!„B!„B!„ò €B!„B!„B!„ByÐ@!„B!„B!„B!„<ú»ÞB!„B!„<ÎÏÿÐï»A›B 4UˆÌnÍß"‚Ö¶­£µc`¿ìûm Ïž]Ð{}à¸9®×cL8|ý7ßÙqB!„B!äÛCø»Þ B!„B!„Üò×þôïÃØæœ)êoPÀsÜ›wGk }ëè½ÅWk˜9ö}ÇõºÃͱ]6\.ZS¸e0sÜß_±ïMªàîps|ùëÿôŸ B!„B!„¼ 4B!„B!Ÿ~áOüˆ´)TsL˜¶­ãîîm n–ÓúfŽ9 "qëÐÖ *PU¸Çdÿõ~l—Žm @!"±ÜýŽë¾£5EÏô€ia2cbÎ ³øá§ÿÖ¿zû'‡B!„B!/…B!„B!ä5ð?û}7?»ûÍã9&öÒEš1þ!Ð_×$¿¶ˆø‡ûÜkº¿µàþ~ÇØ÷4L¸;zïØ¶¾Þé—‰`ìû>àT­éª¨(Žýºãþ~‡ªârisƘÃ0m®Ä@Ò¨ h©Úp¬åÌ?þÍñö.%QQm IDAT!„B!„BÐü—ïz'!„B!„÷™‡âÿc˜… /HÞÓ n†ò ´Ö–8owhNéÇkž^þô „¯a°éØÇÀœ·\2×ïî03 eˆý‹ZÞ[Ö4´üjý)ü·¦+E  kcbŒHøÿ£ß†ÿæýw¯åB!„B!äå0€B!„Bù„¼Šà)f7èýœîw7L3Œ}bÚDïÏî.ìûh="ý@äë/_æsb¿X©õš2ôÞñìƒ;l[‡ªÂ²V`ßZS\¶ ­·0ävÜcN̉,ó‚ªä²±ŒMƒÃÑTqwwÁ³žAU°_wüÈ×þÉ뻄B!„B¹¡¿ë „B!„BÞ'^Uü°twƒçÏ"ŽðÄ伪B[ó6ClïÚÑ{‡H¤´ª2öHå½ÅóÀf ´i¤ˆ@Uˆ¤ž‚¾-Ó@mëØe@TÐ{ÄûG€ ЧaO£@$ (Tc;¾öâ#'!Ca­ák?òE<~…ÃÑ[ÃårAï-ökàGÿú?ûÄ×…B!„B!4B!„B!¯Ä'þ ÷˜ÎŸÓ Kn?ž‡„xÞTa9‰?Æ„¨¢µ†ž1ý€@Erù\'f®Cr™X׿¾bý%žŒ UwÍ$‡¹Csÿ¦Dc_T$ ²Ö[_µµmÑ0¸ÙiY@ Ë@Pû“ Ä2´)úÖÐ{à˜)ßüêwã‡ñâóM!„B!„|Þa!„B!„ò¾]ñæ4Ø Qˆiû™U’Ë•ïæP´Ö°]Ž8 *+`Έì¯8þÖšj¦ÌØ>bšßr?b5¾*TÛeƒŠ`sZ ö}EúªŠ–&ƒ1&žxëu¡_dC¥â.— —» ­5¸;îï¯xþá=ö}@UpwwÁݳ Zk˜sbN‹DÍd„¬˜fø“¿ð?ñ5 „B!„B>oÐ@!„B!ä½å×~ê…О¹ŠÀrº¾Dëšd/8&Úß$5åïæ§øÿx¾&èÝ}H}–ønîPh‹è}–È/*˜Ó0R´ûò÷šb Ð@!„B!äSñsüwf<2þ¸Ý'Üõfù%6Ë’ðo¦÷Íû¾C$zékR]›pØÌIï#š¹=¿߯¤ÿ‹pGêgœŒÇÑZLæÛŒIxo ìÞd„š*ZÓ%Ê»[',¾{¦l—ŽË݆¦!¤K pÄé‡I#®Go ½7¨ÆºuWŒ}Âl`ZDñG›Aœã¦m߸F3‡L9e„!ÄÌ„Á`Û:Du¥xž§z<ç\¦ˆ¨ (ƒÁí}ôºÔïú𬠄B!„òî €B!„BÈ'æk?òňàωp÷£ÞÌÖô~Mv‹AøªÇÄ7€;_±ï–ÝòcÌ4 t´ê‘@$„cÑCÌ6³‹!Ù0NƒWŠÀ›â,òÛ#)õû³¨=ÀÁ\Üâ<õÙU;q¬Ú4§ús8< ŽØž{%æ44miž€X¦Î™»/ñ¿¥øÄ5¨ëàéb¨Iÿšº¯¤‚µŒa91¤þqä>;[51Á¯ëüL›y e£™¡µö‘äàl0yw /ã“T Ð,@!„B!äuA!„B!„Wæçþøï‚b"¼µ5…#ÈJĵ_¶ ½·êhzÏ‘ï£?^ Ò!rL»û2”\bsQÆàcŠÆ÷ÈŸ/ݸJçëûÛ ÅïU[›GÆçß,šâwÄàOÀÚúä×ï¦a—‘€v¤)bª~ªaŒ0 €žoÿë¼.-£ÿþݰ‘i¾^gîËã æÅJ¸§¤ó©ˆeÆ>±·Ëå—¦;ijÆ`™"üœ q{Ñ>ÎÀñY˜þÿv(³„B!„B>-4B!„Byeªç½[9•_K„¼õŽ»g[Føk$XLõïûÀ˜ÑëÞZ[bxkm #ãqK_ýócN¸;ºZ“\ÿ©ÿÝkâÜ¡8Äãxôvâšdˆ¤ë`MÓ㘔?r믂y˜"RHŸÓVÅÒäpZE{“8gepÅœq¾v+… êZ$-˜¥È.)ÎLM1¾Ö„?"éAO÷Ç Ä|ÉkêpTËÉþ‰ëu}iíˆ÷ÏíL3¦9Ž1âŽk'™dð7ìð¦au!„B!„O „B!„B^‰_úòw`޹Äy,ýÿ¤EB´¿\:zïhªk"9-¾ïXð­áˆÉw õ†ÞÌl™jÂÜÌ0ÆÄuß—p½m=…Gêß0sÌyDÊ—A zäe¥¼ JŒ¯óãsfeBV4= ÓÖiõZ>þÂv“œÖwÄ1N[⾟ 'SF&Tn%²‡± Dö‘û$µñ½…(?O)Uï i4Èé|—ªñ?*MèÈõĵ©ëtmk}€ÉŸc{u­2I"£Þ_™ÿżju„B!„BƒB!„B!/åoüç¿?"à{ƒÙ1þ‘)ìŽ+f~3&ºkºÿf²;:êÍ}Eà·Þ MQ`ÎC¤Ö0xäêGÀ4Ì“IÀÚîMt½š¶·w²Pf0Ñü3#ó/²È8ü4K¸;昘*­¯ßÁçZç´8ö±%ÜG}@rSPÓóžSùp[‰ä=ã÷«–¡*õ¡ÎiëQï MÓ€¬vðSíA¾¶éšðŸ³-óˆ6EÓ0?´¦‘ްNØQyPgNÒÐPÛ@¥*ÄA½ýz‡wŒ»ã[?ó%üÀ_ü{ïzW!„B!„|Æ €B!„BÈKqœÝÓêsÜŽ(ûÔö³C>£úsšû²mK,® |K3~î[KÑúˆË7w¨9 1Mß{â6cÜìs‡¨¢µcÎxMµ¿­tøÃ€Pg/Ÿ·8&ADàkí¢* Dïac´µ•ZàÍ_«›sb礃¬0B4mêá*ÈŠëÇ1¡_ûîUB|©ë­…ø÷ì’FXḬ̂ïû>0§e€.ó@CT9xš7âZ¶¨ CCÞ3q, ’ÇQ€µoæy¾$«?¿æ‹øâ\mp6·üíÿâ/ÃÄò—þw¹‹„B!„B>#Ð@!„B!äcùë?úû¡M×䵨@3н¦¹+.^$¦ÊÇÑô’Ž€Þ;¼ûšÌ¯iòØÖö/wzá×ÜBô ªk2½©£©ÂZ$X¦T<¾çôûЧ@Dóë휳³øïë8¢³ÞáØzÏD„Sü}%ý#k€õ;U…™§H?1Æ\çVE`)ªÃªi~8™Žóžé Èú…Œñ÷¬h™«N vFªÞ!*.—m‰ÿu^El®naÎhŠlwH³FܪŠqª‘¨Šƒe ªŠÞ€†2ƒXÖK¸yKrûq¬šF‚·Uíð69 þ‡ GG^²¿óçÿȺOÆد#R&.ô¬Ê¨¿Ï?ñ ÿð !„B!„7 „B!„Bå—ì»B|yLž×Ä:F,³â%¸kFî;ÆŒžùÖt­Ï<"ÿ§ML‹ôÝzïØ.!þ«JŠ˜±:£êÝs»"pTm@ÇfŽÖJüMÁ{:к„ÿ#–þíáKØ/#ô­Ÿ¦çóXµU…Ð[MÈg²½;¦…éATÐ3A@Í0gT H¦˜;$—+¸Ìs¤yÒt© (ƒÆ2Ä7ÕØ/ÑJoA:Lºbø=+æ 3À4[f„05Äk#¹!®[%I cN´Ùnö£©fÅA,j戀€§'ú„ÔIäSqÃyQ!sÆßfžÛ_úòw`މ¯~óŸ¿Í£ „B!„ò àÛçsÔ.H!„Bù¼ñͯ~w‡fK`ÞvidÇD¹Ú!𺇸ïðÕ ?gˆösLÌ1×ïwV¹Œås¿šîŽÞÀØÆœYû[1ù"À´ØŽšbÛ:Üå”$páoÊ p^¿K˹ ö\“?3Íàw¸ËÁ#¿¢ù?²h迈Jac€bë 蚆ŠÊ#ˆ•¨(´®ºâøëXÊ”„8½îKè/a¿µª1HAßã:iÐv2cÄ$¿‹CÓØ¡M±¡G"AŠ×û¾ç=æÐ4’„è¯k9mG:ÄSäl€÷AU!Tüœ¦L×¢Þa3Ã~=L3ž7Šðµù"~ì—i „B!„§ Ÿðøi~Ê@!„Bù\c)›{D¬«¢wÀKðMA¹¦ŠŒ*OºDk·ˆ#u:’Ü|uÇSé/¹\™¦ü:`-í}±N` Îf‡è®*°œ*¯‰zÃâ·òoɘ~GDé×¹sÉ ±O!Å÷Ö ªñF3‡º+åš6@Ó“!KÃ@ÄáçRœ7³%®÷ŒÉ×ÎÍíÎómT&(|8fNó‹ š´X­;®×2f*"ÛŠñwø­`­yŸl.wÛª’¨˜úª8hÛUUh˺ƒL¨åD±ÎÁ25¤ø“¤ðï–ÛctsMÜçZ€Ã(’—0îŸ4àÔò‚¬–pÇ/ýéß—©qÞ#Õ¡ÃáØ÷8Ð3©ãG~ñ¿õ#'„B!„òÉø<üÁÏ/ûdàáòŸäµ„B!„òÞñË?ö]kbßf4Æ«†|­Y  M±]¶˜ÈÇ€eÿ!@o—l®³âÞCá6ÅÛœ~_¯“xMˆÛ’zˆžñÚÃ8P_sJÄÆ·†¦ r©ié¾m{›oä—#Þ¾¦¸§M˜Ô#•ˆsÛšæävÈ·!–ÏœÖÇqüó_µ«R Ï»Îgo [ïè-„|m u]õ †HyX?Ϫ ðŠ@Ã3Dx€:Ú:®J X5*Ø´aÛ6l—žI)â—€= Ö"Æ?,‡ˆm&w@kÊY#aMÚ:oOWô?¸9<Çšä—Æ€9g<çgóHš)ÒxSÆx\“ª˜¨ 9çJøpwŒ=R;¾þ•ï„»ãG¿ñ›o÷B!„Bye>O€ò~"T?¿Hø(þB!„Bž ßüêwc̉™ákBDCL4 uIq>ÔÉ#š8&Ô3æäúZŠÿÕåÇÔxm3ǘSæ,Ó–9á̬¾ù®èÒ1ûï2ÀÍO‚mì‰ç4{¸†“¹"ˆ´‘œ–…ŠÝо™¸ÐZöu´Ör¢ß×¹rÒ¾•‰"^gî:}yMšjš 4W*²ç>iØt˜åQäzÆœÀÆkjÅd4ýó0m ®Æ3›A[‹¨ú}äuõÒ£oy?6&¦¶ 轘+õ¡Dí'— "R!¤U:ùV¢’8ô¨°º^ÌŽ”‰ÓG7Ë›¿ÿ0wHv~éË¿?úöÖŸB!„BÈËy_ ŸdŠÿeBþcËPü'„B!„|.™Ó–°^ýØ£ Há¶„÷€UÒN¢qršM†BɈþlK´=-ݪßÝ­yˆÑ)xVÔ¼¨b7Ž´Íu• ÆÁ’ÝOÇð¦ßÔb·×i†ðeœ(!ÜsÛÅ—{²E}‹ ÿ™ÝãËm½ã²mh½‰ f!ÚN[÷H°5­?b]gE¥ (¶­CFˆÍžãä‡Àîk}c0³üÙàÈ„:^‹éq Ì@¤Týn†Öã˜öëë;]Kki£" bíÃÔûÔnkžrÜ»%ôg’‚Ü+§ˆÿŽ›z³Ã0ãfY:Q¦ü ätÞEÚ3ÁØ1&0}Ý#¿òã½7Ìix~Í¿YŽÖÖ¾¸G•@SEß:Tÿé_þ¿ÞÊ™#„B!„Ï#ï›àESü„B!„B>%3;å[oè­-Á_ìÍÝ 6Q^S6 q^2êÿ#äª!âVT}ÅÌ‹Ü|yŠÉ1Ý®Kl® d•ŒÊYƉ}îýv ¼BÖÔüñ«·úñÈÌ×ùÕʯGˆõn±£¡5I‰cCŠª:'®×Ó&1ýß·͈} „Û®!äN‘˜þŽΞ÷0¸9`7]Qÿ­Å9,Ƙ99â~™+jÒ|Œ Œ:&Yu¢Q=Dg¨‡`?GJœ®¤ª70‹›§*朘àEï}Mª§kâ8×ORüÇÍßÒªÚVz†™ç2GÕ+ê?Ò&7]³aðUIáÓá'3ª¢iCï-k&®G•€c¥„ˆJ@üHñXœ¬ ¨:м'ÍóÏüAˆ~è¯üƒ·x& !„B!äóÁ»6œ…ûÇÞªSØ'„B!„·Ä/þð1§-ñ_›†øœÕ‚iû>BìïCnSÜ+ÆŸâò}Í3¢>Ÿâÿ”œ#õĪ8í„d)€jXSç½7´Âúœ‘C½ÅC8~‚qí+°DÚiuN%ûÕÆ1ÍÙ°m}½¶¾»âj"¢F¡… 3§³{oqÜ*¸8¢ÿœófûf†é†Ö"R^%„u©s^ÿ^ eÔÈ3é¾fˆ¢kLékFÌ—ñ@€e™b¹~Yµe°ÞáëxW…ÀèÞÂø¡}Öi~¢â?€[ÓJ2}ÃwOㄞR*¡Á2Ñc® Ïê€EMéçߪ¥1@Íó:nñ÷çÛJþ(É^î˸R×ÞÌasbŒ™õù7¯±~ÏõÿúO/~ðçþþÛ;—„B!„ò9àm^$è×ïä%˽êº_ÅPðí~DðØþ=å!„B!Ÿæœ)˜#Åi¬éñÕ;/1Ùo ‡‡ðhæpÜ—B‘ýÙ1/*9nKP¸`‰‰ÕswÌ1€‚¶V,ùJ ð·ErbY“ö“Bõñö­úÍËK oøm\íãñ3Öĵ¥(^†€1æÅ_ç>w›†}+±À󜊆H_SÝsÌ%¤¯$ϸ|;¾ í pàzµ›ë72¡ žSÕ¬&ðS„ü!ÞÇ2ñìùúhN{§m‚¸ Àœ‘ø°ºë%* ÐLýH’ÀÙDQµY9‘ÊvÝ7OòùÉÓmÂD ®p?bê>Îü#RÇßÜìOi8™ Ìa§¿kUÍt›_nY °…9£’!l®ûž±þyÝan+mâ"ÀûÏýá¨x~çÞgºCÜ_?ù7ÿŸ·}¶ !„B!ä½çuÎâýË–yÕu½Íe>íGOñ#B!„BÈç ÍémĤpF}ÛI¨/q·åÄýšâÇ!RºLN‚mMŸ’ŠŠ!_“í9-\fÁ!@žÅí«¾„Lw[¢rÅì/QÒ"ú\Rø¬‰ü7Qp+üŸ:Ü—$ŽÕ·^††2V@òüC!Rq¤+¨àÒ¶tL6m1¼"ÝóÜÌŒj¯ÞøHèh-âàek,óD]sU`'q¿:é-£R4'Ñkj)àŸ¯ÙLBÓ¼¦`ߦšÄzZo‹c »ã£áœßnëêÜ¿éj‡wCÞ#­Äù:ïzsì#¯·J˜GÂPõ%êÇ´~¬5ïÑvœÛ¨Ùh+ ¢¶S×ñrwJª@TQòÿ‹¼‡ê~«¿Ãa6ª€hÔD™(pª€Çu5wü•ü]ø©_ÿWoúÄB!„BÈ“âÓØ êŸd’ÿeSõ¯»àu}ð?U „B!„|ÎøÚŸú½!Äç4w µ3;à+RÞÝ£<ÅèvšÄ–4<¿kŠûôÏÑ'_Âwö™#£È{‰âªÐþcîË8}EÆý×ä|­»Bæ< åÍ#Þ’ioX(~¸~/a[މxÐòœF CM¹ß®§¦ÝË qt²çñæ9ªÞ÷9&Æ>ÒCÕ}ë!° °ü•6ëŸ#¢Ûµ)º´Ûéÿºžy-EâškV”ÑÀp„¡`šEåGÓ›Zd2…OÇž÷ÓMª½þ&€ü?CðWÿä¿1&~úo1 €B!„B^…³à¡Ø.<÷ª<­¼3ù6_ÇÛõ·ñ–ÿ±ý'„B!„÷RòR0UˆIN܇ Xâ«{Äè£54Q EaM‘½&ÊÏoܘÿÖÑ{ƒ¨ÂæÄ¬n{Èê'×òQëJQ?ÑŽ-öál,˜rzsy_ñÿ8Öû¦¦ÅšÖäWôÇâhFö»cŒ‰Þ'¼Å1yÖ¬}tÀf¶žÇ<愊Â{LP»Ê9láTÝ ë:šæ8ÌR×\€ÞÖ[Üy—Á|iÐ"%¸ëŠnä$ÜL‡‹zFǯԂœL¯èy vF âë:zës»ºí›Â]ßÈõ|œÓ4€ú;ŠZ‡³qfމ}ð“ç\¯¡÷ÜeëÐÖàf¸^÷õw_&Ñ0ÏÌ)+ùÃó¾{˜„tNŒñѤ•þ`ih7)e$0‹× ™«N¤µ¨x¨Z‚0‰¤ÑH­?ÿC¿æ×þå›>å„B!„òÞÓññ"ÿë˜â(ö¿hYyðý“òYxwÿ˜ñB!„B>³üêO~îﯘÓBœU͈y…YN]¯©þãm]E‚{‹¨÷š:®hq7¢3æÄHáÒJX¬Èià9BÜm[ÄÿWÿøMš@FçŸEû„«g|`N¿‰?R±;òVÞµ=ÿKø9ì#Æ+B GÙê IDATNƒN»YÏ3“ æ›–& ò¼–`Û²>ÁzC›sMÒËZDÅÏ9#Ö=W×Ð#Š]Énv…®‹±Î¯ ~c:(º¦ú%'zš Ïå´Åq”è«y},²çã¼H¥JxFÿ×ö\ï • oÎØñ®=î—i©ˆœº?_›J{ðóߥê:G²LkíGm„P÷F^›9fløýŽ9&¶­ŸÒ4R!Ò$bp ‡Ç4¤ÑÄÄ3Ru±žHz˜+ÝB÷ŒÈ§i±$„B!„Ï/z÷ô¢Iü‡BþCáû“$¼®wãçm¾ËwøOçÓB!„BÈ“gNÃØ£—=Äc]SÃp‹iìŠq·³pgù…“¸íG ¢«¾§€‰ú3ËŠïXט1U>Äà‘z]lâmˆÄ+ÁÝ-'øcB䬩ö–çÒ`sfç{䨫fAÖõ 1UŽHþ¤¢÷[¾ÖÌoߨú±C5ùïæØçü¨|H\k‰HwP‚ÛZHˆ´in˜y®WÅA¥, š&†vºÆ'¿Ï‰ý:ÐúQâö<**GÍ„H&;x™^÷ÕûìPWYå¨Þ(ñ?L;a Ùz‡ˆ`¢ˆéú¼ß–ñ¢*8Än*¢R#þ6E2–¿R Ö4¿­é|=%@Ôß]kºþŽ›Æý'bPSL™‡! ¶g©8 *1¤5ÅÖ7l[Ç/õ»±ï?úß|GW€B!„B>û×ÿ-U1RéžUSáðÈÿâïýÛm«$„B!„Ï/ª8óPؽÛ~‘±à±´KxSÁ›æé|š@!„Bù\ó§ÿÚÿý®wá…|ã+ß¹Äîšz¾‰Ö7¤39Ùô!+¤UÝÀÁœlÞlD¼ç´¼: jkfa“¿Læi(qض¾~vwøžÓúªØ.ñ»m‹)iU uæ°xÚ­÷ùϘýúB¼ñ¶i~ô¿›yVoÞKÀwwìc„`_ÓûÈd‚9#Ñ õ_§”¯…H4h- ëšk9»9pJFp˜Çyjíi‰ÿE‰ôîgÁÝa+!ÏSó%Ì›ºvôÞ!þªÕòþ@º ½×òb@›æä¾¬”‘x­£Œ8vº§Ó4౎]Æ2#ôÞ– OÃ~ݱï#“"]BDpÜ…9 y k _û‘/âùó+þìý¯ßà™'„B!„÷“zÿþq_öàëü»ñØ:¾îãj>n]À»Þå‘/B!„B!o/ýŸb¿Œ11Æ aR5ûÇc’yMÜ/£À!tJ Ë%$ßvÇûé_7k¢¹Dýš¤oŠËeÃeëØ¶/ôîKóˆ@齇»p áÿÙÝÝÿ«aލvc,avéã™P5’•-sþç4ìûȯ} ¶c«¶¡õ˜òoMOÑð¾LcÄòs 8€^ §ëvþªXùó5­ér9™T*= ’æ´›m?5êüD ‚äyÇéZ¦)ãæo%ï]ç®î¡Z÷fkQϰõ¸7·Ë–išéº’€0Øiÿ¦Y9Úa4A%d2DAVºÁ2Óýe:PÑe Xµ ±D?÷Çç[¸„B!„ò~ñq /Šò/ÃÿËüǦúÏ<ö;{ð|mçáö{ý˶÷I ÈO!„B!Ÿ¾úÍøÅþböwôœˆû€ç4=P‚<®‰é+±Š€çc’úM¼³‹ÝR˜]ërÀ²û D``Œ0DÔ›x¼üˆê¿îk{sÎa7YûyLÝ+€J% ‡È~J¨\8âå±Laxœ5ø2ÄÔþ\ïþU˜°Än”Ø|Ýç´‚˜?‰Ô¹ÎªˆÈÚ{¼éЇ·…§ð®­“ñ)®«ÆùÞ÷cNpÔ@d Äé;*ÖëÞ4’öïí8á(IÁ=æ5´I¦Q„q`šaßwu*9ù#‰`Äý¿]:T·¼eíC™a*õ¢ö«m Û¥c»ôuÙ cL˜ ªG:À¯ÿô÷âîï¿­ËB!„B!ŸY:¢ÿ"Á½>7x,þþ¡0ŽþׯÅéñc"ÿcÏ¿h›¯ó]üûÿ‰!„B!„o‹ø‹o=þŸý¾×²ÎoŽ˜r—–rvEäãivSKPß—à¾&¢©éÕ÷}¬Õî׈è¯ezoÓžâûØÇê”·Óµ[l§©B·Hcõ\ÓjsCdÖU± zĽÕí8wì×XŸ¹aŽx.}‡Z&!ôûž)qjbj¼ªΑò+Q N«ƒ@Ÿ„ø¿:j¼L$‹v$'´ÞÐ·Ž¦Š}˜sÆô¾eƒoÀÖÑÆ 0§õ ÀºncúšÈ×ֳʡìûÀóï1æè½Ç¶Æ\5f1þ™ÚqKFûxþXhÒ ‚iñ7s®¨û[ ø•Ÿø€‡Ñá‡þÊ?xÃ…B!„B>›”Ho#€¾Î?×2•é7<^¾ðÓÏgcÀÃçÎËÜã‡éU|»<¡O!„B!„|¾ÿ/üÝO½Žs½Hˆ‘«G½éš~ÖÓdýÌøûTC#¾Ì%â1šö1­?ÇÄýýûu±vNŒ10ÇÜ¡9_“órÚ6Ò°_czÜ-ùíÒñìÙ_øà>øàž=»ÃÝÝ>øà|á|ð…g¸»»d¼=IãÆ˜3¯³™­^0vdÊ€„QÅ-jBlŸ±<âÔ¦aò¨ûzMæûªž3îÝ2HÖVxÞÛ• Pi–"ÿJXé†ýºãþþŠëuÇ#Ób-®×=“6=Í)ëÏþïà:B!„BÈ»§#Dýñ0Òß?æù‡üEõ?|çý¢8ÿW‰úñž?!„B!„Wæu˜ãïü¹?“Ü©VkShŠðsÌœx@г í¶7½_m1½?ç„™¬©nÏÎö&¨@]à¹üÿÓ`àn¤ç¾¶è·Ø‰›7û'1ÈýËÈdš@ïmƒ»g%AÖ èQcpŽˆS[qñõÚóãs­B¿®xü#Ojòÿ8–¸Ç‘e:‚ÆõÔ¦KD7wˆ†XÆøWRÀ˜jWÄ=Œf)¨ëZ4 µˆyÔ¬aÈûðˆòוP Hñþæ:H®Û1Æ€e2@™êºÆz{¿ê0¦90©¹iuOše„*ZÕad¢Å¯ýÔZ&?ñóÿðµ^B!„Bù¬"þÕƒç‹áìu~L¼—G~ÿðñcëü$F€½³:ïú !„B!„¼÷ü?ÿGB•#Þ|ßwìט€¯^ôR= íE—Ë–÷HÁßb‚z̵œ#¦·çŒçz뉮v8°]6l[<7ö‰çÏï±ï1°m_øÂ3\î.ïÄìÓ~Ô„Øîæ¸î~øch­ár·aëÇØgLý— Ü4zè[DùïטÞÒ Ç÷# ­…  3„æTy™"Šÿõø}6œk!ê{*Žãª…9gTdÊkêßfÜ+Ú4’z?¥OÌUPŸ¢¬X}‰k‚û·Þ±]ú2ìûÀoýÖ‡¸~ [ûTcL<¿¿‡MCkQPõex©ãÒ4¬”·H#É{ÚVÚÃíu?Ì ÛÖWÍÀœ¶)êiS´¦øcÿÕÿùv.!„B!„¼#À¿ÀG'÷ýÁ2xd™‡ë÷úàµòÈòçïŸ{ñŸ“ÿ„B!„BÞ[¾õç¿”qõ†9 ×ëÓbŠYCÉF½Ív˜üª¨nô2Ì1þöŒÆ#¦«UI|UÅݳ îRà)Üßß_á~¶Ë DংÖ;T£#~Ž1#‚½Ö½_®û¾&ÐWåÃÓBnM±mTÃpÝ3ê_>’ ªëgK8Žøùد:G·ññÁû,þ•|€¨4ˆgÖµ‰üþ™Sôî€M;ÄóLH¨iø1°m}U8ÔóîÆ³e ™Ó°]rY !½®ŠÂáØ¯a¸^whÜ].¸Ümià˜øðÃç¸Þ‡ÁC›¦™ Œ#@帶Uaæq/åï{ÜHìÓeƒ¨®TÐóÞr„A¦µ¶Ì.s÷üÀ_ü{oõ:B!„BÈÛ¤¸âî ‡˜¯xÜ –}(Ê?|8 g£€Ÿ–û$Sþ/{÷þ~¿»'„B!„òäù¿ôêä¯üÄ÷``bì##÷CìmM!š_0ø!„B!„râ?û«ÿ_ÿÊw¬ø÷Šþ7oèýûÞSh—ˆU÷c[o¸»»`ËxýX8¾I)­‚awšALBt×pØx[=ï" °%Æ—Â- Æ÷0ôŒ—ow-âû«HþÄaÈÎúü¹i¥Ät·èýøØaMÈ¿ïøqMÜý°j¸CôöcOñ[D`>h;®÷úÝ4ì2ÒÐVò‚bª~Z\ Drƒ#¶ÛfŽe0)")¢ •BµvS_`îL0pbÑ£Ú ü(±?"r{o#–ûÄÞFÖA&‘JÆ0·›{ü¨†¸½Î÷È·~æKëyš!„B!ï;e(Îï†ÎÂþÙPÏÕïNô?Vðqëø$Õ/â ¼«'„B!„Bç+_ÿMÀ7~ô;³: bÚENà)ž:XŠðƒ¾m[v³##Ñ+î·mËX}Í”˜Ø|õ¯÷]"0ˆÖ¤œFeë«* $µþ¾õóõ˜ÆžÓV仪B{[ÇËRPÞLjýlŠó"ï»  &ÙÅ"ù‘Êš¦Ç1)_ÇxÌ㺕sÚ2bÄrr^EéMÒ<’†×u-v+… e’™êûjޱLM1Þl‰ïUQ0ÇL3Iíh_<€4|d…àp˪XNöO\¯Q+ÐZ[ÉZæ³øÐ*o²#<á69bUT< Ò¾ÿ/üÝoãªB!„BÈ»Güï§ŸŽ˜ÿçÏë«=øýcË<|,ó*âÿÃÇ÷ŸB!„BùÜñ‹?üÅ%È—ø9ÆÄÓ&Ü}ëøàÙ]ˆÿM—;ÆÄóïñáó{¸zöÂo[‡@°Ñþ½¡ç$½vßlNˆFvÅ×2cØ÷˜.ßz‡6]¯{̈zoxöì.ö}Åþ#'ú®×}ß¡¢Ë$àd8ˆæ4ìûަŠËÝ%á5ñýþWœ§çã{ôÛÏ1 €¦QÕÓý×ëŽûëUÅå²A5žŸs.@ë ½DüiKܯ{£âómÚÚF«êˆšÐ‡`Ή1çÑ#Œ'q½æ4ŒL(ªŽB59ï§Š€¨µÀ'™fa.ÈcPôÞÑ·½¯ˆÿ9gVPû[¿Ñ\¥Çã¹=꾡 €B!„ò>ÒìùXÌ|Üò熣"@ryà¶ÀqL÷×s'ü?|üq??ö¯ð×:§…)`]ëUà1™¹©¨b<§ò‘u"‘0Æ„gü~‰îu=Ueݛкâ²m!Òç±Y¥¬Úƒ|m ù*‚9[¤à0%ôÞÂpà§yþó}”Oľ`mrú(ëa¶eò?û}¹4B!„B>ë€ÿÇÿï–ËÕãú~žò¯çK8?Æéû¹^à“ˆÿOçÝ;!„B!„ò𸛿ökLIW_:Dp¹lØrÒ¾ª戎öýºG•€*¶œ¦6sÌ1àb~=¯§)|·ˆZ_“ýl=–«éms_Óßn5B¬¶H(1¿÷ê£Ï©þë}ñ¹žš{ï¸\âXÌû¾ÃÍÑúÙð4 ç©ÿsÛâ~x~Ü\ŸH0€ÿÝsŒ9±õŽËÝe¥ìc³Zˆiù='þ—hˆÎךø¸c‘üæUç ð4̱ÿ­µH0ǘ±ÍªhMñìÙîž]Ö5ÂD°g‚Äœ*’×5ª< îQ= *kú?j"ad:ETZh«œL0ar-ƒ@ÔfT ðò{‡&B!„BÈgð?ãVð/Ѿ=x¾¾ ÿgCÀCs@}ÇéùKÀ#î+!„B!„B>ãǾ 6mõ¥Ÿ{Ük*KtŽ8÷í²­˜y+~¤è l[_F`Œ‰ýº/¹âù÷뀥­MÑ[Ã¥êRÈc¬ î9&¦E@ÏmT¯ýõþ wǶmhýéÎâ¿gRCuÖL]ÐL~¨8ýŠÊß÷÷÷רph —»-êÆÄõº/s‡D\BˆôY)pŽæï­­4‡Š÷?¦çÊZ¨Ä›a0¯(9* JtÁÝ݆>x–õ²¢øÝýºãÃçÏ1ö5y?Ù´0™äÏcÝSqÀ˜×ûûPÕU}¡z¤HVŒ9á™F!"™.q{ÿ¼*4B!„B>kT€â6Þ¿ã6æÿÌÈÇãÉ þxðÜÃõsêŸB!„Byƒü©¯ý|ã+ß UEëmMó»E\¿jD«—8 dO|Nd×d¸7G÷~D²§x¬¢9Aî+‚]EVçüŽ‘Us½¶Û'McÙ¨8Äè0&„Y¯Éx÷§ þß’‘ø'#ô­Ÿ¦çkÉHJˆ)ü¸V½µe¼pÇ´ëKäצP3Ìö’)æÉåPºÿªeˆIÿ•<€ˆäïY€Œû¯ý­O˜Îõ¶¶)i.Ñõ)S¤LdUÅŒëÜZU (Tãµsªþ îUø!ò·Ùnö£©fÅA,j戀€oÿ~y¬&àMBÃ!„B!äet‡x•rŠxKd8ýúýùñ‹bÿ¾æ13Ác_ô!„B!„B>_þú?üêO~OD¢ï+±>'ÀEÐÓ3-@M! kjȈú³Ø+§o¹Ð9¶]›¢Õòâ²e}ªþ€$…àØ']Ýò±¾±á¸‰rM¾ÿ%”Ð."pÁš`÷Ó2©Ä,~LÛ×y¼Yî²®H\cœ"ïO‹†/ŸiÈåD[o@׸gÜ£j"Ï»ŠBઘf‘ ‘Ç¢*°“™äzÝ—Ð_Â~kq +ùÁQ/4hƒžï;s¸8ÔÓÐz$XÜ_û¾£â´E@eˆþº–Óv{o}Ö)ÄB!„Cü÷6Sü=o8bÿÏV胯³  ¶ñ˜àEâÿûñ®‹B!„ByÂüêO|Zo€9"–½÷~3y^„(|ðf!ô^¯;Æ> *h}îæ¶&¶c-SRÄ€ê¤O“€¦P¼ââ÷±äžÉ%?Ž_‚¶¢ø+º^2Fpì×9'DµRú#Bßcc,!^$þ±91³¢&ìk»•ÊP×ýrÙ *Qãà¶Ü<¶1 cÄõÉç‘UµÚ?QÁeÛp÷ì‚ÞÆœøðß=ÇžÂÝ3Û¶ár·¡µ˜è¿^wì×}ÕÔ½Sûlv$TµA¥W‘ 'hU(œx_î!š!„B!!þ;Ü ý‡àüóÙ §ç‡àœ€ÓwŠÿ„B!„òåßüÆMá °ÊnQ›iÀ>C ¼tAo±Œ;CÄ‹O*šý{ßÿ¿½æ#!o‚¿ýçþ0€ŠK pŠ…koÓ"6$&­÷}àþþŠ‘½óº²èƒb5;ã-§±¾:ÚšÚ¾÷—°Ûáÿ}n_…s|¾eü¿™¯Äs;Eâ§hoã×(”w3Çœ3Œ9•¯§˜ÿ‘FŠ%„—cµ ½7lÛ†m‹öÈ} À¶¦ê Y?ï×÷÷û± cÌ<®£Úáîî‚»» Dcxþü×kF¶­ã²mØ.=ksö4–ˆ¶Ë‰ã™¹ß•*áôÞŽºsT •fq¾wÞ×ûˆ†B!„Bïÿ[„€Aü%ü×ÔÿÙð0%  kû^,üÜs„B!„BÞÿæ7þ(€œôu`ÀL¡µkˆÿ×á¸ß]¿ý ‚–Ï€Öâ{ñíg4¼üúOïŠswD–0kæp·e °iØ÷{оçIö5UÞ¢3@uÛ—€ëx¦ˆjˆÇîÐÖ–Yàl x_…ÛÇ8¦ÜÂ`Te‚ÀÍ9|ì|¸‡ð~½ßÓˆáË0`fsB5'és¢)¤O3±|¥,ĵ0÷˜¼ ¡¥Ã\¯;žxi‚#U`ÚLcA$ôÖp¹»„±À1Æ2*ˆ.w.)ðÕy<×6 ­7l½Aó¾Ù÷õi"`™DÂd0Ͱm±Þ:OuÞÞw# M„B!„2l@Mü×÷új|=Œþlê¿×Ïçïí !„B!„·Àÿû­ÿð¶O='ý÷ÇŒ€šøW¾p‰éí9¤€~¤¶/hxúüúO/®×ªºbá—ÈŸês̈‡£iàÓ÷í®Ý.8ªDôdð›Èú9&ÌÛÖÑ{D¿Ë)UàaBÀÃçÞ7ꜚùéü†‘ÂÌàÀ×ëVjÂYÈž3¦á-E}³0UÌ<Ç—-„öˆÉ—e:¨×@d̾aŒ’ÂïÇ”þcìddpxìCš–± é)Ù ŽQ3y ÷~*bö1àfˆAë nQP‰’çár‰š¦ cŒ}.Š# )‘ IšxŸ¡€B!„Ï''ùK´??n¸ü?‹ÿç×M((þB!„BÈ;¢&ýÏ”d¤?BìüÖsÇ¿ýÐq·¿ý ж_€TE@Ö¼É}|ÝÐdðúøÁŸûû7?ëg¾Àåè½ðÐ詇`S½¦%ûDJÈ>ŒÇ4vˆÁ…š§y@– üTÛLj úxTqþÀ!üGB€Ø‘ŠÐš¦hŸÕ ­…Èu1Qø}ëЦÇõPA×ЧH$7@™ÌC¨7ÌহŸ!¤÷Þ×¾U쿹eeÄ‘"Ä4?ÎÕ)Æ‹ Dà 'B .pxA¦-³C$C„A@U`)ެ2™sôFhÝŠo IDAT­4 àçèÿ7p !„B!ä-#þ‘ÿ•pAˆûBÔ¯:€³!àûÿXüÿyÀã"?ßZB!„BÈäã„õŠý7®ýß› 7àº;~ëyü¾7àÒÏ.‚ëˆ*€¬¿1ÔïÃ.íÏ*4¼~¾õ3_pˆ­sNÌi§I| õ¾zâÝꦹ`7;b°ì¸ÞvyáýVëxŸY5‰™cßwÌiñJEâïc ˆ¶Ë– m™<#ýëñýóëJpضürœ³zm$9Xˆ÷)ú1b]§´‡š²ß.zky­ ÷÷×0¤qÁ+“~sŒ•òPSù-·¿–<ÕFX1ÿ¢²~·m‘°U§ûKEзŽgÏî2öÿ0eByß+ƒI„B!„|¾ÿ#Žøÿs@ÃÇW&öëŽÖÏ>x†ËÖ!ªëÜÚœ¸îc ücsü9?Ç„ªàrwAï f1¡o6aY;PâÅö_¯;àîqýžf2tÌ1i~ cEŽZ øÖz‹Z€³U@©ئ{ûUÑ{‡¨,³¹Çý’é%MwÏ.Ë( ù±”Çx˜NžPÀš!„Bùü þ'SÿBð¯ï‰ÿgÑÿeâ?#ÿ !„B!ä-ñª1ú«§Ýcr¿frïwÇ¿üÿ÷»ã÷þ.Å¥G@U¬ÿëß24üŽß&«.ùÚ¦U!ÛxŠÚË ¡àÕøµŸúCkâ?âÿ¡ÀÑ9ÿ‘{HnúíŸ:gá_ä¨F¸^÷ˆÍw_"úëßzÃ<‹)wwˆF¬ÿ÷÷W¸ù¸¥”ñÚYuÿt7ÝÃ,#5¼ñqh ¶ìaF‰€æCÐËxxHÉ‹ ?‰üâááý³- M÷í{«*#ÎÞ{-?¬µ÷9‘·êVÝ{+«*³ÖotÝÌŒŒ8qþìŒèÌ9ל]Pk›Óû*öœ9%¤Äè"8]Ÿ˜ åäýbט¢|k¢âuä)$:'øÇš`æm±¥<Ø÷í9×µ"¹yaì#'žµ Ý’$`Æ‚\J)>åc ¹`¿îÞ¶5Ø1‡Q ‚ ‚ î>à‡ þ<]üß›>IüÇS>ÖsAAA/‰þMüwmÌöyëÀiUüå÷çªøá`\lê?'ÂqZ–ŠõwŸ«¢vj©ÇbƯ+´›„ àÅùÃ_ù»—1þž "›ô0ûì?i]݇ØÿÁV°MÔøþÖ;ˆ‰m"¾µŽõ\¡ªSî¼3¬kµØ|Ãg¦9Ñ¿?o‰yNò·Ú°®Õ æ7È%£”2·{:…™J‚ P«™F¤¿ˆ‰ôæ>‰(DeNösJàÑaÔL›! K7ÁŸ%çi\ 6A¯,°í眬ž §Ye`•<Í'ºsC½ &€›â?°M¾öo½†= ‚ ‚ ‚àeAþlÑÿ 6ÀÍÈÿñï¦ `¿­ç‰ÿÏû^AAAð)ø4â?à}ÛjQÿ€MîwŸßùPðÁ#ÅÕø¡/&tQ|ï‘âÝ+¼Çèb¢ÝÕbÛÚ0c¶UK!xE7ø9BíÛB^Œ?úկΩm›\ßM©ãÙ‚ìÓDÌÁ3ïò:û?ŽSDp>›Ÿ2Ï:…Ö:Χ3jmX–2#ü™€¢ÖñX|Sü–Þ}2ßñÄŒ”3Rb¨(ÖZ±ž+ºth¦”œ½z ¡®¡”ŒR2@„u­¨kµmæéŠZ+DœhNéCa&œ8dÇØ›lÏÉ[bÀþ<’' ƒYêp‘.R2ÓZïPQ{³¯æ¨-â~¿†=múÿiD"@AAÜ=Àÿ‰-þLÿá?#Äÿ ‚ ‚ ‚7ŠO+úßDUgì¿} œðÑÁiµ(ÿ/¾ÃU<>)Ž á#A¨ >‘»mÏõ30›ð?n»ÏâÙË&Œ—üá?þ;».vzæzºï`;Æ­_=v#§b6!~­8ÎXkCN Çゲ”)ä×Ú "^°¥ (½u´ÞÁÄH™±”âQþ@]«%xt?§4"‚V;Z·iüe)[2@mXkTí¾ªhµ¡wñ׎‘æ$6q>%èÒ/ .ðZ"» °kœsòÉKCUtsòz¨µ›1!¥¹®T½‹íobO) ;¿vžÇ‹˜nÞ'Ò‚ ‚ ‚à͇ü߸Œÿ¿9ù?>ÑŸwCü‚ ‚ ‚ xE¼ Àö9àC׿Ù+Ø­ [,ûq±ØÿÇ'ŽÛÄÿˆýO X2¡xßsáì6À%ÿêW¿úÜIì¹–÷Žç>ˆ·{ñˆÔCDvï‚õ\gT?™ïÀùêîÄ QÓÙ k­P1±~9 ˜µ6¬çu)Ƥ=`ÏÛ[‡ªÎˆ}KÀ¬°‘zã[ï3áÀÅö²Oò+ñcTØsŽ©~õmÓ4!ØëOÑ~Æû“% ´ÖUä‘jàKHã,ÛëŸ'$¤Ä`N‘ðŒûŒÛ~ê7ÿôÖö+‚ ‚ ‚Ïø¶ÉÿñoûÓ0wSôñ?‚ ‚ ‚àù¼Âÿ`D]‹­­[-@bñEÓªsÒ_8‹ýÿÎ÷ßþ^GmÀÕBøÊ‡b¿ò½s$Ê–pŸ…³Û&ÌÏæ›¿þãn“o@|¢½µfbý˜Œï‚Ú¤ ĉ¥d¤Ý´þù´B\¬‡šHÏ>u>¯öµއRf´Úq^WˆèöǶ޻‰üØ}ÒÄîn.ˆ@™@`¦×¸ˆèO)Í몢èbI9§yl|b¨µ¡®mÖ#´Ö!".êÛ±Mþc;föŠ„0<í>v£ÃÂAAo&àßáRøÖôÿÍxÊÇg=GAAAð9xYâÿÀE ‰Mùw1À¡J¶¨ÿëUѺâPÇ…Ð:ðÁ#Áã“âÉYÑ;ð#_f¼ÿÐD¸’­`h±÷Y8{U„àùüñ×ì©·ßåõwStŸˆWU¬«MóïãëUÕD}U‹ÉgB)ÙL>é¾®ÕÅð¨‰éDß+%ãp°ú"BkÍÌ.ô3y”>zï>a0›AHdÄè'¯(°ý“.¶ýuCÁý5[ŠAöZ™çÀª ¶*K ¯è8ΖHPŠÕ xm¨’§™AÁ ¬Çd¦ìÖÎ]^G/Â~­Ý<Ö½åiß·ïöªy­zïø{¿ýïocwƒ ‚ ‚ xÀÿ‡Mô¿9ý?þ=KüÞoA÷û·¤ ‚ ‚ ‚WÄË6žpjÎUÁ  áñIñ× T¿ñEƃ…ÐÕÒN«}ï´*~è‹ ï?´_ý˜fÅx^"axqF:À]g^7Q|P׊µ¶],¿?Æ'äÅ+J)X9çYl"|­ÍÕ[B—ÀSJ3AÜp>­3- ”Œœ3˜­w´ÚæÔÿöU3ÍŠ1y4¿˜MÚÛ÷kk6­ß€"¥4c_¥wþ-m`$ ìÅiÁz^Í€“'¨ĶÉ7óÀ"Ú’nÜþ¶ò"û> jçÚ’(d®Ïÿêü^ÙþAAA`€?Ç¥àEÅÿýÇgm;‚ ‚ ‚ ø܆ð¿g;µgý_ áûÿñƒŽœ?üŒ+OúÏ£kE튫…“M—d5ƒ·Y8»- ð|nVÜÅu8j:€-úÄå÷Þ-®^ ò®z»½ÖŠÞlR>1c9,X–2ï3 "‚um轃Ȅú!ªï·wº>ãt:CDóHÈ X:À0(ܤ°3,ŒÁòýTÿ× XŠOøÓhКrNX Rb¨(Zkއ¹ä‹kº¿Î#•€Ù’ Æyd¶¸ÿºV–RÀ‰!]ÐÝ\ÁLH)Ít€Á]\?Ÿ‡§Eþó8Ö êf&çÇê)¬¾A÷ëÀóOÿë;€ ‚ ‚ @¾Ëøÿ§‰ÿð¯ÿƒ ‚ ‚ ^·iØ =]ì_b›ärVüõG&â|ñF19™Ð/žpªÝ}u Y0xÛ„³7‰0 lÕwqî'¯‡ `ÆÖƒ¶t€!ÂJœÏ+j­3Ýc)‡Ã‚”íOüæOÜúôÿ^àbÚÄ" dƒa)69{®f1ñ?1p(ÀÕB8Bb×Ú>><¼n{íܾöoÝYwì÷øhBªLaŠù؉³ä}ö³OD &¨‹ù½w´Þçô6³‰â2 ûùm­¡®6ݯ˜¶(ÿê¦óZ±Öj±ýsŸtîÏ}Ì$`±û#‰`èÍÉû±ñZB›2·¤ƒ†óºâ|Zç~ô.v,ðD7èØ7+$ÿ‘ÿVk`·s Ý„îûÌ¥°¯·]þs3J´ÖÐZƒˆ~l[ÝSZ·$‡Ä 3ŒmI·š ð¿ü£¯òpƒ ‚ ‚à­|ÏžüÚ¿çm/‚ ‚ ‚ ø¼jñv›Òõ_üÈD³ÞMôÏiÜèj&’¶:€¡‘ÝÔZïªøz_‰T€OfT¼I¨šxo½ö<§í‰3t×€Zjµhf·SÂjy ñŒÞ;®ŸœÐE\Ï ÖsµIyÍŸâ„™8°›êff¨˜¨›˜mûbb1Æm‰MHöý-%[Ì?3Zïxòä§ë3T\Òœ¢1°½¦ˆŠU¨zm‰÷D´Õ¸¹Á&ÕÓ|}J)Í* D yž‰‚™&ˆl;÷õulonç°D3Røµöó¡¢hn¾PQä’±,víE,õa]+Zm–Ààëb˜F@@Éf¶H9OCÈ8Ïà ðŸÿwÿú5‘ ‚ ‚ ¸?€°Ï6Ÿ,ðßÏ߈‚ ‚ ‚ ^1¯cz{Ny¦üGRxïö1±}ŸŒ%iÛòMî«pvŸSÀÓyÝf€!´[€MU§d®¡ÝÏtñ©~Ý"Ø=~d»É§ìsÞ:î[ë8]Ÿ±®Ä„¥0ÖjÞCÈT]dÆî‘ Å.æ“)ç`b,‡‚â!²K æY1@´™ 53œO+˜­jà°Óå1vˆŸ¥'.0Ž R2QºÖÜÅ4¦þ äær3ÀV³`÷z±Ï÷ñµl¼æïm܆iÙ§LØ:¬kƒª"ç„ì5 3a¢ut7}”¥ §„ÚÖ³ÕRŒ´Y*DÉ& é‚ÓiÅét,K™Uµ6üýßù³Wtv‚ ‚ ‚ànC>ÄåäÿÓ @ˆÿAAA¯„×e\öQÌîìÚÖmâß5½ î£0ö¶&€Oæu˜ö†š1}ÏlÓØ¸a¼i­£Õfâ« :£ðÇcÆÄ}Yʜ취ÿе6¨RJ&æ¡ bKP˜ø®Š9qîZÛì„Ï9ãxuÀaY@<¢þi¼œÀ¿pãjÇã'×X׊œŽW‡i"Ç6¦‰ao9?:æ³?v]+˜)§­Ž ¥ù¼ì&æ9Û¿¤ÝOÀ>î¬)`Lÿ  V'±ŸþOIèm\ïaèðºùë'e3œŒÚ3`\¯<êÜq&]p^W¬kÔ®sÎÄ„æFð~ÿ¯_Ëy ‚ ‚ ‚»x„ ÿìßçÝý>iAAAÁKâµ\¥ã‹-f ý6쾉b†€OæUö€)ʺ?bêA[E@­uNfÛÏåþ:]‹Õ·(þÞ;DÄEÝ>ï§þœ½Ûm9Y5€™ l²Û¦²V;N§3jõ©ï’ñàÁËa™ÂúLLLÞ½ÖÙs­µáúú„VRJ–"3fh­ï|Fò$€ÌİV;fÞO–3ZkV{’ üþ¤V àÕ>>ögÿº6>¿o¯uûIÿylêÕ ^·0ÎÍH^Ðñýf• æÀÞ3¶mëÜÆH§Ùµcb7«t¤”PržIêëQ±é÷I ÒMx'8ˆxFÿûK߉ôþqo¨˜ÛR0´z™Q«`ë`^ë´=À¬¬èž.²*€œÒ|¾²äœp>¯8ŸÖYa‘}ÝpJPüÌÿo_Ñ ‚ ‚ ‚7 ðýAAAðÚyâÿÓØ‹Àf Ÿoax6·a¸¬Ø¦²KÀ0å¨ÎkEk ‰Ùbî§cÇ>X¬ºE³ÃÍ=)1hNiË…¸»Å¹‹¬FàxuÀ²03j­xòä„óiïÇã)§¹½œ–”"ê¢íª@.V; »ã3Sègì_Ïëœè'&ädBoï[1Ù÷‰.þ1Ùí «F‚œ“M¹{Ä=™ñ€è^¿Æ=Í bB¿t±ó›ˆxÞ>jTl]ôfÉ "â©1»4Øýˆòºˆ¹¦ý}D|°ÇV/±¸¸/¢¨k…ˆ 猔Ù;jÌ BdæZRN(¥ 'ï̽uüÿÿ{¥ç6‚ ‚ ÞÀ5. ãöçMÿßßß„‚ ‚ ‚ ^oš`0&cƒ·›0<Ÿ—eØw´Ã§§ík\·äSþ"ŠZ+z¼]ˆØÒk­ÖÍžÒ4l“ö€øxkÍ  0£÷sÂá°xÀˆd¯xr}Âê ¹Ø}ÒæÝp<² ÖµáúÉõ|þ±Ÿ%ç)Ћ*rJ(‹Eù‹(Χ³=&ñܧ\òL;ØW#ìÙ@­ ê¢òˆž·  {µÀ}þ\¬/go˜ë‚È*"z¿¨HPU4ŸÐÿÞ8ïû©ÿaØ…QlƱm´Ö.ÌÇãK)P(Ös¦«}H»Êû5j6ÓÇvLçóŠÓi…Š×û»ß~U§9‚ ‚ ^à„gÇþ?ë7ûùPAAÁkàMþƒà³FÏjØOh›°=nßWqXt»¢‹ ±>]­’G«·n“Úc;Åßç¤÷ˆ`"pk˜‘øŒR²ý[Šm“€Þ]\½>£÷n"þRf:€Eýwä”ì¶”0Ì ××'´Ö‘<}DX– À¦º[ëžP8¡‹LÀ¨ ‡eîñeßû誷 ƒœÓL:ÓìÙÅdQźV0ÑÜϽˆ|M{€™JdÆÿdˆ”²iÿQÙ@Ûyî½£Õ>'ùEê5Ã<2ØR+ȦõsˆÐZÃù´ZÔ?Ìœ2L&°Ö†Þmä’§)a\ãq}KÎ 2 Ô’3D§ÓŠëëÓL£¦o–`ÛR±‹å`u 3†ÔÖ ªø¹ßùóWw‚ ‚ ‚às2 7ãÿOùïßo?AAA¯ÿƒûH˜>Χ1Ü4؉–zq¿1ͯ¢Sœ­ku±|‹÷'f 0±jSïc’~ä­u3ˆ"—Œ«ãÁ„ö]¼zk§ë3®Og›¨/Ùù’A ÔÖ.¦ÉG4¿ªÎÉq"BÛ%03Zm¨µÏÉîñ˜VÛ<cZ<—¼‹ý·ÉóÞÖµ¡Ö &Ó®ŸÀNÈÔZ‘˜½ª M±zž÷{ÆM€HGo›OÀ¬Z°ûaŽô3D‡ÁBç$þ¾¦žÆ ®²«* ‚ÕHŽ‹ùï‚ÓéŒóZ­z€,ÕÁ}šé3CÐ'"3©ŒçS³Çþ3I ø6j€'f8a&¤dµõ¿ž²d,¥Ìdˆ±ÇÏÌ8Ž_ü_ÿêÕ]¬ ‚ ‚ ø €3žÿÿI ‚ ‚ ‚ >#!úoax>7Í€N7*Æôÿ˜ÜÖ9É¿ž+ºÈì·ï½Ï xÙ µD@Î6õœR‚Š í­M¡5qÂÕÕË¡¸¡À&Ækí8ŸÏ8V›®.õŸË¶U“ÛC¤Ì| bV†Ñãn1ïð Û¾Oj›Ñ¡>¡>Ò’Oìó¨< ›Nè&fó^Lž‰Í«Jñýô¤„û(þ—Ñÿà ÒjŸIP3HŒóDž¡.šw¿¿ª¸á¢_ˆõL<¯ÅXs"¶îJÉ8^±,*Šó¹â|¶t‡‘0R&'¤¼G¶õÙmç žx¡sýÛ¿QTëyÅõõ­õËÔ ß"'BN–r1Ò"E« «›iˆ·ZÄŒŸÿÝ¿x…W,‚ ‚ >`EDÿAAAÜ:!üAžÅÞ :óÉ¡¸L“ÖÌ4'³ÇwÇt]DÅcÐmZüAg&x¤{Î ¥d¤œuµØu… ®ðhüâ“ösâ» jkž6`ƒ! ZÅ@³8yßþ¾j`ˆ¹]d›ì'ërì8–!ЫÈÑÏÈ¥ äA¼~aõ¤†å°`YŠÕQŒ…E««5¦ÙÅkz·µ9%dñ‡1¡·ŽÚú4ŒÞmM€”Ò\#QP¯‡°*‹‘ n*Á0>(2ÛúIlû¨:«/ˆ?õ›ßz55‚ ‚ œOc¸¿¿õAAAÜ2a‚&€OÏüòš)@eF߃6qr˜Fÿˆ³Ï9[ÿ¹k­³ @ü1‰·ik¨ ·%gÀãßÙÅý!ªŽÈv5bSú Ÿ÷w•m:<çä"û. `Ç>¦¬™ì±6½Îc)¥œv‘îä¢þñx˜ÂþH"vï.ôî¦ü±Ïçä)û”‚û,þ† `ŸÈ0Œ ¶†ó¹¢Õ¶]£ÄH)™ð^;˜i çc[½ º˜™`\÷Q‘’¥6(µö™$ròkg½Å0¬«Eñ“?ÿÜg_‹­õY0ÖíŒ[šÌœpñ¸­z äÝqì$~^Ô1| 1D­Ê‚˜‘“™QTmÍç’°”-Íàkß@AAðê m÷ùþãÓîAAA| Bøîñá7xÙ¢ižÏ¿ü¥ÿ ½;EmJh˜D@žÓÍ&蛨é‰>A=Í05%ÞR0¶e“Û­µ9?:ä÷"ñ˜ U%gäb“Ñ['»ýg¬­!šöÖq^«Åù‹z=¡Ö†î¢/ˆ<À|Wýý86¡xÄÓt뇯¨µ›øœÒ¥p|O¹ù3<"ö{³ê3ÖZÝlÑ|Âß®iJ' IDAT Œx|¶ êÄÛWT\HWUÎ=@Dç”ø^(ÓÒ)ÛTõŒsÎÛ¾ìØ¦¬·š€u­XW›B'&›w“ƒîbæsNž:pÙ??#ý=Õ`ì—*f²@òÇoû}¿ÿ vÿˆØ4ëP1þµ5¬çŠæÂwÊlé Ø"þ‡H>ÖWs±~ˆë]‰-"\sbò: us‡LcÁÎ]Œ6£€ªZ•DJU´ÖfEïÕMÌ'O¡°ÔžÆ•YY3¼lkíFŠÊR°” f{ZIJ”‹Ÿ.O=ðÄy¢ÐÇ_ÃAAÜ ßøúY÷ ‚ ‚ ‚ ^ÿƒûÂÍéU›¨váпåiïÞK»B#À‹ó{¿ø·\XMÛt²Wfh­ÏØ÷´›š¶k-3êÀ¼ŸªÎ‰ì1ù,Þ}>„w`t¾!” ½OC€iDQþ& ê\K":cú[kPÝžo`Õ<»è“§(lYD73€3“Ò&üßwñ¸iPOtèè½o1ù¢è½£¶évÝËR˜Í8ÒeKz<1"AEP›Mä÷~¹¶ó˜i :’ÜX4ÒJɳŽaàpXK†ª¢µ>'½›‘¶Â'ÃÐ`·O¶rÉXܘÐzŸ‰ «ÄXK$PÑY3<-¢”2·kEê&Ì58Œ&€­ñQm&€ ‚ ‚à¶É/pŸûÿ›OAAÁ[ʳâÜß,x>Cì÷:u0Îp v  PÒö‡¬HxÙkéÃoþD˜^ÿúúçç¿ÿþ¶ ˜.ªŽ”€YND`Úu¨¡wòën±è„aÑ) [ÿ<‰höÉ~c+몷<º„Jì &] ^ORš]õ*z‘l0"å™É'¾ÓEo»zZ€€mJ\œÒN¨};„ÿÁÍXzOå«™;Ñ0G$KÖgšI v¾º›ExnD&âg@]ôÂ>ÁÖœøºŽ8³@vDæõÉ þ.+J¦iHiâü*[¥ÄxÌ0.ØíäÛ1#YmFݽvÛ™ëË«(FÚÆÞ<2Œ(LdÇ*â?fJ¡ø3kAAð Ø'ÄôAAÁçä.MþQCTw]á6];{âÞ"Q,ø8"Š&@ëÓ&þŸVÉÞ}@(ÉL­›N—<‰ýU¬£0¼8¿÷ÿS›ˆW›þŸâ¿ –cŠ;y¤C÷nõ”Mn.Æ€Ö­6Àcþ‰È§ñÉ’j€)È›¡  )¯kû¤5óÞ\à…ÖwÙ €¢uñ˜z{>öØÂV@Ä;ÀWOd¦Qµ÷œmŸw‹õfBÀÍÛî&ŠË¥¡cwÞfÂU #ú°·Œ‘±Õ*Øö¶Z ¿v=[m¨­AEo¤5`>·X–‚ãñ€œ“¥xü>`‰eñ„€Ýuiu­¾¶q1m¯2Rd ÿËRpuuDY zï8]Ÿq}}Fï}®Ëâæ€a^È)y2€U´ÖA°u>ÎÃ0•Œµ·¿ xúzŠ€ ‚ ‚àeò<Àýü '‚ ‚ ‚àxÓÅÿ›ÓþŠý¤#¦ðÏ.šÝ_á+x:CŸQmn‘׸ö‹w[À0ätiÂp—ø£_ûª ö6ÏÉ&ô»FìûL`2±—íu£Õ}t<Í)ý1yƒ@¨µ"¥„â«P¡u Æ›ö·¨õñú4ÄTØ„WÞ% TuVS´Þ¡¢È>É=îÿ´õyŸ CôÑöã¶î1ùPÌûÖZë3þ~ôÛóNü‚wwÃ@kÍë'x¦B\Ô À^†ùBd3 äœp¼: ç<ãÿÅÓ+˜¹$äœgRÅxîÖ:ÎçÕê)T§±eLâKK¦PEJ ËaÁñ¸ %3œNgœ®ÏèÝöa9,X–²DÀ´¥L@7CJÊfœÇ6ª'ÆkêÞð,ÂAA¼,^¤ ‚ ‚ ‚ øÞtáb®B-Û¦µ)ÄEÛ&@"‹n<`û€û)‚gáëÀ’ §UñáENÀ»W„šf€á-a¶uįx©|šŸÁ0 <ŸŸúÍ?ÅýÚWŒŸ{K ¹¨ `KØ¿FŒ6tâ-š}Ä› l‚,ûm£Ÿ}¾´ÐÖà®>µÏÄs:H.>ïï3&½m;:;å÷âôè_Ïó¶OžÈžGt_÷ö‚?€ ]UÝ„líâB~²Q° Y"ƒŠB‰à>ŠÝuÀŒúO ’Ϻ†÷t·¦È6dÆÛƨ®È%Ϫ ô·j‚ñøaôPs¸¡ûóˆÝ0M¥d,‡bÇ5÷ÇŽ:%{®eÉÈÙ«'tKÇÆ[Ã(͹&±½.ÞÇ5AA¼ÙD@AAÁgä.ÿf qóÎvxD»*°6à¼ZÔóq®ŠMcNñ—Ä› BÆýf$B(ÌR»"3!'àTÁ ¥d›¾fb€M[ÓŒ„ï]æsÞ|íIƒ7q]Þ6³þEºûùü£ wA]+D)óœz0§ÿ‹åO™­ç^=j¿u4_Éã± «b°ëd“ú[f¼†rJÈ%ÍiüÞlM¨/HÉŒ"çójSü" X²À¨ "äœP{LÉĶÏçsÅõõ ­603ŽÇÇÌìµ äÆmº;—ì)¢zq>í{|‘Zñ<" ‚ ‚ ø¼Œ€ÿƒ ‚ ‚ >wIüWªkL³ÉÿÚ€Ú à É'=ý@»©ß±=àíÍÞ†ø¿63+j@ÀûM€ë³â\Môzt-Þ{`“¹š.Moò_nþ‡!àãüôoý›ùùïýâß e°w¬›`|Ø„}ΰiA±ImÞÝÇÄÞÞ-þ/Ì)( *Pµ‰ó!¬š¡€ð…Ð`>þ:µ‰ÿoûkؼ»¯Ç½*ÍÔ1#g›†—.VïÐÚL…H9aAAʘB{JÉ}®UK h½£Õf‘D(ž0&ü-ŽE­Í¶Ÿ„Þm¾¶†Þ:˜y['O9>,ùf—f£îpß&øQ©¯K™Ç8ê%È×óÍ÷Âñ|ö9.Öø0YìßKƒ ‚ ‚à6 a‚ ‚ ‚ xAî‚ø¿ãDs5±_¨¸^MÜÍ <8Þ¹"d×QªçÄr÷zÅ‹Dfw“!`©X%ĨPµèÿÓªøÊûŒ’ ßl“Äï~¤h¢øw9Ác¸mÝ0]®¡»´n ð|þè×¾:'²í5Ç*LD¥Ë¸v"ª­1i.b© ¯ð^‰m­èî>>¥ÞºG¿_vÐDùؤ¿=ųŒoƒH»Ø›7Æq‹Ø9>¯+Zë(Ùâò™ÙÒjƒzüï)%,‡Ùc@† ^k›ßg¢)º÷Ö§¸Ÿs² ŠOò÷.xòä×OÎäœÜ@–JPTËRp¼:bY ˆ½wœÏ+Χ­w[Sü·õ0ÒÆZk´5{lïÝÍ+ ¥˜éSBJÛÚTt±IK£Øj'¶5 {Îùž¹U-¼(‘AA|V!ôAAA¼0wEü±ÿ]mÒ¿w@”Ð:ðälâ?yl;{Åw3 ÌÛ³ëضkÛ¿ïâØÛÈHŠDÍ2Ö`kæ¯?<>mÌ&r-Ŧÿ…P² ´çj†“MF¥ÄïwágýuóS¿ù§†°ÉSäÓÒãõc/æµÀX‚Ââæ{“jiÿÏ»ágL<Í¿dmÓëÞᮾ Q¨wëž‘ p1~CŸß7¶sà×—¯ñCO;ÃÆ˜Þ·¨†MäQtHﳺ¡ï>Jßî'*€,rvQ}ò‰gŒþÞqÓܰ †àn©­6´Ö¡ØEà&Œ·n{lZÞ#ü§9  Dõ¢f@D S‡]ŸœÊR=Ñ¡KÇõõOžœ "V1P rɬg« f”œÀ‰=ÀS%Ü¥4ÄöšõçÉ*—éì&q>ÆzÌ¥€™¦ØŸ²í§t<`‹ú§¹®·î?Çë_¤AAŸ†üºw ‚ ‚ ‚ x¹ˆÚäë&ÄvÙÏþ™ˆïÝŸG„1p(Û® tŸO`¦\ÆE÷ò¸þ)œ|:û¸¸ÈŸ“Mþ—äDsÒ<®d«`7ž¶]¥»;qpÓ†€ÏÎOÿÖ¿ÆüòN– ó/T¼K Øú ‘Új&. óu Øâ."ØŸ³òFƒÁ îí뜟ÖKÿƒÎs©ª &ä’}šÞþ1ù¹O&¼'¯Ø æ€W<°¥1ŒÇŠ›Ó˜7ÃÀ8¿#ÙA=NßÄvÛfJ ¹$ä” DhMÒZƒtAJìúv0‰ÙÌ3MÀ“¼&b­Ú”?T‘<‘ çdï}½o t%7­ ^=ÁÛ¾â:¹§K(‚ ‚ xs‰€ ‚ ‚ ‚à®Lÿ‹@o6Í=ÄsS|ôDñø¤¨m›òS‹§Õ¤“«…pµŽ‹‰1]¤@r¡wÉ& {•öýÇÞBö“ÐCOO‘‰K!dÎÕ\$Ç}ZN3d¦YP²­À ÷qÍ„à³óG¿öUcý=}R_}¢[‡@ý}ÆmcRŸFýúsÅÿ‹éÿ§îãZ}ÚÔÿþë페çCvÿÀHW°iyA­ EÉe)HÌOjÐ}­[zò,Kñéyš‰ ª@« ××'¬kµû ŠOá·Öpº>ã|®› Ÿ’ ÷¾ß£2bÞàot3€mô.f"PEN Çãe)vÌÝW·únrÈ(9>éÏãÅÛ}ž–,ñ2ÖS$AA/ÂÓ ÷ï·› ‚ ‚ ‚ÏÉ]0ì£ÿe׳­]+þ⻂G׊ÄÀ{‡Bè¢.Ú\ŽÅ>€Zµ ›ô.8« ˆ:€û‡ªNá¿‹%HŒHð%Ûç׫Eû3Ö¦8,„DÀßþ®àÜ%¾øÏЉw¯hÖŒ„€Á}]?axõü«_ýêì«^lm}Rüÿ‹nã®1ŽYDm²ÿBôWµéâþ#ο¶EÎ )g«oðÛ{·t€e)(K@è½CºXmCïhµÏÉú!ì/K[EˆW Tù[ëH9¡äŒä1þkm8ŸÎh­Í÷¸”)%Kõvu4…|rC@ïf^0–eÁá°X¥À0DŒj 7˜0‘í“×/¾N^Öz @AAð<ÂAAAðî‚ø`Æ+hf›à¾®Šï~¤øÎ÷­[Wû;Gx™lªûáÑ&ÿÇcºMÆÔ­ ÿ6Ù½Mq‡à~± ƒ–Q›Ze„Ç…Ppª[­¦‰ä{<œ«b­À~ñàH`(Þ{ÈX  jÓ½f ]ão× cÀíòÇ_ÿ±Ï´žöF€·a=qÛj_Ô#ÿ-aaT(Œó0îÛ{G]mZ~)9gˆŽ©~›ò'&,¥Ìh›þ·Ç×ÖЪD  ä4ïËõOLh­c=¯VàñþDcj¿£ÖfæÙ®3ï>>•ÏÌàij:b“›3,KAÎy¦ØvÒÍ0 )¥‹çØ/›g­¡ÛZ[cý~íߺ•íAAw0AAA|wEü¶ î!Š0YÀ“ð½G‚G'ENÀ{lºñ´š°ûà$ô¡f8­¶%›) d 0¡dpŸ×yÜIö)ÃrZ-5âÁ‘°V[KOΊ/¿Ç8.„³¯—µ=|t­øÊûŒ÷0RR$¶ÔˆÄfÈi˜H.ŸûmYOa¸}¾ùë?þR¶3„Õû¶6÷5öÑbþ[ëPù'&d¹‡€>W¨ÊR,rÄüw¯ðI|fš êOлLÑ^ÄRˆ ‰“‹í&¶T±Ä1c‚ïgr3À¨èž.0Ø‹üäæÅ`¦ “ˆÚ1cu¥dä’-é€-Y`¤ Œ}&Þžƒ°9šžgŒ»µ4’ @a‚ ‚ Œ0AAA|wÉìz±E¹¯8{û˜Ún¬Õ„ÝbiÍP!|ÿ‰àûOÎ "à+Â;W„C&,ÅÒ9¦ÿï;CTë<9ÛtðÃ#áñIñç-¨Mñ70áÁÁªz·û}ÿ±õlé]ÆÕbpxr23Ê—Þ!¤DOÿ·s=…àÍàY†ûnØn°Éúóº¢U›†Ï9aY ’ ýµz,ïÈ9c)Äé2…xN<ÅÿÖš|º¾7éåy%6qž°æÕ“­Ë&Îû佪^T ø~™9ض¨j¯I:ÞýyÙcH¦1a3rI(c;¾ïÃ`ÇÈ3µ€|ßÝJ‚Ý6Î+h÷·g°sJóµUUñS¿ù§/ý¹‚ ‚ ‚»A‚ ‚ ‚ žÁ]ÿ]´³­™ðßÄn¿è^¡v‹k/Ùþ=>ù½ŽëÕO0Ñ÷‹ï0Þ}@¸ZÌ<Ò&ÕÜ7a,¸»kóªˆl"ÿ·¿gQÿ_~±[ DÀ¹šqr²Ê€ÄÀã“âÜ€¿ñÆÃlýLAðù³o3axõ¼¬ô€7•ùóí‘ÿƒ»ßº 1#—ì=÷ö³YkÃõõu­`f,‡‚œ¶€ÞûŒêi#Zÿ"žß'ñy÷3?ôñqñ\èïV’lÂÀ…h¯jÛ=, ŽW‹Gø[š€Ší_­ ­56åŸrº<»çÍɪ ˜"£æ CU‘ó8/<ÆvfúÆŸW·„ø×·gØo[EÑGÒyú`·‰ÕôÖÑEµ4é–Ø0KÝŒ¡Šð/þò¥ïwAAp{Ü4ÄoÜAAA¸›â?°E¸÷®h¨ èb‚>{²ªMh>>+N¸Z€w®ž¾ûÈâÜEÌðð@øÒ{Œ/<Ü¢ÛXG4B¸½\b^0¦ö×|ï#‹ù¿:Ø‚JiüàT§³"'Kx|R<>)Þ{Èøò{[‚ÄîwÝݱžžF^-÷Õ°ÿMØÝþ$8&á‰ÈrÛ'EåבÐ@ÌX–Œœ2DëZQ[ƒºsŒ`Ÿ>bó‰f4?'žÕ€Nyzüñãµ`ÄýqÞgbý¨ Ÿþ¿º:`9,HÌ3¢Zm8V¬ë €PJFJ ñçM9!§dÆ…ÞÁDH9‰Ñ¥£® k­€Ë¡àx< ù›á01‰¨ïl‚»f„[‹ÿ÷õ]¦`ìö¢?êÇ;ÌfЋ}õ€íÿ/üóo¿ôc‚ ‚ ^>a‚ ‚ ‚ ¸Á]ÿ[̲ ¸­ç*!€]hvµ‹*¾ðñ…w"ŠÓ |x-¸>+„wŽ„Ã²õ¸óNÈÁö~#jf`ˆ\Àõª¸>+–LÖf“ÿ‡BøÂCB÷û$²žÖnëæ+_`¼s4ጠ0-Ï*@À’)ÖÔ3Àëç®6±Pˆè¼m×ÉÅùm²Ý¦íëZÑZŸQÿ&¢§™°®uNümX@@H™Á4DqšBþ–’¯>ѤÌH)#¾_,‚¾·Án›€1ý\¼²À¶É‰‘£wÁétÆù´Îý#6œˆ°,K†ˆb]+TÔö—*ŠÚêÚ "(K±çñôÀL ªêI[Í@â´« xuÛ™‰#P´ÚÑ¥{ ¶„ƒf·C=±Á {°ã4CÈÏÿî_¼ôã‚ ‚ ^.ùuï@AAAðrÙdz'P…u$'BuÁ¶‹‰¸L&äD¸: Ʊ(Ž.ú¯Í—«!½Î ^9{¹ªu…y‹´n]ñ䤨 xpØŒ"9X€wDNŠó ”,€Ú‰ONŠR€’ÂTò,>ɘæ€WÃOþÆŸ\|}× £zÃ~ÄD6¿Oý€êîk“æE¶iòý‹ÂˆžW¿ëüÙæ9ÖïÏCCÌ@3X†÷âqÿï]#= ±Mµw‹°ÇCþR$*¨#ªßMK)³j`$ÖŒätû:—‘F@óØE, °U äœí±]"Ñ›P3RÚögÌLqYpŒk:®Ç¼.õ?…|Ÿæ׉ˆ,é`_ÇЭ:Àâÿǵö @~ççþŒä¦ÍüPkCÁŽ}9,øùÿùÏoïàƒ ‚ ‚g AAA;îúôÿMT­ `mögüÄÀ“Uñï+j³©í’’M¸]2ÀDPx…@·_— \¬¤Hx+اITîEbÌ)ÿµ*>|¢øèZñîá‹ï2Öj·¿û€qu ŸÜ%|ï‘  ðŇ„”¬†¬ÕÖçûï\Ñ… 5ˆuöb„àõqWÌ"ñø':ãðLÑØºìæâ³öe'ö·ÖÑ\øyøcj|Nè»Ð?~¶Å_T˜9'”¥ ç4'Ñ™MðÕľM™ûö§Lñˆúí9à•ÇÂR2DçÓŠóy5qß-çŒåP\àjmXW‹úÏ%#çdÛS…x ¨%ÌÄ„ìu ›¨nç‡/’€Û{Û®¥}>ΉˆØ9‰ª3Åa_S ÝÎëxŒ]K3UnkcÜàPr{ÊÂù¼b=¯¾}žu Ì„V~öŸýÙ­AAðqÂAAAàÜ7ñp1@>§ú€Ú€Ÿ(®WÅ’íÁ”‰‡Àn[«ÎèöãBóvõÞwÞ‰!ÐÞOö‘á2†½ àÉÙÖИþ÷áÝ+“UÑðÞCÂÕBhÝR®ÏŠÇgÅûW ¡‹â´ZÅÃá½ä•V- n<‰±Æ^Œ0¼™¼)½¹Æ„ÿ-Zßà-îÝzî7CŽ ì%?bæëZQk3Ñ×§ÉÇDxï² Ín&Ð!0âøKÉ(Å"ê{ë&¬ûvDMˆfŸ¤ï­ã|^ÑzŸ‚»ªúã6¯îÂôRp­ö@g2ÃØŸÞG¢Á8ÎŽÝ2¹¨PlF‘”ÇËRUœ×ŠÓõù¢ ¢,yV)€`‰~ŽþÞoÿû—~>ÞPö޶x# ‚ ‚à•AAA÷"©Mÿ²ef‹j_|òß’Œ· PÕM¬‚!Џ0Ûœ0ã—÷ýÃÁ=„ÌâK!¤<<ºØºÊ™ðn2q¿$«—`jS¬MççLŠÚÇ×–Bñðh© à¼Zº@ï&S=8Ø÷ƒãiF¦½èKDax ìëÞ3|j\0…Ý1M0 Ð6->lqþ³/ÞÞhnó{¹$ï '›*ñW‹§OlÓóãyE$µÀ"öǤ:[ÂXxLq[t3(ˆzë›øíï…€ßGtî´úm*Õ«q@« ­wÆ·ãdO& 2“]o,ŒR2Tý{Ì`Þ×/ÜÎkÙÞd`ÏK-f0¼@ÉMvžjmíû.Ý`32ð¬°ñke©DbFN‚”Ó¬Šà´]Û‘ö0L£Æá󬜫/‚ ‚à6Ù'Äÿù‚ ‚ ‚à­ä>Nþï/¶Iîñ9ŸÐš(’i+`ksÁЧ³Eì¾D—€A˜îsÂÔÿÓhâ©ÛÚh èj"¿ø™°và¯>|ðÈ„¹w¯ï\Öô|ù}Æ»Wä"š¥S|ôÄž³dà¿?ÇÚzi¨*ÞÿÚÿõºwã­æuš¶¸x¹¨P¯B5yä󈋷¯Ç÷ÄEï.Òm²_wQù9%,K™Sòó1>M?Äc ³Y· €-¦ßDãñxé‚u]±ÖÙÕ(Ô'óeî{Ê}o‰"nðײ”rIHl ö?»_kv, [¼?jmh­ØDöœ‡¹d›¼÷ž”äÕÁmvü·™0>ï}Gw#y‚«tAmm~]׿_oÛ°ãË3¹aÔ?Œíz™‹ù?ϨkCJŒÃaAJÉ’üz@km®Ö:þÁÿò—/ýœ¼A<ËohAAÜ*a‚ ‚ ‚à­æ¾‹ÿÀ>X§øOdâëÚMC>‡ IDATÔ ‹jÿðZQðÞFN´‰ýÀŒfOž$p“0ÜOöUÍM ½oéK±‰ÓµYü¿‰@N„µ*¾ûHñácÁ¹* ?ø…òt€÷Úô¿u|+ÖFfFa²m0æäñ.í¶à³³ŸHŽT€7“Û0 ÜŒŸÓò"ðámˆH·ú˜-Ú~‹·æ…M†oú&à—RP–¶)Óga{þc Àm†€7‡—m¸ù£ªh­£Õ6Öß\ôÎeâÙ#ùG$üˆÖ¯µá|^¿ñÉýñt918%@Õ„~ÙZ·˜þ­ŠFçó¯¨k›çˆK¶€µB(KFÉ ÌDˆî׊@3‘!§„”RJ ­wÔµ¢Ö"ÂḠŒk6þOìŸO+ºrJ^-à&’qŽý¹’›NÈ Âßÿ?»µó÷ŠxÙÝñ&AÁSɯ{‚ ‚ ‚ ‚WûÄ&ïåµÛU-Îý쓟ï?$4®ÏеšÈúèZ b©D€¦K@ü úå2¯=z¦o³CúylÓ–!¤èBènPžœ=é8FÅÕB¸"`9T N„ÖÚ,E %‚ˆÎi]@zóy·ç>ºVÔ¦øòûŒå))ÁËa¥ÂðúùÉßø/Ï@»÷‚=c’|añ&ç¼ýÎ×'´ÚлØë“wÇÃÅZE—>§½±d”]š‡ˆBÅÄê!¬¾Õ>MkfFû¥3a€üMh,Û«£‚Áyü<Ñ…OCÞ·ÿ&™U))ˆPµJ©1™Ø=_í#û¶È·oï®n0À–Hp›ÅïЋš…Ä Mþ÷§Lú«Z• 3CäœQ–b)A­cíu¾õ.^Äf ÷ùž4jZë3U`¦>øÁ‘'yr³Ÿk@¤o¾æZÛê'Rb¤”ðÏáGìÿËøÙúnéŒÞ*³iá%mï6—VAw˜0AAAðÖð6Nþæúçä£ «K&ò&¬^¯Š¯¼Ïx¸Z·ØßÞ×g ‰â¸X´»‚Ð3Æ=y•òë¨ï*âÕ8wdöâç8±‹nôfý¥ŸÙÖP¶¡^”lý½òàgàÁð¥÷ßýPðø¤X p$@ýXG²À˜ Uض—òñc¾>+ÎU±ä7élÜO>üæO„ à a>/üõ»øšv?aSwáÜþmSò*€’€ÙÄÜÖMôe2q½ä4·"ž  Þ+àZº‰ÿ·?Ì)ý!ø“ìÔR¯#¢<û¾‰èì·'Ú¶¸yˆÙ£ÿ #×ÄÎïÿ4™L”6¡zÔX”?Mcdœ/ß÷ƒ½Ô{Ûï‘ã8ìÜú Ú¾»H[œ¿™°Ü 7r$çwÇ0®Ak¼%(™ ìj$Ü„Ð:²§@ðpŽù"Pˆ 2%h²ÿ"¿ UÁx/×ãš³Çö³?„_øß¾µsyËìÁçMç @A# AAA¼¼Íâÿž!²ªZœb²¯»âÉYñ½„ò|ÒÏ”Œ¥ãPÌ@ëŠs³m2‡B³À‹¢ªè.ô3‰Mðh¬Õb‘Å„-Q@:Þ&æ×X àÆ„Ä¶ïªÀƒ…ð¤®Ï f€ &î3¡dÂ{WÀiµ€±××g[{ÛÚ¤¡+áÝ+ äÍõ`kÍžû\íûÁíói^?Ã,ðæóµo| üõ›Æ°!Ò«ˆ÷ÞȧâML¶ ré2ãÿÒ1uu$²)yõéùå>ô‘BÓ{Gm ­õ‰ÿœØÄ`¯þ té1ùލÆd¿Ž~´SJ³*Ä \kõT"B'û^kÍÓ ì{;1j`k'FÎ )o8.ÎцšÛéÖb†Ï`Kùa¿.Ú·š„!ú§Äÿ/Š* œx ù­wd?v»m3pŒÃR_½w$¯Vïýã‹'B¤e‹ñ">‘MôçœæµÄfÛ®zòÂ8,é‚)MÉoÿ—_Â/ýËïÞÒI}e0Ìðy„ü0AApA‚ ‚ ‚ ¸÷„ø‰(5áVÔªøð‰â£'>HÀ¹Úׇ¼{Åxïýñ)v—.ÖÍtCöqõÁóâíf¨HLÈlçó\§ª(‰pµŒûÛ÷DÌ€WJ¿¶Ô…­–CÂRK6ÿ½+Æq1Q§+@”|éƹ)nlhèÝŽ''3˜$"$‹‰Xó9Ýlr,t1ͼ9DuÀÝàkßøK˜SóDö³—ÓœŒçÔ·h÷œfÀœqgF\~¤i&.èCfy0€ˆ 7‹£ïÍD^Ìýñjb¼©™C|7C3{¼þ.ZT @ :ÄbìgÞâýE!*³J€ˆ C ÷ÈñéôÞÒœ\7m† R­mû€%†àM»U3$ /ÝÂ;ä0>Œè&²ˆ~ý•Ô Üèáç<çl¦ÿÚ®»í(û6SNv.E!IÆeÞ% Ȭ„àÄàÄv®}»Ãp±½G© ý£ÖE‘ØŒ–0amÍ* »˜éDwª‚ò3_DÎ ÿð÷¿óÒÏí+dÚ.ÿoÔ§öÃAÁ$ AAAo#N~TX|¿ý¡ÿ¸ìïÇ9™à_’ ³§UmrÛ·B"›V÷á½—Vj{_¹)ÖÓîßZš"'¡ 1|›â¶s?Äÿgm÷U1D­¡ÅgÞ¹b\ï\Ùתf0‘ xx(ÍIÒ÷Þ}@s-~Rº!'ÅûCãxӉꀻÁ0¼¿ûó?ŒÿŸ½wû±dÉÎû~+"2wUõí\æÂ!9¤4¤%A€)½øA/6üä'Cð‹ˆÑ䈲HJMþ#ÃI‰CRà¢$æ‹ÿ?É€A‚ À² ÝLñ2#Î…3§OŸ®®½3#bùaEdæ®®>·®êÓ]½~}ªö-322wæ®ý}ë[)Fá½j;HëÛÞ#àMäÐI›ÊøõJ‚‰Æ‚´Xx«@¯¡>,Õü&/Uü¬‚ºÖJmç ‘Þ@Ž’:Ú“ôþôUk3ŵJõ6®˜,=à¸U€mÊÒV@u¾ïöÚÚ™ØÕf`èm næ|­ÝÄÐÚ6hK6°õ5¾Vr3g¨Z¢Ã0$K3ˆÑ’Ú.*µ»û¢Xµ>¶Ž’‹ÍQÔöš–š„Úæº›"–öCÍR›°_rYZÄCŸ;%æÂ4Íä\@u1ž}ŸÞþ_ûß×~ùk×>¯/˜î§¼lØò~{1ÇqÇìÃÀóörÇqÇqÇy)ñÊÿ§Ùö›ïßë× S¶>À¥š°Ÿ‚U¡#Ö»]€ý /*¥š8mÆ¥ûmh}—½À•,U«¬ý°ElDk+ m¹¹XËK.°*w¨¥X[œÔ¢ì»é š0­˜Þ+øK±êt3$XmU¯þïcíýëû˜­¿îs—6A½§.tñ½”M2K%ÏÖ¿gÜ C"kc°5:ômšçÌ­M€EœŠ^þÑßþ“(ºTi÷¸üªu©®ŸçLÎD‡ÄîdÇ0$‚{u7Ç× ­MÑúÄÃÚ¢ ˆ,'@¹[;€ßhchf£.ˆ—ºˆÎ²1Rõ´˜")%‹õ— ]*Ó<fÐf&0“@\RÀßœ—Uµ™diupÝ€ë_Ê*ˆÓâ÷ËÆÑ£ó­*¿ÍoŠŒÃ@L«)ËÌæ:›sfšfjiíZ*‚Ö5Þ¿¯k[˜ß"úœ¥Á>`ÌsFUÆÁöC¿ôT¢f @ašf..ö6×!ؗؽ½À&Å!¥È¸‡„!çÂÅÅé0Qjågþñ;×6×/™úÝà8Žã8Î3ñŽã8Žã8Žã8¯ÂZ}^« ÒµUl›`+ÌY)Õ"ÛÁÌSÖõ/œï•·îÁɥʒÏnB»íµ|4^!¸›/r]+æç ûƒ‰üîYy÷\)ÅæÿÑÛoÞ ÄCjóÍ:çŸôümÇ!ضôíÖàâ LY8;N!†5 ûu6†8o+ðòðÅ_øÏ|ì×þÆ÷Øi¾‰»1šc8~o/Íã­b_B@ª´Š{—{Å¿j¶c$Šõ±¬uHï“Ò n} µ‹âªkÌLÖo>j)Õû/K•yè=mú²dÙÁÌ¡Új_B‘ÍõOdÉÿϺܛh ݺ ¾^”«*Sž)Í1 iÙ®œ3UC3r )õ”Û?1PÈÙÄûØZ´­£¨ hÛdíÖå×R™Ó²Ý&üo Íœã!Øk{ZjæÛŸ…Z×–)%†qXö)˜á¢' ðK?þ~ê+ß¼Ö¹~ íç|Åc‹ÏbsûY½ø€ÇÇqǹ¥¸ÀqÇqÇqœ[…Wþ¿?½_¤Vå_*ì'eÎÊLPyrPž”O?¤h€»'˜"Wž[u·%X•7´o£•£~Ë[b«ÿ¬Gñëò­t7?–¶0&‹d>ÌðÇ…‹ƒòÝoGNwÂÝÓJ…9+)6©E„\”¹ØrR43@à“1Rlúº»Ç&© Fálg·Ÿàñ%pº†¨½Ø”¹éfzd;¯>åÿ¿þÎC~ôçþàGã\Å—~ùk|å'¿—!Y|LÑ¢æ[5¯ò/­ª<…Ð*˵šØ\ÚIÁÎ/kOy4VÀªú¥:ìš¶´)…\¬ AU%„°^™Z…zÉ-`ˆ«AAVoÂbbáH´7“€­'×L)zTÙ¿=/Úpnöb·Maéã”  KúA-PbJ c²*ûÙ’¤· Œ C3lÚ;ÈÆÑªµ¨Å¢kRŠ$ -Ö_«r˜&ûiY~OU¨µ’s!·T€Ýn|ƶéò³.ǃ,Žº%ý@ÍÒMfØîÌW’˜6·»Øß‡Uà¿|ÿ–÷{ÌqÇqœ[ˆÇqÇqÇq^>èKêkD{/`E ­r?„µûÔ*Ðç²ööUµúݹ˜ 1œ{”;Ħohû¾½.àM¼Qk9Уáû×Õ•UÀîã»mX2”fÁâðç¢\Ìpq˜á0[Õÿù^I îì„O?ìaH4³LÖ™9+§»5^¼p~Õú®J&HQ¸{ªŒ<¾0ƒÉ\lÇÁŽ‹wÏ+1oÝ»}Ç€óâùoþÂnøøñ/€ßüÛ¢UÖ[ü}­&Öæ¹X/ø¬ÿ<½Ú»‚4iÕÿÚkjû·˜×¶l;gÄ-Š¿Åøç¼FÞ#¶¬\ÌiTZû¬‚|1ta™µò¿_ »È¼mGD¨l Ú’Ã@D¤¿ÎVqýÕÿk²m“w;&bŒ )5³E]Tc¥EúWH±Pc@6×åÚæ¡ÏuoЫ÷-Y ¬I 1X»UJ‰ì›HÔ6?U+ó”ɹØü7Fß·9—¥eÁ²mî{ëU%Ï™ÒÛPYÚBô).¥òË_ú,iHüµ_þÚµÎû bëŒØ¶Ðgüþ~¸ÀqÇq^û®¥ÿî8Žã8Žã8ŽóJòJVþ?Cð¿ü-îûEê\a·nñþ&Ö .&åëïT¦ Ÿ{3°í õL„ž3äbýëUa×zº÷€Þã>W»/†ÕXp˜m=wNdI(Õî‹á剴¿n¬rÑZ-€mkUxï‰ò‡•GO*wO…ïz32ÍÊwWÜ |úA V3 œŽ6's^«=KUÆA–¹òòÎ]ñz;‰‹ r6‘æÎ‰‰Tßz·p2Ÿ}3¼´Ûáܼ•ÀËÁÏÿ•7†q7B؈òÍ0Ð…þ&çR6¦mÂþ»?§§;†!‘Ke±gߪÏc‹Œ1,¯1²Û¤!­Õí-ŦŸgµê²^K*hû­š½” èºì&ŽÓo‚1…#£Âužß¶òk…¾,×ÓZ•yž™–&?îbŒhU未ñl>RZM½R1lÄ%Ú¿¶¸ýR-Ía»ÝŽqLÄQ”Ãaâñã'äÙ^Ÿ†´˜̉)rz²#Yô¥æifšæ6¿=MAŽæ°Eú'%i}gJ3~lbŠÄ_UÀ–‰Ö¨Ý¾üóòï—ñ‹«ã8Žã¼¸ÀqÇqÇqœWžWJü¿$ú«®=†¹Ú`l;¼êÑùQLغ0Ýø\àáyå|¯<8³*Ê`ˆfèâõa2aúdÜT ‹-+·êöí& ñž¢ ¾¡EÜçbÂuŠOoÆm·ÒµZüù^™Zåÿý3Sò/ÊnNw4À*ú/ÿÚ2{‚Ëã/לuóC.–Xp˜íçnvƒp1Ù’"|ç½Êá3oÄOxÔÎ뀛^~á‹o-=Ük{Ó°Šé½š^1a·”ŠbõÖï~¥†Ó³Æq ÖÊþâÀÅÅžÜ*ÄÓ—V¨b`b -À„þýÚù´ ú!†Vù/ËãÚªÿcì)«‰ÀR XÄÿ~޾)ºVëwS„ª’s&Ï&Ї „[%m•ö•Z µš‘aŸnÙ us1×>'Šô„l~Æa 6ªf8ü„y.ÄÆqH 0M™ÃÁˆ©µ€(•R›Ù£­R‚C\’$ºQ„fÒÐ͇ a1 ,é"¶ÿÚ¸J.„ˆ12Ï™ÿîüѵí“Ä6 ®6\æåú€à8Žã8α5ôÛŽã8Žã8Žã8¯ ¯Œø¿þßOèÿ Àû݆Õ& ¶xza>d8LÊn”#ÑÚŒëóZÛßõß—×R*ìÊùAÜ9 Ä`buÚ¤¨Ú}½z}kNxÙÄìçaiØF5¯‚þ65ÁL&’ƒEæÿñ£J.°àt'ŒÉ*ÿwƒ%0ô(ê— UeΖ*±ŸLü¯ªŒI¸w&Ü=‘Å2eåÛ*÷ÏoߟôÐ×7¼\ü½ýÔQe~JM€Þˆ·ùÞSš ‹ÐžRdÜY¤­Ê~àâÉž\ )F†qX—ÛZHw¯µ˜ú^9ÞÅ~ k·b3,‘óÐça¿˜úŽÖÑ«ÖA$\›Yë¸úhÉ}—HýfšXÓ L¸‘Õ`Ñæ”q72ŽƒEê—–€ º2S€ZbÀ8Kõ}­@­•ýaâÉù¥†!1îF†ÁºÒNÓÌÅÅž’K›ó5a¡©ò£AßO]ä/ÕZô× CbÂö±6g!X ƒœË²jµÇú׿õÜûäò~Ižà8Žã8¯9é“€ã8Žã8Žã8Îmf©Âƒ«³üuùߥû.ñTBÀåRùe…íö‡ÿ~wù¦XLx8 iÑüöÅ{)6„ª…öÅ{Úªs±XúLœŽ- T˜f3D°V­=@cñù’þ%³¯ÅæqnÕðª6'£u[>Ìv¼„°š+Þy\ùæÃº´øÜ[‘(Ö†aLMXâ8aàe ª‰ÿïžÛ^5óBà´§Fˆý bFì¶ã¼>ŒÌM/Ž¿ùÿø™ýêO|Ž!%$†¡ ½&¼‹Èry]«Û¡_4E„ÃØ±™zym¿³$¬´”–R©`Uë)‘šhçŒÖµÇ¼%ØïªµÅþw“ ËUMQµëæuj°«à¿Ü³|èÐúÄhP(P²‰âÝÜ–9”£6 QªÔRÐöAYM¥RLKÊAÛÚf04óAo[ú@m¼µÐeIf&¨--!,“‹6¡^ÑÍÚ€jUªV!ÆÕ4ÒçAKµduæP32ÃøÊO}ž”z’ü•¿û»×¶Ÿn€ñ}«<Ã&zCcqÇqç%à Žã8Žã8Žã¼’¼•ÿMü_+ iJyÿ…§Å~½ü‹¬7åª'ʱ9àcVñb5ˆ´èy¬ê?ŧý Òâµ®ï¥B º$ Ü?æbBð\”³áɾ÷~ÿ‰À,‚ÊíCZlB–€„R-}¡T,%a'<9(ål' æ §£ðÝoÎÊ4›þæ½€*‹`~ùxÌrïTØÂ®K®zbŠÂÝ–ÔÇqœÎ_ÿÄoþ­?AL‘Èå3lþ×j€åĸˆÏ)6ߪٗˆù «`¬Öƒ>粘ªJ±d éâ{ ˆ¬è"­E`Í ¶±×N3âÕzüârÊ@3؉tS_%ILÛ뉶ÔÌ$ ²&IPùs.HÈÄ&æÇh-ºÉ¢› K­ÔÙöVcB)6ØZ•œ³Uýëú±&, AÚRÌŒÑuGf…Z Óa¶eYZîØ‘±8¬Ò¿´‚JÕ°Œ!ÅDLÁŒml¥¾ü¥Ïò“¿ök݇7ĸ|ÿËø1ÂqÇqœ‰`‘@ÛÛŽã8Žã8Žã8/%¯„ð›ÒCÖ¯W¿yæXô?Àl+ »º°½_¶Ïë¿?ûÏ=Õã•/Qüj•éÀ*Ê.‚ÆúœºÝÜv{?)ßxXÙOÊw¿9Û ÷•Ø"Þ÷“2$álgãÊU)e]×nhBðf}·‰>çsäH°(ÿwÏ•o¼S¢ð=Ÿ ì!šHOfª°Ø|ˆQ“ÍYß'·m®çUÅÛ¼x~ã§¿o†K.LÓLÎvqéUß½W}¯ô呂˜)%bŒÔR8&J­„&.[5|wÃAì·ÅÚ”Z‰Á–b@º³N@$´^öíå×xžîF¼.j×VÉ^úEUä(Ö¾´mËs! ‘q, Û\Tµøü”¢‰ø­ò½_·ºà¯Õ¶ÙÚ!4EX…ùÞV çÒªüuc¸X 9ç#3†=¾Î÷"î7£G_W8üµ¥6dkk9bl˰yЪ”jÑFiHÄȳÍUJ‘a yH‰aLöú¶+s.<9¿ ”BŒ‘aLüįüÇkÛ—/€g}ÚôŽã8Žs˸lè÷9Žã8Žã8Žã¼t¼€Ëâÿe±¿WÌ_ÝŸzÝûýeöLÁÿŠû?¢  ‹ýö³D„º1 &B—jQÿ+ßy¯|î­Hxx^9Û oÜ ´bIvƒ­ã0C©º|É~2X¥üUÕ“¯:[ÃE©f˜HÍì°Ÿà÷*sQÜ ¤hÛ?F¡µŸfÎp¾WªÂ3l§ç6ÍX“¢Y IDAT•ãÜvÜ$pýüêO|n—·ÕÛŠChÕéVéŸsfšf„U”Ž1¢ªK € ÒZ4q›?ßDêžs6á|H‹Ø¾¿ÍIwÝçèË&¾Z•iš¬¾m׸ÚE$çÂa?q8LÄÇaúK©Ô!µçwEß~ëm~{¥~79ÈÆèÐ÷mÙ¹˜øÞÍÐL¹,ËTÌ\1 ƒ‰ôÍdÑ—Q{¢€MæÒ¶ j511%¬m,Ù¡™«™b°ûK©Ë±‘†„Vå0M ìv1­º¥Kƒh‰"Â0$B¾ôË_»Öýúx;9Žã8ŽsM¸ÀqÇqÇqœ—žWBø‡•{ÔŽ–Eü¿,üëò¿§Í YŸqŃ˷ßëííýÃp¼)W§ôßûs¶›ÄÄ싃òÎcåÉAÙ ðöý@)ðÞ…õµãŽPÔZÄ&pמÒܾ ïîË&ÝBQ{™¿Ú·ÑÄý÷.”)+'ƒ˜9 Z4~¯ô曆mlÛ7WŽs›qÀÍð+í»ˆ)C ·JÿÄ„åd"ÿ4ÍÌs^„bU%n[@™ÛBƒž,Uê°ŠØ!ZÕ9"Ôb-zòÀ’Àõ§W³ÞzÍîö4Í˺‡aX ¥Tûûã80 䲊ý=v?çB.«¢oÇšŠ O}`éóÙÅv3 Xr@­Öò¦Ïñ’(Ð"þ«Î?9Ù1ŽÃ"ÞתÌm•ZAµ%„¥åA_Ÿê2¦[òÃÆD b÷wÓÐLÀ;Y"Á:ž>iHìÆ Ât˜™¦™”"ãnDJ¶càÇ~éŸkß:Žã8Žã€fíKºiàÈ Ç?EÛ7|V®ÿsPJÜ,æ!»ÁªÔ§Y Á„ëR![0/”o<¬ä'#¼y74³€%¤x»ê½§q¯ Í­•B@›§!E!}*(B6U©—ZßjxrPö³rg'Ü9qƒ„óòó<×?7<›ŸüÊ7–ßí'¿×®”Mø-¥"M¼·—úÏ·kw¨¥>’G"{­J-]”ß\v?¨ÅÏÇDÑ5B_MÜNm;¶ç<Õ.€×UÄ‘Ã"x×6Û4„Ø7A}»_¡%,•ÿ-q!¥ÔÌ| 1.‚}Ÿ—>ƒ}jz %K€&ô¯s_kE[Ú`i)R5´ýT–íî?µíK3àU‚ÊSã!´ýh­¤µH=u †A-‰ !iˆÜîO.Žã8Žã¼*„+îóo ÇqÇqÇq>,=V1¾ÿUU/‹ÿíAÕöU÷â0¡^**ˆ"aýGh÷Ÿb¯=þ·”“oÛ %Üа®ºV%]bX£í÷Ó:¤RMð¶D^e?Ùóvu·~…ÛýgjÿO#ÓÔ•)¯Ûߟwõ2ä©êÒ×nP…ÃdF€\nÿñä¼Þ<úízµ tŸ_úòW™7UÞ"Bh½âC‹ÊïÕìÛö7[ãUiUæG=ä[Ô¿U7q}SA¾†÷<ÿ¹ú(Myêv7tÑ»ÿ^jA«.cÑKÛ*€´4žž ´=kjû¯V%çÌ4[ŠÂÒ&`ðu‰õïê~ˆ6G)%¤‰ìVyßÓ~le¹XJÁa?q8X;ƒ.òËf>×¶iû/¦´˜BXGÁIÌÀPªµhËP´µ‰H- -éµVkÐÌÚ¶¯3 B ¿ù·ÿ¿ñÓß÷ÜûØqÇqçã"@áik¢cà8Žã8Žã8Î'Æ+%^Uû·ÿÕ~ÿ*þËæ‹õ#5^ì‹ï^¤¿ÆõoÛÈQõ¿êöþÍ EÚݲùÇñϾ6·Ÿ{ tÙܪV¹>e%Eád€‹IyxnQìoÝNw²cuÇâq´Û+¯Ì³Åã =eÄæ=¦À0 ¤Q,f¿äB¸1ôsÏuƒ´}©ªG"~ÿDÁ¼WæÏóŒVêQ B©eõEt#A)•Rztÿ±¯ª¶12´vŠÅõ BL±}v©Ë8˜çLž³mHk!`­ly½…@hÆŠØæ¶dg­u{OÆóœ9&jKv蹺áÃæn5>X·$!ÆÀ0 ­µÀ4gûÃÒb FkOS¤¶9éû8¥Øæ±µŠ(Ö»ç¯ÿê]˾vÇqÇù(<ËÀ3îsÇqÇqǹQ^yñ©¼¿ü{¯úoÏÛ ÿB«îgÉi“õûê&4´4ÿÚ^^ecè tU‰¯0°þÞ¹f!TU™ ì'%ìáÑå Q„ïþTàtŠËQ*¼û¸2e¸&ìF!4Ñ;†ÛožÚFm-%ØtjئFßæ¹¸ rQÞ{¢¼w¡œoÜR¼‰ÝÞKayËø;¯—D]Šºu¹f?®H®0ÏÄOUâ~NA¿õÏa ðÆ[œþùñ¢FÿÒò÷~ôSfˆ‘qLŒã@¡U¼·*÷Ög¾÷³É„o‹ÊWæi&—²T»Ç§ªÐ¯ÑÀjFØŠÿ‹8/¡ÅÖKky`¢aóZK3˜f«´ï1ø°&Ø}ÍPÐ^×[X$~›ƒѪÌ9D1,ã a×?ì'æ9[Õ½(¥˜ `¹.ÚrÓ (ÍÀPr¡jO]H¤!-ËFÍ|0Ïy3?ë¹}¹Ö¶mÐ&ŒãÐŒ‘Z+‡Ã´¤ B[NJ‘ÐÒD„R Óa¦ÔÚÌ,fNEù©¯|óZö»ã8Žã8ÎáÇqÇqÇq^*^ÀVxÙÆí_!ü/⿲FøwÑ?b¢‹Ê—p) `Y>-Y`ý©¨ÒŒW˜ºšÉUi}×oÈæb‘ö!Àù^ùÖ»Vu÷™7C4+D ö/i›ŽÂnÆd¯íñ¯“ ûToé× á&©UÙ·Uxó^àt\çµV¸˜•œádvƒÏ³ó’sùúsù±å:¡O?¿*Ì3á$ÞLHªÔ‹=;†ÀÙùnvü¯¿øWß&ÆÈn70îÆE´^ÎÏŠEé«C$¦H «ˆ}8ÌÔZ›(>˜p~ÍÕÿpÉPê’ÐÇW‹šhÝúê,"¾´DÖJþyÎLÓÜ*×íyª¶=µVR«ðïÕùÚ#ñµ.Õó1Å–4 ‹9¢·èi!j©ì÷Ódi! Í `ëÓåÚo€4ƒ@.GƃqLÄ”, Íï<çÅ\°.‰±Ï—vg]3Ý fVèÕÿÝ$‘Û¼„`éVé4€ˆ,© }ßKÖÒ %äbé­µÀýý?¼¶cÀqÇqç*º ÿ~ù1ÇqÇqÇqœÂ+#üw.Wÿ?Cø¿Jü—DEMô'èbض•eu]ôwÊj0±§)ûÚLOµ¸ÙV6N«¦®šÞÀa†wÏ+s†;§&7ÄC†d>…Rá0›»„i‚A¢ÿ‰ê|ˆË&•-þ^½9Ö62¬± Û]QÚ…¢GZ\nG#,I)@ABµÎ"Œ ÑD_ͳ@îýè¿{Q›øRòóûŽŽkA–þïKßùSQž­=À0&†ÔEó›yX»RµÅÚ[ßzKê†>^†,Uñ]è/¥X´}­¶ÌÍ2ÆÝØRìõ= ”‚ÖÖ2 m^-J.ÙÚ%´4©½^ÕRÌpP—~t]n­u{lñú63*Ö*(¶%[ä~ ‘R ¹» û~k€¾|»o‡£ª”jï·R sÎÄ9;=a‡å­×÷ù4M¶mÎ$¬‰ 9Û<ÄICdH–’ðÅŸw£ã8Žã87GzŸÇ¶ ƒŽã8Žã8Žã87Æ+)þÃF|Ù8#]ÃoÏm•ÿ4*A"{ €®Fá8»Y×*ÿ-MØi‚¾E‘UðéC[qÅŸv7ôמˆ ÚÚ´õ§wO…\Lôïmšà`óƒU_×j•ÿÛ!º è<"Båd„)C®f8 bí*.V zçÄ )ÛÈèå­î­ž¢Ÿê! –ÏÓ ÐÄÿen÷±^ƒêFðï.¬¥õL;ûuCÕhf±**ì™ÅŒi`Æ2•À£ôgÍ©•÷ø_¾È­~)è"v§ÇÈ÷Øúo/¢í}¡KäþåèÿC°ñ¨Eö›HnF'XEu”£(þÂr~³d€dŸQra:LT]R«ÞïUö–"ÐdÑ×¶þ.†£ýñØ„q››a̰}þå¨þfªèÇq7,†‹f@Pmf–¸ ¿Ð5}¡ÿc}l?YÍ)Ù66*Äá>ôý©›$™b‰&ò§fÖ´¶¾J)dJ)üÚßø^ÀŽŸøÕÿxÝG„ã8Žã8¯9ö©có½Ê;Žã8Žã8Žãܯœðß¹\ýÏ¥JËËÕÿ(¨fÅŽf‰Ö @í±f`ó3`Ùm Z¬"“*Vý_ÄËí±Š 7"f 0U`«`µèl×IíѺ›i颫ý» &øY¿H¿Œ‹‰ÎóÒS&kã̘ì-úx¯&åt'Ü=B°ãršaÊöšàtgm)^×cqû¾Ü¾OK5Ó†Bx=ç鯨Äί÷µÿmhŠB-P¡¶ë‰]‡TZåzK¡‚jh׃íÕ XJ;1GYOÜõþ_ú¿_ÐÆ¿<üÿõý@7aÈR,f{¦CÇxcÑÿ[Ž®›-úž²‰÷ísDUež³‰Ô)ZŸû!™A¡½_{µ?XÕûþâ@)•”¬2>¦¸¬/„@jQ=µ”Ö @—V9g3´ «ÕL»–"Ð J©µÅþ—f\¹Lo b ň¡”JžóÑüö4†œsk$Äfx`ɹ.I ½-BˆqØíFbŠ”R™Ó<$0î†aXÚ€%”jí J.¶m1®íj%粘z¢Aÿc ´ñ~éË_½ÞÃqÇqœ×š÷KOpÇqÇqç†xeÅÿζúù¹c6•—ÒúËöjÿ¤&ø'E’‰þ’´‰--)@B«ª+ …µ}@¶/Œ+Ve¶Ža­4Ukðôwéëf²˜QqcBÚ>pÉœÔÿµO]HÅ í6¥·*ÅБ9™¡íW«‚T¦ÃL-•aH¶¼ hÖþ@{RDaay¿TUúi3GÖZ¡.­$ˆ¥ 8Žã8Žã\#= ÿ¾ýyùyŽã8Žã8Žã8ÏÍ«.ü/=˜—€««ÿ¥—À£MÐW$ ´‰þ2(ÄJ’ CBbìJ¿Š}©ÎœÑ\aVëÏ\Íö/A3è R[¬3.¸V@Ÿ§>EA„ªJ)fˆ+\¢„WŸ—©/ürüuM¬k—í Ì梌i­î¯ªÌ¦Ù^?D3ÄÈ"Ð\®†¿íÔªLÍ,‚µI¨ÕÄÿ'{%xãn`ˆí~kÃMŠëi^¹ºV®þªþíw­ŠÔ­ø_ TdTØ)2VÛ f…½BtR¸ˆ( Í¢Ô¶Q黵KÉÂGØŸ¯ƒQà×êó”Z—>ò‹è|©u\ï9äªtŽZ+‡ÃL-…~¡ÕZ™ZÀ¸99 -î!Aæyf:Ìö‘¡Eý/n¾fì ?©¥æœÉs1@¯ªo "Â6zj% Ĉ)"HK Pb²ªk‰1Å%é@7‰½%BoO”b ƸTð÷¹ÆÝÈnÌHÑ®Óaæp˜ÆÁæV¹æi¦´tƒ\Ì$²ûCsls’Ká§ý[ÏuL8Žã8Žã€}ŒwÇqÇqÇq>$G_Õo™£ûVñ_DíE½ò¿Åþ[µ%Œ 'JÂþ|Õ†û¥?$Åh‘îAŽÄÿËF€›`»|U·– ø˜R«ÚÀ‹‰ïëûÒö±lRƒbJµ/ÒžkÛ6Ú›¾4|ž3óœ‘;ÆÐLm|íAJªªäöš~±jûŠ¢OÍ™ÅåGRË—íÜ.]¶çêu½æg‘eÛBm_Åe[BhQü%¦ÉÆÒ*õeM(6·!3#´v¡ms@ˆÂ0$†q0ÃÀnXÚ.¤!‘R²¶¯J1ñ¿äÂßý‘7®ýøpœçÀ/ÞŽã8¯(Û‹Ÿ“§+þ¯ºÏqÇqÇqçCs«}ê—U¹ü=Yã%`I‘– 0€ìÝ%î ã=$ÜAôe°*þ fª@#òðe¶øf@ª¢*–DÐ×£²|nèÉñX{ùý¦²ïZÛ´JÄ­0³‚ÿqy;èqÆíÖòCµÅųió°1ÊÜ´¦-mâÉ^™²rçÆÁ„§iVï•Ý÷Ï„ôŒ^õ—ÅjÙˆJûIyrPNFáî‰\çÛæ¥¡oו­}‚ðøÂæoˆ°átB°çt_O öÜírüK¥n \ÇUÿ—M}G‰6SØX‘E$ä³ßƒÜÿ”äâ›Àïý?Ãÿ R+Z·=ì/ë=b¦2]ÔÜõyò °ý p[þÛ¿ÿü…?s—Ÿù¯¿xÿóÝuœ ·ñÿKµ|]ϵ]àVUj‰Ìb)9Y+ÓÛçÃú~mŸ1ªZû µ°Êw;ךhK¶4Š „”Ösf3È&q( diMú¸ûïEŸ2J¯ÐoãZ~l~·jýíÜ´×K`âQ‹Å¡‘å %PjY|/}Ý!`'º*¶ÍÚ€%Q0ó€ÌŒ2B`Ó2¾”ÍTPrAÑeî%ÈòïoëŸûËocàäô„¿þ«ÿñãŽsøåÛqç%}ðSÇqÇqÇqž[%þÃ*œw®Ðü­<¬ÝÛjÕ™I‘ØEd<#íÞDãPï#"‰˜¨ êÁL’L¸ÑÇh™,öE°^´¤%¬ã4Íh«&mòÐoðk½«Ä ü¿ô¾ð¹ ý±;r5‘½TØ «É¤÷Ë›ãæŽU‹§Ÿ²U©­‚¿¢Äh¢ÕÅA9„tÑP—´Öß­ç=Ä G&€Ãlsp2 ã-ÌVì&ŽÃl C‚]²t„ûg\”ÇÊa‚{gÂÅAINF›£Zõ¨e<à‡¥‹“ý:³ÿ£Y{^Oh•ûBmF3…äÁƒ?KØýZÔ7Q ,Æ¢$T(Õj fT[Ø8ÅžÓйê3Ám2üο~Ìïüë Àoÿú©Ç¯ûÜ·˜t­Š—ˆ"¤dývJ)¨ZÕ­•’ 5%Kä‹ö¯µ{&H÷j~;Xj@¬vp„Û°Çæ€lÆÚ–#"K:Bˆ}¯¶ë2Tk‹ìïÂ^É¿ž_t1\vVKPm‰CBŒÉ®;!†D fn¨¥PJEeÝ‚,þš>Ÿ¡}¦ "–æÄj²è‚?ªÍQ–ôÞnÀBš0ÓZ-”l-ÂÆÔPYS ìé²$ ü“ŸùÓaâüɇÃÄÏþÖ»×rì8Žã8Žs{ \ãòaïsÇqÇqÇy}¸*òX¯ú©VõßJ8¥›¢ÅhKP$A ;Âî:¼E-Ü#¤3ÂÉ œ öïtG8¹ƒ¤ûH¼¤{H<%„ˆHF$·èg]Ó¶BëvlG›ðbÿÌ{1È΋¡ ÄsÚ3ìgŒ÷Kì~7 T…\V¡Ý–q3Ç_©°Ÿl=»qM!bqÿ»A¨ ‡lF…)ã'Ê·U¾õ¨ò͇•¯¿Søú;…ï¼W9ÌkÒ¤$Ä`úik }ëPlÛT­¢¿x÷‰%<¸#¼q'P*œï•9+ç{åëïXk€‹Öv¡·€èíäý½ÿ!ؤ¶Eÿ_!þ/‰3j×iפN 鳄øqx@HŸFógÑwÿõþ/xw hÄ–Ñ—uy=­_ºU–ë×’ççÖéïü›_Çš´±VÓoßs&XWJ­í3‰µ(¥˜°_{r€Åù›Y€%è½â?Ï…ZkKˆKÜo€Xå.…ÜÄîm<-µ-WˆÍ0Í$MïBøzÚØ¼7ú/ÝP6¯iÇ-‚ˆ)µ¶-f†ÐeûCb ¤dϳ–›‚͜ڶY˃RLðO)2îF†!-ÛYJ33¨™l~ÄöÕvßt“DBûÉnÇ0¤e¼µ™<‚¿ðÅ·nàHrÇqç6q9àƒê?n¸>ÄqÇqÇqœÛÄmýBÿ¸'sC0us{§Øò¬zLb5#À:&d<# ¨õ)œAa¬ö÷m9j"„ʾ"5£ÃÑsÂN`®è»3ú*©—Ëm¢ýû7ã÷¿ìœÀ*€È‘ƒ0åü‰‰D§;ë Mx+NîÕÿWõ…¿na8ëU?´Šõ°‰ùg'Bh•ýªfbxr0#ChÛ46‘„cþS0Á~êU 7ûfz?£ÄuÏݶ­Ã`H6W¹Â7Þ©|ûQåóŸŽÜ?î´y¬ ûYééÜ!¥*¹jízŠÂMŒùÖ°ˆîl~^ФhÏ“&òÕK/P$4#˜´7_K »Éw©ïxX`Š¥µ“Y æ%P«J®í6béaóf^ZÉ|ô€«¸ü™á¶¤<ËpU:ÀÇF7‡Iï)K"@)&BÇÑæ ¬¥RB¯V7]{uzlbºA‚½f‰Å·×‡¦Ð‡ ¥}´P6ƒ¡Åè‹Xª@í÷B´‡ª"*¤Ѱ¾~5­ÇךÀúÙ«¥ ô{¢ÅüËÆ(Ð÷ZíÂTK±×´tÚ5I‚4s@ŸŸ`ÛÙÄxT™3„RkK -e@#…ˆ4#Â:Ž ²Œ³T]Œ‚=>¤È8Œãh "K«…ÒŒ)%~ý§?Ï8¨BžóÒ‚ÂqÇqÌÐÿR¸üIýYÅúWEŽã8Žã8Žã| ·VüŠcÑærÊþ"Äo’$A8ÒªÜAôѤÈð Ñ8 œ!R&BJÄ´£äÈÆ9»Ä‘*€>©í‹ð+DǹjÕ¥/¼ˆ‰ÄUaÎö"¤ý¬ŠåCÖ 7õ傈EÑIâñc!'ƒ²KkÅééN–vW™Ž…'kp¶3Q»÷º¿n¶† »½êÁ}Ü]x½.A½‹ÿ¹í³ZšÂŒ™<öÊ~¶'Y8ß›aâÁáS÷»AØ 6Ö‹I˜Zr”m¾Öà×oú¸5\%þoÝfÚEÑVñßÿI5áŸõ}¥¥Âþjþ*O=Eâ9%} OÐÐ1À T{µG©ÔŠTÚÙî4{3kk°íõpÍûõÑoÿ­¿TÈ…2Ü-Üý‹ÿáZ×óIqÙðQ [sP¯þï—þó_ÂZ‘íœ"ºˆÛkŸ{‹ÉïÑö1D”ªu9Qwa< ©UÒË‘oeùm¿ô0!\k]Z ö¥t¯ˆïÑûÒŒ%ý¹ÁV¼$Øõ§.úým»™@¡ÔÒÒ Ö¤!-)DÝ‘BÐ}ŠY IDATUJ›‡ZÖùè¯k0 ¡% BΙé0µ–BÌQ–[˃y¶t€”)®¢m+´·^h風Úò¥¥t£‚Vmm6±3º¶CPU¾ò“ŸçÇ¿ü‡érÇqçör9Žÿw±ßqÇqÇqœÌë#þw6lnn„í1Ø­-1b¢†Õ©™f j |?¢÷ žSË×`ž¬0 š#Ä„„M'VÎj_µ©m*½pôÒŸwþמóé±ÿSVæ !˜D¸wfQú‡Y™Šr÷$0g€OwV)n‰ÍM}“}áÇÆÔ㣻€®lßÛT€¹Ôóüý A8•Ý(7òê1ϰÑV±¹×V€Ûyf•|¯¯²¾ŸÂÀtÞ½*ßz·òðqådNGábR>®Ü=ÆHö“.i A`7´„ˆ–¬Àf¹~깄^º~Uþsœ°ˆÿíù횢ÐÒf°Qäü]ôÑÿƒÞ{‰gh~yü{°?G­<ÚDÜÔ’šy̪þźªÔRkD"¨&k3 E›h{SsTEB…»•øéÀþwÿ N¾ðOonŸéïü›aX#üÙÄà+,Qý˹° ë½}í{Ìÿ0®By)²4cŠìš¸?ŒÍÐ*èK½1C ¶Þ+Çž–5aD›XÞ×_[$kâÊR¹UÙ—bQùÝ@ jé!Wÿ ËJ»¸B;?YëiNªžD @Îë:–¹ëé"K;Ø_˜s&´÷Q ¥2Ï3Ó”Æ1,F mfƒ%`CŸsiboзM{Žv +¥0ÍÙæ¼¥Äð.dŽã8ŽãÜz¶ ðáÿó¯ŠÇqÇqÇq:[íæŠâû#—u7¡Š€DD›€Q7ˆ|á”:ô0 Ó;0 &$gûR{þ&ÑGt0V9&M’ãa®ƒuœ@Óá!ErÎ÷&"Ý= ìxôÄ̹(“õƒ/j¥ ĸVØ›!àúİ–š}Î÷ƒ0ÚÆññÖ¿í5}ÔªÓ°dl›ç¹˜ñàt4¬L¸c‘Ÿk›¤›4VãÄÉ ¼}?p÷D¨ g;!ÒÚJAaÊ-E!@lsFYSÔO=Ïd«”ýS®ÿ-§ ˜@i"§@­hêEF¾óuäüÛhJH™Ñ‹ ½PÈ­M¼At5Œ SEJAáNEN‘ˆN %$ÄMìÀ&`15<ïo‘ÔÆðöŸ$½õ_‘ýEÊãJý7ÿŒò‡wÿêï?çz^z*À‡7Ø9B«®Ÿ5ZD|lqõ]ÄF•œ3uVTLü/¹Pcµ-®ÞªäméµHk H)¶Jû¸TÒ—&VÏs^ªÿ{{O­?ˆUôW¹k­äjí=À„ô°Ÿ님p>[*A ¬3 ,âx­•ý´çë¦z¾ÖÞ¡Åô‡Ëçsi-MšÞÔ–ÕSzÊÁÒŠ€ísl¿ØsìA3T¦ifž3¥eþÛúy¸º1£·_èæÅbÿ†”Z:ðæ ¨*_üùÛ‘’á8Žã8Îǧ¶oÙÜǥ߷¸ ÀqÇqÇqœ#^¿ÊÿcšþrIiÇTÓcÜú)/Q½GÑ΂°Læ­tªðä2?Fâv:#çrÈèE¡ÌæˆÆU à8ׯ"h¨‰Ò&L ¥Â{•?~T)Þ¼“Eã‹iŒIÚkLPšf]*‡ }ª¿óÍl„½ýž̰pº“ãÿòÄÑo#øK1#@h•±¹ØÜõ û~Š)­ƒ\©>î6m㯫®î½SáÁ™«™(Dlþæ>Î`¦o<¬L³¥0œí¬ C°„“Á–õ²Ì÷KÃUÕÿ´ŸG Û/áLü'@ Šéƒ[‡… E!rn1ð YLÄÏíøêm,Ú~ E[yEbEîä3yë{QôÛß@¥PσŕWŽ4T¡li‘ï·ß{¯÷í]mNd;?APî u‡„‘"÷š™¨ðÞ—¿bBcâþ—þíGÙ/%6 @Ú‡Ž ‹Ñ„|3öóJ¢E„Ò?‡´ˆùE|?jwÂb (5ÛnLƒUÚ³¦襊v™­ºžmŸK]*ÔƒB]]&¶þb¯ë TÖ;&¦@ÒDL R+"ÙŽ9YÓ ´Vrí¢¼™J)äR- *YJûŒÖŒe­Àתê²ýv> ¤Ð&ä§f’ÐÛoë^÷`Û¸#ZºAΑr)fÀ¨›u…@Œ ÕúÔéÀLayi0î†ÅkÓÏÝóV›¡CDø'ÿýð#?÷ÿ}„#ÎqÇqœÛF7T¬ÖäY¿‹ýŽã8Žã8Žã¼/¯µøßKþ7ýxiÕ”ýËl Åz4犖HPE¨¨lOÔŠjvˆ>¤”?Dö ò;ÈøŸ R‘T LVAvP$Tdé¹ÞǰŠJþ'óÑéâQi­%¢é:LÙ"ß_ôЍÏ÷ö¸&<¸cív£}‡ e¶×gU…šp¸Y!>ádP p¾¯œïMT?;Æ´FÔwÑ»ÇØß´XÝ÷¥â[oaÊÊaª¤$œŽ0¤`Õõ“Q¯¶¿œÀþ<&°ý=g˜‹ÒRÅ9Ý™Äý½ÿÜŒ4ú;”ýïÂÞ–o×­Uø” ̹‰¸ D”d&Kû]UmÚ„þÍ%´¥³· ©['ÐwŸyøçȰC¿ó¯¨û;E¤¢UÞûÊŸBC„¸ÿÅu-»è“ §ÀÕ‰}ÎAZ¤~%bUç[ÑßDz–Jó ²ø—öM´Òc³%´jý°¦;ÔjI½ò^ZŒ¾ ß•Ã4QJ\"ïSL–4Ñý,mÌAÚQ¢–X’Åð[…þúU´ˆ£ BJY½1¡§ lÚÈf¬"–ˆdB<¤”¬¢¾ è"a‰ç×ÞJH)r²ÛëY«ù»g³®&i­Rk0çLž ‡ý´ˆòÝ< -¡aÛzA‚P ÖvÁºš3Æq`ˆPK¥ÔbÛlŒµr) C:jsã8Žã8ÎëÉå€ËÕÿ„ÇqÇqÇq6¡jG$uåtÈÈ};E§s«Â,3¡aO‘‰XrBäŒ L_Gç™ÀߣŽ;tøsh=€þ3Âþ!å\[4{/ÿ=ö!<•Fà8•^¼«=¶ß~>9(ûÙÄÝÓ‰ç‡&þ¦hqÿÓ¬äb) ÉDÿÚªÆÓÂoÞp:*C œï­EA>WÎvÂI‹ÕßOÊa6±ût¼±¡Ñsb'ªGÿèÏrÿ‹ÿïMìµÊÖ p™ÿåøSÀ*¤w–ÿV©ßßßÚŽ¥~ΨÍ<°$%žK©Ìs&¶~ô‡Ã¼FÒ´k­TµªþÜ×]+Ys3tXõ½1b ­Z¿6‘?¬†ƒ¶ì׃f‰Ëo¢wŒ¡ éç_-j_MD×ö>jþjk;c$Ú~€.UõÚ’úzbŠ«I¢Í1Ú#ý»˜R´±öe´„þšÞZAZ›ƒãÒ¢  ¶md36´»ú|ö÷ihiEÍ-5f.K¢Ao­P«ò[?ûƒ¨V~äç~÷CcŽã8ŽãÜ.º`ó1Ã[8Žã8Žã8Žóáyí+ÿuóg”Ho’n7UP*rŸý^ÂúÇÿ}Ta®„iF‡ Hç(;‹ïŸw¨Œ ÷ å‰)k" â÷ßÉäñkhüª•t–öErµñˆbQÍË eý«­WU:· ÷º—pì$¼qG8#µš<´ ÍþxÐ$L³.Âv•zÕúrX¾€jûNŒpçĢ韔÷.LàÞ ÂŤì'–ŠõA­&êOY)MHAÜ;r±d…)›1á0YäûéhhÜMü¿†ohzUêL.Ulý³2&áâ |ý;Véÿ}ŸŽK Á§ro¼S™²06Ý®'t‘ÍÏ?+‹àzÙ´µ$Ô&”¯âÿêÄ1€5Á>)´ßÕV$$D“¥Z?t-Õ¢ú[ µ"!Úª+AªÀ$èùïQ†·Ð*軿^(ÌM´í_lUüR‘7#é?ùs ô_ _¯GݺÿK߯ú”@k;IH0Ã>Ps@ˆ…p òÖ§ˆŸýÏГ<þ? ¿÷ÇpÔ©B1ÁûÑoü™Ö‚§rÿ'þý íÍOŽþŸÖ–¿õ³?ØL =qCÁDd­V‘_ûçmýœ- R¼û{¶WÄ—9£UÆdiÙ"îÍ|²I ضµV¦i^ªãMü·Šù:èb ,ží¾õ˜ÑöÆÍp0Žƒ-C×ó_©…Zt©Œ'ôÏFk,4Dj ÌÓl&–‰ Ï™½ª­cH6®n hI „h& ² æ)Sò¦Å@{°“õ²Œ¾¼ÚbV–õݳ¬/çBÉIí¹-uÁZ Ôe–R‰±ZZÀ‘ëÆqÇqœ×‰Ë-®j°åýîç9Žã8Žã8ŽãÜzÙÖ&ýô“–LŒkOwPš RÐt®0=AãC$&*öå¹ä2Íh˜Ðèøˆªç 3”‡0W(@mU=q¹ÿ•§ëŸhà|\t#®ÔM¡îÐ¢é« S6}mLk_x‰Ö/þ[ïVž,àî©°,àd4ѽiB7¾ ª«Ð~˜l;NG¡V‹ºWlºþòA†Õ«ßUÅȰ¼]Ûi%EÓƒUÄÞ;r…GçÊÜb÷ß»°êXîb„dI 覊ë0Sl·/l|DUmm[›†[ZØI„w„³]dHf°ˆÁŽ‹yJd{Ý9ÚKÛjø^ù¿ä¾Ìè^÷ªY³î󻌷ð‰ áÖ–`€ÍPËÜý»‡.síÓ_}OÖéwõoÿ¿ý׿?’¤^¶ Ÿ³1Ž‘Ÿ/ª¥ôJüÎÍq "\5"[¼\S$UL‚ÜÇ(P«M˜9*•pᣪLNu³HÇpèOŸ|×Õ–Ë+ É^ö‡¹óŽi¤.!ªPˆý¥{¿–1ˆÔ‘LƦþÚ*sé‚X \PÎX¦YKÀ¢ ³@!©.J X™vf wg2žfAÎ\ÁCÜ“4¡:§ p©\Ê0Œ¨îp_Å÷-IÕõ/šdRÓö°Š4444444<ÿè8$ýááb€éÉ[@CCCCCCCCCà ‚Úù)¥øà½‰¡)oºÀYÆ¿ùGø ü"àЃí évˆÞÆW tŶ†Üáûǘ´ü!ys wpúeìÌð}­Ö_@´_67šuùv­Ý¾5<:*A>ŒAðCø] c7ÎßS "â|çÜ݆ƒÝÌé’r´’šjþžRáµê·{/ÿ `Ž×ªSV=ŒYFg?"ýë'ûô¯ æHóh‚Êñö úßßî#•àbg$M¥DÁL¶;ÑïI!‰Í2…Œú’>ZÔ¶%V½Ð§RFa ¯Þˆ2 Ùàb$b—BÌqóDs”Øpmm¾jäÿ=˜ÜسÐF¬HCÊ£8AŒ+ %õA)Î{G:Ç;Ð#…u‡n®áë›°ºQÄgkê °Çí†SØÝ‚tt˜c@»Ò”,niÖa(ß< '26†- Åoø—þEèÐn8ýa݇)òßBв² õ“Å©sPØ* ®±ýh/ç:O゜OѼF.ÞÁv‚˜”nõèKóYhÐǼÎÿá‡9þÑo¼×k÷»‚¿ü7¿0=ÿÜÏÿÀA„=%‚^ET]úRâò#Ú>%B¬#*t}‡¨ÇL‰@D/‘ûft]*º•‹Ÿ©ëðƒ_Iw«%îKBÁ,TY TŽsÓ&S®«–"ËFs¤_,"÷ëüE%Dn¸jqì[)`ìwû‰ü·ƒòó,ÍœaƒX×"lÐr½5ý&"øÝÇI Pœӿ,¤.gEˆ¢Íu±“*žÒTºÀ݆JÙ”©¤&hÒ’Ê0 ­jiJúÀoÿõï?Ø6žoT€0þÓ5ÿMÐÐÐÐÐÐÐÐÐÐðã…&ÿ°ð«-žN7E"€bÛ„¿‘‘Îî¹Òˆ^ÞhÆý±·±~v;TŽ0é‘^`ØÁÙÏ{äôñ<`w3ÜQ<<Š`™pN²lšÔðm&ÊuÁ¼Æ@{»k¸•L‰:A‹`Ìáì_õsTýÑZè»p6®:á7•»kçôÜé“pRáêZŸItâÛ¡ûnŸE jÿ'a³ªÎyAŃT^õR3.â3™vPõcvQïbÞÛ¡T ²U‚i [W}ºüMZ”p÷’Þ SZÂn ¸û£} ×ÿµ#aã³ÚWm´h¥ f‘Þ"µ»ëëú\(„9óŸzr´Ör|tò>|ý><½ra¢…Ù0?Ãû·Ñ~¡`·aÜC&Üóƒà¥!>²(~äÈuŠ'A¶†ßØ[ˆÌD±m¿Š ·~®ù±X.Ü é,ÄdžžHÔß0ÃÏGüNÂÎ=LQæZö2WØ;Üú ƒÿ“(Srëuì®âc9¸”³¸!ä˜×ÆcG¯½7«õiÃýâìúþû?û‰ˆ›÷p³Ë´Nb3¯Nö…3Þ#²¿ö¦—}¥Ê—Ä{”H8ó».á®d3tÐ⌯G¦ ñ­Î£K“ðÀÜÇ1êÚbÜÍÈe>^„ Ã8‹4)jZD†-þ Ä2b¥,BqìG„R œþ>]»-—Çq ">ÇÁ¶’ùÍ?âî‘hÐwSÿ©ö PR¢dÙý¥ ±Åa¯)ÖQˆò$T€¸®ëR"ÕxæDZj¡ž·ë5_Ó_544444¼XX–H‹ç—øWÐÐÐÐÐÐÐÐÐÐÐÐðüb™S»tü¤L#º@Šèd@’áYÐ=àŠlËH>G×–.ðn…Hd‹f\vÈv ç;Ìd4|—` È]‹;Ž™H²K´´Y_¶\K»±kx8*1¡)a‹Dí(«íA\¿}'HöU¯“«ód#¯¥D#úŸwšº\ù‰÷ef«^X¯„£UçW9üUÂYEèpi2n5Ý ÞñBà…“­D·þ®Ø3'Zãû³ÁÝBþGBA”TØ Îº×U´¶UHýœ°äYŸD·Ö¥¨e DàÆ±p²–‰ø²Q @‹P¤KBRŸÖsCÀKtøõ¿ì›IPÄUa"ŽøB Ä{êHr¤]+¬7èÑËøÑ°ôºô2È1° w¾;Ø@òcLz EÖ {dŸ±a,)2†äÎy2»/ȵŒ|ìèûÿBì×oýÙOaÔ åE@Ó¼õ'Áë~^Ⱥ|êøÚÑcG_>‚W>ˆl^;Cn —;x-07µ–é»` ž‘»_ÃqüBà,Åo&þ¿ôcב#/­àåWØ~á5D/X¿öÿ¾·+ý)ÁOüò—øìg>:ÃZÈãi›4c,5ì§ø| K±£‹*b}]ëÚk)/P…)Üï©Äü»ÆÑqí“3ƒ;¹Dí¯èQíãxbÆ~?°ß¨]×Å ž»˜”¤ \*á_Ýÿ‹rËPǾ/3ýív­áñqP^%ó…h›ïARWâ7)\?VÖ}üv?89E:€ò¥Æ6?i¨ ›•³YÍäÎýÐup½ÖU^Âáîv'–§’õû!â÷WÝáoeÙ«éY„{–/H‚Ô­m•pÖ¿ÿ¦òÒIün³6«.ÒRŠï¹ {/ËñÑœªð${r*Hô@WúgÈ!|H*lzŸ8íËËYûñ…G!÷–§ê¬ŸìþµÎC±è¸[l'ê—ú°¦xpû}®ÑÍKd}•®{ä&È&Δy¤x"89Ùâé ³sØ•˜ôõˆÅöi®¤`oe=ôå×è6?*ìo¾ƒ¼ýû%9 <Ô.AŽVluÙ ÊtŽ%¸ù!ôæŸGúWÁï`ÒÃöóèÅHÞ*ŒU¡%jCñ!ÁH¤8%© Š–óòi^l¹þ*rãû‘õuDï°ÿ ¬¾÷Å|úW¾zßÏ~ý3‹ks'y¤Åú ATÑH!ªË1®ï;Ö›]×Ý«?•"â›âÔcìáö-”„ƒÌB™î|LUUº”¦D™beætêq¨¾_ˆ|)BG]'a˜V˜0‰jò¦ (1o+I ã0Nó—…›^ö¾ïX­Wô}W„‘`©¤ØÀ˜óÔwPÊ t«†©$”NIÙ2ûýÀ8fR—â÷)MçÖIÄUÊ0ˆdþןû$ÿÉ/}ñ¡ÛKCCCCCCó‹Z ’ÿõñª¸Zð ´”€††††††††††çü?ÄLà”Û¤Ë6æ¥mÖ@0Hz‹;±z7¶<Ò~ðø\K¶¶”áæXœ¨Ã×H5èæ\¦éÕúX¢ÿua³®ì ,šÛì¹ €òQfâW6½póXIê“Ý€.ñr´ wýÅÞ† ËÓwˆ~aÁ2áà2ª!;"ûÂóL\mä ¢»¾iD¤.gmÏDÌ”i×ÚØGkáÚ&CŽ˜épþûäh=ß9oÜ6ÆÉ׎â;ªL)"¶ì‚:™NççÿȢ¾w¿9¾ðeF&÷û½<¹ý—ÏË_¶ Imñ>#wêQûœˆk' ÒõH‚¥hº\6@‰‡@Êëó¢Ìq{Æ´EÓ¶wÓ}$ l½ñ1X¤£ï¼BþÍÿƒ¿>Äù*ß%ÛyÅÃ)2ÆFühn …@=F!»é?@JFÓMÌ®ÁúMòúËxwQŸ‚v¦Ô˜s“(©SßO1Š#Væå@*óê¬^&u¯ Ý. ýMv_ø^€îéèøæýнzþæßxܵýLâ'åOùµŸþp8ÆËút3ò˜¡›““þqr }×Ñ÷}ßÓ‚ÛÌr‰øû””¾ï½î3±^µ•”þÔu¤nŒÏˆï‰«¾„aærîd³ò¥Ð  "¸£Ñ®ZâõÑé÷ËßM¥ª³¿ü33Ì-¢÷»â²/Ž|ÁBý½ãåy~jbµêI)J+Œ£¡bhJ1ßJÖ[ü™ùÔ÷©ù)EÚÂ8frÎÓ±ØÌÉÙKš‚­úITa¥ÿ´$$XÎE3jüÆÏ~‚”¢TÃ_þ›- ¡¡¡¡¡áyÃ2Þàa$44444444444좾†ILŠùš~¥ÐTúªtJÔù´ÈeÿÅ‘Z~a³ø<¢æ½_#«—ñÍûñîtÝ« òí¿ã@zÈ#Ú¾ IDATõ¿}ìUÿ¬á§íüê§?XÞ‰:÷É)¤9E`ué#ú?ѯúân¯5èm*Pë×§BžG進>¦˜}€~R‰Ë¯âC PIþ'D  "ðKD‰YÄgq}r½0ó’V#Ó¨·ûœ>àîØh³ loÓ ¸9YŒ¦}7© Úa"„œs¤#@¹^››ã0—(H)±^ËÓ_çifì‡ajk××D€PXY)àE8PÓªˆb¬Q-"¸©KE˜fÓ´,[”i(â…Ïýüðc¿ø‡O` jhhhhhhxZpY‡ä4444444444¼àhÎÿ+°¨[Þà  òËZ±Éá8£¯¼„Üøî{8ýžÏ£¶ñPê'werØä:›bý­ð8… ñ)%æ&VÿÚìö—…û¾=k7j ïK÷:RjÖ÷3Ù…¿+\f’šðÞ:þŸêþï´=!=æh/0LýÓîV#°ý^G¾”ãC$%ÄëlΘƒÿ]÷°ráÎ…³ÇBŸ`?ÂñFøPJÜ9wvƒ³îáÆqL[•)f¾ðEßfbnnDo;ýâ°òô¯ÕïüàÀ<ï8Kâ¿ÆFÔ®<º•øÿ¨ï2ŘëT& ªÃIˆÔˆ™Â–Ë5t ~§ê…M—ˆÐgØÃ(X‰—mƶ_†dÈÛoà{ÅÞÚãc‚ °×3¼ùŘÅsÅG‡Ü‚gŽ#ÙC¼¶àî7Èý`ý>ð3üΗð³ m®;Õõu ¢SÊù·Šæ‚\Ï xI/a÷6¶û*È pß(çßkèúerz_ÿz—u|&#ùëÿ=é{žÀÏ|ö›÷ýì7~öãÅýïExTžWña!Ôs⿾ŽD€âlÏBΙqŒ KAº#:]·¤¤!»„1cúÌQý9çÉý>—™ õ¹B1]`úN}»¬!¢Åy/Sj@εL¿­ªÊ8Œd?L!¨ý°Ûï- ‚¬¤#ÒAe Çñìˆ «UÏjÕ‡ƒ¿–J€‰üWUT™œüU\0 c ”Ø–2ƒzI¨…ü¯e~ç>5=ÿÿÆçßõ¶ÓÐÐÐÐÐÐðt £h‹ïóù“ðï44444444444Û”<  g®±ød¸¦ø¹ã£—㯖¸~ûG›S—èJL,‡ ¢S ƒ\N)…দÔïv]8ìsR^¦÷»i;ö’ˆi ]¢ï{Vë¾LCÄS[´^k–ýΪ˜,Ú!}ùŽÔþDÊÖ\…*hB€††††††g¡õíï ‡‚€*î<®àQ¿ÓÐÐÐÐÐÐÐÐÐÐð]F#ÿ‚«R*ÙPHŸ`BÉC¿ÀF·08 uÌ9_^§m`Ù‘aDúŒabçñ4…[Î#¦V ëçKÀU:€vGÖð„PS”eæb3Ïʼn^’÷Ùæž6²ØÝ—ZT`Õ1´Ýá¿êàúq‰¸&¾?ŒÎùÎÉ)¸L<’‚?Èù«IòI!!žˆHèò!&À#Q![|§ïàåëBÎAäl÷N—¢C’êj}o÷#w_h,úÚ ñÖ”ÀPÉÿzΨõå8_™k·í_}/åcÔ`íHïÈ ¼s´ˆ0+¥`È#ÂlA2x9—±2ä9þl@|ûQëÅ¢/©Ã¼ëʈ B'¸„HApôš¢Ÿøä•c§_†/}“üŽÏËvŸ>’E_ùèSxÞ£Ûw ÝŠýp¾U q_Iø«’„ú»Bø2¾Í(w‘½CÖu¤£×&GôZK(t@)Dyn[Èk°Œ™üÆOá¼ ö-ºþóGoÓs„ÿâï½Îg?óQ(úœÃ]_]ùfUß÷ ³8nZ¶’Àä@·"ÐÄ>*ŠyìGUÇ:Ñ _ÈoMŠJ wg¿ȹlk:§L"&Uº¾ Q€E„”¨*©Ó)2¿’è2Ô<¾“tš§è‚ŒW!IжyˆÅ¦RåL%œaÈC¤›Úó–8>¢ab/%ò˜JyJ @=ñÖcó0Žà°ZG¢€ETAœojÒË¥}ëw~áSMÐÐÐÐÐÐðŒ¢ –V\Þ¯W KÂþ~i,¾ó¨"€åožM,ïj|²"ÆGâ Š‰¢£àg‚¿ýGä›0Žø­oâ‚ïâûžáâ¬5ÇÈ —k ïû8ì ö_ÃÎ-J$9»DJñDüWòñüò-Ø‹NØ5<,6£g¿È2.â”§Ÿ ®ä¿Ï<(])/ž †ìœž«Nجf|DK ÇØô2 †<§Tb¾–-gA´,IzX÷‘ en c®¥¢d@R¡Sè7ñÙù.æ•ú˜Æ¡“õÁ°Rv ë"Zºá1p9âZg|rø/¾·Œïg~îf¨—€š ½ÁÚµEÄþ D Á Ïp-!kÃm‡ àçd¿ ù¤翤اyŽÀü·»0\€Eõê¶÷THÿRãÃÄ:u¸.È~˜tãßÁ7ב7ß@ïDrÆ}ûéR cé“ ¶µ Pˆë‹xŽ©á>o]ÚäDx˜âûè?wðìèJMÓBB(Ä¿¤˜¯\GuĵC¸$ó`0Ž`ǸŸ€­ØýÁ±þ¡?x¤Mæyçå«W¾ÿ÷~æ#á¢G:,¹¸ØÐââÇëñ×§ˆýT\÷)9"=] r~"×ë5M©u¢"d áTJÎ|Jy‚BÜ;ñ[ƒ½ý¾ï‹x­–(⩲=e‹$U)m,íÔhgEMH¥T€¹ Šâ‚RÆâüwÆœÁ}&ãK‡¡žkŠPÂ}jÓnçŒÙèR"çÌn?`fÅÝHêWIÙ˜3:DyMMÐ)á*,K@KhhhhhhxVp•@˜‰~gÀ½ä%û——Øs§ØÒž24çÿc`{}ïMa5Džv§Ç‘[_|›à"á£"]ÄGüóì•ì%ÚY@Žð4Æä—Ùë.ÍL‰°]’ÿ“u‘P¿ÓÐð.±t—ÆnuyFoö çSãôEÀ2œoÓ3g7Àª 2~78ûÁ¹~,­Ãñß%¡Ka¸Î̇ˆ ®JRÇ¥‘¥`"ï£)¤"€ýè¤䪤$T±E—àd#S2Àc-®;£Áéyc7¯)}º:¾½á. ,|ñ¾W翼wø¸ø3P+Çô"BþËÚ#Gœ¬`“@d8‡#A_úàÈö ßÝEv·ñõµ ÿI G‘0Õ!È! ÈwÉã)2ÞÆ†3v!8sÀ)Mjª %Î"Ýß½‰ ß@¶oàch®îª’ `±µ“¼¦UdGr¬dA,ÊZ ½ÌQ#Ú6/PNº7pdT|WÜÔH”T(çÝ{Ä3~H1‰¤Ðõà`„¼Ã‡äÙ'vÿô£ø­¼e dåÈQÇÑøµû·û9ÅOýêá2ÿúg>:ðÕa¯"POÊ6šKœ¿ªÒ÷ZkqþƒÓ¡¸æ#QÀÍpd"ÿƒtˆcZRÅÍ17¼¾×%¤Ì¿SªX¡ôÔòDÉqÌhÒâØ§´WX­z†ý0‰rqîG{|Zžý~˜Èþ*’뺮ñÅùÏ,H„q17’Fâ@ó|.Ç“8ÄÄòå1c½‘R¢/i±Ý{ùºßs({Zy€††††††gåž´ü•Ûô‰ô7â2xù¸¼¼êÖòqÅ-  ¡¡¡¡¡¡¡¡¡á)A#ÿß.—QŸ¥sÜŒ‚ßVPGăø/·cnÅÝX"be"G<œý#þöç! ¶!õˆE][ø]!:b`{ÉÂ^"ÿžîc?—Å{ÏÆÆ·,iPwš:^‰ökGªÞ=ž‡(@0›4¸þad½t†ï¾ŽÚ·‚”†ì.¾zÒš,Џ¡º]ƒ§Øx|ÀìËï ãøö¾;LJ1"ò-Ä*‡ËáÓŽç«Sþø¯±“/ {üv8ìéîÝÐçrUÐæ †¬ººÝJÌÛ4JÜŒ”d›š"ñ‡¤Ô¦çh/µ8¤¸¸Å-Λîh5ÃmD؃à¹Ä¬ðÁ^’zÐ ¸Fi"Û:E:Ǭ|߀œÙþ³Fn~ëþßa#{>ñ“‹¤€ÿé§¿˜WSê)¥ ós%ðe6ªãèåœRÜð…ˆ‡a&³1!Ìd8%Ê߬ R¤˜YDûkl_î~°U±Âœ>0χœ”” ‘4¥ ŒÃ8OÂ|±ûhy €yFRŠö¤”JY™RiT"á`“™Gu JÛŠò«³Ž<橎ÿaIªt]GJ%a 4'¼´ò O7ª@)—¤0•X^2×<£eÌBû])<νg44444444444<›¨Ä€U‚ǦXZ™,¹$BV$V8 ™jÆŠvωAìÎÑ¢.ÉósÁ5!«2œË@¯ÏÖá:Ð]f{ï][c÷^x<¨6ü»%žõºðs\òb@¤ìÇkaÕi8ïú$¤#!›Ó' c´ÀùÞÙ•Èæ¾‹4UH"“;_äA})x Š9¢ÆôVz¯]Dí~tK§*o„í>J lVB/-àJLŽþ…Ök©Ø°ùó¥»ÿÀù¿ˆH9–—iºDÉaíùý¹ö tó1¤ïñ´ÃºÎïÂé7ðA` ô‚ë;( ǶÚâÜ?O¥¼Ì³3t|Û½U[ØY²„ߤäóâ!¥ÔŒ%ü\Ƀ!Ý>¾;t¸¦Y1s¹ÏJ?µ´°."‡” ¢TFÁ÷ [Ás\Bá&Uðˆ›¦{MÜj×—ˆâe%ºåŒæbgd;'éx\€tÔ?¢ážŽÀpd5L㜮¢2´g·1¾Ìö÷þ›?ÿ>ÆF÷|â?ÿµ¯óÙÏ|tŠìâ[§(ÿJÞ›W÷}üålÓñÍÆadÆ9òÂõ®V¶—iïuÝ1 ¦i¿ïžèºØ-Vc-¤¤^¸GÛ$\þfVDŽ{fN ¨d¿#RÚ\®÷êæ‚³À+Eh áBÝlçR9gTBÈb9Äuz)%j9…:/m¦´æª÷$, Ï6.'\ê8$ýë­M½T¸êŠàò{Kì7!@CCCCCCCCCÃw·?÷#mÀïÛ…;ž و刖$G§%sM •X÷‰|¨ƒ³n†8( d¬J tPRžAöàƒ#£OƒÚE @#ÿ .»ñ'>²¼˜7›¨|®yîµÒFß k!à QŒæ$öÙyç®qënìׄëÇB§B—‚\ÒtÿùVÁ5NŽÿòþ˜ƒ$êëný ôc¬?aÝÁªûÁéT.q¸Ná¹J»^ÀíãªÈÿ¥Ãù‰ô_ÿ—žKÍØÌýˆÕ_æÐ¯<ºkõ5tõ~To€$„5¦ïûkpç¿p|Hh»à†ËI#êw1ïpú¨ùm;d8Ç÷§pqv°ð!/½eÀä   ÒbQ<ÅLJÐi.oÓò5AïÈÆ‘cGN9Ùà]úçøiÆT`ë°óyÔÔ…GTÈÒ™$#Ÿ^_–î'g|¸€ý)È­pø“@7Ñn©ª›ŒÈ䜑3Dîâ~޳‹t%Îí&Q [ †=ìÞ€óS¶¿û)Ü·ýů?|9žS|z‘ð[ÿÍk=?Ÿ”*ysžêØOÉ2e_ªß¯.}„‰¨w|J¨â.Ez™œö>•0ÜcúY„œ3¹$Hý½ }êHIÉf %Â_4R&¬Dþ×kº®+‰¦Äú$JPA/ÿ2o­Hy-EPbKÛu‰Ô)Ã%æ’ ‚tiN†’HÖèº4õ uz‹„žC¯ßã¡•hhhhhhxzQ5Þº})X:ük%/]|§~^QõÏ—¯ÂßÍáã¤44444444444¼Hxœ‚¥ß!¢Ê³£ûé¶è ’þT±ý´+¬™A’R'¹@9"g#7ÜÁ ïéV¹$kä褌#¾½‹Ÿ ˜BÔ•|Y° ;¾Ã}ÑðôáÐå7»”½:͉ˆûøîü‘è­5b?jLÇóUNþl° OÛ.tdJöØξÄP¯úØýS-ºÈ£¹,§¤÷H¨ûtá¾–¥¾]$”ƒíÞ8ßÁºŠ µÔ°†³ml'™¶•Y®&þ«ûJ(ŸWåÄD‚—|‡:}m³û_I@’¢ ŒãÁZ›#‚•sI)5ã‚í ò3Ú °ê19ÇÍŠ–Gv0î°í»ß dò?¹œ§¦‘Âɳ¼³-N0R^/Ü͇ý7ý-€µùÿ¾"/}ínpþ'X÷§¨˜k%”ãWÝÁ®œ‰Ìó¨mºB´‚º#J¤íd!ã» èn!iEÖ„¨¡éd‚>wð=æÛ(¡àoâãmÎa´RN ’¼Ø¯e|¤3|ábÀ“LÛÇÙ?ü'?úúU ôBá¯þí?æ7ÿ«Oâx!´…¤…hƉLw÷ÙÉî-¢R™/hŠk"7Ÿ6 ±:¤-ô}"•ƒ±™•c©LéZDšã˜#â¿è"A¼w}‡H™oLrÚìÌaÉc¦ëRˆ%ª³?[/Ñþª¤¤ED@$Œ@‰ý¯"ËÆ0fÆ1ÒÔËð¼3O‰m«$ˆ ©O¬Ö«i¹Ümj\:´‘ø††††††ç qYQoCÇò¨‹GXÜÒp(€ÃKƒz©ð¤.ǯž(nîGü…9Çôà½z¡.—?{¯ðÂYª‰±åo§›”÷¢½îˆ9øHúˆ£¯½†Œ{Æ/|ÿÓÏ]È®µÖ~õâ°¬ £CÎ1H½$€úŒÞØ /}9þ®G0náüuÜ¿…Œ;<•Lòå]ØÂå8á$rÕ½=ÚlÔâõ~rwÝÏäòAôü &X–è4úÀLØ‚€0j3ŒpçÂélVŠJˆ^½®lzçÖ™±ê„uÄ:0•xЀÉ4û<•¶Ô·Þ½_ó~ó…M/¬º(0dèJ}hw¸Ø9g[çh-/Þ¡¤œóäÀ,[È‹çKA@Èå±¾vª™‰VÇS¼/5 ”wGÆSÜß ûXø9æo û»øhàZÌõ‚gÇmÄnÝÿ*B#˜u“šÑð½EYšq.OCÄbäâb_–(­ V´ŠÌϯì¿ùQðML =ÈÉ rý5Òú‡t ¾ÃŽ7ÈÍ»øÙÈÎ1õÒùó„œû „…Xa¹§-Ö—…Þ ¶‘=Èm@ËäÕ· G@*š‚RBÁná»·ðó·C8°+Ä­ SIžÚ—Ø ¡!/¥ærg¿ù‘è—^8ùѯò¢âÇÿ‡/^ùþ¯ÿµQ÷M‰¤Š¹Ó™1Ê8‰ФhÛeΆÔu]wQÅÌÈ A&%iˆ,×X›ÖQÒ4¹ìÍf¿!AJ! ˜\Qs¬”-™…™ó¥µLå¢ä@6̼”ˆÒ?›o)K°÷!£Téº4•7¨Q!‘Pº’tQêÀÌè:)•:æ Ñ hã»)Ð’ž>tÄ%BM¨å–ä~ý³ò~,o}ä>uOM‡ØÐÐÐÐÐÐÐÐÐðqë·~x½^ˆ‹RÇõ—ç²¼:¯wï±~ùeøLw—çºà,¯tË^)jxRP‡¸ñ#AQ¼ò-øÆ¸hìÜ q —ÐiŒzÏEñý†®A®ßDn|]R‡äÌØ+2^LãÉçÈé¥`ê”v+õ"£ºü‡1¶CµB˜³ÛÇÖ¹î™ö+”.•Ý»¸_$@<Æò›8Ù„\Dîp¾sî^׎J­fŠ‹~#E£s‰€}yùŠùßûþâóKå¾]åœl„;çΘ÷ˆ¤ß p¶súN8ÙD}óe îjÊÂs¶Ô~¾’ü_ÿuÀéyüÆŠ¦vT%ùgò±à¬%γZwÏqOáâ øÑè·»Èþë°½ {‚xÎ!Ö|?5ô|‹§î RšÈ{ÏÑ4¯ÿYqÜ$ÜðY"Úß  úäö_þÉák¸G0¸xAíLQÉÕ1Ò}€”^Ž„Ûà郰¾ «7B¡W^ê5HÝ®âü³œÞô Q)%<Çºç†ø/q9ï‘Ͳº…éh‡á¨íÐ|ŽïïàÛS|wç¾w¼$T‚¹ƒ)2F}O)õPÖ=à%MAzÁ]¸û>ެV‚¬Ù$d³Í56ßÿ_î‰?ùwþôàõoþÜ'ƒ¼Çű¨íjt’H%¦Ä²Eb@Ù.­\c¹9yÌ…¼O$Ñ9uEŠÐI)羈çée³(à JIˆsAßwT™l•ªˆ„H v.¹çwµ„@,Gl7Š etÞŠ¨@Dèº:”OˆJrÁ2a –X¶ËK)UÎéµßª !¥4_c¿KüÎ/|ª‰ž,23ñ_…ÎLüÃB/{Å{WŽ»-¾óíÞ>gw‘ ß}xuä]°ƈFŠs­ÓéáÅh'Ál%™™Â'Õ°éùüT–ï]É|kº‘Åóùñ Ê€±{‚wFxçA;üÎHX;—¬_uf #½Á±!Ýwb;ƒ½E߯oM¬ö #tJÒ#Øï¼ 9B* Rÿ–Ià _ÃósH* Ù9;7âÑZ8ÞÄöÑ%bÓ\¸ÿ—Žó:ÝçŽà}D¨Âª‹è{wè»x$È™±ìà}‚£•Ð%aÌ‘®°=Þ%®êó÷b=¨DZARèRLáî6‚ —ÑÿCŽôˆa ­Øº‹ßª>GÛHuþO¯Ë¿¢’‰}«ýµF„·—”_œ¬&{Q€I¢Ž'C¥(Eœ" ƒöoÂxŠh`Øáƒ!{ צœ‡ÊŽkB€}!£ÅŠx$ÎAîBÔ(Ä¿A€WÝZu³/]ÿ÷ÆËÌ]vé“C~âNIÎɱ3Ü#–GÜ‚S4&T IDATè—%™ï¥ØÀDî¼3%L#…ek­Ää¡ãùœ¹¿–X¤UÔéˆKX‘vw°Ý×Èý H'¸ïññ«pþ¶ó8ÁYÌ`>?hZªß8|¾¼0ðìÅÝí°2ä8þ0‡aƒÁ>ã«Ú)¦EL`AÛPÖÃè!˜ÆpŒSúsê#ëµ[ݾ„ùÀ°\®º™d@¼\2Œ{¤ñn‹&e÷û?ÄúÏýÁúâÅÀÏ|ö›÷ýì×ÿÚÇPUÆ!#I»éÒ(©B9ç‰P¬pû{çsYr]0}¯–PESïÃ~˜ÿ‘ *’}rê{=^,!N(Qü©©KS‡mJ>• HZR`rícfÜçò[™Ú^ãÿÍ1Õ”®ÓŽï~÷—ó]c9úµ$ÿk¹•BÖÅ£C=¡"sx¹g_Tƒ/}ôÃÇmÏøÆ×#)!}‡w=Ú­ð®èxÜp€ÑÔ1 "2¿:Ћ³ßª³Ü¦E)´·:S Àó_`>§L'SîõÕ—W¬ï¥HÀ†Ò’ñÓ;Hÿÿ‘Ç3XßÛÂù×ðÛ§øVðan“O¦ËÓ¯5˲:«N®îÇ9úCÔ‘µ#/¿„¾üAßÄ¿õMìT`Á°’rTS“Âå_³Dù…îÉZÊ 8Sz‚x¬?ש¡¨;Óú‘ìá(±DQqy†Œ¤Œ•ú$çÿìÏLí9þ÷¿ôàxq¹tÀg?óQ’ƒæë>(®ýDWˆw­û¥r+ª:íËæŽ'ý8ŽX]êRò%ö_DÐBÒ×ßÅnÓ6w|ÌPJ Ч¿[¸÷kûjÜêÒT ¦n÷nÎ0 ¨ ’:T+¥ òmëW‘jPOfRÔÀª‚H$"Ta“LüùÜÏÿ?ö‹øD¦×ÐÐÐÐÐÐðhèÊ£?àâr»[ü®¾_SjÕÏåçõýÇÁ3|gØÐÐÐÐÐÐÐÐÐðl`x”éÕ_ÅlöVé ®AúPBÞÿ‰p~ë«Ø»-¸Û<ؽ€OµóŸ?<$ß/ ÐOL‹×0g”Õi\ÕþË Ìx›ù¸"€*h˜„‚¯RÔü-µX«K 'ãˆH”Wp2®Ž¯^F»ÀH^Ý"ÂI˜3n7H¼M×1[#~ŒåÏ®“SS Iêb¶;,`&#+–ƒÚ•§©.íç¥ÛœbDFèRûgÛ ®)ëNÏC0fçbï\ìœìñY§BJs€ ÁŸ‡žyw¨‡K+›R§Ör¸í8‘å"KÁÕÓwس³Y Ic;Ù QƒzÝ Çk9X÷ªÂÑ:Ä"WO×)|]š¨Ï î9§øDô‹±ˆû÷òžÍß›ØåBñÖs‘8¢QzÕïï8†l~ãd¸‹ÞÆ7+èO@¯ár ¬@R!ð3øÒéÏq=CÒK=âØ+¹Ÿ%Ú]ãý]æRV<Ë£€óyÜØûåÁàÒßÃ0•É‹:)"ß½‰¼q: 3>¾ë`¯¸E,ù$B¨Šœåäïyõ#ùbÄÓ+ºúÚ 뾂woEºBVÞ“þØ«`bîc2Hyd,ý>Æ4ÄÀÑ%M q…PÄñ<Ò´¤4 žBDঈy\b)øò¢ª´çìbjÏÉ_ú“GX)/>ý+_åù/¿Ɖàîº(Ó´^¯èûnrÛVÒ´Díw] ‚¼ `J°â ƒhÒHá1›VÐkI³©œ@8ö‰yhˆ Ì ³øLS¤ ˆÎý^Nô¢2¹û™Å 0 Æa¡ Ñ/VvùRn`RðD/„ª¸ìs?ÿMÐÐÐÐÐÐðDǽ²]]¼^^QÚâ;¾ø\ß»|éïW¼÷ 8~gD:Ðk†~øS¤—þ"˜3êïÂÙ¿AÎ=âë}᪮©j5< ò ”éN£F§Þ—ø¯ÓY4õÊ$€K‘ÃWße,owäàáQDKQƒ,—­Ìž2ðz0ßRZAn ÈÍ r‘ñÓ3ØÜþ|0üÖág߃âûìØa¾ÂÇ-ìÏ`7,j‡&Û—Ývg5¡pw@M\¢sÈA~‹«"y¯:–BŸÏñíî“S½ÆÖƒ î\ožÙàåë:Õ´‰þYuR~DÝ~‹–høŸœâ/ê.UÍßSð†ÇD‰ý¿<Àò´ö•»3d¸si.uÝ›ÃùÎÙî›'p¼–ûøKaÍr9³ÁÝ g?:7O”uÿ䜤ï9.“ÿ !7ÈÿR¾¥º²G<òòã´ZO ’?‚ÀIåý°#]9¹àç{ä­ß/z8ƒ£ ~|‚®ßÝ˯!¶Á³Ð‘B {²_@w±S|¼ìÏÐaÀÆ8'ÉèQW>õ5ÞÿàtCvî•Ôœ½?üâÿjþ¡â¹â.vG×yåtý2Ü~Înãgûg}“‹bb"ÿåÁ‡ûàÒu…Ñ¢ïîÞfì¾ ö6~ QÕPÄæ Gé„"pÀ@,Üÿ‘Œ„“ß I†(Ø`¸÷Ñ–T~[b¨Eʃ>—m(EZ= ’“=gÿè5Nþ£?~ðúxAñŸý_¹òýßü¹O’R\KYÎŒCfCÐ÷AWR}I°»Ç:IR…Žùˆf9h*}³ ç‡Dì‹…°3–aŒš=«UO×wsÒ–G‘*fqŸÉý*¦UURRD`˜J¨*9g,ÇuNˆf÷ÿ{qýXÏ¿ó Ÿhe¾¨%®"óY¼¿¼¾¾üüa¤ý¥Qµâ¹#lhhhhhhhhhxöpú?8 >*ùoó zeDÉç ¶š¡Ã zÇ»—P9u¤¿$ja¨S¯¤x}¬nÉ©>}ù—}²O~D Wÿ‹çV—ƒ+>_à^Äs:@èôÃ(}sßJþWhê³ÅÀi%+t!4(E}õý=ò‰Þ|ßÿù¾ø-üíÿ#~öÎ?3d§ä È-rí˸Ü}†wðÓ/a§[8Ø bõ‰«]x(ó ”9— wºQæ9ÃvpÆìlz>ú+;XžÉó zŸ ³’ÿ¹DzW¾a?Âvïܽ¨Žÿ ÷϶Ñ?7Ž…›'Ap¬W± ïFÈCü~,QÇ5[y6úãI¡º¡’*LÏáÒámâFŸîþ1‹mbÌp²‰´AÅYup÷"„ë^"ÊÞ—³֫ФK³8D˜…ëÞYuòlŽœ©¶”—â„ùïŽHaÔuï_m5ÁtÏb€¨ñÿA®ïÞØ"«„¬z8>‚£—Íû1^!qrX–7È긟à¶Â‡„ªƒœ!6BI` :ÓmAN’øžHÿ)æ?Ädʳ$ÿÏ/…ZÁS ‚Ô:ñ»•"›ïCùò&Ãt€üÕ3üb•Nm˜Îo÷Ù·. ÿ–Çi¥ÖKú^©{>*ÜqL_‡;o‚ø¹Â>a©Ôr/€Â»N„«xô¯Gˆè×\‰xïéCÇQ>ékgä[¥VV‘Ep/íçDŸ©´OTBD`¥ ‹cÐýÚsç·_›Û“ßÈfäúO|íþëêÆÿÒ§çÿg?AÎÆ8ŽåòNè:CÕ&r>ÎU*Cë!â>b3rùnò]eRËÆ~?,‚°¢€å˜—›O俪Æ4ëe¥Õ’-Žå\ÚF[êþP=%!@U$PJÄ6Y_ïõ9ìw~áSMÐÐÐÐÐÐð£ãÐñóHØòÊù*a€\ñ›åç—Ÿ?L(ÐÐÐÐÐÐÐÐÐÐÐð^¢Ô/ìus-†¢xq‰({/1ýêàÛ ·ÿqý~pÁn}ßz¸ô.69[Ý q¢@!Í]Æ:°¯3_ÉúƒLŸË4é?¹¼ðÜŽ¼¼â—•Ï_ €zi”åòJ]úmu€_/‰"X÷·0΃T8W,ƒäLzå#ø±‚üQôëy‡¼e _‡ëxw » üÎmä¶awö‚¹€–"ܪíΫ`Ò ”¿lA|›ŽöR£½ïäð&V–¥.ú¢ðSº+ú‚³£¸º‡ wÖ±kî†Dt)àýàŒY&'{ßéo6óvPwËKP1ëkÂÙÝ¥èÉ$_õKO¹hdÈ!èlV2µ_UX÷°ê}‹¨ÆwÏw!0‹}É,6²“µpóDéKІ¬úxÜŽ¹P™+ù8œvØŸ¾ßú¿bpòΈŸ¥‰ä¿…%NŠC2îêgõr½¸ëÄË<ýШ_­m0‰Úºh²Ô×õ‰_¦çë—Ä€_º»‘i@=FÑ˰|Ìus$j1Êîêhb&È%–?¥`™µ,‰üÆ€íþ%>‚_Î ß è™b7n"Úã©ÃÇ §Š‹àÃyç CF‡ ð …ÂPçQúV_Lõõ2Ž|~/œþæ5 ηAl¯…“L«¢ßªEäÅÓLèB%¥ wñ}/G«„™s¼ú$¤beï»Rþ“I ‘”‰(¨z™æóô÷Å“ÆA €LTݤóyÖzc78ÙàڑЧÃõÙ%¸~$ì¦ò»ηA©„`¤/e6+aY"]$J ¬º(=qÅ®ùT"D]iZÄk>÷¶8˜DÑmD :CW@gøÚ'§6”éä òq*q•òÇH²Héè,HÂ>!©Gº#< ~¾AB-¿YgD %åL–-jwÈ«3d7`)‡ãró׃\9çÖåÄ£ž¼‚$@âœs/ÙÿòÿqŽ@V~š0ùc\¿Œ¬2â/á©ñ)ΟUÔVÉÿ‡% ,S†.Ÿ‹z È2â|- j¸w0±u= >‚Ú½âB§ö_ëÕ…?«&À5ÁèÈÝ·ð}eêòÄLâºA¢AÕ3N—6 ±V'íÅ%þnÛcÿ?{ï÷4IvÞy}žçdfU½?º§{¤ñHH–e­e¯±YXˆà†€k"XáXËk[alcÃËf#víµÅ‚ï‚Í5·\qÄbð®Öj¥•f$ÍŒfºûýUU™ç<Ïɬ|ßîI3ÝšîžüFT¿Õõ#ëä©“y²Î÷ÇÛ·Ù½ö3pþMì/¾ÂÑ¿÷Ç÷釿ü»o<òñßú[¡d«Âž8¶¬ŠU•V›èò\• Ý%býÇrË/5ctå×y¥þ?¥Tß‚ƒ}%æK.U,pˆø·ûß$Ef¥ t:nñ9)Ú.5N@ªXuüÁÓ›ç'1Ä,YçOÿ‹Ïâî|î7¾üT>sÁ‚ ,ø0b4ÄÏ9é?hÇ/˜Ð(ÿ1_*›­ ]{ÿ»­?×­ÏÛïå ,X°`Á‚ Þ3ÒŠüÿÃÏp Ðg.$ G¬E€Ñ]æÅG¦¯é ¶ŽY çÁ{ßD|1é°b8Y® ¡ZчÆ+ÁP‹Ã xî:w˜Ú)v}"èGâFúËÍ%ðsÖ,zÚƒ™Ú8’>ÛO¨ ì‡O“ñùZü[F"H’¡Ãʃt5Á‡¸ÉPð³3Z÷¦Á÷oYݳÖ‚ »rÿ˰dåxKôÏ… }ƒ·1í^?#‡sÑ'v64Ýá{^ü¶Oãb²_%q¿Ï°ÝÇs«šîfóˆþ¿Úú‹En3Ÿ͇¶Ïóóƒu\Pûc áhaÓ¹Ðçà3»FJÁ’`ÈÎ[Œ«}$œl„UîðuGÜÿp ­kx2OxžRDÿ­ŽçWŽ×‘1ŠcN7ÂÉZ&MصSæ ˆMrn…@Ÿ‡®¹VÚ…I=$S@UYäéK 4È*„ÞyåÇëki¥‚ÀÖä¸ Ú…AÛ“Oê*hJ ^:W¼bC|vÛE©’4ßU¡kÜ(ÍÑoSŒA%ím§U›ˆ—à ÕqWÜÓ዇5Þû$ÿÇ×¶Š{ {(ŽÜÿJÌÑWŠ7-žÒÚò=c7KÌÛ>ÅsÔK„ñòBq‹ ÓsR˜ÜóÓ&˜}ĸ¡#È(aÿúWâ»8w\[< ’¦ÎeŠþרÙríòf¾â:ûÞS{$aç_ùrÒÀÖ° 8ûo>ͨ«Êª}¼õ‹‹+û&~í¾ÃßÿüË”Rè‡ ÖƒlWš¤4MCÛ6IŸ’†ƒ¿Þ"r͉?~¿"RbÕµt«ÅJ¡”ä!cõý^±¹á9ÆkÛ4t«®^Ïë˜ö$0O4’*^˜ úFR~,{ð$pSDé³Áê“Rev,X°`Á‚ žøßÀŠ$ ã HD:»ÍÅ2»ÁÃexÌÿ¿×ç,X°`Á‚ ,Xð}ââøÑZX+Á^m£+¬’“;?U‚>Qd¥Öß Î2º‰õ:—X´N ×*1k$»!Z6r:C’ØÙ,øNñ-0hç^~Zɘق´L ùL$ËÁÍû2™ÿêšâÁ[ÄäþCdLž\~YòHüûõúq×K%…0¤1Ørìȱ M‹á[ïbß*©ÒŒå!,ú>µÅd(ønGs§'}ìGñœ°¯{³’ùM\ŒU\k_i,Ü· M ba,ðœ’ïãbu.anLU1äCì=T—²t*ûÁ釮ñÚ®‰d€”Â=­Ï?G$︸nµO†?ߤCíwˆaÝ5Ð&áþ¥ñí{Æå.D:?tG¹s¢¸‡`ÓÉSw.øÁÀF×ç5ògvý^ ×wd&Ïöxñª–‘Q-Sç0©‘ÿäJüC)1_®6Ž9r$ÈI‡·Mé¥Ç÷}ÈdKàŠH“"I°ä †JÁ=£êxÓBw ›W¡ùa’Ý…GMz9´£Wnehò à”ü^^C®¾‰]Þ‡Ëï!áY +>€”pµS zlÈÝM̉÷zlׯ|ÒÔ9d,_c³ÎR‰$š¹äûïðš¨PÅ^¯ª%:Èøésøþ>k.ùÅñ‚Àg§×úôšë™AÎw]©ôkjˆ:Þg[qªh¢$ökÞ®kmŠí)e@’Ç5)&ͦ–B˜D‘ú®–dºõóK½öGáïýÍ;!zj›Íšn¬2E:ÄwrÂ2‘ÿîÎ0d..®úL×µl6+š¶‡aÈ%&ëQФª˜¥Dª«®c½^¡)Òöûž”M“fÉ)ʘ…0A¥¤*KFÍ«Š~ï›wÁ#£ÐŸ>o|nL<øüo~í}}î‚ ,X°à@òÏÉþyY€‘àËÈÇ瘯Ž9ßý²tÁ‚ ,X°`Á‚OÒQôî‡EáqAw´{%ÿ[GV†tds©„Á$G]àiaÞ5¢ˆG¨€ÊÁ=9wÿ7AþËÆcEÖ› XF.·X*±=³øÌbàŠº o3ëŽÂƒpP†±-vhžæÍH'…±©Vî¸oPsvǗľÌ\‚2Wd/ ï =2ôå#xùUduòòö7q¶X‰øèègbὑhÀÌf.µ¥m°6¡Ý]¼ïèr%úcgÆfC.ÁGÉ6ޏVo}ÚÑãp.æ”R‡1\»R¯ï\ ·Ž$êÛW]F?8}v’ܱ}]³V‰×¤ÚÇðl“™‡ºÀµÍ B€\ÂÙßµB.ÎåÎÙ¬¢/ðHxå¶r±rήœ6E™„qÿçœÕA”³ày„>–ïQÿÙœU.þG½î{ÅX’âýàQ¥=Æm?\sþ7›DlØXP=œÿŽ!­‡¬uä8!wNÓ í nò}Òî|¿C²kÄ:З(×IØ#¶Çfssa€þšÜÚ¡¼…_ÝÁ®2Þo"™¦ô8Ññ CF²EÉ‚Úü˜'gJ¦*ªy¹Cìß!Áð®ÎÇŒ1áU QÆ4‡’"¹¦yý/BUHã÷;©ðâOšµù=lÿZ)¨ÀÙ…ÂôšƒŠP¯f¥†=üðº?T$’†Æ¿iV—'KªÔ ™µñÐö¸{µzé¡D„OuN¨pþG?Áéç¿ô]ðáÃòî=ö¹?ý;Ÿ­¤ú(89æñýáM³£ë}"és9Äý ‘&0÷޳ßõ”é9v»=mÛÄu€9®u[ÅâV‰~“@|vÜÉìœ]Ûò$SæîÿJýÇ'ׂCú@<÷»¿ò ~ñw^{"Ÿ¿`Á‚ |XÑ@-&vÝå?wþ <äò—ÖæÏñ¨ÇàÝ…‹h`Á‚ ,X°`Á‚'„‹ÿéÓx®ëË©®+WrCˆ…A,bë¥uXzêȉ@ÛB1ü²`—àÛ„ †“⢽Ñ¡0®7ןµ¦0x$ ´Ž¬9n—_AN?z ~g_Gõul(‹FLr6\-¶9²õj5BÙ«à æJWgšŒ ™uŸÜ8˜èÄ*)ZëÕq(³2õñ1 j+“чn†Pâ¶nàÎÇÑ»IwÁÎ0ù3|÷ed—ñˆi”Sh ûA*ÉuB¹ÌØ·¿%®J”hÆ"<@Ýz‚ÔÓèöPŒñ½/ê/¬9)8îzpIÂÕιÜ;«&"ÎÛ1ä—;çb[]þk©)Nj…uQ÷ë.ò£s>Wçk›Â=ŸÆ_Àþl“ßã"¾&HêŸY¬–FœwÎ#ê¿kurþ"á 3Xµ¾iréÁ ;®Þ nðl D¾rq.vÎVãµ²nÕvŸ¢“Šz Âûl×Ü >’psò_ëͬÆäWGvgÈÊ#æÖrëUôèS¸®Hì)ýÄ=‡¡A8Æ9V¨', "I{”-Ø%V®Ï+° QÜÉ€Ýú‘hÛðÜ¿À¹B|Àmw<èâ{Øg4;¥Ì„l6WÈI ¡‘zMpŽä\KDGKò:· R ºéán¦ìmÃ{ÓX5|ñdò´êC’ÂÍÖmA\b-Z}âz¼:×H)HÊq÷p=JHð7âñº¸e $¢žÑ¨ƒ Õ…7©®:åîÃPP+€´Hz•WIÍK˜ãë7aõuÐŒˆãnÑ÷¦‡_P3kªµ* Û²‚€¢ ‘äÐÊôkM„pwŸâœ%;¸áVÃÛj”²?ãDõûÁÈÙåRµÕ¥žRto6ès<¶í·Ï>;ÇëèË]¸þ»FX·B)#¡X5& ]åCt* ÁÁDú`¾ø®U03¯z1 _Šû§OC IDATþ¤pz¤¬Úxo?8%E:€xlçEWß/‚?öë«O‚œþ *­‰ããìÊÈ+a³ªiõœ2–”˜¸[9#ï7É¢©ÿê±>µ“ùø}䆯·]?To¼az~Lñç)HÔCJAÌ"få°2d#Èñ ¬_AÒí*>3T;¬9B ˆ®q¿…”c„¸Òˆd`Àå O}Y®À RvxºÂ\I¤¿Š9ª7Ø^€öxw‰Êß9X‹uWˆ_Â~m-^ës·×Ò?s"ªP{{€áÿ‹ã Ú„ø®\Rˆ’ÃDûÙ¿FÔú3üÛ†?Ü»ÏnŠæóû”Œ4Ûiõ²¾ï!á@ÅÍÁ'Ó?Œ÷±±¦Ê О³?ú‰i;·~nI ñ¹ßø2ÿýöú}OßQ2 mÈ%£Iãz¶Æú MJÓ6ˆÀnדsÆL ǹZ5’DƒðWÕ8×ï¸i¢Aþ§á3¥¸GøÆ»%$…HøIÎ]1Tdög>eBM°(E0ŸOÝÿö—>N1ã—ÿ»o?±6-X°`Á‚47nJ…rã>³ÇxÄß9žñ_ ,X°`Á‚ ¼8&R"*_x!®äK]X³Cœ¼´Õ¡ç“ÈíÑ;P`–ðÝ¿@ößû¡dÀÜ–öH"¤½´Àêi~Õ—@H–^îÒ½ ¬àV‰}šØ$Ä ¸D¥Ö(#DC8 ÷%ù”b‹ƒ†dEúš PjÛÍj²ˆ‘Ç%jô¾Õ…n#XeËÈ­ôʹ­¸AIIð!êëšÊLõ“-DSaùhÃèÒŒ_WAÌ Ño¾rXƒ´%’Rm£ƒ‚ŽìëZiž}?¯›ó/êžœúæ UÌÑ(¼t" öƒOþ«VhŽVB›@×ÂÆ£®}— ˆP†¼H“æÎÈ8O¤6ú×ÈT‰0‰¤‘|°n…ÛGJÒœc?5)â7]ô×¶w†Ú$S"÷ã}<Òå?;ä ’ÓòüvI…“u>η^…2‘±jƒ¸9߯­£”„ª°nß¿(ÄaŠ­×ÊÌ{Õ…åñøN‡×^‹¨ –‡„hp¸3’–£xm$þ­FcxÄýKªÄwç!ôÒļ`xk!ÌZ%h[$µˆ*®±’iðæìÏ·Iº!âxêNjéÑŠe¬G|‡ø. ~µBü-¼4ÈeK°瘵˜·$ý–;ÄöP.°²GJƣɑœS5 ‡’@Ûà[¥lsÌѧ‚9xÆÎÉàÕU,š0?F(a Ó¤öìãQ"€ñ?×Ô\7îÏŽïÛoܽÆ?Šp¿ñÿñþØ•¶=gü“S{nýì_°~æï~eºÿ›ŸóCi‡®Šú! *4MBU#1PQ4)fÎÐgš¦A“²Ò6Î}×n0ë"‚&ĦZËŒ)¥”zÒ=´õIŠünÈHê)·–#¨"”túA0³fQ¾à·~î#üÚ~牴iÁ‚ ,ø°`Nþ?* `žð¨2#ÿßM À÷ðÜ‚ ,X°`Á‚ Þöÿ÷_Á.ÈàÉÃy^¹l/„¼UÒC_tt¯’ÒÇÑt‚ÉïÞ€ö5H¹ð3òàzÈo>7ºzj¼²eÔr8¼X%ÿkj@¬€Ö£fn%½Ák ÑqYÑ Ǧ‡p î«Îz@J¬Hp±«‘´:.h$RS\e*쥠6 ¯vÈÿ;`—põUìêÿÃõñ ìü«Øùö±‰‰”7‚T²ºx>¥ðÖçÆEø$q[9¬ Ù„Ó”£ t«è‹¾G¶;üª€¤X`u Òf*sPQ}¶Xÿ`î‰z€¡8çÛp'ß9‰8ÿarõ‡ƒ¹Ião¢u!›Ó˜`[çrL㪺&J¤«æ@‚?˜/Þë564úmݹÐ5³§¹S,D*qÄX›øÃŒÑµh~ §a–BáQ*bd;ŒÚïσhdŽ6ÁéF¸ØõÎÙ¥s¼’ —»8¶m3‚ÓÞÒ‰œ/jô¥SO ò¿œ¡@ׄjJ¿‡aYdz÷<&`Vs{r}WRlŠòÅW^çC÷HËiã&«‚¶í" rëQÙâ©Äü)=n{\¶u \á>€ I7Xy‰¤'`m(â܈ ºuD î=H6à¾9ÃW‰’K!YSk…oQÛ"lñfùü Op :`5:Óˆÿ—Ú7V÷ºæˆ{“wä%C?ù Üý¾}}í ìmkMøYÁ¿öObšzqÚçkNyd9€ùüæß;f¤é¼4ÒtçQ«£ª/l{® ÄêÛü£Ÿäöß\Dsüú½Í¿ðj8ñ“¢)Õó3 Í¢üGB>Þëæœ¶…¶mQ=8öe"}JUH)&&÷L%8¬yȤ”žò©dñ7ÚXŠ…Q´pÄß„ÔîŽ#üƒŸÿ(‚ð«¿ÿæSlë‚ ,Xðâà¦àÝÈøî€ ,X°`Á‚ |èh3 ‘ý2ºáƒp–Ìa-·òÒâTk¶Ã¤ÃóúCbÀÌáúXT¢{ŒÕMŽÞ²;Æ×ɺAt…Ø%% v°½áY· î;GN6«û`Q÷cœ±ÿD­æ b±ÉÚ‘¦à„‡ì‚ðpÏ€I´«$Ur¿Æÿ»ÇóbÔØþÊŒÖ.#;ˆ!£”¾ó6þ‚Ÿþ‹ ‚î݇³ß%|ðëŒÔvÂ$ÎÀ⻚:Z¢¦³4Žt† rûrò hîÆw6ÜÃÏ_CýV,lïY® žgòc0'aá@ZW¹Ø9»ÞYwJ×T7?!†‰¨ÿ dƒìN.qhŒ¸wÎ{a“½u,Ü=QŠAkA„?ÏýéõŸ±øÑJèÚÙ5࢚¡“Œ‰ßõÈá1Ž»\¢R-7á}vöCôa[ŠÅmLŸþñÙ/›0‘ð©û>Üý§a?„ M±ßÆø"%àxí¯ß»ÐaäáÍ¡˜S°×N:9[™R@d|ršü`Pžó–a…­‚¸‰I‹ùªŒ†Ç¼‘ í,æ “[Èê´ã}vçMÈ÷‚gÈêHÙñv—- ?BälŒäÿhµm‰vºBdƒyÌÁ”-píl3žN±’1oPéñ¼Å»+ÜwhÚãÚƒ ž oAŠâã~år(#BÍþŽy3 ~Ú /ÿÍÝ¿Nîÿ~ïMü~nhÂvŠ;×.k«êâÙËa8ß…è¦9zêq§À›]ð݈öy;^ÔöŒZ‹šÿø_Û?óÏÓøÆHû/~áÕHŒ¢ž×Š‘s‰Hµ*üqr.!ðˆ÷üZcþTap¬dr.SŠÀèö‰7Á_1†\h¼™Húk¯¿Ljùïf‡4Ñiœ†Þ!É`œ?ÐZºÀÝùí_x…_ý½E°`Á‚ |7Ü$ÿb^½ý?ŠàaòÿqxÎ~ ,X°`Á‚ ,Xð|cøö¿‹iz\ËÃWóR9a¥:)àYð«.^#7'ÐÜþ »ø:¾Ýà ¸K¸ïoZ§¸y¦>¡Š ø °sììm¿„Ÿ^àéúpöu¸ W±ÖáHà´C^z Yn‘ý½Ú‡ â‚4‡…kUÇ[EÖ6†¬:¼9ÆúÙï!]"¥P2ÈH¼WæSáÂ, ^I“¬!8pAMj @}í Ø·{äÎÿ MÂßÚáöøú~ôÑüJ# s §ÆñIP÷yìNs„A­ £#GÇpüäîÇAo£î˜œSŽ>|ÙAoøô‹m¦îxÁDc/Ž]˜jÅ„ýà<¸t®v>™÷ƒsµwV-¬ºp'¯Úpöïçb$íª=T·XwÂíce»:¸«6êŸG<þŒëxÈÜ› ë1d\TÏ%žkR¸¾=qЙïç‡;þÿ@N{˜'S=”Ï_³·Æþ{ÖÆÎHüïsüW{§âX:ÝÄ1°YA.Â}rÞ7¥®ö!جNÉxdÙKcPISÇéå>Dë.>?Í8ç‘[lÔcj¿·z=DkcTF¿ª£V Š½Jºñÿ’ iAŽŽÓO¢ò#ÈТl±áVl7õ¸#û+HßÄéAÖ`â÷c( â-Θ*“@JæõщI‰/+DW›ª؇@Á÷ ;¤¬Þ(ÎÑ-Þ9¬:Ð#dèQ9‡Z@zƒÞCdGm®Ítð×jßH1<ßÇü;ÈðňZãPçIÅÇ fͽ¯÷¢¦Lüô#‰î"ùч_÷8¢ýkO“rlé(ÔÓYÙ£³?ùin}îÏ¿Û|¨`¥0äËhMèÈC"f H)ÑvíÌÙ˜WDäá_ŠÁ§”UA5¡"™ž’N òð—þÄàTç¿îVË»<>ûM!ckj–&ÅK©"/çü­òýÁ[O¥­ ,X°`Á‹‚¹`$þçQÿ7cÿ¹ñÿw»œ|7<·¿,X°`Á‚ ,x1<øÛøð5¤i¡Ñˆž]±_[Ì —#Äü ½…ïöÐm`ØÃå9\>$(#yÂDhOéã‚]u&aõ6T×+‚‹áå-8¿‡kBsÆ/wpl†oÚr¤ÈKw‘;ŸA×§¸\âû¯ é[ø6#9èI ZcK[A6 «_7°þ.ŸFò Ù}Ë_Awß"õ9N9âF£\€Ê Ã{`ð¨<î·G=xi¼5PòëHßn ÙæY‘ÞCH0ö¾ŒÌ«™ÕñøÕ_ÿoíR"bÚ»S?„Úmð ¨+.¯Bz ã 7CFQ‡y¸6û¢üÇpª\”ÈÁŒ*›•°jão.QË~ÓEÜ}?„Ó¿çb‚U·Ž4ÈE ’ób ÷€¶¦©Ä¿ÌŒ’о? Œ•'æ¦Osðý8âÛÉg¸~š˜Ôã)N„ÝÞ¹Ü;]Çk娩ýÇAtÖ§"ÞÏÜáªwî_8CŽR·•£µ°jžÊ!5#iE]B™mIG«‡· Цë™ùÔ1FÿÉÁ9¹„@[Á€N«Sh_EùH%¥:´€Ù%."î7@~ûK¤é 5Û€l,`ËÉøM©Cô2D[õæZ—äš:V,#e@|ÀÊ.æá!!æXãH»ÇW ·>G? ÜÂíÖÿñ¯C?à)æm r· ñ߃Œ÷ ][ãS¿püõ¿¤<ø*ì÷ø=ALñQu¡×—ÿžû³€HÕß=Žèž^x¸ë~øq/¿ùy/b{âøò9â£*Ž ¡¦ ´éðq‘>ã<ø“Ÿš}”<Ôž[ÿþÿóîí{Áð«¿$ö?ü¥‘šDÓ6µ$O.5ÎßC £F£>§†ª’¦ëJ…¥MÛÔ¸}'©Ò´M êä€Dj%×OîH—ùEG=ï³åªôdBǬ`¥sÁjÂK)†™… àCt=²`Á‚ ¼WÜŒþ¿éüÙÿ¨ÿßÄ2 /X°`Á‚ ,XðEK¸ SÐ"•ÈE£1KTÂ_Îܽ€8NFw÷!9Ö;ìïƒ$˜XÖº$,óÚõ•€™œ˜cæ1oÜÀG¯+`½ÂV`oáVl%Èø®EŽ^¦Y¿‚¬ŽpYcú6¼x+¨vЬ€¢ ´Šl ´{XŸBóS$û$ž.AÛŒw÷¡=‡hãHÞ)lŽ´Š5Óa_nñm0¢Ò+žk5oÕèÏVðÜÀýZGZˆâµ¯é·8N›„ãõŒÈpر&1ùÜc¶ c²Á\ƒ2º{?Ldÿã0žÂr‰ÃVkôªãj¬O¿ê„DŒ•ñ5:2«³±nóY%-ØtÂícaÓI¾ÈC/J*lºHÎ÷ñx-ìÎ"`ÝîNŸárç´ ´›‡÷Ý †CŽÊuü­š(©°b»•óa?D9U §qò1¨EŠL¤8O¸Ä6’kÄ€nÅA,tn8 ‘ˆç‡.VϬ€¶hY1”9¯wØõД´B´CÈ`;¤4 —t7 B´2§RÉÅ5L îϤÍZÓOi _6?¶?èÊ;YáWçpþV$ `ÈK ú韆¦E¿ö”·˜\ÅîÀ¶¡¼aÈÛû˜WÅ%…ãE8ç=3¢{„ó˜)òûí†÷rœ?gíqË’\ê\RJ$‰¸CÛ ¢5=¥Ôò2×¢‡«Éë8ûÿµéþ‡I ðKÿð[üñüiTCDQªÛÝ,ON}aÈ™RŒÜ”zm“èV-4õœ}ŸRŠkœ!“kä=ðC˜ë ž®ZTˆ«Â#©?Ttúm0s¬„jÌ,Ê!”jã>¤I_ü«ðÖr ,X°`Á‚ë£` ôƒóÇòÁ‚ ,X°`Á‚gvù_‘‡7kİO.Ôk~Ó›æÓÑueAâûÞlOÔöp¿3(¸â2ÚY9°®v ûÓ?ævÖçëê°;…ß %HÄ›’vàÔK(€$Í2.HÔ6é—54'HsØäŒàëšshî"¼‚p;â=“¹ƒ¤5ÞÅþð.ÁÉôøU„Ópì—мz†\Y83sô“hõö$Pb<³TÿRûµÈ`à)H%ãP´^˜RÄ1ÃÕ!>:8ôW!\hÏAúú¥÷H>GÊ%²ÎFüJð°ÇÆgT®ëÚÚ]Ì?8ûžÏŸp#¡ëúµj‚#);&„cÙi¸ºt¾sfìúJ6– '“ÂÑ*ÜÎë.Íûìô5Å¢M•¬xLœù³Ž¹ý:í4õ×þó³7?8òÈ^ëÍâ¸u$ ¶½3çh-\í‚t>^ëDˆ©øÔ¹Ïj«†ðåxýîãZâ¿m„9g³î„®¶{' V‡ªÁÕÞÙΪ•iÛf6M#î1&»&f]„×ÀéQ,I9! r”'(ÅI 俪¡+GÖŽ¬ i£”Š»#ƒbªˆÇ !tT.uT­¦®Øä®ÕÁ ô·H7TWÄÛÉß%N4Ža)ˆy‘d‹¤‹zÀ`…çI1 *ÈàÐ#2àV¢cÆèo,Úz‚ÊÇ;t šSH¯’ôh ¬ñô*¬^ÂÓwÀ­–PÈ+œÞ”pøK#¨Ÿá£jíE'ÿç˜yyLRÇ8_¾+Eú¤æ„g´=î‡Ò£¨)bÜB æ†þ)<‚CZ@lïÆ¾¼KI¹^|AÀÏþý¯ð'ÿùE¿¨ ª$qº® QU?K!—tmKÛ6¡)Ф„¨LЦIÓ-Á5Ž¿”H Ê¦€'3v®¥ßH|F”. „„“ß‰ß VŒ<äkí23¬¦¤ú˜&„fÎñ‡øåß}㉴yÁ‚ ,x‘pS <šì’äÿ‡äÄ‚ ,X°`Á‚O¶ý-È÷Üz<×zÆ€¸JÏpª%ÉêëH­ >[ô¯•”%Mî¯Uƒ1ƒÎ˰Xzj¬²¤p´û@ÿ…j픈:v· Ñ#!R¢½e@ÊwÈåMÇ gøð&xÆÛiOHÝGñtŽ‘Ò IÝ!¢dÚëœ#Ò¿ô`=#¹C²XÜ<>‚££éSà+T ¦§õKÛ%>Òè´ÊîIT;RRˆ. h5æS¢;Ü4üf„7ø°0K ²Hª@`ü.Ü-DRëP÷`û‚öð£×MH:Á]q.°ò °ûpú ²éàâuäÌBT0âÉÿq Ôû×\…ÓâìóóSm$BâS­á$Q+\†øúiRŒcíö1–½X¸™ÇrȤ™ )¬Û¨g>–˜ãy"ÿGÜló¡nðáùgµFý>SP‰D¢ÀPœómŒ£»§Â: ¹éŸ3l÷€@×8Mw™±±$Ïh/íkDß8h’s².wN¶0à›ù¿ëÍJ8ZÅø²* °:U%…¤1³‹>>»2ºFXw£heìCáh ë&øo/N.QOZWFÓ@·)È©¢''Ð4¨ øåRŽXûA‚èCA:Gš5©©çϹ:ÇW¯c²Æåt¹¤Ø=d;° º¤˜Iiz|s…·X“Q6À>d¢wZ’ž2Èa ~l‚¨b´$êcãÐ$‡@, a«B䆧zRŒìu-N±˜ëýAÁþåŸCÓ`hîîñ$ç:%¹sû¬Ñ³Ïï¶úTñŒµÇ§¿2•EéZa×;gÛ8ïn„£u=÷éd:tyº’›‚€©]îÜþþÞ7ü¬¡’åc)†:s ª1GÉèäcþgB =ˆ­D„””¦I•TÝÿ‘0 ©ë³k'º+7JàŒeqÆÈr±6T·¿[$Œ¯YªAÒC ……ÁÝùퟅ¦‰r¿ø;¯=Ñ}X°`Á‚ žW4õ6'þ¿ÒÿCø+`Á‚ ,X°`Á‚g võ;`Wà[¼œ#y‹çË©{¿–àz] izlò…› …l©ÎÈÿR™×‘üW«Ñýê¸Ä6<; ²DÌ?±m§.`ÖPI©`½Áù=hz|Ý!l‘á \¡;BÖwaý ^îØÔö¢\µKмE±JžØÛPÞûäèAK‚4·@>‚p\û¡ cò¾¹‡ç+Ø{0ÅõU5Y­‹ Híß0…B(UÔ=£F%dêR®•IÍD¹¥ú\íqؼq$à ¯á›Œ§[5á òÀ÷;xnRû8y%0«¨Àgt]2Èìþáïó!˨D}áTcüûì Öuw/vN)pç4H~ó &ºF¹ál{çö±pçäÐ?#¦©¶í<)áƒØÛ§‡G-ò( ¿ðZzc•è!´ÃsŒ«]ïlº4Õ»×JŒ¯»pǯÚèÇlNɇí¬Ú*8©ÇÛ‹Òßc€¶‰ÒæÎ~8DÿŸ¬kô³;û>„¹Æ­„“M¤y\휳Ëxo×DúÂ~púÁ9=6« »…§XdHãÁi¯ 9iÑ~ ¹õi$çpþU”×ð}Á·Š¨GÿZSC× Ú`CA†Œ—ê’¿Ø‚~‹rìÐÜ AX¾Wob»zÁò88œÔ󺇓+¤¼Û`RP€´ÇØÞ)˜‚È‘+\.qÙAŠæM§}œ‘¶ÇS:àV'œRý;X~ K§x9Âm‡ç×àâ|Ž~¬Á÷àof¼ñˆöïtVÒ§ŽÁ¤Óê_œï^Œ±¹àÉbÔFåbFã˜O)†ŒY$€³î$Ê¢È(Ä».¦S@žÔP{ð§?;¼ô¹ç_ð¹ßøòtÿ‹_xË…¡ÏAŠ×cÕÇè)œRl"ÙCàDû( Á¤ˆcæA²7B]žâEÎ$E›•´]þ¥CŸ†< B8BñÖv mÓÄ2æ‡ÒVÊ$vøƒ_û))?û÷¾úÔöiÁ‚ ,xÐpˆýçáÑBx÷å›Ï=:³jÁ‚ ,X°`Á‚ï¾» ØRàý%>ìÃ%hD<½K¸P«àš@ô:³9Ú²F'Ì^#‘(0mĪû¬¹¼ &]-[ß Þ$Ø‚ï@ŠVž¿ZÀÔgb„h8è{°Ë‚Ê|¢‚°™!í ººC–—iÚ—À»Ú¦Œç>Ú¢ å-ŒËZ`ú;0¼y ëU¢Æ³KMB¨ 8ª E†ˆI ë•Õ­% dr_Q‰A7hÉqßÇ ¦ xÄýr§âØ;ߢ®EÂÁé59Áû‚nïCº€f‹»}Á¶{¤7<¿üÂ"Àë>¦Ø­k_úHø×ÿL®¬k •˜|†  Ñ‰ DÒ …ê0ÒáìÊHõ;ÝÃÚQQ V]8»sqš4Ö<¿Þ]ú~¬Š žKŒNË‘[Iš§ýà<¸t®vQ^‰øÿó­s´‚£µÒ¤kmCÆDBtdã9˜z\>çCkž!"´M$@Õq ‘Œp²VÚF¦Çw½s±‹ŽhÒlµfM 1ÁÉFèjI÷¸ß5‘´`%N§± AZA׎®==EO?KZÿè÷vÒ¢Wðû÷ñd±¶¹eèGŽ‘[?r„nÏàìÛøÅU$ÖìüÞ|»E›Üða]õÈÞð^£-YPMx G¾4F’=ÞþÒý[ ³¿D‡sÔpúz¢Ùƒn‘´\N9ípK`Šú€å=ä+è.€+¤ôu®2ؾƒ<ø3ÊÑ94· ¿Äï} ç~å0¤˜C$‚?©‰“à<Žý!Ðs>8<5ŒäŸ«ˆG!·„l°Ý‡ˆGU¸Øfpë(Hf¯âº Oh¨³Üû“ŸæÎ ñ˳úö¿ý ¯„ƒOSHÕ!of ‹¯5A€”»`S2DŒ~›R%×å©ÌIsçTsJ)ä\êóñD)eMX IDATH%ûÁÍCÈ*‚&ýÕ(±cE\¯ÓCÔɈ fÎ ð»¿ò‰% `Á‚ |¨1 æ—û㥘sý'Àˆï‡øÿ^Þ³`Á‚ ,X°`Á‚ïvñ_ƒ÷Xy€•{Hy ßßÇ÷—ø~ˆØýB¸ð£u]Û;ºk€™€ÙkFöÊ«û_ZG6†žä– ǧZ(¿¸Ädœ&Hö½‡“žJž‹„ ÓebÛÜéß*†#ƒA+È*ÁªCšc¬½MÒÛà§ÁY­Õ\dRÎÐáÊÏœ‘¬XÖˆvVÇói· W mtšî1®í¡qX…X¤Æ­6^ ¨UÛÚ(h(nýF±\IU{ÇJnö‚¾Ò ?ùožôO±oYöR>ìF¼µyB|²g?;D3e¹,ø¹â}:6ܪfA¦þv®Ç¼Žª÷ ¿^÷¯.Ä>‚lf$bWIÇ‘°ðª#YµBs"ô9j“_î¢öùHÞt0ËÏØ#FMÔHRA(ã)r³Vm¸ýK‰qÖ5B—â”sŒ·1ö?©LÂU^ˆÅ¯1þîAúä[±x^„©OÖí/ƒ lVJÛX”ßHáæ—j;ßTQN”îÚ$¤M”ïh“L5ů§ï )…®uÚä$Œ¦du i^Aõ6¤lé+ÐBs/Â^"1à¸Aîþ+pú×|í;q®í¿}Æyk0p+¨ƒàY±L”\1¥ìs¡芃e\I²‚T(¢x¹JˆÏÐ-– ’¼9EšSœcÜWP§GÊØH‹ C$ï8y@Î^‡Ë{xiñ]Áôø™á—)ÒwLpM5Ö¤9”‡X¸`ÁcàUh7ËÆ|kîœ]E*ÊGo+G+aÈqÝTгÝGʺ«eQj©q®Qü $¢ŒïO¥J‰¤sØtÂ~pÞ¸güû/Þ×ç|øÕß{“ßüüË!®)]+ãÓ4 ))V,R|tû[ü˜®…„¤:Åì?mŒD$ì„§VJuïÇ䡵ôÈØ.3üFÿ«’ëëS õ˜¨"uìˆTZ1ÜŒböÔ÷kÁ‚ ,xÖqS0ÇãR,X°`Á‚ ,Xða¸ÿ_bå-Ü÷X¹@í>¶{¶÷ðÝzóG½ÉäxŸ„SMÑ=1[ñ?'‰gä}ßDNk¬ ¹¥ÈG?œ~8¿‚£¯ ¼ŽçŒeÁ*Iî6~æØœê¨Gp4R ²Án´Ì*´‰¤-ž:\64ºVàMÍêÄË=ÂIì¿·P/;¼txn ÷0@QG¶çXú6ª Ik\ ×KÌÞ»-HWw[mmWEj}oj¿Ê`x+øàè ¸ÖzÊÕJìJÁ]!´²¹‹å«ÚÑåÐ'êñÙâ˜8Ú4ÈñG‘Ó†ôr|Ý;¸}Ù½C8 $V½Ç6aˆE×ɘ»+‚+Ã-¢Ówkæ2“AÙŸ`>ïS„*´Ôb‚ä?ÝC®,\Û­‰ØvRĉg 7<7»»à)b,1!‡S%xÔ¹¾{ / æ#Acn<…*Aˆ_ÖÖd‰¤ÔüéT÷\ LJuù:ï/UõíCèt²6m¼vLIèŸu ´2Õ³6‡!Çû­Äyu,K?Ÿ9ÙœdB_œ{ÆÙ¹¡îÜÚ§ê´=Hò³ƒPÍs$ÌLNTÁÕ‘¤ë`õ1Róq4­1_Ãæ;”ô-¼är…n[P²9 Ž‘X£îh‚}qv{§m¡ÙØl¿BioÅΠ߀Òã¾mp±*&ëö´/ãráµ5߃QÖ+¤“ˆôß O)[¸¼Ä÷WçŠoö±ë˜D9êãØ›æùù\Ìr\ðæeQÆ&‡cöjïÜ;7ŽVÂíã8¶GGy×ÂQRVm\_äâìkY•*ÈKÓ'=Ùó¢Ä<ß×I£LÉÿñw’»§ÊñZxõgŸ¿¤€_ÿ£·§û¿÷+ŸœaMDy½Ö/ñÝU"ÜrŽÎﺶÿó ¾ëóÒ<åå½bžÌ0^_©Ži`>ý Ï7mC“9¤”ÉýïŒ%w¢4@Û4$UJ2Ì,Ÿ4’¬Äc¿ùù—IMâWïÍ÷¼ ,X°`ÁóІG~Íñ½’ÿ˯„ ,X°`Á‚ ž"ú·>‡—o`î¨í‘|…ïÏ`Žï¶øvÀ{j-úZÞ+LDõ<êݧ˜÷k«ÿ0¾Ìüp‘_êdŒÄÂáÞ8º9½…œ|m‘5ø;j)§pþÒôµØ2§6Á™‰àóMcQÐ+¹?ÆòKBhmqi‚äoA.¡8’ïá{Ç})ÃÃ2´á‚ wØí0yƒŒøQý~Ž—·¡\Õ¨EÛpNJÛ@›Âq¤±BÁKAzÆšŠ¼Ê¬5j´ö9.ÈË ½rì­¯_bü/øàøÅ¾2„„°€‚¬À;§éˆT…£A›¿ z;HFy@Y'¼@ I°†È*wRjõëpÅŠ` Ô5JàRë!ÆŽk|ßRWmŸUÂRDªìÀñ5 N6B.Q“}³NpƒcMâãõ”‚ÙZø‚9ÌÃ埫‘P5Üÿ¥FÜ‚™b5e¸Ø:oÜ7r‰”€;'J× ‚s´’Cìýs óˆ÷>ß:«ö°'fA€owN«Â¦óá|pa†(J¨^b\œâ‚¹PŠÑQbÁ»'Aõµ_»&ŽÝœã³gÈÎP‚jUÐâÈî6¼NnŽß lñòMØ=ˆùшs÷˜Šc{£uÜ b„¿|•75øÆœ289;¹wšFhÚpC·ml¿5üme%oá»ÿV Åqkˆ˜î'k¤9Á»`¼B“îâ¾Bh õÁª€Ätˆ27Í Ø)b+œ-ž_ƒý·¡ðà;àŠ(a`Š'ÅUÃí¯£ðë1äÿ‚ï«×cpÄ0„ûÿüªN¼¥RίœU §åÖQÌË]‹YvpF³šY/÷S]´SÂm/AM.m¨¦ÕÙž¶5¢ë\ðlø0ÀHü[¨ ¼DIƒá\ó]·¤•#:à’QZ Ò¿[#mÝ š Rû##yÀW{dß#Í€í#rAÜ#*ºuÒI‚W>‹_tÿϱ{†_œám°þ²&J`ñÙ]Üd¥øú%T>†ÚKÀ&Lqý´oaé"ܤZË%Ü®Þ9é%ð•†ðá\(»†¢‰¦uZ“;‡+oÕ)ÒÆâ|©Â‘¤£«þ°PûLB¦¡ËH7®»ˆcÃ)¢Ü‰ÂçáÍ=«û¹à†jL¬§ÁHÉH"¤ZjbL˜ˆhë*˜Eg×Y±jcƒiFþ?‰È륄Ó"V[5Èt Ù¸ÚÂZ¢Nx©,ŸäŒ#N×*mã$qLˆZÏÙØïaH$q¶ân}šP‡. /Ÿ*ëç—N£N'ÂJ)nø{_¢” ¤=‚r_|\á{Ås0>ìz¸xÒœ@ºý}|ûMl_À^€,ឯó¨™PÇ3ˆXDÿï!µÎ¦ gë~pög%HÎË_C»RR*èJñ6kÚÜ&ûË4Í]Ð[ˆu!s ¿® Hº!ë-h^FìãP$_âr‚w;ð·cþÏãü¯¸DYO59Ìã7¯Æ <cI“1=*âûãÊ`Ý I…£UŒ©&áߦHJÙõ>•EQ‰4•$‡så(¼{m®—«S»Vqþnj) øöÿt$¥8ÆóþÝÿàùHø¹ßü—üãÿô3Q2Ê7‚ŸpÔ§¤UÄKëõÚ:ÄÏCSLÿÂTŠ`,%6 2mú¿jJ)ä\‚ôOŠ6m´W5~¸z$³˜Gõ¬ºOq]+Ó€rÆò1W-X°`Á‚6Œ ðÐÕÿ„Åù¿`Á‚ ,X°`ÁˆíÿþH ?{'\ûÄâ¹àƒE\~¦Fÿ+dA ¸…`,0¿tŸ–öåþs b¤q`AžOÖ¯ƒ©:…âˆç·œâ V XDúS¦Ï­‹¯æñ^+ÐØäZwÄ5¤5¶]ÜÀ2Â|ˆxÓä k¼ôAð·L6pñ‚ IŠKlÇ-¬p€FÂJƯòàHç¤Vñ•€¶h³Aº ²:‚fƒëÒ*ê)#ѱí-[<ãÍ%ª{œŒylÁð¦E½Ã5ã«y$³À h©±ÿ$ u´-xRÄ›èÓZWêNx"h·Ê® «Åpuš;ŽüèÇ£O`÷¿‰¾ö&²/xmv\„& DièV™¨}#"Ów<ÕæÙ#È£­ÒvZçõH8hÒáVŽ÷=cû±àÙÀX`$…’FšD_çëÊ“^ìœRàîiJîpëHèåþ¥³ï¶6]Œ³¨Ä!Oœ\ùA¢Ï±_ëNXuLI1"°n`Ó@î ¶ŠÈïÝ.êpOb Œx9]’;f…c­FÆÈ;¥˜±Û‚§ ¶›8=u .`B#Šg'ïj4´þöެǒ,»Òûö>fv!3k`‰¬YEJ¨" @~Ô€~)ŠbSÐÝÔ ›"ºD7(ª ‚š€ÐœDŸ¤½4<(°»Yd ¬™•“O÷^3;{ëa³kîá‘™•™‘Yuá×ïµkã±sÌÏZ{-òCäò)žâ»êáÒ¡OAÜ—uqéðð ü°‡n‹öØÙSÏZh6Ŷ&)4#.Œ»]æÉ%¼z_ج”&54*äÝHpô͉ã›k4ˆzkPÝ’õªwAî€w8-¡ÀkAN@zH žZ´9!ç“üãá^0Þ!÷Vß›'!ó•¹4c•(®‚¨wšÒÏ_+ª}aÅí˜ú¬)¾dg›÷O”»'[ô“«§ÇçD%ˆÝ§—VÄRR„”èazšzov>~L®¶‰ý„"hEbHùŠj<>ýò—¸÷óÀ/þæWç׿ÿ«Ÿ™Ÿoâp'5ÍL¢Ã›?½¨ç£)BÂÍ„¼ËüŒ‹š4ä¦îä1£"h ·ðx®FfR_ŠØÎË8¤I#B )QÅ !DUð/þþOàÿàw¾÷BŽ­¢¢¢¢¢âƒŽ¦ü¼mT¯Oÿ/—òi|—ÍX°ÕQÅãÕý<{!·bý?9²;¼—D"/þ¦ý™ tsÄ ±º‘ô à lÙQ§$têaÛiÖ#'[Göí•¶WÚ,ø0Ù‡‡(c“ ¹£äÑÈÙvЉàZ¢Wö耻à£Âè˸h=°׌ög gx6؃í5¢tJÙ³ãx’¹ŸM 9;9–C_Ä!½Ð%8ô06ºM´Ð´%åEË0Z¢‘“ØÐÊš(J¬"g dí Úà®h3Yï4 tø*‘Z“àFv£ÐhèÔ¥Ö·Ùþ×þ°âm`"þçÈ“RU¿YÅóÝ®g‘¤÷ÃDÿîà|ÿ±qœ®^½«¬»³OV!x¯úÅI 8 &±Ò0E Å=~Ž‚c¿xöÇ?;¿w÷çþü½ÙÉ÷¿ôÏ¿ÎýúçJÝr±&òÿÍúý)P[>;j’p1ÁµŠË˜ecÈ7'¥4ïg6C²¡>9Él÷Ìq£6Œ$OÇèƒâÔeÙÈ*)úàwþþ'ø{ÿâ»/ì8+*****>¨X:,ñv½ê_ ï%†BâO>ÇÉ´‰ Ç‚¬˜3ù_â˜\üÝcµàÿ™ps$9zßÐÏürçSè“o’íûXoxNa)lDÎðAð³+Dÿ ÃóÈ4wpñ]üü"¢ ‰}d±í¹\ÛлŽüÄ+èáû¿…Ç‚,Ï¥¬6;2d¼¿B†s\ž€tD^ÀHHŠR.oJ…¼ȺCÒ§±¨0ÊŽ Ρs¸šÈî$ˆ¦¨þ_­ Û@sBêîcí}û '+’$âäd.ñf‹HÊW€Þ±N Ç/ø®\“6þIçÈüÎ=dûQÔN°¡GÒS~Ãcܾ…IçÖ÷slü6~xŒ#>Ò«¸©bG£éß ¯~@î1F$+ªaIî“õû½Ñu1)jî´¢:YP3ÏŠOóÈ,œnÃˬª—¯U¡eÁoÍNûõŠ—!ªW›bÿß$èšhCî…P"Ȥ6Áý;ʘÃúúÐ;«6ÄOSÛ{.^œ=ðÉí£`†|ë{¢m i„U®RÖgCÜ8ioÑàœžÀɶT÷äx³@†m¦»›YÝMl\öØë >D6tî– %ÁEIê4I\è§jÒü*„\¢•î.ˆ ô„5¾Hâîx"ŽžOXïÈãªOžçh8«8ÜHÓðôÒ9ß9ÛNhEzg¿wÖëÈà––Öê ©h”á#“XMRTí»‚ÜAäi¤nûb Òˆñä·5žöxû:b1‘„«Äøìázq:Zž*ù_ñÎ1ñÈîÇX³ÔMN)Ãèdó9M"[ˆcB"\îWNa݆ gr€Å3Æ‹ÚßE?;™WA1À ´ ©l8n“7ßúR °ÄUð ¿ñ×óë?úõÏÏ´·Cþ¿Èç£ëë\ÄxüM0µ§Ãa‡·@[2Š$CeºÆ]FÈ;Œ+Œ§`ñþ·})YËÂ8À!C&²œs× c$)ºnÑõ_­‘ö.ÖÝÇy•¤Bp «˜Qö°+H²Æ¬Á“@;"ÝŒ`ghïx3•¦Çùo@Ç·[äÎ'ý$Œ)íq9Á[ýGíÏßÂ%ãzP|<ƒáû‘íçÑüXÞfüWÿ/¶ýKÆó;7Æ^Èb4rÚ*ûÞÙŽ‹¢â\õÐ6Îf%h£´I¢òjŽ`D*,ô(Çùâ@®ÿä¨3UkË5b_DP<¸µw·7³˜$•ö´j…Ó0ŒArY© ×â°jC0p¦ªXfGЦ}¿(¸{ˆ¶f¿ë©$¶ôªÑ/½Å½»] x¸„Lëq‹JxÜIÉІ+Ôit:fŠ@-ÌQðâ^ã‘'ÛýØGHûÉÛÿ‹a| 6‚´¥Màäbî´ ©-dw©ì÷1*ÞEµˆ¢d̹ ’Jßå½Ã,1">¼ËãQªIÕBLPâuV­qw+l»W$bZ ©ÓÐ ¸“TÉÙÑ´c1Ãæ³Ýu\ Áý¬(%úØr&µŠÈwpyJØå\!û¯á»GXOˆÃ\bcŠ/ˆ¨äÅ;Æ<¾jI–!ì{g#êD®ÎÕÁùÈ=¥IÑ7ÞY ]“xra<¹ T8,ªï§ÿÞ£&)°x6pÚ¦Å/–y§ÂÀ³?þÙ¬`Â/üÆ_óåü…gŽïý¢IZ1#ˆQ$ÜrÌ „ èÛ†”´ÄNMbg'›anÑPbz€ëÏ|(³x`‡ýp“ ‘b=*ŒÃÈoýÒ+¸;¿úß§óQQQQQQñþ y“ÏnOTTTTTTTTTTT¼¸øòç"#Xcξ̋Íå“SÖĈK±5.ÄJ!'˜ª33aE/Aî¸'æÙωԈ'Þs‰Êý³ï“ó]ìüoaôØ¡’#ìnȨp0Ü#‡YŠírØø ¶Ëc9˜‰ü {Š˜at¤Œ7ðÃ|ðp6 ‘Cv¬7$0=C]a=bÝ×Sð-n õ‘ìW0ž#ÃcØõÉ MR™0.í/ÛT]ÞžgòÈ*²çLD?3IÏuÞJÊBÏã–ÿï‘Y\"%J3mÜÙc†¶‘EÕaФXK¯»°Ž×Eÿ=­ó}=²EäŠXT²˜à“Ó i¶f~Te&û3çÐgÌŒÕÚÖ‘¤ ›xÙÎ(1¶õcT»9H÷•õ§hø,±ÕwH«×é¶`£#…sŠÇùœo*‚šLr²÷r÷&Á”±«G‹ ìÉßD&÷”é3]^ÓR¾/‚©Å8KÄάWŽv†{XM»‡(!1žCš]v,;­«.ÓåŒçõø6‚6 k܆å‡Q:H+ă}®Ã\^ávM,çናéx&À|2*ù_ñCC¤<³áhšªæ;ýè<½t†³4=«®ZaÕÁ˜UèÚNMM3=«C}¡û|“ØY$b¼ |D?ÿϾÀÿ“Ÿ~Ëe—N5ïf¬zVpÓàí'ˆ~UEÍ‚ÀŸþ)ßw<ÄæÅ¹Ê£Ò¿¬*²ßÌ"þdZPQRrÌ !©Æ¶DP‰ˆMZŽ~û—_ãþîïøx+*****>hxž þ%PQQQQQQQQQñ’àcT2zñL)} ‹»±@Û…™íþKµ}Ädt; ¯%!?ð^!5 ‚ l\»àœðsǾýUX}ßøeXÓL;¢Aœ¡R¹ž/î&QY™\ñ¹ò_A™¢rÂ.2ò¯áëoA?àW„¨A)Ž>€¨á²‹|÷±GÖWèêëî¡id|û üò¹:ÇvWH?âCXV«ÀªK´mÆTHê$X´VŠ´%K9µ˜n¹œU—ma𕈸,çîIzF9EÓ<­!íp͸Xé„ýtXPO¬`αΘ×È|ÖN¸&D·˜n‹Hc$Ã4‡!Yl—†áš‚ÿrAG!#Œ¢ìvætƒ)nBÎ†Š²j`Õ@Û M£Á0:£9FXjwÒóˆlNŸC°je¾îÙŽìo)¸AúÏdÿrøÆW«=¶5|Ö¢²¹ÿ/ rl{VÞZwQ«rÔRåòá$HI›—ŠÉ«Û24Ù² åŽ. S¹gôÙ›îd„ ó§–3†âà «•£/Ý¥DµÿAð>!ªø!ˆz™*<ðËÇäö€ã»Ç1<­ZÇVFZ‡…,0ÒKˆ 9æ”>¡¸,ûŠéçDð/XÇ=×\j,Æ"]c‚Ê… ŠA'Pn‚JXP·*dÂýœN#`¡œ.Řb%}»‚Ü ™è_›ÜÃx ÃS\NA: ncL)³ˆÝÉ0öX> Þc»ß\‚ív  §’äE…u­éÝp?¨³ï"aç?Å›tpw+\î÷ ù§Gp·”CCöc,Š¿¿Ãô{ÕŸýñÏ|ànbr€£àÝVþO˜ˆyŸ{`¿þ~!ëU„¦mŽqîH©ÖOÒ*–39ÙŒ†4ûY "Ì1·òÚUº®¥)Ù=SLÀÔÅÅG!Âÿø_ýM›ø»¿õw}ü/7õñ¿¢¢¢¢¢¢¢¢¢âe¡â%ÒýHè‘ä\TF/œ4™ ÿÙ×xé ³M™iM v\éÍ¿T€R±ŸíXîš$þR; 1ñ³iÇÕÍÿâGÑ€†P@&@) "H£JT¼¸ ³ó±¼;6“ ;ôh3à‡KR†¥„ ~žñK‡½a½á%ã9¿Gi<)E5é$b0‹“©ê¨ & dƒLÖÒÄAË)Èl”Ÿ×+B€4”²|lšó4 3.slƒ›CoÈÕ9}O-"-ªžÎqž v«»°ý<ºþ"è+(޵Oi¡`÷éÀÊùTmoiBä Õý§IØ °RØ4N!÷°nœVƒôÏÙ]@•$!&„T.ÅÅ.®ßv#l×q›’ˆà‹ê®MêÏ“¬ó·´½¹Q/¿‰Šé~¹) ˜ÞªB€Š€É™¹}Kzd!|YRôƒÐÞ !"¥ÿ‘ÆÐ¡û Íkÿ¸0®þwòî_!WŠ¢Kògwr¸ˆ¤•±9ͬN2¶MèƒWŸA»×Åý1Ö|ƒ1¿Á ƒ¬xK‰ˆ;ôâ{¸fh4Üîͽ r÷.ºZƒ ¤Ýì|‡™‘Æ6^nˆ+ˆáIÝñ".¥ÿ-"·)—aÜr¼×ªKµª*]“C8&°aÌN+Qñ|±ƒ,ƃµ”vàlW`°wg‘ß8 ã%BêÈ¢ˆê=Ð!$\=ƳKd8ƒý%~yÀ¯2¶‹óçƒâ¹Œ™šfa Âëè¾Cõ«xW¸f¥ÏõX8Y+Fuÿl#לRÖ´&G-ÊX›ü0Ä<K1„ àÝ &’}çä7žõ4) €\ìü'Ûþ&ј%†a`p©HˆËBÚ†›…ØÖ !€9*á" )Ä@¸Å^ÁA쇪Ò4‰Ô$T•ù?ÅñÛ󮎽¢¢¢¢¢âecüˆ=nUTTTTTTTTT|xpö{ÿ”ŒËkäèôSnð7á×JüŠz¼ç*` þtľögà‚eœæÙÔå$ßô™¦iµ7–);–ÊÎÙq§Ýo.Ùôó[S¶òd³œ B ”ŸŒÆ Ÿ£~¨¬£L$:`ƒ!»L¾èÃ2yt868ŒEù#á `‚y¢9K!†¬Ti ÙuG¼—E±ù˜'qÅÓÂ,ŽåÀÀdÃàîQù^D–-f¿s0è2”jÔ"Ë=âßMÆ}‹‘1žDuÿÊñÕkHóI„‚œ„ö"­H«Kòö°>cï´8;$"/;M¥KÐu‚QµJ†® Ks\78ì…ËÞ1š.¡’\oQ†ËuM8 ´ê˜ë,Q™´"²¨þ¢d¨OYÝ‹f´œ^¶ó›b€g ׫þç,€òÙB,3 >¤ì‡7­Ÿ¯ßæ?>çUn¼V…âz˜ûì—l'<©Ü£ßɆ'8’í+hûÙ>@R¸“ÜqÝŠ¥ò̱ £mFï¤ §§ÈÉgI›/"ò ˆ%ÎÈw[Ò0 ù1Þ[”7¦Ñ’ìa%è8¹·A?òIäôSNÁ÷°ù¯#‡ Øç£ÀŒ"¨X…KRìªgÂi`´›S™e1ãM‘Ѳ²ã'AðO¯Ý!c%ÞÆËðàdƒ„³êœ®TqIýšÇ‘{½±fû] XŒV¦W˜ž¡<ÂÇ'p¸À÷=z ñœ•AS4Z¦~V´Œ½1~Ö™¿Š‰ÒìAŽ·ÈºbOâ'9ERI@5ìÖ”1¹À‡Ï`‰Ÿÿg_áÿÉO¿£ïÞ¬òŸžÛ—ýkh“t^>*ôËaýORš¤e,5’&rΌÈˆÐ¶ÍllbóúŽ]ÎÆáÐã]×"*³öË=ZÜ !¥TDÛG~û—_cF~ízòÎN`EEEEEÅKFCý ¢¢¢¢¢¢¢¢¢â¥áìþÝ J!‚¹”käæ›A_—‹–±Rño;A¾?–õ'HÅŸx^Å-È›³€/^ßÜÙce¥LË]#Ì9Ϋ‚!?ƒ\Bd!(_µ ÒI¤Ž)v˜¾C8' x.YÑcTižˆŸ¨¾·ÑIIÉc¦· ŠÚìxv’HÆÜðP$ êÑ9#Úc£â`B[ #2äØ×yæSðÑâºF­gܬÐá ?ßã)ù{ï6%: óh¤&SÓ 4Äó9Jž'؉½šû·8v)§ªIBÓD;è:a+Âh ²;"•Ï ÒJ¡u†FÂžß ÉWøî=tWh:ÅdÚDTL> vO¡?Ãú+Æ”¹é/aÁ2ûèLªÉµ÷gÊvþùW»¢âMQšÙ±º»4µ¡þm‰E¹©ç[Þk7Åe?jø°FLø¹ú—óëF p/£ß< –Ï2)KL®Z,û'{ÿéýÙæ è¼=|X6Fψ E°%³Õ¿ŠâåÙU$)ÌŒqÇÇ<ïëû ÷øoþèé»8‹/7#***********Þ'œýá™YžøÈ–)2ž[â:‰ïåçüÑTæB•áSÕþ[‘ÿo˲×Ypc×n®&Η î·ˆrÁq/õ‹^Ö¯ÎYäËäòûŒ…lÏ^^‚€ë)ekJˆ lŒ™k|¼Dôd‡ù2š}ÏÂ[ºl|À· ´¿Ä÷{l—ñ½-DQŽâ„Ø®›Bq20¹uèY4†ï¯ = :–j×Ï—¨ðd ¸*Ò)®‰¦qœêÞ —…¶HÎa"«k%*Y6[…«¡›¶!µ0dcwwV°NÂåhŒ=˜*‡Q¹#{Õ 0gÿJ±`ÕÙ¿¸æÏn´÷›ÌÁÔ†n# –b€gÕÜ´Þ–ÀÛ ¼Õ2ËJ·[>Z¾÷Œ^aéžðÈu[ÐËÍ[1´Ðr}—îºXà=E©&œ÷m"½÷Û¾íøä9ï¿#Ìö&¾h?2“åoÝn9 ¨æuX¸« À¹àßø[ìünöñˆ?iñÃqáÍÖ?½4ò3ª!É9¹ó“¤öãXr\· HKtæ "kDÛ ê¨’—b2‘ømØ*x— »Kj^Eå.h ¬P{ K¯@ú6È’ È䎡wr²ÅS cÆ/wpi¥;Q¤÷Ñ5òÌ ¢c_5C"H¶¨!nñYòpƒð…Xr49´‚· Â:Ñu :F£ßö’ ;ì0y R"ܱqÀtØ“ÇGp Õ2¦Habe:±·  ÊGËÑ]V @Å;Ãô´Œü™Æ+ÉH°ÐŸÜ¶Ž“ö÷aŽ˜ðNÄá.åYÎÌÈ9¬÷ãÙ0|UÅÅÉ)ssóx&4¥â2!³0 “p`±]er6è‡Y, ¦¨Hl«|!—ý‚p©ˆm)©|¿Š*****>Œ¨€ŠŠŠŠŠŠŠŠŠŠ—€³?úâq¢ŽUËתóåŸóBÜxoùë’À‰•âXÉ¯× áÅMü¿U¾ðìFÀâ¸o³‹E&BÏçhò¡Q‹VTTTTT|ÀQ/7£—|¸/Þ¿þ¥[Ö³\t9у¿ Y±·nöú›¡‡(,ÔDð˜à b^,£ËäâtØnÿ$|°òZñìÁÕ›ÏâÉQ@VÞòÁ`—‘ÕÒ#DÒ8Ù‘•¤L»ƒõ˜ï0{‚Ú°Ý#äü ä~_Qì¿t$)tà}TXKŽRX?^/K€ƒ‡]öꘌx~€xƒç§øðèÏi;*'Èj‹u«x/È€{\® _!ã@>Œ¸Ò:ºQä„H7È‚Ž°j%"ö‚ ÆþÒÙ_‚gÇØ©c­á¦tž¸Û(2*mYª½9¹ÏàÎèB²„u‚¤¨ÈšÉî›ÄÿMÂÿFtÀó§_÷˵û¡{ÓoG`Aò‰g&×oS4¸‰x}Þ2“‚ãÆaÌ[ðÛâ¦ÐçÆ÷–ýÂR ðÞ¿^8è!‡•n¶¨ƒÎÙÙõaË»<&‹t Z˜uF·Yª[hk`ÕzLô/ÚÀ3—ci=ÙÙ†˜ánÑ ÅJ>Úà«6^?OÜñ6¶õR° ÿÅ3ti$lëÇTZË-"€¥˜ÆìùOëxò ²‹J ðQC°N<ïúQl›K…å e<ü&cºBÚOX»}$aù)yÿMüòv0¸ âqýÌäHþQ€Oy,KÀµß+*Þ9&rwz}|?tJ/»Ký ãÇÁàhû¿|¹/EPÆžÅë¨ÆQR“âýBðg3¬ †a,Ä=sÀô¼—4¾wS%e¼™£™¦ýˆ=œã&}Õ$^øÍÿì>"Â?úÃÇ/âôUTTTTT¼ç¨€ŠŠŠŠŠŠŠŠŠŠ÷g_þÒw–´¦<ÿ£7ƒ.¾ðL¥_yï-ÁK˜™}ƶ½´7ÎÁDÌ]øÄ;nÒâóÄÜ•¯Ap…€Îù×xä}Få©ã"‘ÑìB“¤1†dÞ°]è9 ˆ ’²îAîâlÀ"Žû³ ’?Æ?€ÝëØplùȹÕéÿƾ? ‡ i4b ÃG :­IS,{©ðG¸z„s‰¶›¨\í{Hè:TO "«øêt[¼[ƒ:BÃ%)?Fú‡Èî)Ò:ëÂÆzíÈië-IZš‹=mgô—Æî±1 ŠÎf ÛWî§:º| ½ñmü‘ÃC!œ” ‰¡›°Ï¶APwdŒ°oÓ…®ÿå—®ý(-f#¹M3së}óöDA2ÚÈ}GÇŽpÕáÒ‚Ê­Ëä7äªÃ»öÙ{kqlo~OOÄþr™ÛHìÅ~à ¹——$Î4é-@RaóC¸@œ¬…;›èpÒ‚kœìŸE¯ïñ’Dž\.÷!¦yp"tɑŵ™³(ÊçÊ$º°íi;ÂEZÅÎ ‘"8îH©äæ­·õ¢ûÆÅùG$PøQsxþè×??¿v ¡hÛ64M¢I)"$ž¯TÑãó ¸øÑÎþÛ`ê³ã¹Â,„…¢BRu«â RŸc7‚â÷é{VbŽFSÇÎSÄIIùð þÞÿðÝ{+*****ÞT@EEEEEEEEEÅû„y¢o&î˜fàKjªZ^ð–ÏàRÿÆ‹gÄ7·õ1×RÓÌÜõªPŸq+‹f®ŸÌs€¥zÞ±’ymeA;n'ˆgâ»f"9+i´¨½4`ÎÙðf´—¨ž’eÚ`ÙP?ò% OaÿïŸ"ãV-®§ˆnñí'Sû3$?Ňÿ Ȥ„5vça×EýX§¨:2îq;Ä9è½Xk7x^“Ú{°z o_CºHwжm4%;0r†¤m ÚíFºfŒævÒ’^û)äÎgÝÂx†Ÿý ú·ß "®‡48'Éaël«Oþ ͽÿG†ô'Øå¿Æc¸2ÆÎI÷æNFø¥ÂYB†È´–6Í9Ú󘪰žièoG³h=qwí^¸!:¹Mpm=w•ô©ŸF¶$ý)ã7íÙýœ–Ù¬ýS†oNâÓ¿ÜôL*.Žë&3 \³#¿f}p a|CÀðnaæ×,ýWM¸§QaÕºƒ6•x€"P*>dÏÍC‹Ê>Gq.Æ.)ͺÄÎû-×]Bèƒ áBþK›á4£ëÜVÐW¿yßý+ü‘1Sî~¼båõ[mK ™ü.ÏiT“—mÏ •㹸UpàÉ!}@úØ¿`þÄ ¥bÿÙíùoxgÄÆ‘ÎmFï&äôׄ~y…ž9v ¾'úÊù~|ò޲JXÙ{]åcA kû§Èæ/‘õ·0Æö=ì=b)¤u±uNÓåH¼'NÒããð«§ájb#ì/ñ‹ßÎìäâó¹1ð‘£SKžïß[{•IDðÌ=Õÿ‚¡[G_¹l?‚_|ßÀÏ ÁÉJU,—6‰´YÁöô>Þ¾Ü#q ¬¿ !lÄ7¸txj¢ÿ dWDG¢ßGB™£mÈRƹøç·þ·Tÿ@ž*~„pÉ_‰ÿ·‡%1ÀMüÂoü5økŸ‹š¶ ‹ý¹b?`nØB  ª´eYFÀÁ²‘s&*üuAðç#©_ªùã±k1öR"Jd@RESS5H’\–®“ ±iš¦á÷õ3³{Àþß}í==ïUPQQQQQQQQQñ>`9±7Ÿ×¸ÿ™-“ÅëÅÌÓ[ÎŸÞ ýoûÎavY±ó\óçË‚Ì%'º|s&}Ë?/.X)ñ‰ @qÉè,®(V£b¨L±Ù‚˜ a­…ü íxs5D;DÂŽÛsÃÉ;ü°C†=ˆAoèÅWÀ »Ðn0}Š÷\]Bò ŽTŠ6A Q¬t‘;ŽÜïÐ{'xÓ=ô—ˆA¼™‚5ˆŸàú—×hVƒö´[HMT<ÙD†·+„ ¤Ù‘t`ݼò úÊ—H«Ïƒ®ñ¼#7lŽ\<%%XwŽãáN ÷PÙâ:‚ž‡ÌÓ+£OÎé–ûŸý4©Mä׿Žùƒ¸"ûuÆÞ}Qõ_.liÿ"7®ýtÙçváG±Œo¡yîöV1À À´à2&C÷ Ø—†¨Ò½Þ6Ap[ƒ­1„\І¤ý’ð¿vˆËYååzÂk÷ÇrÁ[îã ˜ˆÿ~p†šMRîn•1;Wç08w·ÊÕ!ÈÔ“õ$ª-ûèÏÙÕ$Φ®v°ß›$¨ÚuñÇ|I%"3(¶ìæQùÇÐO(ú‘/à(rñµÈ¿lÂd!*™ ÿ9FdVü,öªôå<‹N;þ.ÎéDþ/÷ayR¤¬[$#K1Œ:º½ûÚ“/6ô÷#¯ÿŸX²°¯÷ˆ;9Ž> Äá‚Æ‘ÆÐUFNäc?"Ù‚ŸÃÅ×A¿]–'ú¹¼¨œ.äÍs0÷áQ-‰jôO&ÐgÀÉÙ¡w´ñÝÅÜÅû(ø pèÏ‚‹^;ÿ±]…ÁpшzGä0âz æØà±ŽƒB_Z"ñYoèá)6~Kwð¼Áó¿ »§øàˆ•>wV2Äqz¡‡æc_^?5hN~Ù|,!›‡ø¥EìE'ÈÊ‘!'ŠœnaûM§ˆÜ#û+$î€lÀ ;³Ô!Ò71~©A3à:ân‘ir‚,¡k˜ˆÿ,Ç}œÎ%‹c»ÿsMðx&¨¨¨xgÿó—¸ûŸþ/{7^(~ñ7ƒ$ÿ½_ù4*ËŽ(.AN3f6k–ÆüÜøBü”Id"¥ËŽž<›aæHqœ´,g,‡Ð@ËÚE…FÃÀ,⬦áz+X6÷+T)UEEEEÅUPQQQQQQQQQñâñ¿Ä”5ySp}¡~ƒ·}åƒ6Éÿ–"€”ï‚7sÏŸIXðzbåRùï…\Š¢ÁU é¯3Xˆ@§êm²Z20:È€¹Aa¼Dš„£Ån;#ã€FsX˜ª!²ÆÏ·¨‚mð¦CP¼}OW Ž´‚€ ÒÒ)²ÉÈ© ¯­‘O| î|‘ äÇøÙWáì;=Ž ¬9Åy@ê^ÅÓ=¤½ÚM',ÎÑ8 ¶q iƒ§ÒéN Ý'Ðô ì²eƒ­~¶§dyÌhQtÛŽÐŒN>3Æüë¨jœñáWñ‹L¿ƒC†1AzõÓ¬^ý;$M éÿ ü§è¹Y7UÏÄÿâ"–êë™Ó@Ž9¬KnN ÍJ“Yæ__kp¡ ‰Ò°Åû·‰¿±ïüEptOF 9ú܆Ú/2öí¿Àðdo®‹xn©Ìç]šDóìòMaÀµ’dY|P>»&x"€¸h›ØÍóa÷O"Žâñ…Ñ0fçrgG$‘´.sîó pcÄ¡cÝ8‡34Ðu>_ºØ'— v¾x윴ŽlýØH÷ÿ8äæOðïþ9ö°ÁÏ g‹ x›þÙ-b“éÜ…{´æ)"ý IDAT)±* Bú‡À\ù¿ÜæÒaêǦkNq˜W@ô!vÙhBòSÄ¢o{F[á±Nˆkl<¢!àôzò3hû¹ùø»ÓÂî)zùoŸºCŸvâ-Ž_ˆ Ýh\Ø\Ž%;2ׯ¸†fÄ2£Àb\™s#ʽénåXŠ €kTº÷¸ à‡²ÎÒŸ?€?¹@Ò_0Þ¹€t†+üì[øÅE¬gâÜK¥çœ?½8§s×T,©1q„ÝcÜ¿‡ïÁXîßäˆöÙ9²]#'æÐ-Æ=Äî[fÕäLC¾+BPÏd; ~‰ùîC‰D=âÊ9d '€É¢znE²l_Ó\”þçì¿fÜý¥õ²÷è…âïþÖ7æ×økŸ 1À"*ˆH˜]…rq€ã¥ÂfZañˆFNz“´‚±äDŽ۳M3H¸ ̤Œ-èZð; yõUäîÑî³ ž/É9!‡3dxþº†æ$²±Ó]$@Zá’ÀñÉ}m–Po±Ô¢©ÃEºLN7Hx2¢ŽŠÓ˜;d‹ŠÓôJ¿ñ}oüo$”æ*c—B“{[e8•-š[T;'t’5ÖåÊ‘ï:©6ŽÄ¿ ¥*ºœ“©¹LM‡Òt¦}"*z!ëë£@pÆ·r )Ù9áæ2cËÌ~Ï*Ç6^Þ;µ¤ð’üŸÚâ[Þ¶K!€Üxë‡Ä$y|uªú‡°ø|î<:7’ ÷¶B×êŽc#B2£i”lÎà¤$tMjdÚ½1Ü4ÒhlÄèÝ8ô°éâôRÚ‡eØï£+Øç,rÞ‰ë=E}@öSü̱Ç;´ÐéQ7a>“â‚E;S‹²_^ÜBÄ ܧFÇlù;Ÿ«ò~Ìûßržý:/“IÙæ¤9ŠmIÙVÉ:žÔ£ÀN°×¿Ê ¤uxão°3…QK—ã°$ª‹]}˜ñFîÑ¢zR¶Âô£ÐÝÁÓÓr^¦ã[Wž‡ù—ýH +z* ’:v£ôµeµ“`²«/(Ëv/¤"ê$Gõ;ƒã³SB\/}6æðT¬ýGv‚=ÍÈø9»¼ ßøø¾Ä”}¹òÿx çsºtn0ðK0û6Ò|öü¢D·$A½¡Xo¡=EÓ“÷ I6àk  ±S¬H‰)ÀAZðUƬC­Å-aÙ# w¤üPD¹"<Æ=cû¸v­JÃ}æVTT| p͹ÆÀóßý§¿ü•—½gï ~ñ7¿ÊïÿêgfR_Dh»U ‡,‚ø7 B>qM©Ä½q@JÅú¿ô…6‰é·Ÿ*ù‰f¹h¯.19íHÌ2'Y4Ýi¸øéæÈXˆa³EÕwi©¬`)N˜ý¹yIWG‚ÌžCÓ¤õ!+ù¸= й³A?¾w.öÆ1;ý—™ÖWVÆk«ŒªÐ¦„Ópp¥ÌÃ3æ˜Ho ‰®Ù!#–Ñl¬†½9cRÒÚ‘Õ}ý>´+Bl#nóD¾ŽŽïÀþ5ƒÞIØ_ÁöŠç&D1Óu˜-ÿ ù¯­ãmlKtjvôã$pÄ !q­B|R3LøÍó<ñfñO C:‡6Ú9>*ô‚Œ^œ ŽÖínŠ](â¹ø:ˆi}Þ่W´ìC!7dÊoXo)çWr™T£Z¿¨|wÞæróLî Å¥…ì!ÐY4Ëiý>ȉüŸ¾ …ŠÁ–£ñÅ\Èþ9û#¶á×Ú|,g½#WÎ-WÈ€[¸0h¹Ö¥“)Ç1«·’ÿåº °Wü0"2 #5 é’kmÒt¥ª?·Dåÿ ,ßB5p–'3 Er‡{ ®ÅêèzƒÏÂ6w±EâôÛÂUâZÅÿüóí]ÚŠŠŠ—ƒùq·¨ò¤ÄÂ\|ùó°2¤3Nþ“o¼ä½|±ø¥þuþà}€”R˜ú6'gÈYòü<6¹¨NþéšM¿™á@*€ÙQˆë]â]¬wzFR a€zÄÒx±;ê5œqÌäœùïÿËÑ÷¿úÞŸXQQQQQñ&¨€ŠŠŠŠŠŠŠŠŠŠˆwDþßÄsÈ»çÔñ}¸q›`"\Üþöެז$»ïû­™{8ã­[]U]ÝÍflI$¤CÀð£mÀiˆ”¨e[–?ˆ-[°IQ¤i“ ýâ'¿Ú/–²XDµ8ôPU]Õ5Þ{¦=dF¬å‡‘{Ÿ[·ºšÍÙù/ìºçœ'‡ÈˆÈ}â?¬Ã·ÇêxW´ø‘‚€Z;È%‹¸ÿ‰I^‰[C'¹E'×z ]‚¾C§°<ƒå)t' ]:ZPɘí¹Ãý×;܇êJ÷*e¯QtDl…îÞÍ6â›G bJ¯É•¨I¢•œ+5†´€ˆ—hƒJœ¹(¢¤ï¨$à4âK=!¼ƒ—‚çpª³φHÁe‰÷'H2ÿ5Þßà¬a¸F®¾‰=¾Â·ÙI"Ø ääú.…›*£a˸)Ãrì°«+Æò““Àf@ï:ÒXݾÚü¶qŸDT#ÈSðÍ1íJ½Ÿ÷VjbÃIF.4"Æßá–H?Ð×éŽ,3òPÑÊ[{Ø€kǘΣ- 7‚¿ö©#Þ,’&êæÔ{à‡å˜ô?8`†‡$8¡]íú&!^ AÒH•½oÂöZÕ¶‘Jþk=a÷1üçLÐ6 ¥éœ›±ád)¬˜aWXKfõÌ€<ÆQá¦àƒ£Ú³è””b[­¦n3 t9 —Qg^Þ.¬IxXôÌ`õz½w–«ÄÒ w¡˜À^H×J÷Úc¸ù?°MÁ7nUDÑHáJÄ‹¤J¯ YduÛƒXMXJ°†‚f=8áU¢ïE© .ôè½É)ÂÁÎ`mÈÚ‘•†½¾·H*Ù)’ ÷ê$o1Ãc‚kÁï"Ù3`Šk:Jš8êoUp Mt >Òî†lQ†—p]"i؆²{î®±=%oOLÁGº“ïßy8$«(1h+iÒYm—ÞÚp"ÿëKŸ8VMâ˜Hx!Æ„¶a¿¡E@[ˆl¶•ïz8°[\'Eƒh¤L"š&FiíqÔ¯Þ“œ®}qúIÔBSãÜÛ×tlüp<1ðZ> •~hsMûÕêš?dÚµ§’ ¨âŸÚ®qÿꆧ]BZ-(iòáÕÆ2æÞ6‹€,kí+5ê:Òj<\T1Y7AJœ—œ;òâ‹Èòóø£Wá{oašàâ¸}îÞqÅ“™™š1㓉ã’AÞDd C—†\tÈsŸ‡“/!²ÆË5Ûo<`ý×þ¯õ´? üGÿåŸñ»ÿð«hRÌyÌŒ9XxU¥ï:ú¾;¤HÌõªAÈ›æ÷VR  Bø˜pâóWWÅKzT„œsˆ›@¨å ¢$AÎ…bv/M ¥Ä÷·žçW~ë©Åf̘1cÆŒÀ,˜1cÆŒ3f̘1ã/ˆ™üÿÐ"7ëè|Ÿ#8I §£Föľ*ñ‹V6I%+yOo—ŒôTâd)È*!ë%²º„þYŒgHv² Ò¦¹Dɨïp_†ã\‚| Ï# >ÕÅ R F°!êx3V‘qé„£ì÷}[GïàýÀÙΆk¸ú~}±þ:âý€°…îö—!FÐf/)#xÁ¥Tçý€2àvŽûÑüBu9_cö*>~¿ÝÁáÛ„Q×5ÁZ/ðüé/ÑKÈ7ŒÝÿ‡ßÄÇ),Ìu©%ÉQÄs’ªH#…@'@¸—# À§š¬Þ÷±Örïd‰û ï;¤ÛOÝÀ½‰·”.H¾GØNü%ÄñÄ5QJ#h+g'­ŸÊ´P?¹”'â¾²“M­FÂ÷†>Ñ/öðÜW#¾ûÕoa2bWAÙˆý#7²Øát¼ûD59Š_ר/¯~°õ¿áwÙNÓU/œ®âî÷FçÎbQ݈ç kÇ;g³2†í•ÕúU‡$X-dJˆ” ÅË"Rz%­ éÌgzô…ƒõ—YÈ ø ~û-xã»ØhŒw°-Â8ŠJ‡ï=¢áìÖ&æBXš ß é Ž®¹ìÑç¿'_YƒßÀÉ·Pö†íªÀĤ&RèTÛ¤¦5„#{Š8häíÑí2´7ô4ÁÃÏ¡ÿ¢—øð“?ÄÇ—‘1‡0¨4ÁˆÔñ!“ðƒúc¤–™˜âž¸iXþ½#]M:Xy$è»×`ÿn}‘nÇ#í>F?ò«|Äd|ß¾3mS2@ë\OùýcâÿiÇi¥xBˆs¼¯ãßó*ÐTé1‰Ö~½ªš© ¼íÎ ÑEë;­] DŽÒhôÐôS „F)šÉ½»ßÃâ1EÒ%DO)rFbIL¦™)ö &ÂxÍXÙ!eˆ²1fx©ú]+òð§ÐÅORô÷áñ#è<mª‡ûQ“fçÿŒŸ8¼«ŒGe#X‚\^¢ç?‰ö_]áeC¡gû{·ø›7œü»ßúÏþÃÇÏýWÀïþç_¡Hˆ­Ü¡ë4¢ÿ¡’ý5Î_%âüEq©±ýužBÿði®ý”RˆUEHª”¤! ”øLoÓß(µL{ üPŠ •øõ_~‘_þõ×>¶6›1cÆŒ3fÀŒ3f̘1cÆŒ3>v¸{”°6AÅQE¶l0 >’R98+•žòØDíÕ\²^‰ŸÔú¨Mnt_8²98íõ ²¸Àä’\‚Ÿ‚÷Q´¼ÆMÓ#^I'Ɉìq€‚—‚Œ±äµv)Y`+çURð@S½òp-ATçWaý¤„²Ù®çxš‘ÅÖàö õ˜+Ò¢ÆK>”H#../PžEì]"æØp…oo°­ÃV©¹¦RüõØ/Ñå‹tÝçÐîÓ38yÖߥ, y¦Gñ©iòýV•Ú~•ü¯‰ØáTfr,“ˆÚÚ HZãò Çà°xç_Æ}½Úá]Ç!¯;jËmÆ_þ}\{4€w­ÓEÄD¨V²Ð%x Y) yX Ÿ.ùÉ-,‡í¤ D†\:¼øÓ¤‹J!çÿ nÿìߟìOo.ïF.K;¿Ú‡4¶q¯ntÒáüÉâ÷äcöf*g½¨-nÎ0)9é|ùï¿Bï0,ßa{]XôŠ“³#‹4×Là*ãåP ìJÄÿ/A/ §?‰ö_©bŽFm¯ÑÛ++ЇE"¡h‹ú ÿ[/KÝÃLmMtá‡&JÊÅ%2k…û;ë±»+äñU,æk½§ AÖYz¬®ø °$s(ßÐR-—¼&ôÈús¤Å¡é Ó3üä-X¾)#긫âŽcþ9Ê<™ˆÿ&tp\ íY•:Ÿ­“XvF$ßÀ°Ãw{Ø(¾‘ã{"ÔDiåŽE?(ªˆKŽ ~Úv‡·Þ]ÊåxwGcíè÷ž<æAÀØ·&9pì»ã¡¦ 0Eÿ»yÄîç2•hm;m/soK%ѪÿHuÿî!€ ìîâÔVŽÐ‡ˆL»è`i}$”pâdÈ{ [„;ܶx£?{h‹Ò0ù¼¯êÜðñ,°øóˆ9f̘ñÉÔç½:,€Õ%’^@õAU¬°þXâÝ5·ÿëW8û÷ß;Fÿ/ ~î¨TÀ¯þÒ SâQsâô}G×Åg=§º÷+ñŸ‹aÕù¯š°Z& ´œ%Úsá8úzÖÄsúø±_'´çŒ¨LI3f̘1cÆÇ‰Y0cÆŒ3f̘1cƉÙùÿÁ ‘ÿc\œ¤BçPгÝèôIX/‰59ƒâ‘ ÐI02­ÉUÖ,XKÐ MZ\tl'ò¦— úVÀ‰ '+XŸcé* çQÇÙSì·H9² ÒÅ!•BñÈ-èè æxþ½}ý>Eõ#~?Ü×q‚TÒÞ§„ «±ÿR$&Ïðô;È R“Ú½¶…áâQ<Þ È9ÊAO¢öDjDJ”–&Мk-Ñ ^.©5*]Ü#ÆžŽb/5–VôÐæO,HËqÛÕ¦É%ÆãXœu‚U'löÎÎg‰îá_e±þ\”‹Ï]±ퟓo ïœóuôÔŠP e{“Ы‘åÂIË„Ÿ9Eî’N_@õ´‡²ÂÒóÈò é®YôЯ‚xw—IÔ bÕ¹çÝ‘c¼ jRˆ/¼öG—Ƚc-1}Yœaé ªøÈd-è…#çŠ,ú(©±ÉøMŠîC{ouä§²m^kÍí #Ȉ‘q/à5-äX°ô$OpLø?(qÀÁ©îé£Éäb‰\~]}6ÒC|é5||Æ¶ß ìˆ ÑÉ=î­ÔÆA\$í¹Â½‡EGqEpT È"æ^5°=æ;œk„Goðq ¥`¹žµ(V@¯ ûöâ‹?ƒÛ»s JC®Ÿ9öÆŒOÞ5Jæ0™¾7¦23Œñ|;z€ÜüÏ?£†øT•‹_ø£äÜ?.ü½ß|ßøúçƒøw¯!©áU€Qÿ%üu»Ô%ºˆ(bï#íÏš`ÓöªŠ¹-‡dÑÞ-A©=ûšó_å°Íoþ½/ À/þê+]Ã̘1cÆŒ³`ÆŒ3f̘1cÆŒ3ùÿƒ·:ërôFç6;]–½Ð%j”'“™_´&8ëÑ¢©0™À! íØ‘T‰—Î#þ%pÒ£gXw‰û9"§À’°^u•PqðÖqˆp=Á»¤Òí‘d˜Ö“ª1Ó!ðƒYµ«nÒD¢œ'Ò‹_Æ­À›/Á]8Øm)q®4K¾à/Âù¿ñÔö2noþºöc%÷P6X¹ÅýØ€íQ} ÝÛ˜¯¡táºÃþ +Z]´©šé)à›n_!÷çžÁ†+ÊÍ˰ ù¹zì‰ ^ª‘h•ä®qÿSìçèTŠ¡‡Õé×°XCªµpðÊYl±å†´ða{‚4ϵ} ¼¯"†ÒÅ“FŒúÙî­C~¨®•­n² õdZ{—)Ü;âI bêöÚ¾yô FÎCxqûÍ*VIµÊ„פp!{Mºõ {¢.°H½/ <ÔÑ…»Qé¬cÑYQ–!……U×uuB‹,WGž9^<ê¡!,©I޳ËÎQe™¡–°Z7ÁâþjDð”cI6¤Ô±©m|æÈs§È³Ÿ á@¾E½ŠùbR6ê£G÷}JnÁïöÈîeÊâô||Œï^Á÷û¨ïîUÈqˆxoÔÉ#šÏë9„˜ I†,9ˆœÿ¢?†xBËENðnÿdR$EÁoÎÿæXü‹òÅí<ˆö‚¾WŠÞ³ü@‹V8~•hKJT"E¡³ ÿGã¦!BJL%LHDÛ×2"&H!“ #È‘G@ŠçBÚã\€/¡ œæ’<Ɔ·`… ÛÇ ­‰5Šo ¶`÷0w¸$D«`ŽýŸ1ãÓú|¤( AÑövö*®+Ä–ˆo(ùUØßàÙChZm8\ÿöOâî(pþãc¼ û×¾ Ào|ýó¨Ä\Ù’Š9ò˜#Hªt]"%Å&‘$Ó£AÜ)¹s„ÔEšQ+!Î~ýMiÄ¿ê¤/-IÊ"üæ×¿À/ýÚ,˜1cÆŒ-fÀŒ3f̘1cÆŒ? fÒÿƒE[Œk„xßARa?:·;gÕòWVK9$™W¶K±m˜µ}ªÚ¸ŸÃAªSºÙq]AJÔUM‚'Aà GOÖx†è| ºV•쿵É]E^sÀeAä‹wº aRB’㩹–SŸ*艡—Š÷ŠÝeôÆ„Él bn,à FF¶(†!t}ÂW_£“¯Ù¯P{sAÆ ºHølx¾…ñ¯ðîd i‹ù7±4¢²ÂË>~·.$S© : ²“Æ[oaû߃~íwøí5l v¿ûdq˜ñ"Õ]}äd'yuÿùÏI«Sd}‰,/!áºÂ¥C0„Êú+´{„§kH{Dö‡EZo¤}WWv-þU?êKõßpiD ¢àbA æp[G‰î* Óíd4÷꤮N09”ð–„o•èÝ(þÆ›øíÿm´Í°¯íµ6%ö‰ÕD‚TÛgmȲÖuGð>tQG~PÁ°"¨9r6 Ï%Ä”råø Ñ{LüO -ûß áuáZ'WœfÁ·J~ãÛ¸Ÿo~›eV®n°œa!­,»°ËŽ¡,k ºÔ”É…ñê1ãùK DW`wäÝË”ÛÆS¶‚ÕòIŒ^QÃSád7Fu ^…­LCÉ‚ ŽÞ>¢œ¼„×c‰o(»Wàî¡U^ÞѳòÌËŸEôØ ÆïÁöO]Áö„Á\Ûc IDAT(¦µß‘ŠÉ©‚™½â7ú×"~¿?…Ý¿º‚EI"‡´‰÷ãjZ§jÍ”¸^‰—¨AßáëKtùšÆœ—OÑ`ñto!šq4Ž«UM¥r ÑHÒØÝ#}ã(&™¤O”Høñ~myT²c(y´¥HAÖ½äâù ß¿HÁ6Ô9K \-ÄKR)}½Ö䈤šDbø˜q¿E‹cý€ôTÏ1V }8L}–;|¸F¶×ø~ƒì|7ALj‰Á2!ôòz‘š*ñ/­òÉÑõËt©³ `ÆŒOŽEdNˆÄ²D*Óõ5,þ?»ŽÏ§ã5\¿„_oâ3D‘ø 6D“1n~çk!$¬G8û¹?ýÈ/ïÄ›‡XXÁ¬ùcf̹ŠÒ„¤ZË9ø'a˜Ç3‘øÌŽÖ”%³( Dõ?!Èÿ”Z•Ì +eJ& ÁsáWñyÜáW~ë¥f̘1cÆfÀŒ3f̘1cÆŒøÿpP—Ùg'—,’°^DÍðlp³5†QX-…atºË^&“S¬•V!À1ç|D>I%£ü(`ZMà*h'Ð-ð´BRä9J°®aÛdw`tµ ÐRïÕy„±B€ƒ‹«éÒÒg@¾ü9lõ"úÖKØw^G7íOp• tIñ; –ëﻢÅñÑ`¼Âôd„ü6^#CFô.„º@rFÆ=¾»…r rÝ Hzï߯l #²Ýb»D¿§8o­n~• ¸dÿ×+(† L%ÐïÉ G«Ñµ «ã(ÀH,;duJ:}_~º‡ˆ^ ,QI´ØÛ"Ð$-b§~…Û.\3ÄR x‰[)5}!:_=9'ö)@ñé,<œÔX¸oÇJè;µ¾TaŠ™÷ ß›`k}ÜIjHçHr4UÖHñ‹×›ètZ c¯dµLãýþÇ_Tò_JF4ƒ8žSÄßw±à=O±•Õ8ú¡ù¡M;GWŽ~æó¤‹¿V(ýÿ‹åo#5‰"欱¸z<;zCzR]Â[`I2Ä Ï†û)”aƒu@–HÍé·2°‹×nˆR{¦ò1^â>™t][«Õ¿Š8Ú”LmFŸ„pO–E˜ëSϘñ B+eRça à® »*H~Y? u])øÝˆo€} QšµÒMõóMM\’Þ¡9Kj8ÓÍÿòUF8ÿ…O¿àïüú«Ó׿ýŸ~ Ç1×FUSnÜ+N)ïWñf‹ð‡sÃJýÝ©ä”b“ÈUê>U¤&H|–ji_-íL¨Ç´§úŒ3f̘ñ¡a̘1cÆŒ3f̘ñ}0“ÿï˜+aªc†Ý>HþËSeŸ«;§G®7N1ç™3%)ôÐégåÕ‰Ùˆþc²£ºpšûSªÛUX ­;Põ¨Ý,ßÍå ‚Ý…j®û¢éâõÝ©“é«C; b©ß5.ú"¡Ÿùëh÷5rNèoc×ׄ›×Ó¡Þ´Y”,€pŠß8úö¿Â.oFd|ÁÇ[¬_AY!ž"¤``;à6Dº€¼S$ט 6:Œ‚ïÆ„‚¸âªáfm|ypÖ”}DË»Uâ?+äH;¤÷Ú¿¥êOåZDµ‰&êH'H¯Èr…¬.ñÕs¸>O—Ö$†e¸²ÜÁF’¯1éq–)™” 6ŽX!ÎÆiéN½ÿ.q«K\Ä#RéÈÊamЊGÑ×½Mà)~_5É :ékì·ç*hõÛUqqtÑ®¹²îŒ!"$x'•¬5´„¤U< 7téè©ÃÃòÜ—aý„5ä+|ý-Ä_8ø,UÇqé0;Á}pº/µ-ìàÖÖ–à᪇'4ây¹ 2Y²1¾-øµb*¨ II‰õ"±@HÓø€±Ä˜[/¡ëê7ƒQPQ:7ü­·°Ýž:†}f{=o¶J_‚LÕýtéÈ äÄUaÙU’Pwd/ )áh}ŒCÔp{ ¹½Š’ ¥Äظ%²j§;÷à;Ì–xÙø¯¥šªã¸oËákW|$¶ÏBÙÄ=uÓÙäˆß‡VÏä½É؉ü÷šaµÐ|Šr ²pè †K†ñ^^Ãíc oÁøÏǵPZ €¼ï9¼/ª˜FN ú é{õŽr- ý'Bpï ¦¡è“.É!ÆøúMgxʰ¾ˆéWç³$ÐÅ3@“# Å=t dÑ¢ø“ ˆˆ”2 –ñaƒh´¦‹ Û—˜o†*\*!“C€Ëdþ‡:ÕëqŒ¢¢ÈApÌýûñmöY0cÆ'Á5×ùØCôéÙ½à¤xFm†ÄF”™ö‚ä˜'ÚäÉF=°²ö6•è‘Qð!ÁN¸ùŸàüç?ý"€†_øÇßæwþÁ—Iª$d*IPª›¿ä‚ ò^D=î¨*`AüÓ2}„’ú³wM¡MlPÿ-• ‰±Àù'û³üÝßøÞGÕ3f̘1ãG³`ÆŒ3f̘1cÆŒ)ZD»‹]¥û^¿-l÷ÎçžM¬—ÂÙ*Ö9‹Á˜.µ…M!gÌAÞt)Äz´ïéx4§£TGdT]v¯aVÒh¤qõ½Y#ݳ•¼Ë5Ϙ¢JˆʲCj†¸¹×c€§‹‡…J²+í£Qvo¢‹sd÷ND¦.ÜàU b•0žlF@DKû­SÒÝü1–"qTD Þgd_K Gô˜#5À"‚ GY«“JQ|O¸¦‡&XPHûÑoΞ Ôß— âEï‰)8\ß‹I0‡Ù½è`¹&-PôYºî!èè*ÜË-R -Á{Ô”BA{ܶXÞâC|òpΉ ¦º¸0Õ…<ȼ%ÈÊ3óœ^ ÒáÃ@wý“-žÂ…¸Zï¹J”ê°K½#=‘,Ð…(A:¢t FýîTcy3“s«bmÂËg‘“ŸB»¯€.ñnƒŸ'¸½†ÍucÔ8Kø[ç_ixSpoîac¸iÛØÐvûÂÙ+ñ¨"œ-`•I•J32–ˆø§SR{ ‡Èqwz Ò~ÕG½ó–ˆacpÕŽ¨6‚ŒtNKíK â»Þ~Y²vä¤ ç ç+ÒÙ)-ñ< ÛkìzçW3уˆßÉ¡ïâXn‘ð ;ÁñRYÓâøn„ÛWÈýt!ßà7ßÁ6d9ê̇ÞÝ=æGLŒÑA"é"N":¥‹†;^*aüd¬´ÁÓÊBL)‰ ƒUAVŽtÆw°»?ÁËé l‡Ý¾ 7ï`CÁÇš]jÇOûáá¨3mpÖ!Ÿýd½Dvÿ ¹±‰PùDÔ£÷û_HýÚ5ñw÷mòâAü|ÿRDù“BøÕU7mY¦xõ'øòéN ¦È˜ ªÑ|‹Ø-š7xÙ#¾ƒ½Ä4A3”è’ØàȨ1ljГâ1ÏUØÒF`”Ç e,B&JäH»²:›ÇsT%ÞoïÆý'àÞ̘ñ#Ž ÿësRc«$¿E)&9ØaLs-dڙâ~¶95ôTàìéã3­ßm°›ŒÓÃÍÿøµx^iââçÿ裿ø?ÿ_ €ßüúîUF ¯céÍù/9—{e’¦x:Ôò¡âkOŒ:ÏVÑ€›¾ö˜—µ•â³r½w)%~ëï‘¿õß¾ô‘¶ÉŒ3fÌøÑÃ,˜1cÆŒ3f̘1ã)˜ÿ¢6fMÚ&xÐRÂ%¼ÝÃfïìGØáú¿Û9]§Ká¹KeÙ }DÆn€!ÉÆ—¢=NÍq–$´IÌvjaV°]ÄÑû-ž7X‚i©¤¦4Þ«Q¬äNy»Ðñ{”þp»‡» E¥ÓJVB¸sÚ «Šâxv¸ÊÎÑÎêb±cÉ!°ËàÕ V‰#,„R H—êmr­‹Èáø–\‰IU\SuîÖ…e'Üõmá¹ý¢GíÜHÞ'îÁm{Ødy¸j{¤;¡t¨^lüŠXÁ®jYwµMœdYo‘t i‰¤=Þ•hŸÏz i+<Þ-) óœ¯g>ë/€¯awƒûKˆ¿Œ§ 2pEú%²<Áé‘q@¶|·ë1BxÐ,@_Éë^`Ñ!}‚®k–è´b2ì JŽXZÚG{ð–žÇ§®#^_½º¹¶qüµýÇÓTÛ¶25­À1Á“ÐÃÑÚgÊXû¦*¢ÎèJ§ŠªÓ÷At7!Gs×Iâ¸Ã²ºZ"ÖJ%AŠ  ð!î™:¨I|ŸkG©çGç!ªX\.ч?Žœ|‘3ðl¿úl¸Ã‡CŸÆ$¾G ‡ž¤uU ñ^®¹Èé¾1xç-|ø}X¬£”Æí5l *9Û¢ûº÷±èÅ‘šÆP»_½×_´´ŒïCþß?-±FüWrg%Èé ¬²Á·p÷2¾yaCF¶[|[`—’¢]䉒?,̧ˆ|Ùܼ…ï;|oÜ€ŸL Ðñê}îûÞctóÏb–Øå¸—(SÒc{!ѹW'èâï/q=‹Äéè:blÉc‡§+¤»†á Æ-F†1ÊŒxÑ蹺x[ô)T!@ÿd²ÇxKÄû5ñ¥I$AUœÖ6µ6=É ‡Ïiõ‘ÚóÒ3…ç^D.¾„è°…Í·P}/+bÑâØëßýééùtñþÁ‡Ð8îU¤Ðê̇#⡘áfUä©t)…ãÁ0¥~Jx·¨ÍR XÝG×%ú¾CE¢©F © )é»ÎuÆŒ3fÌø 1 f̘1cÆŒ3fÌx3ùÿ!C˜bá›`ØÁ[ׯÝÎ9[ }'lvÎÕÆ¸M˜‚ÞBÞtûHk xôT0íbâØH5´Úì˜kmÐÚu1³Õ=m¤«S’‹V‡“T‚TJêv5¥@Û9EtéD I[h¦.” S¸÷µ7—=^k}J¶=Þ•«Ri³BuIXç;‚=§ÖmÝÇ¢¸tÀt…ø t+¤[ ]-”*.@ä^ˆ3ñ©k>¹zu!Èé3ÈÉWÑîÇ!+¢·ØÂ±³”m¤t+ää³°ü,bK|‹ô¯â¼ºëJ®ÿ…Á ´× ðKX¬¡;Eú5®í-Jä¶Ù´ SÅ©º·Zš¢:÷ñ± QŽbÝ[J… ¤ÖW8D¼7öÝ+ùßYmæˆRÉ\ì$ ’Þ ¥Ô„‹E§¡;9ŽŽoηê,–ÊA€Lɱ°ÏJÎÆb„>;štªMÑý: ßèÿ^ÉWG–‚ž>‹¬í¿²D} ËÉ[¸ù²u¼×§"iÎý±Š4êØ ÔïÛÁ²ÃÎq º z…›G]ö}scêAøÒÐz+Õ¥D‘ö qwÞS»µ³«}ö˜ØyædõYHkèî ¼w¯#›+|;ÁöÎÿ"Q÷¹ÈùÿX&”‚¸Áuƾýobß›-¹ÊÇO,ûSùت¦ø.ÊG”Mí¼¥«¢‰©¨s¤t)°^¡Ë°|÷KTÎâ9¡Z£ù 4£ºÃ} ÖAýMÙ„V,WAרÑOK¤Š‰‹L%þ£ïzHi(æö…ï¤ZÀâŠç˜sÇ—™KÌMàÔîj‘Ð4(SÍê3füphÏÁéûcòŸ{"±§‰D"¥JR}øKÿ¸ávVzÛa›»¥=ÿýðœH5…èì 9ÿiùW]ƒï1Ya7øÝÛÈÞ£"M;¿z—ø›èâ?øý¸‘>:ü⯾À¯ýÒ hJ¤.E$¿E™/+åf˜y-¹SÈ@òA˜E 0Q¥DjÙ’%—‰ü94…Ø@Ï6'%Ä~÷~wçoþ£o~,m3cÆŒ3þòc̘1cÆŒ3f̘ÁLúT’€ÊÉ`ÎÉJxþòà4\‹'Kád),ûxõ©ñg˜«k±&g‹G €¶þ91¾G|Ïñ¤1Á’è’‹1Þ cçˆfÄ7ø(èZ`™±nÄA—áXÆqßáå±k||†k|Ü…{ª‹¶Vݽ³•¨C*¤ŽdÁ²‡<éÍý߈Ã(}ˆ…Høävc[E‚pŒ7+·² ^µÖ-¯—îArYu”Nì§“ÿ ©è)bO™D„uô@>·Åc?"ª«AžXow¤Ö"IˆtAŠO®ÿsD3èñ›h_¯©’V8J´”á¾ÈÀ§¾áS4öt5À»ÝI¢œÅ} #r‰wçÈòuG×ðÓ/£úyd±kÊÒ³ ²p1è-ÜÙk‡…¢KÅû%Ò]à‹gþAD³Ë §CÄÛã厤qÞÁÆkðRª˜btؼ­^ÆY ²€|‹m_†ímukqÍeGä¿!Tòé°¬u仨S—pº£Q_˜ÑÐ}xÂQ·ötÂý_K,ëUtQKF4£ýnöÙY»F õ$UèÑ:Iô{Å«€¡ž_ŸðÅ%ªÏ¢r)"UŸÃúgÐÅ«”4D¢AÒšÀQÝîí[-uŽúu;¦9¾7Ä"’=ÔÕ™=I)‘ UØ@ñ Áq\,Èb=â{ŒiŒ¸4V¿².ï‘ߎq$Z‘¥ çÈùWÑîKˆ)°Át‰ëÆÇø|+ø^¡Õˆ6©óQù4! Ås§õ£§’;CÆ‚t9-пS|ìa¡unú„Ê~ôj¨åY\Sˆ_†éêxW“;º*êé éÁ—=²8AV—˜<$É%‘PÒÇ>- B_©N³iÄuÉ!¾ðÁ⸈j2! (R;‚à7¢$Gß û,\ïƒÀ?;ÕR¦©8lv1ßž®ã9*Ƚøÿæþ?ÖðÄ{³`Æ ž&úóŒƒ&Ö‚)gš·mNî‹+ë>ÚYxN’¤~Þ‹O±÷Nó]ó³7v:æÝDM#:EÒs$}´[áéyX=€þø¨¥õ¹ô”f8þéÓ*øúo¾Î?ý»ŸCUI*mŸ¿Ì(T©%LâS¥Yü«õó‘ŸRŠû7f2™R îñž»SÌ"µ%gJ1º®£ë;Rû¦6öïüƒ/O% f̘1cÆŒ³`ÆŒ3f̘1cÆg|y‹C}ž)eЬðT°¼Cò€Œ[|¸‰×~ »„ä¿Õ˜ðÆÑ7·±‚t]u¢×Åà8‘pµZáÿNĵ¤Æ¸K%–‚µóƼÒÈþÉZVÉÖñO;/°ÒeõÕ²ßï)+ê>Zlü1x¼˜}Ô¾“Ê¢‘¡¥ bLµÊ¡mÞÕ'jZ€ODg{ó H„ýúø½JŒWrY«ÍÎÚúõS±ß‹ƒlMèn˜”RIì‚×nÁñ”ðåªQNˆ Z“Ò9¾<}×»äl'+dÑCRDWh÷¼{×g9GX¢’‚ ב"·øj ÖMq¿ìw¸I8zoãúûøê°Äw×põ*~S#ï³EÎËáÂîÝ'¨á déÈätœžFJøö¿ÝãZÀ]Qs:üÐ'åþ~'Òß<"‹a}¯ù UaÕÇwÛQ¹Ý9 SNVõËk ä\ÇS¯‚J;^­X8¬)á¬öšÜa¥žZ•¼?ôí¦W‘£“ªcË+9îýtðxMià®Ó¾B´BóMìb †v ¯ÂJࢼÀc3Žc‡ñ÷d›ÞCc–ê&±³:E/ éÙØd\"¶{¯ñ½ÀN`/SìÝZ…E\ŠÄ±ç x‰zФ§Ÿ“˜ÃXÑ“Œ|þ9äìE¸}ûÞ›Øc?¤ |"áÒNˆ,%EÜ¿8ž¬h‚ôiÒKz–§xúpJÔûHuŽÄ:ð ˆÖiÓ(eÜâåÒ§ $dÿfMÏÄXÎB b¿¸0Z¤et½ Oì° uÎj©dsÌaÈB1Xt‡ò9vDü§*0kÏå6[øÓÈP˜…3þrà)ýûI™’S‰ü§m÷ä88J¸™píuí3_Ì‹á ·ƒìÞ9Ôg‚ÇǸxÿ)±ñrØñI”y¸©Ÿ¯Z­§ªJ3«Ïéöt‘£ÏOžËïõ7Ó§AðwþÉ«üÿÉSJ™þˆç¸âÏ,sÃÌ&Gÿ” ë¶",èéBWUU9r|È­Íëä1O¿¯ªô]"¥ØÞ§¿âüöö%~á¿ùöÇÒ.3f̘1ã//fÀŒ3f̘1cÆŒ3>r8PJÄ9Á’F<±û±’ºz¨S ðèÖxã±1g½^|˜H8¹ÁÑÖVý]õçáÀüY¼ .t(cqÆ[XªS²¡»ŒŒ·¸ •;TОTn(û;|›a2R†Ù—JÀ‚›â9> Öæá ´ØAå±› ¸:†%I¸ïÅÔøK¯i>‘€m½×›…׈‹ÔºïDd¬k8[-&ÉG‘ìÊx#ÿ«#ö]¤ÿ^½­ }U ¢¹x8É òÖëò´;ꆗŒ0Ñö$ |êÎd£{6€ۀåRëãŽï¶}O/p8ùißê¡FƒÝ¾z ëxîr‹å·a¸¡àôÕfÁÒYØu½ºé©ä¸œ-‘Ëg‘Õ3q_“#r‚§Ï`þ]zH°îK7j$ɣǖ ëö#ä %ãƒã–a|Ò#ðçt7ÂV`§QÃÜÚ=ä0pš"Âý@Ê·úÀ GΖè3/"ç_„î|‡ì^ÆÒK`wØ(ø}S½/­|GÖ85 ¾ºà½ ?´ºà[ë×Û—pNB× ›,l³0n# dÑEÿ¸Ù;jÎù:Æ’!ª ¶â^É×ð_ƒí;ø¾L%-&‘Lc<õI¢ý¨o»á]… ÞÒ &SüÑ>$r¢}c{©ä?½ÃÚÐ¥Á¢ÔxyðQñ}Bvàƒ!“Ø ÎÇ¿ïðj“Û}bÇ!€%°%^:Ü5æ¥Q#b….JˆÊÁY*„X¨ŒÈYFŸ]…Pèí=¶mâ‰'ÎÌH<”daxâ,©%Z\í;¼[`º¦—°ëc\ŠU1SïêõØ| ¶@½n›N@zŒ·#A&;R´>K˜úp)ÂàP,Hÿ±¶éÙ‰0áfïä\š±/Áí­úlöγU$è8‘²s˜ÞýP:¼²=))‡¶šE3>•8"ãïMIMÔ¾®ö??ü;ÍÑ~40Úg©©ŒOi;òäN›pÓD§ç§oóäæTòÿ)ã.’<üðnškÒõyé»Êø]´;Çå÷=–_Áïáƒ×ô vL¹w쟦RÃ~ ”øÌÖu]]k;zøœ ñ©I !”ŠŸ‰„b¿ë uŠŒDwÌìÞ¼ªZËÔ÷J±{}RDøïåÇ(¥LB…3f̘1ã/ŠY0cÆŒ3f̘1cÆŒRWÄT‚‹¢‹zÆfT§"œ.…ÍÞÙî“e”3¬Âç*w{g#à™óˆ³ïZtù1a_{V‰K+ˆÅb\'NçÂ8¸:Ë/¼|÷=i‘ðý²1l'0:¥áéEðâQ" Ö#P%!íxq×+¡+Ê¢î®ÕJ\ ­ÑÐ$G“Ób¤qATùdywkD¬¿n‡Fˆ¨î8'/6¹˜K¸¤ jµE›×sÅÝVQ&¶9jº)V8ú–,=½DξJZ}Òµ¬ëp’ï^B·†w #“K1ÅÃ?Eà?á‚—#¼$ÃH¿q IDATªØB&¼Hb¬Rˆ ƒÛ½³FèÔÙfH.œQS=Ìb¼í¹¾ÂôOñÓ!Ê)ø¿}®ßÆwY§ñ'uè'Á¹('€‘9­ÈÔt÷¶—£÷éÓ½#kCÏ r!Èéy”((¿Û`×§öç¡5MœñnÀDTMÿ;"vŠ »l|•’NAÖ¸lpÞ‚ýmA(îµd¤ ˆ:"Ó8/cö™ýê߀qÄÇ;#&”£›H®‚,2ržáÒ}“·Á…pÅ>KNíyA#Ódjf’R¤ÍÛ ©ŠlR‡HcWúxùyˆ˜Hˆßâ%ÇÌÁ{È=”.ÒöŽŒ¯Ù“aì"¢TA†M]¡%%¡ˆp³ƒmvž½¤"ˆ ¸º‹”œžI¬za;8»ÁI*ìGg?8fʲ–ݨÁ÷4_Få½êÃŽEM3 f|p/Q(þyWÏuž˜èŸò>ˆbßÓ3€*ø¬%vž"€k%XZ)˜HXòiZ—'yïySÏ\¶R…„!ø¬BÈ"!*¿Þ"Ý¿!ŸßÁâÊn_ë|åm¼·Ì7¶?-¥~ùŸ¾Æ?þ…gëwBê˜Ú‘)Ú?ŸŸUMq#[9€®ë¢$@}†ª**Q¦ETФ¤®‹ù´& ŒC¦h|s©"ºmˆçyuÆŒ3f|øü56cÆŒ3f̘1cƇ‡9þÿ㈤;9I1fGU¸Ý9o>¶p*®Â©Øwð™Ke7:þØB@P£©µrh±.*LqÞÍíku5Õ­F㇭WÿöÞ¼ë’ì:óúí}"î½ïYYURI¶dÙ²d·±- ù| =.zݘ¦ÍçÀ ¸»Ø´mÜÀðZüÏbñGcC^ž$—ªTR9½Ã½qÎÞü±Ï‰ï›YƒdI™•OÕÍ;ÅéŒïyžýl^Â^¹(Sœ[ÉÆ48: ÈáíÈ=)6(>%ÌÛ*¬T2;áÕ\ëïœÃ¹Ec-ƒakð#ù/ÐyäöV wT㥫ÙI,&[X¢»{äˆÏñìF}¹ÉëºrDï¹¥ é 9Sd²í)ܰ랣º—ùÑ?ɺd[HWGNýüÏ‘¶?K¾ú#üòÿ…ƒ×èêcT7ÅaÌøx ãc‡Aª‘@w•\­‘ò” ÿí’R#å>]ÂtˆˆäÊ?ÏFmmþ‰ ¼=]4¢±;A.'ß¡l"ÞÁ8Âá Ÿ¦-ôé!ÆëH: – \âÓ÷À/A OèNÐt†HW™µ ÆÈW/ç@Í.-Ïø$Ý!u¹¿@6çÐ_„UøT½—#‰à0 Œ|´ô ̾U.Ë"¬']i úÏ¡é¤ HF9`›—aût%¢ 9k—MkŽ~¼¿stW" ¾ lT|Ÿ(&L£0ÂX@ûÄÙ‰0™íH¼kZDÁGA’â2Âô=üòÒo‚p>ìñ}AÄ$!š@ŽõZŽÄ÷‡âÙróroˆæpihé+Ð*ØrW‘ϹóUàø5\} å-¼¬.’›Ó@;žß8?¹uÏ*2ÊUüqy@ÒŸ‘Ï®þÉ{üò»øõ5ž·‘ÿÚìü+Ë[9ý›ù§AŠ!ù1^¦ÅúËi¢¼%éèk_@îÿ{ø'Øû#ö@þÿt΢./!m¬¨ýµè5„žÂQ!:ñ¾¯õg G,>'ǽô êÅÀŠí§p×&©ŠVZŸ%˜EÇÛ‰„®L£íïGãƒ+ØíàÎi%ò;è»p3¦pÔ˜rìkÊAþ§ª‰`ag˜‚ìïR¸ðhèAsÜŒ“M\k´@ãÖVÂjÅs‰(ÎßÏÿ<åsnŽ3n×u¯ÎKD¡Zí·1°'„vµ“ëµgŸÇœÆõÇ©·É[ EŽsÛå‰Ím¯¶E¯¿i¢IA#•OyW—:°Œ2~íøAã|LÂY,÷ƒ·íö÷Õó*øÕßþ€ßøë¯ân´²í:¥ï;"%Y¤RM›ÓªDR%ué(æå(èûŽívC—ŽÏû‰´MŒÙ\†¬„+@R¥ßôüÎßÿ*í¿þ‹gpWV¬X±bÅ‹†U°bÅŠ+V¬X±bÅŠg†Ùª¿®9¶ÀÜb0§OAf˜C.±¹IÂËçJ±à²öƒ“4œæ|Ææ·¢´êAùYÛ:ª«Ó'Äbm'‚,±ÑPs„¢aÛš3dw2a£½éT2¯š Ž:ä¿]ÿëÂjU¨×<ÓŽwÁ#I]4¦#Îi“MŠˆÓ”b/îH)x)ȘÃ~ŒÜ£47 ¢)ŒêoÄÑ—ùÒk°ûþø{ø;ðËã½ vG˜Oö6ùÿÔEá'ÉáÈËþãbéœ9 ΋Á(ˆf<]C÷Ñ E’ MgAKµf÷óV ö><ÄWø±‰ÙyÁÛ"x=Ö¼D+¹[}˜jùL9äˆ4Ÿ jÒlI† Ø¿…lïã$Èä=tïiø”ØŸ€¡˜oèt…+µ`+ë>9Ø>×-ÒŸã»Øn¡ƒÁ0£æ'¢¿§¹×®·1sËÔ iˆTCJ%MšŠÂçÈèĬ°pŽQðŽœgäŽ"çw «QðW >qØ'†¬ä1ˆÍÖÙuʉ aœ¼VÅ #\*y2I šW$d…ëU³|ÒH5q›ÐøDé+–7§nüQ¿i÷¯q2 Ò9º¹sN¾Žú×¶¸ŒøIO¹s —÷‘>"3gK…ÅÓSÙlø««O±#†—GÈõ5–JA†Œï»èƒÐ ª[(wA,ë‡î‰òÁå£H:ÐUòé)×€³¹÷ó¤î§ÉÿÄßúCÊ» z¼K‹´ Ï)Zw+J¸éǤ%¥ …øG¼àž™¢Ýˆ‡ˆ«lpϱO)¡róÚ‡TÅ“{mË(î]ZjŠ*ÁÔÒW4‘Y½9ÃãÁy|h'a,ÂÅ>\pNk_oõzŠÁ~tŠÁù‰pºN6ñ,Dº1G1ÇX›ª‹ø”ë,Çž½ecYVŸÙ~|ÅŠçµîÏ}éB¸›}îÍßÞzýDµ¾©s'ÒêXŒ™âÉ"»Ïέ…¨Sˆû)ÍâL; /õ8ÿm:¾8œT‡¥kÍbl’㹿óú¿Fj£:^zvä‘”CÓ”ã|›ê4àÖUþ0ZõóžÀÝ™¦ "5 ¿#¥DJJ¿i[Éñßú4w˜¶ŸúœRú¾CU)¥°Ü‹@8hÂÝ)fX‰qAªÁÚŸ®X±bÅŠVÀŠ+V¬X±bÅŠÏ,ýoßxÖ§ð™Æ2êU¶‰”g» ù§âL…Ù¶|£BßÁK]D5^œì±½J[ô¬«¶Ëè©&4¨ålÙªAÁ}¸t³ Rk*NvAEIHD^W‚äz†6û›’¶BJÕ ÿía2“£ó’ô¼HqI‚ìO Õ€ÎÑd'ȶƒÝéO ÛÅÉV?u/2`ØãÃÕ §Äýª<.Zo°ø,xà,!¯ütûu²þKäÑcüjyn•$„[‹Ì|4©ÜVGU vòÝ?Fvß„«!D9Å5·²È‚[Á<ÒƒeÊö€Û]Ð ÕÀëV®P{ˆà×÷ñaƒU‡9 /Žõ†º9Zo†«#zŠLwC@Ĉ¡¤—¡¿ƒwð–wýæŽ>ü8s™JˆŠáƒ1T†)Ú¬ƒMÄNŽr¡ CâqLA²€]ÂÊ;VÏ(Òá~€2Bµ„v´ìx—zï«øCZi‹ô7»rº ÿM) ãb¹M'l:!—HŸ“œnãêŠÅµ5ÛǸ:ŒÎÕÞÙôp²ß' G€VQµU¥[…ºŠV<XæT‡c»kñŸ=±¿øgî—éc°fä4;à4¶- LBNÎpéiÂ/"õKÌåÔ/ºÀ$xÏ’k_KØùWâ¹Eè/ûr§Í«–¬t8a Epõ9›’›ÌsU™ê¼BãZD« ê‡Ô¤o»­=O‚€ÿìwîðåM*Š€èÑÞ?„špWÚgÞÒ°(¨þRìh÷_¿O]ªbAsa°1ÆnsÆqš\+V¬X±bÅ_«`ÅŠ+V¬X±bÅgÿ× ÿ×Eëg‡å"™ê1úHˆÕ»M¦w§°'ÎΪIãýù‰ÌÖÅð~R8FÓÔ­fQ5ZY´’î½#5 _{ak Õ®Ù'j¤—²MJŸ„ÔGÎNu,1^<ÈÒLM3ÐNbq>õ9¢ò«Ý'±(œŒ‚ì½I{,ˆÉÛm¥Ý×%–bUÚK‚+ÈÄèVûEð¸8X®¤i2Hí3ˆáÙð«òÙœcé´ÃÜPÑ|ñᮡÚh{a&~¥V8Úó.Ïy>÷ºVî•8®×Ò䑚 ¢ì[„9ì˜úq碈ՅõÞ«+¼Âý)¢;«áµí^="Øëa&Ð6ßr•ؾt‚wõ<šx¢Ôòñ.¨Ç²û°>­•k= EðÉ«GØö›8éï€øþÛøå{Ø>ãcu»Yó7Òa®õÜëùJGÔã;w‘óŸG7‘ðœoÙ½zAwxŸ´¸^­@’ §[aÓK´Q$iÉU+1Ù>3é5zDMÖÏÌŽMª‚€tëþGJ-ŸzQ’ê=ý$"#y ÉQ—CFN¦桸Jp5ÁXP\í7ËFæ"z²Ü)Q;Ž–T:WáBi÷›ÄNQÁUÖÿO#ÿÛ1 ÝQœõQÑû*ÑÖ®œòÎ_ ›7‘ý‘ÿ©ƒ¾1Çó6¾62{Aj??’?@' NAâ+Ðéþ òyç ¼ ²‰ŠŸ¶aýŸ¨B³Ê°Ù@aø%^`SuBQDiŽ!Þ>­äè „®îÞÎïDÚšM)k^¹+˜&áôcDõsv™ÇH‘¨ ‡ÑÉVSàÔÌ£Â88¢1þmª(¯m!$ÐZ‡Z=ùéÊŠ?Ürñ8>û‡¿ÿ€/\¢æ.A$&ªÎ15Rc,F(QÇ{GO òR‡¾ö8ý* žÁîuð·Ã±i™jÙøœH%úvŠÀ@›œªA$Ç>½yî:÷gq¹©f¬^oŠÍcH‰{'Éc‚M¸ÐÕVý#ppY ž1À?ø½‡ü7íZoæfM;ˆ&EEëT"ˆýÖÿ B)MÄ¿-¹0‰ Õ¥ÝA³ø{§ýí©) #•„QB;fNÉOÌV¬X±bÅŠ«`ÅŠ+V¬X±bÅg÷ÿÙ7æ¨÷cþå玨ø,Á¨$ý3¡øÑÀ,Ò ·T*‘ï¸s¯y‰åæð Ò¬1½±ÿÜ¸Ø l6ÀÆñ øn‹l{z¥F×Oøh‚¸Ð»Ð#˜(âºÈ×ìP Á² ~L¡ê jDªèàý_³@€ß'=rrF:}Û¾Šë+ˆÞ¶$ [iI%]áz†tÛjÝÿ·¡…¯F¤´KÔIð¬Ø#ÿýGÈö›øuëºh|Bq2VJ½IYR]èOr¼¾eà‡’ÿÇ2m ©Ñ†#”ïÂõØlƒœ<\á—#v•ðQñ)ŽͨÖìv JÓ"Ð ²=‡ôIî…ņmñôºÓ—Гûø×å7wÀ¦‡.)•=~ÑlýÝ+q¿ TËt£’2‘§>‚°-Õ~YuÝŠ!9‡#ˆDâSO¡.z 2‹Ü« ¦ 𣠆\<À^~º×¢¢ë_`û¿~¦•Ó‘OÆžŠDtéLNT1D©‘‡­_©Bˆù^´ëmî|ÄášàãN¨Ôî öÀd¸f( &9æcyž¬ÿ—ãljڗ^E@^ùµ¤púJĽ‰ï Þ_#ÝC$m(¢ˆ*' ›æP€ ciPüä+¼ðRŽî$-ªxn»ÇÎ7td1æõX’pÒ‡(`?‘ï“ »wO„bÎwß7Æìôp÷TæL®œ«CQg;ád­l· Gë!ÜwN·Â0Æv'›J6ΰzKŸ£b^ñÅSÉ?¾¿Aüß"ýoü¶þ=Ð&¤sý^tJ‡,ˆsšÐÅÑÞñ-èK/#'¿€ö? ²ÅÓ5å<ÁÕ\=ªó¿ܰä 8ñ˜ÿ%A ØhÇ>Ù=„]I`ô‚ôõ¬L£ï$ÄhM „닯YŠ×ñ¡}VCï8l%®Bqë’Žóëšày47€ÿùï}…b†ŠÐoz¤ €œ3ã0QÌHIQU¬D]HIç¿+K)  MJ—¹”ˆî·˜Cf)trü»Gªã‹j¸­X±bÅŠ? ¬€+V¬X±bÅŠŸ4âÿvô¬äÿ³„T´-we›×,!x5º]’úùÈ—y8cmwAÞ`xꢜ9Ãä”äì|cè‰àgwÓ×ÐÍKˆ;bñëw¡\¢9ˆZ3Á§ ‹]ª]»jºèÉýÁÙvÂIOÄW^.&WuÀL–¦ˆ¾’NÞÑ­ÂÉv÷°Í«8Ÿ§ãpB„ˆIå©&RÚaÒc"P2’sXÖç)ò¼F¶€ dûÈÏÞðÑA§X(.Ý1´S#"ÉYܺyöÑm¥ÃbIáˆ@µ‡WÂõÀ‰èú¶ÿÒ+rúÓhÿ%Ìþ»x?ÐíïˆèúdP&ìÊñ=¸¥š¶>¬¥’⾌þŸíÿ—ä?7£øZ]1©÷¬ª8RKŒk5*бvMâ„?LŠ †lQ0®‘Ók´»¤è5‰xFfmC àø5^.aÚC)AðÖ{“°t÷zþ^Û ËÏo‹7n‘TÁäøl)_ðë HãÚ3ø˜ð½â¡LQwR_ëžWaÍ­CÍ|I-cñšÃRµI.P 5¡øâG h%«uI|8ÇÜõ-RN­±¸¶¶Cwä¤îeüÒA°‡‚‘ÙAŠ#¥À&£÷2rESy–úíC¹¯icèK¹ê¿¼B|ß¼‚t¶ÿþè †k|$Èš² é—eóQh¤z-ÃÇâ"€†¿ùߘ_ÿö¯þL¸h9¸;¹¦i"i"¥øëES¸‚•bU8 ¤¤¤j¿"Åâï•:—*«Óz©E¶ö§+V¬X±â‡ƒU°bÅŠ+V¬X±â…ÆÛ¿ó Ì"îiXƒ×ž´õ®NokŽÙ1¶½ßØîéûxÚ—-Ä&¢w¦“GÎñ~i'pç”îΗÑÝ×9š%?&{ÓØþ›Ëàcä`‚2¢%ÛùZ†)øÀ>)›‹…b„wÒ%ˆ÷T£)…ˆîMuáxÓ£Ý)Ú¿„ù+tÜr¥Åg­d}êpzTOÙŽxÞãÓ€OÏËܯ‚÷•H5»R¥iñXDZö-Ü$Èn ª˜æ‰[ߘ!ÕÈw=SYuÇ&³VÃ'¡ ®/°Ýc|¸òÿÚA,ìÍÏNOÑÓÏáã#äúlLÕ–¾Ã«ý{¤c  ¤†ÐÖhÕE$ôÑ!‚Z ÕìµÙÃ+Ðlpµî«xúk4[DýÆ;hìIàà±(Ÿ@Ò„ë5¤Çxÿdå''!h%ÈÿrIÉ‘ü¯`¨!¾à‚v‹Ïÿ£"É—nm»vÈ1òÛ¤¸:- ^<îe„éî} ÚH÷nÕ%¸’%Gâ¿j®Sοƒên§¸°ñ ¸|ˆMŽØ"çù²LZ½{Úù·N{N±á7·3¯¤†£÷Œôµ/Ãݯà_‡o¾ƒÝ7pC¼å ±Hñ’‘~ö'»?o·¾Kyߎ‘“·ïíR£Nºë¤/}î|†ï`ヌ½õ€tø¿(Iáñ„_+f Sšf²÷“,ø·c.ÜnÔïåyÎ"—c½ø¡“ ÕÍM ±ŸìZž9Ìÿ¬ [æúŽÜ»ìð7ÆÈÏ-¾«)Caû}JÑÍíN)²I˜ZFÈ×pxŒ.°áS>¦ª¨N ŠTÓ–ã½­âRPC„29ß÷BJÊáÚ¹œ{gá˜S œï„>)ï?6^:Iál§}*Âk÷”«ƒóxó£l0Nν³pÖÙöÇæäÀ¶Ò?I¸ LáVMR¡ï é'ˆ­XñCÆ2bùYÕEÍãÉ’ðŸ­Ûã{¯ã9N%ÚCrƒzŽÂ6‰è©‘ûV¿q;î¿8R€R°’IZEݔؿsÔ%&‡­ÃÝäÕ¯ w¾‚ëðì¾ð:L8ŽdB,z¦ðÒ)rºÅµ ‡kìqÆèbÇC…r.RÚ8sú˜6È›D ¬sE>÷K¤Ý/’û?€þÚòÆþèñ<¦øë¿ñ:¿÷k_„”}ßafURíüUѤ!–*U4%rÓm®Uç§ï:RJ³˜ÙÌìcÎhÅŠ+V¬ødX+V¬X±bÅŠ+^hÆXßtÎéVHIèSͭͧ„§ø ¡ñ~³+€FäÿÌëq,³%n¤h?Š×æ0åx¿Ù iãÈNàü%d÷%R÷Z´¢'¨ŒÝ#ùšéàäk°}D`¦$œž:»­ÎÜdêUg2'›Ðk]DΆj‰U!ìZ¨6­¢D´§ ®Ž¤Ò f§ˆmÀ»ÊhWæV:ÐS覈ÜO§$ÉÝ%ôgÐ] ÝÉãgÕ@T#‚¬’<˜mˆwå· $ëzøÔûT.ô‰w·£æôV¤s„½»"“âã Ø~/ é A’Jä7—£é Èæk ßÅӃțõ˜º»Tò?ߟ#“@Œ£z=/b!¶-–Ï×®=Çè>#êK-7‹-u‚h8CˆYDÖ†‰ R€kÐû  QCuÝ‚G:|Âl•ûH~?< !Ę#o©Çš] ÚCnÜÖ§4ˆãË–û· pšGÞq2N®aùŠâJ†qŒ4Ý&“k•îJ3ŒEî*6!Keï‘ôÇLçHå€_¾…_\Âåëe–…D$9Ľ7 1ÆBhר¢.ÛE/ëY}®.rÚÁK¿H:ý™²{/Úàí¥Žìîþéì¯RävïD»ù¨T¼íxÀIw~Ž´ý*™ ÈCü±‘/G$¥Å]úõ6½Ìõñ ÒZÝmB€¹,/j!XÜ» –îŸÜ>Ïå½»Q¯ˆþA Lj¢‘b#UTå!r±‚–=ä ÷x·…Ô#$pÇr¤,ñiÀÇ C™ýï5w÷ùßÏ-Z´õ¿â‘A$ˆyaÊÑúÅÙtŠjˆæN·ñûb¡ÁR)Ù¹ëC ‘"À,æJî±Í0†kÀ¦‡;'«w„. ›.Ž{˜j* ˜£*sµ¤µÏ+~ÔX vŸÍ„ÿmÀ,óÛß$ÿm ˆxM»ÒtÑ?¸[ÌŠÐU1ÇÄÐ©Ž©{G.îcÛ7éQÛ]a‡ïÀp‰Mu^¡@ºôÎËpúutó5êùl‹äk¸ºŽôA½×Y¯!¯~Ù½݈Œ¯#ú&š', äó†eô~íSŽïŸ•ù¬¼ã|éÐôŒšóó”àW~ý›ü/ÿàkt]½Ÿg»¥XÌ£êüª3P^8á˜;f÷Vç á@JZGwºúŸþ4ã}û\éŠ+V¬x‘° V¬X±bÅŠ+V¼°xã7êŠþM IDAT™¡FÊ%v7뢖Ê1è¹­t­ ×ÏmÑK¸YªápzÃâÿ“íðH8ϪˆZ.‘“]ïhÞ)Òï`s¤ºnb¡•-ÒbiKFÈÅ#RS„Ô)©ÒMûO }Ë}ÁÒ²+èy†øàøuª9f›-wÛEDh) ·S"‰#¨ábUË ‘s»ëñ­€l9Å7;dÓ‡•BW‚ ¯ëÔ®!hy×½|¹>®uQÚ&ƒ\"ÒmSÿzt£:à-ÇçûÐæs«[Ñ8ŠyB/%Åûz®â€ýC|8ÀhQ†&áäPÅ-xƒ¹Wn»žïmÙeô¸ÖÈ@¯ê“bìh ¾×cl»Ý(Û]Ü‹nSËÄC¬RïÒLޏTaÄ$È ‘&£Í‚€.Á¦¦›±º!ö©‘ûVEûÁgA]ßÁݳ¥<¼4¦ìœî‚ès¤ÉÙô¦ A.1‚ˆúO ‡€Æq}"ËŠ?DÛ)Mþ/&²ldb a€Ô¾piZ Üý^Üb<”ìø<9úÁcDþ5~úÒDÿÅ[ðè F"=’U'M·÷Ðîs¨ÞíÁ¶hú<¶y¶oÂ0!&°;EN¿‚n~ÙÞC4cé¹{ —ï"ÇÔ×_Ï¿Ì3Œø¨(öÀà[ÿ9ùc¸ᢞ_÷ìsÑ?o©þýøÍïó?ù2Ùœl¡t¯eêÉ?M9†èÕïî¨*]—H]‡j½ÇÞþœU©ð?þG_â?üïßú1^ÝŠ+V¬xѰ V¬X±bÅŠ+V¼øÓÿî—"Òm#ì6¶|¹¹D„[®|`ŸŽÖ¶-ªr<<í¾/yZYZn?vÙm¤eß+›ÑiµqGt&H9Èõº½k¦ï2wN44½"àV©Ï®åWã©ÂÉVH©‘%¥ÚƒéË_ÄO¿€_}ÿîØU‚R‰%‰…AwÂ~^ ï tcœ›&‚¾ƒi@JWW¥ô‚{O¬X§ E"jµ’Œ¢Ì‚ƒv[b[˜ ˜©$Ò´sȾÛ8ÒÇJ63ÈÓˆŸ ¿ŸÆÊf¤—åGAà3d‚Àí"çµTçqÇì]üáý Ôל·¢Ç5~c&ÿ½ùÝwyEÑìƒ ®O=͆UÜÐ]Fî$ÇîpÕã-l‰ñ¹.iDã«WÛáXaŸsÊKE¤8^ªâH p¿—ÙÐî!Ew æ†Úˆäk|x ‡ ì°‡ÃDt5x%èmNo@ZŒCx#1T‘>ET’Ú©â¥O¼ƒÇŠàÙœNâÞƒ`ªh§l{¥ï[Tœ& ª(ACP"¦QwÃ]ñâÈa¢\20E¼ç¸¿îŠ˜¡§y5ê©}`ø D‚âiß RÃ/ŒòÆŸ ÛoEØòem»IolëE‘KÃßü&e÷>LøE%ëÓÇ IÃ…âZ)oé¾ ×#~¡ø˜"Zs)•±*=ÚjÌ*ŠŸ¶üç3ÁÛ­¤ÎnlS›½×>MT GoÍÍÍñ 𠤄¦¥Š£Î;bÕ4¤öQn­=·}´FÚ¤U·ÊUˆvM¸¤Ð”°é•»'ÆÕ'š-æ5ªB¯ðêå¢3º©¢8Ý ÆÜè0áºbÓEj€T·uöU=]£ Ç€ÏbõóÛb’ŠuùcÀí{›üw›ß{ò—¶]›ïÓÚ¸YUÂêHç°©Ï©Î; xVd¼ ب"žØ5¥¦xÉpx9y€¥„˜á‡ öà×Ñ„Ë qB"ÏèZçRˆ”5õœèwHz•$/žUWÿ×`sïÃå¦Íõ€cã¼=QS !Zéà ÊhH£šÒ1ÕÔsPŸŸ77€%þöûþÉßzmîR§lú~^Š¥”9U–ª¢ÍÑÈŒ’ Vf1@…~ÜücÅŠ+V¬ø¬€+V¬X±bÅŠ/$.±x}ÒG4+0»z«Â¦ò`ó" ·øÊÏO|¿ ‘ªG[qúNèkd@qSÁaû=ŒsлÍlðò.2>F̓°s­ËÈû–Z¡Zä¾Â6Á¦KX²Ä_]Û¿ó5ºí×™¤‡Í}Ø?¥Â9x.HF×™€=è ÁöA[6 ç¸o`Ú€„­<Qì"Á^Ù‚˜¾q¨Æ{Ñèk©¤Î8ÞuAEŽg¹ùsY>ùMo”Q`Ô÷á8MØæË‘\“ú¥8ŽV+~"®Km› ® §Ô(¼.fjT›É(ZiúnGúÙ_DÎN?ûçäo·Üª!¿‡;Júé_@NOoý?±Mcïfû‰˕ڵ4Oý–Z  VS9 Çîµ=’3>îÉýIDªUx™` Ø0Á¡„UxMgàEfÀ1 @½æBIV#ô5ì9.àÏå'6ǨaŘFÉNêÔ š”ó ÀaÀ9Weª.'[9¿ËQ‚DzA"ݱY¸´Ô5R’LëÕ5 ", y%Ñýü¿‚ÿCüm›)šOŒÙá Ñ2¤©¦„x ©¡€'üeº¹­"¡‚pO¡ïK°D9Eý¬é&¤ºøÜh¨ýAW¸â/‰eqÎý!Ø‘YTÑ,ëæ­æ|ã;?Âàkº•&‹ ¨º®ر { ¡•/DKÑwÕöC«+ZÓ’0·ã…N8;Qºälë|§e\1ƒmæBŸj:‰!qÌGëþ{gŠŸÆesR6u_¥ÄÅ\Î{Œ\â8ç'á  '›pˆ9¦ïùì`Ö€5, ç³v/~l¸NèÆã˜Ò§9pH³ù×å¡a{_mÿU ï+ù¿5Ø*ºÙEúRý„¬Îã³Hããóü@<æ9ŒŽ_ŽbÆá‘"gR¤X´s#úžñä·±t†Ë øˆMoÃþƒHd„€²´9GY ”‚ºPüéõîiÕѤ¯"€ÉCÜäu^›ô¹˜žW!Àßý­wøþÎOÐw]×Õ©–3M“Y¤!¥p š¦L)M‰¤J×'ú¾¯"àZEø§¿ú3¸ó½ñŒ¯rÅŠ+V|± V¬X±bÅŠ+V¼pxã7™\"ºmÓA¶Xøžr‹~[’aÜ"²ž³Õ®yˆT‚žJü7+gó⃠—Wxú6ùŽ ÝËeï#û7a8T öcø¼$ roŽgfA¥'B>·‚_¿O¶¸zÎ{.-Gý"TçÊ: Ýuì{RL: Gdöes¬ SK~ÄmÂJ, {¥’êÕú½.FSsPKXB[ÆÁ2œì„³“ˆ]8”F{ÑÆ‹ó•Þ$™y2Ú¬§EÜÝPEølmïå&5"ÖM"rܽró±H=çÎnŸ!ÇÃUÅÛÊ×®Zõ×ßT-¢¸ïÀv¸t5bÿv=Z^ ³¾AÚ—5xPÚ>Mps(Õ…arÜKä2Ò AW§ oVáÓÒ*œJF/ìÿ[ô<–âˆì új]Â÷†]8>…[ÁÜÁÁœ–Bwîö±àÿÎ%i4ôUÈ}bº2ú}O_„GL²9û öƒQ\ÙöÐi†YT#¤¸ÉõÈQÐHΙàl®vçf§Qæ’j£ø QnUìЭ½.òòÞØ¶´6û!Û~رº ×ú{‡~Að/Û‚̽án²âǃE{*¡æ>[zGð9¸“ˆ» %žgÁ KÿVëIº,:ÂÙ Eø¯BjÊ©ijÇ!GAÖ±®0¿žw_uìúj‰@_ÞtoÛê€Ôôjî0f'Ÿ#RSM À¡@™Žk®ÜæåÞ¹Üc†¾sN¶é¨%âxÍþ‚º(ÝŽöŸ¯±jEš$ì¼Ïf.¿M"¢íÆ\ÊfR_Ú@]<¢ùE‚W«º½&ƒ ÛÙ:râÈiBî¾ Û/"¾…|—ïâD4$ƒ—rÌ$`q,ÏužUü("óÚLõ\4á}MŽ_<Äû?Ç=#é·=\¼?zß[ŒçÒí±éJ~5æ ©àå-üê>xÌU-z ™ï·‰¤à©Îë¶uìz^ñ¼¥hØî¶t]Dò‹ÄœB‹"ª(TѤLãD.9Ä›ZèRBTè:¯‚Úp ¢?-EøÍ¿ûSüíòæ³¾Ä+V¬Xñ)Ã*X±bÅŠ+V¬XñBáßýF¬ó™ÏQ©îpµw.±R½­ym»êμí„ôü®s­øËBÆZjŽv©„K†È>Z¦\@º¼ ß¡â0 ØuµkÒœ³ôHÐÌÏIšÆ™D´±~e”ïþºy†°¡' ôVI¨ˆ¼B†_}DØ#› L Èè«Àøç{¸=D\ñlxI óLj’±*.ðF¶ÖX·F0¹K¤Ä(ŽAØ=+lzÁÄÉæ\°Û¹kæó6·1ó›·slËR ÐXsæóh¯[Dí¼©,ÞyÒxo‹íšïzqaóuÆ©(\ì;ÿ*"ãfnAìzXÅ_eì­? Ràaº™ÝD Ëë`yBÇèÏÊsG4_ô?˜ÉW¿ws¼8š ×1ô • –FT×ߨ£Õ*¼–iXë/¤ƒ;’ ý\A¿þeäì§ñÞ€7ßÁÞüŽgÂÊËünGúê¿C’ÿŸÈ8 _ÿ*åô+ o~‹ÃwÞçdT6žè’Îu`Së@ªç=NA(Ð'¡«6éâZÅ&U °¼]K m‚€3þú_ÿ(ãô?8“Ö”]¾È°Bª¦éZÚ–&ÞɪÅB0°íÁ{áboŒÜ=ú‚ÓðÅ”¸¸v†ÉÙöñ=Í,üØe¿pp˜]嵎OîqßrÕ”u‹û~ÛàEE<<‘v¡N"šx«‰wªÐ­‘ûHšå‡s›E©ÖÿDíÝ9²3äÞ9Üù ©ûÉp[*#%õh¹ÆÆk¬jvãkçUŸûm"™Ég!©71© 69iüñù{púú L~}…_Œ‘2 ´5£7(:!v×®¿ .ð½†P  )›øà£ªßüý§«Ž>nã7^ç÷~íë´{9wãTb¿Í^%,ÿ› b~XŠÍŽZ‚,D¶NÒ§L¾W¬X±bÅŠÁ*X±bÅŠ+V¬XñÂàíßþãäÁ'V#цɹi<¸0Üáî™ðʹR z6ËÍ+^ Ì‘L•\oDãP,LjO”T>ÓõÀ¨cäOЬHV|l8æ,—.%\÷מ*9KpÃIøÁ‘Ñ(šé"Žœôs[PÇ®È$Ag@ö0†×¼twÎt‚›âe‡•wQK!dpÅùÏC°mí»ò°íy&.ÊìtÍ¡¹]'ÜÝ(ûöc¸¨:׃³éœÓ­RCÚìnŸÖ~fîS8æ×Xèé‘ý?óþ~ÜÇq½ÿ)¹au+Õd@êW±¨íƒ`ïÅʹ{ YS1Ôt{콿+uý~vñô'\f§…²àÜçï¬Y…·Ó÷ã>kY°° §Z…Sˆú7§9Xœ\9íàÞ/‘¶¿LzØ~0Ë»Þ °‚ÈQÇȘvt§ÿ›»¿Lÿ²0¼÷i€ë<9w;á¥3AEØnbC†2Å9çè¨5]„ Q×9žÃ\ŒO‚OØAð·k9XÓaãÁ÷“œü/›Èü6‰Ò*VâÿÙ£+3›[,œX²ÁTª|¨D$ð"u…ÔÔ"ž5"…]ñ®Špµ¿f‡¢ö»-*¹0Û“Kí­êqð°Þ¿AüßpàÆ0Óˆè9“Å<ï9vOóî,Ú§—cæš¾‹Áœ…ýèäÇ¿:8<Žº{÷LfbûÞ™0fÁÌâ·çÞtTKôEƒ»cu¼tbø˜S)LÎT`Ó… ŽÁç­û ýÈ‹éŒð̰œ'?¦í(¥€Ñ¤-Ç\Gk¡x ¢Þ±˜Ë¨#ƒ­Ã‰#§;d{Ñ*¼ô˜¿‚ŸžÀã+¤‹”;áÒk4ªÎ¡¯š°*ò‘©8È,„¤ EÐ ¶wE¦ ×—¸T1ààø Èœ0=~ŸN‚ôrTã.…Ýÿ89¹Èœ¸ï¢5‹z©õßëe6Å^ÜÇåµÏ & )\¨eõ—ääŸ~ÿ|âß½ìøÿ ìv‡šƒ=QÉYŽî3º¸-²Èõ~“äK.g©9ˆˆAžºHrŠpNªò ¥U/¡‰ï%HÉ„Ìå’DæÏ[ŒF\Þþ –üÑÂÕA˜·oEÖêÀsFþ7²Ðah5ìIÀ'99QD;|4äªà{ g¡*ÊñV_—J•E5öy[‹}Ÿ8’Ï×)>rvYèz8M‚Ìj[mBBÀ1kÛmH¤’öO6£'¾›{ÔÁßún8Ý /Fz˜ˆx÷*ò:…~ß]!JýÑ}àI{öO'n‹Ú°ÝÕ WCˆv›’6G8m]º)ÞYñX:6Á‡ß´ÙUeñ¾Ùþ×yŸxµè\7Žtñ˜çæ¨ "¥ŽÇ+㽆ðg Þ%¤+Dº¥w1ØáRpÞEìk?¯Ñþ²sä8ߢçwa³Ïèp‰_ xrT4²Cå*¦”*&Êá&ÄBÕù:T—7`¬b›®QãÜ$ÜŠTq‘í>ôf_ñ"âyL`f3éïVeªu\ÈÙb\AS {ÿ6N'¥K©î#Ò˜YÝGŒ+Ž]±bÅŠ+*VÀŠ+V¬X±bÅŠO5ÞùÝos½f0NÔü´±ØÕRv g»¡ oË´]ŠÅíŸbx³X®¹œµÄ¢¯S?×}­5 Ôk$UeáÔ1urvò$بl<,ŽÇJÙ"zœ$íÕxŸÛU§…›·ÏZ8×õe@I”û#âÛÀGÁÅ"L Fl(ȶ@g¸î™‚èO2!6LˆL‚E´jw‹{D2GYÂν\ï‡WΔ…³]´™ëÁ²Ó÷ÊI/”¶øØHB…M%DaïÉ«¶`ßX§FhÅÊ7,•33%·õ”Õq?˯o¨äæó¯ø¸EñÛ.²<ç”ÅU{Ãè xˆ/Ä|ŽÞûP«ðvÙ-¹ÉœËwIþ{»Hõý^)ï9¤)¶³$=i¡/‚cf ¾¸£ûù¿ŠùÖ¿bû0ÓyÇ8%rJlzaªQÀ’BøñÞ#ãzˆèß󓆨Àndâ¬7øŒ¨«ñ¿‹:1Mðۺ烗¡?6ȳÙC_E>jÂvŠÒ¾„ ˆ£ÒÉ+Eÿ‰ÊS!ñ™}}ÞJ%þ%ꘋĘ&â¦(Ÿ“ZNò!€è“¢€ ÷ƒpX“~úȤֆñoQÿ-W‡Z½ÙÎ }É‘—Ïáü'!#‡ xÿm¸}éÐöÃMAË¢Ëj;ŽñFOùÜ=äôóøþ>öÞ}ü±‘<±Ý×E&Øn‚âÑí»>ìþžŒÄ_~·ì——þNd?9Ý cvRŠ9”¤hÿÍI K1ŸjÎ/"æL) ëÿNc®Áº‘6aÊ ½`@žjö˜¹Ë¢‰>umçGˆuljB§ݫEe1Óc°4C°ˆæßXñ»[GRƒšàE¾Èä¿ì:8Q´OЧjå_ÃË8„Ï~}ö1¯ •VW­ÿw†ßÙ‘^þI8ýtwpÉÈøè[hÞcF+´‹t !ªÕùC¹9ßq{Í6æº>ù/ªU<(uÛFú7ñßýÿ¬Ð"ôÿ§ÿøKôբŊaf„Ö’RŠºHˆé’&4µr-Uês‘Rÿ[ï§ø[ÿøÍguy+V¬X±âS‚U°bÅŠ+V¬X±âS¤6™f§;aªöÔSqJ%'“F´Ö¦†ìŒS,>öéh×ݰ.Ð~JÑlœ»ŒœrR"‡ó^± E Ï„lŠðZïëÁ:¥ Œ£QJ&uÎÖ•Ô WFW ò_»jÛú´ÅüïÉ]_ÏÞÐñÚ5á‡yÏ‚Ä5ïâHÊ0ze‘\øô5ŒŸGô®—`¯C~ ¦«¸¦l4>Ë[dÄbwË%_£ÒgCb3­mãÞá¬DDãé6ìÞOJ¼ÞTD1˜r\J—Ž–Ñ4r[$ÇÓDíÍ ä[¯—Ìøüã[/oèž&¸õþû%ÿol·Œ<\œû²<Û)-s–¯Dš~„UxÛ½ÕcÔ<Òma¿]Dèjv㙥­Öù¥Õ9©!ár#úÿÆ5%Á]±M¢è9ÅF†©GC»Ž"éKM•®–ç׃syp®ÙÖ%åd#s`õÓnõ‹ŠÛÄÃÖárS2 ªÆÔGÑfurZŒ+‹ö®©>ÔÛ³ÏïÕjÚç’pX<{ýžý/óûp¨én£ B§Çï#Š9RtÕ–8Éñ·©¾—Ŷ³x ½ÖçÓ)`î&š`~„Âb¶ ß:r· ÷6ð¹ŸBNÿmÄ_Âw÷qûpxsØx·¨[‘™¼yjƒ®ñ¾QôÕ¯‘Î~;ü~õÏá(°é•~ €9It+F7ÑöpÓª¿áis–šÇ´ïÚ¼ÇçbNuçD(~tp‹T-ͺÖþ?©¿Ðä¢LÕí ×z¼í OÂ0µ~0îÓ09›NØnâÞÅTáv¥XU3»p8ºu¡Ä IDATMÖæcV ‡¥'lÌVàX)«ÒÑ{C·Žœ䥄Ü= › ‘ýv(0H¤óAv~²COO‘ÝúM[tD|€él@†~=†€ÀÂ’}î„;­"gw‘ÝWÐî+x:E¥PN¶;Àá{Èäx_Çjkd=7» ǹ¤xÕOúì4ÿîØé­ÿ?c¢“çÑ À‰¹_Ò ú]mžÇébüâµÎªªÿŸ½wûµ%Ëμ~c謽öÞçœI»¤~Ã¥î#Ä™?$e¾Wn×íåâÿO]âkdÿ¿Ü'Öç)°íðo*8\[ßjÝ&8ïìXy¨Lí•uXÖζðuìy¼3F$†äØÄ®c“VP¹™À¾Îþ?ßgQ66j¥6Þhpï} ¾²=BϾ‡{øêGL"E½‡[ßAöï «[H½‡º‘ˆÐA<ƒñâ}4š5ª©óœ@ôi@„ÁG[–“MÓçN™Ü²C€ËÿcZ7ϧw—HùÆèyãžÒ²,$˜2þNËr>ý^fw¹ð?ÞÉDü;‘‰ü¼, xKâ0Ý'ÉÿZq•Bí[5þŽC÷Ô÷ =‘ÕB‡ˆ¦þ“Å5ç,Ëûâ…½ðDžô§ß†ƒÐMO<;*‡óÐ6ŽºlGeˆn"x4ÂvPÎ;»Öžr·»#àÆ`;Z/„×~ÇM<"2ù¯qÖjU>•˜æ*u|i*aÕX+åsÙ;a½‚UÆ)¶~v¨¼9é¸tš _`O™È©d5Ú¹·ñè©GÐX!Î_¾—èrœ•fPÔEœWsò¸}9ü:®þEp-·v-G¸pŸX9D[|{m߆ö|{üÎù¤œî ÜH £‡ê!â6Ä, ŠXvvEºÿ*Jª·¤qß“b9A²hP˜]D®RNûŸ;ACêÇòÐjéD²|q“ÜþÆßÿ ÿÕßúUÅ9#ÿçë_§ùüRMcŒLþ3 ¦{¦ÿð?ú%~ã?þöËÚ­‚‚‚‚‚WEPPPPPPPPPðJ#Ùt ØæL6gÙ”ê™òòò¬ˆ_̼ )` 7<Ð/¤t»œìƒz‚®‘Vqï¶08ôÁ½elÔ¸[ïS­¾„÷„áÕûèéŸÁfƒôV3¶rpØ âîsÒ//7‘Bª–xÞ)N”ƒ6¿1en‡”‰º÷Nïÿ9¨<>Áɺú-ZգŧˆB ‚Q|š6@T,=bê—˜™Û¦ìf ˜A@fçÞÔö?ÛÞV_52þ½FˆûŽóÎìàÛÚJäÚÐSèú:r#éW‹o®ˆò_µøò—^^ïYÿ¿ã‚@5b%}‡Zf®c²ŽŽÁL(r¦—ÕÑÖ͹úz’Ùd g_$ýó6å†\ÞÏÙçIäãñ Î܈]¶w·ïš ¬üC&ø½³ ض¶ïé%xË”µþU_#‚ëQˆÿŒƒ(<ðšÕ¿Wh1r^s€Ùê¿bvð@%æPùT@Ìò¿rfëoÓÉIÀÉDàOd¿»à &úhÜ‹#ìŸ&B>ÍxÐ\aåõ>îÖ›&¸j:ÔãwAÑá>Úÿ„8l!ܺÅì¹3É?‰œ°ù\TlÆŸ¨:+Í2V¨«À;Ä;jQÚÖúÖqT´¶þ¦aÓÙׯ;>“u¿.(Ayú{óôª8uîWtÙÜð1ÀÓ"ík.u býøùV9>SºÁªòŒÁ,ÿûA9\Û}PÕˆþÊCv_Í·¨Šj²dŸn€_@L.Šºû#þ‡¼ý‹ ýä‡Dñtt‰Ô–«ïgYø™ˆpq N‘F`uñïâÜmSü²"úw‘öiâbp€6wÐúMªê-p·¿gª >®M8P;hÒHк7ÑeÄJûHŒ0œ Í§¨[u Q‰ñçÈö±víg}@ºp3±»#½xŽ,FQM¥Ò…)ùg²/ȸ)nóïÿ€ð›_™–9çÒ!Ïä¿-Ñáœî,3슾ñw~™_ÿ­o½}(((((xõP¯ .fþgûYEÍí2kS|q-PëõÎóÿ.fûË‚ÄX&+ežãæ6]>ø‚ö Ç1¬ÿ\C¼÷'¨Tȇÿ<4-|÷ÿ@6 ÁáQĈDQbþ*ûf1ËNW¹™¸v3dfeòvå ®Qa;¡°ª…Ê©õ!"hY¼÷ðwþ @ˆÝÿFì î6Œ £#ðS\÷Ø :Œ©–¦j¿evºr!«Þ¦à1ò°Â”Qˆ<Û*Ggʪu¬[ËàÝk̾­Øª+¨ª\VcA}î¡JÄâµB€eÛ%\£|Îêï¹@ÌMaŒ0Œ'BíŒäeÛÛÞ5µ5rÀ ‚Äh™ÿÁÖuѦ]DQªä²1Šâ#Ô‰wª#4jäS«Â*:‚(« ´=jB„ZLHàÅÿ*‘þù½vnú,‹òôYML'Y rY0K,»Èœñ_=+Ïú'ÁDüï’…xËþ—VÃ=ÜÁ—pí—·ÂÉ9‘„ø#´ßÀÙœÀÑhÕxÿäºá­ïU5PªÙ·}§í=ªÞÍtcQgÙÿê­ÏÁìý=T•­38ë,ûü`Ï2ÈÁÈça„1š¨¨©’8à Jndq’°;6òŽåëqE>D’.jÑÕºäŒPys@9س~ÝDQ6m¢1·)¬½–ç}¾GÞØ!Ô „ª"!âÅ­÷Î×ð·ÿ2(~}øMœóÄD°[e›%#®s;¦!‹y‡ÌY÷ª)›D$XÁ†”ý/r€º7¨ª»àn?i˜F¼®©q"Òöhؠö!©üÔ\ùÕ²òÙœ òº HuˆÒC÷sôä>ºæ"lC%ßß³¥ÈÒYêº%b‰lý¢b.#xS—¼J¬„åóãËxïÑhÅC²¥¿=Ïʤñ¤Z &‡¥›û VPPPPpQ¯4–DSŒHªÍiŸÏ±µ‹îvìn­Í¬ödˆ‰¬Ä‚ÞyÝ‹Ö7¦=ÁN8sÄ`ó{f­Ò!®BîvˆW…tÓÃæ'ŒíÄ¿ᘸý±ë‘àˆO+¸h¶þ>2ÙûWÑÈ,Ÿ²ÿôòêRÆZ;>-ÎH{r–ÿ,˜Éÿy:“û³½ZßÍÖýù/ËÓ_.iP–N/Á6Ï"©^x´‚܆½qòžõ¡ñ +<õq{ß¿¾BFA5©d2SŒ5ˆd—;‚ÿò?8øÑ· Ÿ`¿È¬ÅJìz¶í±þ¶®³ó‚ÐÊ0*«FŒàwBˆÊ¦WŽÏ•1t°'Và ûºûøNÆÿ«àô”˜Ä‹óVŸºn…¦²’7Î%ÁÓžÚÏ×Äy¯tƒµU]™ÀRn¬AÕ›À,ÐÓÀC²Â÷JŠ,Ql¼„ØGÜÙ}âáQ·2²Ÿsâøcd ζp²TΈŸ¶µŒÜ¼ý*‚ó:§×nÿ·‹•w>_.¿â;.lopˆ€w³ÈgöySÍe²(@öZ¡©gr L”¿/“ÃN^üà'Éø_âV€ïEØ8\tk¨:ДéoÙÿ>¤J}Eð‚Ob¬*Z—ÑyÅG¡¶S6¿r*5‹öTªÔ£*uú¼¡+ÕáSva-BíìÕú4í3ÑŸ2ÿÝLܯgÂfÀ+G^^qj I#€´iqíè¾Ù6Äm²qØ }‹öJìúTn%7„“Ùbh"Ëirç=Sü|ü]ÄÅT'ÜMj»ÙÆ¿h/jÎwN×à^» ±ò ëÖþ§N¥7¼›‹>%YÕÿ½RÇü)‘uŽQm|“qD] ­X¿9]ô‰vöAypyxjî6‡{ÂáÚÊnT^Í1ÿ¼ýzéH俹ÿ(2(l€O¿Ë¨‡(½÷mô,Âà˜nT²Û䕤qUº*bŽG£ [µq\ûOÐÃ#¤ÚCÃ1²ù!t§ˆ®Pjˆ+|½2¢ÞÕ ’•pt³J¨Y!²Ö+¤i ©:{Y”[R‡t¶çDÙØØ+œíÓ Üî¸òq.­Áª7îŸúÚ÷ˆüäE'åö)¸/Ûàßý{ßç·ÿý_œÊèhS¢JœJMÉdXÃgÿ¯‹ãRAAAAÁóAÜh|ùŸqU`z.Z‚`×!ÅšRR‘2Œ¶\Hd!sg^?*—ê×>-ÙðL ’\[ŬP{ S+ 0:ž° )Û"¤Sâ)H‘óO‘ê>@· [‡ö’ÀnA˜?Æ>.W5ŸWÄ9ª*²j„óNéF¨Z± ±StpÄ#ÇøÝOñ÷ÿg| l{t#0ŒH­h•‚ɽe~YFYÞN7“äš.5òÙìfew_DQ¼yìNÍØ6ÂÞh4Ô,°^{%:Á‘mÿ-;Xd×¹ÖÇž ×e¢^Ѥ/ vÍýé¼CM%ì5Bˆ–:DØo…®W¼šjaE²ø.H»ý¹vÛçbc\Gþ«V!•9•~´LÕÊÍÙÃ"síjïf÷1ÌóµÍõ†§Ÿ–ß|Õð´ÄÆANÕ„,N°bíU÷àB¶õ§Ê˜ÄUY?¡’²þÕlþ]´ «QhÕ1`D£B@iZ:” ØÃQ‰ 3j±kÕç÷Ä[+0ªG艥²#Àd韎·Ydü/³ú—Ós·"I0ùñÅú/KH`]ï&#›t?íQ7Xç7:5„Á,È7Šœ{¤SBðˆ8ÔYmrÍÛ¿hppÜ£?ù}û­ãh;Mî–F»ÞÚœSëW¢šøn¯¨³;G&Ì™£­eê–m©ªÉš¼7‡€‚ÇC>er9©gUS›ØÂ„’¶^SÍe§²Ðª”~ïM*­’*E7H<ù‚ jVùÓµ¨bˈú}ø{v]œôÔ¡v=¦¬èiP:µÙäUbe$Ú âñ8àôçÈÙ}´ò :ôÖæÎ!TP5FþWµYõ¸ƒd¿Ò‚žØ×Çh¢ 1镈GÅ%GI‚ì¦í• (*ļm!)e¡¤åÑÇ–ùÞê<Üù:¾þeâè‘O N/õuŸüœù¢…Þ»E¿ Éؽ¯~ù_PPPPPðy(€‚‚‚‚‚‚‚‚‚×%@r5.s9I¨J Cg‰VÍœq8•R eúݺÀ7 –1)eWA5€(R©–É_¼‚F4€œ›9€n,¾«¤ íàlý%[õ8È.p‰¨õöVŽó.pÖê¼w•*†Se8im«HthLäRÏ8è± r4š˜¿ì5¯ö㚈¹KäÿD.ç`uбG¥‹‹#‚O^ã‘TßX¬­¼³¤¹IppωçÅñìƒéNàöc•£3èGh*å´S†A¹shDjãeNN{¶€½Lê/&®SA\‘ ¶Ó¦Ó0*Œƒr¾ óÛz®Ûž×˧|lýURÖ¿Îe>ëx¿Jýï³"þ3ÞºN"oÝ©h{8îMë,{߈N‘\Ä8Φ}r”˜¦±w§àURö"ôL¥²Õÿ4ø*ú™ä÷"“%y•-ÿ]þ, {ÜlõŸ»‹–þ¯Œ@ês*¥*ˆ !v·9†½WPßÑñî£Ûâªâ¼5pÔÙkn‚¬šsij ýÞÖ–†õ>5nZS•q„Ó>UíLœaÓ+]¯ÜZ;V S†hF® }ÛJŒpÞù|¸g£Wâ8Ý,]¥ªÔ7Æ(ô£‰©b´eÃ'¥ö°jìø5µðæ¡cU+Ï"MeâªukíŸ]>ÓÉæ5CvÌ‘¥¢"F@Í @7VÎhÈeŠ¢]oÀ¬.JßMºý¹”…¯b]q}gv)~¾>µœw¨«Ì2ßûTŠã¨@»Y!;ý’ѳé+À‰ )“3b%@tT,K/i*¢vUïXŽ-ý|H$0‚öÝ~L°½Mßÿ4Gë‹—R@í¼Z>.ˆs;YÿùUPPPPPð$(€‚‚‚‚‚‚‚‚‚‰GÉü/x|dgú¥õ•lŸ³@ÔLàj!ãH©”ƒä“ëËNås†hJwM;,iC5¦,-±òÈ(Fp{R€–”Qï :Õz~ Èâ÷ó<Š8¡©4èG˰÷µ}dÏY…VA·JÄjàªèeNãÕ¼SŠ)eŽ%ñ|ùŸêa+Ä Ä ¸1иHŒ xÄ{¼“9ó;E¬/’S¯3&‹V²øÁˆ¸…{Ç‘£³Àûw=û+a529il‡\.ÀJ@ŒÆE"Ÿ‰j®rÑX°­iö®9'39Óé—ζÊéFik8\;öj²ËìôuE>"vÌ_ž4&—¶÷ÕÁ³&þ3ülÙ~ œ¾å¸Î)® Ñùdãï"¸¨HÈÓ6ï4M'Ò?Oûh„¿Ó¥0@&@•Èÿ©D@˜@`&þ=‰ð¿(Èë»Y(P-ʸ ï"L¢‹Bœåóz/—i¦Ÿ—ù¥X½ì>5îñZýнú-Ëò×{hÿ#+ ìÈMb+ï,‹8÷§ª°Ú oÊ¡~—À‰ Ûú`e`²ð"‹AúÑ\DšZ5‘€Æ™“Ì·ÕœY¾[i p¶Õ©„Ï+z™¾4,ÝLï¡„(„$P5‘Åé&r°g÷\ÅŽÅz•ÇRn.RÂw/½œÝz¡P5²\òM(ÿé]4udâˆÁ\S4][Îý<`»e»¡$„±Ää¾!QÍiq©ì:/à·Jd~-*î$‚T©ä@ iJé—q@Pˆ©.Dæñ•]§‚LnsŸ£.)_¤S)’G<#²€!8â}|êoÃf€3Ldð“=¼H7€û?ù.ÿÝðO§>ZÌUbq>|Þ¹ñ*:.¼X@AAAÁKÄêm‹¦n? ¸Vð QíYS0õxöŒsаgÒ]Qz±|+((((x$ÄTû{H,ä˜Òm" ºA9Ûšå­tƒÕo#*gY«7 ™”Ž@Ì”SÆ—WË´N$‰*f×: 2¤oÀ‚µ.j]&y`ò¹R¤X²M ’²¯÷׎Í6EP”€ç<z_qP{| 1*1DBÀÊHÎÞÎryÛ–eÙ%þÓïî ˜¸0‘Tÿ=e·ùðÜu„ÁÑßñ£‰dQÀþU%Ÿ™ü‰‡p.‰h"Œ£rÖ)§[ØfçÝ Fä5pkß™wc Þ f¿OâíµB½°†Þi×ëšøsÚ>s-ýhöÕ•*oVÕ«Æ>?ï"cVe·VN¨«Ë_/Ìöñ¯ú!^Ä?À­½8¸5@½¦ÆÚìÿ«A •ÃÅ NðªTÑ:%¡ŽŠÊLì{™«X¦8&ð 7€¥+@¦2¦ã–ÉzÒw.Éÿœá/³($&µ‡¢SæsHڪ̓9±mŸ¾WtÇ- 8}îÖÿ™l4KÿŽɑ:|™ú;ÄúRúˆø€Ô Œè½{ÄÍÒî¡´ëà¼G7Š‚ QÌþ; ¯\*¹©GäÀö3ž´¯”ùqÇÛ>âÄwœ&Meõâû!•_³šßôfí£&[zûŸ½ÆêÌ×~þŽÊ[›tƒ°ngYXÁ“ù|l씪+›÷bÇdLW\íí˜TÞÜar¹•¶~Å;ÏÇÀd÷Ÿ§#¤“‚"šHõJ‘ZmP™Èx—êhÔ$ÒÍzHI '…ÜwªØøD£3ξ(‰ àZk ¶'|Gp•ô +Ð-f•mjQôÀÕSdÜ a@Gs‘J >ˆCE§ñž¦å³û’ËuTlœ™:,™lIáüH6-ªœAè|ÁÊ\án°EWÁµ0Aõ|o|œûã²ôKAAAAAÁU(€‚‚‚‚Œ;_oyãŸ]ñÁ¯ðƯ¬ø_ÿêx÷_Ys÷WWl?éŒÔžá42œ|+ ç‘°±ÊñÜ¢=Î'" 4¤÷, éA Õ€DÓú™ Ñk¦Y̳XÆ5ó¯Tu§ w‰hP`Ûë”-x¸ÎÙlšj+ç±½'Y™Îß1Û‡_•Áüb®š™ IDAT0“?:½lÙ2ÀÌdë4YÏÐa¾öÑl\§@­$[×§"ÿsp7o,I ì5B]y¼õ¾ Ê6:V+aµJú¿1²‰Žmo™ù"–aè+³¸ÕLèOï â?eí¼_\.s‚‘gâîmûÚ_Âmbücôþ‹Ò/p€9щ8aPîDŽÎ"µšJØptëÞ8ªU"üe¾fêÊÜÆtLuA~fzè#¶»ªeÆ$ F¥ëí¾µ6ç‰ÓN¿ºQ¢*·×‚Obj6“X»r9ÃúÀó$þ3Þ ŽqŽö`„¦SÎD©b"k#fý0*n€Ñ“„GJª¨H‚y&$ •’– ^…¨pÖ¥!” ¡‚)ë¿IÙûuÊð¯Ó|å–/Ëί½¤²’²ÉçÌ~#“oöqžÆç{¤4]pÙ&qÉ FZÁ½õ%¨?€{±’ï;h/Fþ'[rMedf%CDä6ø¯üàà£?!~¢sÿ|ý`÷Ôu+©Ô†¤Mj¯ì¯„aÌûg."g[%D²N-;vddA] !ª‘OÉN Öæª°n„R9€ÔÄÎúOï`p&®Ê¼/Ì÷×™üO62.2ÿCœ²êÅ©ÉZ& m„ð Dâà ó&²éH➘¬AEl¬£bÎJF§§1¬`bƒLȓ̒£@Ô§çÀ1°Z›€f[ÅRù{ˆ§„pŒ„#t8…q cDT’9Ar,Hý¹,€‰§d Í*¨Ôo(vOÈ¿÷NS“«H¬MIÀnÒ¯‰Jï†àE:ü[÷;üÃÿð—vÆã;¾z•Æc/EPPPPððþ¯íóÆ×W¼ÿkì½;w½ç6ðKó.§?êqPßq„ÎáW·ÜJ¬Æî¾#vŠT% ŠóG›Ÿ^£Y#y™eÆ{¸Ì¢„I Á‚Œjåø®Æ”¹xa¾    àÆ#“ÿÙB8gæxì”ãs«W»j¬ƒÏqDï„õ VµL‚!Ì*·“àE¢d´ÍAÍöµQhi"R'»W1kíØ©˜½X€y°ïÒ‰,‚ÊO»O"h²°Õ´½âŽH“D1(Q´Y¯ÀWy„è•àâT‘ÀÕbejÅê½f~Gr}Ü)•<ý¹Døï’ÿù5ÆÄ *{€Ç{‡º]ÉS·É+I,B¶ÂÏÍ×TÂþÊáR[ìµFÎÝ=šZ¨j™NË1Ì<€KäE.½ñ™-ùí¼,SPyðÞ²Á»A9:SºAy÷ G[Ë´=!dDZäJµÌã10eÿWÞvøU;î/‚øÏh>¹-la;šëˆ éå-óÔé˜{lý+,K¾ B%Ê(&¨DP©"4Q8÷q*PiÊüWÊؼ‰ê Éþß2û«$ ÈÖÿ^‡ì84^.•ðŽ© À²<€KýĜк[`éð¼Ë„äìb‰éƧ š%¸k–;×—¤ pм5hø1zÑÊ™¸*b°#ÿYdûÎ"ŠC‘Ú!·ß5ÁϾ=l]³Íb÷Ô½Eö†s°¿2bÑ{ÛÜ,pâ–ú´Iˆd󳈠òÊÁÊúžâþôÈ:Ž,˜ ©…ÃôùTæBÌ!C¢õ›µŸ?›ºÍlHñ õ£Š)ó?×Iˆ Í–?†4©¦‰B ®‰ÈZ[kX¯ ˆ=ÕæŒp6¢âõ&Ú\ƒ&9{$5^˜•jŠ}&.]‚6&œ“¢‘øÃChW„P#(N@’ AØuKŒpñ´ˆvgh7µƒ­~[¤ nMÓE¥æò˜Ç©1m¯³ø îsE"’¬[tVÂ|’DVo¡U ú‘Op!¢£C``rè_’ÞÎA VÊ(«"cvÿÀ®aU4DbqÛžPã}DbÓ¡z Ä„"ŠjGŒg¸øØ ›ûhw]4÷¨àL$¤‚dw¬¤OÈ$’íþSBr+‘& û)¶3D84Ô¶Ò£œ4˱]AAAAAAAÁ5(€‚‚‚‚g„‹ÖþŠñ4òãß=aý 5ÃI$ôŠo…±‹„.â*!öJèq:[Çyˆ½{Kõ±éT‹­ƒ±ægïü¾Cè/K,‰ý+ˆþKå>‹ð/((((¸ȼÇÒ>;’VÞ2ö„¦N.­jÓ& °lÄÄîXBO®Ê/g·v‘Ï‚¥ÖÖ M„=‡¼qwçC¤yÛrÁâC8û"÷ð1N÷I"ˆª¹ìD™Ÿf³”1ÂiG²g¶¯ŒÀy¯Œnï Mm¿)"ÓýÔUž&ÕsΘxŸhN ›­ ö÷,Swò‘¿ŠøŸæ/~Y‚ðñ\. *´šO–b"ÕÇ “`U[†îygĹw0ŽÐ¥,ГòñÃ@7˜ýÿ{ox˾:]O&ªy:r}9 ËœC?(÷O"g[e¯5²wÓ)ÇçÊáž•ðÎÊÌ}ƒP‹*kº¦29y“Oƒ{>òŸÝí^(ñpw>øý¶‡ï¿¡Ü=öó=a%Ш0ˆâ“¾¨ÂˆþŠÄG«ï2ÙŒg;ÿjâ¬SVÿ‚°Ÿˆ}'Fü»Eæþ+ÿ—©ÿ\ F2Šd?àîzäîû ½ÿSTñ(9°x7Yû›­EEÜ€~4 ±F]R¹ÈLæÁ"‹wnȔݛD;ÞOkô»[Û¬P£þ‚7ÿ~*ù1®@?Øý·©æìÿ)³ÿ1šEDpN/ýFÁ“cJÞ†©^·fŽ&Ûÿ‹·Ù/Dû/˜Fü+S6ªY.ùlÍ.%½Üþ Ù{W} äM¼oˆn‹®k4 ÈölxKÉ>þËvÍA AÔ‘"vO3g#Mex27/.€lˆz =²Þàª#‚[!®&‘ØãÂ9:Ãöˆ¸=‡óíÑ¡Q Ä4~ÌýÇn©¼ 믈¸[yÿdýzú3âÏîÃQ0Ñ¥h±î¸AxQ.¿þ[ß(NÏEPPPPð¸ÎÚÿQñÑïóÞ¿¶ÏÛÿÒšñ,6OýY¤ÚKÄþ Ä1Úô¨‹eVÀæ…8º´ü`.2&Â?½Ç²V“(~Ϣ؉&_"ÿ¹f¾    àÆ g.‰úl ¼n…¦r„˜j“{ÁïYíàÚÏY ç½eƒe"V>“T² 3^R°;žóŒhòÖV¤9ØÃÝú2~ýuðw- KO®ðGÐÝG;…A­Ös`¨LYÏOÊ|ªÂ¶W6²^ÉN`7(œv‘¶vìÙòÈœ :‹óLŒ3 '›Ý~$ô#›ÁÑV5>„ž~ââ®Þk;WMÄïDz}Á‘¯#2èÌþ;´µeön{«×Ý&Q@LÍxçÀ±í•Ó­â®…­„F>O#7³"÷ówxm#ÜZ[ ÊÛ5Ÿ³XW$›jF±ZÖ’2S†7*»§Ô Ä=ù_~÷p|)¿ß(üî×"Q•ÆÃɉ¢(¾j€:ÀèÁ{¹`%ªhóÑÍ®ØU4A€ 4ѲG+5q@Œ(ž”Ù¿x¹äU¶ù¯’P@‚)Ó?;,>¿hë?‰H¥+Ø~ÉâóË¢®p xFgÒÒõ¥VÜžâÞû Õ›Æö÷›?FÎÕúwŸîƒ“]{…ŠCƒ·ïòi#SŸ›zÜ…bNXîˆ.÷¥r¨Ôhôó¼—k÷õÊåj¢¢³ÎaÖ+¡©tÇÞÿqð… ž_¦¾Ÿù¼ÎÓ0;Þ'WúáÆÓ}kéƒ µ">‰*›–6-o÷‘öMœ‚® ®p²Bùm?%øFš+ bñ qÖ)^(hT+ ‚â$ƒ­*£¦mD@BD‚BÐaChWP5Sé€dØÂØ»¶#ÚaŽA¦XJN¬0—済zQ X'¿ïðïþüêÏ3¬þyøÑ“…ˆµàFàO¿÷?þéÛü¿ùÏñoþçÿÍËÞœ‚‚‚‚‚‚ÇF<ÕÚÿQpô펷þÅ=Öï× GáÔ|cÅ øJNl>tÊx ')£É;b‰Hm~r:‚oÎ+Ñ+nY"À :*n«ã+ ÔÛƒr~xݱúO©žS)€¥»Ó—Ê,—]œ¾j¾   `ãoüêËÞ„×™TŽjVÿ1õãu%´bYÍCЉë£â£ÐåÁiäá©O÷„õP9«5ìœàüËÛ¯éæ" ©X¶TönAû!ο ~\\¡Õ†¸÷ Ú!U4 |yö·¨!À¦3ëþ½F¦zñÎ)m ÇçpÖ›8@€~úÑìÜcÊ2‰YX5°ßXê¡ ¿ß³zßΕñ| Í7ø%aÿÄÿT³7Ïg²Iææ¼Ñ)ß/É^ÿ0Fa•~4kÿaTîD¶½ò ozœ³qÔÇþžòéQd æ0Û|/¾ÿYlczÏɘ•ƒÛûŽÛûsy€ÊK²×é0÷£òðL AijaU›`À{hªt¿,‘Ï5xÙÄÆÛAø¤‡õ ¬ïz6.Ð Bµ*•ÂA¢R1 §<ɾ?ÎÿÞC¥‰à÷LDÿ•ÿi>“ø™Ô¯–„ÿ¢Fü.±¿\ö‰ûg„Lÿe³õ 뻸ú d}©17—ô€2íCÞ±»5…‹+pêg¥ÃbúB{L©t#|‚ö±!š`ìø\Y7ª±ûl&¡ó}{Y ¦àÅa>…L¤SùYP L'æÓº¹¼J¸dýŸíþÝœé/UÄÕ­Ræ¥æÒ´¬NÊìÆÖ‹4„P!Q‰nDî4°ŽVÞ#ºT®)]¾1 Z–ÛâÒÅâI"A4%H$±€Æ#ô#Òlpµ'Šm‹j„1‡`ø ÄQa,óLñ’ÔA »cI™ß¬žV|@ä>R»Qb$7ú½øñOÞyi¿ÿë¿õ­âPPPPPðÌPÏO“¼SpÃð¤ÖþŸ‡î~àÓßßà*ÁÕÂpÏ"®Âyd< çIq¤ØGâqˆ–å?˜•]Aƒ=l[V¿Õ›Õ˜ßÁq:ÇÂÒÃêÅù‰ÈWvF—Ë—ïK”ׂ‚‚§@!ÿŸ2§›Z ÉB>ªÕ!÷©fx?ØzM•Äã\ï¼”~ï¬fx&1óÈç…½/Üs¦LêDŽ©œkÀ­0;€óù¯Y¡®F|*ñ|‘üF»Ñ fó¿¿²lï çM£ì¯æã ›^9ÛèÇ–”êœY‰O›æ"þ½Šý¯ý%Üñ@÷?B6‹øóUXUË~Ëé‹"©fnúÜ2_™ëG¤ :%»Åy¢‰=b"ÚUm™`en­mmbmoâ™Ú›}ô³Bæ`ÆE™ïŒÄǹ˜¹ÌamûÏ­LÁ0šPåí;Žs¨ -Ü bë¦ÿ_ŸÔðg_qø^©D¡”²O*ê¡J­|´É!À).‚‹š\Ì R¡ŠsɯBeœ & ä09Hˆ• ¸(Ø är‹Ïî.Vn`8wAHð’ÄK¾Õ N¿Ã¸~ðèé·Ð.BÈÊ•üéN(X&±Kßrù¶ ív,t®sOyŠÝ1¢%Ô^8ëÌ `Ù©Ç®åóÎÄaû+Á»—-~Q°ã ó}Ø àžêпÚÈîK â]0æd󿊰8ØÇí­¬#ÓÙë» êOAÎÍJgP Ê ®Û·Š;¨w¾Áþôpbº!Í7ͬ>ŸZE+ N"Ÿ÷ˆ@Ÿâ#!âFÐ&­³D1qd&ÜŠ#HFGFš]þú©9®¬‘%‚ŽâÿX N;ô4Øo¼x< éÿ;¿ù×ø+/À  ˆ žŠ  àz,ÿ?k~Õ9åL=›Í)x‘xZkÿGAØD¾ú·Ùû "tJØFÂV ]´éN ]`ìW ¡7«{ÄN‘ZˆAÑAí}Êø‡8š#@ÔD´®Lóó;“rÝ‚™E‘K²j_ –-å/EPPPPpc°,PåRÈÑ2Í£èÄÈÀ“R{X5'&xóбª•‡g‘¦ÚÚH ˜ë¿dV5$Lî©)뢢c‡ŒçPo°H½€hl™Œ_æYpÓˆ€»£ðÓ?Ü0¾ k¡ ŠÖV~Pê¢:` Ú@#b¿Îå±Ý(¸¨FæGpÉÀ±(;¯L™ÿpIà°àN&ý]"ýÙ)`~OüÖDøKÊü¦ÎSs‰F„E1Q‰Á§óê›â‚ø's^‰(M€êyôÓ:t8qÄ} §ÿ“=žèImvÝËc~×TVe*õ’qʼn¾cùÿœ b¤~ÛØôyg¢»1˜0À‰p¶µ¶ÝkÍé¡àÅáªã¿tøBc'&Jf÷¿ï7nãî|ißJcŒèæ{ÐAü3Ôí£Œˆ¶Ä¾'êÑ“OÑm@[äÖû€CÚ?!æœXF²\€˜ÄŽä. öjMTjª«Ñ¡0 Ú“âöYð³@NS™b}até D4"ŠŠ À¬tÈâ|È_è°þjðè©¢}@ª-[†øË¶@Ï Bú_52üßük/DPPPPPPð,P†Ï ï^Zó5ó´öl︕ÐÞ­ˆ½2n,ãß·Øsš,YUp ®JÏ´êV#ÔŠªâzè7³H tàZ,J±͘`“5žFIrÉ-€åû5.¾ \O’ùÿü1e­¥8d%D!$€¦ìÂÓMä`ÏXIÅâ‘ë•…Š›K„Dé̯¼LÄNŽÚbv°Aˆ}Ä£{ª¤~ph<&t?‚ÓOˆÛ€.Ý' SöÖôO¾wm#V~ñô5‘Èbµã›j&áÖ{Â^;—bØÝŒ\&Õ#ôûÿ2Í6 Ô»D×UX’ÿ͈;ˆÐ½îƒÛäm¨'<Ñ>°_ßÀ´Nfd`Iî,§3K÷Ü,•·Ì\[¶=“8 D›®h…1(~ʪv1Á9¥vö{Ã(tƒ2Å;s¸Q…wß0wëv.aPy™œ ^öQ¿‰ÄFáÓ·ýÏaö¡åaO„½”¦ZðÓʮ޺’I8uð'Mä~õ<Ø×âïŽÂaÖ ±äÙ {N©UØS¸…N¬†‹Æ÷é øªÓH¨Ó¹¿µrd.šË¤—W«×í³àA™Ü ¼Î⟠“è!‹|Tª‘£Hõ@¬OsŠ/cž¿ÔÑ•þEPðEÅÓtsû¿/;Q¦à+ÓÿÊ»œ–cPPð¤X’ûKRÿE$Ú}ö?¬Ÿèÿ6?'á@LñúÐEÄ ÃI°x}ýid8 ø•-N¿ã¹Zi_ŒÜÏ|*é;h*ïk/tŠãkå}G¬ìïqÀTÒw¿¿PæwùX²Û×yò’«ïE¼š3 EPðEÂË쮊à†àEXû? ÆóHsËѼY!m@Á¯Œä¯7ö°¶¦87jªÃ4/^Ì1àÌ\Ä9Hlµ“Éö?¹@"üót*­þ…ÉõWbq»"þë p…@à:”ACAAAÁÍ‚j<¡  ëF!• Áˆ@u&ðg¥2‰Ïw°£j–æÄô.0yœç`êĤÊdÕJ'H4ˆ{€úc\اÈfƒ>èÑ#ÐóÚì\G@]fn=kwE@W1ru;Àª±úð•ÿœzΗ,eÔ™- È£‘ÿùIß)²ç‘7ÿ<þà/¢õ>üäcð•Š÷ ö¨ssfÝkU³çéòÎHµíœWÕÉ‘a.¡—œ€¹4öÿ¬ö½5s•ˆº|}-ÿßË®áYïcF.ã‘k¸ï5p°çˆÑ¬þ»ÁÖ­¼ý·÷…a¶ƒÒ°×¾x²ñU þ ßoâb.1ffÃioB­pä•Uß+ƒ9‰øAÑ• ƒâ%VI$0ÚýÊÅÅ g¨ø(øä6àSÙKRNb ’äB€fs¼êôY•K7$@•• ^ÔÄ•ª ¢&€&Q€P¡Vg<·ƒB7*§eML°×Àþž¤û‚­=Ä.÷Y%´PpCo5QaŒ@@–l 6v߀_4 5l¨Y¹nèÎÐs±¬üàP­ ˆ}>Šw*Vn—dÏÁ «’Jrû¹õ˸Õ/ÛoiGt+ts‚ž|b÷ø¨&HîJ‚ñÈ\J‚¢â4"à¿úe¸õeôá÷á»?#Þ‹h´8Îd#2±ý°3¼ÆM©\ÕÏ¿÷þâ%2ÿ3G\ŸCü_üßÿáoÿ©7˜ß IDATuþêsv((¸‰xÿ×öÓ»û/›à^¸È´w¯_w{od8‰Ô‡Ží§#ÛOF|+ĺû©­äo÷ R­,®Î·bÇ- » ì,椾8$q@Ð)¹/»hH7­$€ ‰~WˆvÞ ^K@ÁëŒ×¡û*§ċ¶öTüð¿?âÝyML=8ž[ñL#íÜ7›¡höBìÆz³2‚? Ƥ ™ð×4°@ ;RªsöšßpÅûÅé‚‚‚‚§DÉü¹ÈœùRðÕÔÂaú|"RB½Ä™ÜÌŸÉ‚Çà9d/iLe!Ý´RV³N©Í™œÎ)ÎFàKËÖŠ¶‘¢â×Èú+à ߆8 Û6šî‹Â´}Î5 ð^Ð>r¶µìϽFhª\Öj·O•®jÛ¼º˜ÔO:´û”Øþ é>Mc÷FÔÿª‚ž”ÿŸ½w‰±%ËÎó¾µwDœGfÞW½úVu“ÝE‹¤YÕ´ ™†¤‰à& ‚!Ml‘ôÔcS3Î h$À€!Û D‹C°g„ ÑP·i˜´øRw»»º«ºêÖã>òq±÷ò`íçäɼyoÝGfÞøÌˆ'N<ΉNJõÿë_ŵˆJ³Ív D«nÏäÝ*ëF)œ0)óü©Õ…lš+ Ûä¯}h+.bË‹iYÙxÏ«Ú//W5µ’È.böóó ÔÉzxݤ61 ‚’}{Lç|.ò|ÞB€‘øðù õÁ‰#õÍfƆß°…c§LWЬ¡&pu¤(ÖФêú¢UÊZQª¦?«ÖÖã"L§I40d"_…(’;@A/0×p8 tæлØùäÄÜ2ÿçÒ xÝÀºVÊB˜yG ¯#«Æõ·"QÖ°n#Î '+Á{é[¯AýòwÞ7FŒx–Ë3HˆHÕàöňø:@#H+¦\‰KЕÝd´6«ÿv…¬µ–Y ±Po„lpÖö¨p(óIê¡(¢›ñšd[R`zÅ[xwËnjqŠº·`r )¾ 扭Z1‰HqtËS艔VP'¸™ƒ;ïã÷~ÖÏáãÏMxH$ò`›¶ÿF¼l“ÿg¦°Î!ý/’öÉÿ×·Þ›0{«àö{S¦o—*¯~Ù0}­`úZ?¾¼ÕòÉSÝqÌÞ,hŽq©T{)ÍΩE@wÛPœÙVÙ=¥À®S 15õbB×çùm(SÀ…ZÀ¦ÀE8€‘¸r#ž%¶/ o‡óŸ5ïã–y•.;OBæwiÜç´-×/ÓÚÿ"8þ°æ¿·Ïä¶ç胚ŧ ÅLÐO =‰‰êHX©Ùÿ§>B±ÖN(`¶ÿÉ ²{ˆ àçb@kö—Y °Ë*h#Øz½«êÿTð¤b«tÖŽ1bÄ+€\¨Óõ¹p˜Z]é*üsËøî3’lêŸ72ùß$³•-SP ©os¨³67Ù ÿiKJÌzpoãøGSÔhø b-P[XubUeƒêÿ¡%kçD °U…vq8'LKEı\ñBr¨ï¬J}Y[R`>Ù±ž¨Ïú”tÏ>ôß«¬;„ø“¿$Î?@–kôH@ âRÐOÛT篴çô¬· 6ˆ m£,‚‘Ü…‡I)e¾2 ½wèA†UöJ.ê“´>û ‡ ¿Ú÷¸í0|È8oÙùc…‡›s!ľº8Ÿã!öÄá¤<½íÏ #ñ?âIpèáÐÛÁy¸'°ù,¸Û,4u¤XY.R¬Í-@Zp­¹øÇA©µÀÆPí¼.4«&—€ä$ Ú z!@ßVÀ'Ò¿HׇÜ& è†jb×}%ÒD!¨ÐÆØµ‡±údeZ e‘îÙ4¹“84öÉcÕ,ÐQ0âùA³AP@n9Ü7q‚~ôçÄ£@\ nñˆ8û)Ñ x4>"Ö?C¾@Oºp°â2‘þ™HGÀådÐÏÆIj7@ªr”$ \ÇoF¬D2Å‹ F$HOì‡~]âñiy r Z+º¸GôÁñ=[¼Ê`û2ù?1ž‹Ï%ÿ¿"é#ñ?âz"ÐÝ~oÊí÷§—2Ÿ~•ðèûkfïìÿBI{Qq7ÍQ¡–‘²rV¸RÄ{ÚE$,#®’¾°ÖÍñÜ2 ŠOÅ€‰0÷ßì‹éÝvÁk/P8âÊcŒ8OBèŸGóÉàµÿ.k-p‰‘Ió˜âšÂÛ1|²2ëíI sǬLçt]&¬—÷îåf§ÙšæœRÒ‹¾jÜ”·¿£ôñš2pØ;ظvyžÓ> Ÿ´^ûåJú¬]ž_Ð7ÿ#ž5>)Óñ:“Î1àn#¬懑²y¡_ ¾Q$(ê0Q@PÔ m-qº{¯Œ°vjmŠhâ¯V°å³8 µð˜í¿#·šÚ ˜ À‹X5³]ÍѨÖ"Dì>#(âL0P‰ct²aV#ƒÊ0sÐt;<ãâ5b îà-ã"qô©rûk|úW4 ÇK´øÐR “7±½~Œ[|¶ôè ¨ 8Åu>Ô96KâÌ´}’Õw]ТVé–‡„ú#œÛCãª+bóœ<°ÂŠVŒüW—ÄŽé¤ [ûž¿"ç­ÀÃ@üàÏÑùГ=U×ßL‡äÿð ºèw:â©ð×?z›~þÆÙäÿ3 þGŒ¸N˜¾á¹› çn¿7½ô¹ô«„£×H ¿PÒ®Ôb<a@•°0ÇߨDšc#ÿ]a$~X›å<—ÕÚÿ"8üá7wÜx§ ~™DŸ aA“×±VÊ[.õÿ‰f÷¿Ž7þØ@l­ €!Ö¶|KÜ*Q3ƒ#–ÒÔÏÎ ’ÔJ_v’T€šL¶HÝžA2{Ĉ¯&Fòÿò “—ÐñæÝ8ôÅåùIÁÕ®»øˆ´¸»yí[&tûìcTñ0ZâUÝfõ»Øk MDO”øÅ'hh§èágÄÃm’­¬¤ ³­³ˆØv5RcÛÚ8kÌ\øA?ë‹îžv»˜{Ç—^’%»ý&ÞCÝ$±ßÖwCÄÕ-2[!¯y$:âíä%åžec>%Ú[gN Š}~뻼ÈÚº5ëÿÂ[õ{U˜ëBTX¬#m¦•P·Ö  ÜñÄü¸Šþ,è[H2"ºó'j˜ ?cªØO‡m/Ú<½®<ê³µqš·i­¥G&ÏkS°áx°% xÒý‰ÿ/YpÿN:VßôÜm„“:Òþ‘â »'N–€F¢@Q[[€è hÀ·Jô‚o•"(Á›€‹&ð)‰ZE 4.½ À© „Y$†’ÜDÒë^$PˆP¸þµOãŽt@ðÎÞ±V=N>¹ÛäÛ›KîY@°ÙFàú\÷GœƒƒÈàµ@º}ä››^Là(yþh~øÙâµÇÕ=VhW'H5CEa½FOÖèI$.K¨FÐhêK•‹ä¸¬K:g&‘¤jœ !µ ‚®Aƒü%Í#˜ q‡?C¡k uV 1[ Äþkè¾(naŽŒø:ÅP…l~Ë  œŸÁï5b':ÒÎ&þ·ÞÛ˜üë«ÿG\eÜzoÂÛßÙ¿ÅsWË{-ò_ßãkwúQ`ñIËú‹–âÀ¡­ÒœD\ a­ÄuDÊTéßXjí}µ+ꋃña´¡ †ÝóbíÈýÁ½è¿?ÿiº\޹þk…ñL5‘OãóÂЫ|ª¯e›ïi—ÿ¤óÊŽiç-ï¢ûðJá²[û_ëù7Jª;_ %‚+-;¬\kíé´U4*nŠ™=F¥¸áh–ˆ*çB»RX)þI`R˜ýl´·þiÕ‚†–ôº@kCXð†Ã¶–ÿ²5â*_=®²æ«"÷ñz˹èÃÃú~KXG¤VZÂ"R¸•U$´J¬cgm5üÓ& b;¦û!Äs;îûÀ™~˜æhçC×# Ƈî:Î…¡MÖ°e†M`ó<ωWC2SPŠì®¿%þ:e§þ¼ ¤„´Bq7îí_Åü=-­þ!añX¨U˜‘’ÙN‰>õ¦”_‚‘Å=[xãГҪà}‘HüùŸÌÄŠwIRß:X«Ó·[)éÞ†Üs>õŠVå?Ÿ uÓÖJ.*ëIX‰Š‹Šð¯yÜ»ÿ>ºjÑößÂ}DH”Áïe»,!]Ôrr 'Ö}Ñg®ñŸ‘¿óíûoZe][ÎþÆÜQ·æÐû¾Ž—JTåæÜúlÞÚcÀÙÄÆð¸ÉãO{ΨڱÑû©Šôã5ÁÄ!!Â|jä]“d®„-’>ŸÃ. ¼£«ø¿h›íþ ÷÷â×…‘øq™ðI©Ö+=ÇV˜(ø“ˆ´v¨—+5ÂðRÔJðBÑ*eQ”Im·õP5¶l-•"Ó$Ò5qÀD… J¡Fô篹…@P "”™ô¡rFîçÖ>Ó}g¯ì+ýHïÞ“„=áý®ï#ž©ç“¨&ûü-õfùŸÛLìŒ :›œ‚xѬì†J¤thº$DhÔ§$˜Ë¡®½©d:}1'&É1Ù¶­þÖ1,Bgדâ?]cm¢Ú€œ|óC¨ ”€®[ôDÑ•ï] '.%á2?ÐC(¶="DuÐjj@/œÌvYg‘ÿã¹÷Lð£¿ÍGéß¶OHþ?íãù‹&ÿÿÑ?ý>ð{¿òB×9âú!Wú_å\úU½u·þó›Ìß)Y~Öà+8x·"6‘Õ—-“[)^ ñ.µ0´<%ªˆš €¤Ù4(Ú€)7)ôþ< ³½¾ÿ(}«œôä3‡ã¶²Áç ·ÇÏ›6â¥c¼Zx^4Ý.p›ð>ß…‹Ìÿ¤¤úYxÜö=M”þU¿ÛñÉ á*Yû_ËOš£Hudzü,P? ø¹£9´‡Á”ÇÐFëáS«‘þÑùa¥„UR®Í2È•¦@MjÐ(Rd@¦€a{€Ö^ïjÐyú£zHþoc×ô—ˆ‡Ù× ÜD8øfõÔË™¾Q<“@yöŒ–s•1¹ÓŸÇí‘RÞ1a‹6b–Wk!.WxÚ:Ð+nêˆë@s¢Háh£‘|…õ:µ"^еYi¹JŒð_CX‘œ-l¹a™g!®ñl´ÉÈB€ ’pœ">Î €Çà÷ÆÊÿˉ éRŸ Ýí_†·u$å[8·g'ky€0,ißH »”ÐMKÑV`Q—Nð(š™ÝB%Û[ä¿*"ÙÈÛ¯ãïü"¬NüÉG´÷œ•†Ò“/çî—ªãe¤nä/DRü–É}±ãþÔ:òz é¿ÃLôg ŽíyGòÿ™áG?¾ËG?Ó^œÒ«œAþ?ê+ÿG\=Üzo»¿sëʹæ^eÜÿ7+&ox¦oyV_ÚedþõÂòú R–Ò.ÍiÎUm”ÐHZa”›¦B§ZÁ 1 vd>l6iÔs‹š6òüéïT®ŸÁû#®®>›6â¢xž§¯ †».O³þ‹Ìÿ4ûtÖgÎ[ÖãÖ3¤CÏAìš>b WÙÚÿ"¨Eª[ŽrϤw®W®°~?®ÚEüÜבb_:k âÀVBXçªiëo'µ"‹ôÀë1‘@£He¤‡«–v•td'aðô”>Y]/Y1˜B]Ù ^ ÖÒÙúüĶ»˜ nb„n±_¤}ñ’þŸëÖc›QÎìÖtÿ›8x×D‹O5ÈL¨n¸"Ð.”ù[%ñŽõ½ {žØš+@¸7‚ã87WÅÔZg8±Tü$¹4Jt’^›Fœ–8R$ɘ…0²C“yÆSâåÇàÑ¿üöËÞ„ç`WRÿq•ÀÏ9¯ª€k] zø}Úòu´èáѵZÖvbXØd%ÅzÈj´êyÍIì2%˜ Þ^N†b׉‰Cn¼‹¿ñ„æû°ÿ |¡æ¦³Ñ+çl(V}Þ´‰øŸ “Òš\­)b•ÞÎAUejåÓ“ÿ¶ ‚Þo‘ð'öàØ¢¡° X´ýPlŸ%¨Ü­ˆLÄDƒ‡Ñlp•~W§ÄYù÷§'ÐÁòóF¦[+€“• Vµ‘ëuk­¦ÜÚsT%Lʾ-Cl=Þë°ÍëzVçÉPŒ£ªÝC†wBÓ*Gëˆw°7ögF8dí†2 êvˆw¶·1nöïm®;Fã†ÌJ\bÛΪè¾È_O#|é•&ö¥ß÷ÊÓøˆW  ^o…ÉJ9i”¢´j-ԕ⢊¹#V[1b¿k`ÉX%›°¹(”ØþäDø§ïð òÿÔcøù•ÓG€OŠoýÖMÞýí[×¢ˆî*a}¿eý E[¥=QÂI ¬”æ8Ò<ŠÔ‡IExÍ"vù…ØÄÞÕ·Ò·ÈE|¹%@²üï ˜rn`ð—+ûó•Peó¶d÷Õ<ÂæµU3mã*_L_aŒW‚ÏOÙ¾èKÇ®íÓ­÷žV¬°KôðJFúOcO>}£x%ìˆÄÃÞ;a¥8åÌk¥¨w`vånî('…ÝìK`õÀV))<µùôŽÇÏÝÙ¯q1¿[2¿[rô“E™î„e¤Y*ÕžUW±ŠP;ðŠŠUQuѪc÷Ò(.¤€¹íÛhj`-0ÔZ„$ŠiéÚÍ@ºSÐfÁÌ@I›U´hšjÚîõˆW—"Ÿ“¬âÐÖ–ðá—è—ÿ;=è±·RËNQ6ü¼‘˜Ò7=N‚žÁÉéÄªÑØ²üßµ-*hˆ°ºOX}Œ6Ÿ¡uD:Sö‹}g‚‘Ê…·JÿŸÑsY`R7fʤ”Ó‰{q]xâªNÛà:;v«†KIúht“;ˆ¸_|wë[èáÏ?!|¬ç®÷Úþ—‰3ûÎkO’A$Ýüé¯n”ûG‘“•2›¹¾\+‡ å`f-¼£s`Bì7*E¡¦ý²õùäöcÔ KÿIÑ;N˜”0­ ô©=@d'⡳Ǯ‡’–Ùùc0-ªý!*Î ß›µD…ÏEù`Ž&=Ñ?bÄ«€/ å‹»½[Êë­p_•šÇŠo•8$™­H °Rë–¤¡DE\T|kmºÓþµ9ØŸ‹™à´ÛA¡ mr … {µµp‰m-D¨¼˜ƒ@"ý½/©¥€$IïõîÃV…¼ÓNÐÝ^.íC·ö÷¶/¹ú?Òõ5–@’ú¤ã"Ñ7Ù1Ÿ9Uqƒå —Ÿâ6ÁwBDEÑ(½º…,¦¶»²JªôOºDü§i=ŠÒZœ3‚wSpß|¹ý.<ú𣟡Gбü>ÿ&Ȳµ:ص6Ùì$úwUý§¸~ü“»|üó×Dúoc§ÉÿÛçµx \†ÊÿQ0âqÈ6ÿ#ñÿòðÙ÷–”7„½¯W4G?s¼æiN"Š2y³¤=Ž4'7·ûj»PüÌÑ.D)Hn¿j¼A‰ÖÙé7; Òµ>Gßò·ºœfñ€m_n,S¡îr Èsš× ãáêc›¼N»ŒØÞÞ ñ Ä0Sõ$Äÿ“’ú»~ŸK‡[ïMNçõ+³ŸoüÆüeoˆ—߬XÞkyðç+Ú¥µÊ8ù¼eý PÝt´«HXF\%„U$¬IvÿíÂ^ç`8¬¬E†x!,#aÝ/4‘ýV2´Ç¢T¨=ÉôÖ—)ŸàÒgÃ4tذÑÊIŠ]ÁóYã×ÿço¹¯OIgÞAðèÒì9DÑÚúÆjgݺkƒ‰^’ýÿæûöçm‹F‡œô“~MM¼ïÐàúÖ€s¤´ò<¡…€¹ˆXá]W±geÙ¢‰rbßA®Î“hIûüh4öH&ný»øýÿ€PÜ€Ï>3/éTÙ~¹#ÖtiÍbSrUz›ˆ±Â÷óæ¶À>0 6>©„s¡*L€1ŸH' ˜VVQë4­Ð„~>Uº¢}Eìó@&þë¦wŠ(¼à½pcîhƒ²X›{Á¹c±6¡ÂÞ4ùàÒ®yÉÇàw§ ˆXÅ~P…N"Šk~“1â+à‹îüpÜ€"(¡VüqÄ%«ðreBQ¥h´*RË€ÖY[—Z Ö" Œ¹•@n„Y -,j¥د„Ié(eêjƒšÀ­¡LVÿU&ôEðN:"Ÿ|}“œ,QP!Ú† I¢(—sý¸­Ç¥ÏÛôäE§œ6ÝF÷€¯€[ÌΠ»³þOâÀLþ»¥¢¥&£$M.h’,òÓÁ  êÌ) ‹)d¸ì!6Hr;On§´i6o¤Ùæ_’ÛàcD™ÛÈeŒ"éÀdîáõ÷»xG>¹NmŸÊ·e@&ÿÏj…´ƒÜß&þO½¹Žå68Bp& Uû‹i¨QˆÑu¯cÌCGŒ’þ1ºîý<ŒwËJÓ€4?Ýtû’3‰f?½ýá”Éÿó*ÿOE'ϪêðÁø?¼|òĈó0}ÃóîoßâÝß¹õ²7啯~ÿ!1(ÕŠÏþïëÏ[&¯yêÃHý(Pì9br˜¥ M4GÓ¿Lê§Jÿ4ìr˜y˜ò•³ùßiñ?ê¶_IŒ€«‰]qÌeÌÌœ·M%Ûwa(¸y¿ýžl-ãI·e˜Ý^Ö³b|¥ìÝïìuãÛ½ËÇä#FŒ¸Ì˜½U0{kŸ£Õ|ø¿”?])¡‰àkÛž¦@¥ •K>Á"/¸­j}è;«^HLO÷¢ƒ²Pû*4gHƒ"Á’º]ò>€ÖŠ;¾G[| 'Ÿ¢<—ø:Kú6Ø.柽#ÊT…¹*@²GL|€söu寢ppsÏqs¯oPxaj-ò¥¼n•‡ÇJˆJU ÓäÜàT¥àR €çq}‹i»ÊÂ~þ£e$ªµ&áÁq¤n¡ Úµ2qx¥JrØ´åþî¬àƒ*ð¥×ÑžĈgˆ#Ý *áÖÌÖ‘æ(nx#ÜëˆkRk«R¨ƒâ‚à„`®!(.ҷ߉@M¤2 À®CÑ[«U¡àD™zAÍÆ\fÀªÿePýµðâº*/VåïSåÿÐÀÚ²oµpÛí®ÀäAÕ$r6ê!? ¨³ .Ç‚)I¤R˜*2 HSoa…Ú Ku´x±‡©ž³G.3›™¹$+¦l<'u£› þ£O«¥›>ÞpNîŠÑå={.tŠÂ²pÓå¯ë,ò°oà »ÄÃm¹Q6ÿÞ.@žoñlø›Ä}&è{"“Ôï5y¾áüCt"¶æí6éòÿ–ÿÏ‚ø‡‘üq¹1ÿ—'5Lïzö¡¢&([“ IDAT9ìÿbÉ¿a.ÅA`ÿ[Íq¤>´ÖíI¤9ʉ£]DÚ¥â§V½¯µUõÇ&µ1mm¤¯ð@äjй¢n‹¢€n¸- æ?·Ù±í‹è˜ã¼ò#ž¾*Ñ › CB}øÞ®õ]„~9oÙÃùw‘ø²cÚyë:kÝÏCký!±?’ú#FŒ¸n8x·â—~ç6ŸþŸÇ<ø‹7uB{b}³üÄ¡QÍ`qSÓZõ¿j³ÌÒ`—ä°ŽÄuï ךrQbZnØfåŠÿÜ @\"‘¶ƒç!Æ øîÿþ·»J²#¾róbÕG-Òõl}îÉÖ$P cŒƒn°Ðê.`Qû¤PM<¿öÕÿYà"Š”@©HaBQ,ÙÛŠ¹šÔ@kÕ|"z¨„ŸüÙû­ôˆÙ3þYïÀ³…B×!D«ŒÛ쨛§yþ˜8Ô~²6@í{õªÂ~×U­÷#4­}þщòÙÃ@Ìà›ŽIiëòÞœ6lô¿Ò>&ë}Õ¾êl»YÛɽÀIÿLK#é>œE¾,ŒÜÿÑ4ò ´áˆ#^z…¹À¼àõVhcäØ R‚¯èlû‚Šˆ’õŽd~£à5šÑ‹b•Ù©­€¼¦ÏvM\µpÜÀþÄÑ6&$Ø›8 Ê™€'YýK²óíDÛ–ÿņÀ›ÖÿÒÛþ»A;€Áôí*ÿQ$ð 2õ’ŸG†ýo2¤û‡’„]~z¨)1ò¯ÅÝpÈÞA:˜ôd; &š‹.)OÌÒ?ÛßX±¼žâÂÌÕ4Cz'ÿîÛ÷Éa¶M zÚûi²ëÑÖ¡GBüé`öXÔÄCt?Ûë{ܳÜ)’ÿŒõ¿dÄDÌg=“ýýß`_U${š·Wf ýÍ þn<‹È$ÿ.ÑÀ¶xÀ–—Û ò_ûí;ü?…³¦? ¿ÿHü¸Ì‰ÿË…å½–Ï¿» ºåX~Ò²ü¢¡9 ø¹£~h#ÅžÐ.¬€ÉM¤«øob£„FYn·Mk]jùÊléo…NbB¶¶oc:ÌYvÄÿÀÚ¿sÈB`ë†0âÁ(¸z¸L§g—~ý ŸÜø®×Ûë~Üw2|xÉÛ%8Ol°k¾ó„ çmÏÎy¿ -øGËý#F¼Š˜½U𵿻oöWQ9øw&¬¿hiO"~/©eWA»° Z<ø 4ÇÉþ­Há›bÊúhu6[©g–¦q$7½sn3–mk­í`.v'»Æ¸ÿûßÞ°½ŠÕÿÃ^ãC…àUÜ—+”¤UÁ¬í»é¼Ødkö|wþÔ6<¯­è™oôë-*Ef©"2 Öâ@ Ö­âºN,±zt)èg em_h(PñvPx‘žƒöÚ6±H¢¬“µ‰¦•0›Hç}°]xúkQÌd”%ÈÛ`@YÀ¤–µÒ¶Ê¤2òªöù[ûŽ“•Ò«´=˜™#EUôœÁ³øæTûv`û"Ô­ ŽW‘&ØvÔ-ü¥ M•{·”ûw•ÍF»þ#.#¬M€pÇ܈²±øu6ÜZqu$×DŠ:}H•r­]'iפôE„¢QVAÑn”‚:sÃ" +§ÔÁâà¬=@%æ $R`‰ÀB¯PФV3‚&ðišP8ÁÅ^8à&’߆^L“Ö‹Øô«\ }•ÄÛ÷¢!^xL8´òß õOmØ ’žÁóI®þW¤TÜ4"7JäÍw½wAæÀýøiZ 4Ø8ÎD‰…ÚVˆ=Gåuäö1¹é¨"ÎuÒÙúï¸q>‘åÿYÈýz´0ǦÏ"ø&96•¨÷½ ”'X߆Âáô¶¿ìøiãÆÉÝóªl¾f@Æ+›°[D?ô–þ§DÓ¶ÿúÃ3o£!‘ÿƒÏwÛ4'ÐoÛö~'8/ ú‡ÿýã‰ýß}`ÄåÄ·~ë&ïþö­S-|G¼<~°¦¸á˜}£¤y(æŽÉëíI@ä]ZÿÎlª]jyиRˆ@Û$w_é+P%1O%VUßX7J¬Åª¶êúáu/hië¹sà˜”Jˆ‘UmÓ²%LüGÿól\rU?‰Ç¸ï#:iùÁ/DNfpïf˃òšÝ4FŒxp¿Pî£PÁëOsiO"åžK­Ø…Ue±©o¡ž ¾ÅÜDð|0Ò~U*ëViZ¥ðž­S¢X‚·­”A½qŸËYFÁCç Î"šˆ9 8¯Ð¨‰Ú<©ª? }ªä÷Iôæ;‚ŸN ÒÏ»Ñ&€žôÏÚ½Þù]:}ÝiÇäT;“ íþõ°.=Ïæº±Ä][ íHý>e$ªŠ ÖåGz§12AJ5€ƒ›¸ù¯âª_™¢º"î—°|„;z„úhËB öCx‰B¥6îHBiA³+–ØpmÊ_\·‰ýäg)¤Ì­£BiÖ?1­©†JAÑí4}Íô÷õÛÔe /gÜì~®Ü&Ë•û™„ï‰þ^ °Ù à4áßÏ¿MöoÎÓ¿l⩟ŽÛá±cÛŸ†ü¿ñŸñÏþâw/<ïˆ/ #ñ9qïN8þ¨ÆÏ„h¤”Î]4 ‹b«Ä6¦b£ô~›ßï_kng1b?ÚëÞæ_OÙüÉüaÕÿF>2 ª®yrÄnŒWŽ«‡ó¢ÌqÚ>É:.:oÞ§¡æè,1ÀÓFÙÛ¤þö:vùb)›!ñ¯;¦í\çÝïì9€»©‚ÿíïì_â§„#FŒ¸¼xóoÍùéÿzH{¬L^wÔ#‹ ~ê+X~Ú[¥~L-[+1(Dh—‘°TÜTú>ZÉ>ËÔ±ƒá޾Y;Iþ]D?lÞ¹^ÁàúÑ¿üö•$Æså-l&—s5®2pHÏOψì1â\ þY„B®þŸäÀÃí;ÈÁ/"þ5K®¶÷¡úÑHˆvmk¡óogÉþþ²’ÿ1B iíÌk14)¬¿õºQNV–(1b¿*„Ie®…ûìTÊ„“bËÏmšTa?Ìñ—…‰ /¬š.=Mt²¡Ÿø*dˆðÁ$ð¥‹|oºáˆ#®¾(n wJö‚p¨ÕüZ‘=p+pk¥™ ÔJY+q¾kuÕ8#p§ÂZíYª‘þ¥BƒâœÐB*eˆu„(JT¡Qí[`"ª#ð£Õ{¬üSë€Lø§¶~Ð:ÀœÕeKГüYp™[ +þóõ\è¹d!™§ŒÐ Ùâ!ùR†_‘˜l•þ#Gã`ãœm°Ý£’x!WðW7ÿ&Nn‚/!NˆîM˜ Å#pšî•i=…ƒ)È,Z ‚d­#ölU ²]G¤ÉÏMf¹/ÒWÞ?×ïÍ¥Xg;s7¼?oß«sk…üöð½+ïë`úÇØ¡]ÿ*Ä ›þÓ¤}žϬø?mûÚú@ü'€Žôß"ÿwýÛ¢ÍýÝ'!ÿ¯:þà÷~…ôO¿ÿ²7cÄ3Ä­÷&¼÷»¯ƒ—Ë{-÷¾»àÎûÜ̱ú¼A*ÁOÄZ—>Š”‚8siÂa㈊¨tíbzÎwØ­'¸`¾Ò=;¤ËŸÐ»C ›n¤1-d+o)Ð;õ0˜v³o#®FÀõ®HèYžÆYÖÓôC*e{]YÞN}ëŽiÛË9¯æ¶ðw¸<Ùšé›^n¿?eúf!·ßŸÊí÷¦2*óFŒ1âÙâÿhνuÂñOjfw Âê³€›¤„R«”û Js)S W9äNoûŸíþ;5ncn1ôŠÛ a@ˆ$Óù.’î§ë³î×4ÀþôŸ¿? Î7wò2å™üo“rÚŠƒ¬wÝ’ªëÌ12R5ˆdRñòî߈낔ºuŠ&ë^™*r°¼‹›þÈ-K‡´Hó}tõKòÓ`Iœa¸ Ž g@U7.•N *,Y¼ªð¯ 8˜›Ýˆ¦êǦUk%Ds`tî«Qm·Ë¢'ïgìM…¦5ÑÏb¥´Šæáξ£MƒºIÙ“VÛÝ.*øÒG~XE¾7k¹ï•NÎ{41bÄuÄýB¹ŸZ¼í«½Èá*Q^™€x/øVM³…D­Êß)UÖ^i (Q‚¤°¸¶R‹U2Z`ð(’ÃU @’ €‰|’^‹¤a®öOó…Kó;é[ìl¶èE—A  jñ_H- ¼³HnÇ¢2)%Uÿ[LHjqñ\bÂLþG#ÿs; ŠˆWs(‹ SÊ5’>—IN@͚ȇaÈ:Ú"Ú¢A‘Aµ¡(¨—$@ŒÈ>ÈÁ戯ЦAÇÄ“µ4ª=Cu%âòâ¸ô'q®a,Ÿ>0l°m*EVùƒlUþ÷¯ÉóÒvHøÝìýÓ-N‘ÿœOþŸ÷èü^!‚ÿ"E×Ó7<¿ö_Û_b|ù§KÞøg”Âò³€/W ?… I…G–s$ µÍ¹”GrÖ]ÐR‡Ö6)ºtO÷é¶}n2+m.åi)OÙUý÷ °Ç:—n^·vøšæ0_Œ åõÇ)²ú qÞgvé„§ÊÛÙܶ³>·=Ïã¶ë¼u?ég¶Å0}Ó»ÛïOåöûS™¾YÈXÕ?bĈ/³· î~g/ÿ¿%³»a­,~Þyß8šEOž„“@»VÄ í"Ð."Òe!´k%®#®t( 6Ö@µ*Ùra  ºæÈ(§¾Z}åÍfbe#°¾¦B€i%™SRT1BÝ»Ë[-ŸsŸm€• ™è×”ìMÕÿ)RÉû©Z.Nøqa E4Ãq1Á^‘ÊÁü6ßÀÉ›àç ‚Ó ¾8&L>GËcp1õèµd~¿4KÆ_6@&ÿ5m«ˆu)ȤL”ÃE¤*„ie{“É"ï„ù¦¥t‚&ôî…ª‚®Ou>m /Ì’c@é…eLJ[ÖÞÌH©&]'r ï.Î|wÖòAøÒëXÙ?bĈSøyi釿¿žðh¢üÕÑ¿VªbÊÊ–ZW4â¾ñB•ý„"À,Bp QЊ D3f/<aæ„¥¡sØ þÉoľ‘þ(Á¿aõ¿Mæ³YùŸ¯“]¬}È,j÷§˜Hcçúbm#ÿµoÙ^=ëØKÕâÁ¦5÷„ÒÛ´ºU–k&åæ¼"Éi&m÷³Ž 5;eÖVÕªòËU„2Z\àì= ­“Ò¯‰HíÔjˆª¸hbhwòˆ0ÿ*$Î]ê`qH¬…˜QjAÄ­rûù7@ö ]Àô§?‡°D ‘ƒ½áÒ× b¾'÷¥fò}Ãþ?º­ê7 ÿ{q@<Ó`° ê6DCòÿÜÊÝØìÍ}Lb$ÿG\G|ë·nòÞ?~ýeoƈsðèûkËAÖÊÃÛÅÏ„°Rb µµ!¶è,þ›¾ð(fQ@HãÛΤåÿÀú_7‡q?våC}ù5Ë?ޏ8FÀõÇW=½Ï"ùŸt}y9ÛôÇyŸy’íºÈ2†ŸQvïÛ)Ü~ân¿?u·¿=•[ïMeöf1>±Œ1bÄKÂäNÁÞ;ŸþÑ1߬(çžÕ-ÅÄ–‘°ˆÄ¾° œV¨ö …âÊ€L™NÑÒã4›5² éy¤Ñ`$®Á+AÐF VôèŠïöb†¶Çpü1z¸€µ@“H¼ UDf‚;¸ƒìý \ùMp\±¦‘ iV°úÖÑž“LAvñìpÊV?½è¬þcO¸wøô¤|Lä?e÷ßMÛrØrØt `c9 \ºÇàóÈÿ³Ž‘Áô‘ø?£ ÀÕÄ­÷&üÍò5F7áËÕ-ËÏ[ö¿ijÀê5G\'Ò?(íBÐ!B}djvñV‘v©¸Š a€6öZ³[@Pb+] ?Í…IÝ_ï°íóÃñ,ØåÐ Åúq›pÆøˆ« ¯*×g‘öOzêî"ìÏZήi‹ðŸæR²Mâçõ\˜Ô?gÝr÷7÷Üí÷¦¹Êÿr=¡Ž1bÄnþò„“Ÿ5„UdþNA¨«ÏZX 1DB  #Ö‘vqAL…[›òV5.Ä…÷ÓAŠT·Y«}õÿÀ€À)®nÕ; þk„²p¨I¶\[å¬%L³÷åIøåoÎE†ô;É/„udÝX€²€ÊYboG륷¡Í®Ï£í•ÆÂøz=˜ß’ò×ó·è§ë Ø®°¿‚“¿51œX>€Fµ*¼Vm¯V)ˆ»L§æD¶ºH_±_x³ëߟ Ui禪›(@ˆ±7e)¼l,··’¶Ãfݘݿw¶¬“e¤ðÂG”G'ÊñÒÜNVJÝÀí#´rªÀ“È“8V÷1â™ ;üí¦ =|úyÃk{>8damNªÔР¸V)Öƒ6*u€#‰„Æ’ÇwæÂ~e÷©J^­º»LUûÃ6‹w²õ1¨úÏnÛN`Ý*"š¦i×vEDX·a«º¿¿ ›mU^Ô}|FMÎU•p²RŽÒýÀgl»J;RÛ¨q+…±‹Hþ+Ù»Ìï"Ÿ5®¹‡º{hha!f׿çAñ0 «ÂH}/ÈÊ¡!~ ÇPˠ+‡6Ú¹4à€´òèô6®x ço‚+)¾|“8¹ågà"jŸ;+«8â©°Aü»ªêO8jó‘ û˜…™¨§#ñ·‰ýŽÜߘ›ÖÿÒ½6ä×ôëÜÚÆóÈÿá¾ÁHú¸¾íþ¯þè¿üˆÛÿÞ”·þΜå-ëûúA ¼á:’ßO$åã€ìï‰þØÒUþ÷„þVõÿÄå6:ŽÑCat¸Žžî_5¼>/Lß%(’ï»»ÈùóûÇ‘ùÛëØ^ÿ®ñS¸û›{~$üGŒ1âjáöûSþÿâ§|ã?=`þNAýPY}ÑPî;SÞ›åu Js­êZ +ÅMè‚n Â(lø¶šv¨šÍVZùuÏÃ\ìr Ûìå5ƒw0Ÿ ÓÊúÕEö€,Oóº—HÐæ$o“l^5 œóʶ» FúM+Kî¶-”¥ H.2ÌqøêØ&ñ‡Ñ£¤×Èö Íäÿæ²®¤;@.YOãæW‚]_¢@pÄuÀ<$N>$ú9¸Û–dm—?#.¢ë€Ö@VQM/™ÉIÕ“›vÑN`>ªÂYæd×ïgBˆJé{jQ+ëÆ¾¿LÒ»Aê|¼H"ñËÂ&­åóGÊÉ:òõ×<{S¡I&!š»‰*üu¥|¸ùÑ,òÿì„ÿˆ#žþõ^àÎDøOöæüÕŸ-øâM¡\)Ó5<œo ¬”µ*ûf-´>X唸‚µ‡ ¯Ð¶Š ¸Ô>æJ}z€“,Øý§é½Í¿‰Ò]cóû>ÏçòkeØ*@¯ŠÕ,®û"ILZ<ßMŽ ëÖbÂÂÛ}¡*¬5Lˆ°X›³ÂÞTX׿S•»—eÛþ¬¶MûØ'³µ(B@|„sÜkwñ“w ÎÑF‰nB ÇøÅ!ÁGäfÿæûP–Èÿ†ðq²0k$¢âÐV‘UÒñЈUÿ¯6­6)9L¤aCºS7p×ðyçEâqX§?Àfµ?ƒ×C ÿ<}Gõ>ÛïmYÿÛûÛVÿ}+€él ä?y{+þG¼ íþ¯¾øã¿øŸÝ@#ý¤¦92‚ßO„úAHä?Ô"q­¸RñŸ«þ1ëÿA2¶æÑI­pôгÆs~6EÛ0Îy=â•À(¸~x–©¼§YÖYŸyܲ†‚‚]Ä~~o×ë‹.G¹ýþDîþæ¾$Ò$üGŒ1â böVÁßúoߦ> ̾VКGbîhW‘fñ…Ð.#í2twŒvh–ÑÚ4[=ºjEJI½¹zq@rÿ®ì 0´ã"gá@*?=¥ÚÍÃìØÄÿà×#í¼‡yª¤ß†ªõánW6)ŸmÔ'ErR5+u`Ý@ÓF&¥°7–µ¹4­½²ÊïYŸq ÐU«]V2õJ`£y¨ dëõFÿºm Î¥L’ozC=ãŒü‹Ä@d¢*ˆ EÛ”œ?\¢òBÑò¢Ž¸þ?†Å]+²V(äÂq@[ŸÊ/ïw’“QÍŠ?@–…0‘$àI–ümT|ê <8Ž<<6ÁÑÁL8˜‹õ±öÖ×Ù;kY¢Ø× IÔFX5æb²¬•ª4QÀa¥|zCùã¯þäÆHø1âÅâ~¡ü‹Û wþNÅ·jÇ>]!{Žj­¸…²º!°´y'‚¯•2Å/uƒÙÀ ,‹H`!z¨¢PbŽ)¥ U±F,Yè^@r ¹Ác±_÷Z¤]:á€3Q€Ð‹µ:AlŠ:„ ·€ÞÉEúv,òôŽŠÝcBêUŸ[Ë8›{Ž69ÁÔRp¼²ñÛ¶þÊ[ü›·ž—{A2v×h.>{w§BnHq‚DAûÄå>¸êu.ì¿e…V\k¢BuhƒÝ\ …µv±“ hÒkÉ¢WEƒ mDê0»GŒs”)hMhïÁú!Ú†ôü3ÈOŠÇþog2žDÜk>J~Xö‡;*ý³åŒ®sÈóØs¬¦e¦ñhbÕÓb€Áë´Yº²MLéŽ}ɉÿ§Ãhÿùqë½ ïýîëÜþöôeoʈ âá_­8úIÍÍ_žeõEËü‚øTh´Ž¸s#mÔr9¯Ø9Úk G€sŠÃqÌÁoè µ/NJC¾N:¼.ÿ¸•{Üv(½ƒÀÎQŽ¿à(xµð¬OÝgµ<9c|×{g‘þÛÓ»ÏMßôÜþöÔ½ý}w÷?Þ ÿ#FŒ¸&˜¾YðgÿÍçÜøåŠƒoUœ|Ô°ü¬eú†'œ(¡Ž¸Jú€»Ál¸šDÞ7FêC€‹dÂ?)q‡ÁöЇ>† G€W ‡ðë {¦žJZuÉZ»-7Žnï;ʉf»þLü—¤«üZ(Ž•²PÞ¼é(=heDáºÑDúKr4HΤ âÔo\R=ËuµŸæØ>`N©ÕÏy?ãT(§§]U!€¤CÆC bdŽóD hý=9AŠQê]×è*¢+ Žø;÷õ÷ìšöÑ_Zõçeþ.òÏ“ DE…ª”β¿nl¾ªHbÖ†"Ö»nÁ;GU&»fÙ|Àpöµåáqäx©T…ðw"z3ðדÀáäå|#FŒ1ÄýB¹_ÞúzÅÛ”OÛ_:^«¡ ‘²„yp@D½0IL~ë×@ÑZ뀢€J…RRG  T+ ÷Ú»X÷¾%@'zw€D¶{v8 ‡lýÛïC&ì{aÀójcBH÷†²oùôåaäÑ"r÷Ž9ÁL+[O8ÁÄh÷¡6‰Çòr .!2póÙ¨P¹àöžš+bvH>"óˆìÝDf¿b<{ûn²FÖ‰–ýWôQƒþø_ƒ8ô~ R€ó¨+­ÝdUc‚$ò^5ÿibm])rü€Xüµàöа@O>„“ûè:@ë:2BDl}§¾ˆçþ;ßÚ¶ÉO¤ÿÆÄlõ? ÿ;ûþ˜E™ìß´õßEƒ÷ÈÇôP0l °Iìë`»mÍóì þQÉÿ-üÁïýÊËÞ„Ï¿ö_½Æ»¿sëeoƈ'Àò^Ëò³–ù;%Åž£]DÊ›ÍW´¤m µRaQXÛŸ«RáIžÏ™ˆ ¯!/9ǘbšlý£C•Tžg»épºn Óç6ÜFÒÿUÀ©_qŒø*ÈQæ“\†¡þyŸ;‹ì¾w¦pàÖûyû;û’lýÇÇ‹‹w7/ IDAT#FŒ¸†˜½Uðk¿û:ë/[ð0yÝ› W­ˆÇªÿc—¢°ž\ñJ»Œ–ÉŒÖ@£ÍÖ¦âŸ*þk¸dÍÕ· ÀfgõçÚVØÂî@û ÙQ•,Yš«scN¨ Tkm°š Vm¿x¡€œèj \—ˆÀ&Uz/•UmFëukdãº1»×ùÔ*ÿ«¢Oö® _ÔÜ |'3|¹î—ÛÉð³ˆÿ3Ï“|’ue€g̸õ …Wé÷qX‚T,Ñ*AÆ’R+¬ﵮ DµÊ½Ö!+…bôg¨÷¶ÌKŒa€"«1 u«ý9,дp´TJÓÊáÄį8¦¥òð$R¤´ö@žµÀñDùã¯þß_ ütÿ _˜GŒqíq¯Rî½߬K?løì5=¨Z¥âZð-Qñ-øâ ˆR(Ê D^˜+£Rª9TÑœ0E˜!¬T™"T"4ª”¥&&(D¨œPHús’®á&ðNp¢L|"ø{1˜K@Oúï"ú7Å_•ü1¯×î+m´ö'ë>.œ”’„ v¹17AÙ¬²õ®›‘B‹ÙD(=ÝÃ@Þ¾ÍPE7ƒcè­©ò4·µ_ù¶Ó~{òm¼û%ÀѺû¨û„¨-Ô‡&v¦@Ž…p´„¨Z"Î…’³ì꿞ž}Äz@ŒhãѨ¬`ý3tþ%RL iÌyè¤EW˜[QªHïöë …_Ï»ˆÿS“vý&;>ÐÛò“÷Þ¶ŸSDþfe¿j®öVý§ñüÜ”«þs*V’€ÀV™zVÚ 0?eû¯;w€ðßýó }¯ž„ü«ÿ//n½7áoþ“¯1{k¤â®?oðSÇì‚pp•0Ýó„e¤9 ”7nnñs‹ÚËC¶Ë€žX.ÒM„¸Ž‰ì7G€ÒüÉ…GœÝwc¨òCçÑAõÿ°ê#ÉàõYØfßÎcãF\ìüõƫθ8)Þçw}nWhÞee›Øßµ]²5o÷Ù»ßÙ“ÛïMåîwöe¼¡Ž1bÄ«½wJ>ùÃc^ÿÕkÅ<ОDüTËH{C‘ÂRiW)°éK#üU•öʤ°Š„•R•’l¼ì}ÁÔ¼±çsÿ.Åy!vÁxêãûà|Û¢«S㞘_%QÀÿã{Ü9p´+e±îÉõ\a_xØŸYu|¾{{g$úªŽÔv„Ü‹Âfõ˜=`¹h€ÅÚì^g#ò—u¶&…$»ñ>O[x¡(z.y;O;â t BÓw¹!ŠÑÓ¯û¸ÁË‹DLÈÓ%•Ï ·¶ã²‹dg€s&Vj¢ K°»Ø}‚ýi Ôò0å/Á zPJTvë—i’v?Š¢’@Õú2/#û3cõ»Î̧fͬ¸¾E@HÂ퉤ªÀ÷fïÍ÷‹K~á1bĈ-ü¤R^ûVÉë"½R̳…Ò®PŠ ¨‚âœÚÅ4Ũ¡…è3qgâ±Ö[<çš$ît K”ZÁ«°Pe­IC‹P<Ъµ X#ÿ½E´ÝëDà/›ˆw6Í9˜8€~(& dq€2¯\—úª·òœ€rB£|yyt)½¤˜ÕZ̧Âí}¡˜BÝÚý"·2(½‰Ú HÂj¢¾·c|Ié&¬¨ûµ! —]jÓãºk ¢ ¤?ˆ³Cp%è—Äõ'p|‚×ÞlþÅ[< JqV•-.WéG«Ð§… ’âÕ€¨‰Õyb¨r|h±EÀ¶«vÖ¢¨ÛÖN¬y™#Ž‹¯Ò‹ þUô™\g@öÓWüwvÿ}Åÿi«ÿ-ò_í¸´ƒÃ÷ý@ZˆaŠF»Úþá~ôB€ÁvvÛ|zǪÿ¯Ž‘ü¿¼«þ¯.Ž?¬iN"вú´a}?ÐEʱ*ÿ•êWHgós €:¿†Ø퉢 ;©µ…ØÚ¸¦Ø"¿/%½Ý¿²;¯˜)¶è¦ÇÁµö»ër%w¿³'w¿³/og|š1bĈW³· ÞüÛsêÃ@uÇT¸«/[¦¯yšE¤]DüDˆµ¢­Ò.b"óÓ_ ε‰ÄÖÈýö0vÄ~léúquDÄT·!vÁ÷6ÑÊ K̤ ßîg~…‚éÿ§÷º$Nî›í¶‹._i$ú$Ù©ÿ?{ï+ÙšÞwýž÷]kUÕ¾ôåÜæôñÌxæØglÏñ8‰ÇJ,!û(Å""(Bƒà(BŠ=)(hC Á8_àŠCda2AÁØc{ŒÂxÛgÆÇ3sî—îÓûVUk­÷yøð¼ëRµ÷îsëݽ»{ý[ÕµjUíº¬ë»žÿåÉq®Æ¬tÀ{õ¸¼ÛèÈÄ®åy׺ Ø[ÊÂh“LjÏ+O.H*ÌJ÷X·Æñ*|Cîw;"ÿ?Ší‘ÀY‘ÿ§ˆÿñ•¬Ú7$)¢ BòÞLã`ïþ¶˜yq½S|À0Ú|D$otê6NS_Ö€Ô^¸÷ÅiCŒ`& ’N I®`±àËKÂ%8!‹ˆŠè«¯,r2‡€ªÑæ•[FwgÑ ™¤NØÌJá+;-ߘ)_YL¤ÿ„{ƒkIØQX , öUX ì*ì¨03af0kÐB±6bch„¢†2»¸S0br·ˆêíC_u‰BˆBQÖÁ¨¼•U0Ž÷7£ñâl{ 2áAÅ;…ÁãÂs«Š·_¯9žÃãe œGÁˆ­TЙ ­RZ!os*NÜj¨8á_¤à|_aÐúsLr:­ f¤žØó0\“Ž:4’ykdÞJ©1¡WxT~aB+FTO j91À¶Ú éMGkýH-$ ìbßuœ|U»ó@ȯ_Ìü³Ûªr~š mNÍ!H¯G ’l4æMwc“aÀèóSBªÙ÷ÏÓÃ[—ƒ¸QÄÏÙ!x†¥`‡‚½ùû´¬¥ÀòÛØ­5¼¥ØIDšˆ¶Á—rW1 >6’…íן ºï˜ÇHýX)z +œümÄgçj%AZ‚¤B~k·t´<”qØ]ÀÆ·ŸyŠ>ßx‘U"=‹øÏ÷ºýoá?ŽößLèæ‡ýuû^ÌMzP¬Ÿ¶nºÍ„¿€Õ~·:_Û{‡§ÍRòt¦{LCýG ç6¦#У…~|vï-[÷ïçµðÁ(Ȥ?é?a„ ö¾»â䕚j?€Ä…‚T‚” ¥ZC¡âžÐ+q×ÝIz7V.°dhkºé,hm£€ßDwpýÛ€ó¦Çµ¸ÝšæŒé³ßeìÌe£°zm×˦ãBk‡ÓW/®^Ùñb齆è.F\ó…ÛÞÜC“:§°W3“zDl«ppì‘â˜Ç‰/æ^¬. ˜—Bˆ÷ü'=88Ëî4nj£×l¼v4­š–ðä) }ý˜öv V8©Ý«CWÎw"ÀY¿š¶Ž .¿`“`bHåï^1ó‚;Ú«e7_Ÿ½G ʃ ‘!øïÜ©„”†v’ÌÅÁE1@„_›·|u?ñÕ½ôÞŸ3a¸š`§ƒ±£ÂsáIÓ*ÅÒ‰Om”Œ¢ ƒ˜ Éz¥˜ÌïÕ§U„¨–I}?5ê-AYXgB´\,4'fMºâ¡xšÞ‡½'?3™Eˆ¢Ì29zr {q—gŒe„„ñrÓòíçJ¾²3í'"^œ+ÏñÃÈî©ÿ1áV‹YÄH½ËßH·cw€lm”.SÞÈN%u‘@÷1@à²Àsý³h¡»òÏWs¢_ #ƪ_sþ¿/˜tëâ’‹¶ l7ïǼŸŸ£(Ždð›ó–ßÜKüÆDfN¸ ø³%¿ùÊŠ¸«”¾-ÎŒÐÀª6Z…¢1B€¾5ŠìÖoJõ]¸ŸM¨Å(M(LHbDæ8=VŠ¿W!0B2˜a·œ¨zÿõ.J]·t .ê¢Ó;î/ôÓCïõ®ïú÷•¼ÿj*¨Íøf©¼Z(ߪ”o?%SbÆ€W+ãúõÀs»ßyeÍúŠo[å:û ¨²0ÅÄÝ÷¥«¼}æ§G*õÖ+D 0ß®"Y8À è„]Ü/D P`˜"”IJyû…œ•ç…aî.r+€ÁÝÿÑĪøÓzÀ¼ÊèmfšäuÛÂÚSô9ßi„L®Çˆ´†ž€4·Õ‡> ú'‚ÅÏžoyáe?Èñ•)ÁòÁ²ÈH††“0Ã$Þ’ˆîMéIh_Ãç"‚šT‘¢Eö|}éQ——<¬"€mâÿ=IÿmÂßN½|xŸQÌ~ïìßpýãļ ) -Æ÷. ýïˆ{ÕÒÛnÅ,ž`iŽ1'5) Šg¯‚” º>ÛñÿÝääú¿LäÿåÂäú8ð‡ÿà]^þßyúŸßåàÅ#Ž_m˜]s¥Ÿ%™†FõÁÔPËmAs«%ÕÕ†h?øžŽù·á1Œæ1znt;ë˜{.ñ? ç5Øt4šðQp'òþƒ¾£÷èI¹ñÂÞtâœ0a„ wÄìZdùfËÛ¿¹bþD$-õÍDœ B ¹¥Hé¬Wsh„ÊÝÚi©hmHôÞ•´K9 Ñ£w¥Q¿]K€|ë”»™:4è]5=×WÚwTÙÙyO\¬w<ÍJ¡*ìCGÝßObUD<@r+€BJŽÏ…ðÂÝþÇËLä,‚ǺF¸¾'ÌÊÀá‰Q¼vçþ{bBøz·ËE ßOdÿlò߆×l?dã Є©BcÈòhë& é›Úç²é`‰¦­ël9R_s=AçÆXˆ Z(óíÇ1 y™ÅÌÖdF¦w€ÿ$IêB§ìËìcÈ*ˆKõ;ï Éÿuõ"àm^ÌWó7g‰¯ì8é?‘•î&Úß^aW¶+4ÔK˜ÕN.VBBÑÂ]ýYX–@Ô£¶ ubT fÖ‘¦Æ,÷Mó1¹šŸ¥D„dÆQ£Ä<ÖP%ë­ºÿ&½»:žA–vÜ⼈ØÝüÜ3™ÓÖ¨¿cÜJÊ·®ÃW-/V:íc—· ã7ŠÄsŸ¬x畚w¯dñe ifÄhµ¡”µR6n/¨£-¼åÄ\ yÛµL ã©Ñ|^aB‰· (Z§Ÿ}›—!) 9_üµy{Œ9% ŸÎó‹œ Ð¥„^8àâéD.²Á1g€õIU0Ìï§óã1aÈBS#%hÌJß/Vµq¼òño½ÝŒ\Û ¬ åxe¦ìWÞþ %¨úB( ›Aˆ!“ꊫ€È_»Ý`ôhìfVÄzþ¾ý¼m|I£hw.Ï7# !ú´xlÎÆ%IOþ« #Ëü]ƒ¹˜Àð÷oüý¤MyÍ2|F?&¡JØ8ê_B?–2ÿù.f¼ ñ»?øöï¡o©' \HPéýCru–Ûÿ Òÿ,€¿Ïær±ñüŽøÇ4Ç1t‰Ë¿'úm“üR²óß “E(Ðf†Ù¢‰„â˜AX R£ZÐÖó¼þ}=øùÈ@]NÄ¿0ÿL®ÿ‡ë[‰½ï-ùá?óͱÒ+¡‚vi´' ‰B{¬4Gž0Ú&‹Ô·Õ¯ÓƒÐ.t¢„Jе·"µäu´TÚ@(ØLm­oCêF¤,$È5È.u”´)èEyúÌû 3¶×òÆã‰UpîÄQÈ9Óõ"ŸþÂUžùñ=¹þ¹ùG|» &L˜ð¨`þTÁê–§þ¹šc¥:JÄy ])íÊЕ¢k£] º2(œü—Wò¼€TäAxãd(@Ëà©­·>Ô6?/>°ânrLŒ¹œVËmœ,…AûeÄí_üm‚㕲¬Ý5¿3ªbˆîq¼þe&¿;çÑIUêvpöžï)»‹Àþ ÃóRÜVªJ½ Ý]aõ£þòñr<ë»?P0Û,8o“ÿ§€SåÒÜ›VT°[ é¾îÅõÛ-š"ÍÜÿ¨Ù]Wx¶\è—Ìw®4I^´Ô4ØU09 ™KAŽÛF|°_é›e@áŽNº[è5^`hÀV—aÝ Vú…S¥KŽWPè“7Þ Ê—÷Üík"$'\n¬…_ý”q|5kc-Ærß!±u!YHBH~“GûG…ÐúüB€˜£ÔÕ‰Ó¼Oz©B…O‹ÁL¤'[+`ÖíÔ•• Š1Â,ÀJ•*˜Å¡y„*æ„€øá#×CæA¸Qn,áG—^Fz'*/VÊWíÔ6àâÅ™òÔ'K®¼TӔ¢€pè§É³C“ ÞʵaY˜2o\Ȱßz2@•Ó*NävéþL0’ÛmNF¯EóÇù¤£¹}!ØVómœhÑ 6.d”`1Jèž÷ǧS.Âh:Ì0V&mò”‚em¼u ¬kãOî}7¸¶#ìUÆÍÛµR‰P$@Ô#î£yÊØÌs°ÒÅÆbMÀ¢ø’kéÜ£HúVÇ"W¼ˆ‹{$ä 9 Hj:Jõ ¨€Hð1ϰ³Óûÿ5'`¾2K…¹!3Eº±4‚ÕÖÁÅÎI]Lã¿ ô°®{•^^˜†Gþ‹ˆ_'©"e@®~ÌÇb¯ÿ}öñCuØrû߉ô·Ù`[Ë•‘ *3Dÿ³Eðqþ›Dÿf€0¼ž< ÍÃñ€¡HqŒiA»¾ŠÄšP"q‰h$T‡I ù8a„ qìÜ(yñïÝ"Ì„æ@©”8ƒöHiŽ”0ÚãD{¬Ä¹Ö>X—é–‘VŠBZ)ieH)èÚÛ„B†x¯‘ ׯJÝq+€³éÛÓ°yƼ¤ƒñƒ_ú!ŠhìÎ"ƪ6—Ê¢rB¼ˆ®bVƒ6y]°Œ–¾søw}Å»"fÜf…uŒ°¨„x5tæ)Öyû¹{=k­ÿoó;Ú˜,ÐóVä‰1ù¿Eú“ɯA=3z.OK0¨öv¢s¨¹#bus® Ò“ÿ’]ôÖGÛšã‰pÍ  X Ö/E€ôǾê뎽hPHé>ËßWL±t%H«HÙÀn$(¤£Æ{wÆvÕ»5ñíê»Òð•Ä7fzç?œ0á#¢ja H2®/"åP¨FPOñ.’1R™´ÁcÿiÁV Ñ…s¦ *œˆQ*̬ C*õýpQ%К؉P+4âde)²ï§>˜c×3Ù  PUm¿<_Ü„__´“à’áÍÂxâÓϼc¼sØRTÂ"ºVÚÂO!e‚6§Wt|O³p±ŠŠƒf&$q½\iBÂ<¡47Œ—&@¼=B%Bk–‰ûÜ.@†T€®%@÷}Z@&ë;.¶âÿÙ²l¥[øô ­û@2ãÄÛCiá/(²˜¦n2ùj>ÞO BRæÁ¸2ƒy0æÑ¨k#â$zèz•!{‘°·ƒ•b ;YÁ±Ÿ·Œ59ž?’Ù{ˆ.Ÿ›‡VÒ»ëͦNÚJô2î‘Ðýèd£±—BiÈÂDØ °»€Xú<^¢GšÇ¤Y1¨~‘,28³BØ}5Du¿¨AkØÍ5öíÿÇï®ÁªK‰xø¢}ŸÄÿ˜ô?ƒðßôŽÿ±èBÀ©[äGø>i×@0‹ýkª·Ñ¸BìR³ðóˆ ˆ‚4 e^¿BÕ€ )•ü…ÿü—ïÞ‚½Äøâþ<?÷;?}Ÿ¿É„û…/ìòù/=}¿¿Æ„»„wwEy%pí³»Ô‰æ ±û …BhMwþVw÷7ÇŠµ†Ä@Zu‚€à£b!hƒ·­¢mÅþ ¿^oÖOíÖšOWô5Æ®í(ù/œ0šîعmâ<ŒxOò&À„÷ÆŠoÔÞ뵟þÉ«<û…kSÄÿ„ &LøÈ¸ñã{¤ZÙùD‰¼ÞÐ)³'œÀ³dÌ‹„™Çu!w|:”‚¶.%X£Ù©í‰i.ȃïŽü?K¥ ƒ™eDþ÷8k@þAΞ÷"Nôï/„²ŽW‡Ú´°3óØü¦…£•RB¹óUòŠEôÞ´j°7L1BÝz+€<¦¹*¡*„ºõ¾ÏXW@æC¥ œù76ÔJaHjïLUÆdu÷øNäçFƒìð‘ÄÔ°hîXK¹7m0w¿™šÿà E Š÷ßÅ Ÿ$6÷®M 1®%Â÷<‹O`·^F_}}7\ŽHÚ3Ú$¹ñre½k¹ ;s¤šyñ½­‘“·(§„ì ñcŸÁV`¯üz ý[?0Ûðbåÿÿh¿½ß_eÂ#„ï: ¼ó.ÜRãã ¡8¼Þ&öŠHl`™”˜\`щûRÝ¥H+amp­öB ˱ê‚Fó˜ôàŽýÜ­ˆJepYw„iï~ÆÏ—Î@~Òñ|j´æÇÒž½N–i“0후éY¤*p*fýOG>ù7Õøÿ®NÉ—o†>.<¿7çõo,9Ü7žÜ̃à=ëwk'·‹àB3¨2A/£qNiP’£î Ìj¼°XI âÛ²ÿÞ ŠÏï’(úHñí_N¹ýGÛâÖvèß§k[Ñm—îlÖGÙã§ÙªŠ, ••Àjíξ5­‚0®,”´€u­$UÊh„B³(dQ ןF®} )÷°pŒ}Þz ’bI¼ÐŸÀ:·¾/„³O'@|`xÔ?œ¾žèwZ†ç»q„™÷q( ™+r%À“ßEØÿÈ>¦Çpô^s»b¾îc|}'6çiĦ„ˆc3ÀnGÒj墇TbqH:x¡zâkº¿·Øn°%覇aµ@Gôkçâß$úÏ"üÇ‚µL0aýs.¢m!Ô$Y‘¬¥kB Hq‚X¤]ï¡íS4͜ԖüÅ¿óßßõåy¿ð×>ûwáïþî_Ï×väÿ„Gó'#ŸýâLFƇë›-/ýò»<öÇ,_o8~¹ñ±q%4·“× q¢¥¤¥‡ÒJø¯èÛ„öÎÿvÛ4dC ±3åós_Kì¦{ŒçæÂ%¬)N¸«x¿kÝ`L¸XôåÚ1®=?“g^Ø›úâL˜0a„»ŠêjàäUwÏ®Fwü̽ Ý.óÈYs±ðD±@¨„6;ÿË+Ùíß(ÚXVäæ|»ÕŸkß5Èëx@Ft×8`cÀßWtUwF?ðâ;çÿY(",*XÖB“Œ£¥±˜ Iádý`‘‰Ð‘!Ãb¼ø»˜åç¥ã§Í fnÌ¢*Ç [ïùÈÿŽè÷‚¶åùÐ$w¢•qTOU2áýÁ?ëžb»AO^w·Mò_Æ1B_(6Á«ÍÝU®fò/\K0Lü½,å˜Y‰† ¥B)Þ(EÔÛyH±eþA‘]AÿAâìs´ö[pó/Œ_6cùx¹Eƒ2» wrõ ]ìšô IDATrõ»òq/ëmìàۈ݄¶EʈjéÇ*¼Ï±Çç÷nFc|y¯ñ¾ã“ÛÂ}Àë¿»äOê믦ÖɽÆÖ7Òº°(´NþÏ,;ÙMí1¡ËF(*¥Pú>êÞKÝfCOõR¼Oz2ë§K1ÞN Ìdj(£Pq^û†þéIZáN?õ##'ˆ4'¼s[ùÊ"ñ彆›S‹Žû†›…ñu?öéþé+K^ŸUiÌÖp‚QŠŸ.SpW•Œãù³Û¬tø·šPwò'ñ×—ø6\â®ÿN´Rˆ0Ú|?«t;Ãô@üwd?ÍX€²à׉$»ˆÿ^pJ(p–¨ÅO‚!˜wÓÉçÄ"Â.d¬WJ#™RÌÔ“°æ†j"ˆ"¾cW†ììæŸ"Äç ÚÇBƒîÏ`}ËÛÈÚ¼@§øì¾ÐÐ}ñN¸pÞËÇïµÝvIÌ[æãˆ+WûŸ!Ì>ƒÈtI’9²:†“[PVg5ˆþÇ‚%¼è>K2k W23XCºaѶò„ƒ"žJ:xÐàãøÑ÷?‹ø?ôÏO‘þÝô9¯§tÄ>›ßd$èÈþ1ù†ÄÍ&Ò®]€”@ˆk,ÞdÝ6ÌŠM—P¾ Í5Ú4C0ŠrÅŸÿ[‡Óÿßúþÿ¢O[Cà¯}ö¿üøA>Žt¸,ÛëÿÿpíùŸÿÒÓ“™ñ!Âò–[__ñÌŸß§¼H'ÊâFæ6ŸéDiN¼Í¨“ÿž ÚŒSF»€Êë…Út.ÿ.MÔÛŠz-Ñz±ÀFºh®öÎÿíºâØ|tFMqcšÍûI8ðPã¬5ÛK@§#Õ„‹F¿±ÝxaWžýÉkSOœ &L˜p!•pôrCZåÕ€ªQ¿©H„æHÑÖX+¬•8 „ÂH+Ck'þ›ÛŠÖ†`ø =ÇrYÉ€L IŽôJ ‘^ÕËv;€sêg*{ïéßa›ü73’zükÓë’³RXTºzdÆ áòFÞ/:Nº[ÞUån.矒4GÃZùHŸkÐæeÄÉŸŽü_Õ.(w¤o±Ð}~ ãúï%Žoo×gÍè]ÿùïisg›dA@G|‡,æÿ „h Š$í®@á½vüÄ;P–‰¿\Ž“óúm@uÁOm„Õ›hxš[yAÇ{µ”ò¢–ËøŠMº=ùŸ—“³†î0Ü[®}’°û<¯DÐt@Jhì¤ÆŽ[Xý,;´Ql«æˆ‰Ë‡«ÄW-_žÜþî#žh„ç…´€=ƒÐ€@*„ $°ÒÏ ¡0'õsk€ @ëî{£ª ˆfW¾ý½lõN7ŠÐu"ñèí2»¤ÝIí'ÃhròPÛ±ˆÿ(žnÓ¹­O‚m¬C‹ð±»úîSOŸ8 üÄQÉ‹Uâ®Ö“ç>áfaüã–Ï~rμ¹Â‚píñNk” ha]A B‘ >æˆÉX—yü£° YÀ¢™è7wþ3 Ì·í,f)$oßâ§iOðm0"hnàR=X„°±}Êx[ý€‰6)@mè´¿fQ¨‚"…?©¦XP(¡Tb‘Èò:ÿà.}¨Ú!„ëö€'Í‹§`±‡•·]ÔÙóÃ6 “ÞÏ.ØýHÄÝüóБÿFnUbÞª`¶ÅSÄpÍ£Ðd†Å¡ó+Xy “ñ÷ìßèŽ P‚¯á“Ï W?} ³×Ñ·˜“ÿ<àäÿ†ëÿƒÿçþ}+€îï6^—£þ»$€üœª·gGþ›qNäÿ Ð<Ý“ÿÝc3Ìv<É\j¬Ž¤f³]b;§mæ´MÉ_üÛÿàB–齯_ý¾ÿ í×K¿¦ò¶)æ«Oúõt‰¯½&\8>ûÓO†Æ‡ßXóöo-yìOÌ9üVÍêÍ–báÇ„.AÔÔhŽRVw¦!ùjc}¢¨“ö›†!ßçÇãºà6‘¿ ð^$ÿvM‘Ñ|FϺß~~ƒ‚óÖà¹kvL¸p䘙”q&L¸×8úNMu%"ʽ{KæL¸÷¸ò=3~ÿ¿¾ÉüÏ”û‘´öAxµH+ûe@‚‹Ôü5˜¢ëL>*´J(„´ÌÑ^•ÿ©Î"¥O@p5ï*O7ž–)9¶}C°Mô_òÁ¶ªQ·°¬um=Ñ_•P¢‚yå„õríå«m7üƒ'g²!Ú6I7{›€¡ÆúaŠ?ã¿1³ž×Mê®Îu3¸ÓºïÕ“AÆF}÷¼÷½ï8õ%»‚vþ£iÚä¾Ù1÷±£¶W2ýo¢B©He0SwßJN00ÉñøE…]}¹ò)ˆWÀVÈÑ¡o½F°Ö/Äk ì-CÃ×°Ýo`' v@^ñ÷v™Ž@Oì‰ ©ÝünYI²{æŸ ƒ¸ aAÔ%iïml~;nà ÁN´^t'Àîùo½&·ÿÅãJ‚uÇ®â}»#îîàÝh4øqÑòãGO$áÍ…`•°nŒÐ:B›[–<ê߀F| P$¨ƒk• RትyÂÉÌ`-~¨)Õ¨²ÃXðõ0CHx û h°> 'S‰»þÕ`„y 4jTA(ƒ0+Uf…PF(ƒ´N˜^<ù¿çêÈðÆœCÃ/<ÞðââÂ>jÂ9¸Y¿Kâ³OÍùÃWV¼ž”ë• °®  Fl¡® ª[ÐÒˆQ<¹¢¹…Eòmr-Pá]ij±Pã-0 ¼F£4¡0¶D¼-@Ñ%ˆo³…'Aýqt‘K„2xû%éÄÁ…-ÛÛñGm lŽÁǵe0LB|âä‹T-aW‹Ä¬ÅÚ%–ZÄ•  ´ù&ø’ׇaÓGØ÷>ÈïíDZ#¡!9aÉXìZ3ïºtÞÇžûþæâ‚yD®|†¸ûC´a,Þô1šŽ 6\ÿw"þ·üvÆß¼'éß½Þd ÿ»×õäý¶óÿtÀ† `‹üw!à>ÑiÛ+˜Š‹lCB5bíD òpŒÏþçþcT5/|ùŠä‹B‘žøAò¹û^Š~éßý¾sŸ›Üÿ÷ó'#ŸÿÒÓ“©ñ!ÄÑwjøôO^¡=QfE®ýÀŒö8Ñ+q&´K£]*Ry°]z½°Íiýô‰mVÃõSZºvñ¾e“‘ßûÑW×~M¡9€ÖOáȨ®([õÅþxÕ}¤ ÏÝqxñ~žŸp™pÉÖZÚ¨:OŒì„ ÁüÉȳ_¸6©â&LxÄqôšêjôAM›£Ôø4Gêý×+!­dõÈ$(µ' ‰‚fW“Ñž(!äÕÚÕ•i©~Fk‡Ïèã”t£dý`i<Ý x$Àãl§ÿîó'‹~p?õõzpð©¿r•v(w»ê,±ë.œ8ƒ¸Ä!+¡9P´ Ìæ®î•ÅŽG…‡E æ(¯b7øÀ½Î÷V†í.1DxÅ< ϱ]]u­OÍ„aÚÆ¼ñ=ç<¾ œçü?Y{Ì¿ˆ“ý;3a^Iv¡K&qa• °š /Þ˜m|w¥#ç³™+Þr¤sz÷¦vñ¢öª6NŒ"ºÛlg&½ ÛFF­a/?ì¼›±qµÚÝXôãºd[¬er U$˜ÓaAaa„y‚…ÀlaŸ °Fô6XÍ÷‘«Ÿ!ì<„°5©Ü%´'èòm³-‚_\ERÊ5Š Z`JèŠ{]ë‡îíQˆooFNyÈËÑòr¾‰!ƒ€AŠ ‰ 3Þë¤ðyEE¨ -r±¹W˜dQEÊÕîë†õNTþÑ^ï/Ò~p=y/nK°È-k’e>–«8ao—¡ÉqBSÂÑ_["¶o£G[ÚRžÎƒŸ¡×‘úÙVlúVLR¾"NÇÓbôÚ¯o<~éoðÛòq.<þÇç<ñ#;\ÿÁù¤ü½¤i õ¡R%êw«·‰žÐ¼Ög’·uïÛ¥kó^•÷Bì¢þM]©kˆ«xkØK%Ù?Þ&Á Á†ÂVW5 ªÝñökƒ8جøÕ»lÍ»ËØ&ÿ;ˆ@YÀ•'ýÇ}ï·_WÀL(/‘“øý¢'åéê–‚à‚€`_êªêVìé\Þm‚&y?Ü"f8'»nüÛÌs‹… ž>йÜú÷Êÿ]^Õè€v¸ƒÑPóVMë""3ušûýyR¯ B€îøaº[ë¡u5˜ ¶ö7ÈmDÔ‹—ÙùÕé=nàÞoLSÌÿ‡ÇÕ$´b” fK£ ɵj(j#•Þ—>䴚ر5R’œÔ.ÕIj€61ÂÚ”kßiQƒ?Úãõ¯¯xëÂɾðÍuKÑî@HmN½1BêÄY9úß|™ÆÜ Ú0¿ë`Í…‘.…ÛIÓBr‡ìôäÿ|_Ü3)%¿&‹ŠLšvñÿ!?3©Ķƒ:“·Ò E:ÒÕî^:@'hŠÆ÷Í”ÿäãßÏ7ªâ¿}íWùýåýý'¼/Ü,Œÿy¿áªŠo¼¶Fw…Ç+ˆk8L‰ªYÂû5”4³F<˜µ‚‰QªPXç Χr“!‹"ƒhÅÄPÉb5¢‰—ò6íûW÷úa{½½”sÅ-2n0 øöËû·£çÕ“†øXD\Qâäúc„xô*¶,P*´=„“[PßÄæ+W°f¬_Ánc+Vrivô¥/€ß ÿ»9Ч ­»}ŒÿŒvïÊ}hNàÝïÀ­8[M7„}»óÆ A ìÈÐW¾‰Í¿ë; ˜Å‘ÊñÁÁØõÊÉÿÄ¿ùwÀhþ)ÒÉ׊cò˜?výo;ÿÇnÿ®-€vi`ô¼)¾ÿv$¸(ˆ"¢4u…êEuò@’ÿÿÊwÿ{=Ùï¿Lö‡žôþ…Q*YÑ/Ýk¸hφrÁ"€ —SäÿÃ[__JØyº ÙWêC¥Ü)ÜtV»y-­•6 ÒJIk¯Ÿk õpo¦mvòçk0mó5vnoØ¥O¢øE~¢Oåé/Ç;1lŠ:L¢€G çmç1 cÉ$˜pwpíùÏÿÌ!6a® “àêÏ]é¶Õ(OÛ„öÄÁ¬©®Gwѯ5÷$÷žDíÒß_óçkòÇí2˽Xm;'óHµ8&é»éLH0úþ½J‘ÑïØN‡{P)ii¼ùkKÞüµe?ûÆ »ÜxaoJ¸D˜?UpòFƒÕÕ˜°‘æ(¡IØ{¬ð”‰tí. B,©öèq‰ÞÇËZsñIkëŸÓ%ÒÉÖ>1¬lW6+cÒÿÌaÚ}Ú?Î'ÿ˜Þ›Ï{]ÀXT¬|ðÀCÇÚýNÁIù³öRìéÈÿº5Úäõ&“sWw„V½Âºq²åh©¨Â•àõ§¸µŒ/SÍ©'ùÙÜÆmóy?)N Lå€Q/]r ~ÈBaˆ»‚î>…ßKH7 *CR RgßðàÚñާŒd^𠥫0ü³/†üïGRßT$Ñï-6’æºx.2ªº« <†·[ŒAÁ’ u"žÜFw¿ƒÆ=ˆ×ˆÙm´þ6zü&4õ DŠ™ÕÃņ )!è=(dN½Àßk…Ç“p+ÅÒ¨£Y©“¼+CÅÖûskp§nP¿—äNݘ·—žŒÎó¢ $]®=Ñuˆh^™®ëxz-¼ü1XÏáj>'Ñ‹{&BѸH°T#&H!x/t-=ý»ÈA…ަóò/òa©Ê³Î9Ý­“ñ¡Þf–ŒFÂ(s€âë/fB¢ÕŽà·žÐ"ˆ²!èHÕN8°Ñc]èßã½ÈÔn¼R5¿Æò´x•Øy–¿õì§ùŸ^ù%þ—[ßæ‰L¹'¸Yÿ åG?6ç·ß^ñjTеQ®”“R(k'ÿ›ÒÏ?¡ÉÇuAK$WüTž.y›c¼ôÛs>¥w¢— .ˆ Ó½p% ºm5H÷ºÍmvØvOßÇÀƼ.M@DÁËÛ4ØNŸÉÁ\áDº!•®%¸þ ²øŒ€èÛæhswIzY+vr â”%DCë–À*bµ€ì¬énBd`ÄI_Ñ€ÕŠ„ˆ$¤¹‰ìúø©IØa$X¤k¤Kl²¤g|VÀ‰þ%X£¾ñ$ñLˆ\üÿY®ÿ³Èü;ÿw l¿n ü‡ÏuñÁÈ6"ÿ7âÿ-l´ ØN ÿ­ÿ‰X¬i 1òçþ³ÿá—îÅá Ÿø›Ùål9ýŸÿXп*Kθ¨í‡Ê.zêDw“ûÿr`Šüøqð5Ú*ûŸ*Y½›h•8ƒ“·Ía¢˜{ô:ñt{’h­ßç5Vq)À*Æ2ñ!§…j_S'Šrý0ê‡]Mq\?ìêŠlÍ=îñ ÖÜ'|ÜI2½F[Ç$˜ð‘0ÿ&œÆÉ« 퉲¸QЮÍm%.²ûø8Ò+Ó:eE¡J@h넼&uA9çSGÊûM•^T@ÚômüƤäÖtO܈Ê~þ9¤å6¹á~>O{öâµ_9æµ_9æ·yƒOÿäUžýµ)ì>£Ø »r' ¹_W¢º^1_)íʘWjöÃ¥ñ^]k‰¦‹úÚTöJÄ÷ËÚ x[Ïn¾¥-±Oß’"ï{]K€Ñô¹ÉwÚ§îñþõ~ˆîÎqõrÿ=Îú’ÿ»Î3Ü£n=vûàÄXÕÆ“W;3¡iÝ%ž’±\C«Æ¼rg¸!Þ– “51b/ÅFýNÒmäÒ1ø-;ÿ%fg~ð–/2ñŸ Ʋ+ÈB±¹`Õ5‚ߨ¡•yªŒAÌÜH|¿ …;dä<ÍD^7oôœfmÈá^ùÜ$lx2 Í1¼[×fÆcGplF9ʪV¼ÿy‚y¶íš UæÙ ΋%B…øqÏ`&BÈB==ÌrDºbÌc`QV­¤‹GœÎ½ƒ?§s8„-g´ -žQúCÛû%ð?*ºsª‰’`+Án½HS±pZ€!& (Aý5y^§KîúlK§Ö½jì‰ü¿·¸öüŒÏéé©¶÷cùFËïüí·yúÇv8yUX½“XßL;ÞrvýNK(üXÜ$?Eét¦žlÛ.ü¸0´È5ü|ßÕ -¶êóÝùñ=Òn7Lváÿ¨á¼5>fgº’ŽîéOG²  ñÿpcùV‹µænòÚhÕ]¯+£¾í'¾õ­ÔGÇ;¸xü/¦pëwVÌžˆÄ]aývÃòíDµXdáN$-•v©EÞšþã[Ýõ ¶ ÅŽðï qäï×…Üá#î//ýâm^úÅÛ“à>cþxÁËÿë!Oþ©‹gJŽ¿SSÕa}3¡ »Nð[;Ú×Ò0Hïœþ®ÒµÁíß%d׿öûml6T»ç(xÇûᶨFƼéøþ.ã<çÿÇÝ$@ºØwÍë»™l3W‚Ÿ¬[‡ÊÎL¸ºëš!çÙV%ìÄÀ¬tZ›ŒuNK³RzÂ. »ôèÐoßvú9a°FO¡q[²"Þ8˜¢,±X"R"±€E@æ UB¢¢ÝŸõœrCs€¤¯‘æÇP\…v ‡ß‚Û·°¥§zxAÚF—MÆFoÚ»PÓëÛKäuŸògù:ÒZs›£, Š^ ìD’‰ÒP &Ô! -ÒÜ„å!2ßAƒ"õ–GMØÞö ØSä EZl-/à rÿå‚ȇ/ï5|y¯áf1 4k…­°|7asaÞ8ÙV‡ÄN2öÆþŽlS!&#&!*$ÉNq\ý…ï:ÞƒÞ ÌDt+P™÷“O@…“Ìku—«k^üýŽÅøÚI}Ð%ÂÂ>)¬JˆKãÝ…’ìQ꨽ïy¬ &q—páE´ÁÝ=Ž#çô¸ €ßg2”쌖Íû1!È‘þYHñãD÷\Gx"×7cÿ´t„¨|dõ €µ#öÊ-Òíÿƒ|¼NØaä_[þÔQàç>ÖNÇŒ{€›…ñ‡¦k8®”½™aMRŠÆÆHÑ=¡5šÂ·W1h*£h¡l&Á 9f@\ æ-‡úH‚nÇ»t)Á?·¿iÑ­abùºÆû‚<ö²[¾Ž¾üvË/l„ðÞß³[V!c¿‹ü}w½«¾…ò>‰ÿó[Äÿ)·ÿÖß þî½ÏrÿŸГÿª›‘ÿ±ÿ[Óý{#üÙŸýïÕb¾«ø+Ïü;÷Ÿ»,߃ôbwüÛB€iÿN¼'ý”f1@°°!@„ŸÿúÏÜã_:á"ñ韼Êó_|â~ Œ7þÉ1Ÿü÷)¯EŽ_®A¡z,Ð$R­”W#Í¡"Á3o*ø ]k# &Ä9U”~œ 9öÈD™×ó¡39é/q õ7ê…ãi†iÝO˜°IþCÏõÓãçub'&| LÄÿåÇòÖ/Úò‰Ã’øë› KNf¥•¢kcùVÓ«ÏêÛ ¤t­ç÷qïÝèþÞˆŸ¸ªë‘ÿ…ýûýóï;–o´¼ø÷nñÌŸÛ£ø†pürã1Ú{Á£ùkôq§q= ´ñ^ä6"ÙˆÛ·Q$Ð0Ñ+ßÓ±ÏèñyØ&g&|`Œ…Ó…ÃýB\DŠÝHu½@Û–0ÌŸêƒD¨3¥M¾/…y€Ú<"0ˆGn7‚´†æ6ªá%ùØ*™øïIþÖ‹9§fù8,£ûÓC±ÍÇÝ _ÎÙO þÇûëYûîöçU­¨ê„ÍëP²ƒ³iÜýx’W”Àºñdzö+;¾T¥¿$uqð™$o÷uÍÿ¿ñšü:Îý/]@ ÏÄ–B dQB±@Š=Dæ 3¨VRž ¡Å¸‰j•‹­ÇX}i¡®A_‡x¬Âš„¬±Û†e›r‘v¨ïÑgïßE"¼4‰>Ý¡ˆNFìTžÑ&ãhé %!@ÛzZp%DºÐÙ¼£ª!M.§€Ô‰°\Ál‰ŠÐxïþud÷:f 5ìߊcäf‚:÷âU ôwy#zÔ‰ÿÇZ'_×f”K#´FŠðz ÃV°¬³“$@l ¶¯m@ÑBlP.”-¤?Nk IDATà÷EòDåÊõ0´JuòÿLú4ÒlN,—2¸p‹ìÀM¹Ïí­ ÍàÙßZò‡?²¸Kîr þæŠësãÖ¾0{W 5œÌ€¤ß/ÐÖNLîÔô¢ŒˆôÿNïÏ—tçì|Îd~ç|îÈûn:æØò.ò¼#íÇvsN¹“ ²EŒÞ™Èÿ c5#%Ÿùâ3b>ö¬r‹“#?>X¡ ‘çÚÈß}­äç_ó•ô¾×Ù„‡×Jã{?Q¾Ss¼§<6 ÌëÀQ&½ÊÖЙ`Q(“¡3HÑK6÷^·ek$²ÁÇ3bIhÌX‰Q¨ÐšQä}ÃL(FC8pÄ·±¶5j5æM/TwùÇà$é?NM!KGn_F­èÏMΰ܆ÈKîŽÇ‚ÜÛÿIבPBs‚µpóôh uðÛ LÇ$¿~Ì„Q/‚Ñ¿@t 7„hhmP(ª¯sb\ŽøØçIõבƒÿ 9°Þpð¾¾j3r!¿æB°Mü‘ÿùnü<+çýµ\÷:6Iý3Å[1ÿg¥œ&ÿÙpüo»ú;Çÿ{ÿ/üì/_ü½Gø—nüÛhÞ0¥Oµ²\Þ’ 1ÀÐ B~ tçÓüÚN$é}k@E{?ÿõ¿~á¿mrÿßÌŸŒ|ö‹OLí=¼ýÕ%å•Àüé‚õ­ Ånn‹RqÐÖ‰ÿöD)v]´ŸÖ†»VI‰;–êƒøVëÓaº6Ì„0“^(ªÌ§@ï=èRúÞ^ Þ„3±]z4/µœWåݾ±ußð¸·f„÷ÄüÉȳ_¸Æ³?uí~•G‡TS] 4‡J}[ ¡9H¬Þjˆóà{ôJIKEJqwùZ …VÞ^JAí{½÷.óÚ<š. ±Ö¢° ¯[c}lM§v#Bœ{Ôö•ï™ñÚ¯rãO?Ú"€úvâsãIæOE¬5êÏ*fF}ÐzßµÆÅúè­‰¹-ÀÊ2¯‹užßXh¸Ó 5¾üÇŽeòtéâ…Ú.–¼ƒ°‘0N8O,ÐcJêýÀxéoóÚ¯M}Ãî1޾U3{,ºÛ¿5N^k0õãV»TÒJ‘íINá˜ôPs|ÿàü75šåf[ Óœ¶a6ìCi,ÎaÓù?¾·Ñc/š§”&$³Ü#]F_•ŒÝÿ]ÀYñèCŸô“Z‰f1¸¨ ä×'ê»>èQJðÁˆ ”Åû;øY&ÿ–†\ÙŠø>EÝñ"FLÅ{×¹J&G»˜p¾xsί/[~ájýÈOî5¾1S~æú._ýc^|ºe¶‚ëµ±*óñ(Yß.¤;>E“|œ’¼­;Á_4èŲàh´—ÛÛ¶H/ˆñiß4 SŸ¢ðPn× 1B JÞ®G¢˜‘ûÓùÿ!„¯Š/‘V‘ÆÐ›²FÞýVE¬)àØ°#ÅjÁê˜Å†>ÆÀf¡sœIþ_ôX¼9öçíIèòr¬ë›ð°`þdäOÿ7ŸR<¬o¶4G‰ýï­ÂÉøòŠ …ó*ÅNÖ׿mC×BZí*`ªHþ\cX#Ù8úz¼u{#%Cšovÿw­úZ}K_O”„Ÿšs½ñT:è¦'< 8©GÿoÆ”0á½0ÿ‹£oÕ„Jh”Õ[-å•@ªõ;né–š#'¦¤t…™Ö™ Χ¾ÇLGèŸåÚßš&1ô’ï¬Ñ}ïfßwuû­8y)«2Ѽ«¼óµ%¯ÿ“#þÄß¼qÿê}Æ;_]‚Àüc‘õ-¥9N»*´‡ÉOäÉ[)„Rú$Ä“ÒÊU†ÖÅŽ¯mˆ ¯‡uÔÖÖ“’è Ä‡7‚:0š'sjAЪI,%8pb‡á·\+®œ®gR#ÿ>›É¹Ql+hQ,× )¡@ø–èDLÙXuNX; òðÝd;5€NHƒ-[}îÏ®~¸ üå—ÖÏMßòIÅ/_íøñŸ^nmÈ/ ÝÆÑ5ÄÞÉL!±Ìc‚&9mvç’ðýì}Û,Ã\GªÙB}\USf¥\I¦”P#ªqdŠEcÖ*ó¹‘ æ92ÛDl“™ÏZŽæ>-šÀñ, ‹V>8П0Êk%`Á} p^Û»¥l‘¹ã¢YtK–äÖÿÊDÇ-éqˆ)¾û¿Ñ^ ln'–o&Òʈ3H+%+¹Sï3“ÑŸ»xóóàâ¼¼*–ÿj¤UÞUÜ¥–:'ïÉ9š&™ìO·C/w¿é¯<àÜ!žöxP–x—0üóÎÖ€CÜ7>û…àÿ#Æêí᮹ú#s6·§ßì9䕑ΔÍLöšE'Ú›`+w°°aSõ¹Ì7¼Ã]-.¨ýëþ‡$~¨˜Îw¦$€âÆdI`-ä·¹¹ñyÓf†…Æ:žˆIçG 3pØë)(¿K ð%áövßóü}ÇsZ¬ä§ ~ý=Û€‹Ç¶@5ðSÿé—ûµzâç_ùB™Çúã]ð¿VDâG||©gê§ `:¨ÿ«òlKûoÔ? áqÆüüqÀ=ž¯øÚ_½Åâû"Úw¾²)ùB¡[{pÀQŠ{rªô·A¹_ËåT‘%›eYZ[°E²7Êp?Õj×{Âî÷à°\{Öcß7¼Ûêã ü×LÑ>€àã‡þÄU>ó'¯¬o2Vo'ÒJi/–o&t£Ä#ñ:2áný³¥Ï)£Òßsk~OJ º2 EZæ ”DOêig>¹ŒeA–Ëôu!Hçwr˜n|Б¹@7­vE±‰Ä•ÿîÊ^øƒ€Pð~á'6¡àmá·þËw¹ñ“ nýÆŠ³o÷´—‚«û7æe:/šªôgôuªèŸZÛJâ)Ûß<Ô÷wˆ7ÞüçüÚß:Cœ}§ãü{=/ü ús%/Ë×fôK%Í%Hg™þÌkoEƒ¼òz^í%Ê´Wœ(W^ºƒYðþ4Y©%è GkŠ¢ &ÏzBÅ]õ· ü×){°u/?°ÀÃ<®×g?ºýé!I5áª6‚Ã"´Ñÿ>Ymq²Ž‰l–㺺š\ͽºþ±Ë@·íS['†ü›•„œB€@l‘öm¯ã+ÚrcõWÖÙÄdF u“I˜bæ ~±0 ž Ñ“ñå&°ú{ñܾçJþ_°Üøwz4w mÕAŸ]Å;o„>;Y ÞšMhÃÔûCU\$^Èû¢ˆ&^« º^fïø¿@:X~‡|¯Ç:ˆ„‰õ¬ }‘_ ÛþCJ d,^Âg~Ö‰¿÷½¯òw› ·ŸÑeÃõ,èRÉfÌoeºY ˜qu©äFˆÉ8*ÖØ1W[l¯{ ¢ÊXÞØRïû¾ ö梁–ö ŸþO-Þë¶¡ØÇ‡ À[SàVrKêNA… F/¾ñùçëMÃ[«Éu¯o¯ƒ¶BwTJ µ Ù» zÑÈ¥®y¯ã¸šÅ+„R2à õy„3sÀsêà׆jõ(e@ áC&Vé"ÕÕaàÜÅÇñ~8vj¡_ýß¿#y+ÌcÝû8wÈhf>Î1ü.Ùy)Pópñ‹·|‰ àqÆÍÆxíGZx³ç<¯GÂÆh6Fº"ä ’ŒBJN`Š%é A=d0±I™Cż¬ÇJzcVÈ­QˆO^*£É™yPš&3;ù4³ÙÏø¼úè7¸tþmooI±È¢eNä}­ÁÄ|«x®Ej=ï=s_³¡ï^åùhb!ßIJ»ÎÔÁñF±â2Kö׿_&ïkød¯NB*»çqGý©°Éç—è$†¤Jn)'3„éó=ÆÈ•Z{ÆiOUò×cÓçùÚmüO^s?‚À¶?¥ö‡}À?˜…ᘪðÓáÙÿþå/û÷ýó»ßéRLÛïå²/ÅIkøçp¿[÷ÐI€€‰ñW¿ög?úxˆO$/E>û‹/\:Ÿ£¸ó[kÚk“˜‘WFXˆ»…®Œ´ÌÌ®…A”;-Vþî‚T÷µwÿÐWæ$Hr¸ö`±äøÕ·2í¡>_²ºµq‹•.jºÛÅhJžeowÀžõØE|ö_ö—‚[%äMÕâÃĵÏÍùÜ/¼x¨U}ŸX½¼ÂænBðdkêuÚÏ¿—É]©é¾1ÒZÉ%D÷[¯áž6Fˆ¸uLçv1ymèÚ•ãy­n#S:ø¼vxЮý-ÅNÆÁãZ×ÝÎl,ž8À¸?XÃÃþnd+{³ÿš˜ÂæNæÞ·ºGp…ŸþH+峿ðG¯µ`°¾™‘–¡–P^ù÷›V™t^jw®þ×Òn†ýR®Áª@ööfeJ¾û‰µÐûñ=ä½û<`{ˆÀ£ó7zî|eÍüFdõVbõvB“÷·Ý½ÂÜ•þvchWúâìýjZ—{M mÔ­°[+å:t@kD Fh¶ï¿šè¬“{vö™Þ‹J± cÿ}µ;Éÿ €=qûoþø‡²÷=Ä£Z@^ÛV„¬°îŒ>mãÀÌrãàð‹WB±z†ã¹0{!rçLyïL¶)%"ÈçÓ~ß“>Ÿ±Ò؇5íÄ!Î0Yâd†…µF€äë;wГYÝ`áiΑ™»˜€õSOf6¾£û\ë±€ÿþf±&ùKâ2¸thWÏWѶ dæíXÞa“Œóõ¨`ŒA`®öQ$Gȧs¾ ¶ê±›ocyƒ¬ŸDžÞCn&t Å’ Ãß¿e‚P¶¦Š©÷™ÁŒØþÎú”¿ûÞïrk¡g¯Ò<·ý¼ñœªÑσêÿç_vÅ])LÕÿ”#ïûršå¾Ý>Q˜ºæà¿”UU1o*oÃç±ÉLàO[,^ŠüÜ_{ý z|ŽbõvâüžÅÒ*ÓßÍtw]ˆi²\Y)ñé8OÞa&èFÉ 9DS›”Söœ çú†Å»žà½…„ÜŸ‚þõØ ÚÕç 9{ë¡´ïCåðïG 8äøŸäx¿¬¯íüL3Ïyg¿žçÐÛâÀ|Û›Û‰îžZèÏÔ¥kϪö§™¼Qú3þû3¯Å-c¦5¤3þxn‹}ûàV¥÷ÔÝä^¨)mÀr$h/Íä;ÇØ³ÿAB ΄«?<çëÿÍm~ä?xáC¾Ñ³_ÿ¯oðêç#ý™ÒfB+ô§¾ ÏE‹»ƒöƺO“zãÅö¿ÔQFÀüß*PÛI!‚lÕÒ6pu=1q <ºX¾Ùsú;®}vNZ*y©\þLë6]I™½Ð^wî/)ç K·n³m=ÖR×TñÄžjp§7ÒîÔkO_»+VxØÛÐvw>DŸýÞÿãuÿ5™l8P °«eÜî’q÷Ü zÙÁÿ>MtÐnÝ éÈÕ?ëŽæŒ¸¯•s¨‚í`Åü1„cÉ¥ñl+vôeL½>‚HÑDgÒ‰µX{i:È‚„;Xê 3R€„pŒÅ96›¡³ˆ$H$OÀ›mt]@?Æk4U+U·µBX8ˆÐg·öw‚ŽfYý»¿wn¼w®`ž-èk£1oêk*à ¸½&!†€mzäÖ–´ HVta#Ð7e^Yýõ2ìë_ zÖåŸ^6þIܺýÇvÝ>îx!9«ΠÒ&˜õ®m:Wo#BLnݯA\õ¿†˜ÅkbgW­ªØäyÔU¯Q„F``"ÅÛA®ÇZkìà ˜ƒÂ£Õµùu;‚ÃSËëŠ;ÍÂ(<• .øØöÛ7;¾uÞóþH…ìñb^|CX¿aä—'k˜÷ƲõïY’ÑSˆKêýX,ãpÔ–ÛªÜ_ …˜Aý)ª~ 9ƒQé?¸=PJ5°­î¯ªŸ“€šÑ©!:ZœÏ¦ €iƒÒ¿ºŒï¶‡¡–ØëÞ賓œðëÞX®yûÿI‚sl‚ŒL1~vÕÀ-$€ÇïF¥ÍÂÙeá½Æh²ƒü*Jc…ìTÊ]´Émð£À<Áª$¼gVJX˜Ñ¨°–âˆR¶½‚ЛÑ#Ì€3ƒ& «ô·—ÞŽ‰ w¿í}uWî=5¿oðù•Kƒ(b~ßdSÿû U ìãiÖì$ ˜šî‚°•H“±²ï1¦ÓÖ:¹Á¨&;æeb G™xc†DCß]‘ﵸ5ä'<‡«ä…Ii‚'gVùÁ#gÙ²ß÷ æ7&¤m7€)!Àvßkê&pµ¿V÷îçð“þï?ökô¤Ä¿þòŸöÉ¢x{†b\˜²ì4P™<Å :Œkt1ÄêÀX&S_ÐÁô_/@ýN x<„É¿ýç~ô±¼ï!<^ýüÉ!÷Æùw:Þù'K^úé#î|eÅúf¦½ØÜÉXrÁPZi©„™V:ìëÆÈ벟J.~š›Ÿ`9ä >3%æOs„“üÞÎT÷Ñà4‡xšcØ¿ûX'û‰mпÿõ‡úüà9C½Xßt¶?Ïn·ô§Š&õú¨}û[WÞçÎ;ÿܹ…»…h×bUÍŸ×>ˆhÂÁ§TëÆ8ÈDÞ0vêº_üŸÀDB+œ¼Ö<÷à?¸5¨´ÂùwzÎßèY¿›˜ßhÈõö0—¢Ã÷>A4”ý4´ÛQõW¤‡-Û úÝÖÄ^U2 $€²>¹`)¾»ˆ%$€w~kÍ[ÿç9ï}uÍÑË ¹3Öï$w݈nëŸWêëx#4-N*eâî’$Ûº¿lÚ×Þ‡`5$àÁ÷Ò}€´+Šÿ'3v-,›(C޵‰0k\ݻ锌> M43úúìdy‹ÛÛR‹²ÿw= D€"ž£Žg/?¦~㉕DßÀlDÏKBZA枨S¯·‹&Læ„ØB4r’QUÔ;ãRhž?æ0sPßË;øã6ºêƒT‰}@Œ„Mgœ®ŒÓ¥¿FÍË —$0lÇŠ×ÔíL­OîŽ2²É¾°ýš©»"ˆ”ë7$µGªz} øz«üw/÷|ûd<þ4Çõ$\QX÷Š®”Y+„;ÿ©bHJ̆FAÔÜÎ]Ýò_²+Z«6˜+b«½0'ø~©umâvý:Ö®vïƒí;;Êïü6"¬ßë×oÉjvÙÆžDØôµ¬ˆmƒ¾¯_m8i…ÿ©=Xª×¸’…¯½j¬Ââ,ÑÌ ?ÚÑ&CŸÇÑ—¶Þ%9Zº˜Ò&óòµDµ9Œ6è•PÕѾ?’j;¨m¤’>â¤}Ô2çH qh'“òõX˜ì器«ñ IDAT+àYñË}s '$U@J†5Þt VërmfRpD Æ¿MB¨w·ÓEΘÊð˜ãÍÖø¡ž!ß븧ʵ£¢¬ÕhÄhqn]Œ6@F›½ôE/yÑ›—Ãø}òxD+à¿™Ÿ Pqw 5è4ëÈüÎ9M÷OµVÂ&Ò1x‰œ±ºž} ÙFœx(.6C»¶Bš, 妸/s’­"C]÷É žÞQÕßl(¢ÈåùôO"‹9¢ÿrZJ‘M€÷}a•D9ù8e¾÷Ì!?J¨ Yk2„‡÷Uòï;ï_ùœg Øï¼ÇðøAçêã]ËÿyÔþ?ÿʶÖHVß“#Ûkð}QîÇÚb/ý™úëýºõf•¡Êï®å|¿¦”ÑYçQÆü¼qÀ?žÏø¿ùïþ“%¯ý«—èî:îsôJt!çÂe!­Ë™ÝèÆÚšKÑ1 Í•¦ñ ¶“  ײ¾cyßíü"ƒpó¹Å}8Ï…þiÏãC<+ñ~ßìÉ™d«ð?ïüLÏ `Às¯~þ„Ï~áÅçÎòfõ¶ƒýw¿±¡9ò v:W £?óDIîÈÏkêµW[3È+…à`¯v†4”1`½[¸KÄ­Û{ƒHq(yê¾¾nRÿ½Ü¢c¬ÜÎÿé-ÿ¸–áÅ?pÄþG7>™ðÅêíÄêÄË?wì„’3¥½‘Bh½]h}ð·A}UÛ‚V‡ˆ¢ìÁÛké¡]P^WMãAíeßÄâ=Þüç|õK7ùÜ/¾øI”§.–oöœ½Ññò>æÕù˜¼2òF!z)Ž´VâL¶6Ò¸oe߆ã~æ~œÔkªDâP'üq‡­>|‹¼5-0½_§ÎÓ~|wûâÞßþýîÍñØBÚâô*m#\>ÎÅÇŠ”­$À ë\~éHH¹(É£ `mcîú‰ a°*0QW½eGICeÞ¨ ªMBç–!¹@˜a–}Bak•œV ë+ˆ–Ä€„‚®TËûÁÿÇ’3÷²H)и%xÊFV£1'$…ó•ÌÜ‚8F¸~I˜·Ó¥—ˆXÌ„“¹X·Òöú¥¤Bv þ£ )¬w+Á?Kþüœ(PJ!Œ*Csp£æ?1nEãK/v|ã±ú¿Ñ –”å2#­x ÷¤¬¬(úÕÐ…7¹XÀ̈½ºÒ5»µÿ&8 ;ËЉ+^ëJ;æĨ\Š+]ç=î0¡+ui¶oʃRuòuL0©)΄˜Õº7»D†þ`»ì´k_sRº\j·kææDFvÌ!NsMÿšc3tå%‚, 9€E7“ºñï|Ý” Bu7ˆ¶€œ5t €ÿølE˜ð¾7ó®Šñ–q’Àhá/C[€íé„–2‰ê®õÉ“ÝáµÓn¯¶‘ú{+Ð9=¾/${ÿà„6p’ÚùÚÉK—Ž„YI9¤ì€nR?WK ˆ¹éò@3CLËçô~Éê/« º¸¦H7¾9SþðK þß·Ö,ÛÌg-MgÜ™y‹}4fÀ, ýÜ9F„‹â¿ÌSÚB†ò{Áû¹( æ$¨z4A JƒÒt¼‡ÐB  „ Är˜9éÏTÈeN}ÀLÉØðOB(¶ý*„ ª‚$"qœ——RKÃmP:aÃËTÝö×íCL,L¬ÈæH™ì²9§Q-£¦à! ˆÈvrR Û }=±Þï÷aÿñ‹ÿ)€_·"°Gí”c»øé¿ðüÿ€ÿz|ëvaoëÉú­[]0µÌtŽ^Í0´”¼ƒÿø÷2Mˆ9!`׿ïOtüä/½|p=~cõvâÍxƧþØ%Vo%º{™öJ -=Hp§%<_¿qžˆc>. 2l3æÿ(exeçù^ý°?¶àäáÝùw¡/›€ÿÃëw;ºC÷ó,ÅÃ~›»亟q'Å9¸»ä€¥já!žŸxÞìþ+ào«·›;i8·|SI« WnM+ä¥[½Ä…Œ¶Ñe;ÚFW©ª¶Ý{j³ï­Å^ëÃ<¡àþÃÆõÏ->éðD„©ñ#ÿáu/G´3.}ƽ?%ý½ÂèPˆ%Úiãm+´#Ø88F¤j[΀iy´,&!»¤iÛ«Àã.i`_ÛÛ·=Äc‹oþ­»\ÿñÅsÓ'?Š8ÃÁÿk¿wÎænf}+ÓþÏ™ º66·¡ñµîz¿TÒ¹gBîÏ3!¯Œ´Râ\ÂW½´óÉ?lch2cRÎå>ý¼Ž¸ä´_¶[+€÷ëûâž|ç—Œ0žªCŸø!<¦ß…”…¢C"w1+µ½kÕY]eÚ%¯ßòïqÑ ‹VhCUi‚Ûxk±36(nØ5yYÈ€ª²!s…«‘hF>3l ÒTeS!ÔD'”ÎÉ÷oEãï_Í|ùjâiW7B>WÎúì×ï\™G ¡‹z#$Wú‡ì@µôEÁ¤€XV”¬%áÓ–æl´x( ÌÌUÜÅÀèEࢸ @oI>kå©XÁ–ü¾¹€ûb[.ƒE|°á±™÷ZSûÛ¤°ÚÀÝ•r¯Ï|å›=¯½•ùÞïo?oèÉŠW{áôŠ“…®I ¶^ù7‹:Wk+þ]4f ÙIZQaÜ–?d/ÝâÊæªz®í¤€ 6’¯ÒV×plmábZox\—â¶µ,¿øÄàyŒ}háôg·@eö'8”x®â‡þÄÕg^iºz;‘×JÚ8°“Wêvêk%g 9hÚÝËh†0±í—à@mwÛ¹L@ý ØJIF”§O‘«}´  èJÐûÙÀ\xÌä1{¶»ûû?¢-Ì®G®ÿØpïëë;‰›¿±bv%‚›»™…´ö Dhd˜L„8ª“ ø„¢+Ë®,1ú’pˆŒå”Q}\œö»CAgCÀ÷Lůñm®ÿϋâä!âüžóïv¿Ö’Î3–a~­!¯Ú«´T4¡•AÕ/Qœ$“Ä%åMˆ‚Í¡ ÑŸ+ÎþõI}éóM°Î·=É?(üjþp Ïß÷¡ ¶X½Ãb`zŒ}pl' 0/2=P>áɪBÇ`ƒ½À”G3aÞ }2–›Ü_÷6((cÅyLÿ‡ +“©À¿ÖyTõR›3CZóšéÖC:‡î ïA˜‚¤ªx$m]’äŒ ÷°|ޤ5¨¬(­vîÕ-"À@ȶnØÇUáÂ$ÙX8w~ðmŒþÝÇ+â•Ôµ6my=Óú¥̯µ²åņðCŸƒu†o}Ý:±œ˜Èí$F1áË×z~ùŧ[ þB^í…[]fÝe¤‡“,€;hÔÙ7Ò{U‰`BÌjm´gZ~¨Çèl¥€WL^)ÇÃä:à¿cç^Á.¡¶@WF€ìý,Ü·íÚ/»0¶ÿyãNwÎ3§ñî%åô€ýNØXÎ!Ïü 4UVf4â@|+§Æ£yRÅÌ裃 )A pŒÑh,x¶PlÏËcÆ6SÛU¬ÄÕÐB%ÔvUžSI#Œä™´‘T2’Mjû’IÛ›¶«¡=†±ÍAí.¼“Û™·×Jfóç j^¢æxáïCùš Ï)¥ AB 9L SÏ[IkÈÌœiñ5NèIÁç`bãîgW ¿²LüÊñÓÝw=‰ñ•…òÇ~ß‚·ÞZó+JœAÛAߺB?d¿'¼ÿT/}’!¨‹êŽ¡ª¢P_eøŠB)}1–¼hJ»m)%p—–ÖŒŒ¸0ÚY)“‘I‘@ 4qè_ƒ%ˆÏ1b ¡5BkÄ2þBö¶RFÔôܑǼ½×vOUÛ VLtž]&ÖC¾åó$³šèk—I˜’3ÒtÈ1„”±.Á< Gèi@úNèSô¹ß®ÕypÁv¿¼nKñ¿§À~Û~`rnzü"°¿ó{mg¿¼Ïüâß}üéˆûSÿI!(ëè·q¿,ˆ}SÁþéÿeï¾ËœBÿ'%pbÐ6 `²FgºF°ò¾Ž©í¡øˆìñ$ƵÏÍù©_zå¹Ì³mîdòZ‹HÌsÆË7ûA,¦ÙJþØ.k)ÚZžvÛ…¶äœm[çrµj …Á]bp–¨“Œ)!E'e²6– Øždl9ԉòÀC“Nv÷ñ‘â×¾ø诿þIŒ':îüÖšïýÃS¤š£5g¿ÛZhŽÃdîŽVî'Ú÷çbߟmg"nÛ œìI|+•“îwÿ ç`¯Úÿ÷Î¾Ç ¶ÿOgìægCf‘²ƒ½›Ú.¹ÒsÓ{R¬OÆjãJµ&zRJÁ¾2TXY%~¼‰àHgUuêI>1CÄÑxi¹!óŒ,<9ï~Ù=––Ð݆8#KD¢¬s2€?^ëQ]¡öAo¢Ý]¬;Ç:w€"hU_å>ž&øÜM@¶?{Ml‘.Þ×Tüûj¢cjpi!˜b„.9¹´‚ƳfQè¬7þÞ¡Á—ÛÁ!Í= s@ ½Š¥ C)V_”à•(bõOþñIæ—_ÌÜ~Šà½Ð$ãî:ñ­zsaF§ÄÖˆÛN[¬”PUÊIµn» w3dç6­Ùnc­ö²T¬“cµ†»tFŶªr»€þ;jîJïé XFìi_Úæb{­%§j™ú^WNf ¿üÊéWUX&°:WšÑl 5´½“ºdèJ‘cws° „è÷c,å!bS€üÎv6óP¬ÿ)Îð{ôÚn*id$‘Hq™˜øLÈ$a›T2ûˆ$ã¹ î×î÷²Åº´p5­šÑ'ÈÙ•ÿNdò>J f.ͽ Ve6å=3˜·2v³‚+ûÍÁSC#.”p²(fVl“±•`+ä4qfŤ¯þÅÛ ¾Äú@x ñO™ØÃì̉iG½±Þ¸øüh Mï÷L›!ûÓ–û@E˜ec®BÂX(,Lè¹ÁQ2$°ˆ^ÏbdÑ8ŠÂñ<²ZgUš ´'Êìº/7ÞÎî‰×g ‘àmÛ”€[AF8RÂÂÅ Òø”Ã’!°6ýÆ0-À¡‡"Š£Ï8§¨uV¨®Nå®·0”X eÎäO“¬˜fÂu!~ê‡íáôkpò}põû±åwá;ï ·]µ,?.NãY…Ô7ãk˜çm«ýÙðß׿?\ý‡÷ÜúOÉ÷SûO_?”0øƒñÙþÿ×ÿ¬ÏALüŸþÛþÛÝgÔÆäÁÃEý"@™;Sÿ nñmlß3æ4z›üóW•ï!ö$Ç«Ÿ?á§~é•Oúc<ÖX¾ÙcÂLèÏ2Ý„4ÁÝf‹š=¯ÕÕîkW¸WÅûXÊØ†òÆÚ•²µ=ƒ²´ B4Ý*ƒé¹3æ 'äiþlšgž«%øO<òñO‚ /´´—ÍåÀ¥OÏëi`þ¸P½þ¹ýBªÕ»‰þ^&Ìáìw:Vo%¯²SÄB¯Å ¦eB‡buáM6–(ÿ‡Üb! ®¼%׸òçí¿ÿ þt»»ˆç)¦­azçL·Õþ¿/[Ê~iq>½æ@xöã³_¸ÁgþÔµOúc<ÒX½HçJ<‚õÍŒqæÅÅK‰nó¬½ÒœýRÉ[ú» ‘£n±1˜CîtX†:.y¥[¿¥É ·¥Âf{`KÙ¡¿_§.8÷Ä«Ÿ?ù¤?«·gßé8~½aùÝžå›=šæ(П)ý™+%ÒRéÏÝf<­}2Zq÷‰:ÙÚ˜;ÌØ3ëƒÂ4œN°.€“û&Y L>¡míY÷¾ºá«_ºùÌ»´|Ø8ûNÇé77¼ò/ž ºSåèµÖm/ÍH_ä„VÜ¢«–Ϩ‹š~ÏϤ¼†Oè'6^aâþR¬þ«Ã ÕÑE'·ËtÏž-÷yüãþ?ÝQ“NMQ„ B.–ÿwÏ•YãvðS5o Âñ­âg'+SvOÄæYSrËñþ8Hfž’ Ú˜•3–'7JTÏ›7ŠÌ”pIàÒi.…K KlSt®–ÐÙ‹W@€X;kTωúÚÝ„Õml½„M.KŸà¶| ¨”Eø˜¤…R´~ø)èÿQ®AùozË ƒ…Í5ÎZáh^ž'5Ql¨z½ÑT ?§ƒy™ºîþ2#`·{ŒÿÛû³óä×­(¥¾Hà·ð7^JüöÑGÿÛ?‰¸ž„½`+eu–˜#\QÈÛ© RD:sRJí…˜!4¸Eµ+°,×d𤆾K}¾N™•Ksh®-«/A{ò9Ü}a‰ª•R{e‘c#˜Nø3³%·›Ã¢æQÆ›­ñ3?8çwÞÚp·5Ö38Z›63ã89‚E˜õ£]F4ã< 'l0îH)±bÐdw‹¨¡¼.ºP-BX–çäLÓ(Í"Ñ6/ÐÎŒ Ь¾ŠôgÈy&h$„PÈXFlÕûðF½¤KœŽ/f3¢eÂúòÁI! ’2B($U¾Ç 'á»M¸À`»?¶Å‡Ža¢6 5$›[ÿ€—L*6Q²¸ ô˜6„?K¼ò¤ãßDn½‹¼§#Aù9Š®kPu Ëê˜Zû׃†`:%ÈdZu??ìüÓs÷Sø³ó~Ã>Ï6ððï¾þç ð_!Æý2\ÿËñúÿž®|úŒ‹!ÛwSýb  Îú}í5%”ß_nãêì1|ÎúO´|Ïáö”ijˆƒln'ú3/clÉÅŒ›Û™Ð€øóJ‘iif2ü½¹1Ë`g» v9ÞMÄfæsÝÈ_KO„f2¹ë}çDór+í‡uñ;Ý-.wzo{}»~g3É«_|ŸCâ鎇iÅõ9éÙ–ÅþëóúòSŸ#åyÀ³ÏšÕÍêíDwÏ ,é\±ll¾é+ÆPø©0Ú4ùä1/•´T¤…tn¤¥³½­?µ†z_•×>èl«¬ÔÕ£%#í‚­ë–)ÐúPà+ì¿íŸ‚íúçêpÐðõ?~™ãOµ˜óÑÝ&VÆÉ§ uFÞ¸ûD^{)¯9dh7–ȵ¶P§^. *šûÂ*ìGöá0Y+ÀåØ^q³NĪUÓ„#¶—uc{…‡k£‡x¤ñÍ¿u—×>é઱gßîxY¼Ò  6·2‚9©få ´RÂ\èÏF·)ø?öû•ÕK!Ø”}-÷ÕàÀà@]ä˜/p†Å€lMUî×Ï×$Ô3Ðïâч'¼VÁî²q¾6ºÞUàYÝ ëËÇÂÑÜ“ˆMHæ2»/Xˆš'´¬‚~û¯ÖÐà‰ê\œÈböÏP ¸ê€¨n³wáêKÈ¥W‘Øbr ë·`ùÖ{Â!uÈbEh/“›#$4îÔdBZ¢Ý=l}×ÁÿU‡­Á¦‚dÐZ­$p&&˜Òž3¦!‡ÄGùUZÆÚ J1&ß90k =ñWWÌ,+äl^ÂLk+óhx¶ß´œ¯#. Ûtþ‰48Ã$”ç‰p«1¾|]ùòõ‡ºO\\ÍÐ,õíÄ»Qh‚ƒ®}ðºÏà}kn!]í^ÛÎ9"¹7'„iMvV”ý2UûË ÌÞÞ^¬×>*¶·•ØU½Ý`µncÙ–ÕRúŒµÜ/€»U¹Í6P #ÑdؙؽW"КråXH{ž×¸’áŸ?H»Ñ+Fì@ƒšR,ó‹#/#¡Qبy¿#BWìþS‚µx;‘ìÓ‰„•2¡F'F*ä“@¦™LW€yw•02Ržk:£MƶmB@Ú÷ÉQ\÷8*þG·€}íè~Ä“¬Æº7ºd^ždh_NTê,;cÖ›eÊÚ„²±q?Šý¿@ÆÈÀÆŒãy„ë¯ ×‚Ð\Çò=4þÖé2¶1$`æ‚lþ³w|áÕÕco/Ï[üöLi„ „“€¨Ñnm;r÷ÿgº¹Ûþ‹:¯7ךl4eLŽeŒSñ2Mù>ç­¸K@¡ îÞ2—@;7f'‘öÆg˜ÿ(Q@Ã)vþÏa#„N8ž…â¦c„¹Ž”xYhnÌi^xxùÓ —V„Íw°ÛßpNÁƒåo±þµ¶Ì]ª²/ ’¤‚Cê? `j> H‘\ÆmüØÅâ¯;IzìÚm4¿‹ô·| smy¶#gaÓÍÆƶšë˜LÖiÛ:ê)Ç·Aîø¿Y`û½Æ}ÿý?û—þÎã¿HŸ@ü©OÿyÔÔÁÿ ý—þzü÷¾ß&ûÔÿwµ&gÞ'¦Úü  4“z¬ªþ§åd HýŒbûÖÏîD€ÃÂýIŒŸü¥—yíó—>éñ‘cõv¢»›‘–ßë]Tv$tïet£X¬WúÓ\êÖ{Îçnu—‹ú?Ìd[Ý^\Ž¥a+÷5ºÉÚ}1Ý<òÿxßÜòtË}⇨a;?0f²jV«n•øï'çêëÏj<+l·:àåNy÷WW̯š“@:S'”µUžþ¼ñºÏ•Ý6‚@p]Û0j_ê«Kv¤€¬¥´ƒCââ3O&GÆqj½gÀ{Öãú€J€Óov€·™tfä•f•͹[q•@/Ä#!¯¼-Џ½’4^‚¢‚ÿÚá%*pÙÛ1E‹S‚Šîîïi—{¬†¦mv¯‚ùküÚßâ_ù_~ð“þOLÜüÕ%÷þ¿ †ƒýë›=¦Å9£ªþ{ß— …lcH#ƒ£Fµ.›:¸hqÖ¸hÙUú{µ±˜…Î}96}¼»ÿ cåÿÓ®æg @nŠõw“#áÒÂÕüI¡5q[øÆU¥ªã ¿™ÔŒžcXMZ'øÚLPÖ`÷ éS¨hA— ó"ÄW i0VØ"bÝ Î×Ð#1aë%yvÚ9"&†jôHkl½UÆ:Fð?QîmÙ"lNï9.ÔTçÛ‡ÿëŸlPÀZÇú }6¢³’¼×ò{+À¦¥ß˜‚þ*õû·ÁÂû›¤1m÷ƒ [Áû`$bÔk•ñwý½«Êß»ÆSi÷- a£tïel!ÄH¯¤ Xpð)5ž¬Mjôê ¿D'GtÅ¥Bf6øæ…Bö ÙÚ!¢4årµÙ­¸ì<öçËP ‘º?:˜XQR{ÝsÌÚ Nâ©à R¬ÿÙþe(íqQ­ýþwzM¸ki·†Û±ý¥ƒŠ­ÆN[XÝH‚8󓂯CòëºÆÈ”{uftjl èO(¥ã ÈÙRj™ãíe& 5ÏBq™ðs˜·€B.‘J<”B©.ÈP"`PQï8ŒNC°Ç IDAT;íé€ÿ)ú³â QúñòÙfÐD'©¥ìïÕõî •RbÏû9pùË ¯TRñÒ¦5$*ÚÌ‘ãWiæŸ&ÄK¨^…“ÛäÅw¡Y"aÇ~y:€7rànÎø+/v¨eàvcüÄë3~÷­ §ÇÂêÈÛ¾™ß!,„ FÈ…T¥ͼÜJ6Zõ¾7(´jîÈbe~£Lˆ*´9-Ä*ƒ¨J“•æŽÒ6oПx½|¹¹AÎBŸÜ‚yß:3âÂh7Ðp…Ø]§½s…´Òbö"²¼¼wJ¸—¥{ 4G•ÔÅ„Ðå%Dzõ»QÒ!FˆÁ½ÅœþÏ{ÂEf`kCï8Òª”pû*vé°Ú`Å{ò÷ÉÄzÝ’Õ@.ô¬Ð×Ú@uØŸž¿¨î‡÷#LmþëñŸýËÿëc¾:ŸLü{?øQ˨Õÿôg øsüŸýQGŠ)àýI“RY6¼Ó® À!žœX¼ù©_zå©Ó¬o&N¿ÝÑ,¼éng'¼Goëwñ(@y•‘Öíÿƒ÷Ùõè#sVH)mŒ¯»;<7Öy{M±ñ·1Ÿ\…îQrÉXÉ“= Øÿ ýCâŠÝ»¥f±ê¾1Úþç}-óÎëÃð ų ú_½èO3fF/ƒýJ9þTD¢ÐßS#,p%õÌdšŒÅGÙÕœâ"I¹aY3ÐcùC´ePOîX6h@ÄÁ Jé4Ó’p‰#ø3ˆ JÂâ¾ãÙ3<Ð=Í“«Gý©3ó—ßëY½™H«L<ô÷<9ŽÜN<çR VÅ  Åë3­=)WuƆX6Þ&µë½êƆçL‰)L˜š[@%\˜ âÉŒõ»ùP  ÄòÍ"¼üGNœ ³RNV­×1[ךfNKK%-½CŽÉkw…iN„°VÒÚÓÒ9Y, lü¾ ABˆ3°$…h#îüRˆ6R?R u¿Þ[{`öÞC²óø!ãößüq²ÚCƒ?‡xòBª,|’«Uó9ÌÉB˜·¬žHnár²mÁœeglzo8mã@bÕ*ºþž‘„þ Q“ÖªHPäX‘ë¹ú "Þ}ÍvÁ~ÓëÔ_®#z 4 ¡%ó>Ù[a›3…Ðaí’ÐF¯g/>³”°.cbÐß­ÿ¥:á êñJ’vzMdÏO½x÷û“q0«Kž¼l¢ƒ^)ëηGs˜—7«5Ø£ŒdBÕ2 „üšƒ Ão«Ošþ%±*Ã'*©Îà¿È üO¹/}ŸÛþ?mñZ'¼zÓøî¦ç¨®ŠpzGi×ÐFÈóä뀼~e¬ æ'-XH°h¼ÎtP¬û¥Ø9û’ÀÕù‹Xl×qrMµbT¨Ü‡t­ ½ŒÛ)€?‚²ÿˆ•±¹U0vJêya¸[HŸ¡ë˜ýöñPãߺ7ão$~õ…ÌÑF˜%sE¿ºà6d!(4­@4'µ­¸ÛÈ¢æúîù3 >âem‚ Á„`‘F’QAÜÎ?„àý®fBÌ´W•æê= oÍ;瘞"h$Æâ€ÔÕÿ—Œx#_ûÍåßG3{‰3Ä2š_ -±“»è;k8¬ÇóBÇ‚\‰ÈÉÚPlµÂ–Š-[ tüõadù}ØPEB&^U¼Š\ù~ôî·€wPXŠ †® {[ ·:ÈëšÊ{$ß÷“›MKß7[$kµÒGÓ£ 8_·Î¨º ò÷ýznÜ¿?°ÿ×”ÇåÜüâ³kñ?ÿ‡þÒüOþyTâáÎ1¸ö?2ðÆ”F»M˜>ö…ùðÍnê±]€C<±x)òsíõ§ Y½èÏܶµ¿§Hp¼¢_)ý:çBwWIg™¸twéL‰GžoN+Ät÷tKñ¯½ç¬t5-ƒYÔÿÁ UìX÷C/Wr€¯SµL»l|<`"÷É]—íæÀØóø‡8Di–¹FžüT¥ÿý¶UT¨ã€g&žvÕÿÙ·»R=;˜Š@­cSlÓófÌPq@H‹•M¬Ç®*ûË›jûܳUï†T¬aK’xËê ìÀ6óÇ«Ÿ?ù¤?«·oþƒ3^þ—.!AˆÇBÚq°Ü °¯O#qÖ­~½¹‘çB<²BL Ãä,4ç^ D°Ù8I«n.1bh«TÊpqØ8Äßü[wùÌŸ¼öT.`UÜýú†Óow\þ–ó7zÒ¹Ñ38»XgÔ-E;/á"8 _mÿéʸPÎ÷§:–ÑJ€eõ±¢ZÿW´«³­EŒ÷l ÓÂæ ü¶¢&1‹è‹â^NÛsÕä5ŸœÔˆ*tÙ¸s¦¼wæi¨ËGÂåc'G6Ñ\ïÿ{Ý`ãÚ^Í­ýŒpãÓÄ, ñ!÷~ –3ʤÜs.Á.o Eß ô†m ë ˆB›ÐV™ â@¯[ñúœ$HÐ\ÀÜ¢ü·lƒs¦×öØ$Œ ²]]UP¡•Ç îÎP®y+,fžn‰¢{róôVõíÕjR.dVðòWÕëRI èú7®Á—/€ïõ ‰Ou‚%åÎ:s*ÆÉa“à¤Ä›K;'j½Ï6 zƒn$Þ8ÁLÜ:#0·Zü7VÔÚ&,³[R»µQõ‹[¶)¯©à>Ü䀪ºfTê×ý]à?àJÓªÆÞ­Ë.%I=ª³ýñ”4p±¾ûEð§Ž‚¸Ëħ‰7N{®Üé¹ûs³ ÏãW¿zÆ·^‚óËþÔh¬ç{#öæê(Œ˜`f‚5:è,B‚ØàÊ~ƒU0ú¶s\N+Á•ÍQáh 6mqŒà„ñŸ-2Étd[å_¾óJ,š¶ÁÚnv÷ëxòAˆ'"°h…£‰ú¿F%®©B,$úJ‰{…P]¼Ÿ6SÄŒ¨ÊÑ"ÓÄ5¤ïûk 7 Ÿ¢«ßÅÖk¿ÞꟖº¹Öù‹7çü™ÅŠÛÏï”ú‘Çoœ?ù{[ßUÞ5åõO5ôgp»ÏÜËÐdFëýÆÿØBlZbi‚%툒ˆ1dFÔè]"öŠt~O-}'•leÄ,t§B“3ñ½7üwuV⯠>4ª„è®1MoÄ.£}¤Gr HÂRBsF´æ™pðr^B®Ú«À9ÿ]ôÖ›ž@*daI:¨¼ |¾ó8ŠÈ Ÿ#ý‘·nBãäE Ï:Zÿ×Îý1ó…TeøóBøøcëMK·qÛ¢ªì÷}íþ·Á÷©‹üƒûÓãS°ÿý^·ôgBø™gÔâ¿ÆŸþ=ÿ9j™lêàÿ ŸZþ׆=\ëü¯ ÿãÿÇwÜO(ÇËcÌdü|2!0˜OJ<­BÈÕ;‰·þ÷3âqà蕆þLIç™0Ò*“V.[¿k¤µ—ˆÝÜíÉE8¶¹›üoÜ)3­”8«.™nñ¯]q7n)¥c ™%yŽL"¥42îfÛÛEëÿ}9æýÓínÈÎùÝ!òpKâû²ÉST²ºd`S¶ü§óÓˆOWyˆ ñ´vàÀ鯬}0ÊFw×Û³DHçJ¿R𙕧"‘¢üôÁM¢«>k‚6­\2e½tˆ+¥s烘«¥mÛΦb{¬Ñ¥&¢kRz úÀþÛr7žáìúçžBéØcËÆ§þøeæ×""Fj…£—BS´Bœ‹ƒüèÆkΖõDy“‰àP¬Ñ¦V @Rž Ó¶ˆø›ÅÔ¥¤Á3ÝNŸÖøµ/¾Åúë¯Ò㉻_ßðî?Y2!òèn»Õ™fgE‡™÷ñ^2ÃËfÔ¦²¸©õÌ&5ͼþ÷¸_ËfL4¶³Ð¹»ùÂ8ð1ÞSðÿÙ‹ŠïÖÜsVsÜ`Ö:“Õí” WÓ©¹Ó¾–$l×]‚³¶ÔW®s<ÙöÈ]†¬)H-õ Àì2qvÍ“lók„yðÕH™‹Élyн Á ²CX¡ÝMX.±ØJ¼Ö3E~  æŒÎý1ýÿÙ{·X[’ó¾ï÷UU÷ZûrnÃÎ o"EÑ’H*âƒdËA’‰ÀöcÛ‚å @$!ø-A#J‰e#°•—@oÑ–$±D 0¢,v,ÈÉ!9‡gfÎm_ÖZ}©úòðUu÷Z{ís†gÎ>gïáúútu¯ÞݽzUuU}ÿÿ÷ÿLq‡.ƒÿ¹Mk2©öÁi[ÂáÔk‚J•çµÉ XûÚ:ˆ@]Ù—>Y%šÖ¿Yå,Xpò˜ÆèWÈÅD 4ÿü\ÁÞSR¶5Ÿ0/›à?“--‰ê¼ZÃß~î< 2È´[-Ð+ï¶ß(¡…XÁéiÄwö"V1™ißçu²Åõ:¥IJÁÇ ÜG¨–jå”SÈD@ïdÓ1¥J ü¯Äáæâ&2Ð2”ƒ+þû&ÑÜE ä]Ÿ±nÖ8ú„Ûj6Á{«k?òRÍ;Ÿr¼ùâÅ\ëªÙõüIayÝ”T–3áDß&\ éšÃwŠë,O}×)^ ¯V6߬khª}mbl`•*$df °"ËýSrŸ›âDLB/B'–B"dàß(9’>GÔ[õXo‹Tù(ó¿tbõ,“J‹tˆ&Œ„òŠ Þïòœ)3ö;…$U#²MkØ´*é–\Tæ{ŽpãEúà÷Q=´4/G÷Ñ“ˆ¶“÷ø–7µªó¬¿ú½Š_üD÷ä+̰ýãëÊìÍăøg.r¨‘Q¼Wf­2o•Ó™МÎd†÷×n?sýVx½‡×%Îíãå’j¼v G¸îéz\çñ]ÊjçJªÅ­ œb¿©F( ;Š“” YÑR¤HD¨ïàãTsø==ôo"ÇïÂQ K5‰dQ»ÖlwøÂÞçñ³k  1ì#ý),ïB«h;­ƒ *C<ÒòxJ;E·‰îœÞ6…#Ä9Ë¡€ºˆ”|Ý ŠþOIH:m¿“³gí/nò³ZU4m=Ì¿F©Y›¥-À<ùø)poûÆý0~¶©°®ððHÿq~øáþÿãý›$My‰ྀÿ8 nFÿΨòÿt‹OŸ¬m†íéþ«kþ<“/‡a¸\Äýíìû±—_9àK_~éY߯÷e«÷zNÞl‰rðC~©œ¾Õ‹úïRAwbÄÔcÅilÁ,%ÈQãèh©,'˜GÕ,§©b×üÄ>ã3Rþ›ëílgOË6eÿ§ èï0ÀT |.W@¼z¨ñÎûÌ_¸q%e¢›»=§ou¤¨Ì_ô4w"©SªëBs7ÑÝHŽ:XÞéq•ÛB°rêɃôØZ§'9@‘æ×hÎ[WËÐ JÀš3†›&Öes(:–)¹Q' l€¶­7n"»õÅLöß×ÂìyO¿JÌDÀ)ýI„N×-„Kæó‡Î"“¥ºnEƒJE)çÈeíTl€'Có”ó˜k/jfåŠió5"@î2äýð8g{gOÅîÿQý?\ýÀ¥Ùxðõ†û_]rë sRRüž°ÿr ;‰ôËÄü£ž”I`)fÖr»Ñ†5&Ä€ÜnzÕ_zF’À ü2™MHbÓþáL?° ø.¶í'ÄÖT^4M&CÝØ ©_¦)`âT`lSœÇŒÞP8ÓOLû ¸ðvtô[?1iù°#|(lÌ£lAÛI”˜Ä&ÿ¹Î-åd™8Ü3ǯb`ãþÜ@fÅ)²¯Óy¢¶¦©:ݧ†¼ö‚ž ú½{¤Åÿ$ô~K: ¹‹dk²›Öm‡6˜°Y8!ő߷ààE}T[$ÜFã]¤±H$MŠäö-9"ìõ Çì–§¹qsÁwBj„ùKÁRUtJ}ÃYz ÅH«œ£¼3²‹¢¤^LÍ¢K¤VŠ!—1ÞÖ)æ ÇDŽpÉu[FõŠ’*`Pµ`²Ëk뇕¶ogf«w#ßú»÷¯ÌäæƒØƒ¯7¿ÖrðC±UºcË!›„öñ¯Kcâ* 9Ñb´6äæbÑ®ÁcE“Ûh’U5\a@÷ .÷ ^·ö›ik¬èáÙymk«BØ·ÅîþúMõ@&ÑÁÓh£àCgέGWÁ¶½@JJŸëAåa¯6`¹{moyè/Äôl›aÀ”ýiŠC–í!ž$4%XXäc|¯u 8b¯¸e—Ù6ž¦5 Z)©ö`þI\õips$µD݇eƒr„¤dŽó>;g3ú¥NFŸØ¹Öå£7ž×F›œœØo3›eG å½£Dåá£7³jÕ–¥s(Xª4G+:“Ô./’!ïèV‡KÞ¤ªq愯àN¿zCù½ùÕy'\oà3ã½ï´è¡ð‰ÊÂ"%¼üBÑ ök«ô UŸë /JÕ ê•:AHBŸ”ñ‡˜L-@0¸>sTºLœè<,WJíá¹¹c¯6¹þX‹Ø.²ÿn_í}¼õï2(™Ú<±:bõ±ØÇ1U{?4)ŠÌªÀÔþéŠô2œÞM$T÷ß°èœ)7øÎRNà ôJPaµ—P BR% ÌÔÞ?Ág¼NmÜ>öÛæ&‹W1E5@³Â*<°«_×+XFK?ÄU&„¬Zᆔº.ûŸ‰-ûµ¥)«Â¯g"0«„˜Œ u´Pöka^ Á"‘ÙH¹ÎCžƒ[ß!hf¬9Ò‰G¿ÕØ»-4x{éŠÁÁˆ ÁM HgÄ/‰ªw#"3AáùcÇŸ½çøõvõýIÙ×CàfÈ"¶Ì®-ÝreøÔ]BƒàcOk’¯ ÔI{‚$|ò$L%$Ÿs2¹.§°Á‰)?ŠäÔ%Õ…åìÒ«ˆ&Ýrý÷š—¨øÎڱ׈ëˆ,Œ0Ò+ôŠ6Á9GïKJ¡S´ý®ºNŸé ~NïÁ*Bë¡ÇÒ‰)9ôƒ)p8{qh“œ‰ùebùd&‘ÿo]ïGŸ0E=§90€ä] t] „H]÷uÝ÷îÜ87ʰ ê—}&¼_ÀŸ|~Íßö ê¿úõý.³ýÂçÿ6%mØT1` “_TU׆¯°.ÿ?ý{µ±z*V¦ÓB‰ô?s/j)r QÀêÀÎ9ö,ì'¿ü"{åðY߯#my»çäõ–ão·4w{aõn‡_ðÒÀ}W1(U–ˆþA¹r#HìL K,þ^ýUyî¼Í?5?²¾ÿÜíílgekmSOs‘óŸJÿ/ÙT ¦çÎ(‘m_ ygÀÕéèÀ:»Õžþ$n88Râq" êýI$\sˆ7°¿:\€¸JT7¿çˆ+%ì;úe¢_$Â5ð{F p3 ÐVqó-`T|î 57‘3`Î9L·µNqÚì>ãeÞÇþ+h·¾°‹þhD^þ×™¿èiïGº“H}Ã"3¥Üž¥4v9OU3+ƒ'Añ3ëS§8Ô6¸sÁœa)fg]K\ÖnÙ'_««› ÷mî‚QÕüÐÙ·~ó>/¿rxeH_c¾Þpüzk‘˜w#í©ÂLÖ?{E;H½©¾¤N‰³qb”Öäý™ªll,l²¡K_q^Ôÿfÿ°­OxXð˜ ìè7¾h…óí0”+eÝ‘>L&c.egÊ÷ì×BŒ9@‰&i«9ÒØ;蜥(‘ pþ»ÿ±¬È?¯…tlOwm@–nÐM×KFŽÓäÌñže{¬Ý•¨ºÖÏL2ZÝŽçqzR©G´Aý!È1¨~–óà™"¬ãM®ÉGO–­_Û+CJ†¬¾ÛGèzeѨý•Ðä©×ªUæµEýî3J IDAT ³œ& Ë©úhÏ®Ê÷ç]y®÷âð|'ÏX'Òÿ2ÿ=|åÀ$ÿ¯RÔÿ wÞíøê !Ü×*úHPc/ú|´ï’±}À€!@jè¡S#z•)q…“šÎH–}0IÿÚ©ðV/+'V÷:Ûç4©’J$–vÏ¿R‰Î.¾ËÉ^°+Ù"Ïž›%ñž)VgW­Õéï\Û‹=ß ßzQègp= u–´' >×;D¨Z0’ª¨uÄJ©;S`Ñ B*±@õY‚9Bç”PóÎê*V÷*P€~¬nÕ%ϹX]õÎÀL?)ïW“n=E@Q¦i%¬®íÏÜv"ôÌ…Ê §©tÑÒÑÔÁÀÿÅ*¡ u~-—w[ʃ®¬–@4àS£=sT,úYÌ0ÜzÖfQò :ânFü§_B?…½ oÜæÏÝ üö­ À“²Û1òoìý8o,øNó7›ŽçN[‹ze?)©êC¡>¸†Ês?'¸`à¿Þ%è •KTîA÷ mBº•ùpâðÎ#ÉáœÇy‡xápæ3`J¾š¼oÕƒD“‘T®J¸¤²¹¶&Eúê·?CO½Ó¢]€‡(â[Ä¿†Ì©®¡i'o ñ„„G½ ÀT3ÑлÂû`VrÙlޝžfäçÐ&Sš |œeqô||ÓV4MuD_Û×Áùó$ýmý°}ù¿ðŸþíä»þÉ_ü‡ÿ ¯€ý•ÿ(•Vs}Ó R8Dÿ˺OT‡±*¼¿^ÿ/Eeú÷Ÿ? L{µ*/k¨)ø?™¯ìì©ÚUÁD|½áä;-ÝQ"\sô+‡&åð35ýq¢[$fugÒW¦Ž!í«ë!åà•”åüÝÔ¯5=ŽÛ$E£/k#øq-…å6ŸÖÔ¿O·9îlg;ƒuïrn½kÒþ%Ê¿,MÞWR”¿Q'-ÁŽp%lþ‚çg~åWZÞîY~¯£;MT׊Ò܉6wI‰å; ñ&ÿϲ($â}«ß±IC”¿å´)2Î Ré©=ÑIô ÈS¢¡´åÜÈÍµŽ®Ø6 gg[íÖw€;°$%¥ºáX¾ÛÓÞM¤b§tGñBl¢EýéT-õ…·cRcí´JÄ\ÍZ>ò3É0 Ì4Gøã@­ìÛBØ&ߤ“òÚy6múù¶ý;»0[½ùÖoÞç õùg}+b÷þpÅ›ÿן¬X¼ÕÓõÔ7½½ÿÛœî%ç8+yÏŒ `eñ 0)ªù›ª0I×ÛÑ9*0°1zÖ“Ÿ©Üw@K•Ü€ÏH†Pðê€;ÛnÅÇ;|u%\ËŸû‚î‹áê’å¼+?~&£O+ãݰ^òÚ°ÿË ôZ'åÔ:*õ‚$PŸ,’/wJª’" ÜÁÈÄ)[œÅbmÛò½›L»$Î’dV¨ II);£ãð$Ë×g€ÿg³íY íÏ6ËOp²Rî%ú¨Ü8°ÇËDÛÁ¼f•ÐEà ü¨ìP`-²Øgžû´0=&W QîTðkÏÁWöÊ^~{±Ü2ñN9¼á8ì”6A•Æy×›„4µàcNb7‡ý˜ó¦Éç(ê\ ªFéÌÔrµ÷Þæ*J皣EEç`?X=@§J‡ó#àj`>Önˆ´.àÿ ¿þs±?Ž¥L„è“2¯„×÷?¸Dó‡Å“pꡟAÕ+Ú*m–û/Q‹ÑAS[š !z‹ôõÑÞ¿©6BŠË õ.×§•ª9]ò;R‘̇2bQÄH#!þ}Ì€?äOEò<×7)ÑÍø÷€ŸÔ»q/§Mb/Gÿ¯×Ïu‚Ê÷[gEï”YmåEmgé&æFœ9]Y?±„àLc˜ ‡Ü‘‰Ý›ÆÂ²Q±HhÈ®¬®ªQm6âÙspëÇñ{ÿ Ñ ï¾Nùù;_~ññ"’wvÖ¾þÙ;|çõûœT ŽZ¸]Ú›‰°JÔM¢«Þ­¼EÒûø¾Æãðšpý àS$È)¾ľ'´ ¡ëè#„ÞỎ(n¨×È2NÈV¶ŒmGòç^óqªxQœÓœŽK =þ–#¼ðIÜ¢»oÀI‹Ÿ{üøwî­·©ïà‚Gˆ¸¦ƒ… K‡kAzësœ Šó¦è·­ >Œmo¨ëOßÚÖ|ãd ®è“éŠmË™zM0½ìÛðÏFðO×å˜r3²åïdx¤ô(B@.÷8s†ÜŠ(ÿÿèOü µFÚÔP×tP•rö ¨ŒP·’ý­¥AÛg@æcO/9DmŸÂ(?PB8ò9¾±ç¸sEºˆçzáGÇßià@ø¬§÷"ÉÁacîöèÈBv–¬Êø`HBÅåÈ«!ž€:®eÉVï„}QzJ„y2ð¿öm½rôvR²ßg„Ú Þ2ìm=FbŸ—†Y#®¨(3p}æ$€˜ë “lßÉÿv˜À*Í\Ð&+pyp+K?Ò{Áujª[“ñwC$5À¿‹…” ,  ÍW+ eÒ`u)©/P{uÌÑëÅÞýI Ù%ïs–&ŠàE‰šeÿ1eǨneÕ‘SLÀÉ)€Lnì?§þyÿ˜LeÕÚþy-tYq"¸DßcÀ~·«&D|B*ͲjïFŠ @/Ð D“|WÉÒ.‡öôÖTíïÝwÑå»hgóÓ‹Àï4‰oÌvuÿIØ;Ýûú¦ÇÍû§Bš´MÌ¢¢3A¤¥ò/>v$‚ïz|Ÿpý‚ˆP'%9E½P« ŠsÜ ëkʰ°w{ÅD-ØËï±êåP‚¨½ËIF PÝPÂóV µ‘ÎjÁï ²§„=ÅUŠ„‡ Ô(ÞÒóµêQÉêÞ¡îr¾×Ú6 €=L‡|0_Û¿!·Ï¸½I8´Ÿúe¿­Ëgî_ßÞ¼Æä¾'€?ÛŽaý?ó_ÿý'ð4Ÿ­ý‡ŸûïHjÑ$F°1² 9‹è½âÄ D€<’çÓAéZZ€ ¨¸6lÕ)mà¬mûìY¸«ÎΤ§º2gV¬B.þ~ÿü/}킯p5ìªD.ÞîXÝé¹þ¹ö?èŽ"þÀÑŸšª±›åt–‹”ƒ³ï«1Uš!²øÆú‰Ÿ«UðZÐ~(ÓvV'ÍoFV˜Íûfbª²œõ)ë–eg;ÛÙ³°i+Ü$ š,³,S€£ {Çsî—Ù®Œ¼Í74)'ßiY½×›Dû Ò>ˆ4÷Ýi2Àsž;¸ÆF‡ý2!b“åÏ« ع%ßÍ ñ_@šÌ„;ÃxÛÝ©ë傜éØd˾­Ù˯<ë[¸¶¼Ýsô†—^9Àaö‘€?pøÚ@ýù ~2ë[Ø Ù7ù[[§)xÙ)Ò*.äR¯Hv~oF43H>éÚàm¨û¥MLÛ@ñumÖý]¿ôöaS8ýNÇâ­–Ùó~¡™ñ‰«u"€M~’Eýw:€ûEfèJErš qbNÄìÄäцIŒi6Õ6¦ke­OåìD‰õíâáaës¬ï NpÉtÁ<¥#›ì/ŽÆâɸÀ6RÂÔ®°³ó2ZbãÏ©jp‚Aö‘‡¿»ÀßA'… âŒëÁó j‘±ÆH(uÔ@)ж¨Ç4²RÊíLq¡N Ú…ºÖ Ú‚;Y"Õkô-R¢©ÅÛèÉ)©´sHt(.ƒÿý@ÿRž<µ‡€ÿÃ7.ĬNù+×A˜Wæ<î£ý>U(€^þÍŽNNíóZ˜×¦Py˜Õù+š¿és.ß?FDz#ÇFϯ~~ûæãý”ÏÂ~¨u¬^oxÕ ×…½cå(%|åÔEˆÞ$ÿq& ¡= Ëí\¥éiQØÎüax$—qÊLATMBÐJP§8 ÊÀ(†)Ò¨¶ÎÛB¥U#‡ ö÷ª¸´);óLgpÕçzfŸÍ¿ng—‘w"E 6Uk U%Ô¾Qï@Ðb?ù{‘Îfü߯7¼Ô:n‰p’#÷÷&ï…:¿Â‚Xʈ>)•ËídJ¨3‰$¸¼xˆ#%Z¿¼’êðäåù/Ò ðßõ¦,±l•6§@9˜J¡$™2º½Ó,ÅY2ÖÎL‘Ê|WbB:ÐÎ#RÒgEaÆÉ˜§ZK ú@H¯} ö¾.;ôXŒYä…Ÿ¿_ñ‹/6Ïê±}¨l~lñqÞX½‹k–\¿×ÒžvDBó>ÑÏ…Úu„ª¥!“¹"®íQ ½m‡hé3\r|ruÌœÃ{‡wç„5snèÖÇwìD¥DÕ“QDsJ Î#’(¤£ž>}Ó>+Á&¦Hé“ Yu¬ 'H‚t¦F$êF¢a¾©«<nš XŸË ÑòßÂFDÿ(Ÿeþ“¼Ð[„ÿ£ÿíê0ÿa÷›¿×øùø‡?ýׯ>è_ì?ø‘/“´(ý¸òÑLcI¦¼’$™âÊÄ):L_µháŒÚB8wr«ÓâôØóæ“ÏÂ)U&ÎÛöO‡¾³ ±«þßùgK–ïö\ûtE{i-ͱßw¦úšSÚõ'¦­ÒžZpKêÍçÕð?§²L¤à"cpXhéGåËiP‹NýXÅo•Èê¶-:º”€uRË6\dç3ÞÙÎ.Ò6;ɲL à/Ët»›WZpÄÜ ì—Ò®J'·z¯gùNXg¶÷RÀÍ„°ïr>fGû âgBu ôK›õK¥›K§QéWôœvtq³3Ë`çfG6^& ËZdætÿæ—™vp2ù›±[_ØEÿÜû£‹·{Ž¿Õ‚ÂòÝq4vÇÉ&ÿ~Lk!AÖdÍc.Ä¥Ÿ2È)ˆ¹-$ ™Hšo”›m m¯÷g¢”wuþJÙ‡I`ñvÇéwZ>ì½ß$#Å,­­¤¨tË„Ù&U–‡ìèÅR`d_›Ê؈æ6’g4c”Ù˜Z£ô#…8sÞ²Ö¶¢p†0]o–bïüÊçì=t”¬“¨»MÇCF uÒ€Ÿ4 àÀÓ÷1lo¯\í¨giЀ1³”a– –.\à³Þ¬è_–É€K­Z}dm­âÖÉ@¨ÁíWmü'É!}Û^ï•Ejº[ž¢! aÕ“N]zèÅÄ™·>ƒB浟€ÿ›‘ÿßÇãˆÚ^‰ùÝP¡ “Ö¥ù ªUî'î`vëP¾DZ µ2p´×R(9ò?"³w= .qç¸á¯}Ìq§ºíëù^xù½Äw›ŽjÏqx’è[å8€OŠ,”.G²„DŸ¥™h±·¨'%Ê\20É÷¼2È?{2ý=GƒVÎHUF°\å>ƒDA ¬-)4†|êIŸ§±- U¸Ï¿Xð°?‚ƒ{UânØ ünDáw>Ö±zÍuC-úßåñ‚Bhsô=z²|¹ššÄ é_Öyßš´ÿ´ìÆF"eþ5 ¦dFåýÚM¢ûŸL½U…U«- øymÊ'óÊÒœ$§¤dÀ¿¤Ö85—ÔL‘¹"sAöçv'¸¾Å’¸H¨8ƒ¬T¡O /òÒÝ”/ê¨G—»¾5–OïQçÁ ŸëŸkº À°;ý)7~â˜Ù×Ny«*QWŽÖ›"Å"zR%$Ec‡KŠï³"E±¢„* AÔÞå(A’µ‘¨TšŒ$ nHûbmÈ8uyw‹m—6RÒc84§ÕÈmsh3·r¸UÄy‡ÔÍj3’ýUÎg² #”Šº,±‘ë\ѱï*ƒÿ@¾¶f=B_v…”£ýÓ–¨þ3…M`ó+—ó¬ƒû¬ÝËú}(ð~¢û7Éÿêó¿=Á§ùôíßÿì_¦s…i ÄV@R>F²ú”àÄÔ¸ˆ¨ö×ãD·Dþë c×(䀭¦œýì* =6&»Š‘ˆ.ü/ÿâcs¾þÝÕÅ]èŠØÍ/ÌøÒ—_ºÔþ¯åíž×ÿþuRßð¼ýZb“ðsGéN.ØØ%5–þX‚ A`š²ì‰ØŸ¦=Îj––òrT°,þ¨GÊýoø©Ö ßÏê*´ÓíìÃaÛZæñ\ÿ§ÑÿS2@Çèå*À?“};Àe³« ù¿¼Ýó/ÿÇ÷H­ÒÜ„}¡_$ú•å;SÍ¿Aüuðr3âÒ€=¿“‚]Çt‰ìÖw€Ù-Ïÿ¥ì¿èN"ÝiEw’ð3è‰þ8âfŽ~i?Té—J\(RA\*q©¸¹Šä“)€vŠö’‰12Dü¯1;7Xžk`eqŒma×ή˜}TN^o9y£eïc‹Û1“Ä0Õ˜ãD˜Ë #ôÇÉÚÕ\L)`•¦rÉ“Vr¦¥vt/¤¬€—1WÚt9K¢:餺þÑ.¨-ìÕ›…ÑóPúÈaøvæž `Ä/øí些g“Í eÌ3YÎwE¡—ÁÆHaé,¹ãÝägGÈøœucYó0jùBך$ç•,[?5ùB–MMG2òŽô˜‡¾³6+QMjW$%­:ðÝB/h sÖWêÄ!ïÜè/gøÿˆg7D™b§­r «˜”˜”€0¯ P^¬ì™ìÏG@îÆ¾£ÊÉR ^†Ù‚Y•Gyæ.‹Z<ð¸—~ŒÿCîñ??÷ö÷óË=Sû©SÏ;¯5¼µß „eâÈ 7f×+!X”ut  Nï2Èš9Éå”.µsgãšURf"Ìæ2‚GŒºwƒ2B-´QäÐC©(ÞËð²‹äß"ê(‘Ó¨ª4ý¸ý¤r©_¤œJ€Wg»]±›QX8ë¼æµÃ$–Ùurg_éÀ¢”;%9¨:†þ°ŠV,¤€À«‘W<™”‚ªøÕœÃ\ireôÔ„RÇ¥™“Úý)6' «KT.›ëé Ý¿žw¼Í9Êíý•ã=åÑòþ2U«W×öíýW‡1Ý@1É÷:¯ öŠ+9^¼B¥H­Èž 7¯#7>Ôσ84݇“×qî.š¢)7õŒ©ÖÈgåËÞ£IŒ(±^¿?µ |cÖ>ÖwÞÙº}ëèmô-¾U®íyªN:Nð1á[H•#$‹öï"I©{1X/„¨8Í*.jd﬿Œ4u‡:Œ½§cºöñ¹,Y–ß2™Xæ—œÕY_}a¯#« IAœLƸ9ÅPa†]qð¹¬×¶·ê›÷ hr9`˜ŸR~›)çpþ§ ýƹ·Jdÿ@LØü§ ÿ6õ€í¿ý_ŸÈ3|–öï}æI)NöÈz©´ƒüÜJ=ub­ÆRt•ý2N‡ù$XdïÝ3ÓãsHã3ü9ìaòÿOÏvàÿÕÁEÞý§ |½•[_œÑܬÞé‘ZH]4ÿTcõ»(W‚h\ª” È”ƒS;Fö“r›u#ø_T¤(RN¡ÁÉt\Î)£˜ä¦x²oͶúœv¶³=;ÏüѪפÿK¹›¬[FR“uÖ¿0üŽp‰ìó¿ð~øç.·Žçý¯®8y½ååŸ= 6Êé-áÀ!Þ$ýûSËeW‰¸R\%Ä&‘Z Û‰K# ¹Ï×@OFYçЉó)P£œe¹1)? ÜÔÉêQÞ®Ã;c·~bG8y££ºaW¼àj!ì ýJ©öÕýVñêQ'ƒì¿ÅÍ ¸TÍo±3iKW9›zˆ9¾Sˆ&s;HýÙ§bNs˜O€Í3ÑÌy°8­ûçµ3å=s»ê*‹·;ow\ûá*÷0»áèWÆ’®ÅúqàfÖfÁg‚Œ&LÚµSbQQè—6yÒA (ë&MÀ~]#ÍLû’¡O)¦œ­ÿÞοÀ€ó–û’é'ºq¤NžõcuùÉy&E™î{Ô3˜’6¯½IØæ(º¢NÓ‹²5€Áq—ñ ÷þÚdg~§A—ŽÇ‘ÿ¶x5ÅŸç¢õ9ñ@vúCï‰Elz…^±4 –ìÚH’@[ìܪ.óŸíáè l‹”k!ë×.ö>ëžÈ(+ì‘1šNh;¥–ûþIâþIâ`î8˜[îö-””ÁxANí gˆ6›ï¤»$~­ßeñ¾îõYÛµfKåŸ÷-þy­òÖiG ö쎖‰ä3ðMÁ÷Jˆmíc^z¡CñÑÀÖ^”¹ s…ÓÆ~ƒ"Ì:S8Í2Ïjrí¥¬i¢àÎF[àÐa-C¤©0F[@•÷çª6Dl;»FQ€ 1`(?}ò@¹ÀïíõOì¼WÝ®%xéøöópÍ ÞynöJâ+#‚xE2G¯„hQÿ!§ªð|‚è,zÙ©‡ ¿ú¶-Ø+®¨ ý<e„E¸TšÓJäãOÚ8IG1ÿ%ÍœS÷òS’À´îQäá$‘í_ËZÞ4fÜž#Œ &¹¡ú„…ƒ}äú§ð_@Âs8R:"úô«h{Ú‡N!Nœ@•Ç?>uãg àÏžTüöa·SÁxö Wb¯,¬SóµÒT¼âWÎÚG”ª³ù­¥qÉ‘ùÎúuÉmÄ”2L¨Üiʤ®BÈ Œû _S„)KQb©8 éÆ'5‚‚·è~¯‚KÞî58ÚU¾>Ó”–'ÝÈi“zŸ@œµM.šŒy¶Xά CÕ¯C¹ê# oä¤õhÝrÜæ1åüÛ>® ð×ážÏ'LÁþõcÖ½Êö—?ý_æh=gî—#ýóXÀÆÞΑ4b­0¿ó‹tÏ7õ­¥Øõÿ8$€ílÓ® øÿ«+ê[žùË7h"Ýqäð3ÝIlÙâR‡ÔÇÝiARN[ÔKjXWKŽþ/é.%¯A · –VY‹õ=#Ú÷A¾ä®9ïlgOÓ¦²dó$€„ÿ›ûÊqžu+³ Àe°ù ž/}ù¥K ¬.o÷¼ýNLÞü$—6ëêŽÝq¢Ÿþ©5Ig©¤kÆNÌ@Ë&ËÙ fYç*>•¶Yö'ãÚ­Ûë¡Ïz?@ήƒ{¤½üÊÁ³¾…KaËÛ=ïü“S^üÓû,Þ‚æ^¤¹×S]wÄ• òŒä’l7Éí;«ûiwÒAÞ)%Lær3·Ó ý¿ý&Wù#äʧ™­P›&ø|gOÝ®ª À{¿¿`q»C#½fi3Ò*W)·ÌŒ.9Ϧ}Ç$ßYÙ.±u­½ ™)à?ô+œß&¦íbÓžRý/ÒèÊÈж(‹Ì¤9Ò(Gh ÞyÍúÔºh>DàŒÜøæak,_èæŽéõ'e@e=¾÷Ù“+W7šêIØV0EÎÿìÂLÏ[¶ Ò0´J}Ι›õØÕÙ6™ …$ÔG’ É@-SçÌ»ž!’IöÅñ+À™ô¿såžÕˆ›<¸É÷zì¨WNU"øXÓ,D€r꘬wÎÀ²çoäh«ËV©¼P•lå®Ý#üî5øçàÎÿ?w*¼ófËÉ-ǼIÔ¨¡ß.2‚ýI tIô»hŸMmód´õ™$Н û½P ¨‘È’*3„™i B¨Qjç]Ò,m€àŒ àE¨¼@ýÊð²ÜzyÍNÓ ÀëûK/›Ýõ»Á]±Ÿü½È?Šo |³ca`¯‡y„•³ú´„Sh %ç‡=$Gõ—èâ1r¹H†}¹î7‘)w# %LÓPäõ@<™ì/jÓú»„›‚ë µ&ûïs9vJ¨,Ulª9¤^Ì/Ö*)fB@†ýRÉÂàƒÿË1º(¦¦Ç9¾ßGù‚w¶³= Órò·„u²ÿÓ´]º^Ê¥Kó€Ûž±Í_ðü̯|âRGt»åøõ†[_œ‘z¥;Žà…xiOn&ô§‰~-R³Ub›s:7 Îd›ãRM'KáhRúÆ&=Ú%+ãd@{ð§,2•oÞ"Ñ|.¸¹ëÜ>ÝúÂå%©‚@0÷&ã/Xÿz%9ö}fNTùØ£9b_‰b‘Ÿ`*Umn‰0HGÇ<®R±1–ËÀefEÆßÒ"ÿubèüˆc?â³fßíòŸ›½Ü ÿäFÏýkÂÞLXå(Ù;«_)Gš¹uI©’Eû;Í„U{ååWŸ•uMÂg…“A‘‚±‹6ÀrŒ0Öù8¨P0ªT#` ¡À V1Ö͉"…Œä”FN ,SÒMÊ¥¾–Ïa{}Êç½S5VÞ÷¨RÅ©I.;W!nnRaZ·q{¨¯oïó <ê½ÿÌIµ#¶¬7ËÛ¶w¶³}?¶­%Fyÿ¸Qž’¦ç(£Ò[9lØ,˜;egÏÊ.{WdmºE¢¾á9y½eùŽ›©Oô§æÐ¤ô§–—YSöJ¿Hˆ·ÁbwJžæ˜åmFe,zªÙ­¹ ÈÙ¶Ȳ°|Õ®ãz¨Ýú⎰z·'EØ{Î"þÁ!¸Zð{B8H¹®'Du3äº.øì’—^ñ“²Û´c=™§ †L£}4°aH°Ùn6ç ·ac[ÊÛ¶wöÔì*©ÜûÃwÿÅŠOÿ»7H«Äê^Ïþ'‚©É¤V‘ÊÒÃX?a„˜Ø$S”)J)hX;aL“Ʋx†þ$ErÎ4Ö¥ÿ·õ-iK›ØÖ·\³âø·>[|âP.£ù¾ó½H4¡*H¯9‚Ž xb!P%·­ˆÎ"ûŒúÓžHçJùŽex¦íë–w@ép'Fó~É)?qžèä<ål|öÈ4;{:¦ˆ 9ót£€ü9ÙµEýEŠ€ñnpb$5 UÔÆ†ÄLlKŠöÎZ‡E~’ *ÚI®b¹î8Ÿsñú¬÷nuÄ% E«2"v…ì?¦­;öuˆôS»uæµ=”Xä½2ŸÕXÎyÆ&:T÷ü<ïøÄ/´åó«ÑáþP#¼ø{ ¯¾,Ì÷z¢Ì:p3VI‹î4 &bÏEœ<(ÄdïpÔ^¨3€3S½œ*Qaîá0‡!K=“ež3ðãeøçí¦Ê»5ÙþüÌþ^å®ddÿû±¯ìäÿûHN³GäZpTs軈ë´}45‰ä¡ŠJHVW’˜(1Þ“Z=ôjÑü&SÑ  L€Jf®€•Y®¼lgE 犅"ÂáÌ]*Rɹ&Ø‹°(üÅÜô × WhZ® -ÛÕ’ëò­ )†ñÒcÚG¢ãsÛ‘až€ÝnÜW:…jO½‚ã…2«…Ð*}T¼B¯T=T½Z¿®¹½¨X{ÂÚSb¼3¦Ñå?‚û³Éû}šÊeJjÙËïû’òÂõ‰à[üËÿ#?Aµÿtñ/I|…ˆz¤òˆ›dJ•ûKÝæÞ‡ï[a£ iɧ`¼®GüÀ}ÚV–¡<‚î[R°úOÓ LAÿ)É`SÒÿáJl=ögé·>裻ö>ùŸKqÆŸqš>lj6¾,)±¦1þ2€þ™NKI23UÏbä-ûÍ4ÿŽ‚²þÕ2ü³²QÕ¶½¼Ÿ3à¼v,òö .°Ùÿ½ÿôGøó¿ôµ‹»È%µËŽ,¾ÛqüFËÞG<íƒDû 7ßÕ*Ñ®ÄÒ"/¾Ti2) ÃPNlü¦[”ãÂŽ‰+ +k©ÉÑþ#N†zòÐŽÒey¯>ÔßÙÎvö4lÓÓzÞR:Õ¸±¯Êç2ù¼ôPejê'kÙž‘}þ>ÂÿÜÍg}çÚÉë-}“ØÿTEwAÀ?´N©o„p  R›LÆFr6§hƒmñ2€5"– Ç:0É€¦¬ËšO£<·0Ù€±Sƒ±êŸ(.þYý ÙeNSñ4mñ½žú†#.”æA¤»qûŽö^OwldDÇ]‰ì_)RDÈ’ÿÊ^¦>ËAõðdH1,=gÙžÑþgLÊÓß og—ݾý[®àô;Ëw;žÿ©=R¯¬Êìy"´zª›MF“ÚYèÒвzßY‰Šß¤…è 웊Ll…à9Ú<‘j”Ô! 69êXdÒ~ô gR%3¨s{i»9VO¾à¶öòmHj]ÃÅÇ{°(g²2‚¦½"ÉP’f7C-ļÇÔRV`D%l?ãícœnÛ~È=kÓo5þ½Øw±Ý‰µð=™œcÊ‚X;Ï–Íàé™nrã(ÎÓ†S–<ÍRÍyž*Ê!µG¼ïñâДÐq1’Ú]2 xI¸·fëƒT4§ ìÐtðì“ïH=âÓXS@Åçû|rõ§<÷«àÐrTû$5€¨ÃØÔÖîDà+{‘_®å=×ÁçVÂë·;^ûQϬ9ItAhTªÖôs=q9²_"Ôɪûõé£@49ÚZ ü¯2ðt ¦F6Sö*ÇÜç<êbŒžžFJ—m‹ð/rLIÀ!§¶.»4:Ä€d¨ž­tóyR»")¼ZÇ‹¸+i xp š=áíEÏl©´3¡ŽJ¡ ¦æàÕH,!K“›ºˆ-!é–¢R±úŠR©I¨é2A ”ž”ƒ™s,õÄsœ±þ†-}}ær²ÐtéÜô—Jf|B8ÌH"hB¼"½¢]Ä- ‡oªkžšŽHí›èé{èªGûe&6­ë1&ø3'ߘ5ýÕvföFÝ GwCˆÁêt T|cà±ï¾g¨>1Ã|2%kG‚WÍi7dHTаUî–ª4ÎRÀ´š†¨ÿ¢`dx0íÞ%ªû‘êïâp‹ï!G=4!á™0JøË ô¢Ã¾õvu5HcËU=DùC‹LSkŒ ü4šÈåqÿYE€ó£ý ‰ L¦ ÿÃåüÏK`ŸMË›€ÿøü[ój‚ÿñSÿyö–ˆ`%¥Ä4ª¾Ô³óÆ“#m¸.yü,#Ð/ê†qÎx\!Œÿ+™¤Žf»<—-ÊrvCÙ!µÔ·½ëŸ]øÿaiFÅö¿ÝÙãØUÿ_k¹ûÿ-ØÿxEû ²|·1_TlÌŸÛ$Ä)ýJ‰Ë4(¸¦6­° -‘YÒ#3{%…éD7pÖS[nâ$ÅÅd&é%³•ƶY‰wþàíìYYi±i£¼ úo¢8þ\ž’*F€¿n¥Ÿýä—_äc¯>ëÛ8×îÿqCû çà~¥¸œ‡&•Ž)Gg¥œ9ì‰ÉòyG ‰Ø`Ñ3h­^&,êßåŽO:Ëg£B€Øå‰K=ЃTÆ^ÕÂøëÀŒ¦¼]ð„M€f&_nס=¶½üÊÁ³¾…KaËÛ=_ûŸîðÂÏìsðràø[-±Uü\² Tn3+ %d²1ð?å\çÎ[£“uæëvòËy‘Ê›½bªû»öpeí[÷þ¥&‘½÷û î}ÅÞ‹ão¶¬îô¸`u¶Í¤2’•]NwÛ”Á|¡é”ØšrLÊýNH1¦0¤(“§>·)Y¦€üS¢Ìf_ñŒ¿Nþ÷Ï0èo†¶maH´2è¨"s뇥´u†*â1—Œ-cÀšìeË ‚ÉðQ·”7Õõ¿Ûã7Ï»vl>gQ (`¬°þÅÏÓÉÙâŽpqvéãaý†0FþÙoè®T 5¸y@g3¤ÚCª9êâ¼ÕñÔA¿Â7+´[¡+“¾Q²|¯všÅ½ uÉü¼2Ty‹6ȼÇÝPdîÐFIGŠô "9µÀ¯;ÅñŸÔšbqúÇL0ò“öëµtHvôdûõ›¿sãjDh_ë Hùãûw]¨²ìe»®KH}e¯9’ÒU¢ºh ~Â@ ª7¾`r²uª½SS H6‹Mv *,’?&%tc”¨D£ @Q¨[¬“t®2ÀãE-ÂÚåjëLþ¿€;Àø€ý–³êñ•$ž”yµ CE;¯~ßñ»`±úä£÷M@¤ ½Ò›¿F/¸h^—¬jKPäÌ]ÒL^É$–¤©œÆÈæ,‚b* #¨ˆaáQˆ1Q;¡WÉ<ª"÷¯Ô9’ˆp×ÒPx·¡`±AzY'è„ð‰,eL¡jFÍdƲÄ‹SxðQ€ù ˆT¤þœ¼ÇG& Љ½¿“Ý´Næ™kn©ã[ÚÃO/¿ÌŽðA­¸þõÈêSŽzOØ¿-u×B´w|ç>·ô¥YÙe([;©Èÿä÷z®ï•0¨d ïq)‘ÿ~Hw!ÀaísjŒÍ6¡¸˜ä®'œ¼‰ÄÛ°ê 0.8$o®z´ÿ¦­Võè&›DÝÛê,è>ä§Ñýgÿs¢ýK™±L.3쯹 ÈßýÏ?núMíóûoýæ|zOÏ ð?€ýZ„÷É@¿ŽDÒGUÑ´à}¦d)j\™Ö^F—j³êú3.ã …t†Ì-¨¦R<ñ,ÿm÷ð¾>“ó>x"öƒýÙ±0ÿïéî¼–ú¦:ìUä÷Jê)*©uƒÊqjGËÔ9óae?ðTᲨÀj? ËD Ë“‰‘P‚Á¶¤E^SOž’˜ìÿ~üÅ;ÛÙΞ¦M[o Yƒµ åÍÔcn’"ýoBt;ÀÓµù ž/}ù¥KE½¼ÝsôjCwj’5wÿE“A›HuËD\$ÜLèi²‰+=K95jR6C‡X$›Sî3H3k€F'²Ì£üñÖ4ððlgOÔn}árÖÛ§m©S~ì¯<ÇÞG+úÓÙ)çgBû Ò'#,,'T\Y{Ò_TypWÚB)ÆgiilÓvq†ªc¹°‡v!“íi·°k'WÞ¾õ›ÿ?{o,KvåwýÖÞ™YUçœûÝ·[­‘æCKš1Øó O˜DØ0<ùð‹ÃÀËàW"0a"€à…0HO0¼lìð#`ðC€=ò`b°FDÏô¨ÕR·Ôê¾}?Ï©üØ{ñ°öÎÜU§ÎíÛÝ÷Þ>W]ëÆ¹™¹++++k®ÿý×å%œ½Õ±z§çÖ?»@#tó—=ý22,#‹W+b ½2ï¼-Òâ(/–´ŸFÎ+ê-ªF½kI2h¶(rAÑ*/ަEÒ.ð‘JÆãH5P”Áù¶ó1Ú’¸ˆV‰,'@rºLÓ>™î7DĨnѹ7÷ÍÙ€ž9âÆ÷i‘¶bDóêp`ÅhÔ Ê^£Ñ9Ÿ¿pñEYi±ˆÛØíc( Ë/]”åýò´ ;$Ù~¯î–åzÏ×Á>²mb_°ÁGÄ¢€$'·¶ä×H¥VÏA5Ì‘ÅUÜì*Z]AÜ ¥B$šüMXÂì´@N§ÏèIŽÏ$P*æö” ©.º±:Ù["â#þ†â~ésÈñç‰Þ„ß!>°†%™„ò1­ääüïQ ×Ti¼ßÏ]Ã9îºÀw®÷|÷èňÎþS+¸ûÓŽ³ëÎ2/,#«Jð½RuJï ׫–ÐyJ¥‡~0€ÔRXÓîXtФ&š l­¥ÕŠ¼Ï€W7å–eT<Ó6w!1‚8K!«õ˜=%b¹©·#ÆÜê[eNèB×gºÕWöãÄ0x|—ø¢Ô±gm׃ðö+Âê:43°ÐG*^¬žR›ú„E CŒJ5u?)TÁ€þÞ㣤èeK #–U¼›†Ë Êôi<íª,jzæág÷’Û‚K©\?É@¨óÞ©G¢‘Ì:ɘ cÙT‡õéÕáqnÁ8¡’¼hAQg×Ö¡‡‡wa8Cš#«Ã]K\¶ètí‘VŒø¥øŸÿìƒ¶æ »3…¤X³s{À7VþÐ&>¦-à%6ÊæDhÇõΘA•3ðÒG¡ŠEÛAhRŸëX´Y,1µ«qú¨E‰"x” ƱÒåþjHª/‰PãÁaj4®uÈ£ˆø5. Rz"Ÿ*°ëe¢î÷óÛç\F€ÕjFŒŽï¿ øç€yUWùy[ª¤4Ñï‹`Œò‰ÀY\»$ì~¶m/¾·lû”¦ýÓþµ/üûç€ÿôŸæÖßg¡¥½&¹ÿ’h?YìßJ‹‰j9–#Dr°º¯|šúØ|wùÚÓg'K:/{ý¹²¶×œRËîËÅë2=‘§jðÿòÙúÝ·þÇGÚ¯"~&Ú¾?0ll½[%ô&í¦Ñ¤þQ7­àÆÔÇ"NRðJ‘þ82¥q ºÈŸÖ¶é¦òë°¿©¼ÀýÞÁö)²‹<̹lô 3þ¹åç¨þ\>Êü§ý,˜UûÀó²ùmÏŸûϳxår>òõ»^ÛP_q4/UÄâŠ?†!å ñN N²Ì3c††ZOc*Š‘ižMÄ~Ií/9©Æœ5y?IÜ\(ùŸÏÝm"eS9 tÏÔnüÚ°úIO}쩯yppò ЪcGsÝÚ`Rä­;ŸÇ|þ3£S‹œå¹ÛÁÏ~Ú1_)/Õ°j•º3¹ç^?@•RyûªgŠ.CNUí£9¦}®6"#h3ŠH«W!›.RH÷ƒ=öæ 4}~òÏž¤U~êKU´0DûüÊOçÿa·m÷ñúAþ´«AXz8~GÇЬ”;†ªªè@T˜·pÔÃñàXy¥ ШЋš4yú*5°? £úD¢(+lÙœ£–¨q8ºǺãjZæµ0o$Á0€šÒFå`õ4µ'‚0ÕMRÙØ_ÉÅçøù¬£ "1UY£–™.pšÒ1X®Ñ³Íû:Ðλ :ƒ ƒÝ¥]ÜþÓDðç) `*mœFçeØðtìè7¸Ú±¹.¬¯)w¸^‰ÞÆîœþŶ:*hø’2€&e T²šF©PÅIÀcD±JdÔ;­°sj”Z„Ê;jïl[™‚@í TꌨW9ª¹à+ó2¶¡Ü~^TVëùHì€é% _þì¶ÓŒ)H¯ÅBÚ_ËÏƾ-ãgïÿ§ûßø[× ü…¿ù·ŸÎC{öo|ñ?@UÓ_$j´ýüOD€±×c\9–žÝi东*¡ö žŸŽÏÿ‹$‚- Y% ‘4}˜Äû)ÑXtµ‚‘Š:6ÞÚDØÙ<“=;2ì< )_Ÿæƒûhö"€ÿ÷þéZ¯VÜxÙ³|»§:ªG÷ ÐÝTWkâ&Z W#Ä!JöçÆÑ§›#÷µba$Lаlí d)°’’(°?ÙÚgÚß:~Üvwÿ`;ØÓ¶²ÕíûƒÉ³›ËbQž½oÙ¦iðôwPxžvÙsÚ´÷úUàêW‹Êìlaî›UÎd\}#Äâ<å¯Y`ùÉ{ó,Ó ñ4$Ð3IÔÄRŽyxY˜[Š™(P|ÅWl[*lxVPì³³°´Ëª\ñ¼íìGnfË•Ó7;b«ÔWëwúÓ`).¼0,³J¶¿¶ac„©-Ø1æ4½å/—Ú&‡SÛÐó9yÛeîNè·ÿ¸²ƒ]z»l*«wz–ow\ûÕÝiWqü 5ý£@èN#¾†þÔ¢ÿ·´Ã2ŒmF#„ÎØÓÃZ§öÑš”šT2-žrJÙn+㘑ÛÍÎbFËiSQ¾eϨM¬þÁg6 8¤˜9¨®TN¢E@%)8é" Ý"ƒÜøÕü— V ñ!n}·†¨Ž49ÙS~ô˜<Ü^,:[ÓCÐr¿x8¹þ}%¼ë£‡'?޵¥Ddº‡î1d? @Õ4ØyåIÓþð|l ’w«_‚áöD‹2õ‚Ô‚ÌfÈüº¸V/SU7AŽäRÝëñnE 5±qHdÄ0X{ö ìb·˜o$ÕÝò÷W Stõ.A®ÁêŽ9ZòyO¡ªHRØCZ¥%Ù–àÆû½ÅÀ·o½Ô·åk+xíNOíà•[§ëˆŽ&‹‰BSÀ2Dp5Tƒ7š$ûuP'4ÎÀÑ(j@ŽN2Ð^ËLÎ?IûË$]‰X4´$Y7É¢g€Ë("ù ÐÿÈÙlÀ0«GÞÙ½†]¯Æ« övß1NÝhþNYBþ ÿ?Ù{Ç‚ðè ÄUdÖ˜QŸ®¥,JùÔ)k…GƒaP¥V¡Q[ÌUh6(s€)@å=ïµ3à?“Y†Pa>sœÌ…Yeõ»N1‹ÚáPùT‡wÉËToU‰Š5b_Ÿ:lI3…E@ŽYÌ-i¼è[´W´t#Ð:Ë|™%o•¢¡Â4ó®²s7ź”I– {VâSca×ÞŠønÍ*ËÈ©*ÍÌáz#ƒÅ”RÃGÅ É×4D¼¦¨þ Ôš}ÄÚW¥¦aÍ"C‰–ú{Mä?D*"Ω¥ ÀAôDQ†èm,Â9½:6C"Eú0Ž™&îüرlsÙIgg‹°Ïv1øÏ¹ÿ]©ÿœ˜ÀÿøßøŸÿŒümÿ‚sÆdëø/¾ àÿ_þÒ_ŸÀ~Ä´-ÿ2òšeÆô ¶ÇtÝ9–R¶©h)ª‰ 2Fîï§Lp¸â’:@Ñ•¦5à´^L×ÌŸ…¦ßø¢Ž¹$ èVɳ5ÙÚÿà–›H"–2Až¾À§Å^ðÿ½´ŠR!WqF˜Ý¬8þ‚Ú(õUÑù+ž°‰’|ºÚD+ŒJÀð’ŽB™1àk üb[9ȹÉ]¼cëØäµ»¿ïø`;Øó´ÇµRÝùËæŠ²ìmlZœ‡P݇ IDAT3ÔIqnNФ?Ieî@xÆvÙÁÿÓ7;Î~Ørü ›;ý©EešTsHû~©Bè „±\ÍSÎæ°%ÛÌ(ûŸSLŒ·¤¹ØÜ3À} Kmwÿ`OÕ^ýæñ'} —ÂÖÙóÙoÚÈÉçjBjâþÈ"šC¯¸¹åª "Ã_IÍ3ÅÛäOÅÍ­í¸JRrÛT‘#æ™r&Y¨)Z¢œŽœ¯¸=镲áÐV~Žms'pÿ{›KAÎyÿ÷W¬~Ösô¹†Õ»¡OcÅÃäý'ô›HH޼~­„Ô9C¦"Ä‹k’€…ÐÙ¾æÀ1‘`2ð˜Ô×Ä¥mS°íˆ'§ã-Ã3jë7ÿEäÞkpÚ5É÷Ï*丂y u…ˆ5f£­ Ûü`m;¤†_Epg¨ß€8¤^!' “W­" ®´“älwYïq2:Å5&(B“gŠ8‘Éã6=Œ‰Ÿ@Vaêz²•2ãƒTÝv:© åÿ Ò}$€·Ë2h›µ'óuògHOß>¨=dà¢MJrŠ9-Å+4 2[àç× þ%ªê¸« s šê˜k Ö8œÕ•yqM6¦‚ÑG낌ÿcX¬÷“½òÁïxãû°xV=œ ¡ËOÉvA·‘°ó²çüï\kùûW†§v/ÏÒ>ß)›÷ü“áøªƒUä~ nn€®·ZšRë‚\³^P§„hN®¡·¬GÞ$Ò«D…¨J¢‚å;èú.ôm6‚iþb’hf›%)Ù‚í¿v1¥4……o,=ß=>¨|‹Üp¬¯ «>RU*¡ê£¥órPõÖ®\œ2k#s§„#oªëª¢sÁ„ÁM*V,ņŒÇ Fºé4âƒRLj¯ÍÂRñ¹Þ!k‡tu‘Ô–\7Ò8’ÕbÊT[å.©Ê¸©eåÝ1åy©Ã|;[æ5£}vIÔ-A÷}`ÿ¼OrÿçÎc÷}Óµw ågíýwËÇëäÃÀ?ÿÅÿâo}üõœì/é¯Qÿ øAÿi ö/ú»ì7ç;¾)Î?_&¯ò+ùúç'­ªà’€aë¸]€òMšÖnÓÕ‹dÉI•§ýš×uÅgŽkõgJØ–ûß~IÆ9Üôú¤ PR"ëÍo/ øúf§ˆÊ•_j¤? úHsÍ‚WÂ&ªk°@Gú…“0Ü‘hT‚âkKå*¨®H ö’Ñ/f¤Ð>©¼æÔ°ÉÊŽ)¸å\j€'‰ößÙžóïîï;>ØÁö¿ùß|þ½‡G?hé®üRcį¨8¯ø…-’‡ T×ÚGBïLö˜=¡Wb/¶ß¥ÅTŸë¿-’4ÈH‹iK5&Gþ‡í¶ ûÆÝik»‹¨Ýý}Ç{L«WÑÙñ]‹S*ôhŽ#‹ch|QÐB‹Ô+´^ã¥Eu §Éò‡×â\ÒÂì—‘+ ÍCüúq àLJçÐ$/œI ‰¤H=¢9EÇè ±D¨K΢wÏ'=AwÆsže8FGVòsZÁ&äk+Û4ƒÒò‡—7Ãð´LÇôÂù˜äó$ÿŒÓ¾¤‰sY †Ù±¾–dÿO ü—$óKd€eòš+^{†TÇP=2 y/z+ºõÛ®l/…¼³yçJ,?£ïíõ¡Ú‹~ö$Ný»>òkÝ #;ý«›Èý÷´sáv¯Ä{‘M‹V©»¡ªfƒ‰Ž€R¡ Ð;¨¢R÷–Ë™Aƒ8nG.ɨ#TªT8\j™ç¨j'IÚ_hÜÙ_‚4eÔæV”¿p.‚ó²3¥©êαÝW•Ä2–­‘氘ɨS3ÈQâ»_åõæâ(¼O“]Â[ŸæK¥©`¾4¢nh ð¯¼$™rpQp}’,W‹25Ò¤ÉeŒJviß)[Ûœ²Â0A#£²…G8©ÚÚAÆ:?E*S ÈQÐB: (·;íàY”Z€ÿ! ? $iº3WäÆuäÊW^VÄ¡Fª5„% ½"ƒ~Ä'ß–L{·.œ§C9F$$1e_^ ß=ðÝ?–=Ì©0²‹Éþ 2±f"$Y› Á }- '7Œ46Ü£WK#Dgm¬wØ|1 JÀªG¥Öæz `©dE"'‘xûRß .ßGâV ‚Ã\"‘92™ÌÔvÇ¿÷XwH2]O@DqnèNÓçª ðÓwn+ÛÛí·9O°ò¬°øÏïÙyÿ~ðûµó÷ñxп܇=ë´KjõWþc#8¦ÅiÞ·èû÷ÉþÛT|Šö/I×çÿýB/z9­¡l™–öe’ú7rÛè@þí~wº“´ZÜÞJV`$ä÷e°+ÀxgAØÜ/Áý© ¦g0Fþ—¯Êù+ìñö¢€ÿ›»ƒžþ°åä‹ "¨oŒUÚhkÝŠQ©2a!ª!)V¨ª7I XJå8¸” –ÉŸ•ü*6¨Ø) ¿äÀ°GÉM"ûaöN}.ðõ>ÖŸu°ƒìyÙ“´¾òœ<øf@U”Z˜i[3‰Ô5űǺ®ƒ= »ìƒÛýïm¸ÿÚ†ÏýK'ÄAY½Ó3»e9Í»{ú†7ðÿ4R_3üðHq3džeÄÏÅ@ÿœ£|”úW A¦ü5lçoÖóÛ½å΀õX f_3: lOÅnüÚpöãŽÍ7ú³@w?â*ØÜˆ²¾3à‹Ø­²|y·½{@S™`QÐYÊ<±B¥¢~ÒóùvÛ \Ünv'}mw÷Wv°Ka¾ß~¢*~ÐrúFÇÉ/6 ËÀ°ŠF";‹ 눟;èN¡µ…Rè”ØZº©$©ÉhbDk"¨ÉúD,ë“üne™È8Ö”m`Ü÷[ø“žl ”ýùJgò»óúÈòì5d=à{‹Sr2ÇÕ×ñ³›Ð\ÅÍŽÁUÉ9Ø¡a‰T¡ºêCÐ`ÎÌÑv@fïAý9D¿zµGë»à;¤["½EZÙsI)2òml6'=Éà ¨I¶[بŒòí*9Ú:¢NW:f’}ËÓB6’Ô&wÉ18Eñ§¹lŽþ˜\§ÇÍ!‰øãÈT Ågü™>yglμùý˱dŸ•^Ò¯ÀyG o­ö³zÚöo~ù?ŤýASï]ð”ýÏJE“‘Ö\%è¿W탬¬–ùô’L=¾à¦m:&¾ïÖõò:±ùyN © HúmY‘ˆ`©2á`Ò (Uì*-Â?Ší@ö²þÑÿåš²H† ¥ü¿ì^í`±ËŽd[¿7è»ÿç2üô=‹ŸùóÇ^¥_E«’ƒX¢FÍÑû1­höU©¯˜*d’ù×-ŸQ§(ÿBñõœÿ7û¶ ?ðÞ?.v]ö4›ÕÁv°cOÒúòàRF÷ç¿LP àÏe0Eýg@©PÏÀ.ûà¶|»gsoàåîU›Èâ3W Ã&2lÃT•a +5 gV fèWOQþes ЦÁoKÎ&L[ùšËÎ2’yw›@†s g.ÛmF%0sÜ>–]‰ñË`§?èX¾Õóöÿ|ÊÑgk4X{ФTF ’±ŽÇ``ÅVú‹X´1‚_Ï§ÃØS×/ów÷ö©±7þî~ãןª™Õ;=ë÷T•îÁ@wNþÈ$ý5(í½°±6a€h黇h©/È’hŠÔ QñjmF1Æy«÷™ YïS­ÍHg¤±äÜøQ,œvÛÔ²£÷Û¼ñÛà~BÔ·¿ÁÍ+`ŸÝB¯¼‚½Œ›Ý7ljO7Üd îñ3ÜÒÐ.¢!àºD_AâM¨ˆoˆNøSÔ/'06»ÅbZ-&M&0g²àz1§Ÿy6JƈnMN»\rö¨ý☘ê!“]H¡,YØÙyŸ-á•Ï‘ °Ö—‹d:÷c+ä:•¯ŸQÅOÒ.ý³€ÂxÌöWÍ¿Í8ú8Žè=·0Ö-Ù>m’bV¨i­©<¸*ÿÉm/'ˆ àfˆžZûÕˆ’z™Tà|r"F\ 6HŽU!$G¡!¼ùÁåõЈè¦ÃOî7ý½ÅÀw®u/ ûµeà‡ïl®:ªM¤Z+u«ôPwJ݃ÄHÓÛÏVýƒhÚ„IJ¼‰’|ÃVyg#óÆ1w9¨à{‹øô•rä\¢® •L*w&žœ*8nn|©ó ÊåŒüßµSö‹Áê˪ñ¬2p¸í•åFÇŒ)m¯4•0k2h9_/ÀŸ¢ÿG»…“{ðƒÛÂÆÆ¡¨ 5D/ ƒ–ÝÂ>ÍÙ»Úª¨þ1mÕ^óNÕ2¥¨¢ÕsËY®Ú+l¢rº6_*«³AUóç¸:Í£0Üô/ÿl—øø·¾üŸ%¦(ÿ'ÿK€mà_‹ç·« çûÁ*[¦Š<ÇŸ’”¾M„ÑÁ¥`h«ö¼ªHI-`+ÁØgx<¿*£ÊÀTzèÿLHÿ»Ç%`J‡³SÆD8ØÛeÇGJ[þ¸‹ýi_ù+׫¸Q†³Èü³ÞTZ•1r«¸.6 õäÏJòþ;óeI aÃèÃ2«ËS¹·éÈVÀdö~á½~¬¼ÿ¸/•›Ï.6²ëH8ØÁö,í"osùzÙ:K@Žâ¯vÎ)#¥êt\cÑÿ¾x¯ÃÛ•E<ã@„e$t©„a­„MÄÕBX+¡³}“R¤–‰$“%ÿ÷öbÆcØn'ù¸ÜîîìçÂÞùÝ%ëw¯<¿!ýìGwþÉšÙ ‡«„ßoÁ™wõ“ÁÀAocÆ°Šø™ylDZeh Ü7E€œF´·J’*€(&—Ö+xöƒüûH3¤ã²}°gÿqe×Þÿ‡ ><€ÀAu…8»Õ+øêe¤Jrè.i;ǯ " ZJ&CÄ%$ljC¥Fª9ÈܤƒNß]IEãCÉ‘ûÑr´kÎËÕ@ØŒÉú„½JDà."ãëjúªãC‰yQ | Š8MvæL"$Dǘó°*Lš°éþ²c(ÂôA>]+"Î?Õ‘`_:€'5U’‡€[ ΀ïΟ»5=Ê Ðû‹¯»û‰øéÇ[Ë×|J÷zî*i<Â¥ú–‰$U„ÚY´¦ì>ÇGX£nÓøµ=håH£ìú‹«·N‘«j“ÉM„‡Š®ÀÎëBŠ¿}7þx+¥Ø·òÿo1ðí[í‡~ß'a·†È_}Å?ú©Çì=˜o”®qTÁòž÷Þr2ûèF™æJap‚GS”¾35 dÑŽÖЧ:sµvÌ+ûùû†ŽfÂÉÌ"œÁú…Ì穽å@7°&I­'3ç<Ÿ€ÏmŒq|¬ÏÑDJ²®7¢ú‰T·úN ©Ìí¾é ðo*¸r”R¦$7z?(«V  È’¬×g@¶/wŽSï¨BäÕÞAy§¸MJ7mî"H°¾H¢N’ÿÀ,m˨ÿñ_ePý«1¨™ÈD¡í@בjµcc”8GµãxnAM%Ô‰€7À[=¯+˜×¦ àÈ î!¶¨&ù,â[Ž#î3_Áý °Xôÿ@û?FzgéÑ6÷‰'?EeŽHƒøSTïÀ°šæn¤¾·ü±˜ìYž#ûâô5óØ­@ˆh äV„Kiê óQ푇?ýz"÷n ­BÓ*Åya•ú`U!ˆµ íÕˆ4QÀÕ#\s…¾{Dx¸‚µ‘W=€ÒÉ*c˜9œAGxñ‡ôÍÛø> Kðƒ©8ìó²ÒK©sÜ8\Nk$ûÈ4™ pùIdïüìæN¤=; ?䆳/‚¿þ-úÿɤþwÿýÿÛòþã}í‘ößúç²ßúÖ÷±ŸÓÓ°ßþêžÀ|«‘qDò2ÀŸAþìß:6•+ʨÿ­yhê÷¶f¦ã3ºÀŠy4LˤòM’ÚÔ6€?bõ?¦‰ùThd‚|ãÖæ]v=-ö\¯ [ãØO‹{Ý%¤³÷M/°=qú[࿌m?ïçÝû·þp—®½_F{‘Àÿ³u±?‹òò?$ÐÞTn†¥é£Ö ‘¶üàâ /!)¡©"¨®&•Ë*§ÈÃ\â ´') (þDЀ)à” Ê¥¯·ç\P‹*0Q,»wIcßPìŸkãåâ¶<>ØÁö<ìq-.ü¥C4¦ã¾8ί Sôþ«Ë²à)Ùü¶çÏýÎçŸ+óamùvÏý?\S_w¬ßëYßÐ!Úl ­åþ ë$Ý<³üäù/ç.7©ÝÊ[ž#s4?…¼ Á&Ú¦Á'LšF¸4G ƌۈv-{.0N/Ø?ØG¶_?Dÿ´÷nüé9³Û&%ì}¶Ìjžr›wÑ¢;›è¹J‰3c† à*?‚™hšÔõ©íŒ©4@cÎu.S€ Ø {˜†„ƒý\Ûç_ÿkÏG»tùvÏ£´\ýÅP6X@ÿ(âæ‚8èWÔÕ7*†e$¥ºâLa>JJD”¼’{ ‹øÑ!©tW PN’Ñšó¢¥{Ñ<Hql§ì]åמµ­þöMd!Èûo}‚›ê™ÍqÍÔÝÄ×7‘ê¸#&õ&?­qâܬCã +ˆ±ïÖP=$T×h¹bwÖgF¢ÔM‘nN“´z0ªrq.¢•"B­ÐHâ’ ŠÃY:q–†¡ÒŸé)b$hJ#À$NS_òÃßÉô˜<2‚^2nG€ AVÇ=$¤XàêÞA{ÞrÝœ™ña@;™D˜¢sç*nŠJü¸¶–5í–û|ýÝ3aÊó©bëyÀ‡#ì8ÇÂt­‰s¡ãoiÚÖFìquº qÑ·CÔ¨-šT„HÏU"Ä¡CµGC@CD‚#GÀ­ÛÈ•/ÂúgèÞF7‚Ƭðä_íIL§j>1rý}Rçß·nnøîQxº7öŒìVü…UËÿt†#ǯ6½A9« üw¡š 4*„Ji¢Eêæ@…ÃG¨Eˆ2£50¨Z·à( ^Y‰Øý³JÐÖAèC"©EFÍ„£F×CSwU€4L ì‘ëg" ¤·ÚùP9;éŠkä÷Œîî§údð?gC1Rîvú †¤†Þ ÞÅ”í$Õc7åVuw4éRŠ‚bu•ʃsDŒ¨}GÖ ¢õ¢Ç€Ò>‚oW+tëP¢oZ1'»RõÈû~ñ´GÛ`â–;cñ8|åŽ<“BHd…8&’ÿJëø.—×—ó"X+ÕaX¤”QzgŠ1êdL “ü¾²ÿz€Uj?ÕL©W©«Ûxç «%Ò…ÔnbZ¦QˆIò¿.æ*)j}ízßqâû¢¡ç`/´½ó»gÏ…pö㎯µÁÆ»°Qª‡«ah,°±òúŠÃÏ"®qTWíÔRe,\S 6à Æ$ÑL6f$GìXòTƉ‹4ñ5-¤XBùÊ}lû¨ö…ï¯#íõŠªšQׄÎ2K) µà‚W“ý÷ B=(уqÚ#´ôqM¥B…^•8¼j‘þbmÄÆ™)Ñi#BˆŽ¦·Ô4w€Ú)µÔ*ÔÑYŠoäÒJ ©Lu&§ð©íx·í_ùôûÙ»7m_AŒÓ½ï*ä¨~[/%pŸiŸq_Ù¸¿'â,&°¿,ã± ÿe‰ôøw¾ö_$.Z?ïSü™´¿S €I O*ÇãÇÿ#Y:ÛîñTnÿ˹2)ËuÚ%ÝsI— {–Yå¥Ù®h¹,©ŒÀzžï§Ïqkõc›Ö~ã<~œxßã‰'øÅzhëÿ-ðŸ¢l"ìUHÑÿ²«löé´½UðÕoóÿÉg^ŒÎXý¤×¿>s1@ hÿ(ª?ã3:D<8/TsÁy‡›‹Ä^Mä®6¿Ví߈è D/âU J}Y‚:‹ô7’©ŒD€ìÃÚʼ‘ã{ _±xàºÓ4çÛzо®ƒì`OÍv]jy›ÿ mtª¢{Æöì?+k@koŽLs† ÞyÄÕD7Çûc~sµˆ5s‚´6àIersD š!¾ç!:´Ðž¢nk#º °íÚØË^phq&~h@8Q´Vdád¿ ÍUD6Èê=tµ$véÌù"µÀLìÖ½ Ñ%N¡0`©¢m‰b€…0LÄÔ˜jó,øà¢Ezd'‚¤üá:(9²M{ݤ2Só`í­?ŒûÁ;Ô_µ ‰w¦LúY"î*¸/~žß[L¸;€Ô¦ûüa-;ßÊÛë¯NÇåk­È²Ó¯kqqÙîï³goä‘ ²0þFù^·ÿHÑ–º=Ö¨)wøA‘ @‡Æ5Ê#«óÈ"5–ä8”´Ïñ¢ýô$„¤Š“êVwŸï@ÿ>Ú‡4Q,îÏcÙB¶v,ƒÿCO <³Hõn°èô*nƒRMâÙ©ºsÝ»>òí›í #»~ å7êð“^ªð›•ÈúX I¬?éëÓªhŽÙÌé­¢eû¨"¸ ´~Zu:U¼ Uœª.uO–"Z¨SÎú™‡J¬oqf3ÁÍìÙ×^hTÞ%p&üP9r&2c¤¿ÉSYù'éœÔÏÓD’ÞŸLÍÖ%~Qåáx.œ,„¦Nĵ}#XŸ›CJ êÿ>žë÷¸Ìæ€M­ôˆ®œi“#ªê”*¦NyƃÒWV¯\4®WX;{OÎŽã`$ÁTÈX÷Ç´)…12oÛý`¹ÌB EáF8]ÂzcõòÊ® ê-†Iíjï¨ü`'ù³ˆüоU,‚ÿ‘'þø>rïwa}Й3’btèëWN;ì/pÐ ´‚ ti½“²QD¼C®Ý†ºAÞy eH¬‹ä=/]Ûj‘ÿ!": u„£€œDd&|µªŸÎ3ùÛ?³@ÎZ>Û_ã×~ù«üìþ›ø{oã7¼£ŠÎ2BUP/®V#©„ˆ×€îãÝ)RîÈÆS98gQ‘1ÍŒ3“j‹Oíǧ|æ^H)c2 ŸSǤqIŒä£Ñ2±‹XZ닉f8¯óÌÚ×G´¿õ2!¸sÓ ôOÇ2–çã‘À~࿦9òD (åÿ‹ÉrþÊ%`—H.n› ö—ÿ§½ —;/H~¾EJÄÖ:[$Fà\*ÀÄ×ÝõIü· 4ÍÍcz¯æVÊVŽ—¼Ý"Ø÷•ñ¹^Dx¬Éø_qw¹=ï‚ÿSTÿéŸþ=e|*žèÉ¿hàÿúÝ>Þý×zíO5RÍ=Ä@sÃKµpôË x¡¹îéO£M3äÖÞ]e}œ›‰°”8 :ˆ¥wMx6ÏI¸G –R\’·ù//³“?E%½wç;”}Ñ9;øyv°Ëd»Þ¸¸óZ^N–’ÿÕÎûJùÙ9'ïç¿FwPø8ö¢€ÿ¯ÿ·÷ñsáÊ/×§`Ä &U¿hA’œìœ¬"2S˜)Ò;Œà#räàêmdöU„¨nPÿG oळ[…¹GŽ i’Ê¢ºQEB€¡G»º€vÑ¢å5õs*IÃZM= F4ª ¢Ó·Î —³ß9Ú ´Ñ¢þsµçd¹ß|­älœò å÷è~`8›ŠCï÷Ä|×êÖƒUššG‰j‡\}Åʪ×I@?ø3vmô¸U3WhÝ9.6[ï=÷=Š÷eÇ×è°K×Ýë¾øÞGÉî¥Áæ{šT9«¾n0Åm;èB=3‡¸„¨N:£œC쉺!Æû¸pÝ<@7gè¦C[µ:zÑŸý1ñÁÐu‹¾!2É‹ŽÏâ ÅÀÔ!@ŒÉn@¿Ò öšÏ"ùVr´¯Ë¾Ê ,¾ë#ãö†{Õ‹1Þ"òëõ‚×ÞTf'3>{å?[sß?į;ªA鋼tÁ" ¤|ãj©ónÌîà˃®˜¿··gxT[ä¾DƒÜ8*±ëTÎÀý äW2E4à¾3…AÑÀE“%Ï'.ó¤VFÕ]—8š MåÒ÷µˆo¿BÔ1úÛ ¬:¥M²õuejÎÁ]÷bÔÅça¿uZó?t=÷îDæ+8ò6|VƒR<¸(¸¨øh˜rîZ¤±‹Œ’þ9ÅÅ´Íz‹B%î[™‘’riKzÿÌ óÆYÖœ¤ö5¯…Y-´<ô‘UmiNÂ+×+æ Ôæ¤È«7Þ?§¨DÝ4}!çÐàa­ÐC<)`1øh/–FÄÈQ “ÉIͬèÃ~ô]ÔƒÞÛXHy‰qhàN‰#*6"Rä8"7"r£Æƒ\ã+gkþXÛgûÜ~Žíÿ:Vî¯asõ”·ßýên pu,ú‘”Z£?DšATª4A Cd~O™‡@/ÐôÂL#}¥TƒPcIEŽú"F¸©EFf"ÌiÀG•Ïp*sï˜{c’5ŽÆ ]PK P¨bÄ\ñÆ~Y§qEó£ù”)’˜©žW×x’s>Ú¸uzº`µš÷¬[{6›^N‘ø%9àƒÀý)²ÿ¢ˆÿ–ù¿0Ú¿˜òþ«— øÿ÷¾þ-€s= ´Ÿ@&`?ý3ÛV °¿X–îÿUË÷3îèµl¾_™ž÷X?Ò:ÀH’y¶H0̓í-SýÍp½]³\nÈö}ÊøßÖR¥$‰ ZÜçô)ççöûúe‰loÿ¹­g@7Ú¿þ B@Ú?ض½hà?À¼n/Wuuädó^¯›÷Å#ÝàÝý`í4¨„ÖêÙ°VQBgeâ`X*Zk)¡MœPømÍŒý½ìOËñÑÇUú¼ØYú?ÉþÁv°Ë`k•åàUþ{nò’&o 5ÛHjÞz  ¿(“´õ>º½à?ÀÙ›¯üæóÛžÍݼrõjCXFú¥åjÖ6:þÚhd€N =„Ö›æ¦ÓȉEŽÑžRDwÊæìæ¶Ia)[Ý.h [ƒÝxÌcŽöÔm~ûr×ïçeÃ2âá­¿ʯÏiïÚúŠcXZ ©%¥W[»°H~«ÿ1hR¿ØòU÷›[“¿b\ëívù»ûûÔÙƒï·ÜÿÞæ©«v¼ÿû+Î~Òãjáì‡-ac‹œüÃJ¯ +MjB8›@þÐ)±Ãÿþx#¡ÅÞÆq }BŽþ3âX°¢÷¦ÆØ+>;û¯>‹€\S¸^ᮞ U Ò#íÒr“ hÆòc€Ñy¾mÓwÙnÜÙõáÄäNcûI9-× Úv¢bá…s……âŽNæÈÉ R5@‡ ÷Á¸rïn"á*q8&T/£Í[¸Øš££òèñ9:Aæ ð­bU!v0´°Y¡Ý¿éÐ>XJ‡J“Œ2¹HaÖ…¨V¨WibÔGS è±KžÒÎÜI-æXCË¢ xÇ–ãGÆG¸% p¡9Àyt aÝY= nÿs4Jîµèþ! èà uAD˜ǵ}~A(<¤ûÏß’!;»×eËáVdOÛ¸?¹ïÁ—íoc¹ñ­ù9Ç䬎éæ;‹NÕÕëûH£¨ëZ`Id…rX>ÝzKÔ3||@ܼ«»°>ƒugZÛ!åƒn…¸RÐ5Ú ´*•)6d?ã‡p=åô=4Žˆ‚2«…ym¨òÛOoŠ(Ÿ€[Uå®üG·Ûü×À¿=ƒðÌêšÅ²!n„• M+TËj­ø øV¨çÆçµ&°_¡=k±î<=:†bG3ÇIm¹Ðƒ Ë>R©ã¨vÌ+Æ<Ë9R?¯€†éeð(FûúAY®­½yâ©+b¶ÞŸÀ™Ë¥y‘åæ5‘RR³ª+a&Ђs·3DÅG¯îŸEœÙsº²®YtøëÍ‹¡Dñ¬íæ ü/¯ŸqçeÁ_óô'ÊioŠ=}$(n°ˆ„LÚ?†Iî?F«W=6Ä¡wŒ2äYœÆÀIMå–*£BtJ…¡ªfƒ£è{èz#Ü8öÌÒ˜î+hf0l”!$بB7(C0yY/àc¹ýŸ‰Åþ9€i¿˜_³þOŸ¹µ6(ï«øÿ¼íÄªç °e¯ìÒç—Ýq:ÇæÍ:]jœOÙ ©>”Ë%-ïŰ M ƒ|Δ  Ld{R|×m’ÀôÏíIyÞÿ®þ%µ{‡Éÿ*S|`Óœßö/øÿ³ÿýl£Aýâ•JÖï ¡½¨¯87,•ah®9B«ºä»¨ÀUHì­Ú‰7¬Ä×"±çÍÿ%‰Cš÷(àÅ”‡i:3¶\ ¿–jj&=£òÆ¸ææ ~Œƒì`/šƒèØ3øâõ ÐßU ÈîØüçkн`/ øÿýo½Oh•¿Öðè ÝýHu,@×FÖ׎Úq©b` ¥ÎrŸÏß&3ŠÐ÷VË(è]9ÿË øïÚ8hO‰:ªŸ7µ©!„h@±bòÿQaHê/"Ðõ¦^ᣩáÿ¹>àS?V?»-„4ÌO•>*U-T½RwjÂ4þöÞìÇ–ëJóû­½#â ™wàå$Jb—J*Õ U¹»«`7\° X6lÀp¿w†ÿƒê‚ÿÁOFÃ5´áö[ÛÜ ¿ìÃÐC¶k‚»ªÔªIK"ERœî”™çœöZ~X{GÄ9™yIJ¤xS<‹Ìsœ8qö¸¾o}+¥\®¼VçÞ]unúK3[äÿ“dÅŒ¯%BƒUpe€h^~1X†@-™7MXVBSe9óËÚÕªìâ\àͽ×=-Ï,Ô>º:ÛO™oÏû2‘,)(¼b³¨g›®IóûÈþ½E#Ss?%ø÷2   ªd[¸AþœÀEê8“SBCAÖŸ%Æ/€Õ$¹àbÇÿÓ?þñßѧÔG8[Ú…ðê69yf)T=Ôb 5TÔæëõàÊCS’Q©Q©×‘Jˆ:¡Æ„ Ëˬ¬!^¾"žg¹’ @Zöæ¸$sbYé/dôœ†B¢ÉK “ºÊ<¥ÆÓ·Ø|é °€'Õ…ÜIŠwʼóœ¾Á¡WÊÌ‹IŸ<’ÜÌ‹caÝ8È6$ã|k,½X3 P×Npq¶ ÔúÃõÀïÞ(ð_ù*‰W^K,ïVÔ}¢N•ƒœa@Ò@Ô€±ê! [„¨BT#˜K/-ƒ)QXI–þ'Ï6 züž6B%þDØaÔ‹è2ÍÝ›^))F0ãÖ"P¨þ™dgò²!)ý`—~ã›hó4UV™Põ(ïÒ¬~€³­e x~mjáÙ[em<¼PšJXÔðÆ­cô±Ï÷׎'ËM&+F¨v ƒÑ‰ƒ’ b,kŽüWÉJòõ%ÿ j\𼆠œ–%%†@UÀ‘Qò_•/Œ­ë:pR u儾e%„% kG©ùý–•pkµŸëûc%Æ>lÚžÆdûý‡eå 2`BÈ(¾ ÞY»œÃ†zD–&²À^ÞèüÒ£¾Äì8®‚06>Rú;ÿ8É}†§£!§®9Gí ‘ë/xnøTEt~äV‹°ÜAªaqa¬6F» T41Ôâ©6n¨Š²F ^¢ºªL$×§\Ç<¡©—ýR§¢Ì·'€‘¨'E1À‰dø‡R|„Œ©©’€¨eÀßFð_($2˜‹Y9.דϊ•ºy8´‡-#øùáíÑ£.6ï¼1u«áÈçè_Àýëßv•š| _Ÿ†·Ó8ôƒÿð´ÿ¿s°gþð–Wm>ïAü#àŠèÿ9A`|ÿVîöDðßæÏñ¡­d¯?@™ í›L÷›7–sÀÿ’ÀØwh;XžØ8âº_^`*&ci»ê‘.‘JÛ?ß#)H&@ŠüŸ¶Ã\ ÿ…|Þ§ÄžXØ øÿ´c$‡öÞŸnÛ{¿²ŒÕ‰ÈæÍ!uTªµHû épn’ë è†ZhDF_îÀè×ÎÕ‚öÐwꪽ‰vê=h¯>N xšÄ<Å) ñ©M~_&ñïyU™µ™'Láv´£=•v•;¯tcô>“ôÿ<=Àü¥Å˜¯Ï¯?*|»)àÿö­¿üÝ÷°y¨\¼Ú!ÂR8ûÛF.rþ%³õaÌËœAÊQâ?fÑÉ¥XŽ Žq À¹ÔA]×Yí©²»_]|ÒðTØö­³ïõ<ÿo­@2“óN Z;qFÐÎÓf„PRgY¶ÜëŽ&ÜrÀß'ĺ+`)—£ýg¹ ™Ÿ×F5—¾ª~ëÚ§Ê^ùùêo=÷cÝãÁ7wœ}¿åçþó»täRŸ/˃GuE K6bRÎqf³ý{ç$¦>¥Ì²<š]³Ô\/ÈuCKݘՙëRÌ\Åœ¾D*¸jù!L‚¦¤hnAõ1ÜjØô4Þ{„¥è9ÄÇ §ÖRkyæg–¿h zNJ‘ôëÏ¡ou0ÏU?¹ í– IDATFÆe†Jvnçá¡t8Õ£ÔWwÕs„xÇ–ö")>‹l^‡Ý_aý)²m‘îÌ4õšXÝAWÏûw«ŸGâ „c 뉲B¥Æ$€&‚ö`&É *œ2¿@¤©!F, Ò€4Kˆ ˆµƒ¹!¢i‹´[¤3¨Azu'ÿ!þ/;â¯ÞKŒ’¥ÉU¤î‘[ÑñíM†zßkæ)Šç*•mÍþ#ÍQŒ8K?sÈ„j˜,U÷üf\CfŸ#å:$Ë_¯o)›6-™mç^ 鬬î1¸ƒmœIH˜MŠ´f‰F•, fûèøÌ7v0Wf™euôîAV‹èÆ”‡Ø­„óz"°Cê ‹•¿3lHh;@7  At…éK•«>hþÜ\¶gsšýê[v_ZßwÖiþéJTRÛC?(‹Z8Y Û¶­Ñ~übWŽy„`•y|2ð{7üø…`üåëÆù&ç>O qëQƒS"$å“Cð¿h6V‹ —ž¯4ƒ 2@¨q‰ó¡ÏÕH<º_òzÄ#×â¹ÏÁÛ ®£ç¹o*—°o*a½VGµ‹øücYC«FX/~:À»I–6ÏòÅH*¤L0ƒMkœo•ÓUn÷p~Ózé —eIl€w‚]ýAŸB{~^~'ò¯n'>'Ryw7ŒÑƘQ{WëÉ!K•ã`b%GÐÑ<¹–I~¼lG¼ìƼ¯DÇ ˆeÀ2+ã¬+ã¢6ª ÔÑϯ+aQ u$+‘údDqòLÍöÇjóèüC‡t)˜å<³ËÍnñjç&¿€„2ë×Ì‚o«e5‹ (eIè2Å Eè2f†Œs ‘`ÞoDÁ¢÷u¥ÿI°Ík¤ZVÈVùrzºý»÷„&Oà_ì2ðsù P?Ûuf¹n/ò¿\a\ÞçLŸyÕöGâÜñu>‡˜HóíÒJO娫_.´2§”óÒ+"؈]”A¹é4_ÊimÄ̉]ùv~|ºû•„K&{«s ~øG2Ñ1Âÿ²ì!DBþÃHøØ{Ýa7üo¦„PÝû{Ë!½dÕ°s%×P#i§98R‘Z$µ“âehdKÑ^¥¬Ûl¿ sÈ~-²LF°&Ù÷+#à0¸rîÇ’Ùk>»–0·ã”àhG{lüϽVoÂ윹7«€ÿ‡€²½úÏŽ Ôn ø.WþÅ߸ËúsUŽÌ\ç(ÍÒ()4ÚO@L:r¼³²éÚ,Q>E}æåÐÉÒæ#pS:ºÃ¿9h“ö;·à\×Ù}€ÍÑÞßžùå£ü?Àp¡Üù¥†úvv°å Ïî­ä-¨©õÉ9Q£:bÐÄ~I†y WÒ¨äÁàTGöƒc45¨YÏCéó'Ô—ù„üR½9Ö£Ÿ{óç?àâ=›ö¬?W“ZE£?K˜©M¤Ö²ôNsQ"þg ÿXÖÇcì7‚üó2~I=à ˜OŒf˽?ØF ³C’ÍýWÚ¬C2*ü™%ˆ?¸˜bª˜U” K-pŽ,Ò I5!%„PåN°Cm‡¦ˆ¾ƒµ±ÝÖNØ+Ns›»92aò¯—Îl,)ÁБVM/RklÏ ?ƒ]v/-Y#õ,>G¬ŸE∫|}~‘ÁÁü B"!ÍÓ Ì6’ª€È‹'N19<@ÝÂ*!õPcS,.f5[BmXe.ó ª€†ÿžA28ŸA5'!ÜÂßù2&‚¾öm¸Ÿ0 X(à™TÁ¨ fY9 r’—#šæ$JyÌ) úü»›b„œ* ¿›•½Lå—y‰,å³ÐüÀ“ @yBƒ=Æ,ffKÓÑGWPîIž“ü"d¿b¸7}ü$ÑRîæÏ—êìËæ²I0'‚0€^@0…ícÿ -úÇÆ«¨B–¯ööDó´aýk}”œ`9ÍE’ý×Å#òϽ†ÓoQ^qš¥rGv·1œue¼p'PG°Æ‚¶· úû¶ˆ+üÉiâ¿{þfÿ¿…W_…ݪæd',z‚±èŒZ5õ¶©WªÞ=„bòˆÍ “ÿ†Ò̽ƒ‰’ÈE)º+øL”‹$Ä4ÍDC&ÄT"¼»ÉädÌó\iV(€Íf?’³8ÀRrùÿw·ðH{2Ηº\wJÑ¡8€%¡÷žýÏþ|TN†È\±ºòí(>ä^GX5^N‡äùâÿp}”ÿ¸7¯sË/ r;ð.ƒ¡· ôF B|ÝÍQÍË£zHÂH|Q¤¬Ìñç*ƒ`9˜™€BÐ{¯7å1·ý|åÑ–<ú¸ÞÉZWibÎežÏ¯¶“D¹Ÿ'c¹“E`?:ùÇ,·{óˆYß0ë$ƒ_SÿåÇDlæ-_?¶Ý¹±,&Áßµ™Ž¤¹²4‘¬ÈãçÁrÞ]‚!¥¿›ÔÔLTžG@Ý R%$}â ëNyöV 7«9ª¬ÿÝ;á¥eEÝ*“²n"•}2ÊõÅÄU3ñô•ø+I!Údò•~Á·k™È4¹(ýû`~`’(_U²l^7.µñÞï‡àC{;¨Kö¾¤Uoƒ“*ô ºÜƬÉÄƨÏ0S’ú }Í_ûeT%ŸÏŒèé¶§²q°}è_Î;$|àÿòúdÿðwþ‡÷ý^O§Ùôïø½f˜1ŠßÛÃÉK…À<ò65›À›Ýõãÿ§;^MÈûó6‡Ê¹-ž ¬'òÀì¼iU(“/™}ûT:ƒùdüŒÙöÁW~ÿ:![Ó¼«ÌËXyô?û²ÿÓ²üÍ•üاÝ~õë/Þ8ðàÝ?Úì¶ïQ"²{;iûhð {˜ z<Àpž£*Ä$í¬Épáé0% 6˜¥Ö<–#MÚ`2ù²lòã–!Q RƒqÕöÏí£lŽv´£}œvй]»¯ì‡}‰;¸F8ìäö÷ÍÉe]8>˜Ý$ðÿá_îhï¬?WsþýŽþ\‘š)'ùBÐ’»9ç&—*Gÿ·³<åýå?ëÔ㬶L°è¯s'3×J´òÔØ¬Ó›y¯èôF;vnŸˆ=ó+G@÷(ñð[­Oþk¡{”èÎ!¸DëpáaAiçuHêœëé~rɧ֙£¡ñ”ßÖy 2#ðŸY¢OýǺeûuêR½âŠåÑ>5¶{'ñÊÿô/þÆÝ}í£¿iyç6œ¼\³{wàâÕžP RÁù÷²G4BÚ(ý…—’ ŠT’ëÁ”çLÛœç¬ôƒOø‹ÊL¨æe;;ç}Ç|‚t؇Nœ>~äíòybplú„´±îu4žÂp‚Úë^ƒíC´M9Ñøb5RE´VèwÀ ¤˜v;T/úkßÃ6÷±v뉴q¯¨æqÜès—i˜˜¦Ùùn¹-é²{ˆœüMk,¬Áztø!lßÃ.zl#H¯Ø RÕXµÆšgÅ]¨nƒ,†Éû¾6ùŒ¨C?YfÐ5xþíÿíÖÀÿüBÿä†â)³¿¯ü q±Ž,ûÈr¨XiEÇÀb€EJ$k‰ƒ²jqp’ðj’0 ¼1j –SØ$k^ü§ BŒJV!PÏ¢/™ÙD¨bÈ@'Ó2ȸæ×åßlb¦Üæ?µùX½ÙËï«ںRšÊ¯$sr@V¦ˆúà©þv©ïÿŸ À/ Û;â©#*â !çŸex€ ¨ÕÉ/Q§¿`ÞE”Sx˜” s4r%ä¨dÁÿ¢Çœã^öë0ÁèQ&Õ‘UsudrS=˜·ýå‰`ܲÒ'àýLNàMvî˱‘T7zÁÌß·©7Ò&åsçŸåDAü÷¨þ‘a©t¦ÀHôkuÌši¤ó>J/@v ±-2la¹Ž*x?ª=ˆÊÃ5œÝÎÚDTƒ J¼®…1¹ @L>¦ñz•ëC®c5SýªŒ1µŒ÷5™x6«O•81ÀU7lTé(ö"Ây¯œÖ>†v UÛ#8$LÄšK²½þçzRMo )“±‚jÆ ë*ÊHVFrÍì‰uúÁÃSÎÏWþüRÆFÓrzž‰k³ôËx|~ݵjó{ïÉþ{;Ê|}vÍô Ogı«"ÿ/Ù¬í³‘+eäqjùϦwà—FÿOíhùw¾ÅÁÑÖHãö|ÿåOµÆ²*—L—ãpÉgÚø/{å.HQµËï¢Dÿ›9 È áÃG¾üôïØÀ¨`ã–§úíhGû¤ìIÈá±èÏ['\ùÏ|ûéG´?a»Iàÿö­oÿó¼ôƒÒ+ýãD< Öl”¨ð¢­úú¹wf.ÿÏ^¤ÿeùšÜ¡™çäÔ•¬6Ã;¹ygu8‡¿jÉ5ÛGû‰ÚMÌ}Ö=N¬^ˆ…´u@³9 %ua¸ðµH#Ôž Às‰ÉF<}†â)6¦ºÃžtyÁX$d~´0‘hâåâ½–\s…îZpôXï~*ìoœhÀÙ+¯u<ûo.±† BÚ)õ3BX„"uæËÎ'JÚ'»ô†¶^Æ›Ê˽vYõ"+^xŸ"“BLéKrb]˹ÎÌÀvL³¹¼ÁxÏ1Ì å}R{×~”eýÛ_™]ë•6¶jkðà‰wΡ>´Íë°9Ãv™nÖ¢éq–¬€3ÌÖ*wDjKH¬;Ãv±v›ëÊDÑsvŠÎ"p ÌÜRœ%ÌÀZCΚoc§T·À¶ØÅ÷àñÛØ…bÛ½º´ý*¸½fXœÒ4'k9ËqY­Ã£:*߈`Õ©jÄ*ÿ=«nav›(w•“B Deñ8 r!ÉN$Ïõkž»ôÁËÆ‚‚Œ¯Ã4ÀãûÁºsê¬ÃR퀳jŽüWd¶>éÁg€¢1ÂÊ`õi/X]‡lwèÎF¿”%ET°ìÁ5Ä’;°J¢vq%‚½ßmVX8 ÷ÆÞ¿éü\‹2=³xù(øŠ;ØœàJ&Z(cè³J±”½w·W9’Î*L‘þy] †ÁÉA¡ XíŽ3 `Q,å k®â þ>ÀËlqNêÈí”~Ò$+}„=ð|‡‡óéËLkcSqÚç;äHÓ¶76­çû]-|ÛvxÄ¢‹JèS[þé -|r³"«?„ï½¥t§ª‹$*:©è*À"½[¥¦°Â1& säT/·µA£A Q={\ñ!f¢@” ìˆK–»vH™°¬…:@„Blrtg˜£s`T¦ϲÓ°l?:óƒ7O›Ím®#4µp+å{HÎOŸ£MëjãA}ܼ4Nß†ï Æ“@³16=Ôâ`~ÝãýŸeõ 3Tr¤¿z“Y¢÷S° ˜4H%Bý (Åp€ÄÇõâª4å'+àøIx?’¡*HeÔÕ”J ¨_xÖå$ÊJ³ ?zñ+íüûƒþ`T®Éû3ø€ÍÒé8Þcc!J”ï'9ÍŽ¨«/8—-Ís.ó¨ÿœ Œ ãʼn§µxZC‚÷A€ æÚòÙIKiÂÛçüÛ/4ü¿v3Ú†§Íò0•“ÇÆe KJê˜#éëÞˆƒg*C­ˆ«b8qƨÄ×cÝÊ EñÈŒZ„#™øOе äQÿž Bf^Q¯Cïì²…ŒÆ¨P`JavΨÀÔ—ìÝg6¶pipÿ©ùP*%£ë=¥ÇzáýO2c×É ˜÷ö\÷†7òDÀw_ù°’ÇÙ÷:îÿë-'Ÿ¯IF÷È%ÿ¥úÇiŒð'†êÃΣýGVtr¬ÙGQ;#m°©\—r›I1’Ä…ÛhYf:OÆò®sÀs:&vP”'ÿ„ÛYÖ%THe #]T”0Ü'ž#‹èÇúÁC…‡ ‹!Ö"ñ1F‡ Z²dºj}‹ -ÖvÐ&ÿ{ò=Äý¢¢2µȵ×MnJýç»ñ_8/nèÿ[¿ü»êü}W‹íí÷&Ѧ¦›ö )û×]ÿ?i§ç¼¤ª\wúô÷¾ÏŸÔÇÿB˜ï’£ú}^b¢8íFgW”¿ ûSJ›®ŸÀç4{&û+!Ïw®"\MØöŸ!Šf„€÷Edo´][è^úÚ ¿öõÏÜÈ/ßÞRûpˆëÏW1.…åsU¨Öb·¾ Ãy¢;ÄU#Ö•ˆC;•ÔNÁ‘©Ï‘ÿýLárL¡ –Ì.)»ŽëyŒ3Os9ÃNƹöA`å%_W©0ÌöíhG»©v]{Zjz‘²çðà¼ppÍU÷>*<Énø¿y³GãîW— ‰aýb.Ÿ«U Õ†dYºìx ”H}UHž·¼°ÙÒ–=™òí¯ƒL`å\ªüPƦ,gØ•ëC«Piê2î$›$÷Å n|;z$°5É–˜.é²#4{F#Œ$W• Ïœ’ ³Tï]g|ψ0WŠÔŠT ¤LÌf„Ú“S­Ÿ!œ|‰÷f¤ÅCR¨!}ëCgÆÒÿ„ËùšhS¿?²¶òó–SJ䋿}U‰þÏè®`S_”åC¾oé¢%ÊHŒÞk˜Ì0”¢›¢!«[-¸t#‰*BŠH‹ô;¬n ¡s>šï]*|åh?Š]£‹ø°K…ºsâ ±w•¯8øï[¤þóp̹—æu)˜©6–ËÆDzq³ñ_£ UŒÁv´ñ ÄÏä¤™ïƒ ŸÍ’ lö_¹ÞØ»ñ|ñ±±¸ÍVæQýûÏ2ÕEJ^­y-¤³2ç(e%ÏÆ÷Ó Lï®.âÉFLíz ¹çã*M\öë ÁŽv´£ÝH;¤í\uL¶¯:¿LRŠ'¬¬—k—{GáH¸Þ~õë/ÞðàÑ_·„Z6Êöí´Sª“À°Q†­›œ›¹sg¯Ë€¶ÊÐæèÎ|¬äo.À¿Îs–ÏXlsÀ¸<èÔ®ŠXÞ[í©°5üÓn›7–÷"–ŒÝ{‰öA"ÔÐnÚû9Üí˜æhé´3†+h¤×¡PãlÐ"5gƒ*#ÑýO IDATf$ÐÌ…³u= Žv¬?G»Âþö_>â‹ÿèîû²7¾qÎ;°áÎ/4 ç°I [£Z ÃNç“›<áɪÃÈ€Æz/û#»y>Ñ1ý‚Zˆ0Kgá…W Ë›3Iúëp”®D*íR}ø¨ëGªJL̲CÁ˪÷oc ÖZÍÜÙaàÚ¦æÊùšƒ¢2¸£ÜÜÁ1*$‹ñ7\ ›“†:5+꘡FR¬°£"1ÄgÀ Òû¤è¥‚nÀ¢¿³üåöRïàLo® "YÎY¦?s g—{BVsy·…EVM ©ÀTØuÊ¢ ÜZåÜè8˜z3“ügeöAš):óÇÉãü4Ø<ÔŸ•q3°H˜@âo77«¼~\¶4ø­Ý#v?+œ6»P-ŒØ’Œ„8X^‡*yrTËË’Üry.²äׯ£šKžò}ìªôe9Û<š¿'”ˆäËb&ÂIFÀ1ÌT éåP–üºˆþ‰$sòOûçÇ÷ÿ$äô81Ëôçþ)DËÄuâZ°=À³8¾Ã½àCÿeu"È’ u"®ƒ+˜A]C³‚ú6"kÌ©ÐXc¹MÐz 4gHý g -EBZ ÏaÆ?Øpûý¦£¹]c³úÆÕòº ò(ÐëX/„àu,ª+mDõ9nL^¯º¬ ŒñO̦ú‡£¢àÜWðm›ê B´LL2l”ÐxêËÔ:qQÕHÉ ïÓl0‰§¸ê_ ±R|cí]Óz 0®¾²’Ú®ørŒ}üä pòª ˜«üaãöUëG;ÚÑž+ÝÚ9çIŒ°¯CÏ×|{tßÌ–ûc¶_ýú‹7*ŸÍ;´¡½Ÿ8y¹¢»ïRÁqè%ú #. }¨ JX@jÍI Š÷©²| Å9à“w‰ ­G$–Ï€Éç–”²V1ɶ–ŽI÷;/™wZùø¥N¬,?HvìØ>»Iåÿã´ý_½Ã½¿¿ä¥ÿà”æ6HÂÂ¥ÏëÛÑI5­±x¶rࣄFižu"@\(Rûù…t*&y(Í$›€GJkÂÍ>1`.>íX'Ž6³7¿qÎãî•Ç.~З—þ³;¤­ÒïŒX× …(ÖæåN u íCç^Š’æ"m3ᥴStgPå‰S!´†î@j&bYÅØ§HV¡ÑÞûœ=µ™˜]ÔR&GÅæCž«ÊþGX~øÏ~ž>A•åæcz¡ï•(.\‰ÞV—–!'Á@-ù™é`‰Ñ©1>´‘sÛK&PˆçÃÍKÏ3/“EÒ/e”à'%,BÄsñJN½MNv¢W 1ЮE6Èê1)^ÃÒHÛ9¹ äbÄü¡¬Ûbz† [Hª u¦œæ´ïÁVùÒ*“¢«HM­©1"É&§‹å¨d1ò{ôÛNçLñ¬e N‰ %ÜRäÞ ¹óT·°öŒpÿ ôü Q¬ƒÔ@IƒHí…PkB\‘ªÆ# çR,Ñ«€ÜþUó¤ièo¿G¡"Èy»´‰ÞŽ·y|^R6äÁ‘5J¸£„Ï~†ð™Ç=Ù~ŸÀëè;UNŠ«ÈÂÓÏP™*’%”“@°Êï/àêOªŽ¨¨Ž¯ftè ŒbV˜Ä%&³Gê3*âØEÂ^ý¦;FvÚ‡\†1'³är)!—÷LZÑ»íòž$#DEîä1èÃÛuö†g°ßæ¿ïbÆe‡ÜÁö¦fÇ>•Ôÿ¤FeN.¶™·Xþ›Ú'ûð³ÿ÷·wœ/+NFšX± =Á**hêII‰–H±G¥¡J·€êŽ*m‰½Gou¤ÊQÿ1AÕC•ŒhæÿÙÁc  ÁÕ‚äu>c Õ™Ó”Œ~ðߥ‰ÂÉR0ζƭeà¹;2ûÐ,?;üˆÀæ µ©©w÷z½NŽü…âO7'c|û¨À³)ðxgtp„ª‰t}"t†ä”1‘S\äˆÿä€¢à˜µ”é3cÚyœˆRÁeùq<ê¿UbgËÂD^™ƒù8ñ%s)™ûvF>ÜOºØL’ÿÓvIvàJDŒ¿¼ þ%ªjŸWY•¥Óñ6AÕ¢|òç$¸þ;ŠÜxæ‹NÛ¾¶@ªÛîaÃYTÈÚ¨kO5d}ã$Èå ÔK‚ÔáJFZ %Lolpã'n V;#-ÄczH•PµPwFŠJÝûþ!Àb0šÁÉdM9!,Òäý\(^ï–&%{µ K:³1½L<M-B9ê0‘ê@÷r}ƒi½ÔÓqìäÔ§€:z¹„¶÷ˆÿ]§4UÅzX-|ŒUÄ-uNq#BR£Ïq1øx$frféçþõ_üì¥ÈýëÚ‚«ÒŒ»æ÷˜í³ƒ?mÿWÿvÕ‹ºt|_Ò_Tæ±þ¶çôœŸuyõò‡=ùù"ö$øa6Î(P¿·ÿ9uD–ì„LìŸÅþ cš¾ ¼ÏßJÅÒé„™x>]™æ—o_š_f$šR·¯‹èãzȲÿóãaF ïûͯþ6¿û­ßúQßòÓf‡%ooû+¿õœÜTðà½?Ùn†­Öý…Úî½!uï%ê»!öç*i«F%ÒŸ« [•P Ã…JÚy@ä°1´…¾´ƒPO™}1ÚYVo¤ÄDŒÚÙžÒ奠ɹ÷3™oÃ^íih3Žv´£}»Îs=ß_֯녣üϻ꺣À¡}å7Ÿ½qà磿n‰+lµ¶o4ÏFlp _û ÀôV–ÉAæL5ëí@²ÙÆhe˜IæØîË5ï1Óì Œ·'vVÇÎëµ»_]|ÒðTØö­;¿´àÎ/.ؼÖóø»-ÕI 6°͠èB&0¿DI¹óì¼Ò\´DEg%I5ã@êŠÈÿÃzdujoy´£Íì•ñðJÀÙ÷:ο߲~¹a÷(‘Î3è1ú2œ+¡†îÜÉcq©>ñÙ:©eØ(i›YÒ­Ñ?tPþ‚ F¿-9ÑÀ.fÄ–¹ŠÌ‡éOàr]8´«†N?¦½ùÏ~!]ËÚƒwpvᎌu#œÔPÅ@¡1®‹ìG±e5ñ¥x Áz†ƒ§¹,ùo™ ‘s€zNÞ¿HŽHRPÙõè~Ã’ Cfäe/¦EuP…ž¹¥vH:CÎï£ñ”k„XÍ$ÑÀv g¤ôB† ;„•bUzH;GRLA–޲jƒ8Y¢TsT_9E\áàÇ; H i9­{/#·ÿîB÷€dÒw¡Ý!¢ ;,íÀZL+w#YÙÑ6—×,ßPb(’£úa„9ù9Dlñ.œ¿E aƒ¸D/ŒãøLÌdàäg©ê_„PÑŸ¼¬_÷´½ KÁVÀÂÚë£5 FEèlzÒyaƒx #¸ ‚eUŠ"óŸgÅŸæ|qeiÊßѲ\p¨u}»óþlpí_3ƒ4óàÇ`&Ÿ¦ûgÏz.ï·á3_@VKÁðcy·=äwþÏ–¥j0Û>° NÌÕÅu‚é²€šGè=pžâ(ÿ÷³=€1²-ÿ×4°~bÏ÷´Ûg{á‹ç*‰‚PíŒ{m .„*Gùk(Ñü†VÞä•@õIŽ|ŠJöu)|&fܦé¸LÇ#S9ÌIù™”,Jd¿fQüÚÈ?¸š±¬ÃD¸RþèeÞÌÆæ;ïÙ[”ÙÞ'ˆy“Lê †„ üGþi@i"RUH¬(ª4aHž°í‘.¡Â Šê¥AÔþ“ç`è!½Ø께ަ’ Ym°“Ï‚ímý líjC‹„ ’: y>–;¿c€Ù~± ìzágÿÒxá35oö‰paÄäDÀjçi5RpòXÐ\/R!Ïä:3¡WÕLäšQICÈrý¥ÎLྫྷb¸ØŸ÷¥žLuhÚþ Š1ïGþ'…®7vì:Hêòÿ»ηƢ†Ó•ðì-¡Šž"@ v½«ÔœH0âœÆýwxüø„I2-?Ãužº} Øy_YÈûl»Ý$àü¿ìҤѮ<^ÈãŸNj&{WŒ©®þŒ«Ž}îˈÃL  ìÇ"þÏÞ5™Ð+b㕞þKf8?NôtârÄçW)íyÜ™.Rö¥}zªéóe¶ímY­¯€öå¿PRìEøÏIÇÀÿÒ¿þã¯þ¿ó­üã¼öOÊÞ¯Àö•ß|V>ûµÓ;ˆÞ½; ¯þ¯‡ÏþG§‹í»ƒµïAé$é/’OƒZÝ)–Z†6ûkJ@×Õ’{c8WËé.eTuMseä«Ó\΃! ®Šœ·³GìähGûiµÒ¦^W“å`}ÞÝ.ár¾wΑ0³—¾vrm¤äÓjçßëX>9ùB ëÏÖ4ÏDâ2“½GqZg ¡oÇÜb«H´1 S+C2X£q&ëœdìÌ$™cTfnŠoÿÀÇÐí£±g~ù(ÿd~ö?0ø‰@Œî¸/|þ÷Ï÷üÉéÍÿ_Rão ðŒ@CEÅŠ!Fbh¡ÂB„J<_r% ‘ƒl<¢?)‘­B ê• ¨b T5Øz…šî‚x±#¶ÊB*ªý_$˜Qñ6sUnVpº ¬/I](dÜYºdû%¿5a¶^@œOöÕlv˜;û+ŽÝÇÀ½Axû϶¼u¸%¼q6PïŒ&Aua4½pwEw\Pl Þ$V8±¹± ä&S ”J2‹ô¿ïxÌ2ÈHKÿŸ»÷ÒÕ 6¶Áe}# 6­Ž fÈ‘–Ó96’ótðþ½#‡ã.ÂH,,‘ÿÁÁ#þ ‰Pa)ȺÆV+¤Y#õ 5HÌ C‹´X»%lZ´Mît¯pPÉ@v-rö¯0"¢aq‹îP¥<ÖŠÕŸ#„/‘ôûP]À°&„@ Yö [lØB— §G½ £}hÛ ü{g¿»ç´†çá]Uïz£ÏÐ]`ùÅ —œZ£Ô£,õ-ƒý–×sÝ)ÿ…ÚT˜d¯v&‚H<ú.ƒlñ'jãY½œü+¿ûâ3¯‹óæ¿8Í_øí“V—*Ú(¶pÒR°Þ°^È£*²Ë¹wÑ xîé)äz™RX–.r)ûsõ×!²îù{+vR}DýÍøÈè?ØÁ>6¾ÝüÏׯî³ÕK‰¯üî‹Oú2>²~·ã—ÿ›ççâížá"¢®pè/ Ñ)ïxîï »­÷ЉŽ¨Ì}‘-ó0»ù~$¢OŸ×²Ó˜ÖáÒ6®Y¾ný`?s{ÖR`ü´¬»€èÑk »ûÖ Í±Ò=d~ñœ’·QØÓJq²ÈÖÈÒ‰ÂÖñ­Ñ®eÌ©.Źm» è‚)•À0“IÉ8LÒß5Zû u ì&{ë_ž³ygàÞÿ»å[ÿÝ;<÷ë+îüûK†óL:Rt!4ÇQ>%nƒ ZʸÍ- 2YWpÚšŸ•RnsÈ¡U’ËÕÍäE¸f"óaú áúrýS*ë?øÇ¿†tÙ9Ý@7·ÖÎ!5‚Ü9QÚã¯6 ÒxÉM:“Óý Xtš²j ’ »¿ÀO (Ín©D½ï÷¯ÓXÏ‹3âJt2R¼ý^€Y¤\¸Û„™Š—u†œ½Iö¸ø¾Ë°ÙbzÚŒÚmNÈi…Hƒ¹!¶C‡s¼{€oÀî vxcMç îÏ#¼FÀˆã=\Þ?EÒ·"Ñ;–v0<À† èw\(€µkù çÐU"ÀÕq¯S9ŃkŽ÷‚mvÈùÒ-$ÝÅ·÷ñ³â¾ÈJΆðä duïf·ÃÏwpîø.A'¡Ì ZT.9süaƒ§#h ­a‘"·ðv"4ì]ªz0ˆ(¾uì¬Cí{xëD6é#8:BnàÇKhÛ‚F9’ÚâHÖÓ _,åy‘_DzG‡ˆþMƒRq¸ªcË%/”U+4Mg´—"/a™„£•°l`ÿDZo?ß+oeûùNh7Fß9m+,z,Ú^Es(ÛÀ~ ½ð\F`2kà©€Ø_¢ú˶¶Uò¿J™O)¦Tü¯e’©^Ld€ ä¯àäO3޽.5ü’Áa€¢‘š®GŠ$Ž”v”àè˜tò"¾zO/ r‚È •IQ(ë9è’Ñyû=° ¶3h5M¸ º\âë%Þ®IºÀ}}Â7/¡éÚïk¼¿ƒè OK$bÇx³Bš6€µ’¢^8Ì¡>¶m5@~k 70,‘H¯áÎr€{;xdƒX"@%Î@«¥® @ë%C°*9ê›JB)ÕL%Ö´*c«uy‰Q IDAT#Õ¨}¢°‰œîjA¨u‹ª¢!EQCªbÀ>±|T¡‰±iüÈz)œ¬Š²MIÿˆüwrŽc.vÎOCe€“u£ 9‹þô¿~í3ÿ(î´+`ÿì {ûü³üüÞWÿ`ÝK{6='Ÿ5q7?=¯äéàÿ*¸_&$Sdÿõç¨J×îŸýÿtX!‹ûµ%gÿ(g’ø¯ÏR$êT™;Lï`zJ²÷¼|Üå\2ý~½ŠyÔ}ççë¥vÎÈÑSx")¦ÉspŸH 0ÿÓ'ã1ŒËû¿÷ÌÙ£›‰Ùçoý“×Óú•g6zø·»ÝÅ›C>ýng»ûÙú‡™þ4‹4"yk’;C‘õo½K ¢´Þ}ÄL÷¢ Sº×â·ÍEÅuŒög š©€õ‰Í•-g>2˜mg¶~°ƒìódêTŠÓì#8X½”ø­?~g±S;ûAGs¬¿ÞÉñ"ñß9yRÿuyÌYSÈá9­W2€©r­Þà¡ð;8Ö×òTž9‹õºÎ öóÎÕí`O•ÝýêòI_ÂSa›w¾ÿ¿>äö¯,8ûžòàÛ;¼wÒ‘²ýÉø…R¤¢%!€PFµ ßðÍ£¥çƒ>د7PôEo˜‹~”™þÁüõ½Ç[ÿò€íO6ïôWò“]íÝ}¯}ð!ú²Öƒ£µ¼€váXQ|O\ì]H2Dú;‘l>€•ôNàÙY q ‡e!æ•„:$„Á#u€ÄËzSÚ®ª¾ >Tœ$€Æª‚Q¾çj5Ž:¹´[£”+à?’¨Ñÿ—¶R°b>ÔËCF—=r'~H6ãI!ú1´1ô6ÈókX?¯^Æäšô<ÈdY€~ïI²Æ¤þf¾C†rŽ(9‰4kÒ$¬$µ( ÚÀb7:<}Y€¾:F‰ã<Ò ©Œ¥ Àty u°d»nÁÐ:GgÎjÛ•‘†Rßš¨k9 »6"ù»T$ÿ=È8GÝÊî Ä÷!—z`ø?A­‘VÀ\Fçæ–º¥¬o ! Ñ¨GÍ,ê?Uu€J®™©g@(=ʼ—f0äõ¯þË6¾[åþë8?¥(ögçlct´³^†êuµ?ýæ×Æá⣡Øë.lüâ5»¦s}–dþ¡‚þa´/k{€¿3®L~™ù¶ñóïo^äþgÛ&pûfÇg%< ØqÌo¾Ð2‹¨Tñ¼ôŒ"A¯cöùW*ÇÇßÚ{#—XÞ2_ðù¯NÄ€qiâ×õ¼Uª2€R'*sŸkðÿ7~ÿ}q’Ëvúw]ÿÚv²>z½IÛ÷÷ì,_LÒÝ3Pho%éO3Ã…¡+œþÜBÀœa碭”@­PÅ n ä*†iÙ=ƒ,€>ˆeÚ?[ ¬«Hñeì5Ÿ-wÚÁv°ëí†QÙc¿ó¸í씞ýÖüÚW¾þâ3 þßÿ·[–w•‹ìdú‡Í9œeú C9m. +^ÍÈY^r”o iCæ?÷‘×\¬Ê¶ áœ0":0•áJ9Nªs}–k$·Î;³9ØÉlûã–µí`Ÿš=÷ÆAþ {yå?=bù|BÚ»)"üwNÞ-‚h³³PÎè"/”•<ç6ÌòBõ¾É?„øªkìç„âz–è£r?ÁþDõR];ØÁªUð`óÖAÛôqöý?þ ƒÁ¦wðÜíb ælû v½ÓpûXiÇL†ðf,¸VÌî)dÿíoèÿ¡á*røþx."+ I ‚ÿP‘ƒkOQï±¾Ö´€ ‚œƒõí®Z¼|g¸wÐHÚ IK^vÇ-Çü€CI¤ä$NÀÂÀG©üp¤õà;ÜÎp:Ì3j=Þ=„n¬‹A½)¹ôöÒ ÞzÙIÏžCuÚŒž`è“„XFÎïÅA½a P¿“2¦‰gcÙÇQ³›Ä5 ·Pª”kô^¶pñ¼é@ŽÉÝrö&öÁ¾¥¤¨é%l4òÓ‚«"­Ã¢AVGèÑ øñKÈòEXÞ¨I-Q“ôd¶˜>DHà÷-XWÕãDt¦ðIÇ툄¿J \%+ªÐ:©‰؃e@hÍ`•ñçég‹ôŠÜ5ä•‘Õ—ñ®ƒÓÿyøß–ºÐ”(¡,HÒHM‹ûÞŠ§ ¢¡¦ IÇÚ³W¾¯‹úŸoÿ¦¥h|c5ðß?£àÿÏupü[¶·à¹$_d6ÙÑu“ [¥‘•% m-\‹4Š!2 tš;d7Œ)HLÀÕ"u˜`çýYFÅS’§PÜ"rz1z9"ŸíJ´³Rö‹0—9mÞ‹tžçm®RÉ#ªÇtì> ú äЋ¹;}†ûçFRxá–>Q2Âuö~: ž„[ßܱxÉÉÏ)g[ Y„.;Ùƒ„2xiÖSQÀ±²ÿê%•^ö8jÑ%tLòÿµZJL޲]åÈÇu-ËZdþÇõ)Ê?•O|äa¡FTÐ$¥­”ŸNÙ›ýoÜïš‘ç}ýËÐwػ߇‹ C ¡H(K‡»käö«hû2ƒ¿à¿ÞYR3åÇt´¨™Œ®vx¾E ®ƒ><èb‚‰… ͘7͠шôÏ€®âíè´ h"·AÒ+N‰úÞ5æ“[›áÁ1äVè!ý?¤PÍR2a5Í‚«—ú£d)iô2 •SiÂNœÖõàD¶õw#AîYˆ0”Ó.¼ðE1–*!<Ì6Ö½¹"@«2¦ÐØSÓ€"θ¯‚Á¦ªÔc*Q Ê“¹œNα¾^D>Û8}vî+m‚n€£•ðjJœ^ÄübÙÂí£¨×ßø×_ òjMe®¾ïÁ²7ùÕJáÿlEûÿá4ÿšE“ûèH™Áþ3Çä¾BûÛÆí¾î þW™ÿ9`væ›Ì¯¸§éÉÛ#Ä b-eãÇ*Û_Õê÷ýÊ-Ížÿø\ë§Ïü[³B:ƒÞã¼^ÔðÂFžðŒ´3Ò®SIZ•õyöWòÂgüÿ0æ)’_û“gþ&»97'²ßb3ôFÞ*Ë@™v*ëWÂÏ›ý½~Éÿ[U\Ç}CñóÁacúÌ™¯÷Ÿï1€Gø…<MÈÁv°›í:¯íãŽùDöì!ߟ¢ýÆï¿òÌÊw÷3͉’ÖJ H ë/$òÆŽ…£…·™¼Óù;'÷¡ ॗåÒ±uŽe'oöŽî¥°.:1”H©7[5”s¢[çhbÌs#R–ÃWÅÐöÓ÷@oãv ™¼‡çû˜EZ´ïƒ:/[ÜvH×ã}Dí“5@c,S=¼“ÕU¹|Ÿ±îãû‘1¥[,ø¶8®Å{E:/ ¾ ]¼ï<‡ÒæšÄ92Z^w’÷ƒÁΰ‡ »‡Ð4HîñM‡_8\(^IZ <”t4‚¬~¼FŽ_À¿€7/“/ z² D³FM²Á¼)oåò)»a©#yKã-É58>|G“vôiÂL™9Ð@]i\h¼È›—¿&Á %%¥i”e“h“à™dŒ¸LIF€sûõÒç ¼ÿÔ¢—?%“¢B`[çxë…?5×ðÍõìÑ„üÙ/Áö–’:'µ(!ŽQ®S64 ßÃA’<²Ÿ¤’`°ˆRn\b%¾~G¢ïo¤D-S-ˆmZHs©ÿ¹4y]<ä%bÈèì¨Û˜»\DÐFÑã‡Ôè^}>=²Ëž]š7ŒMqRhŽqkðT r€(Ð ¤%.Gd¹…Ê[À (2ÿhôiœ—Ÿ¤gH§H{i‰4›èß Áš>#Öƒt [\{ćxíqÜxÓ”Ü ~ "Í€x‡{¹‹‹âÀøDöKò¾Çœõ¶drH9ºö¶ü)²9¬¦Ôòu¶EX •ÉZWg©‘r«w§•Á/Œõ§)ýG£Sݺœ*£Ö““¥þTëŒ{…7²€°íœ{gQÀîÇï6 î Ý ˜m×oögoDº+j¬ñü!¯¡{C™þ,EýOÀ¿Ï€ÿ¼4'ÌŸƒüûNuÛ¸4ÛCj›@ÿÙç„â1^Ç‘@@\¦ë¯éé?W¯éÒåÉø_7ý¿Û&TÿRqôKÏÖ/í›Í7e¾§Ô‰¾—qnÊ Ì¯u¸w¨¤Ñ9 ¨ñ(PÿßúçÊù>ƒ6>øÕˉßüýWÓ“¼˜OË6oYD¼"o DÉ™þÜܺ žu÷ŠÀòÆèÏfel8ó*Š.jYp\f$ª2/ïµ ˜VG_î8Þ¸äç½ìë×Ëi¯ý<ØÁv°ÇØç–PmOú2>–mßÂwîÎÅ6ow Ûì0œyk¤•Ll´\s‰ûFN¬´)"ÙŠ\™çiÛ(e>(­|Ší˜$\ÆN¬“Àá6Êð²Ï=”O…=«uâÓ¶7ÿùi%l2pþƒžÝ™å ‰þ,3œi-cŠ MŒDmeV¿|Ÿ!:°÷Y•>l~¨½A_<ÝP|¾íòò£¶ì``ÓG„ζ+. ÿñ…åB¸}Ò`ÙI m#c¿ˆ„i6°H2Ș'£§ÏµÈ {‘é{¶dûe°ýe<|¾|£{ÂëqÕ©ri»(5jÀÜ#`ÎK§®“+K.ÏL 0 RƒXDo¹à~äïb‹I·qzÄÞAòdHx¿‹t*–A\2 Vòê’û%ú¿¶““d^½g™=C£ÞãÒÊä¼6šR!ÙJ$UÞä¸ËåT…|Û§‡:FSÕ”“×(~3{‘îßðÝô¥ÝØ ìòA½ö$!iœ¤7mÖ ôø=~_¼DÛ¾8EMR•#t 2ÈÙzDÎqYãÒ]DHJ‰´â=–2êêÐIC-§M¨î2Á¢…UK»h°ä ]&³Ã—ài…è Y$X4‚ë9¤–ºŒÜyº@Žñe‡ ï §÷Q±pl›ãÙÖ†Üj ~aA´ ±W?®T•OÇ÷žfþÑË»Oå\OÂ~®ƒ¿~¯gs¬´ÃvÆE+4[ƒÞInXc´žYHÆšLC¦‘Rà‡LÓ ´¶EÚ ]ãÍë4š9¾Ê9mNhvZ”†lZ…… -B«Ê"%šViEUI Lj”ÜOEi¢:cE/­ü4Z£p²6s¾5V­>Ur¾ß^Ü(ùò¹²/ ÊÛ}DÙ¦!€HKBÓAÓ9¹Ô”&Gîrõ¢l‘œ&€y¡Ì )Ài,”¥€TI2怿0‰ýÂþ×Ï‘¬ìç(o*X‰€ÔHf4“'#‘}§x“PB§¦‘¹R=dÈ¥¤øPj#‘ïàaEIM±û=*#ƒMÆ\F5,))؀ق¶Y´Œr7huïé—’í]–ˆC»D– ØÆ=0 …¬ÆáIgä´!5[„"4Ë¢¬Sº}ÏDç»Áí 6xî±Á&?‡ßp¿{¬}±þò®±;‚Õ‘¢çήYÈÈ–q$é&ñ¢,4«_D]I ʰó!9”0J]Sʾ„ÛËuL‹êƸMfÛÊò½íLfF¨$›Q‘£õ‰œv3i. IÊüAu½Lô”¢œ2Ÿ€çn 9Çùþü/¿Dj;¼_àžF€óã–ÏúµðŠö¯rÿ>‚m˜_ùiyý/‘Æ}Õ.ÁÔ—AjdgŒÑÿE€ öM¤ƒñ;³÷7Í´¦ó_C|‚þ±m"'\½–:ßù¥>û½Ë•=VÕ8߹ʲxŒb‚—;Ea`v5.•S~Î)= u®º½ŒD€ bPÕ;\ 9ºÞ!#A`üͧi÷ÑíQiÏÓø[ÿäõÏ NtúÝnhoëââÍÞw÷2n0ü°ÇA† /]†?×:¤{߯´È£Âkõõö@ö‚±0a'F(!Î|{þ×síΣü·‡qÉÁv°OhŸ™†ý£Øê¥Äoþþ«Oú2>¶}ðç[v ´w•ÝÆp–Ñ¥wÁ\#9ýýL@ÈÆP;³Î±>Xn¹÷ˆh#L "—ûÈÓºO`Ì{>g©= œ<Ï–ÝýêòI_ÂSa›w†Mæö¯¬hŽ”£×Ú;Š$XÜU†M Ï Ã6Ô4Ú6êuÁ«IÈ]0D›FŠ¢ÆôWëÙ¾<£<ƒO¤›ê×^•©ƒÇº~0ì`ŸŠ½÷'opÿÜØöáØ[/â³ë"êùaѹ81ªÏ %¡idŒT§àèn˜ùpd_GóýÅ+`§ì/ï./—uŸýöÜõ1:c.±Jß.€«àfS´D‰°(áäÅÃ/)Î7v_4^â9â{Ez÷÷Ñõ9¤ˆwëï[vx§6 m!Ÿ*Y +’™¢îkôÿ üßkæ*fQ{R­ÞbO£ÓIr8æ\g·!Ó»gjŒë›{|Ëó b‡‡,ñÆg}A•2‘|:O¯Ä 8HãRR1© Ú"ÍÞÞAÓm“ÿeA…2@Ió!N¢cà ‘Ü× ;‹tNóTJ|.Å……ÁB‘Ô ©…tí¶\á‹m„f•‘öïÎȧ…í2r¾cp¥ŒæâoéeKÑÒüj/"í-|éd_ƒü2Ü/Ê„´-ŽÞQôò› ï¸êõ ÿ§èˆ{?ÿè¥4Ïf‡ùjïgÇpW¸M€ñÛVXäWÖÙ„&ÃÐ:0Ù±CIYÐl˜e²÷4 ˜¾F«/à]zHâ"äÒ-ò¢W±†Á¡'€ËÆ a\NÛ8I…ó¡/QÿT¯Hù¯z%Js©@ËÓåxUVmäv>ß:·Ö°Zìãîä2žKú³u?«eùÓ¶»~œ¢ékzg±sú&È‹Ž·pgÙE—bâ¤ð‹9­ ™‡äSÔ²áA~AÈx(bx,' ¡•øÌK–’å+–IY7Ê2Å£- `áFcNj!Ý2Ú“õc×À™„bJ+°HûJ)"ÑߘOý}é›Fùð*³1·ùwœY¥\;—ˆ>ªÁ7Nî#ÄÛE¿Ï*Bâ¨$%êc#$"G«Q]4l$T¡T€òYÕhš’à2@õ*è/—ª]Y¦Ê¢}D*Ø£¥pçH2 9`QŠ:´«Ø÷öOŽÃrÂM‹¼:—êoŸEÐfQÿ>‡ñ }…Pç.ócÆoìõרu/ÛG€1šþWÎ-2Α®³:U˜k<< øÿê/Î!ðéˆ:E-u^„«ÎÏÊ9*óÜ÷ŸsÜó ăñÎ~pÜ7ŸÛ2=Ä îkyo)D¦C}¢Htvãü°ª½Õ‘gøœíyò¿ò{/賘"ù:;ÿQ?ìîM:nEòÆÜIk•îAF¡½­ô§§¸9ykˆ"–ÃÏ+ Øõ6ü „:²¬¤rÕr:w÷HãÛþgÊL¥½¸VöüºO¦òì`{6íCuRŸ–ý#Øê¥ÄoýñëOú2>‘ý䛼úÛÇ1¹·] Ã&ÓÞÑ"Qî#ÀŸ Ð’ý†W rðB&Û”¯\JÔ],W&ÛÈh›É’ßÄbû0䀽îºåëÖöS³çÞ8ÈÿCÔWû˜õ+ >@îŒÕ+!ÛÝŸ‹•²|>ˆ$aq+À~k`'…:@:lδ´dJ Ð3©”üQ#{´(TU€½û¼©þÁþPžk¶?jùQÛv°Ï°=øŸßÀ NÖJ›œÁ"µÚÖÙvB[‚‘›’·³J{j•앚;Ð'áޯ̜ó™ßåŹ3ãZÀ¥õËþG:+¦}{*x‰¸vjt»¨`ÁÕˆÂ'¦)޵êTóþÍÊyï @kø®ƒ¦›vKx"*!‹Ž¹ßÃ'ŽOÏ C€ÿc:!Ÿî#rNNs~çÖ>d4YÈ÷e(z÷„‡w(HãI¼ì«Ž»k‚•tPÑÊùÃô„ƒlqÍu_WÄ(’®Ñ‘Dù™d“"XNPR“ð´V¨. þËQ“;¦¨ÉÈáÒ Õ.)ò)W<¥:¼ZAZ 9ìEQX´Š4 \o·‘t mN`±ÆÊwÚõ\Ü£?ý€~óÆúVØ^ô}Б6ßÁV·ýjÏãí]¼½…4Š2àëûäÕ)²u¤¯Ï׃|p÷•xhïþu°éæ£*Ãe{¸ºÜz„ýáóÏ.øÿ|¿zu[Y¬vNŒÔÊAI2D´š+ˆÙW£5 ÙÌËlÍYä Ð ëÐ|1F^6D¤f㡬 ¿zD;·d‚¤‚r梓ÜÉw^—¤BÚæ+¹ÏSÉÕ<¶¯s æ’L ÌÏÂR‚ã•ðþCç|y›ëo»;}†ó“ÜZÿìÈß8Èÿðü œ}kËòNˆÍ¯Ï‚°;¬”4Dä¾IÈ'™ÀÇ$ÑÞÔˆßT~šÒ¬higœ¨_Rú¿™& -5ø<Ú•LäÜI$CïœTv9Ο̑Áht I¦m…tòšzïÍ®?K†.-R¸¤„¦ø¾ÈI©¤zñÅÑ6.RS™ÚNš—ÈúŒHÀ-E!¿¡-hâ8<!PÚmÉäæl¥Û© 欭õ@ß•yÌþÆ1TJšžäøÂà6ð—`ùËpö]äíáÛ‡øöl¹BšTÒe°Ey+F‡ù}ÔßÃwðÝ9t=Öû¤`4Ž/öQíçzåÖáß;/œ$VgÎYo,DX:ìŠzÆé_? ÒŒ‹ 7H€ûÀxSˆ4U=C$È4ßËȹ,õ_‡2;f9Öë²ÎÖoêg×ÇÌûM¨NGK¡¢_°ÈxD¶’±"Åß÷¿û%$žu–Nrþ­/ùôO?ÒñÏŠUðOfÊÇ–9ð?‹Ô-íÌeðß÷ÖʶiÂ4—øvÙÿ½´sóŽq0¹ðMõÓhÓ—ѫ¸°G¸tL`èxüÜC2ûâ¼}«rˆA¨Šùcä„P"ÿ‹CÇBîWÌʸ H‚BçÁh•\¼½RÁs×hÓ€šÜ8æÐåMB• Êÿ@–@p gš¹sÁõ gÞ0À°åÀê9'­ÛÁp?r?Cƒ'Šl²N¡ÞlÔT¯ÕÞc«ž`  :ë4 Œ2… R€iŸF‘NABþ¶€= ì PÛ–¼¯* §ÿ7FMËDð'ᔼ˜\EiÖ"åòz‰¬oÃbÉдm¡¹ öäÛˆœXGŽgo·øšvMZ´äöîgÐ7Ø&£–0ŽÐöôYAÛ" â+LZT¡°9\éîmñü_q÷wxnãv½”í=‡âÌr®ùU²†==ÞõÏoùöòÙ•Kÿ• øþ÷w´-|1+ýyÆç¸R)O) BÚ<$“$‘”€f' Žº³0'Éû¤VÑl¨œÓ¨’’"’Š´²’\QJÞeU¥IR¤ÿ `Ÿ øŸ è¢:‚2ÏRÄÿuê¡ s±sn m™fšÃÅÖ9/Û–d»È?³ßzš­uøþ…Í ¬UÉ’Ù"hŠ,%Mïä$H)û®i†ÉÛ Ðä(ß}éC[ µ‹,EþŸh¯½ $ ‡(' ‡G‹\•©ù˃0P¢–Íȃ“rÆÛˆ¬—[?툉 ' ~ï;€À`¨f„„š!ƒ)`ÈèjGz!EúÞMŽÞiIp¶ƒm‹´ Õè·R7 G[ôÅÉB¾?à]éèª àP^K´Hô;’"jÀ‡"Óž{zð-Á FÒšgA¢1Ç8x‡H‡‹aÚ í Y÷°ÎØÉ@Zü=Œc<½‰wçÈö¾j Íä¾+*8-Òî=ÆÉàÝûøæ|·Áw‘NÀó4æàÙ힨½Ý8oÁöî¯`‘¡kAÐvñ·I°èå鲜 ”-ʲ8¬]Èb´}–  ‰vµ• Ó(°N:¦ÓhJ}C‰Þ'þF¢™Nàÿ¼ÿ©³ŸVß3÷% 2XöIÀ-¸7U€ã{ß{!·HvDËXò1—ôYùçöõ7þèæ(ü ?âÙþçúPåú÷Ï1ž™+ tQ=Ûß7‘š¦óSFñ•0›<¸!\jbÊô¬ÊçÇÇ|^ñ¤¿¡Á9^î -ãó˜BΞΜ¯ 3òŠÏÔ.Èå-ûO \ÌηöSœeeNVŽDA\´±]æçœ"ÀÓ?ývä<Ùêåä¿ùû¯¦ŸÑõüLìïþÇûùîW–ÚÜQ¿øQ/oõ¤¥º»K÷ »ލHwncy¶FÞ¸KBlp.НÖ\òÆc<1ø0‰q­Üÿè…+~Ø9ò±¾Ùƒ¿ö`û¼Ø‡íì?vÇôì"áþô_Þyæsœo2p÷ËK޾Øpñã](í-¥{8`,î6ämt`ͱ[E ©­àß;iQuÚž ÇiÖyl)9m ÐX#“}"\ŽF®ž\§±ôþÀln‡Ží‰Û³^7>-{ë_sôzƒg?ìé>hï(»2Ö9͉ìç‚êgŸÙ÷„SZo.©iÔmE z>p´ù rVÏÆõKuŒR÷j}ç\W&D\±8Ô¿ƒ}îíþÿôƒA7xDÅ"4IX”QÒ§hŽT¦Æ]ïœmÓ‹x6`]2©8<˜òÌySÑójæ]Ú=ø‡« ¨\ú½¡\iuÚ0õáõŸ_Ú+©ò»U4ÑËw&Ú˜Ãy"渵ñÞ[xY ~í#ˆ.¸V'–Èøpºˆë¨ŒBŽóÇcDÞ£½DèsH*ëQeÙ…n30äÌúcñK_Dï¼N¾ÿ}†ï¼ËpOCâ¹-×à¡p /ެãaïEí;c#…¤N3ú1äKÆýStz•´‚3„KÊ úΑ6ÒGLï§:Ù÷<2j²ª1Ä¥õ™ÕÇì! °ŽWÈñkÈúu<݆4àò"AŽPnC‚ÛI€ñYC™¡iѶ!/Ï™Dfí²Ù¡%ÿ³¹G¢ÛEƒ$ÁµÜ±] ¶Å³£ªSZÊŒßsòÅ9¨à¾(‰rËýÙ¼Œû¸ìæÈÑE܉÷iz|GE•Ç糯xÿìnÇ7ž]°ôKøþ[ÛÛp{™¸·1.ÖZžfgX÷§9©”‰äV”ŠÔ9ñ™,@Д¦ƒtÑ“ô­Ø× º Bz@Å#ê?¢1 ! R’Qê¿Q–FC`Ìw>ϱ<˯X34ášž"6y"­"B›œã•p¶uú!ò8›9Û.TV áxUÊê8ú—*×þíÅÁx> ôÎa¸0¤o@7NÓ9¹´5Ú>–5WùÿY¤r®jR"—§å–)Ïx#B‹Y¶7Z#–kò’£”åQáBB=CE ˆO¬Ê5ÍšåËõ UÁt Ç DJ™F&p" ¦¤v ù¹–æ—Ù Ø·ÿG¿ü÷ 7ò÷þ{_ðT"% $éå†ôË¿oü;½ïÓ°åò‚ •~Í-ÚãÒÖ£A ”¼ïþµ3²Ÿ“|ß±mìgˆBØop;GÝtŒ-äI÷‘þǘ¼ˆoß»¶‚Ë)²¼P¹9†väAéмÁ†SØ=Äw¸èñ.‚$Ô†,ú¤ƒ}tûâ ¼y êÂK(ËÆù‰{mgh£Ny#ìG£ˆ òYr"}†9R¢.Sê#Ahˆå‹lÑçPx¤ÌÔn5ŠŠ°É}e_iwk_T·Õ:9' ×ôCå7êq0m£l:áã±Fù' r1aXµpË|ÿ‡?z©Œý¤¨rMÀ*LUð~N@ÿj>ç†o±‚îÌÀw{$ð…0;G}²`ü¥GØô]¿[çŒÙ€½åBüð bŸ\3˜ž]‹Œt´'aõ kÍ)[Jã? é»O©Ê{šßÅdûw2îu÷Õg~iÞ\Ï^Üþ•…v÷3'?ßrçW~[‹Ô­½“;ë#p²ª([ÙV÷…RkÌÕ=Ãpa1^P]ÝÛ1SOlZƒ'o¦‰ìo‡Ù~ö·íÙÁŸ{°ƒ,ìFó熰z)ñÕ¯¿ø¤/ãÙæ{¹å•ÿäˆö–rëK rW{§eýJÉAÞ@™»È¹V—]ŠÃ¬!&¶‘ NB‘&:·‘QY#®¦10bÓ°¢%:©š×†«¸âœ y„<Ø·»_]>éKx*ló΀$°a;£Y ÜI´'BZÉ^J «©4šþ7)@3X.*JÙ›U€± xÓr›íæƒÃ‰W7 êÝÁ¶gþ‡¯â^¢¯A-ËŽ'¥m"2ç|j:·f¥ÏËV9½ðH°TŽKsZ«“êªã TÆÇNµeïãÚï|§Ä•CÊ÷‘°wiÀv³©Ïöù·eB±œèä=¼—îi ¸•†JÔQLŠƒ¦xlEµ89ó ¯R¼^dyÉe,a55A% ”ßAÜé8Û «KXÞiÐ—Þ ­ßÀ›cô­÷àaFQ™9xä’KNÉÈúxfNÞéØÙ{Ÿ-k€ÿ¥m§: -ÆZ¤¤ôƒ³œ…„dž”¦1åw¾ûZ9h6ž„™÷-ì³ þÏAÿj—%ú÷@þËŸ{ËvÍöº½sŒç÷GÀþó¨õ½÷ýrn*°|Ùº¿°gqêê/zÎÓëbßç×!å¨ê;žŽñˇ_g¾wälóu÷8Õ©i鯻>ÃEgÏÛcnY¨³&- %YLŸu¢'Ï> àQ0ñø8¾ð;Çò…¿ò™‘þ¶ÎO¾y‘ÛUQ<ï\úSó¡3lç’;'ÀmçR€ÿðïÖÏ!RŒ_A(Ÿ‘¶uô5ðº,Y}´ó?¸ú†v°ƒìñö¸ÎèÚýŸÀoýñëOú>±}ðçÖ¯4ô§ÆæÝîaFS8È»óŒJä+ïO ibÐb[ ¹òÒñ ư±pœÎpná›î‚Ñ&Ê(û?FÝ]ÃTƒKLà›:³Ç­ì‰ÙsoäÿÎÐqþ£žæÖ’ÍÛÃÆ6F÷0êNÞ8ºÛìЉÐSˆŒrþûu©0@’/;°œ¨C~¥>]f}ÖϽ:vyùQÛv°ƒ]k#.Z€(Ó˜øwƒ“sHËŸ^8÷ÏŒãµr{Ž»U+¬Z¡m3+²×à>ž8qé—‹ùõ›o:|ûcÆ5ÌdtÄÌ=&sOT¼gþ|ß»F/ÑäÅAR€ÿ*§(c_*'KÔÆË½6õgŽ4®‚ä"½Zq„¹¯3Eþ—[²r?.ж\Ùnœ³¬’³Z ËFhp|û.Ö¾ ÛŸ f¨68‰ª™=Ûùc~¬ûgN€™"€ƒEX.Dm$pËÐ÷ -¾ëiújçd¿ yKØÑ“õy;ûQ“§È°ÜaCÆrDÒÙ¨äàH“ðöªwQ= FÊ…È}\¶ ¦ø°CÚS¸µCd@NlMJN±%––¤Å޼5Ä3j=ìÞÅ4>D¬Åó)\¼çgØ–—‘’.¢¨1¤¢ á¥Ì/AöIõ‘7 –Ïã¢x“¢àäB™)0àÎ7NŒ?|ùÙÿ¿|ÿîí»åesÙè<N]D]Z#4¼Ïã²cmàsmrLY äe£‘f2Œ‘É©þ‰)$jô³€3ÚÀõ‰\ä8É­D3K‰ät´¨ °^è€\ÿŸNÇ«ˆ°haÑÆõåìl:';Ü=’i»ÁéÆypn¸×\ÏŠ/ߌûöAþ€çáì/¶¬À±Ò6Bã^´fJÀir€îVÊk¨c Qÿ2n¯)3„¦ô÷‰ª ¾–B;ÊK¶]¦#H‡•3‘樤çöÕ_BD8z÷oà¬Gï=dgߊ(ÿ]†]ÈIŠ6MÝì ñìYñ÷ÌÿÈ` m ûÞ¿ÆMñ³H-C­l¸%üÞ€ó­è—OótLµK–]F‘š‰èÿ’à]K‹ $ŸáýOvA6EȨŸ€.¡­ ¢˜ÝCí=èÏÁ‘%´Gˆµp~F>=…³‡ø­#ëÖàÃ?òV´¬rfè‹Þz–ù¯0HI³$€àãÙÚ@ Ž:·nÁYï¬aáNÓ:,û24gá#¿“ÆBɶ¨jUÅ —P ¨u7ê[T°¥È˜N£•èG–ª#€¯30?²½ˆp¶³±Ï¡‚ý0ÖÅZ-j$ÿD˜Ô®ë§E÷y(=µ3Ó¿ûÞküÆûÏú/ê)¶ þO‘ö— †]&\þgÇ×óĉÙÿ¥klF"ÝkÇU¿z½ó¯]:q á}äòz³]ýá½_ù™Z%:_.ÖD¸‚±—¹ÅD˜+)\¶ú¼¯n¿þ Wî~ž3aή æsIFW–Cf#t•xÿRËSY›ˆo…tðIÒù=vSÁñÕˉ¯üÞ‹Ÿ)ðàÇÿâÔ¿ð;'íñÏ·ÒoLôÂÐVè/2ù£-’wÎp‘‘é”»S#-…áÌè/ŒáÜ¢“Ò’ByçhrÑþ¢1Ô°#­†@I£lU *)ä€KŸu h³*1<©ö;ØÁžZûØÑç‚ð•ß}õ+Ïþ­.î&šceùBbûþ€Hä ï7FZð1ÒIB—ÂpnèRÈ87 pc•h- 6§¹%X90²Ú<ËL¾Æ÷:ª½N«øR÷òÜ<ĬÛåêöé€Oÿùìf{îk€4—þ‹;t3ÍZÉ['ï2yç4GJîm)J¾÷Yÿ¤aF ð=ÎS›Ò0ÊI‰Fê1ÕF­s0qŠÒ†\ªsqÐy\;Ø3mÿ鯅7n á+Sø/"âN«£‰ÑAèÒîqÌz!¤;ŠYDtîz§MBÛDÔçÜÁáÜô|ÔaÜGE‹dæaœ¯ˆwÕ=éÑýèéN!Ìåòkóæ*¾Ñü3™„NË@̨+ `ü×kwÈ„Lï.;ƒ M ‹ë¥bn Ù8ÝÄd}•œÝð4·ÿ†´é±‡Š,‰‘LðqëcíÒ ½(- CŽF\†xnÒÂñ² »Î1m&Ö^°X>Dä>I@]1Ê0¹ÈìŒl§H~€wgx·…ÞB¡Éâf+RAq åeáÅÉ]DvMˆ?2ìä‹à†ø·ÁÖÐ#醄h ’¸Øôt4j,ÎÏiVߣIoGìÐã=ì€ Ï>”<9´‚´‚7µàĵGz‰hcnµÄ‰à®øýÿΟ†;ï~jIy5G ïýÆø“žm„çùÒÿ}ÁÙ¿×ÐÃìÈ¢#aˆÈÿÈ…hs€šâAP+`J•±¡:Ÿ?É=äÿÇw„Ó[°^ ½8çC¨Z´îtm¡Ž¥ÈíÜ"* d(‡Dÿ¦Òÿ}u1 '¤Ê•R¬¨[@(bÀ$Oî%Å€ûL#ˆb‘6CÍIÍm¡]ÜA“r–A·†>ˆ)˜¢9Ú4UEó€ôŠ–¶Z%´9ôABÏ:D¨òáÉŠZÖT 5Ø…à» G¹•P [žO8æäB p7D ’! GŽ9–ÈÔj¤˜±{HŸɘ 8;°¸"î,Ÿ’ìÖßC‡ ¬¢¡Å›%Ö40$¸Ð ‘5ŠÞ~NVøé`3»ÏH£cÊ!wŸ¢ü]Šì‘þ¯ ™Â.ªõßÚrk ï¿ ¼{¯çd§+h¶¡°±Uh3´%MÞ °Ì°rèeªo½'(17•à…4ã#aŒ •™ŒýˆÏˆWRÌÈ5Ûtÿ£ÀþCJ«ýC%TK³>ï;ß}7ü2ÿàÿÙOá­<ývè_m.û_×/ƒÿvØw»´í2ð?'ĹǹÞcê½ûõûç3½}2AýÎl¼=S˜äý§yUýÿr:€k`ðŸ’M²ÿrÃö˜.ÏRÂQ§•d|髸f<úÆkÚûÎ#¦¥—¡zÃBY.JË8í”sÓzM ç/O^¦ ®Æ3¡ð¸²3õë/¦Ï’ô?Àùûüâ´NëWéÏþAöܹ áŸíÏrÿ©w&Ã6|¼"Ð?4¤…Ô ¾R´!Ô” tQÆBEö8-]8¶Žóº .މÁd¼¨VR(0ÐùSŸ .UoY¾79 Qv°Ï£}¢¶úÙGÅcw¿ºäÿë»Oú2>ûÞÿò€—þã5çovœÿ ´Žœ†Ã…‘–JÞY€”Me¦ÀòJnò)*Ù20û½¬_ÊU3Ê×\–!¿f˜°†›@ÊC§õÔØk¿sò¤/á©°‹7{ÞúWç¬_mÐlÞbp·òÆ#ª±•H½± Ÿm œ¥µ>Í"þGB {dÏDý%¡üæúR·—¶Ïíà§:ØÁ>ºÕp¢±þHT¡IÙ—RøµO–তÝà%_g8õÿöÞ-V¶5»ïúñÍYUë²ogŸK÷é¶ÛÝNÛ±ÛŽL "&á‰H䜂"¡Ù‘@‚§Ï¾®KUÍù}cð0¾y©Zk_Î¥û쳺ÆÖÚ5o5kÎoÎï6þÿñ‹ÐeØtQaµ¦Ô;ŠDdHŸlîÒyæ¨î“p8Ì'WHWýj÷=ÜwA!²¼‚ÇÓ©ëÖÈP£¤þp*—éºÆ±DuŒUL8›„Šc“=ö«B_¢ü›îœÛ­pþ$³u§yd\<€Ül¸µJhI¤&‘ÚˆÜoß§Nu¹÷!õƒˆH»XƒwÎí;ЦHƒ€CÞB_ ¥Y“HiA–„¸‘Ò ÈŠÈìàæk¬Ÿ³H5²¯¤«ÀM物Ž,–G‚$&‚N®ÇõqO‰H8[$%üÂÉïôQì%Õ²©*^Ñ¼Æø«?ê<üŒÏ€~rí¼óf¤aà¼Ð–DY±Ø6´› z»D7Ðv`*´%¢ü‹B[„Öœœ$ ©ó*³ì!>D^ªix®òË>å^0ñšï<€íâ D .‹TÐ{à_ü ¾\À»¿Eù à9‘iãªü혣Ɗ NÙWËáꛊ;'˸N«Ûçx!œ®†º>#¨p²zö}˜GjÚæ£ßóA ìO>QÞýçoÀÏÞVÒÆùýÑfXÈ"4æ,²`"´ÅY˜RÔY˜°¬@äÊ…¥8­(­@?f°‘¨ÿ$Uò_«*F]´N²BR#- ºªé96ŽlØ‚ ÐªÑæß âØE‹ÞiÐÛGÈbÀaß#ÛÛ:Þ)¬%>³â¢Z…¡@U¢çi¶âøh÷œšÆl×=HŒýZœTÌ£]n=28màÎ}XÞ‹ãÚs$}€ERK’‚±UÌ:ÔÎÑþ ¾}„ô—¸·ˆ(ÖÞt8gx¹@Ì0×:^<¤Û⽇´¿GDŽñ‰ÈDÜ‘‘P ÿþg‚lvàÐ|$K^.ïÛ#嬋‚t©´ ©xÏÊ´œl ¢M©h´þ%¯û˜Öu臇òº>ÿmòçþ^ n¡(áócöŸEüïEí_…¿ën¹næä{GOgÝK%OÉð32M©ðØ?ªªýÀI{à¿LŸó_a@¼ï¯^uû5ǽÔ} cÉì\ÔΔÖÃ9W÷ŽTU€SÃÐÉéø|â‰ù…áh½Ïx@¯p*€š_³ì€þnžô?ÀÅ»?ù­Ž|é^zóõw³¤•8ŽlŸ”x‡S¤ (ëP([£l-·A^×1Ž‚÷ÔÀ®š`êª];xÊ,0ÒGµ×¸®kƒ#‡1ÙuO‰l;ØÁvÓìyüÇîx>ãî¯çÛêÄÏÿÊç>íËøDìüŽ[_]Ð+’„îIHùk+h+ÁìW½PÔ·£Ê!yëEÞ e;8€‰‰r‰NŒ¹dùžìÿÀ¿?6žwfóípèÀ^q»ûµå§} ¯„­ßËüÖÿôù×oqû'–ôOãÏ·™O(l”¡ Á¶NÞ:š oêö¥ŒƒÃù_™çê™EþÏ>k£Öµ]rCí®ív°ƒ½”=ýÿй6Ðþ­zè«ÃC YÃÁ¾h…£28‘ë¤Î³£“¢™¢ÒÞTzt[­³ãáC‚õšÀg_‹ ‹êÆcÖ;q †K¸Ž?^çä|¢:YÛFh%Êw›á½ cÝoßSŽÕH¯eš»ŠeÅþ ÃeåO7ó IDAT‹I‚Eƒ‰ÐuŽ£I5ÇrÕ/—ýø1-‘ŸjžðêDÊ.¬·FïÎr¥¬R-*‘L¤ú6OqM˜eXl(ù !äžM¶¸_ öß~€_>Ä7kØ<{€ÅGT_?Å›oSÔAï†û¹ Ö ²…¦ÁûrÙãÛÉ·H'ñîÖE¸‡»Œ“… ½²¾tè••†:†f"¢‹±¨ô1îVÀ±#ÇD8` šï3¾çâPÕª³vŒª¿K3 @+.$F¼«bÐí-çÁg<ÐåK[ç›ïuäî= 9ë¼X°Ú,Iž(ºåøÒI—Äs§u¡ ß'‹æãÚúj ÑÍ3ûZ$Mum’ThTHII)>Uµ G­PLxÚ’ ·Ž•Åý7ÑÅüÛðÔ@i©åÝ|Ë06uùÕy^îζ‡ÇFÛ'umcÛCsGX-ž}ÍûİÁÌàé…“Íyýv¨|ûÕãàë+统ƒ‹Û·[£Áy¸í”WHÙiz§(4Ùi3ô)1’I•äRxÍG^Õ3dˆØ—'×a™Iª\EÔ,F#FZšU!¥6¾“3RŒÔ& —NzGH<&-…f᤻-Ê É?O²{8CòwÑÍYUÖPØšESBSø Ä@Ó.@dƒÚ£Ö~t mžFæc†a×ZA«ó[¤­Ú‚/ANn!ËCåh§ ÐßGxv yƒ7-"ÛøEÛbù²ù²9Ǻ ¥ÁðÖ‚´°}„œ?Á7«æS°3¢¡þ"9úRDÆ1]ÜR¨ ‰É¤´V¨J30IKìeí«[%+¸Â[®H%nyR*P.ì¤Ù¼’Í¢È çdN>’ÄbL]³ÓLuˇ:6)i õg”ñŸØŽýá¦:þ4«ý NªäÔ¤Q—EdRª‘W3¥ ¸ªXõl _U €×ÿìoÖ‹úG? §ójÙË€ÿs£æŸ þÏÿ`ôŸGýOŸóóûî/¾° §-óéÑîÞ½¥aÃð»õ}¬'ª!%±$Ó‰e8–ë×?ºíŸc/â_dÞÜÇœn65H srÀó¯iW)éúo\ãôÚNÍýbûâ4.A Q\¤:¼‡”C»Âó b@êÕN¬Œý²yuìE/Áu^y‡*ýÿK¯Ä‘æ«mïýÝKw“œ~©•|Qäè~Sý²ÆÑëI,;Ö»[ïb½S²cYGedËN›'Œd'½ëT™=|¸5ÊßÇy6ת(ï((ï©'x˸ÌîþaýÚσì`? ö‰tA7šðÓùõ!ýpñ{=ßîY¾–ÆÆ¾Yèï@sü„WùT±p°‰Åä\›èpt8&‡d¹š¯fÈ[3D.•ìF›á;ëÏê”Õ+e÷~æ ÿàæü‘ÿä š;ŠªÐÞ1ʦD€‘Ž#Z±t…-”ÞÑ• I±n–«¯xõJhVÕÄèRl`Cª*kl~=ñæ:ÕkòDùó†‡zw°ƒqößJÁ“†@òÔë.°‚£Z#à¢s[4ОÄòòG÷À Õc{+Ÿ±Š6âÿˆ?ÛxÅá¿ïå"Ïë†$˜•ÁàäÒ!‡¢NÃl¬ Ή8~]Æ\­ñR{²°e^ úâ¬;á² p®Ûí°×'äçì¤ö!„´h(IÙl¼-¤e†[Bj¿Ì›ê/ú$™•G-—éÓZœ]9Á×[Hu,¶Ý†LõÑ1,WJÂIÙÍxD)Ò\’ô³EãÕºÅ˾9Ã7—pÑá[ú"‘ªÔñRÁš Îw{ŠÚ Þ.v…ê›xY€)î <)âÇH¨á²†nƒôk„K¼9Ã:cÙºTò¥Ó›DzÓP±€–ž¨H‚/€è± w[üîmt¹)Èú þtƒ‰#ž0óˆèt vÄP“NÛ$Wéÿ‘ú¿ß7þÞÑg?Ðå‹=¼³u½¦\®C¢?7=ø©(…Kr뤥âÿ½FÎóTœ‹Eä[¢.M,M‹¶¬1¯K¤h¼~×!QP‰œËICþ?¥È»ÜhŠõ­ ~aXWxÒÀI÷khäÑ–´iÑ&£Vå€z™EWÎd˜Gyf½JøA“ŠÁºsÌCÎNúZ4ÂÙ¥q±q–mïß–m6VK Ú´If[G¾Aú²vˆþŸìâlhZG—pþ ³ªdݶs–½Ó·SXÖ´Á©àiì‡÷>T†¿¤“JÆ TIÒ$ÝQhd Ңоá4_z›æîÏ#¥‡ïüº}HºóSHNø»ßD;²šS§¹cÈ[·I÷‚öô§‘t„ãö»ü§ðè·±‡OáR°µÀFà– NUÔuBn>– 6S*2w£(Ecìä-h{ü>¹IŸ;¸?Æ-#R@RT )ä Ø<ÅÎ7ø¶@VL·hó\ðnÿgq¯ôX&*b“°VÑ"8Áœu1 adL0Ì»Fðß„7Ã}ôµGÉùàma{ g“z£OŽn¡é OBÓ;m}SS`‰Pž)UU«ÑƒëS?ê3AXK­D€é3>¦á°ºÝñ¤…”š€JÜ©iÒøYU¤¤žsX®J.$6€J||^õúÜ¿ó›ÏÞùCdø¿ Î~–½åHÿýÀœ °üï‚þ0½K˜Œ¶ÿœgyè¯|wç~fÛgͨl¶¯&IKSZ†v6è%/º_g»Òýómã²Lë2Îi„«hüó~gðçʯÎxæ]ÌʘÉòO_HÈ×û¡wf_}dˆü·¡‹¶Cæš µ_b:ç+¦ð¢¿ï Üñ~åïêM“þè_ÝOrüÅVÌ3È['Åó­œÀ$„/ÂJ-¨ªØjÙñαLY‰\Y?¥Ù èŠq…_MŸ<Œ—† ¯øuÇå¹}ÆÜL;ØÁ>’}ßÚå;½¹ûµå’5ß>,¼ù/sù=Ö;éHèÏþÒh–Bé»0´!¤i¶†÷1Êk †Zvú ƒí|ÊK>uX¾ÛAåÝë;¦ÙÀj6î½úù²vèÌ>5»÷³ÀÅ»=ç¿Ûqü£-¶v¶O iùÒÉ—ù_. ùÒ…RÖFÞXÈG]Ú¨¨QºˆŠµ 懔THOšÅ`q â¸W–hö1ZÑ}tÎÓn sòlyXÝòÁv°É<¨jÌôЈLWà T"úª£Ö:U,ªc>fš4õ‹¯ˆ3àŶõϬ¯ÞÛÎÔûlyŸ SÃ%3ïÈ`sçÚYèÇ`+èÌq6Ž!ªku_=Ad”d”J®ê:ჳÞN„¦Ö]«n§ÛhrÒQb±¬!ZIœ¦5Ú7„æK?d­w¿Nù TEˆZÀWmp¥Šün(©;–­°\À¢¦œh ÉÀ•P¡Êßv ç˜×ìÒó6wЂhÆKëß:ÞK•ÿ,BñƒÔYU DéÎ0ß «S÷>äÕeHµ§ºl1ŽPYcE0.¾ÇrÆ:C\X6JZEäkw¤ƒfÈAoAÀñZÒJd3¸ÓÂë_DîþÒÞ¶pô.ßFÊEŒk{òÀðV€¡O_o³©CMÆ7N¿që³þ!;ÿðIfý# Mï˜(]Í…âç$w¤7R ²ºÐµ îB®_«C,U§Tk‘ 1hÌh,‰eqçXj´ rËBC €³Ÿª M¢©U}“OÏV›ÂG…”±rÔ MU Àü=À-ùiƒþsë2¬·Î²a'Ê_UX-B•ärkÜ:Ž{»Ü:—Ûw¡˜#·Ž”»'‘jâþ–m4€›N^4<ß÷¬‹ð €_Ú ï¿%,/ÛËx_S#¬ZG@/4 hvRq, læäJ„™TB¾?$È+Ðh‚º‘’£Ëe Ú j:F#'¢A!™±Øš‹7hË’;e}½xH*í¹pdI¢hã,Ž@¶Ç´ç÷i»U­kJâëÞ„þ=¤‚t†ô }´³hëšR¤ºÑ‰°òamœÖï ¼vûáF· àQDycŠXD#MLL‚@l i~‚õ!¹lylžbçk¸,ØÆ‘ìÑoiÆ èâù±X ôª9žb(¢ŠºDŠšÞç÷P¯ n¨¨ñ0žAøÆêP>¬½‘…‚îª\ÙôÆ¢%eÇѦ7Ù)m¤Ój¬…6ÇxgH—1¾æéÔk}ò:†ªãÍ–pj¤€ôéÿJøLÀK2Û?|j=¦ö;©®ø_û¿Ú]é«*6:ìûâ¿û?…§ðêÚÇÿëp®þ"ý«@þ'Àß¼Lä€!ú°þ ¬Þ­û{põøÎ͘>cß.¸¾‡F_EÄw@ß[ `úEÆû¸ÞžÁþlðgîuÍ7ƒëì;}ÃÕ+Ø»2Ö•ú•¥]¬_Æ#õaœ{úxíc ›ñúŽy4üþÀ¿Ä’x†wdøEÔ dœ xG÷§j×ÂÊ÷~f)_ùÅ»72úý~öÓ//äøíFºÇFY;Í1tO ÝS‹ÊæùÂD—5Í뺦yÝ:eïAÙFqYfTs±“Ù<Ôºa½úngà?{¾Ü9qòÊ×,sÍòÁv°ƒ}D»±€›"ý?Ø{ç‚{?·âäGZž~³có Ð+š„îIA*y¯_;ÖÙ(?>²ÓæyÉg`ÿè|õi‚lõ31©|†Œ€ÇäÏmøíwT/Z?اb7‰(óqlûAañZC{+±¹ìÉkC’ŽòÕÖƒ®”F"…F:ŠŠÓ¯ö$Q6FÙ:M]–mÍ¥™9rÍí©`ƒ\åŒíD&ø€ÍëšÍ5õ®ÖÉ+õîEÇC<؉]üo…,ì [?¨ØˆF_˜ªÃÉê¿V¦4ÈÛKdt‡’i´ €ê3ãص™¼ä®ã"Àuß›fµœFºÏN!³ÁW „û`Þ|Û|Ÿ€HDV*òë¯àM 0MŽÉNYw”ßþµ>>Ë4ÚÒA)9i¥4÷Þ –÷¿ì7Œãuôç,U~Rª£jRo[åîIä1v¼F¿ ©‰„R£­8ë­¡©Ð4™F¶¤…“n9¾è þT^ÉZ£W ‘{°—ÈolL:·ôp3„P»°úÀC%ãyƒ³…¼ï‡n‘erÌý]6zŠn!ŸQº ¬ëBáh‘0ƒËs(³òJ:À–ÝmÈ‘À­×àôÇi—_…t„Ò“e…”5¬¿ ëª,ç*uÝpß­Qb1zZ翹÷‘ß+c÷‹óæ¯]²~«a‰ÐœdkÐB³µ dB³u[§o‚¼”ú„ŒÈIDhKDSŠÃ¢DÎólVeÎ=ÀÏ z$‚<0˜¸E„±¥$ŒøNÓ$k4¢+«Nó£Ð.G A5à™ ‚ØÈj*8)<<]**>¶-C$§ 9]?%Ût1W:YéN„¾»Ó$çî©°íc<—.7p±ñªXÑ­íBh–-Ì…F¤ËõíÐм^Û™ñ««|Ýž:ûÜÞ5(-Üa‰C VÙ)ª5ySÓè9 ÎÒã½+ (Dd°‘IÜ«"@Ô EhO…æõÏÇ{ýð;p¦7 š”•3’)ͪÐ.¡Yö¡*T2i“9î•ÍÙ;h ˜ž,[Мé®ÐÜ?%ݺCÛÞCÒ1")-Þߦ÷r©xgxÚ¥@\”Š`22h>ŠIä£FßA}½ÂFuŒ$î‘n€Þo(ú$”Ͷ¸l7ÄÎ0û.¥%Ðã›àì)~Ñã— [Å{pO˜×ßè ™mþ· òWÕ/qmŠ Ü„ñϘx&“Oc<Yñ`Æ^/Êc„~l šk¨cŸà}H%?i €$@ý¨‹h %Ž!ÍÆ°2*4• Ö¸ÓVEšx‚µ~€¦À­&ˆjëc°)E‡T€ˆêdþw”höäÿ¯‚þ2Šl¼ýç€ÿÜ~ùkÿ-ðq{>ú6HvG`\·™ä¿íÊÿïËþï†åú[u Óê ÄŸ_Õ}¿g;Ž™]ØúêÒ°6¡Ô1µšEæ×9Õ. ¦øt®p æd€™Ï~çÿðÿÜÏ9ßµ˜ølÜRº®4®wG ß½Z–2ß^#ô½*{Ęr" ÓÏø¦1¤ð‘`¨ Ç“"€Vð¿>™Þ R#|ºÄÿçyñö!ä9¬ àôW>×~_®ê°¯ÿÏú‡¿±æsÿòI[6æeë"CëëläYgb]õÙ¦ª0,W ß31þ)!ý/˜@„QAY† ¹_vð7}äà¯=ØÁö Ù$üô/Ý¿1Òÿ—Ðó£ÿÆmVo6`ÎñÛ-y]*K-XmÚ:¹F$k+”€ÙDtr¾°1ª?34AY;yí¤å gSɽL7Ÿu|cTò™<0Û|úÈ2n é`ÏNncº|^вŽIAÙ:Ûu­w[h•$²Pù¼qD¥ªqÔAâ,OÔXìj}Â÷Ö«CùXqì`Ÿ=;vè í£ÎAuxpÿ±ˆ>Cµ:"|ÎЉ*Z£“¤:¼z>‘ÿ×™LŸ­Ö³eßÝ´¯êÂèeœéS–ºOx†7é2ÀÜÑ5sê!#®[nGäG±ÏRJ¤~A÷{4‚[Ã: œ² +5N8yËjõwIþ¸ZDó`òe¡_/U´ÃµN‡W÷“;¥@©€ªÊJ sès©Ò„úD®Ú³—[x¼qc™œÛÇÎê¾£§_€Û_†îw‘Í·ñ§UP7Õî%Æo}(5*’ ¼¢±Ã°Ø½ƒr‹E—$+H›S`©` ß´xY&aû”þòÛöÐA*  pW '÷Ñ©$T\ÃÑÙJÌDZùƒÕ-Rû:¢·‘´/hzk_ƒÅïCêBM‡ HQŸÛî;å.HeZüµ7áÁGSÕì¾;¿ÿ¹D¿‚{ œ³¥°hþb´½Çx¤šÏB "ÿ+H—H!¤°Êáð,8©©dÞHQÒMŠW¿‘™4ºEš±„£â£”s’„B€ã­Ð¢<¹p’*·•¦Ñ ô;Å„õÖi¸s>­HJ¤R²Ä˜)½È˜ Õc‡ÔI„Mg³èÿi{$ÿ ?Ù´/RÚÈü§AqJ¦ý?õ—þétó?äsðÿà§þk*ýâJú¬ ’NÑùŒ@?/þ§Èÿ]ðÿºèFã/<ð4}ýÆYÿlLzõ`§Î%aœWȸ]Æ9™ÏHqí2~o»w«/°a^åóna ÌÌħí;7óÌ[ß»†½Òœ)-\=üy׿·CêüYJ€:'Ø%0’Àx>©Wçìw©o‚E"»D‘ëU>U{™§ý¬—Ù¿ògîÜHé€õw{ÿŸ8iâ/ÞÜé/Lò…‘VHé¼I6,gŸ'ûÙrÞÝg5¨Òò°é³øY`ôïéöT]wü¼Ã2\õó^g?ä}ÍÁv°g7%¯v÷kK¾ògî~Ú—ñ‰Úú½Œå¦Y/c[£9VúG™|i¤E•«Ù†Ly¾(”ÎñÎ#5ÀÖ(c]8ÅCNÖ-¤ÈmëXUÀ|rX2’Ã,¬)&ùCG&sy›}¹òÚ± j£= ´|¹1÷Á>A»÷3ù7ç'þ½{}®!oŒÅë‰;ý¥ÑŸÒBÈ—Fi¤•b]Ô·²5lëÈB°ÞBqc‡e6ìë pHæPçÊÀ6Ýý›“òF½L®¨C:ØÁÐÛ†o_+Ò—‘gñŠ»! /Õ¡âTÇeè¶Î]ýZƒ£}°ÏŒüÿ³lˆðƒkˆ°{³Œ`ü)ËѱîÓ‰®k‡ž[T²wÌÌÛ2ðD(z ÐÜRV‹p‹msø®ÅL1y{tYxÿ‰Ó㨅·ï$š‡NÿtÍñJi$ò:ŒÏ¾ÐÚèfÅ­©¡Ê/÷¬ÃéäHñÈ[o†»`.#n]ÜѦJκÓçˆøoÚï̈́ܘŸb²Îºú*é蟣4§Ð¼;ª<‰…ª£ ”·¹FßXÈ;™P#éé×—Œ p†4Pä=Väèoï!öX¡\´ˆõˆœ!ÛÇ,l‹™Ó™SrÊ'œë­zbèk!›aïe8OQBJ“âÏqD,Ô †A¦—†2Ç•ÑΛ:{g†ˆ sþÆ›Æ7nÀPç>ÎÉ?¸à὆£…Ðm [€4B1Ã$ä”K£Hñ ;i€åCU†òZË0¹ÓkD]j1ÒÂiŽo¡I‹GȦ Iж’¤J0Ð>$ž5 š‘Q“)ÔÉRj*ȯœm‡½ò$kÈA×f½ ©û[GÂíu%xäƒVsRmjomRœ¿‰ßÙM °Ÿ:àûÓŸ¬dçüfN.N.Ñ?´Mˆ}.Gãw´šDMPóÌêtÌûŽ& ·Ž†fÔüïztô¹â)MzÓш@6¶…‡76¦ëÃÙïýÆ¿˜Ø%ŠÀfjMgtK("¤ì,2P OBQg™aÓ ­:Ëlœ¥ ¾¨ù2Ö§ss}ô»Að½È¸7!;DtÅ'@ÈŠÏ…¾dôÉw¢ÙÚ ²NHjqìèÚIꤦÐ,¡ö-Ò¶Aô6ª ì [ÿ.òä<éñKA7Dd¼49¢ŽÔ:):¼»ë|Ô´#@ä!å"”ðX”‰lož®k¼{‚4ÛŠŠoÏÐYr†ËEÌkŠâ½â›Rÿ[‰k.##%úÐõ%1O*i³ÐÜãÙN¬¢zó¶{'qÚIL{””>؇²þ:gf¼wN.[g½–VzVG¦£¢LëB d"=MHù D*¤ žÅzÒø¢ô…X>n¦¾@gïõ“V=r/Ž·ïeü²…6^ É=êùæçðé¦Hxì ñ{?Ú°>î$GWàK%H]¨ÀHŽT…ˆæ§H9jhq.ÐHÅi h‰T@y$º+ÅŒî¬ÈaK¡ ¡NR#!ÌŒÈâ6AãJS@× }5‹Ð4JZ„$y› ‰Ñ¬œ´TšÍi¿C:]!í}ÅóCÄþYn±#ÅI‚'Ò,À Ýü°ö,€¦*RP#ݵ•Aþ_/ãWßà›ÇÈâH˜(k¼t5ð@)Ì|W(ÑýõÏM§Kú êñ x½ÇQCÄêDÉ#ÄÜYd²ŒŸ>~gþy˜v°çÙkYø;]Ç÷^=‰1ÔÓäØ2üVÖAßD»¿®D> ½ÄgëЋE 1^²*÷OZ 2ÎB…³\B¶ÕÍçœÂ×T}ä‹|é/ü“O³X_Yû÷ò¿`H·à²ê#Ø £/bþ׆,¯ˆW nðŸËýÇ_#þ¯Jÿ兩üÏ®û (¿OàZ<b,=|gšî\爹6Àl÷KâÇßk~g‡$°wµIcü=¦g4ŒWö¯Rê<ÌŸÕ'\þcmþ¿ø¿î ókß¹¢="À\a—÷;úÇêrN6 ÐÖªÀóTvl1Çy%ö½í#múkùõ-ÿº~/CÍ™Ñ=.Þ=)4§"á­~Ûµíúm7êÈ=Ø&¶IR¬³ðãn¦ .|HåZ¹æóì:ÇÆEƒÿv¨ÒW°{¿æVr°ƒìûg7ŠðåëÎ4í?üéHøÂ¿vÊÅ»=ý™±¸«äËÿò[²Ôü4Ìåg|ÀFäP–™mçÙÛwìÐ!}&íí?~úi_Â+aßûÕKÞúcÇ11ÌŽ•¾hŸ¢‚6N³¬wŠ9ª†/ËÁ(mŽv)Ž,b@hâ´K§i ²:ÞÖzY=n¬uÒë'¾·jëz}Dñ8ÂÉh•´ ÝÑ %aEŽ¿‹Ë=$¿G¹|€?¥Ö—BÙJ/´nx©›F­O^nGxi”ÌÃi\I$Þ;rñ[üHA–·qßÂå;øÙغà] P©@“بR%iö.xÐ:ÿëç^â}ì~jøW?þV/Ü]|¯°ØfîÔˆÞG–´~Šù‚¶t,–`§_`aN{ù-º3£e¡JgÒV'øQ}/$Žúï±HNN…ö~byïˆÜ.H²ÐBk[šÞÐM¡93šµÐn”„’ÚD³L袉h~I`]éLh‰ÅBØfx|éÜ?×NCÀÝé:§[gÌYÂê¾qt·që²Áκ]“äSI°É8´yÅàéÚyrnœ)·Žœ“#¦¡ùSa̽Þ+NäÚ7É]¥ùÉŸ‹Êšÿ>¬K€§•4äžò«¯½›Çß×ûÿ,ØRxoc4ðö ýrÉÉÑçYJÃvû{èæ‚æÚ"ôm0v§)5h¼Jü+õyù¤~!RAhñ9Ì%¢ìQ%©†d¸VÉqòŽ'A#ÝŠ9æBP*1Gð `¨äœ^H]Ozò=ôô iy‚¸#}ë-²|ÎÑÎ@ט›„ŠQ\ƒDV–—WÇ#p™Hxuò ?•àuœPÁ!'ÚèKð\àòk¶ñÒ›ãýL1@—è·\µ*1I…+R,»2Àa^#²1âx†4 !`¸L Ÿ.2ÜI¨ƒ]XÈ”il×ÿòÑÈ?ĶpøæÀúD8^(ç+'÷FÓ}Û>„‡R†”c¬˜º¡=wXô^£*!4…ܲšzÃ…d•àUAÉ+˜ïÑ-$Õ€ CÉ(ÙŸ‚btuÿAà_ú¿74̧v¡4ö–¯[¿Áö¿úŸ#€¹Í`g!*ä [ïL¨ÿÐfÙúYjW£ÿãsí'¨v&ý?O°¯0þŸ¾;°pw¶åzßÉÎ…Æ;®”™jH€Â³½²]_ù?3Î7ΩæÄ‰Y<÷ÕWU‰·;ç¹îÜÓ0ÿÓøÎ“ïmxŒ#€þŒ¢™ßçlî7þï×}çe*ѼÜf%Zcÿ¿;’¦2Œ×°þ¢LïÛNÔÿsTÆù°ÌŸþ¼¯xVa]ã¤z cÛ½Ÿ]Êçÿ•Óô}¾¾OÍÖïgÿúÿòзŠáOœêöi!G ——­KéB–Ø‹{^¢"s•d/>þYU]åü+IþZ?ì Syx¿S_ž×Ÿ‰€&‰ˆa<¤¢{@"ʺi„ÓF(É(Eék‡EHïÓ7„D¥Bý‹” Dz'Æj·êâS&çž ‰’ëøÇ4£]ù¤ó¯ãío"Û þÔ ùCw¤,&ŠA½’Œª0ð§ÿÖ¯Š=,¸DRt1ðŽP½9ïðò]|ý–+(=¾½ ‹* ÝûÔ&…àK"‡ÖœSEøk¯É‘C¿Û,ùë—øiËêØ7Î5á­ÐdC ”´Àû”Dn‰¶\B6¶n¸FôòFÆHæäáØjEhŠ’Ÿô°uÚÓ½wî|ŽÕâ&`ØCØžc\Д ȅ܇f‘B`QÔ,Ú…¦Joo¶Ây‘ ÷*øPŠsva\œš”YœNßN¤/ü8h‚÷¿`Øc ¹«hæ÷¨s÷hú‡æ¿rg怅™¢‹F¸smΣ3Èf¨(·Ž&Ñæøý§:<®i↶ÍwÅòjrð[ Tu$jâAÉŸxY|íX¡[ ›•ðþY¡i…õbA»5Ô3IŽP¿@$œäÔˆcGqÒ üÒ^Œ9Ľ¦À(¤J£BòPÐÈ€D.!ÚpdÊ“j+`©2E0[\CHžƒª¢n¤’ЮÐ\f´XuÈŠ¸"ªHR¼¼ÑÊZþøÈõdˆZ› …xàj,1¡ÁÕTýŠ[Œ±¼Ht<}'ìÓ1bÎEC6¼‰ÂpÕ È§vêÑQU0¬ª4C_]ïmè¿jX¾ÁëJú±Ÿ‚mÁßýmüáÐqÌÊñc"üêɘ'à`/aG.´—€;·7…´.9Ë.ê—Ö¨ÿe‰¶taКÐWÀ>yð÷è§ÈOý\ˆñ‘H3Êýû p!Óç@t©ÊC´ÿPÿöÓü±ÿèqÏš7ï¯ËÞ6yα7ÈþÂúÌ ƒÊ†ÔòSn ò@¦:Ó©Åk#§§>1¸DÑðÌ`Öð]©ÿQúßFàvØ?¼CŸ»üÏúâýk™/í>êÙÚlN4¤™ê)ŒÌÛ™Ù<Ò–Ù\”Ùñ×€ìûs°˜Úʵ×$"UÝ~~²wÙ3yýëÌy‰Žÿϯyÿ&>”%:+ç“pFàzæ³s€Ù\pŒÞž)^•ÇûØ3K|ö¹ïþì§ùõ›)9³í™ûÓ·uõ¹ïaû(# BÊÆ(C[¡t.cטIÞÚȘ6YšŠ¥ô–âH#;ëÞÇÜ5R¿Ni`EÓ»Z=&öü¼>}¾4öò¢þéYÛv°ƒŒDøÊ/Þåè­s;£Yïüø¿}‡Õ[ ýyáè ]ù¢J“Uiò¡IÈë™y•¬ÑEýÖÕ¨ä~Ö™eŸunL¹Ê3cNò‘ùÖSóóq”ÈÁ) »Ãx¹ë`?0»÷37z øÒÖ=.¬ßÏèºscû0Óž(ecleëämýeë”­á…H©±qt!»õ©Ÿ «œÿ 5ÉDùXæÒþÞ׋ò0<ØÁ¶cöèÏá©=¢,aõï2Ò ôŽ™#Cñá‡Bu<'R=|<ÎGu¬¦íY÷<:ú|rŒÈ‡,¦}gê2Àä<L– —“U€ü}qúX¨Ð6p§‰”';œ4SDî$©ØYßþ­p='á*×8-Ÿm.AãüÞ¥ H þ*‘ï6i¸O­r¼tJ>èºÀoÚ=Õ*$”"z²ÊúPÀ"!¡à̤Ãi5Hb\†P‘Š$„æE‡Y(J™Ä¸î‘áO3è&œ]ÈcF"sÐ2½>¤0€¶¦MøZ)Û\ÇŽ‰zÓ#í[ÁÅRðÍ9ÞԜмSX l r]ÅpX8;é¨ÄrŠwæo‘øÆêf¹¼Þžð£ß¸Ç×µÃïeÛSRC*,z£¡''G¤Ð7}DEšá½áO¾Ãº8©wQrONëBãNQG-þšúH’-FÛ®h¹G³yƒ´9©ù˜—(-™¦3m6è¶#õŽš¡¥ÐHBDÑ¢4$´4¤,àŠ¦)·Eh4Þ¡Ëm¨q¸IÓ,`ù:´Ÿÿ*z÷O¢’(ò·áñoÀ¹B7¹Ž?ÑÖ·F/ËSdf¢ïQO²A—R¨e'Ü;6èìÒxpf¬»lçêsT™×N+8)³t×\îQŸt¸ýZÖ¸%¤µ ½´5’ú²ãëýù'YŸY{ôÿ®Ùž¶Ü~¿pÜý ÜÆ8n—$iX懰.°V&x}Ã*Ag°PX*txUЗH ÝBC"!!M>FüÇû­"è«’T"%FUP$ÆeìoR]Ž(æx/¤æ¼Ob¡4!u±RÛ9wA‹ E¬x˜*:õòëÉ¥;_¯c"±Ê|ñ ¢BiÔ8ŠE[.6±'†ï#”m¤S Ç5š*¸"²>žÚï8fv&q’ý gŠê—¨¿ zœ{ŸÇ7[xÿ[Z e3Þàüÿp°:?y»S„wN…ÜÂSsdy–/ hö#”+˜FšdŠ6l‹¨ÿQÀ">ªoDêššÀÉ©@[Õ32®'*©†)-@ªïПúϾ5Í»m⎠¶3½*Ï‹æß7pNþç¿üW©4T4ÒwÈPû´Í@ÆÅ»D*˜ìµž‰ûµ$€9nép•0EüÐ?¤ØúŸ”Fˆ÷:ðª{Vtþp}WÙ²¿VÉ;úãý˜GþZ»F+@t6§ŠÂt¦&Ìa$,ÊN»võÜq ^Ÿã ô¯sŒá÷]d÷º¯­×oúþƒÿ;?†ó,À|=®|º.ãsØ!ÌUj™Ï÷ËxŽ19CÁµd–OÜ^äI÷½mN̰ ð¯üÙ»éÞ×nÈÄèÖ=5_½ÑÈÑ›ôçRà&ýyÁ3´¯§H­ìNs”È›B^;Í-V#r Ò Ö…ƒVWY>€|©ŠsÚHøz«"§  1o Ç{Ï„Ÿ ŸÏìíö);ØÁ>}»ˆùêÄWþÌÍ‹þxüO6¼ó7Ÿr÷k+$A6DzårìÏëꬒ‰±¬4̰_Âì…q2´@c¥2»°Cõ™·›˜.ã£Ø¦‚ÿ4µNd§ô1 ëÎ,yêtëPÛÀ㸋‚¼6ÊÚHËaÒ癕ÿ¡`µ®Í}W"ûm¯Îö=3úX†:ûBâÀ¡îì†Zyü§q¶ ާGÚ„7‘cmü¯þéaBV!Òz–Á³1÷pÌ·ì™6w„¸_ÿçŽ+žS¢#‰àêÞQ®Ò="¾¦!Âj!hŽ“w}€tY@kä“àôH(ËõRã§jx˜÷-å‘U•ˆšˆV|ùrPü"S~ï·ÃÁvFD¿'` ʼn”œã#ÅJ² ÎÑ*KÝDJušpl Þ QªÔŒO®ŸáB$Ò (Õkƒ§¢Jök8q½D.ÒÖ¸b½E´©ËxM‘B ZåþA\C~Áµºœ¼þb=~ˆ˜I:90-$«½‹c-;ÚT‚ƒ—À|K¿^ѲÈ1pZà¶ ·N iy{þúÓîåŸÑ+nwšc~ýÖ÷X/zRq´U| RM ¡é2)wX{NëJr'kG꜔CÚ²QpuNc`)`ÑÎ N+ÐěŤõ‚Eg´²(gÏ4ž"Z3;«+,€¤ í²ÁW t%à·‚ˆr¢J^‡Óí(ÁÑqÈ¥«JÈ”# Êíã¸?‚6‚r‹dG€àvBñP Hµ9~aMtŸ"˜‡Mõ‹GìÁ Y„Rª´~ý!#E„u W²ª².7!k~wàñOŒõ&~³PÔ(Ù9jàvé?"½T€%sçñäÐŽ=q8;gP–…Åû¿¬õÀáï¦í×}i{Ë& Ö ›[ÐGÄHlØÊ»xr([ôd‰ä!x”¿zYÄä…„£Ò 4$s¤Û¢)£©’ ½Ñ¸¢ª'MÔµ*Tà‘ »45@3$~·©D°¬TBñ%á$ñš^ÀÑKÐ&Ä0d TÌF-Ô â=Šù‡¨Ä<„¡m÷%ý¿Ó'à?•#ÃK¯ÞRÒf¤UhŽ#E…öÀ‘X¢lŒt‘ñ³ˆå–š`¸1Øi#¥Ñ?Ž ½ŒÑ® ŸcØ÷б$ð^ñ[üÿïÎ{œv:×xƒ³eÙ[?ØKÙ‘Ç»XÁHqLƒ,¢âôK¡T $ÆA‹§hæƒ"NªË}4}4óy.>i²Ç~%Ò$&YÿìUÞ߯þÜùm´Ùsï²ø¦Žä¬çÍ›oØ<úÏ~鯌pj£ý£ŒE’D{"2ÂÿÏ& HhH…Õ6k ž¾šSÞšœx×Iø_‘úŸEýÏ•˜m‹sÁ8Ë»¨®KÏ|®{;|¼“ù¹¤‚öôü<€ ßÙ;·ÌS)àx%;I3ìœx>-{kY@Æç5œ‡é!ùt¬_;†ùÌùªí–ç~i|{ ÀÇçà2›»ÔÖø¤||KfòÿT€ ýÎTöÓ;üJøæÞ?›}Žñå_þ7ï}öƒ´¿ÿW¾ëÖ»¿þóGºyXÈO éHB!y†ƒˆ‚e—˜û2¦K¾Vm•É»c7¬í?ØÁöÃa7‚ðó¿rC’|^cÍ©òù_8åÖ—t ÛG™æXéÎŒþLiŽ#R9oc"ž/­Nz}”¡¢‘pÓòÕ¨d+^ÙiuæÅ§hÿy¾›™LÍðñ:àqù`¯Œ½ýÇO?íKx%ìwþ·ÇÜúêËÎù;=ÝÃBéb”gGèÏmŒš´­S:GB*ªßÕP·IMC’Œ›ù§ýz3_‡«õæPv°—6 G ¤„Äì¢AÚ‚6†¥ Èùܤ.×f¨Àì`t|j·ôÙµëR{Ñ…»N¯PÈ>QÁ¾”àî‰P|R0ƒ¾L©T m"úZ…‚!§€ë,ÂþC^ŸH€Ý¹Á—¸OA$Yüˆ芄’• úTÇ“Õ(~¯ÎirÏû ÷Yž™YH›Ì\Õiîˆú—Ú÷x4±ˆÄóV§©yH/WU“Jp«jÕ- Åj?çÑÑù Ó^pÍ Ø±¸6«O2q¾Þ±ÄTçª …êqó˜½,YÜRäÍ/"·~ ô6ÿéïüí—>¯¸½ÞÞ⯿ÆãÕ%·¥P²(V $*š ê©tˆ+É é Í‚E ¨+)‡ôxƒT™shªÜyëN“Œ… MR‹íÑ]Ví}m+A ðhg4ýš¦­ÑË­Ò4§´§o¡·_Cî(ØVýûÈ…SÎ…‹¶¸}$¬Z Õ MƒÅäBÖ,ÈÆ±÷¿A¶\òÿ”óNwæÜYÕ`ügØ\Â_ÆÈã°DßeÏïl  ¤À²ÐîÀFÑ­á[ÅSH%´UMÖÛÂÓ3£¿ÌØí¨Ó'I‘eÃ&;Û «pgAüNŸWdÑÒ.£Í‚±ºDƒ• b©D9.H tXzèÝ'ø¦Þ|ÓNzçÿû‘%›;Ñ^9,ÀõmD#[D kˆ‡”¿E¤jrCÍBÎ_@mA#í¸ž¤,¢™³É•–hËZ¬ÊÔW^â÷uFhEh¥‘‰ BBS£ž“W×¢^ÿ*ø_£kµ™ä!30䙸’ºâ…6ï›}ÿ¯V$«%€äHcèÊà8ÁÑ=tqo´çˆ^âÍ]ÐSÒæ ûà;.à ¬“ÿŽüÿÙ{·˜Y²,¿ë·ÖÞ™ù]έêÔ¥{º§§{˜éq±laaÅ‹-‹ã±±,BÂÂñ€0âÅâ YBØð²°dñ‚@²,Û °­Á šö0cÄLWµ{¦úV×SUç»ä%bï½xX;"#óû¾S—®Su.¹¾“'#"##㲯ëÿ_ÿåÀMè &`}]H ²í[Æm:IÑ# ÖPÎ{} VbeQÈö;ãÅÖ…ÃïSÙ«¿ÒqøÍÓÂý%ÜÏÊ[±Ð¡)B˜™Ð"ôTÀæ#ƒ4ÿ6ŠÁ ~PSrÛ¨þ¦Ö…¨ƒò†ŒÒþCJ§oþ»¿é'y˜G_k¿ôÕÿd\.¶E¹ø1üî×qŸÔ”SÃöíß@nTÔ¦ òÐ CŽ{&Ïèºèÿˆ;ë{Û¸üß’¦Àõ£€ÿ¬ó:"À> `¸Öák²wÙÛ*lï•U@^Àl®¶U6ù×ÛðßY¯¬ e︓÷á.ÉGÞ¢kH6ýtoÃgf{$€qÝöîú´ˆÕÏuÿÁ)gõÚ§óK/ºõF}~~Gy÷½‡ûËåëæN\¼?y»§ÈÞûÕ¥ýôŸ¸¥ßëX¼iïªtƒGðCMãZ,÷>D+ûr‡¥¯Ë ¬.“¥¦Jƒ'o’ñ?à;ØÁžp{ê w¾5{¦#™Ko4§J<©Î„&¢­ 3Ð9Ä…—Ö‚FH+õtQHËâR6ÒÊÈ˂ΆÜ6 ÁeÌKgˆêØj¬9ÌËžb@±QÂ|ˆ–¼Ò î¦ÄC§øÄØo;èSx"ló~â§þØ)'_m0 ½È›‚D¡?Ëôç5ÍÆ²Ð×(ÿÜÖRgž;*²“*oê RÓjè*$í2ö¤¨SP€­oŽýwnX?ØÁž1ëÏ~ “#23D a(Äizlv³ tV#Æ f5xYgúÓèìkdØ÷à5þDöÞ/©^ÃÁ³‘ª’ƒ*NŒ¬Ý1AmÛNN¾?Ji^ýp}ó©OpHæ¼m¤U*8 ¢^ƬZ{†“bU*C´ÜpL»æœ†²8¬ØXzA²⼪X3«‘ ÞY2—x—•73ÔÔeC^ò‚¹¦®kâcDTâ*fÃõÖˆQ¦ UÆ Ôqeh2s)z3Õ†k+¢V“sÐÓ[ÈñÏ¢³oò7ÞúU¤g'úÿåö¯¿Å²íˆ+h“±ÑBLÐf¡ ä"h/°É¤±3茌˃{zŽŠ¥±âwõâ7¸äŒa”>“Ök¢œ±ÚDN›ªCyHà’. Ýé2!EÔŽˆë[hsmȬá"Ÿ¡›KÊÚXwóóÌ2w’¡Q+‡¥F`›HF(…f³åÂ;ÿÈëLÿpùИ+͹‘\$U}‚iŠ—Á¦Ñ¿ƒöz#»>§eônÜŽˆåý ù݈]ºä'M@%XõððÒ¸<ëiOòŠÒD¡+Ó8>mèkZŒe_8¹ÕÓ|I)ý»™´46#ž9‚¹ž丠/%ä…‰…°Zc›aÃ<òÚÃKÿÎsn/l`sži¼¤†]f–@“ ³bô­ÒZ hCnZ‚¶¨6D ÈK¡HG¤#’@"­´´ÒÐ¥)³Ô³'ˆ9‘À‹‘ky^#ã¤6¹Å /FI…^¶€e¨ýР˜¯æã-NbHA@ÅÆâ+•@íb4xJÀ¡œ{Ô¿í¼§…ƒ@ã²Ôß;Äú߈Œ ¯2FMÊÐ&7@kÈñ1Ì¿ ñ.ºèaÖ’Û—!þ,Âm,?„Ù?AÊkˆõ° ”¤žZg¼ Úk Šº=aƒºŸá=€dõ}¸Hh#–'¾(Ûßmô¯Ë¿r4•=<Ø£ì[kåÛ/'¬7NoÒÒøíM!´ž®eU<Òi Uú_ŠG÷;Í%ü#ÞO… œJMEœ ƒ“½´l§ IDATiÌÌI4s°ÿü§ßÛ«ÀÎüXÂn0¤ö#:ŸCû׿òï€þSó±^Oe¤0ô߯ùO‰ã^• p îXçP"B©QÖÅ€v "?2úŸ© Àt?¶ËÃ1m8ò0Î߃©¯é: VïEë…ŽÝ<ôÀvÇÚÈšÞÆg¹O·ùêÿ{`¸™¾ª¢ÓÙÂÕ³­ó‘áÃD·Ê “¹îüÄ1W »é¾Øþ¢Ý¸þÙÛìæçãG[âÄx}2% X½Bïã5€­„”Ád?ÛÞ‘½zLvýòþú†&_eþr´ßõ^xæ£ÿsgÜýÖœWþÅcY½Ý“;£½¥5P« ¿ >Û{ª Ïzô?ÀúžîÖ¼*œ¿Ñ#ŒÍƒäNÐéÍD¾,ãÀ6]V'·þ N 蜵†T‰òÞ™ÑN v‚Œ“%&§±cšv@×uF×­쉲g½Þ|\[þ¸gùVrpYX¿•²šZC£ü%nÓflÓkl£ü=½ã@ÒeÅ'Žˆ¡.õ\ðí½UéãÔ±C½;Øsl¡¼²Z¡öU‰  Š5XTh3´m %yÄ’'”®€c­ÿƒNŽ+3üÇ<å?ا²êcÛª¨Gþ‹0¦¼ßâ_Ð󛲆ÀIx¦AƒG½Édª#Jv’I£oTeɶ)c`ôBê(·º#QZ¬F»ïH悼øUHkäƒmÅ D/ÍóµÿÝœˆ*(Ù÷×EÒùýV‚…‹AŠ $Å% ‹çù2x¾ÍäñNÔÄåµ}|j¨eþÊ÷ÿÖgù”¾pû©ù üÎâm.›5q Mo¬¤§I†–à© 4õ躣ô™°6BçmXèñ\èZ\2ÜŒ¬Š ¨@ẪÎ`V¼L¬æÉX”5©¼Ëê¸'јò¼OcK4õHkR&ÐÖ+‚œL ["©#œìl Y””àÃUF:á| ——ëoŒF 1z56±gœ‹u.W΃£¬@`Uöò¯*Ä‚(ŒÚµ¥‚²Ù¶®ÊVÖ\ )ròsÄø t§o"‹wÑ#C6 .­’0pÿbTNo)Ê!prÜ`‹2Jû·QÈ F çEnV‚–èì±ÃÞ^O¿éç#н„ï#ý7ù¯åËÏ«X>Ñö¥ñŸnXÁ‰Â¢Àjm€h‚©Û•eN”9Á‘H¤Åœxô¶DeM´ Ñz‚$bYJ®¤/ J,“¨¤…6(É<âü¸î,‚«ƒÕ¨Ú¦©)´ú˜?àÙVÉCÄ?µ4<²è ¦à÷Ø=|Âþm_ýfì7&ýÇÄS-ˆ$8Ìó%xÖ—è)hÜOQ4!ÚS$c.3ã,‰¤Q¯“âÑù†s0·]äÜ®w½:lÚI•=U0Ø¿u[jNŸØîdÁ.½ý}eh7Æùea•&)1ádµl¾ W¦Iê‘ýŠ?÷0\ê±Õ@ÍÓküGýGî£ l‰ôêšF]²ÿ>”¥¡Xø0Èû‹jWæÚ:ݸ¿Ó“o¿ô•¿Ä‚—zcF@|¸+u~Ïd„‰·c± @*ø|• öž£ŒK¥’Ôt—0™l Àþà/±zÎ~=ˆþŸ¶—8|{»ÌøSÛëŸlý6“6MI¾ÇV5¾ÞQ“+íÑô/{ÛÆö¾h e× ÙÀi×¶sâçå)j¦ÝG?MÛÔ±®ÑþfÛCLÜp»%ëªsøó¬:ãì|²0Øß9— b[mò½I]‘mI”ê3˜>ÂÝùÙc¹¬›–÷[»üŸ¿ù™?yç™wú.ßì9ùé–ã¯4B2.Ø•x$„™“Kï©ë$nÉ‹k°¤Øxã ¦¸cÚîÔ}êXclSêg `ÿ´ïÙë‡Fð¿Ü@`²^—¹î}ù`;ØÁ>=Õ€g=úý^â§ÿøm¯Dº³Œ.„°ú‹Âü¥@X(yYH—iAÌ0ßÊ”ì¶1ÏM”q½ô•õ6°ÛF™ÿ­:Åsá`ìæ/¯Œ¶‰ò£Àv}\ž¾ï/ì±Ø—þðÉ} O„½ýËKîÿ'_ièÎ2óÃHŽÉ×''ô—…¸ðú“ûm¤¢¬ßÊC•~ ͆%,.C=Ë6:,†:5:1®,ÞT®DþïáA;Ÿì`Ϩuïý{nA¿™O¨ìÉ©1‰¨B ™m`±¤lVÐ%èñHf«Ñÿ[?Õ6ht"ìI5©RöÂ.°¯ íà'ã j'$Qßeˆz× ô(ÎWG“ï<|—Ɇ½ÅiY¼Z3€œ£D¨Ž)2ö=Qš=]FXÃ,9ö®â„Ò4Š-àä64sÈ=ryçkè³8™àv@¿þ»‘Ó#Êw¾MþGK§ëÞò¨Åµ­MÈ5r)ˆ·IU¶RVÑ®!]Áêœÿî­Ä{éâ3|@_¼Íµd”¶Pº ¥`Rè)dÉ„bäÒS(hq×{V ]â ô$Bâ²z?~+aDæ/+Æ ¸42è%M³¦E"æ`el‰á¾ó@+šæY%‚¬ˆqCh{âl‰4Ðr‰6 9`Q\>_‚pïVp²žvB­x4qU1ÔñR¯ÈZ¹=…3zl"Žo+Å_â왤Ž#X§°$ ã­i<ž—3ëÀ.ß§Ì>ð¯ Á°Y‚F=}E° ÁñÜ£ÆYfºï~ Šž':‹äâd \l„îû«ü«ÌÁ>L”.2S¡eK^²<…<`Êêeþ.Á{Ž„—Ñtâ-~kõÖçV.Ÿd›¬äèNß"p´1rk4E™Ñ`í 䈙aA”XZ‹^fSŠ)s+=š×ÌJç~ÝšþDLX¥B%Š“™¢l2"ʬ5Ž›H¦PD¹HÅs–«+Õ àýÄ®bÕQ]`ØE­ì;^áí÷3áV*05‚ƒ“cŒsx›¼¨Ñ¥eˆ*PtHåqI‘#'ÁXbeI.¸‹”‡Øæ è×ÞEï{,l¥›­Èd®SÓƒL‰ ¨²ºJq’„é^´§l‡oÆíݳ×Ûƒüÿ'±ðí5ùd„‡ïô´ HZ(fÄ~€(=¿©´Ž¹mËÙ¬‚i®¼áJ5Z›øÔÿý×¾mªI˜¬³·ÝmW–µí)¶?Ueýw¢à«#a{©vµ9™šlÇŸÓ¸ï)`«0´®²e×¶L ¦\+RК&ÊÇïÛsÚÂÈ@vdý÷£ÿÇk2®nó/O®üšõϤìEœ²óLÚ + ÑdÃt8_Û8©+²³Ãä˜2®k[é_¹¾µÛžÏä7‡†têCÚ^˜a¶i_nH`{‹vÇݦ7yòLj³û ¦à¿W¶þq²a™ ïBvç1: Õší¿FðÈßø3wžyé€Õ[‰Ò«·“…™Kmäe¬®Ž\15=k‚\ßGnoõ3«¾\_Ö9¨ËlƒºìÚ”­;8È”–a×÷UÙ?ì`;ØghO-àyˆþÏk#- ç¿Ó•Òëw:Ò…±z³#,”´*ä•¡3Á’Ð-kÇ•¨)†—/mœ¼ó*}íÄòö}%÷Ôv"˜÷¢™‡×unûËûÂìηf_ô)<¶~7ñÊ:fó~¢?Ï”MulEÞ¥ŸÚÛÁ‰2 GUž6€´Bi‡ºdã`ÑóBÉîò$WTÉ@¦ªp…Pö’{›ý÷+ÒQ\3¸Ü'êáÁž1Ó¾…RÙlÒ;ð“€p q!'éIÍ%Ò~ˆ´¡Ù ]¡ôtÂŽ߯L:6£NRÕŒ€'Í®sxÉø_ýü#œcŸ«í‘&ÔÛHíàêãœ÷¤ÑnÀàõК¡LWðÄâ¨BYôáÈ, §§ØIí5"ŽÈíŸAN¾†é)”vù¾eé j‡G:—9–æ$›”\d@Ë(‘¨ËWÊÀ¿ à(ŠdƒäÇÿÎÅŠ¿ןò!<™ö³‹—ùá븜-¹½œqÔKnu…7H1f1‹>WÒ/´h:%4Ei¥ïEÚW~ž¦Oôo}„ F…j佚Rh-Wé}¡]@{'3¿Ÿiï½Sš“W‘ÙWP½ëE+? Y~{ÿmdy‰ñ!扜1{lM¢¢"1`Z Z¡–ÓP‰"VË|, =.È1HÓ`9c—…æÂÕ&¬ÃL: •½UAJ‘*å¿Èõ8‚4Ë[&솻1¯ox\¶ïÁÛ÷°_ù¤ÅË‘Ÿù“·>ŸÓübí×þòÛåîï™Kœ+«w{úóbÍi¼.äeç•yðõªƒû%™«ÍUB¹e¼2 ÿü_ä¸ó4v°ƒì)±§–ð¬Gÿtd6ïgæ/ú‡…îÃì¹ÉäqÔ±y(äu¦?w#¯=_y˜‰³×j„ré|’^6ú‹0ªH”mØo 5?ÚMßµQýL¶MíI>‡v÷ŸmâÌǵþÒ'È‹W]*¼ß$˜ç‹Z»dìú½DQG²öïö¢þ;£þG&éCª·Ña12Fó.ct§níÎww†õûÀþ•èÿý)ÂÁöX÷ý?‡ôødžIˆ%¬ï 7Ð(Ö(È Çp4C­ÅD±”ÆÈh«Nuw8Õ|”Å<ï¨Öh޼s<‹™ÝÜ€}àþZBÀ“üOmG“–­ón6õèxc»ßM·iýmw_Óª­Luè ûîõËîƒmZE4Rˆè­/!³/#4МAþ²yÇ÷áôçÑÙ7@çhÙtNÎklù}Xˆ‚]dÊ¿Å@ÿ ç|ÉbœGÁÐh„\)G'2ØÊ¨ì0^‡ârÑ&žÂj£ü—·Ÿ½ïŽ_â7Â<Ú_7¬´Ðk¢·L¬ù,ÄŒhQ1õÀô(F™CÓÃ,™Ë+[fvñ–2Å ÂÌŒT`nÂÜ„¾dÚ óœ™•B!±è 3ú¾0ß´ÌÖ·hï“x §D”KkÂÅ%áƒ÷Ñ½M(®ª"I oج3Öf-ÄÆÐÆ UFØÐâ’ýªm !fÂé‚pïKÈì’/àƒ7±| Þ/‚”Z¦…íÀÉÌÉ%³âàÿ‹ äî— ½…¤ äƒSìÒ/r©@£1„][2Ê… ©Gο­ e¶@^x;½‡Èšöá–ôVHÉÓ14ŠpÞA—…[ÇB\læh.¼üBàüRéúBˆÊɉþÁN3PXËJ¹(È{=Úý6vú" ´€Âw–?úÂÊê“dë¼âü«w¾Ô@o„ypp±x{SOLä°!Ò­!ZC&- `æj’ˆ%­‰¥sÀr£„¡„¾W2Ð;q&V5 ÄËçre„°h³‚аh”`„\cÀÜ]¬E*à¿Åáuòª¹ãÜ¥ªçƒ“v€ÿJ®°õq»ÔüלA²GÐW¥ ×GÂõ»RpQöz"Ūü­  X-¡_!#ÇŒ6 ˜)t†m¨cªà õ8†yÎ~=–¢ì¦fõ¾[Mï gå(%DÊÐ<Îâv0àç;å­ëlØÃìþ¥RËIM1²zYuÙƒA0AëºTÀ¥ÈÅ ^ÎxS­<•:²R嘇y³rÅWµŸvo‡°‹õ]S=ÊsþËw•…)àæÈÿ- `jûÑÜÛüñ÷ªLú+]d'|÷oø†"ãqà÷J0õtÈd|ë§T¥‘bÛhl?ííZÝe{–¶ý?o§W¹½ÖýõÏήW˜bÍ#€l¹žl1ù¬Ç’c“bùÅw%{^À+Ëð?¾ã߸ó\€ÿ«·§_oåôgZ/GY¾Éë,Í€%Wt}¸õeƒbk}ÁZÃò$(rôÛijÚWíF^(9ío†à-Øyz;¾]ö–¯[?ØÁv°ŸÐžJÀóý.éAZé2Ó9¥yóÀéî%¹/.;vbÅ;¯dôkÛæ&Ï[Pr`M—‰|­· dIlÈš£|œ|O;´Éúh‡Žê‰·ç¡î|[þ¸§ôÆü¥ÈæýL^Â\ÑꌲñH°â²ÿ|`ˆ@˜ ¬œ@â *ÈXˆP 5‡ç´ޕ9$²S'eÈ_8åïN¤wrKM_×9-vçî;Ø3iý+BrÄ+ÐXÓ3¤ï°\ 5€8PFDÚ9è @®ÞÇV.I^}+»sý’ 2ÏÈš"ä¬÷¾Qä@xL6:_&Û¤"dOˆÿYXUËÞÎ%î_¯]¿ùÊ1]^u'LhðâUŸÉÄI;HLG™Àq„»÷ÓŸ'è«îXn.A Ö®¡½ƒ6/¢á6h2G›—(ó{ÈüǔؓPòXvhT¬4îÀ´BÑ‚¼(43H6”U‹Ì"=ò_'ÏyDå•ÔL‘\ø›Gð@Ÿ­òp+´üòÿ÷:—G12«X>£ÎBÈTÐ씹@×(šŒÔ¸ Àfmôéç@ï„*+xìÍXŠ °´Z.4ˆ-,W0›Óœ6¶„¨Q‚ÌQ{-wÑô]&4!G¤ôR`½.l6Jœ'G0S#Ö‚;Ò‚™«GCŽ"Üù2vú{Ñx± Œß@6ßEºŒõâÑûpÅ*˜§h =ŽÈÝŸBnÿ>Dï@9§ðë°zYgÊ¦Ž½ê!¤‚žÖ¤3lÐ#AN¹õSðÂïCç÷]R¯Ӭ_‡M¢_©sÒÃe'<¸ðzwëÄÎ1Àc¡›Šš$ÄèѲ:q0ræP%wƒ‚EW<8Ë”^•!Ýšr÷²8ã½Rx/žEô‰´—6Æf.„w—†^¬ÂBˆ±(Q„3Ž™a¢4vL+$†ZrPOKHH‰Ä’P]£Ùn BÀUKDêþE(IÐ"ͼ~t½QŠr•.C—ü³y*1 Q=ê?àÇàdV;‚ûŽì߉êÿffH)Ú„Þîaº†üžb—[pÞÉŽžÝëªA)XɈ&‡ÈýŒ÷-¥@ïÊZðt±·Lj{.”PIê5PŠû+ÆkWä¨ú45ní¿ÌYFO‹÷W]¦\4Ið44Ÿr¬ðÝC €mãÃ9¬o+}_L• ¡w>n íá¼1‚óMÐRI(Åø{ÿ÷Y`*ÓoUõ毪û±¦)õ€fHµW•ô¶„{ÿÒ¨çPØŒJ–í}?¬ß}K7Ü·I9»æƒÏÙnBímoyôîW°ökŽãw?3Û?‰ýåÁk8¼Ê½ß3ׯýk·Ÿ‹|¯ýyæëú¶ÌïGºóLs[G³šþ¸x €ëvC ×qyÀNªÊëÔ5²“·ªÉ{Jåêòˆ¥Lš/«J5Ómc¿.z;ØÁö)í©$<ÑÿÌ_,îG–ï&=í­H9à`{–¬t.I;hJ=s€Í9äè‰y%VçFA mn“gk,~¸Š†+õEjÅ””ðÍßãÓì×ÿ_Ê»¥:Øž-ðñ‹°ë"þ…*¼P? ? <»$÷µÞDwÜ.Úõ›§Çw¬ª§p‡íb£ÇQ‚`Q°™ G·‘x‘[HI JÖ»Hi=âpO{d;@ôƒ–I„XR°€…ÀÑ1.é~K_û&ñtA÷Ú¯qùÝž%˜£l#»aTåQRQ¨ñwn}Š WH IDATûü„ÛÏÅ9opÉéîŸ*±çËžÐeâ¦P´/Ä¿'Eˆ=Ä’Ôâ b* ½{s€%¨zÔ15› Ur# 48àT š¡‰„ÙŒ8?&ÆB˜T$WòGðT*I ½¢% TíLYe]”ËÎù"M~x¶ Áшó:•¦ý±½…•Åç?Ä⥧xÄàÆ£‚¦…æ‚¾ŠÆSJ>Áfï@û}—®êR#C]‰tO5ªÙ;þ2Íü«Èì6VVX;'üæŽuÖ¨9ÞÍ»Ÿ\üZ›wO…œÝ¿îŒ„6z'"£,²ˆ«XQ›ë3tÙ$lýyÞò›ÏVö‹Omóo¾Xß„ÞçÈY•&š¥)´)3K™UX‰h‘H¢4Ò€yy P<—Þ†öFHâóìâÎ`¯7ŒHÍ&ËUá4§sÈ&ˆ›\X÷þÌûRE)¥Ðeù› Ì¡'¯{#èVößÁ—=‘ƒâóVo¾)7˜; hAneÂ×_…Ó¯a¿O\ÿ€œ3rÚB”‹룷Áà+È¢Cî:”/³ËÿH6$*ÄZvC@B¬åÙô¥5,‚æìµ/CNµà)ØÒ3ÞçNC¡´bˆ$ôv!|õU¸õeììðƒw) ½&×öÇ·C €oì×àKÆ{»p’á¬)ÌÌLI­ A#š×­hÞÅÿ‡ÿÍ\Ê_Ø R#.§É óWÀ‘ñ‰Ý4?~ éŸÿæ±+ë¿/õ¿þ_ý¿Ë$@Ü+7âúsíý„‘@jxäùáÅÆ?‡ûËøîætÓ2I0¤…D˜>`£ª J6^Í®üÿX n6cŸÏ£@L¡}€ »&ð/@½ßµóq²…ì’{¯r3Òï4ãý–ˆáäaÌ=Û²lzeüÿê}}Âm¯_p„\ÛW\ÕŒ¶NŸÜÔáöXl¿ÐN½Ó¡é+}é_9ygG×Ûù÷:ûð·Ör÷wÏé/ ýY&Ì…´,¤µ¡­§UÎkW-J—¥bie›ÊuL“<(TLdš"yÀH&*û*®SîŽ_wêÇÝï¿Õ<=EUì`;Ø“mO`~?<7Ìym¼óËKf÷…ÕÛ =a&ä±®QÉyãÌ6m¶¿wlÐ?,XÞF/oóÙØ8Ébd­yt­$ùÀš†Žk$OOüQc Cö…Úo;èSx"lý ñÊ¿tÌüÅ€™1»§´wm…xýyñÁãÊŒ³ÖÉͦÔhþ0i Î|YjäBaK@¨|ëa`8]žÔ7›D(\QÞ.`º}j‡úu°çȬ¬¡]yd™FŠÎA µsD3Äô…‘ „Ë+rº„nYóÇÖHc|ßÁ¤×מßsD:Ôqû‰Íš ~kE|½K³ÑD!ÖÑj”}™äö}ÖÈ"À`îl½nßuÀí±t·œ9@yÑaÙ‚î2t>fk ªR Ú7)ù“XOIoÁêÖ%¬(jÐ%™r™`¹[G¢RxŠÅ#ʪ/X„6ztE.Œ®aH€Õôð×^}ö¢4_@øÆ?~ÈÛ³D/ðð¢'ö…¢†©aQÈÕ œ4!oÊbviÞD<ª¸!hLÈõ>:>î’å#ˆjRcüó&@ Ú&â\ˆ¢`Ѫ·‰â„cÓ€ER@$xe­ àI:çØôThæÐs¹ô54bœD!ª¢ö`=ä ô$fÂŽfíuŽ[«ïb×`J™auœªÄጣ€<uT «ç3‡T  ‚4î?š ·3¤"¤\Ýìâך¹o_n\‰-4“j9íxÜ«_+¿ÖÏýšJ_³ ,¿Æ?²O?‹v+¢0;ËhñôRÇà8z~{ ДˆÊŒ( ¶Ö…@Ôà¢Á:”DÈžš$AC¨²åê’ÿ"u-”l,L9åX•>+*ÂÉ\‰GBTe>‚BÊÐ׈ù£F™ÏdKŠQÁÿ¡yÞUøŒú<5t®p뛄Åï¥Ø1ùèGh4ôË¿àÅñ¯SÞ/ÞÈŒ“ÿŒÜSÂWþ¬ßÞyƒr™!‚´‚Ìf 2Ÿcº@“ˆ µŠ%„Þëfî`“¼Û ÂlË»¥ 5ôEd—~‘pô‹¤Ùÿƒ¼ûuÞÍÇn·2üÍ{s ʇ ãl]H­0ë¶7ú1M¤æu³Àû·ßCáôç›1úß»Ëi9Fa&vÁ˜²û>õcíŒå§€ {Ë_ ý…ßõWG¿ Ñüã»Õ1ò>ø_¶Àøü·2ö#ö22À°å#mZF¼s6èH*cü¿°1 NC žEíç2œïöŽÄ† 0=}¬TŠMþ†ïï@¸»oŸ‹ÝØ í|pÓ^u,.r…85Jt HÕ}{Bú½:7ÚiMœXµ½—D)VÆG[†y±8ä½3pÕ÷»wiOL؃ìŸBÛƒ‹Ç×µàÿâ•h_û·O¿ˆý"ìíÿóR^úG,^Žh›ÁŒx@%eâ\±.“Ä'(åM¡¹££ßÖÜ_+ '(&j@—l±“©ÂÌ~Äÿ@PÛúÿ2À¾ Ó¦ulo'Ëì}v°ƒì`ŸÀž:À×éÎ} Ÿ›éL¸ÿûGB:/Ä£Žû‹ x´Úòª í5yÊw^l£•Ó½,ã¤j”³©d€Ar\ö:²Q®f˜`ɶã²ñ¿=;tRO„ÝýÅçƒ<óQÖ})½qñFO §°ç+lÌÁÌ@~÷yWõEKØÖ­Á=ú܆ ×à!»n@8µC½;Ø3jÝoþ,R–ˆ¶1ÐÛ˜¾Šp ¬(òÊ%ë‹«ä VÎ ?„Í;ØÙyiXöÚ£ô¡8xdÕ±BQìA½öË._û°Çˆ7 ²û$6`Ê]ò¼“±†úwÉXmÜ1u+ÖÈœ‹Kjàˆ=Ëi†Å$7§ÝÀw@dÒ™ìï8 Ji7wÕª6^=$-ÞB%¸¤;ç”ò>²^­)¼†Í3„_¿|;¼*HRB2,T¡Û(¬2³&’Î:Ö¿óë”™Þë™7‘ÙL‰Vˆ;uU m„£:ÿîíÌëóg¯ƒ{Q3ÿû½ž‹#EúLH…Ü’ÍåÁ+è/Ás#«âïšAjîäàÁ½sIô >l&DÇÎ&4•$Í_ …h…è²Ñ&h7/;ÚÅ{Ðþ 3Tï "tÝ }Y¿v3E-"Z !°XD$:1À‚rz kØôƪ3š™"RXw¼KvÙ#g?¤—chîB¾ÀÎ~»Ü¸ÌÁ¶¡E-ÜGíÚ–ÀÖ=\üˆO!Þ…tŽ¿AYv7¯ f dwÞõ Yþ˜ÜÞÚçâ lÕ!IÆœÉ&‚“ºìË¥ø¸./Ë1øëx.£2ÀŽòçò°âÑäìégBð¼ë9ñÚâëàèW–½¸<ijL+Ð/„Øæ¹¨™c+t!ÑHC+J±ŒJ UO™²§()=d)u4%Óæ/Å%Ì™8×±êü`•eWh‚ÒäBQe•2›µÐDh7œ pÖeVµ_dlŽU‡4{rÿuŸ±ùÖ!Oô°ŒÍúu*9BD<%Ù÷Èù·±ó7±·ÑO L•QöOÌ£~PÅJÍk¦†Î æ‚8ž!ólvinœ€´˜D ¡ÇXB:G»±æ‚²ì ô9†/CøQšzœ a[‰ þ=Jyº÷\qÍ~r×Ö¯={ä²Ça÷²’z¸{ùžÐõ…hÂQ‚7ç´D\æ¯ÿOOw†6ìþcÄeýõ<Q¼¾É€?Öò?ðŸ¬Î©ÍqÌ`å `˜KßDxŒC‹¿ø­ÿªþÄØ6¸øOåþý•Ljÿ«Òÿ{i®ÿ¶½;t€z±û×»×ìJËïÞ;“!‚ZªóBüÔå2Šþ—+´i'uÖ”Nõ\dœ‹gº¯``W–&'4½¤ÀÿszÀWl2:U¦#öëÀiûôá“AYaT¨ï ïC»?¹æé¼h8ŠÉô>Yë(ØHÏÀ "ŠQÀ&ñîÓ¹Äî\NÇnþ‡÷© @äoüÙ;·¿€óüBìò‡=¯þË'Ì_ Þ?˜¿ÉK# óy¬õN‘Em¼BAæŠõæ}EíWBëã!6Féeå=5QI®^F’ÚKm³wq’kÉiSÜd×¼ì`;Øc²§Š0¿øúŸ~~ec¤ËÂì^C÷a¡t†¥âå² Aè/2–ñ ÕÚåÉ%nU$ eíQËe$Œ)†åšs ñ¹|Iˆø„²íÈv† {ªìyQÏø(Û<ð(ÆÓ¯·l>HH™ :ƒ|BæQ\:ªóI©Öx¥c$Ü Î©ÒVÓg”5[b͘Ÿp ¯Èþ_7<ì`£õ¿ñ2ô«¡ìB½f_&Ø GÐ7d> —ip}ÙLf…ðÖçØÅ;ÏžGÚ1eHo3æŽD*Ù&`Bz£s§L‰ƒ§þ`ŸÐ¦`ý(ý_Á‰TŒåƆóŽæ¾_êm¯Úà›b^Ï, `°®MöÞ?òûƃ³Ê껳HŠt..ð6ˆY„|ýa³qÇÈùØâçXJØò’|‘È‚® é…Hß›‹¬6E8?SâyÏchsK8 ÌfBÅáF@«T¬Ç—„Zø;·ÒOp3Ÿ\{y¾`)3VeMÓõÄ•‘!$s™ÿY=2%$A“QDBvçlÈÐdÈü/în‹ƒýY¡±­BÀðR1wÜ«QŠŠ`›B B ™^úï¡GK´¹C£Iç<¼|“æü ²QBW£<ƒ;ËΗÎH(b¤’é²ÐFaÞÀjSè7B«…uQt Á2’ßA.ÖÈlîQÂËs¸,ØZÜ—iC`Ûe( a—ú¶ùuhH¿Á.Î`U°Nœøüˆãˆ…JH¸þ8¶,X§XvôÉBN+¸;à"©l˲V²SP»™¼3T€áÝJðÜêÖŠñàèn÷>¦½Ô?º¯¬N”Ù‡‰ÙÒàHX\b_Ð@2hÏ-›1u0D3iÉbD¬'ˆ1ÓB°ŽÈйö4š jœ¶Š*41“lT•Á^3¡ tâŸÍ\= ˜’Š7n11*±ªr4Á…&T½?ÁÙr¶D®Ÿà¹‚+^öƒŠÍ¾­:ìÌ¡:Ñ_w÷EbŒì­õÂìÈðÝ_GŽ –ì!}îvŸ=~ûWϾý^Çw^…f“izX£éÌÓn¨Ñôž¡ëoüòÄã€%Cóô+Ù‰*F#¡T@ÔdåO†Q¥[*(3XÅœGÛb­»6Å=´rŠZÇøŒçÛÿÁ/þ×ÛßeÔ'èÏ^„ûð·•þŸ¦ØW˜FÿOâß§êQ6wr#v€ñk¬¢ç[Ðwÿ³¼·«÷Ø>­¿=¤ðå­ Q+P½íËä§g>\ë.j¶wòK>m>KÛkâ'}Á  ã8O±µ©®pÿ5}„™U‚» l0¿Ïæi œ Pœ”`ñ¶û;äQpÿpô'‰ðTGÿîîçÔŸ¨Qÿõ=/^‰öµ?~û¹K6Ú:Sú‡¹bÞGôÅÓG¡¿ô¹íñßÛVö¿”f¬ªØN*€A-Y¬úw« Í”~1K–-élè¯ÆÂ7•7ºü·éúþò£¶ì`;ØÇ´§Šðês–»¼$cöB ½F˜U‰òþ"Ó_48ó,¯3im•¹¶Û±íwt¥ßíü¬2ÚlèG•€¡ÓãZÐÒúk@ËG˜‡쉰/=guè&ûÁß=ã¥?x<ªK„&¸Ì¿¨”þ¢xÔLÜJù@• ¬¼Îhƒ§ßØ@6CæRÓˆ“kºh£#IÀI7^¿F¢ÍP¿Y©a˜oÔèdvëÓ¡þì95[eD Aif+J¿F6Hg`ï#zÜ’s‡pé!eµÄÖ늀„m&\™˜‰TåÛ°õ‚ÅT®u®ì£mt‚V0,„ÖU¾—w55A8š»dö°TEñAþ†¨øƒ=Â&ù©+ÀÊ´ÞÇ)¯+6Ÿp¸ñï믎ãUrªÿ²õLAü ˜_°]©ÿQú¿Lˆà¿ þ_þÍ&¿~õÂÆ)ÏΧ2~(Ãy}Sm‡Æ±ø„x! ]—1¤Ðøw’b¨yÌùøë#Ãcû0·jŒïÓkºîª®Þéë®øó³Úbä6·¼glÞA@ª @À«Nö™Œ)®K0B󲽩)5¢¹PDê+ãq¥²f¶ô‘ °{êOúÐ\öWo&‹mÕö·î3Ž«/`z7ü%ÿ'ïýÏþ¹;wçɹóC£¿úËìíÆ¥Ë‡Î¬»ðÁµ >©‚š—Óp¡U(…ÜCœ %’ ‹U†­ 2!ØN:€‘Ä¿UÜ–Ôý`w¤>'^7 ;t‚Õî|köEŸÂa›÷_ù£§Ì_Ž˜áX9:QÒ2;¹æÜ%¡ÚFèºRÀ  sÜ!&ª„sViˆ†,„¼2bMÕaɺK†4[R| 8øš¦Ñ-Ɖ<Ö¯é`q: ¶Mß÷—µí`{Jlù÷ï£ê©8T@lCYÕI[ütž§ö!bïc«%Q¨uX:£ôa³òèÐ,0äë•TüGÆ>KDœHÕq®ðÿ'°ÐïzØ$#(´Qhjäl—\¼Ïp2úì«Y뀈M<¹ŸE0äsiƒ“ÐÜù§cru§{ªQR°„Æìí"a«ˆ©b5âÈ‚`®Wí€iè É‚µxïfÙ¸ûî?åh]¨Ä(ܹå fhªäu‚‹µ‘j™ˆQFõ)Mýz›ù»§Ïfôÿ‰èšM£äy"Z W!Ì Í` !’ü=$ÈCôñ}BJð4þ²ñ=ØÀ? T™æºÍeÍC1$bIM´yF센Dº%1eTV(B, ½ IÙÏÁ…üÀ›\8ëzD•Y£Ï‰ÂÃ5\nªnÊlÖÆÅErR2‚G‰†8àóNNÑ]C4nI!£imÏq"‹m@²Q6õâM¼l÷¹–áAoýSDzGã™ A=5ÛÀKèj&Ô7Ùµ}Êð%ÅÇ™¨J~- þàçÛþìºçþAÇ÷^jhÖ…¶sòE0ÚŠh´E ©'¥‰AQ#ÁM2ÿ?{ïkI¶i}cΈuÙ¹óZUYuêÜìc_úø´Ý’QƒíÍ¢»-µBHtƒÄ;/ˆWhñÀ‰F<ب‘ú…›n$ÔHظoXv»ÛuŽÏñ¹Ö5+3÷e­1ç<Œ9gÌX{箬ªÌ¬¬Ì5R;#VD¬ˆXó:þüÃ1Ò»„O#>îð.ÖHý®óF°Ià$"Þ$°]ò,¼§ïœ©g¨à,œŸe/,;á4€ÆÄ8Â8Âñ V ½ƒ…7¥€"ÿ_E[TI!áRB$frJ&ÙøOØùå2®t9·Ž]‡…LŒ;ÔäA¤ø¦j!ÞêMêÁ- ãçxÝÀ­^!º×2ødš+¬ªå+ч#’åâ†60ÊïoçFb÷¨FgÇ HìܧVgúÀêÓãØ£ð_…ï¤Äø02œGüZ÷ÃYįá,²þrǵ…Î-½ž²$Âib±°ö5î’)Xz#Ä­Ò/L¢Ù,™”ôÚe!´²Ë„i‰ôûàÌÞßÌ_uÙ<ú2`³ùü7þoöjYÕ‰ð0Ä´àÛ2»‰‹$€)â߀þ’`?êRà*ð¿‚äÓ_ —_$+H»]K;à<_*$€\Eó7'‡¡V @ªãø„³vEµrÞò¬+¯Î—’~µ]ݹþÏÖì7]ܬԜ rù±RAýô/Ÿqu[ùWöÁ>ñ$RÊ;­Ÿ§¬’jÄzu$Iˆæ²[¾®SEüYóu¦WsÙóý,˜êædŠ<|ð_|žW÷‰X)Ìôo%ÿ‹ìÂú _ýk7_yªwóÙæÀ{¿Î¿zDÝÙ˜H° ®3󻺥ùw%&¥\r¸¥b'‘¤¦ ÞüI–2™ þO©’÷À–Õ/{Y¿Ò,k=i‹ÔãTðä`;Ø²Ï àÖ7–¬_ÿÜÜî±ñAäü‡#ý±c¸&ºc1öZ–¸µhã¸3ÇT‘ý7FÄå:'¤!pÒ !¤NÑŸ†Ñì%« ¦ NHÉ@M$O®ÂD`Ÿ‘ÝŽ¿/(öLíö/äÿ†‡©:†‡‰áa¤[ áÔœÝÚ6‰´ÍD…pn€ˆ_‰Õ°€à¼wyRjõÙ‚¨ ƒæ!º˜¬e”‰=Ú(k´ëUp?ÝÆ~}º¬N]á 8ØÁ>Ïvþ¿¿ÉêV$EÔïIH!~k¬~ô d| ŽޤÏѰE¶#:Š*É€“„TåÛ¤Öâè*‘ûˆÓ#Ü:û ÑSŠ#ðtkNÅk+áh)Ü?KlvJï-·òùN¹qäXô^€á‚ÛŸÐÄ¢‰,¿€ÉT;€”€y¸ùe¤ï`÷ñChùÜqü/Iæ3ð¥#–CñƒýîÿƒªàÏF–]ÏCÎ?­Fô(ïùý‰³­n ×VF2X/,šö7nŸÙ£zÚvë÷ÎxøÆé°õžkkeÕƒødÀc‰vŽ É™R‹/~Žª×¨ùLL)d”¤0àžméãÇhDš<pÉ™r‰Fd­ø+tâ½vâ³pìFa7ª®- ¤YwðúMÇù§[XvÖÆe± D¬_Ô ¬8cçÅŽ¶È«§žx?˜ŠQÛ~\s¹|ŠŸ¼ÕÊT÷ÔÀ¹ ÒرÒK¥ «Yß@V¯ºWpräºÿ,˜<ðKà0b‹OÁ"Ý5ð¡¬A JMø^î3›HI à€²Þ´ Ÿb8ð­ƒÀcÙ(üöœqýk ÂI"œ$4:ÂI"ž%1¹äÁ†:*H‚n!¸ëÎ)£âÄ!]öA‰@ŸçÐÉ^k@G­Ò˺‰Yÿ}P¦£ì)ÐéGþWX+ëÿ¸6ŪÉõ °¾LÂÿ‚Ôõß*Ðl#òõj{òÚÜÍ£çÞ"ç.õAT÷HSw]Hõ|’ïH³ €IyûmvkËêêìuÍžáe·|aßçØÿÑRGZ °®æ¶Ì£ÉÝ IDATTD,­J%ŸLd€ÌOçlÒ>/+7R#þK*°†X Í9™ÊC9oûì÷÷OÛž­]ì®J 9‡ò—iùZiÍš„(¦ÓÆþÀøÓÿþí»ŸÕM~6‰WyMÿŠùqÒý±G:›ûˆ÷Ä­âzÁ¯:(tX€U4lDŽ=)(ÝJ&õãeVh€S‰xÖ(Ó´)’gý6Û/óçî7ÃîÁv°g`ŸDýkÿÞËýðãÿó €ÅMo²6&úca85Y¿t„3-ýJYÖÆõBÌd×Q×Åc$ÁdË«¼éàòðb6Iʾ¥q§ígæ×ãL öQ‡Îí™Ùíog62žØÝ‹lÞ ,nš<ÿð01¸„Few?;slˆ é9¦Ó „sÅy*ÉÒþ™£!;oc3(l‡µþ”¡={~¶Ç êÐÁ^`;ÿ_¾HêÝ¥@vJ$†Lˆj²éü½öK@Bvçèɉ9±{%…“En,´M¿1#ÝdÇú>Ë_æë­Óà`W›9,íñà1I¼ð0ñþÃÄ+7·-gòzavÈßçHIÙe‡®wBßsš1¼Ã»ø$¦"ˆË®;ꃨ‡ h¼Ý‚{#I=’.Tâ¼bt¤ÂøÇËSO‡_ux†hÑÑN ü ÆÒå lGËC¿È³”Î ¿-ð­å‹ x~iPÞ¹Ù3öp #;¸ÞÙcíâGèq9ŵ҉#ôà:Í*ø:•yÄ?&ÿïÕ–½äÏ”àó¶^½É›'莔þšÒ¯n°7:¼x\ÝZð8oîg2:÷ãÈ ²ðHççèsJ%““MFŒÔÀÑ"°Z&Ãô;lvê±ÂĈǣä|à¥ñUL’Içà½ËÛE3!%;¸ „LQÿ%º~¿ÝhÏFÞÌ€Ëä¶ï‹ÏyŒ øŸ-óc¦¬Ÿ¤`T¥œÚlSxkýâb×ÞÏ·ÞèÙ®„k½c·I|_7*>X´¸KÊ2(ÉRÇãR ÓqG¿s,űT! x‹˜p1Ò ÙF,‚)|-CbuÃ3¦×p1 ámô<²{áìÆ Ü9vÜÞ ^/¦ p„ '£âÏÕpSô¿€“¬(!Š‹Š#ý Gÿ•_„]$mÿ9là?•µÝÖt4HÛÞDD¬ÿ.Q£"šÕÐÀ; H`¹Ä-n¢þå/k~ªÐ¥Þê`}‡tXbÝ%âŽÐn‰t=â=I’Õóò¦¡—Js{ÓžÿŽO1 8(<žýÝÿñ=pàÂéwÆÓÄòŽ¥ÏÏÎÁxšê7œÛܺœ Lë£E€Ç¢£)X~f;¦¨QJQÎ+óç2§Î׸0¯¾lyÕúöŸ}ã¿¥…eý׿N³KI—.ÿÍ6.ÿµqÔ=ðÿè[®m@…¦3œû^#X[¥ûõO­jg»hî«§w&¹ _ö2?¾ióÿóaöìÚG4/JórUâÔëÿ2O`ÇdRcI+TȰî)€æ'-¤üþ€LÕéêÂ@MPÔ®B÷? äÿ²{x¬}2_—éÉÛ–æÉÕ§}ÂV`äþÉÿ²^þ†¯þÕ¯=»Ûúìm|éŽýÚ±}?¥¿.„3e8MôG‚öäù©eü"X?’FL--5Ö¶ ÿ™ZE+Wx®>¨Ê@nê¬Ø§¼,S¦¡I[%Di…5v°ƒì©Ûç‚°zÍ¿”¹Ë¿ò×n†Äƒ·vŒ»Ý5Ëý6Šøh¤QffôŒ±¡eJ7Œé°e>yRf“ª[ æÓ¡“ú\ÚËX‡.³oÿƇ¼þ¯^£¿© #Ãýˆ[Àx’ˆÅ-³"š!@ÜbƒÇÕêWN¿†ëlô–‚â×RëMÄ¿Õ5½¥ m}{DÔÿ•ÎŒG õô`Ÿs;ýŸ¾dÎÀ$¹®˜÷^3È"’Ì18$RŸÀíFdø4:ôÃsôÜA'¤]‚’de9òŸ”S$ɤ·iZgþ¨g;Û­€ÿ1;k½e!b 0Fål§le7*CPηJR8^ ·Ž-·ò²·síFØšUŠÍ™¶èŠÿÿ“:f_nÉ.]'†d¦ èGE7}ï;¨(é¨.Ю³—9µÔœ¥ªLí¡#©½ãèkoun»µHÿGŸó˜¯—p÷–ãáyâÁ™)=,{¡ËàÖoÜzqÁÎ7FxWá«ß¬ï ‹AYŒFxB….Këû}€(Î"ü1 ?cr8É bvXúŒe»ú‹LéñgÛQ¾“õÔÔýö}$ÝÃowpêqÁ$¿ÝBðkÁ_÷øEgã]„sµH›`Î}ÉiÐDˆFß’¨¸h €_ŒÈõ„_ƒMÒ[@—¦*¡ƒC6vù¼ÅËf(GŽBl¬€÷ÙéWD*ÜVåÎ;#¼Þqtš`TâÚeåè–ÂJ,Æ#Å B ‰k XõŠsBõ!KF¢ñ9=@]rø$ôIðAYÄDw¤¸ëý‘'†%ÑyKϨŽ<Œ!q÷ØqãFÂß•8‡8ö É!Þ¶u–½°ð‚÷VV|)djuI’Ç9Üâ:è@\uh¯9ýÊ“ìó´–ÕüiŽçemu§ $’(Þ ²X¡²:D:ø¥Ã*Éu{n z’Fð@xD\‚My¦K±Ï}{jÈím?¡GðÖâÅ$™=IÛÝ ¼ú/­8úbOØ&޾Üåt“j©ôNÝ‘©I¦Q«Âd”8¦ úÀÖã¨Uò?˜e0J b˜Y ân‰…-ÝB.ºrÉþQóéK üŸû¯ðÓeY( ,z˜}”Ui~ ÈÔè\ýO«ÐÇ´^eÿóùêõZèûràÿjp|¯_Ý#ÔX}e@M@ÞG{ŸåŸXýל Îµh›–ûÏòå²Ü^öOœöÂ,\>ÖÐÙ95·³Æœr*$®°Ê5T˜È  u@ÉÌl¨Óõž™cjæ_î÷€™­µÿSŸ{]Ÿ¾p§d­Ü ü4àÿÏüG·_éÿbßù»xí_>bÜ$v&â6‚s "i—H;KåªÑ äð0Q·›ˆg8 ŽLƒ"½ÍyS&œ¡j¾\…¤{íRöÿæ––ìm5Ûëпù«i“Ëg.Á\> y›Áƒì`OÄ>€/¼¤Àåý¶å‹ù˜Û~Åx ç.Ö U–ñOc²‰Užë ÿÀ—CàOnv©ôdË£Šíó¦šóÏý­þ«0jn»ð¿Üš å´ý?‹ó·ã›ïNàʧõzÅ=ÀüjÐ~d Ë´ÙöUâ]‰úoÓH%H¹Ç&ç|½wÉ¿Qö2ïS?]¢?k»JŠžZæö·MSÏijÔ”©<@êX~^F§ñ¹E/k­ IØGMU ¶cšJ˜ÒHEüÍ´^©!ÌÏÈš²›ÇÊÓ=åçY~S}–Ô}í¼ÿË[h·íQžÎ¼³%Œ—,G`üê¯ßxýi\üyµó|ñ/³~³‡˜p]Ïxêð+aqÓ1ž'ÂY¢¿=©%m)ž+AYLc·Ê¤³<¬vKó99oý’KF ÄÜ–ÅB\bîÛÝÇD`y^ò8øÉóÒ”ì`û\Úç‚ð²F.ÿDÏòµ®‚‹ac`#@8‹Œgj’ÿ+!É&Z£EÈÄœ.€eÉkMÚ&íM¬4)’'X´“«fþnÞ‰áYÇ9Yr/åç®¶s+v踞¹Ýþ…ƒü?Àæ€ôÂÑ—zâ61<ð¸ ' †û鬾Yî(ˆÛœFÃÙö°QüBr¤‚¥h‰6Å¡Qê ”h†<ð˜êFáòÂ4,N6½¸ýJ;Ô­ƒ½(–dò9ò2 öXîñR†,÷, Ò 9”5{ÒqN&AÕÀ’ÔóÙg»féñj“i¢?ódë4?žI2Té0kÑÃëŽõRHÉ"þ^ðÎá–\ÌÙ“ QŒ`¯ÁçèÛ}x'ŸÜ ðãÈ= ¿×”ó­{E½¹Ít^Oì${uÅäè; ¨*ô°H¶/4Òÿ½ƒëkaµ€ t=]*¿yçÅþs€ñeÏÙuá¸w<Ø&¶QéFX JèLzßJô†‰KR|þs¤ÌË"óï“ÂûØlÖ]YŠ)tbû:ÁjÍl—Lú¼Kb‘ÿª,Ž¢EDw]¸C¿û¼ÞÁ»sËþ Zs:¸â®IqkFP$FœOpÍãÞø&þÚ7‰» «?€øXÜ? ÝŸ’ÆâÆ€†œÇ3€Š³ÌÒ´Ö¶ßaüsz ©ŽlGè½°^Yÿ¢–Á€¡sLœ´O,ýÑÖž÷­4ÆÇµüã |¡g{ìøã]2u™^ &t a‘A}¢ÒaëEÉÁŠŒ`³@éÔ6½Z¹ïÕÈ]Rú$Ä”è"ô b§Ê%áXwB¢Ã!*œ…Ä–ÄzpÜë,:W1õñüwYúß[³{cm’(³2¤bªEƒCÞ+ùº<Æy‚eMòµö'í\¤À™œé¤˜ðqƒÓ IG„t´¿áS3±É^qIWÑ Slšòì;Â뎽ß]ö}ŠÇñÖâ ªñ8öÿw¯/8ýӑ퇑´Mœž&¤Ï©&K BÑ‹sã êëDšW&½ê¥ù“÷#%/‹œœƒ—¬_òù?ùsÿÍSý/»æ„W<Ÿ¿"ú¿!Ô:ù˜à³õÝø¬îçs å¸?#3ÌÖ3   B{ç’|$t.TpºÝöÜûDdÿã4v. õ>Ý×µŒÊÞŸNÇÏ.öÈ&³´¹‚iàD\&ÂKQ»G¤¸âç}v*v½GÕØIIÂÊ2¥U¨0¿´dýÇ·GxzÖFýGæ‘ÿ#0|å¯\¿±¼Ó½T‘^¸•èDtTv®Wv÷Ìw‡DÜ&KÑ:de™f½¤E¶Èÿ¬ðšU”QH[a$írFFS¦4Êmpdöïîƒý³¾Œf\¬Ï{ûu°ƒìsiÏ=`õšis—?øçë×;D”³Î4Ò­m42ž$âÎ&Ó”°IˆâÎ:;ñbÜNquli´<}Öié…Žì#S´cøË:«Ë:ªCçõ\ØËZ‡ömûn$n•´MìÞœ¿=Ò_7)Ùpž[«/ã©¥Œ”¸K¸^,5À$«ƒ)KV²MÀœIÍ÷µ©o\ŒZx„CãÒåÁöØÉÿ5[QEJµ’Ç9§ÕÀØR’åj!ÍÙ$YÛ:á äOÅ¡áL¢2§Ð$v¾þgYÏšå¹E•«ódšê`ægm´Ryªp´®­Œ0fÿÿz)ŒA‰j eLðþƒÄùNé<¬ÂraQË‹Þ䓟¨ òÇüM0wq}®IõÞK½r†—Ýey_ÛGÍüÙ•®¦æPÒ5÷=Šos7šŠƒå‡·ývÆ ü·ÃÓú¥Ï…½6Â=¤…p6$|P’·¶L%Eè’BT‚©â€™ L}›£ÖUˆZ¤\ÍDe™ä{Q¡%æü½1³|kþm'(ž$Ñ@Ž…Åë¯#ǺxÑW@oâ çîÜqœ!8$)BÂ9‡ÃÀÿ„ Œ³•²»ùC÷yˆ.î"ã×÷*¤ ¬ÜÝ{èò}‰ï‚œ94$Ô'Äùªöÿ8¦I™0 µô®À>Óß0*§Aé¼°ì3H묩u]r¹vóë?M@±¾4&\÷8…WÞ¬Zžqí…~§ÈΈ4¬ àïÅL=&:’íKºÜ/Ù¬ÉêÑ¡ÏÃ…… ïXu0D#Δ”wtÎá½Ð‰C&–.Ðü"B<  =*%ã’õu‚ðÁi¨}ˆsxÉémpHÈ*lsJT|̾§¾š&ßZ¹gW#1°.`yÚÇ» i¸‡¸øc"×ðô °Ê6Å-ÏúnÇÑ›É@ÿm" iZF% ÚÈúë¥ ”)”mTéeù˜LÚ)j”Â`ƒÄ<Ÿ¾LòRÀ¥X3Pû?÷_çzä ¼úÄÿVþ¿éÚ|špf²þûÑÿåæ0°·Í¾<ÿ‰O üŸýš9 ?#´ŸmœQïQ ¸/W.’ *x¬Í:óqw‹)7#›Ù/ŸÛgÁ xTù™F3¨zÿð ¼_$Ú6„€öly®zu¹µï›@N×$)ïi€~êDQÈ›‘<¥ò»´Q©¿G/#ì3·—UEcßþø¿û€Wy_ ç? æÈ¸ïPµ:&N̉±«%jaRÕ°z‡+é4ÔØ£ÁX¥WÉÎêÍãiv°—Åœ¯r°ª.»sr¥Hyf¥F@É!áâ ?å¼ÍvŽâä0GF©‹&ù/sÙÿ*m³·lçø³õÏ1ÈûZúÇ 5(pµ0%DÛÖ9rd¸1N6‰÷$N·¿qÇÑu–3™Ïîu4JÈ•#RÄ&_"À¥?á gå%§ÉþÁê$+“lÂ6€,ûÅ1PÓ ´àg!<ƒ™þ‹l%/h‘^¦3P!fÉíÕB8Z ÛA9Û*‹NXtæTöNxí–ãxPž™ ÀÍ#gÎ ²fëÓOªó™RD ðgÀµÝg.%ÕGûô#?–AÊϯ€¬Ë‚1¤yœþÞÍys€îÛëµ¥£¶Aqy¬>xgþÑr¶&º¨&È Â2eSÁ'—eþ¡K΀L…#qô÷^„޼”²=§1é{!/˜Ó#øqQé†îÞwðÁáVwpË[8}ÑSØ~v;ܘ<fõS'Y[çÐèH§ýaÀ=ZOcªsï ð‘vòí8&VwzvL-ϯ„”ñÍ‘uqcdz× q0°EœÍ—ùâ:#ÄšÂ^Èåiäì)¦¤“ð"¸Ež3R@3¯.j8eî, ¶ržçèwYÒ|ÿ+(¨  B :;êz.¾Š4 ÓJK^ÈxÜO*³)¿îGÿOÎø?ƒa矟œí‘êçvûÞÕ5ïÏÏÊ@dû-m*ù¢@ù¿>‡&"{&=߬_…+Èÿe÷ðXûd¾Þ”=ÛÒ<{)í}K ÈG}„@…æó³)‘ý鶺¢øŸH2“:@9• ™ü¡ 9£¼÷2@zú$€=ð¿ø-hßÔñG*léššÖ®I*œƒN-§ò¹*c€ÞÕ÷$ζÊë·\ufݺ&ÜX ï?LŒÁÈ-Oc:ÿÓ¹ïþvô¡§ IDAT‡ÜN{.ˆC–ªï¼EMÓ€ÙÎM5_f"@IÏPV•콫@×)u©ãÉ|â·¯¿Ø€_:÷ü‰¶|i'è)œ&åØ;–l4á#t*D1G¹W%Gÿ æ{uØŸ­k'm½<ÂkV«4Õ”Ácéêù\,Òæ9í@L¸Ý‚lFúµâŽßÃ_ÿ'ÈjœŸ"'#²qÈ –À)®7…%— 2NéU‘(8u¸ÞmÐÕ=ëȰAw÷`|éÄô*lÞG‡ˆ¦n"j=FµRU$*#,îV@ÖÀÒ=O:Åã¼c Â6§¹yͱ ʃ3%F#>a+% _T˜3olL¥961¥Ñ §&«+;”ëÀÔæTª[R:Ã…û¤Ýpþ!i»…!™C= -UÙ1?]Vê­é…ÇòéžÓ!­ÆÕ¶y'ðö?8åî¯1œ$†»{¿6Àð0"YÏÒQÂ8F#É6/NYÞ?nò{UKP2~éNó»Î*JÞ|SøœÆ²* <8óUá×ò?ÀJu$ëzý ŒÎŸÛuëp³¥àÄ5p¥R#Š©ÎŸyޱw-H¿â×(ÿŠéì¸zíéð†4°w™Ù½>-kÀþÖ÷ïIsÛ µ-iIFhÔ<_+¿QTŒØÝ Ìž}yKemŠ/Ÿ*© 6g ¿=Ôǃ=ï–Ssüå(± ök¤¸š¦ÎH3 /Q¦€êT)Q6ÙQΑ%‘Èùœ³ƒ µXRõéœp°'b­Ô±3_+Å74†Üž‰Ôb XZ€ëG²÷x—sÇ;‹Ö5¹( <ù¥X”ˆF‹R€~e¶¯*ä{N…ÄUÛçD  J±òDÅÙL¹ÒÕÀa‚’²#Xœ€çÍcóÛÇç¾öónßýgήî¾wX'%:ØŽ‰.¿‡^³C<Á2ˆÉû'ê“@—옚@3@„ˆâ‘,mn ô",cˆZU:',Šì¿³?ï&¥¯Š¤„‹ï#^@Tñã)^ÏpQ‘Q<Ò àq¸Î>‹{·¹ÈiXD²pè"áˆHø. NŽ`8Óg '[â=A£·aò¾^þ€óµDÕf.án&ü×¾€\ÿ ÜÉ÷!ýB¢Ë÷½‹Â;§‘ÍNyóÏz)¯ì1²OvÿŠ¢2F»•Îà‘¤Ÿò™Q ·íûˆßö{GÀõ¨|ÿ'z6·.&b¬@¸ia$DQ~´ºâSŽàÑßiŽÐÏÛ;¥Fþw gòÿ ïr=²Ï¹žˆ‘h¼º üW`Ÿ¼tŽìGF£2¦T#ùWÝDޱÈý ÄH‰âÏdå§E ¸€Ã”ó–ž`Bšl I³œ ÜÂéH= ¥sÄ8î“ttĤ¸4àÆstwÛt·íˆ˜#Š¥/³ÒZÔœ¶ÉÛXÁåHÕö¯¹Í}<òqì@ªùh{ø­·~n‰ë„í»á~TvÊp’ð½Ôù²+„ùQ`À€– ùýR‰ïé {·]‘_žæ½i¸dެÓwÛ ”¿þSÿ¹ü¡ù[p/Ú¿65€¯šûàëÕÑÔUçSqm·î@k·P!ÈEÙ꣯q•cîiX[ÓöU.?^‹9ýƒN)ÈéŽÚƒN o@* U.Ÿ€ä„.w–Ï0ÍóÅ31¹de¤÷Ëb» ÞFŸËìûåààqûCæ¡P$·¬Ú‚å–ŽOÔY_Ôüês×F@ó¸µÌã(oá àIZ[þ i¡¬Û=ä‡j™D:‹ü/mÁŒÀ“˪djC!ø<›éܰ÷7bɶv_ù«7¾úLîà9³üýÞøKGø…Ð;–ƒ£»æ›D87`_ò]„m&"ì>LµJÅ­Ö&,æSOî[éÅÔh’Bç¬K6ÁÒ è²ÓÖt5û¾Ùƒö`;ØófÏ5àe–ÿèoy®}©çÎ/­D†cY‡³Äxq½#œG™É†sëøÜBˆ%l,òÆÒª„scÃ¥@ž˜í1ÞFæ²ÿªIm>ï‘$mö;¾g=79·¿ñr«hûÑïœr÷_9"l»û‘áÃHwìˆ[ç‘4$“óß@Ø€_:bP‹ÜÏççZÓm¤qZâ¨ÊÒ1勪ªÌþ öÇÆ~]‚‹õåPöØÃßüÌÓ “¨Îª”)olž”µ•¢Fük­K Å©TEG¢äÐS,/u3ÁWi|L V§J™(ÊE_f›åÊè½às~íÂícát  lG{ܽ7€äx%¤œí”a„õrÂОVn- bcp>XDð²V½’Îçã™°½V‚¹:ty‚ÀÍ2UE毥ì˜6< 2@9w o, §@p î-à·^ðèÿ¯o_Ý8”ÄëQ¸{" 1{aá89VÀe!ÂPºd ½ÏQÎ]—Aû\OZ¿€ø¤ìœ¥V¸*âØ¹KÞs®c‚”50N‘˜,5XTtPˆìg Ûéšï39-W‹Eu­¢÷ çç$çLRül€˜Ð1ÂFÐM‡ºÎ^é„-Qÿ¤”9 }BVnüþÚ_ ¸ctõŽ©7F*ÚŒp¾SvãD2:Û*]×–Âk7ËÞRÄÛÁT@ÀÈëå¤`Žc™î'Ö8tš‰ ÒÞxF‰KÝ“ü;í˜PivgÎF[åfßább‹h`|èGÂ'!®—,€dÞÅ,¤à3awçìvjd¤¦  #Ê"«dlÄÒp81bŒ'«m$AÔ®é)2þàÄÑ9ƒ¯¼diÿRÿDê¶¢ PÉ¥é-¤žiŸn\ƒ;ן÷O$‚²ýA!¤´6¡kÓçLb«©”\>‰wÐ#Ýk·!9„¯˜6$>„à‘i 0ì ¤ÝCDG ‘ªƒÂp>‘C"èy@cÞÀœŸÀô,>nõÁAþÿ#mw/Òßò}±cxðëˆ[ ÃI´\ +N¬ î\Ú¿¯—Zê›Orÿ­ä(Q!dè®+®”tâ,RP„ß:~±Áÿbÿï×”íÚñêÒñ`€“`À¤àC¤‹9²?(> êMÒÜ'H$).e2™ŒÁ‡ÝlÑÿ(Úž­LVÈÑË‹B ä1Ï‘ÿ5Ê9G?k©â5ÑI2àS’Éø'µ”NpÞ#>eÙt…8©;TÍfš2Úg%W¶íh㦨èÎ!ƒƒhð ÞrFdÉK«~Û%ÄpŠŽ0Ò¦i+0 :(2šïB£Z §¼4ùr¤xBn€{ýkè èÛß#>,`Ÿ<Ñ>ÿ÷Ö/GŸóIíì#g?Y¾â8ù6œ}o F@mެ i—,^/–gy0T%n§”q“ˆ;ŒHƒ‘êÅ—y4uN^@–â“ÚøGá?øú1‘q’ì§'' 2ƒÈ”ÊÕ5¥ X,:í›dzr§ekc-á³/Lc¬VYSÛí ¨?‡÷›v¿>üÛ~á3¡Ð>Ç:}›w„Ís.dîéAÔg¯ÒL±¦9ž4íQ‰:ŸÀÙüžjz¹‡=GdÞ^ÞñÓ{Vsz¾k"jMûç%¶"ÒM„úü ÓqÒl{컛ͥ÷Þ_ÊçÀÿå*ÿòÐë´\ó&ÿ* f22ŸúùËÅÿ¥ý-å(Ù+‹2õ±õÑ5ϯ}”ÒT4™v[YUÜUJNŸÞ¶LÒÿõï'ÿÝ›o,núkOóÂÏ£ ÷#‹Ûžå«Žn×ÓßðY9âWBwäˆCçq+!í°j´°qG¸Þ›J@oóô·ÌcsE^3ë_ÍgÛIvPª&ø\ìS ×}¿î^{}¡È†ô;ØÁž¡=·Èàþµ—®O»`š`|Ø­#g?[eqÝ1|Ï®Ÿ¢þýÒXlqg„r„r¥l9o4çaË®@e\k0G¼É´a“°Åœ¨ræU–<]ÞÉÙÍ&ì`{ö²“hŠ¥ ,n{ºcÇø0ÇDÃ$憑þرpޏK¸^Üʇ Úô6ÐãP¢R̸cÂŽÙq‘ë‡IFaä‚l5 ¹­3—ÍÛæÞˆ Ô<ØÁ>çöðï|ÓŠ¶kœ3ÅyÄfRås‰-ÇéÜ-XTj* T­Ð˜ªCÉ‚M“9–E¯@Ön/ă6 ºøÙ¯§WÈ3ìãYyµåI^[ «E‰R¶}Ef_Ä@øÎ[>ç'ŒûÏïKŸ2F‹ìÕLp"-,š:Dåt£¬FFúÞ8Ìq0sò=GÖÊ‘+9×Â%ƒ·^\ú‰Ê}4MЏ„»¡¸/¿Ž»õeÒÉŸ!ö.éƒÄ.ñÛ/xô?À—‚°„×î)¯¾â¸¿ Ü…UïðQé’àùU”ÎøPta’+W„>¿º"éf“æ/ƒúdp2™EQ |ö2å&¯‘ÊNp(^;œFˆFpQqjD€"ÏM‡ån.Mh*à^¢ˆù¶B0Š).AfR˜ª#ö£C½G½3‰Oy!%)’"r}Ä¿¹UÒ÷Ή=òôßFWßC·#îLPõ8ï8òÂ]n]“J4:Z ËÞþzOÎ3oä$‘‰„$X»TÊ:¿BDÖ;º/8¸ÞÃÃ@øa2b‚[Ô9—„ˆ[ È+v®ôABwbƒH*‹íþéŽóWà윜VNÖÅ÷ƒüX  JðVw|„(FðɶEQœÐ7K¥Úè´6ÈD(uË9–"MÝÉêRÈ3:Õ-7ÿ³:愚2`Rä˜ÈF ÐZ[D­^>i›úÒ¢M`Ú[²4â¤úœ*ªÑ„?\gè®  Õ3дݠ%í<²â’ÄäßH®Ê½K+ï¬ï€Œ¤"³SA™*_Y~B{kñ¤#R_,;ûÁÈúÍŽÕÏöý½Ð[Ÿ.gJØÙ¶¿éH£Õ'MRUò\g>(Dp]NU©y>œ›4ñy,Xe˜óºf€¥àé¹mM ÒeÐ~GM®{‚U+XªTä¯HÛæzæo4 õ¼â.ø¸¦æ¾”Á–¤L%©ÿ¸ocýu†Í9öW/Øóàw»j@¾G(&Þ·Vße¤vÿTšç„•Õ4O–Ê-ŸŒöqÌsÝëüm=%Àþ½·àþ´­-§5ò¿Ý+S¹­¤²eÚÌ •þ÷ZÛy„’Jáj‡T2M¹Ç-ÖœÖxmÚrùÎ¦|üw ÍÿùÞg¤>›ýc¤í+êܾ”ƒ‹÷Qç§N«ªºéúOYÙmË<ú _ýõ?÷4.ö¼ÛÛÿ׫×;Ü6o†“hóQƇ‰”çÜãy"ž«¥¨”´3Àßð ѺžS&‡ÉÛ¦oвzëp¿Á@j)zDS~éçƒì`{ö^nù€7~ía“pKay§CF ^\»Jžt½ýI'0¤)š2“Ú‰E«8/6ùòæéŽJ§gÛÄ)©‰TKªHg¹ T°´ž™|ù£ÒØ9˜uŽÕÝ3µC=2îǪݜæxꤖç4(ã™2ž&üÊÏ#a“£¶Ñ ½XΧ¸NÀ™Òm·&×#“}M¡l0ŸÖÂdq¥+RˆdE€<¨̉–ÉE)@|ž“•ºæ<Ô©ƒ}Îíáÿúç,ç#ã¦XA’*@)“—&²ÌÊ3p™Šäs,96RÆ´ú‰É•ÊY.·ò—ÈÿêlΟ#†Fç{¬ÎƒO†l²<£=Þn„H–,‡e߇<Ûn%Ÿ–üÁÄË«ß0†Ä²®­„Í›2Û¶-ûr>h?É/©æçÂZпüÈì¼+ŽºêÞRPÉJBþ!Ÿ°ÜO‰SäÈã^ùyüñ/¢‹cäÝ÷§üö­Ÿév'þ÷w%ÎïzÞÞV;8ë”°ô£eDèS¢O°PJY' —·AqÅâö?“™>—u!‹&g2ï@Ý—ï%)>eÅ1MxQœ·”dÎp ÌŸ67‘$9ŠÌ!®D;[™êD)ê\Ós.­ɾ÷Èè ¹äÖùʯZÙ>ùÈyB7B|Ô y< ‡Šåt¿qd÷#„Ì[-…””hè?ÛAyÿa"Dk›ÖKaÑ0»ì…EuÎK½‘„Ü葟ü:rüº;Çíþ!úvª5NTArÛÓ}ý3"öOfÇ€J«?ä4 7‚c5*„÷™¤ÒYƧR–Õ°äRg‚VòLˆ¥>ùde¾'«^ˆj:„¾¬K“f#—›’Jãxá&Y'Sªº¤–ûË"þ?2ÇÓ0)e/®¨…õRü IŒt:$d·AÇ{¤þä8wÔ;4Àö”´ èÖÁ6¡ƒ@(à¬XýÎ)A¤ø"ÖÞQ÷ÿ¡ÑÁY@鹪#µ!ÜÇn÷ºÃdê*ûÓß¼oj=X*€4š¤òx®¤­Ö¡t¬iñRÁ”ê?ÚŸÛ~ÂGǽùÈ}Ç„Ô^Æ!eh_×§ÿ®8ï~û+­h˜µõÀ”¬l~¾6TskõÒ³)þedçù×.žÿÊ»:v±n”.9ZiÛ›Ë︌?Ë;2:Y¿®%"¾@ÉE­¡¯¹Ïµ¹£æö­’U€ò®žÜ“ÛûÝužRê„®?tÚkÄ ¾—ß/…m(õ;å-ÈýÉî:ÿ§Ò´¡PÈ÷b¯/ÕwQ®]_­LSä”&ùÿò.šo4D€Öö'Ü{÷»w¬î?ëý‚)³Ãg}[³ú#(ªg¹…P¡¤,ê *Ó/©ž°µàÿØ]ÿÚÂeñú“¾ÐçÁv÷"7~fAÝ×`Æþºc€J`¥ðg_6Ç?&#¸÷‰9Å]0Ù¬¬º˜SeDS¬ð‰ü¹Ô#©uË;+Û… 0K 5Õ¹Éþ3‘hºB¦9Ï©dRÙ(i6¼“JÂ)J¾©gSŠI ÝWHeûD(Q®N”êòIûi&#PÙE k„‚³àzºCºwH"°º8úvï¢ç;Ø€nvƒ@r¤útËXœO·Œ±<éT` ´KÉðø¦=˜8Ÿ þú݃ªÆ•vòݯü[×Y¿Ñ‘FFJÚ®á¡Õ¿PÈòÞÖÓÆ¢1ãÖmÜÑF`©MJJ9çr˜¢3ï.¾Ì7oÿ%$9ûSAÔ#Iøþ¡Eæ«ÃáuFLÉë‚íN§^Тù]$Ï#KCÜŽÓd¶ÍçmÔIú”÷¾´§Zåä,³qf!ì¡D­µàÑìê>‹þaim··GÈÅÛ¹—œ¥<ý:ÞÌÀ¾ä6£¼·J¢+ê%0m» ô*$€GÿûŸ§2U£ÿ÷·±G‹û§Ïók?n»ß¦(ê ¶Ýžá¤P’kätIZúÅàÿý/›K4¯T ¥”¯E}ÓX¯Ôbm™iŸÖ•?äÂq:mž—ΠϦŒ#§23wikÇ)I³Ú”'SAùþ“'£o˜Gÿo~ö?¾óŸôE>vòÝ×~e_ »{‘Ý=Ëõβ¯6jöçèïz‡u2q´,ê˜YÒâ,r’Ò±MG5²Ïé\b¢êäß­™ºZŸRñݶûŠ/w/™­Ó¬Ë%Û¹bÛÁv°ƒ=¦=—€CÞr3Jñz½c<ô·„nm²äqHÄ!wxƒmKåóè,9(Ü4ÙÊ­””š‰W!$EãÄÔ®d€BhØÛ3÷%`fb©ëWv~—-ö©íPÌÎ~0r÷Wxð/vhR6? ìîd!ijdƒÄ¥ÔhJŠ@ûÓŒÓeÒ´ åBTƒ^Vþ÷×áÂ@°Výºp¨{¬DÿϬ‚ƒbRþ<@æ¨Q@tr"ë `Ë”Ò)t Y+Ò'ÓÉsàë²s¢¥½IXÈ©æs”0G8{õoÏÙU'jz |k©˜œvâk3™W\‘—Çp} +àÁÆ‹ó <Ý(ÛÁœ=––@Ù–¶àhe‘ÿ%8DØå(âróòÿ³÷f¿’eÙyßo­}NDÜ!§ººzf7ÛæÔ–I‘’ $`Á†ax~ýà¿ÂðŸáw¿~¡ž m؆lÀ[  ¢JÝ$›uÍŒ IDAT졺º¦Ì;EÄ9gï凵÷>;âÞ̪¬¼™•Y+3î"âÄö¸¾o}KZùæç-ò .’9ò?™GUi®';ð«?/“¸<»¥|ã%»÷N¿<«Reª_³ŒQ—ϱ3H?úSÒñ‘õ{$üáÝu>[»Ÿ„wW€«ú+ã*&úNè70Y€ÅÚq¶è¶N˜–™#òc‹b8¾â¤€Á<ÚÌ3ž”4ÊE-@)*E@u …nú± X)VdÒ=@H†j",AG'hê «#´ëÐ4!ò‘-èVaR4*"Q—ó×PTdÆú+Èé'$Zˆæë•¿vŠ`¢¤GüåŸy¹¼BÀTgõ3T@Aòúœ’ƒý‹N–ÂÕÖXo㥧'8Z_yM¹ÜÃè*îhMs›%å|4.&ä/Œ|ø lö(’dÙd$`FìGÿÄý‰rÔ³?X|þÉ1ŸÄîGa3:°ß ^7âdô[XlŒ±ƒåˆ`u}Ta…U„A½>u&$>Á¼$|½ÍI„¡ÔfBM©;"Ðç2¥° ¹ÜjÁ¨3`Uø‹™ß’I(¥î É<*MRQ°]õfŭѤ-þ$E]¢ÀN½Ùâ(yýͼ0WgY† ±¥ˆL°í²Za=H‰Û-²1Ò¶Ëà¿b“CI†fP/ÃK‰œ*¿Ë'À”9S§˜Èk¯ó™Ñ¯§.O?<Ô«'ÚúÑÓV¬”Éݱ× é”îȈëD¤H0âÆÁ>Q…ÉG¸Êä<%ÌU"MF8Íiö°Ñó3K²›Q㣯ò+wþ61&¯a@R@-QeÈ“Š‚DÔ<ñƒûš M4¾A¨îÏÜæb^5ª³ª —×2çP¨êjêó\“0-Vi$ЭÇ×fùƒš ýý}³Þ{|{S%ã÷o´ÛÞWdž~•fÉðö‡ädI×ñ þ7*uÎ(%} z—çë­9—Onrý’vÀ™Ç4„eiI7¼rûèÑöóUŠÌßmô æåw¯ï©ä¿b¹ü‹TàßkPr2W–§-Ši>³™hPN¼F×7w½V=Ù9«²÷ÆSžKÊžåR”¿¶Ó%ä>xžBf(ßš™Ké.)9Ê–÷{JÕH“â— Q¹õ9Ý&¿ª À뿹úîmÿÈ«`ëŸOl?ˆ\üÕÈòµÀxYÿ"Òy€Öx«BkMyܤD¶˜ hmðcÁ<®v¼ï»-ÛPý´°·yߎ½ môÁv°/œ½”èàA¶ÜmºL¬>Ï£GüŸ$Ò&KÚlŒ4:€™Fó(ÿ¡é覆i]rÛP3â]d'j¹š-Èÿ¤2[››;ºCç÷™Ùƒï¢ÿÁåÿû»Ê·þÓ»Œg‰å›dÉø0f7Lkw`èR"猊ã\¿ÒäK›\ê?Å="MÜPRêV!Êä¼Q–¨ÿ;uŒ<‘h”ÇÙ¡nìóhE¾FÕã@¥HHË9Õ“;o<­W&G¦zCŽ#rš•o»ld€ÒU‚KEH>sOêˆoÉïYרüÕ;ž7e×Éu <•Ç8P.Y¢ï5ä[œHŸbÌß·ä2~3†ñì÷~,ñ"¡É W[CÅ%¿ƒÂz€1:@³ì„1:Y œF„®›‹Å‹Rt~œYaT¤äà)š…ÁÒÅL˜‘„Ë4¹NŽiŽj K²›;ìT¥ÖÁdBÌèV—½l¥:ùMK®  ÆÀ}é‹ļ=*ï#lŽ„6É #KA"è2yTíÍ£”£—ùA¼,Fr³s6ÐX®þL=ŠìG‰RöÈå²,Qÿô/J*YÚ\KÚ€üyÍà?F°@H5óö+ГD¸³¤»ózò6ŽÑ´E¶ïÀÙ/óuugÊä tRNoÓ¥LŠGUj¹©3ï®¶_ïÕw6 ñ£ÂÀQ9}@ù92è̘&a=ãd¨ 㽇NÆ8^¹c»ïà{Êf4ìaòîAêÏZ{êíùô6Àô繠L–HÉR ¤MýÜ£’-õ•‰ôýC¤2ý?Þ¿‚ç/mRGÒ“ É˜,8adÛy{F56„(¬ÃÌ}.ðõI&+WÞ0/ž  “\§rý饬«×ö¢ÿµI¥!^ 8ߦf½]|g‡SÀ£².ó1ç>ìSv8²·QHk¦¹± $34)l}¤’°Èå€]lI¢¨â`ÿ¼™&²úÇ ˆU ï¢ô”A[ÄŸaciŽêÎ÷¤¢aÏØ¯Òj<ÞÖïN¼ûÿ\‘FãþÃ%ãÈtžèî(iLu~lÑ}P;ÀJ™'7óã”#þ‡V1¯žÌsæ·–ßào<ø}d“£ùM=òߤÙÎQÿ-ØOy¿Â–yß¼L¾RñÏãQ‘ ú}( _¤’ç >z„T„2Ï·™OÓŠÅnL ð íÓÖÏÓž$ÿÿ$“Ýõ@ßáöerÅ5‰úüé *—ö£ÐO 4´4Ÿ|os²ÿÞÍàU1r­{ÿ* à:A –ëÒèßx?™Í*2—ÑÒ¤€ü‹*Z‰kþ2œŽás#MAN+èßø´v”ÃZ_²”+¨n—ô"õO~ÿ½vîï¯?¹£ÕQI)&6¿g…¦c„¼ßê§‹ãÎÛ€4¿}{¶#ÿÿÝÿòÁ·ú;á B•Þµ¸M}¹çµ¿qÄöáÄð0òúo ÛG‘á¡ÓÆóÄx GÊx‰W ]ˆûy¯ÜÏ·Y¹ƒ¸u_¯ô9ëhhNçZTh,/ q@×#o †¬E¥Ý†Ý"òq¤—©i?ØÁö¹°—’p.ÝD„wÿï+^ÿmgYoÞ/"Ýq`8L—‰îXIS" Mîñ8OÀÒc¤É+Øoì2ÞÚhJšN‹yy-ryý`/…ˆ4ng?Ü2ž'ºåêg#ÃYdqWÎÃÙD· Œ—^Ÿ´¦Ëäë aZ'â•öâÖƒ"‡‚hxz öX¤7 aÂÓ ·ï`û¼Z¾{Ĺø~SARrô†'äž!÷rzŒô ÷I¤Û =ßdBÎ MK½™‘b7»ï$`)5>™Ïk'™{ƒþ×]ÀÓØ¾Œ|Ì@˜8FØ.ÁJH¥Qæš> 4†s ÅY”Ë`P8=Rú®È|»Lxß‘ÓHüÝNÆå†*Ù`Ìâ–3wdKJ’Å”X]rðÿ8!ÇŠ;ó"NØÕÖ~“,÷œÀL=ÍNàe~Š0L‰h°Z*"³š‚asÕ Z%¤m þðAâ×rVr»öÚ$<ü§kä ¸sìÑ‹FŒJ?ݨ$ñhý.9Øn“z 裃ùQg€P .í z|½—"û?ƒ“½Ì9ÌWAj4ñY¶™£ÕšÄ£0£G<êBÐ…Ñ-==%°øÊUm\Ãf ÉÙ˜ÛrK˜„ìPN»NapÀ^ŒŠBÚ'ls=Ùºƒ–峩sE™¿^MÆhôÁ¯=ÙÜ6-‚ðàT‰Y6~½5B]Q(ŸÁ¤z>‹)øþ h^ ˆT X9ï0ç˜>•p7¿"ØBX%8ºrÕ18ÚBÈ‘^}„ãRòIXdEƒXV³ðg¦Ö€÷PAýVê¿´ç.óŸ—:GüM à‡½í›ÿ Ú7ëßd&¤íþIQýOk×H¥îåe&¨˜&„ÕÑœ¸dw½÷U$M¤GïÂ!Gfãd²)w¦¼åW`çôN¾,à“ËÿCÖ`47J{)@>åuÿ`y¨W³‹¿Ð.~4:pÿ(²ùÅD8VO798@:v"+‹¢ÞnŠ<¼ÍoƒJ"üýïü×ìøåßE‰2ÖRmߊ·år‚4¹Þ}¿£ô¥,YÍÙ]aø ·`oÍ_»…`–¨±ùýº,"áù{üÏ`ÿ>À <ùðWÚz» çËü–µõ\ô˜"b»ß¨² R§g–U\Ì2ô[IÌOIò\Õ?a›"õÏî_¹~-­¬-ñ²÷j£ÿo ”2·{¿ž}^±[oæ# ?éRÂÈïg²«a)±\/g6MÆË›úVïû\g÷)»]ÓãI&õf¨¸³^ÌˈI#áß@ýäºZHB†’0´´)û${.óº5³ ÀæëÿÑß¾íxlýîÄ{߿⭿sLܺÏG{ý±Ï5µé„° LëÄâ¾2£óa5º]B7Eß¶c_·ÅLX“ÞÓEY0YHjFð¢I À®Jrëÿ}LÀ×>Q îƒ"z ì`»M{)]m‡¼ån‹ûÊ/ÿ÷9úJO¼ŠŒW ÂJæhÿÑš4Y `;§ˆu‰böIXU˜lf´EÛ µ¤ÉlìD0ïth#w^ÇÔ{`èÎò`·j‡zäöÞ÷¯+¥¿£¬ßÙ¼â:±}éV>‹ƒ1lœ€ Ó…ç~ *ðßy]‘ ÓˆäùÊ  DJÊÞàOØ«Ùv&@7 øv°WÜn”ÿ’ÕHŽì$”ò ¼XB‚9à(!÷zô¯`«o€œ‚l`úé.@Î`üFÏC;H†¦äÑÉÖj€zv9ൠ")øQÍß){ÁõéÎan| xíÄ8]I%$L±DX:i!f•‚³KãᥙÇKáhå@kßÁªw©óifž›+ø/1ö !KCN;ô/ÃÉ7A!žÁùáƒwaФwèMî “+h¬wéê!â* AX-Š÷Õï‹$Wop€5ƒš!Ë# üá½õ‹½1Ÿ‘uÀ{÷¿ê·pti0ÖÃb0#L,'Z`³[RæÈÿΜ„2€Ùå¨ÿŽùŸM¬J˜û¶›™õd;É[€;‹à>,3ŠTkŠ.ÿ¯ÉMXJXŠ˜)ÁVXõ”jB©//Kßðx`ö©$ Y£‚åd_Šd8§‚¨ÛU޾žR“Ža&PÉ"å¹ËüŸôv6}uÛc—6­– )˶t6¿Ü°¯nïÿóñöÏáÓØu€|¿Íï¯O æ(ÿBË)Ñþ‰2¬ñ¸ùh A§*d3"@sǪs̯å¦:Øva7?Ù[Ý¿'óœd~k®óÉœâ0×ÉY @p‡ŸšïAÔ?_”@ÊåÜ~5¬àÿ½_Y.Ž¿ÜãÖá°é2ñúo±úRÇx‘ˆ[@„4ºÿ6mñ{?y*¡îØý¼ªJXB †%nn5«¸J“"Ù’!1o§™Ì1þÎ+ŽùUMu4f?°µÅКÀnmß“½}Üð—¥É?ØÁöJÙKG8ä-Ÿ­¿Î"Û#íÄz*<†³èQɛĴN 0'Ìòå£Õ¼æì/Lì¶³«¬ú—Ì^öý¥=fû1¯±]Ûi½Ló–ωê‘Ûö£È×ÿ㻜|½cZ'¿Ô£ ˆ—ü—}š¶îÈ0 sšimè’9@› lG—’q9ñ4$$d¢ÎÒ1×½Z™Ù¤ lÊó«=ò´Eäy4ý Òí—åçáâ¾y7°Úïoa„ÅÑ Q¡+ŠÉ\!#“cú\:“J’éE9µÌL”™eüK–ŠàWàaæö­3ˆ—yûfÉþ—p|ЪÔz%3Ø^È—æd–$ 9Ððçî[8OØJÇLµô×zJä˜[ë‰KO[fàI‘…·\š;ú5Ìßÿ”÷òVãñvþ—Gow}9¸êä©pïÁ‚ñ"2^&Wл2¦u¢¿ç`ÜÝÖøFÿkØ0awGl«ÈÐÁÉ虌JZŽÈi"Å2Ñ-… IqœÄœ{[ˆ$hÂ,‘rJržtÍ)( $2“ÌØ+gP‘ *ÏÄ3©ÄÓÖ*Ô[‡ûù»ežÂ ÒRŽÕ 6…ˆPÝcc¬…Î÷£‹Åö@ÑWÁw&û›rmßãÞ/íé žS}‰þ1…œÊAÄŸ.–šc4ãî¼Yúå’ÀJdúüTV µ›»vìnï€ÿs»6_Síßÿ !à‰Ñÿ3áë6l&Ì×RÕ‰l>² Àóïõ¾(Ds5)Ë@º+^¤ÂjžeîS*é¦ùÝk(é ç{ã^ÿ^_w?”ÉÂ\êÏäßÊ~€d–U ¨j\ ~€‰ÖóN$˜ï³OÙ=Á.É€oÿg÷~ã¶þªØÃ?Û&cºJl?˜Ø~ÑÞa¼2¦MD—Š ž96¾Ú6UrMY“ý±q0l î³M“7ÎiÌ~¥¬ |ÜÙæ Ëýõƒì`{öÒ!„ùÿÙt!H'.asá/] ñ2zž›Ëˆ.ðqKç¹ÌËÜ:†ôR0Œ<~3ϽWäÇ,ç:*“‘ÒÁYÿÚ‹fYF‚ì×êzYiÇs7q9tŒÏd‡zävù×ãYbx˜Tëês@‚>gVÆ1GÕ‹:ð‚G:ÆäÀ›ˆ±ì=êfÙOÝ:NŸí–W"äàÂNÐä€LFgN˜\®4\y”YðàTXöÊù•ÑwN\8YI=çrÍÏš®à[I•¢«côLƒÕèë9º‡öo£áAÖR<"õoa«S$œ%,IͺÑw~}—[c³õçµìÕB‘à}¥æÁ^P©yÒ­qø•«ÿŸOÇç^[˜ç$ßÜ~²‰t1õp*FÀ<Š9€F—þÑ#•}ÙÈý§œ¿œYÀðTSƒáIv——T}5;ñ(eͤ€¥ « l¦´+iU„9dw¹} #£Ñ÷ÐÅˆŽ—èòºD؈ÙûôéÄÉ÷½²X"EB튷¹FÓXjü³sjYjD2Å£Ïíx›¹à§xÿDˆ6«¤4+€0·ï„.Ï¥žW•þá">Ÿ¿bö🮹<6ÎN…}¸åtclƒp†±ÈX® tÑeÿ')$zóWÂëâ!b!¬DÌXˆ§ÆHfž&èU  ^o4D„» %ènÔ~°Ž—:«èK›-Ä,«È¼dö8@™ïçº@,r ÒZ°!9¸’zP—n¯9¸)7EªŒ™¸Lþ¡R•«pºù¸NïúÖëpç-ló.öΤ‡âé4̲ŸÂi5oç1x?¾6ߟè•8ÃÃX¥ÿã•Ïõõß«ÞËÆ(H 0)Dõt11ø3K I‘äà½$u¿l› )øÒ‚Gõ›æÏæøcóBè„-­ ß<¾p‚ãB–„¤ß(¶¬ ©”¹<æ'Ãñ¥ \kÔË{’ÿ·‘ÿN×2ÝöQz´&@='¡:Ó²ÕT1µ*Ö éå7<µs°={\ý›‡;º7||†ËËý.@yóiŸŽÏ·Jf’ù©ÙùB˜ûsosr{d[™WÖr³CÃhÖæó»éBêš´Ÿû8ð_i#þ½ïÈ)/*`^oÿzoe>ßÛ™OˆÍ廽&›·¥!rM¢Š´¸h~–Áܹwõ–6D‹ú,Ê2÷Ó–å¹{{Ÿ©ì?ÓÝ1ãLHõœŒ 蛑H~])Þ¬ðPÌû8ÔïÏsèÍ‹Àö­ß=ùýÛ?ü«a?þŸÎ¹ûÝ$8ûsOíÚßS†"qk見D!mSŸÄµWþ‚‹¤É×-ƒýÒå¹L´] ÿÒ4ïb×írý¦íƒì`{Iìå#dË«™ýé†éªGT¸üñ˜s×icLÛä.·–ÏÃé\ŽHÞf€1KÙìD"»ó÷ZDr™\¤ÿk €¬P€ÍDz฾}`¾½8{ûß9ý¬Oᥰáa¢Õ4iJ\üùÖ%üÕ%¥ ÐãYà >P´Ñ/}¿Tu <×aQÕ˜˜Ó¹^ì×§Jh 4˃ÿé`ŸS{¦Èÿ›¬8ÙªS¡ðVë š9B³ˆXšœ¾oÂ@Jja"b.ã¦x8§”cƒ;f§9mÉkX%ÝÙ¡]¼ Ùñt[€ÔÁ2ø?D#fI½’*øäHˆ6£1f…øat0þ8KëwE—y×WõLVóvæ¨Ð”¼ ÓÙ~e<¼Hœ)wŽÜñµê…U/ô‘R¢ ž»9Ùì+¥ö…Xòº!’Óˆ>Pôþ×°)Á?Å.'Ì5¡ªiT”uªë’) q4ÆÆä’ò‹NYÃq26ƒ1ŽÆñ‘²Ð+«•;ÒJʘ±%~°ˆ_¬Ì¼¡ óüåâ8Z7A?YŽ6¢‚™bÆjªMAŸ ‰°4X"Œ ƒ•(“+q0³ÜæN„…ºt}Èàf§s„óNNr`µ 5b¹DþÌO“;ßeµäŠ!«L ÝžºŸ¢‹5Ò÷„0béDÏet°G 6A—ˆ‰³ü׊–¦åÙ\ Ý1ïJV_)'ÖÔ¨O‰Â»óܪBÿ”»Í^î)z„„ 6—áæûsù¾ýIΨ„;Þ¹—w…Õ¥«c|pWÑ ¦àûº¬¢Åj×loÕJ±òv0¸ÄØàÒú#VBnëBŒ^Wr4q—ëM@¸šâ,ï·ùªÂÃÍuIÿVEà¦ýÒ®Ó*4ªð|ÉO"”õn*XP,æ>¤ÓÒ³<¶ªõmÀ©èœÑ|®÷`p¤È›ÿ:áî÷˜6‚=úá,Íã¯Oi„ô…QžyZ;ûó-?X½¸üë‘ËŸŒ€aƒ1®ßíîL0ìH.ÀUÀºèykB~þ%‡FRÌdÜ„$Íë¾”L '†˜÷Ø„¥ÎAÑäHŽ˜ob êë5jE<Ð¥”½Mš¨€Pï×¶gr¦›W"žE3 ›R‘ æ¨òkŠ•à¿`•€ç OV»¸ {JF„úÞÝ÷ž2½ »^Ÿ„–r1ßo©+óèxn2J»°;v®`«Hþ½yIž‹>ß·2înÇœVŸOiãæÈí’æfÐÿæklöɼUŸzÓ.Ý(ç_·5·é3Я"™p¹§°GxòÙ=½í§J@ñã«øÝÅÔï³èN3Ë÷ÛðìaCsä|ʇ’:Fk¢òk¹·+²fíãíã?3 g·{³¼Ó#ûñô€HÉ„*âÊ#”Ö k!¤9À-Û%0|óïÝýrw¬ný诀]þdäÁ÷Vœ|³gy_‘~Ét™ÐeÖºJN¸ò`-éÅ#ÿ·ž’¦¦<ΩÇfL$uÝ9M6ûs®f×øq¯ùto ðj×áf<ä¦íƒì`{ŽöÒVÙòj"ƒ_]qòž¸N,_LÛ„vB\'¦wrqãRæãEt¿ØF‰—/¥³› óÉÁMß߀™c/…” ©ä5/@æ°)¹Ó“½Îšõ–»Ý¡#¼u;iÜþâ<ä­ß;æÁ¯¯X¿;±~7qúÍÃYbŦ IDATx‰ƒV⃽Ñ%üµÏeŸ<Áïò„&K@©x}P1,§1´ä“ (Þ08Ü!Ê|ÒbÙW¶oZ>iý`û íÖÀÿ}0¥HÖøîr/L6 Y?$­Þq'´-€ )½Ø%)m±ñÊõݧµ¹oîÌΕQJfÃ\Ýo2škö»FéL(Hg‹v¾ˆHïWÌÚHpÀÁ|õÇr¹I¬·pïÄ#ècŽÀO 6ƒ±.ÒgQØ¢.³2Àìä»+þªM”¹(L™(-„pOkðýv4O Ï´i­J;%èzdè[ß$Üý}ØŽ$ý¿HÓ¿„Á#7eýéîO±´BlvIŠ\yDÅ(¤¬Э[—ÁÜ9â=46[eÙÖe}n<¸¡sÕ„¾“ª!"_( æïn•Ÿ¿áNé{ÇÊRË)q´ÈÀb¤æ'1ƒ™IjÔ¿š9<ò_ˆâÏxeB—A†#”}'R£þ«|9åËóóh1ºú|È€DýŒQ¢ÃDr:|¿bÈÕ€ñbgˆ,Ltl±àsoW“3/§T<Âó‹\w òŸ$;¦uŽô•¦ÖH±yñ,V®½«íˆo“‘ÌU.ÚÏÝ|ŒÛ¯ã_(’Ìcì—‡Àòjâ½É¸¿ç†ÈQ‚º|ï±A Ð+,L3  ¤Ã¥ÿ´Ò‹ƒö]³,™^…^sõßAwëͪ×Ê¿h{ Y&$OŽðή('í#+5u×™J¨?œsí–Î"ar†ÉGˆ=Â,…gW}ÿè ªñ8ûðŸmXÜ œ~kÁp!t8"ðu¾K\_Áj‚I±Qœµ9IŽøÝOoÇcΑ_;ïµ$€ª àJÉIJJ€š+ 8+.¨¼]"ñkA+ýä ;Oªñg°¾‚ú¼oÀü’¸FbÁ-~®’ÏAÈÑÒ™VÓ@™H”9…€wk©\ËYY‘“ùܯٓÞ{Qö¤ê¸_¿Ûõ'?Ñæ½ëßT))!Ê“¶œ¥~ÎU¿+”­ ÌŸAí«›{·›ÍÍ®ßW™ß×ò_i÷HnÚÐ_öÊ´$€– Y  ½+¹Œ•ò-s¹º­1Çu@s©ÖþŽƒßE,_,ågÒÊâ,ERVc(Š–É~è¬Â!û)Üö ô³ð’Øc~øEáä}ðåʾ„‰’,—ªZ7KIƒ$êǵL=å–m ¬¿úïþ›·}àWÅ.~4 ÃG‘«ŸŽ #à }¼=u¹ÿ’‚5‘&fÌc4´RÊŽøo}3vT®ùm?ÆwûÔ¾Ú'í;ØÁv°çh/Úþ•Cärµ¸M\½3‘¢Ñ+q›ìßi›ˆÛÄ´5ÒÖÐÞAüàßíøÒ4ç¾ÙücŽt®*”y0oŠð7ÿ|ÛÁít|ûë7mì¹ØêÍÀÑHÃÕ;#ßú{w9ùÖÌèN•ã¯uH'Øäõ(މ4z~¨¸µ¹n ^¯âÖÐŽ\RiðÂ>mò sãŸ× þ½¡¨0+Œ¸Tn–vÓ¤f_ãœxªút¨_{‰ìÖ#ÿa§ÿ¡`ê¥ã1 š;"× çgH÷gØñC¬[jg¶ØpÛsÇìDHgüÇRuäÙó 8•É"GŒ¤ºÏÕÌr%ìû`׬H¯¼@•š2 løè"TYtYì3ƒ.}‹,­ß' Ó,¿½è„¾b·D6ú×íéJ°¤„࿯êÀP½ŸÇ09arùÚëaŸ#1¤¸ºŠ?ÒlqíîAÜ’÷\)j6†=z«?ÁNÏ‘p„mÏàÑH“Ö 1§f8ôİccœ"ç['c,…“$È&¸Lú˜PíÀ %&cò BºàÏ.¨ñ‡w¾8€A`½‚«SØ^E †tS¢!ª¹´4¢z<|0£CˆÁ£œ59€©æ‘ÎEú¿3qusÀ?  G˜0‹i ¬ÔÕJ€^ÜìÄÝ›Eú¿Wh,ÛÁ 1£K 5k€Uq©UTGèFD³DtNÓ!½×s6''Y¦H•ݘå“Ó Ø"¹-ÖÒÖf€Ñr;Ü*¯<#éª`HU@½ÌŠÌÂ-‰åyÛ}H2O²·'á/…³#°&6—,1ƒ±Œp™ezWÛMâu¦#«gà’ÿâuMœ PÓc¨“ôÏõŸ¹° 3qFs]Q‰;ÑûÂn¤~% 4$ÿ~Í_€¢6âÿ%?ÜDÈÀVÖT¯t›ÕIÉ| 5§ôøßüÎÎoâ7"*v±Ÿü ¦“ ë <R˜ ŸÒ~pH«q£­ßøèŸoøÒïc Þ\}KY¶l£p±Qa,6ëĘ`1À2Wº”R€AÄÇÏ‘o"û·îÆ6FvV[šÂð_zj„-;Rdÿ  ø×JØS –Êçn…PÆU¨)IŠÓÊ'n…ÛN.Q49QD’Kòä” È,Ñ_JúµÈÿ² OWžý¨µÊ䕲×Uòo›xYh‡“ÌA…âðqnÊÇW”h†ŠÏoŠÀn¿Þ]ÃkÿÆÑ¿Û~UÌ îÿÊ’ã¯õŒg‘ñ"ºµƒ¸¶é؈yPd€´Íï!^9†â꯹µUª_W”ì¶Ê)®ª¯šœÈsf˜$dìdÊMKQ °yé°·~°ƒì`Ÿ¡½T(áêÍðYŸÂKew¿³äOÿ›xýo®8ý¥—?ÏË7B%Ä罯lðö— ½;z+û­€úeÎTœij4ãb5ʰ­„ùèÿ¸åÁ^¨=øÞ!úàçÿç%ïüÜùî’Í/&®~:¢ A g QYËÄ€ìhPw4¤˜7¥ÀØëáPæv0nü¿&¥Ü8¢kÿ•Ý@QQµbÝ„ñ2|‹ ¹óÚFl3`1¡ '¥”Q,@ w¨îºÄìšH­¼‡G,™*sNêrŠR3k¿? õ¹4›Ç!ßF8¿Jœ¯1ñ “q±N¨G átå‘?Ë~¾µ'扢zïÃnç¶; 37ù,záh9ÿ¶_‹‘’GŠ…E7G„†½Àç î_ª!HwÔ_üãêM$¿úi l›„ô(¡ü9ÿÓã„=ÚáùG=pœˆ§†Ü,û;tc × FÂyb|g ¿êyp² _‹¥`j¬'aý> “q¼þ—»ãs½/›ÝMÂɇpve<@è¯ðT°œ< Í€z}9ÈÞ‘·É‘Ê)rÇÁºL>q‰*pYþ 8v9Wy'³ìîËÀ$Y–œÕOI`HJ¾Ï’ŸpJH2PCƒÂ‘ÁQ@V 9QXõÈâÑ‹¶¹‚ËÛl4 9¸ðº!…[EF:RQ[ÉýRn‘p5G¿íÖOUXÌ¸Ä êýðT0üñ†/‰ñá—Ë$[FW«;Ïéàƒ9Ù¦³L˜ÉýL2˜0'«˜UIâdž. C<½ °Ý«?]®cSœÓgôêrÿ¥þrMQ ²¯€A2ÑÕâÖ#ŸŸ5$cöÌy¢gðÆšñÎNîeiêÔun3bH×AðŸ½2âÏ"6¤I°©÷´!Až©ƒÿþñ¡^Ýd›_LüÆòmä»Tâå¯o°!ü¢^ÁzÃ’f†Wqe ±€m:XŒ.Ç‘¨ 2©¿Æ1 S‡FÅ4ùvT$v˜&$$ÀÐÔ¡±'Êèë)ejüRYQ úeß>q¸‚tuéå§Fá×Ñÿ ©—}"u —ïw¥±è€®)"#9 Àrä³j…­Ö«*‚4§˜Ù”Oúog’kþî\…æóÝ[¼“Vváû柴ï—1ª4ßÛ¹+ ¶#&â*Œ¶+þEŒüé6é„ú™ju®¶»û“¡ë²·%uw½™¯cW@п,Ëkð¯¤ݹ'Ï#ú¿^K_ŸQ®*î&VLüîP/é µ’ ×#“d–ÿ/haþ-ñcÍóü\ú­ÔFøä%»ÔÜ|¨J#J(Ͼ’v¾Z þ‹’¬ÈéŠâA¸™‰ ·hëïýWoþÍÛ>è«dïüà ^ÿ#6ÿbÃÕÏFâÆÕ§­1EWHCšµr*×4xÔšò˜¤¤Bn&ž%°q?ÝqUr-{ ™ûv‹çÁ'|°ƒì%´—Šp.¯Ûâ5åèíŽþž²¼ „•2m]æ_{ɪYgòèeKlqfuųVH°;:ãB/$dr@ʨجï³ÚÚpo}§#Üï$Ûå“Öö©ì탊'ßìùö~Ÿã·ÛG‘áa"¬`x±hž>ã*2­} 9^%¦ËDX ÓÚóHù€ÑÙ¢¢N¸‰[\qcœÉ5–Ȭ¨áÎI|¿§1ôõ@M¥qm yS]9ØÁ^!;ûß{>¾É‰—,GQؘ-HDdÅÖÓu$C†„t Ço`Ë€¤˜°à²þ¢ÞÉ x´)ùDr*†‡Sƒ¤äÑFª»u7Éœ4ûþßh’Aòr{Ê6xôü¢ƒ“¥rä}§.!†Q˜bÎÏ ô9:wŠ» çm6£uèdå¡?ÉnÉüxcòWÆCQúkáD/ÈÚðÓ(Ø…’~özþ¿“a ØE‡  Å®„d†\>è!­»¶ÙÖƒž<Ø›ßäèèèУý{б ä±øIBc3FB—#€eïàØ8yjô`îGá÷àü¾p¶~e¤ t[c9äYb9d5€8Kÿwy’Ë™2€Z§¼ÍLÐv[ A ¿——•;yÍýse9Nr°3+IhJIt$´Oh€®wÿi§²|]=Y" Hÿ&‚ŽžûX6Fw žZ€ÁX¤3’;j‹l‘Z5ª£¸¬4yfŸÎnr¦Ký“߯ëÓ®»þêŽqq'[¸¿…«îla‘„­«<_Õ”I,j–¢˜—Ìœäg®/j „òžx-䘀?ÿ· Ð2Xê>ÙÝßTgEÝû<ùxe{_1æ~f‚AÝÏ-§#È ;)aaÚíÍY\ú?™„™9·s,®ƒl-’˜×M é›:dt¢šd¹g"üT5n¶ðá)§ÿð;¤ßzŸN:x˜_«„L‚wHgØ$ÈyóJ·ÎϨóˆSÐ!À@2vÈÐAHÈУ1`bhìòzBR@S@ÆÓ(j™~f°LÇÞ;®¬ÖeùM/ª6ϳI3˜SޣȑÏ"á0ãÂ;1êÖ®5J}w™qG?v=SžSÌ ø^…Èó„ RæôU;ñÑõã^n*e®líúó2ÙYÿøÚ˜Û„›"ÚëpµÊ›> jžE—¡§‰ù/QÛd v–©·ò¯Dÿ›Õ(ð"@1ÛYÜt%;·`GÛ@Z@þï¬_ÿ¥ÙÞQ Èßaç¾ä_{Nc™KÖ ó4 )éÿDDò„66¼;‘Á*!Ãönp)³»e÷¦µOfs]¨ÕFššn¹ŽåÇߪ˜åîÅJiÊ©«(É©æç]J×§9ÃO`ë7ÿÖÑïÜþa_ Û~ùúx‡£/wLãîwˆÂ¸NŒ]ÓÚý·º€imLWé<êºLèÒS'ÇûmQHWÕ…TUäq‚ÀÞº•õª–ÌìÇ-¸H¶Ÿ*€yæåN|Ëã|¿·}°ƒì`Oi/`õæKu:/…õ§› ?VäힸNèrA61¿Ò˜å̳ÔÍßZU€ÔÈýië¤Qö:¸Üñe©6K¶Ã‚Kk|ìݳˎÛcÉI³~­C„¹3|ÜåÐÉ}*{ðë" À_þÁ#^ûÍØ‚‹¿Ø|0±z#0ž'Æ‹D·¦+—‡Ò…KEÅÁ%ÿ=-@+á_ê‘“k¦‹œN£ â&ª TŠäzÃ5)#…Ø¿[Æåý`Ÿ»-ÀûqÑÿÙ¹—ý?î(Š™"bž `“? Ûz=Æ|›#q0*Ö¯ÿ*X˜'ø–¤‚>ÕáƒJfžÿÏ(Î(<*mÛ2ß+ÎED€l5Ò¶0’¹Oÿαr²2bš¥âïŸúí :ή\% yî|Œ¾3úà5ƒ”¬F>ýý×\jÚ‚|¨˜%§;-iæ¢[¹Ÿ™9â„M6@‚éÂ#¶mÝ;°o‚Mkqœg0²5‚%O–½4± î#÷ÿ5‚þ2¢„#Rè–åi‡.GH°ÀÁ~ÁCÜÖ^øóUä‡_°¼æûŸ'¾µ llüÒq‡ ¼·‰(Jêµ3ب Ý¥¯DœÁAØ“oÖK=¤ªmìŠ*ÅMÛDûCAJjÁ—‚¼$'o”±>ø¼@– 9=ää¬^GÃ=ŸžØ%äx vŽ$Ë*î>&c&)(ÍA~M.-%º3K<—UiB°€d.I~Kv#!à×éC¤2|iR=.OÀLÏW„Á“aAÑÐ LŒ.BˆÞfwS¢¨Ü%è“0‰Ñ¥9uFgFŸ‚Î`‰§Ì’yÓ'ÂÖÌ•rÄPUWçÈ$D'Æ4`>s]«ÒþÀe˜ë¥ÌD€kõò%I PòBû8*9¡²€–(ª`Zaæ²ÌÇÖÇf•7ýë>~¢˜5*‘šóS?Ã}øþp£uÂk®"²YaI°77ØZ±I‘×FÛ*öúWÁ]9Ë4( V …mG:ÝÂ¨ÈØaËmV°Ü C‡ŒS·E£†%©ЩGéHaªÑþb‚Æž$±Ä:"#5eŽcö?Ô²öŠLíI,2CžsJ‘½ézîÙÕ (Ðþ.L»Úr÷x×N*Aÿ›eZ–ri²;WÊûË9=?çBs ûÕ°ûÒ¾ßR%ÊDIf2²û…\¿çû¦Í±ök&ä¤ y=§+(ݵæ¢Ü¥FE¡Õžg~¹òyO{2ŸõèÏ.ðïí~¨àÿã€ÿ]BÄ|?Ÿ·ÍŠHù•öXv?~Õ„$>?V’ ’vëÁ\ú[劽2ÜÞïOP|OÒh?Qú'2ñc®­ÖªìÔŸr‚òΩ%<ëMÚù•B~¸MûÒß9>=~»ÿÝ[=è+d?ý_ÏÑ¥¸JÓÚ˜6N*CÊAYÑÕ{Ç:â`Ä¢°5Òèߨ ¿1=š×w€þdî¿lן[ÖO¹CRk—òáÈ.½¿˜.qȹmÖ‰éÊ%½Cœ{48°)A¹sïkg×vr9/ÛN·/cÀzoæf»µÐÿ\mõfàè­—ªZ&võÎÈ¿sDwGIÑËþòA@:A‚¿èé Ä#‚säP‰Ð—$úR³GÜ£Àº<äÏõ§˜¨Ç¦™øñjÉ,ÑJŽÝºrÃqgÿþúMÛÛw°ƒ½ ;ûƒï]sÜŠÙÞ«î÷h-žŸNj´¨˜Á¨î(Œ8jf3õÈÒ‹÷!(¢B:êЀK×&Ÿøùw’;<):ñ\p$,Gˆå<†õ-`TÉyHå”n¶Œ'0Åùñ.{¿OÛÑ'w2%3†ÉÛã‹MâýG‰õÖA¸s$x¿{¬-ü8)ƒóxæSò³t±íHù§æü¡€6/ÉsÉ!­ÁÇ{[M"{EÝ/®Ù© 6Ôè(—í5lLÙ) ¦‰Ô.ï á-B¸6Á¸…ᯘ.þñÑàõ¬ƒ8»›hô åx%,zEþèþ Ô|{þ»×·L½p´Tþñù€ F·r‰rržã.)4AŸü1,e‹Eö9ö&,&3+qZÒQŽŒ/yÌ£QSóõïK©Äš"Z¢À…K·Š¸¤«9%A-ƒ’†ºìÖ¹b]Àº"ꃩݯaõ§°Š˜ˆú{2M9=S?2ØáJd%~;7øI2) £ÿmê•ÏQ[{ÈSîöz®’ðåŸ'¼Þñãxë ¿a ]ù5J•þ×8§Îè⬞Ñôd)Éi5JÁgJ©)12N}Üé$œý(~OÞ¬g`lò÷Áþ—·ÌŠ‘s%$þ%e©›±“Lê%'|hÈOüÇìW½q÷³Þ©©æº…O¹øï`Ëcä8b?¹‹`èjB6=ºY`ýäÑûC…ˆ=aZ`Y2;ÄΕ]R@, IQs=1A,d(0ogíàôõ*w/øçJDrž[ÿ—ѹåÜ–.Ja˜$ #Yò1»Ôðú¯|÷ú2Ã…yÌh6÷¿'®à1;ý¼ÝŸþÌRé`™X,uÐkS繿÷e• 9†Ô¶Ó¿]?‡rÐö o×ö!ðÜooT dS‰õ]™ïN% PÚÈ@G¤ví­ C4gxù¬|³¬µ”€] ¶¨+”t&åÞιáç{ ^þö.wg¥^»4÷àðßv£ýgB€æÒßšû×·Þ›=Û)«Oa›µ$*Xïm D<¢_Dê}tÉ©õÖësyŽYn¿žfÄ7µïú„ÿºÝüîN ž¯£Ù2ËÏ[šbóµîœ@-?%ÉAV—Á,•é0—ÛÛ²ïüýûÿÖ­ð³Ÿýï½Ý¡ W?ŸØ¼7±¸¯¤ÆóHJŽîM“k¥Éç¹ik>=ÈJÉŽsXMíZ@ý:'¾ Ïh Râö›Óƒì`{v@ _r[¾xóÁýýÀx‘Ï#áx–²‰ƒy€­ç¾‰[Ë‘Ì΀Ã\¶\·†.sî›”£—snóçÑ¢Í ·–×H–ï3ánRÔtšéTk‡ŽõSÛDã6ž%N©çø+=ÃYD{ Îa'_ë¯"Ó9è—…ñÂe¢÷•iˆ8›ÔV0ž',zô¢k<rŸ‡¶ñ‹í¼«‚ÿéú¾BðÌ€ÇþŸü?ØÁ^«~“[`l¥€“Þ©TÂMœ#:OÔ5Ì›É%%tYÛW0é pP ™´“Ü‘1%˜6eE&—žv'ž÷Ÿªîø0“ NeäÊ‘R(NŽVBàsLݦ¹¢°9`Ÿ¿}çÑÐÃdLÑÆNaJÆ8R?»Ý«…°Zø}]t9#ƒ•c±„8ç›|ºçP¾Wü’]A³\tq çüL#ÿ[«ÓÁ눙Ký§¹\–ˆ6K%êÛÖ"ÕibDŒd‚F©Õ¢;K»î/™>ŒL—.ßçWÆûgÆÕ$h€¯½©t;þøô‹Àœ&áac„p¬\ô‰]êß#–¤XJ„ÉÁ"ÂV¼î,’§"ïMè} LFïÁ½áÒþm]êDè3aæ£!Ö4½Î€U­SÌD€¹ßªÀ¾úÆ äæTÒ~^J“>û&2ÈÓ÷q5«¨ë<ñï²0è¢ Iž‚)m &ÍŽr¡#ŸöTžc½=jn¶£?û:Ûo?B~rÂQ8aûíKØd«ð`‹ # ³‰8nMA) SGdƒŽ=:uXìurà?)ššº,íï$`Í gœó5ƒŸ"€I-¥_0I¤\&‹€¾‘H3AÀßw.Ë¿cÍXÎçuëÚCJºÍ`pùVPQ2 ¡%>lÓìyÏ @Å}|6±Y]ÊÊo6JMDuq~ârðdÛÿ+¨ßßMÛSAñ|/JDûN”{iÏtnÌroO­¢qÙ¬mßf©ÿùŸ?â{ÅAßZZ0¸žâ.‰£<Áù×nÃü_Ž1ƒó×5ºWþŽþŸÁÿ›Rìÿñ`ÿÓ>ë›Uîo›@ r-k_ÖüÉ  Úgl4õ£ÿ7í>`÷S;Ÿ¯Q5ûo6ŸÙ{ŒåÙæšQ 39dÿð>ô¶fN-áç˜Èi$]«ÂÏjw¿³ø½Û=â«eGowŒg‰©DõOÆÕÏ&¤ƒñ"å FÇEŠCÖ¢«€¥¡´Ëø³NâAù£¢ŽH&Ô÷«Ý„]Üfsz°ƒì`/Ø^*ÀW¹Ë¯YÚÃYD‚0EâeÄ&eºòˆÿ°lkØ:zÉþ/£?R$%Æ+£_ùÄ`ºL„•Ô¹{šÀFÜk2YŽö—üO’Ée› fÖõ ì×Nñq/ȸ…ÝÎóБފ½}¨C bÀ‰ŠƒƒݱºÄq½B/Äm¢;4( ôJ\‰§ÏŒÅ©Ö4éXœY:Ò;ÙF¤¦Õ°Ife*Å'"Íì×¥š‹¬uh; >ö2Ú~}¦c=¦€ß@†qLjeÔÌ÷ªB«‚…ˆt KA[-~‰,–Xè@ƒGšÚ„ÄÆ›¶È¦ ‹£#;Ýàò¢ƒ‹«ë€m ÛªËûwÉÉÛÌX[+l:¯l—Ù½ EÆ€uɉ!%@Ní"Q!*‰‰¢¢Q!ߟœ< Q"A‡&­åKL’½+8ÀçëE1`&”u˜Áü<&©‹› ÉFÀ¿‚‚Ò¼SJø>Ü(5*úÚçÊG3i¸pÚʹ̾ä¹J[Oú?ÀãÀÿýí¹.àïµ}{àö<6ÿíÊÏçèks¿–æhr¨ó¯]:‚dð¿di— Ò^ׂ(O{>U÷>q.+ío•ñõL€Ø½ÆØ/‘þ{jíç5¾! ø}ó`|gçþ;²w]s9i?ÓþV;j¼üíRÞËõçRóæß}Æ2xãÕ~ì![¢ÁLðð¿™<#í°±¨lÌûüÓ-v²I´”²z‡—³'vqOc«7ýð·q¬WÑ®ÞùÊß=eõzÀN¾Ú‡DX qkLë"óŸrêÖœy[RqÊAã,ÿŸ†ü8Í)gß-M dª"ò>\›1‘ó8`;ØÁ^f{©»n‹ûýøÒ¿}LG/ŒíOúSe¼ˆL— ]Š.s €µwŠf ˆ® †½ãkóš²2À”™oE ÿ7u|°Ûá×ǘ×é:Â[·¿~PøWÿí‡|õ?¸Ãñ[!烅ikÄMr0ÿÒ…6qq`4b(–Q£ÓhM~¨2dÿË ±Ô“2¼ ðoI4ûõgÐx¨'{ìì¿ÿ5É.ZÒp{LãÔ«ÇÝ}ÙÜÅùÔY c• .õß+r`yŒ¬Nå tGˆö˜vˆ&ol ã%ŒØf aD6Þ&)K:¡MHÔ þ»Ì¤•ð]c¤ªvå-ߗϧ_¨þTchÌÀ9_ë­±ZÛLÆXtB8†«­Q†Ñ£ñ·#„à Lÿ[ðæYnÿùÀóŸ—쌉Ȟ[*;8 i.§’œäBH‡:’FÏ®ˆüÛÓsÂ┸¹äì?ãüÃ+î› æò¾÷O”£#e|h,'ÿ©«ñǯñ@ÍÞĹAØŸŒØå¦B„nã9ËÃ$$õhû0¹â‚©?'5oN¦\¦Írt[*NÊLÚµ¹™td·Æ5[R {TŒx4´¹”AI>gð9BmÎ4“tÔÇX!€ö KÐå ÑLHrŠè1HçuÝ0» ô+¤ï¡S¬»Ädò¶;—U3Ëòãù”JÔ#’“ÂÙS;ù•okRåð *g½‚0NF è„«Oˆ×!È äõG„duYˆ4õeЙ8¡Æ§Ã ‘F²Ò†“gÊrN§!Š*@&hó~&™Õjº q‚ÀfL»Êy½¤pbD›£ý_`™Þ‰þÏÐÂü¿¿B| YÝ»Bý Ó þ0ÍS˜9‚õ³·òæ9:¸ÀvìèO¾ÉÃÍû`ùã7Izư&ôÁe3"عäõ¼œ¤‚ú»ëÖ3íûI‘¤ðÿ³÷n¿·$Y~×gEdî½—s©®ª®®î§mXmƒñ زàÁ#ˆ$˜HøñW€xáix…€ cKBHÀØŒ/ÓsQOÏôLßêvÎï²÷ÎŒµxX+"cïßª:Ug¯£ßÉËÎ;32"#b}¿ë»bé9Æ )ýÔÆÞaŠGüå}QjõÒiÑZÕ6F­„"´ÉvÃÆþ­S‹;îû'àö¬œ÷.(Öô¯?lì6 бF÷Û2^óSñ ޵NÀ±Jïëê}ÝGˆ£žy_϶{ÚíA[® ÷²¾ÜÂÞÿq~×éÞžfôçÖ½WîSd  ÿW=BÌÕ¬•Ÿ/ý›= ÝãGz×. ?ñ®n÷|'¢?µõ²ÿýç©#ôÿ‹REÒØQ=|Þ“½gïÑ®š¯õnø{2@­s‚,*õ¹¯|N8žþß»»î|V=µW…ípÃbÒV‰‹ÒCŸ€ñë ÛZI…êˆ-)%Ì_Z/Ä^õ ®›?š([ã'¿qËæk™©bëE 94õc É¿šîØ—,©'CçÀ?"ÕZ=.1 RkÁîÏíæD½¨n£Êºør¥«ºîª~ù¼u>Âþ“ìd'û„öÒÌ~gýE_ÂËioÿõK.þÔÈþý™ñ°ykÍ|]H+ؼ婜)Xn•yclÞÊvî–NKƒ§“uyrêºtL8£–c_/='àå½Òu|ÕúígŒOöÉlófæì­—¦Ia¶{wæÏü'Ù½[¸þáL¹Qvï'ÊmÕ\*¾ê˜ã¶vÔ§®m'»mäys¢“싲2{ò]ªìE¼«ðµªqϨü£&¶lþŸeØlHç±Í#"Ã9ÈHÎÉ 6¡¶Å6OyðÄÙÃ5¤ ¶! `DäIL EY"%"JŽŒ;/û¨ÿ¾]Ÿì~“ïqà#'a< @QW@""9ÃëûɸÙÜX‡Sg ™@Nã'^à3xÙAÿ5é¼[}j’ DŽO’;JRÆ(Ì·ï’>¸BVûíÌÓïÙ_¶Î¨ óìr ) $ÖWvxç©ñ¾z æ·þï=ÂÿUê«R´fî¤KÅ–º _™wí;ù$ÿ°1xðCãûÙ%þÓ ø¯BIFVijƒ ƒg4aPO PÄÛÐÊ„c0OP÷HJ{û2¼Í¬D˜ÍX‘Ø$açœ|Ì3$álv³“nR€‘̯YÄSÔ¶˜–öÙk¾HÐÿØz¤)¹šœ Èão^ûKÈø:Øšþ?Ø}—t;S¶ÉÉbóü‹²‡ÿáo¶õ·ù‚_ü/¾ñ^ÍËgùÝK>øß3üYÞ2öW[l=Á¦P¶†MÆ%c%Æ÷Ó€yŽ-jÏQ± ÆøØ†–t2˜’jzÓ6¯-æ)d,äšD½Gò9s€¿æ=d‹Â4ðt\ÖÐËãs$æÝÖ&ç‡rðÇuõ#TܾYÖÃïDé[çÝPÅ®ßzN§%qÁV£Î#dù#‘ºû’î{î=>ƒ¬#ÇŸÝþ÷²õÈ~fô¶E/ Cv<ºŽ:¬•áös,‘úLl_‘)ÊD—2‰¿…¬QÇOzà²|ù·^½ôË{îñ ¿'}Öÿ‡ã˜¸f‘ï¿S{éþ{Ž^É(ËÇ¥uHXžoUoóCTkÕðñZÓc—vé÷ýö?ñÑ1vßÿ÷|g9âym¨?¸kKñ½¥9†t|%‡4eo¸€«ˆ¨KÊ#‹@Õ °W]ùê'†sááŸ[só'{ækÇÏWÊþ‰"ƒ°êXGðÔÈ;#­dÁ7¦Úº ßnDúk§Öj3Ì‘Bà à±ö/ýzïƒ=^žìd';Ù—À^´ð\ÞoãƒDhÎk5²‘Öž_³ìÉ0¬-Þ3Õ¼8‡4@Óæ®ó‹%-Š™ŽùF[>3r¹ï; ¤íãžõû¶Oö©ìµ¿xŠþØ?Qž|wÏÙÛè/îPÎܳ¦û z]-×!#µ?j+U  ‹ö?h7-ÒßÒdž¿ ›übí{gÊÕ¥póö+Xí„ý—.Ÿ’…ÑÊ¢Ö¢’k4sR„ÏAÂMõOhÌQʱ¿å2· àûFI!ëï̾ô(ÄúÚ~8d²iˉž€,Ê€Er¹ÿQ ÉF®Nç i5À°AV—X~H`Ã9–VHJÎÞ‰ÎØš¤ iÂÒK;LvP#6Í‚leŽÎ&'[Z‹ú·å]ªõûÕy×þÎêDÈÿpǾ »s!Wtr2Òd”5 µ¥H‘)4/é4²: ÅüØ…Qÿæë>ŒF„kS¶^ÅÙYáJ½íluIp5†½«$Y¢ÿ‡ÜýÒ¶ï'éÔmé>«‘¥©ÆÚñ•,p‡8pxÎOF&è&ûõå3 0¾IÎo“†Ç¨^b럠ëïcãSWJîÁÎ/ÈzðNQ•÷ÙêG¯±ý ï÷n˜ž جÈãÜ$l28Ûa·Ù‚­ ì*‹]=š°ÕA'Dr€šÍ%ÿçh˜%Rh"…*€/…±àm Ö]£BuàÀ\¶±ÿ˜/ØÚçqèAô²¯,òòõo9!ÖßÚÇ=`ãQ]–îÚí4_˜DtÿAÄÒ/ÕF\›V~aQh€·„rÏQWÛäˆ@»§ äö÷ó±°Êîâþ?ÿéö-Ä€{ºè~ê1 üöËL¶šwñ5B»‚ݽsåØÑÒ_e?¨ã†®Œ…€Ï—4%}ÄýA1tïN/’…ÀЮŸ^àPÚÿXà8 B_'¥c‹´]Å^êÚ‘rÁÁc~–£©+Ÿ¨Ä}jŠªN±Lz…&s' Òh{õÅo˹ûk¹ë ³VþfG«÷°>Êžã{^ë‘zßµYJGà€0TÙ'½j„b$ ŠÑ½jß6oæWÞ¯û[ÿõOyã—Îxã_=ãêû{n4³ych ÈùÌý¹:’=-€îÉþ[÷UìC’Ü!H Ò8VjµeÙ¬k ãšã*÷¼*ø¼ÏNv²“ìs°êþ’ÛùÛ#ÿü×Þáõ_<ãòçFæãæ‹G+*ìß/È ¶$D\âJÒàÒ6iÒZ9óW:.±ÞHÒI™³ÿ-÷‚œïhûð9!ÐÆâ©¿;uŠŸÊNN ·ífýšápû£‰¼V?;0ßøDe}‘˜· [e5&WعÔ$|LõѰ!]$†ìû‹ÂÕVyÿʲ±zè s_®c= ›ŒÙÁÿýl-È}5º*@u žHG¶xq½~'sö…˜Àl$Õ–KQ’&†½1Ì€ ·ó"¿ê ´÷™/à7~æÕ‹þk~ü–°=‡ËUr©ñ•±ç©äDž–ŸfcÀEUšŒ¹YåÊ+I IH–³€—H‹d®`ò›r@“¹~.UÊ<$ÐÉ\b!…n!iîã¢4ø+4W!ŸA:IΑ‹Èú2œcytðßCCÁÆìs–”Ie`feDV›™Õß³³FÂuü}Zªÿ­N8êDC¾r㨿wöj’ez{T„}]˜ÎàL„lÆœ«¿×yORbê‡c>ad 3 EC Àë·“† ¾ .¦G‰×_Ž!Ì€“N6øvfµ2 §1Ö)œÄ…)²E„$à¿+ ¤däæsüE|j§v ÿ^{Úë™^Ñc!ÔÏëñÎA´î{u¬âýåG5VYãætéÕVöP&D5Ô‘X.ôs¶cп·W=ªòØò»—<ù;ì/?!½³!ýhåù½w ×ÜÞél3r;8`‚!ûŒÍ1~Þ äý€ìGl(¤i ÍšŠKÿ—Œ‰’4#eQDý½o¢d28áÖRtžÀßéuY¼‡úW%‰¹ì~ð‰ïT@¯‚›À×ÀÔhuÁtžþRÏM—ÿ\Ž?#@äÚ?A¿ºØa„ñÁ€N˶m™DcCûžŸo!Ô¨ù…6q?à¹vøkk;ÿ£úÀn¹»Ï/³‚àË­§è×­!m ö«Ënû»ÇÝÝ—µ­€®¤ËÊV'uU¨Edb~ËYš%I­lõ‚ôo*Ï[6¢ÀB†¸ßzŽvaÑ·4 ¼Öí£:Ýï;˜;]¿ôå«uŸÕþÁêï:£û¦¶¹“ª¶jÚ“ä[!u××®é>0ÿàÒïWb88þøF?ĺ$ ‡mÑlI!Øæð•í9Hb]¹Õ癓R”5»yÕ}ºOÏ/þ—_çügF¦'ÊÅÏäË„î<â¿*¸–½Ëÿ—}ìïåÿ÷˶U5×}¬ƒ™P>> ìÒ 1m_Ò^A}3Yê<§Zžìd';Ùçj/ à”»üÙ¶ý±K¥!1ž»|MZ ÓÓÂ8¤3(7ÞÑ ê`y’çÉIkwJˆyÄ!ižVÒ:>Uw–H× RX"È”0%-c ¼ ?\SêoæÎýÛ'ûØvjCnßÿ›OÈgÂø(ñäw÷¤Ágsó¶9L‰Á¡¤È5ùºIÌI2³“zÀþä æ4zøÙÉNöU3Ég_ÃRväÈçÄ=¯ÅŽ'ÿ=«Ý,ª¶1]&Þ˜÷IõÞçhD‡º»Æ¥«Ø#Ãë ¶¾ ç0¬‘aÀR)á ï)ó¸We$ ºNh™ýºU#Š©€Í® ‚Ö! )qÙÀ*WmI"mÈQÀè6™Võ¿! cŒV§Ù¸Ý7[k¤ý ×[Ï¥|¾Õಌ›ÑI5x£âÙ­êù¶¾²Ö9³?Ù¡FÒ‰ˆ#Ǥèÿ\EŠÙP± ç Vk!çÄaVa_|<8Íp»WnÎŒï¿zb'ÿ‰ƒ•˜RT‘é_MêãoƒÕdŒ3`°Vðƒ•ÂZ…IŒµ&6ÀÞ<5ÀF„½+\ª\1Ö!U¾7c%.;>›5bÀ(‰A`LN “0&°FH˜«HBL9³§VÔeسçá”1ak!mXè°bd'bQ™‚é„ÇW+*ÎŒL"è:òEÇøkVAŠ¿ûµD[õ j¡æèkº†­F•3x^7ô²ÛI¾> ·{ØüÔxx g׃[a?øã‹G+f“šù§©cÔì/ðÏDv ñv—óäg©JNÈxÿ‘e‰Ü¯ŸK·_dI§Ñòà<èZú¢ƒHÿ—Mò¿³Ú~\qi6lop»…§LY?DôML¯°«ïaW[Øã>¼ƒí¼¾€>¦=ô¯öö/_|ìó~Õm|ç!Û_ú éív•±×Y+v“} p¾÷çs“ѳäK‚›ì¬™)Á*cS‚)CV´$?¦$dŽeI¨&'ÄÒdF4{ÖìT<òßQZŒ0غÍ-jÄÅ¿-a¬}¶Œ/4êV©kÔÿ˜[A>úéúݵC¬¿E+(XÑ~?÷p×êÎ2¡Idôt{Û¯Åyb³©,vßv8ñBlŸg,î~Á  ·ûî²ß#‡Ûà¬5û8Ú¿þÓrž ÏrŸõ®»>]áiô€ü°¨ÂG‘—¤ÿFÐ%âw{FU'|žNغ[.®òRn‹ÝóÖû|>ð¿,{hºÉñ[ܳ,ãq¿¾ <ÇkŸøž;Cl;Ú’ƒ¼_ž‚±”ÔÑSYêYûEŸÿÕNa£í­ï·v½Ë9íèò¬~í𺻛2Ž>ûØV¯¯#|Z‰VÏS‰&þ/Õâû”öªÕ®ÿpb÷^a¸HìÞWæëBÞ*ó2߸ÏvºòÉ‘§tí€ÿ>ÝñtñïÄES7‚ûÒ=rìÇ=ª²M8n*ß;ÙÉNv²—Ä^Àæ”à™ö3ÿöæ›Â{¿µeº*m€?ß*e«äµ¸Ìy'Y®“µ|æ9o´,ëV@Õåþ[¤L¢jÔ¿qý_Ç×GëmÞ¿ûŽïÔ ~f¶y3ŸÒhÛwfÿ…5ë¯e†‹Äù7G¦ëÂpž˜>(LO¼ýÌ7>¢ÓåÖCÝ*e¹£Ê2h´É™¢5€õí¦Fö÷mÅøP’@<Þ×Nxξ“ì%²§¿öóØ“ þàÿÁ²`ïí1[Ñr‰xË–Èœ{gÆf-ò8îN00UÿkC3£FðK0ð1EÌÕpLi•`мb‡Ð˜7û™‘T0Ûã²3fФˆ¼32gò èJ=È4•p"AhÈEÔ$ª«“ÉÉ4Ð¯Õ ¨£+‡zûÕ™ôªYªþÑü/¹,Ub³6+áb# !3?$X ž*`? s¤~WT—ÕiúU5Ϲ DôxC‘Ÿ²´ãÚӷÖÉTÝeê^ƒçh*9yÔÿ\„aVkBŸ‹ñäZ¹ºR¾{ñjšoÍÂû“±+ ®f†-ìWÆ0y†—ù'Ø'sâKI"W¹Â,0ìb1ãÁñ“˜ç2WØ£.ëó±¶×êJ“xŽôA¨d5eÂÇ«‡Ìã••Ì߫ɔŒE4²§Kƒ§Hƒ!CñŒ*¡D–³"63L{ò舦Ø@’]¬nHxxMNê ÜuŽw¸Á`X6R24%'L ¸â„Ä›ÓBI ¹ªÅìÆVR½ü_²wé;Yyw8 ×ïn`Z'6£[~²QÖY·>—Mx{)¸ì.PòaêŒF °¥nüUe âs ™4…ŒDG dþY$ýa€Eþ¿-“Ó“RZˆI¤e\9&TB€g«pûÜ,ü®À¡°SäJ!ý›·Øæt‡=ýû `»ÁçLRoˆûûZ3wÈE¤ææNÞI§çßãGüíÛ¿òøcç«lùÝKžþí3ì_¹&ݬái†'Ö* Û&'|í¸°Õ »öhAöì– ™äf€¬È~ M6d€xW I ­D’AÔ”Xg‰´ÇÖ¥>–ÀBˆuÔ/ 6b, ®1êƒÂîóù6‚ZO ¨Õ§kËãõ“ìd'û ì„~ lýZ&o„óo lß)ìÞ™$öO û ÃYb¾)LO•|æÒÄÓUašáR˜¯=â9m„rë’­V*Sš.¿yíY:¯®3[nÜÏÝéÄêˆòÃ|§Žî…Ø«>P¬vû'3Ó'ÅèÞ˜ž8da¸H”½1Hj$™´úÏ YYi@§e¨Ó¢’aEb€yik[é†}›ážåÉNö%·§ÿí·½îߎÌßßj;x^Ø£÷~¸xïÙšäí+ʨš êNÉhsR;15È}4<8ε –ArBru,kHâ®ð—‚É-˜ƒÿ®¢£îô2Œ¬ì]!À"ØLî,Ð*QªæÈu80G ¶] ½vœ.·çÞQY}ÉÀ«OjÍIDB†¿µ[_€Ëp±viÿqp9ÿÇ—^T7HWµ¿ù IDAT[cžÍÕÃaÌákTiÄ‚¯j©šº#= wãKJñçŽÍÖ>aÐÝi¢G²¤)»ô¿…TvŠfš…ÝÞÐRŒÛ­q{]ÐRø§o|¾åð²Ø¥ »)±¿6®w°ÙÃf6öYXXaNƨ°2—#_›°2' ¬WWÀAÏuò8úuò¨ÿ½Y“Fw9 Ùþš‹|)›ï=<媰ÝAB¹!iD$›’Ì£ÿ¸ã>)©fPÉWBZ»@>‡´Ù㨠{’ÂÁó#IL0Rç–‚SœÀ0ãNx²ÿ†&¯¿)sDjJ'ñ«ºÁÝ ôKú÷vŠþw+ÿhÇæÜØ‰wŸÌ¬·00Ý(ã#ƒ•«‡3LžCÂ9[î›Hž2CÚP!©2èÒbPÁþ%EF%TÀ¿ª$qšþ‡ ®Ë$š®þ!‹Z@%¼TJ‰ Us)u¹ÝCyÒ»¾o+Ø.ÃW¨ÒϸW(¤õɽ*Øaûû䬈3ÓŠÀœ|}öu)iYqe—’Ac]“¬š".÷¯¾øª5Ý–4B€•nÞmÉçã1>Ñ ÚVTÅo± ¾Wp“Y—8çe4X_~d#ÔÏz“:ŠïRhHè‡ò•`Ku €£ý^Lâý¦Ä;*ºð嚬¦¶ª?lA®¡;wÕ÷…å`å~à¿ÞÓå7ê¿EÊÇçéø>\q`ÙÁæ†GYX»ôìoÑæ Þ±T‡¶çž×QŒk+ /ýþv­QÚtM—)îiþKy-ÀOBXæ•ðO,j–ÿì`µ¬´ZExÈ~pëužÝßgÛîÈQO@¡íºëµ9å]cŸ+åYwMË´qˆÕ{X4ú#î:ÎìhûÅØ³HvЖ+Á¦X´¯ªŠVŸÎ^uùÿÛÍüø×¯yû—/)“!91^BÙ9'æÉ° šQ'‚JôÏ£8R±P³â~ßYd!ÔcÕ?»ú×)uúßôÕU߃Wùqõ}ÑÕùd';ÙÉ>ÄN€/ýÑß~Ê|­¬ßÌLï+Ó’7>ªÌ¶*]¾tfÞñÙL°ÓÌ;À P܉V¶;Ö†Z¿~ê°^*{Õ‹ÕækåÑ/¬8ûæÀîÝÆ '˘Â|k —‰ùZ)“1>H-w)Ö·Šda¾5ÊòZZ³"hHóV†èA¾¨gîiŽHwTìžöw_;<^Þ¾“ìE›HLŒ3˜{¯-q(~®æu«œ~FT?çØ1S#;Y€ÌÐpoŽèÚØðòhk¿c¸T\Ó–¨Žš§³gí3€äký^l†a{d,Á4(i['4/¹Ð±N+¿ÁæhSwh‘£,Jwï½·)Âý+ýÒ–c^«AóÈýÆõˆHö“1Í^çÔŒ©¸ÀÃvoüôåzë€Ç—ÂÅÆQÿ³•1ä €~˳‚ÿsA´@RdŒªT+9ê“çåmÀ®Ý,^ ¢Ž†#9Õ^1­ ˆ“ÆÖ©sîd-¬ÎgVo(ÿøõÌ«jO/Œ«GÂí¤Ùü•0y6J†4Cž=‚YÅ÷ÅA¡ÃìØÈ8G´s€+&l‘?ÇUªüùÀpú_9¥©Œázëuç‹Ì*™ÀŒlÆ€Gÿg<,û²iöˆÑÁŒ±(I'¤Ü"–Hd° OÀ9»2¿$c*ËG4"BÅ"B0äŸ-EDc ˃,H•EjDœ-d±¯@5û{gó} _¸}mþ]Öü­ë <ºññôœà¢$jÄí:†#°ÂÛÃuÛë¿“a 0?€ù1Õhü´¯ |r.Vé~y:l;¾W_•_yÿµ6~‰1V2 A’OzlŠ`{Áv‚5ð?ÚvS„:ºg‹ho ò:ä?ýlWàûߥ¼çêå“þÇvš'ÚðÓ‡¼ÿO÷ðx O°?9Cm"m Ýfä&ǰSíàïXÙgØg,dŸ‘}ÆÆsŽHÿ„Ìí/ê@?ðW—ÿOš½oÐŒXì3 Yü „Æ¸Ä ²,Z€ †Æ¶ÆðÅס™øYnm }/öcžbu¬Ôˆ4à°þ°“"zºÞHm ê¾wQÈ5-°¤@; ·Õ±˜.×ÝÍ [Þ5_ )‘ßwµð_Ö¤ý|Gˆ9KúDþ/‘ïI–ÏèŽéäåR;À¸ú'kÙT¸º—¨ëû¢á…Ê>¯½Cº2kÓVp~‰è§âËvM ­¼*Ñ¡þ]ùôÀýѰÇ%Z\y-ùªvpüÆœ?«LêíÖñ£çÙê´zÙ¶ãê¤í—åÊúºtÏ5Õw…©u‡÷0ÿò¼}\vpòÞMðÙÚ  m÷û-E2„DÅéH v Dõ íU—ÿ75Þü+çl^O˜š¼tó”$+’º5æ„ -5ÇBf#­ŒkY€PC–ÙAÿÔ?Öè4©úy+àxýØç«ñªé†LÍÖWù¾ÎK·~PŸe Ÿìd'{•í¥!¼êÝóìÏüÇùÍÿê'¼öלý¥‘Ý{…rëÑþó2_«G÷oyk©´æ8Ï`3é̱ˆ†^&E©H´ŽQR|ÞuvËe?ŽáúNìÔ¡}&öÚwNQ ?ø»Oyó—Θ>P¶?,ìÞ(öÏ¥P¶…éÚ•æ+¥ìÜ™e³¶¼Q:ÓÚÇôÄDƒqšq‚Íä¿©5&ß?¬m¡µ¸¿}œÚÆÉ¾$öô×~.f5¡•—e ®{÷±ÙÖ‡CÏ­6ŒÅ²xcb»gÓÔäíÖp@ M@ÌÚŸI”$cFd‡ÈCÃèÿ&I+Œ5i!`‡ÙbƒOG…µ’F…Í„‡ØêÊö½w`Kbx’¹pô$ø§¸Ö{Ž2I]ù4Ç^g ê1_MëUªõ¯Ç9r¯ªÜÏÆ\Œ$þ…©ÔsÁv2T…UŒx‡ì`W¯ÎAúU1fEJAV —Ù¨Ëçî® ›½0${úоmIuö…^ÃÅ£ÞV¹OßZÝÌ)ÈfFÆ8Û(çðöcЧŸ{q¼ VþÁ{ÓÓ‡¬¯Í­±[¹TùfKóS³5Ir1X•Z´ÂJÜœqÉÿ•ù3HÀ‰@\ `ÒzV4‰·›¶ŽocÆu†ímáµUæáºFBG €p~ædH^äÿódéÌÈ—. ùlOºØ¡:‹¹,¬™‡ð§d…Ú€ ®(;H e±ÇdÆãÊ:ðDð¼¼¥óœÝçÔô‡€ˆ}©Þ›'ïÿ»G;¶Âxžxw« ;c^ )È2iòKñ.7WÊJü Ù<`y0ÿ› U]ˆ2•_’–Âp½´Ÿ$ц¶.,’þ5úßÛI¤¨2ÿ˜x|·z²@·.í˜g§ø\È1_Qd4Xuj®íг“f)"¯Sþ?WÎßU‚ó7@¶ØàZP~õ¿ÐÛøö¯žäÿ{;ûg?Ëö[ ß¼¥<Í(;dS(7xC‘Û„Ýfx³xäÿäÑÿ2e_3¬2û×)eÉÁÑâc ÁPkñõ |‘0)@"I¢x¦——1ˆ0Ë>€Y€ÎP†jdûôö¨4 ²*-düÏüû¨<¶,¬‡…ÿ¬ÁÇuzÓ“Жn®Ônùh3þ’®LVˆ1˜AKCfêÀºY+‹z{=@ŽoëÞæ)«‡ú °íë•°:"@]¯ï¬D’ AààÛ:ìå“ú¼#µZz·öìÀÜ]ÉÖ—?‡µŽwµû=ˆâç •DÞ5ÚS‹ñðB@]ÓÚº¿>Ãz?õÎÙk÷×ï[@ÿç”ÉRª÷˜´TtíY¶úŠ·O–g,¶9ŽZ„`º”ìSU®¡N5î¹.;üïîgŸ©£¬û»á¥TI9‡È¢uUòN|íS]äI©n83œ'ò&1Ý((Œ2e«ö BVŸ™á)¶VBZ Ü*VŒ4 ÓÞçùZ Ý‚ ‚Nä%ƒã'ºTPvþJ-[ Ù%­@ÅRPÂoÃâÊê\[Íî« Ÿe5>ÙÉNv²±—†p²g[>Küéÿà!ë×Lé¦/2yd%ÈèÇÉ€OrVY(7ʼ5Vç.{®{CÎ@ö ;.e«èÎțয়K÷q¡Ëun ÀÙÝŸ‘>ró}ÛÏÚw²Û¼™9{ëÔ”wïÎ|ã¯_rñöàgßʰœ€ÑSe\+ç¬ÀôT‘Á(;£ÜÖÈ¥Ü8©Fk»É1pÜ[#øÒй*ø€±å꘣u°xÐ~úA#Ë6°Nv²—ÌžþÚ7,t]XY̨ÉÖ}^|ÈšG«wC¸x8[S9òP Í+Ò7”)MÕ£œMª¹ gE²Ezs¥Û!\SlEbòÓˆ‘Ò9¤sŒKÄÎV@‚R€=ÅÎ1aL°2lòÆ+¯#| ™~Hß•.g†Gsv‡¦©“ðGèÁUc!Ô‰å±g®ùÆl)¯¯ UÃz²;Õ`7¥ Òþë­ñð<‘£ŒÏÖðõlj'7Êמ*`=Jœç+\t•(£êQfÒÛ yýçØùã`RЊ·9úv¥H×uÁiÑÓ‚J¥„TTêp§¨GjØdÈ`¬d~c³›W“ðæœøé²ÛãÖ{ÇËrq‡¯f–ô%%m5¡ÉÔ£ü5Ál0˜0‰« ñl¶8mÉð<èwÜ,oÙJz©¯”bÆ:Gn^ÜA¶YÁv W[ϱ¾N®¬á¯6K1’*É,N%å ìŒ|³G¸EÊ’îIx”gNWÏHiã`€FîˆIQ]Á,ŠhAÅ0ÙùëN¡åFh“ÿûÁTxÙkTå—ÐÞN oÌÂG(£ðx‚ñ ¦.n”GWBRO72ªpV…€Î-Q0F„arRõ |šœ¿üÔ³ÈùW࿦ͨ`¿tQÿ½:Àó@}:pÿÁ&ý/YEí ›fN~ÞéÂHÏáÁ›Èðæ+äƒbvC)â‘xš*~¹4Áþ|Ý›%ì=6ü_œýµò™ÜÊãï¬OóäÎÖßû:ïÊàÍëí6'¦óÜ®a?øût¶#6(r³‚)ù{¸$˜lå*{sa­bÞéƤxä?š°"±t%ÓD*Ùåÿ5a*ˆåå»êrý ž^Úx¸æƒ&@îådË>åhs† ž×ª·Œo*pÙÛG{ø²ƒÆc¾²ä¯Ñë•@#OÒ}¿†¦ËAµ\ÿò¿´wˆF3²ƒCÓp) Úô“nr´µ”åˆö>úŸ öŒÜÀÿ:ÖÃÓ·y_…¾¡R÷@·V¹ÅZ³<1k÷×—­8[ÕúÇ-]YÖSyyö¤„6‹m€»ûíï'Iõ…GUèˬ+é8ÆÙV¯Ù?W3\ößëê}Àÿ"ÀÇ(“{Ÿe´-iuÐI©èî!Öúö²¼Þ RBú«jGßþÍî¬ÝmŸŸÇx¨{gÐû1b)‡ªQgÅ03óÄŸÎwRª«ïOŒRñ@UIô×7B¹*¤µ7 ›”2y*2 ݹ?H÷ŽgØäÁ-Èëºóá^³¨¼Þ„ÿ6Ò¿¶ˆÿ=Í«¡<“­eýd';Ùɾ$vš } l8Küø×oùú_9gx èθýƒ‰|ž°Ùؽ_Z´ÜôÔ]’¡l•²5ÒeºWt,¹Ù\¦/»ƒV§Ž@ÐK›wÁÊntö̱ÙqgøüñÞÉ>…½êLÑjÓå'ÿç 7?;²ùzfÿD™Þ/ È/;kD˜²×î;«3ÒhT€ÆНk“ˆ 1–-½Æ±FtÕT`uöqÛÈÉNö’™ËP–˜ˆ%Ä"÷Zr°EÂ3%Iº¨buçJíLHÑWE½$Ú‘;U,Žóc$¢ýýÜ”Úæj260²Bÿ« ¦P&¤l¡\Ã0 ¶ÂÒ€È9–ÏQ}D’‡`°!&v ¶'ãQª†ayB†Ì3¢·O½rð,”êpr` %ÊÅBiÀïOª>u½ùt“μÎwÇîQiròœòSWµæb\Ý7{ãÁ¦:†a•=âß,‘ÄØ¬ü‘‚“ òWµÈÂë&˜§ªxXHßüÉþ-(3³ýo”ëßv­ø}HåâQçˆRÃÏ%±DT‡ãCй¿Õ7ð´ÚÞ¡EµÕ¦ªfÈl”IùîîýÏ»4^ûñ¨<}ÓÆ‹Ø¦Ñɨ1Á\É‹¦°‹æb‘Ë<ä%S÷×2›°Èÿ'뢚UºÈ溾,©ùÌ]9@‹q3+Ó <™„‹±SPu"@1†AY¯`Ø@šŒ\Œ¬FV%©2L·äd&RZ“䂼ΈŒdˤTSD2Yœt%à!†ê„ØŒ¤‚ÉìïÍnÎQ£C}ÓÕ_,g¼ò…ÓÞ̽uyµØK¶Ù¯Ÿäÿx\¼¦3áÇEI@Ó×<íD*xÝ,ëýŸŠ mÝR¨ æë® M` rÀ(Jå?аJ¾B=cH˜„Uö6”Æì¤œ\ § ¤#"žÿ²XLhâÅ#ƒ!ç¾öMÒÃI1ý[ÿ”ßCÊìMnÆû‰0Ÿ­("}ˆÊþßþÌïâ;ÿùŸùo|™ìÿÍ¿ÇïüÂß%=þ ÛyëïÌ=â˜ý}Ë,°ž $4‹¿ƒKB“Àjr`¾$Oÿ  ~BLÑÈÅŒ%Äœ+tÒï’°$,rðNpd;Ø">¾HædE‹9¸&Kú=ºùuˆ·Ãu‡w½?9Öã ºýÈ}D…W{"À‡“ÖÇÖs qÒM^[#ý…$¾$Ò8-4œ$QçEq¾;aÿGSŽcëAâûë€ÿÐÿpý>ð¿‚è}Äü!håa@l‡ˆr_îƒø€÷÷¶lÕªÐK³×òªP÷ƒpÜ—ÿò ºâ¨ÿ5€œö®ó÷ i©Kýo.ÒÇjzì¬ë=û?f™ÜcKÄ\cò·… àŠÒêl}ÆM«)4øua†VÇX<µîÇu÷äçÙ‘}žî±ö´»•%´GØ}ÂòTÞ:ŸÄ^uEäÛÍüàï<åëíIÆþ}ezRȉrëA\ù,5mõß6õãÉ0lêý¹Ýz1w'ͶøtïK•ð_†'¡0¯”û|½uÒWß~˾;öyVì“ìd' ;¾vöÖÀÓßÛsöVæÑ/¬™¯½ƒ€ýUa¾RÒÚ£tLAgd¶É-;ïèPßÖ)ÀLöÑùaèï´Ž¢û[§G·ëËãõ“}.vb‹º]ÿ`â¿zÆÅÏŒLO ²†Ë?50Ý*åÖsv—1o•4 ”­2ß*2 ëó­’ÆP¸õüQ:UÒ. µSt'¤‘F õ©6"ÕŒ“fè—ý #ÿOméd/£‰EžåØÓG¾FÝÔ¨1SDuùnÏ{¨Ãx½ŸÃ‰U¤M²< ?_ö·ø +N4¨HŒ”Í#Ÿ»¾KfEæ›na¼½§sà’”Ö½$ÛÐs¬Œbk|[‘8§ðˆ”·èxMÙß0½÷iz¹švâMWÂ3P»¤`+Ú<’““ÂyäO]JFŒ-*©:Œâ˜ºèˆ/аäÒ¼k/h&óÁ™“0.Žs'ý?&¸ÜÀzô´»IYΘ9ó¼ûý2Z華D ÄIéÂÛÌø ò£‡‡¢’Ä`PdFo§®háÍAæÈ퇴)ȦóRÚ0¬7èxAG<>3.ubXZƒŒ>'™ÏIìQÙ‚ìJ=U ÀRç*šú…D’kÿb*ë—â}ö ûÝUùðƒ¾âöµYxï7oɯÁc1ÖWÆÙ Ì£“‘ªŠ†˜±š´‹÷s2’&—ÿ7wxøÒû!@þš*#‹ÿ® ÐIü˲*a¦ÛBCëûÏ>ïgRªÑ£K:€¶.u§ðY“:è¹íÁª„»"ÃY¿E^}  å!EßÃÎW×Èàþ‡v£à$±¹Ö—¿ò»Ÿí=ÙIRùÐ.~ãÏñCù=äáÄêŸûñšiuC3ìÛ%gí²ÿñqÄÜEöY _·Ô¶øå .P´ÔŽ3â|TŸ“Ä>€B €3ÔÄÌ4¢ŠcÌÚ‹v¨o¤±¥÷hó óÅtGÃ$€~;Àß:«@s'#N½ÚJª^`f*oá0¨Rí>P;îÛ$ÎÕÝev¶©Ä±"Á•áà7Û'=h|Oô¿7ýˆøÙÿºo).;Ù ‹f¯ôŽà»·Ûûë`wß[,°íÁRàྭoûçÔ·ÐâYÎãÓÁN‘Áz¹ªÔ[îÀ~l©ßíÞ•»Àÿ',“ƒ§Š·ÁöLë3–úK+ÔºœÃ$ø¬¹bmÌÖüj•t¼üߊºÛuçóÏÕ!v0‹ZÚôñ%4´ß¬/Os¥§¾Ê}¬?÷ï?äü[cøi‹Ÿ[1]Ì2ç¯eÿÃ7«Óý6  xc 5ÖÔ5ø<Öj€W êê¼êü×”e®QýS ‘“;nïµY|5ŸoYžìd';Ù}v"|IìÏüGùþß|BZ»ÜrÙ{ä^%V´­“‘GŸ hþ=Ó#1é*VC8%LñÏjGU;¶´œ§Âé;»6€>Ò¸íÔ¾{í;¯ö`±ÚüÏðõý‚¼nÿxbº.Œ2û'…é©2\Dž§"U&*X£e²…!:Y÷±]#ÿgt¶š£àœn€H§p¬ Ñ+iÜ ö`Ýú©œì%²ëÿþëÈUüß„-š:ç?U u±pư8x™Ö§È}XÀ&qÉÑ}í»Z玓mL—”µ1Õ4ÅH)@ z›fd2Ø r|IaíÀ¿ÁœìÌ“`»§‰Ù²6X²2o«5 zÆÛNl›¼Y˜Vôm©²€H"^©:gþþðêæµÜy”fã|•в5HÅëcÉþ¹”,äâŽñâx ÊI2©xZ€it\¦¶çW-®ì=Æ€¶cÅš o­lz–µqrÎU´d(…qÌ\n`³1€¥FÎsÏǾ §6³’Ö̓g‰Ñ=šVÀcÌ`‡”-‰[HHÉFŠ®IºÆlÀL¢‘î½Z!ë˜dñ›V£(©>|´øû1åþû/¯ýÎêÕm/ÕVTøqò"p³vµ‘õ {×ógµ¦)1Ô»þ›l¬Š×ý}DÁŠ [12F6a4[ȺDûûŸ‘E˜cYU2D"í…Xtß}:k ~]¯€ZßÆhQµ)-ûÉ÷>Y-¶x_ ¶´ƒnÝ;ŽPÃæBÊ3²A¶À³ Ø„”)ºénÆÏóðWÿñ'ºÆeßþÕÇ_èï¿L–ß½ä½ÿwÿÎ?Bß¹}z o=Á¶™²`?øX`;À>a«2'dÊHñNIfAJöTR© hRD¢Ùÿ,‘,“Ì?Od0q©tó^*Û¸ªÝܸJø7àß”ÒÀO0J'+®Ñ5tÀ¨,Ë 47@´¯Ô®àEŽŸEˆý5Úÿh,íÃ÷Ú‰u“,º¦éƒƒÐö^½Á­Lú¯F»” UJ%Ô ¤Ì;“Õ ÇsŒ£þë³lÿMöŸ6‡i}s¼ïšÔýhŒG’C€Ü=åÜÝúTá£ÞU}êή©î– VN¡»dêÿõ-Ï*µûZÊ©kŽž®h;_}Ó£}ÇÀÿ§+“ã*aAhÑÿõŸUõëŽ[žey_®C[ݳçW}zß<ïâ¾8ëür5Ä¡³®~ÖÆ£–îHm|t;tÁþ½‚MÆî½™ÛΙa“"É(×á_ ­þX¬)%ñ9­CG#suÆðå6…¢^Ùõ`IøwY·z?ï‘_·T¶À“c_o­ Þµõ;ö2Ô÷“ìd¯„½€ÇßYÑ—ðÒÛåÏüùÿôuξž=:y«.i2ÿe§™¼7J€š¦ÆôÄ™pùŒÖaZé×c»JáôrçqïéKäÁé:Èå€NA uzun3Óqƒ§ŽïÙæÍ|Êk\ÿÑÄ7ÿÍ B„õë™á"‘7Âø0y=nEŸn©Šj ™¬­¦)?ü¬¦, ²ÊüþEø½z&À¿ô'Âw·Æ¸R<1v ÂjÃì$€UVÅ#—×EXLâ@è*¢þ\¦\1VkIÌk„MvæÇ4™rñõ„Ë•F3ç<'¦Â&)»]¤ËH>æ™öÆ\Œ‹õ’Ž£ºu’“˜1š°Ø¡¤œV†Žx¥Ð‚e@¿FâëÀ¶C凨ü.ÉrÜ¡€#5qXi‘ž^ç¢þŠEWã@|Ñ)9AÅ’0ÍÎ¥³+4Aˆ°$;pã¾Lï‚ßYŸTø­Ÿv—B* +ȳfWçJÅÈòʼI|"nŸÍNhÙ'CÔÒf41"<@p <]´mFó¶”΢-åþ]U#ÖeQÖèÕ|;”4ê¾ä@\ûn’ìýÃÀÿOc5E’KÞÆûŸøÅ4–Ïz€Þ¬”mp¼Ô²RŠàœP×é]©Ý¹[ú]kØv÷ÿs#ÿëu:xž‚”Zt¹@O`îÁÿ^[)®‡‘î}t»>ÙOˆ´CZ”~Ü|}×ù8ÆÇÏîˆh3Ê%J¢Œ{††QßÍíl€ŽÔôõþ,æÈf.•GÚ?ÊÀ3Ê/û€ÿT&µ<Úû¾#ˆU’šD*ï—ný~ûÅæ¨Ëø?®õ€ÐÙ}mò‹˜5Ümv´¯ÞïA[ª5û_ò«ý°{·0>ÊŒeoØ~y‹M׊$Ð"ì?(¤Á#ø§ë%­+àÁ^{#­Bõ¸ êjþÛH Чw½£ÔzŒmÿÁSAOv²“ìSØKžÌ`"<ýÝ-»÷2:·?šÉkAB’ÜÊdhä:/{Eæ±}ß&}NœýÜG8×Èæ^§F9?w'eÀ=ëdO¢ì—'ûXv,ºÍ7JÚÀúõŒî¼]XòºN0o4Š·ÉYfÞz”£îÍ 5;# ©&ÚÔÖÿšäÿd” Éf¶EJJeQ¸cÜ‘ÿ¯N€ãå½lÑãvr_»9µ¥“½`»ý_cOðtî[ rõ|”꜊Ê L„•"%ì"Áù%2n<ùvKººE¯ÔS×hÂ&CöÑ8æê¤gQsáçÆÚÒƒkÜqc8nŽ:+i‚4ÏØ<ÁׇŸtycBÒÌö`‚ Øãä7õï%†Á#¢÷Î, ÉQU Å'¬À •N±ˆªƒH:0?¤XS8žZ»îœƒÇ$€aîdr \¿¿øö~v€o„!†hE+±gw@³æa»çbžãŒê‚²–Û‘£€…° „â$ãà qHT˨‚íž&8_lŽÄ—Ë$ÐÜœ dìTž¸3•]‚mHøVge$˜—•!—käµo"~†‡[Øþ!’¾zN“9Y&|Ô\¼’¢Ng¿IBà÷Î_ÝNimÂ?ù†ñô!Œ[ãêv›,ç×ïs—+dõ¼ö9¤'´4Æ( S™ç¼œiQËÁ,2ÿI*à)]t³3H¨ ¨p}ãü<)ûr–ãj†”ŒY %²†3ãìB9Ÿ`Xy0ÒÊÈEI:“F…aCfC–œD Õµ¿)u‹Ø@‹¦Á„“ QhY{ÅË.N¿sô9»âÙT`)­Çsÿ®"”’©ï<å~ñ '¿~6Ñ—ðRØöîšÿá»{~ï ãâÖ¸Ø EŒÁ`S¼?5ŒuHŽ«˜g¦IÚdDD}¬4À‚7Š÷$È‘y‹^ÿ&ÌgPöœýåð…ÝÒóìçåÑÉÇ6¼ó€Ÿ®¾‡ýùW+®Ö?ÁÞVØ'¦Ý-l&÷mŠAâoJÈœPRr¤È 0•`VºAR¢¤)H ±|” E¯[°Ò³P{éM‚ॆb}|±Ë¤cU•ìD6è¤ÿì.?Ë÷}´Í› ÀñX4ˆ ñ%'ßÔ\ô‘”z!Ä<"ÕÏ #c¢í –¤]Èô ¼­ˆ}SÚÖ @ÿzLKЈT–C¬ûµ·ë«D€ Їƒñ®4þR3ê3^Ê›gû>b\sÉ‚4Ç’T¹æ<ã9Å× — yíuäâg‘ô5d6ló.äï#ó{È^Ѫfº)V@RŸ#e@í‡$™•¤@ÂKGS}OC÷³«èìE¡“G®‘qÃS§Þ%!y2úqûæÒÞ ¥¸&˜q告Ù`ž ÕB±„ia$d%Ú¶Ævõ-Ž">K dÌ4Ô3;§ü}$è¦fÍqZ½Žª«É̃«óQ`šýܵìßT…õ(lGcš0滹•{%„—Äù0KCä…-;u‡‰á‘Ó îÐôÔˆ…|"Èù#äâÛäÍŸEòÉöÌé Ñ-l¿OºUJviTWéð6ÉàíÐó`'0"ð÷/_í|æg ïn`½-¨ó/}d‰Ô!†×WíeB $yY¶H Ð5³l„›k9`Ë+ÂéêòYH«ïK]Î<@Vq2€ «,œ¯…1C–xVIXIb°Â‘Ø9 Ì”Á U%ÉL¢DÄóÙßÇ)ù»²N4œ,¥âÐò)ÛrÑál7ªg_1ö·Šåä©gX®b¼v,yö2~wõj·€¯ÍÂßúçW¼¿V.râ!Â(Ævåòÿ›-’ ç*XrËEÃTŒa-ÂlÆ(Â*Ö³¸ƤFQ£ˆ1›Õ"R‰è¯Qù¹Æ_¯@XGàHö?UÀìÇKÊüÞëï´õY(ŠhAÆ—êã2"÷ûû qµ Á;Ó”Ð}"ýdƆ† ÆÙ_ûÞ‹»®ÏÈNòÿnùÝKÖ¿ÿ6ÛñGä A÷`YI+Ãu4kˆAÖëãì„€)ùxbT˜³+”‚Ì ÓÙUTè/‰i(Hl«&$%DÝ©”ÌÓˆåH—0«û´¥½à;§©a¢‘Ak‰—?è¡Än¬û–f9+<ß”îe‡®CU€ã##~XúïW+ݾ«·M‰23©è³K€°Ò—ÑBh§ûH¶€þµß]¢ÿS+7ß—\^Ž¿Kí€ì nólûà>|îKy/‹îÒã÷êÓ¯¥jˇ"TR¶Ù|·û¶úÎO$¸Ou>f‚¢dÉ¿)€Z•¦m~|'z?î}‰ôwпz2ÀçQ&µÆ-©˃ƒãê³]æÿ˜“+ûë½szìäú²øzEú–nFkÄ+드öí_¾x1×÷%6Sã­㜳oBÞÓ•cããŒî5R¹þÿì½KŒ$Y–ž÷sÍÌ="2òQÕUýœM³ÅÑ`@JA @A\ZmAHB mÐBímµÕ’KÔJA" 'Eœ_C 9dOO÷pzºººª²23învï9Zœ{ÍÌ##«¬®Ììö“ð´G˜»››Ùµ{íü#¤:¯½Ò?Tl ñ£Mñ’ÞÑm8ˆWa‘·1“(û:»Ssµ.…@ÈÖNk,£Mó².~ÀúÇ|a‡í§8Å)~ª8Þ’xðkßùëÏè&¶ïwhgìŸ6i£¸ö©Ú+e4 ;ý£ŽôÀ«òßH¹v’Å‘iq0õxø“U±È<¨©@‹´$ÜËù}?ãM×¥¯;Mx¹³…#€gǦ:¬6QK©ŒUYŒ—lþ}üÛqͽ3X<<ÂË ätÍŸâ ŒÃÿq‰}äT ðJ˜ñ\a‘΢v8¥ZÚ‡dU0òà!rñëèæ_»DÅ0žSÎ݈ݾ QªâB :r ~¦Á5ØäVÐ)€Oˆ@•ÆdŸä³ú¾%GÔ R&¼LhÚCƒÜ€á]ô×g˜öÀ9È„–Ôô#¾ƒD0y2rvÔB!XÔ#ñI€Ð¤–(Iñ[PeÖX´önVË+´ŽÕj™€ö;RÝ´Jð瘭ÜóÚO¡ 5ÖàÖœ”‘4²9·‡8—Ûη±]Ÿâ#ÌëüZÌŸ[ÕÊL™Ù! ÷´"¼´×ÇάV1ëÚ9‡Ø*-çÖ-ðš4.^Ýê!HõÜoŒ£³Ÿâ÷­£»)‚ÓñW¿!²Uª]z³Ø%ÆwíœYckt —èðš#ÝÀ,{lx›?‰2³ú:Hl y²2Qb`„æFð_òzæ áâ:’¬ï }q®Š±éit&õZ¿<9}Ž¥îyPè!¶ÑzZ(”£0 $—YýÜÌó›â¹—P2;Qü« f'M¥jÀMŸIUÃ`Ыム$o a¡C )®NÚB:7Ò`tA;E{E{ðΠw4)®·¸>EHà=.ÌŸ¢2â>ypÏAð XH»e4PK˜k½·A¯Ê¾8×{ÐÞ¹¸·è„e쥵ÿ‹Ú©ÿ<âÛ¿äí¢ìÅßù¦³{èöÎǧtN€~tJrºQ¦pÍhd€TÂ%#7ó«Žu^av 6¿ €Å-£Yü'a5Ü~šC@#$ióÕÚ¿öCKi€è‡U×e8|¶ù‡1àó$½"3f r™Ñ/'äɯâEð?À¥`/7#$sugºÄÿúÝÏo_¾€xü[›“ú¿FÿÑcžÝ~„¼›éöØ¡'÷{RéÃÚ¿¤x–U‡^£”ôØýS”¦Úw]Е¡&EÌWÀcÜ®57OHUñ»UG-«ïAê%nðÍy}ÿ BÈv ]sjcûÙYë(à\V€g}×ј2Ÿ/lÉ®fðyþÞ…^iû¢mØ¿ˆfBð ÄÏ´úYñôáx=6>“ç–#ðÙ±ÀúÐHƒÍ…`­þñ¶Î€° ÓÌ ´Ïç¨ØÐóH X¶ï»ç=¾ð>>æÇËK©‰ö®P³ÐïñœêË™YÝó‡ê?@ÿÅì¾Q)š2ÞÜfÅs7âÚ_4íœØLtXÀÿµúßjÙ£Ùà5“öÏVó3  =¡¶}jû¸ìÀ½×Z·ïëËûÿz#ˆ¥*â÷Px~\&û'Ž“  žýãŸüƒ=õØdì~˜ÑmóÎ(;C{È·NÞi#áx|¨n®ÕY»pvµ)žÊ¡6@Ÿâoh-0t¼lù¿g»p³ø\Îø)NqŠS¼ž8=½EÑTÉ’¢®Mw&¡ºJÔõÌ/+†ta)ê6ÙÌŠó6Íõ3‹/L¸p6FÜ è¼k‰s¯-ÎZéì«u,ëçàgu §õÇÆö½tJn/¾sàòO xvÆç›<\.öF¹c:“`î-,¡zY®Ñ à{Žú°ëuº G )+gŒfû_¨äBlËûDâºonóãQ}žÑËsSÄñ3Ù)NñF„\ ða† („ms‰§©YI¢"Û{D$ré ¶¡û:Ê—ˆº4‘4qý*Öé:ê=‹#R¢6ù¥!ï?B} òˆ>ÿöñ5쨊l~ôác ž¼ :ê ú±lx‘irM± RSúëô“ô×€û-…ïŸâ¾GÊͤ]í“Wï$3J–°üO55¢Ë¾D=ÅÚZ½9HC¤­Ý 'ÕBöñÜ€š˜Ÿ“>²ú>ÛO®|­—$>,I£Š$4@9Àí!’u}η`´í ‚f ȵbÞ $t;"ïV`î“‚†x²^süÎÌü@íG›Y“JàÓó‚¯JhM8šÓ§šÈšcu©.£3ŽÆa FTgðwp²ÁÙ hÿúUÀÿÂQÏ¿ÕR³.¥&Z£Nvµª1C͢Ƴ´²%Æ•«ÞìèD=5æ Ž^ú÷Ç¿· ßÿ!åcÁ-¬v~çü—[Ñ\p®&ðñMF*ˆ=N¤\뎗»¬ËTÀè,ˆY¡ËQ—ÜÄéMªMþàÎaGL·WUŸ$H³ý‰Ó{£m_nb[ê:ËÆ£0TG–]%®—¤Žj½N GCÐähŸ¡;Ðmw¤2lI©àúÇh÷Iˆê I6ˆ j#â#&·¨ïã:¬È­8”HEs%’Ñf0¹¡šHêAú‘“S\£ÛS€®]й€´ñÙ›Ð쿽9~{ŸøGãÄXÛ}jéÓpÚÉu>â»UPêåQ»ÙΤ™Å0…6]ƒý«²k€‰¦ÿIÖeÐï°¿ÿe?œõú² @í·×.óûxÙ¡æs ‡&«–äèeA¿ú¤‡ÿž'2ÿ7¾û6Ü:LÎÃÿð}þûðÆoýç_zÝ»ðFDzq΋?Ø#ßÜ‘ÎSº (sãäÄ'ŃM 7 ï,J @nS»0aL0X” È É Š¢V—KÂ5#%ÕW8¨uA¤Ò%ıŽd ­e‹~>£¤S@­‚¦wœf˜³—mÈÃj()ëjå_D¬¿}øi·ªõŸïl=gÛø¹‚ý ø¾t\ŽWàüõ¿W,~ ¿:Ö€ûö—]Öîe\žŸ?V¿M–qù]ðÿU ÿ1ؽ˜øø9â¾_´:êüù/í¨ß¹ç àVïxÚµú‰•ã'jÛay¾Z¬N_ 4´m€|!<,–ÿëyÙá5“{ ó£šm·ìÓ9};CD~ÜXýHÿ™~ì/»ý?€gû¥Äå·z¦+£{ èFÈׯtÝy*ÿÑf€¿äÀ5¶a«ÇMÌ•¶yxq¬¯©§.°ÍÅuο߸ëh wÎôga§8Å)NñÅ =|‹âWÿ݇žg´Wº‹H€ëVèè/BÝ,ÕV¸Tœgð1^ÚI0ÞêÍÍÑMØæx9Ò ŒA˜¼:„ENEhêîŽýNäçOþÌIý°û 3>/\|½cznL7F·…2F@{ÁvŽO†çÁ•ÊS̃DËŽ·åR 2·~¬ü·¶Ì¬þŸ‰1µ ¬Œ÷1F_0¾ýÏF§øŽÃ‡ÿîßħ\ïÿ•ˆæ^âÒMªýmA ¾I]Ô™ ®‚§ ªÊ/ê¼Á¤Ä;ÌS䱤¦ è =Sxü5Òæx9àö)Ü^p^ÅŽÏ'âp¬÷– 1Ü 2°tÈsܶÁâé:H#NÁyB²/!rŽ—+(ù‡H~‡kä°ÇÉ-’xY:˜ ¦\p”ÔiÉB%I©VìîP­ô]¤ÐT2R$úVwp­Ò‘¨mà B ‚aVòE&Osˆ •Ôä[¤oÌà ÿ¤0tBŸ„˳jÿ?Fíì[aʆˆ°ä8J4͹.1äI¢ûÖŸIdûûȇV“T² lmÒòKæÇë[RtÞüÎ{Å^CK~Ö‡óVÖß Ðw¦nöÎ4 Õ>Ýœý»ÑgµæK. í¾ èàOîÇà¿Å:±è´ ‡j}Ý’‘ÃsÈ?Äò\Ï ËÂþü0…å¡ ”8u"[A¾ôt›rþáéG¶•hóO»_î®CØŒpó˜„~t¦Ô”Íä…dNW Tp³/Ap`0hDŸóB­ƒ.lŠ„[3p2Õ†3 óÃÝ¥*I ŸÕÊ‹r¹>p˜ ¸Ø(Ïœ>)nÎÂao¼».‡ š»#n$/µ½Y”wéüÎáL;ÇS(µu˜è‡‚oí7Ð<=`!)°Aä )J{Ôwø¸Ç£ŸÈ$uHª¸H½çÆzqg²pIyx¦LÀnr9È×ûHæ?¼Ðê\椵ÝÇм¿}²ÿàyrö)Ú€tAp ܦhkÙ`ìðTàQð~ W€6Žƒ$Q$ÉR@ÂâB’ÖÚ5Bª ?©nSËÌn®õùYŽrJ^­ÿ±×g®Gg¶„W<ï8+z—ùYÉýyƺÿê¿÷µ lW$—êPøöïˆ@ sßF6Õ}ô~µìÔõí}wƺ+px9F è?»4õs…X6ÖBˆ²Síd5»û5øŸÒ}ímÝýûýªdŠ¿êÏÕ5©cY—ª~_CÜ÷Û<ú»ÍDÐ…ä`†Š,Ž õ¹Æ<Vîþåÿ1øÿ¦“v±ÎTi$Ÿ‰(kBÎü„ç÷íÛ=ÏY´vûÆ<7¼jGî[ÿ3eôNöÿ°û0óÏþÚ§|ùß>g÷ƒprÝ4Ñ=PltOcl\Fc|fh!îCØåeeë¿ÎÛõÙÕœ¢>ÏbÅõÅêË5{Â-NqŠSü¢Å‰ðÅái‰úä£a'ï-6ç7ve甃a%lrZ™á|bÙ{¨i2ä[ 5t‚•Ћމ5?0[‚úž#7€YéÜ:G‰‡4¹Û¡®Çt÷ïNëO'»¨ˆ|kh*0›;E”éÖ(»¸þ§k›­ òm\d6RݘA}›{¨©E‚U:F’"Aª1ùZ¼]Ëëä]ðßaí·Äéš?ÅÓ?ø öÏÿ7ìG;8(¬ú°ªé νtäÝ xôUD/`|Ï>„¼{1È;È·v¼[¼Çò 2 {ÔÄç²®†ú È-ª ·hçÐê¤Z«Ö]Ǫu>‘™‘Hdˆ¿A'D®pž¢Úa>AÙ’ÜÁ3RF}ܦ(×Èá ¿¹‚›üv¤ì­ZšjØÎû}0goA#Ø`œ ‚U@××´†Ùœ„'ô2»yº dÁGAöÕ:²åHÆÔ2‘{õ£¤¢+á&ÐÀõTÏ‘Îi?rŠû è_ïc¿.¶QãûÙua·sz`?:·#<¼P†ú^ç²M¤(ÕrQÌÎÁ%ƒ…º£w³µ5™;‡­n„Gc„»jXYþ׸Ç{l•†L3ÔÃÞ|êêW7À°Àþêæ³ÒwÔDUuïï¾ œæó‰Yñߎu·s棕̾-àí§øõ·)¼ˆÛnÿ¹ú¾+øØáÙ)&&!¹°5‡ñ)V>‚ü ”&Ûç<¿Î£ðFÄ$NNP’0õq݇8?9Á0:Ý¥ƒ>×RÃDØ™WÀ_=ȹƒ ½q`ëB0­PqÇ«Ò1·kÖ#Î×Ð\j‰Ûïî—BJNF±â(A¨:dçù†àh)ŽMFBªcDuèœMÍ„o·5%mŽ£øí®"!®çˆôhjhh‡Ó…kÙ´ÃʸŽ{nÙM̪EWÆz/<[õ© 2…ã\„C6ž3ú³°˜×õy¬obý»}^,ë2Ú–F9€V @Dç÷µ÷Ƹ|~6{ü nãëx×ùn¿43Ø]àD^ßËÑþ1±>ðó³FKP®ÿ0?”UóÿHö(íÑEE®5Ã]PQŒJ”“°\•­|Þʽ¢‡c€7ð˜H%Ñ,<€¸êQhLËù–9vþ Õíc¹&Þ,ÌwÚj{(|)~6å?œÊ¹”½ñîooÙ¼“°É˜® i£áèzn‰ÚÕüÆ#h·?Ý@Ê=Ó(ï:E•F °,ášüRY×*™ûBSÑŠ÷ät¦¼bù§8Å)ÞÀ8Þ¢¸üõg¿¿§ŒÑåC‡j3\ëãhì8'€Mé¢c´ªt+‹n ›Ä™n"ÑW¦X/ræØÆóÒAίøÿ’ÒÿUã)>×8 #¾ÿ¿\ñä_ÛòâÛ®¾;@ÚÂø,.Lí£F”Õ`©ÖQÒI(ÿ'Gq­Wåc‘RþÙª_ºÞO×ú)~Áâð·Î)ß¿ÂGÅ_TO³©@ISÛ3€žò¨‡wyðgQ;ƒÃ'ÑÏ\ÿ ’' ®žáÝ?dž-p Åðñcl÷|÷Ï„´µDnžÿ1&×.î?õgÒ$z Bª,4mbøÍã)€a¯ •çŒË ÈÓšTÛã~Až¢ósÿˆb yƒ—ÈøGøîäê¿Þ£»ŒLF)‘ê´¹8ýèC•ªtBê+@!V*ãf’Ã&FH»UL?Rb€JXá¯Êÿúòæ~c’Ñ|…C5©ÑïK(9º´ÚæÂ'/Œ_ï^ O.”óÎ5œ Êh³%¹¢X1 Ú¤B_þÅž±ïþ½¸FžeÜû%©Ó€–º¿s eE Z2˜NËEÛ¦!Íù &“!]ÝŒW"®Vß\·Äq²Ánï”âœo„Mß?Y-Ál)‰0ÈÛS  êÍ—A›8 ®ÐY”ÏÀa¿ÃŸ~nŸâ݆Ã>ÃþšaÌp“`R< cnGgëÂæÊñ?þ}ʧßÅw#ö©„W{þà¤hæý¬ìnàlgüêy‡ÎU.<Ø$ºìt å,ʈtÄeÝY™¥˜$–°1;ÿäwmÌ›½$©“Ä}'5p±®ovã ÜîC¥±Q.·¤$H4²qÎs¸Œàèþû}U]{܇’B×7‘§3`>–2®…Mu5’Ñós„é{Ђñœ±²Gdç˜n!ï‘\ð iW¨-H )Ez¶˜ã&Œ“ñüVØlŒ½âHµ_w†Ϊˆ&ÈÅ9Œ‘ÔV‰2!]jgíõ´õ“|5 Ïžç7ð(7qMm6‚!ÕCÔçèÓ´@çKÉŒäâw}m#=ÔqÝôÄ0£Yþ÷Ó¦ìïUèU‚ø¢Ë+ûpÌ©ÕgØúªŸòf…ÀÃÿø÷^÷^üÜã¤þHÏÏyqû ýúˆßØÏ£©*ýë@¶e.¥åvQcfSðQa vDS -öò3)^´º$4wþ{í¸\ÁRÊêy¹‚ˆFU¥®ˆ•° ½‚Œí~ÜtȆÙ‚š[%i~ÖCùëxX%`xg ™ŽºgfÛQf€ú†…ué+·‚µ±!¸7`úerk#$µ2Ymß´–*[\–áx|uýþ.y ÀnÀö¬|§¹ø=ó÷ÜMù^çïÓ»§øîo[mÒ Ú _J4u‡èý½ã‹Ìù×Üa÷£Lÿ@É»jg^­BíàèÖkÒÇ`• ˆ¦PIOÑCÙTǶ…:¨l\ÿá.ú™[)°/Y߇ãÎðîô?SlßKœ}ùÔ|O3¿öï?äì«îðÎÓ  ýþ£k‚ü¢Ä5׃í|×€r¨ÌÑD A€±±­—¹Þ”ˆ÷FÙ;ž¶©Žô„s@#d‚eÚ‰e5¿n7«Áã%Üm3§6tŠŸCLÿðKøÍr%0 ¾(‚EÓ ‹Ðª®—*¿ÓäÈÙß~….}MJIH÷CL~„xÆÀóð?¢\ÐGAØ}‚¿ø!ì÷H«µp骅bVì:#Ó¢]¹"C‡¤„t)ÄÆéVõqmd*Ї-©'­I®¥ ©àù OÕÒFÏÑý¯ÖåØGaIj7Èôöרþ€ï3>9e u¬&¥)tƒ’6Nç ÅÐNIçF—Q‹\Ub{ïp²uäbg—ˆGüúy^*eqÜL*Xž"R,~‡z|v%A¸ " ×`iˆµ„‘6V’DMÕ©Àäp³wö£saê ‡}1.Îáñ£P5\á`Ê!{MÛ†’iH„Ýë®C¹ÞÛº™„0ËlI™ÉÚÀ`Vú;à­~ë*éëí×…9c)è÷8F3Ód5QÙ”˜=5é(Œ9Nõ¦¶}¨7Íi2n÷pÈ;yõpÿ6„7ãÛ: s¯e¢ö3½Ã`ˆF;ˆõTø~Dv#fá5îI]Q|tò(Üî¡H¢vNþ ê½{|L¸&DäTϸù{;)|òÀ9|œ ôÉésnEP8«–«a]Þ,Êe¶,?²!Ž¦ÍŠ\›Åÿª6ù öKãSµù˜^a<àÉ…2ôu{jâ¶8ùJvÎû VíûÌ´HɤQFB“‘:èG:…Tª°Ü9ê#‚X2!¬§Àƒ<\Wl„|@ìe³­\NU£ï ‹2– þw â”1)7§I%ÇѸÙAßÃóÄåyã¡Y‡ZÜÃTœf=äz]4Ÿß9?Làf€ÍÎÉ=t[a{JŠ2 A³ã¤íÃ’7³p¸)†?ÎÁ–öTp Ñ~¼"W&QZgvÈÊã´Rì/ebÍÕÞVJþcÛÿEÙÏ Ö}ÑÖÿÿƒßýB¾çM‰“ú?âüïþ)þ¼ÿp@nz¼38(2iTŠ7`RIVçS0i&Á³B®Jÿ)áZ‹u”˜ª%$§p°ºlŠZ‡xu ¡>â¸FHÞ‡¦ú.F9/ÛžÖ;ô‘Úw›6ÏK–âolTìtYl@k,ßX[Ó¯î#®³éU¼7a•µ ÀgKzˆ~÷'éèt± ÑÖt„p]«kæóvlâ~øö#ðÿ>¥ûJ1¿:Ÿkkùù úŠwˆz¢R!²I¢ƒAûßn n5‹YÔ0/#øDr0Qú®~Ž_0b‘= Ø¡à‡k0C=ƒN`ÊËV‚üVÕ3n}iUFIg¤®hCØc{ äÕ ²Ý:\l‘'ßÄ·ß¹¿B.¾òGHɸ¥8£!.˜•p °‚tι0è õT‘Zb á¥Q®%Ä¥ªi V„/àùu(Ï:(“q›3åѿ ) ã ”CBÍC}œ”Ô ¹Y…CHXŸUjBs¡ç ­Õ),ƒZNhQ·,%…Vïm™ª–€‘¸[«…l©e!’„’É"j.ˆ8ç=ሖí;áò̹RRºT+)¬ê[¶¯~£š…n«!¡°5tkÈF‘Í6XæPö0íc˜F!í¹,il’•Û½0™pq¡ô[Å<ز±¦ÝFé•€h÷ß{ÏɽbjhÜÁ§£W3$sR ‹ÿµš¹óªn®Í$9 ™¨îÕ†œC+ïq(»jÜ,̵ýM çøŒ§F ´:Š(ñÝÐj¥;C½î£XÔW[óNè²£Éâù# ÚGr-a°?˜QïÂZ¢Ž®[A,‡b±&ä `·>k¨C×A×9¹T^­=œ’ã" ƒÐ{(ù¥º =ô®'û)”ÿ­>ûÐ I…\ùb¯#ÙÜâ¤þøÍC⮄.àW,1˜ó}2ÝR†Rɵ2ßß +Õ%Ã*I ö ïZƒ4™€K¢te!ÙhŽÅªµ¿9iÌË•P¦TWîÈ_×7…¬œzLàó%ü²þë8©ÿ#†ï½Ç'Oþýê™Î&|Œ>QðIá ø$0*>µù¬š¬«‹³Þ(1Æ”"m>wAn¿oïý¥¹c\[æ?Î{( ÙöùxÎvôõk„fÀÉÍÿð®2H< ù, Öåýõ½ní71Ã)V¯ðÙþÿÍ=&3DšÍžW ð8ÿ6“&Ú÷.-õh”õY®×9[âîDKrŸïWÇmƒŸˆT³Ž“úvf~ÿø„ßxòg6Ü|?3~Zè/¢$YÙ[]…“±t‚75¢ µÂñõe{ÿ̼,°ês–©¯—ïηkóî¹~ý×ë)NqŠSüØ8Þ²øÆ_ºd÷ƒ1’aƒ¢bh§hgä«‚n"©6½ˆ$\¾µ`É JÙ9e·Øå„íMDCèI›62@×:KYÞuGÚ–9^¾wýÝùûâÍü½‘q0FŒ/ jºröŸdöO3ýƒÄô¢0>/¤3%ßTû¨AÉ»`–¦a±‹ §·he¿*p¨Ë]€VÏêD¸l6@Aõ€S8õ½£¡DíAH}¢ë Kµ=NÒPãS·e«èØÃ/Áùo‘ºolqßczdÿ ½ù˜²3è#ÙêÙÑB€eZsC¿lÈ— ?Lø®Ã÷¦›A²†@CÏ3ònï~`l7=ʃ³éœá‰Ó¿×qöþ—AúôòG™ò£¯$‡ÔDþ‰ ñYÍUÍ´ g$Æ+¸ïËMqÞ®~^³òŒe¤ŽšÝdÛ¨©¥D d¼.K%Œ&L}6›H¼NE³Ñõ¦wúAà¥&4‡5ÏW’¹Ý¸;¹@.R(¹ß8À<&[ ÐÄižØ²1äR‘G‘ó¯#<§‚ŸÂÍ÷‘üŸ …. ç.È!’…‡ », ål›¢_-Æî Üîlqütð½S=s®{çp.ì 7OZ-ŽAJ”‘ {-QÛXK]¶¸%‹åä±.ÍVç‹åù\Àev艽§Cb*ñwñ(áÑ7w]ÀN+•HøW„³¤¨K%Åû@¦ø$­¥ ­Ä(Ð@lQ;@ãò”JÜ©""Ý >x¦ú‚ŒQCwÐ÷Ü2¯U@R”8;‹dõ~Œ¶»é…'Rb¼‚µÂó£¸ÐuBŸ KµNh=n¯«5ûÔ^x' ÿô÷nù“¯é\ø½ÝDgŽ qÝíÀôæôS%»ÏÄc&Ǥ:Ub€º ~¼>ͯå4¤–Ó˜ÿpÐF€{‰*Õ‘C‰Í UÌe!µDÅâ°8Ä:Xõ³mþ}Î/3ø'õ?€~zÎÕ?18ëPàŸðl@°OaÙ?É2-1ö&Çü<-ÿF]ŽR`nRÇvB°a—åù_C «W¸°€˜‚Í £µ±>•, u{©y£ª÷÷å=°’Yý¿F=Æ{¯ífþsŒÙ~¿§v¼«B XTÀ¶ô0OÛ;>4w Ç•ó }¦Öó!hµ…_ƒ³b½’Gl¹}¥t_+ÜÕûgÝ~WGþ*]yÃ_N¦Èz}SÏ×(÷ÞñN£•ð™`³CX}¼«›¯ã¥*Ù긬mÿ±·ç˜p||æ ©-ÎD‰öÙËñYíÝ1 ‘HbÏݤØ• “£Y¹».Hq·qu­Ì'Uuý©r_;ås)£ñgþ«÷8ÿZÇtm<þÍBºGb;å`ü@slmå]››ksÙ¸º¼Ôi›¯¸†Ÿó·¼JÈå«éêõJG€nqŠSœâ-ˆà- /.ýÃ`gK/¤m€™ioœu}€œ;çlSÕÌ£ÍäÜAN‹N™¼*¾êú 4ØöœO­ƒôc7ug¹@eÝiÂÒ‘¶ùƒtŽSgzo<ù­“Âàƒÿóš÷ÿ­sP¯VØ ƒÓ=¤WÊÞè¶ñÀRF#uÛlºEýZ«×¾çH–½Eð „’4ÚÎrÝ{-›±\ûóü+ˆ÷1LâtŸâ ›öX¹Eó üö¿Ýã7†ïßöŸS; ¸6á[G\~ 6_C|ƒp‹ûò~û~Ø#e‹ßìÃÎ~Þ’ Pë÷ŠÛ’dl/¤"Y¯Þ‘^ü?Û"ç‘Í%Þ]€öÑ¿”=’oA/´€3ܶàC€U’ñ²½ÅéãÉ%Ø;(dˆýŸã]‰tÚö1þè× { å yúGˆJ²‚OQ·—(G°IÈ6ÁFÑ´¯Ö¤^+C–Z©»W8߀lßEô˨<‚4@Ù`úeØ\âÃ'ÈàPvŸ«NÒòØÐ_{‚¾ÿÍøMãS|çp;a/vÈu†Û.Ê8ŒuÜà±þô¿’8÷¿ÏÆ«]rWgûÒW•îý¿ˆhۿųOþ?^\9~€~+ Û ‡>,ô›»Ð’1«ËVm¼‰ Yä‡ê±9¬]êªxo8XUWx̩ɚ.r]>[¢lDqá`B1è·‘¸ò·è³Ð©ÒWÅZË@y#¬Æ$"Žè¢èÙOÎíÞÙôÂåYX‘¿q±d-ãØ‹ÒÕ;ºyx<ú&ºù (HCÁºO)ÒCþØ] ê–¿®„bB×)ç‰ÔÇYULK6ð)ÀÕ?ØL¯ó¼1ñ{eúããƒsv » 9…MúY…Á`(0j• Ü ¿–¨ó})» öº€‘³’¹ÚŽ«T§¹g~:ê $ÀÁŒCu'è;¥ÓÚ>Eq5¬ ^\0‹{‹”p×0w’;æŸkä¥Þú]2‚‡ 4Y´@¶HÚTÖVðhBʇ=¾I2Ò›3ŽecrEª*¯T`Eúà %0ËÞ«í¿.d™ ÄÈÜ–b˜!•ÝRsH]dÒºÍ4µ?T@.·:Ïßó¯úù]d¿ì ‹“úÒ'\üíßäðà{¤‡Š=Wü&ÁN€»„ß&ØüÐ…3—zöÞ•p˜ž LŠä:_)ºrÐxYª¯°ÿoê~©S\HUù/$4¨X1¶˜¨p¶7Uu¬5l¶«7­*éú/4ÔZçW@éêAû®¥øëŸ½b¸¬Ü„?ý 9 m¿~™B="wÉ]Èøh/ååuËüZ1/GãN‡°×žÁë5°½^¿¼Žn?v.˜îõÿuî•§÷Îd–—”£„óØàÍÌ7n4óçIÝ#¯.¾vZh¿¡n-õø·ßWŸãܳ2oùÖ“öö;à|N=hµ“óz-oêáÖ'‚4;{uþO¾X]ù~´T+®/ý£E•ŸiÙû,€Ýò⦚“°QÈ7ÆxSP RrÞÒµ{ ¤3™+ntçBÞeý#Á&êçTç׉(ÕšÁ&¯î–çÈŒâã“FÚò`Ç×h›ñ»í`oJ·sŠSœâ«8޲ؾ—Ø<…:Y<:Ì 6>ÓÞæAØá™E ÏÛZ¯|_™s‡ZÛ|o”C”°L:í$˜pmŸÁ„²‘°Ö ¥L¼G4:Ó£šçw¬vÚk8®§wçOñcãT/*âÅw<ø—0˜®l¹ál‘wq=wò䤩Å<оaÒ6Xl4ºmeNªÿìX–ci®I“š¯=®֠ûïtÝŸâ ‰üÁ_Á}OŸ¡å Û?ƒÛ+üæ€ï¬‚ÿ[·ÐºUäâüì×Iý¯àth¾¡È€Ovû#RùŸ:üƃPp|Ô° /Zªª:ÄB‘çs¶Å¡“¹Œ$.¡`; g—ÈÙc¬{„v瑳©Êù¢n´¦³s¤œ£é HAdóX’’fÒ#ôl¨}—¡Vðt†?üuxôç}ì.åö’v;¤°„ Ò xêƒx0$Ø:ºqTr½t0=Þ)œÚ®Ç ¢Œ0áªN‘°ÈÕª¦©žƒ£— ¾Štðî!>üœõðè ¹ø.úá÷Ã^²&l)‘DÊÖA>öYQ‹Y)FÉΧÛ>& ï ªLçï°ËƳk˜n O+©WrQ’JÚfÇàÿ¬ö÷úûšmóœ4¬D,B=OÝ5q¤uŒ³º~ÝÂi€Z&BJ2ˆ£,€¡X+B7$:­6•ÖìÐqT¦ÞèT0„âQÜk‚Î"+†&:¡«ç€¸J™J$³Î7o `ÉÏçBjþ_Ri¸x‚l~…”¾‚wÛ°v—3Œ6=Çov0:.JqÅLÐN¶‰!)ý Í8Û›¾‚ʯ?8ÙÿðOÎŒ¾.”ÆsýÀéF˜PóPÏ»CS1;H[ßÔöuóT‹s'YU/7es]îXÔÍQ½ª›½ÙüW€™ÕÎ2—°ãX•ÿpÞ Ûäá2€„+€Yåi9„S@Jñ9îBRGL«úOêý þ¶¢¸ÚotúíÎñþú¸GJ*ˆŒ`{8ÜÂþ:PÙš3ÞFÖ‹3š³ãØ] aÍ:gÒ2·R·!T‹7ç‡m„¡(ç¬åô¾ÈøóàÌ`o`óâ:ÓÁ›ë''MŽû‹.C_]3º"ô×ât¶g’­À~—¹/iŠÖ GŸ£:hGAÜÃÂÎ8Æ'g)¬¶ úz4¥–“ðP†RËïIƒê¶^ k? àG=æ[ÿÙßúŽö/FüG¿öß`V¸ý/ÿwŒ§¯{w^kôü._|Î3Ý‹ÇØ'ÓfGw)Ø‹3Øk”…º%Èê±.K°d¦pâ¾9%ä&­ˆŠ–ãJµJÐý­Ùû'’'4Z_u‹©öÿ&AHÒuŒ(íq9îÑx‰c¾Œó =30ÖÑHñMÂü_rwQ^Ùé,æû•PyíŸÓH ­—ù·¸(žÝêø{ýù¯üf9^^̸ډ‹>Þe¦¡©ýÄûAîÕºWÝ˹^ŸåϹ_-)³z–š=*x€wÇ<ù&I¾:àÝ»ðÝsôövð(e à(<Ïä?ü»QÓýÓL)‰ÍF8C™¼°¿1º«?$?ú=ОòüŸr†óιòé!¬‹øŸê>áñ=ç0+ø{”>p†½—;%ÆíœKM¦ú¸ÜCL²ùF©ÎLj&í`ìZ³¡‚¡Fs:Q6 vÅÈY±"LæÜŒÎ˜#ëc€ÕlÖÐÃËù£4tIèÔ)%ÀžáçÝpÚX÷-w B´) m¡Û€l@'`‹ø%ÖoÑ^ñd˜ »yR.:eRM|UðJ¡['$#x²4xç |óÛÂï¾c\ìœËI¸î¡+NoBQŽÿ©6ƒy™µ%y½5ʲ.µå BvºØ‘w++ò£õ³My\Ûͺ¼©›˜²sCIß l{㬃óN±ìÆ‚˜sÖÍá±hAI s¤wÂgß‘N\êM‚t\ÏIÝèáÝtØÂ&¡)ƒpWŒ„ô êµ§ÜÐÙ!nS¤Èq[ß$è7P&¸½5^ì„Í LV@•M¾úDy¶ƒç7±ká¿Vã°/ðI:µ€÷Šòiú Înœ.ªÙÐ0L ørº Hm3¯Äap¡óÿ‹DÃz[òU±â$YJ´v§%H0ZUüQ Fx:–y~n+Üqàx¾9¼D ÀÿFÕ¶MÑ« üˆüà}þÒÿ?}áçâMŽ¿ú§þ[ÌÂB»x!ÿËŸ`ú—üO>äÙ?Û#ßÈôÛÄx³Çt y¡SèŸ$^£à“¨ø(Ð[8s 0$×’\s9AQÀ€ÜÊ(bÕ)¨M+W’¥h .¨W¢)†ü³3@„Ã9 ¶óÚV›’ØêxrIY¡Ž tñ£éË•2^3àÕàúÈÿ±›ÏÛW€uVZ·{•¬~ïB h"ëP wjþ„¿az[Ù«5(\IõœÄ©Z~tþ¼Í2_oÖ/Ýu}ûÿžS¸Þâ¾ý?ú¥­“¯ w£†5€z¼YÚz½Ÿõ_xiíc*qE4ÆBNôYÀ}›Ég‘–c&Ë›çï#¨Õó{ægŸíË{+ónñóuó¸ ݯh7²n)²þ›GñêÐá÷Üt^§r®°û0ó£ÿ÷†/ÿ… t×ß›˜®Ã'™î"åa÷oh_EY+¿9Ï@þÚ¹¸N_ÊÑújžeyž?Å)NqŠ_à8Þ²8ûrÇþŸÀy÷·ÏØ}81=3úGÊtmäk‹º9§L¡ö/cu²t±Ä 4J”à• qe¡Ò±Øž·©Oׯ9‰v_§úªùSüØ8 #6:Êm0C%9ÓQnƒÔ’wN¹ut,Q7ÇöÕö¿Š­Ê­Ïêþi_ÓªF^ $Éå3•÷^¸g™Ï˜?Å)>§È¿÷¯‚žvÈáJÆíÙÝÀaO¹Íp[ðH¡Úñ‡úß[ÇšLÓ¬WAŵuœñ„V¢;BŽ Ò‘ÝÖÖ+ð_Ó{sÏÕ[æ<R f*H×A·Åºs¤{zäÉ AÁœKˆ<; õ)GÂRúèÀ&G:Cý //ð2"ãs˜nçr Qdú¾Ç|ƒ—ŸöèTbÏérƒ?¾D·Ä:ü°E¬_{¤¿@ìòГÌ,Ì>Âu$<Šî¿ûx®þs(hR<-É(Ÿ»úrù>š¡ú0J"”-–Þ¯e®âx …Ñáà €¥se*ƳçÎtÝðÝþŽ÷>›xxH‡Û`¯xS9­2A$pÚçUšò%X®¿;n”-$è²sr²ÞcçD/A$h ¹ªÀ Ù€\:ò°@ì… +›1À$$Í(*…³NQ¥ÚšfÕÉÈtI)È’)…Mx¯«–] ûÿÃÔ’s_ Rø“Ä’'žgŽÆcÅñr@ʺb5Õ§N‘È ¯¢SáfrºÎ5>Ò„JP9>å@UÉ:O»S§ðtp~÷W`÷P‘’Í %¬ÍµÄ|*^§ñR 4Yšîµî¹Iec0X”qî-Ôý.Nç€PpÂÚ¼¸Ó‹°•ð6ÛlDÙ&a2è5HC •’°Þ¼ÉBpÎz8ôF^\9ƒ:ý9•XÌàÍœá]æ-¶3RÔ}î6h÷º'XzHÚ<€ ݄ˈK޾ƒ¡&ˆ ÷‚ZAr¼âahJôCpÔTaoÎõÁ9LÎf£¡êÖpªè‡p€R†^˜r\î" ìå oÒ'² ¼“…wÇÍW¡ß$ Š ÷ý]r¤𣽏F[é Äé'g$ðF±h;ÉWƒÙ  M‹øâ–As¸hä› ô¹­'ú” *ëdiÖÚÃÑ8§‚^]\À*¸òôé#~ðÁ—¸¾>ç¯üµÿñôLðŠøO¾õßͪb¯ãÇñ/ÿƒ×½[¯5ô“ ®ÿúäßxJw ö",e ~+ø‹.Æ×;Á¯:8T°²û.ÊUW-ÿ™r(üÃî¿‚ÿ¦ø¯ål] ‚ûÞÀü„ te IWÇ‹M§©€F9€¼–«¯ý×Ý+Ó«á³ýo¦ÿñ·ûþ-žKCz3àÿÏÒ7ÅýÏ·þèÞ~ÉY©?[f —Ú/·Úîw?ÈîÝË»ëŽÐ úÏöð´Ç€Eí½,µqâËç¨='Ý^ß¹ÌÓþ÷ã³÷Ù÷ñ–ë«@–Õñ7YH8¼9ªy/måîï[~ƒcáx¡P|)·<–ÕokÉ1  ½Ñª DkÓN¼gíTÀÝV)Ñ)/tƒøK»Zg'‚úן à¨M¶4Çj}tÜ+Á¿æÕHxþüdq*çÏ‘ïÿùs¾üÎq‡Í{]`[!ï¼wR†ád<Ïïcª]`m}Ã1Ê%l=æK`^§G¹Þé¡£üîjÚnm¯qâ§8ÅÛoàÓ´Ý»ðVÅŸý¯ß'ï gïwˆÀ>e†wݹ1=(è ”“÷‚áPó¹ÚžWÀÓ&‹Ä÷z]µô¸ã& àÙXu?‰òÙ—çŽ^ê8ç~sÝÞ×™ž:ØÓ€±Æïüð«ÿþCúÂîãÌøÌé\ÚB*SÔ³“¯ëõ=KÔ*Àä–J†ivP™U;X±IëÀð®òÿ¥Áài xŠ7$Æ¿ý%lÜ¡]Õ{õ-~x»=¾3ØyUþ ÌJÀ¥>›¯ÕŠdG¦+œ§˜<ÆÉxš@žâv[ÛC|Ž#¸*¤.$oT™^XÉÐ<ßݽýAâ [P䉫„m¨v¸lIÚCêBIBRL"áu˜oé8 €FÍR˜UÄwø¸ ww\ .L7ø4"‡fOíp»‡ëïR†GÐ} òsäêñÛ]8è\làý¯#ïý9èßÿCôfÂÿöÞ,Ö–4Ëïú­õEÄÞçœ;äœU]Uí*JíÀˆƒèfxðƒ…Áȸýf YâZB´Á²i Ä †@B²…D wËCw[¶±]tWîªê¬ÊÌÊéÞ{ÎÙCD|kñ°¾/"ö>çæÔ9ÜÌÜëêžóŽñëÿ_ÿu]òÅ£h{Ž·Oáã=’ÜbäS•3T/ññ!î×0<į/‘È.Àzñx¤HÁã’Æô‘á÷¯¡ÃGˆ‘¿€Ë+ð‚v¹ƒ¤B$ß÷Šm•á5eØ”\•ûDꕳ$¼p_‘ú½#šC¿)ä·’’¡Jÿ{DçŒØÑ¿]FÚÒpf!ÅuXµãkÎ ŸmRˆ1žðp.«ãƒ!+Gîò…ò¥Ç»ŽöµßÝào@r2N"¢“¡U§‰é°NBw!!I®D9)Ÿá]º†U8_ mÉwÿÄÙqÿãõÙï ¹~€­¾‡¥ HOƒ+9¿Mî_†Ý ópäuMtu›ÁY{¸ïûúŽA³"èQœöë~p÷hV»¡ÙC<>{'·¡Œ‘<ªEòYâ¿!Dfsq(’æDQk±Ý:¦´‘¨‡UŽUˆ-o$ÖÏEK~ór¬F€³vŽfŽïQ¬¦“àC]íqt:…˽qÞBï‚ZI_@ÔAF§idªË‘ò% oVhº@Ó=LŠ¢KÛAÓã²ÅR}üæ‚p…èëˆäßï±­a»’¦£gÔJȯ7…¨ä+aÕI€Å°÷/”óµ3ŒÎfç¬WmÂ'd¿r6~bßý¤˜/QØÝö£¡MQ›ËõA¢éb,ž ;Ù ±“Aë 5Z§|ö•ØVÊêŽLŠ ähݦ2+m”Ïš@EæåŶ)Ê¿ô/*ðæ›Oñò^àò2$€U„?öÿ‡OèÉ?ùöïÿøÏanå>ð%ìÿè·?÷ÑÿÝ?ø»Ÿ~Ö™ñ"Ûxoý½HäÖJÄg¸(>HŒÓX"þ‰Î|ÔÚ¡»,kƒ‹9"õÝÉ‘îå µ“{™?X˜1Ï¥¦•%GË*T¤ŒQ ä-^áÉèü"LÔ“üAæ×ŸòÛ=¼§}‡€>2?—Ø"@,%]IU%ybI>* ¿¬ìrÜr¯ÜX8šM,À\¯píÏ€øã"Ýàw½ä{ºß;È}›Õ»^‚ÞïNÀ™€ÿz/‡ $D”l6ÛÇ‘ýËg§ñ™È¬ÚV¾¶Âõ^¤aÁq`&CH´s¶O¿­`Ä}&Låú£ ÜÿëÁ¼I|¢+ ŽL-Öܲ½G€§¾±:¥s%0 ‡ßÞsþÅTèdjPÈp™kȸ3òÖÑV§tÆ%½ñ.ÔŠóÞc{'®!©-3AZ/Ÿï+ˆkYíØÅdŸtßr²“ìdïÞˆžg÷ú)ïáû±î¾Ò?ÌØÍ…Ò )¤H+%÷Ñk¥V/3.!ë?^Ǥ9÷„€©5Ç‘ZÁGÈûÀfl(_ÖH0Ä ®0Íñ€èqžœãôì?Ù·õóé4`öo|õOÞçétM꡽çERZ@ËĪ(Ò‘+²ÿÚJxÿzHk)9¢ Á½¨gôÐ4 %Œ¤A( Ò¥2µ¥À8<úq8Õ‰“}„¶û?îâ›ä!v–ÁV †+Øn±­Ã^±=á4Åш‚6×`ô[™x›`æÈàèî6ß!«A{yû—ãÚ‘7#]QÅ'`¥ÌäÌÁKZ<ÞJ¨)Ëê¨F¾h‘„H*yjJ©v(IÏÈcKƒZºŠßœäÑ]¤ð·ñì¡v08ȹ‡qûÛ 2D(ŒHú>¾ßÁêé7ðà d›A;t½Æî}fýMÐÄÈC¼ÿv u$H¤{˜=Mjž; Hn"äœ>"ö}…ʳ„ïGØ^a›-¾ÏÈÞAHï§%"±|¯Ø#‡·Þ&¯¾‹¯;D׈oÈû—a{‰÷„Ó¶xZhOÅ«!®8ëN¹{¡ì6 Ûû>4š¢i|¾Ö ›Áè{Xw 2°“ÃJ ø_×ëA 9ËÈý¹£á཰«)'$Ô ´ú9½:Á¤€þÅÿ’˾ÁÐo¹ òÒ×H/üë:r÷‹´þ¶u|c€â †•ÆJl)Ð%²}ö³Ê¢mö@•¼ïš'ü‡òü„šXwZ¬R¾½ÀåOß!»ãí³àʰ{ ô=ÒvQE’·i…ó5Œ®E±¶{çz_^ñâñ¨:]#¼™N[µ;YèzØñß ‘»¼Ù‡´ùØB3ÍèäTšÃ,!a^ݲæ à „¤2ìΣÙÙ‰¢€Ð”ºëÅaëâSDV.@ù@¤zI° õ3G‚`p±RλòØõA^¸Þgö¤Q#• BCR¹dm]¬Ô‚‚zB­CmE“V¨6H2’l0Ý‚=CÓü"÷ã7ø%Ù´G› t-¹%Ó¨ÓT°Øl´’¸{i/´)È Z*·;t)êÆ®wF‡óÒ5ùaUÿØì¤Ïeá¢ü×:àM)».ä&ú”œÍAÞ4ÔšìlÕ§ˆÿd¡ )6êöòß%H1 ¢ŒÐºÐŠOÛ /Ñþ‘ú¢Íà¿Ì„€ þK нþæ}^yåy®./f"€ü¿ú?þ‡ü)±?ý“??Isîw8œ8ÅòðGó“¸Å'ÆÚ¿ÿ~5Ã?%¬öw±«Äè#Í.aWi"ØúVc¾ºIe|íø^¡Oxã#r¥PÇÕ" €X°ÔTƒ€ª… &•…V ¥%€'Ä5ˆ[.1f(‘ÿR25‹DJ'Sñ`q/ü+ƒŒNVÀÙJJ O'ÌtQV¼D¾ÏòRqüÇ7ñ>ó—˜ú1θÜ?Ê‹­Ržˆà>øàB"Z>kôõmþâ÷ßôÚ|YúÊ LkSÞú%ÈíÓyËõºË¨øi[œpðíÐ}ø»|ùNïåzGO(`DÀ×mæAP‹`ø8ÊÜÊ{ðƒr¹ºë3©ÏíÓ÷L Î“\ïB©JJñZvKý›JU¯,A= ú$$€#5Yn«u¬Dÿ×í2µV>­Ïÿå½¾pRs ùò»ÏùK › H#´÷”ñ:ÓÜ‹@Ƽsš­¡Œ½ÓîKêV÷’öµ¨5È‘E°cÁ4ÔƒWˆiÕgá³x§À.nù<ÙÉNv²O©ÄO¡­Ÿo¸ún ôÝÝ`—F÷tB® ®3z'1<Ê´÷CZwÜ 0^[Dü ¹w\æn€›R¢øê²à½/¤Ï}(`ç䫯¹3+»³Œ{—çmÌ9_,s¼üNÛ>§öôO¢ÿvodžýÇÏ8ÿ‘†þ2Ó=£SPñp‘°ß9ãÞÌPä¢òÎÑn Ú eèØzV ð&€@³ˆjóZ/Üñ´(Þ_Å|8ü1q&R€,Êþ4'?.Û§²~²Á6ÿÝSøÀ¼ÃûO‚`œà½B Šç"ÓO8ðܤ̳ eÚû(È~9Bþ!ì!í òˆï°¶1ä@ÝU\$]¸Š9“# Xj³“Î9aÌJ¾÷¥#¤t>ÂÑL÷Þé‚I"yùnI {¦Pe_!9Ãä·xŸ>EôSï ˜íÐÍ+6:æ ô-Úµ‘`CD7])ÁÁµ:\ÎIÍ=ð»ˆÖö»-èÚ9ôW )Žßƒ_mœð{º‚Ñ|ë:8Å«EZ¿›Þº„ô-ìþ#hÎðá ¿ú><ÜÌ€\Üt5Qd’»®‘öš [E~o€~t’8¤ˆt÷’çIéCTPËK½cp_øZçøé ¹›ÑŸBîþ8ÐÃÃ_G¹†MDkK¹NuïÄ]‘àŒ€Qœ@;GðÆ‘•àzzä³·t7ÒS´Ž·Že‰Ñ„qŒô Á­Ò³Z¡Ö('º ­[qžh Uj^Qr¢2`db›_Gº3úѶ=ÝÐ#=Ø^¡þ/keô»Æ#}ª£[UAS‰ŒMð«ç'boµËÆéW‚5B.UÂB=™Ü8–`L!cî@Û{¬ñãXÇÌiL؉ÓÞ ÿhdÊk²åQª­È”g°?¹ORçJ ï+Á¦ï#¢ZGŸWd¾?)ëÑf’åäß)Ÿ¿izrôLø4>¦TX-—åüR d.ž‹ò\æü¥ÌN?E–¿;®#"ó2Ü Låð}ÿ~¹YŽdýçú¸$Û„þFÌ­Žë¯ ¢eúîöô7OþÜík#¯ÿꆋ/·‘ÚµÙ¿ ®ã&0‹¼3ÆEà•–á$EÀVÈþ3©·Š0¥8–Tü¶9Êë¬r<ûm'àÿÕâÓ¸íd';ÙgÍN€O¡­Ÿkxëìø‘çÎY¿Ø’Εî©Èu£gJs'˜qÒ)Vrå$INZ…lŽõÕ;QΚK•„:VrðJ#ä\ò댠¿:Þc̤l(i„KÜŒ€†©:ÖÇŸÇ#²Û¶-÷}Îì¥cˆAã¸1†»ÆþÌî‘î)e¸t†«‘´VÆ­1n2©Söeð˜:!ïCCvDº€]HJ…tT¨ŒÛ2¥(éjjªò…Q$ăÇã2^ç2ËäÒ™Q˶ܲýØ>‡eýd¿SPˆœÓ ‘iVœ|£@¯X‘ý÷"ëí.Aör4F€¹C©Qóà;À3²¿†v[êøßk8\SAY%|†Ì¦òîÕ“®sD@Óq¸º#žCJÞK‡ã^¢0f‚¤ÑFÙÐ&ãf!y.tDþùÚ³u!õHßãÖ"’0-Ϻ¾,;ìÑ*¥Ž'b*èŸ2­72KþGÝš£ûki´Ô•RgDàí·ïñÚkÏq}uŽ–Âóïý÷ÿÛãÇëKüìdèÿAÍžÙÐÿ«ßþîæÓgòæ9—áEä¼NÓ$äJáªAÎ ¶ ;Eˆÿ­">ßi ÷„õPØ)Þ墀%1OÏY •)¤q›Õ‚°å_×Y¬SaN›>#–VQQLvåœ ?. ð:™ö2ƨl÷ ]Á×›ia‚¶|´vÉ¿Ƚô¯ËˆâræFÊá“9¾öã¿cþ­ÊØtáÜðªÄ0}‚Ôf†CÉÏ´ï0Ò}v”Ý‹ûþðîùÊ€÷´¾Ü~ôí^öË\ª(Ÿqìz…ZÖægRÁÿ#×ЧꙔo^¤°2šÊ×-ûòÉD½^( L*>•w÷ǘž,þ¾óóxlœ&{õZ 2Îb_‘ÿ—E Éÿ¨—ZÞÓ IDAT 9tÁÛßÚqýòȽ¯wô2ãÖŠŠq©îŒW†6‚6QjltÒJ& ?ÒŽIIéÛÜ Ð?„G¡b\üµð·`Nà“Æi';ÙÉ>£v"|JíÞW;~ã/¼Åü `!‰®+A’`ƒETsO‰n.ް*Sóž/sO’þàôYÞÜŠSüqòæÜòy²ÄžþÆiÀðÿ±á…öŒöBñçiypV/é¬aØdÚgÂù1\:Í]VÉ;ƒ6…ÇMDŽ*ÁM炬ÏNÓÅ Ñ3S¾ÑX—Ea’Œr#¢Qíp»839`Qoä¨îLséåçrùD 8Ù{´ë¿ô">V¦LÚ2·.òš^#ÂMÁD Æâs™Í„ beº/Ø"…€9ÿQ"Wh‘t§HÇ’“ƒŽˆd·B¦¯‘ŠO¸Ft'6ŽhîÁ¶dÛ‘¬_GEÀ‹S3¤÷ˆ¬V@.¿?2ÿjë8÷¦Lã †B(H‚¥p~ºìÛ讀¬4ôßÓëפíI×H#x~>Ô¼¡i© dFŸí‰ÀØÀtÍ94k\.@öx“͘Äs¤A@'ž‹ãæH?@!*xqÞÒ—ßâíªï£xBTâ~s!:5JHŒ§’I¡kC6~t/…o¸l#e¡©¾ó˜Ìëþ!Ö¾ > ý%ž@;Á›@/ƒƒŽ.ÍqŽXm4#¶Â…Ø–¢¬Êåë0üßÞ_ï‘] ¡ÞŽˆC“œuö=ôƒ“cÕm£¨ Œ.EÀHMqp/œxSDO°â>ìÈÙ\@òߢX#«ª“«Öß÷|ºÏçE! àÖ|îr°;\ ¹Å1¹”—lr² M+h’"ï4Fi(Ê—/Ïï×ý©¯Ýçç¾ó€—ç|+œí¬ÂùÖü? üšŒÓ-"›Ï(’åE’¼)ê-Z6"´¼”Yš¼ûÜiuþ‹ss üKY¦DÇ»G‡6É¤ê €¸ÍQôk¥?wάR¤Q±àXT“dH ´Ž4ŽtŽw)ÇÚŸ©¨JX!7Ù¤Çíä!¡`DEˆØ.¢ÁG#å’¥¬0 äôÞÓ4ú,ã囌ÃC†k¡„´RÚÎI)ÈhîÑt°"µÁ,™üñÚ¯œûw>iöÒ(üÇo?äÑóÂÓk¥qgcN·’P¤Ba„‘›$J{Væ«e|’-ƒ¹Œ±+1@ka&T°?H42“i¤’iâóüÙß~ü8ýxûñò;mûœÙïð?¶«ŸýåõzŸ&“7Îh~ýôŸ{ƒæžÐ½u»Läõ+ᛄt¾Sh ¿L°m Íø6Á6ám.i4$ÿ/ërYšAñ”aŒè~Ç‘!M`XQü"Ú~±é]ÐX—TDÿS¥DÄÙ  ¢j+àáÜOS_©ð§O‘þV¢þ«"XÍsE›ÀÂe›~0ù(I °ñxØVAüÔ~>N#i™ªÆó ²8ãq_Tí½ÿÆ:´}·mÇPë ÀºFùOŠ1V´’ÒcºF¹À†÷¿¾üø(Ñà}üƒ"Þëþ^äÄEB€:Ÿ­Øñt™‰±p Î`ÿô?Ïd1W‡IæšÛS§l‡'Ö¥EzF-ßõw A0?ˆc:oº±£êýN4˜›¿øàÀ¦ø~_DüÏ ¿èág´oïz/ýÌÅ{»Çϸµw”oü™g9{)Ô\Ç«L:SòÞwGj­ƒ¾Q—ûÀ5òÛ¨i[§iæeý •kÍTè#s*€2O®Åï=a§qÞÉNv²OŸR»û:^ú/¸øJ‹ Ðܤ ðÿ–ÓÞ×9¢¹Ñ=¯cïä~Žê·~î,}¬ß±RSžs¼t”Œc#þYlçhûñò;m;ëçg/žªìæ•û?ÞÑ^$Æ] h+ ×FÞÍybÜäð €qŠ´ÝÑ&ê@.ÚÒšb¸_Ë|jóœ gu‘âuëÅThKdÙ f}Ýø¬àÿÄóÉ—s¥æ-¶óÛNö¹µ«ÿò‹!)q¡DÙµ¡Ô¤Ln":Ç 8(Ù‘ÆóÈûîW¡)EÎÏÚ›Gê€L€¶Óœ½€‡EäÓKäÿ 6ËíåtrÂéÑ¢¸ãÙÑÑða‡Œh®Àšø¢6i G¤Œà[\ zm M‡äå½:‘™432DšéAƒ( ZHVªa‰^õ$¡ºJÈY‚t†o׈¬¡)¹VûŒ¯$ÉAþÄp’<šR" MT~-2«zç dlÐGß^ã›o"5ƒQ"°ë£4 ÂAIÛÀ°|ÖEƵª>TTpj£âÙÉIÅ%!¹À †·Nw‘‘uF»xÇ’ã;m$·"xhsTH´e^”b}*:: ~ù 9_!d¼¿ ’D«Ð´ÐÆ}ŠbaŒt ¹ä{-áæ“ttd´P¥èrIJß—2¾®x}‘ÿÎN›ŒÔºö;c;*ÙŒ¶Q’ûÁÙg8_AJµ±^xºª™ÚdŽTo”z`‘ö"ú„÷èŒZ˜[yÆ”žazwïB,¨ŠR;”).áœ4E¾£—â! ™ÆxeÊa?Û,¬Ö"4Ê’s5 xKN!Ë®³cúda?÷|ïEa&àFŸb,¡9ˆ(¦B;:mîT“ƒ`aÁÊBÂ_ƒN­Š‘Ã|Žz.MÙ.Âõh“”yŸø¼huZ®„0´( æÈ¸P ¨ª+¥Ý…Þ,ÒAû,¹.€$/ÑÒ‘~#9ôÄIÁªíñ<†’I6œñK\^)]Ôy\Ñ7X~ÆGø8ÀÎ`4ZQRÄHë„>÷URóèÏ~ ½úíúA‘U¤3¨à¨`ÀªÖ9¢Ä> 厓œ¹°ÞÁÛ‘mG:¸+ÑF@<äø °R»u!GT"êö’Á†™$êEÔ›²¯lK*üóö·â¦–ó×ãè0nY?Ù û°Aÿjû?üò×ßøH®ýi0}å.¾Ez~ ï2Ž#ã $¸ ”zu(0ù °rH#>(²r,Ñát†§P”r1hŠX*jYÜLcb)¹j,Æ¥8‘BÉÑPË®Ôè~ʧ,>koà.¨+5¦VUJ]º«´eyÇPÀÃgCØÃÊ(u¼C…ùgÀ±VÜåÞ׎G@KpÞ¶çÈÿå^Yœ±T(ûÚ_Õ•ÛîåÛ±›áqg¹ô€šàËoì›A¨ÑìUê¾æ€wÞ¹Ïówòq4¶‡¿ñoï¥_ꓨJbÂÌV®*6E²×çäî˜Yyïþ®žÄgRïÚ3²<·X%´x¹V™‡z©ï^©u[¼¨ÌÅõJÍg¹eú®÷ú8ªËaª•‹¿eþ<ÕØú»JÔÿ-Òÿ"1Ò˜‰ïaÒwRs ·V3Ê:Á/4TŠKТÆp˜… Ží<ÎiZmÄhƒG Ö"À1pŒàH ,}ª:·^¶Õé| x¼A8öá.ljïT=OãÅ“ìdOˆ=1hâ~ñŠ/œ:Ä÷lëçî}}Å/·Œ;#!àßg/¦’ëÜ÷!ñŸ÷È}DúéP¤ÿKÇË^K´ES§Y"Ÿ'ñÌš“[NnÉŸã¾ ÖAÝãfr´~²ÉNrQaãÆÐµÐœÃpå ×6È’0l Û0èÙL~ÙG´lÞEÁ¬Ûµ•ið8©`TLUÁ(ÒRK5Œi°x4h¼1`n y‡O³~²“=Ƽ,îÁ6±\]23æÃ'¦ Q¢=w'ÝQô‹_mÈ/ÿþ–Ï9?K{í/(Tu\9ŽWÐ_‹„s%¾Ô›œ} ‡ŸÕw<±² £ù`Ðï‘ý#h,+¢•.¢?K¥sðtQí"#Ê´ßnHɸBäø±]Ôu‘é?)R<î£R§°|¥Ðþc‡Iƒ¬ÖdÒÙK¹ü´÷¼¤ 3À¨¯FAxŠ|ôw:ür…]pµÃ‰¨´,˜¢ø¸/Ësª õ¢¸Æï¨‘ÿõÿT`ÔÅC—Æi:G.2r×Iw×Èû¸¬¾‡«Gðhgƒ\Ôª €©­ZÆ$ˆ Öº1d|AR ]í íºBŒ„ŒxïqÑU$ˆâ0ʃÄ+-m³X‚† ŒÆ µpȨ¸DiWqoû}þytÍ £0ŒBîôh|²´8x64ç@V†t±KÁ{ÇÇ’aú}’ÜÉÙB½:ë{lJ]¼%ÈÄ}vŠSH+ó»\nR DÝÖeqˆF¢º45Eý»îaôÌ™:+2²ÊèSØì2c}´á×îŸ:­¥­kTrû È{gl„fv0vç2¨E*†¦€™n°ÃiLh²³mJ@òæ4±¯õ ´"48IC]eå﵉ÁœTû„ú¾õÜ—xÑBPPêþÄ}‰„Ü´¦H¢šB~Z<Ù\F4ˆîȾ#¹G; ¨*¹yK¤3D· *ñ¼Á‡ßÈÎI9î™’g.q}DÃ5¤PsZµÑvkSÛÍ¢‚€ÐµpOõ“ÿ3o5§úraÂw/`Xë×#݆ÎI{hrpªtt’E=iúÈš£V¶4&d2]ÿ´ølb@SÊi+ÂæòœoÝgØ®QWþ“¿üÿÎÇ÷rä~×1üÒ>g¯öÃüŠø©¶ù·ÿÖ‡ô=Ÿ>ÓøWãCš¯9­­±~ØAȽ•üÆc³ÑaT|pè™–«\2ƒâƒÀê]¡&…Ø'!ûorCö—*Š]³3`¼aŽòŸ£ÚµŒKcÚc¬Ø«A°PÀçHÜ2ᘀ‡Üø¡Õã„)Y|‰ÁNÀáqñ—pN ~ùœ¢ÿ+°_÷ÉkNç—[Ÿß4¿Z€”‡ˆÖñë¦}PÃ’d±»$ë«rÕò¯3ï¯gø|ÞR=`yÞÑÇÇbÓó_,Î˃ƒCÝë>½Á%ÕD~GýÝðò?Nµé |jžÉÁÄ~Þ^kZµ¹ÜÏÛð_– ‰S5ùÿZ‰åÛXÂöKE€ã;ŸZî8ÜRëf]"ñOü™¢ü'“¢ õ?ŠŠˆ¾‡'5×Håúò_¾äùúŒÝë™Ëïîqƒf-ô—ÆpYë†3^Gúb4|¶îÄÿüOj¬^³ÜoúfoñË.š¬y½./íƒ6š';ÙÉNöÚC8Ùû³‹mù¿ô&Ïü¡5×?ؽ:ÒÞOxö‰QWÁNic’g• WåpFŸr›ßHPAÏšàÜòy²ÌNŒÑ°ñÊX=•h.’Œ´‚±wòÖ k%ø\] ˜MŠí!÷%Úµá@:JLÐUU¹Ò‹¶‘[Š1òÛz$ó¢~,¥ÿkýX¨ÜMvª''ûìÑŸÿRø„LŠní2͋ëæÙs(áîs”qüüYíwqL$@G<œ~… P±Âin]u¥'@šg×ñ¬ªÐü^ÕcbõzŠ[ŽÂ`ˆöXÚ ª c¬ñ”€Ñ|‡™¤;`Kæç°*÷o8[ŒKT@~‘èèùH« }𠤀ڎ‰!š‰ìÂ=£oIhîàM‚µb2">"6@Þb²E½‹ûtITå´ù>@¡Ù@—‘ãIq 4Ý‹£´>š·Ë3–’®€p¨º,ÞCZ€ÿ“Ó±8Od–„×…DGWŽÞ1ÒÓgÈS_AÖ_Á8‡¼…îw‘ü}|äÁA"ßkÙ#"7\‹GÃÉëc¨µèΑõ9tçx³"²áÞ#ÖãÍa‡0Ð.UÁP2îÆÉD ‡É9¦|·Œ„Ã{Y#Zy…}ŽûY¯Ë¥±ò| õ 9ð,LùÊCÎ3rß»)êߣ%Ø@»¦[üO± þ± ÉÐ&œ¥á|OÑ5Zœd‹ /Ô¢•{w/Ë¥nyô‡ˆ`õVžÌ©B\PUV]´ »Áè÷¥ƒëFÎ^Ìè×^BξÄþ‡¿G?üÛ }vú‹SG·´ë?¼f÷Vϰk„aíèèxk…q„”=P ÉÇJu4Æ% Á„IÕél0)Õ׈(é‘á\€~u™>û½•\çsôsÍ{žnÛVx"ƵC€I@=î(y‹Õ}Vвm u7H–ñ¼EtÖÂ0Bªj gh“¡yÑ·p %¢T%íñqízl›KÚ™ˆÁò+ƒW~ k¿×#l"ºtJö¾ì¯`% h%'|vŠþ‡gFA~m‡ßwîï”ó+Gz'ÂYïH†Ü@“…Æ K!ÄXà”%‹ ÉAs(ú•ã~}}Ž:¼úÊs$«ÑÈQþÓ¿òK7RÜ-”ÅäŽcLÃì0žnΉ?Llñ ´*Âÿð¹-W„Ë?ñ«Ø³›æ{Ÿp“×ϸ~°E/2j-ýÃŒ7m4·\R={*E"Š ¾M!Ÿ¿—H  Û¶)ÒìïS0n2ACõɳA ’‹²TQœ‚$àEößK¤¿k´¿et)ꩌuú }Šcïì×âÜU¡i¿,+^y!1ŸöÅx”i,ër¸þ¡TÔÇÿÇë2=EÿRçS:„ <Öhãi¹žwøûæ'äU±y¿î`fö˜«øx6ƒú6=Ûù=Ìýø:G ÛýŸ Ü ÜÌÔÎ*Ú/ÉÂrk¼ÏB¨díúû>+Ϥî)eÓˆÇÛbô*“fÜðÏñ2‹þ–ųðÅ÷Ük]ZÖ¶ã¶ØWþLµRæú¹ ìxÿýPö_ËºŠˆ¸ Alz{ê«“š+àÙùÒ¿vó—Ü;_k®3š"hË-ÚòáQI''æ9&yc ׆¶á¯ í`¼ õbmç/i«ßöó(Dø¼ã8Àë=yÁbwø<ÙÉNv²OØN=Ч؞þ©5ßýßñ…Ÿ¹ƒ~Qؽ‘IÐÞQÆMx0šseÜZÉ£#˜kNÌ$nDG¨]‘þA•I6'rfúA~óe‡89BnëüŽ—OöìÄ ûëÿÁxá§ÏxöŸ8ãê÷z¶¯eÚ»ŠFÿÈ\&E måé%Ôg}Š”ˆrí‡@þ-ƒ½ƒIÙ©|Ÿì °Ë¿øe HXÀÜSPìæ+ó1uÙU!;v=’^ù{˜(v5àÒF®z!œŠIŽ}±³éâú27ÿKOz,P\ËHt·’Cºô?UÔGÈïÝÃðØÚoÀsFÙ¡Þc#À#T!\`Þá´`#’÷¤| ÛGäÝCØo¡9T!d«š‚QP·‚©KÈŸ;äì܉pDï ï‡3TìxŽï-òÓ¤3Ü[DËû!#²ßýê—¸mpF0‹H+·p›:JXß­ÌÀ?Â"Dw&Ôw³0Q9ì¸Kè¤tF:SäÎóÈúëhóc*;Ƴ„_lëìrIQ_¾Ï‹RÊdò‚­bMƒ´gèù}¤»‹7¨®Ê×ønÃq¦mDÙ4‚‰ EîÛéQpÛOrùxƒ{ƒ’â'eÃÇßXÊ ×F¿ÏŒ¢˜(MmjBN0ŽÐVNNœCßW<«Ò_HgÈÝ‘ôåÑç~·{õo`ö $wóä=ðlÎT‡–˜CöHÐŽÈýŒœgpÁ7 v ñÞ¥¾Obì&0ƒþåS¦Ëf ›îEL °%¡55 2i¹+ÂZ#Š<¹2lúl´+¡}î§hºo²ïÿÃ÷ß U§uãw×§ñØ.®£ÎvX휱矆ZÀ"¿"õrX´BéEòß`”t0s GâÕ+^œ8©lyþŽJ‰àGJÕœ×UB=@e±.RÔœé…Hà¶®î¡0àÐHYNNj#J[F'…0:í8B¿!µ G9C¥AÏZ+QV)RT’¢½wÛ’ó޼¶QwEwE7Šï<W†„÷Eñ£aRÎ¥¯&S»ùñÛ¯œŸÈ÷>I¶vøÖÂöL¸³®×Êv44ãÑÑi148Q¤ )[D÷Ó§!ì6k’Ã?|:½$5)å?Çÿìÿúå™Ä{<Þ?žÏ.×Ylãh·,Æìg¿ñç§åO"]Fÿµ²ýW¾õ±ïaoœ±ûÙ?DÿÏü«?Ø3^5°ià,ãû„ï5ÆÍÛû„ìX™ÿ,0RÀ|&9äˆö/å¿*I௟2ÏKäþÇ‹Be¬^ ³¤·Ï2ñæV€µp Yg{gbµ\i¤™)Û( a2×Á£HÿÚÀ×Å WN€c™À Ü X’÷_€~8ÿgð~ 0"3 üfTñð?ÿ«ùwfпŽ¾>þïYNðÞý9Äû]9¯Fýìz÷Ë? mèãçbŸÏ©&& ¿–·RÒ2¨îŸÕgéyü]”Ã?s.Ϩff€—z¼dÀLÊ«uXB‡êð–R!7 9óqgjAjz þqDËøxZ÷B(-ßãíéož|¹×ßpsƱ}m`¸6š3aóÀ&<Âvª­ãuloŒ»xÄãÆ°}øy}€aSþÁ«ßwJ 08RÔŒ°Œã1 qÓßû9çìd'ûlÛCؽvr‚¼_{æ;ãê»=?ÖâÙY=—ÑNÈ{‹|9}Èžû˜æèÿ¬“dÎñýoGÛ¬~Ê´|L8ˆ~^æÌy)t8Ú7;ÕS'ËúùtbŒ›W~ê?zŽ‹mÖ/5ŒW™t¦ŒWÆpi΄<86Õ'ïç6,¢þk©ÌÁàð°>p@8ŽzG‡!Ü8úã§r²÷aWÿË— À{AFJ –˜´zÕÁ•ˆ nÎÇ+È© ¾ÆŒ11¶.¢´“NeŸp’£ -ÀÈùS&ö¤_~‡"ÌÆÁsÜÈŠxÔaõ\Î ãž<´H—$ †Éy@Å0Æ#DWà-êu½ï‘Ýö;Øî‘ýrrÆ$iO¤8nD#:=¢ÊGÐ-¬[ôéoYÔW¡OÐt„Guz|fÄÆ´G›;Ö¸6ÅÁÐc¶Ãìmdü!¾€ï®ðýRò%'{(E.²N€¾Sß‘þt‡Û%ãᦫ¢^:ÄŠî>šžEõ.Hƒ[‹Ê³XsÒAs8x§Hò"Ï_Ã25Š™$Gš„¬Y¯àì.²z oî¡i]`Î1~§d\°†f Mƒ§IMäœ×%Ôúhn­Yâžl@ÆÒn0Ý€ïi<“§YGÔ5æ!.à50>ÀnB@ý°ìÂ<°QGÏyêÒt?îô÷^ƒîoCŠhþY…No!îí{-cŒ@ÎH2äþHúÑ„<ûU< þÚ÷ÃÕ†ú^}þO€Å L 2€‹Á@ªÓ¿(*à`:[¬[‰çr‚„bN#áøïw#«ÍåUÆí›xŸi“Ò¨ð°;u^KS ó±Xy‰ZŽwRš7Ú!š43â=…À âŒõ(á¨:b³@Æ_F<+>m‹wVÎEÐ’6@ëºÄºà%ê¿l'äõ•š{½Ô`Šãt[\+¾·)R®©~§RŽ5²;j=i¼"a$Ù`í R†l9ÚœæG€nÀ¾ÃC$øhØC¯ÁMk‚ ý`‘·&áEÞ¿f>I°ÿ6{+êʳYy¹ƒñL¸ÚÍÞÉÓt£°oœÑ…d»h¯Ç}‹šsuuŽŒA©uFLлÛyÙ…ÿóïüúéwý#z4ÿ+ ¨-"Á&iÙÇŒýk›~«:Þñàxù¶õ'Ð~ö?¿X[ô7dØ?R@Œã«/ÿ­¿ù¡_ÿSao¬I¿øeÆ?þ¬î8ë7žÃ¯ãÅyë6r6â½B HŽÂ£sèF|œÿ)êñ8òeyþC¨¤D* ÔIÎüW‰ÿBƒI(¾h+”]&â34'ÜgÞцûÁ6Ûê)e¼¾ È¢œVñ `á€ZB‚¾ø{Óný§Sßü_äÇYj$”gX#Œë¿ h\nôeËû^ WoÜä;5:ï¶ï¨ÃgÌûS¹ø?9¹eÒ±<ÛoÙöñZ-SË-þ¸÷}|Fù}sôyÙ·(“ŸÕgâ·˲½ ÆÔéÿœ0!ŽUw\"%ÂñL.ê#«óM™?è˜8&¿×¿2ÕX—Åú²Ž.dÿEBߤÔÏP- éÿPø¯ûϽӳ<¥s ‰ÿP)Ng¬(Π²t.G‹>JÁöïGCá8I!I@Z ÅWʹ‰1 RÄL©Œ%/–k¿g‹å[þßr\./?yÌúã¶ìd';ÙÇhO ¢øö·vŸô-|ê,uÂý_ÑÝYä^ÇïýÃ;@„á*)Ú`Ë£Y… ú¸q¤lëäÒJ°>:I] LvÈ!‡.¹LÄ3@!°èûè­ )‡ŸÎ-ÛyÌúçØNư¼sº{‰´ŠòØž—\³+%­ ¹'!¾k]ПF™ÿc@,ßL‘Ë„ƒpt¬DPDnEn2H—å}©Œ§²}²Õ6åKQ·Þa¯ø|¨ üêDšA⺹:ÑŠ Fß„€òÙ ž y`rZ•?Ç!ÌËïä.ζêÑ­>Yø?&çc™Àåù fŽ zè$F3É yÃÌp×÷ *Šyä¢ËÝ IDATDõÑ#r}?ÂÖJ.¹Ùá9EÖW=x/`h‘h÷ÞPÐ\’x›€íJ®ÕÏô@IFÓ5è%Ö\A¾‡§sH]ÈaKÙ5šàû7ðë·ðÝ6îo`ÎÅZûÕÚ¶Ì/dvEû»‡|x<¿2A¾…pÛ{ Ç)HΑŸR¬¤ŠÈ‘–Álº§é½IÄ,ÑÉR_¹ø¬ x× «3´»‹§»¨^€´8V‹eIgVxZ#©ƒ$¤”qëi1iðä¸tˆœã~²Æh ñò5Ú> mÞ&5¡Û!Ã÷à=ÑÖ»C4Áª‹gÝèÒ±<ÿÆ¥4D?Áð³Mt㣞|~4ñÜäF„þa½ Dÿt†Þ5ä…Ÿ$Ýý— gÆñáò7`ã‘vR‹s±^W|òØ/PaGÊÝxŽvCpÌ3LrZ!\ÃUÈC†ýÃhXvÎÕ9KB~öÿßÿ‹¯¾Íå{Ò•#®ô£:¸c‹zŠ%&Z:8ûPNÆR¤°2æ);:Æ>1!Y‰„öØßH´­ETV‹ˆýžº ˜G=üÚç7"‘] %iûIo¦¨ Z@œ‰d@BÍJ7SÈäÕpÔiëh#H©Ñ a´2ö¨I÷¦iÚ;Ð|‘éBE÷ס¿ß^JdWöCDz·*´!ÇJV¡Ïáª]ëLb›­€%þ.]ÖGl¿µ²w?è3n/ŽÂÃŒ4=t=Œ&4½ã›ZçúÑ2¢ã(È(hVÖ#¤¬HRÉS®E1çúë÷@õë±)îŽ%_—sغ ‡ÎàjŸÁ¦îOÿäϳüa^û¯ƒz24g;$|p2À²ç-ƒC‡ëùï1ü#?ü€×üt›|÷>—_ù.Í #öP¹î~— Vwߤù±íß'¸oÐ+ìOóƒA`P|L z>á­#»„7CiÝ[CFqm²üäñ/ˆål÷|`SɳAH´h¤†¼9Æk|¾E—ª #-ÛŒHip´Ê•"RK¢L`t%À ú—±©/I ðQ¨'ÌÏ|ñ÷Ý_Ðñuδÿ™nx)éO£ÿË9•_=¨‹Èåéüò–ûæg³´¡Á:pÜÅò1Vv³¡<ü~óåÄáqÇÏÇe¥½»uûò9:t^9V¾{§g2)pû“|§ûøøìŸ‰»Ü2Žª~ˆyU¦zPëkù; Äʤ;¾óe–N‚e× ²èrj¥–O踟*‡qXƒ˜Û¥é^k=\¨s™EUE§T"ÿÍoÿ¹î±°ØNé\Ù¾6òí_x‹/ÿwÑ.pŠqã‘êÏ ­Š¯fp4I73³ß«‚ö»År ⒩ƬŒ[RëÓX¯x¸&ÉTËêØO)ég7×­µmQ=o¨@}ÆÇ‡';ÙÉ>ýöÄNöþíîW;~ç~›«ßUîÿÄŠë—voެžNô3Ã#£¹£ä½“ûHå"§#©H¤ï=ò䌊öoWÐó¦³ä†s;ÁÌíàmë'{_öÒiÀÀþÍ‘ëïõŒ›†Ü;ÛW¤‰²›·1ZË}ì‡Åå“{GÓ\þ!my;O0ª:€4ÌÑ“·¦¾¸‘nÖSÙ?Ù‡d›_ú:rq´Ø›KìjW†xŠ©ó(áÐÒšûå„vÉeI#3"RM“—i1‘_‚ÈïÁÉëå»Ål³/aš9ÇÞ¸—óJúðHSàŒs½äKgÞ ®ëRÜ(îˆ8â#¹D)Ù(ÈXò u2 »Y8$‚äã,R+ò©cÉm?8¼þÉ KkdP\÷È‚uî#"ÉÆ’r…4—H{éoW ,#š7x‰oáÛk¸îñ=¥ÒˆÔ¶ÈU$£p.Uùv¯—ÀDúp 2„”!*Lɼ¤ú’'9xó ÿí3ìÞÆ×¯b¬>î°þØ=€!‡ãÇaÁA%yH<ÿ©˜HJЬðæ ÑsТ >Æ,Þr”Wíðfë9ªç-q\†’Ö¢TטÞÁ¹‡ø„*)gïɲAô‚”V¨*ÎÜ·‘ÀCvßS|uÓ”Àz«N*ç!Œ Q?|PüJ±ï á rÆ^û>¶|,ÇÔe^Êþ¤Ÿ¯êÄ÷ê“{(g8p~@Æ™žu© tRâÐ8ÒzŒò5G•s‚À" …äå$T$\-Þ…Â~6{g(‚MÖ°j”'íöŠÓç-ý%œ7 ¹ˆ²ðwž:uzK;w8Û;í¾x‘èvðö9kœ1;))i„fçd Éó6Cg N[ÀþQçü$‘¡¥Ahˆw”„iÿcåü)@~ÝWöO¢!¥ŒÕcêöeóQ›¡ …œ%VT ¼d‹™²Ç’¼tIЍ"i,|-#ÙMØr䱞{>T,ANŒã3ˆã㛨 ‡p…eöEéº6)£ÃõºVÝ”9èÓÞS÷õ‘Ùß<Éÿ‡ýÚŽ»CËö9#ïíe‹…¶O´À™C74€cb$S’+YJ¾p‡_ø«¿RÆé¾ôýP¥ë”»*Î Ìžâ²< Á,q™wsøÞÖ >¡Mãø“ÿù´|Cº{Þq`óPmP=å"T°vº~ù’üô5ÿÄç3ú_~íE®Þº&}!3þn‹½Þ¡Ï1fx³…UŽò¹MEÕ§Àj{…¡ŒEvMó‰õQ¡‰qn–ØWÒTÙÉM‰ü—8¦¤Ï+ ¾öš×˜Ø[û2ž}ÅaÀËò1>+5× –#˃ñ2•˜DJ—ú=eÞ³ DY•é/eK-Ç﹞Ü×¼16ƒÿõþd— ˆyí¯3àˆ"’Êz½r[ÎÏfYóÊ/¸ÅÞÏÖۓŇ͟ß8øq×µÛ¢Oh»x`ËþÚNÊÑ“Ÿ÷EÓu¸ÿ±?Ó å§ãï{Òíè™Ìö¸ö~yB­{uî9?5€) •&pxº”ä"s×ç>î–Žki½d~‹SÔmdnô:¹ÿ½DEßõ½ô3ïvÈçÂòÎø‰?õ ç_hée,;wŸkJÊb£½/]쌼74Åú¸ ¹ÿ¼3Æ]ø‚ò`xör|´õyëÈŽè#\…#¥ ?Ž3¥aöñJù„ÀÆbSª™åçÒ>¬ƒå¥}êöÉNv²Ï¬=1€í)À2QÁ].áÊZLœȃ³ÿ½ñÚ"âÈ¢sÎÌú2l/QÐ’"ªÚFJ@XaÜEJæ›2ˆÕñ|›ädª=ÿÄTÕOÔ¾ý oñì?yFÚcý#c¼6t2Pyå½Fù‹²X^lO1ôÑÃc^ʵ›OeûÀ1xì0„wwžìd¢És_@ï~ Ò]ÜwÈæ{Hû2øu8Uò’Ò “»f5rxÁ%_þLÉ@¼Mn=ÿ±7-Õ쎌™`õ{Di•×8¦^®HÉW'²o¼»à¦¨O¾òèÉ#*Z+:y<¤ü)©mÈ… Ìy|ÔB`“" çÐ^'{Ò$‚¬È —=ÈÈîm¤k¡kñóšâÈSÇmÄs. kÂyDNk¤Y!©…$É=2îñ]›ßG>;ê}Õ\­5éwyO5"èà% Ñ@e˨äèÏ î)PôxÓ³’ÉÙëƒb»Œ>z€ëoâ«È9 ×øåËøõC¼·@ݬ:l.Ðr)ZŽuš”0m0éh´Má²qGp‰2"ºÂüMw ’@Ís¸$DÖxº‹Û}’>zt̃œÄ9&-ކ£|aŒ4ÙqõImBTÐÛ³_8u»LA²xð£oØ)\+n ©¼£þKQ8 YJ*ªd‚Ž„³ÞÀ7‚¿ñ› v7Æh¿ƒí)ê WÖAô¿ƒ8Ò8t+GšI¡†!|°‰0 M! €+’ÃU{ȃдΪSºÆiŒ ž,0:8j`‹ mâdGöfr®Î¡_ ›ÝH‡ÓßÒ™”CÖ\S‘Þ7/ÑöŽ 4EÌAaRg!­_Ť > Ì)êö$U†&4ÔˆCHZö‰ÐhÙ&³"@¤ˆ´©îÃf¢AÙ:šåÄäU ºÞ_B(e1;9¨Œ°'r’ð† Œ» |Y!-g1ÔÌ£}ÞïÀZÃ]é³–þæC›¶2,€ßîò'ò½O’ݹ^ñKÏ7ŒÏdZoábË#½Ž6©çÿgïÝbfɲü®ßÚ;"3¿ï;תêîêêîqOwÏ­»Å0KƲÙ0<{$$Ó>̶3Àâ€ÿŒª»Fä>Nöoº€6ÓÇð* êp© þÓ:0·± oýµøTßû¸‰üÞ \vh¾<’Ì„ð…vÞ@àÖ€]5ΰN°‹ØU€•ff  ìæ,#®· ®ë¹ž™4¸ŽQôÍì|ZA~ï‡Ûž\u4rþ1×öD]Î)²Kmöw½5 ¤ZVÀñpÌÁ¶„%0åY÷z)Ð냙u²¢ïíÕ ($æ{-uÖ†ç2ïÀ{ïh¯ÜkéØP.1Ë+>üå¿üÏ?—Z;,œµ‘ºÌyg9Ñ¿'™›B~òþÝéû%ïDÿÿAÜÁôï³!7ëäIÃzj»g¯{ 9³ìMî`¿¡¦¾ÜšÍ§’Y ÷jŽÊN›'½«Éyh~,9."Í@˜ÿKð¿ô×ê O1¹ÝÿÚ‘Íó ¸“p„Ðø_lÝ6[²žåóLêJêb#™ziçì¯Å¡*•¯ Xù±©ÇÊXòõ®­\|³b9ÀfL˜–þÅTü닃hu¸Ù˳Ôr”£|bå™Aþ~÷aßÂGR>÷¯Þf¸Jœ|¦áìó-»#q°Aé%h0\'ÆKϵ“¶Êpmĵ³¤Îõ¨´uc@QÃ*{É¥ú‚ÀF“jø˜ï¿h:7”°÷ùþþ“Ê>ærL»·F>ýçN¹ó3+šÛ‘Í Ý£‘æ4П'ú‡‰xÜæó"rëË„“/C8!ZÇNë`·%tFê€Á£^¬„mÆ)¸é¼0vÍö÷?{ÚÕþ!1<·ùé@x~¦è›vÕ@ŒËß0*z,j˜8%¹ûDÔû[Šêéã}Áæ(×d<. N#'ÉÜЙ˜Òz¨û%jF°P†ÙaÊ‹jâ‹@MÐtk¾Â #2ö0 ÕjQ uætÀR‡ÄˆÆÆï+ªŒ}BzƒÊJày¬%‰§ð)cOu ØLgï…ò  Y„» Ù¤Šô`!S­†ü`Âd\,´È½ Û€j‡ì~›•ߨn‹dGg&(†úÂa%7}yâ»fão ÉF`01„‘€Ib¨¬°°‰”ô²BÂ$‚4H<#Ù=ÿå6È,N )®ÁZB²DXuèÉ56l±n€>ƒåæŒ5zÛó rƒ ó&üžzà!X›ÑI<,9ÄÌ”aù½©ÉEVêÑùÑ­6ØJkELý#o{× ®‚;ùÌ-¿õ>óMƒÖ`£„õAÖ'@‹ Šl;`—Ód0EöŠiŽâ‹‰µš•ж¦U$NF;w²# 1§šV·ÂÔÜ—k1n?2.€³&Òš²ëÜ bšê-¬rº­À”Ý$æ×[˜ÀÿÉ `Y ¸“éX [@öeÉPÎ Î)FÒ|«L&[&€¥ æV2}œ €J-b àíPFqD·SR0¤y•PòO½ÀÆ—a8'ʘ}c—Ð1Ò4ƺuLËTH¹K„àÜJARnúo­Žôÿ_ÿ×èËø£Ÿ}Ïoîb;¸H; îœ­Rþ[´Ìbâ:Îÿ𛿻GïoUgWÖª‹5kÉ›§çC©»åy=¨Óïï?ãò׿ú·€ÿXZÀ){¨Ô™×&8uŠâÌž~faÊÿ¾;G?çÁ_ù ú¯¼öTÏø±’žqþÝñ Š\­ËHhGD,Oó˜"²1wàØEXåuëu;é]Ìé #ˆbMËÀúz„ÞgCÖ3óÔ@ƒ;ffýWŠ£èìÏÿâ P@ÿ0Eúg ÿ Ûg‡0æ‘ïˆ;Ùfšm5WÆÔiÌ„+ʤ_5WTÖK€Eµèå?)×Ò/|„É÷(fŠpV$—×màƒ•Ç¥R’;Ó~9|ÞÈп+ÎþQªÐ–¬ü ÓyÔyFÛ÷\f&™ÏúZÝ "ä¯Ñþ% €ˆHáÞIîýhË·Ù.k“É¢,·ÍÍîä›m±¡õà-3×ï¤Í)a:u€$§w%cÙásvCX3§ÏE€ã\7œ=ÂÔá“0´å(GùÊ3ãp”÷&ëç#ýùí€4 õҜFÂ:0n¡âVo'Bëe͵ÓèŒ×Êxåi†+c¼RVÏ´´W¤ 1ÝçIt0tÈL“À8£J‡…1…²l›“çÓ¡ŸP9RF¹ çÊÝŸ[söùÆsEÝ´÷Z†‹ÄéiÃú^dÜ)›"Ú7¤Q±^H½Õ4ÚEgÃÈ ¿Ð?³,Êþ(5šhÎŒ1ÿ+)jjŒ ÖqTòã˪Á6· ëˆí},´X:!®v ëç`ó*´½³ZDp¤¥»2ê2­º÷¬Xr`q>+Û_Ô¿ÇhI…{-ò• IŠ ÿ¯ç3/€0U¿¼HÈQiæIyâ°rNuó(ëÂ72»Àj:3öCv ç2e¢NO’û²;hÊØ­â;–½Æcã÷¡ ëÍ£ìÛäàh2H£o#n ÊѰnup]†„îHï†Í| 5Ê?…Lƒíl’£±¬Ð³Î FAÖ‹Q4Δx×êsÈÝ/`—ßÇìGè[êÑâ%R{þ¾%;(ȠصxŽØm±÷óÔïCGñ\³C­ë½L·¸/ªbú{ÌÀ;9r-f=AÁ¬%„ˆˆD…Lïš@” AngÀh}&¸3WþÃÁˆ:0ÆKˆ·ÐøivÐ$t°©æöÚl0–l8/ú Áª!×ë¼ñv;d¦ rÈ4Õ.e A‘FáD‘S%œ ¬PÅ®Gì"VC·%+A-•ú{£çî%øõ R5ÿ3õ?­!«„ÜäÖ=dóYl¼ ]ñmT^¹@H‘ì ÞÖÔ Ó+ñ""Ñàô¤A 5-‡àÿ¡õw;ŽÊž<ÍhðÉ’m€;=ÄÆÖ`%lvĈkÏjáCYÎg¹ÊãÔ&;ל%a…Љ±2ÀOXM¦ö%:Ÿ ÜWê¦ÈAáv*í¿ämI P¢CíÚ’³¿X.÷è-¿nî/fñ>(¼!Ásy’?C}ìsg.ÃHÐ\W€o­/ö¯ÿ…KÒ™òó7‘ÁVŠl…¸ èJ‘Aƒ³ûüÓ*v Q¸õ¥–q§„Fœ:6ÓÃj¦‚• †jvd/FàõŸçzöS}2ï;¶p®ÇLÇOÜRÙû,¿ö ÿfÅM§Üçx7»}EŠn+R.sÇ¿âAP>”zM!ë?s ÕÊ<úØýô¸ø×~÷==óGZ¾yó߆ø•-ͰA¬7¤]û„ÒE‚˜Gþ HçúѰ`C„˜°.¸ƒa;:¨ßCã}!(4¸n}@”s{κ'’nV¾ÕèŸYX¤(0j ýJ Ó¾ÌþñMnIµÙLà[õO x^Ú”ÌuÞ,eL·<Ï+̺æ:Ö/̯`{×ZúK‘ÅNv2(yDæ_8þ‡ù~¥ü/¹Å§ècÊþÁèÿò´{³'O=¼”g¯}wöÍ'öÕ÷ÏÈQF‰gÇ`òáÃøÏn¼ j~ª•þ]вguöXšZuÈzZý¯øä´z>{÷›röT§€ù/nsöNE¬Ýþ«€‰È ô/N±àk}ù¯ÿèß"¦²ùT<sáÑÿßýïòŸ=åò;çßí‘(Ä•Ð=H˜™³€e»mh%38ÙRŸÓ {¨‰:ÓåÌ&=nßÉsÏÙs_«ep³Û=+Ýð(´”7ÿaO G9Ê-Ï”Àƒo쎓㻔Û_\ñ‡ÿå[<÷‹'œ}¡áêOz† %žzŽœþ‘×n¯¸™ƒìž6ó–+‘øÄ[¢(Ф@t9qšD«'Í÷$GÊ(—Ý›£3Ž0ì”á"Ñœ$ igŒB€þ|d¼Êæ+u§–²,HyìZЧTŽTƒ!¸â˜®=‚Hbÿ{_@è֯㔢~_…) °NË^Ÿ8¶û£ü¸"dÞ1 !´XðEˆUªõ ¦º3´çq_È¡òRöcè½A2^`š1´½{+ÆD çôŸ@ âyíg ©M¼Ï9xm5Ú¼°ìÏE’@Í Q®·d93d›[6†Y÷ êQ’2-] h¡¬´ ‹+ää V§nÊ·Ð]¹sNM­½:q½­’gÕïAkV©ê8£`6ÍsÂ/l¡æ†ÝMDîü,ñìŸc 'ÈÉëŽ4Îq'°Š“Ha9ò€ÖªŽK}itCêˆSÅ–ëä¯9 £D†åŸ0CL±”ëqÀˆ9tVÜ%Ä£îs½—l¼î¥%HG"¢¶¦ +øoò–ñÕå†Ôà|€kÄÎÐfMhVHÑýÅóIÎrÅj6.¥|s3lý^ðÆf¦ãPâÐ$·sƒ`ØÚ§F¸Ï}ÙܽB½‚É…3=Œæpªu C¹^©)îÉBan ööÒ²Väì6zöSDû""+B¸‚Õ =Æ– ½§h=•ƒ<âÏ”àñà(Š•¸r‘‰Y7Ê›f<ÆgjUñlHžÛ Û¶VlzÌLVæ~5š#¢Âr`fp]&E£Uï;ƒuþN«F‹Ð ¾?bD3§÷7#Š;ˆm‰4ÄtêþS2‹þÏ}¨ ²(±|nN-»AÌãQýs& ïSê}*”q)Ô,Ð~lÙIí}<#h7"ÛW‘Õ›°ŽlèH ˆfí̲¤ƒ0æáÛ¨Ïׯât0I¦9Ì ÇŽ-ç7OŽiï®~{D^ Ø™y„ÿÇûÒÊøÎ÷ÑQÑÞר±õIFœ%¸þo`Âxéç¥Þ°‹l0æ ?˜ö ÃûLűw]ûŒ†íþ601sTð¯;›=È>`²ÿ0‹ãPÍó@…"gó^½F™¯¦i«~ç‰lÂxÿœ7þêÿþžü#./ŸqõæŽÕ¿8u…^%øÔ¶ÝEäÔ wh¿§Ø°.@ ª§ÚEŠ^»k!a}>¯Ih/žr(]t–€ÓÑ'žÁP-¨ëw…*9€¨ )äôî ÀÌ‚úêP¬e;‹úÏúf¥þ× n[ÈíÌ5‘Â2+›Õä¨2Ó“Jnõ²X˜Eÿg‚|ŠeGòu©:Vi£¥Íºn–¢å߬€âìx *Î#ÿ—,ÓqŽ.®|>åûÔ«Ç 8ìLóØáèfgçÏ玦ÓB£Ö“—ÌÊ—§,¤,9–…OºágDdÿpî ‹Sf-àÆ%¼ÝÉòqe?oœü–Šû×~!³Jš»•aó~ãkyoo–{lP]0Eòqù%›é•‡Õ:š¹&ÿ–L.EóôRƘ©¿ÖˆÿÊÒ!Á&Gž§ˆþ?â€ëc_ùwîsòé†þUqã§e#¨G‚“¯ù&¬DDÈô|u;Û/Ï=zñð=¸úÖÃ2qoy?ùbp}`FC6F8QtmÐç Ò–AoÁË)%ÕDãÚkŠv IDATFUÍ·m€i ©ÃÒ¡xlØ€•¹ì ®€ÙBУ•þ1 Ng@n#aÌ`ÿE“‹£‰; „èõ-n2RŒTAõÉòmdãjmCRÅœjÖ ñ€[ªê³×±=€4†œD¸û"áî?´Ïƒ] ÒÂíHÚå|½ïq•òn÷ÞÝÜ"! Ñ 8ó“ÜAäEÂpË™)h xji×ÈÚœä"$LzèFhf³Ô MNuÐx[•ò³ 2ì£þ ‚BŽkã}9Qá‡Ï×'Â6 ƒòàÚ•×]¿Œ˜Œ¤0æ´ ª§ 0ÌÔÇ¥žœùD³L>‹ƒÿÞÊ ;4¸µ‘Ì À”`Šú—L^!yêpsjpBˆé¼ –›e(Ì¢–Ë3àÅï¬D=‚eG§™³V¦Ž6 ȘÙA°.!› V ÍŠæÖ-âiƒô#r¹E¯Ìý§:<…JpgƒU+„Vh›Ùü7ÿûåÛ«cªŒ»ç'\¹#(§¡`½þõ2^+q#Õ)= >纗‡!mvH   Ø(èšì¸ž)aÓt\RŽ(K²d¯›ÑÁ.ŒÂ:›Ëö ÁûëZ@ò׿úw ‚ù†¡³ý¼¾É7<•ç¶ùm?î&Ëò^þ¦m&sÎó£3ó/úÜ2]mŸ  8á½ýW~ƒôÜå_1%yc?¸ÄH×2^zg-ÒèñMCÀÎ[¯ã.b»€´êç ÎÚFq½¯_yÊ¡^à²E‚ºÃÀ XtšÙ¹c±;g¤s‡@ )8ƒ†¤ˆŒÙ Tœ‰«ÿ¢qr Lì9 @M½tKJ,dpߦ}©°wVqCöƒž€ºé˜@ù¬Ë—ï“Bê¿Qµ”ÒÔççÍwò5kqÝkA)žö™î hüw±‹³\ã•n|î@­ ¹qãKYôຎz¿¦ýë”IUë‘•z¸!ócÿJ‡îOSþ“”Ç)“QŸ­.»öZÅ \ŸZ,MŽ$P³*ëÅâ›Ïrî€ÌrL-u™`Ãíe2[EíýLî¦1Ô´ÖY© {u>Cªu|9ø>Eåý|žbøŸ§Ü(ÿ¥ß.Y¦ò§IióÙ_¾õŽç|äíßÛrõòÀðÅý#OßZŸÆ’¶FØd€Ôñ¯)ƒúe?,² ö÷à,›§(^0<åýÇ0,t;fe°ìrψÎw”LŽoø(+y¦|cÇKÇ ò]Ëê^ä~ýM>ûÏhïDúG#çßì +Ÿû‰q–¾ˆ]¾‚õo‘¶¹îbƒë»+ãdÞÉc¥˜_×F#¤ÆI[L¯òëÉÿ¦ ´©Þ…„Ü¾Õ Ò”áv6èÚ£ü~º\ËU¼™R"åÆ8B7ãÎ[3ÖåÞ+xŸÛPðj±˜t³\¸%úÙ=äÆïúí[æio‘öÓÄøYB¼‹ê-X¿IZk.<½e¦»ÍÜí³~‚®œÒ7 "=f[DFhoÃÙ§ «€­/aõ€°;ÇRªlb –£·óõƒy›Í÷å}.@2$ÿøÎû4f|Œäû+å¿?»Çÿô­s>Ó Ï¯W¼¶KœFÏsóšhø™(øCîê=n²~”sev.e?Z+Aˆ*þåùÓþÞ5¥´)¹9jƒ¥¯ÝØN4ÌRÎ×ü™zû1ÑIÒˆiBÌA'Y;ˆ%X¯‘»Ÿ'œ~ ‘Sl<Ç}yíÕÌ(ƒ;P% @…6wˆ)ìûÜû5¿½ùÖêHÿ¿ÙµôòÇo¼Mÿ0ÑŸ§¬wÃC­Ž|ãµ;¦ÁuúКtI[г8- Àäë. ¿"ÿ9ßÎ÷×¼O2 ÿåo|í?Ïkí2úÍs€?;Mä²éœú™>ôt7_!› †fð¥(0»Š#¥M:LU„â„·Ïpù/|‹«_úö]G)ycÿÍW¹|ñe乺·¤o“Dêœö_°.B}ÌÖ€u‘/·˜ Ð,hvpÆ#BvHÈaŒhÚ?,$Dst‰è'xúª¹Ÿól¹–²¤ý¯íáÐØz<ß/“ÉïÑu+)ë?Õ¿7[+Lÿr#˜rW–̧)¿üX{ÿ“%ð_æX™úÅ`œ"‰çà?{ŸÍÁÈ p®9¯§ò å]‚ÿvàü lõÏÍÌÓ—1sòÚ²#P®q™š*ä¦Hý®í•}°ró}veØÿF(ï«8©—wµÍ©Í¸Tfu"LöûW~6ëd’yYöûé÷½™˜b¦\»sFå¥ê¬ù‚F”œ†Ì@Mk?-¬Ó´2«§cPü)÷!…Ÿ¤ô½ð?ë«â©$HZ6}ž]¦Ÿ,G6W—æ,pïkN^t€þ<ÑœÕ2\&â&0^9@ÜikŒ;#¶0f¶ÖÐx`bÚ)Å™^“Mã…Ö™vã‹ö†ö’3³k ¨3}p?ýÓBï›é7æÛýýCÇ+;ʳ&{sGcÇQ>²òL9ìÞ8R"¾¹õ§Z¾òoÝcó©†q«˜)›ÏDнØ|ÚsÄ  Á'Ï´UÌ":Ã…º³@ï4:5²¿ÐæŒÓäX'É=€ôФ¹OS,ÌŽØÉëñQøì/Ÿ}Ø·ðLȸUîþÜš“º‡‰Í‹ ·¾Ô2\*ÃyâÖ—Zg¶Ø)Ò4h—S WŠ4¹}† ¾Õ!·ñ¡½í;U¨ Ùƒtá P"„loÏ‹tÁ–·ï,c{ÇóíþþQ>Ùr’<{¤+ìüû°{ âÆ¶WØÅ€]ydƒä¨œlDS­èŽeÃÔÒÈ5“iÿþ?GAµÚ+”þÊÄB—’ï{f€aŠ/;h›`2ÔNTÐél8¬ ·l”(à;‚ÎrƒÆl°ÆjÅ@Sh€àÀ´…#®#¶y Ÿ'èó`+HJ Ó1^ÅÒ#¬ ¤$³ú{(0‡òœ2m3¬W€ àV—åk` 6(„Áá1VZýïyß  ¼’¶Áný,ñìçIÍïc¯ÿ5fJú\ÿÙø"ùÅ jT»VÆèèbGh/P16GÛ~è1ëÚl´Iþ~ó#*ŠÈ€s?ªK:=KñÞBA?? #:]W[7$ÄQ‰1ø£”&jæÀ}+°Æéõc~'*¹NÉ©r£šÚèÜ(nT;L·¨ž`©Ã†Îþ+Ósøæ»ªÎ¹½ç §øÇ¨¢Šô×X¸„¡¡‡æã ;XßGâ-bkØzM:Sd¼FúaÚ&Üa%ÏHfìˆÁÓç>ñ…YS=Ê ùþä!¯~®ïAìFÚÞiý›Þ|?§iÜé"™3*¨3+Äý?sR†hКДcrô?ЊÐàQþ­øÖý¯x¤ae™ö?HŽþ—i]X$Hm¢…r_˜Gÿ[.s¨è&£‹+ÞCTÅÓHŒÁÛ¯X@ÃÖ '÷‘;š¸þ „ ¦[Rsý%Ò3 5ŒxÞ‚Yß™—ð“™çÞ…|k}tøŸÿÖ0\(÷ÿôšëWFú‡‰Õý@ê Qf´ý6Ó¿m¡{ßб÷têÅ:”ûO*ûåßûÚßXù‹ýö3þóßâܬ3íƒÿ¶8ª"åß2Í!Y­’é˜ pÖòÂàóÚ¤åYí“_€ÔûI÷/yý¯þƒ÷±Ö>òÆ~÷.雤µœôg„[=œ¤[aMéûˆ¬@$8à¿Vh= Ÿ8±A°&Á&ùúue®Ÿ¨ÏçZí5¹Üð4všuã”u-QýPRC•?™ï3ß'©Lfƒoá‚)ºŽH¨Ÿˆe5;T–(ywmÎŽ—â4–ç†å*piGe·´ë€ˆ2ƒ_)+¢E[·åî“f‰Qà¥ÈìhúƒL qðŸEÏœê÷ŠÓ…ÔÞUjÕóqàÿ»üý®Èr0õý j“usÓiô¨, Ôf‘ñÿ¼¾Ê놃R¿ô!Ê“_~Ýq}'ŒYj›¬NêRÖŸV¯³ð‰xÒs? urCö¢úY¶É©Y?’Ç”k½P²íÂÒ¤/ÖkCfyoâc_¼2pÎ:€T¯"_J®õܧò¿µŸÚì—²ÌAÿ©ùÔ{_[sò™g rùPdûÚÈËÿ‚—þò-úG‰ñ2‘®’8.Ñã6…Ð:ý¿&_Æí¼5îr°â˜Ó·Ž¸£{‚Ø8¸oÉ”è__…àÇA¨à¿94RÌu¬*>Šóy –͇.›}6;>hß=ÊGMŽoï(Ky¦f£íkG€÷"›ç~ð÷.xñ_q°x÷¦Óö‡µ0^{Dth`¸t %‰ Ù €•ÓìŒ2¥)jºP(Žþ3Ÿ('*Åü7²Gë9w”w-GQ—Ý#©óèŸtå ¿„ˆvJ ®•ñR®2M˜Ápíy¥Sçm]ñý·çñZ«f—v%²ˆšKJbiç’Û¿Ýtx±i»ïì7½ðÀÎv‡–Çþó‰’ë¿ÿyä´ANÏ`±f ØÖïà¢ÇÆèAÎ;°®Áúœ·SÃ'Ÿ(±q¶ôÇDæüÄEÄ# c\§ ¦0œÜB`²Òçs‚çdCT˜ryN+2© 6@13¼˜8¬ &„`õóGú™ºi#DCuÊ "¬ùš! R"^’ß ±6G\+Á>À8 £ c€Á°¬Øyþô †Šç·3é[r#ÔÈÕìÔ!Rr°çòe¸î àˆÑ’fÊmí›3CzG¥ÞUÝ`Ú'xø*Iî »·Q ~dØ2=£Ì2Í÷’ Ü0£Ð½6b0°kOÁ"f at0Y¦‘¨Ñ_ZêªÛ#ùGDv¨n ²Æ9÷¸òRîÃò Þm1½@†kdì±Qi€³µ×g…˜éÝP.†çÀ]œ€l@Všž ’Äû]°ÄÔéŽ~”gŠ¡S²®Än€«WI«oÁúÐ+ìâ{ØU—û°Lïu.Sx•Wl¾G'ÂpÐÅ’ƒÅÖCØ4çÐü;x [,¼„4š©G6Jhotií$¸“QØ^`—#tY@‰¢‚à “a÷laŸH¹ÿgNøÑë;VñS1rA¢a5øX”‚G§4W2 ŸûàÍ®§:Ù1 ×KõQ.D3ÆÜôý:ÝÀÇ;ßÏ)2¼Ä‚ä²àÛâ U@ÿ’ †sAþ¬d+±|M›²›QÄKl÷âhXh“çÕK„æ9\Q;E×/ÁÙtuNˆâé2’ÌšßlL¬cã‡/¿yr\ë<üýŽ/üë·ùì/Ÿ1æ<¯q-hÍëš ¾ƒ‘FÃzOQWxS¯‹Ü¯sßêØ;zXö˜XèóûëÖwŒîú€äo~ý×ý§g:Óað¿€ü‡€ÿië×ÒŒóϯQ¯ÌãTjD/4ðhdv³¶•?›€Ï¹#€GÃ2E|š-œ^þþÇ÷±?òƾs—ËÓ×iϲ6ºóÑ™OÎv° hµÀÖ¸¥H’Ìz’Ç=’¸þXÙ/˜Ò[”9º0[YÑBnïÙ™Ñ‚ëØ¹_HqÈŽBa@rZùÂòWS·Üø¬®GdyÆDx˜RDLÀÜbÁ\Æõq­³s¤®4áEOΠ£;<Ê”>¬\ûI}a_fÏWÚöÌ €‰%ºaæÎËTLÇå¶f¿~ãŸü¿ úÛ½Ãß)ÑþVëÕïǰõ_ÞáÍ‹•·QÖ|¹Þl:ß7ûF‘jð•Åþ¾*±Ô!¦6»_š‡ÅÅ9%‚½²!Ô§œÕɾcÀ³V'róiJO½_UGqæO0¹>LĆHnpWœ¹­T†H¦ë7ɂԫÌßÇòMI˜º¨÷ÇúvÊïÝì«‚HAì`¿ôrYŒc‘c*WŒÿâëçÁFG§û—˜ëP]—.Ü>+Q\ïÛ:.¡C¶ç¶‚n»•ÆÞjÊc×qâš6˜Û’³¾J^7é|nT–©ŸŠù€¼_ˆçeLe7äh³ý8È“Þâ3²š<ÊQÞ›ø6<|Å#ȶ#B'‚„ŒÚ×ñ·€á\Gp—ÂÚVQö†ê@HÄ&¿*gf¢z4p:C¤ÉÌ A1,]¡´krlò=È4€Ûô‚¤çHzÝ%Öw„QiƒÐ4nÜ6t7ót¦¤ äÔ;¹} Ú±„]_£)Û¤ôå÷ü·ƒL$˜_›¹á½…ö߀õ ¢=vuŽ](¶ “‘¾¾/7VHÑ“²ƒ›;™˜7æB™›Ô ÄÁPã‘W0®±¦!°ƒæïÞÁbÀVÀjDÚ¤AW_„ÍÏwÁ®‘ëo!o}»ì2•°`)çný½"Κ# û¹Oâòz£$`si\Þ6NºÂ Íâ)–(ñÈóý˜‰G0#fƒpØ/ÇѤ‚î ô‚IÍ$ò0³a:Ê2’¿ÿAjd˜OŸùV0BÙ Ä2C…‚iE ’,ÁÇ„bv:dØŒÕÉ)·u3`D‚zÖ ¨ä¸²jû÷¡=«õ‡ýÿíUzç“>ærõÊÀ/ýÇŸaó©È¸5Ƈ#Ímo“)ëôÒ‚õÆÐ¹aWHêåÚi0âJÜkМ7(5&ƒÏ=aÄ× 9ÍWIQ×­eM:s8¸FßëZàqeY~í«ÿ)8A}B €Š–lá ¸_r$þo8Ì®1Á'6=ÏÞMʬ?ùœ6Ý“TPÊc½øoß  p-«j¯ÿ»ÿ€ôÜåã+èã&olà·>Í£\ѼxBxùÍyC:Ùb}@:×íCd0F§î1 cž0†èŽƒ`Q±Á÷U’뚃`!ÁèùT’O>*µ­KʺŠ+À™ Éþš5»þjóógÀÛÔVÙ>‹ïá?9™å|à¨gjëû'—Ý)¦·|¶PtËY^2Ãç G¶¸€S±O6抹Ì.µ|^™9:´þ{iDÈñþ3–€Rkuj“ÅïÕ{›(+ým¯ìððdU-nC> J#çsó¾T·ˆÇŽ+Ó››áËÍ"r`gjÛ{ãÚ¢Mù;//jÁ€QŸ#·mÉÔõê&¦œ€Žº~Èò¬ÔÉRäÀÞ¡Ó„PžçN›Æ‘Ü–üAò0›Y0g¢2›Ñü—eSK¸ÿInUR?­³ä{$Ì#öÅýê˜ù¶R–}Ydúå'VÇ1•«ËõâZè$Ò•ŽfbE;G†+%mx’­]¶ d È:bòà-9u/¤5gh ù{mŽ?ÉŽÕ1›,öm¿7ìÀ{Ûi->Ó 9|¼Øîï:>ʳ"‡'²£åc"Ï”ÀƒoìŽå{öVàíoìxð;Ö÷#ýyBwF8´ƒÔ§L¥©÷ÈÐq§Œ[#6ôßaåQÒ:¡Í‘{9Ó% à´FDîI—'І“ý‰ñŒ$G9öœägþíûœ}±Á´Ïe0.éÚ£þã‰zõH¡ìú)r¨Délß.²Aq˜åM-§¾˜)Œs£áìøPû_0ÌËàé”Ä£|bdû¿€ÜºÜú2Òþ¢0\“lÅK?ÄzÃv;ñ¨\#ç×ËôÜbÈÝ@øéŸ#œlÐ?þ§Œ?H™¶ý Eˆ<Ñ †à ³#BÙN™:QÌß›91°LM^¢ˆ,G"˜9}ß)±6ëÀ)ùb¹¡b¨Ñê™nªHð\ôX6†ª`]D·‰ðèm°ï£æÌ ³vŽÊ+ Ñ!å÷6˜X·6„/üyˆF¸øG¤K­ÆxÉQöV­€ù¯–ÊöÀU·ïⵘ/°Ã -ÍÏý@Hßü-ôµ¥E¬ñUô<Áxš½3+?˜ÇÌJ@G89;…“3ÐKdÜaãC‡¶!y8’‚õ *A78œ©ˆô˜ô=’ƒB 9É\ýf`=j;4=@Òë°{€î.°nÀzÊ/ù¢=çm®s…a§J pv»A^ürï‹Ht`œë?&ÄW0ÑäíƒÁ&C¨æºÌ×´4•[êÛâCo—½a]NãQ"˜=D:·3&ãjn{™k5—i5jo5R϶ œÈZÐÓ°±³»Ø¦Eâ},6ÈæâÎá믚_@dÖ¡²ÁÆsBúÚ t8ðÁÚl¼5ƒajüæiûôí$ÁÜ'èüv`·M´ÉÏ öÐ †5nÌ ™ ù™®² î¬ÍhÕ±›•A«>”´&´æ”ú­Á*;@ ¨)+„•É`•_ƒåßaüóUh‚ІÌPÀ}³!BÍ™ ŠíÕð´´ÿPûAuVÉÑÇÕrj¹’L½íç2QA{%\¿Þ{ 'kĶèøCèÎ T˘8á=-…,‡¿g`î{+¼á<òø1^'ñ¡º¯Ô•;Œ nô ƇÉ|ñ'éJ‘ ç9õW€î-«ºsÚåvÉŽ¿,ôú…>_Ö±E§?´†ev̲l!OñjÿÆ×þ{‡©’TØmòïoûz ¼”±¸F>¢0sʽnÌÓ€Iþ…r·óNì(–Ï“:7±?Ìž¶þôìYëÓK)›(üƒS²ÍÀÿÉ@$“ý—ˆÿz<{žÜŸl¿^ç ûþðolú÷@øþ4}ϘÖlr<:XG”š^þ+ÈA™Ÿ=/ùÉÊbõ˦ü~f}¡îçòâ$àKHOCá}mb¸Ë#:ïôŒNûËgö-<²{}¤½hN"Ãu"®„¸ ŒÛëçƒÓ@ñ|Ú›@êAN…t©Ä A«-À±ó¶$Ó#fv€TÚûR!¬Êâ^Û~'eñ`ÛÜZùƒ]×å“«ÿõs° Øæaý!ÞÏÆÑ ÒÞÞtÚîùïѸÏûRÀ‚ÝÆš¬‰ Ï`Ôá!'€º“ñQ2“*dƒX•¤8L†“Üàæþ;@k‰0tFgVa• mFœ 4~ýؘGæ ˜%ˆ5%d/U% Á#Q¯€x……ï£Í«ÛHHØøú×@/R>FÐF¨A¶ ^i=ß±eU n✢þçÔÿ³êZØ­~ÌuK¹^Œ¨ž¸ó„¬±4‚4X3c‘°lÄ Î‚`Á(Ù<´EÌïC¢QÐÍ· IDATÀé‹„“Ocã«Ø£ïa}ŽŠ´k²%(„ˆ¥Ó6[ÄNÐÌ`a2 NË'[+4\ar8Åã›Au‡êQ`»7±«·Ñëkôz$íÌ ½ ƒ“Ó£†ˆ!ÁS3˜ܾ…Üùâæç‘p ¶Cà Ú]bWo!½¡]®·Òg§ )i+s[Í •Y¦ðr”OwPf¹{î w* ûKðêN9ÊÚòo‚”¼®N‰#¶ŠHs†µŸBÂçm@š+4^Aè |†î:õn°øl};{Ë#Û´… 9Û‚BÝ£æ`ô×Q¶¾þ'ƒF w·.”“­¢1§ 46çeV“ 4â­º1Ç€<?6B“#õɾ3Ì(úaŠÄ—‰²¿3 !„ ;/SI $7ÝlQEÕS”s‚å~“ÇôPБ}Ç,pi¦àd؆ Qñ±_Ì£»¥ìÑ#8ùvç‰'ØpßÃ^B'ΰ‘ŠáWêH¹4³ýåŸ>ƒsñ,Û×G´7Ú[íaÜÍÚ#øÇ­|èΕá‘O…ñÊœý+¯I‡ËäS¿PYì$JM â,aèà:~ù®•uëh¯§2òê3üýµ¯þ'0ˆ;äÔˆøÌŽ1 ëå¬rV+PÃ@Ñ}€Àÿìü9à_AÖ§pjÄ÷ðÌýU¤Fd"Ì&ˆÌ]–ŽW¿ômüêÿý¿þñ{cƒ|óWáñv íÏH—BŠ#qcØ6`[Éé› †Ì´ÃóüŒ‘ÐFE®t Ö¨3ôC‘§o0Š9à?,Œur°œr¨äfOa Du×îµýKÁÑ(ãõĘ_Þ0Ó¶\gYJi Ó7Ãt~žËЧ®Q€s(`b…JeÆ"‘Û\qŽ­àón9-¬%G]{If˜^Ù/¥Ô'’éùü9 Ð8þsq¢þÏsì,ò?Tgîéy²v|àFÊZhùéøŸõm£ÒÑ—ú,PªÕ­ü¿¨Áéšó±Ä¿¿ä(×/k…©Ö<}šÔk”—èïT–Ï‘_‰od~¡÷Yf-rÿµ—ñk¾æšµjòûóg㆓T½{‘¼>ÿ™SS#Õ¿úë“éîÊî;iPŹ®[Êë·R”×+””"A2ðo{n²¸ðLE,ÿÌÃ],Ï7L}2•ÔlÄÉ_)cÊ úŸÞ3‡??Ìæ>3q†ÀÇ×̽¯­ß¡Ö>9ò‡ÿÕÛ|æÏzÓù]æýÐJf0w BÚº]–ÁõBMÀÃÎjp¢Ž^^ε”>÷Š÷˜ŠŸÚ†ËcôÁýý£|äÙX$å(?ayæ^ý¿.žrïBÞú-þ¨ãÖ[ÒÎè&Ú[¡8\8ZVB¡>ùe…;¬Ëy“k4¿Óý‡¬3]¢Al…½çBÀiclÍD›˜'Ð – sþùÜÀ2³_?1ÊâqF˜'MƒIùþ׎Ñÿ»·ÝP8ÞJto&voŽ´wÃeb¸ðH‰áB.©÷ö:îŒþA"®ÀB1ºÁO33€‰§Ð!§Pó´Ý9À v‹§¡ÍÛzSÙB>íó(ï¿Hk~Jr#@#`-Þ0#ôn Rurg£ÿ³¿¦®ìåßÃ"è[ƒ_§Fm?CrÐ  äònž£{ß™M@F„!)Ac¹Ú¬„3qT¶]"™±^Aßlˆœl™ˆ™*µ€òfˆLë¢g`DxrE[X„„5œ€v×°MXãã’‚=R·¿ée;€ÖÁÛy…”¨Ø þK5ˆ,êòÇèi#¾ÿ;*œ',¶XŒHÿuàó{rÐÛ#õýs¾X6*!íÜïv‚ «ì 3+BH0Œ0¶¤qåyêÁIúÇl0:‡p‚4„p•–¤ ©‡ñαëGŒWWô:ÆkcÜÂÐÒ`È'A8§K#ˆÑFHÁ`u†4Ÿ&†û[Ð5? ë{°zËY&‚aâQð’Û꓆˜¹¡U&}Kúܾå\Œe­¿W·c‰×sRO3a†;÷€4ù·Ìç¬`æhM‚¨ºqEÅ7WÙ®¬½Klž'pÛ¯'Â=o#> úxS'Bˆ«S¬Ù`Ítåma¥ ’vÐm1¦´9GYÈe0þ¿/Û»‚ŒJ¸o„$„A £’Ñ`D|?ŒBè…8$¢:@Ô’À·9=~4§òol¢ÿæ>PQŠã€ù¹åX²#A) ¼D >•È|_ÜÙ Óí'gì{æôþC2sK‡,„Bm¬½ÿÂ8®³±\Üù§ä›î»ôa"è«Èù[XÓÂ8`—=v!°‹NymÁ§€BYPöá™™÷¾u¤ÿà[ÿíº·Ÿÿ•[l_é$Vw#ig¤nZ¦’žŽÕ s—«>š™½$Нq+K—-)ýçúúû`Ìý›_ÿõ· ž(fË<þë>°oºW¶üÏüÚtyÚ‡ŸÎrðwý_þ³tÎ2à$dÝF+ ¦Ï]óàWÿŸ÷±öžm±76Èï=ÏÕê-Ú»‚í …k¸ëã¾ö'`C€ýoƒ§ûbíþ´ݸ°4[‹Óÿ‹¸áˆGÿË^²îñï«9ø¯®˜f‡Ô þ‡LcžÁ±Ù~´¶”2ƒÖ¦sgŸÀ²=Iê5fp”ï–¶:?·èžùsÇóÊï@o_EÎLZVÄ8–ò‰ÃU/›néÐ=/žk .ÀC {Ñý™èïØ?5ò¿‚Œ{õWw /Ëæàÿ<ÂßÕYIÕáí†ÃÑ|H˜Ê¦sĦ2­ã“;¸ë:«Ö—u^›×bõ]•{)Ÿ-¨ïùIÞûðíM—ê›-ï•ú¾§¶XÖ3g)N2~ß–ÛkÁY4øR«Û¥3|8u²ÿüå׸/Οõ#EkÊÃ$¬:ÄÙŒ}cþù2bÓÚ¨þø¢~ÉëÓÙØQžaâ×sòDfï‘%ð?õÅŸ–ãß!9¦ru¹ønÏçå6'Ÿmؾ6²{} nãúóT†P†«&Œ»äãpvè,iе3ÆÎ­/Uµn¥½mÑç ­Å`_/Ô™9c¦.Ly©Â¼ì(G9ÊQ>‚òÌ9l_?ì[øHH÷öH‘Ø|:ÒÜÙ¶ Úˆ­G=„µ:%uF{æ”­ãÎ (!5ÝZ¯AFˆ'‘ñZI„•– 0–©w¤FPLއr¨×ÉêÑ@ütrT]~ø^ò¹¿tË ƒ½çÿ¾üÞ@Øãl_OÙ#Bºœr‡6'Ñÿ¡CVsäæ­·aOϽP ‹¡pXWã!,•ħ1&Æ£˜“Štϲùþ\AÀºk±¹>fº‚LÑofȘAiËعcI¹çb©ÉÆ„púÖЫבaD¯Å#wWnˆ¦qÇ,ÉN #6*2ŒÐ{𢠢(žçÙ,Ð4ׯHñ„5ˆ¤qÀºŽv¤mO>Ð]©Ã ç*´"ÄèQÔbµÂƒ6Gd{ÚzPÓ ø„1c·¬†Íbñ< •¨HCÕ¸Ë9¦NOÈH‰†¡š¥M¦:Vu³XPwjÍÙÄ Œâ‘)˜'­­ñ6Ú¡ÐFÿ­l wãH®±ô'¨œbz†i‡¥?AÒÖÜîC8Ålƒ´-¬ ;d<ÇÚGÀ#8?*x‡DŸù®òÆ-ãþ•r¦ÆU«´ƒ±[y4ôêö},a|ÄæÚH×αÂ*B¥Öãè€Z1Óö7-´Ï¯¸Éà¼äò€9°Ô!¥€&A¤„bä–X‘éÿ¥ä,ÎN"åzî”"m‰‚)]E˜ŽçÆ´l$.` Çõà@ooØ• cB.;½ëjƒ`}8U6ùAfÀDq3ì©€¨Ÿ´|kuìÿÙŽŸþÕ»„•·Í‹ ˆWÁ}{Ï›:UÆ­§«+¯¯ƒS¯567üÎ#ÀÆ™!8yê€ù¶2{íG…0cðo~åoá`và<½íQºx´n˜÷óü±Èßýdšÿ}Y‚wEñŇ™9µû‚ÀÕÔfe àÁàW¿ ú½ÃBe19õ×ÉÀ#þ3ð¿pö/±ÿÞ¿ÓýKÞüÿ鹫wUGU±76ðí;<:Èú Âø@°ë€¬ ;ltÀFqÀpI†€¥è,<£ÿÙ*µ\ü;I<Å‘‚ ÁuMõ5¯+Åù©øX«¡êj¢eì.3à3óÉ,Á´ÙÑ{c«Ú8Û)p ;=/— %®·|¡D‘’ï›<¿ÕsæÑ×F¹Ùþ§D’S X¼¡2-gãÓÂÐ7]Fr½J½z.ÉuP®Yý„ÊHá0ñ4§—k½•=øöà;Õ»”Ïæ€pfr…õA¦w¿c°ÈnçêÏÔV¦Ï3^Y²n”×'Lª—årsV3É×ò:É 3¬|M ÁjJJ=ØôS"Ù7Tªo µïÏoc —÷UǦòÎJô_0)Ψ2{¯ÈlD;tú›SáäëHü>\’Î"œ>"œ?"µ~ß’#³,$:Ÿ±·OxžÈ8{¾jå\Ú^Þï÷šK¦ö“#ûÍŸSƉ£cÄ,ú97Þ‰ù}Ì ØuDEš1ÝyŃb$…fykƒaƒ¹³E¯•ûÜ%%7òj0@Ø"!¢ýZÉ!a]Bze5BÙЀ¤šó&7´›9[RÀh#ÞI„æ!ª¯ z³[˜í°ô \=pªêœKwzfÀrÒ‰`ž”}­ÈZ‘&9bŠõ}„­`½ä"E,äˆñÝV¥~M¾N›Sd6‹Ù°›™lPwn“€·§6ÎN±Ûw‘V°ð7nxK;Ì.!=@ômRûâ]°ßDˆXxžžCä iN ]C„wÐ>BšÏçÞß¶ø1‘·ãGxµï~9²î”Í Œb„Ö ÝÜÂÚçh-ÅP}H›u‘F i”6šwƒQ&4ƒ4“Ð!˜Ñ 4ø6Š/ô¦ˆh‚;55BuðˆÿLÔ#þ‘ì³S]g øŸŽeÙØ»oñ ƒ2®«MFuÉ߉€8»Š¨`=ðÏ $!£öÿ³÷n½¶%×}ßoŒšs­}9çôé+Ù¤(1bt‰DÇBÉŠ$€“±yÈKüà§$q$ù ò Oþò0  Y²É–HJ&EQ$›Í¾žÛÞ{]æœU#£ªf͵÷>ÝMöå°{î}Ö¼­¹j֬˨ñã?´ž“I±ûe‡™"Àû6ðÿp~å¶Ç´yŸå*§˜oÚaųғXdfEÉl-^/¹Ñ³èY×ëà#s¸þ,8sß,}Ä¥býän•ûVJÙy¯¤ƒ2@uŒêsT-ÍÍgb()µ!"fÖôçÅxPk.gíå}øÏ¨TozW2?õìØ1ߣýîa ½×wd5v) ¬ý]ÍNòÞºW÷]{jâÕó4f[m—H=ÈÚAì ”Íxئ¸hÖÖ‹>Ám}âØ>s¢ÏÝGN²Á®°Í`÷aíGl³Å®FÒ&x„O1è( åqbèÒˆ÷ÑC’Èl\˜M‡×èíט÷Ù$Þ  ÁÙчѸÜÃÕb&ö“0m#'ã%]ÜsÖEÖgJ·R€Ýä׉A´ä9ÓñÁÈFsà? Ĉ¡°zôóN³nn|Mòœœaë'n¼ípÀ®GðüíÅr¦AÇÊ»]]>ÐJæ1¶ÕS„»#ú…SÄ ½¶!^ H ØTܤ¥Á|/¾÷ "É£ù;_¬K"ƒûQ'ÃDÊÂÞ`°y¡ïA6®ÀJ¶É„1Ól4áÄÒäQÿ–ÔÓd$ñH8²A"Gó˜¹)­;yéy½!}‡¸½y‹[¸ü>öä1¶ËÑz1×R×%[zCN 97ôŽ"wNÂÜ&ds…=‰¤jî“ÿ~2М󷄟ö†œ$ä<¡çwÎ= ?MØÅ%éÑ„YçåÈ~´Å¦¦ g+ìÞç‘»?…#Ň$a Øþ ‰?„ñL;¤{Œ…3D×H¸CÒ—ò2Ø]Dï@wæ½ÐéžDv$8™€£Àmrñ××üüoùÖ©ñ¹ÏŸ²¶—Ù^ì8Þ¦g‡Þcµþk X7`ÛÇôâÎ7«ƒ»ÝÝû„«wÐG ®‰ AÝL1CF PógÚ~2QLý³ÚÍSnÆn ³<¥øýBÊÀ‰)WûäçJä¿ÌŽ üKNõo8Xd ÁF Ë B1ÄzH±;º%ó16¯WP7Šc¸Óä1Ó°@šËdq~`ÃÓe”ŸÌÑ™&°ÀmÔqõ="¨ÿàìè÷þ^N^ìûˆ¨Ð ÓÖèÖ‚®„iH¬î9 €vÎj÷FÜ%‹Ó`¤rnôméæ”%—l½}§|½dxñù&; X: LðŸ|ù¿@S‡ZàQzµŽ`B@-äØÿ€˜oõ²ö¶kñGv ¸ÎÛõèý ìÏ‘þú€Öàø_‚þ%*néÐ~TÉªÇ ûCKI=ïügî<©’#^óíááßÿ?ÙÿÚ_~àöó“(öö¾yŸÍù;œüaz70È}dâˆSøJÀFEFOûe§ê‘ÿ?óþæ°ÇAa Œë’; LØÍzU6›Ê¤•ÄRhò‹3€5€˜ÍPÍ534Öèç8¸’ƒã®×Wln®Íé€Òî,§U’±_Æôr?9ø¥b;¨= 8ÔZÕûLŠîÕôÅF @ ì(%Õ…èÈ¿üä–s sy?@„qÊ—ìÀZË¿€Kc,m´qâXüg]|¯: T/Ê|?Sû™ïëÇ%X¾<3\äï–ºýpëä–z¹vü=ô¢ìàmc~ïÙol~¥)·Ó‚ð#sb 4ÍÏ*çrÁ*‘S¥ ¹â°ØùGç>ZÇÉl YT /Mx–£Ô{ÿ6w´…ÜÿåõÓëë3$¯ý“ ¾ð7ï ½ëÚ)«{Ê”u·õý@ÜGÌaíÕ™’Ñ ÓÎ×ݹH; ÓüÕè~õ4He~?³ž—Y`ɺ­Sè!¬ÌǪm´G9ÊQ~‚åÙtøÚÑàPÞý£-oý³ w¾ÔóʯŸ²{kB:èÏ]©™®ÜÀ¥Á˜0¤3º¤½NÂ9ÈitjXRŽžÈ¡Ë–ò¢gt ™Úß'ÅìH T&Ï:9æc×P«:é-Ò8±ÃG¼å2öZÓ?+¨vs¹wØþìTX­„q6¾ùuô ì1E§tD”23?, :)˜Ô !£XIaòœòD FÉxÚ"68uû €8µk)pÆË‰Àä÷’d>&5†ÏEÐÅGþ?M2°­Ï¯‘Ÿþ H.ÿd“#ŽC¸qG’(FB´CR$ah6ÁZ,†,HŽ6Î/ZÔÙ @®8ÀW¯‘( Ó¤œ×<™GüÕóÞZ¡Ä•9u'„Úp$ Ý—Ðî+˜}ý1é²w±-Ø.À Nç_hV‚ p¯ðÒ«Èý/#ú°…ÝwHÝ÷Ð4’JùÆŸœšÉ§kî(¼ü*rïˈܶØù_ |¦èL;œ@ÄC¾Wý VŸ#„/¢a"No’¦¿„í%²ßÀxM{AûYõhwØ=Gè_¹ r çHwæ d09A­#ù½ýmûû —Çüé—ÛûÊ[– ÷ ™:ˆ+„·ÑxáM߶赡ÉP5Âj…Ê Št'Èéc$):‡F!àwHÌæ |HΠ=LœÉÇ¡ÇBÀÓbÔÏÌò¶ê|L:Õp¯5gÈã¦àûbFÀj‚Ò…µôãÜõÖ€ñ3=®¯CÄû†•ÈV_\’ƒû¢îÀ“ß°0X1à&w2òì°¯0O ¨òTy àŸƒJ«|s}ÿþø·Þâôó/ÿúWß¹úÁHÿœ‡ýO›œ¾$@ññP¨FÝyÛ+ׯ¥.ß®GÛ9Ó7>Yîÿ׿ô¿P#ÖöÄi |žÆý8rSd¾€9Ò?ódàü“ÅÙ9 Dÿ8ÞŸÆ `Y% gÅ7*Tçe'‘Ü…or(ßÐ O]ýÝ?ülÿ¿ý³\¾ð:Ý—:ÒÛ [AO•ô®b;ñôG[ÅvY%g* ¿å(ÿÐ(µàJmg?Y&Rt $uSÕ'-§*L)¤ "梔õËØ7“úΫºYö‹ŽÏÎo¹q ¸q¿ÈNœcš«¤@ÅíÕ¶3ÆhŠaê^ ¢·`në`þ¥:8ÌjöÜ^gPº¯ç2Ie˜ë¡8'—g* £G7 d)Wu& –‘¶&Þø¿(qî¥ÙXwñ_Ç‚ºŸëkîiÍ=Fƒƒ9Ï {‚¥ú,– (³£Aû ;|*ólù­ù­{]ÜàÐܯm¡Öü{]n·åðÜÍàë¼AûÛöo¸Sd}·:ß·8ZÖ~–ÇÊâ$ÙŽ”å7KÎûâäbYºÉ àǨ“e;¼ä)àÿb×ïâºZé§ù΋öks[kÀÿÂYQÊž²¾è÷,Ï_êKÛÂÏ'óoÜæÊÐ:ùÿ%˜@ò»kKQ;÷â¸ßf~³û 9Fÿ»¼óÏ7<ÿKk¤ƒý;‘iëƒ÷´q‡Ð¸7¬ƒ8xºÀñÒЀ0í2³S‚xaž–x4Ç3Fw-v_KîÜéiž² 8Gýc×0®±›QµïJ3$äÌ7.Ög>¶Û—G9ÊQŽò‰Ë³éðõÝ']„gF¶oOl^gÂÿ£s¦S¯_ÐºÝ ñ9É9pfÄÁ$CV>Y–ˆg,¸í¾Pé@ÖÅòdYò#: ž IDATêJÚÒ[¼ù»MÏ‚º@«×Ysò8AÞ*Ïõè ½°~^yî«kN_í¯r{ß&¦§„¨vÉ#‚vN:íœ.4¬„TĆöáÚ¤º¨¡•6‘å§q«Ã ¬‹[cã±­åÙýá¯ÂÝŸ%ô?å‹PÛ2é tÄ7°1^ ã¥öÐgp4‰³Ñ@Š!W?nPø£–6è°ÅZca6>8¦4_¯*œ¬…—ï ÷'¿íÉZ út¶$öÈ*°8¼RsxmŒt(ôBþM35µ‘†„^>ÀÎ^cB(h¼ Å‚]8­]ÎßnX6<#6§tð|î52DzýsކøØEQ§ãô&FÂÆä¨a›ÜHíÁÿøOÅ šƒ6й'úŠÛb6‰xä»(EaIšÁ5_–âàï^ÕëÄ RÆÑ˜¡ ° š!ÍFm]ä}&çÀ•ü;Ù¸„°!Âã ¦þÂ{°ÇMÎ `‹öê i6V}G³Ö r~¹ótõo á Òž$'Ƚ ¸| Ù©8—T=)ÜäÎäîÏV?è)–vp¶&Ý»À.Þñ´NAh¨p(&fOSH²Æ¸‡Œ?„Ë·°«=¶Îb±RX­àô”xz±ûw‘î.¬ü7=Aº{ÀÖà !  G½åi²ãdc„4ñÜú î1ÚHºíDaì':dLÈNƒ9("tÝ]úð§‹6Ðé ìKròOày;g‰ ùš ÐIË ¨åc”ãžf@„Ì$ •b9uf b¨–}CÕwÊšCD‘=Z3;¶8=xO»beÍ#kùK;NZA7ÒÜÏlVÊÊšƒ=½dZl›${YÉ:!w€µ¸£Ì¥ H˜ÇÖjì³EÙª\A*–p`ˆŸåÏWGïÑ«×F~é¼è©]tw„»?çì0ÓÞçN€é*¹]>&Tf»â J=&!Gwy;Íz=Ñ|½›Ù­ÑëÿÓŸùo¤ˆ)y=ç;÷}rûÇZêÿ™Úy qK=Nsÿ 0t @ZÚ¹PÁºCðnÿSÿúÿCÚÿ…@ÙÎ?Dƒ¡ÔëzVösai÷3ûüŒU°T£ÿaÿ׿Çîoã´šŸ\±G+ÒFØþµ?guOˆŠÝM„WÌu¼½"Á °ÏcÏVIÛ€¬Í:E° 0tXï@v©ÝY`R¬K>&ÁV±®oI9=ŠÎmŸÄäÎ7’ÓWU¶–¤TÖ½ê?ÛãÒl7ý@öçVÞ€P> Få.õÛƬcìòHý4¡:À¶²Ì`b™; í|Ð2ÇäþQ‹¯ëÙr¸}ìCY‡5Çe®‡m\"“g@™º]ïÿ4=߬^i”µ ÃÄMcíØ 3ó÷æjŸkßÚŸ¶EEXIå“Ó”±¦-Ky«cG~¾'†š ÖIq¨pp3¾—÷¹.jÒâßøOsLê¹àŸÿÚrßoÀäü[åý¤L¥š5)R]Éço´L¹‰¶„âp5;üøurãY9üæ ãz–C3ðÒÜ[Ø4pÒ/¿P}šâ榠ùÓò³QÛHi?)¯ï•¹Sç*CÈyÚ‘ˆ¢ÒÕ´!‹ã~&»îÌMá†çþ ëî£-×%œ+'/u®›íŒáÁD8ËéW‡DÚ%X 6XR4Æ'©êw±ÑûÒ0ÛoSÿmÊÁ]×ì¹Võ½ÛÒ/†>8Fúå(GùÔË3éðÃßýläƒ{/ùú?|‡G_ß±~ÉúýÃD!IJƒOŠ…>3®hǽsz›Õ}±_<àtrȇ뤷Pò uÓdxœ ?t92`xÊ‹ç~aÅÉ+Ó“ÈÕë݉²ßÃî ‚˜®"ÓÆ)£¦mrà-¤½+Ò qŸ2ý'Äm¦]¹AÑ ‘R•ÈâsÓ®Ÿ××´ó~{!™Žò¾ÄNïN_AÂKÞ~† š&Rz›8¾Ã´™®„áB`Túµ@ï0OÄ£yúL¡¨­—ü§Qny®… °™Ì2½ cI)§œžwÄ1¤1”þ¤gЉ€@›¼ýĘ¢±î…;'ƪsG‹Ó•°ê–¤Y‹ê|¡‰Ó È<¾ …¯!'À:¦é ?À¦-Ò}ý)²>u4.ÈnGÚ¦LcIJÇ<ÀXk¸ø„D<Ÿvz!þ™ëÎ49KäGvp¾~ËÊüxv€)Ñ{ÄÕÙ>êY‘ÌS¿6Ü!¦À}òTGû½0ëÞóœ T](%$9 n.·©B¯XìÊHoü.Þ&lëyyMFf˜¼ ÎHP »î(‡°:CÂ+}Þ£çYcú ¬îcýÛîø ­½yVÎDò=:õ9¢/ôyO—ÀôelýÒ?pV§`˜âŒ 6)¶àê-â*SøÇ ¸º$]D¸v] zÖ#ÝÚ£ýõ8Çô Ô©ÿeµÂtÈïL€ºŽt—O“sžh¼{jÜyeÏZ³ÝL„4Ðï”8ª‡.BÈÀu?áì.1±Þ_ЭaX +óÄ*9rp"BÄX œ(œa¼-žöÂI/ì“Ñ©;Èx?Þ?¤™f'b͆UÏH"^$÷IXŒÀÅ¢[:[iÇ“øØXBpfó®;ž„Æè ÞÞ‹b•ý0°˜j´11å1Ä@’÷¡® @1ÿLD¦œN@rš¯¼÷>OÚ¼ð€ôwD"äßž rYÀŠë†öæÑâ¾utà/ÿñcâ6ñ⯲ž¸Sït™/a ãUb¼Lt§®Çǽ¿÷’C6Mü[´™Ò5ƒüvƒSoëÄûwöB ´Ná߀ýÄkà„H·j£óg‡¿§ÿsäÿü¿)úýæ_™¾÷³ÐoŽžÎ9«Ü- ÖºH(Jbøõ°ûoÿé‡QeϼØθüf¢{y"tßL6*ÓeÖïÄ~vêƒïÆÍrÒá€þ¤È$XTˆžfJ’ºƒS î\š$ŸcÁjDŽú÷> óZ5e?‘Q¹¢Iëü¼­ë)€Y‘C@ŸÅž,®jÁÕ÷’µÛC„±¹çMG ×D½cÑÙùF vX¾3»±h®úô7'»(¿SdÞÖÌP”TÌ ²eæ«åx"³¾ØÖñd.¯µ%/ûÙÖ—sÌ_ëÿ àÿúØ@ýN©tǯý~Ö ,§ø)¥¦¬ÞcYæ–ß×iÔwì©'ns(u[î[ÀÚy,{Oiô•ÃÖžvÙ~Ôhs¾_×Û‡RCûŸËë )ßSœ£yiî_øeü …q"/ …Úš¤´ãÊÞ5Œ[æ§”œZ/;Ö‹6u°xæqÞ?Úr]¾þ¿¾Ãéç:îýÜšËï "ý=%žÖ)e–á¸7â|w TÖVòmT,˜Æ Y·‚ü­Íš¶—E¹Ö¾oìK´å(G9Ê3"ϤÀÃ?ùì¦Ø?˜Ø=˜øâߺÃÿãs¦]bx”ЕOrÓ™Fr¸ˆŒOæ¨è¸sEjºJ¤)o_:Õ¥iŽxžœ"Ç=Ãó„jÔ ìÀk®xÌ•ceRm·m{–“ð¼niVŸ‡Û7íJåÕ¿yþIá™ý»t¥ÈÞ8y©Gú Ô'â. ÝÝŽé2ÑßS©’ÆäëÞ[9Å¿öÐ%ß¶(s›nr@-Úý í6¤´û¼^»±/Ѓ§·ý›öò©“Íïü `XPèÔnc‡™2î…a Ý$¬5`Sþ›(I=âS:w„9ÈG÷Ì8˜ÝÜ?®ò%ƒq‚)Z NgÝûoÇäǽˆJÈ4Ñ—»Äå61LÐwÆé:8ÓH¡e¨´öRÀ°à†‰¶’DdxVrdû„sÒõØùóȽ/!§/c¢Ãå÷ÐÇ1¢ÐžR€2fTCÊÍVÁZT€€MB|Xôo»R¥äwÄ/ŸÇÌlèʈ¾³’eÁ²#€ÍFº|nþŠo˜dçÆ ˜gvÕ|¡ÃrD2ìØì¡°î” 0NÊn!g«l¼Ë:O-¸*6öÄG ¹È¡sI±½B¦Ò¥€ ^ZjLËÙE´lÅÁÕ!FÔ„xs É¡€×IBH`ØR¦1!);  ˜ÅJ™n{°‹ˆto`ÃV§°¿Â.cW vêN+¢h—cÆe……3èÎau«dõ<ÒèNÙxÙD‰;_xÏåš|ýÔøÃgÂw,ÑOV)1vN­7 ÉÎ)!B×CH‰. ÝfG¿MgF7izƒ#(™2VQŒ`¢¡â™ Âàþ]eðÈÇÌůz^II'àiB6ökyÛÚD¿©¢fhÈçµI¿bNË/)¡$BŸÐ•;3ë$0fg*S´Ïõ†æÚ‡†4¯%$3™eãŸàÒ›§ÉXá¨ù5ÑÁ2‰~­†€Üÿ zï«pò ÒÃäñ§0gÀ¢ó™YÃ(s0þ.ºöØRþàü˜àù¿rBŒ“—:ÒhLW‰î,VJ8‰Úˆþ®Ga³$jýçÔ+öþꤼ³kíë½z¶Ü°µüîr«ù¹ÚæòRÛïüï2ÅŒ¯«j1K˜Ây_1+º¦7ŒDÊéå–=ÕpVªZB™—Ñ9ÎÇâýÿ8r´åβzNÙ¼>ò¿uÂù;V÷”p¦Ž[l’²ÒÞˆ£eg€DÜûº )ëxT§ÏÊæ:–±†ììf•Ÿ²Øp‹Éa¨57Í¥´ Û–×_;v”£å(?òì:|í³éðà_nÙ=˜¸ó3+â62]%ôL<ïùàt8ªñŸ6 }ü3+@­æHtªóö3Oˆ×¢$ìúÄÙ •2ÎX Íßbâ<Ü>Nï[žÿåÏ^»¿IÞýÃ-ßxùß6¶oEö'ÖÏòß$w^ÆMªzØ´µÌ€‘H#3íÿ„c'™.J‚biëùÓ–m~Ñ®çµÄ¼þ8ÒDåÇ«üEÏ¿ñ-RwÓèö¤øÒû}b••(Ú+9?}p:fí@U£ÐM‹ôOV®á#B0>*G€B-©]vˆÉÈX)ëV&\la2î }€a‚³áó!p±1ö£±îáÞY6óU{¶3‚¦™ Àü¸LBÚ ºAD¶2èqŠõ“;ès_FŸû*Ò½ˆŠ’Ò¦~ðgØðÐ#ÿ'…‘šóºVf©¿OÂÉCÝðâèûl0õñR2€“4WÉ!÷^vK3m~ªÑCRrˆ,MŠÙ0˜@µÍ¨´vmwt¬?âÕÛÉØÂ(ÆÉ*¢±Ù{44+2ím‚>×q ˜(–ümª,7è™_S-É"ñ\äë4q ò)!ûKÒî5bwÒÌÒøvõÛ[¦è•jn¶b .“Plˆ¤ÝiøAŽÌ?#¥6~ŸtñöÞö,%7f©ÁdN-|Æ€lßv‡¸)Á.bƒ £’ÙP¤ Èj…¬VЯ`µBúô ÑØ7$FªÆË£<]NõŒ/}kÇ[o'¾r8¿ÞŒsQÎØ„NX'ÍÑqF?kKLÁè‡Ä !ŽÆjÖ(SïQþ'AÍèÕ^&14€èƒt„ ¨!dÀ?7_§þw@0O1-É™<4yÛ×” Ñ9r”lfmì´~’Lÿ²6äNDÎÒéjÄ.:l—<¥G§ÝoÆ:Ç¿ñC¦ÿþŸ¿çóÄþÅ <ùö@øâ€}ç.ñ]!ØVH[…ΰb[§þ·:»±Âè‘ýL™J”€¤H’š²¢Ý/Ñüäñš<HfC*©}!ÜèkM{­©Ðœ²|n»ÜÔ¾k£X:¶|ÜÎÇ×/¯e.ª ^q(`_Ž'–œB*Ó²§Æú€¤¼ÖȲÇÇ©ŽoF©1Éಡ~Ò`‘sRÕÅ}ÅrjAú ®—é«ýÓÕ9ˆkãÃí)Bn–ÑŸ¯JÌ®#ˆÔ1gycvòõ‚û ICà€U€Øßé<ø,D¬Ùj[äõú¬[ –…÷ÿóÜPAÿøQT<S½¦ôœÒ&êâÜÏhiZI°l`Me®ñjuë¥@³ÆÀšt¥†o©“[%nê¯7_µ°/ÔÍ'[3/Óü-kÊx(Åݧ¼ïùfùŒÌûe©ý5³Ë”Þiä¦$ÊÌ`˜a27$ƒÒ¬Ê»¶ún? 9Úr].¿;ðò¿sÆÝ¯¬Ù½9pþåiH9âß°!Uì¢àaÔŒc€LŠŒÅ–[lG4¯c±G,‡˜úgͱ|© KöãVÿo›êÑÆ{”£åS$Ï®À×wŸt>V¹zmäÑŸîH“1<Ž\|gðü†“w™º|ÈÔå=Ùë­ä4g‘ÛÜiÍY‚þ™Þ|ø·QÏÖ|>m|o¹éêw5ø.ÇœQ.ãÈçÿ½sκçäó‘ýÃ@ÿ\ÈL íÝ÷©æˆŠ{w‚±dL[§T.ʤ„eQé¨}"Åëý£8T§€‰ëž¤7ô›…ó\ïKG¥ò(YlHpõ˜¸þs" éî€m±ñ{¤ÝCœ´ÀnPöƒpv¸ÊùÆÏ;É‹aŽÞÈ7þ„FÜÃhÿº¶Ü¥˜Á>j;¡mîÌ'aŠNí‚pµ3Þ}â«¿{gnèÜ?†IH)ÑwЩTö€jßÒÆÚyT¸Åˆ$HSB¢‘R6p*@Wœ>g?Mè_…î h:!Ø–tþrñ6æ •JŸÖ‚ôÉŠ˪̮«8”—+ä|Þ9@‰²%da1~I5Ô¸uRçTðz-Æ¿vAßþޏ‘+&H& £1%ЮãT`?:#@‰ô@KŽÛÏEÂçÎÁŒôæÛ¨7†`‰¬ÉÏ_@ú’t¶*-«’xDÞ(Øå·™¦ ²¾ ¶Ç®~/<êot#¾ †fã¨%q0`ôˆAoýWLw.‘þL;ìÉ÷‘'Ä0©·¿ò® O0AڂĈ¨åüˆŠ Q!=}ÞA—`• ËQÖ’‚;X~!¨3Xptö(O“oo¾,lîÞ ¬ !L#ö 1bD#„)¡S®òht“¡19}¿@’Hgþª,GÎô“ûµLê‘ÿ½I¡X‰ÉþH"Dƒµ§ªìGC :V9÷óÚœ@Í™ª1!ä10Ôq^²lUÍŒ!DT"!Ü#œÿ<Ú+Æ7`óbù¾Aœ–¼.$ƒÕÀbB¢3 È*:ð/!w κ^Œ`W#éɈ%AGÅ#=†ð½?…Çì'x’++À¬¸•gJ £=ù’lÖý2H,CçIï[«cߨ¼>ò¥¿sõ}¹Â™prÖ7‰îLèïuLW‰á"±º>1]F‰B—­Ñ=Hcò¶>XüOSNé5Á¯Þÿ[HTdêãš;L“;¤Ž`š:Ôºœ ¬CΊAO¡s¾1=@ûï Ð\þ/`^u¨ÿÍÔÿm €ì¿ý?·ÕÍ®Gö¶€ÚmõÚi~y޼i!{aËô÷þä×ÍO¢Ø×žg˧¿1‘v‚í.‘û‚îzCGÁöFÚ+¶w„ÅôöêÁˆ[…mW™•dè`|> Á™¿v2tXHÈÞYâjB†:R¿#S¢$BTT)D×+ £… Nb_èÈCmëÌ­•ƒéçiÉ7]~Cÿ«Xôì¨&|o@Ô½,pc-BAóílñÙ–²DíW Ó"g…2ŒÂ~URb9«NÕ³sP|(s4ü¼Þ+S¤l€03F›&„vLhœ„Ro˜Aÿ–`þÝÛÊÓ–7Q&l.ç‚òœ:×9 Íˆœ4NE¦u(õߎ]óï<Ò–y¯üÛ–qå/×¢þµ8´Ž‹ë3ˆlícJnOMÍf¤º©)Àu¨TSHõ£n×÷3Ë_YƒYðßT'vcܶžœ¿µÜ¿vµ5PUñoZ˪QŸ°™oum£ühY'6õYú¦–ªã„»Lx}8G_ûIN¢+ ³‹õüp¹7@?Žm¹.qï¸Æø8Ò«ƒþWÎðšöÆtÝ.`ž Š€ÛeÇ<ÎÉ×$ª†õÞ,3FÙdÎ| ¶asðbðZ0¸|–1TšírÜ ±Tómô¦æ|«"u”£å(Ÿ¼<³?üÝ«Oº›¼ûG[Æ«Ès¿°"îŒiçùʧSúÇ!‘ö)œ¸×\1µÿ#¤Ò(Ø*çHœ¬æF´(¾Ÿ …úLXRFû_‹‚.&\›óçmS^QÓŽò>ä³È|q(—ßxé×N9}µÃ„µÐßUÒÐÎ æÓ•9eîñÊеGâ&ƒnåËŒ4ø¢2œ(ÓΰBï ñ¸w¥2®„jç”Ûiíœ! ®t–¾"!/z3èßæýhŽò«ßþ‚·‹ìÑŽ4ü®!ëĉáò’ñbd5v„.ð$Á˜„•Áfv»„ôBè•~ÊØªä€h¹Ý€ôQKÁEŒ™–Ï,Síg¥ óµËÕGWîjÀ¯+UY8º òNÉËúž¿+ÄèN»Áè‚°êx+ô”VÊ­@–M°ÁiB{ƒ»À©!)ºat§ž7]{ÿqë=ÅÂÚiîÔ 'ÅäøÌŽ# ¥ãP²×GÙ¦>Q@rMeŸÔl„ͬ•5ÀðhvLÒÒ¦”­8Éô'ØOÆ~ôýÐ çNWʪ¦$ìF©T«bèKkôþ]Glø=ȹ !ÿN~­ÃÂÒ2VÎ厘ü—].wz Û+O#`†Ûx`Éçn%ŸAe9p6…4 ºsš`¦GpyiÓ„mGlãTþ †ýMзΠ ‚v!§‰°KúS8Û}…ˆ1"lI²¡³SHk`‹/Â<àXÄdi‹Åí‡Ö¬>­ò0!ÂúN×ÂzRö{#ôBg†l$X n´ Ié&7j†Iè£1‰Ñ3ºätÿÅï´ý!ïŸ5‚@§æÛÁT!¨ƒ÷Š_Û™ÑIbÝ !yniMB—B4Oô`^h6N+d£xþÌ1Jâl-Hôº•ðêY½ð è*0î¯0ýiå˜uâinŠ8fê, PÃv)wˆaeÈYBï&ôÅìüEç™QcDÖWˆ=ö~=áýqÓ y°:R ³ùš©äï]˜Â«Õ¹ZXï ýü•òõo<«øÇ'»·'†G‘°‚¸IìÞ„3aºŠLWF8âàé†Ç\ïE_çF#]F7OÙq7¯>ÿ› Š„œ}'h,ÒÜL%sBëqðˆØ‰$†I$™Ð€.Rdšglvšm¡“þ:ÔY>Oбƒ¿ d,¨þ+õþ›ó”#ÕA´+?kͯ/ËÒnÉâ¬Ô“5OsEe¬>g¥ä}qKú­ßƒ—>ÝAööÞ<ãêÑöíÒ…’ˆŠ39¥A°AöpÇ*Ûäñn/ð÷ :ø¶Sù‹;´”6ÅSXLš£ÿg&‹Ð«šªQÇ“¼>Œ¾®U;ëæ”u–ËïÑ[É´-¸(£‚ØHæf{þ^{ͬßßðµ›oUú˜·ù ¡–ªBÛJSK´y†¢™ñòS/‹T!WGî3(isV–✽¼2Ÿ3Ûû^Ö›5 eœÈ }îë) Jô?cÄ"Ú¿þ“5c 7Œk´C©”öyºœÙ@ŠêöÅ2ŸPY›õ_¹¾L«…I¤}kâ¿·“Z•ü¦µÒbŸß”vÔ´SÉ-¹€þ‹Èÿy_[#ù· IDATV™ÙašEÛÌ" óòÁð¨t¥˜U¥þùÙ´¨ó¶œå™×E4`u«š´urà8þA ²·^·Ð{Ú·õï}°êHSF—oYæÃ®UaóƒÕ:—E,/3S­Û™ÀàÚ¿î e]g–ýäCq8Úr]¦«Ä‹õ”îž2>‰ôÏ Ú+ÃE‚8y¥#îœ €Ü6ÛÐÄ´3ÂÀ´Í˜ÇJ]WòX•ƒ³$d{LÖóR ÚZ0SŽsæ°&¸âàópû(G9ÊQ>EòÌ:<ü“Ow€Ý»ûw'ú{Š®…í[#(Äö&ÒJ°”g*`¼J>9 Äј®2;À.1mÍs%v´3ÒÖÐ5 €4Y΋ÉÍÑÌÍ_ÕAoRò QºžòO·%å@Ž9£\†GÞž1˜.#ÓD8Ò&eC!Hçé.ÀФ½§È3Æ«ìü2D#æv¯¶Mž áž¥Ñ ä6&$‘·}ÁÔû n“w'€&ÂKJªà^¨mÿ¹¡ïØmÊåQÑüÌÈæw~.&Dœ€FdóVBJpñ0ñø±ðÂZ8:„®W’(Q„õZ AèÔiíÇÜFC¨U3úÇèP]Sôæ2¦ £—qÕ958¶kFÍ] qv™[Ù ¬{©gká¹3aŠ¥Üœõ<Ùý‰ŸÛìýÙB?³Ú—Î\)*5ˆÅ:#p'>ÿ3XŸ°'ßõïÙ¶ö»<—Ž˜mÛeJzªGzɇøÌ79Pâlâ d‹L¾ÖÀ]ý³–ó|›«‹5æºÆ@"ŤSh&!&a3˜¿+QVÎN”“•2È$GÉLÙ¨$Gø L Ù=ĦÑm¡ŽÈ¯•’·sñÜÍóWq£"n¨Œnô ì'Ðћnjö‚M*µž<HÌÑc@Â’G1ËvBdrãÆ QÈh`Šh‰ÐìDÐS{§Øý—Õ)¯àâx²ç`·ŽlÄNHÜ é ‹O@V>Ù…ÖãëùÝÊ\í ’6?F#úlȽ$Ü}Ýøî«p²V´ƒ{"Þw@ ½ïÅ%Dß¶NX§œÚDÝ@’±Â›èJŒ^•˜Áþ’@4Ñ¥ïýøºWº.Ç|ª/ÎE:á´ÓQÑ|‰æÇMœ™ åñ:3ÕŠ:À¡b¥Ù¡ÁÇ/ žŠ@Ä€+L/1  FZC»Ü÷’0’r·Sfp Ö$'†ž&¸w‚Ýý× ÿ2b'Ðí`z€tÈÝÛLž_¡‹ÁûK ζ¡ÙB£÷2ö¨ºÒ˜Š5=5Ûy KvmœòíüO>ôwZj€Ï¦|ã{—³/v¼ð+§l_Ù½é_Plr‡ÜÊv··ÊòU(aµ§aé2~í…¿íc•*×vzI›ži+ÈIr& A°Ia”ÊĨؤȤ0åí¨H Î^³ÃJ 5Eý´ÜÞMs*%wÚ2Èc•}&›u©U¤Öµ‹@Û6ò¥õß*ùrâ¶ðçÐ ¶NõŠ;|,ýu6[͹Ó݈U€ÿÖ6cœοVB;Ø)W‰Ì}ÊuT©îÚ:xY jšáè›ÖCsŸö—yø_¢þ­#ÒÁ8qü·ãüfšn[—¥¼HqUI)-}d)4Ï…l5k–Mý–Š˜o2ÛPhÕíìhq8xÝXTYl^sV‘Ò ÊXOä/‘ÿ3íq ˜ç•’ i«íZH–É$j;¡$ TœÚÞë-ÍíÌ2M½Yf±Ÿ«¶õXÔIsüÖê¹Qìæ]YžZ¶ƒWfË~´(p+ÒžgáG0;•äoßbÆqËzSï q_tEk‰ŠþVÆG޶ÜY¾þßáþ/¯yñ¯²{Ë@WχÜh¤Ñ:c ZÌ‹it}/FÜ&´K¤ ê›ù1{%\¾&ªã±€@fSƒuÌA¶ü¬4NJܶ}”£å(?AòL;¼þ»—ŸZ€·~÷þÑC¾ð›wèN¥z¿Zó4¤Ù߿ı†ÂÜ'¼4ejóÙb“G:§1G3Âê¿.0M³¢•˲®ég«£¹nt;€érÝJp]>¸ú’cÎ(—i“èÏíÅùš:Oˆ£·ùi“^NtvpV<8±ie6åu‚bù“¥ëu¡*nÔ&æ~©m_²9SÍß-`]Q$å%²®ƒÛïs°]ä¨\~*Eïß%îÂÎHƒ@to¤ ŒûO”ýVÏ”!(W;Nyî,ð|]§¬Ö~¿ý ÄèeІŠÐKiš> ~›»b2Ü)Áˆ¼«YÁ"ea¤HÖô¥rŸ¢_~©¹<Ífð>ÿ~î0LŠ¥äscL`uÁÿÎO¤2ÜþV£¨vD=O|P’ÞAté°”`wA¿OZÝ}D±ô„4½†mÞÁö“ƒSq6ò‰Yö`2«Â‡¥ð¡ÉN¸a&e3Lå²Ì†Åë(ÍÑBsøOLó}*haM@‹›¯‹Â¢p*îäѯÕ|O)9^AL qr"ô½¸ÂÔß±?ý#¿÷Y¹‘¸€þù>ïKŠ3ùG'î%Z‡\טp‡‘¤ý_¶Ïs»®½®ê¹Ë`b²”烦„ ÚZ®Ö¬¤Šéœº*C¾ªn„(Œ$fóºˆò.2c@éÓÕÑØ–ãC¥ðo"ûà?LrÀÒÿå¹Ë“g‡úTR®¹þÂD˸ES]—ÌÆŽC»É¼.K ÂÛÞ¸¤ÈGn°.Ö7ú¾Ôr9Ø›õú:F—í6úŸ6â_ç1ýg&êA²ó¯•¡D–›äg§ŽÉeTü_ÍëwïÈà¶EϪϡsûkë°>®a&ËC‡yãÞM߸þ;vpvÙßümÛ¹mŠ©Q÷å^7¼ïÛR̸lYoš·ËúÏ}ÐgçñÒök;ÊﬖçG\_m¹.»w&~þ¿|;_êˆ;ãä¥<#q§ŽmìÓ°Ä:l²ÊtLNuÌä Æu­;‰¯KÊÁ˜æa'ŸgähÖì8@þ¬cZs¬•£J”£å'Xži€‡_ûô-·oNìÞY¿ø¥¿ÿû‹HX)qŸ˜2Í¿íÍûj(&z¾D¶‰Ø i€4(i4º! æÑ:]¡÷Ï´ÿy»¥Á±ØÐÄbtk'Öç†?kÏA;)¶\K7M–E‡}FЋgCŽ9£\þò·ñêpÇ €å¯wCEXI¦ˆrcíxISŽÚzäÙ–W"EÉýÅœ9ffŒˆGMd¯Rj¨}¥ô‘÷b̸¡Üê0s“òxT(?õ2¼ùß‘ýÈÉcÒ•yìóâEŒdÂvcŒX«p’`L°…“à€eP§0ï’Ö ÅUŽj'«AËus:Ì YdºlºÚ»ÀÉJ8]Ke€yýÞ…9úÿã’vQîž ÑfVKž À)å‹#€Ôj¹o”bðqÍÊr„éf$½õm¤÷E-}@6[xò]¢ ¬^B¤Ãâ¸üK¸¼ m <ú¶:é!y>Î…JÅh‘ËuX‰Ÿ„cÀa$liˆªÍ±¬8X>ðPáÔ¬ÚËs ùxùÖŠT,i~Ïœu9_s1ÆÕrd#§pbÎô“–c{!¾®¢Ð˜Ÿí}ÕA.›j7$š§Z’¦ÜÙ h5ò¿€ÿ »Š·%q£‡DËlÅpšjtc¾ás!És§Û 8¹w÷špç_G»{¤t…õÈþ5g 1uC¡–:¤ý¥"׳=1Ý…xÚ»ž))mPy‚ °á³“ºëÇý•5úÆÀîÔÛéj ûtƒ±Ú;{½!t“þcghtgͺMgÂ*Í®!Š1©w§^…½&D¡ë` vÖ¯¸¢§“5=Á!A/½Lìw;tÜÓíaò4&]rŠÍÀ•N“ëcˆ§T R£þ=ÎS)£¶°¹Šhz#çê$ªGww óxf8cF¬8Lž¢Bœ~Ѭt½‹Ú}”SPpcº°ÐÎM†`Z¢ü½?JŸS s£l<*ÝXaÁÈÆæVéËÑŒygñ¾ßíŽÊÝÕk#/ÿÚ)ûz¢œ~®sö»•ÐÝSâ®8ö&¦mâ+/üO 1(ô ‹ƒ3·ÄùÏ¢xÄt"ӣ˜×<ï§f[SËN¦î;ÔÜ«dQ ð_Aûçh]ʵÍøÏÀM™+Íuš,oßæ°Ø?8ÆÍàÿµÈÞ¼ý•Å:ÿRf)êŒe¿ðùþå§üýŒG¿_XÝ9Á+v¡Ä.×éÞm46t)ÛaÈäùÜ·ÎoÓÑÛhq d’†ê¿´ßÜ–ó°$¸ž€ ¬U›Š>”ǯìHjiV¾ÍJô3óûýuÝò£–§ü\›û¼€vîÜ[@ÜYÿ²-]¡¾‚ð•ߘûå¾RˆÁÅÈñÃÞ¦íàÚs·)Î æ~Þ;ü*’™pÐ;Ís]k}ööU5Ø2Wµ÷ãÚ£ó8QOÐß2KÈÌr›@¹[_ó8t80ØÁ¾4(­ßO2³A®³ú‚æ6ÙÚHüt££W ÚæŠ(›ÌelÛÇÁØuÛPÖþ‹}à¿ñÔ_ŽÛ¾ŒÐ ü—uF>_œÊ2Gš²HÓ‹ÚPË’¦rh²âì&©ÖC‰g_Œù¡¶^uH…Pšúµþä×™-OŒ×ë2·i»­’[ˆÝpì†ûkÀŸç¬18“´)fü9|³¤Ä ø_€ñ-ɵ¸èÏ6³u4©,šAâG’£-×e¼HõÕÅÑí³á,§kê q¥è˜Hƒ3 [mXù~¥=ÊèÃlݭĆ¥ì…d5Ú¤èNšuðy“ês“wqÑQ•?ÊQŽò)gÚàÑ×÷lßœ8ýÜ3]Ì÷-þlÏãoî8ýB‡]8­¹vžë0îi—i÷\N… Gü8›¬Òú§h`&÷KND¢5à¾Õ¨þ˜i\÷Š»iò;Üþ`r›ªþ1¯(2äÓÊxñAäâ/¾ð›wÙ½5UÐáÁ”WÅ0^&Dgp?î=òÓûBfÉ(}¤n[M1Óˆz* ×ú†5ÛÜðy”£|Iÿ;qÿ}¬[#!Š5`r౸„“3¥{Öòâ]EWêø Bß+›}6Ð)¨º×sf£Ø5ZÄ@JäGKýß©«ª¾ôŸ¢;h聆iôÈûü—z(‹µZ/²Ã` Œ®,ïÏ™¢—]Vm¾ý~5Ýf)s2¥úž4>ˆXgXß¡ç‚mÆ#dø:º>ó¼ëãž´Ùb— ÛtžvÈc†“„ 9ÇNO’m­¥”óÐAƒ¦^o­+Ž õ`)År¼¬*møT5Î3™¿~­þ-ÛS……jQ:ƒÎûë0³5kk花‚ð‹çù Ï_¨ÃÕÁ}KyRI6·£rmiˆ…ú¿$m.®#K%mB@RÊé¬F I1Üj6AVxTa‘>aš'=™Puö+©+Ša»‡vç¬ON9Y¯Ùï:FViCØ?¡£Ã%2 NýÝðf#èÎA;NC ô(‘Íy øà*À`$Üø'"H/9O3>YRT’Ï#Î1$´O€ÉshWdg ˜F· ê˜ûÇ2b²Cô ÓÉÙ7°œF eÃ|DÏ yùyäìeÒÕÛØ›°GÎvà92‚8<4yÔ´¨2Q¿÷Hÿ?]%.¿3pöÓ=– ÁÓU¢C`òºúR÷‹Ø™ÀŠœÎDÜIrÀ?1G3ZY, 3è^Ôš`ŽðפYÔʶª’gO PrD¿•È~ÿ ]þzÃ'¹}5ŒL¢ê:evwH)ôþV¡ÈàÏ@_íß‚KP¯L“-ø_ üï jL{Åu9ˆÈ.sP{<¿ñ&ò?þño ?abø"¿1ÒeG·?%¾¦Än@{H[%mÅS›l»RX ¶UluÂF…A||‰’S3j¡pqà?•¶<;­Hœéþ)N,MÊ w¬ÌºRÊ‘ñÉߺú1Ûy²žQ¢“[®,¸##Å‘¥HKçíC·”Åv«6J{ZÚó2w$rv«S€å±m_* ôAH`O¬.¥ÿÔšÉÇjm)Å ö:د•®<å‘ !3}y©Çây,2Í 9EAUɼ$eÌXôÿâ,TÿTÁÿÖ`ò3¶À<¶È=_aÛúq}L(u7Ÿ/…_ž™ŸEUºÜ±iwR¦t©¿{x®©—åªzÇÁ1´íHšú ú¿Žñ5@p ¡¹¦>fó²æ([³€÷¶Ó½/–öS˜Í2-µ­/ŸÅ¯©ßÒÆ¥©æwÊæòV¥,m?¿¼?|/7ɵ©å¦Ö3—äGM1Sœª-½©œ1Áª @j2Ï•y Íà¿¿/iS*§‘àhËuyû÷7®¸üî@Ü%ú»Êx‘/#ºVâ&1n"ÓUÊ,t0ífÖÀ4&l$3BYþ$çDÃñŒuø> ;n]Ior@çkršûiÞ§Ù¿ñópû¦ý£å(GyÆä™GÖ~}Çéçî|ÒÅø±dûæÄ·þÑCÌŒ³/v<úÆžñ"²~1d°¿ÉuX'8æ9'Ž©@ý4Ë å<ñaå×hn'ÄYánÖ1Ej'º…ź‘6Ñ-ÃO‘cÎ(—ñ"B‚çÿê ñ*±9yy Ñ·‰~“½0æH!ísÔÐ&Ö´õÔÒy*‹ù¾—PD磢êtSÑ|‰³sMe(¬-@ûÇA_i?¹eÿ(Ÿ)I—ÿwXÚ qïŒçV-=><‹Vp¢ÿ?{ïòlI’œ÷ýÜ#ó<ߌHáA&A‚$ ‰¤Ñ$3mD“ÉL{ì´ÒŽø´’éOÐJ&­eÜp¡Å˜Ì¸! ’a’3x €yôÔtwUݪ{Ï#3#\ ˆŒsî­îêéꮪžãÝ·Nfž<ùˆŒˆŒðïóÏ=rm?:¸¾ìa€,Co #üôQb?ËN¸<–½OþW f/Š/üÞŒÑÕÀƒôXvÐa?7;W®ýh,:a™¯³Sæ‰÷—`Å?R#þóö)ú‹®Ï8Õ'Ý'–k!%SuAŠÑ#X“a#ØN¼R<ª5il¶W†Ø›GˆIòhrq—¬g…hãG”üÌ'Qñ çYÂÿ^Å ÁÊ)Â_˜@ù vÐ.€™Pgè~_föí¥ fZ§q{Ë:G[ù§îÛ^ßç1Í×Zï±u"·ç—¦Þ0ƒÚÑYh¼Y!ÁPȹ×ÉÑÐÉò®Éû”ê#w°ÿkâêMoB|Û¿À¶[Ëij1ÉI–@¦iq‚aGꮑ®ñÜ鉈ÅÒ€íÏ¡¾X|¾2û°¿XÝû°=n6‰¥8 #LF7€uÆb4qÝh,ĈÁX&è£1JVÌ0X,L˜Ì胰HÆÐAG ˜Ð¯z4öè& ªÆ2LSBRÈù¦»Ø¡I‘ää]!  ;A÷Y¼C;£øŸ€Ëßf(4ø˜‹…¢ 4y*I‚® ôYuHß¡! €ärÿË &$$’6F¬Çû‰¬Z& Ò>¡›‡¤å=·§,0>Dxa‡…Éå ‚e%Ç……kAßý5Âê[LËïþ!"S;vÞ¶¢æô³Sž¦«­ŽÍ@¨Ì]ÑŸ|Ál>9ûåžóoôŒO"ݨ¼ÿþ×°Ån¬#Ó°u9tSl™`¯0f€`þ¹W,+K †€CFET‘¡,¢GUÇ€ÐP Hêñwíu—#ÿÙ:y…˜¿Kš%üøwÅ ­Dµ9=…¤BTÉD—L °"5n$«JCeˆ‘¡ÙâjÆ9u¬fó~ðÅÏ%䎅ð•úŸ1+­´þu\Š'@ËÃÀ2¦Ìan/õ˜M›I6·¿bõû£6"¹“$§Š ë/™T÷„ þ·ÿêŸÖó R³:V‰¤þ_!QÿÛàIæc%µAíßÅ·!Û»û‡ì`l_Ê<Ï_òX¶¦;ÈmN2KJù5%}ë„·*LÓ3E¶ï[þ½‹põoÔˆW(ŸÐ*¾ Šõù§\_ÉCöYr¾¦u@jù×i …@Yó+”höŒ`Jþ·Ô/ê÷LkM‰ÚqyY¡™5ßµÏåÎmu”Svð>9Üï¶I™ nlî²üº­+…0O“„ö0eüåmÐߥ¼2¹NÚ÷å³T~>;ùrg{úƒ_ú{焵²z¯cxé.é])º•År°£+!w%íñÞ s?mQp-é¥W‡;i‚¼F#•`È‚‡´^ÆmùÿöžUeOv²“ìµ·WžðÁw®ùú?x} ÿhÇGÿrÃ{ÿù$cxY¾×·‰¸OèRXm)Úµ\¶×—YÝ<¿ìÒhÜ?ÎŒk^|Eêÿ–Üé|üÒ;½¿t;åŒr{üo÷ÆÃ?Ú¢ ‰ï?žHep7z½Ž“;`ÓÞû…0CpW}&tL ¡¶;’ôÏ3—&íÅ-`Ÿg¬?kÛÉN¤tEŠWØð#ìú#Ònr‡ŸÖCê=‡³å¼î‹ 9HÀ#è]Òƨ˜ 7ÛÄõÖØ Ƶëe`½p»u›}Q9âÍÝC*N\0`78à¿èàòlvdNØì͉ 0©mLeV@/¿H§c«À êÚÅQ Ÿç„ 4ÏÞ³CvØD³ß㣠ƒ!;ó(×8cÙ³ì49:$;uJ·â7”²]f‡MñÑ{ID€²îþ(;(çÙᜯ»8O ž’ÊM6Ç:öÔ˜ä28¾†Ãë9pÊû”ý>µ7Vú™çoÏ[¾Z“â²)£s4‘/‹&‡P™³ D…m„‡?„iƒõÈp=ýv“_|Ñ¥üŠsmJX壃ç¯Í„ H ‹ “#Â'üÿSíªƒÿÇ‘}½è&XÝÀÍÊ›ý˜}æfhÌÎq…> lÌð /ö ïgƒ@c DÐ HסýúK$Ü'è%!,QYø³L†1 T"Ö%’ŽF$èÂåïügy¸cùãléÉ@zÚÃÓÑåÏo‚¿#0dÓQ£ónz$$'nLÁ yY¦!eK@’çG—) ÖÌ¥þJG°ž ]T=ªS‚öúDÂÀ_ò@¿PkЖÀ•î|þ?!ú¿!T æ9Áÿcˆæ³^x¥yéüöô÷ç<Öëaöñ’øHWYýGBvÜâ IDAT¼RÆqDÞ4Ø ìé4ˆ«7í<µ ‚KóÙ^œÌ’Ç2ì;¬O0$“^d ÈèiLd èÔùö±Cbšr}÷t¦ÑÇ©Œ94š1H>Àf%“fäìeüóGû}ÞúþSÇR´OßÚ¸ò’½Œ™„ã¶ió}Šƒ€’‰[0Ç{{›Ûu~c 8Þ3Ÿ«ÙËßE8†¬Çë"Uþ¿lB¶ûÌ©!¥fÐR2PYÇ~¹íV•‚£~ Ù,û?÷ ­;¯ì›j_Ðö‡w9÷'í}¢IéošÝ³‚åqp‘»? l™÷õ NˆŽ”´ZÐÿ® ‡uxVä¿OÙÄ eEÅ%ϵÔÿòðš©HE¥KªèÛ ñ¤<kʼ=L" k$®ã&ˆ¥*‰_þµº\ÖÚ»ÌiÚÉmYÎ]Biß•Ðôí´WWî·Þ÷ÁÊÜ^î²g¶ôrìzÝÌwiÇõÈf®tý}‚Ò>¥ÔûÛÀ%PÜR(s|àç³Õ»¯<´ò¥ØþáÄ;¿µbq_n"ÓM¤¿§ O"ÓUd ÝxêÖiç\Ó(6iS0‘¬PµŠê±5i[­ýŸ¤xŒ1ó³;É“ìd'ûÊÛ+ÿ–úà;¯gNÑ탉«ï9ùæ·Wl?ž<º8ñqò<ˆ kR.ãÿ4¤š³|Ú%âÎ\ ³ßÌœ÷ü:¥÷Ny²0‘YäÔæÊ~k_vÙƒxà–>ƒß~!ž^_ˆrF¹]ÿõÈ×þþ9¿ô;çL;Ô;Ëí!ºœè¸A‡¸³š:ÃÛ 5}@M£1äímúŒ’ mê@Ò|9•A%‡mÉæ¶tЦŽ‘§¶ò mûŸü·°x‡4|Ÿ8|Œ\ý»¾}®H}ÚQÍóÏééXáæ:±Ù çgÊ"1y´ÿ×Þ®wÆÕM¢ïàòÌ#\^_jN´ñðßòkKºœÂ=&£ñd“\É`á  ÈýÎV°ê¥Æ8«tAXt3ÆÉ &0Ù@áÐ)t¾FxÍVfG…ûõ\²XLÉØ«`îãI ‰‚ Fü/5 €¶ŽT—Þ.Ñ+–$ËdJÍe·SûðʰuL•ëý¢­9‡T'ÕÙZÅ(õJçïÿè­{©;´çzÖùåö÷Çû¾è²8 ä¶ã¯»ÎÙ:QÛYvÏ…d(<ÚK=µÿ\Ì#Ó¢v‚>ÝÃø“’a{ÃÆ÷¨èü÷¢5gKú‹0 ÚDàøýØdX'pö¢ î«mã7V|ü½=›½ñÍ·zºÛ½±¼‰.jÉ£ì%¡9u„F—¦×ÉÐɃáÉ@ès{Òݪ'œÓ¯ßÅ»,º7ÑpA+s…¦ˆÆ4-‘¾'t†0AêÀÎÐØ#Ãžîæ i³E÷îh èùŠõýK¤_ 6¡ãSl»ƒÁ<Ÿ5~},V‚ž¸X « 8{YÜÃä“%‰%"qŤ{Œ…Ç`O îX † ä4{Á®#ØGÈô9Wdµ@º{˜-ü²— ÒÖ¨9IÚ ÙN؃­ÿ¹ÙÁ˜`°‘h0˜§ÄHE€ún5'—ZvV 9í·é?;µº÷øÿî}ÿ :õ$ˆýèÞf m<ÒŸ­boáýù>ö ]„A=²:˜ËþY gŸúäébðÈ꘥ÒóŸ&'b€fÉtµ€˜ÖèÿB § ÌQ׈Gƒ6Rÿ*:ø5@èAÞòÂ䕪kþf âŽèÊ/ŒÛÛüÇõܹþB&(†üÿè¯_À±^aûÙŠÍ_&Âû{ºeGÚƒ^$—ñßK†Þðú7¶$Q\ÙBšå¬`“À$¤I½“[¢ I½z4)ÖE?Çòót• ð¨v‘èÑÏI%€ hIòÒOQð-™IµúÌ0ÿóþÇÿÏ9vo`À;ÆbB;.÷È~ï{Û³ûÑðêe iíøÖ\„?Õˆ÷ 楶U„¨Àª¾OkF¼û> ÐOl+øß±˜Õ J?áùÉýÛ– ÏWŸÍ,÷oP£ûÛ?(d€–Uæƒu»пý-ð_&ŠR‹¤(L´=ðÜÏU…£\¥5{¶}·Í·Xá})í¶NV0nÊHs¤h~ÌßT«HjªŠÒÊnËÿÏå?בùxÖ<ìç}·Ü>Ã% Sæû«ç:"“”t”>­”;Í;5§ùd€¶ŒJ]ýl~ˆ×9hñEÚþQd¸J„³èY´–ÂpéÎí Ë)\E3Î1ßLþËsYéóù®‚EA:°hhôõê³nzÝá·­ÛÚùöëö"†N';ÙÉNö’ì•'üä5S¸úþž›Ÿ •6\ML7¸¼öÁ{X qH½¬T³‚™Û„ä´ãurà2ƒ•)&Fý˜vV_€åeW–à9 ±ú}ÞTÑõ…w4N¬vzé}avÊå2¡_ÿ‡,ÞvO O#Ý™2‰XÔ/2IÆFg„Æë¼möÂtã’PøÏ=Ý´ñßTÅ*÷o®œQ¤“%ÿK;’£A!|ÊŒ³±SÛù…²Í?û›¤‚,×>Üí°'{*†,ݾ0X‚\tèùŠÐ/ÓD¼ÙÂGájv;áüÌs7ãý3—“4KĤôAï…ê ®¾•/²£"Ù œ§›ñ䯨°è`Š.ù?ŒÆå™°^:PÒ¡ ®™ß=î°*â_Ìõ?k"ñÿ"²È£wJÄt.¸h^x“øŒ5¹j‰DÁ&O@2$e;™ý‚™ÐGrG• ]—GtÙ‘ÛÁÏì°ªc­ñÚ}vå>n;‚’€ÝQÊ}6ÎÀÃóp÷==ë6¿Èû¿Ùÿ¬8Â*êîëb8y„!y^õà/¨ê0 ’ëÖ>x9wZêÜé@ƒ¸r@œN¯— ¯«e<™$¿gySC<÷‹ŽŽý Û¿>ƒKƒÍ¾ÿt¤aê ßÝ@ŒÎÜ)Ù‘è̈ !eàò”!æ€vú ô=h礲~!„ÁXL>v¬— ÆÐ±Zv$Uï{B\¡Óž 4öDíPY!á=DÞÇdØ5,é'7hd¹Bï}áü눬Ý!ÃÀˆla— z×$ÚX÷Èú={Vï`á-” ÌVI®6í–+„ÞûÌ1Ájçç˜ó[›×½´O¨$,®p¶'† I⤻]V'Xàà¿&lÔ6A|<¢7“;”û.…0&lkN¬ž’Þ ³ô³ˆƒþi¼Á??ÿ‚^d¯‘ɾ‡í„í+CŒÉó£oÃGQbþ,çNV¨ó¸æ¬‚ÝV%þ[ùàø?èGŽHDmŸ`µdÊ–¹OyÖM—qhYÍãíª¦XË%¯‹4Ê_3Ûê <<êüµY«ë­T~²o !Ï¡8!u¿–Ðwü#¹Í•å2©k”‹ªæŸ¨sÄ:õÙÌýqY²ZŽwQMæ£å7Öô@K˜‰þ›¶]—²'+-ø<»§±_®UrÍ¼ËæÛ9¸ÒŸü¿ÛÚ+nú€R>õÛ €¦ohÚ»ÌoÀ¶’ @ùí3X'Ïe'_®Ûþ£È꽎³÷;ö#„‹oôÐeFˆ{WCvücNçÚ÷D¿t\$í Y0§IÎJ¯®ò*Uö¿*äwsŠ ±ôOd§“_ci®vÔè>±¿è×àÉNv²“}ÉöZ}w÷Z¶&ýÉŽñ:z.òkcÚE÷ÇO0ÞD´“ú²KSBBNÐÈþ;@ ñ&Õ¨äøÔò‹Ì¥n2íF)Ÿžã†fn¿ÌN/·/ÝN9£Ü>þÃ-×9rù·l~4°ýi¤»†'‰é&æH«éŸÁþÓµ_ÚGjÈ0)Oò6KVÛÉ­6ÒHDµmæ ý´m§˜4ŸvÇ'GËÅNmí+köØ {Ì%ŸÙN‘ Gm —=òþ×7~íîÒ†tý—ðñOû É)æä¯ wZwqÿ\8[yÞåíÞæúÐLˆ¿+í%šÉJôâjç+áb-,zW0óe'¸ttÎDCäà¸õ˜_’Ýå,z!ª*†Kü4Ò„æÎKŠLæ¬õÉj”ªtVëˆ.Àºõqå÷nŽ‚¤à©QèrbîìZ4›ªz]ev;;ÕªÍa9_¾+}W¢<ºÔãK•g}ñ|ç}¬Üãün8rÒ•h• haé#œ'ä,A—ëјA†œ¨Ýº\D1 ˆ*ºTX¸Ã9I~a¦˜ß•ù…˜Ç›ÚJ)æèÂMhI«SódÏgOƒqorÙòñÅöF·7¦•M 1A2b/tâÂåI…nLtÃÈ4“а˜ è–C€N£îMèbBw‹¸¡S%ì”x s—2ŽÐnOèvH] ò·ÑèÆ›6ÈôÝß “䜰}—ÞAµ'0`LÈt ;l‘d„$ºtÛ¡áœNïaã}úp‰êHï –b‹œ'Û4a²G»ë¤Ø"7÷’ yÒV‘hؘmBÂMí#‰ Š-\Ê_Ű”ªšŠE–Kl} ç`#ßyÎy«{É{>ê\ß2¡Vr}ª)Dk[˜ëöL ˜‹Ënùv qÃZµ®ƒ:6ïW Κ2;ø,דA{Ê»¥”„ÍÛJyÙ\¦õ<õëò2#wbÍu—ãÞª|”¢|ÿÍòÁu^³zgµ´íÓIGdŒùýè࣠3M¢>F™ëá‘$ÅsÙß^~ÎûþêØþQ$¬!ŽÆ´5†' K®ø÷ÆôxDâ)¶³¢Š ‰ý÷ïšÃcOá:í Û¸ À¬ö* €95@þ´HV  â$Ö("ßRp‡P';ÙÉNö•µ×‚ðÁw®ùöÿôÎ˾ŒO´«ïïyòç{ξѳxC®"ýÛB—`xIôAÝ‘$‚®`Ú(Ó&Î…4à Ð2idÉLó4º<Žv›ZuÌó «´ó·öBïÓµßì娛ß>1Fºµrÿß]°~¿#¬ c¢»TWÂx’##íS–úûYö?T7§…¸ML[óSYÀ%¤ÈÊF+ý?“8Ì#u,!ÕJK5ƒÇcÂ@ųÚÁå³>yÆúÉ^ {ú¿é¶öFÊ6Z–ww§€!ô÷/7þ6áì×]ƒí‰ÝoXÜ|ÌýK¸}"´ÛÒ%4Dàb­ÄhÜìq‚eïjð­“ëE[ÜhæÆî˜ƒ³¥°è”˜œÐqµ›dôÁ‰ *°Œýè××w®  A„0û÷^ ÿ2­†"IfL¸¬}ñäÛÁË‹û-’G¨. Ö†®  -é&Дë(l„t!Ox…àhÇV–‹Cuvþ‡óe—û]ç·Y†Qòú]û–Û¬·û¼ÇEìàÊîrHÔ±žyô¿&8KÈÛ‚¾ó>tŠ\? ]OØV ÈR¡Ð/°Dú%¦™)¤€DÔlÚAÜ#»&œHÁ£Êt $Pó÷š;¶ Àõöðå”ÑWÁ>Âõï­~4ð`a„­!7FZA7¹äÿØC7‚ô+Æn…ZG ºdÚRÂŒÝ$˜cVM‚á¹Ï-ÐÓÓIO`A—ôjé ñ†`B„tËÕÚ:yExMÐ;˜"bíCtäò>ýùûô‹w4Õ‘eHñ rý˜ôt€És©wg ÷Vè÷ïû¯Óuï‚\`,‘ԆńË;õ0¢F0O 0í·¤~‹Æüš Æà€ …D5‚õâäQổ/ºÀ•.’Á”<§®&¤ï‹7á웈܇aƒÉàæÇh7‘’ºªÿJ`ÕÁJ]ž”HŠŠÄ Üt¸ŠF/|àc}-¦Ù_¨]ýÓûÍL}[&¸ð¼é†ÁNaãð;!íÅÉoƒxžôlÔó¨’o ²úÍè¤ Æà’è 2ªúä©’æ49%€éœ­`ª´Û( &H¨€äõBþ¸­•äp›¢l*ø@ó õR$Z"¥9·€z3@2Oê+AàxìgíÇ ¾½#ü/ÿywÿùõªÚÏÖ<ü?Ïè¾õ1Ý[ÂøcŸ‡êydºÒ¤ÛAÚãcþè¤ë«×áQ=uÅ N è ¢!Ñ×¥bQ±ðwªL™xbÉ—±\§ÈŠäzL‘’/uXêbK.qbóz£!"9Ê×êÉ£­ç:óbêгÀÿãõ²-`ðŒK…>Ûø¤|ŽÊ÷fr,ÿo ({ú[3iŸ1ÎgÝ·#¨sz…™`Ì=C*ÏBm"à‹I¹NÍ¿‹õ>­Þ—Fög¥c&FýÏdhïIvtwÇëÍRîóp›o¯€í ÐÎ$€æ{KÌò¤‡©Ÿ¶äyg£¶0Ÿøˆ¿‹Ø·QM(c¯cÍ÷U]lV 8èsŠ`&aå|‚ûd›¾ú˜”ï{0ûð>¬½KkÌÕš2ÆfE€Üvg‚Øá5‹‰+íä©à<%´æ|>º¯÷&BMžÞÜÊ {·Ü²™â«-  ]¯%™· "ó¶ú_«ŸQûýLq(K¹7óÏO²S*W·íƒ‰þŸkÞþÍ5qoÜüh$î7“1ݤŒ]Ó&?¯à~]÷ÍJUyE¨é]%0§@î9LÙÚü ÈÏò¿¶ï†»Ýµìd';ÙWÊ^ ÏÄîÃÈ£ïî^IYò’‹{ãü—;®þÍžñq¤»P¦ :jOÎaî`ä´MÄMªò¼ûŸ¹¤¹vRUnI”g%€Dp L~jÔu ä ¿Ë¡|²—f§A£Ûÿ溺Þë+áÉŸHý…fe «ƒBé„”ì¼o?Sn/)Or”މÍgmC¶ŸçVÐ8µ«“¸cooî³#O®§,ón‚õY¶]_"ýû„ð¦ÏjÒ ï3­îÃâc+8[yðÛ”Œ€þƈçNSÞcÿÛΉ/ÀÊû$™Ký§Ü&úNX ŒÆh%}½_{†h<ºN<¾öiöåZ¸<:º`¨ŠçwþªXÕ—„œbâÒ*ÙATQÉw_%äÌ‹„œ'd°å¢ $‚Ä-¢B’{ps Ü‹K ‡Ì”¢ÀL ´ÙÑòüñJŽíøz>1Êç ¯þ_¬ÝòLä—P•§q‰x0—ý_úÞ/Ó½ù[qý‡ˆýÀ«A'ØÙ]žÁâé. »DtIïà„ŒHÚ Ã¶»žú)ÆÎzoF!>ØÁÍ\‡-úe¸3þÖðZ—ú—n¼†×°_BÊ’ÑÃÊÓ{M þW¥ëÖˆ¬YÄž¤‘ia„8Â48všq¥TˆTj…ÎŒÎ}œÐi`Ï–>º`ôq¢ Qºdô)béb„h„\çL] ˜'žd>1ëÍ¢Ã"¬Šç[v'qP!iVˆéëzèÎIáª÷@Îлã: bÿó_8'ÊèIŸ`ýMÑo|KE09wv!Ë,;dÙ!‹úíŠ daÊĪ> ç÷ÑåÛˆ]`¬H‹GÄþ§Ð9³E‚Àå.ß@Ök, 0\¡»½_÷$Xðñ)½ž¢ÿy²Bþ›ÃFA‘5¹0lçãx.ÌT„páÀ>œ'l'Œ®"¶SWs8Ø>gÌ>›¼Ü§¬£ø[C”tž_¶ò)`-`j—!TVj!Kþk¶fp5•HÞµD€#0©î#3pSA·y²P 4ËiVJqË ïd‘—ϲ۠Ì矔Èo? üÞîã¼²öÑ þå»<½¾bõ{“K¦ï œ ô)?D‚];IE;#=Ø*²0Ø©×Õ2O܇y¤µWLQ‘èé/¨)ì0}…+u°û-دh&¥ÌyåZ €ÅÐ(äHù¼­Nùk6–΀ìÏøÝ±}þç(ìf¹ž´’˜ß£P÷U8LfùGy}N™‘Á>KµýÜ&P—ç;lÚgsËš#ˆKT¸5ÿ&+‚þD<"$ò}8h?[…”“Ô4Nuî¯ÎòŸ£ý3!¸!Õûºü·æþ¹ÕôFÏ|ÄG_H­-óó,}Ü `®ƒs4º¸š ½̽f ÔÏu$—Î×ql3ÐßÖÀr­M?-¥×Ó¦\lþí< ž÷ðM©–kÝZ|G·úãYºÞóU¸¯j®óóqêÝä{¶ƒ}¤Öù”6«9ò=ƒÜ"3ø_Êxä¼ÍÇ0šëÀûJ`°£{þB^Ï"äíy½’Ä Ú4&EÝ ÿ¹.: Õ»¥¤ÈáLDy~‡Ê«ˆS¼ ‹»Ä/ÿ×\üÍãu¤¿§HÀÕ\ŸFÂ…æ­úWìcÌé[3ud›2&’±—þ·šù€ ýÁ#)Ë6ok¶•©uY†ù±‘Uûd';ÙÉ^‚½€Ÿ|çú•{±^}ÏÓ \~³gÜ$6? +AÏaÿdB—ÐŒ7 ]Ú;ИG/$'8Ó iÄ#“Å ó߀>bbDOÌ“Ëü"k|Âd…§[$€ö¯fÛ—Ý]ŸÇËŸ´íd?—½juûeØõ~éï]°z'`f\üJô 8™f“êäqÜ$gƒŽÍr´†)ê Ò8xn¯ik•q·æ*ˆƒÿ^:rÚÑé õ±%†É.Wì"ÑÞ+L{´ë‘NsbOÃTòüÇõ¨½e@W ìl…,×Èò úB@Ô0Û£i‡ 70mд÷¨kQÝc¶ 1@QI$5$¬‚ƒÿoü²¼Dº iø+$<€!Ap% YôÆ?Ý/|›XþÉ×Ùþð{gvŽ}˜Ö[‚—Qßj¤­:Øß'llï‘Ó6 ]ÊùÔÕ “çS—"«ž4Gú`ß#ª5ƒüU½FOÏë¼ù/ÁÕ¤Ðsþu­„Íj(A²âN0 du fÎ EÁ‘<¯·ƒxšÁ¼èEâ ˜5ºxifrÈ~|.Óßý>ú~øŽôŠÚ÷Þ€ÇKnî?`ñæ‚t#ŒýùUC÷†[8èÁÔÇãŒ`–ë³>繚ë b~ó:*™¬Räÿ â£D÷ëd ¶‹¼?¾ìüæÌ IDATVBÏï[‹Œ|GWkà\w2¬œeÄ\1£Œµ=*=×&+gá '8õ Úc?«†Ýúן~:ø?zÞf”¹}ù†¼<ãý3ÈZ>2 {ô7‘Ñ·#áóYsö¸ùºR)Ë5òg2#G)_³•ò/Ddç#/ßßæ>cžåà†ü_"Õã¦îç@àø>m¾›[J¥à>k‡QʪÊ<øPúßrdvK(çö²<žvÈ\W¤éY%ÏsŒœæŒr„\]ŽkÝ\·ZP»\WUgæãÖyh9B-mæªQêM·½°ôÝsy5[²/©œ·”ç!ö/Y¹cÞ¡”CêçR/)¤¶m,är÷šã;kssͰ>H&óý–ãÎ=ħ´ýiG$€¹'k¶]MIY uÖ]Ês‘úëã÷ú“Kà3:U^‡tÅ_†=ú“7?¯ÃãÈæƒ]: `º‰LC;˜6Æ´ÍŠB%H úcSö'n|Eo{)ü”ùèá`éP€¼ïÉNv²“ý‚ÚkCx•ÒlLüÕÿuE¸PξÖqõ½Á%ÿïvFü—Âpå eXû‡‘¸5Ïw³£Ê”§,Y>HKYBÕ2N‚«XÌcÃ"ûŸÈŸ÷ÝzñìÕ¶¯ýƒó—} ¯„í?ŠhÓ>‘vNœéÖÂð8÷Í:mÓMDWJÜyNu ÷‰¸÷e!ݤª ¬Ä‘“QB“ãÖ*Ø %Õ´¯:ˆŒÍ?  9µ»_X{ò¿} IéÀbFvìåðe’o^mÿ”8~€v÷°t†Ù‹?Á6œ0–e¦!Ëè/Bž«7ÓÙyÖ:u¾kÓtšÙ“0LV‰ *0NðtkôV õkï…·/•Uo<¾I,:aÙ»ŠÌ*ŸqÞýZXÉYêr Ì7™e" )kü×{=rùÖÿ¾‰Øj Ó+bük,=‚x…ç3TPwÍd/!f:{4ʹîjåDxì®v{ǦìõÀ'Æí‰÷üqmè$µ> çkäâMìü=LÞ¥ïÞ] ¯36ÒI.ñ?M0NèèIåæ!6LP"Rk.ck¯ñTW>‹=èá?ùÐØ«±‘Äú:Fc¿„eÉM/‰>(*J”D•>†}" ‰0@˜ $£S!ZVˆF”„脆=ÖíH²Ãd‘õ‘ÎANT•`BHý¯DzÙ¢ö#Ô&‚,QÛ!ÓÈö ì]j¿ç®Èù T×~®Ýâö Ù»êK!t }@TÍ ¾ëåãšíç „±+ 抂+øûu}TO/cüVΗ°ºðˆþõ}¬¿„°Â´C,"i‡M7 Oa|DBÚbé!iú f÷Û’†Ÿ‘¦ý¯æíiùÝâ-X¬±n ÝS,~„1¡Awµ°êùÎ_DÖïë³ÿ/„¥åˆmYª‰tiÈ:wщ÷=ŠËzà,Ï{%ž;½l‘—EH¹ï1Qd*àŸ:9ÀcÑ=M š8˜ŸÌûÊ=?“2 ÉuÑIsDµbB/KTš´ø5y^ò»ÿƒeN ŒÓæÁbÛ—GÚ­¥ùß²ØâC·™Ï1&|{Gø½ï"¿þäç?Æ«n~ëîè~í)º…i·ÃVv¥ 2üâD£N.í?‰¿‡£×a‰êóÅè$ËDÉdà²,Y@o+Éÿ”ëWjˆ+õo&£r°mïmâ =¹®È<Ž('•±}3l´¤¥Œ_â– ð©&õŸÃÀšm3¸/9š7»¦½µ§.l½ÏÀ6 I?o'oËŸMCº‹„ܽm„¹ŸTæoªšÇq9X‰õw5”rCíKf"„ƒ¸å‚˜ç@‘ÿ?ÿ+¨ÙÞ3Íý5ýOûï3‡ Ïê?ŽÍ5€ÖËÀŽHe”èõZ–“?Ÿ×Èÿú9÷©¥Â”º¢åRëöü¯4טëŸ3÷ñÒE¹ŒzµüÚºqX¯  \ÿ¶^ÝUtM4ý|]ó5ÏDŠùz¼wm9•±Ð”{.‡Bºðãêì#r3)­ìh&šK©å¾^Ž5­íØAPUrúK›™$çÆmP¢äêçýªúèÙöÆ·—/êF_{»þÁH_é.”íGݹ¢+!îè/Õ}èZç ë©¿ %«º§b-q-GúçG~ðùÌešuæïë2w,ßµ~²“ìd¯°½6€W% À£?Þqõg;ÞýOÏHS"nË·•þMAÒý@š4KÖV–ó¤Ð¢‘¢aYºHü;Èï@dŠ.mC*Ì7|¿d³dbÉu›á]iŽqÏx±:q?aùd/ܾvbŒpöË=ë_êèÎÔ£÷w =Jßb–ÿO@VÁð:m}N•õd?ŸíLìG0Ð^ˆC&•ôBÜ;¡DÔÉ&%OY\ÕE:áýÞåŸl·$5Ô,ËRú²L t¿SÐ!<ú˜ð£? \üÚ¡6¢Ûpõ®m€0JÊbÐ ´ñÉpP_wG’;“$*äåÙ¢Õ–¥™ë>ÅÁªŸ<é#t<À<‰“3 À 6{ãz›¸XϱIAálåïKCçѯE[?ãWÑlŽ®(Î.QÜ¡WÔ~V†^tèÙ=RÿÈ×P{—ÆÎQBö”4~›G‰NE µD8H}áëü?vœTW¯œH¯ŠÇ¶[%rˆºôµm>¼‚ñ÷¡7lŒhê`µ@–„Õ›D}‡¾{ôÈ è²Ã3,@úœŸzBÖ{,nIãn&ÒOäRé€ÇÙ»XZ=Õ“ŸÃnþîš·þxχk¸÷NOÚ$îECïA¾ƒÐtrF’€¦ ÷¬7 Õ€öFï7ƒŠ«¨ÑètK¥_ ‹3KaÕ/èû3ú~MŒ^†dti$ÄDg{´7ºÞèl@¦Ç®Pˆ „¸CÒÈ89Àµb`±Hüx‹.:: ãŽi˜èÅÙaIÉÀ˜ƒ°ÙANù´§x=ÚzLyB“<¿LJMÙ9+®.3N‰qôw,—ÀY‡œŸÎ߯ÎÞ…þm4Ü]yôì8ÂpCŸ"©w¶DâÇH|Š Ùn&¸¾FÏíír !b:‚ô #È€ˆ+RY§t‹‹ßú+Vïþá?ù•—R§^%{øá·¡ï 7{ìR\åæFI×ê¹Ó¯•t³DÚ(¶°JØN=‡zo0)6vÐG;ϯÞGïw¢@çÑ®bJì'Hêõ;)1ƒ¨jR†GS—Ò’G½« ŠËþ«e5€¼-2f µ|×H´Wéõ<.²V  €S%º€zþc{mïØD%{§9\þ¤)Ï ˜Éo?@÷O‘w÷Ÿÿ`¯¢}´BþÅû<îw¤?žv\7/gùõæ.P©¤m(>%"ݤ‰pÏ=‚Q¯9Ù þ§&âßw:ÿë]ßÿ@Ýæ›O±ÜnȵþH_’ ÙÄòÔ£DkÏûÔ™ÏMýÎå‰Ì}l‰Þ¾S=®N¾ Äîå\Aã6(>—Ó\Oær§m7•ýQuÛ§—áLÖÏ÷J›h¯3•+‘o!* (¾ÍÏ ½{1ñtR®=Í—VæòÍÜ´‚ÿ™1æûyþ:ò"­ÀÐož¹¿•ºUû¹¦åz9—kó;få€ç™ÙœR¹ºmLl>yïWϸùñÈxé/•ñ:±4yºã1w¹Ý$O\ú¹”1ÑŒ}L€Pƒº´ø`Ir*Xüuô,Ìã÷0޶qÇò]ëÏÚv²“ìd¯‘½6x¹i¶&>üý f°z«ãÉ_옶F®.O¾M.g³5ú_fipIò8øKË2Пj¤±ÝÊYc“Õ懹͹Å~»Åt;b»A³ü˜øðfCX Ë÷:†‡»‡pö uu‰­ ‹™œ•bò~z’Ü—ßü* f É $BˆÌÂNÐm"<~HX\¡!,!cDö C@sQS‚(ÝP• úw"ôWñX6—‚. ~÷Éßù1ò>:“T¨ä' <A@Ðïô¯”Œ)O£ûë…ÐaŠæ©&cÙÅÄììi Xrg3îóIH,αpa ¶ :eÊN¯›öd€JO…e&EuçÔÍõÌm´Ë§‘Nör¬õRäåê¨ÌÏËd#˜Ò˜`eHPX)tKXœ“º{‚Ê…ƒÿ’ëšÉ7€@0‚ LÝ ,® ‚É€mFØã ‡:(áj8Ùk%¶æTa>«=˜VB˜@~:¡cˇF'F\MXÿ˜E79 Nôà ¶ÛÓï’?“=âÑ4]DhçD³0%$™b¢’¦H÷ta…‰§\ŠqÀÒŽ8ÞÐ O‰rÃàreȸõngoŽÏo…~v;ã|%¬ÖI®‘^èz˜¢¡’zubtgL ]2ú±8!¶ÇžH‡Ð{ K› $, HÚCÜcã„shˆ“Â"Э;älœ½‰¿õïÓuoža,œe6n` Ý gžÿi{6{,^#ÃS¸Û6ä^€iBâCR<‡tqãϰ4¢]À–Kÿá_§´^rµ¢û®Ð·'DH!GM.™¾ä 4ø²ÞKXo¤"KÆ6 œ%D¢§8a5a“xj†œIXîŸ(y´¯ÿÉ2IJ2Å4!0"š?Í: %b€xz³@’™ –œM™ €5l¨˜IÐ`5XÓWG‡Îý½5ŸóO?Xºë»Ÿwšÿ•—üÿá%7? ßü‹±gz,Ø¿ó”N„´ÒÖ‡[)sl#ØÎ )i#°S'lƒ“ðɉ)C€>ͪS&©ä¨’TéRV¯¨ ¡Fþ{*‹B (D™£ü ¥W4š™`3`>eR+Ö<:tÒî ´–m¨Ú6×Yÿ7¯ßzå·cÊC» ÿsþç¥rÍVæ‡À‰?LvÜž Ø?¸©¹ ñ¡–E+$>“Ïs´¤ö¶kQ4cêúEQç*à¿÷W*‚Y"8qw¾†Ôûuà?Í÷™ ó5¿}Nðÿóº¥äZ"À!  ½%`dò‰ÌùÚsñ¹LòÏQÿRUXJiÏ}H˜UëZ2AæGçk¨[)¥XêQ­Ow|Ö)šß4½ûsEÍgÚƒ5Ëuž&·ˆ‡%˪ÌÄoÊÉ~ýj9õ‡eÚ‰$,%?G2R.s¯‰®NÑ–D-fË˰vš[;;!¤óÛ¨ÿƒç#V·òQMñ]>9%áiÌç6^G.~uAOY¾³dxÒ3]GÎÿ†VµÖ¸÷òöô®†öYÉu º¤*ÔÏÑS$W¥€”ƒÃ’ûá*  â#v¨`ͧÍëuæV3ö:â¼¼Ìj²“ìd/Ì^+Äíe¥øè_myüowœ£gxyø';ÒÞì7?J¤ÏG¾7¦]B{!íüG…´óžGæåý,Ežjnæèæ"?^^Rpø¢jóל^H¯¥Àÿ“ìåÛÕ÷÷|øÖ¿áéŸïÑôçÂp51mœ™wÎRŽ;C®6‘ö>‘üÿ‹{ô˜zÏÇ܇œ—Y Pú$t]4bVè“èè0:ƒÌüØÑKp€~ÐÎËÚ)1ïËÁó¥Âs}/VÒ÷e¼©+NÔ !^ÜM ¨ç1£-Ù¶ܲ2Ûa©Ô›/}Hóž««mÔû jë2©û ê}OÞî)nR%\”š˜r-±óµêÏÓØO¸¡/ÚZAS×r™Hûuó}~꥕×CUå«Å™Ïói^‰“?×-nŒË_ë=eëÄ^¾ÛGHûÄ´Ï…m†M‰á&IFcxìxÉ´õö˜Æìk#ׯ9²Mþ½t¥©Žˆ˜Oã  µºz×#n‡mu8¶—ÕNv²“ì3ÚkEØ}ùÉw®¿´—ìöÁÄÓ Hïü暸7ÂRXÜÄw镸Kž‹<;ìÒäÑit°ÿ`y*ëTÙÿ49À×iT¨ +äÙÁË,ÿ 4?—OöRìþŸìd/ß~úÏnH“ñþïœ1mq—X­#)Ë…œÎ%å~Z«<™FœŒ¿ÿ·×üÄbü×`ž‹¸ëPñˆ~Fd]A'WÐ º$žÇY¡%]ÉÅœµä9”Uý¯S‚¸‹¤Sϯ\¢ün#AÈû{TÈÑý%Ú¿UP½MX->{Þb¡ñWdå¢.ó÷¡<ûî%eÜ:ÌßÉÑ\û“Øö¯¥µïã,¢xsð÷úD#EEd€ð!–zLÖøø f?…xEúò¼šòjœ¢Õ¿Ñ¤K©žŽçb[ÞÖ</ÜɾtË ÁÛ’¬6"é¢þ¢‚„à=Ú!rœoýÑ t‰ØS.,åï‚“¤ ž§;ˆû©ƒx”¢’³Ù™×¦Â·¶ðûýiù¼öhûßYñæÿ»ãgDÞ}§gy®œïñžDYM†Z¢ ÆÒ€^Ñ dÊÊ2–ûõüø5 YÜ[`‹51íâˆÆ#OY B44È´# d¿EÆ=:Nh–ÚÔÉД`+ì70íÜ Õßg“!ã]çänés&í!$¡ëŒ&}Jg‘å’E/ ‰Ö|™ )B´…tMž ãÒþ÷HJH0´ ž‚G˲:'-îgÙÿKÿé<5º€åCL·X÷-`Ää•Bè‘2|ËQ‚“ {!ÝLˆ=A«E•ÕùÑ­çúæ·OÑ`òá9ö42í…~wAÜÄ« Û(¶QXElÿp¥£Q¼¬§’K=÷9EZ½DQGó¥'TÖ³@ÊÀ{:Ê™ŽçMלKÝ£§³ä?‚JçñÿùS$$ÔÏ’  UößÓ/Í ëˆ ˆÌã©Û ‘ €§ ½Ì RÞÿYv»ã»ÐíÊo? üÞþ½¢¦þO¾7ÑÿÊ#ºiIü’LÄkÊm#ÈFeBA!]{Qr„¿·}}›M£Ö42y~c‰:Gÿ«yýŒ’?CS_½îŠyô¾˜xº üSrdÿœ@â/|­é'ÄU+8NàëÅL´¿þéõNå¨úMÄë<°· ÜÏHw«üó,üd^¸ø‡Ø-ß¶Qÿm„w%&”›‚y{”­ŸåGuWËãd›×ZU{Ï0;,»·%×üíq?P!×VÀëB§´¥[¡þÜþkJ+ ³¯·ç¯‘ém„z-«v×9n{  ÙÞª84àÏYfо¦@p¶T.‰Rj™ 9†Ô üÿ|žVi TkLRV²J‡@w£®PÊ6=£Ž”¯•«?,á[EœëÃLœ©%P«Êa™•kÎD‰y§ü{¹uüB*ï++Ö§øÎ3NœÇ>û±þÿõ_èB蟊ø?¹/ YQ°‘Iî¿ÈØÔF­IØì7h°ÛxÁ±qzIìþíhÏ×Ö÷GüÖËÆòÕÀå·{ÆË’+ÒŒá²Dýo3i½¾ßdÆK•åÞHg)éKB¬‚1,…EìèN_Á–w‰á”…$Æíû,Öè´gƒx*á\”F ˆÈÀ¯Î;U!„€íkô“ï—)²ß LÑþТÿ}¾lg¶OYVõß“ÍT>ü0¸:(ri‹¢zÞé@©Åy‘fm•Ÿó'ô`_T«N”æü›9ƒ À$†+%`›a³F–gHŽ˜< ÇÓS„Œå÷±ñ-$m5,øqv­¸ @õ¦æijë<ŠdîÛ;Àcö|¬ù¹“!–˜á–Áiò~›vjr§œ½Ø# @‰ÎÝÙ&Õu[ʸ Úšó¾|v*)³Þí£};Wxûua}"Üï]Ÿ¹Ö™.)‚f#öæ€ühØ@î]i&ŠG«úÀNÌ’ˆƒ¡¬ˆá Iç„þIW„Ð4‚Ôd4„í€n“þÉÕwCI®4 £‘'‘ᢺXkæ†Þ°kc±ºÑXf!¦ž…]Óï §8I@{ºxŠÈÒPrFò†<\Az€lßA.ÂúëÐTx*†E'ØR«ˆu LOètUˆ,#/Ñ_aƒè–¬Ÿ!ÈWõ=èÞ‡ Tá['¸VM.@ÍÍ yúo¾ðy®^ œ|þ¥^âöào/àOòwn1¼sB~åÒ Ûè‹ÉAÿYu’8pš©Ÿ¬ àW -ú @¿ž¡Á)Š4NÀbëÍ¢ò˼ŠпÊýkûˆ ¿í«ÓwaF„úh}¦§a Ì{uƒþê ÿü÷ŸÂ=“‡KòFXë«?HaìòU郭’ß¶ äm‰è_åT †ÂIBFôâÊK£º:H› ¿æÜVq£à¼àõ3RSú˜íÌ˘‰§«0!ÙèeÌ„äÉ&ȦŒ•xRÒH!ÌS”DQ˜ƒ…ÌYAÊÚù›ƒÔ;²ÈóqÀ¼Ñ@Dzḹ_Ïþï& VvÞ£™rÁ,êÛû6ÊüèíZ—…Þh+Ø?ên·£®Û9ØÞåÜ€rwºÅ Bµˆ[ûC%Š{žó¾þŒPˆ×6#ž·¤D·½Mç;»¶™H¨¯¯}À=Äk‚:]ÏÓè·í‘Úò´~§ eSÉP:¤X%«³Álýñi%bÁT¾æåÅ0´üú<„Þêï4ð¿–L¶Ü™‰l±_¾ÚU ìß‘¹IcŒÔoI»'SÄ?­ Mýo¡‘v§£µ2";÷½nò:ÉÉ#å²Ò¿·<;æãíé••fõnÌרþ5ïok„Ÿi>©(ü`ç3~æâ;À§È~ã¯ßç þ”°RÖßÎñLɽ§H–è7;EA9r3%²QÀ|Û |,ŸXæv´£íhí¥óP¼õõ«§züõý‘‡¿½!gcõZdóÎH‘+¡.Ò ÃEryÍ>£ú÷F®0^®Ìú¢ IDATMQÿ¢žb2  3G»Z‰¨ÚmÁD€4õìD÷ÔÆOæ_ýZÅÒìBöÁc£øBØü?ÚÑž¯]}gàÑïm¯9ÁÕwzg!«3ÓÆ%9é*Cÿó6;¹«·þ«ã3Ë„!:£ Fì„pëŒxëKÄź JFÎîÀ‚¾‹¨Ë¼Fu™ä€¢‚ù1¸ügAµ€þAA…vÁÿÇÉûÃGðP«¿]Õí+¶œ³¯«²ÿíüÚ÷~æY›ÝGتS' Š­G¸¼"GEÎn•/=DRÆÒÖ¥¬¯{—Ö3m}‰ŠÃÖÃÍû "…\gDæ$€ò½÷fõ×E«žµ£=K«ÂpvMÎÎ :Íè«‚¼öEˆ ÷±õèýF2š–G„O1:’ËKyØçé“„³K¹97=Š­‚ü³7¸ºV;›Õ¾»È¼òF¢ÿj ¿'¤"™t¢Dƒ8fÇbqš'Ã:#)úLP§SË{íB=Y·¨õŒiDÇDH£·9@Јv 4%d³EÐ쑪!«N’ ƒãjBTw¦oèàÄ32\c,LIf\ 0ˆ—™Û#œŒB×Ãj\³ŒpmÈjKè. ñŒ¨'%ûz†´Á†Kbÿݾ^c›-)'dé’ŸjJè"q‰«ë EÁB øbrÑ Eò%f°Álí Wˆ°@&`’РXP¯££!©v#p-œþ»‡Á8悇+â_z‹ðÚã5ã—=lƒçPžKÝ®Ydr_r¬ÃʼuÙ#­{Ŷ1¥õˆìQ}¾¬÷Üê¾^r%(šÂ”c=4EÔJô%z:,x|¿‚,”Èÿò QѦ  Ur}u­T`ŠèÿÕäî£õ×¶ÏûTžŠ…ßý,WçWèç{ìJÙ^ždÒV°µzP!?òµ ]&¯•| WÜÉ[õ¶tÛ*¶Vd™Kô¿•²h  ÓRç½`M…Âbvù¯\È-&ÉÅ”ÃÍ®ài,¼T™ù²wÕBu'Aù%‘šG¼ªRÔ4“*…ÏOkø¢1ëG–(ÙJ ¨Økû­ƒ€ÿ¾ÉÎì¢Ûþ+ Y·ìs&r€ŸƒÞ€•w€í}@ÿsÛ¿¶sðßöáÙýåi½ÿ—ëd¾¾ª6ÕÈwc‡P»ÔFéBÞÀ"˜)R¢Ò«¼³hshI¬±÷Àr½fÚµ¸„gè΀Ù} µ©Èž @% L X¤ ¶¦ÒjW¯_eç2V;^+3ÓUzú¬Y¶øÒ+ªIåwÜÊN®* { ÿT{ +=mró>ïÀÖ;À½]»ÑÿÓX¬Nk?^½ž0mÏJ÷¼¡æ§)éD¬ÝCk%W\Ãü³kõI={{jo{{È“wß¹®}$ùƒ¾;Ùå×þàƒNø‡Â®ßø‰ÿø·¿² »­ŒëÌx +%§\T’m–þاy°IýxðHÿº.¥ä\'gÊÉõ;–v•H…³Û””™R+ç½iWle¿8*G;ÚÑŽöÛKGžZ€G¿·eýý[_í¯2Ãu¦»« Æp‘YÜS™G÷‡ä/Ñþ'»Qÿ9–Fl°â0Sl( Ö6ʬ±K21ßj£eSµÓ0¥—ÒŽàÿÑŽö|íâ[=Û#wÿô’´u°\û´-o2¡ÆÞ×y¾1'Hçõü¯ü¹3ÞL™€(¹ˆC¦#¥»2ý– ™¥(Q"Ò/‰£#ŒÆLgJ§F—ƒSº"»‚£OCÀ•tú#tñÅd›c‹Âq›I5‚ã–VÛ±âüúáþ«'†ê‰+›<Ý ÅóÊæ ¹Qì<°t…,ıËÙóÑöâ‘fà]-‡SCJôû‡Äo~agH*n³¦ÌúžÉÁcz±MšsÐÌw¢†®2úê wþ$dRü‡þ¶3yt¹wášÄš`' °ƒ£-üÅJGt ¶ÆòŒkÏÁž²;O¨Žíâ<­¬£R€ðêØ úÑ>¤]vðµ¯Ñ¿·áŠr'ƒ £yÚèQ^ÈÁÄY…Q MFˆIq~øŒ÷Χmsõñ‘ÚS}[ú¹ Œ7¬ñ¤Üç:~”Ù… ³òE‹þŸdÿgµcù—ËÿáoF¶¢Pþ&%†zmÓƒº Œ¾×ö¸Íí„iåyº“µi»†R"ˆ:í~ÕÁ÷ì§ÄIyX©vTœÿl±6^4Ûëý¹ ‡ Üî?_;/¡óFþñ¶ùê1Àùï÷œ|>²z-°}˜Ø>Jt§B>0^yôÿpá¾4d†Ë©½¯‹ÿHŒÔ{ŠíÄU”ÇJÀ••ç*Êi6}ÐoÓtOaZ×ìE,×G;ÚÑŽö ÚKIxão>üDÔõý‘ߨ֙ÕççßÜ2\d‰0^eÆkw¶^}'#BŒÌSŒ3Íú©AJ•á6[š5Rr²Ö0Ùl¾zKg¯JÆ5’ç¼ñ:4¾?6\/¤Áÿ£íùÚýÿûŠ«ï Üý±%~gCÿÀ ^ic ôO%]Ë0$—ù&"W%xåÞ¸÷“Љ$;##,”³¥VÖ­8Yœu‰J&’@"«A ƒ²;¶¢yYŒ„*ÀïRÿ¢ÎÌÏfä,œÖP©2W*xÖ‘þdõT¤8½bð6KçcêêˆyÎû“´æLiSš£¦É>ª:š†G›j6dÌyº.3’zìw.×ïYük†|mÿä]ÌäGÒ96\bÃRÍ!!ÕÝ"ñlï}F„Û(»Ì’£}{ë®ñ•?ÞÞ·ÂsXlŒ´–IÁ¸èAãDÔ¥þÕX¡(«D)iWBQ§–L$²ͼ­Y ªN(‹Á·Œøê áög½NùþŠXD$x>ê,ÝšÝ7n=ý@Ëp= ›n-…Û§ŠH’Ö)sŒ»¯îÝUâ2{€þzFX\³8ÍhÜ ¡€ðÙÈôdÝ`ql· ™q!ŒQg‚Þ;%Þû2ñìu$ "ç çd3D¶LаK˜F°6,?‹† șܟ‘¯¯Ÿ­kÀ¹é´Eb¾§“ªUpZ©é +„Ì\= Ø!T;À ˜Ûntó¼<Ï€ÿ™¡¾7m¾jçcŽ;z÷µöadá?ûW*Œ{üŸ€ÏùÛô$àÿ1V³J_{vŽN&ž36áˆy׻ޤBâå\gŠÓºv¥³-{Pç<³§aíRg3{±øÍ¤Ø2;K¢\‹Ö÷B­}¦ô3Å?`éJ7ÁŒ,aSJ…Y´&cå“k´ÿü·Yº€z¿÷@ó9`º `óê~§ ÏÞ£Æ"); `™\î›Î”çðréó•L3½÷=µùóx¡œÍ'•< _¹ }æò9ýú‹ea%Ä;ËW#ñ¶²ú|$÷™n<Èf›‰wàÏ}¦«ó[CW>̓!f¨yúM+2’zªäÁÐà `$ké¸*Æ‚ÙN:决ìEûœî“ŒÒÌæçÅßö¦ûëv´£í³—’ðð[Ö÷ÇO$Çâù7·\~»§»£Ä³ÀúÝÒ¤krrðŸà¹ŒÓÖ[]d7¹ÈüçÆVËæà¿t% 2P¤j‹¦LŒ#.2á$ §·Ë€ê–×hwA§ˆ$D2– 霾¤H*«yûF¦Hb"ˆGü«xjáb›Üͧ´õ,P祪qû€x?ELXq›ÿ„@ø€æÈ+À¿òÜèÏÊö¯Ý‹ecž;]òt/Ú½qǯá’یے4—<×±úÄüJ§.k#”`ȆŽ@p§¶ˆ’«›¤9G§‚0K‰ùX“¹óéhŸ¼5@¾,| H‚mA.¿M:yÅÕû/¾‹mÍÁ0¬a{…tï!aA’€XF­YâyO èÉyCÎñlûÛ^aÈ”þ¨çAn¡XÅÑZË¢Uoã±h|,{¯3.î^ž¨KÎâþíl¤Æ-ž"Ì ðo`)h8È Í¾§ v ëЃbøp&!@L™ð~&¾ýÞ&¤ŒnŒÐ+‘ˆLPB†˜ÅÆLc¶ÂÕFLxõ–rg«!tž{Àè%q±Íܽ%tK#vNË ýˆ†§»A³+XHŸ`=`Û£B$ º8E»W ñ.¦#Â@fƒ0 \‘¸&°뀭ËrÇËl\ȹdž '^U`¨”ïdÂïíú„>Ôs\½>‘±éËnþN„Ó3òƒÛ8\Tò«§åŸpBZ’6õÊ´H£×iQ§Ø‰ì/óZØQ U'²P¢ÿe’1éPüBx‰gàé.¸:Y}Ì+«Zîê$7î´µûƒø:}<ø?9²×Lj4f_øÉG„_ý}ä§În/±Å?z•ë«K¶_ùc„´R¼ÄÖBÞà©7‚] Ü6òZ<Ê¿3ð43 AÈ£xŸ,}^Æ’˜<‰#· o³ ÛŽ&í_Öù<`¹”Û•l2e @ ±C h_Úû¢ÐÊu“ö¯åÓ©)»ªõ/ *»å·EZW‡;Kþ =ó}˜]ûŽL}•¯½û­ýIë¿J9‡)JûPô? 5§»–ñżï\7¦u6dwæ+ÐKí“ÏÁÿ9¤¹Ú²»í í]é ˜Ý¹­^s%Ì×Ú¯ù~|6¶bçz&"Àþ9Ö4uÕÍkx–ÎÂza>?O Ðx%ÂÍíeìÊLÊß¿SÆZ…4#"%Ç})Kó›)Ó3¯Ï×Aüv' à?›7þ[Ô‹ôŸÏþmóÝx#”­½WDlç‘·¢~ÍÍ.Óí4øŸÏûîóõÓX|:Ù9çÇÙ¼ {9à‡Ù6?zŒþ¯öÝÿý’/þKg\}{`¸L`x@ä§ÀÈ4YäûëzF÷uhQúÊ){ 2À¶e>C^[é7ÖÈÿI TΔ”wp•¹*Àc©DöÖó„éÑŽv´£½„öÒz)Þúú%_ý˯|ìï¯ï<ú½­ƒôQè$úËLX ýy"­3º¬²þy’öï÷¢AëüLž&'\²fÖ01—¦±ÊTã 4ÍOµÛàI/ŒÁÿ£íùÙõ[Wß8ùbD"ô2Ý-#Üäm&œ@Úñ–’·™´$©7â-wö¥m&m.1àÐw抟V«¥²äÿ³¯KÉïyt<rF™—+ àŽ›*û©îÊ™<ú³·ê,îÄ?Ë–é"Rr.HÎX±>¹ÔvoÅ»–‘áU]­–mòÍAçÇ$‡VíiÚ¼ÿ¶ç&$u€â2À[çpýÿb¬O0„¢% ¹ÏÈfKQ,GrÜ`vd¦Å ½!ç+4=Ķïb›ä~ }* Uà(à¿Í£‘Êé‰4?ãÑ>†½ÿéÎ]þë7ñöçr ËÁÈ+Ðd„Þˆ=PƧœAG!C X)`™)ËâʵѬDŒ0dW°ˆ&! U‚H;fÐÒ6aÈ-añê’nù ßW¶¸w8]1x{²\ ¢Fö`k$zU²²qvŒŒ†¦p—ù0‚ ˜“ZsqúWa +µYɇóϱðX¸‚œ tÁ,ùF!™!:ŵèWþ»?Ðs¼÷O£ÿ9_°üWÞ'¼>4òûüãªxÀècâüß8Ÿ úïî9Ûf8¶o›ßó-ª¿í_H ;=nñs«²ëÜÿgá“NùEð >i8±G˜L¤€ùml:ÃÁ©D‚º·M%{žÕ¢–‡Š¡[!Ѐþ¼£PÓìFÿß$•øoÎÞ¡öƒÓ•<özço’ìo›•‘úÏöÙ!xÙÉX©ÊúúÅÚ_·ö¯•µú;•Ä_ßÇC ÿ¡6æùÚó‹þ¸üÚ§SIç£Ú潑/ý…3N¾Ð1\%,{º'>ðXÃØqUümãÝRZÚd WQ° 0xoÉh9XS5ôÊÀË·ˆU1·šZ‘i|Úâö Lm÷JU»ãPê–÷ïÀ{z´£íh/‹½´€7þ—‡›ðà·6\~»gõZ$m3Û‡‰x¢h„ñ2“ÆŒÔù­¡‹êÏœ5íRNNÔ‘Ás:¹rÄܱaSçÍf¬´}éÿ2405.óõíEµ¯ü;wàÿÑŽöœìí¿{ÅÅ›[â™°y'1\eÒµW¢ÃU&mJ=ž=טM¢LTÚz DáüOþ]ŸÑ”YÆ ÝH<[ï~™ÅêKÄå—hú²¹zŸ +$%D7ÕcK$Dè„;1‚(ƒç{VAƒ6Ðþ“䟷½ŒçüQÍÌÈÙsa sÂÕÓûÁH –ÑAY0Rn0?Bva0D=zÕ^QEK®n‘ QU@NØÉ ²8…Å)h<:*õȸÅ‹`@ÄZR¥!Í Ë„I†t2ì;š>ýðµÙƒÁg=B¢D¹^—Šë ñŠJÔÕ"2ЃÄ“k²ä×h¼EÖHN ±¯±þ¶>Ç6×ÈzðüÜT+RÚ¹I)Js¬º£Õ½*?¥üãs¸W/¿ýÚ«[./…!Z‹ê8Âr„> cÉŸ®TˆYŒ]mzò@Â耥A.ùWT¡ªty¾ÌF E¬ê_\äVD¾ðS¤Õú„<±Ñë®>ÁhÂ"‚ F,ª%)•ÔgÅ 7B?A Ù¡¨ XÎ [üY]6BÂÓ¨ >Þ®Éãûh>+Ò¾=p Ã#KEñ" Ôô¢‹=™¬[4\Ñ}ñï|bÏð(ÿú½Û¤7{ÀH”ü(Ài"_©G^wæóWЬ²u ü°uVUàUʼe_/e^rR+Y)Å€¶ª…¶º|z‰–¶)ŠÚ#«]æ?Htщ¨–yb‰µ ðwƒ­X=Ð÷y, 2«ê'8£Ÿ7ØU³ÆùI8L=æ/¿ùé•ûxB~ذAðya¼¤3r²*¹r**Ñ0+’EƲ`£Â퀤N@ékY,QµE²ßL¼Ž-‘ÈÞ›óÈþ2/5’¾vè½î3«€\í‹åBbò2jÕ¬‘ÿ¹Àþµ^vr@¥”^¤E„¦ ¾o(å±²Ÿ“oÇëÎf:ÑtZ¾A([ª@µwØ=k¸ãìÿÈÿ@ÿwI»Ç¬ày¶ê›û;$€û!Áÿü² ¨Î‰L˜@&›cµ;]p›]ÇÎÙYÇs·®çy¸o‘y9º¹·«`XúëØdƵÔ+{ Âÿ³·v'`¿FýÛ®Ô¿å‰Pþêöö~ •”í'w¯~wnCœÎ³)F”w³ÒšÂ^ݵÌj}ö%W¬4€zä‰tÖæ­ÖʼÓ6 ?PŠ™çf²¿(7Öíl»ñÙ+‘ró {6Þ;ÊÿlßK¼ÿ w/$Û÷GWëêh“` —ÙSlöîcëgA•i0 §”Êy´)…ò<ê¿Èü·@˹ÔÿàÊý¨þ¹:£¯Ø» ½¬íhG;ÚÇ´—–°y'ñàŸl>R´ÅúþÈÅ[Æ« ~kFE"¬ß¯³“®3ÃU&,(¯3Ü:®=o\Úz®‰Ò. É`ƒ‘|ytUœ<0úzKPƒýæ€Öàž—Ú^ÿÅ3~ú?ýìó>£í‡ÎÖ÷GÎÿpK1r÷'—ôçN>û‘Žt×Nê¯ÍI>ÙdOá’ y&Sö×þÕWùÃ<²¡’ –éR&lÂå#âfAБ-’ÖÈfMè/ÐÑ#ÔÍ•Ðäÿ!(ªŠÅÓ¸‹G]ŠƒÃUÊ?Èn„PoUöG‹L¿4ÆN°¥±Æ%Œ" ÁooV`)ô"äÑ tYÈ›%,Fˆ®VÙëÿ 5K„ëlõ¸¬®»C«›ü|š0"BX€?ê 2^† 9Y‹ˆFÁŠM2spVŒ(ÐPRöŽâ*& ,´z²3H4 CëÑHøyGJJ-9ºÏ×H÷&I¶Èr‰ƒÿïÀ°Á$£)"‹Dî¶Eñâ$ ñîûÔžáëGÒ/\uÈ­5 ¼jÅbŠ™gf«p¤}v€üÇÖO2Û({ë?è»nÛc ÖoÜþ‘«ÏE†‡‰pªôW1 mJ°M”¦šìäo“µÃ•–Kj Å¥„%ÞŸL¸jÔHŸâgUX†ƒ€þþpºª0ÞáÀòÑŽv´£}Šì¥%|ïë—šðÆß|ÈÕw^ý™ýy¢” 'Âp‘®q%0Õ¡ÑóLæKÕ„ÚXЉºÓm9HkÀD¥5XÕ7n4Ð@~‰þ“K¿,Oû¢{Ž fËÕ5HÇFê…³×ñŒ¯ý7_xÞ§q´£ýÐÙúþÈ»¿qM8ÎþDÇxíl÷“ÏwŒ›Œ­„å-%mŒh™x& × Ûú|NFÞf¤Ãs''+r€ÄšŒr0ÈIˆ}¢ëÎtE'k:»"ØHŒ°bV‚vtA 诊¨r¶ „èƒÐv}™ÍW°_øô¨¼¬Öœ#Õƒ?ƒ ÂŒ«ëìån§+÷²Æ`S_€Bè øj–@ÑâöB.ÃBḵ@În¡gŸÅV¯Aø "· /$¶Ð_’sçAþŠËAŠaa„l.Å)Ó¹ŒМIóŽÅ9㞟=)'åKû>ÜpôKžË15ˆ„Ö~c¦€ô.;\#c ±Œe#§ÃéN~Í¢ÄÊ0$rŸ1OÚÞ¤¸'ð£Wóî©Y=ïrΟ…÷ã±súQíûñ3߆·»ÌÃÏ9të}£_1;°’¢fØÖÐ K<¢?„ì0Q4Ðls ÿ¶ Q|þT„HY6!*D¤ÕG*uY”ö'¦  –‘>¿ÿ¦?òKa±ˆXP4xJ´«š«¡Äài ™Mð<ž*B®¶j;†±ˆB4¥O™a›°K2](±mYSBÇGÄþ– a„”„ Wt?úûÏüù­^ œ|þ¥V"Öýw?Oÿ/ü=º¯]`kÁÖB‚ƒ¬kȽ:;ŠK±o¬Dû»C˜ÙUÉFµ‚©d£ Š•hÉVYØ ¥,`ÀÖHqiËÌžúSD©€ª²%e¥'S¶u©ù×çç7³>ÌûIE¥"³²wÍ5?t‰¤!þnµÆ•ŸxÿÅ?þTÿñw_ãâýkÂÞ†ؾÕH^ì"À*cç|ÑÁÉH¾*$2¶Ul+³«Tʼn:ŸÊrÒ¢6¡MÖ¿©LTÀ~âëØM2ø3`GÑaò3{Æ6-1ÛV·ú«)¤•½švB§ôð+7Êd£“eÛ¬[‰þmD€ Dï‘f§û!lýa:/©ª3L„€9Á´Þ¿E• Ô(ÿ9|Ü8-\¾Ll¤} àuª=Ž0E·[}×e,njM·PoµMghØîé6€{wÝ‹Öo¿a{çhÔ\÷‡v=ô”lïNï=ÓÀÿŒÔÒˆ{¤€í‡ÀÿùûÀN¹ºq-R{¤‚ÿóäS9™HTQßÛn/SRÖôåø7~·ê²|¼3»Ä§d7‹†<¡˜Ëlœ=ëIÈ4ý¸vùµgßÏ|Qí¿õ/ÿÅÛ>NX ‹ÛÊêUWZNƒ‘móº´WroÉHçÁ”áD’ 'CƒÁ5%¥²”Èœ©lÓ‹ õE| Sr ®œYÍ@tšŸuªf(ž}¡>ÚÑŽv´gd/µ§â[ëÑFY¯ï\|«çäõÀ+fÙ¢<»;™´Í„¥ÑÝñ†G—F JTèÒYfe\Ö¢ôDSäv«éJd¿Jd–¹´\æ‰ò4Õ+“ÿÁ¨Cd€©çïvl¤^(;‚ÿG;Úó±«ï ¼õõ N¾¯2~sC RýÖRç2ìFK[n÷?ñþêï ?õèé=àçhúæ]RÊ\Û9ËÛKìò„|Ðh:²(z°e r‡­ ŠEÃz/?¶2lôô[9AÜw à†%õ Pó:*ç© 4ÃÂçÃl=4pÂÀË“X}†Ò@DiRüµDȰ§e»6‘L.åÕz¼,³hÓk¼IL‘%+¨˜‘ è_cþ@i?néO°‰nMοFþW@Â'"À®•·%ïý¦0õ¡gûÎàZæÎ³Ýs~šàÿü\æàd]ž¯÷û\ß ·ÁÇÀ í½_zÒY|ÐÏÚöïËSþ­C$€CD€å½uÿ'"ò.å#ßîˆií­)ïdAþk½?)CÌ¿Ÿ'd›)Âßµ ÈîÒH(ËOò1¿þç' yÜÂnèkfeQž|عm¾úö‡ÜóÓmÛ÷G¾úWî–À›LŒpªžVsÈ„…"ZÊp0Rñ=dõTœ9Ôy#©O…<¸:@î ÷5ÞfEayIiYÝŸRIVÚï"eÖ0™¥\h̓Qö«ëvÞ­gv+v´£í©ÛKMìÿê_~åà¶÷sÃúÓ/Fr.ßìéî*i“ý³uyԴͤ޻Ci7EŠfã9jBW@¡\;ŒxËQ[1w¬µóF¶åßÙû§{ë¤Í˜j;ýªâ8Øþ©ÆŽàÿÑŽö|ìÍ¿ýˆëï œ~©ãú{#›wFº»ÊpÙ¼—‘…·™í#ö±’ÎE!o'ð\ç6˜¨yÇþÆô%Š FÀˆ&,r.€KbÉšxr—åÉQë0Â僗þ—àó¡8žƒr²T$¸S<èø%ú_3s¼½atŒÃ„ۧаŒ~4n-ÕÓd8éüÙ&5+‘?Åí«âþ›(HÈЙÏ/ÀVº:C—¯äUbø èÈÑãÚ÷_m09Gì]KH[rîAÜ©KI7±X9&|1±þƒÿÕÿ›Ê¦0»„ɱþòÙä ÷Z”N¢Cn'Âk ¯|ÛòþÛØ£D^çÇ@s¨;¨fÜñb£Íž{¹K¥ßiPsàßAÿþ7idZ?Ó¨Ç)÷xò§ícÚy0¾ò¶ñ½-¬n)‹5 ½Ëfv}y¢FAGe‰l«Á1Ô˜„.9àGaQ\jÆÂ<ºß „Q`)°”)Vºa©JoæÑú"®Dcæü!4ASÆd²ƒ¹\g/“¡Z K«~  êpU%¾HÊPRñH0Œ¼…Ñ„4€v°ÍB7#Âí¿òîszZnÒÁò•À½Ÿ>¸ê_Ú_*Yý“Ù#ÿ7‚¾šÉ£ƒ´Œâ2ìƒÀ ÈP)‘Ù”yr±')uÒl¾Ê²ç¡&"€f'H²TÙô€æš'¼WW”rrÚµÔ½äKÝ¿äVïtéòêшký'€á˜Ymä©à~«D I¡FLÏ%âç ¢ýäûØð;ðS?•Õ¯|ç69Œl——^޲Ò/¯ÈkÅ‚ÂXš¥R>è [+6(¶È>…œ1"¤Œi!Q$W]rlO‹š„b sS,‚ôŠ ë22*2,dF’’Jº+ef.ù_ÊNãÍA}’4’Àô w s&˜jÒ˜+{õu1“Ø—2Ȩås~ä Î@gï™V"@Ù^Au) â ÙóÏvߦ2=ó ø/ ˆLþ¶z–B#¾Øl“-ô棛°M&}¿ÿ8ïÇ«û”Ï4ô ]eŸ;c±yë‚þ%‹@þäþýgýhk6ÀæÄë¿xëyŸÊó·«ŽñïŸ`?û˜Ø»ô΀Å.”léÌAÿ’‡Ý^!fdöK™Ò¦E íýB%¯é›Ìzþêö š¦hÍ‘L‘N¯*ø,€‡!…¯_Ž)0ä *‘l#ª•Pˆ,S2jNóCÖ0ià¥ùoPo%!´~ŸMbúçÞ"ýëß„Ÿ|øtžåó¶Kòý}ÚTß]a!!"¤K·$˜§“è©ä‘A¡”› ¼L5›ÚÇ»m[™ºz£2Ea¢–±ä÷‘–`¾>—ç•Jù«@ÿ,E€—ÇùN[]¿QMÿçjunR¯ðòWHSG²'Zù)Ä)muÝÓʯ7ø\ *ÒR°—  î7­»Î«ƒ [;iç!;ç3ØàmÅôîÕ#&LkŸìD» Æ> §ÛM=ý¾«`¥*¥cJ ³C}„Ó–v´ÅÁ¸ýOÇæÄæ$€D€8*¹¥öM&ð¿g6Oý¿G0ùðÄ’yyžÝ—zîs‚È ÀßíJ¨D›}·¶gx?5"äR&æEª–W ˜žÒ4l”uö&ÏÄäÀŒ´²û'óíןÕE­Ž’ï×çeôP;¾ýÑ#àwþÆ{lßOèÂÛ×Í»‰°ôù¡¤DÔ[ÃCÒPJ‘¥ìΕ’÷°“¦ê:ÚÑŽv´—Ü^zÀÃolyðO6Mzñ»ÿÛ›wGnÿ©ŒõÛÝEB$­3Ý-•2¯ˆ:H´¸«Ä³" ]£?GÃ’:àŸ'rÀÄ.“In&ÛayÿYTÿ ¢À!’»ó7ˆÌÖïÛ±q|.¶z-Áÿ£íÛå÷l$ný©Ž³‰ôç NΣOƒö°´Sòàþ.%6}lôú=”zß×}«ßzãö±BÍ™`™°5bŸ WïV[u7—è•¢½ƒ aÈ~œÑU%jBU}YJnä ºÌ9À§ÌÖWÀE' y¼Ãùh?°¹³0¡C‘òO.Ö™wÏ3)ý[⹬k a†E¬Jž÷z]^RºÎsv»œk}¦Å³¢ŠÆˆ…ã„N– ®Sð aCÖ×ò£€1†÷‘î XtÈ6¢Öéw*Ê09"«¯úq}‹ç\¤Ì %W\qµðåõÖXwbu“9˜2Ä@#ÓÔè —Æš3xöŒ‚§ Êñ.QoAØB8CTÝ)×§ÊuV £¤|°©Â(NÃé™[IEEÿ›‚Uñ*Τÿ'ð_vŽ×ÎûhÛìg—üø?øÃW2ËW"‹ÑX Èè©Ê† ä!Á æe={Ôý¬½/Y•1{M1”çðiå‚<5€Š d_/Asó}’”ïj!ªAMÙÛ¢IÄᩚ†3¨ÿ" XiïüûÒÚ2/„ý›mfA³qroÁêK9]b›¿Ç«¿úç÷P>„|þ¥RÿÀöþÿªt¿ð€îõôh Ç€.²KúŸ*¨÷¯Ò¥b ¯Wl[RåmK%µò¨mz….Oê#ûŸ\¦&%5-_;¶ ܺ€”´Ú@ZeŠÒöÔŠZð¬ê\Ö¿Lë_¶H’@°‘D$äàJ¾ÁÓä¢$ó ä„&Ø¢Tˆ2O©RÏÉ ð?¥é—¾ÉðK߄ϮŸ×c~ºöö)ý?¸EÏšx&Œß½Ãð "Ÿ±‹WN3l•¼ ž§ã{uõ¤A`PÅËSMu4(:*Fö}L\B¿ªH”2E– Ì7¼ì Á„ è×g[a¨ŠÂÍÀ¤º~¬š/ÉÎ^ ÈjL_™Ž¶Õ¿oùœÈì÷¤|GÛw&€é›-¢˜ ™Î¢ý-OÒÿ2+»¥¿úxÔìz…½k EþcÀ&ˆ×æýSm.;„ƒj6Û^AÒó¯àoý¡›“gb­=›©9ÞÙé—NP+¸ÝI•Ã~zÙ ¶GhýÞ§rIŸŒÉþ¢ÜX·³íÆWvß³i«¿ðµ¬V%ˆ øBôÿŒ0ù`?øÿáÿCVŸÞœðÁ$/'³B]Ê—´ï—¾½@Sz£(Й”±fm•ê±å‰×!ílgÍÓµÝçüÁźd^_Nþß4¯½oûq¿±ùÊü¯ö¥ù6ol¹÷O¯Ø>.xâéÂÆ«D]Å,÷Fêsó»¥Á#øó`޳ ³àʦ 0ÃY’œÅfcÔ6c8Ù¯â-3¹ÿCøËÉ`jÒv0˜¶n>å1ËG;ÚÑŽöاÂ[ñ½¯_²ú\ä7þË·.3¯ÿ‹g¼õ^1ÚS° þ§ìÍrPo»û6½q¹ötc‚~0®6Þàß9ÓuÙ˜Ñ0€AÂÐ@Ñ´:a+¶ªE–VB‰4‰½ âäÓ „„ÙĶ'XÉ ™u$—iñÝpvìt;žCyšƒõMú_¼ìÙ¸Þº`åj§+߯ ~=9ÓÈ25òàÐqŸæ¹Ãt_?ÖïÍTÜ¥˜ šë¹xƒAï"}"_}—ÜãÀ=UòÚOÀÔŒç¤.ä†ág_¤dæ4‘ýèÒ‰³à ¤jÑÿå$KáúùëȯѼ›w4F7^36ÀFÌË{Ê,‚4Ý,;­€ý’`fâD¢Œ8LnÙXIâ$¶:_Unj»ÍU: {‰¢%ŠÐ‰·Y ð"Dq²S UíÆë²³eªžšëØ †¾¦”±lô'ÑXEãõÿMàÍg{ó?¦½þ‹gÏûž¿½{B÷³—„Wš#&JŒâ)˜’;A–Jz£-ä¾ä '† Ùåÿ\‚½%Gq‰þ¥V-ÿT ÷úÑܶ‹iI 0û˜"ÊTQ+±úV"øKiU‰ñù N”H(óAcÙV#°CQ˜·m:³ Ê5°ÇϹB/õÏqœíÕ5Ûí·éé÷Ÿí3}–ö`AzHy‹þÙ‘Ål#t¯oÉk!_  _j‰ÔÇ 9ydW¼¬j6 2„)/ðB=úÔRÉI)[þgÉ…0PÈ"RSIÔåB ¨@ö\¥Ý0Ý„tˆ0Íê#ÜüF™m}¸CûÎIMö¿žÁ üš“v:€X#Ìâ¦+$ØÊ.쎻°s=ÕÙ ß¼ÖùyøïJk¬àÙÀK›Reî˜X²sŸÛMpö¹P˜îêþ–J `ïO;ÚÎÊÊùóCÞ•]{`í¡ß|ÜúË~ðî;pí´SåQL÷e*•»„Yù>ýß¾iÜ\W¨­9°ü‰Ü×Ýò±K˜/{Aiçèl‘éÝAháÿå‘OU”¢ãÇ"O¿YKQK0ñJ{<»Æº½|ïé•«ÝzpwS­óæÛwÉT­Ü̉S;_˜“¦¦u³Í1úp%ÎûÿϯþÌŠaéÏP³}h W 7æêË´4Ì)i—=-@(Á8lf†Ï̧«¡ à¿„Ùð—ÒfÜ®äÀü¡å£íhGû”Ù§µ|ëë—|ëo=@—Âÿóé#8¯ì÷Á÷ýù£í#Øü?ÚÑž­­ï<øÆ†´Îè þΖá<¡«2¨Xgt©äqb»ª‹aÃn”Uy©$€ùòŸû™%!{Ä#šd{0H‚ !{äN ‹ 4ÑÑ]@£K(‹”Ê2EôWmWêÿñƒÎ£=g“É2Ç=¯·Æf0N–NÄØæàŽ¾ÏŒ©9€=„Y•˦õSÌfN¬\EPo:  ˆ ú-2® <$Ëï!¶AsOOÛ@ðô Ë­ö÷æ97+±%, mázë÷£ ÂéÊÁǺ81ÆÓÈD xfç Cr¢H †€tP¿¦8 )œw±ÿ—;<.²ä¤Î|0\¡J< €e<¢nò•ǾëZŠ6À? (Zæ½ý² É S!%aÈóˆؤü‹ÑW<ÒÖ .5›”àÇþ³7žË=ÿAíÞO¯ž÷)ö¦•󪋔ä*æ0Dÿsorý¿Áøãïü çŵß}Þ>årûnÕ‘Ðo3bê‘û#€aÛõçb`[-9A’z4¿š« Š…ìå`ID\âí/Ù%ÿeG=¢Éå4ÀßÿŠ’ÄXt3 ¿O³Ý¿ tí‚R;;`W-¢{ÀÖ\5 }Oç¼=ÌœX\a‘ #×NBy)椀pnÿZæ*2]‡´eï«ì¾ˆ€d)¯oýÍöºwþKvpö†½}Þƒ•ÃèÛv›(íÙ jm•T[³cS¹±uÏþ|™™—úÝZN[•ûÛuóÎÐ@+‘ÿ{%4Éÿ§1…$@Ù>õé€ÿÿ?{ïsIvÝ÷ýÖÞUç|—îžîކCJ¢Hq$Ù”l˜ÃX ýÈ[€ ` †í\a Hò y!  Ä~ósŒy ’‡ˆ‘›à‰ƒ¢x‘D‰93Ý=ÝýÝÎ9U{¯<¬}«úÎ×—á|Ý=ݵºÏW×S§j×®]{¯ÿýW{æûAÿ¬‘ÁøJäÑzÚé}$%üŸ=À9@ùzzΚ:7¹²\÷ê¹´#Šë!Ìëʬ)¿>kÒDîR2@«@ÊH[ÁSÏ6_Y`é”ommÁ–›‘á$Eü ìYò½õƇ1é!¼w„sÅõ@jñ3½¤î5¥é©ŸKéàòIVnkî·i³¡­®/¢q\l±Å{ŽöJ —›j®Ñ¸wÆ[ìzìÏÿîçð±Åž“üáŽíÑþ–yÂÜ ü “C6žÄKÿÇ­Úv”°QÂVq+©þ`6dUþ³ë\T#N/Š÷&]ÜIV0yc7‚‹’¿á IDATñè‹„´œÉJ×%…€LâßI‘VžËúËUë\˜Ú:[^ˆ/ÆJ•›ö.ún ‡+OŒÊÑÚÔ¼ySé}ÊÝÝ ÃNÙªÒ‘£aA\ë˜Ðâ¼0ð6h1 qDØšÇ[H@䕬ÑÍú›8a#ãÝ-ds’RÙfGŽ'O•‚ä¥ì0e@7ÀvT¼ƒU'ô^¸y˜äÿwÊàÆ0s=­W œlŸEDà9<"QMâb§¯…ãùd¿›»Mí Ý*ñA' M.[ÅYnõâ%Ï÷9 xR[gHÚ…üÑêX)NÓä¨WÔ ¬ý¿yîù½£Ú7_ìÙì—ãˆÝ6Üý8ò‹]ǧcd5«T¬N…Ã}4Õ€Ã(¬F”„•ƒA•µÖj ¿ƒ1&R›¸ß‹Ôž±Îåˆ~#Ö˜Ã{#xomaNoⲓ>9zGëùxQ@‰Ø®ÿRs«;óKnÈ\L`n4"]Jc¢9JÊÕ‹@V°Ò¤ðx¼v–@;::ëÿåèõxçí»)»ä,íY # Z!=DˆtÃÅí{„õ¹ø—þøÖÙ ¸‘ÏÉ><`ó¿ßb<8%>Œ¸ólvè™ ›ÎÞyƒ §Þ¼U;[Ÿ¾¬ø|45ˆTÇ äwá/jÓÑ›:Äèè­ï^Žå…d2ÿä£7`W‰n¥ô#]QHב–]ùnÚ–ÒBåPû F-6ö)Àg 4Ww ›’’z=™|Ÿ‰âFrnhg$­P_V(ϹÓ³ûlß¶Ñ彌ûÏAÞù†VMªX&)5ýÛIgîqÖËn=®BËU °­Ì–vƒTŒ»˜V‚ÈTþ?­(àÓUi¾7!LjÐåºöéƒÿõÈSRH«Ç‘×_þõBAS)J‚Tð³ùnNPÚÒ(4 Úç]Ò»K%ò¹4L¹<ŠýôÊcÖî%5ípÓ®ä÷m›.¥Œ¯1TU3k‰JmíÛ_aϾñ½Oéú>ÛöàÛvÞøÕ5Û{#®ît„mįL…ÙuÐ9BòËùC%Ž8(Ò)Ò'ùQTͯbTÄ»æ9$ &Ù{ºp¦r—‡Ë®<Þ•äYX-³){æIË—Ôf[l±Å^ [ÐËÅûöõo½Ã¾yãEŸÆb‹½ögÿÓ)ÃYäø:¶÷Œ&é¿2Fñp’XÅƳ„Ž–ol«H/–`4Y±p‘åÅLJ,Få¿üëïÒíL~½S‹Òî{ðÒõ‚ï w‚Ň7XzŸÜƒÎ{¼wx/ˆÄUà_Jä ö'P9ÏÓÌËð¿Œ6Ji€ÙwÂá ¢ »BTV0Œ–Ÿ[œE…ß}Ùl#½‡ã5¬;‹V?Xƒ$Ÿ÷Äç”ràÅq@Æ-¢ç=Çë}-êºv°Å†8FT¸€H´È—,——¢!‹ƒ¬üi¬t_”Á"Œ3 ºIÒâÂÑZxp¹Ø*½7Ðý|«Ü:r¬z»'9-@‰:~ €üüŽ#œ£¬{]?‘eÇš3@¢ä8"²óÅW”™¹ø³Op¯c®q1F ¨åD)ÊÖ†[E©ì•ü‘^W^{oëø=¸÷sJ!üáv$àïwXZ‡ ¦@“Òø`ó¦uyšÖy•$óoûv‘Í©<2ŠØ>ÎH>ʲ³e—ÒÓtB™?ÝÆ’²Æ‰â3©Mô$j`Ó›¿ój€ÿw~c!|ü¿Eú¿¤V©¼B’u [>·‚: WâÖ™J‰WâIgàn—äÿÇ¡=:‹ø\% ÞHƒ¼ê½£|u£)¥ ë‘èqÑãÔá²ü¿$Ùÿ$ìO’ÿ7à>Q\od‘*óïÀ¿Ì§ï8Wö—B€ ²6&Ô4 ãSÎÞÿ.gßø>»¯~ðüoÞs4ýÎÈOŽ8ÒÝÞ²ÞÞ ®…x4âÎ;8vð†¥ŠÐAàP¡3/v–ßG·[…~4€?#ÂI‚bJ6!YÁ”p$¤zWdƒ¥Dj4¦D!¨$r‰õ•D±”' 0ʲ:Ú€“ÚBV-Y o«Ëu¾@ã†’æø€8W^µõk-&õwÀ«DQ§wt&¦Ø¼+ß·è ìR„q·K/g3Ǫ÷~˜nY;9ë|9º¹hýÛµ(m”ñôûÓŠÕζ諀ȗƒP˜³6¢@¼eµì/æ äÚì õ÷ù^íšçc2™Ÿ_Ò´HæOÏ”vƒÌægσ•e®3ñˆ_¢üµE+Ø_àôy`&7Q·· ×b Ø?¯>E€¢ gEže©÷Z™X´–Y-é´R§{wÕJTÖíý¯…pø?_n[A¹ÔÖÔõ @.o¯ËÓßž¿¿ÇÛ'?ãu½:vñ“‘Õ›žî¦C£GVb*O*è.‚BaÌþ8¦Êr4€ësc`uËf¿¸1í7‚®RºÎü5½Û™*×¥c—®õ7ËtߺÅ[l±WÜÀb‹=£-àÿb‹=»ø`äî?;¾»5VðÍiz/BTü‘$©ÿÔÛwBÜE“!ë!n£ <:S‰‰–G,I7×Þr$«Ãéz¥_+Ý¡Ò:üá®s¸‘íÙ(ƒ [‡o:/øÞÏ€} ƒ d@²ö)ƒÖ þïqp-öÒ˜bïàX÷Bçͱ¿ £’r>ì‹­r¶U.6ÆèœpÐK¨&Æ:Å1-HT“¿FÎax„r ²2¦Š¼uËqç†ãhmÄ ØöýüŨl“sß;±4.I,_ãó%bu¡ï•aL© üeO›šà‰ç“Ú5ú$ó[¦$æHuTªî¹“ûÌ^ÿ¯ª"ˆé"raåQ‰ç C×Ù÷ÚmV¿yÑ- Ïh·ƒpp®|øpGw ÜØ¾5ëúQí9—Ô+ŒÉÌØŸI]ŽðOªÖ«hJQ„• ëj©$µv¨©ÙˆüüÛ³³Ê ¿P”nJ:›Ôf(ÖĬº2%PCQbr«þÜï|ûEó§nï~óøEŸÂ‹·×ô_?Å¿~ä w;Ô+ºx–ˆJ≷—ŽWØ q'FÞÜ ½9â“p/Jȶ+¯ >½'ìúÅ-)_»µM$wžÆÆÙŒ˜Q-¼GÔ(.¿ÁÓËRóKº|»ª¤Z~ïœpúþ÷8ûÆ÷ØþòO¯á¦¼\¦VÄž¡?Å}ùœîD'‘xó‚xâì3:€ƒÕE·}d ‚^øôîQþÏÒ«3ígt– -K‘üO b’øwÑYæ“ÂÏí£6“Ú´À‘Mdúd}Þ²4…4i¨jWƒ[Òì3¬¤Ý¯¾Ž @¦g—Õl?×ÔÙ 6ÛÞðÏ@ ‘jg¡àÕнžÃäzr`½"Wº l´õµV©„„ÉOÉ´ï41­î¥{i-ƒ«mÙí# 0ªr“D¸¦´OóÝËv”Ù乘왩ωLÿI»½ŽŸë÷rÅ‘É÷mV…3L?Ë÷+Ôym ÿVþß:н–Ë€ÿó(Ŷ>\N±÷L‚ÉJbùÆÛÚ:Mu)—™­W_Ø1s™ —Ii/ž½Œö\ßü¯íؤ-•¦6ÉžOKÐ+ÿjU’Y™\e›_^äÿ³=úþ–·Þ?d{/pò‡[Âú›Âö~°@5lï*á""+”q“”'’.î’n¨é8uÌóS°iª‰ôÃãÒv áñ<ù‘}éß‹-¶ØbŸŽ-€Å{{÷›Ç ø¿ØbÏÁý`ËýÿwÃÑ;tT.>ñ7œ¹¦’óÖz‹þwÉ ;BÛdÅ\'Ä• ÄcLâ "F ‡ð7¿Àù6âUñ1š„¿‹tz<ýúîð]ºîÇÞˆî²ÛޏàqƒEW:¯ˆ÷館ÿ6ò?afII +ÄPsÀGÉN:P/Qÿ/—e‡’HJ;Ü .Æ t^Xõ”³r¸ú^ *}'|î–ã|§‘Î[»w‰’r®ƒ]‹Ä±E¾ØžC÷1HOˆ 89€Ø!84  ÊŽ(' Ñí :œÃhƒqŽeO¾¼ËNÃÙ•_wÑÚo''\0ï øF‚(6;e;(»Q9ß(QáÆ¡pû†Ð{Ǻ·cmßcrP)’ÀÉDʸ&€ˆÐyeÝ »AÙ p°ªAóù:ƒñ—ðüãN%;Õ’§J±6d¢]jG­žùFþ4yÌóÜìØT§IZ¡1ZûsCq_| yãÐÓŸÀO>"~œœ¥Å÷Zo­½–vëiíÍQx;wÿlG¸å8ðBw±‡ØÁjLMr¾öƒâGúûQXùHÊÁh˜W—"ÿ;µHÿJÄù3xŸc@%§©±ïˆ0 …¢ú]´gÈ9±iyoYjŽ*H!ü¹ÿð;ûСWÆávçkKô¿<\£ç#á®§ +tã‰p]ÊÇ•¸Ÿå]7‚îÞ[*±~܉Gvú`QÛ£K$Ëá.IÞÝHJ àO€Ìvî¤Ê›“šG‹,¶Èf%P’"@ú—+I@Gǽ¥ÂÐŽàþ¼¢nÈ|Û~ð¢xÒ¶ƒm».{–Ûv±´““¿d§ï/òÿ§?ÜñƯ­9þ…é„¿¸2¥¸^XÝvŒ× ÃYd<ø•0žF†³Hw(„þÇÚü ¦0bi< ,,x'| #(˜²ORÐö±o¦³æàru|™^‹-¶Øb×` `±ÅžÒÞýæ1ïëó/ú4[ì•·Ÿþ/g ›_Y±ùpàâÑÕmÏöA`÷0Ð9†3D¸•Î#cšß~iý…¶Ñ"‡"„ MÉØM ÷óo¤ðÙ=°!:¡ïa}ó˜pô ¸Õ‘î'#Ò ñ7ž!#H‹¼A\•öÏ€H6Å?‰Ša°R"’+ðoî¬ UU€—̲óÁyðN‰Ñ@ê èîåþIä|Yõ®8F„£•‘X4:V]«”¥–ƒVS”hcÑoÎo‰ò1.ôÊè!ho²·(°%Æ pã#d÷Ýn`Œð’¢áŠôm&4§Q8S6opÌ$×UÆu€î-›÷O"ŸD¼VÂ0ÂÃs“ÿãØÑ{ü½ËyÊ- €w0­jPV×F0€ÍNÙ Êv45ƒL Ñ!Ƈ+ÁõO8—6²Æe§LI“Ê$ÓBœï29ölÙ¥¯;ø¹_ÃýÂÑwGÿ+œh’ole™-¼·ó,ödû…0ŽÊévܸå QÄuŠê»Â#‰Ÿ szùÑW¹ÿ1)d²IŒZ|±Ñ¾F Eúk" ØÝ’R­\ŠÜWç ©¦°ÉÊ>/§T7ÎÁŸû÷¾3­h¯¸Cíί/ùé1ñŸƒ|ù?"z8.¾öĤ\ÇFÚ¿Dø§i‹ÖV[ÎÑÙ’R×àµ×2øŸŒé:ÀÞ¯ÍQ€õXŽ Ü'àAÔ§"‰ >Í»4ïJ*€ þ‡8d`øÆÙþòO9}ÿ»„7OŸë}y‘¦{ô\ožÜ Ý[žñtD;…7…p&„s닸µ/z!p è…CÏÚ<çŽ#lªÞ²MgïÌ>Öºƒ«$L Ùù/Ñ$î‰ ¸òÕ¬¨“ꊒ.È$›KR€­©pî ²j¶ hh–\f ërMÄ.õ7*äUÚãKëæ@—L·“ÀÍ\W3¬ÍöT(fi6+6—XýÒzr=(П šÞ•@Ü( Ô_ˆ vùvnWFý¿²&³Ož4Ù²gU"©j%T•†y_0­/û_ÛKºy æu¥ZÚí-ñ¥¹ö¦NO¿Ð´çíhMà]€?ŒßÌ륹ú7Ï*í÷gÛ_ €úÌ’­JÙ³÷%“fiÚ@RBõzôÔž¦Ê”›ÇD‚×’2DêóšÎ­žÜôgsV—ÏqÞÞRÇß”6I{WjÅã¢ÿ÷ÚVºm½÷ËÆ;¯Ï{üq¶½¸ñåý-Çæ^`÷(ÐÝpìîìúŽíY l"nå·ö¬¹5ŒÛ˜@}%Æú†^Šü×`à?ói¬Ï§fF£ 0þÛ¶€vžï£¼Øb‹-öm!,¶ØSØí¯­ð±Å®Ù¶÷GÎ~< +Xy†“À¸‰¬Þò à….Zn0zÁ8ÜJˆo@ÜY€nçiÞ­ÁÎ$ÿÇ$1–˜ÄN,¿˜ŽæìDéX¤¤WÖÒ¯…îð7n|žõÁÛtÝGHλ#»ss©¤68^{Kà)9;+€?—þÊðb/¥µIgI®-š,ûI’#D,RM/póȳî#¢Ê0F¢Súº(¾E¼ÕOɨÛpâ ÷ˆîç"nMt=8‡qa@Æ-lÏÑáw0Œü/¹p#iÝ‚(Õé]/c7ˆ&ÇC¼jγZN!ªtÉñ¢ª¬zxó¦ãp-Ähÿ+/xçpú쟒BÄ0€ªw2 î¸nB`¿½î…³2 WâF…Í \ì’|{s.s'÷ä÷úÕºÏÝ׬Û÷ÝK'-µàHJãTî#ác«$ …Æ'}ù\ÌÞÛ:¾·Ž,vÙnÁm#wÏ«µàÞr¸!“„¿S5U™¨¸1¸5Ùª ;uj·.OCšw‰óV¦LAÿ¼ì‘é:ÉÓh’ÿ¢e*Tà•Ôl~û?¶ˆ(ÝW çöŠ9ÚîüÆB¸ÿ? Ý¿ò1îs#ýqíá(9â‰GŽºt'°³þR°Ê;¸$ûO‰ú¯rîÍ|ÌÓ$ó]•ÿŸ(¸$éÞ¤(®}‡Sc8‰j†ù›vãøWW$ý®D… " Âö+?eûÕ8ÿÆ÷_ iÿ¹éwÞ€óŽD‚L§£}…pÂdYG¬nœ¹šbã«@®Ñ!¡Oàþ´N™2­Ou‚Ø0BRSöOòø’ê ÚÂŒµ¯Ä¥uÍß'ö/ärS)íº håù|øK`ÿU@×ÌRrdl›Ë»¹s¥‹ÐæC/4Õ‚å]Ù/ߟ^›LÖæ~]‰ZÎýˆ‚ÌÔD¹ü¢~zýƒ1…—ç´çþO¶>n¹^GžH*ZúózéùîÏ¿å2¿¾éSϪc™<i±>c-ÀKi²'ÏÝäRà¾õ×Kh ÓùÇÅËP}×Ï*Û’Ú›´w]š}êýÈOŸ\©!´eß>‹i8aªuÍóÜ>ßd2JúÁ§-7)¦m!ÓsÎãë ˜OðËžu{ÚÍRÿšßmÏaŸ½.ê=O²ÍG#Ãi¤¿åˆ›HØZðî’omÐ"×?< %Ú?î"aBJÑéVbÛ’_®*T@IÐ/äj©éx¶À%òÎ¥)W,/¶Øb‹½â¶[ì vð¶_ÀÿÅ»f{ôƒ-ç?ñkgÌbü0œÆäŒF‘ñ". 䃢ƒ â`¬axØ _âº4`u±¿ÿ·>Ï£0âcÄÅñQñ¢tt§zyD±ÆùO€ø9Ýâ8Wd£øàp⹿U|çp.EE&@Ó¢ÈRt§$Ù÷I)9—²Ì ”é¢ðr™Î¢i:Oszá#‡OZŠÛÁ‚;o÷ú`¥¬:‹wB—d´-OrЬv¯Õ ˆ„"»@ôç8·A»⪃•G:@ µÄóÄM„]´hœ ”@Mи۲/[R”GŒÈjDnšŒ¬žŽæÏ²²×X¶9 ,&_ÝÑZ8>0ÀlýáZF“'ïÄTî>Œœo•Î[týzeÏÙª7@þyðnDLÝc½† •G2Œ°ÙY1®…¾³kjûdµÛWÄÈ¿Œ`$Íý¬«/Í_µÝ™àÑÓ?úáã?B/â#P :ÜžÓ{o·æöæ(|mëùÑŸlˆk᫽ãôn`ð£ÒVÄ]šÏEÛXùV©H ^´Vü æ§y×,‹‰£wÒDîϦ9€Kï¬üîiSÙˆ¿úïþ~½¨×Øöî7_ô)¼öæ¿Ø‹ Òœ*Ý; ½2:EÞ°¨o½â¹ «HÜ8ÜÆ*³I¾gp8“œ©\d‚À`SØ9të XîC RˆdÅ€¬"Ð*d0kë\& àp’EÀ@'ÞæÕáÓ?áàxÅðæC†ÏÌð…‘ý_ìx¦rLÜë (šr¥×~Ø>èÂ'ÌHK Ó÷¥–AK:(p¿ºæ¨y» b!ÁTÐrŸ°-ɽ&VîŠÂ¾~ÏgÄd2SëCíçiIMÑb T€f¿ çkÿtI³;ÔÖåfùSMi!í­¾B1¢'ð¿¶upï×.m{Uê2î?M#ñÔqSˆÝŠßÆ™¶œ¤5¦ûQ÷4÷/uª¦¢(ßhˆó©{µ&³õmÙÛ¶mß%à¿!<6ú¿ú^g§ï÷ {¼>öáÿyÎ;ÿòý±CG“Ý‹CdýV‡ô!5ÿ…þ–c< Ä ôw:\òã­<ãV‰[ů…°Q#Öyñbªšƒx¬ºf¢tE!˜¯ƒúg¾i¹–~†ß‹-¶ØbŸÄÀb‹=ÆÞöü•üó¾³<*‹-ö³ÚÅG#®ÂEdsoÄõÂîQ–Â.²}ñ¶jùÃV6ˆÛ^wJxqkã˜')ؘŃVBÀ@!舱‰£±‰5À÷Ÿü^a ú‘^Fº^é#ý-èÞŒ¬Þut‡oÐu‡tn‹Žwñ÷"¬:8ím‡ŒœG:‡8‡:ðÞ=©HûŒZëXuÕ3œ¶YÎ÷¨ŽUgOˆª­@ÚáJÎ'%e°¦ý€9ÍÇEá’+%Ýë‚à:—©.9NwFp€­¤mÉõ¥ŽsÞÜ2øÍÑÿÙ!Aî¶à¾ô+…ø§ß%ÞF*xlâúŸÝ2Ð?Œ&™oåjå7[×9súƒN8¹ˆÜ}9ݘÃçßttŒ¼ÏN£k=íb¬{ TJ¿;&éÿ”£µ°îmß!`éF“mï½pt ¬dOj€¼\57 paÓ upL<ÄlerlIrž%| à»ßƒG-ïE=‡ÇæWw ë] L¡{ùÞɆ[Ž£­òàl¤sÂÑND•Õή}LSµþ.6ü*³þäçeI¤3H‘ûuÙGFB³mµMª ÿð7y[÷å¿õm» ÅiƯ-ÑÿñýŠC¡ÿðgGpãÙˆžöÈ*õÏ6Šné#q ºâŽ4²Š)<Ú»ot )2#¯Œ 0R¢ÃÍñëJ„¸Æé´U x( °'F‡SÁ"½í‡MiLœ=„ºûÀ°`Çô‹'ýÎϼB¦ÿôóìîE.lY¯P=‚­0néµDû“Ò?ÈhF!Ž‚Ë÷,ß'Ëe2:{—%õ«Òƒõf@_“þ,Ĩ7à;Ã[i}IÑÆ®Ê$ߺ侑¶ ö´?ñŒ0\þRþ3ý{)Òµ‚]Ï"s`IÈ–"ÓôèÐH–H/±ÿÊ„ @Ùžæ/UjÉ4sÛÑhŠ!&à11mÐ"j›|@ãä8{˲t‰dvvû^V/ù¹êÜ3ˆ9ÛMæW,éƒTj;Ñz¸¢ÐÔÙ9è-$€«Àÿùòô¹l#°¯$µÈåíu9ÏiíW„¿™^q}ÚÎ6Èá•åñrPêúv¹zÿ\J™»´§1D'Љ¹E A@˜“lŒ2!@)ü)A¡=϶4'7Ÿ“Ymy,øŸTORûgýX—ÚŶm¬)P¦uO&õu_ÀÅæ+¯ŸªÏ>;ýᎷþÒ«7=»G‘‹{Áütâyd8 ¸•0nÍ?ç4ó"Uú´ú·‘ñÂVŸ”°Ià>JÜÑüx–¡"ù7² ÀXçI‚…*{†¾¹­tL›„ö6/ãÝ IDATšÅ[ì·Õ\l±ÇØŸÿÝÏ-àÿb‹%;ÿÉ€ë¬W½½ÃI`û±åýÚ~R§ß˜¾Ãy¤;† “ø²`ž Ò—<_ƒ¢£õq̽õe9b€€›y9çüšK‚¥@^)ë&ð/ö8ŸRt8|§tЬ¯§øÝ÷qGÈp†œþ)œž¢;Áƒ9;KŒÌ$Ùøb¯…娒˜“GkaÕ[dÆöÇ 6èÕq+]4Gsv\æÜ§ÑÉ’†°æwvæ¤Õ]Dºä¤uÇèúð· žAø ¸³4 ö)Ê. ˆ£Ú±ƒÔ\îÙ¹]‹wGDMaàwLW|õ}®{„lÎ$SBðè‰Jü¬„£µ)(œmLMaÕ™Ã×;áíÛŽ;åÑ™©¼qä ìlpkM7ì:5J´Z^W5ƒÝhŸ•©„Ĩ £r¾Q¶#x}bÊÛÆÃ©“&§½Èäº/@F²«dÄÚWñ=ºKÞ—"ÿ½·ÀÉüû±ßºèø‡lŸp¯¾Ý ÐEå‡ÛñŠÜTNƀ뒼ÿ¨x§—äÿƒÉ’èB´u]‚KÛÓEKƒµÂ: Qp¨’ ¥GX'àà@œ¥ÖpÂsŒª¬œcêÅaç8èÌ©{Ø;{ÇWþηïMìßþÒJLíðÅûÿ3‘û/ú”^>ûÂ9ÝmÈ$ ýhm ûÖûeã­‡ †JÊÄ¢þhL0YGA@Š$|ZW¤à¥‚ÆYi¢¾p¦Þ:üm%l9ú2ð+÷às[ôWîÃç6/¦_Vûèýñ1§œãÑÝY³î<±;G·‚®ºÂ"óvX´?·Ý ²²¾¼ŒB ‚eÖ’¤ä@£TÔ,ç{Ú’9ZÙuEâ¿Fû'µuiÞ%ˆÐUr€¤:RhIö_(9ê+§N¨î Ä\q„gˆÅ€ue~¯V°+O'(O’¹Î FN©¤%³TcïrÇ GÙ'Ð? ”òZw©.í®ž]`&d¦@/Á?LH©of§“ÉÍ™$ô±Ü“\f%òøò¹í·÷ïy½v¹v\®1Ó5³^Tð;ß?‘Bᨖ®F ´…à™KdFàRÍ~ú«»t}ð¿’WZ ·½¦gIi!R¿[KhÚAÑKËíú=¦{¶}ú;³  ¨µ{ͺ Æ™ñ|jû`Ï“4b)…!ÑjJ"ิËíÉ$€´`g MmÊõñò(eb2™iÛǦ¾À¬Ý»ÜºÐoêVûëXKxüÙ™wN®Üö:ÙÃ?Ørþg#~íN#»G¡Ûx¡„©n‰ÿ>ùùFe  #Ádÿ5€óFÕ±ñבHÞ*¸ë4ùûÄÔß^ëœøþfÓK¼ž¼=ÏK³ž=ó‹-¶ØbŸq[Íݾþ­wøÂ7o¼èÓXl±ŸÙ.> Èžók…­¶©n ßtÞ'Ò^ít>ŸìÃÿæ×”µw)ar°ÐÜQA<®‹p È±šŒÙîäôcÞò©ŸîÐ3AOŒâˆ]rl_ħ,.öòšw¹z´V…1ضÎC/XPajRg >™Õ®b ÷äá*$5ü‚ý&¶?®G¿ˆÜøKˆ{âC¢þ?°ù>â†ôÌU'‡Br¦Ca=iÍ<6ÑàáÁýÓÿUAíP]]{ýÎŽkç S¥Â¹š|~ïa”FÎ6Ê;·³ãn ·…»"Ãh䀯çÜÿÓ?ç6eANÙÑ®L±àh%tÞêD>—¾nÁMŒÄЕ@{©Ç&W‹Ö«—Üc- 6aÝId‚E½çeCаL pÎ[â%ç/y&ÒÄ{Û×7 À›£ð—/<ßÿÑ–~ùüžG‘Õ ¬»ôlµû ¨Ò©à£¢’€}„¡ÇlÁA§Ð{!*¬Ô«EòC™æh~ŸÚ!—#ý¹œj&o/ËÙ!/•Ëö•¿ýízaûd¯¸ýõ_úÏS>j%j@5U‰¿²€ÿOkòvCúÅ3ÖÍ6ýh gxØ£ on‰:Æ»9ШĠ,²|tq r±‡%&€¨ÿ´‹Ð+r0ÂA@?¿%Žþª^£ªýlvÍðSÏîb„íníw‘1l¡t q+ˆ¨t+ÆN"Ý 7²G&tØ4):du¢A°?}‚kÎäþµ™°_°<_ È/)2á£Zqú“È(€7M'£Ôð{²$}!ÞM"S³ÌõüÝØ d3“ÙzI¿3¼žU溭•PϤÎQ@`Õ«–~F%ä}'T€Rpóç¤\S¥5å)ËpSÊù–âÌ÷§éÏX§zôj¾'m¹J-ïfvoÁ¿èüÊ.T¹û¥.´÷´‚ÖêÖ”ƒ6ÇoAà'’ vZ³ëß}ç»÷Rd¾m?øÿIRZÌÛËÏÜõÜàOFЏN{ÊÑüùHs’ïN.Ç\?ʃBÌ ÖS¤ ¬õ4J‘+ ©º)ªVŒ¬­gÓS›µ…ù¯´k¬>—ºPê„›ÕLhÛG—Ôšö4×ÅÂ&)­æ•㜳o|oïú×ÍüÚqó«+޾ØYÊÎ5ô7Fâàp†sÁ](xSì”^‘„hj².@:Ð]´:è…8F# xhRøÌ¦£ùI™+аÿ÷ÿðr=Æ‹-¶ØbÏÙÀb‹í±/ÿ›o,àÿb/Ôý`KËÎM+\XÄÆxÙ~èo9ÂE’Éï`wb½^×KâçÀ|–ȃÉg… âÂÖ¶Išdó¥³vŒZˆZ¢ómÚ¤‰+c½l[šuÌÖÃåÎøUóO¡ÓþàŸüFs,;©^#x,Bs¥È* >ZØÌ0Â8¢£3'ó…ÀÆæ ëÚAäÏ~ž‹}öL¤Iu›¦Aƒ@X’s´êÓ%d)Ôô,YŽÔ$h)X ©êúä¨ðkdõE|÷%ģ㠴¿Kp?J:"ãšÒ#"i†-"˜/¦óÄÓý¾7;C®ŸSo#Í\ò?eÿû0æâ“²+²ß<Ö½Ç;ØŠs°òBרY#V>Ís…íH!¬{s‚ïFØ&ë¿î¡ï¦Î%aÕÁªÛ>ªÊ™ÄCï¯H ÐBŽºQ%EÞ3gpýnšF…!ÄECš5§è*«áì½ÝëIøísÏáÝÈïoø¹›ž#§÷G;¡€MÄyèsÎJ§t ^ó: Ìï¨óèGè“„ûÛ©Peü‹„¿T >/À/þÍo_y=¯›ýí¯þ}¢ÆæPÌ9™sR¿õ§/ú4_“·· ?·AÞ³(»œÒb±lWÄvèmð‡ ƒEì¹wbc‡• ‰ b$#f8Œ´Á 0$þˆ½{6Δ"É߀ÿåÅZÂáoÄŽ ü[ZWæ hvÍ|†Œ`o3×Bf¶7õ¦Ò¡£¦3È•aÁô]¾"Ÿ·ÌuÝÏU`«9§Ý?ÁHÕÆy(­Ü¿jLä–@žk03÷K¿6/g@;, ¨[Àë&€± ™Ï!0(cÈ Ö¤ “Hÿ¦»]/»½øë‹÷ÛŒ•fµÌ7Oö¸LìÈ`%Ì..[ߦûPHŸªVZ•@-½\‰›"ÙWƒ‰Óº ¹çk¡YW‰s€_J‹9 –R-­B8y¢JÅëiÒ”U!{bÏ…“ú¬Û04&*@›´j¹ÙDÕÔ& TŸ– ó[±·:MÇ$3úHmKRÝ·ajS/&ía&x\þ]!ÌëØ´Lg›/ÿä)öz=ìGÿÃ#~î·O•íý@8‹ˆ(ãYd< tÇŽ°K•ÁAÜZËGÐ1¥H¾E§Y σ缦$ NÑ5Ò¿oæ“ï±e2@㋼D €©r¶<±¥)Yl±Å^![‹-6³w¿yÌ×~÷s/ú4{ì⃱F»§høí½@wè»Èpfàýp‰;Å­ |;%ìÀ~­# ŒqBb‘ÏÏ`ÎsßÎkÎ{ßHé·Qø-s¶•ÉŸtˆŸØ†Ìeéë’R &'Ÿ¦ÐJùáÃ#Ca³AE/Ý8¸°Nh'%:– ž.özZsë¤(ïX×k©"RÁÿd%¯¢-™ümq•j3/U9*ÊˆÆ ºUÁæÙË‘7šcÞü±RŽP#†’#Qšå|ÎS4ô¨v¶ºs¨¯êë´‰O,êÙ¯¬\îÜN7Êf°Kè½àÜ8â ζÊn€Ãµ]Î¥ã~Šç:¸Øš¼a—Ûµ´g¥ï óBßM“zi&ßIdžÍ`)Ö½póPðsTL3ðŸ,˜—C&^Ú>egºfçŠD p·"¬!žª‘D {†{ÿÕ'K€¿v+Àj«ü‹[º¿>ÞmB7˜ºŒ tƒÒ–’Üà#D§¸hó>XJ€NMú?zJ‡ñÓ:„S ð@/’>6߉Ð9Sè-¯¼©ü…¿û5˜ëyb!/™ýû¿ö_%p?¦èþ˜±˜> (–¶Å÷î½à³^l±k¶Ü"œÃ¸:'¥ÅœPžå¶¬„J†¸Ëõëåé$=h-{—r©ºzOÊ_KÅåàjòøS%€”B¤%íi€[‰WœÄSžé¬-Éí©™<®ýó4f€©W®Ë~§y;\1Æß\äÿN¸ãö¯°~»C€õŽq-¸•àWBÃ¥ "%vЬ„¸‹% )l“ŸrMëÔ)1@LþÊ8JJ )ðHˆ£š¯2§m@ÿì;ÇÇ*ƒî[^l±Å{Ml!,¶Xc·¿¶æýo}þEŸÆb/‘m?„M¬ÍþÓ¡èag9®üÁ†Õ× Ãi`<øCW}×Q@ý8Zç·öÆ€c–ÑoûhÛ)2ÂhÕ+Y®Ð0aáj–ë“ÀýW¤£üè¿ý 6£© B4g”…É"}ÄäÎ yë]¤ÿyÐô„è~ ›’<©¦¨%Ж<óË,özXmâ&Ž5þˆ7§çÄA\W3¯]ûLЦܶÙq)H DRdïôb çJº‡  gÈ™µ7RÎÛ"ßž§y>}Ú:\>í¹JÚíùTòöwF¶ÉkœƒõJ£•ù0Ú:AÍáãmùhmÑõ.=¢ÅSü)[T‹òF¥ï¤‰òW:oNéíNÙ­Œ’3„˜škÕ’>Â9SèšH†`.¸£õŒëVLíZÌàmð+á ÝC+,óÕ9±iŒàîŽâ¾ôîæ—Ð ?ú€x?Zjÿl…÷[ÿí“wüŒÛ›£ð•ÁñÓ?Ù…wWþ\9•nºQM¾„>£ƒ~VAàߥt«ë(lE‹€èDpöàq%:ÚcÀO/6õbJTUŸ¶uÎÖ!ðÿÞØ3áš~ÁLhí3ÞøÝ_ÿGªª2Íu£ú#%öM›óˆØ -òÿ‹½’v÷ùÁmN><Å¿éÇä| ~ǸMÊW@¼â…ƒUD·ÎÀýU4°Ä"ø±þG[4Éþ«³ÆkðUæ¿ÿiÚ¤)r)º¿@.ʶ ­ÈÍÐÜ—Õ\±~…ÐÙ±hú“®™$°X)0rÞšWp¤ôåy{9vgÐÿ@•z=­Ì50uµ§ 'µÏ~i™µw…üd_˜¨RÀã­Fü§kÒtžZÉ"®¬—öÚÉç›ÁéÚ‘tåéÈm÷YŸ_rŸ¨+“ù«zQìÎÝï PNϫǣÙN%K&äuÚ@ÛÙ*´v‰e0»ÂYýž€ÿ\­€nó)×8Miñøè©ýúô{­“ÃjÄü™{ÌHõjRßGõøYMæ‹Ó{׎# è-µ)ã‚ü b#MÀjƒKà¿)¸I_H%9’‚À„m/àÒ97×"íÝjÎsÚ&NÛÇ9ø/Íò¾zD»<+«}vúþ"ÿxäˆ3ÿäxa ʸUÆsůó˜[!(~]ŸUР¯;“øƒT¥Ò1¤ hi¤ÿ¥Q$¥ª ¦ÔúCçö²?Ï‹-¶Øb×h `±Å’¼íðÿ²}Ÿ;›9ßüxÙÝX×avg‘î8ö‘¸­lU×qYZ§à-iÜ©ÉUý‘ƒNäòcÈÑöÖ±ÍD‚2VO ýÄÏËPýIg¶™–¾ì¼S»t|‹ðŸT™ÀÕ€¯>!0мywëÏ#îç!vèx†èÎÏàô4©þ'D1Gú.Ñÿ¯µÍp-þdçÐë¾û7‘²&qRòT“d^rvëVŒXà¢?FבÛ+Xý¬ÞFø‰¥ Ù:b¬NÄ\O59@JÞÚ´¹ñ<¶÷RÔk+‡ZbÇÂÁJðI|CÕäöƒ©RÒy‹¸÷N'%}"lû‘u_zò×½p•a„И¶Qvƒ¶˜=«nÙ1ò­è¼Ð9%#¬J¡ÌÀÿ`/i™`óÛ§f’œ{åæ+Hr(È[_ÃþE‚ÿçȽ»jžs,Œ¸µù5‡S‹ôN`÷(”Çd8 „ùIÇóJS9-éKk¶Ê¼')B ž’.HQÛñT}ÕÕuä×õÜw:Ÿß·|ÕºÅ[l±Ï°-€ÅKöWþñÏsøÎòH¼ vúÃý-OØDÆóÈð(EÒ')ü°UÂErÈFØ=&Ÿ¿Ó©„~––*÷&1¥!m+’øS ¾Êã7Ì=ó-€ÿ¸ÜSÐÌÏ×ÁÓuLûôL“#VäMPË{½îÀú 8ÿ¶$Æc”38þ!úð çõ Œ-Ž>MΖŃ}QWGdOm%+®7ŒºÔþ88ÇÀý‹¿º r·¾> £‡ …ÑayV©p ügþ·uY&§õ2€ÿP%üC°bñiy –©Ã9X÷Ï.Àš”k‘ÿÏçUYuºŸ*Ad%ï ȈQ Á¢þ@ïÁ;Û§÷ö©Å_IÛAç&•‘À‰é%%IV‹ÒȾÊ(HÄ€–*[‘Ï dTdó±û)º½‹Ž‘’‰ûT…÷v¯&àNÏ”·;¬rN†ˆ€%cÄ 8IÑ2JŠÄ'ýŠWã¹`Òþ]´îC§JŸ”±{ÄöS# ôX´‡Ð‰‘:©rÿÞi•ûw°òVÇ\'—ÁÿW¸ŸÑ‚ÿSkVk¸%àÊèÿ†€~ûG׋-vÍ&wáþ!!î/"žrã™ Š wwÛðoôÝ 1Iüë(¶Ïàì™Ú:bc6.úX„Üh@¾¦÷‘Eü'¿Dÿgp¿öó©$€´‰`›kYï‹ Ÿ^Q;#´/y2ÀÞ ›óŠúÍf.Õù§”Wü®<»Ë'›Ÿ_Ñæ»" Âå:°¯~\Gmy’íU>æª+xn“¦lˆ'¥-”J”(ù9‰¥Ôù˜{L—þ‰ÖgPU0U€2³sÐÙYO+QS¦×1mÛvqíߦGI­d%ÌêΜ\p•·Oož^¹ýu²»ÿì‚Ý£ÀöAÀu&Õ?œµ ¾}ÄY侎ö°e?,y}Þg ‘œs"hµ¾ÕK¾ÔÖö­[l±Å[l¯-hçb‹_ÿÖ; øvö£8(«7ãE(ŰUï„pÏm1œÆ3ÅØ>a«ÄmÊw½Cõ˜¯AkÞû &©Ÿý!ü±üµ“‰E¥ è·~q¦<®Sº€ù/µÑÿ&MÿcLλÉ@GD"x_RÁ¥ˆkA]Í©¤ö'@Æ{½,G rëBj$ÉÙ¢uÉ^¾¼_FÐ E¶ðã ÿÔœñèÐaJöÑÆ±¬ù÷'€¼Ž—²:çSòYÎ+’í¨„˜÷æRöãšÈ ÞÁÁJXuRˆ œ¬ÀªƒÞK)Þ¼/4ç,WŸŸspt`©ú,Ãß2bnÃ"H„^‘^aeyE0À%ˆEhî€1š³.ºrÏ%8ôa$þÑ·ÑÃÀù}„!Ñí…=ƒýæEÇsüDß}YíË;ǽîÊxˆÜ øA‰ü>(;³ÓYñ"6u.¢Ý'¯bêÞ8Uö?M3·ƒ¬ )U€Å¶v"…/¿ñ_ü1ÁÍú2ûæyÌô%·«@ՙǹ"bö.×ü8µ WGÿÇ÷ùÿÅ>»&×è©gv¸u œ8ËÁÛ£ÁR[éVˆƒKyzÅýAÐèÐ`çÐЋèOÀ½Žbï£ÑÁ¨ö®Ù‰1±¨?5£"ó¯j‘þê°Xð˜€}#¨µ°½7¯©çdO{ß ]!Wi„¾1ª+e éЂë6)ùæÛÞÆÚÉðŸ,@*K rMæ/ƒÿ­LzÍJ·²‰ÞW€˜¢w Ê»RådúWå”vÀû¸ ­`cÛ2– N‰)r=ß‘ I^!©H9r%¤ï«–ßÒtý”ûª¹ûùždÈû³Ù œm@ni–§õ*ßçZfPïoV¥p…l>VIµ=ÿ­ùäÈ Ù=­VžÒ"o˜‹Ô­unz>Y™™Þ§'¥´¨ÿU™£=mÉæTO$½ÏÛtleȤ¥›û’¾?é4÷þqÕàÓ¬"ŸÔ7Œ‘«*!#_ÆK )õ>ºÔ¶E¦w5¢IqM˜¤EjI¤zUZjÊšfˆ{é¼Û:TŸ‘´¼P¢û§òÿ5ú¿¹Æ=mêÓ‚ÿ›_^¢ÿÁÔU/>xë뇼鹸7²½7²ºéØ>ìFºca< gqêËÝDSXQüµEâ?P”ScöÉ&Qþ™Û~iÌ2¿u/úù\l±Å{‰mA<{ííëßz‡/|óÆ‹>WÚ~ðOð…¿zéLöi¼ˆtB#î@Ñ—$ôƒÒƒ_ƒ†ˆóŠ_7`ÿhë3ÀØ_sAå}©ë9þKŸL˜/G¦$vªÍrê„^ê”î$.ÒçnðŸ|¯fH‡Z~kÝDäá]ÂúP:¤;=%„?CÂ#¢´Ü©EÕYøÅ›YöÎêlÙûUuI¨QœO÷ÔØ!œ;øðÌ?v¨ôhçÁ%ç°›IþgËãÀÿ§¨Ï9½jŠ4v×ü 4‡±¨ú©—s]`ÿ>ë;;Ä×ät‰Àášm^ž Ow"¬:-¤ûô'‘™D -–Ná "‡9È ûñÀœ­€sèÆY>yg$="âwæ„;T|e*<£½·óÏü—ÕÞ#÷ïnY:"ø öîˆàTðÉqŠB¿µàV, @tB”>8g*>Ú§W‹öbÿÔyO’ûOÓ^,{õÚ¹¢Ð;ýX 'Â_þ¾›Î‡W®OòqÍ÷µ IDAT÷¾öõIÏyÿ[ùÿ e5E Áò÷t²‹üÿbŸ9s÷Žèï‰7¶œî¢<«î-†8 <Î9¢-¢#ˆ·âF^‘­ àœùC&•aë"F–Éš¨³¶'‚Dgÿ*É‘Ÿ:- ©Ñ¡m„?àcO‡*xWÿ6 ÿ|}¹ÒvqnúýEsĺZJß?‹«[Ÿ¬Õn÷oçí”ìpµÙ9ØuYæ:owR‘ÖÐåÃ×~澈ÿ8ýã øŸþ… PÖ< •4®c%É%UÀF¡%¸J @ˆ(ù¤(`oB4µ³Ð Y€ºnè-$€«Àÿùr­ÏÒÔ‡JŠ»9øYÊ5»2ä*¸Ûªx»M:›ODˆ&ϘR»w —R¸ïžÔ•mœwÙëµUÂÃãSZ˜„û|]KÈ÷«T‚='(TòGí*çsÊómé·uµÜÿ|˜òyýø4êÊÓÚôú¤Y-óÍÍviÚÆ\whæ[ \ò7n‡)™TSÉ’‚J¼ÔGªO%XÛ>k#/]bÓ¾“Ÿï\oæ~ìçHÿK©Pšç(í?!Ž<öd¦¶ùÊOŸzßWÙ4*?ÿ×n±þœUº7G_è^8ÚÆô›¬¿MÍ·Û®ãE´À¯ ê ›H¸P¤£ùžX*Ö"½”à.Lýº­Vë´ýLÞY{–ëÎ/x_!|J…¹Øb‹-öl!,öZÛ»ß<^Àÿk¶íý‘ã/vÄ1rÿÿÛ±ùp$p즜Ø=‰‘^Lê«H'©Ë .Ëû»N’ä?ä膸µº,9¥–Ú1‘ê<ðOÆIG–ÎÝ«jYú?ßë˜äê¢â4Qâ§÷þoôÎ}ôè&Nqç?B‡óê0¢©&‰Pàød²‹½†–ýÅë6s(µmÔ´*˜2EF•ƒ¢8p †ärñõIÚøÅ•yÉ=#jEÙ{T½æåwŸÆ¢ÂvC0™úußD}JÖFöLäõQú¬Nÿéþä3YŽÚjM!Àn°÷Òº7yö–$ð¬¿Q^·% BÕBÃ׊ÜMEnÂñ-ð0ì³GÄ“-™™  2F‹æ!Ý7õèÎ%ÑYä¿‹R"û}´ÛÔ&P_“Ô?0ß;‹âïÅ ­Þ kïRZ{„:Ÿùyþ½§‘û…ú4÷kÿ5Pa³*e¼ß¦Û²k:ù¹¥:þ³$pÙ]…'[H9]ÀBXì³bî£DF¶ã–ͯý€xa྾)œŸŸBPx â¹õ_ukúˆö>؉Ÿ0°_w$ÉÐÔ€ÿC»`Ä€ô‘QŒÄäýC–ûwEîN¥l^]VÈÀ±ƒ<_:/kþO¦-P˜Ú€½íÆ€‚yûaóYƒ GšÄz{ü=€¿LgÊ/I³÷¾(×+€­ ŽæèzžµÙ‚÷FÔÌíY¬Ëm €fZA­©jN&“kÔ ’VºFg2À” ž¤ °½c9iÆp¥Oè©:å¾fð¿Q0üQÓwëñæ$€üŽxöçHqþWð>Ïç­$€¼¾9s Ýï ¦ç/EoçmùÚóP7ÖtB³%™6 ïdÜñä«m… €Ü\O®ßyäR¯wò§ï”—r§¤2-ÓÙ-ZÀ^òÛ½ì[Û Ê³Sé2!Ž´E2I1<“=3µ%™=Om›’¿2iš:Ô”µkʪDó'IRg/mŸQÑ2v(DiÛ‹J˜žû“¯¶=·ÒÌÿô\äyW”#dº.?k3Mùµ§ÏŒwNžöä_i»øéˆëAÄdÿ‡“€?Ây(À}ØÅ¢Þ:n•øÈ€}ñl“‚·È*¥_`!(êóúhë;% iÌ: àšgͦyX|¥÷-¶Øb‹=­-€Å^[{÷›Ç¼ÿ­Ï¿èÓxåíîÿu€Šï…õ#ˆÜZˆëƵœ1=!ý‚Ðûö+Q¿2†hwÚk‘ŒrÞ@qŠzA{5 )gJR°#[n˜¢•Å…¥óø´yô?Тö61" ¸ãˆûÂMäHàìcâÉâqlÏ-¶úâ`°ÁÿÌ 0q4.¶Ø+a6MÝɤHTsÊk_̈bzà9Ô>¦üíªÚúäÉJH 8—öO1q!VO—¸$£©“mÏ9>…©ÂnTη¦Ð{Á_CÐ÷ÜIS¤>¥n¯ë^ŽgÐÊÆ  Wª¨àƒ6^Ôg:ïæ=%Y†¦S“ÿ?Täö!rûKÈá—P9†xë?FÔÈLŒjéFµT(Ùœ­"ÐeàŸ¤*©4?u=ùÍ‹î3KøÆ…çÇ?Þñû7 X=ŒÜs °Þ*»Ñ¢ô]7*]ù]úÓ4D»=Š”Gß®¥quˆï]ÿMÎ:'t.œIü{gÊNŒ4ðîßø/ºØ>5ûþÜ?hJZ*QüŒÏ}Óh¹36›£[ëRÞ–¿ëÇŸÎ…-¶Ø5™{pD|à C`ÜB¼¬­KqáˆÅ]8ôÂÁ*à‡òï,º_1Iú,5@3O#VÇD ˆ’þ4Ÿ—Õæ%¦ù Ð/d€_HódP¿ø«,…>ëš¶óRÛŠ `ÄÎÊLfÓ bfsº—ËaÓ‘AB½¢-’z~åo‰ú42× «² yª›¯&ü®1Eü+QC‰ú"Àã#ÿ+¨×šÎ–knïü-TU  ®ûhV†û¯ìVhÅ êuÆz¬ëR¤Í8ìÿgïÝb,ɲó¼oíq2³n}Ÿ™ži^†ãa“ ¶†”i@†~² ‹¶ éÁ°á !‹2HHððƒeÀïø¦ ¦m@2 Ó„ É”iqF=NO_f¦»ª«2ó\"ö^~XûqNfeVWUWwÇJœŒË‰—½wìØ±þýKÒËZ&\J ¨­§ËÉ@ÿòÓ‡ƒÿmv(©‘ÿ-°‰d@3 Cò8Rɉ+’‡K¤˜¡£ÿU­~j!N¯á/š±7M»›\mü·×=nS›f _·¿/;Îu²WÐù¹ï*AO5aýõÅ<÷RÈ2¹½Ôò/D­¿;dé®o¶¹|ûÇc“—³Ãím¶½u2é'29 ’¨­ôKJ‰¶/*÷…DâÒ;–#3I`F ¶-MýQÓ£\á*›¶ÒœSí௬Ĩy?Ú‚ÿ“£]ñæì_øæ•¶û¤ÛÙ›«ýG”°é!ŽBÃA'¸^q«ˆ?VtHþ[W‡åý5biYóû¤ZÿcghwØT“ÚZ æjR¹¶ ­¥+oÁÿl‹ïv±ÅûÛBXìSiǯøüJ&N¸ùZÏÉ«=Ãi`b}«êÄߢòì—‹=eKŽ qD\Ô"íè¦Éí ò¥–(öÛ kv }‰¯*¢ÁxÛo+^qÍ6è:Sd³SNV‚s_`n‡öÿ,Ý?N„UoŠõ¶ƒœU5€1˜Š‚º×(7Ƀ)õeÒEܱ 7_FŽ¿Œë¾î·Œ7zØ®‘ó-l£‘FÆh$Ó˜ªÔÙÉ…1 Ìq½Uº¿Ú¹þºão²½jÑ=ö…Aø£ïo¼»á¹ÛŽŸýÀñà4°ëÁïĤÿQ ä_· ?’"ú‚‡èF»«‹œ'B'iÙÁJ äcJ+#Pvjd‰RxA½Ë üÜðOíägA~p`ù¶ïõÿ† º@%ÓȼÔåî0;ަ`–Á}¨sµ@X3øËÛÅŸ^¢ÿ{öÌ¿ wzDX+ÛÖáÒ+z×#ëÛÏL’_œ¢gÞ î ºñȘ$Ô7¾´w¶Î"ðwÞæ»€î<2xÔ0zÿ.Ã×Dì·ÓÈoñ+ ]X:?¼|‰Is©ª`&Ö%äÈÙ éWŠÌõ…ý¸Æ¼÷ ðŸàð⹡ë’rS[fˆšRB®¹ò¾ZþHœÿ“Ô- ’Ÿ*ü=EƒÁy“Î㓨–t í97å ¯9–ß–2 ‚˜…0YbEÔ¡švTÏ(ƒJVU N„„J §ž÷ôô®ÜàzòþÓ¬›´óO•ÉŸ›Å !9*Ûþ²zÔ`ËÝ^Uö ¿^Sgµ*¥iõ¼çûÉ } àjS&Bà[`–t• P¬TŽ]i¹Þ.×úÊ%ÇÙI“Áýz1’T&òý+“íj;ÐÒ|¬H¤¹©J±•Ò{r¬¦DöŠ<÷í÷mÏ•¯ÛÞ'’ÿå·V†YÁp¯ß°oµù#þm»‹¢ÿ3@"ÀeW𝩹‚Ü?J^žJû—u{}çŒP¦ó¾÷áö?ê¯ðK¼v¥m?év÷÷6¼ú'oÒÝp¸^èï(qp=øcGÜFp¬¥É¯óøZÕ|³!¿SÚGGó×jNß:WhÍ–»ˆN|ùî+¦,xÒ íË£¬½UÛ}ŒÞ[l±Å>Œ-€Å>•¶ùaàïü‰7žè1¾øçžã+ùå'zŒƒýà·Ïøü×o•˜¢8/ÈJð'׃ª Ò øˆôö¢î¼½XÄQq·¶ èo9âhëe°©ŽŠ B´ÈÿÇ•1F%`ÒQ#M>J*ƒTÒªX›uÙfïäí/[^ì©ÛAð?[ö'æ0ó ƒHwwýðw€ c÷‡Ð}8C½ªS|YcìªÎJU‹ôÎÉÓÓK«EÖ>²Çs±“çCÛiDäVÄ}æ镸ý3Â=s “äÅË lú}Žˆ¥Ù›d¯Õ‘-ùQDŽS§¶ó°Ó*—'î‘s¼‹ÀªV½6;¥ïd‚ kvþ$‡Ú³Ô?Isb):/ø-¬·ÊéÚ@ÿã•En¯wÊv€›GÂÉÑÕö«°¬ežUMzòºzç_Â¹ÛØƒv…s/úç {×BÔÕ1€“€{dåÐ!8tH9eCDN6ÈK‰ŽpoDw©½\±¿ú¸¤xqþòûGüOßxÀ·n wvB÷nän9 ðÜ쬢²jê`¥°BØ¡x(ŸN’Ì¿¤(~²´ñ-f¯sæ–¬rþ‰O·%ðÏßç®À€øéVò>¶c‘÷Ëÿ%Q3 DL’ŸJÈ@KfcJrß_¢0õûéd½f<«@Z%¨‚¾þþ“ºôÅ»¶uï>ÇF¶qK\8q諎ˆn½íà(ZTÿqŠìíÅ$û1p«ËQÿñ‚ŽF°´C)Êß Úcã'°²y:AWšh .½G¥{Wø-úŸÙߪÀþ4SäßdÀ.¯­èW 6jú-¦zôP›í£D R7#XI4–ÒS58ãÃŽÕp€kü7J‰þoÇj†¦ñ PL.ÿEÿWò“íI |¾;ü€Ñ‹¾NývÛ‡kcËŸQj ;¥lÊ©”a³Ù‚<æ5Ô'צ´6À­e¯[U• 1¨…\§4½‚Iù·× K»É×Ò‚“Lë¸]_åËçÎÖfrDvÞo…]#ù­ ÎgnÿOÀ#àE”úV‘  Q\˜^¤LÿKÞíº6÷b:g…Ž¢ôVBÀäíyhó¸¯Ç*Ïg¡¤| ]sÞŸhÓCHíK$í¦`ƒ©&÷Sš«wyC–È¿k–ŸMJ¼Yžötm?gMC&¥—ûJÖö5íï\.ÒMÅfå:a¢&‘‰©-Öèÿ¨‘ñ˜÷%ål¥½²Ú'–>ø²iòOSg´ûÈWñðþù¿û'ÿq™õë7/ÝöÓb?úsÂ6òƒxÎöpu±Ã× 1¨)¹z1°?¥š+VªIyU'ÁU:›Næi–©ë&ß3ÝvoÝEË‹-¶ØbŸ2[‹-ö„ìó_¿õQŸÂGn|c˃oí8ýéq e<‹¸ãHܚĿIHÙ²ÍçÁ£EôÇQM>j 诃¦Èÿ þcŒÏÄ!±üÈŸ%£örDÁ{[ì“j-s£u9^aå`‘³·`èñÇÀ½rÑÎEâê]maÐäàÌŽƒæEò*$€º‚‘DÓÙ¡Þn!|š¬‰,§p»G>ÿÇ“#dó÷‘!9L¦Nßúó¹‹(ý Éáâ"r3â^ç{s‹ÝÝï®Ðs±T×s?tüÎ)Ç=lØ ÊIœ´2÷0“Aï=tþÉ+< –EVE›me½SB„UÛD8^ÁÃ;‡™9½TA¢9üKš"¦­ˆ" ñŠ{1à¾ôääljw¿oýx7…µ3â^ñøî¡›ýÖÿG|ïá=­}y÷ì¾´uüè‡;þó[îuAÐNqƒ© ùÑ¢ZÜhrÿ*¶®­˜\ŸòYvAè¢Í¯FÛ¿Š¥èbR ˆŠWÁ«eëè01¯Fèy Ã5=F"8rŽN„?óߪQ2 ’Më­}æí/}éo”þ ¦HPAšÜÖ²OÈ_*äV  M³Ñø¤3ÄOë]ԶК¨µ2jxýÞc¿þÅ»Žù»7‰?X±½ˆ'ñ·9F6úˆy+KùßHë\šÚ² ÎdvÓz‚˜ünÙz“ù/¤i1b@{´DIDV—ž; \SLN;Ký·àUZ¦¬­ßy<ÈÙ³Gz<¶`Yí/ThÁ22P6¢p©r¹ïÉIš]¯µç$ít fà·”… ®ëÒ> à/¹ŸKpŽðŸ€ÿøŸÿË~Jä®Nº– PËò¡E¿¿ù,Çz¤¦j‰ BLäGLãcW8_‚ÔN<•… À¿LP¦cÐ<6΢ 9€*èŸ-•pèº/®ÛÉòü¯àãŸÿ9"Þ"ÿÝt]|¦5ÇËðÿ6¨¥R©õ>'”+nï KëEyï_p{»^×Sóµ‘kŽœÊ =÷y¹µmZJ+Lu”½XFú’*­€ö´Öé£=ßC8$)AòI*OMc;j݇d’HÓNr»)ïnÀã%Ìú§¶5Ë¥^JKí«öÚUîÏR4ßC¢ßH=^½® øCJ¡ûmÈî­X¥ÿ¥í7RÝ]X> @ŸÏsr•v1ðß\Ïq«¹O®þ¼ºøsèn{¾ð¯Ýæø3ÃýÀî~°:Êð o³ñ<2œEÜ‘0žGÆóˆ?âÎ|¼®§nÅÐúr«o·r5î˜|¹Á|Ã4J9@«îZü¼ˆ“&ø1x?Zl±Å{œ¶[ì Ù _=þ¨Oá#7 ÊÏþ‡/qò¹Žq ûÐ a7ça8vg‘îHבq­Æ$Ýi 7YI"a@›š×åMçͯ¬Ï_Dd¥Ès÷ã¯â^ù—€?ø?Ðá}ØY_Y~óÈ$è;¡÷Ê0ÈÝ{INVe p¾5Æ¿;:ÿH‡ùؘ¦è†ø0ŒÊv0gôÉÊœ‹ÃhŸŠÝ]÷žÏÞìÜ_ ¦tÙØÜEß!Ž'(Ç·„ÝÛ°¾ CHÀM3"rÓà _Áýà½÷ •Î;éˆáâu õ¸†}míùÍç¯õ“§f/cä­³GG¨Hðƒâí»øÆÎ¦.Bìá(€sà|'Š›÷¢tÑdM Àˆ+CrÎõË¢û;¬fFŸÖû4¢üëÿÅ·‘ôßKWTý®‡Ç&W™¿l݇°¿ðÅ_Ÿ8{£ÆyV]Ñ(d"@uô¶DD<©¾˜¤˜]dÓí•ùv}ê\øÅ·oA,¶ØÍß»AxàÐQ6BÄßRâZÈ'uÎ<ºÓÄ2J‘ü[Ý€:g‘ûIn[ ÁVuèq´qí FÈD€>-‡¤0‚‡¤e‰.=Kl‘õ/Q(Ѷ h`¦ù¦ÿ11±÷H<®GÈa 5jsŒÖ2¸VÁ×ndʸbL4Í© Àßts2À@Îÿ*ž®%w÷ö0˜GþïKÿÏÒ0þµ%›µµ0]\³Øl"Ò<M) [?•q©.µ¼ãvåi.çzoÖ œ8”Òdh" “,e—Ÿ ”±ó<}D»¨µÌæfàöåàÿ4Òßàß@›ËËMÛ³«¬O¨µí¥*ád »ªÚ*M½7Ю”-Ò¶Z…Çö-3]—k@ò=&P—I›¯¯32ßyùÓw9=ªD©ÃNEÓµ "’'«Lk'¥ÊýÔ1E_ e¤}V€<9ú?ÀEàÿ|¹éCRÿ±·nÖ´2ø“ïóï$åR›W´ŒÍÐþsˆP{ÓJHm°UIÜëGšþ¿©w;—z®- ø¯óL¶½ø?þ³½ð•ÅŸ °ywD%2ܬ߃Ò8†íýˆ_ް½ˆÉ¯0|QÆ^,Ðk‘NJðV êšv‰3ŸmÌiÆVU€â¿½Èg»§êšM(Ïβ ‡oÙÅ—»Øb‹}m!,¶Ø°E.Êlýîˆ?ÂZîÛ ÑŸãid8 øcaÜ*ºU\„ñ~$îe|`ó¡üy€˜y>d–(ð'EüïEþ¦ÇfÀxà‡}Çù2 |&í:àÿÄrtˆsHḱ‚îñ+Û&*ªqÁ€/ó&G•›:G®â£TE$ànGÜ^An={¾÷âû)zEýÕöµØ'ÇžŽ„ï½aÒSPñ¨—}ùÚÆ¯½·Ÿ2/–þÈ!·_§ë~€Ý­w`õ;h'H¨]߇ir7Yû1 *ˆZ¤ûz§ìå¨7ð_Z¥ÖSý$^4]óv°”ÛA‚ü7Ž,]Bç9`´èÿë^»´3P1fp&}ÿ.꾞lÁÝ€ñ=}=»‡n£É?—‹B"þü]‚>nÞ³ÄÒó¨zôn@ù]{¶>(ݵÌKÁñå­ã›GÏŽÔ΋£ðúÎñí·¶pÇñâVè¶Ê¸‹øÔ»]HÓh ¿ÓîÇÁßN=½ïHüPäÿ;±Ô^lÙK÷}³>Ëý{çlþçÿ£?¸xÿŒØ/ÿįæÌ1#·¿‘GŠ²Û“HÎŽú– ö~˜d@h£ÿ[›€QÌ@¯É °þBúîã+Å{ˆu?¸ÃøæŠàÂàóÞòCvÞÀ—¬;pŠlºñ8ѵ¹xdpÙí^p»Îžõ£COtÁT€F1†Sp6&ˆöDšA˜CBЬœ«}|}èñÂ%¿Ÿt* ðÔ‚NéÙ›'Í}Xº¦öü %Í|î÷Z€ëÀÔÀ8I zúm–èÎY™¸[â¼çÀÿ^ô·J):í[ÀÿÂÇL:‡‚©Èü»4öËûÚÃJs4w£€ãÀ–IùÙAÇôN&(#hRpéQÓò*A,ƒ¸ àÅZ`½ÞyëÚd<6m¡AÙ=ಭïfÙÒ mz'µ­Ô}Rê°žˆä'Ÿ¡ñœ§=Aý™0ËÝUK{Ÿ_pÛ"¤t%Ý­™é‘êIrºŒt¿´êíÞ¶¯Zü‡Ú6RZ*#&‚QCw¨B mÍ)Û¹LQ#"IM”¶•ïãF “E)åe÷½”c5­§œÏÕMæÅ]úžò}þ·Ñÿ{`û))EÜä*sÓ/ýLÓ¦Z"¥mØPJšˆ–@YÎמ•Èk¯Ð]·ÇlŸµlË!ßKÓ>´üjÖWz^\ú·vòÙ.xëÀp?òÚŸ¾M œ)"ag} *Ĩøc[Sw]½èKjVV€8[N>ÛìÇI½•`M&n[nò麨US Ìü¸˜.¶Øb‹-¶[ìIØÂ5ûþß{Àgþå›t·»{Í{#«ç<ãY`8&ó?Âð ‹þ?ø•6&¥(am£·°UâÖ˜¡a«¦àÒ 0`ó‰)ºñß²DY(80]ì“gÍ z~9°{u)r6ÂxŸàÞFúçÓ‹¿Cõ1¼ƒî> ŽSÞÒ¥x-ËN §È‰Ã½ô3ø[?Ïxòÿ ïý¹')+û™x‡†ýÀF36üÜw‰3%sSHŠë:‚ž¿O<ºgßžßE¢Xö‰êCú§.8gŒ ­jÙÍ` xç…“#Ë{£2F‚*N„UÞ}üS(Ùº‰lwà=Ü:¶k?êk¤¿%Fs¤ùëfýÈýYöâ‰5Œ ëœÄ-lÞ‚wÁ¯`ÑíÖ#º‹ôT,¯s¸ ñÛÿ޾…nz* yêˆçÝš–½ª·J¾f]}mÝñˆ:Z IDATͣݵ~ó¤ìõ­ãÞ÷vüã;Я”þÞÈÆp4V÷#C*V7*]ÂÈ\̲ýFp±ý šŒ§Y¾ßÀý“ð÷Tð¿KŽlÁêÿv牒Ì¢xómóÇå›ÓñI œÌçá™Ëü›?þŸN–ãìÁV#þ“Ã6ƒûZÉ"n©Gü+èÉj¥“Lû&ƒˆIò÷¡6ÃÓJ1¦TúúûP‹-vusœà¾ó±ÙžømG·rèNL®×ÃΖ ¸?8tp Ôw0z#x¥Œ)ྷÈüè!. ¨ê“ø×œ_»æóš=íBŒéž.Î÷ö"À´“š<ÛŸâc~J@¸ø› mÁ¶¦Å%ÒïDžßP@{†Kí÷Ç2žª ìºHæ©¿qé”§ýSÓoû‹ô•Ï© t\ênü·‘ä“r›ÎÉä[)_(4—Kj;…š7M³.¿˜•ªb#æÜì*nC.›ÒZÔ¿bz:4.hQ{âwnÚfs¡5½-䯤~[çöÇŒ¬ušÁýZ×®€¶¨E¦Û”½4)'{^æHëTÃD.•³QBj’€ -¹Û#ŠoAÜÉ4]‹fпŒUS mÆ…³—‹–’žÕ ˆÆÚfÊEÙ:ÑüÌo@zqÄXÉUhSC&×te<ÐÔ…”ãÔñH!‚äóœ)F$4m¤m —“€þå§ÿ[Éûù.Óë“ËRÛÒä·™pD{oi­ìþ·óU5‚ ™2Ii¿Ç8xÁÍ-Õ^k^®÷Q^ßΗß4å”Ëè]ü_ºÌÎßøÜ¿r““Ïuˆ3mXG ˆwæ³ÝDÂÆTþâ Ä )u+I¥5EþÑÖ)é[5b‰Ü¿–Oîâbï_ïe©òsó øxZl±Å{ܶ[ì Ø ?·ÞúßNY½à9ùŒ·xS<É•¢®:ìE®ÉX0{Ò|nÜVyëtàä9Ç @ç”x$*«AÑ•GºAêáhPÔC¯¦0vjÀüÀ;þ{ãµQ@ŠÀ<ê@“ì¿=ß~óþâÿð¯‘üiÛŸû±¿èà?7í;l‹3>>ôo"m¥®%‰ïï<BÂ懄Ã=å‚Sàõ{—^Ób‹=ŠùÝB·°Ûîðâº388‰ŒþRj(¼ Þ!3ðNm¬ ꬓR“óu¦"•¿Çƒ8Ë!/]"Ørˆ‚ ÎðŸèêø89Ôó]Sz›„Ül¨F€V«c“tßNÆ·û`Ö“³CeŸUi[º²uàÌàÀæ,h½Ï”)ðT÷——§àT{sYIÉ)ý^ÉI¯Ñv¥9ª›õŸ€þ à¿ú¯ä€ ÿu¿6/ftºNÚõZR“igBr‚‰‹ñO9ß è§å~†ÔÚK -’TÒYysK )ú=Ÿ²æÝäú;øÏmº²€¦åÛ\¯¹®›'ؘm¢´¶Ù>¤`|ÁCuãšÌí‰ÀV$ÛçD»â¨'VJ%€Ì¢ýk}•a¨¸TÇ®ôµù×—n-åNõ½¤×•¼ÓÏ'b_Y£‚sÎùfc…úr¯%í@n1U¬EüÛïŒpXr_•F¤kÒä?²=TyÕÑÔTˆ4ÿjMû™üŸ€ÿ4ëfã"™}˜µ«¶í@SÕ{©žŽ6—U«2ƒÿõ>*åj56Õ½ïå7–LÊ@š{~z?Õ²˜ž·4û{Ô¨ÿlK@—Ùp?Òßrt7ÃY ì,Ò?ݽHwSNp½gÅ­qåT­a§I±5¥puªßO³zk£äjcøß¤m=úçïZ°¿ÿ³]ôž´øz[l±O¨-€Å{öÂW—ãÉ+ÝMǽßß⎛wbPü‰#¬•q]õ"Ã6Ž* •sAåAa’ˆÊLјءu ¥ ΋<Ô'Ë® þgIv(æë¨°Ä‘Ý]8?ínØ ÿv‡žï`­èÎ¥¼é$ÿar^ÇéÌáª÷!~÷÷Ñß„ó-zOŒX௹¿Å>YvQ{:ä$×êv•ùvÎO}ç)ˆFäô­Ýnzî-’Û_?’»¾vžY¢V’×4ª}œÀ*G¿;“ÌA„Nì4ûŽOø/ªSVÝåÀ†ˆÐyåæ±¤ß]ó@™É–|ÚQÁíîd‡Ü1I¸Vt­¨‹¥ß‘ X_ƒõ7æ¸t0j’„H㤶™cûQì£Lðâ(üÒyÇïÍæ¶ðòŽ6‘¡7 ¿!xèfÿ}40>;„}ÌÑþ ÈWö;­ÑýEú_,Goç„>Íg°ß¥iç¤Ì{î޽ßüõßIã’7®æ¬zFìϾö«D WÚ¶é9ˆ!”èÿâÜÏN놜øN\Ê É9}]Ê!Ö™P@ªœÕs˜zu²~jñߺ^a,¶ØæÞ»‰l:Â6ÎH9à AÄÈyk‡[©=«·¶Þ:›ƒG;µu[ö<2Zü®D£Gû’¤²Czfdˆ$Ýo¤ûÇP.“’(HtIbWŠÜ¿húšªGŽüÏ £ 8é’´8T-ÅÏv'&Í¿T£í—Z6Óʸ«/xþ€jB|ÊË ¨ÕF²Š6éîS~ûŒ3?ø³èÿÏ·£ý ìƒÿíÿ4waõ;¢Ï[d°°%”&I•sÙä…˜$Ü]w+Ð*“ቤw2U!ŠAàd Òÿ»éùzv wZ.î>ÈÝÖoÓŠd^Çé~›¶nö±«ÎŠ“gc>‘Ôß3pÄrVVà  CEѸ4Ûùtßëò©Øx®g©œ”Öí´¶±ÜFrÖû˺¦~Iò¼˜ÉÃÓ5õ’ ù ЯQK]ɰ^ƒ¤7‘ä“\ä:!TÒB¾_ÄüªÝÝôžµ¤C€÷¤í“fëÊrý”–ÔŽëÛsH˜Õ€D€:¶Jwt)…ZZ¹9“ÖÐ^º´ ³uí=Þö›MY]ø‡ëÿÇ‹ü?Û»íÝ€;vl~0²þáÈêŽ'l•Ý#ò¾gmßÄ)¼îî›J€tÑ6U‰+ÄKõãFûcœ‚þ$?®¶SMç~^f>ß‹nŶ¿Úë·{¶‡-‹-¶ØbW¶å©¶ØbÙ¹(³ÍFŽ_êxîõ• ;¥¿íÎLæ_“«Ï"¸Ž¸My¤:Gc‘*’Q£µ1Ë>%R€f©¨hS²TTfˆ`‹^*Õ’Ú÷Ý‹œðË ð™·ì´”R§:©sFŠq¤ƒ!â¶;‚lAÐtp¤³ Å5`mš> HI>çvñ;ÛßΡ®ûP€ìbŸ2»¤¨¢úqnŒhB™5$ç–s车å\÷!Z“õÎ:üΉžûc‹ìw®žrßÁíæ„Ê$€,¯Z …_ó1»®z¾’€ßG?P*'MÒÀNá…÷ÚÏ¢»¼ùñ>¨—â ±öwêg‘ ö(4Þ¶'ÒýéÓžomû~/³/î|Ço ¼ðŠÇ¯#¬¢ðƒWЉÒšr<€pî ° ÂèL`MRÿí?S´’øW“ü﨤€N„NòÔ>½þÔ¯½1—dÇúÄZçÔ34îø³¯ý*tŠÕ¹{bI±Æi[A„Jmœõ"€+âÎ9Ö3ÏÅDpšä‘Çs)º‡×ÿÄBXìÑM>8&†ˆúÀîÁ–¸ð·"ñÄYTL‰J}„Ρç½Eªª¸¤äÀyè"2z{˜ºˆ„•Ž#Œ‡Gœ‡Á#Ñ£~0‹.FâpÁ¾€Žˆ$2µ4ïLI2>*nì @©)«âá™vb Yí£à»ÒjÖÌ¡¯é6gaª|œC&…QÏl  ‰X?”Ü’˜Dš}ïo ZM®¬‰dmHIÀn&éÕ—ÖB®P¥ÔtÖOÿfÝà¿6/ÁWþ/°ü®•@^»º\€ë¤6Jõ÷ŠÂ‚¦S¨äz˜ ˆgvi¢ß]’—´4)“Tž­¤ù^Øÿ!^À¬Z'fÚ mÕõõ0=ãÀ,Æ??ë¯Ûv¢RI™ Ó4uìfëêµBÎÓ>©}ûN Æ€:omI]B±ö" Ñô0Í©rû¨¼€– KiOEí!Ÿ`ÝtÖz¥¦* ~Ò3¸Bz Ü"&¦Ió•²$²H­—.!–zËûhÕZâŠä6™HÍ/š2i­ö€s“Ùz;^ÛGÔ~°´”¶O¢¹Ž‰’ÄeÑÿRݬ­·\®šÏ©\JSÞ Y Ô…Òdh{ß ®^꺲V¦åSëç@¹xN\øÏöù¯ßz¤ß}Òì¿Ê‹ôÝFÂy´÷yUâÖÔæ\'Ý ÇxqGÐÝôŒ§í »é’?W‘¤·T…˜#þ'Á]ìGügÞÀ¾—:]|·‹-¶Øbû¶[ì1Û"ëwGÞùg|ö—npÿÛÎÙú8ª±A‡X 9â¿,5ò?ŽšT(9¡ò´0D›"JUhAýLân‹° ?†vÈÿ±”>‰YlŸ’ò›¢jѱ+‹Æ*i…U,rjÄòfR¿,Ÿ)>sáù¤°hÁY;݉²c§s[ìÑLA¼µã(áÛ yoó©^y¯ üßì”a„£•p²²¾u7Úú¾ƒGxN¤pEèüÅ’÷y»Qé½)|Ìðÿ§cª–5¶N^סÜ$Œž°ó°±ˆlKƒALÞ¾$Î’¯³õQ!Wµ_XwüMžà3£Ày{;àn‚ßÁ=Å% +Å¥ˆÿ 𫇀⽠"xÞÛöÎA•.¹‰%ש)ø¯t}rl­V™_Ð!üûÿý÷ŠƒKVL¥,cƒõÀôáòôÅ.´ã ¿RAÿ‰d´î;ßZRJ“V2ÖœÑÌ(…€’ ”]™Ûß:¹DXH øÐÙu^ZÈ,öi2yï2:BÑ:Âä(7=ºq¸U4rÖ èì2q2:o¦y‚ƒÑ>2z$:$ÉϽf¢}\ZvÑ$þE=.æF–ɪ/’@K£ž£þA£ÉÆ›zO]nIJôwcšP2-ƒï´þ™yÑ:Ð!\U2—À´ þ»©Ý‚º©G› \¦;o#o§ æªBŽîΠFä2 £ð­j(±©§ø¥ÎgÐeüOëóÿÕÕnqQ‰M7®D€\úñLÈm&ý&ƒù øGòÓBK^v JÇ7µ¤ $Ž©ÐV6i | žó¨>ª„Ì—™¯­9öd{QÉMiÚIîOÓ`g9”Ô…Trõ¥½¤rÕº.çig@’ý7ÕLˆðªVvâÒøÒÚ jËy%$¸ÔÐ’Hò´òî¦ãR„eÿíX@ !0äµK$MýÉü ”³¯]m¸4ìUbUJ´óš”’¢cŠç»£mmÿ7¯ÙéRžgp÷¥àå¾)÷K´D€VU¢ÿ¹]^F\jÕ&-½½ù’"‚¦}V²mwà /±ý{@šõóµóóœÛ£‚ÿÏåè‘~÷I³íû#/ÿ‹'œ|¶Ã­„›0œü‘Ð?çÏ×Ãx®Œë€;rÄMdÜXôÜ*ãFamA`neàNà:)þ`›RÒ_pQ‡ÅÔ Ç¤Ð}•÷(>š’¦]×b‹-¶Ø§ÒÀb‹=f{ua‹v‘ÏþÒ Ž^ö¿ìÙF†Ó@wb¬Ð°V¤‡°VÂ&"½0®#a“…;%î,gTöÍ`°´¦˜¬ŸNc;@lÙ¤y°˜I 9  â@±eù‘Ùµdÿ øŸ@U W¦*Ì Ô@þÔI 1†!æpR?rñËg>"HˆFBÈç )·¡¤‰WðäÀ·Å>%¦j  Juxæ´ª@&®AÆQBZ®º{` °Ù™Sè8ï8*qˆl×Êà…•w¬ú&ª¿ž^™f.‚4mÊéZ9ê¡ïæÐÂb¤hL¢Õ<–:¼¿e~°p/à ™ŽBt ,͈&W·*ÍYj•‘s7]æÞ¾Mˆ#ÁÈ™€ž€nGtcãKÝšCÜw [­ƒU4°?äOz_ ‰ c£&ªjL@?éaÓ}¡ ÓDðó6u.Ý{šžýB0­tH‚gÔ> “`ÏaEHdVIÝUl¼\NVºƒ90þ´íátÇ ÝJÁÇHÀ€ˆ\Ú(`bvç×99êh,eøUÖ‰Ô 1<³€“³Evël9×X"jLÁ«¹ƒà¿ÎRÿ_níù5WŸhÔ €m,$‚ö~4!‹¥6¡L•eãÍ cÈ)* ¾ÿ—ÓLT Ĩ}~4—GE•¤B· iKëhH–¥­´´šqx¾“ö˰¼+’ʦ‘ײ÷UMm´¹‚rM•£ZûmJ(&LJӴÔdK´yÏe ߎíÐ?Ÿ³P;“IÙ5̆ ™(RJæ骲Â4-A‘oiR:!Ä®»üŽ¢aç-¹K¬·…är–¼@nßåüË5]Ëdf xÏÉÓÉ,êßÍ€~'¾„L?- àªàü”k'ÕšäqM{¡¦vhPxÑš9è¿¿ýeÏ“GÿNùÀdýÃZmºSξ7ÐÝ¢°ý ^A…ñ<‚¯ ¾Ž5x+si00ŸFö?ùóT­Ÿ¶÷Q`gÓ òç§¥‘Û)|¨ò ³ͽ|Ñ” –[l±Å>ƶ<Ù[ì1Úñ+~0›wGüÊÑ8¶wÃýÈê9ϰ¶¨ÿî–$¹“Þ»hC…áA$ì¢1@wØ rP†Ì mÙ =à’7jÆþ,ïªIÙ½ÂÁà|~±Ô)ò?9JóTrx¤7ÈÞ‹ÒV0J‘ÄV(θ"ûŸu˯ý¯ÀÀ{9A@=Š/û\ ÿÅ>¬iÿc„ HÖΓêøb€@H ™Ó+“b„í ŒQ9î…¾‰ ãÈ‘DvÙn»UGïA…ݨŒ¡ÞŽ1š‹°óÂÉJXõõréåÝ~#ª|*-“)Æ Œ»ä^L²¥á¾gx‡†À±¤3‚ǘ¼$®œOu/!9Sÿ¬´Þ“'Ó#}mÝ=1ÀOíë7¶üã[Âó·~£l¥q„¸ úk÷óE¡‹Ðe…A”> ½Ârâ:uøkþ”y—>á—ÿëï TPÑë:‘fþ"Õ|þÐòc²_þ‰_C5¦<ßû;t•ÒRñ´µ§7]–ý—•€‰A&%špŸá @)ˆ’HšÜ÷IBºlŠ ”s+Ói»¿øýk–ÞbŸ“{Ç„¢}`¼ ñ|‹»¥èt;Xtÿ©#nA:кtë`—¢j7ÖŽLºŸÁAd°ˆ¼Eÿçÿ¢ûC—NMêß"þ=^mê4)àS¿Õx†KS0”OʳE“ü'KÆG›%)æi=Îú„˜¼ó…,A_lúÌY‹µ—U3p©í}šhÛ ¶UÀqÔÝ{~6àÞX, ÖÕžPê Ó:6LÊ ˜}YôC¨Ï–üë:Ÿ÷Ù‚ÿ®îrÝ· öÃI(MÎyMåRàÿò¿€¥ãNeŸßÉ —ÂhyÎì¥BHrÏû·í3À™É.íõUèi œÀVfóm}v5gÓ×vt—‰šy¼–½òX_2xžy›·ÈÿDj©\\~7%?“ èÀaRV͈%Bì ´YÜ'VØÑ¥^s¾£RûxXz X%ÆsE¡ËqµÇîáÌVM)„ÒˆBÊ7y Öš1›Ò}Ú"š×Êì2çÁ¤‰´k¤´¿ijHGÒ’Z"€Kj¹.ëï ɨiƒW!gµÛdU€Éu¦s?è9Ø•È ÷`þ Ïá}à?ÛÐe¶ùQ`õœçÆkãy¤¿ã»ûîŽ ìîGdÝ Œ[%l·¢s•À®!Í'¯šÈj©^£w‚8¦]9ýk æBmžüîÚ¤¨ƒüfú ?[l±Å> [ÊÅ{ŒöÂWù€ó·GÆM$Ž‘õ»#ÃÀú]a¸Ï"x!e<8ãÆ”ü‘L@þVþIƒ[À¿aˆ .÷D³Ìtý|zÀo}xÀ¸ "Ÿ}›Dþ'¤,6CÔÂ:•ê'ˆ ÀLïûª”°dñΪ½þRC–]ò\ö2Æhàÿñ€>À t#Ä{Aãý¿Øc°–ø"’¾w1áºé 9*±|{Î%frr]¡ †h2ýNà¨v<4âîÀ§ïÈ(ÄèØ8]+»±ú ‹ÿ©8YëúÎ }§ !ñ«ÑF¥þRÿ1*ç£"1Ð;Á÷€óx¯8‰¢8ôàV ½K¨CG‡„X%ç#!$;¾Ÿô ëŽßw¼ß=¾êgF¡ß*ï¬N^ë8”]P¼WzU¢UDÀ%xð!]ž³ÈÄäþ»ˆ<¬¢¥±ðÀ‘:: 'Eø;±e:l»N„Þ ÿê_{£Ž/Æt’ZÛÿÜ~pþ#²_þ‰¿Zÿ6êBÈóPa¢)(°1I3 ‚Sr Kã6žµ;4–èÿìž7x§Æþg¹b€©69&Þûz"‡ èO/Ñÿ‹üðq5 .0~ èv@Ž=âFà(2>°±½IŽ«‹Ä^`Ä"úQ„ˆîħ."±Ü¸£5šÓûÎhï;—ƵQƒñöbò‚kn¿é.ÉɧW—@.ÿ!ƒJ¾Á¶¤ôSõ®NT€L"ßÿ1ýZ߯&Ï‹C™\°þIÚEϰZ^äßß>«e€1hN2xÖ䨾2˜¶øK³^Ó³ÊÀÿ K@Ù’±€Ã}4õ{R?½·Î~\Îèàòc©«I¯Ï”Ð.[¿\Ÿ#ô‚4Ï)Rõ9}U­·)Xš-é½/¼¶¸WVõè¥17Ó¼¯¶¬öŸ!-è_þ—6qèœH©S©’ʦ´ :Ko!\9nÞ¦Ê^f+8‰¦n¤å9™¤ðù‘Â'¨ïôÙ^Ú¶XÛY~ÎÖæ4mGõŠçíK¦Àz*‰Ú:š¿KÒÙ®ô†{÷¢PT\£1¦i\‘i1ƒÿ%@žO÷¥Ôri»?ÍÕ:;æ¾Éd¶%ƒL€¤^›´ýM+ûŸI—€WH-Q -£g‘¦WÖÄþõÀ^z¬¹=ÀnKJW³ñ,⎄{ÿdk²þ^;l•°5ÿBØ(çëäËØŸ‚¸ª*@MíªcRp«·f°¿õójæñIQàÀ{Õ3öNµØb‹-ö¬ØBXl±Çh [¶wÇŸõÜøÜ1ÃY »åð'Ò°>#q›äýw‘¸«Ë™!mrAÕÁb%h•þo#ÿƒ cÐ)9 ”É`²Pî)´Ë4ˇ|WËàò‰Úueÿ­®´FýǦÒ}ú¸ìûÚºûЀŸßxÞûî–ÿóæÀs7„þ,òû¶ôÎÑ£Œ›@,Ò?f)ÿA”>˜êv ÖÍ͸:µGBàþëàyóÍϱ9?á¯ÿÏÿ+£*?‹t¬ëHëŠ]3 ã” þgàþkl@£ ü·Îý– påoÛWqì%@còER*Ñ8‘çÍõF5]xi£  Y®'y µv*Ä5 @_<‡—׿ŽÅ>Ö&÷Ž‘³Ã{Z€}q#覣{uDеƒdÑs‡8EOFd â!:±Ž¢W"b/.^MÂðÖ Dm‡¯I濳ˆæ(&åªt‘òO O޼Ez"ˆ$b@ø¾D~šÌŽr•„{9jD­€¬€nBêÿ¤¡Ù`ÛÆ9Ê¥{³û|ÉwOË.{–ÉlA¤‰üÏ=D‰Å-`3mDmžOýÌ”fpøYz6NÖá$5êã™ Èæ/* ïÁ¾›Fÿ×å)<ÛöãÓåÇg3@Yn×ÏŽÞ¦†)¿(W^¶-ÕA׋„¿ó Ï®$•ª^‘¢¥ HD€| -'3mçõ]3ÏÉAði ®f0^ËP»nlõ1‚"D4)v8q()ò?û"Ž˜üLšË¥‘ÈbN÷tC@ f]±´ô$L©ñr­äòj[‹½^7i(•ZÜ#Ljw:ÿ˜Ó Àƹ/³÷ú¬®«5ß›i\¡Ò*ÙPËèB i$¿ki>ÿyØ¿N&{Öþ“eàŸôŸÏïƒÿÒ,OÔÒoy¹}xðÿ"{’ª†O øxõë7ŸØ¾?N6®#_ý+/sãó‚póÇzè”°VÆuD<¦  ¤À. ð [E¼ØòÖú¼°Ž„MD:óùæ0é$©¾‚Š8jÐ׈©m&Õ€˜‚JJ¡𠝋ºšÅ[l±O«-€Å{LvüŠ_Ø¢ ãY§¸NðÇbj¿ä¥ÞÖ‘ñɺiÀþù£¨Ô®iIiNó³Â€úd6ìRI/l-á4ãíÖÎó@óöO²*€è, >7n Àf¥¼3Jó¿<ÅÓû&éÜÅ Tƒ©Ði@ðD‚µ:qv_æˆþ ì¦ge–ÂÏ,m¢¼-„›ñZ°=aBa9‘žùEub:(m­U”häsbà|”p edvEéD5=PV ²qCS/y7Z¨%@¤ng$;ãHö)ÌÏ<÷pM­¶_SçÓ_Íw$¥n*y£ö%µŸ™ÿ–Àðÿ"àª\’/rñ=²ãW.ÀéwvˆÞûÝ Ý K·}ߢþ Üà{,¸+ùa[çuP¨– `—|¹c¬>Ý4Æ æ•¦ïQ¡>æÚw…Is‘?W¬[l±Åû”Ùòt[l±Çd/|u‰þøöߺǫ_¿Å­ŸìÙÞ È‘Ðßp gá°z†þÄsüJGØKÔõXΨ}œ§äŒŠ£”´:óSGAÑY£æ½!·#Í Ç|KÐÖÀÔ ±çx¥¶Øc±MyCÔP^áHq'¹!È­›prlu=néÏΧèÔ-1åRWƒ$G”CÈ)x‘ †0ÞWÂþrô-Ø p ªüòþI´ƒ9¨yBQ_ØÚ=¸^q7;ä…×çþyÄ=ñ!ü.Üÿgˆ æ4+’°ì÷œÿd'¨w §Û{;D`åzºÞãZ§Þ5ìIFŽ|ÜLsŸš3²O©Px0DÎv‘çoGnÝŽø^p«›ø®3éz·¦ï·¸çžGný ®‘cˆk­r~ŠžÝE:Ð]ŽfÒɱkÙ ð<žºùÚºã›G»+oÿâ(¼6:Þ~sKìáÕα¹é¶‘~%øûàG%x‹úï‚al]À"ÿ]ZoAn¬VQ؉rƒ”p*øéGÏ;ßÿ Ûósœ*ô˜Àöoüíßj1¯h@ºbâ°ºlþÐò°ç‹¿n`ßøß‹þo`¶©;¿š.:h*„2ä:0ÞÊy®K_4ÙYvÏçÈþX€~sêÏ¥ýäi–õO¸HsöA…ñl]øÅ7¯P’‹=«&ïÜBoîˆ!OSÞ™Õâ= Ô÷Ñ€üSAw ;`Gþ1‘FÛ^ Y‘ æ´^#%™SK‹ü¿D@sZ*ý% …Y:Éi›áI{I±{ÓRº¨D:¼ZTj¤3B®"§9ÿ³+óBL¹³kTlþ_1«,—.Þ2¹=-R·½™kÿ×€bÓÉS190S¯xEÜ‚où'"Íï -}œ¸öÛºß+<#¶N¦“^6½æähl* «• Ђ°—ã²Ñ“°éK÷ÃGˆM8Yò^9ø#­`¸¤|.•à`¯%Òßž&:Y7yÖ•cÕ[Á×uz%Ù¦î-G¨÷–N¿W‰)ÂÝ"ÐUL‘ÀE"ˆ†ÒÞ¢ÆÚfóõR©R"Þ)Êš Hyn—4xÍ…åû¶íÙ'RÈ"æwˆ†м/ï×ÿE5}Á&˜È DMDÀÜÿ´Àæ;¤mT’ŽPR^ \»@_ìÿÙ)¥Ú-i$¦ˆ£è¬¥Ì:§üÿ à0`í_ ެûRMwˆ\ðq²'ùŸmñéšm8}sÇíŸZ±û ²»èo:bTÆÓ€tÖŠÂ:"^—æ;›[Ÿƒ²Ü‘ ¦›|·1¥&dTúøK&øÔ4c%òìEÝÊÓl,¶Øb‹} l!,¶Øc²W¿~ë£>…ÜN¿»ã¹Ÿ9F:áƒ?ØqúÝýÇÖ›ŒÔ¸Vº#c††1AÅ 3ðß“¢ýØŸ¢ÿÛyK´ä– Z"ðrÄqºg}Øœ²­ý€yû§^–i`ÄÃü"ËÀò±Û£DþïYÔM‘¢7:EVNòâóÈs?†ô/›CHï¡ÇßAä‡È`pÈà‘*Í/@0Ç >¿š_ 1ù2õ°ÝEðCzÉñ5úÇì%|±«ÙÞ‹©P:™'éx‘²Ü¯ ÿÞ½Šën6ÇÈø"„-@srÑu<±£c3([';8òB'"×Ü³Ô œ¥Ý_j¹ÌLÐD øG Q ÙFe'ÊØ¸åñ·Ÿ§[½Šã&Þè~„ð?þ3x÷¸Xý+hõ÷@b^XîO³Ü­Ã>²î¾¶öüæóWÛöß¾·â÷þß3¾óy“ì×Sx¿ ø  ÎÅ©IGºœ*Îð2º¢J7šCÝ› ;Ųe«½¥¬BœŸžðƒw^Æ©¹Ò ¢#á¿ý{ÿ D§ˆ'{-f6qýêÅë˜ÏZ~Ìö¿ô×Ktoû‹ô•öÍ©ŠË;G ÏÿI|ø"æebë *C‰B,¨Jnräzrät®8æMBIb½ŒHÇ) gkùyžå»EHÀÄ/¿ÍÒ]죰ÕWÆwl:¢‰÷ è¢ü[}Š:Å¢õwò³sòïÝ9ÄGâ ‰¶Œ‚<—"üÕºú»øñS4E÷«3)­Òü%w9ŽžI²þÐ7ijQž‚s¾YžF}¶ÿ * ì?Y*¼ö_õ)pöû"Q%:ûÐÕØ|ßO‡ “ù+@ò)pº˜eœµ‘þåWm´­\p‘MHVå_îqÓ§Qoh_^§¯³ÚtòûI=<Ëí­©QÞ³siÕ¶ÕLž 4C’4DA*®’a‰Ð˜éb!fÇVd}§Ä·‚—}ʤnj++ä¦Ñþõró5¥ujj7ê*°æs“ô™¢Óµ‚À¿âÉé]µ¨¤gg&ÖÅz¶s§H{½y\0%æ¶×<_›årííø€–h戇ØtÀÖ)×MäDˆj#…üÞ¡¤w­m&—•¤= šÒ/ôïTe2FšÈ­¸%µ¤oJÅï_ãþg¯Þ#4ýz+ÿ°ÏŸü.í÷c þ?-ûüâÓàþ·¶ÜüBÇÉ«~5‚84ZJ? Öxý±Ã­ÍÏÛݰö6Š;²qMØ*þȶ;KóJ‚@wBR ‘+) ¯#ähÛ¥÷­=Ÿî¼ƒÍÝô|˜ñ”ßµ[l±Åž5[‹-ö˜ì…¯,lÑݽ€?6à©¿í¸ñZÏpßXë݉am’P²³Ažëì%XRš€°Uðo‡‹øÏÀf„†”¿2ÉFßÈ9ÞÆO’f𠏾ñbÙ>4ø ±¦ "^ÁG“,»y¹õø“Ÿ÷‚EÄéÑq‡;]ÇØ»l˜d"Ô‘’DšzrVÂ%æìEH£@Œµ­-àÿ'ÆæÑþ5jÚ€Ålù½õ±WùÌ+m¾Q±ƒ‡ Ä að°þ‰wqwF»}àÀ÷‡TW=¼sô½"Îãe³ƒóM$ £^Xõæ•Ý!D¥÷B¿ŒB¯fÏß„æž>Ý*§AénEŽoƒÜ¾…¿õE:÷“W8·#®n¡²CCÀê­ ¡ô—qQ‘M¢Z4Æ ‚F݇W.y)8¾vîùíáÂm>3 ¯ßþ—÷Îé~Âñòe/Ðm Ôݺ Im[ñ*8ëú àW)þ^-º¿#hèxûû¯°;?±ß!¼bi›ìÚüêßú»“ñÄ¡±E©¯gÔþÒ—þFŠú·ˆ¾X€ÿüoþ8äÜW]ê~¬_^oÿ÷=úÒ®Ï`d‰¤« eqÜü%Ëúæ(h{Þ;ÉÛUÀ¥H?¤9›‚%yóU_\£/¯¥˜{Bæ¾ñzg ¢ ß^!G9ŽŒ›}¯7Yد’¿ CWÿ,×?¸ì3ºáÏàѶ)ÿhD€ ¸‚³ö’düÑ´¬®ø¢vT(9CSRÆ™ 0© ü^À›|˜Ue®30˜bdT²ŒIŠì™$Lò•¨ ^5*0¹/ Q,Ð8m÷ .ô/™)wà£5„‡ZS–{—šI í÷+uAËà¬þ n'ͺÇg³JûîÚ‚ÎͼîÍÍö“7/¿9pœ§fmlÓ„ïN›h þg€5Bí³Z3¹Ž³ô»kö%1¦gTý‰µÔU°>®–<ÓyÚúæ h2Õ¨ Ù¶M[I´+P™¶ÇÓ^ãü]CÈ[e*€;\âµ€Ò²6ê?åIŸÚÕœÐêê|&NÔßÕ2˜¾íöšÛìöyœéJ2 q%U€µ…܇iêã¨*õª@Ú2J ÿ?{ï«É¶ÝwýÆœUߺt÷¾ž}nvœøølûÄÇÙ9+AJy $KDâ ”PœWxCBAAYG€âDÊ‚„Œ‰$(BJß/‰íãsÛ>ûì}úºÖú.UsƼU}ßZÝ»{u÷ê½k,}ë«ÛWU³jÎY³Æÿ?þ£½¹N–-(Kä2µŠRÐz§m¶yVìø °Ÿ#ýgjíö.m_X øÿªØ‹ˆøoíø%÷ÀÅ |þÏÜæä³ãFéN·¿pĸ„]$lLÁ5l•qq޼ƵâR×°‹èN Yþ—Ô\wUåUF’«Xz;/¸BÈï T²uJïŠR•ZÿmÛµòõÞà÷³Å[l±çm‹ëu±Å®ÁÞøò'ŸYšÓxén9ú×㈈ròYÏpÏ#«×c/"ý‚;v„m¤;‚q ºþDlP¹QúƵ¢y0!níE*ŽXÄŽØÀ‘!9 <æÀIügÅØÖaûNûÅ^mKÈ€hB³b—Ò &Ovü²ú^œû4ø[ ‚ã˜èΑÕûhw’Dª½i˜£ÓRšHÕ!j‘° €¦—ËâK|µ^Æ;lŠõQJPU5áˆ1¥Ì9íuúhÏpüêL”’ E7<ü&£»…ø×`¼Ç÷‘;? ïô¸í/ çÚ€O"Bç•S\Œlw‘aÑÑr"»UÇzT¶#Ü>¾[êþãL’ƒÓ9¯óó¬÷p¼× î¶ptËÑÝ~wô=8}Ç&lq(‘wÐø>aüNNQN‰Ã9qû 8€1åœm€dªàÆ€œl·-Gu¸?¢»äTtÏvÿìYåþ¿õ­-¿uKèWÐ= ¬ïAllƒÉúQñ® YH¨ @z0 D‡g'|øí·A! št@§Ž>vŒ2Ò«9Òÿ‹ÿóï›ÓiE•éž}OÈs\ë%3þÂþÕôç¨ÿ™ÔÑÖFú5ËrVùüŸÃHûíºÖ¤‚€G1‡ù”PÁ ©l±d ,ýÚæv¶œÌ(Óò¸­ÇMP€P¢›säd|÷»ýb/öL&ß=E¶9;BÏîQ0Plt„YtÛwb b»öïìC¯)߯ÿ28ˆÎÞ 2x°þ1¸ô-å7¦üäì·!ååbçÙþèJ”®ÿ ´)ÀxjßÀÄSp9KBg©i«ßi]CSÉï2×`y¯µ€]¶DKxòŒì’ÁÔÀ< H)ÒfLÛ…¤ó›¤Hí5¤íjK«ÐX=ä¼³¼›C\-˜Ú¸^Õùß®mîG! `®,¦ÐiÊö.öühÏaJ:Hï‡yõd,¯¨æö•dýgÛ6Ͱ5OgËÓ2›_ì¥ØuDþ“ò«ì#11âTQõ=¸#Þ$'PèÄ>Õ\2ÀïLêÙU§F-pONÈ:¢‹}¬LU‰Æ`]‰OU"DØ Ê`Õ™l7Eu*1ɵþ´–#=Ä vŠž+ð!l.ÐÛǸþ–$òêV¨ëP‰õwÏp k:ã¨0V§îMs–÷n;õŒYµe±'¶ò¨Ê}pr$œÞä–ༀ_Aw á(ysGÐ#Tï0쾉žÿ:¡€¸Ûèæ½ÿòè ÝbQ°1E}€¦è¥€{Çã¿øÇÑ͈þÞo¿;èz:{wçykîvuolãùà;ÞGù̉çè‘òhPúÎÑ­·K ÛPœòÝh(±W¥‹ÂI¨>£±ã›ï¿Å°>2Iÿ(œ¨3ð_s”¿˜@ЬrâøÏþ·Ÿßú'͇)0Ã|úØ_ü¡ÿº‘úŸEðþgò¶Àm.“ÿ—X¾x…–„ø@næ@‘Ü©eùü+ðß%úR%Go*Ÿdç?Îä˜ÆŸøÆG,Ðb³îo¢ÇÚøð˜x.ÄÕ@|àapà#ñ‘O Õ@<÷ÖÆý€î<4y~|4À‡EìïÚExèl?Na瑯ÕrdL²ü£$2€ ÀEI*MÍG¥t$B£¥FQ2q¤Ng@ äHú) ]Až,ÃOê{žFæ:_9n5`ö;SÉŠ`¦º.͸£! hZWn™´‹’w»DÏJHWQÈÇJ¤ž´u« pý$€ø/Ó«^£ÿ[оJÄ¿ÔeˆsÍ8©‰¤ ë_à_k:ÿgä¬?Û[÷2[óîr9¼u&‡!MyÓN¤Ô¡$óÞÞw©ß¤[ÿoõy÷©½æº;säº'ËšÿÍó±iž?ó+ŸÛLYÖD‚+•cNOcÏÁ}"€+=‚#ï3ý6Ç»·}J¤ƒê3Ÿ½ñA[’é³t66¨¥ÝþuZffssWL¾Öyåu¦Ê}¢&‚@NûÂÒ/(…гzæß6Ö€¦º£©mëÂÕv¨bÒÿÌ€ÿ²¬%ÌÖ±þOŽvÃÁÿ—üg[Rºš­ß‘U~ÜÙCnõº'l¢©¶ž@ˆ‚ï=tÊ(Êê5óÛú ú'’@Ø)”°1ÅW#¤ÈÿDŽšî5ûz'óö!}2A@²ËêC冽‡-¶Øb‹Ý[‹-v ¶°EM*êÝÿðMN?ß¡ ýŽÓó€?v è7æh–‹Ò]nm€XX¢ S4Y(Mé’üû±vfγ\•a´å‚-3Ç””ª‘«ë\‰7;ÝžÆ9“øÙA­Q`—œÿaÄßGÎFôØ#PýqÝ¡(G³´±üª„ÃÛAÙmŒÓïîüð"}Çú7™í7#ŒæDwróP7Í¢Â0§Q‘NYEsðÅQ ãÑ ¸¤‹Ÿˆr!FÖ»‡wYuè艷 ødHà[* GzØ9Péˆá¢¥¨²ÒÏnö¬çï¾±ã+žuÝñ÷Ï6ü¡7;|€.*îDxkåLÎß)‚‹à½$yË`áÕÉÿ?¼‹¯ý³lX÷V’ÌuÎ¥9ƒ&Óá/þÿýp¤É+26øK_úo©ÿèŸÙM´uþ7@@vÞ7à†6¡ü?P=.º¤-dœè IDATå¸ÕéŸÖq¬˜ó• P󲟼´€-ã¢ðÄÖ}çudðèñ€¿J] æŸu¨‰kÇn‰PAw‚nO¡ÉHß’ÆúØ3c”©ï‚³¨ü ůé;8\Lÿ%b_,’_‰>9Œ]zGòûmVÀ2­u-Ofà?¾òÌjýÞƒ3eº­´ÿ%µ²Üß|D™ëÖŒP„¯m¿¥OoÎOêÔ¶×&hÈ „LKµ]Ÿ¹ 4–eýŸ à2ð>_!· ðï-ÛÞö××ù鱯m\£—Í´€ò%×LÛÉù‹îcö‚l6ž,o·«7ÏoVÒÈ„œ<ÎDʽÏ"ùp©gMioPH,{WZósŠêLùŸ‰rµ Ó’ä/ÙßB0rCjK9o}m‘Í_!$À·<'󮌔ß*™¥>ï,¯¶uvõyëáãšGTÅeE€Ü®Ëá%Hl:ªLy€ú[ï8%ä2¦ÚQúò'$ȬOÙS˜Jû—emtÿ$Ò¿ÝÇ´‡ZÞ»®¶“wxà÷þÞ}>õ§ø•°»Ø=ˆt·„ñB k“5Î „¥NˆK ÞT\Ç‹¤°VÂZñÇR|»Ù‡Gf>\úo[%€4Ÿø6ùÕ!µ9ês¢}^Ü w³Å[l±—iËn±Å®Á>¿°Eyô{;âFyô;ùEø»¾ôâN £±=ÃP¿ ì×ÂöÌLQØï"ÄMÄü'`ÿ% ÿd:aúfÏéÅž»=3øŸo¦j‘ý—ÀE‹VêuIâ0¸x_#t·‘þmÀÇûÄõ×áá‡ÄMÒpOÉ¢]Ú«=-E èèa«è.¦œd5b+Ë .ö|mš[²Ú‹rlÌŸ‚UéœMŸop¼Nޤ(@}'í|þ¿VsBQ¦ˆ [,ÇžòHAìÆ]rUõÐuOÏ]Õ.6Êz§Œ$Âq«#ôwp}ÏêØ»£¢[œPOlâ""ùö¦œµAAñ£À èùÂ꛸þ‘S` nï3¬?$ÇÍØ–½R ¯2Þ“'xß^£o_¾æ¿{+EË{äáø@¼0²tÑÀûÁÁVƒúÃΈ?8tïGI@¾+@¾äïÑ!4:[³T¿é{ËLn_T,6°å@,) l˵ÃÇÞ¦+/ËYÛ¢XÊäJ„|©O“¨ÓÔ6Ú Üâ|h ©Ž¿ô>îUŽ7qd»BæºD»&€SZÑ}- ZÞçT /o¨¢¥¯­ x–w5¹Á÷"©ERt® ’´)ÿœÐÞ«f{4‹øŸA±:ºöOfyµÓqòµ*½TîP>âi?~¼Zû[››Ï·Ëÿ|oÝ«ðŽÛ7Xä’—+Õ˜Â]$÷éõ¹Öy§JLõ¯ÖÅÜØæW:ý¸%ÄÍ¢æÛHÿò4Rš½4 yþþ’Ûc|s•i8¹EÎþÔHNhòÚ3Ñ1Õ:7¹Få US9Z¹ÿz IýxNºÉ]¹s,b¥Ë{tõZd"@Ôèÿé}צ_˜·Å²ç¦/iAÿ6zÿÒïä/ýÕÞ>È…»ÑàÿËŒúom ꂳoìøÿà N>ÛYÓÁêSŽp¡ÐEümÇxX{ÄY4؉EüoÁï@:¡ ìq§¬>eßqTâÎÔ`ŃR‚¾rŠ b`)_QJÔ¿„ÚÎK¯š&ä²nö²éCó‹-¶Øbc[‹-öŒöÆ—^ö)ÜûöÿsÎíï_qô†cóÁȰVºasd<‹¸#GØDÂÖ@Œá¤÷ÂÎ$âo¿˜‚"À¨è@q²hì/ç JC … @~9œ¿ÍòÎ-ƒÀWÃ4½`ggfÌ^Ûhn¯àMß²Šhg/ý²>GïNÞAðèp½ÿuôál%å‘íN=îÖ1ô+  ë ¬ƒm£ÙY¤aç¾ÌIµØõÛÄ·ïÏ‹präh“Vú¿sààœ9{Æ`D×›CnÀ7À¿}’IëüS[~ûuÉá%å6¶x@ >e’3Ë;Ä{´óÈS²Þ‚•ád%uŽcéè×úµ_ :û"=Þ;\ºF‹=¹™œ§Òy$‰NØ0îÀ‚®…ݸÍW9}sÄû7!7ßE½{8 ué\Ê-h´¾ q¶Îe™ãtLøŽx!èÖ¤-T½Õ±kjgoÇÛÁ¦ïtŽ;á·ðí·øµÿï ÉwkÏ„#C¬jW,nÒ-ç¶6·WøÿË?ü×ÉQýQcÁ+W=WFÿ7„€ê@kÀ+Àÿ§íê¯3XqÔÇ“²ƒ>oŸ÷Tô @TÉ`¤mÝ‚–šÏ 9ÎÃ?|Êò||Lv¿«ÈÛ|Œèw=Ám‘àÑ»=ÚÛxžóΠgQØzØ8´S‹ÊßvÐG#ì:Ô™b’ÛöD ¬=ê"<¢Žè ÒõFPÂáØoõÚêBW¶½2~-™ü¦‚7馀‘*!žª³CP8bWf¦X/#Ťi»Öæíc:4|^2×ù>8Ú6ŽXR`4 èäì²W=EšäýKq%WR¨e Œ… "—ó  ésZ°êê~åè_~úxð?ŸˆíýɬÜR›ïÃt¸ŸÄ'íå ‘õ…‘X›ÿ7Ã*Ø}-&ídx+ ¬“e¤÷GRvë jËiÈ5™Ô´­i+Ó’î¢<»fˆ= Xs„].I^>«g˜ëã €TWú‘L(é$RÔJs·2ÔÿDÈýÆÇ<=¤sµé<ÞJiÛ{¡”èÿéŸR¬Òÿ…x~-¥@¬èÓØÃº°L6re«Ë™ôgÓ}4=áþ?ÖŸ®YÜ*ï t·¬þ‘á,⎠¬#ãYDŽ„ñ<2œGü±©„µâެnŽk5yÿ‘âßÕ,ûŸ$þãHUy­Ù–4¯mp—Öyfm½qý¶ÅÏ»Øb‹-Vl!,¶Ø3Úýoy¢4*·þPOÛÑÝvìEºSaÜxÂ:â:aÜF®°TEzL ¥p6ˆÜ&)©´Îy# „­"Þ§a£¸ž’G µcØ&V騅1ZŽs…€<°lßÏ/û^ìÚìi"ÿUÕ¢ö¢"1;Û#“¼EýÓƒø€ø`Îg¯8/hÐû÷`}}ݲ³îvèÙÖI‚ÖtÀ­yç³ÈëßÝk äâkÄï~ÛR ¤—  Ô—KÐ¥ÅžÊæNÒâÄPã]d³x¸{éc„!À0Ú‰ŒÉ!|ÔAï…í œoLÅDÄäñWp´2U€Î™Sé‰-#zÐŽ…±pi’2EÌŽf‡¸äŒòNïŠ#:Á ú>á…¬·Ž-Wfï!Q` ñ½‡×yN-üŸn!|4L FÄ .Iÿkv‚pñ`@î~H¿~„;:1Åí›~9;|†$íÃùæ;#ƒð³ÆjŒ×U0*K<'« Qm¹Ý¯×+~éW¾È£G·Òò žQÒÜJvàg€F«Ó·cZÅ_Eðÿ§¿ü7€ìl®`D^6&²ãZ÷Øä_(ûËìÇå˜ç¯e4€&$€vÞžûå—M@ tµ-ÍQ¤DÎXU¥w_ùÚ5”éÕ¶îÛoÐýÃ׿òMúþñÜÓ;ô¼CŽ"ºñ°öö¼‰[o@þÎÃàÑn4À(’:dôD?È—¾%zœš”¿¨M[ú :»TS„ž£È΀Ë÷ÁþÁI¼"QLâZ£¦LàF Í ä±Çà¿ê¬æÏçërû/{ˤ]ÞD#?“̵Ú>«"€Kà¿6íÅNA¥ Dòå²4@Óø?¬ÌÔ¶Q•}g@³’P/ƒdÍlɵæÜ'ÿ'à?ͲJ ˜þ¢ÿ'‡×D˜çkTï¨H%8ìà¤(õþ·Û´Ö‹=›µ .Ô±BC›ýÈPì ò§(x{Ä6ngù^5À·½—Ä47=ÎÁ"Y*Ù' dÊÓ*#^²÷;#I¶I9ªKR÷¦^áÊ>$õ8–3;õ…e\þOFz ŸÊCé—H׌2ž”iŸFUhjC:3-ýÌëØþoÿ¶äÉþÐ?ü×i&Û¾*àÿMþ³|fF¶÷Gowø#aóa`ýA »%„sex‰£ÂÒ¶nÌw6^D4(Ãhˆæãõ¤h-~Ù’Þuh ”ˆÿ‰š«‚f¨]móˆ,]o¬ÛLly”.¶Øb‹[žr‹-öŒöæ,RQaùôOœÒßÎßÛ±{莄õCeû0àza<‹–jeLÒñ¢æŠ»˜‡bŒÐùÇÄMƒCÊàPS*€EÆÉ»x}m—1ñaOˆ‡ÞÒ–äµÙSƒÿ–Û¹ª8MN h ÕJáX‘£€;õÈñizi`\Ûï·=ÛÀí9IG`'èè,…À “™¾s yó]ü­?ŠøSˆBŠŒ°¾ ;Ew3‡î’àÚM±v®ÔÈ7U‹:c }ÝvÚØ¯ßñ‘FÙœÀª3·Ôfg€ÿªƒ;§YvÓ¶Fåb«„h*hu‚[NòT¾´p~ÞªŠµúöÏÕ$€\KNÞv›´]Œbuª£„™?Áµ:o‘é“sv€t–ª ³ò'×cw½ØÌT51]u‚÷ï">A8@}@dCw„‡ ;‹B¯^„Ý ì¡Ïêââ¼KŽÖY&¹S{q7-«bìÏÿý,û_í»Dq%@+;} ðŸ<ôÍ)+:©wîg~î…•çºí¯üÈßÜw¸O@ÍEuìkãoAŽÆ•]ÇGsó2ÀµŽ.#¤åižD±{^ÏOÚòù  IN¿I0f©ï•Ã?¸Ær½š¶þ¹Ï°ûÊ×pon9¿áìéúpÞÃQKvÎÆ^ÞÆQ¢µ¯>"8HóâL@ðˆ8¢ ˆ3Ðï€þè‘(¦Pdÿ[2€}5 0¹1@3(+Å)lãMU<{c–¹®À eº»r´ß.êÿ4ui“˜­H VþOšº™kÿe’£€WPÆsºJÙç~õq*ΤÈÉû3(2!ŒµœÊ$ª¹ôÕ-¨WNèªk8³=à?;£h+ø?+BÉ£-ÓeÍÎ'ëÚåÖýäz0Q½Øb‹-¶°[ì™mÉe Ý-GØ)¾ŽßêÒ@/rúNO× þ–#nœàzcŽv'B섘¤±â,ÂÁaQ´®¥HGIH/x-ÀÙoÛÁâ$ "Î ° _˜= øOþK´ãÒÓXŒðöDë9Räµ¼ù8ù^$¬@¢ëo þ•ƒ)OHbÎO›œ Ú›#[Nï GŸÅwo_A{¨>4ëö~RQMÝY!(³ç€þXR¦¹ò øŸH7Î{…i¿Ð­.%vLÚx^¦d"o]áÒý4ð_RÞCKøEúN5>‘¨{Ò7D äô@…Ж½)_=÷ǃÿÏ6NÈWò)0­O÷ôYÒIº–ª¦œ«[í? “ʬ|• ù,sÿœÏ9?gfWbßšú›Aþö¸¹.P¿þ'ÛäëÐìóÿpóÁ€7¿¼øt7Ž|êÇNp)H+l•þ¶#ŽÊp,eë6B€îÔ1nRÀÖ¿…mõ/Ä`ª­ ĺ øóù¦÷9wL ôÚ“ÿ×´.u7¦ZçK{«ÝÑåß\2¿Øb‹-ö1·…°ØbÏ`ŸûÓ·^ö)Üûýÿõ¯ù˜×ß]ac’ÿqvgîØ™üzgŽqBô G‚ŽÆu=ÄUÜð' QR.(MÓØ`/I¯çÁ¡åŒb¢ :h<¤0—þŸOÃd©W (¹d~±ë1ÅÖ‘.À퀜 8QôLÐ{UÁu½"¯½†{í‡pýèÐáèÑírö¸â&;‹¢Ø´$_‹(5DzÛ@«#&θÜý·ØG7s.e€] ûF°e†/Wà2W•ìÛ.ûI÷èZ"Z“Áýàb£<óp÷ÁW‰qG¼ç‘Iï`uúÏàº7¬rqÌÁê« gV/  ðG, 6Ž0‘Õîqübÿª§¨îÐøº¹‡‚'±^ pöq´yDLöÍwΦϷF8^ ž v¯Àüó0‘š"=ûk\ Âï<Ü:nŸ«ÞTTmÚHbŠûé|;/“ý–}Î-9šå#äû~Ò:ʳŒ\´ŽÆ§-)Àkh×£ÞÌeR»VOóù:CÔˆÁÛ#OAï Œñ·ÍÕ{†‘œdêñ>¤†‚Ýÿ—`ª:Iåá|ðáüÚ¯ÿGÇç¬Vl×·K?à]§ü{ÿÃß~)çû¼íÉÿjÓ¡ÊÔùnã$­ã%jÄ^nœþîòc¼èÁPë>Ÿ—lŸåÅ+šÊœÆ†ªZÀà Ú¿6Ÿ÷æO|õ¹”èU²þ½·àÛѵçèlüìéa´q’Ã!›Žœ…Z¶&ïÏè‘Ñ‹Hp ì÷ì[¢ÃÅ$㟿ÕaÀ½¤œËbN÷º¸j ܦ¨MÒrU’ô³˜¶¨½#(Ä&¿uŽþuÎÚAÌѬ+„‘çø?¯4ÿ¯¶†l¬´î1®Uæú @þm(ÕëH±öTÒÑD)À¿@‘"Ï€¤“ú¾–w_U™¤¼€i±*úY#ÍÛpû’û}å ê¿Ô¦f›½#ióm}MñÓ3¹‰ÐžÍR~KñiÀØTjºJQ|˜“;ÊþK |—#L”öëc½Ã:[öbmÿž^ÕÇÏÁÎzÛ›Û?³ þ‘‹ü<,ÿµÔÉÖ1û…öçé¶ŸhÚÛ•…+÷ðKí¾´D™¯£€Ó“jX,J¦i^ËÚD’’¦oÑZ§b~F6å‰É±Rë]Ó.‚T­µœõ´¯³F]FhÁxëOž>=¨L;©u,/šМA©målg÷épŸÐj²¬Û+!¡b^àÿU³%¨Ël8‹ø«»‡Í‡Ý-G`woÝ]%ì"â`ܨ~õBØšš«x)~_€¸Ž¦ Ûc>Ù–º­Ó¥H)›&Ÿd“–$Àœ 0ßf±Å[l1`!,¶Ø3Ù"»ûáaàì÷·¸#!ì”í‡Áò=;cŠŽ¿²|QakéâÎd¥¤#±F#ÎÛïcúh~ÃÆ^Ðã Äq§ÄÁب:Ú€2“à'Qÿóã2"|áöLà?Pn`§È±"o?Ý[ÿ&Š'º€ÜûEx”æ˜Ô‘QqˆóÃ$G’ ªŽãX]ÎGÂÃV‘ Á?<Ãü&c<‡ÕkÖpþuôá}#™ŒR‘܉'j±g±Lði¥ÿ;gúΙe Fp½‰^Žøø·”h©<ÿ¬ÖFÉgÚqO„UçÑú¾Þ þDQé½9ÂÀÅNÙÖõ©X0¶ì8³óÍõkÑûï"š%@Ÿ¾@ }8ÿ,uï½ÕŽVº±dÙ«(‚xµû‡鈂n…ÍûŠ¥“é\ø“rNJ•R‘—æ4Ìé1t¿þ„îà»!9å…=ªÂ¿ÿ?ÿ­—rŽÏÛžô& C‹ák;èiÀ£Æ{?Íœÿ-ÂdÇí× ±òhm&¦9ÃÛ¥Fæåu%ô¸Ï49ùëNÓdr¦+l¿ðþó,Ö+a÷þéÿÊî¯Ù¾³EÏr [A7é¶Ý:¤S4Mãmš³mv¶í#28¼) ¶-AŒ,0z$8dôö öQÓ´Ãò€Gb‡=N-%ʉª‘:í1=ˆDhSàk*"`-5Jfu]k;xÕe®KËÎ@±4-%iÑK(iÓD2ø•!˜D~†í£I„¼J‘×°½†Pؘ’5m0oR€/ò†S›!¾èBÈà]úO"ÿ­<.?˳°n?¿S–z&"šKY/ÔàÓÙoe²*“JÊõ.ßé^j>¢ÍH"/Y}µm£Æt?Ó w‚7èãUèþË@þ훕¯Qu°%Í«‰ËjóT+ ~ó#ô?ð ÌÕ4WG©»/¤œ¶ýç}ÆŒ'Ð<Ê3.÷±©%åÃXÎ4ŽKyâ ÑÇúƒ&Ͷo„iºMsËuoý?ëçã„ÙÚëµ  \Gz ¶,Òl…,¤u¬\n^ÓI*e!÷Ñõ\Ó[Z@¿.+dR’È IDATKe²EéÓf¿L§s³ÞÙ^¥ÈX|ºÙ¾þ<ä³ò´ñþÈá{‡H¤;tlóñ<Ò8ˆæï 1ùkc’ø7ß­Ž6­S°¿qÍ•Z(¶6CøY'5ŽM»žCÝÐË~Þ-¶Øb‹½D[‹-ö”öÆ—©(à9ûý;ï®ØÝlïú;Žñ"²K©PØ=ˆ¸•1JÃ:&_‰g Nˆ„!–œQ±cV_O2ÿ“Ù2R€c30,¦ìÐéÛöb¯’%/‡r ÑcœtD¹Þ$;5‚DÐ!"›GŒ»o þq'8Ήñ}dËÎĨFRˆ©Ïé;áHÒ¹-ú…]PîE³éΉpçTèœÐyÅ9ÁùAÅŒðÕß2Ö n–Çú#šðޏéÐ÷[;ðÝBf¹É–¤)RÊ$¢“ Î£C$ ŸéMég8ˆj9±“ÇQ¼€ÓÒo]¦ðñðáküÚ¯[·ïr|ú€ÍÅël7§ht„àùóÿËÏ>÷s{ö´àµ™§ë€ƒLÛå³~ê¶×ýÝ”ß8Î ³vÐÖ8ù“c}š*¥ÿµ@iÚD€W©Í({ßßzD|ûüEîÆšÿð6òo¼>âµ·ñ’Kà“´tçÑQ,ɹ [o)•Û¹òËàÑ.âF‡€ßU?ÿÁãCGtÁ@~5°¿L«ÇE‡Ããcà- =¥ª‘P·ž`/½Ý1€(SDš@Ž]/àÝè‚R{öÈ6Ïìº,Âu>o¶ÖkùH2×ù¯‚ÍS­Fç·S€ôÏucL©w*E^Óäé­»ßó•ܺ|4Édr[€3)ภÍÝ”€Ôeâpíú´ÕEr¢õSz ¶ì‚‚¸´ŸÚÿInDåþdr´}i>vÛ+=Þþuù|iùÕ ò9¼j kÇ‹O—í½ÀçÿÌmN?ë‘αzÝ‚ ºǸ¤·T›Ã™õ Gït„!Ò¿æX픸3?nܪ©¼&@Ì·w‰ 0’¾5qi‘þ§IóZ¸„J%d›½«ì}ϧ[l±Å[‹-ö´öùEþ€ÿ|Ë;?~Êé÷tlï=ðôw„°VÆMÄIüÅ:ÌÁAÑv: ãHÝ&Ø ÑÖ¥´)â_Ç4`Lä€Ñ£h‚íÁ’x¹™0SHuÈeE€ 9ÀX—ê“&’EL癯UîU2Eà2¨wÿÌó½k@û2oÇàM÷'#¯¹®W5+kk î‰m+eÓËÜRf_/ÄäÀD7eú'íúÜW·”€|ïeòûÉîSÛÈ×v.á¿'õ_R†h³¼ÇÓtzèÎûŠú¿ü›­Hu/ÿ'MIÛh&90!”ý L”T©ª°:Ÿ¯*)- Ó~1õ/WÙ~ø"jÐôé¦Ã ۷˲r¥h ='ݯÂH¿/×xï¼[Û?ë a@,k·½aïh¯2ø‹_`ýíÁü­ÀöýíÝÀ¸xoä\'Œë`’þæï]Ç´<6‘°6¹ÿ¸…°Q\ß(·vàŸ½Ì«_nÿµùÖô$ðÿáyÏ/üÂ#«ã5?õ³?÷üýí§¿ü7^ŽÃVkÛŸÀÿ3°âÀÏöÖ½ŒaØ~_x•ÿ¥c+eo‘±d-Ø™ûÒ‹ÿÝë.Â+gÃçîï®qø‚Íæ!ºñà];âÆÁJÑA Dý;ttÈÎÆGŒF‡Ž‚D(Ȧ‡ &=?zˆ‚:Sˆb*ÑY®ê(¸hŠ&¢i9Í·¦íRÊ'ÑÄœS—IŠÓ„n©bR³š$¾c¦ còrÄm!T°´m¾×þ×=¿(™kki¹vG•rZÐPò¹í˜ @ù·çQVÈQÈŠ›‚©É‹/™¼Ðj±§eœY øOæi€ÿöWB£EúÛº þOÁç¼¥æŽoÖù9i»ToSößž¯Îú  xkÝ&×êg,€3škELJ&õÞ9&ƒÅ!’Éy½x™L?þ©˜Ú^zßÊ÷+“lUCäjMóñZ@{ êï&ó³e¹ÏÈû+mª:+ž ø¿Äòý•|_²F‰D¯¤”L¨¿Oœ„Hk³¿ÒÆ›— qEëtY«LÊ>­íÓFú"Ç¥ØÍÄu¤*õ#o­µï«}HV™ô™™2fÔÞ³ÃN¹jî†þðêÿÇï’ÞûäÙúý‘°UÆG‘ña$n"«[ŽÝY@ÕRÄ!2žEÄ »»á‘)¼Æ–4®ne©^5X{ŠCN÷ª¸( ðÏ4 @äR&[šãò<Í|“aè…vB‹-¶Øb¯ -€Å{ ;~Çóæ.€ÝƒÈ;_9å{ÿ­Ûl¾DÄÛ@n8ö¢ê n#aPÂÖ†yتèP£ýc#Ue¡4EôÛ|¶Qþy ¨Í`qöÚOýêc¶øÅçpÔ›g?ýå¿\Ò.ŸÕô²™v°sÉÝÕvR›m/« /càtY§­³-äêÍ'åš_§Ô~¶?ðþ³îÇÀ.þî;迼C}€oÂ…¥„QIc®Ñ!#‡Ñ€|4ÍGç‰.-oÈ1ƒ÷Í:ÍÀ~ÚG ðgÐ×̧ße&‡o*Ä'Õë­õ_ÞJ„‰È*Ñÿi>ý7ûƒÓ5[öï|z­2×SñúyñA“Ò…`_Zç¥!¸ÃÚ´&ÿ|zaÛk—~NgFÛ ˜F)ÕôWûç9‰oÒìKþ'Ð øï`*í%Ȥºt J…jI(¥®¿ºnH½–‰¤P#ÿApM_–îK‰ÞoçR/S%Ðü<±6‘•ZâH.ƒ”Ë,ÍKr¹×mÍÝÛ»©äÒ®oT Ä/• ¦ë&?¶R4÷ïRÐ_•"…¿G€ aê½ ?×Û;¯/ßcëÆÞÆZˆ¥×)õ%“ÒñK_`÷ÕöÑ” JÓ’R6ÚrÖ¥©lM»mšÁáò¼ÈñAÛ1NûËëJ”ûÖÉhú•²÷ £YÃtáãÆ|‡×/~…ço‹O×ì—ÿËïð™?u‹·ÿ¥cÖïl>é_w èƒ&29„‘ϲo7¯ÂSÌIj®®£¦rJ8×2ŸeX6 þšõ7\6-³éCÛ.¶Øb‹-,€Å{*ûÜ"Àî~`õºãôs=GoyÂ6¶jß;Oؤé­àvŠßfvhÄí* 4åŠÒ‘” @Sn(ûÄ’"ˆ4@~}KþS¦”ýq`–_àEúØsþç” &y­bf»¥¥˜z~ãWtˆìœÒ…óÈyú•àÕã:a„çðàÞ~C89õÄ‹HJAÆzƈâ´£p ’rµ;Ä'™ÔüfË`zÁ¸¥p+è<Ü:nŸ«ÞTTmÚH‰Ð5oï…ŽÚ䇛_&‘ÿQî©s–² óVuûÎæ½@ŒÊ˜Î ÷p²:/ŒÁRìF娿žú£ZÓ˜B‚½˜›’‚­_uYf6+(mQ'å.IZg\˹.ö|̉@Œˆ‹p+à>5 ·{t|¾GÃ1s_ãí|<èÿɰ¿üÃÿ}šª€aë"¾>2@ln>ß.?üó½u¯Âiês7ǾîèÃrt81‚–ã[g„·ÎžÓ ¿Öë-ÎÿíûÔŽ>ûÐ] [`ã‘UD·v‚¶Þ¾°íì¶l=ì|©š²³ån×!ƒ¥¡Ãê"nô%-êpÑ%Eý甦àKÔ¿äÁ—BÑoN(*ÀÒ” JÍçs·ï^M‹±ÿõ¥Á¦6¿B“pÝcÀK®+¶R™ë¨5&Ÿ©¿×¤*Øi3 ³-œXŒ?šrKÞG› ¦ë7¿ÚõO=‰jž½½²A¶‚\îÂ@ÆK„¸¸$íŸÖãÚØ8­­„ZQìºe•‘œ€¼¼Þ±é)K9@&­äs–D(–¤NÕBÞ¹~·5QˆÍ;TÐ_$¯žæŽÏ÷­}2d°BÀày’æuxZÒrú—ðˆ_škÓªP‡¦"Š)fA c/ÏÆË£ÿ÷ëg% µàí)öÀÿٻġ'ÏakkLs=¦åÔºYÓH!´ê7å_v’ä]J†ÿ)e3Dî¤íªÓ¿ c…yÇu麘ŸÕHšö[¶Ð|o‡úý9)àIíUó#|¢ÿÞüòBX¿?Òßv„MäöæÑïîLÝõÈÔ]ãV-U`ý5(⤤oÕºÜîKÛiÓ½\ö}ÈnBÿ²Øb‹-ö1²…°ØbOaKž(³oþüC>ý“§ ÊÙ7FÂ&àOÛ*îÈ7‘°5©¨LN ôßEâ Ý=*q°í,µâSј¤nT,(HÌ>ÚyLzfçX_‚Û,,Ñk²çþë¾ãAHèpr”90[IÖAÔ¨Éq!˜ÃÆ¡ôƒp±QFG½E'm£ãá:²ø§Ÿ‚¢:á¸sô+‡÷¦°ÉI© ì•äp{µÞÙoœµ²úÅ=c]§Gªs„h {ï"„¨ô^Èêõ;e;X…ÉjN0²F"ÈDÃ-çwu,¢Þ'AU8] !¤t$¨‘œ›w08KÐ*ð?Û(—Á†!*ÎIÿw£]ŸÎ¡%—yLçè}s)B•¢Ý;Ù?¾TþfJ’zˆ°RÜ›îû¾÷æ¿FÜ\ î£î£_ý§èèÑG#Êê©+ÝøïÛúGÿ»}Õïr ]e`á¦9Ÿ¼xQö$@èG·|ÝwKô?ÝÝÛÈû;tëáÑô¾Ã}x‚œDØ9䢇.®Ãm;´ H0UD‘±Ãõ ¢ÃEoà}úvê‹Ü¿SàqêÊ·£Ãâ²…SÞÉ  ¤% ]È["íÛwý(!- ©Û(ÑT‚¤Ê|ÓL`®Ö^P›hÁ¨<ñQe®í/“Z‚ƘRÇhmM쪧H.Î@òÁ±yI`Rÿ9ò?o±ñjÎS€PJÖ¶ï´æ²Q+6ÿDþð¦P·™îkòΘË3øŸànÄY-™‘%YøOGÔDRÐJLJÊÄ€×_ólbræÕm£V¢Šæƒ'À8+IˆÖ:ÕãúI³~»Ú-a£yJ^W£ü'÷1‘ì»àW*@¿Ö}m ¿2ú¿!äËð¤àÿ³õ¹µD€Ç“¬çÍ×0{VAHuÌTA2Iª^—r¬+Îÿк—1JØï®¤uM?žÛú¡ô@Ïj7m,wÝöqþ³-i]íyöÇþów8ùLÇîQ`÷0àVÂîA $®ë ì’ªë¶ùN~]ñB"q§æOÛ)aq$Å×äÕ|iòõjR€¢Ъ¼æîml¦'ûÑMz…Yl±Å{ɶ[ì#Ú"ÿovÿ77|êOœ"¶w»{#®Â&Ú m„¨‘q£„ Ez%l”q­øURØ*Òƒ¦m¤ó äÞʽ³Èý3s\ÝNjFï,ÉN»j­£&jMAà®ð=Ï-ãàùET€U/ÜIë}>a1²‰D#äsƒ¦þd'ÝV¨ì¬Ÿ^Ät å"ر:G½]“\¶ìÈ®ðêð'ì;ûKaiÏo©ü7ѯ¸‡»ý%ºîKp<°}ý=ôww0v¨ëÑNž¸¾-€ÿåö—¾ô×Ò#&¿{ë¤l%šUÈ ›>ÝP"À'ÅÎìw^ö)¼tóNá3‘OoØÝГ|ñ»pÖ¡z8aíaÓÁQ€³ÏàÀ+ < õŠŒÎR ÞªüÎ#Cv£‘‚+iJj€”JÀEhñïÊ´¦ô9 € µ8ŒU-jÍÈqä‹9*8I€C~~ë/K­7§Цg™~í¶4àVêF.“¹Ž“$¿àZië4­ª ˜OQÍb‘üÓcJCxHk$ýKã§I ­49ý _fÐÙ.u‚ø%²i 5}eIë.59tý[ yùŸ·©Ä€ö>6×i2QàN²¿ù7{¥”|­Òù×H!Tñþ¼Þµ'6µ|šô¢$SYë³§\_€þÏ…pø?ŸŸ\¢è0Y–ïéDá¡®ŸÚ'ĉ4þ/w«‰ìŸ×Iò•*u·Yf?®Ç84-Î… =!´óµ•Cç¶š_H4"âq ÷gÕi2ÇÐÚ™¨1Ý‹½­ÿà…Ùeoh:ÛB®Þ|R®¹ãáq¿ýdØÇ ðŸÛâ×…þÉ»‡‘á,²ù`dóÁÈêuOØEvŒ 6ʸ‰ø#©)\S–ùq“ÿ62Iáj¾Û˜¾µønË´2û‰åõ˜„¤y$ʼù6]þ^»}ÝÔb‹-¶Ø ²…°ØbÑ–A¢Ùön ¿ã8ý|Çænàø3ŠtI pÆuÄ¥û´'lñÊêMc€viàØJý»1)Ð4]äÿGEƒ4Ê4xl˜¢´LцPÒÿAóbœæ¯Ã·±Ø³Y#3Z| å»qh“É •²Ä)ÉÎ5EÆuŽÕÊ!½X„ôÖ$ýO`Õ;n™ƒlŒÂvg»ë;èDÔq8èWR¤Ó½Šzö'Ø1p–›câC¬rö«^ð.E³¶]ßQ`;ØrØ Êf€Óc¡ÛÆe%Ð,K—Àï ;ù†`„a•FG)À]í.qòçzSÝìö’¬ ¡@§¸ºˆe¯xVËÀaÂ=è¼çùF9[+G=Ü9uœô…¯‚h=¾wØÉåtŸiš<]De;ä”i"À °êï0p,îYß%úû踅øÄ£êP¬qˆwWîsýoÿñý7MX|îÊÊà ”.·“ì›— µ$€fNêyIv}ÐuÙeÑ}×°g.~ü“Mðwoóðç‰ïÞ¢z¸¿‚G}*Ýx¸‡ýƒEýKÔ©Eû§y Bõƒ/à¾oÀSžoýɇ:m:bDSHD4ظ?ùc‰4Ó?5m”šè_iÀ6rXè%µ…«(mÏ6°;_»¦Ib‚ÿÞ"¿£Eí ʼ\õÅ©“Z4‹S×\Ïz’–"€”j@싚Z‰‰ ЬY‰àÉûôÏË*P L¦÷Ç*©¿V­¤ñ|í”I”8B‘þ×ÇDKÏ­n%i•H,Ò€ÜêfÀvlÓyJ>vÚ“ZyŒ¼é@Â0Ïé€RSÝJ×:M—Þ~F¨wä£Öýýõü¯<]‹8û' .M»¦”õ–æû?}…LCü5 ­5/ªrFþMÚÇe„çþ×=&¤åZI-¾"cä—²ÊZ¦—IJr}ïÞëïnÊPà*›õ•ÊÓ¥ªW½u}rìãúg{ãËG/ûn„­ÞðøSÇé÷tøS¡{ÃÑßqŒgÕÛÞ”‡ˆí¯C´`®áPJW%î¤qÅ:0õ߯ä׊¦$€œF@§ßdŸnãßmÇ~å‹é+×¥ö*ôg‹-¶Øb×h `±Å>¢}n‘ÿ ßÞ œ~¾£?uHìˆCÄ9Å'‰œàWŽ8ÚÈL¼ 3ÛÅ4×ÓÀ.ƒry`Uʲb’>®º$D°à•F @•ÉqÚ#4ÓíËr¶e@x¥]kä¾¹)÷¨.¯ß³e{ûP Á›çx4š„™GLï§^s Q“\¼Þ~Í1ŒÊ­cǪ3@õb«Œc4‰÷NèÓ¶9Š>inçcm€.E©ÇhÑý5W= #æ¬U¼zøò³¥`/&1O–ì/»ve|¨LÁ¼¨‘Óö12H–+Xp¾«¼—Ñ$fXs@pÚOTP©ÃiU% ø¨¨K×GòÞ3gGjólµCñtF-&¦ \OÒâ–r€Ђ&òA&eLˆd=ï3põ «=,X™ÈìOI‡úÁÚÙÕˆð|é}µ‘‡Gp‘ÏQgg;W2Û;éýçBK”Ê¡.¯$†ý]‘•¼ IÚ¿‚è`ôÒþ+ü€5ŠÉµ®G½¬œ—³À!ë÷G¾ýÎùôŸÛ‰V›®ªé˧6Ó¾kÏOø˜ùÅûxÚþ+ÄbŸx[žx‹-öíÍ// ë÷G¾õ=âÓ?yÊÅ{#ï Œæ ×уÂF [Ë6‘qT.”°÷ôv IDAT1çRÌý;,ŠdgDñÐQG0&G‡6`ó^¾ êž³=ð¿ÌSGõÚlÓŽè/»¿)´Zb». }ä¸Çäi7Âvƒ@wìé;¡ï 0F`;(!¤¼í½ØzgkåÇÊùÆäR_;NÞ)§G–kÞüTËøê:¬:Mô4Š¢ @ÕgëÈícWª„ùþÌqzëØ@ýU7•ºG¦²þ1Âzg ϽÝ{™œSû‘êžœoØaŠyŠ E9ázëŒjJ™í…z•í¼‡×N»Ñ”LáÀêuTåõSK‹Ñ‰Ò%绤üñæFM €hÅõcFŒ©C±(òÎYjŽni /Õrãq¢'>yð k/[‡^˜À„‘ÒØú?™ýGïþWøo ’ÜØtûm™$U™V–¹i@ V«0ëÛi¾/ÿ+À#³Ç롇íË`\Vö OzìK/U{d¶ÎìÿgïÝ~-Ë·û®ÏøýæZkï]ÕÕÝǧϵÏñå'ñ9m °±-ç"'~à0BB!æ $pB‚‡H¼l9‰—Gæ!Çq„0‚ŸKìsísº«º.{¯Ëœ¿ßàaüns®µvUuï]µ«÷UkÏûœ¿ù»Ïñã;þè#¤ñã!þƒ»Èg?€EdXoá„Ø ÜÛÁ™C{•ƒ»‚À©@°ul]BޗΉy¿Ñýí¿«LÑ!1y>gf€´´0NMê~—–#@:1èÞ?F! Ô­0^¨ÓTµ‚ÆU^ÆÆaýj÷Hžž^ ÎÄN’@CÍÆ¦}Wq¨:Dó8_Tò_ÁÂ&´YFÙ‘û-[wÉó?Ï•qiîÄÔ ¦SS¨Iãÿ´Ü®ÀÕ%Ybfƒ Él.£Ÿi³yŽÖôÚ§H ã¢5d6ýGéÌ÷:ž`Iùa9ÑŒ %×Ó?Íekæ0šþ–~,%¤U8ÔBaˆ–{Ù«æ¦N‚‹Gx¦ƒ/FM %½Ð¤¬ŸY§ÜÑ£¿#ðŸf_5 ˜ü{Þÿ *SB“'Ù:bâPêgƒ6U3¢ñ{—OÑCß­eqýCpO»„ÂÀ¸ÏÕº,áCÜß]°=\ì”3't Gp‹xv!¤(s -<˜ReÓ+ÝÖ@›×ï‹E_ió<ë:ÄÀ|Á{+þ…‡E2¼ˆjÇØ V~§+3ìrŠw~>Wvƒp¾‰ìz8[ wND£Gw’ØZŽøce¦Ò¥tçûŽ•¯­Î¨jiOa)0ƒ–‡çʶW>ý¦cµ†`i ÁŽ{—ÂÄÈ€0DÅEÅéœqî©·sqÉ;/( àBDCö30Gc oÊŧx•ÏRå«ÿä üà‡oòµo|¾ìÿµ¿ô»úž* C ;ô<¡ËÁAÿ­b3èÿ<òoýäЀÿU$ƒ‘-ÀQ¶c€VØ¡¬•·ó«¥Pòó{f6€’•ýiY |£®{¦—í»ðÿe^~R@Á|mÎÒ‡:(Û/}ÿÃ'òc"þñ)úÞùâœ{ôÑymHx©$z1P¿— À¨ÿ<®wø—Á#ƒ!I$ZX§ î Ø? @³º/Ã˨šÕ3llœ—åâ‚)‘¡¾~E!ÇUC?D;{b”îŒê³2¦¹Îžú¢FÏïÅU;@f?PÎÞ?w£wOy™±c¤$“‰Ì6¯³®Ì®³Ü6ðZIç’@ölLY¼ÿ«1€=³_'½NéF’[sjéBí…2 A~Bú³‘H¡‰×2gƒþ­Ã8Ïö:Ê ¾ŽzÖ±w…ìë¿Ü‹e‡ívk5ØçO2ÐæÎ’ËnÒæ{&F†l€Vsrj\*{À[&SðâÕOðË}e»þs~ …a Êõ@6òÐÜOPû×Ãc²ø¿ˆ‘±­ÄÇ=Þ÷êÃãõâyäÐüàåÊeó‚Yf9.³clß „­rþíž°UúGÁ€y ¬Í¹+&‡¬°6`_BØFÂFÍÑ+³¬¤8péýE,À~ˆšX©aòzÒûªÿ¼„Ê0˜×±c‡ FÝ÷¡îé¦tY³Ìr}2×òYŽÊŒdÎ2ËsÈ›ïÌ“Dê¸û£ ÎÞ^²}@¼þqPd)¸,á¬îã.ÿ°‰„MÄu¶/lY@Üšu¨x!ì"q‹Y{ „-*6I uTfh©ÿ§ÆP'‰ÀÑïõÙzôÅI£xµíô§jgêÑödU¹}XÑG†ÓÀÉ?ÍÙÿ®ƒøÞ? ë¿Ïê1<¾°úuº¶v}@D‚ðx¹Øý¿ï”ád©|ê Ç£‹Èƒ'F%¿ €^vo‹Y®^¤²”'[ N–¦7o´óßV¦rb4øN@¢°í+½gH ø²3ãÕ”CT.¶F—/"Ĩ,:9ÈŽ>Ñ¥Õ¤Ê>P—ÓÃaGë$ü ƒtÎÖû`uô|c›&ƒ p²„7î8– {°ÝF†^‘ñ." ¥[DèÔ~ A\„ت­Ÿ€øämÖ{šé  ˜fÞÜXø½ßÿ™È¥’/­Êœ x‹±˜»N±Fuï_ÿÃëIÇÇ\þÍŸø 1Œö•Ö^p)Sº·qœ3@Qâ>“YC€ ÂÁ´ªÚ~šÑPÁá´ÀFåˆ#S€¯Qà_¦Ë¿ zþ˺)ªÕ®áZ-˜×/~ökW”ÐWSüý»|êoü ~þïàï‚®:xx¸@.<\8X)ºsÈÖƒSØyØzè"û/Þaõ ‡?]°ú¤O`~`ù†C¼{5€]$ìb  ø;Ba¬Ë;®Ä‰ ERÜ(ApNJü¨îLˆ coÖ£šãªÔøQIö°üÉ$ò†éôn¼\‡çÿaðÿðŸ¯ÙÓ¶Ôãv,Òk$x8½÷c,—¼gw÷‡¸ÓwYž'Ñ£ àT9߉¥Ayð$²`·‹l¶ÂÝSáÞÇêTPuEï±Þ(çëÈÙ™W:X¬´Y®\„ª˜ÌÅî=œ.!F),ÛAYx+³]›²Xرó Å;Xtû†`w[xX9Ö;e½3Ešåb«,;åleù N²òú’ô8Ø2\µ´ÝXVQízåþãÈùF9]Ùû®·Ê£ åµS à… Ô¶œ K">B7 «€;1Ã.œCE»âVÀé‰ìˆ(ºU‹;ïüH]f€Ä~§«×”/7M> ðÿßüæ_<¸ÿáùÓ?õ­Ñ>UåoþÖ¯”í_û×þ^:òW÷~uü?¬üåÿÈÊÿ áÈY’Ƶ HUÏØVÌ ÅóÔ€ I¾§^bÐjãðSÀ:FÀO^oaðêÿ?6(ÏWö¿P`¬„ßî'À¿ŒÖÚ¿”2)ëMnâÝkHû«%«?ú,ßøò߇×w¬¼ ;të‘U€GwÉÂ,`TþÛDï¯ÙH¢úwHŸ–Q`ˆbjõ[¼+ÑYy$qÉÛ?¦ªÑÚH BP»F5@ˆ;òì°ï£Æ4+L„êæ_ ¦ûgà·€¹y¾qƒ†¦) |ü¬¾7О}/™†Ý¾›R˜‰dÊôÜÎkQÄÚâÇpY~Z”Ì, u¬O£âŽm%×@—ZÀiKW;×ßó’†Òœ§%ÍBG» fcûÅ„8à_k]ÒæÜRË´Þ»¤°,Íuíœ.•æHÎï=ôÒ€í̸ŒLFýš4Æ”}V²Îɼ LŒZÀl8’3‹6õõEËöÔ½5iÏ{øoí<ýN'‰¤Ôõ2²•ì«c^žŨãòiÖuomüŽåôQ1·eü" mù6µ*U'™ÿô|jðÑ´ì½7h8ªyA{Ͻ Žì¿N9ÖAKùú†£ýyÛîd²ÿi×¾úr[€Ïþ¹;/; /]Öï¼÷¬yã§WìîG>øê–îTðï;†óH¸ˆ$ò%Â.¢;!ëlÅ0@:)žÿ`ÿò'³7lÕw{ºÙƒ@?Gö½Œng–Yn¦ž*Ï2ËDf€Yfy™i¢àüÛ=o|y…¬„ÍûþQa [óø."Ã…Ñ@…ÿyr¶Éb´‡áI4KÒ^ÑlE:@ ü›å(c+Ò‰ÇÿÔJ´8¶ñ¢Š¼ ö+,W þtY£’”qûÛõ AêU²‚¢™âôöA²yHؼ‡,–Èú}âV耻§°EŒ9@1(›ÁôÚ^„…3ÏïÕBðΔNàµSÛw±V¶ëH¿5O8u‚óõXüó[f¾h)ª+µ( /¼vZ•X[3Þè¼òæ]Çja ?çŒê¾Šs²!;¥_$@|µ€OÞ3ox°ãÛ^é£ÈWÓ™³KUÏIe$(*ñˈ¤(¾æ‘w°Z ÷ÎŒ¡óÞ ¦ôŸ,͘Á;衦¸÷¢)Ô‚(nð¯õÈ[‚»³ÿè)¬×Èöø ¼ù9Ü'þ¬ÅšýÞï!_‡†ˆ ÉC´Uúæ>7-+_Ö2~üÚÎsÿGÇ£q¾üÁ?z dïþ¢Q£ºîýåÿ÷¹Ò;˾üêý5¢†=Р•=9¡‡"$ZnIñµ§¾ 0ÏÍ œT@¾@s¬É° `/I±/„küG)ù:¤† ¿_~t5˜,^ˆÈ•Ú£LòQÚã¹Ï‘æºúþSp`û“3ý¿vÃ;ïã>wÁÅûÄa‰|ªG/`XÀ½`€þã%tÑ4;ì<,ÙuÈС]@ú7,R¸AÔáú*7t¸Ð]ÀEo¡$"jë.zœ N]aptÉÿß—_©Õ™ ]±9ƒsí_@$¤e¬ÇŸ€¶þ¿DѦE^6J–6­jÞåhé;2€ª%¦p B”ÜcmûjŸT=ŠÛãù™Ù˜ˆÑXž ÆÒ9å>J Íäõü–R&ûžºmn%³ /P€}Mÿ÷Áÿ¼$å›6×åû\6«/zìp*$Ëâ´žhþó¿XÊ$÷뮌7“/«q¿©‚ŠK\f šX¨E–ß5E…¡ÌáÚ÷=ð¬I)Ô•ÃÀ?p˜Î¿l;Üèwb#ãèüQ€1Ô]– p?nÛS´iR8—5û› ?ØûNçT’-ce~‰l8P^iıÿ¢¥]5ÇnüYÿ(£9A©+2ª¦·Fn3èßÊÉ[3v‘{ÿÌ’'¼ãŸ>áÎÛ vÜB»« Ÿ(Ä!âœ,ξ!ĉcÓ34˜¡@¶mvÂHg›†X ‡«´íXZ“ýív+7¡Ÿže–«“©ùË¡ý³Ìr©Ì£Þ,³<£œ¼ågš(àáW· O"»ûÝÃÀöýftþÛ÷ÛË×=Ã&·Fé?l"aq 3ˆÛj%SEàß–¨Ži¡òÄq ~ÔÀÉò2¹lÒ8˵ˆ~ykþO@ÿªfÊšÂö !ƒ¯õ^ ¸]yÿ º¶‘ßE .§+áÄ^q¢|ò5ˆIyôd«\ììŸ@Ò\ïtN!Â*²ì"ÞœŠÅ¿UÒÙóf¹RÉe‚… ÷ŽîÖ;åb£,’Ù Êja øâŽÑÞw^Øõæé¾Q_(»%Ü9±Ó|ÍÉÒ~«…èC0Öˆ!Qí/<É@„F¡öò´GítTè¼~Çñú óÂÝA»AùàI$ö‘•‡Sé|¤[FÄGäM¡{û pú)ÐA·'°üvßÿ]xí§èU¡ýÈê&O@û°Ñ /ö¤mΣϗ!ÀGþŸþþÙàOý䟘Ç_HEö² ¯ýÚ=_¢g)ò«?ö× ð3 ´îÃî?â— ×Î:nè.ÊM¤ô‡Ñ¶ñêžÜ„¾ò²ÉÛ¨}^[/¥=|•i¼A2ƒÿUæÐ®°}/.”·ÿâk¸N6ʰ6€pÖYacl®â!l”aËg{XÛ1·"év;v Z÷7ár(Wû^)Æí#&×¼¯í{¦}ÐËî“f™åêåyjùÇuøšå dF3g™åež$štw«O¬8ý´gXG†Í"ÑÿG†·é(Ûq6@œ ÄÂ`ûâ ‰À&‡a«hO1Ж 1ÐÇcGš(Âx¨œ'‡—Ê•zþC÷´Ù¾ ü/´þ4`¿VÝXúf×¼V8ܠȃžxþÇvîFˆíÁu^ˆNð ê@Né:SªIÒ­…`1S*§ròÉ€»èÎ@w½ß!;Pq¨¸9ÀÊÈËU̾"žƒyòð$Ò¸sjUçb«l{cr8[š—»jafÛÃùƼ½–Þbß>Ùuþ2±?„XŸéÄ –ŽtŸ¢þ<@·ùâ%ÿC€!(1I,;gá$½{ŒÆ’¡À£óÈB¯œ-àS÷ÌÂ?Feé9é`ù&ê~Çç‘e‡ÛÝgˆÊdø€8è?•?øG_áþà+é~vÃÿwÖÿÓsßîVË_úñÿ°Rƒ£FóŸÁ€xª½]ÇÞ²Ò€þÙg¶5¨p¨kÀ¹½›'®F¼ù*ÈUAÐŒØÔçÛÀYŸXI¸¥€o’ ‘ÚÛ4…ëšHñãCÙˆ¡=>Îë2Ah¼JÇ´à\üì×®é=^ qNØýÛÿ7ݧzؾ‡ö‚îìÇΡƒÀV, ÀNÞ£½ƒƒÁ¶,$€gôüë%3$ÁAt¸¾3úÿèèÍH … äõJ:–ÛIúápiIlÊ0ºê\l.ˆ¦i¤ZÜYU4š@L :Z§içe :S7íÊÒÔó,š©Ûm . gšCGÕæª8j5¹o©wOy›'Ù°UjlšØRK[³þÉ ©Ï±¹›õq*ŠK@4Í=[ð²y±ï~x«Àüj£Ühúx£ù7oøØxÿç{´a* @; hÓ5Ndžcàx³Ùœ"yN›?¤eØÇm.5gž”åÞéXk”Ñ”†=Ó¡SÞ'€‚®ÈhÝÂÍÔoµT,¥ä)ï´·SF=9#à¿ÔЇ¿ù-í6ð¸ü»bÐ ´5YGCÖáe¿€öO/L—ÿRúƒci¦ÒÝŒêÂô²i{¯†Õ\¦éóòáè<àEö2Zoç 2=ÜoÇý²W&듹ÅágÞ|™þ§ËçæÐ®œ»gù#UØü0°{èî8v† Åy¡¿?0ýKglÞ‡þI éºSǰ Fñ/] •iþãN-fT³{›ÆÞ&ˆÙR”1&…ËÐL!uÙdŽOçIã‹•=ï •×Ý[ R­8)Š3@"8ï „¼ˆ°6%Zìa»q–x¢y®aÊŒ˜”‹¼7 ‡w΀Õ@ñ^qo€{ûs¸O|]ÿ1A¾ƒþÀ›”nfùè"úþŒI­ÂSBÎN0ö§Kál%¬àƒ£yÃ;ÎVŽ>(g+;oáaHëˆhlý`ÏëüXÁä’’É€õ—7×–ìœ@;— &†`ùµè,ŸÖ;eÆpàåøwëM„!²ð–‡²rø…@€¸ øî5\÷º}¬û€ôŸ@yÝü†õ;ïûß*F6#qæmõƒEZ`ñÀ9¯!@þá†—Ñ òÝôà×ÿÞo|¸{|ÌåßùS½‚7…Ú96ûêzŒF ^ ?¶þ,RÏ’Ô&mà’ôÍ`Gc€UNgà\í¸ªlÏŠ÷ Ü` gm?bã%©Ò ug6Yj²û&ÐHeòyÐæë®Eá/“V1‚)˾&G«ç{´(õ )ï©»ÙþÄ»WœþWOü÷_'¾»Áy%>èÐ 83ʽð–_AàqÚøÒ»þÛº÷N}2ðìOÆÕÀ×ö¢®°Y€«Ài‰©žØ;PÅi$&úð lªN3Dœâ« fqý~‘ðÖq·Ù©šj Ý•á7y‹K4p°B°¥ÊcQik»w6 ôRãÖƒ­&HµÝ¥ [Ë( $#’€½I1nšdô^os`tLkû’3…þ¿ÖŒb0þííQëRëEžYÚ~²ÔÁcÅ–ÒT¦72=FyÿÚ1^Ú€üd³ÔiÖË[æ¢KÇ4牸ÿGb2 °±ÄV‚Éï§áér¸÷® kiêNÿ+蟗ù7ü‹Ñ€+÷²|“=ïÿ ä_é¨IŸ8öòþÓ%cýGÊIö6ÊL¡Ì·§=Þm4jZ¼Üï½g‘ôv9yk¦l\¿;ðÃÿí‚·~þ æ.LÁÚ?€äÙ/Jÿ$‚°5ÏAçUߨSd©¶. ˆ!æ©âµ,§º\„È]öˆùõÐ:¶ÛÛ7]Ÿe–Yf¹E2Ì2Ë3Ê›_žâ |ògO9ùTgþTðg»GwæXž Û:€;b“dQ¡KÖ£l—B)µX¸b, žÄ€M,{Eóú` 8Ð>±¶/=C¥a’Ü-Þí“é}º£xýkU>95–K§¦£ré=Ó¯Ó|ÇGN,îì F/D'ôÀ:Û­r&ŽÎ).é&€#‚ˆÒ‚z¥“3^su¯°ê»_Âßýçwpgï¼÷ü,W.’ÿWŽIù™|Uø‹s¢Z¼¹TlO6‘ÇkS¬.:ùO‚8«qùš¬CT…óµòdcŠáN óà=¬:Áß=ˆàœ²pÐyèaÛ+}0C–ÍN¹ÿبú>ýfJ·‡O¼æ8[*÷EÙmÁ;¡s àœƒ-è6—ç‚G½‡èÑCÖºþºô¡‡ÇMÆhùS·÷5wõœc†7Téö{¿ÿ_ÿÆÛeûÒaetðÿϯÿÎú¡¯ý¸Ë¿û§ÿs‹ñ½ç陨ü“×oñîÔŽÎo<þµ¬Ù¦ÆlSi<1•ðP  /’€ÿ‘!€K°¶m“²“1€y>Si/¶&ÏÞê™—$+³]ë¨q¥³—nJ)Í• ƒŠRâUð,¸Ê ÕüyvÖí¢„/Š}©€Rãõ_Œ¸T¨ox•¥ IDATPÿö'gú¶9`á, ½àÎzî¡XFô‰·ÉRˆ ä|.‚È»Žè"PÖEHÞ˜Q€$ øÁ׺hœ>J«u¸¸°ºžÀÿ`¡'MI»f(É ÍTÌë_G´b­+Í ™Ù( *×û=ªð,7ö›¡æ‚­XWûˆæ´dç>©¥ /kÚ´¿Ü—eP5çöÓšHî\MYk8Ö,-VBgƒ§Š9ŽÉÍ«äÒÏ`¼½´±¢¤Ü(Ö»ãÏÀLõ_X ÿè(@ þïÿe|˜–Éxm<Ó©yQ‚Oü4j¤<,§¦U'$ckãkSž6e…¤œQ—úu±QÆ-ÏÓ9š½ÿSþY•‘ú-6y©cÍ¡}öh»é‹ó;–qh´¾þK³=b H×”ú)˜¦æáË¡¹R[õóÊØ¦ §©ý¥ñþ–‡ªµ÷æË þ?ŸÌÌ®¦_}ûÏßåô³ vúšãô­%Û‡‘Ý£Àég:†‹Èpq€þq0ºÿ¥/:Üâ5l-Ükì#±OLƒZ8€ Äè`ãŒ*£¯Ú8y•áÐìö»¦]ÌMê’g™åêäykö«0TÍò’e6˜e–g“·<§Ÿž›Ëæi&æ„°ò/„ÝãHX+ýã€?Â…ÒŸUÔ°QÂEÄ­ _õ?‘WÊ-€¨e‚¨ÄM²&  ™: ³ Ø$1[‹6¤pÉr–KåJéÿ÷0ZV®·à¿Ñ‘ãA‚Ƕ³1@þR7— `äz¨h‰àœvÀFÙláñ:pºrÆàÔ€” B ¦’ ÑBX2K,s"zñC†Å7aó=â–¤$ažz]³d ¿`ˆ¦vê:¡sFo¿´„ˆÑ<€6;åýG¿{*¼y×±èH‚.ÒÇ(vͶWî?‰X€ÎW  &æØÓ•ðúGX»Ån—¨üe¹xˆž|•§à6D÷YŸ£÷#ñ‰ƒµG׉&Úû„[êñþv L­c³cÀ¸YF¿÷ûïðõo~žCžQ¥|þw˜ÿËå¯üôQ½9ÙöãÔ`úïÓ<@mÀž üG>{ÍÈ—Ö ü+†)–qÙò­¼#BŽó%#€Ú>$ãž´fZžÜ<¿ 4i(Ç3ðT‘·² ÿµÿ§Ûõm³oß`izÙë¿Ö.ÿGãuÿ~ Ó_ÙÛ'íþbÀ•A×ÀÎe?—$…H@~é‡Ë»çíZRãA£®ec¸}¯æœºÆË»m”‘arÕþ}FÞ×­!É%ÞÿÀðÿð?ÚÞ{»YZiÛíø@þvÑü¦NÁS¦žéxÐ^puóãoÒöƒÓw‘œÆr\&ïž~Mý_PÏ“fßM•ôÿð2;vÁÅ÷zð‚x!Cß(~'àÁßqÐí¿Š?M}ƒ$ÃE:űɣ_ë‘&hâ’N/.€Î:…˶jº ¨÷ô»y~3Õ)´2³¼º2×ÞY®EfDs–YžAf+Q“ÿïo¼Ï'ጰU}Ë“o œ}Æ3l”þaÄ-IŸÍ: i]ÒþhÞÚbPóÖo©þUÇôPy²—™+c£M([ÅÝd‚XÖÛåtý²}·H®üoEýê¬^ò,ŸTg¼Ö’d -TbYãPÀÅâÐvVWtP$:|w;X,¤xv¯œpzâè¼ÅÅ|²•ÈÝ;Õ33ß<_¨:â“ßû&òà[°Û¡DoÈëÍÕ¼ÒÒzódÛcÆ!(– +§Íή9Y&e·ÂÉ^¿#\lí‡×NçÌó×Ûy§«ªl=] ñŽãbkÊíÕB8]YÛÎ7jƤ<{™Òz:9åÂØ+œÀéîž:bTB€mŸó@Xxåõ;B¿õìv¾‡“…µÝEäüÚ}ánÈ4¬‘í£›‡Ä 観Ñ!eŠ“”`¬ I«-<®ÈhqŒ ð<ø?:ðìiŸAÿg“üÑ6<ýcŠñÜÆ|ΞŸSÏmÀ-@R-F-а±UgˆDšíÉ?Õ|d*r“Ì ÉS“âí©£æ1¢ñoÖ‹±-ЄHà šØÆ)J='ÓiKBå °{F鬙ó4Ù‡ÆàVÔ×õòþS0häáW=GÛ·©×\üìמ3½/‘G+ü¿ò]ºÏöÄdp÷tVõ…½$†%[ê—†d68b°° ÎæcƒG£C‚þdÍàqÁAp¸hÛfàq±YWDÅÔÍFmïÄ5Z9ý=#¬Ò¨Ò›¸îĆ! t%MrùÖ`f/IdÔÖ¤LN¥öA¢5BLAñ°.Y7dhIëZ]iÎ×öÙšIeÖ@އ5I=˜BêǨVROÕ¤1‡(i(r¨Ãm÷·bú8yÿ·ÿõšÖ뿎¹^4ëí8ÐŒã”é%cr@Æcäï4ß¶é•ê”)ç£Õè¡í9I÷£Ü[Õ¥±Á•žY'ÿ¬šä´Hbç»h[FM±”Zj6{ûWƒ—L僀Ò÷SïÛäÁ1“Œ*£>áFÈñóø©¶ñ.-–8$#À¦ÿËß·0<ÐÞ7È “üÿhr2;v±{ƒ²þ~OX+agàýpÑÄŠ8lvÖM$lé’.wkó)„Äâj:»îU|Ú?€óØÜ«õöÏL­­ž·ÑÝú„Îc⇒›ÒmÏ2Ëåòajj™M_qZfù˜É<òÍ2Ë3ÈgÿÜÝ—„—.ë |þ/Üe÷È&‡Ý™ãî:º»97îmé p }ÄŸ lÒHÔ%¼>€[Øý1c5ÅÎ<ýÅeÚÆúñxpR˜'Œ¤}ͱ½õvÉ‘ícûf¹B9P@-€ õ'^m„ò ^q³ö ü/aªç‡h´ŠÖ‘Ly¤¡*ÅÌFEXÛÒ_D"ìÉEdÑ þTì9åk#%Û‰ý[ˆ÷¸¾„Pç¡Ëñ f¹Éq¯½¤¢Pa7@?(C´}çåá¹r²´ÐÞ™—û²ó<^Fî?N^ò^çb«<Êל8œ3ðÑ «…)“t]þ¥óM)í\¿USèƒÌ òàl»ÁšÛ¶/X=QÀ{Á-Õ”ïƒà¢>ºôáv߃ÇP×!ýÖçèã¸õ¦{VïPq¨Ë }½,™‚ù-HQ2·*«ÞY_Jûÿð¾öÏ×Ïþ?_zgðÿ¸üÕ/ÿ—´ }£9oþ þ·ÞÿQC5(ž Oóü¯àO+{ž¥>ä«`¢I9žÀ‰©g~…Þ3@l"ˆ’ŒÔÍä¸4Ò¦ýçöa€^° {ôÿ- €Ý²^‹ØýžjÐ_-ì3…ÇÆr´é±ÃàÿÈsOöst? @ýU¿Û/½{$}·GäÁ ºÞ á±Gz⣹`ë`ã`eŒ_f `_Òp/ ÈÏ æÝ?$Oþà“m“÷eÿäåÏÈû¼Žº‘çaÍŸ€èTž¹¾·ï6.i®»%Zh©âfmk oêß´^48m/IÇW4ái¬”f»Icö”¯»l»öV-͘õ½ñ$×’’j ðLaMÄhP‰ˆ¦RLýWñ^—Iëo€Éi~ÔÓò»Û½TÇï]@ý¦‹> ü7ûÊx0ÿGÆmYÒ²QÒ9I%9£qÀжŽ1ûÀù àoéÿ«÷ÿ…È÷Ïí¶ÚæZ'ãú]sîpù#ƒ˜rÑM×T÷wóÍvåùv5â­Õìv†u3ÇêÊKø¿ùÜ-×í®ßxÿÿ\óÆWVtw»G= øG„á\‘%hPÂ&âVB Øëˆ8ˆ;súÊ,±WtmceÜacQPˆvTG¯ÀY‡©ŠðÙu¹³nw–W_>lÁÿYžIf€Yfy™i¢`ýýñð‰Ÿ9a¸ˆÄçô³·„å¦qè–ohÜ)aSl¨HÜYœ¨8˜5¨Ñèý%æPeÉØB4*:PrŒ¨Â0Ù75˜®S×÷¶³<ñÀÇ@®Üû?ÏÜÛ|Õö×ìT5å‚hñøÇ]Úîøïéò1g´ašcˆ‚ VR]bg”þA…ÝÙîÌûùµ3áb ëM`áÀ š–YwàÁ+HãÙïA£ÑÛRÅq€ÎÓ®ë— ±‚ùB Л‡û*Å¡©oè¼Qÿ‹Àì^ýÁ)Û]½&ß'ªÙsÜ9‘ªœÖ žw¼»Ùž›Wçáõ3!D¡óõXPcPpÄ ËEÊLÙ8bˆ°éqn‡ët„ˆnA6<š•þ^,L‡@ípÙSÚµ˜Eù\9¨'”—fðßþö_HÏ:¬kÿgÐÿ¸üúWþ+€Èä2ÙpFÛ±¡ücúÿ)íÿÈ ¯C‘Š&Šñv#-Rð7Þÿ 2hpÛ½ÿäý3ôADïX;tíq÷â#>épËHüáÒ@ýE„^‡Þãzƒ/”ÿÔÏ@¿zˆÉ»?O¦üŸþ:üi@ÿÉÒ©•1ZÁ”Ò~2¼Ÿ½þE#ê” ‹ÙPj{)€³qKR½y4×—Èd8Djï£MÓ­ƒkõÑE›ž* h>³…´LóÑ« k’ÛŸ–Kérr’ê5£?#Q—@ý̸ôOb­a@;Ø7Kã@>ÖæìáÉÁøŒ}™€˜yœ‘ZJå¹##êû”<Ë¥¤©úk-G•Æ@FÏÍ6[ÑeðÖÞW\›5O²±€4O6o¾æšõ¹û~ìgOÿ @{¾Kçg°vb×lžÌÁ´Y¯yr¤ˆÊéµDFvü‚&Ç2_¨å]AîcçÕòŒú&½$¥Ì‹qQ³ ÿµÿ§ÛµÞÕwŸìÕ½<¯Ûãg¿H¦·ä¿^yãË«—„—.ý“ÀÙÛ ºSÓ_ù…-e ~'„ø“4Št‚[Bw–<ÿÐÌô:¨­ KÓñê1hF·+¦ÏÍŸ÷#`Ja Ë@>Õ6¢Ó}Óîå%LËf™å9äºjèÍVJÎrcd6˜e–§ÈÉ[žÓ™&Šíƒâ9ÿNožQéß7EÊp/Ä]$ì’uh31Œ}š šÀþ4)L`mŒj úi¢” ø²m&‰zlÂ8OŸ*×Jý?Z˜$¥dÿ‹gòüÒ)ø2b¬²ôÐuˆ÷f½ODbDÀôÙâ.·^„MïXo”a ^…eg´ðKÃÂè\`µ4c†ìuã'ÚH $Íæóþ—à•<‹Ù]ø¥Ð9íÏN„>˜ç” àĶO–Bç…õVÙ ¦ä_tÂÙ‰ˆ»fÙ Û!‡ P>+Ûkå~Ù!²d– àïë9>9»x5PO1ºW\¢P@CD¶˜Ç'$ ¯ îÞíàñ7;…hÀÑÞWýãaÉzã1¦Z±Šú&uç 6øÍßþåIâ¹"ðÿ¶þÔV©Þù ´÷à¿zþÁÿCÞÿ „ò„ZGŸM»¤ÇÊmL‰®ÉS[•³Áý±,M ªM£oN™BÖÛ§5y%õY4Ênh‚%«º5Ö’ÝÖš›ŽŒ*˜˜ËFjã~Ö9×HA_wÚî)ø?y€_ìCöú•‚[¥wÞ|òŒ ýøÊý?XüÜN:¤ù؈œdÓ£;Ó[A;`ç`ÐC;…Á½3€Þø?x¤ï`e)‡G¢àDjqY >-›mÒvúPÑe t(=„…m$ ¨bŒ8ÑbÌà$Šâ4ŽlVóÚB¯`ÖÕ[O“} j<¶4(7m—’Kí3Ê{äÓsi{¹ÜÆIM¹}Óšu{òOŸ#¬‰Œß*M¬’·zb¹tœ¯é/¹ å6GŒÃ¦ ·æ“Ë9–y´©ë5ÛÁÂÏR¦ùÜÞ@G^úc#(a°„À·iÉåbï_ûôœ¯åijõÁIN–úQÚÚ¾v<ÔôŒ|¿g“ úç~|4öŒ€ØÚo»Dûßw!åš1œç¿%[§†Mù£“²Wmòóp»>Ôæoü¿gqàŠ1°-¹z¤<Ìõu”0Œë-l|¿ áhÛÐ ôq2ëuþÿõŸZrç ÂN¹óÅΜµúF›õº½Öe ã{óþÃD×Û']oú1Põ½ƒ¢Ql®™uÁ‘âôEZÏz߬F)Î]%ÔkúXuß/ºƒže–ãrµñf( gyedýf™å)òæ;³÷ÿúÝoÿîcNÞê¸÷SKúGÍþÔ>êÂE°‰YŽõtÀ O ËzÐäÑŸ–Šylk¶¾2Ñ£ÙÎ2Oô>’\øÍD|¢YÍ ,mf.Bÿñ/ ¯þ/@VàN°Z!ËSXœ€_H‚öHØ¢»5º[#=C?ðh Qñãlé81ðsH²¬ÝÀê^ääG^¢Qüo±˜¶‚˜?,Fƒ³¼,±bÉëX-Œò_0O‰°ðJt,<ÈJXt ä÷vͰ”Â0½Æhÿ…Œs;7MÇÍ«9I>{ä§¾³,ìýÓ±¨c³ˆÀéB•¨‚_zØÝEŃ"4ÇpØ/´¹2ÂÄ›uÓAW”nìq™O–fð›¿ýËz[Ž'G‡™Ñ‹Žå6ƒþÏ ø·2¥æO;(‘½9Ç^qüÏÀÿü×X”þ Ã4­1@ÞóT9TùÛ:\$æ5ð¿BdÙ“Y EÑNPZÀ³ˆâ E¯gÎËÐü¥,xÁÒPA#ÉÙ\6‹wqRú·ô¿ÍTC€CyvºïoA‰V©_@ý©R¿ªï'÷ŸHÍ ¬¿¿ø¹[ÎðÃSXw„,pÛ%ú~GR=èºv‰I`ëЭ³¹ØÆÃ¶C–oÀ¿…ê_2€z Å”¼ýK_îdH^ÈÕó¿÷çPØê±âíŸ<ÿó2ïËM˺‚ù©§ˆ©/ˆµˆ¥/ÀÚ`<3p®‘ì›ðØk¦¹žÊüo†Àœž2/mDÉ qõ´Ïý^JËËÕ«íziîfïù"š@¯â.cYbíÛ1÷ßš?3¨‰÷ÿ¤ï‡<æ<üÿp æ8ŸG g1~HÇS!·F(˜µ§tRÞ$Ý#]#:G›ûÔZ‘AÿzMH‹Ãhyß§½ñ¸Î¶Ë ([ÆŸ¼¯5˜ËcÁÄs»­üûå–ÚJj'µ§Èé“ܨG©?Ä´7t]g³V¹lúÛ~XKóî{ÞïRû‘r]îG›Ày¾%áÆßWû‘eü_žÌ¡]á«ÿõ}>÷/ße÷AàÉ·4*Ë{ŽacŒ­!„b Ðèu›mit¿x!nÝ™./ö é ¦û¡0½Zˆ*ã«øÍ2ËÇC®£6_Ïà4ËÇZf€YfyŠÌ“DШüÄ¿ú'ŸñÄ­2¬#a‰k³ [‹¶JØÙ²xÿ%l”¸±PeÿÐÄ‹í³e¨VëOUâ‹á¾dÏ"ôP€²­ì±Lö–Ùþ˜KQ”\%˜ÖºRËï\Èà¡dÑ%%qg”ÿ²rÈéNÎàôuduíî‚;AeÝ¡ñ·xˆ.> ò"gAéNaAr|ó^˜”.²x _ü 'ŸûnûäÂðÝуf”ùê²g–«UÈìq«…jþlÕhýƒ­¿â 28Y3€¹F¼íw‹FOþ*Ô…”X—@ïÅxVÊ¥LhItÖLC4çA‰ˆ 0{¬(®„¾ÔLÔ¥ØÉYØ*³¢PiuèU;«‡tª ÂÑP_GþÏÿc¢OyhI¸7þW/ÔaðoéþíÈÿûÔÿ®—Me{OR1#Lª†4§L²`6š”èBá½WÖc!ý¯LYÌ0ÀåÖi)i€ùö`p HàœRÊ´ªù¼ûÛåt}–Yn¶\Gm½MØ,·An÷è7Ë,Ï o~yfØü`òZ,¨ èÒ>E±ØžÄôQ bRP%¨³  t7 AYœ±£X‚Æ¡YOñ¢Ü‚ ü7¡bŸô¾R÷eãɆiÝ€, «@ÑŸDö‡ä[4¡üà¿{ ñìÓ+ÿÈ-R±9ó›Ù½$ÏÓ6?µåBU§gø³AO> Ý›8wäļ‡TA/À!Ý ‡°–nƒn@wÀNQ'XöXÞñÈ'¾ÄâÞ/û¯ÂÙwm„àVUŠWL¶CÆ DÌc?&ê{çÕ}"‰È×tbç线¸ìšôêÜ«1×ÎT±Ó¦ìRÞd‡}k‚M¦$%oÉTsý4E©óèt“>Ïh¤íHà –[ŽÔ£¹ÉGLy˜¶ÎúþQ““ñöÅ®ˆ ƒÿG½ÿŸ…úøõßùœ–WU®ôß÷þOD퀢Rÿ·!°Ïû¿‚Z`§ñ"L{׉QBíO!ö¸Ô.ó½öêx6aréÙ±ýžÔtV6èÉPœõÁ­Wg¦ŠmM¦"ø·§Ûs³1BŽtS²g4O¨Úºâ8Ê«š ‡Z¨ŒVÆ þv2UÒóÔUOѤÐwÒÞ»@hŒ”í—¾ U·KtÂcAÎ/Ý ²íp+µ9µˆUÉ¥ ^`!p"Ч7$Ø’àŒÅ+Hp¼mµ¾>˜/iuu^¢àbª›ÑèþE3í¿O¡Rø_ÌY¬L- ÀÂ-ÌÛ?¡1¢‚…pfc´0ÙXˆ8êOb¢AÏõ=;{®@ªý\Í|QF­GÆ¥½0úÿmÄŸ acÎ\â=ÒE†‚ð¿…¸kbN\»¤»í1F×óêO:]‚گ郳)[é;›O¼Él2í7^T‡;Ë,]®«¶ŽFìYfyV™ f™å9yËÏq¢€?ùǼõ‹§tw»‡ÝÃ`ÀO„þñ`€Â66Š[6@M¶êLÍ!KÐЯ+@ìµ1°u @¥Šj 4Ø#F,îgü±?YÎÂý¿ýC´™Cö .ßè×)y¦/P4‚IC/.íwŠxÒ[:X­p'¯£'ŸD»OÑùO€;YZåS@{¼žY 8X ¸0 ! CouË)!°Ë’¢"(rþãoÀî;èFu¦tk<첆m–—)ÙËC­´IúÅb 0 °ìŠ“zÕé$%áó^ó*É¡ôŠ€oß')òŠB¹=ÑAéÃ#àâ,£4µSíl?©Í&åY;#Å¢(óÒ¾î5$uk£W”b޵òÿŠŠä©žÿBôv‚ÿ×åéÇ;ˆ IDAT?– ·´Š÷C4ÎSýêÿXÀž|¼@BÙÈ` ü¼LÇii×dt´"qEùј4ȶ±œóc„ꉟøü‹­‰šA@®Ò%+Ò\ZJèªÞ½ÆYÌS>›d(t cc„:P3j“#ÏË&“Æ‘:(ü'JõVÅß*ß3ðP€ÿ¬8œzŽ#€tƒ&®oNïhøNiš Àÿ¿Hxç#¯ž¼ úþ¹7 ,à4ÂÖávt ½Ñý‹‚Ã…"Š >th§¸èp±³Ÿz¼zD;œ:\苦e)«¦Ü°ú¼`E jµ°U\rûi°=ˆò"µ>Ã`Œk ˜€sÂxqР©ãm]>Ô{<›4@p¤ê}œ>ªàuõéÏ>¤=Ôc—;º´o ’Ú+ k’ÄÔ4¨õȦ¸öîù…ª÷öèsPÇÆí‡cþ;-Ç_®O“‰@Ùn÷OžÞ†c(WH[Fôèä¾?ß¹ycÁÆL¡”A1^CS‘¯(åî¹ÿ†ÚJ ÷p9ð/£´ZÿPëBÎ$Ô7hÇöf¶0._!±–hŽXUÛrÊÕº}ø-!]h÷\¯ÈhýéSà\Âuya!ß©Ìòd¼†ª÷»©hŠQñM Ô>Ýû_Š ôUÈ úß`û"^ÐØ)J2ÈikžÖµ­ôÿ ²ŒZðÿY¼ÿ§òëÿãíý³\7ø?¢yn÷}#€êño@ÐGi™* ¤Í³¦žŸ%%G¦ 9}ûȘ´ûµ‚…m,çl«°]™è÷Õ€°˜4b™Ü‡làøoJ{‘ZyÛ9RUš[z2Ðï&ocÜ8 A דb¿}µù)Tï,›ŒV'gU€gL½ý+ðŸ=‹Á€ä«Û¿U{ŸÝO¾{(a·GÞ;áƒãfqé¿zŠ,ùÜ}ì¡wpoHs5ž £>V;Å9gÆ`уD<;¢ ƒŒi4põ8‰Ú_‘4¹rêÄÜhýFûŸ¡Ï ødÖ ¥®äÖÖF4(Nì;DãÀ²¡ÉÚÏÈèàÍ5¥ÝB5H`W“†éT÷Ø„ñp"û¥=6ž€–µ²»¶O›Ú*¢þ“¤¿è°&9}—ìM¿Í>ˆ?öoÆÉuÍé‡óc4/¸ÎÇìŸ~o€6{Z#´¦VZö™1³}Gç~±‚òyÑŽ·í]iI›ûµ¸Ô]ÉÛã¹æôù‡€ÿºÎ¸¢5Fù^u._ w¦¬”q¿²~i;ÆOu¥Uç¶­£˜K¨FpÝ ñ=EýάOB‡’‚¿ à«´t÷U!Þ)º‘2ŸrÞ¥×äK?J¸arô=ŠÛ\VvV­¨¸¦Cu˜Ò9±sˆð Î>úÅ#ÿ𿝮¨ Χx€²«„¤lU-BphÀ˜jõUV~óo=›çÿ_½Å ÿT^ŒÇÿ¾Ôª™à‰Æë_Ëö„ê¿ñúo™hö‘€‚ Œ=>[5õñ¹Ãä€d¥v€ œ·Fµ:—ªï' xh‰K šñ;fH7IÍq××”Þ® ˆÅ7åG@ Zdæd&pdšÏÔ.§êþÚ¦«2ŸÒ=Íãfäó¥&Ç Í"'ºr YÿÜ7Ÿ%‘o9ïˆ;`ã9{§'ÜïÐ]‡|!¢›v©oßîÐ3Ö¯À6" 56€^!ÚÄQû<ƒ_ãBG<Ú)’Û¼¯t.ïXêRŠI5a¥SÍCZ­§6¦Z:ZŠûë7˜€ÿ *š1°ÉãbL‘îˆÓÒáî&T¯ÿÜR-<½ëÍ $Í»ÁýlиÄОä6‘Ú|y†ïŠøµä¶ëv×߸øNt°}/ðä[;.¾;pòVG¸ˆôç‘îD;%îÌ8l¬±Æ9qeFWÒvÖõ&šÓãê~øÖÜmäaº¢G]Â1Àeûf™åÅI3©?¸ÿ:ä('gy2Ì2Ë9yËsúéÛÝD¶Ÿù—θóùq9{Û·JØDB¢õÛHÜ ”ÅŠ ;‹U¼ÿû´=`Þÿ½M -Ô'ŒRŒòäq:q”8™4¶“Èjå–Oïÿíw8ß(בΠËN8Yš;áöÎî¯m†1ÖÅœ5Uå%u”„<â@î‚À€>¶›Äšctŧ{$ýDFŠc±»]¶@1Í¥“gúøŸåæÈae·ITû¥¢u·ºœK_ª{ûŠ!Nòè—DùºRÃGðÆ ù˜·&¨êȾZ ˜§p¦”‹YuµùÕMöš¥«-¹CXËSä·þÖ/€ƒ¿òwþ³ç¼ÃÇW^>ào2¥#©ø/óþ§eKe=ß»7´L"š¿º’ðK#E}®dÒŽdé¹##*x–ª6ùŸÄÄp @ DT4£‚I©­u[C€ ª7&€ñûf€ <·P¨×ÑI~ÉÞZ`(gAU¾W%¿¥7§‘Fá_@¥|}!  ÐF»/Ýrúàýÿ}Çê_¸`ñ™xÞÃg¿ŠÄs!^˜gWܤõ•¢½ÀΕ%½ý¤÷È ÈàÁ{¤óHpf€Ç9oëÑá¼GÔ#Qª‡òø—hùg4ÿy[@33@:VÊ<]_ª™ÑW£Õ;½õöŽ,@"µ¦g€JÓQ5Ú§¹¶¤ý£ÚÝB¥ÍyeﵑÅ\ÛØï’Ž`ŽûS ÃýÕe{ofX“\ã0emÆ4Ýx)û¼®{k“\¨Ÿ‡í÷¯CÆ´mX€bo%ì×Ò×ÞntK×ôµRA_—÷•ò32HyÎt˜æÉøè1жnïÔñª){¦Æ7­q‚–sHûë\êœ Ï¬Cˆ9®}3Nž-©FÖÝÓqµ´}¶«®#ÇÀÿévÍSiór´¯ö™Ž<îgлAó{4mE’±7+º<ËİÝ• ÆýiØ,³<§Üîp–Y.‘ÛNðÁÿ³áü{="°½Ù>ðgÂpn,ÛÅ]Gÿ$Ð?±˜Pùڤq)‰BJ ëˆtÿ?{okÉ–ÝyýÖŽˆsî½9¼Ì÷ªêÕÔe»l—‡²šÁ2Ý-µUHLô'°|@²P#èn5b$$$„mZ€ºiS·Z=øÁP3¨A2í–LÛx¬²ËS•ë½Ê÷r¸Ã9'bïҵ§ˆçÞ›™÷æÍÌ{Væ¹±cÚ±cÇÚk¯ÿ‚ ‚ENÍë?ZŒ¦9äTÀÛûa~èÑ{omOÏy‹é÷ÿâÓJÛè¹h…Ã…àœ®•ÞÃa½Q',ºík$Eâu`£²KW¢ÕKV,w«šÚAëJèSÌ ycç„ñ )®RnÑ0U nU(*CD®ç¡÷tí¤¤0½ÅûLzƒ7Åâ"J>¢2•¢î¾ †š@ˆü1To-L7ƒÿI š<û£ç¿4 M€&ä€,Ò9¤m ’˜KÔ{Ô{´÷È& ƒB´ž¶Ü%5sˆªÔ¨Œ-ŒŸ‚Ää ?ßûú‹ùàOü÷{Ð?ÑëúoSÍë­_%ÿ.C€j›¢ìOçð¿@$[àÿAÛ‚v×·U)’P‘•õ:1˜€g©Ž)§fý|è¹QÒ¹".Ö‚r_ÛÀIÌÆ­æ•ÄÍ$‘3&pnûŸy×ׯ .Jm– JÓŒVÆ ƒØÝg€ÿd¸±'iõh¹íÒH}FˆG¬®ý÷~x‰÷ùö’>Z²ø¡ã†áÃ:oÀûÆA/àŒïJ#è©C×qŸSK °nm}ýô´ f€‚”t¯ApÑÈRµJ)¡é}Iñ‹å ­w1&uóó°àM>ÔÔ|¥ –PX÷cBâ©,äk&¾‘AÐdØÙ`dX"ÉPµ~¤m€V#8ëì¼ìi<¹fùŽÇÓªxò¦wl' oŸ‡¤çyõiMÆQΩm-ÆäúWcÀè™tvõ¢f¸:OÌí«7bÿMˆkìŸ.u(±1Gâ·8 «žL ìŠÕ|jÒɦF#øT¦e’§U¹¬ò´Î–61Žõ¨ â¦Àɧ|³iL¦&üG- Å( DÝStüpÉ@< É`Èúxl)üåjf€èø_Tï¯ǧ!î·ï8ÏÍ)€¤Ä3ˆ—Š×7ùüuKT *ã†*ìY¦ßôù“Ñ€Ë×*í[vÇ|pú¿¹´×íÂ7ÿÆ1Ÿþñ;¸VpŽÖQÞpJ¿R|o¼róĸä°V†Ç¦‹ºÝU仃2›±•8‹Ðoé&]ixrXN®õ¶¬½€íȯñ7ÇV€z 1> þ„_‡ñ|Oo:]NPè*•Š:Y¾ý Ë=] í ö´§ô™¯Ü½é*Ü8ýúû1í¡£=ºË执p§Ekï8¤Ú£é¡Wš;Š,,@+‚ë„æ0æ{ò ½ &Ô 0Ä›­õi%TTõÓéУt{2úà/ø0xX÷ŠxçŽcðÊ“eÓ+‹ÖRlzåá=Á9X4BÓŒõ0WŠÎiAëÝZ- 8tCC°6Sa׃t@>TÒ8{¡GØ Ú¼7e/¦4ДÜp®?åÊÈùŠ·=½v¤ª„ý`ì¤mì5z«^¼rÐt&PK_Ü8û%£·Ý`öéf¿Éꃊç ûO  ¸V‘¥ Ë–ÈâºCh:b¤_£›3t½BVƒ){±PÒP'1%G¼/Å r«žõŽ„6ìxw÷ÿÉ¿×þÎìþÛF¯/è?¡ ÙÑZ%±ŒŸãý_ä º$ø_•¾PÅ“½à3˜\”+š¯”ÿÕQ$ÇÖÈØ‰Jñ•¨”Ï^såXás%ÔòüOOÐè©âÏü‹ð 6"—ìC3 Wƒ?ŽZñn`göõ³ý5X:õ†ÔtϨ%Ô]II ÂêG¿~‰÷÷–ÓGKôx€•V]£^£(öè8uIaÍÐQ·5¤<Ðéê ¶´ä#(÷OV »¨O³jTïgÐ#FIIë?Q±¤ç¬Û¯~òØß÷½´·ŸN[Ü;kš‡p²ÂuŽfkAÞh] áL` ŠöR…ÿtãД`Ó@Jnhc€h¢@hÐЄþ¿¬Ã³˜ í„©R ¶î(i¬¯Eã­ I}·2¨>9%ƒ;Á´1=•Ïë¦F6ñO4¸©´&ºma0³®ì|.­W«IáÎv¸‰ áôëòú9ÿðê¹2€šÇ‚¦cS‰Æ~—Æ‘tÎ| ‹Ý4ø—r«ÞÄh'rÚúhÜÛþkŸl,€*¡>vv™Æ2ò7KÇ·(„ƒMŸBe@i¯Üöã‹í2á˜kºÙ–ÿTeÅ0`Œg€¼¾¥ƒÀ€qIƒj´Á ò”F„ áµH4õÎ/Ï<þÍØ¡Éàÿ.à´=ióšöàÿÛCèvëvQ¸÷Å‹‡ ›'×E½¬½ú…à à÷k›÷§h®M'øhà:,²ëM‹9y &kKƒévcº×¢·5>™Ó»Æ¡iÖÙk¬†/÷´§WO—é}“™éµÒN‰oO{ºˆö{ÚÓ ísDߺ‡¿QôI`õá` ¬NèŸy†S³Ný±§9tþ¯iÅþþÅ ô&$æ\P„D[âÇ ?»~*½Ëíùö­¡Gù‡pΰó!À0('kåøLYm”e'¬{¥q°è„ûGŽE‡ “#Ö=lú¨Ø8\ ]çzµÞÑ#p"-µ®Bu@Ž£÷ ½Í´‰Ö ’â5„gøðñOÐÍ1Ú¯¡ãcAˆÎ ó†À–l•±{™ëu ­^œBJCIׂÂé*°îáh)Ü93f©t¥N°0tøŸèV€ÿ@f¨Ù­º€'¶ üwjaŸ]°-pÐ"wpwÞC?í{ˆÜCd‰“Æ^ŒÛà›ShïàšAô)„Mäï .~Ö’œ?·§7S/ÿ^ÿ{ÐL/ úën&y.½øwTÁR䪴CªÅ#]+@)ðÔžÿ–þµhÚž¹óÑ.#€X®¸Aú ¼®Ÿ/dD#€¯¬ñœ±§¦d…~Q ç}˜€Šô52•¢?EPrØîd¼}«ÖΩC.ñê5{§¾"¤PÄ’ê#õ¥Æh¨VŠ„m‡êèüÞÍýöÅ{Ëé£ÿÓÓ}øGŽþƒ=s&ƒŸYcë*ûôœEð‚ô âxÁE ß–ò·ìwÚâ0Ïÿ†XŽýD#@£BètIB¼ ¸Ÿ^q¾Œ¬?Bû…ò)×2&ë 5å5¼ Iƒ~¹>å#ŽáÓófuq[ÏóÀí²Ò£¥îÝ’îØÊ|lr™é]½’ŠêÇ·}D4¹Ê´&eœ¯' õÓL··Ÿ`Ú[ûÞ„ùâDí«Ó¾Èx_:etlp·µlÛ!£¹™@6Ø®LM»úu\“q™½ZÉ5M÷ƒõUDŽàË`d,0½Öüq£èÕ9ã‡/¼"oMŒìšõ(´Í &ÒÀ6mÿ¶Vð¸€ñ©·öxŸ)C (ž@óü^\¾Gˆ}ÂÅHC7hÎ`Þ`ìí_ \ ô_ä¶at][µåøûè¶§8þú†î‡´ÂpæVåÆáÔRµ6Kðg6†·w„þ$¼ÒÞÂÚxe{Ï¢…wš£ˆ‹QÜ¢3.ð@0§/±Ìc6ìø¸œèv“åÄa,ÎÔCÏ®õ=íéjèrÂr¡ëV Þåž®‰n7¹§=í Û. <ýµ ÷¾°`ùnÃúÑ€†@sèX?öè ,î:†u@¥YØäŽâ)æò+µHíÁ½fAœ2F!sÚ«¥Ø@Xƒ¦ðRVUE×Ô%KR©Œ$ ŽÉT'Ë©v™í·€ÿ•Ƈ¢œp|¯UÇ`_ jü\spÉÕÐTí_€‚ÚÿqtwMž˜âÏÀj •Òc‡ÛòÝ$@3Ã#œ¸è§¿)"JòÎ%®×†hû«q ·íyM¢ÑûŠDP (ýj½j™î’טÆDgXjÞ=Eß;½¨fo5铎åžÒ~ÊãœCþ8à ¬]´&ëZÖ–ºtíVm}÷mÌ(@{GpJèØ4H«ÈÐ"}­â¢¡¾ÁŨ¶îJ X&ê/ vlŠ`QlIŒ —,2€ [£>L¸Ê$40Í‚NºL>ÌÀ?ºç…¹N`xMR]3sUG û_GHW;ÿ›šác:Ýû2¼-ÝΘ)î7æÃu¥5a ^]ß8ð¢t!lüBTű„‘Jdº³"×lóÌ"L{?TrFbìçû£õ0S^Œ™¹Fºvºo’ÌVp²=}°‘Z?Í]ËØ&ÖW£AßèÛ­ïrÉ:êÂ|{Éx{þ :J¼ýkà¿2yÄÛÉо§‹À>‘Ýdz 9p~Ë 8ŒÃÿ×Ïš# ŒÎ‹×݃ÿ·‚|yyÓU¸Q:ûÖÀ‡?{Ê'~ì÷­Õï{†u`ó‘·ðÿgÑXÈ]8!¬~£¸N²£–FG-‹Òª%J«jô5ëi3ЯãebÑÂhôËSÇ´]­çrÊuòöœÎ—e{ÚÓÅtQÏ™îŸÕt²oÚkwwÑu÷´§¢½Àžö4CŸùÊÝ›®ÂÓoþÕÇ|ö¾Ëá§[¤ÜÂÑ9Ä ¾„M  êg¡ÿ]+°´Hê·¿–¶½5@:lõæ± ÁlʵWt°iaXG2 ž„åïZ ŠPrHÁx8½%ßÓ¿ö#¨*MôÔOêÎE+Ü9° 1˜7¿x÷ž°è„¶m«ÂàM!áœÿ"2ݹ+’:L;7Ꙕ콥”`€dÙ¡‡ ô“?J8<‚Gÿ ¬Ÿ!þ)¢‡§(k 2P¢k‚?ÆùÇèúzúº:ƒU€^Á‹ý&¹ÇT#è¯2–ÈöÀÿëOji.o¶*¬|2€ûwgkålcJ''ÊéZY´ÊÑRh‹pᢂú­wü/WdÀy0‡†ÆBü£V–&èÉ.Æaá¡“÷ÿ¢E–G¸å¼{/‚ÿ÷ÁbÅ/Ê- t8qx<²Ü€?%ô+Øx¤W´QÄO¼ÿ£ruŒþ‘YÈÿó·¯}ýsüñŸùéWÔ€¯']½‡ÿLšÛ=3ï•­ƒ¶”ÿ—´QÃ·Û þÈÓ¯ tr^ux¬ön°îz…†J >U~ç(å“Aj#0L3ð^.XŽ«½G€AÚ›# ÌÕÓ1’NN9°m@¾¯’øEªã9-‘¢DÅ{äΦŒß½$”dW=G`M¬KòúÖê 2fÃð½ß>§V·ƒôçßÅëV„ã=ä00¬…°Ó ¬a-ÐE¹iP‹0ˆýzƒCCƒ"œ…ú÷m‰£X¸ÿ6‡úwX™àpêl>”¨˜ŸÃü§ÎPG ÐêÛª¿€ í䢀Í D•ú` +p4ê ;Â\×áÿ·Í€bdIß]§*Â9Ýö´lŽÇ]-o›€Ñ##€zÛÚ%£WœÖ$§ØÓ•PNÁ’£aMh`«3¾„ÎZ¤ôP¿eS€-à¿:¾F‘â7_Kù¸z̪¾Ñ±Óç? 9šHú²±‹Ì¶_2™ÊG[k™oØßóÁÿÈ?3ø¼ÝkCW ï°Ñ¾~—ˆ6 U›I4åãÓnøc‡Ù ~Þêø?ÿ+ÿê97ÞÓÛL·=ü¿ß¾çŸ}ÈÑçZúgƒ÷@Q¯lž¤ü:àW× ¡i]{5ýmoÎ]%µëôÚ«¥è-º+5pЬÏì¶èuÇS¸-ïEìwO{º&:w;ٖɾ9q]«cwÎÀgh/éîéJio°§=ÍÐÃ/ßn!ñäw{¾øO?àè³-~¥øu »ãN~`8‹9¡I xA ¼Â: Œ^Ñ– …ýù¢Rx(MÑb´”’7*”í½€¸›2¤®†ŠÀý#á#aˆm'î9|P‹¦à,_ú£'Jï•E+tX®t±4Ë8RÎ`Iã6 í1ÒÞ…ö)t{ 1BÌË0Ç4„¿õó?ÀoüÖçùç~æÏ¿øªZìµ£ëýÇØéyÐÑL館̀“qÀ8‡ð.c€1[ÖQyRìÛ2) É €»k=¾ÇtvÍT÷é ¶ãxMné_È”.y '/×Nå’AŠRV'iB; «TÞÖæÉ EÈÞÿã6ÏÀ+5x2i© "¼0‚:ÒÃHu -o­” å~£{+øûs[ûVÐÇ hOiî)ºRB'4w”Ð[ØØ»u½þ{ ðï%¦°u¼ÿ24„Ê»Ÿ`?ÑÖ@þÐàK ÚÐÄm¡¡ÁÅÈ ìë¦DàÜ¿Z©R¤² ¼ ÉCÕ.÷„rBÝÇ&PsÄÇ¤Ü T (b¬‹Þ²u%F˰Ód<¤‘<†“çú:ët[©fµyCÚ¾˜gÇÁ_œ&¼«ý¯;­IýT×Eå­¿.Ê«÷þ?÷n3rïÔ(àE¯¥“xüS`_äl ü×Fví:Œ}Ïô WÐ?ä:Ô|côé¤*€]ṟ“xÖÿ±ïµð¤ À¯Œ&•2Z™þS›/ÿm¯ÿ:ô}6˜ï"¨N}“¼Æ(|NÍ0à¦Ò¥“ìbm@y†-þišƒñ~'Ž?÷+ÿÊeo¼§·n{t×þæ©ø‹¥ð›Àò-!‚üyµ2ð?DÝí@^Ó®iéË’:µkÒAF½nžÞÇ ¢vLf‰q:R‰ac‘çuš÷ô¶Òy=lºOfÊçΗëçÑ[ª„|~ú®Ÿx‡qÅãÿoÍÑçZ¤üªD-Iü©~YȲZÞ7å%“9ät¹S­4-{xÓÞ`O{šÐÁ'߿ݟÆêÃ× n! «@{èpKA‚äpЊÒ‰q’î ¾WüÚ~M ~£f°±É`2½„ƒMò’)º±ui±k ”dÀ]ÀÅCñNOÿÚl•…½‡Ák68èÌËùt­ôÞÎa€µ3/éggÊ=ëÞ€ÔO?l”¶)ÊøÚ‹é¥)Jø4çûŠV ¨œ „Ç÷;¿wtŠÜ?Dš# z” ¢=N›St³õ6kôl+öb¹k1#€¡ê3AÆýEÄ”6é7‘»ÞV,øM£þ…`†.)u…E0oÿ㕲láúÁÂ×,ì·ì„¶)©†(Cv¥h,%ñH±÷V‘ZŽ]¹×â¾ãï5Ixõ#'óܧL¸%ém–î$æûsBÓ¶h»@Ý![‚tÄÐÕ糎×TÌ0`‰¸#´["Ýi‚ „ê³³[Gßû€ßøíÏóSý?~ù•7×ëB/ úC­ Ï%exÔÉv¥0¿xÝžRk¬ŒŒ$׫c¶Á¼øË pż+ó¼·™ªóGêýñâ•P†Qª•qÞàú`!åÎͺ¯Ê댋æ²0ËsáØ¶ È©qÿtÝÃÚL²÷ÿøŸž¡„þO@}êCù!«ÇÉu¯Æš½‘çð¸1â=g€\&ðPÝÿ½.x;·€¥yØãŽÍCEÚÎzêN ø÷Q¶ß´Š,2„,O18ðƒÉQƒC½#‡B°ˆB0/¯.ˆšÇ¿h—ö³N”Ö±kã ëxbyŠ?ëd0á2ÛÔ1t*HePCþNÄl÷=)p1 7ŠÉ é;µë»ÉÇ^êR¤µçÿø”Xg\'ʽGGÌ;NºšT|ìZÓšdë\íÊÛ`êNè\*ãŒú¤×}®(ÓMÙ*íÛ:E&m²=×™½ÖÈÁ:é›Sð?$ ¿öð×h P•€ÿQÔ»úø[ž“ij¹g,ä¿:éÁ2îs»LmL—x…¦½…=åo¢îcª‘ÿLûn™{WfÖo)Àöœ—{1¨ ¢W|~ÿ1@ð1>(Ñ ¥º‰ô@#..õrÆèaôìµ€mÿç¿ú¯]p·=ݺõÎ]¿×óé¿ÃÁ'÷ý±§=ŠzÛM4ØhþùAÍ£¿úi2 ð±lPÂ@ÔçÆã‡âä¼c¯Y—«ÉÙ«Òå¦iLÒå&›ä$ç»ñ„ïõ·÷ôºÑ¶Âb¾¼.›“Ï;ozÌ‹ÐTð½µôÅŸ|ÀêƒÿëÿGŸí8úlËé7z†3¥NªÃIÀÅèÆ~L¯ ¬ÔlE²RZ:¥4‘d(0múmâ1·åÜÓžfè¶[ˆüÖÿð„Ã÷[IJyâY죷?ôÇÅÚj8S†³@³‹°2†êW¿RÜB Ð_Y& Ñàµä‘ÊV£”H‰WáÚ¹Œ@o£ž£)ø_BõE@ÔYŠïMO»ìà`!¬6ÊÉJYF£€lî:V8mÜ;BmÑy¼œR#ŠñjIA¢ÖGÄ+¢Ä#m€ô‰å ׇ-ºp4Ò¡ag=¢k´§ÑÕ€¬þ4 }ˆJi…`¡kÅAâ¤#)“âEÆ]Ff~ÖÐ/Ü{º>róþ|è¸{`ýût­¬{¥k…ÃNðÑ"Tò·‹h…žÒe(c`ì­¥! §ú@ ÇÕÏ>ùr­íœ#ˆ Ò ´üg¯ÿ{ =¸%è³h¤Áׂ·".§i®=~Eàç~þøñÿàŒ…¿~Í ñúÓÕzüAÿ>/@Ó6X>…–¶©R]W¹¬3¨+±‡iý²µ:“èÝ7ª\,¯«¢£uÝZ›ÔQ©žkfÿ+Æ_S` È×û5«Ú«÷•Á3ò3&ï™ñ…Êz1ˆ ™=™Ëým\ÙePjVŒb«JÝÈ:iåbô¡¢ñ¾ŽÇ’êù™ó¹Õõ¶B;×e¹-ÆwïžÁ'V¾·™ôÃ%~ᔃ?êé¿ÙžšŒ$mC8s„µC|0?ÿºv9IAN‹¦Ôdphß ÞÂÿÌ@‚­£ b*ÚôÇTDàŸ,L5š¼ÿ]1ì…(¯U|£þž«~‘òo‹0•öO)Ñ2 ²Å_ñXŸô 2К @c}\¬žŒî11fš^+~)ö…]:=Pùâe´¼ð _°}Õ4æ_#y)Gó¤—Nk’î3’Íj½l5¶ìàªÃ‹éUy¦sOxe´Kø,“’q¿>ï:2sÐeνJ |~÷[à üW#пöú/Ëúúy«üGk¡`T·j}Z÷Ú*e"ï”/Wª6•$â’鿤¯ £w;þ£€,0¼Çaÿ“@ƒ‹À¿ËFµ¡@1ÈŸhýÍnÑõ§*íYúwø¡ŽP€ÿÿúkÿöWÜÓm§ÛîÜuöÁ@s(|ø³§|ªáø·{ü©²|Ï1¬•£½º…dp?GmyùkÖÓ†Z_›u¹Æ#§NZ%å&#pm²¥m(lù¦¦i{z›i®']Fx¾lY¢é|*%ïé’ô]?ñ‡ï·¾ßò™¯ÜA½rç §ß8ødÃp,ô‡Ð8ü*Ö‚t’—\KæYÆÛßR3l¯ùXr8áS» t¯z ùÖí ÷´§ô™¯Ü½é*Ü(~³ç³ÿÀ]Ž>Û¢ÜÐܱñ*¥y&H~­´VX–³Àp¦4KG õQp?P˜®—"0Æ^Ñ ÛLxÆëd 0*kAsK¨LûÓ6Õ¾¹õ׌æ<ÿÁ&îEZÓÛA8 Êf°Ðþý êU*ì ÈÊ1ºÓÎÂ[,¬<Ň³(óË}$TjPÏÆJÍæV·åœ}¯ŠÎWFûê¨D—òÜI?2$8ç¶óFy'qDŒmŸ¢Øý¤Êý[õ–ìå—ê3­@³;ÿ"ójOÁRQ*?Ý7?ñJµi}¯R—öÞÿ¬–×)î@i›¯BÀã:Aï*Úóþߨyrmœ¸ÂFh6‚Ü7ãL¼už/éCoé\‚ƒþ5hpÚš²E• §f…¤1À6•%­Î,ãOk\™~îœÊ73ïém£Ëô «êe©ÇO{n.×@Š»9úâO>Èë?ø'?Á¯üùG ðà—´w”å'6;ú§] Ý]3nB”öÈá7ætàBØÎ€ÿ0ç\ybSÇó,cü“87±×ΆÎ:wÂ\ºA^¶7ØÓž&ôÙ[n°úÐgýÕ#Ïú‘gñÀB«ô§× ý³@pæù?œxãÖ}C UBýëÑ0ÍÆ‚äh9/m1z ÅŽ& ÓUàšp¶VB â je‚¥ ¸äXvf,°Ú(ÎY”€¶y‰úlmÅѲ~i^‘ ˆx8Pä~@îØ„„&˜Šœ>C囄e·€°FÏ¡§Ç虇µå¬¥7o5UgŠ<½Ê<è€m¢÷–ä\U#C€¤3¾PÙÓÍPVDÅî´\‹Î@¥»ÚÁ¼þЬ 'gÊq̵ì„Ek)š–­Ð¼F/;( BP!xGBÛzÚ6l›ôl5ë¾VÈu&ÝêÐá?HP44ЊE{I º€Q|åŒÅ(N=„ ho˜´ÀÒr4$D2Çùóè°¿&ø a3pø¿ZÕö·®¢ÉÞXºJЊÒ*eë.%yíMMÚ ŸÞ¶/ÑÉ–ŒvÙ÷–‰äÕ=ǃêC®Ò}gP`ûÁÆ}½èíÇ ÿùOëýêi{6p÷Åq=?oœ«¾¨j {'k¼sBË´~' ü¯××âÂâ]3Ô”VðÅŸ¤†3‹¦)- §08DbØ8¤ú•2œ©¥ˆíƒEyí)Q_GŽ]ìÔ횬Gf #›îj¹%ãÌ A{ÚÓNº¨‡¼lªÏ—ɲ>æyů×H#ùêé3_¹3ŠÞrø~Ëwýï°zì-*Àg;6¤5ãÃþ$0œš!ô1­I¯e9]O¿˜Â¤ŽZMŽ@Šðª! -S“9¬ªžK¼|jo°§=UôàËË›®ÂÓé7zº{×9º;Ø7‡Î&ëÁ=pŠ;p4ÐÜ‘œ3ÊÃbm6 Î"„U@ÚRîc®9oT 1SdÀ6FÈËÈh3IUžè5`°WM»<ÿkš‚%]63 óþ‘…úÖ½)HÚFpï‰E X+뎖vÞÕPQÐHÞŽhFP$ û×ãÞ;Bî~è!<6eh; Ã=~§ÇˆëÀ¬6èÚÃÆA/Ð[ZMádq£Hf @ÿóOª_¦¢ùH ˆ=½^”ŒXzÞ[k[¡uÆ[6ƒf#˜îë^ùè8ðñ³€*Ü¿#¼{×átAX.qã‚©ÏCpïðÁÀÿëõ‚Á Þ7xïxçc6j‚¨sTнêâfå`!ûUÔV%(•b=)ÝÓ ª˜UBPû‡5NOðzF£g è™D­¼;ü©WØro]5à_Ó–ô,ð?^'N£r[Žuçç!&õ\'<õ2\–³Y’Õu¾OáÈu™ÑíªƒÖ«õ lWoBXØ¥ÐÉrþá£çš @kT¢H0dz^ ÚE¯¾sŽÇõíÛ KÊëÖlH”"JHW¬ÁUBü§ûòv¹f-o¤6؇{oUÎ¯í½ªGÏ<þÔ!Ë€±TK…ÖÞ‹:Aúh°lì0øÞ‡8ËT44¨óˆ6hJ@ƒSb$ƒÿbåI6›†‰…ØÝu¤ Nû2TŸøJ~hÉày;Žp®Žø$cù¹ö—cÒ cÏkD²!@`³ñK¦Y(t:"Ѥë@å5{"}1w¾>1‹Òþõs[ûm-8ùR§5©Û¡´Y•½Áî e½†Á ߪ®“.“Ï™ì?·í¯šÆÂšTÅ2Ý]íÏ q]*“õ‘Zzf¾smTdˆ ë@Î ÈËQøÿiØÿé8pÿŽñöÈ˼úüWwÝeʾ¶œ–zgõrRÔ€Ä_êcvyÿ[ €&ƒÿ»€ÿÑ6ä¾0Žø÷jÓåjäN¾Ý.{àO/Jèv|ã;æÝ9`ùnK{¤9öò^Ãpf€™k„`xhŽ¡WšÖÙ×Ü+íÂÅÔ®QÐb£K;š"¶Š¹fW´¸sdXµåàEuêÜTgO{º]e¯I£úEÂáü·§ç¢/þă­²?xÀ7þ×cÖ–Ÿh›g¦䮀·´Ô®q kÏpj†)€?‹N:Óûà: ˜œ#ÔÙÜO:{½A¡9tÀp* Š,É®%LÖ“aS 2÷šð°½ÀžöTÑmŸ~mÍæ©GZ8ù «o–`™BüÜRŠõÔ·ÂF ÐT>…ê&l&†9õú× É9Ô¾hš×k%àœ¾{/ fªÃ:§´Ã…· Ü9(Š Õ†làƒ­w,…Á+MSÀ¾£¢V²ËVœ$­`°Ñ1ƒŒÈ‘ ï|Цý!(„÷l4n6À·aø†cüà` ¡—è‰æÐÞÂÑ5eH «)ÿ¸ ¾µ1bŠâ-ÿÑú <÷ž®F!¬%:´Ç~ì½Ò:aÑkXm윃…ä¾v¸ÂÇéÚUËN8\š!LÛTrZ¥¼d‘ ,e…aðÄ~‚Eè‡÷Ž!Føýo½Ë'?ñ˜£Ã½‡Þ+‹hÀ"ß´ôÕ÷èbß‘ÁÖ3ñ’=…ÄJüX¢€ ý›tó]>¿p‡ñ`Áþó¯¬ýÞºNÐв¢ŠµR~¹©@TÛj}L>£Rä\n°MÞšÉk+pÅãÌ”B=3mWB{(u®ë•ÿVêùfafß›s,gk IDAT '¤çÏ›f(17Õ&ãÒi„¸h ÛŠ3†eöZû8Gx Ôw¢ ²÷ÿè¢ 9'¸¦š× Aö ÍÐÂÈó怟ÔoFmô¥Ï}þÛ@úá’~¶çðxºwÍQ X0äa ÙÂt-ÈÚÚ0œ8äPÑ3gaõ<ºr`1àtÓÀ¦EÓ,9$X4\ŽЄÑXÃÿKh3ü#DØzRž¨Ö+õW[Oj¬pll”öÀ´×åóø•AãÑ]ªûHéíåØ1h—<Îó* OÅÌ&*P? Ø)±,~.huþ¹L¬þ>oÝMxØî}õFs.‘Ö¤–ÇrûjâIE¶OeML|&µÏÔø¬î]ÅD`²x%$3+UOÿ“zê’UŸ¬ž¿>?\¿ªëuë1»ðñóÿâù?ÿç¼ÿçä™)ÿŸÖ媩óRû×},ª©Ùµ~cŒßs-3Õïv ø¯ ÆÞþÅ ÀÅ@ÿ•A@ÕoêëÚj‘Ò_Ez Ù6­¿[à¿üõóâ“ö´§t›SœünÏçÿ‘{ÜýBǰ ¸ÖÑ݆UÀ¯Õdgy³ï64÷¢þÖa韤È\@EA‘…X¦¿Þî£h£"Þµì\¼CݤnHºÞʃ–¸´ÜÓž^Ž.Ó“’ðyÞèTO@t¦œj½<ï:—¡‹êõÖÒƒ//wòîÅ;Ž'_[ãϬ9ýi`}êiêMO9¬xÓ}¶ 1_Òîä`8†K2f¥Ádq -ÙXÊuq˜,e —§‚¥TÁÖÕìãm©å—Ï;¯í*»ÚìiOÝf,üwßqø~Ëú#"´QHÜ<p û'!;éøU0@_aXóàôB°°P¸ÈÇ‚â:(ÅG}Ÿ'3Nõ•J(`Âåv¤ëZ‹³=,î…ÆÅq¸w(1äyÙ?xN³ArÑ–¼è/¬Šƒ¤¢YF;ÓÚ—AP“âA¡1e‚¸ Ú „û¸áÐŽõg·4åÏæœ)ºiÐ508˜Š¤¼†.zJìd€ÊHá«*àRÞØØ‘jm#ø»÷þí(J½F‚ ›úA‚•¬”''ÊÁB8Z ÎøßµÂ²3ÆÒµÐ¶ø—òª_å ¬O†`à~HÿjËäí? >À0ˆ)Iïøíßý$ŸûÜïáÕ3xåp Ëø!XZæF ‰QL'W…£)0B!ëå•Ê  ë3è>·ÀKƒhÀ5Üݽ·N¢ëýmƒÿ•*v4ëY!_«£kÖÞtsPT(rwŠ LöŠ«À‹\ž¢HæÏ2º[ª»½¬_«¿¯!û›¤‘aUdš‰ @~¿,Kïó•;7]…¥ÓoöœüÖ†f)¬?Ø< 40œ† •=¬¿ øV,bëÚøëpj²ùpfµÍÓùÅŸ=jÑ,Ftb`šéÑ®‰ã{Òë&Ù–b† Ý^‡™åžöt>×St²>7ÐÏ_—½¨øtÙó^ÕÀÑ—ÿÔ'vîûÄßwDjFLw>ß±þx –ÎDO¾7ÞÓ¯bz·Æ°)·T,’‰K¢M¯hOŽnbú’¹tÕs«ç9«êE¼ëxÙÞ`O{ªè³_¹{ÓU¸Qúýÿã„;_èX> ¬ ¬?ö,8úg¿2EïpèOíRb(ÿàWЦÐ*ƒ¢ƒ…M‘èÙ" fjðÉ,ªA}QŒ…>ŽÄ-9lŠ*–W%T¼r¤õã­/þJBñþ÷Q¿Þ8èkª6ÎU6ùo¤(ož‹*p?»µãw¢Š`–Ä€üÕGèâ!âÞ‡ö¡]s8@|€á º~‚ž p&°¢çBòhŽŠÍÚÅJý•>¹enSƒ¼å„rœTe¯‚2o‡-À¿÷o?Oòøßý?Ipþ_×bîÕÕß¼¤w\ïžž$åð]Í—¿×ÒþIújîRß+–™Ñ¹ß ° àWÀ~òôŸD¨wñøzþ{‘yÉ«H4×®‰þ¯ýëçÖoO{º =üòívîúÅÿèÛ¼÷w°üdËú‘gýȳxèðkÅo,tvÉ…ׇ*/vŒâze]¥jU_¥n XdÀ$;/š+e{Dû©Ýž®Ž.#$WZßç:¿uRþ¢tÛ§©#:Ïû?Ñ»?rÈÇ¿¼¢=ºûGŸn͘éS.G¨>X{ÂJß½ëkÅoB‰^½QBo`ØhþCIJÔCˆQ¬SôÓÁºð»Äó²Q@ÆBªu­Öa›ÖKvl_í ö´§H¾¼¼é*Ü(­¾=ð©?|È?ÐÑŸî~GÇý/-ð+eyæqþ~m©šÎ]üJ‘Fð+ÛgûŠ?3¡0l Lrz€¼’…•d!²ñ¶TOaœ•…U^V ukÆsý©‰s¶_3zð?QÒ=¸’&Íÿ7ƒœ°ì¢‘ÀŒØñÜÀwÿ5çO~É/rqM“†„Ø ºv„Ó€®-×lÃE¨Â°mÌól%°2o5 'á iÌÂÁ‰mÛS”{;štÅQ!¦´ j^Ò`¹ÿÈ^*{S¨qÐ,„ÖÙû<:z/4ÎÂâ{µ¼¿³”‹VXʦ7¥d×å~¢«4ÉŸH0t’ÁÿÃù§(ýÐT^ÿ¶/¥°ˆv2ວ¨lPiü!Ãf"üʯ~'ßÿ}_çwŽ-‡“ÂÊžŽ¬Í“IEÓîX_‚æüVY‘؃º€È>bñóÊÚêM¥Wø×¤Õ ÂÀ°¤ §R”§úóÀÿ¶R½\# ’Å`[µž•É ðŠÌsä ª¶þe¦R¾W WmÐË^ÐàúAœç¥Ëxy¾zš†.õÔ ’d02@ÁM`lÈi T5YÄŒïV˲üŠÇgÐIÿ¥ô×D%R@.±êþáo]W3½9Ô(Òúßnéd‰öøÇ-â4}*„µÐc€or”óÐC¼C:µõM `ÝA, €ocˆD‡ ¡ Ñ&TqÚ0´ë˜ʃ™Q.´¾2„Týͬ.ñê[Váåð, ÖȈ%ƒ`Õ>5®–ý´òvM¢cŠ@d2e1ùZW†OÉØ°rëÇ!ô'óM%¦ýÌ‹¶F'Çôºp°si‚úåç›azc_—NÒš¤kækŒßO ±nM.ö®óXTN·è&iBPß·ŽiR LÒy×2~LÇÜ/eéÉÒó¤>–÷JÕëhŒ°_J½âLj´íý_ñ÷üEÛ¿ú¿NPý“±àyù\«k7©ì¨ƒ’ÿØNS‰y~c¼)Y¦NýÐø@y_’‘™³ÕôNç=ú]^w1ì½ßU†äsÆ}í¼9Îu¦Ú)Cδížöô¢tðþí…;Ö{¾ü§ßãð3â”ᬵt®àÏ<ýiZ §þÔãŽ!n' 0Û(ڃ7,§wÄt{Y—«#OÙ©×ì¬n÷Ðl§®·ÚÑ!(íéŠé¼·>í)2³ï²×Ÿëms£×E#Ú~Ä›ÐyÞÿ‰–Dá£_Xqô¹–ÍãÀú#‹0œYTêЪ +ÅŸÜ"áY‘Z}1t²4q;áT•€z5gÖ¸ÜÅËj>¶Å·`Ükn€?ÝÞqO{šÐúݢ_ÿ™'´w„°QÖyÖ=ÍÒ¬¿ý™1Rcš&ºF²å”ÏT¶”–JEÚÈ(£•hS8•´]3Ñ©åèT„m&ºðv’BôŒ’·¯siRoǤùÿKQy›‘t ˆp ¢cê€yc^ÌAiе™"ëSX>!¸{¨[ :ôÂ):(øõ¼MTÂÆ„eHTØ–gѨø0Å‘0Sª4ü÷*lb*„.†ƒ+wQ!”•lûˆ¯%‰˜@ZwÀ²ƒÃ¥©• kÌøÅ‘Âþ›ÁGІ1¾æÕ¼k>„ Ö7U‰€¿yö§pÿ)ÄeY<þSJE¥Q 48Bq-àiOQ½‹ªCÄók_ý<_úžßåÁ;Ǩ®k=üHË)“ ¶æ°W"‚:Á’[)ŠÏÑßóKWÒVoý©/ÿY^—ùÚ4DÿH:ñ .ë3 õ\Æèùú„ßMÅã?ªµ/Öb âryù½ÞÊ“å¥Çéþ)/í9í÷j{˜ÍUÓ 0”å}[§L½údëˆç®R=Ž&£¹üWG ÉÖ4A•žeÆp£zÓÛÿ¦€‘N×g€ŸüM_züš|©7KßþëÝßß²øÒ†áqÀ?vÐ)Ú*aåÐA`©„dXÙªyõ¯r4XlÔ>.Û€x‡6Š,gcCãqÚà(ç[‚*†8þiL+cr›SìÚÄB€&ÑQFVöHÕêOãÆo}ë3~ ‚Vevj³")‘+$z¸V'äÛêèšRóÀ,_êò·£¢8qì4p¯4ŒV®[õìü˜Æ®_'æ6†ì¯‡ J¯_’¤ž=§]4:‹ãeÌÑØ‡2D™£ØËÖh°–ª¨v»«P&m5‰ËvII–ö%YÆ 05hœÂ>I>']cÔ¯…JoÕü½V2G%{蟀ÿPŒH†/Àÿ'u©×¶e´%¹¸”ï/v[’­íúý¹H²F1¿sqntNî»5ðŸËj#€É>¶Áÿº’—ã\uz \¶}'þܯüË—ªÓžötºÍÑ]Ÿ}uÍ³ßØ€Ø<ÿ‰·ðÿG%škö†Ýø ö—È”õª%]nè`ú]*Àä ;ñˆ¥ÖírÎrO{š§çé!õH=ía2sÜeï9?€íé¥é2Þÿ‰îÏ’ßùŸŸñ©?tD³†SãKí£êñgžæÀÅ%‘—üY@ ËÒ „!_ë5§ ÐQÄ“ o‹Ú†úâ?õàÒǾßò=ÿ̾ù¿Ÿðîp÷;;Ößö¸…ÐÝs g é²üd31j*?õJX»âퟱ­jY¥8Ùr^­ 2o¬  rd€‘M¦ÖuóѽÀžöé²–Fo#ünÏøÇîqçó`ùŽãîwt4fIåÏó•;7]…¥§_]sòæÈ±þp`õÑ€[:6Oá÷§ ¦ ΂ †}Ê •rAQjâ2úÊÈBjjMš™cõËeõrº¾§”'ý€ýÒJÓ¾3¨¡­XXäŽÇÝo£#TZØ è³SÔÅp°ØHô(Ý8êñ4«gh«–KlºnÐÞ¡^° ôo Ýu%pã4®« hœÐ,Áo”Ó)*ºŽ-w¼*1÷lŒ]Rî;ÙëLIYªh¶I†Aa`ÑÆ÷÷§ó®‚ð‚)ð4ý Ô×`@|PÉ  øq=$¯$ n@ăóÑE‘fʯžÖÑtkÄ ¸öú»ô«{hx‡¾?@Õáš®[áÚ!~ÿä€ô§ÿÊ•<ÿ›Nÿâü™Ñöö÷>Ý–’ 5îÎóÈ`¬,½Šþ6Ê{K”DEy`Þƒ:åÚ UÙøÏÇeú4ÊÀ… Såe¦$Õp1˜O{ÛÀ!š¢wTà…¦ù‘VmœªQ”Ü¥ZÕüýñ›AúÍ#è{Ü»Mß!G8\#›ŽþÃŽ‚Éa[3Øl@6‚ö3:˜ÄôKâ$¸¸lpi‰£Ñ‡yü‹:œ4ŽŽÅ¸ï&¯ûòQGþë'ªàò4~£ \@ºTõô[kã^*yg†r“l ¶?§¯ªŒÒþŒn¥¼Ðê9ãÚÔ7>r…låâý4¶MåE;lËÓÜ4#;‡dº9Ï ¶<ºóeÄݶ/˜y}éOa›ÁŒÓ* £,ع©_]h@yspñ®Æ˜åÍ2Ý7þç¨Ù«¼ªoJ\ep7îo¶Nß=?Çyqy¥î«:o0gpÅüÿEªqz3‚’ø×óG_Qêolóå=o~gáû«ñÝUÑDÜèºóÀ¿ŒúHîáUTÛ¼ áåÒ•Õÿä—þô•ÔgO{šÒmvîÎßûSY¾Ûà:¡9ÂÒ˜.Ö÷ö®³Ô­àº‚…s´W@03ým^O¡±k]nж׫ï^aœ N·a›—¿Æ"Ïž®.zë»öŸwÞ\Ïš;þÒ³õ=½}ñ'/ïý_Ó½ï\ðí¿}Êýï^p÷ GŸm ½rï»:t°tÕÚ+~Pt£¹ÌRš§Ôlàë´ÕUd€Ô¬ÙaUçS L—‰ÇíJs]oÃ6ÜÅŸƒö{ÚððË·W@øðçÎx÷‡Ø|äYìçp øÁÑ,!ÄðPºÂ\ âÅgÚƒï!ôàZS H¼S$z‹*™éÍ$æ7aŠ5CÌÑc©öÅõ¼¬™â®õóÊn˜®Âóÿ"ºROaü}ˆQÒèî`@t¸÷¿w¾ˆp€öOàñ×á›ß„!X4€A-¬ÙXxs¼#4QÔÒJô¦&˜‚C[‹ âŠ6V °éaí¡i”E+t­ãÞ¡Zøÿ^éÜ=ú`*‹åBpY§¬ùZÖ~W×|{º:{\'ÀQqU_HÔZ!ÿ2ÐÂWÉÞý!8üàÊzp C óŸÁþàr€à%§ð¡ä–°À5\»Â¹ž:Äõ¨;Á{¥ášîÜ]¿C¿9¤íִ݆~s`uôÁwüCÿáϼôs¿ ô/üÀŸ¡|Ûåñ,U ÎÆŒ<Ã$ª;µÒx¤wÿ^©!Àd Üÿkà¿2þµ×­d/××ñÏmѤ¯³¿c€ü/D%¸]‘Cbæt³©&`s~ü “ûÖMŽò¬lïŸj¦®•Æ`–TÅ2Ý]í¯¡œ\*“õZÑ6¹Ï«¢:üsm¬ä\ïϺߎŽc»_n?åžeÖ ²÷þàÑÿÝUÜBÙ,Nðw¨„EOÀÁ}5C¹§ ¼§èZ`åÐjF3®ÔÀ¦±”N‡ôÎÖ½3£€!¦ðŽ&´qÝR4¡ÃiÃZÍ  þÙD!~¿q\‡±÷wAz-†¦'pÆ5SzüÌ_s[¹q-ªŠ½gw›¼‚]afYÞ¹[oŽÆÐOšò|:{"Y0”o1°±'ûòüߤ É5}W×Oý:]æÏÐÿøWV ÌB@`[Ö†f(PµG±²·ÖÍî=ð |Þ(Fw‰ÿWírÿ§4c˜a× ¿¿6(÷<óMXÄrýùÙyý vë€rÎßúsÀ?\ý¯üoéºéŒ¾ý½¿þJÚq yÚçô®¿ÿïþ§?ÕcxšÄk?Ú| 9¶wØâ èW!®¹œk:Z`F«ë³ß‰oˆö@w’žw¤\u¼¹í„ùºBòªã^߇÷g„Žßéž+ü¿§G?ŒóÝÃð4âäË ¬>1ž%„B\% ÏÂ/’BõÈ‘P‚Gá‹¡ ß¢5ÚɆÅpj$¤A"`‹á@½ÌŸ9Aœ`#3ŒòÆQW¤0ᣯŠ:ö;DÔ§ÿp…G_?ÂÑ‚X~’XЦuBŠ Ë“ ÞþŒÅ£Cþ÷'@Ç„¸ÒXt$Ê ƒޤÖRŽêRÊUYÖXGÙä² ¥²-B@Ë<›u`º]­S¦{ËÔ×þß$ÙG¥$Hh,¹B?‚Žôðèþ×GàÅbêó§Àê)ÐИè_wb4‚ŒÖ€l\Dаÿ!š€ƒSB„ÜB€ãDb„ ªÙ³µ(ñîNAøô<ár#‘VÆÅšñÖiÀr,zÊi H~ÂÿÏê…_Þ€Û€©Á¢Rt„þoïãeR9ðÏ P$&DòÀ¯BúÇ€qìKèÿhžþ²-á’” ,MþÀ8.@±Ã"D„0`ÄñßÃ" ˆã1Æõ â¸D „õúb\ºnįþÎß{ÁýìÒ¯¿ÿÛ`6ßre !‘ûF,@²ÁRªf92ƒ °ã½³*ùÇÞœoæÎs®xú èoÞ þkП+e{ÕI-ÑÛ®á÷É—íæY”à¢ÙÖgÈB –¸»XZ þû¼Î¾¹þ¨fñZˆfV øÓôM>^4… È£À!3ÇÛ!WG±¹9¹æ_¤2NQÏrÛ(ãÐq©Î ¥²ž¯ØÞß×ÞÿüãÿåO°x/" GxèFÄKŸ‰DöJ+úZ0xðšžô_'ð:€Þbð0J ¦€!€ÆXŽb0p‘6à±"c !õ±‡(†A)€I$¨Ô)( Ø‹b å˜ £ìKå^Ë»Ÿ™Ñ¶^©7©æ[°zö ³È‘°—ÌÞÍ<Îm Ãs.š.‰sÚ’ Vƒr=7•í:ä|»¿”½^šrŽPöΨn^Í à û{ÞÎ{]Æ9¢ç³Œ•–LŒ”u5èF¹!v¹2Èz~ ¤×Ù5Þæ:ËCþ®¿&àòæmÔe˜)«†]c´“sã¦çÛw}c€»Áÿý{²›¸êªwTæ0€è.ý¿(Ël™â¨§öþ¯×‚žòñ¨?7&H[íÀþl âŸàkúÛ–èÛpýôúèá7Žn» ·J÷¾²À;áG:œÿh#ºÚ„q/ÔÆóˆñ"¡; ªÃMâ!ëócWá±U¯;ŠAA6pF¢Ãå©“—χ} }®1åÛÈt§èª'=7:®Sߦ¦ÌÏžæ„üu„éU“ƒ5ô¢ÞÿFŸÿgNðÝßþáˆpï+ <ù׈— ËÏuÏâ%#Q6€¢€€:R~Çò9 ÑªÕžÇïò!üßþt08ÐÞÓñ;Ý^‡ˆºøñˆÐºã€áéˆáiÄÑç:aˆÉÂAA˜á`ÒH ŒçÂõ(ÒŠ³1$VS#À4· rž•l ?äð)˜Ÿ Î1×;ÌX÷†X†È%κÎì‰Ð%àˆ€“‡ þKÝÛ-!õ_Žïûg  `ERÅk(h€†ƒ©ÎŠ` ¿ý8{D(T¡$^¹}ô   >~–ðÑÓ„ÏÇ€G÷NNT¿·µ ­>%ÆZÇd‹U9s{s»›ø_öZwÉ@`î™Õ0ß´Ç¿óŸbÐõøï0j$€qìÔÃ?dàß $=D)"RûûÅ( Ç°DŠºÅ !lÇ{àáýò'Œqs fB× H±…tðöwôëïÿ…gü†•LÆx«L¦jQ)38 †»­ªfJ^}­ íÆŒŒ'«®¥»¼? T׬4¼ÿ鋵ý3DüÞBúèC¿Fzħè˜ÎÒY%ð*€Ïe=­°À2ÉœðÿË’ÆDñô—_‡z Bê䇄÷’@ã} ‚ êQÞY.¼.?þ¼]ôqLÖcH9ñóNެOWÀ4³pwM5 ÛyVQ‡ëz¡õZ}È…9Ú‰Ø`0s@×7»ØÔm ÿsm˜¡ÜoŽ3U'é¦^8¹L€¤19”ò¹¶]xDe* 5c€Ú¸*h¿&•çTÕkÏɼ»³qF•jü€Ý=¸»ÞÚ)Ô”W[Acê:~“!ßî› ×öÓ›Èó‘äæ4Rç¦4ºüÿÅÈFU}ÑHMÎÜ.ÕMr—ºó3$á‰9*@Ðm¨Ù9äÞ!üÛ<Áê÷Q p»ß©Fßþƒ¿vÛM8ОÑÉ—öæ¸øñ€÷~éî}uá<áôÝ>ƒüq“× ;î°x@ˆkxCùR³0_Ë8!‡þ/º]@–õ»ü7°Œ¢ãµ)Zóõ²]?Ð>Ó®‘07r¶‘! Û>ú·Õ¥“¦+iî˜=o/ée¼ÿN¾Ôã«¿öo…'ÿÏ'ï.6 ëO"ºã€þD¼þyÂR>¸:$ìXÜ“DCaH lû4¢ÀfØÇÓüâˆòdï _Û_Éx )í3øùÁˆÿ· |áÏž`|1œ%„>`<O~tKÐ5@½‚_Ðp(½P§¡P"K^© a®l–S©,)‡ŽÒÉf(ßÑÞëŸÚIb³À)ÝM͉î7€Þ4Ïÿ¢Éï%0r"B:Fèž„wA”ЇD‘TùÁ{ßyN ¨Ô”\SZ™€6%¢‚WQóËv ü#0DÆùš±Ú0Öc‹•„À½BxxŸ°èŽÄëX¬c_T<Ë^®ðâäÏÛÝÏ}Î ^ÿª;œkßÐ9¸9åWR€‚¬ç öסüó¶3Õ@ V ¿ÿÌ„˜JxYfB0ãš$YË ôË3pê‘Æc€(ŒÝFR¬,ÎÑ¥•Nc~åßþonäž? ôëïÿ6²Ê¹òDв—‹<±íY*üÈ+‰[w ­à÷D÷•Úž/@i+ûûšxÔ%ò?ÕáÿÛ°ÿ•€­—~È€J^Lû§R~º¥ •O“0á& F¤¬Ê–oª(d0F”SÚ¾„Ü‘Ù@À…é†@5%, ®ŠaU¸Ú«DÐ4Ð>jö+l̃NÀ¹È~ •ãd'·™0é9°¨mÚó…€öáŸm”83’ügÇÎŽ]7ÁóÆ-puNÀž-à½ÿtg{÷‚mÀº·u^¶hÁG é(Ç’†‰7ÞÝ@’–iÀKøœŽ%å’ö’*z‘X½#"(uà”À)"qDà)uèx£Gò¡ÿƒzü«+m»U@,0³ó´—{zû»ÁÀo_e•—·~¤xoß LæWÎö‹ f$eû¡æV!)oB1Œ*üÑŽ7#€77­ ˜•OÑdm(”§I?È[Ÿ@ÂH¤‚ñŠåÒÀ>çR¹¬}Ê„@Ð+È5İÀ>/j#ÖÈÚ2X¹Œ¿ÒžyvÚW¥Ÿ*¸¶ÿs$+o¼àø½zû‹ˆ˜« üWFÌYN¾LJ£»Æÿ_Žš·–o ›n,TÌ ®Lî{Èÿ0 ßÀÿà Ê3.Þþ(Ïܶü\Á›|µ[þûïþÆ­^ÿ@ûKïíqøÿó HQt¹ãEÄæi>`›g!ã%#®¨×ÙIBa_& “-ó»ì¸µc9K@@#=$rìè :ä-¹¯s:W÷sv5½®iÌîízòs£¥Âí1í9Íì÷“Ò¹õ9z»Bö3B/ëýŸ‰›úŸ=Áp–pùAÂÉ—{€á,¡_ô€x©Þ­Ú_##‰†²!qÜOÏþxƒ{?½À“´ÆâAÀpž0ž% †gHu$9RVb• ‰’6¬ùOX-A¹XVáR¸„÷Ÿa’@³¾‡ôÆÿp³¡‘`Igø¦,îåã qDØ|„”~NÇ :¥3Äá‡þH@ìD‰L(ôà PQLÁ°@@ZBn@5#50Iø!ŸÎÏ­ÿ¹«Ÿ(‰¬ÇÄËÚä Tf’1É¥ƒ‘žÉnVƒ}†™×Õ}w_5#”ü¹3àŽ33fÝ7aüS"¡‰Q©Ø0äåӘnj¬¼hJ#ßß·Íÿo†æŒæöéü„Úc€"K³ØÈŒCÕàDÁÿ@¤ÞÿK ˆA€ÔT**OùÙÜ%àÿ@ºmzôýuðúñïãË¿t‹·;t'„£Ïixÿ cù¹q“ЬÝÐmxç„î­ÓºF=ŽoýR£Ã*íT/œu»€°½ÅS˜~³Õ›9ÒNÅ?ç¶ôY¡m_§W=eÞ²ô˜Ýz«1hF⤌\ÙU‚ô ho€nÂûßè;ëCœþÔoýÜ8'_è@Ë€á,¢?&t§ÒÀèNx0¬Š4r #™q;S‰fb©Nrz®°-1râÚ×±]æËÝÔxë:0½~¹k}  ´÷´ÏÄñ<áí¯aù(`ýiÄð4bq0®ã¥Z‚®Æ•€ý`TËа ]gt ®ãŠÑÁåÒR›’?Ê BÀTù¢¸a˜»˜&êr)Àõæ®OÌ¡¡(tL+D=D²,¢XÃúcàâ÷ÁÇŸ‚q^?=ù>Òù9x``áýƒºN"ˆ–I.‰¢Ê+ä kÊ¡’™ÑSQP-—„ϽÕáä8 %ñø_v„.„/ô#„( Ô@.×*J +on¨[wïß¹s{ž{˜»ºvÞmW·Íçïï®ë¦2ðÏTüœZÀŸ²·þ£`ÇÐÄë?±ÿªHeOˆwªPd,ŽÎÑ-?EˆŽ n_ü›ÿómwÓ$ïñŸT€/3Uè 8`=k«ýV¦¬nÍìG§JùªÊÛ\^½·‹ØyòQ)Ò[žÒ†æ×B»Ë üûð¹iþð߀ÿœœb½ÿ5„ÂÍ‹~ ®2§´i,Ù”×+£½dÙ¡}d€ŽØO¨èAô a`H‰ &ÆÙ<:­_óunl‚ЀÿÞhÄm“—k6ŽPÆLíZÿ6v eJ…Æ«xN1á7šËJöú1žj#‹Ë»á•Ç"ç½ð“¹úmõc´Þ¦oýdÚ®=#~¼&Ð ƒÖ=0ŠÑ ¢txX„GZêôz¯:`@›HÂþw,À½°‰µ¦ñ9ñìwÞ?u@Ô4©CH MÐ’ÄU$–_bF@愎{cÁ…ï9$Vø£\6£‚MÂçì-(ïÀÕF`¨×:”‘³¾µ:è ôÏœ©¤: ÚÚä1þÏ|ê IkR¼òç&z¤Ñ\Ê<ùεÏA<Õ Fa¬½•˜Ôø¢È\>6d>¢MzÑEœƒ)jl&÷’Í osÛr»²gßyi;Ú¹5¹nrRʽUà¿•æ2=™ê§`sžr Îv½&©xísùî±6”Ñú¼)¼¬¹=þsÔxž0³=CÍ£Ïeò ù™ÂEÈô˜òŒëqâKrÝwäëàý Û¢‡ß8ÚÛç?ð¥oâøK†'Qõ¸òK#KäÖž7 iÍâäµfY߈~6*øŸ6,²kFZ©îv`$Õ#¼atG„$âSl=£Ì‹è-ÊxJtò=™.¡.ËÛsKlÙÞVv »B¼e}Û1såíD×¶Ssì¶QÓN[Áy• ݶÿyëÙ{º)ïÿõãˆ_ø·ÞÁé» çãy‡°$Œãe°†ó„á<¢? /Ç¢%/û"žâ%ƒ:Âx‘/h)ÑQâJp¯´†8Ç!GÍËâ ŽB¢{J4—ŧIÙ9ZoöS2è@JûIrBDˆ—¢pJ› @¼” `7 0!tFŠ:Æð¬(ÉÄ@ÃBE šWeÆ5J˜¨TÖ½•ÚI"f–o0½‰žÿ™÷?fQÏ,€°H %@G'@߯ÇÀÙ`dðj?@k€‡lD¨×%H€ŽE¡’¦Péå¦ðFͤ™I=­O÷ŽIRDùOŽÃȈ ôÄ|ô$ábÍè;àdI8Z:– àh!yÒ^–vþ[w5`ÿöã^ AÛª˜»WžQzm1 ˜>·ïMPp>FñÞO) 9Cú=èoë1•ðÿöûtæíÏPàŸ!K‚þpPE9¼@àSü¥¿ñÜvÝ9ú׿þ·‘Ák.€¸)Á«P³¦&®@oU'{à`ëËC:Ä‹’¾xþ‹¢Öçd׌!ˆ®`tVúcÖÀÈ+Ñ[À߇û—_„yüOCÿ§ißp鬼·õ¶W¼ää¡ ÖéÙš"Av(ðBâID9ÝJÀ%d8i/²Ëjo ÄXƇ66/Qï5[Ìf@ÿWb° üo·‹R߀®WNe\¸öÈÈ,!³Ë#6ž6îê7ºP~«àF+Ê(ãÎ[nrsž;<¿¯±_ÔûèkOfîw¿ˆpŠÅWÖòj}|„ôQ@êwH¸‹¢Ü½$ðe'@vøB'8(`ÁÀäGÈîÔ©q’ŽÏe£ÎHH}‰¸ÀHk5 @)‰4ibÊZ_@õ=ø¤#3LÆÃn¾ý\½†ë~úަ&¼¾Þq°ò<¨¤àÌeØlrdvae`ï ¾×àšw¨ÚácÛÈõ Y÷è³Ë†M~¹‡Êm/¬£È5‰ed$=Ç$@áõŒ®ÆD‘ù¹ 9;‰Á PRS5@cù(fVHÜ Æ Šv÷ÆpÀEÓ[ ©ê½¼^:ã° øÛ9Þ ¬º˜ñkΞý¦/cËúÏÌìPõ苦4Êo!'€òÖ­ðÿ›¥†'T  æ8 Ïiþ¨VžÙü&›}À"ÀŽÓ3Ếdàÿ@zôÍýuîzö7ÎG, Ï6O#†g Ý10žIJ€î„›‡ÿÈê ËלuµÍ•¨¦qkF`€§„® ÀQ¥'1:¸S®ž ©d,ZÙ¾IÐ|'¢gÓ@rÛ°:€yvÿ*EÀn’®ó¤¶ÃÍ>š)›«‡gÊ<Íj9a“ðÝeWÕs t“Þÿÿï†ËˆÅ=qlÝ<‰X< ?® ¸Ÿ.aÃ/†ó„þ8`TC¨$ ®xïb ’Æ: «\âà$À¤MÑÔ+¿#F•¥K3ñÂÆ±57|/Ó®‘|Õ¶Ò~"Ÿ:Ò>OŸüῳB8Â2`óq3#,I,A eá¡Ì‹?ôš ƒú2QL2alÂÿó¨Œ,qÅÐÐwn2wMö&ÓþçÙ4†.ç«@mso µÊdÚ†l³(!§ÇÐ?ŒŒ˜äã¥øc”²>cÔ{ê Ï.>z’p¶’ÿï~. ï1]GÛ.u½®Û2žg‹¯û'ú°+uwiÛ48ïn”îÕÔxÞ(`—nôUì2°ð$^ù3aŒrx~óðOÃÐgp_~]üÀïÁæâ[ýþ”„xLRÐ2©R–ÿÊßþOo¶C>#ô_ÿ÷=Ç2È¿øŸ‚Ýœëðªê¢T®9Í+eí6iH]Ê 5ŠùYCï®\§êÕ=°ZçÕu_îþLqÎ`úß§p`¿­·}dÊx¥Ü¥¤Q¶Ïö£ÝÓÄÑ@›mŸÐUeÅSN±4þÀ¯€CzE.ÊsàÈw*ä# ¬m`åcTÂå ˆQ€´R×λÞBs|°{|$šŽ­xàŸêñçA½ç¤FòYÂüxÖs3C¥¦ ]¯Ö²‚õ86 `.`·Ñô™4Ç~zg½³Ž½ u‡ð(¢ÿBD<»-ýIBº à>¡;ÖЮBÚ0°!„ ×$`ÿF–ÃýŸY ç2 m‹·ÆKáqaräZxLH‘±!XÖ¨˜–ߎ%ʼnOçÄŠ¨Sà6Ô?ïXÇŽå+¦ƒÀöšöy‚ø¿ÿ?Æ{¿rÃÓ„á,¡?!Ä#n¨“°& ‘Áÿ:t¿19®Â—´VK¼©íñdï3þ«²G”À–ôàèÞWúŸâ=J`>C §àðÇ@< ‡ B(OÚ6Ïrt…ÒÃÀ3"‰r‹ž@‰£ÿÇKÂéaµaœ¯Ëž°ìE¹ÕÂ;îoOÏ% ÀÛ§]º¨èP)wuÛ̘Ÿ} fr¼¶ ¶îœwÎÔUƒþ^Uޝ 2wiªŒ;¦ª»V‰ \ùh'ÇoÝ¿cŸyû3 Ðc@bóú§*Ô¿„òÇCùÇX€ÿä ’†GnCý—WÆ{0»eaž~õwþÞõ:aè¯}ãÛYq½دÖg€n—{î\ÝyvE[¼b\¶‹bÜŒˆB./¡þ²¤”Á’ü!Ô¡í¿)ÎáïÍÝcסþsè½w·ßTðu¨m×<}_ý–ÿb.e(Öó3@¬Ù IDATУ‘68>J0›/9.! h¦.ãEæe›¯¬<žYÁ/*E,åHfX¡í›3È/«ç€Os‚vêÕà 'Ž#©§þKÛ½'Fœ2hcciú=ïA1¦ÐÖr^^/tžó•·í¿|}ªw.ïå<2«ó¹®Ø/ê.ÿàýÿWÝŸY"­€áOH;„G#ø, ]t ã $‘˜FFD?MÑ@‘€bÐÿâ½t=p'!þѸCLj{‚¬[š@Ž 7ÌûÛ¼¯5 Y$ü©¯âƒ¢1ÈÛ¾¼¹zŃ ¿ÖœYŽù9®¾£dç«” ªd(k\õ¥5),©®aS9fŸ!)Ïõª}V·72m<£-œ=`¼ÔUâ¶Ï?Èœs¬ÿý#1h;&†;xRÕk4S*†m¹ïÌpÂöÛ¶Ž“ªõª©È4"c²9O‘5>’Q¾ª§Ò ùãÒž­)JÏŠF>7LJô{=üÿUÑDôæY€6Ïd‡ö߉Òül-i¢ßÌ æ›ø.þÀþéи[v WJ_þåû·Ý„[¡‹x÷ïáä½›§‹GŒã£óˆž ÝI‡x!ÑtŽßê× X,>×I8ìUÂÉÛ½¦e,;1=°x›$-À¤#Àß‘F B° Ѿ¥ vtNõ®Ž9±P¿ÁÛÖô&ÑužÜuŸúܾmÇÐŽýÔãé*™ñ²ûà½âÕçßßàÑ7qï§.–o§’’ä<¡;é$Mqã´aÐ2€†JúÍ(ãâŒsQ/§ˆ øÏѺÅÂÅȉ˒Úõ¾'ßz3»øßÜösÒÁà@{Mû:A|ò‡küü¿ùô÷äƒsýÉ ô„qň+Éí$ÖOIÂD`Ðhy;ÉdP÷Éq21L‰]Š…”c–iÊ$·N )3ÄÌö@o<ø *oKxîDPÒQ?x:ù Bx@$¥SPŒž!¥K€óˆÂŒ"å…›ª •€ž‹D¸`Æ0‹ØDƇOÎWŒ/= ˜yxðÖ á£§ Ã(ƹ©Uý»¯¿  žÏþî ¬™-Ÿì»I¢é*Û¦©å¨Ú7g°Ë R(_³ñÏ{Y?̵w¿þÜOü—0ÿ)Itïýßzú'&p ªøWãFV–B¯=×~ð—¿ý?ç}6é¯óßçUÌy;õº­¬ wŸËbÙ”ÏY } „ð@.<`c~þÞ ¥¦3FNƽ§|.wŠp.JtôÃKÐC”HYÅ>þO !¶õ‹{÷›2òå\ÀuŸ?ÛŒìöäÌ¢ m6€”Ãá‚-Í‚^GÁ«3ƒd$Aɾªœ\1Ã0΋€ÔëóÞû'÷ÿJ¢ö ¾èvÆÇ¨€/yœ˜×¿ÊDbÒØs…ÉhŸ³ø¬ž“ÊX®œ$&tç9oϼ¼fh .炞Qæùq]›ßxyP 2ÿa<Ù?32é[?Ùr¿ûCüáè ºw,ºEBZ%Ð’Áox¤ ɶzÿó†À›îG 8B FõÞB â0Ê{™Ô €R@äJb@I4À”À%@^2•HP¶žßWÝöï]*¥ì©—UÉMEhç¤l ;²#;rŒeà›1—¥0áß<¾}€l`s—ÒšL¦ê”÷GgQÀÂË« &C , Œõ ‡r¥yÁ®2w[<½v¾^9US̈|”0Æ–  ¾9Î@,9{\æ¹ùYmë5WF~/eyX At¿3:œÜ¦Fæ¨g¤ýÉ:LÚRØ_"\?¥‘°Ò&ë‚”J_¼þÿêÈ÷ã¬iÜ5ë.ËO!3ÎÏ G§#ô¸—áe¯Žîø?7 îfÇè•ÐÃoÝvn>ýÞœñ"ax’°ù$¡¿lž$lž&ôkôÇ‹„diÆ8¤¬ÇÇŽÅ–GÑ.SöˆåȚ˚‹G¬9ƒ¹1DcdCïš‹ÖëFùóÉøÿ6Fû:Ùÿ^†®ó¤¶ vvKj¶·ÕßÛ笧må~ÿnˆ~ö_{ûÆRqŸÿ`Àò­ ÿÔÝiÀê£݉|q O%í]XÊcŒR½ð7êʧH· áqjV¾g|0q‰n¨Öå×­s½ÞÎm_ç´ö`p ½¥÷~ùÞm7áÖhõñˆÅ½€“Ÿê±þ8¢;†9œEA׆³ˆþ$‰WŒp¤¦ª<€pÉ ”$­'(0R`Ý@°0)@=û#H¯?q 2¯…aêzæW‰ÿÝ ÀqŸÒE3XwIqiQ<ê2ÐØåì“û- @iTóü§ìõOð‡ÛVìßÀí<Ÿ¨y „RUvó ™‹jÐoÛñ9‰ý‘•ÃðQßb]*”ï<ÿ¡À4¹?9Tϸå´&5)†n¶.«¬ÏÂO*L³Ô`²G(•tžG:™XæšeþٶП›¯ÉYªêÒÇt°Äœ6ßLhž$,Ò<Ë1å·~²‹f~›ï·¬ÔýÖî£ê~<øï _ü˜2ùæÇg"½#°llÖö—¶¼HJ£biMk#ÿUóÿ×B×®ö^Ú– 'Å<Èd/ܳÍdëN‚ÿ¿óÝ߸îã6é®·ï@7LûœÞõ{ßþïý ÷±x/’¦b%P tKåëê¬D=–‡8‹{¤ÆÅÙ ƒ~k,Hœº …ñ1:1åA¹| Že{`©’qù5ŸúÓåÞtºêIÎ=ñöL{Ü\ým¹›ÿðGßÖšö:ÓšHˆywö$²I9v¢IuõÛk²^ÛÉz¯? J蘦iìFƒ7ຕ]ÃŸë® 1 œ PŠÔ…3@n%Õ–ífÀ·¹J½Nímpî'‡lÞKœ/ÀfH“ç ÓëÌö›ŽŽßW‘Œ¶¦4Òv'ß\›_yYÐ>ùªƒòê‹ñÿWOsVî Ý‡W÷ÅMùUçÞ)ðܹ–è@BûšÞuõá00œEl>Xš ‹Œñ<‚!mi“Æ‹²/x` ]oZ1¨Wýî*âGF"€š‰ÑäÅ6P`–ûÚPì÷Ž ÇKB$*3°˜DO×w@ߺP+"‰2×_6¨.˯AQðÌzù·ÿdÛ_Pïœ)ŸmܪªË*Ó-OÕ‹uI«¶yËL¼½ì”¶ÒæÒÅëU=p¤ìÉŸÍQ!Ž=ÆÑÀ}[RñúOú0»0ÿΨÀÂü·Ïøµà¿•®ý'à|d;öâé/ ¿xc€ø¯A®@pmAµÈ”•Ú²bÿ½`¬Ù”è’78²h ÄÈŠüêš¶LY1¾Ýûßm£Ü¯ïËÒÏ[Àÿ†±¹=WïG÷ž[g€#ïD‚Yøé‚òÖÀ¹ˆ*X r®z@ ¸$õ°ÓL„Çû[ÌàÙFn«^eÊ·±[;àedƦ ÁÿY¦5 ¥FÇ™J¯Èã»9³LoPúÉØõ­nåþyéÐù‚*óF7óíñ71Ù÷s@zÿþŸ?<ÂÇÿÓˆã>‚С»Ï@JHÏ:„Óî"Ò* ,ø”ež>¸à£"yÄÀ(^ým®@—b$@±Bê@©CÇ}û{^è ,K$›¤ßåÛ!óöc¤ÖÞ@\sÝfÞö¾Ý\çbþåŸìóÊUËM:¥+@*»÷°ä™7£¥ ï¢ò2ë×ÛHkþO@c;Žì)ÙvÃǪ¶êܯ²°ƒSæ¹Ó™fM¹Ã¥=Å0BûÁyù—K–Æ•v›—ù1Ú€þ|ž¼zþï8¥ïœ ÷¾ÿN¾îê7•Ã/–ÒȽ­n U˜ìmMê½ ÿ¿5jøkÿÌßu©ÿ:ò“ÀÛ%úè@wš~ãè¶›p+tùÁˆïþöGx÷O‘â†'›'ýý€ñ2!­áH´L·›—ƒ‡âÀ•¼X×Ù{ÐFqƒé„}ÈkF ~¹_?í²]?ЛD/òäühGA;ÞŸÐL·í¼ç˜»>åw~æèÅé&½ÿÏþh£¼ Ø<1<‹G$ë ÝžD g ý a8OˆkÿÓ¨ßdA Ÿ2ß[%å}È‘Òå…§b€Œ‘¡ÿ1Ãï ï;h/i_ÁÿO~ÿ'ïöøâ·NŽ>×I(†gš+ŠÃÓ ŽW q¥†FZKÊ@΋kËŸa”‹žo€X“hžȵœuTžn³‚Òkàªõ¹íme·DŸðß“Mµ,pd`£á—7#°úéÙSÐâXP.`ÅÀЉ’y„œK$èû‹Lßž“,„T¸N·ÇôA£,Òò¬Òyïfŵ£jsøŸõöwвm^þµÂ¯>/oO°eø_#Œþü™TïÞZM­¦Ývm&¥9Å´.©»Úf D.ý‘RÈ¡þcì ÀW/þqì0Ž¡òì) ¦¬†ÑÒ¨Ñð¿%Ì{o¿öwþî¶ÎÙ[º ô7šóÌg6Õhñô×8 üÀ?q,ÆæÚ ­(Êüª-ÍvÉé[Æ«[,ï¼)që?;Ã候‰Ô€Yž2Ĭ܇õ J¿ìôþ÷@¬ñ›k‚ÿsjêë“õ 7¸ÚŒ r¨j?u€ L9HÊò iß2+ò¨%•î Â-(ãy¬Ã¯ê ܪ7í?ù’\f`]=ÿåØT›°;}":¼ÿ©§dàÚ ³”¶æg m¼‰ÐÖ© Ð3@=]g<†¿xˆ&œþËOÑ¿7"]¨#,Þe¤5ÉvÏà Vô@º `¥ó1pÀ—¾ìr}é²:ŒA bY†Ø!¦ŠwR@H@ŒFÀ¡äI4¹(»UJ’,gQÆ£¤€”e==ÃÊ*Óí$gt“Ë›c›ëõëXÃu˜Û§ïažG*ë²Êì]¯xdÆ %VnÑAXÍȃ¨#šd|ÙÉ¥2w"×¾müen‚§bÈõ Ÿ‚3¸ º«Ë¸ùná„-¨]¿çµ‰“Ö:;Eõ<Öo“!ºlCù›a…]Åê±hY¦„®p\*sˆ€Òæùy÷ Øo–h¹~ßÕaÚ»ö±»ŠÍaT®æpuŒõÅ,µýæÞ§çIidçú7ÂÍ2fºäùeÁËÍG^í⟠Úþ–où@o0íkt×ñ"á¿ùyœ|¹Çp1<$ÜïØœE Oî˜0<‹ž1ú%axÆè=!^Ht×Å"¨Î@/Y0I¸ÿl €ØÀH‘Šw¬c£Æó•Ú0ÙÆY—Ët×é:Oiîÿä¹)£f(ìí±»Îñåíö¶ò¹}ztSÞÿ—Œøá†åÀ{_]`õáˆáiÄâ­ãeÄx!žýãeB¼dl$½ÉŠAAŒŸâZRš¤ð9&I“BN{Í ö§ÆÓ߃üÆçfù[;bo™ÚKzoOÃC=ûÿ6xëç–8ýÊ«F„cBXÈ` ÕßQöhÈŠ+f ç4ÑÂý¯Y˜h/Å´„þ_É„:€7b1Š€29l'ãN2Èm!‹O¶®Šµ@–x›Þ:u ~úüIúNR X°QojP®'ë`_aD«¹ å2LÀzdÄD8Z¨-œ~E :ƒá*à›·ÿüº-¨^o.êÏ”5å×"<•[«üÖšÒâiVå¼Ð¨¹FŽ¡»­=u³×RÞ$Š\fB´7~)ë“ãÐcK`‘¢†(NæåÏÈžÿ2©+Ï÷¯þ‡¿{UO×ÿ q~? À]ÙäOyY…ÿoÃþWE–MÔöy1£°öª^²v’ÛãO€Söþ7¥9À•ï?#ä÷ ¥$r˜R~5J¤èó÷é½×IY©´Üúÿž%yeà· ,$å:FÚœ/ é‚Ð%€/ ¸ ÀQFˆWÿ   €M€7AÂþ3I€ACÿŠ€þ£€ýˆ;P IÀJAR™$‹@K$œ é˜Iö¡•åÀ÷ˆ¹î’Tƒª¯\m7•rm=œlîl;Ý”7ÿ˯LBˆeN °Êãg¯;­ Û¸=Wÿεâ«ÅHl›Ä™ŸM6D°/&Q„b^Px˜Ý{%¯+lýXÏQÉú5X$ ÖÇeQàmüÖú e\¸!M3}#Ë"ü w×`QV2¸ôeÕFN 0G;û­–?W¥4‚ŒJíÙ.s¬279ЛAàÿ@o"í«ƒ×³²ÁxÁ¬~2b</ظ‘ô®¡'ÄuÒÔ­vY*Wû¡ç-ù±8õ9tIm9G /€G ³Ä@GTa³É6V¾©t»ù¨™.Ûõ]eztUÏoÛïŸìÜSvI„&¿–ì8;Ç—Ï­ûYy+˶³í˜mt‘WÐMzÿg_üÖ)NÞí±ù4‚„?·ÀúÓú8þbÍÓfàè jà´NX>ÔõKu aIêé/¼ N±‘*£¦ôç¥òôÏFîØj°+:ÊsEJyAþw08Ð^Ò>懺ü`ÄÙŸ 8ú|‡”€³?Þ€cñ `ðÈ”Š\]ßÔŽù:^ßê¯åÚ ¿JÈÀ¿÷£„üN)ˆÇ¿úÃÐ#Å€”: ûŸÄ ƒÿ)€Sã¦D°ÿ˜xýÿÕÿèï^ÙwûBÏê_M>Dx«¯þ‹ç þÏyÿ/zä+”÷êz³jÞ¶[];E'®ëæ=—ÿîOy)$1’KàÒй×Ã_”õë¢Ü#š>r÷›¿0J?×@Ác€ºÛŒ´Üy0Z€Ì_rk5È`‹ÌQü( ”…Ò&f$eB ŒK\€IDkÆåoÿZ"¥…ÍjP̬^OZFù`³ÿ­éD‘tòLU߯×N£moq9~¾¨)Wv°+5õn)1ùŒlÏìØuÕ*bB;ZìÇLÎJÿ `âü\«1š;‘5ú9ð2âó¨ï½Èòl#ý`ábVæ7ÆËÓ|w^£ßæbmKiD ¼]ÎÏ“½ØËƒ]Åÿ_?yˆ½šý4<ÐŒöU¿ûGÿå¼÷K÷/â*aý$aù `óLtºaIˆcóiDX+yÒš1®B/ž±›rzê ºÝ1 èo€X·\¾5ìµ½¹w…uèe誧8·¿¼å8 öø÷<¿ýž;¿E|ù\ÙÜr޶í;Ȣ礛òþ€O¿·Æâí @8",ï úSF·  £;!,&Œ+Æâ­q$%Ê’°ü6É:®5šuô)RÔjHH#i$cÁ¸˜¡Æ(†sØWëϙ9þø yåÁà@{GûšêñwW8~§Ã[ÿô«#–o,lžªòN‡q%!þûÓãEÂxÁèO ©£œ A KBXŠr°äGÑ0ð#I®(5ð–SÌÅ)#œ›TVPsßüoÀDò3 þ¢! ‹Á)¬aa× Ú<8‚/é"€Bd4¿qþCFܯ à'E•ªªœ#K#æëðy0ƒ»NcÑ•[ki+øàŸëã¹=Ï+bÝ9íuv]3Ÿ?׎نo'žéóv²*|Õ<Ón"”òªÙ@©ª\KöyjÅsÍÏ7VïÁ ôkxÿ”zÄÄb b"ñò;$Çcìų?{ü‹€„ú'5å'3<ü½ ÀßSš_ !Ö¾oŸ&à¿ÿ øÏIß3ˆ³SNçëV-ººÑþ5ÉŸ¨\¿˜T~%J´}å ¤¬mùg¨ä÷Õû pf÷»3wùžå¾€u=^Ýo»}sÔäm_Þ\=ç²¹\YX¼ ú,¤† é2,Í€B‹\ä1¢áœ‰¬O ½ªš_·­¡Ö‹³ö|e•7ò+øOΓ² ÿo€•ñÐéSÊÏÏ ‚ù¨W<ËWº‚ª>sxà–ö@òlû®‰ùÐûøøÿZˇßüOÿôôÝ{à·× gK`Óƒ—#hèågONÃ÷ ë’ t,aü:yþèУG €@=ˆ õÔ( £ áê; ƃðyMަ䶭Ԟ»ŽájÜߥ ËË®O~~«o ·Pà”¼¶²¤Ú pNcräu¤5)aòµ•n_ioá_ù\j+´·š*ö*½9•BsÔ\+5OuÆÞUÆ–³2/´§[=» ß>! ¥T"ù³‹êo’­å½ÆÛ3Â_3Mû 2ÖSƒƒü†”gÆþX•±à¥úë¾ ªWê”FÅ,̧9Ê_ ùg£ ×2é£çÿ·JÔn¶ã¿Ù79¥ôl©ðE8ÌËÓŒ÷ÿí4Dè.µå@w˜Þûå{·Ý„[¡ÿÞ¾ü+÷pÿg—Hë„Ów{}®ŒåBüb' ×À8ù|@ à‚„ð)†Þ_Bý—ÿ¢ße‰Øéôº%¥+O=`Ù-Sð«LóJš2Owÿï]õ$v=9[O3Çð–cÑìËŸÅ µQ€ZˆÒLY{ìÜrŽ2èé&½ÿÏ0`ñVÀÉ—:ÄKÆx&xÖx–°þxÄÅG,pb OÅx ¤¡¤¶®xâV‚_•pÿp!ÿY#œpb ºÁBwú]åù_ëù?—Åó¾Vm³m‰-ÛפƒÀöŽöÑ:tõÑ€ñ…?w €8yWòDÑ1áÞWI­ŸÒ&IhÿM2 Õ qh!@¿8î8­GǸsÒ1ȃÍa¥C•*뮦hsþøo•Êhï*}fÁ#›F%@:¤ÈÀGà»ÿ'>MÀ¦GêD1 üIÏ…(ˆqÍ™Ub`Œ@Œ À¢PKNÐéÜbHИ*G1­BfÖ¹3+YÛ„ëà+è¿#B€,šk5›Ì ž' @¾u¯»‰P€C”¹0êÈÁ•”t1E޼ª´&%•€»kÇëú×éžÙòíÛõOÏ”Nxç¹4ùõêLíIDkª{±þ¯Œ´¸D# ®{´>fâ-¤¿D‘þ´y²¿{vmBáûÍ<&óÿlügW–}µó öÛ5ReC 3ßO:W!Ñ$•"ø¥ùÿ뢙¯ÅcÞÉy8ÈŸÊòŽÓm´ðu?Ò}Fhõ»¿³BÞzÿñ\Òp½Ó!nh)s§@,†ž½`Y–h9-J9õ@Z§ìýÊêýjßšö½ÁÄà2AžD¤Pô¼zû¥ò)eþd[kÙ)'8p†Û¤]½Ï[ŽñåŒéÓåæœÔ,}=~êF˜—MÛöS³l×çê8Ð ÓMzÿ¯>× §ï-A `ùÁƒÎ»#––¶ZRw€KM1ÇÈŽ¨ 9.m$Ô?õtÄ£ð·úͬNÐj³&NùYöÙ ùßâ[vÞì›óøÜÁà@{EÇïtxôóû5A¼ü`ÄwþÖ‡øê¿ú'ïõØþ>Ò>ž$0‡—RÑ>—×Ëäûøßåíß[×7=~v½m×–û¹.µÃ@A+wžýù@ûè#wrÑCËiî,ªÖVñþ' Ù¯ëcAÂû“ˆr4Æà)á[ó¿{þ›ÝSº-ÐJE^<…ˆï”à \‡úÏ¡ÿSVlØ~›¢g#ƒø¯ðu[üU{)ïÌcÖ´êM]¼üÊe »“/Sœ³Ö™T;BlÕÅ;Ñ{ V|©Š©(©¿%¼q@1¦(÷ï™Êë¹ùKÞ­¯Ã)Ï5>ñHv(@Ã*~rµÁz È=*÷/ÆT™Ê ·È(r›ê¡¨ùK; PÔzþ“jX3??·&·ížŸ3©AÿyãV{õ! ÉŸ»vy"¤óN¾]Në· Ý™ÙG_;„ÿ\ô§ á­„ñŽ8Žà³€x@Çš#tÂàŽ€5޼ø2€îGp$` ²Íb€À¢!!rit1 yøÉ DŽ›÷˜DlBã%FYa,¯ª¤ã±¹1Ô;ÞÞÒqLeåªÍSÊKkÇ–õçœzjçI…Ìê€À|½Py–çÁMå,KC*5€  È‘›Ok"Í(÷Óz6Pžþ·RrMåOËjYwÝz­]“Ã}jŠÕ9”@p€5‰€¥ "³6óãJH¾ïPÆ¥ñqëw²­F}¥mrœ?Çóîüsï°¾'ó)lHWe7ÙoyÇ|J#ÿ6•_p N=;!FüQ9Á¥r{žƒÿ¿vÚÅ.hۆȼ–ÿß}CÍ›LÉó¼;ö¿¥»Ô–ÝAÚGý. g§ï-°|°!I•fôÇ1DIÙPÏ2¿sá®Ó u݆ý·%¹ã5çuDvã(a²áÓ¼ºÈœÜ¾Æ;~©ó?r"¢Õw×móþý£]=Î3ÇØ Þž`«áŸú¹ùµÔNDÁê&ûóç´û[™rsC/A7éýÿ£¿†‹X}0bó4bõQD·$Ĥ¯¦H+ƸbtK jkÒô'2GNji#ß\Æ×(¨ÁL8ÿÙÿ†ÑÁà@{Eû89\ýdÄ×óó¸ÿÓ Œ«„“uB\õj0nX=ÿKˆ¨´fÐèìÇ c `ôP/kÀr}ç™›­ùÛ¾Öó”É]ËDß`fêioÀ#o :ÒtÊØëþó’š)ÛsÌ«L±Ñ1èA‡ðùo",ÞÇ ƒC«üzþªóv^qÀŒ*£á×í’×þ«ý×9v®Þ¦u»§Ñ ê{ÜÞ×>Ül[å8çpJ_UæUSsà>Šâ»TØøó°†øøç€Ä$Ö™) &BŠABúGÂ;€"þüß8þ/BwüŸ†µUu7¥·ú‹‡¿¥pûÁ𑼽\˃§UK¶° kßT;N¾œu,gÏqTF†9è§,g€”S ‹¯º„Ø Pc‚ÒI0`÷UCÅ®Oý]eÞƒùý¯U×ÚŸ ²yhöp^Ö 8竉¡@ÁH£1‚cÅ0‚r.òúO o `#_¡øo@E·Uyþ/üdµ›å)f0ˆÝÓuëysûÔ«‡<;º½iCÕùyµ¦¹á þÈÙuh—›¼RÖ¹ö9µ%í@ ôM™KNö[Éûøä¿X¢ûó=Ò0üñéGG w6âÕ¿& ñ¿`õh ñò©xýGõô„%ÂEqJ!©g â?H€ñü tâ1Ìšx‘•W1$Ü"Š¡V‡¾‰€jl€ÏPñ®×¦’Ûv¡w¶ùîãëƒ,=ÈyÕçÅ<® ø—:dU‚0n:­I]F3ÓtÒ9ãœnv›D-¼©®¿ý§ªž»Ûó›îÝ©y¤,ôY‡~ת!@¶|õ×¢ÂÏMæSNvQÝiï‰@œšx·eKdl'.2ÎÏ_¶¥4"0¥ÿ¦ó››ë·ù”FfŒb‰)ä˜ÔŠújø•f¼<ÿ=DÕº v·Û_Œ“\)5ëK¨¯ó¼tðßèÿ·}ý½´úÝËF|ÿ¿~ŠG¿pŒ£;œÿp”­Ç„Í“ˆ¸J Âp–²Gþx™2À5^ŠsWXBÒ ”…Îò`CCdÃE@ ðÏä¹ÎÔw?ЛH»ž ïXú¡„@d”‘aåhöïžDjeEûÁÚN´§ïÝåº!ºIïÿËF<þÎ _þ•ûX> φóê€áé(ƒ§#Äc\%‰ÓX³ ‚o¥8°¦A ŸÄà •á'1tâ‘s*ã{Þ¸i.üÅ[é–~¾v}nû%é`p ½¢ÿŸ½÷µ,Ëî»>kŸsï{Uõº«ªgzfºÛ3ãnâñàö8¶;ñØ!¡cEA–’ ÆÃ?ðX(ò€H²HD@ñÂH‰„qDLq„P É@,{âIfd3?<=SSÝUõ~Ü{Ï9{ñÇÚ?Ï=÷¾÷ª^U½zï®§ûÎ9ûìókŸ½×^g}××Þ9xÞ·ðLéäÝžÿûßü¯ýä/}÷Œ“w{–÷zܾY@-ïôG&+_05Å0YwjmÉ~ÄÀ¶1²]= Ú SFAR˜E*·8VyÜð­Ae¤ GW߯sV÷mbކç¤ózýO†ïOËÍõêåÏWÖM÷:‘¦`¸¿ ôßToœ{výZvSu+eqÙxdE—ú¨èVóÆÔè¯* ôzËáÝ÷ Þ+?úó;Àÿqé2€þ›H‰ã&¨¾K…wÚ…ú/=¸‹He$Åø&°´¸ƒsÕh‡d%tîæ!„me@òd]=ŸOÂ>Õ¸x;k¡„Ï_ÃZ·Q:ÝX󲉙m¬çB%@°uŸmD°ƒæÇðú6·>ê%XƒŽþB<ÑÔîÉ@Êþ’©ÎHöâ£Goäy¶pPòÆâùJíG§;Úh@^_kÈuÒM»'tÐ Šf9®C¾Œháú!b}ÈàŽŒùpò¯ý_—;ÚWö8`ï»@? ÚÍÑèÀGÀ¿'xõcà\z[â¥Èù*ˆ°<;ñÞ€}ß›‡¿öx TpÞ: CØ Þýöí+éwá{"y‡÷eSšì!–ûT Æ5ªµÇ•1×iý,2Q6ÚwJèïµ´%)Àè‚ǘ›Hæ‹ Nk’åü y%LlE>–¼*®ÃÐYÓUλռ˜þS Û§æÇKÍoW5$ãêû“8hÕ ¬Ž îÈè,0N¢!l’×EŠV×Ììãs'Öža(Aÿ‘<ç»K‘ÒHÀ˜‡ s«¥FI¦¾Ÿq¡Ø¯qŽ??ÿ$+å¯þ¤Ü‡MÉŸ¨Ž•Ë×qVvàCý‹a–ç§mRàŽvt*]7ý.Àƒ/.¹ýýûÌï6¬Þ÷t=íMgáü{p3ûÖp31 ¬Ü\– ­àöLà’FTÁ+í\ÐN‘ApûsN@†éÙ„VˆYˆÖ<þK¯Ùñ$°£Ë@gy›ê¬MëÅrJ!1ŒÊ‡Q JŒDSsÄie2±ý8´›Ÿž€.Òûÿþ¯žpçí=–÷{N¾ ÝÃ73ï¿T[®”aÁ~o!þû¸Må„ÉD5þ•xØï* à…æi;€]+zýš ˆ¿¼äÍŸ¾Íò½þØÓ{¼$ä;q­CZ³”ò+˜ßvƃu“¹Ÿ‚ò9nk¨–c‹§¬¸(Ël™(ÔuŠí¸^èE6/Çô™ðµóü¤Áû5*cŠIÁ½XSèã°óaž+€NСÁÇ¿ ó/ÂÑ ±0³íùdµIðÿI¼þUN¯ƒÝ•¢.€ßãëNþ%X?ø·éu¶éˆª¨üU½¬f+³>lº¾$­>ǸÜ{PuøÐ_üàðÞÑ ¿çÏý-î¼½Çëïð‡ùã|þç¿I÷ÀóÆ=¼Mq3B45a°St¥Yèë Æ…•ç`áïJÃ'0þ˜¼Ó¬ÖFO°Î¿bY¹=^ßVvÁt™ÿL…v˜À­ÓŠïiàÎ}ü×âeéäõÏ~Ë‘áeh (§Ãà¨À–±z3)Êã9âýKÚÎ)4b⺩f:7amà0yë£}ÏcÚ7Ixê _Ùa_ЍÑsS‚W}Ýëo~ @™µU\WÖ Ð>Û@Üž§µSTÁ¹8ñdyJ ‡B‘æ7›ÀÿQñík}w¥1@q…³Ü|]ý! kïä’¥»!Íj±KNŽ–‘ÇͶ{¶½Åœôãß:ýù®í ìÿ¡CÜ«‹{G ÇŽæö€_yäèJ`éШ´³0þêÅÂú{1ÿ“™½ÐYƒXXÿ!†÷op^ߘ“¯‡F|ƒó ¢ @¼ |JÂ1-+b$U‹P~?ñ˜ðLQöASŸqÒœa4>%Ú&Zʦ aSèo é°ò¸ä‚]/‡ú³X5ÏSHkxm¾«ÄŠE¬ ™—…í5ƒÑ­|j}>^»º¶Vs¦ÌL'5†9Ù)·‘†óiŒÌP¥kKJ'Û2ÌÙ!–¸(£dãÀØvJR‹ø {æw7•Ò(=KÙvÉìÙµ›Õ †`Å»GK«ø8–ðÙÇãÿÏÆ `,Oœ^?ö‰¿pdÌ€—ËFÇM\qøøÅ/|n|Ðù>š/†¦ºäŽvtnºnú]€åûǿݙîv•=÷ãÔ<{d.xuXtLo|Û¯,ý+€®|0ÖR3 ¤5}¯ˆZ¾lïŸ5š Û›0å53ÖEV¼¦ûÛ때7Ú?µdÃöŽž•ogjQ™ßPÿ´óç†rz ÙÕo\g¼>uÎM´›Ÿž€.Òûàè«ó;Ž[ß5ãøÝžÕC8–ï´ûB³'ÈRN<í͆þØ£jQD¨"h/É@IÀ6bá\¥ìÀ$¯ãZ[žŸÛìèÚÐkïÜzÞ·ðLéäÝžwÿÎ1wþé=>øÃ7è=·>6 ÖŸZ[G«)ß+ýÒ¶‡¥ÊEH”À÷𽄂ñ€¤ÜžuµåÔ8zÀA0ÑNØ»”¤ªQÏ•¥v-öU ƒå"µ™7k„r´Ú¤ÓI€Æ¡¾C–iVè Ð7à;×™½&Šõ´"y[IJÒ3{ó¯í›þ·×±‡ÕÔ¦ùyêõØ(峌·ÏFë ±%õ9#•÷“ òý÷[¹W pÏâ½ÿf üà¿c^þû¯6¼ù™Û¼õÓw*ò~îU–÷{n¾>3€O3ú¥†ô&ž~a_ºýÑ@w8 s …7yܾ0œxºc3†…¥?q3I¡¡¤¥¶í¬®EDÑ:*J™ÿ®à{[yÞiÂácˆ?óÉÿˆè•¶ô'HÉeåuôâ<%ÏJeøÿ¬ê¶’­Þÿ”QÊzäõxîÐG5]/_³äWÕ}ÿ×i¤øc@HÊëtÝÊ€¬@û(ï3þ…üÃ=«cd*âAÇ‘Î]u¼Iz“l˜&ËË2Y=÷ךÇľ,©Ž1&MàNh ‰}gl`çLí+¡ “!Àf’x·%eéèÈ(Ãu´Ü;ê÷Åuë¾=ü— Ûø^'úú¨éŸ4´€˜º†:ÐUŒñ IˆšÃì$cšpS *ÂÀ§gPïÝ…ÿ oð÷ZäåVÀÊá±>´xä Ut)èB ÕàËz 3«šÞ!½³÷é !ýÍÃ_¼ÃE 3Á…>àCtŠÿ‚6JOgý 0N¹Ö Ÿ jè˜ D+#”(?Ô)EÇÀ:pÁóÙð¯ÞûË9¶öî-Ö¥^û©Û IDAT<ü?ÝûÓ’cê1_F¹¿ŒIy“ ö${W¬ËãӲѓӗþÿ+_ý¯VÀÞ†'zVTD;ÚÑãÓ·÷N¯tÅèá——Ìo ÿ“/±|o[Ýgõ``õpàÆG,íë°zŒ{&)å«4¤Ô¯Ò’ô '&søUt³È±t‚´¤ÔiSõ%@†ì»\ŽËvô¬è´ߦ0+ü–:ã·œÄý‰ú£åµõñ|1ùZNž²¥lGψ.ÒûÿÑo­XÜë9xëªÐì óÛŽö–Ã/=no–S8Os£ ¹á–ÊÞÝüBˆ» XÔ?H·*¯‚6äohÍß¶â™U+Z\ãJ›DÚ à“;€]ºûöõÊuïóÇ|tÆÞ݆_ZÑŸxæ/ «žîÁ@sÓÑt‡&¢š„€&‰ Ø ¿:3&*j3CÌ )”J œòÇâà ,ü];ïÿþµú Ô×ûÊY¬Ô”ˆdÐ߉¡Â•&e‰˜´m D–{Î׸ÓÏA=9Ç[·•³…üOË©:gþÏú—©bCN¯çºÛžõñ•>OÔ•|ˆCFÓKT´ÇХ׫Ëm ÂûÉÞÿÙ»Jã¼nÈÐË÷Bç“ìQ¼¢ßÅþúBÁ[R¿õíu0mÔ'Jž4EáÙb³>qè°­)@ØÚ@F§ˆÀOòˆT2øÆM åû­ŒPäÇßÝô”׊Þû{{?± ýÈ@ó øe‡.¿ÜBÐ¥àWçBT€¥ ·ü‰ƒ·<œ8{7=²t°lÐY+‡ö Ò(~pHß }‹´ ùïRHˆ !€CPï,%@Œ¸‚¢¦¹Ô[o©qþŒö‰ ¥Q@ ·¥¥ÖûòþQÝ3ÈŠëà_ ÔUYÁú½–¡¿¸TÙ!9ß¹¹¦ãÔ¡bfaF6ærÔü_PZ“±Gq<"‚ÚÆÃŠΗ·kf±OO€ÿãùlŠ—MÜi½)%‡ˆ5äÜ©yb½˜TÁÅy4vnÍ=ÀXlˆhÈÛWÓùÖ§ã(»ž¾%¥QnÒò]–m÷üÛÍÒ9W‹YQØÃ½BÓ•lŽöÉíqø>÷Ú$u4öös›xõš˜×óe42+HñÅb×óþŸá O…Êî°£=1]Gïÿ÷ÿá’öf¡šÈ Ú—23@KD Q†…éw}§ôÇÁùk5Ò‹t˜¤Ô‘ˆl™»&Bü'À_‹y!~ƒLA½cz¾M¯Öâãýã7XþÆõÊ7^}öQGˆû´ØŽåü KÙP¾í˜):mÚÍSO@íýÿðKKŽ¿Ñsø•U8þަd.É̵bN`'Áài¥ø¥G\0~Z˜ñÞ  ¢ìåGMfתyŽGÀi<îÑÎ`G׆®S~¨“w{Þûõ%úñÌï8îÜœ(¶ò´/9†5ø¥§yY˜ëO¿Rd)¸ fåY0ðʰ$û‚_jÊ•€~/•uTb–¥PÛE‹Œ®#øob\T^ÙÏp_쳺¥NÖÅ0l0oÿRÌLÚ”Ó!­W;FÞüźõã3†û àìK{¸±q@Y§~¦Ú8`Û³Ÿ…¦ 6Ÿd“g®m¥Â§þôß^;îÎÛ{¼õÙ;gú˜¿ñá–W~÷ dá§¹!Ü|#ˆ4*47‚µ:Øú hïÑAŠ|O’ –zrÞ§`áéÉ២{ùá;Ë\wáñ×”¾ñg{žJ/6è?"Mÿˆ`cd1Y¾Åû¿0H ‡3‚ÿEécÝxT=çaqº€éµÓ¦3¥gƵG¥¨îÖúªÏ{þ;Ïÿ/)›Ãÿo§õPÿ¤9%{±–Zæ' IÄæ°ú_rŸMá­7ÜI¾†ÔÃÜ…!þJ'"yº,5gÄ4øC@HBD€Ò¨.Á ùÞ…ì©r½ÛBƒH y|iì/Š~p‰¼ºÜðN®½·ÇÞï;D;aøêœá Î#âð ðK1…Ʊ0,œ…x]4ø…CfÞ¼þÚ¨öETj<œ4Ð7HØŽiÄ;dÑæhCcQ¼Ã Éw ôHà"„ ^Ò<96¼‹£Ä†cºkü²v¯\+¡¹¬'|¼èüå”úú[ÄO@¶’í“‚—ýäi-ynä¢Òš”£UQœ zÞ¡‹ã;ó1ÕÌáÖΤùJ›Áÿ1ïzŒù-^L2_K@q@°sTž8?—Çשy2Š|8”ÅhfbÆñ³ÆÞ9d 3jŠóAâóåS*€_ÝÛ‹ÒÉw"ɘ.ÛõÚчq,±TŠ;àtþ_| Džpq²Íh¼K¾7)¶K9#òŸèåŸy@6°¥K}¨âYR6ífns^ð?„üàyzÃ\&¡sGW„î~ÿõrðZÞï™°áÖ-â@œÐÜp¸VèN¤w×1wHˆ\è,"À±âö³·é £–†ÚKá鯵Þ$yÄ’¾¢7•7{Â@ Ò‘Œ?mKn1)Xìè1é´ÖÛÖÚ%€Ÿ=@'~‚Å7ñ!¼v©ÏU)~Œöˆõ©sŒ¯µ‰G%±£@û¯6êý¿¸×Ó¾äxó3/ÓÞr,ïÌ_qÌn «Gžîp ½9³(Öôø–_93tZ¹ÍÕžæ£X©Žé°Y3È©°I=y ó‚ËËßv;º´ÿjs¡H—–ï ¼ñϰ÷AGwd€Iû’ +‡Ì·ðø=‡,?ó¸=óøw«¥SÜÒ|üÒBœ³} Åí¹À,µðžÕu†#Œ¬E׬©Jaq$(Ž…Å)Fº£gH%ø tLeæ}PTZBp˜"¤uLLááóB0'9›Ø%g¬7ñi=­HÞÖ Dª–V'-GuJ〠öoþ}{\‚ÿ„ã7þ›#ŒËëúgk—麥Gÿ6ÂXw\'>ï§þÌ:èÄ×Þ987¾ý‰=ºã[?4cùÞÀ⽞ÙAc‘M4û!ÊÉ# ùßkȉgáíúco)QN”þÄòÛùÞxœ_…0»J6ˆ’u¼YjâgkF1 ÔiüŒ\žyô £íí“¿Àb8¢VBf%bRP&ÅbñÿBÃ"?>•áÿ‰Êìb+²¡n¥í'(Å×Êìà|Í©í ™@FàuePn['J÷”é±,Ýx‘|æ1¬R>…×¹®4eúPÊ6&%÷¸Ú`ÔÞRôÓ*Ã:ÈUA& È(Bm«„æBd*y:gµùc¢¿Ÿþëz™î ±×ËZ™”åúx! £O²MI6§‹ZHòò´ýÆ@xg R?ã#ÍÍ6VÖ@ŸOîÂÿÈá·¿¤¹ÛÓ Ò:š›º¤×cá[_š.€ð˜z®èít.¤Sóì!l7È2ˆý¢æ1`xóŒ¼Ã%xÔ‘S=¹%€ÿ¢R)Pëå°êa34wq||²Uó•ÇSçSý-â¬Çz{ò*Ÿº7WÆ1±¦»€´&Uøÿ4æìA ø <2¼ô˜¯} vÍS5/ç2ŠëþO¼ÎíïyÔF¡SH=\nf“ ›Â>J~þ² çèl !ªªDÅÛü2ñ´âÖè?aÔ“íýˆÿç¶»Œ)D³¬bs¦GÔ¥&ÏÅñXÉcY³ëCä£3ñxJF›Àÿñv9âkyCÊ¿Ò@Ö÷çíúÚç•Ùñ Ÿ Y¼+n:;×I.ž¦E¦íè iÿÕfc¤À«Jïq ª¬ÞXÜëñƒÒî;sôZ˜£_ZZÄ¡aý{Óíjïñ÷ üBšW‹êJÆ X¡ß Kb”×±w;‹ãõ=-:­•§ÞLÜ¿=mcüúѾX¾&M‡rWÔ‹uÜh›QyÜ'EMËñ5§ÖwtA4NÝú¤ôþ–ôKÏþ« G__™wϱzßÒžH+ôGÞ¢,™GYܾ@¾‘Boköß Ò)CM ¾øU¯æÐ:„eH{-…Î7…ù‘ì¶<¯\¯FÆÜÄ §FìòÊ냈îèZÓuóþÿò_¹ÏÝØçÖ3–ºG³[Ž~¡fµ0ë§¡Y€eH(LŒBáà³0½þã2Z~zÍ`×”‡,Ô:Šató/˜ðw­=ÿ½Â0 ^?€xD|ò—ÒQæ©?mi‚Ô Ú Ò‹M¢`žbÅqð:yÖÓJ¡HÖ <ª–V§òÚyýÇhqý¼À ìk±¼/—o‹P®OµÂt»Ž›<é"7¾‡õ“—uÓWøÁ?û¿¥òýW^{ç€×ß9x¢÷[›ñè+–×®½éh–§uþ²Ã5°:ôÌï4¸¹Ð Ì_xÉø ˆ0¹eXx\ó»-~å-l^# Ç/±ô'Ë;/äÀó+ãu ¶Þ«a«lPåÄ‹Ÿ3¡Ÿ—y¢RCmúä ô³ß÷Ÿ.)¯ªéØ×KAð‚38IŸå…1@9±DO½\ˆÛW¾°g™6åš•ÖÔÉ÷'ÅóEpFCì¨gOÈkn¬Ç~‚‹S’_ÉbYÙv0p¡6Èý/õ!õ›øn¶Q|ìXWô¹b‹Ôž Jêï©´ÿó¹Óýiº£ªŸçÿʧï´Þ”Ü2ô'ç­á𿛿- äs§n½:)À‘²‘ãÜWxÚxÐHîÂÿÉáXâ{g@/è²A¿Ù ýÆ Ú„Qá‚!@#9͆xdp4¦‘ÞÂøK«08dðˆ÷&ÿ bÆÞÁРޡ¾AÇàã>аŒQpX'OxŸbÑB €Ò` ׸|ýC> ù²¥|¼oL»yçÒþ« o}öâ¼ÿOÞíùÖß=æ•OÍYÞ‡ÕûY±Ú›Ç+Ò¿_ŽExáÒ#sA{ÌЩ¬®•™!TÂÿûNsTë`•øÜ”±SÙ›7ñ½ry hg°£kA×)?ÔÉ»ý©—¹õÑÉgvÇáæó$ e8ñÈ,æB1Tª;ôHKª/CCùœ'*X‹Zx¨"—vOm Ð× s-,T;!,žEP¼tíÀï$¼(?€÷0ô ÒH£dƒ)d$€ÿÒ(Ú­…=”AÐUcyeW>ä‡%);£—É…Þþ¤NRò¶URXZ,¼þÚ»¢<¤}gþK@ÿ,õþ\Ϩ®eÞÓõD±Í×+n>v¤Ïú7Tá‡~î­ö¿öέü_‰þÑqŸý6´/;þã"ò¿{äQnfüÃJq3ŠOë¿gúxeÔã¶™j«Çà]ÿú'ÿ‡sÁ(¦4¬ˆ òU <SÛG;£¤"×¼÷¥Cµ6('Žø¬~<¥ðÙ¦cŸa\>ººf¶?)SÄpìé—·.‚x™~¡òÈ‹e—m.]#onVˆ×>xL(ØèVª ˆà?”†Ö46‡U@U¸ÒU75`áõ/fÔAà‰š^¨~ ù U9Ÿ †TöïòÞ.[èl$!éY5¼¿èÌ™‹À&Ùk2FH§ž’áÀÈûJˆO¼·½šôþ_»…û½K´üïìÁ|€¹Â"4Ž[kóÆÃÒä/Z«V.8ò ÒµˆS,”¿x ïï|ƒómø54Ú j뎧 NChkuöÞˆ]Õû†zFýØØ¥àé@,ZÌa%æ t±|}³·¯ÛO+ô·„Pÿñz÷/ªRþ6?ÔàrÚ'pž´&5O1#&»tÁ§ÀÆüRGïâ<àÿ“½ËÒ„!_üISóhHÍãuÀ¹&—+¸äѨàv•Ñ–ÎS…~žæ«p¬„¹ Þ¤o›$ßhEp6þ¿fP´[ùV¶·ÍDï›ÿ«èå˜OcÌ ò/ñ€Äª‹?.)—Ïëv ÌŽ.˜®“ƒÀ½ÏóOýËw¹óÉ9Ë÷ú¥Òî[žë¨Ó–Š8¡y°›=s^B$¸Â²\N^¦Û%Eðeèá²)SŒ¿ä,z•¸.å;ºHÚÖ²›ÞŠnX/—eì®ñ/î‡üÙ;ÖBh±Šdô›*+÷1ª·íܧíÛÑcÒE†þ8þF‡8psgé]E,ð`~ Î9Ôc|ðXqûÂpœùßp¬æà5+øX¡–‚‡IäUc#§±®8PÕ¡£¨ômêùÏv;ºòtÂC¼Ûó›õøÁ}ð°z8° Þÿfe®`‚b¿PÜL2ÐCAuÁ"ªË†Ú•€?¥§Ê›‚ )ìâšçë˜^áïz‚ÿQÁCðþ7Ï‘¹Ñ#7{¸@NB¨Й sy‹Ü¸ ó9€.ŽñzüQ êR:¼)v%^ó‚€Î'ÿËýèŸ÷•^ÿe€ÓÿÚÛSy½$Óh üçºëm±¹MÏ“2`L"Êÿ¹¿U•Ýy{×ß9x¬ÿ§Ñ·¼ôæœW~xŸ›oÌ8þŽÅ»=ó»–`y Ù3udL"˜µèRMx°0R Ž~Uˆ!äSNsBƒ?r7¥1}U½Q?YòFà³ßýgqÒ 8ކ‡8œåX £s'€3•‘˜ˆÿ/½¡@­$ƒø”^p…a¬\.ª¯)ÅÓeÒâiN2Ø_*5Â=iTr§OáÒHÀ7§º¦ 7ï:q£»ÏûèZ>V±-ù¬é×i|‚gA§ïWjù]y¬ ÂYBzâÐæ¡nÿ%å+Îæ¤eìgõåÇm%…aN‘meeç³3™@:+€Ÿõò%t ZþykGK0 o¤ô$‰m))—¶¤ñdûl®’O¼¯.7<Ûõ!¹ƒÙú*JsÃ14~Päè‘CÌ Ž›=zܘÇþÜ£Ç6¯èÞ€,A–-Ú(2e 3…Þä=m:ü0 Ã€ú^£Q@ø©Í_xÿU%…IT7´¨ à¿3õ–4¢Jo‘ŒnJY+ÀY‚&É¥„éìÿãÍ›Àÿñvæ/à_+ƒ²¾?o××vÎåg ü$>k6k@!)¥Lv9©fíµ"Ûš;‚$Uxþ_ëã6_C×Jž.Åï][¯£L×Êì €Ù‘1w|uÎâSÚ”ÝB •:E0 (¿¹3EˆºÜ7]óéÒGÙÜN£q—¼\;")×3ÀfÃKŠæÌOžÁÿ m@xƒ£ÒQk%€ Røí˜Ì0ãäñ¬™hv"T >±ß'¾£é,—:t¸Erèq"8D="€Iäe‰ÀÄ;r䣕¾÷ÁžñꓜÌ`¯cöáèà íí½%èX Ú9ô¦¥ЕCætÎ~…úgg¡»U‘ @]ލ‘n ôûç&{óÚN'Þ¥Þ–£™4ˆdƒ›4'ý)áû¡O:×Öý_x‚þ_?Ä©Àÿ òÅõøìk`ÿ&𯜩…¢§._‚©ðO9·Zúkj ¬gd,@æS©PÊ‘3U—Œv;ºòt]ÂC-¾ÝJsÓÑÞ4ÿý·Ìļÿ÷·oÄz¬h/47V¦¼ðjŒ®¹áÔ÷SP¯x®ËŒO†²Ý«ås÷šÃ=õAO¤ÅÒ ü,&]R\;RøÜ²2S<;º–žÿ%)¦ðÑ0ë5ö÷Ê€ûȇÐýOB÷œôÈÁCè¿Ý·`~ ^þ]47¾in‚_âÝ>Ò¢ÇßF–ŠwJFMíb§gg¸åu]$Áÿ ?—†#€¿<¶ôú¯Aÿià\VÖ÷¿n[¥ªWirãBªíªm&l½ÅÇàŽ?úïý/Uù›Ÿ¹ÍëïôYDÍSr!p„0Ê44´˜¯cup8q4Ú" §. 8`žg¦” êÉ_Vc+®+ ”¤Ë2È ðX2R¤ÇW ñzñL(MYÅJ­œ.+rq_œ<ÃsIÖzOÏ›$øúžmsås˜G'ïáLûjØ€v7«ås?(½è²!€ä÷c•H/+‚ D€-ðøŒ†l˜™â}h2øµ¸F9ÍU}7l•@Pêú¹__úÐÄö‹ur]x½ÅÄ!A—#¤v.‘4,b_ÿä.ü?Àì·?ßxÄ 'ìßÁ9ºù1rܘA枇¥³_ë¡k sfКŽN¼Cgjs‹¶þï©yó. Îæ§h à]8^@-/9U½j•[6†]ô¶ÓRxë×çKÀDÿãøQðº¢Ö4ã;ÈSeícbƒŒ)ã}Óàÿ³ý¯•<¢ËÜ"q|¤9¤\?Z“ bc_ã{’èùïÃþlö4Æý×(Môºv¥ñ\<¿%ò\|žÔ<ø\œ‹£‘^î…q’0P%åLÖüä™_gþXÉ4ZË4I*þ¿í†ÄZapÖ6*YßƧÁ\Îúwàÿ‘láÿQæIï*>æÑ¿–~¡ºãõÑ/£r»Þ–±?×5ð_lõþ—'µyoÿÐ £'ý\ßÑŽÎE×E¿ æýÿ•¿þ€üžè <úJ‡4àZX>L_ë C±”®Q—«àµˆ`ô¼ÿÕì¬úÀ¯Í —€vXåÓZ7 IDAT"T“ëÓÒóþÖ¼ºt––ªS¾©r}ì¥_º»lzÓåO&êŽIFK7ÚWþذ>.Ûtm×ßÑÒÓðþ¿÷÷ùÆÿqÈGþÙüÒ³zèq{€ÇÒžœ(23 ¿?ñ43I ¿kI:^ø¥·NYF³®œ^YO »%ªu¹^ˆª5~UÒ¶Qø ig°£+O×%<Ô½¿ÂÑ×;n}|ÆÑ×z–÷zÜž°|ßÓ=ô ¬ò& )†>ç*Cýûބɘ ,5€ÆQfo–@fŽa½*‡šÉmbx—T@¼ÖàÿEŠi™+ý"òQ¯ ³×>d¸áÐnî&Ì>LÓÜ…f²ê‡aïÌîxĹ ˜¤ºÖ“ˆhO þçþ…Gþ(äe0*_7Ø üOG¨Ëë%IÑU>Gõ¼¥¡ÀÆFª¸l›Ôö£÷ðcþNëwÞÞã­ÏÞyn|vÿÕ–¯þÍGÜýÔó; ÝCåð·;3LV=¾ó¸=³~÷K˃'­ñB¿2Þ7tŠFž×+>†Š*ÂGQ€þ‰×ÅðÆ‘F!‘b;¬ÿ±×~YHð›´l‚¢°‘Æ–4ˆˆ ¿Á Ä âpd¥â‹G£É l–Âu€ŠïZ®ë§IÇL\ç™Q=€Ê´9|3kû3h“K­®bÞÑá)D̨.Ö!󵬢§8›]/æa+u$€ÓPœ‹¤ð’¢XÆ»‹ýIá^–Êh½RÔÊú2¯¶í(^D}â•4óU)Í ÖÇ[ Kœ:aæì½)>…üG¤žœ?kÃ-kÄúñ|±dbûBÞßø©ŒÊmk»t£ÐÙÑ`'GÐrÔúšh$çfÒ]xU3^R¥Àð©Iôãß¼€ç}ñiÿÿy‹æÍ/0ˆr<xRú„õÛØ_ãüÇQ<·WE$x¥†‘±•ÿk>i°ÛklÀצ¸ÂÄ /e½ÓÀÿ"5—XÔ“l¬[òÇøO8†lç‘þ³_ÿÙûž­³’íèÐÝ·¯O„דov¼ö“ì°¡{ä¹Õ+î†ñßÙm‹v°z0°zàinZÄÃþPiö:(ÉÒÌé,U@Âfû°o)¤‹z‚N„¤AÁwAK`™-E©SÂÓšvé´VÞ´_Y[¥2 (æÝ?~«e@t?ÚWÖ©?ö7õ2Ú?.›ÚW?uÎ=cú¾ãƒz¾÷~mNø]ÿÊ]üRY=hn næŽúcaö2ô‡®5G°þØ[Ä×`ÐÞ1à¿™7ô s‡ë=:ǯ^²@¾ˆ›Œâ((G d hüi³>gÞ¸3ØÑ•¦ëê½__àÏ­Í‚çªgþÆ>Ð…½¶æéºPÜ †•EpsðŸÂžÄœQ…U”åN‘`=*Ùó5Ö‰€X`Ž¥çkÒq”ù± :¶¦Ò1Ã3ÙgD×ðÑ”¢ ZJ‹2§á‘[ö_×¾‚—Ô{Sêh¾ Z-ë AÕ\_,ГHoþoòöŸ(ßäõ¯“åÓÀÿ©)â=‡ez¾X§xÖQs2.ؘ`T÷ÓáoTÅwÞÞãõwx탧âÿ4ZÞFhö<´7´Áí Ú)ó;fàdÆM× …ÁS0€Š¸>ýoLa "”Àó0>óÁOßýˆ7?~ÔÑxóîwêè¥Ã©Ci‚§RC#!ã‚à“”#äW‰€Y¡àG°lÚ¥gà i©–KU8Q9^M0êȧœø9Ó6õhµÏ6by‚çeY¹2ú‘x ëcð_⟯TµF‹gB2±’UíRÿ•@A<¤@ù3ø/Õñ±rÙôΙ“AÛ OF¡;È@ãú ·T $ÐG#ØÏMÝà™•çgª–ÁM׈ç*ïæ"ßÞ&#€\4TkSèìh\aÀm|Æ ¾W YOeA+ªé‘â~UÐO¼wÏûbÓïì÷ÚCštèÍÿ¨Aö= þÄáZÅ?jà%ЕÀÊÁË+3X4p«G=²˜è~o©¼cð]ðî·(êÍëßïñç(¶£1€xKcƒ·ô6¬³¨a¡'»(ú,‡Õ==!¯ÐJƒjè , ™®rèïµh0aÛ¢±qô¥ö”\-·q1ïZÓzT^|^í\R“•'Òâ\Ó|id,0YçiP9ÙŽøÛ†úejE«Ô<„(/ZL’ZدÉà×-¥2îwyÍ ¹ÿGƒÛGöó 2výÜóh5²×©–IJ^ •|=9¦‹1ïF@¿{š1Øìý?ݺ— ôt$ì]CºóöÞs×?<+:y·çWáÛ|ôÐÞp K­àðݾï|ZŸåmc`¿2·°Ù°Ì€.ïÕR !Ül/MP÷½Vž°"äŒ,)À †õòs½¸N!ZdÚq'¥ÓZp¼ÜúåoªÜOì‹o*Áå¦ã1•ŸóÛ~Su¦Žßtþm×ÞÑSÔ _$=øÒ’ï|þäË{'ßìin5øÎ³zo@fb¡ý;M?iHžü†Wemòî8–jWåu”äp“D†ª÷W6ÀcW‹Íõr=#žx=fÎ][ºá¡NÞíùòû·ßÞçæGZüj@½}PvGfñ)å„êŽ<Òê•áXC8MÆÆW“ŒÊ­¯–àX»¡¿s4€<K þGºb;zèºDwóþÿÄ¿z—›¯·,¾3˜^cn9¬»co^úé/$xø•yÁŠ Ä5!T ¾UtÚ™^Á·˜ƒ—š!@šë@˜Ï"óŽ¿ Ÿï(Èx}ê¡ Þ½£§BºaÖÁûr]Gåñ¬Œï0åý5ä¹ñó»XF³“m?NYÓn>zNôöç.ÖûñížfOøøŸ| i„ö&ì¿1CÔBýë0cèLÏ‹ÃÂÓŸëN<ñ§Ù3‡Wu¾Ëòu&ø¥šA|£Éó_B2¥ízCJ×ø[ü =—”v;ºÒtÂCÝûü1¯~ú&:('ßêQosqÿÀ–CçyÜL†Å€´‚:_‡rszŸ=]£å”/5l¦@ŠÓué¤Xz÷—Bà$s¬”B£}ãõmeOþ;ðÿ,¤IQáоAä諳[Žæ†KÞýÒH¶ ¡êâzÌE¼Ñ€i‚ïüóúS@PÐ ð¨€Ó"›ˆÄí±Ò°V º´ ŠÂÑz '™oòx¢_$ÒM§¼„Qõ(Ý4Y<i|Ó{ÑQ ÙR=jHp[¢;FÊ{M,R$€ ÖF-Lš·EêÊ3°ó´Ú«”×ÔR³~)ëgÅyR–Çy¨: T°ç²­w´Á ¾ÅQ[­³l2Ðf›¶}!Šº`ÆýE•¤Œ›ºÜøÞ.œ °Ü?O =e• ;£Q †K…¶H.´—éMB&m ÆFQr8h…ï}ÿ)>÷‹Cîx=ìqoœÐ?ß ²¯ø÷zBü=lÑÆ£^à°§è p<ƒÖ£«é´õHߘafßÀÐØ¶Sè\ßââ†×Íiû=¼ 4¾¥ñsœoð® †A– ëœî…îoq<ÎJè²wµÏB‰u<‹ÌÅq’ÜÒ옼–¹B¦‰ñ.e½ÓÀÿgú»ºë"@ÍW‹š rÂsDÞÆjùäe´…È…¢Jï#žªåáô½Ö²j±±¶þ´©db5o NëÅ£•࿦J¥Š¥XPÅ:pÔekñí@ñÜZ­ëÚZþW_ôv›:ã•Jž±þeưø¿õ?¦ù’̈6^H‹ó&ñxtíu’jUª‘!™¿cµ2ì©Æ~”å›$Ãg™~l4”%–1]rÐ?¾ÒðÃcGW®ƒƒ˜“×—þ›÷xãКÞV½EQéàW¤<×ýBéKy¸‚îÐãf¤¨®)r¡†4KTŸ!<šñ®¨zcÅE†˜¨?õY»uæzŸê/ÖJ:Z–åSÊ›f×ËÆåã:›®15/ÈèçXŸGb9å•f`tM×ÛÑ3¢;oï]¸sØÑ×;š}¡=p¬îx…ù£{4XÚÕtIø„²ײPpöòÛ›¢·Ê<þÞŽ±oRÅ5bQ‚Ó«›aÑ^&¦–6ÞXļ I/ïÚìèÊÒuuôµŽßú¥|èÇnrãµ–þ°gX*³—tÀò ì;hÍêI»0#!„ôLÐÞ㇠œpM¶ÛWoJÌÌë¤ õ/Þô|2Š0þ•ŠŒp™iË©©íg@ÿûïÝCÔj_sJhºÆ¯†ºõ þÈãÜùÃl‰èôÐåבå#tÕ£þ;H{ˆºêtÑ¡' Ç-tb“­Hˆ ûâùÛŒ“<ø?ááO±î‹z0:n|er½<&€ÿ  ÿðŸûe´]——ûþ™ÿ௧²;oïñ}?ûÞúìÓšûRÐKoÍùÀï½ÁÍ×ZV<«³ƒÿiᑆOâq{‚®,ÀЙUè°R ÷ß™ý'ö~z‡ö‚ ‡ôþø;þ7qƒ™ÒÇpÇ!Ô±ýœ¶„åpÚØR\Ñnë3·ó­‹K#ó~õDµ2¸BÉàÅRy ¼xQêoP]Û.˧_Û÷"à£Ïcó¸”ÉÏÕJ•.õžÂ/1œ2ª“5]"åjG ¡ôÍ€u¼ÌÓ1+ºKp?—eU»dÏÿr¯äge¤D/œéH vŽ!15~ÆF›¨n-ŸÀÔGƒt]B@ JŒ€€Jˆd¡à‚ÑJ2dÊ@+D­P„Ý4ð? ü0jA¿w—À=¼‰ì½o ŒTõ½ Ûs…ƒb©Ú:8\'èL-Ü2zg ”6ØöàÌ;B¼Í{­‡·°Ô6õxoéo$„©OÑq|é¡+!glð#OagK&I@i‚‡pŒhÒHc"º‹2Žõ³±G»­ÕÜeL•b›º?^†Ðß§Qmî;¶ä™"¶G–Æ×óõf˜“4D$RËüµv¤¦ïƒ³ð0ÎXå©Ó6¶>C þGœ#7üN"w¬¿wCÏLÇkl¯M||[Û¼€í–‚&HYšq€,ßä=ö˜®0[çÿ?ˆ—( iXMK&²F’;JãÝÑØò®þSƼÎi«rÙÁÿíè¹Òþ«Í•×ïFºÿ«'|è'nƒG_ZÑ/ͳÿäÝÁ BÈëþXsš×Eˆì:³(~eú ¶¢3Dôp­·)=_ƒž·ŒôzšÓWچ͟*SóØe˜Û^ :‹„°­åuTo\ÞxZŸ·\ß&R—ûe´?n§Ä£}c1S&ŽÝ6³¿Hа+AíýònÏÿ÷çßåcü6~PßêY=ôÌ^rt‡ý±9¶öÇÅÕx Ehö`X‚_)ÒÚR{RÁÈ#üƒäu)½k4pªÒ¡ÿÖ{Ú ÂÇ®Çì¹£kI—Ùcõ¢èÞçOxë_ºÃKoÎè=ó»·/ ÇžîØ™è›ÕJhÌ-–tÇžáDiö-gTʓ݋Ñ`eû‚%i…M`˜R„G)É ÒÄ·ù=/æ™46Ó@Ìu#UMº À?!Œ±)zA‡¬fðºú²u3X¬àä¿êо bã ÕtpèÐÀÒ¡ƒ)ˆq.¢;[uL›ï¹Xg´®A–Vv>ð¿ŒàÕmõ§·sYTŠMÿ¥aBµ¤Rd—)Â[šÜ·KyüüÿÇ´Cü¿õÓw^¸ëÛŸÜã›ÿçíM¡?VV|gmÜ[ê“áØÓÜü_‡ôï•ïÙÿÔ 4aì÷C|×áû$„ÂC¼)ƒg£à_³<É8T‡ð>]0„§P¡÷+Sªy Ž&z ¹†FÚ¤Dl¤A¤ñ8×Ú=à2ˆ=k‘Ðàéÿ/8ÝN ”"ð‰!ÆO0xÞ_(¶ü;õ™à=GôÍ€[ºÆ…µáèÙ¨–É«.+ÞH•îk I_FŨ•÷uë=ÖŸ2žÖC@Û1¾Œ§,Ê‚ÐÕ]š¨(d/Q5¶êê`ë’ýlÎÚPj#)ÅÑÿþ¯>å'~qÈ­ZÜKrËÓÌ=Ð¥àVm=̺rˆ÷èÜ!­åu·þÞ 'É^i yA|c^ÿ! €x‡ ÓYG(W‡hc†pÞæ<‚×òþC!†ý¤hØísÏ·ŠEß*¢„•LJ—ßX»d%&@Õ4Á¥ü/eIäµ%è'<‹Ðßç¡'Ok2¥ÉŠ !@žtÖ(bcšš“ŸÇ ½þüÛææ°/hü"/séB3ˆ»v•üN"@’eùâÙU'Û¦>Ó‹Ûneg¢üa5Jx ý/'!Æíã™Æü?ÍÑC5Ì9P”7Ïæv+e†j»3âXX3ÚþK±=•„r;\í¿ð¹í/áùSlÂÝGÆŽž]ïÿÅ·{ýÖŠƒ7g|=òÌfi”þD˜ßnp3µ°×3ŽJrjVJ3?4üê±(=èP®[4¨j#&)#k ,:ÍkfÌIžÿ“ÐO-“M=äG¹LŸî/éh×Ëí±F~ü»ð1QË„õóÃ:H×§Âý»ÑqSÞÿ°>ßìæŸKDo~æö…{ÿ?üò’ïý™»³gõžà½ñ¶îá !m«››`>¬<³‡Û3¼Ê©ÒÜ0Ãr7߃K<ŽœÊºâw’  óú/ ¡Ò÷+ëFP09rR9¹¬¢çÄë^,-ÿŽvtºê⃴¤=>>£?ôtG–ªŒ)ju¢!ßɰÐ@ñKûøîN,œT³/f!„Fi±yoLSA,<_+ Þ,K5ZJy!(¯} “aÀ”ˆQØêÓ¬–lؾzøß}•,Q £×5 @ÿUƒØ:ƒ’ ‚jé]8<6ú£‡Öv+_¬š0©Ð[¤AcxØÁä< Ž‹`Ϲo9¯§•x–•'?œ ü?_Ùö:°ø?è¿iµú‘JÀ?Ò›Ÿ¹Íëï\¸ðö,ÉÍ„ƒ7g4{Žþ¨gXXhP<¬îà”ï¹óƒøG-jáOоEÅÃ\Ñ¥yûÓ‡¯ÛUc^·þ9˜÷?^,@ôþO€G›½ÿœ¶D@ßâd4¦ÌÛZË\)³É€Pæ_Ž}7ªƒ#oÒ´GW‡*ÏS+Èëé}'.œJ+‰ @¢Ör ÿS1Øþ·ëçƒp¥ò¼T¾÷çíúÚO×0fô…‡B®¹Ž! ‹XR“§“T/œ/i!pKÌ÷“ûX†xÿ‰÷¤£_zÿC'èÝ%|åV:8œ!‡s˜÷Öœ]ƒt…Þ!}ƒ:K Þæ8šðsˆompÞÑ 3[?QGC›"ÜäùÊøO«ó<ðö„¼Tä!µuÀ«Ç뀪ëš÷K¹œæÁ¡dq]ãuKšþR­VÆ(VùÊ3 ý}ôøiMFã<(»J9³þ^Ò d¦zéhÖ5bczÚ¯º=êò²†l¯žfÒ°¥Ø<»V¹ü Ýð¼×¡Ý”¤ÞOÅÅüÁv#3PÚÄÿs€’’”œå–1$ÖÍ2QyÔ:¶e({•:I¡þ4 üßü‹é7þ­‰v¼ôTjGv´£çF×ÁÁ àÞÿ{ÂËß³ÇÍ×–÷Ú}X¾ïio9š}¡4@Œ9½Y¾7]®ks$™Yª¿Rh„aeN`1Ìcü )u"&ôR•þÈZ+uíhÚ:w$€ç1­½XtZ …M­5óÑlc(ö—^ÿS!ÿÇ×õ¥ èŠm7Q.Ç”ËmëS´››ž½õÓ-ö«¿òˆýøM>ò·èŽ<Ýá€ûäœáØÓ{h„îѼü»#e8˜Ï~"¾ÎÃ2¤»n?<ñ¸yƼtÄ¢¿Æh*¾íÂwjä§$§XiHi¢qTé[êmNåŸí vt%骇ÿ?y·çWá[,ï¼ö‡o±|o èÍûÿć°×Bb\'æÃÎ^¯ ^ͺIÃz™»X–LL'D‰õë7|É_EQ|‰J²5ŸöQòüOÿÞ¼_4w %ôCý0©ý ZÛ§ƒBºRè "¥E ÈÞš%ÿ.ü$¤}¼wºÚSÿ½`û:°ïý¸lýøxìø×à!WÝs,'+`KÿñØ+Ãøo£×Þ¹Åkï\™èƒÏA`ÙËŽæ–ðÁƒ×Å5(=9DO\Úü£¼ïÑÌúô£2þf,ÚÀdhñ³Þ€ ‰—`@´·ðþ@‚5À"eØ1–‹×¶†üÀ*Ù;PÌH MŽPEhr¬Ž8Á©ƒ`< *8ç67Ø5 ‹¯/Šžì©¿‰-Ô0I+3ÁGp¹ùHÀœ À‰¡›§ŒB-Îß–Ï\ÿ ‹ëñ¢k`žyµË§–|lq¢çBå`œ5ãÖu ·ÂÍÇ×’d-O#x$(^"Tãó\˜Ö=ÃïÿÚE?Õ Ió¯|ˆ=zsw½ÝÀ£Z˜9xIÀÏaÑûúÆÒ04Á3Ž!ôrN œjЄ8¼ä–hìÖ§yNR˜›×\òø·¹0v÷$¶TR‘³ØŽ8V|5j $ Äú‘»—ácÄ“Ø÷N—#e´Uó f€iðï¢B? :wZ“"•@=†C¤-w k‚¨–ü.—]z5‰rÆÔ<©Pó{ÕÜGËÓÇc7]ÿʶÛD¬$•ùÅ%™dÿÏ_¢õŸÙ…c‹H4ùFÉéË)V²<–áþë±_ò€ÚÛ¿Lb£½0@øK¿ñ§¯/]_åÈŽ.í¿Ú¼Ð g¥÷~mï=͆“w{†Ÿf·†¥Çnî óдÎÀ{\#ø!ð»Öt¾4¦›'¸¹ ^qûæ‹7£I©™¢“}br‘+¦þ 2µtL¬yÅB±®£é¬”#àŘëž>¥6Õ™ú¨œÒÐG¼ø†QýMÇQS*%â[œ ãi ð—-ÇLÍ3Ûöíè9Ñ›Ÿ¹}áxÛ£¯¬øØO½Ä­ïjé—Jspΰ-giNú¥­#J¬èÊœ^‡‡ÃÊÀüþQo)^{øu®"hŠrRF=‰QÊÐÿ" ¯vœâwåò’ÒÕEHwt­éª[›èÞß;æ»ÿ…Ûì½Ú°øfÏþ<³—…Õ#O÷h°\(GÞ–XJ€aŒú< KÓ˜ ÁJš`ý´2˦a™Ë‡¥&{ÀaÀƒÂó_ƒÝ`åé) |ôÜEŒÓÊ.ˆþ•O¢Þrõâ Å–Ë—¶œµ×L0࿵p¬8r¿†¾Ð+„ë Ü÷é_èZ¤×”*Ä3êTsë IDATƒ@#hðˆ.ÿÇÿ“B9œþÇ ø_‚ûPã}]w»@X/ïçÌÀ úÃøo£;oïñú;¼öÎÁ•3Žò+å¶ÿâ{nÎî¾íñ  Q ÿä.›là3è/Î[bå3ÀÒhð "Fˆ‘‹"  Mˆ& RàpCáeŽê’‚5ÇeÐí :HQól ÉEÑH1‹T*óüµ·á~„–X«²Ë.xÇ¡MUK¥4 åvHÈC –¦"äœOF(µ€F# ˜aë·›ò.´ø¿ùާžùtð?õǵ¹#ƒ€ñ¶d8!˜UþTÈC•¨tÅC@Sa†šTE¢:§~*¹Ÿ¹`ÝSâõ= 8F?xòTžñE#‹Ÿúîµýƒ¿×"·:tå,½ÒÒAëm¹rh£6¿-:³yMV Ú(²j`Õ íƒ ½ÀàÂ× ½³ò! F ÑpÜÃÿÇ9f('êÒü‡HHŸCý¤z¿‘•ÿ­'ÞÖQ”ÏRœ 㯡O¥ëlh¿xumSÿ9qÄ­n%–#¹ ü®4üèí 4izA,=@HÀ¡-¥7Pƒ!þ–÷Øò#7¸þ€?.i è—þžÿa»uóìMÈzXa縔ü,•–—š*°¾Ün?Ö@Š’¦&ÙPþ4iSûŠî²Î¨z~¹n YzKwa`k˜Ô!¢uÝ 7+ÁÍÀxNm·¨תéJEùÙš`Mµ>ÿ)ʲaÀà_óþŸ0( »ªuŸÉXÐMÛt2ëÕ¯l节A ¹ŽµÄ½’Dƒê*¢tŸøÎã>À•#òr{=èL³±?Ø<¶oó½@+°ä´F`f¿ÎÅ <û`0‹ioÄä$å•p½‚7'°ÀZ2÷Žz¾¸ sUˆ`o,‡)J@Dáê‘£iÃþ§í°–¸U:V³!AÑŸ.CèïŠ/•G;ºFT÷ÿ<6´,ßÀÿUãøT<ªc€È²1H2FÛ|SI" ›…<±fä ¹$xú €þËüs×`;ÚÑŽ€«ïàpïó'ì¿ÖrðÑG_ëXÞïÙ»íè{ú#Àú……Âv­XˆìcO»' Ë€µ’Téš¼ô ш$*5WÆÏDÑIWmì<ñópJ׫L”o[ßVv=è´'ßÔZãÌq Çí±§?Ô`ÿÔv4 ßøgÄå6~ÇZoZÛ.ÏwÚ ÒÏÞúé;îPvôµì½Ò¢^iæ‚´’Sx轉kƒ‡½U‹Z'@~áÍ *àW¾ ‘BDlõ䍨¥Óšç?ë ?ÓÛ•ªì<<ï9ÐÎ`GWŽ®røÿ“w{~ë¯=àCŸ¾MCwèéYÞ“åC›ÛýÂÓ/-DJ²íƒeTgŒ^éO|ÊsâCxß›Á€‘IbÖ¡…•(‘Y¢F /5%^ZÒˆø’~ûÒ¢„˯‹Ro¬{)„·ï¡÷ˆÐÈÜ#7¹á½Ö¼.Žz´ôÈ!KPí.™ÒDE¡‘Üf!Ò‚BÎ1–öqî¶­óŽÖ P=½j€±>±L{ìÁÿé0ÿvŒ÷µÀd€p-ŠõOÿ…¿q®ç>^{ço}æÎ•ýÇ$û÷²E?<4´à:kïW:dáð'˜ ~!ÈMïÌ»_‡Üôæá¿r°¯æõ¿tf³r!"€GW t ´0‘Á1„|Ênp@q¸äýo†±|ʡ̌lé²ó 4†ýoh¤¥qa]" kðˆåbNŠÈæy¿Ž‹!!E ºS›2wSˆ+­÷M×|º´ÎͶyÌeÐ)[èÁƒçh>kôj•€˜‰˜±U4 °þ¦ HM œúò’É(¦4@£ç\„ÓâµõìXÞëÄ3&U{ÜÆÞþR(ØÇecP­ðþ—âºÏ`«u/º¶]–O~eC@SïG5xy>#ÄéÁ]úó@w¿ï«OïY^0zô+·Ð=ÄÝíLtm=zÔ +KAV¿r¶Ý ¬¤kÌÈ­s¸ÞA—=úé›ÉÆe/ßäˆ6ÁÛ?{ùã6ëMxÅœ§¾DJ `CÃ:H åk¡QÖÿŸ½w‹Õ-Ëî»~cÎõ}{ïs©SÕUåê*_Ú]çÖ8¤“ˆ"¥Q‰ð‘°ó„ˆÈq€ˆ‚,$x‰€ $Hyâ! !¢ÄAÆ6J‚‡Äî¸íÄÝînwWUW:—}ù.kÍ9xó¶Ö÷}û\÷9{ïó­o¯ûeÎ5טsÿÿÑÌ™þޣסÕó…ù„ËKýõS{^›½¦ß[d[ßürå¼>ùÏ,ϯœ×±ÞêxGê{öúß¾Û"šÆ-攤:ÿ´Îõ‚_¶2®Hã§ à2&qâø«ÿìÏ?c­ìe/{Ù%¯ýÿ½_\òŸ9aþºÃ ôg˜súa(@V|h¶Ü̃Ùr—§±ä©ŽC,öÛX¨®›iN›#ýsø6ê_›i¶÷¶Yá§ çÌïåþù3Þü݇ôÇ‘õÃHw$ §áTqGb¸U¯„ueC±´q nNÁ­b¦ôO Öw¤õÄdgLºl£¡5¦³òEù$oëtßK2Œ¿ž(é^^i¹ÎÞ¡ÿÜw~óó;žõÃÀp‰CL€ˆQ¡¸¡Ó†%y‚:gŸÄþÀ¡aµÜOsp3!$¤Å¢b’Äø«ÿô?}âªÛË^öòørÙ]³¬Þþ‘#ßéX}<0¬"¯{tPú³ˆaXD†³€Ìá̘dî‹Èp³¹ØüBq ‹šõ§j1NŠ™-W‘Ž1à5…‰'Ps³µËy~4eËrž¼êò´pâ.?nÙž³é„fŸmǶ=w6$mÛ.[æ§?Ç&#“uÛÎ5•G ’/ã úÚËïþ‰Ï>÷sž}Ð#Þÿ±; ‹ÈúÓÀá[¦—†3 zõ‡ÂRøƒŽa‰+Û',•°Œ¸¹”´9%JIuÝÛT<ɉʖÑFªWÆ ˜N,NR“—Vw¼Äçé¿—,{€½\;¹®Ä»ÿp;n}®c}?NÌ-³hPâm Ö?4eÖ6ðó -lëˆÌ@$SC™’Ëž¡âÌ[Ôºþd¸ðj†¹L…Òþ¦C4dhG ÓÅH¶8.HIÿÏïÃJ‘ –Ç>T¶8‡z‹1°áˆKèl¬HÎù†/¥áî %ƒÿš5J‘YDº€uÈïàÞüÈümˆÇDÿ`õ«¸åÀ°‹KÑýåÍ®Y¾¨zÛþkÚVhþŸø¿‹ ¯‡Jùÿ{ÿ³¿q!EÎù—Þýò­kËzò8ßyˆüá{̾o… ¼ ^âÒý1 AO9Šè sZY;›ïÔ¢þ1¯Ñä }:>¤ùâ – Eý£¶Î¢3 ø0/@)¾_00ÄID$¯·ŸWcðXD¥s;¼Zô¿sÎX4§Èôà ˆÈWÑjœ¼|2é!D‹ZÍï±4I™$Ãz‰ý¬çɧ)ÇL¶¿PkºŒæ¥Y-ÓÍÍöê@ÒËëfpÎ;§ZÑ\JbÆrѬ†ƒÿ³E'3dÀßîÅÒÈØ ŠEg öj3×Âg›e¯åÃlçƒÿÙ¸žA5)íº:¸¦mWà¿Ø¤©ÓKÙþ_q‘q»™:Lß—ÀÕ>z¡·y™EOüþ‡È|—Æ(À™Xº¦< w%«ÅÚYÿÖ›˜^XxÓb´”^ƒXŸVú¹<=.xÔÅÊP¢ÿÛù—èþ݈ =ØÔ?’ÀýNæìkÞœ€?i¦ÚÀxN“c@ýZ ¯I`3:UP“ŠAN©úéI¨¿Ûý]Úé|©eÔMnû’kíµ»­x–m}ï‹ì“ÛkîZ_û“Gî>y’-ûŒˆkÐ}½M÷æ¤yÏòA;ôŽê7Ð?³´Ž@»§$=PôÃ#J'Ó{«ýÒ&ðoûî£þ÷²—#×9À àá?[¡¢Üü¾ŽþA@cäæt„¥ÑúwÜÈ¡ào9b¯ø›×^q3¡»a ®nÝ‘ÛgvËYl½iù°KTl°åÜ5ÉÝ|eF€À¯<þl’œ›ûÕ–Çÿ·9LüèßFíßîÖc§ûNe:ÉËÓ(7Ùg:ð‘Çœîºþ^^²¼þŃ abyð++ÄÝÿúadyo`þšc8UV÷ÜÜ1œ)ÃY$¬ÌñI•¤#"bë’©+;¸™TºÿvšÒì jS7eCGëµKªç^]Ä`/×R®+ýÿò“åÇ7Þ³²I'¸C/Ì3u»p þPÐcË÷$ .(ê•Ù-!ôÉËiÀrD F¡âçBL4PF/¬h\g£êiÀ€:ÜÈ›’‡Û|/QNþ·ÏÃJÍÀ9(‚Þˆå¥Gñàp_±üöâª1QHÈÊ5p(à¿–è‰$Ñÿ¨9½ƒï¾7{nÃá]Âá7ÑîçÄŒ³f-;@3¤»˜ºÚÚ´'€Bµ%?¯§îÙê`÷ü(ð›³À—þüO^Hy>ÿ£wxïË·®=ÞãŠF¤³‡+³:0“„{êJŒ {îAÒû¿ö怙%êÐ(0‹èÊ™Iö0X €Áï-2ÑÿçÈH‚EEf¦kˆÞ@(#jd‰¾ÿ1ƒý øÍd´Ê1Á%J¬ ŒZç/)ø/)’ ’;«Sr¤aL´ƒéÀì'Ìß‚ÄߤšÜ›ãÉ Ù2S!OÿI»½¢ëq 0ÕÞ9?¢q¸Ä‘XRˆÛ0Æ(²@æ@SßhõYÁ¹ZßÛZ׸ìBû¿mçæÈžPjG€éþçFÿ_¾¶ÿ´’Ûû¥LSðë©Î íaÿ„ÚÆ­¸JqD†ßôÝg¼êõ‘îá äí%ÜN”¸òp3¢ ,<ªz¨È¢ƒµ ³:—m€Û}rj“âÜFpð?§¨ì72ät6Xª€ìàVÄÒŒØÒñȈ!`”@dY!Û»ªžÈV›ÍãöÔCdý8øxo£o¬ ÿô›ÿSêïiÊ×…%ЏqJ¶\ÿŠH­ÚW65¢Éü žá¾ÞŠZ75ßBíiYe¼ãDÿÛk߸dG€ÌP¢ÿÖHëíΦ¥u:hGaùý¿¿›Ó½ìe//×þñÑÀWÿò]Þù·è뇹NbI窪麊f·bIó[ÇL]¦š@þ1øUS0Jñº èß¿¶Ùx¯øuIä¼ÚÙV£í|ܲÏÀožÂØ2?}zí¹£K1·´ëÚåÍߦØå0þn¹Öyé¾£½DrÑÿ‹>ü;§ÜúÁ œ}h¸×ðϰˆ„…"]HÌ&јM–¦ ]a•‚ZE µˆýÁð+RÊI÷)ÆfÝ2XŸ§ãÚeØýV^!¹~Hé^^i¹®Þ¡wa;?‡ÕýÀúA ;r¬ïÛÑ ý‰ ý¡0œDÖ'–7%Um°7œEÄ%ª”¤0¥úíF¥ £2, ü Å¿lw¹ËW¬ûŸ*ËÇQœ©H“aÀ…€º`¬3Ë)*AÐÁƒí°¼õé¢@³ÚØÌU5âê¬|>ÚEÄG˜fd²"Æ5{ks ˆV§Br¢ð²ép‘E(3“èÿ2߆K>êÛõè6ðÿ|°?/ÿÎ?÷\hYßýòMÞýò­k«ãžIT~é&òÆ@X÷€ =д·÷ÛE[×W#£® É€¸Ä@|ºvFwL0§€Ä…§½é!ÂZ ÐOü Àh÷T¶'C’AS‹òŒDM_P ÇŽ©áf¨Â€Aˆˆ ‘Øž.Ž•HÄ‹EqЦ÷Q£95]RÉÝÅÔÀ]¾à/B¢® qÎQ¯ZÛ}vŸa:ç>Z&'€Ô&ƒO$ ¼qì w;nz®|íÛOqˆ±”-¹kýëƒ0×‰Æ ®ìRíäyÇ-Å–ñbþ/í)Æö jmš:(N­#€£Í©]Þ’Q¶/dkm&”v:ݺ³E¤v~Ý) ÛCŠÃI~žR§e¿ìŠÒÿÐÞ ‹¬fptjŽlÁX=˜EsŠrf +1ç6‘¥CÅœX;Xy8 è`NmÒ;X x½9Ÿå1°¢ÖŸå”819°….9$€äìf´ÿ®Î&c»AãÆ˜q²S@jÙMC·ò'ŠƒéQ"ÿ3 ÍöHým€ÿd[£“Ê|{µ+òÝ¿ïÚ1IÞRÞÓ}jžò(íˆcRoi¸¯·Q½MÛµ~òžþEdü΢ý5VêÿFwd]r^Å–+J¹›¢Ì!wsÌò?þêŸ{œÛË^öòŒòþ]ïô†÷y‰› ~.¬ïú³`´ýsG\Ãpf´Õý©ZÚVoѰa2ƒ°„°PcpÅæ‘J{-a•ºžå¯-wdã݆m»éi´m^~ŸuùäIÀÿ)@¿ ¼Ÿþ¦Ér0fØv/­±DΙŸ‚ÿ»¶KóÓ-û¶Ó©\ò+$ŸÿÑ;h»ºxûGnpôŽ7l ¸õƒFñ–¦CJk­k%ô‰ÞÐâU–{ˆ}Lé«IPbO*•°‚s=¸-µu£ Û”(#çØtx‘øÖSÈÞ`/×J®#ýÿ'?–(û…{_]¡ÁûÅ'k†ÓhŽ¡·âUòQeý0¥õ ÉóS!CŠ`è4Qáƒ85,yFµ?É °Q„-õÓ¶_û½­­ò{Šñôg?k…EŠþw™ ¸Û¹ÝY¾ú“x†9@x s EŒ5€¨ÑÊ”±ŽK#™+:<±g˜z±˜z;Á+:SÜA€YYBÿ„õg@߆p‚ž~xº0ãòP,_/© ;¨ÿÓ¶œ[ÖRȸ‰îLN=ü_øÿ»~â=ðޏOŽ˜ý ÷q·ñXˆkAnt)ö~+hp9(ô }¢üï-W¸´_~ï]Šö—&ê?’ö1€ßœˆ‚Æ1Y¢!Ó|ŽüW‡¥¨”ç…Ö”m)m@¦ÖaØ yÙæÄ5QÝ—UòÝZ\M³^‘”Ê ­Ë€B›B%9@l©yþÂÊ#uv²)“ÛíÍój¿“Љ‘‘¼¡½](–iâ€%¶1ð?< Ï‹9“䄎:îßj®Ç]å›®”QmŒ üìe¤iÿ³@NuášT­£@ë ðeÔ¬Ú…m6”ÝÇJlk«/ :ÏF³å ì|cûONsÁ¤]€PBí}^üž¯=k!®ÿä ô_ºo¹9u:ôÔÃi³€žvp6Ctå‘•Gg!Eý;¤Ÿ[J›Á"û @HËÁ%êÿ<‹îOËNý(€ÓùïKJ€Ò—¥yÓÃ9¥‡éôìU%ëû”šMnSÐÿåQõÖŸ£ž×.uÙûãFoíSó4síÿ|LîŸÛ8)ãöõÆÎzKó®y*Ðnÿ§ú_d—#eY¬nÚ1MÒ [J&Ô[¿§µOÊã•=ð¿—½¼h¹ŽöÝ,~uÅ·ê„÷þÐ-ü‘0œŽù뎸VÜ‘£»i`¾;t€­M“‰³kÌM7i0ºkñ¶Þu s‹þ—.`A,"6Ù2ÚhØ€9нwgº×IW4Ò­íÂËø\¹¼r^MLAûé¶©%} ô‡É¾yŸ,Sð¿=Wîˆ[Bc”(Ûdò;/[¶µçn§{¹ärø¶ç‹ú­ç~ÞÅGßüëx÷Ë7mì•nŽ&˜"šŠMMyÒ€;¦ FÒwŠ1¡ôP üjƒ\{6ÓšLç›k>+À%Ô}{€½\y÷Ë7¯ýÿñ¯¯¹ÿËKnüÀŒÅÇ‹zº›$–ʰPbo –yyÆÆÊèŸÌ*SCQ© r” Å´xBMéüA‹Rä*¹”f»¦SäVDÞ{÷ÆïU⃀¿{—xæÍÀr€!Ñ[g³ÂÒäè]ÍF1y:€M5uL©Â^`Ô|¾~¹ZŠâGºh´ÿwSÛ7Cx}øÀß„õ ½÷)z¿G33<7Æœ—:”Ót/ #êø¯ŒÆàT·¹ÏŽßïø³?õŠõÁÏžìΓU‡žtÄãðqG¸ë‘£`ºìÔ¡¢Ä…@èÌXxfß ŠmÇ)¬œEþw±ÿêb¡ùG3=rI¼Í»hQ‘ÁU€$ú„T0¤+ ¿ÃA“G¸Ó®F8Oò ;—Psߣ®ŒvdðxüMwI¥$w“iä$J†õQIpifì('®õQ:€rÉ‹°HLèÖÈßXêŸY”ín4¹(•|×”h¶’S¸¡ÃÍen£¨sÍ$Wr´$yg¾ˆ”@ 2$Q)×Ù0â5Œÿ¤Ýžõ–LŽ?SÄY*©_U"âþިý3͸Å5À¿€ÿâø £PóX1}Ý¥w¾ºØþyìD^û¯^{o£±[ó^ÿ•_ùO}¢Ë+µIíe/WD®kzW0ðëkí>oÿÈ~.,¾;°úd0e}? NÀQè¯ý˜79dæÖ8Äjç-6ÞdçH ?…{ôŸä¼nÁÿ­¹¯üÚK+Ûjg\¨“ù©1'‡çM÷iÏÑÿÓkÕa㮚æsm˺lT˜î³ëT…çÝ%û>ê’ÉE±°¬>øÞ?t›Ãwáx ™:T#Î+îPp·~ï?âП ëäà‘9Ì +XT ¸SU´œ+{š=±=O‚ €Ñà óà·“.H” þkÄu Š; ÈkîÎ;pô®Ý—»¬>„ûßDÏ"ú8u°ÂüM3õÿ‹6n>õAÓ¦ÿÀÿ-“hÿîÏüô‹-ß^Kîý¯‡ð”™SäfÀiDWR>„e┸–„u&¯Ï¤àô¤ƒy´wü´« .‚,gF…¼îugy”S.d£ANóCgyŽP’©‘¥æˆ 1ÑÙWð2ƒ }^ŽÕ À“©”=Þ9¼tæPà<^xSZ«ð>5d‡Êijžúüs»)- ÅÕñH>Û¾ÞÒ€f]s”dFÌy1#y•NµŸdG«µñv~ï¡<ƒZCçu¬eXÕ”³>ë¿ò+ÿñ#K~ÉeþïåJÊu€øðoŸðÆï8äÆ{g ,¿ˆKåìà ˆ‡aRlJ>l7ƒaaù®ÝbNéꥀ‰Ç¢ûC1õíè¢Nw2¶nƒª§"çl{uäQ¥ß¶} úÃÄÏë›àžßåÐ^o›c@ÛO?LwEøoÛÞ®ŸvñÛνKö}Ô%“׿xÀûìbŽ¿¾föšã`pÀ:dì †“ÁÒ¬•¸R†eu|Šëh˜WŸS4Á®}b¾0¿uˆJŽP™ý$ëE²ŽLoÒVšÿmoÔy:ò’ÊÞ`/×F®ÛñÓ´àsÿúk}¶c}NîÐ1œúÓˆóÂú$ÐGº–%ÓBå`fÐuV„môã0bÐÊ0ñzÚåUrHµƒÊÉ0dg~” P–ëïþpü-b ¨DÒõíŽ=à)rëmdxín¢GkÜúôø>‘LûmÀýˆ¨…'A†€;X#¯Ûø(>è:/€ ÀÌ)© 1&»Šâ|„CEÞx¹õÛp¼"('™Cÿ+èÉñÌÁR`ݳOSšé‹’ þ§iþ·PÿgzÿÒ&¸¿ôÿ-?þ½Ø²ì~öôeßÂ¥–ø=§twr#âTQu¸7#²÷šƒ™—‚,¼Oé¼ôǽ՛ápm,âÔÒ¬¼Qä-=*kt푵G»ˆöé]r$é;36&ÊäÂ~Q=.æ|È>€3€$–±¨H'–øÌ ŽÎÍ š<ÎyÆ´è =zÓ*¨v™¤°§@1~›Vʉ¤®)Ñ`‚4M^Ý&r®¬c è!N£¸l_Άé "å»`TæÖhN³Úó•:ÓaH®3»F.b%›HrÐô}“:êæ‘k¦‰:lÑlJížW ´Æó) ¶M[Kà ø¿ ø-—ª|Ym}Ê쩳›¹ö>¦™™Z}åʹX}áÃçVš«.³ïÞañé zæ™ßb8¨ø7 G‚eøXyûuѦ½7}±˜¡N‘>Qû'&I,6¨Ã ‰Î?õa™ÅFr?–™mrV¢úÓ~X—õxµOf¦5Ì jóÑÔ7¤¶Ÿ•Ùe¡þžÿužÑ¾Wü¯’ë öÈûÔç¼~hßG]Bùâ?ꀯýµûÜÿ•%ßó#7øðú4ào:úûØ+2†³Èpqs1¨³ˆË,(}“Ú¤e8i™N ŵýµn+™`ó¼T'…€3/Ãøí:Û:ïI²wØËµw¿|óeßÂs•oýäCðƒ_]±ú40{Í™'ÔYÄ aeQa­¬¾«„úã ®,E€t–ß:¬lWæ)¶.+ ó RóM)¸4Ÿ˜6(P´N7†$/{°XßGtˆH” jô§3Eï}a8Ef:ÙûH÷.rp›x‰7o‚ûUèïA-7ê:õü' ¥²¥æÑbѬùŒ£û¡Þ ~허ߨ¶c¬ ”|ûÏш ÆÓzÜxßCôM GÄá„¿.ȣЉ‚v\b.xÁöq““ÔÏ¡þ‡ÀŸÙŠAZ…ú÷þö‹-Ä^žIäãü‘Opoõèpwâ©×9 Ä31€.Oñ ˜.Œê_‡,¬ÑÙ¼æJÖÞR²˜³ÜÖ@-2ŠJDb6î2¢'†@ Å!RþSWþr”¤Cõx5ðsÐ5ÎuükGç|b°È/uv5Þ5¾¤„b¡0ƒo‚Ûr0«Kðn@–Q]'I À ÍSùÄ íÅ“w\›÷üÏ÷– ÕÅIª-×ø—èV9"7Ý[l»ŸŒä>(-gôÀáˆÉO0`Ý)23Å–?I CŽJÌÆözeËŨ:F3Õ ßÔÕðß:Œ£ý]Ûò± ¨Ïœ”hŠ®Tž"%Ï3Êž:[Æ# (7iiŽ«åƒ@”¦?P‡7Ž÷tŸ¾ÆìçÞ¤ÿâw8[Ì}\Ñu¥X9ðFïÏÚCHó}ŠL²ôFõßwHïÑ.PcbŠØ×ì´&¸Ø NÍAÀàýêÌÖþ,Mu°géªN@ðÒÞ¨úÛvËoE6¶d=”Fw/˜ú›F_e½–ÍÑQ­Ž‚+þÓ(—\çéMÕæmáYRó ñ)ûÝ'/Œl]žöÕÖôåiq£´0w£¼R÷Û€ÏϱޮJJ£²µÔ›lÖ[Ó=Ö~qÜOæ³m:´uP]Uls}ÿeR5ç:.J]÷—¾ú=f=]*)µÓL÷²—++×;›å샞սÏýÑÛt‡Âú~`þºcöš#¬¢tõ±P\koöÞ’òuPtðhÀ¶—(×è´ ð˜rW3ÝðÒñüÔÖ»3,Í2[¦Óùë)*á.(pjIŸNÖõÊvÈÆNíu¤™ºf¾ù0-óÓÈþé6ÙزÏTöýÒ“ÏÿèÞøáà 9÷ì¶ãù&‡ïvÈ ðpð¦§ÿŒc8ø#)ÿ¦cI2Nw’tcŠø/:0*’ƒ@ '”:èA‰Í 4CRØÔƒWAçíör-äý½>Þ¡÷~i‰Fåð­ŽÕý@ÿ0W‘õ=S€ýqÀ-“B\F¤“”À@7“J}²ŒÅkTצ QSЦì²"PâºQ~9-@zƃ=Š}--L ñ"-ÓÄãÿ’0|D<ý:,ÖäFDâ p z&ÄnÀÅï ·^CŽ~§Ÿ…ù›pøn0oÜÅ>@ŠXÓ†Ù ýÎ~ ñõ¯Yã“Qö‰Qœ“õ)*„€¥wÐ9`nÑý}€nn€OŠ˜'« ;D­»pQ€_ï!ŠÇCb»ïmlŸÿ“÷ÅÝï3Ƚ_\^Øì*‹|z„.Ï ôÔ:âÄ+œ8ªCæVBXzd–¼E—ɸx3àŸƒhï÷ÒÃaŽ tæöâø]0‡ ¬=Ò‹ž<: HHÑÿÈQ“`F_õ%jÒ%€%Gþ##€z|ŽøOÑÐwí_R8œ›°àÆï¦¾xPôñ¥é,rt]zOGÞúÿ–ÌpžEj™Ïu ‚MÒü?”˜Å›b4Û<ž YÓ=KŽÆ_ÎìN+šÏëÒã8)ÞÈÙY¢}Þùš ¿iÿAÕœO@q’õ`d«É€^Lë”5ìêþd\—ùÞ t°Í îW CȬ\°åXh¯YÛ¹êæó»èw µ¬ì©³¡D}¶ 4uÁ´ #Ò~ªÊòý=øßÊý¿«„ßó äûœÜ?Cg3tÍ`qÚK@øZŒÕ¦Stƒ˜#@o}–ôÎèÿ‡„.M£ö'±d&c0F›Ü§e€Ìj–ÇQ$­+ŽÚ€éI§HI*…@ÈzÜd- È—ß©J¿Þ¨Û¥ÕSùŒiZ–eJÊd¾Ó8Øâeís%–Iê%먌Ø>ijõÃQÓ´yz\œ›è«­ͳjžyî§7Øf'ÜCÎcŸÒò”.2×[>ïõLiôxõ–û7ª·r¥Ò—NœëÒˆ$ßK雞Wiœµè•ú™¨Ó’®÷—¾úgžª¶^²´ýª*½ìe«\'ûn–ÅG?ûG¿É÷ý‘[t7§›ë‘°øîÀpqÞì±ýYÀu’(¯ö°TÂ*6ÛÀͨØ­3@Å ØŸs['¹D¿Bµõ¦yh¶íå±Ùgzlû´¶-·Ÿ^nËúöç&ûn|¢=bÝTÕ?íû¯K&‡o{Þÿ±‹ÑÁgôÜøÞxÅÏáð­ŽÙmGX+®“ìªàí0ª9}ËÌØQÂ:B¡‡°Vü Î¾uÕ)êÅ\gf¯j)\ƒMI˜hž$§HºRZ7›ìÞ¶Œ‰M—á1¦ìX~A²wØË•—÷ýµÆÎ>è «È[_:*ýGoyÂÊæØP©È× )…]§îßJýϸmæýðOþß/ä>Ÿ‡,>xãeßÄ%÷׉'‘x*Ì?}½ëÐ['8#+ˆ+§¸• k1Ç&§¦A{1šÿA ÔÒülY‚KƒEA¢Í‹fðC ¡YGC’³:\ú†²W$Gú â\5oŠ–¤;²beDqœ°’4Ó~CîBj_¾´iÚû­Ñò21’ogR4zÒ=Ùœ 횘ª€™Ø«a~¬ÓÇ÷ó¨BŒ(ço æÒ®kÑôoí,eÍ­IºO«¯X¯©™T[ÊÎÙØÝFè—;q–&cœÑd,W‰læ×ÎõÔäØE’£×yu2‚ 곜ÖA8j;ÏNcÁ•ýëóMERiƒæÉs|‹ãHã‹çrÙ÷ÔÙµ•7Ï2Í×ê~Ò¬_F8ýÒ?}ž…ºÒÒݽÍú_ù&ä·Y ¬SÛY 2àmŒ¶vè H48d4:k6Œ¹\QP—„ÿ½Crÿ§u>§(Žnš€ý‰S@Ù&9mÀÄ ±˜~³õèÓ ’ª¤,YL¬7i(ZÚÖó¡þÁž:½‚¡ÍR:×åìs%Ï35Ov¸3=Õ¤ëá¢ÁëRšñ–]Ë­Æ’vP×7ë&ŽMþgkº€?qb,<[ov|íÈÏ­· ©Çç_om¿?Ý^—Ç×n&Ô·ýQó†ö­|ŽÖQ±M°û½ü~ù?|tÕ\n¹šJg/{Ù!×ɾÛÊý¯.ù½á³½Ó±~˜Ý‘cXD†3ÅÍÀ¿ ÈlNXÂÒ"üà°}OcúRÂ2} :ŠýX:Jê×%Kb €C@a  æÇÎvÞ mϽþr^©ÏƒüZ _šy=g^;èd~úTv 䜜Ï0=~zÎmò¨þiß]Bùíú-ŽÞ¹¸øä=ÃYàæ÷ÏX?¬Ff7ÍN;¬"~î FÂì3ޏBŠþï•pd¯¡‹ÈÎ0±UDaX€.#îÐfã \çL7öÛ@L_‘¦W‹îËÁ± +@«ÿvFý_ý·wØË•—w¿|ëeßÂs‘ÅG~u…õ—Ÿô¨R¢û!,lè„8¨þ)ŠJ>”L‰bó }ä™Q&öŠöfô›Ò@hŸúÍÁÞ†gè%QzÞ†cdx«bXÁÜ!·3þÖ—7¿‚ÞýñÁ?\E†g¼Õ‡D  z†Ä%RÍFë­¸‚1=•8Àwè™~c@c—XžKUF1ð߹Ď‘¦É¨[“ÐÅ9­ÙÓèŒ3r:)¬"Ò$0ZE!:lH÷?¡™-4©)Û"¥Gž/À!ðlß糤H:Z ÆQ)ZH†,"¬q(”üI‹ïrxÔ-Wc·IÁÅ·Em9Ò>øÏ@¶ÈøSÝ5Ñ~¥¬J,~Zê¤Pg·Ú”J‘çBD€ˆ$VÐR?ŠVG©Në 0*ðcT’ÛŠ”ÀQ}L^*Ø_÷ݸ`®²òze°|BÅŸçÒ³mA€ s(.Š:ûU €žÊòýžc¹®¶ÈºƒSE3™O=Azè=ºrˆ‹hðè¢CÚ;£ÿ_uÄY@‚·u^!XŠYwö^Ep«*Šë=n˜¡ÞŽsÁ#Ñú"=.tDqÑXk\ôˆ:¼v)…M‡ÃÒÕXŸz¹ÎœßÄ7mǼ—nœ ·k-sé×Ñö8§u2y%tò~ŒZ·L×IÑ/e]ã¨UÞãÉy®*ð¿UL!Q´Îc¤æi«X’ž/5Ïs×aÍ׈ŒuÖØA¯ê Ðz‹Ú¸/—F‡”ÙÕÛdtðdõ6q¨=õ“ÖåTß?ïzs£R–êj{‹s^ŸMvŸ|¤¦1AZn†)Ù!`,µ^þâ?ùQ'—ZZ€g/{¹vr]ì»­|ô÷N‘ßîX?Œô#îб~èO#2ÖwmÞ ñdØŒöo(°C“Â5®Í&ì:ûHŠËœ€ þgêëÖD¼¢ÐÄŒ¾M¦ë¶Ú~¯øõœå¼RŸWK­uÝ>ÌëdëÐî»ÍQ`—Ùuô6Ù6Í7붬?Ï@Ÿw:¿Kö}Õ’w¿|“÷.H?üµÿýSÄ Ç_[³øh°ïÏN͹ɺøGÄKÑ{Æt’uY£ßR€ë4ÕIÆ:FNM-®Õ¼mE·5oéHßMç·-_Ù;ìåÊËEQ“¼h¹û dþHX~<9ÄÞøÙ“ ˆ]U‘o0ÿßн»Fׂ»= ? hbEѵ iÖದHIíëÞ%5&€A‘†çL‡F’qÙÓhí/‚9$c¤R"U´:4_.å\v™  ÌåeoÉÄ'€4§ hŒÅ)»Áþ'7_Åz±Õj”ÙÎPŒè@Š®«' ã)¤$Ù€ÞRé6GPZÙmc-ÆöÖø¾Å@>¦ ¦<»À–ÙÊõE¿u ìj4þØJej ú³GV¹£ À’jÁ‰9hâ49  |Ð’S{ ·=â9æ;’fªMÙ'QôŸ åHSš@—æžÆ¹Äe죔òg„`ôäóó{æ>«\å¹QggðçU¥€^?&|æä9•ëêËìã;Á+ë‡z,È T  >ZÕΰT7n@»ˆD³n¨à¼µ¯.€8¢ïSG< õÌI J4§7Áذh—Iý$€3¥ ±ü7‹&Gù‡ìà–}l¤ÈíÁ•¶Ÿ×˜T3¨Ú¶dzP7]µíKÓ&›Ö/GÚÜuÿ[]’û±sœòêQc û‰SóäØ*—\;=„á\|@\~Ë{h¿„•1$8ý úà×Ó3ôµ¨`ïm$AÖ+X~H<œ{€‹3”pöëpüôÖÌr¨ö¬½uþÆ2"ǿ葑ƌ…$ÀÈGxë¾÷BÿýäïZžâfè\ÕÚ@!¯0³›–˜Œlª”ºè²ô½/À™fð_…Ïþ[?Áw°—Ë îÛ¯1ü}%þ¶cºåÃw;â%Þ9t%Ä5èJ¬½®1Zd$§ébrìèÚ‹½çÅ Ù&`O¿”‹Jמœ8™½ç‹ùQb£’Y»˜Á×3'’ÜUIì"19D§–½ÝiÄáÑü-V¿éAªy»¼„iv®Õ-sÓÍÓ-Ó—º¼›}ž&ªzD9,Ò`ʘ L¨Í+‰ Z1ø?Eÿ‹Y5&NczK/mgiÝmMažÉRNa í~[ äiãx¹LõèJ·\ ÷%¯@$6@LîÃNVAMíQóµI†£â`@2ÚǤ;“ÀFô¿UdÖó9äú؆œŒ¶eã¿€d°©ÏR¤Ü¦ÓCÕì+`H¾¶¦âåZÌ-"˜NÜÔý³8¥±1P¿2Ù}ÃhS©ú]^×Pû;|rbK4þšÒÙ·Û¶údÝdÚÌK»/T)Œþ˸_1it¶Ëù JýÈcRW©úxãUáçº^ÀÿX—Õ²jé‹itV:"é´ç˜š']óKRþçó;×¶·ZÞ¢§`¬³Šî§¨™ê6—êÆ¥"§î51öŒëmäÌx‰S•ÿò¬õæêþ£zkŽÝ¢ûy»;œÚÿw_ùñÇ+ûå–]/ÃõR>{ÙK’ëbßÍröAÏ⣞î¦0œEbo¯tÿ0¢+Óíë{‘°Î)^c‰î×Þ˜au€8ÄÂòªásZ×LíŸÁ®Lí¯Zƒ»Ы¥÷Ÿ¦um??·Ú–¯ùiä¼Ò·µµk¾]×n›Òþçýš¨­kU3Bi¶e™‚ü»Àýé6¯±m~ß]ùíêÍ Ó¿‹ |öË7™ßñ¸¹éÄL×VÆxÖ–úÚÍóIúµó±aD‘Îôaì),Ø:Y_¦¡q ŠuÍ‹—aŒ†ekº¸zïúô¬{y%åý?võ½C?ýG ^ÿ‡Üúü$¦øí\}Ópf ÅjHÁì ÕkÍé”éÿC;8l<¦ò´äyjça# À¶ÜOL#¼TåèVßF×ǰ|ˆ.èj@ƒƒ…#è)º=í TR1„^ÐEDy€„røhÄzº@O˜uø·]zX}ðiƒ4ˆ<ýpg[4î‹0$¦g&2éÙœC–}øm„¸#˜½ ó7­@N`ý!2;†™BL‘|Âzº .ÆlX¯;»\ŽüO`ágÿøõÿïýâòeßÂ¥“{?-øßî{áÁ€ î(N…x&6Ïý IDAT<â©CŽ"ñÄO=2h'è"Ó ;E¢9ø³€Ê[*‚+@ð.Í[>äœ ÆbFŸ’¹‚'Š ²Â©1¬## tõêÍá¦@Áí´R³«ÆòuèÅ'Chu6¨Ç'Q6×dËÚɪzÖjtnM¯Oî PáK›°¤ÿ¢RòÃgàßjÕ"M­Ã2#¼ÕM=}vH U28œ‹z>ld€‚Ö> ì'£²V£y3_>ÕµÓÜCµPÁ¼¬\=X%EƒÛ±$“äRƒq·œ¯­©FE,¢\¼µ¹Ä š"E&©Ê}•z7ŠRZiaÜz­';Àeg¥(õ²LÖ'Ëm:ŽfÝÈnƒ„­õVþ.yJ£¶ÞªÎ²z{Tôë4ÖÞÃÓH~ÿÛ_úSO}ŽK&×À̼—½<\ûn–ÅG_ù Ÿpû 3ŽÞÑŸDúã€?†ÓHñR¨þ¥3&€°ˆ‰­sè“}·¹2à°H×­‘®´×ÛÀ­½ÆÙ&Û¬š»jjZ“ítÛº 7J³¼íüÛÎÓÞÛ.Ëkc8Øøm‹ôŸ d6~S‘óçí·—K.¯ñàBõïâ£w~ÿ ˆ°ø°g8³Ô“<„á,ÒŸ˜>ìS*€îÈÂÚš~XD†¥¥:ÉX™xˆ'¶ë,`6®AºdCÁœ¬¢€x Çý“T(c{i#×DGîöreåðmå)±}ÍêþÀüŽÙma8S4DÜ-gFýÙM‡¿a¿¸z5þ5?F£V5cqXà/3±õ4fcx’lxõ–b`ôO»µõ6ÓYkS¯+¨]ý P”«¯ý>âñwaE\­aˆ½UŒœ5Ðç ‹Š”AÐ5(Q…¸F»:£ùŽkÐ…ÃÝòh|ÍŒîÎ'Úûü{Ì›ÜöOGkzìØïy“a*¢xçR Gø´ÇûˆÞ:@æïáæ¿å ¼ QÎG‡0ü: 'u˜º2C®ŽÜ†/~¬7Ÿ,—3r´×;üÿ½ðk¾LY~^ö-\*‘nÑ}érzwNüæŒè2à¯>ñ ÅzÀ9€^í¦ÿŸ!½álfë¼â³â$`Ñ”õÁF’üO€HšVð?{]Oìù{+Ó“²Ñæ¯.+@».í</kddI«†Ñ7}”¢ÞÔþÏ“b½FJpë©2áª)qåkÙ~šxCùŽm¿¥ë9­kê¨íãZ;ô6ãy2Pk¢êÞ­![h*G곬L -¼Õ<£V 3âphb5(`ƒæ:q 4§BhÀ€lÀ׿s¿-97Â䮲#Å µ–܆2¸°UdR’ hämRžC ^Š]žv3s4r»i6 &2ªáZÓõZM#˧/ÏÿYØšP6þ4ËåÔc‘ú^¿ŠЧ{€"òÞú`Fw'¥´YÎáµ³Î:¸¯°8€#7øÅ:¬­Ìq c°1qJ13Ìš¾lž×<2Õ‘-›éû5õa¦¡›~.-“[R}æY/U}Em À†Ã$‘tž®6ïó¦J¯ÒêùvœßùÆQNFŒGéS}p©p.›”®-3n•õ[@\(ýœhLz϶+ͧPv,é_ÙšgCvkÈd}mkÍY5³¤–7rXÊårü—º<Õe¥.Õ¿­ÞÎeÈ×^vJ£]õ¶Éjt~½¶ô¥m»Í'”kúÃãYN®—’ÙË^¹öÝ,‹>ù…ßÿ¯Ý¦»áX~:àæž›ßÛ¥cˆ½ZtïÒ²4óJRìÙšÖ Š’¿kl°yÚ€¯ ÐõXŽ0ÖF×üzÙV Û¶ï:f×ñÙ@‘mtdóÓŸLæ‹ÅaË´ý=nÄÿ¶ã[ÙýÁ¶)û¾êŠÉïþ‰Ï^ع ü½?ùmßö|öÞdu/°ú$pðWOÄAX¥¨þ9æÜ4h‰ÜM3vlXO” \k½ÿ”ñ¤1u™ä7M&ËS¹bºqï°—++ï^ñÁáý_^rüõ57¾fž £{*Ô'+›ïÆD…bÞN™ú)uP4y‡–)–GjH‘ÿ‰"ªLw § ±†À¥Sp«_ü­èñ}±h¯ì  êH˜ÚiõòBSo §–wPèœÚ±=è: ëH\ÿËã}QæFß/ kŒ}•6“ÆÒU;“b(Æ‘F´Æ¢:- [áy|ã(I7§‚q˜y«”E„[¯£Gï#ßën`9Êר‡ '°\@´ä‰®mÊpÁrxØðÚ¿ù/þb—@ ׊ïYÄ}x wçîÍx‘ï˜ß0Ðß­…¸] šèþuíˆHoëzA±èþ´N£˜CÀLJÔ¿ºh”É™) ÿ–Ë:ƒtФ¼5+úšs©(c2üšAØÖŒ¡ Ÿ¸ò?ƒ,Ìðâqé×cíêù}lÁ‘1à?+n;•|c¾`Šõz%m@" Ðï&û[2ûŽŽü/éò|2’˸̭ÀT'oÓaft—²}‘V@ )×D¤\§Ý©ñíMT`DS™rJ©à1̧3¤Â˜€« ·€ÄÔùˆ£ÜBûjè|:NK¶€üÜÚº«mhZ]cç„Æ×k6uWjoòA¥ù,Z—*åL§RƒZM9·Ž¦)¿òM{­Åoœ[rZ„ÇëÌž„:{OÝ‚@­Æ«çX~~ýߊÿîkðö1Ùò5ô ºœyT;xm ËÄl󺱈SâëKXu°ìˆ·Vò/gÙ¿žáÖê#Òw¸õ õ7Ìpý uk\˜á‡9¡KóÑÝ€sž(!±˜“VN øÚwIf¸iÚyÓœøÇ«ˆVuí þ÷ju¾‚ý:ÙKÆËéC¨¾ÿ2ÑymÿVÏñ4©p.›´º¬MÍCâÝi}Úèu­O·ÔNƒô×OœÜe=–žG£Â êï¼Tç¶iµ-m@ÚýÆ vŒ€jª®rbm™Ò~=6°mÞœ \ýr®óX_sÙS=N½m‚ÿÛë­¼ó­óÄø'«:ì~g®È¿K.™•e/{yñrÕí»­œ}§çð{<7ÞíŠ;J‘þËÈìH+‹beÑ¥Ãy%EŽÀ¢‘ñŠ Õ"c¥Ä^A‘!Ùƒ-kW켂-vÞ­l¯[r`·¿´ÔùÑt:ÞºË/ºë]%ÖŠnÙ6¥ùOµ_ö›:ÀØI`zi§)Í´ýms YßšWÚ}Ûé¶ël“«9ø}Åå"©ÿVŸüÈ_|—£÷ºÂx=,óõRV†y9/ ËȰˆ¸¹±cÇUJ"–2 ,#â„á4€Ð8K%&”ûÊN;˜¯7¤š·P'oãH¦uÍGÏ•=’°—++ïÿØÕ¥‡Z|4ðà«+ü !œDŸ „•â`ý ÿpVñB\)ë{áLq—íoQüJX‘¼¦"q…Ñ_¯Œ&J:JÚ<˜µaÒ;'奆™"sŒƒY.É`//ížæéÕ@»ÁÙ 7#<Qqà’JÓv06¢ ^Q_ æ h¯èIQ¢Î (wÒX%eãL>wS#œ…tÍóÆFù¸é°îy8¤Î,ßk1Äy¬]yük·áÖgÙëà€q†Ä;H84Æb6÷ò‡{¯ èßʽ¯,9zçú|?­ÈÝÜÿ3øM‡¸[¾q@|èà ØæÑY00ˆûèO^ñFß.Gñ§H~Ëœs"§u)ê‘(5ïq^—sá6Óœ•sš3^/Ùp>Z[ó(›ù4ƒüb@¿¸d®Ò”šM루èH*Ä!éôV%eÍ®ãK&˾EÙçýó3¬õ6ˆ ˆQ®iý1ŒÀÖréX/žûÆrÆIÙ˳"a #Á®z*`Gªïrí”gMr9µ^³D´Ó€ùJèÈ×Í÷¶þOî»”-­™”µ¥ ·MM½ç›Â¢ð4l£°üI{ èßC–“}ôÿHÜÙ™Gäžåâ>Ì=ÌzKÐ¥³ôLkkÓ£z–X=—–ißÌxÓ;è®÷–ú¦ 0xdpe*Á#½7‡àqÁRHp–@=.:c H)nD¡‹‡–=³$–›fG€iÙ8ŒúÊHnahAI@Ä€×±Šhú°²L£×ìÿè/ÝØ¨sI=k}çÚ÷çê;¤fgŒ9ÌVW“÷tBÓC7½Oûí¢m_‘Õµ=¿Ö o¯C]kÛÖ™V—ɨîǺk22‡kk -·:¬u è±mwWnå’§4zâzÛ¢ëÛz+Ž[tÿîèÿÝïÇ5ÿŸÕBrÉ^öòØr•í»­|üóg §ïÍ8ûžÕýñ¾X?¸™\aaö´8ÀpŠ.Î*&jy²¤ä¾Æƒ®ÕØE‰Ëô ˜°˜S0þ¸µ K¹Ü&ܼ—V¦52±ú–Ú“f}dSÚõSkûônrŽLÙ?µK³,Í~yžÉö鯕mëÚm{¹FrÑÔÿßú›Ç¼ûoÚÑ+Ø8ÐÏ„p³Þ×B"ÝŽqP¼ƒÐI¢öW¸nfº°»iës Ѧ£ƒšîaÄnuß”! Ñ•NQ0~;¯ ~Ü;ìåJÊë_<¸²‘°‹î}eÉüuÇü3žaénó×=Ã"ÐÝöø,âÿ@èzGX*΃?º[6ð‹^qó4ŒÀ´Wœè°4ÛµöX®ö`óÛ"ÿ©à.‘œþÌç@Ì ";+hˆÎ"v#)_7É1 ó$ð§˜ýò`8˜ƒ’)’“—dP˜yÔ â] Ì€Ì7ÂÄR“®k;›ñ#[µJJÚmÃ`9‘²_cL{b±(B¢¦_DF×)àNNi/í3ÑÚ¶Fï]Yßæ²nœ$r§¾>¹ŽŸ„  ÜWy ø³§€>Ëòý=@+÷þðû¿pè=O|Ð!7=éàá nÉÀ!^‘Þ[–}{g ~ŸX²ÖÞXúu×w¸aFôCý;$:\ì*è:œzœz‹üÇSAþšÊfÆ2ùCê>ã¶UßÔ¶½=©lö-ãT8Õɨ¬*ÿv9åóŒåù¦Â¹lR­RŸcýUê™â¸6J¹Ëo¼e4ßt¡š= SýçújûUWê+ÛkŒ¶Ë¨Î[£¬SGã­¤ŸÆºÌÀl;Þ‘/]Cÿ_u—KÉíz¬Ì®BJ£q5>Y½µú¼:´}À®z“ÍzcóݸfÀÿó«¡<ö²—§”w¿|óÊÚw[ùÖO>$Ê͘ñð×ÖôÇÙÏòãÀpð‡Fï/"¸¹Ñû?O ×`v_£ú·ïÖîHеÙ=³mÞ[D«›ÙT¼šÿpMäž#P«»¶Ø€·QemW]–‹œ7tºzò¸Áé|5ǘ4ܺ£}¦Ûb³Žæø¦§Ét;ìŽÞÏ?×ì+[ŽÛ¶mWó¨~hßO]A¹Hê€Oÿñ’7×!Ý-áä›+ÖÒ‡„*ë‡Á‚MýX*®3,,¬ÓòŒ&¿2a‡u]Ži=IJC“ ;DE>ÄX¶oeú^Àmo㔫ßÃîå•”/þø[/ûžJ |ø·OøÎÏœpû „eää[½)§ g‰v7Eõkß â-þ-}Í{Rx£AZ;Ü€+¯¸NÿÖçº?ƒ#e+u%å¾Â2Ї¤ :IàBÎK©8Ÿé¤¬'‰9 +œØ:šÑML€M$94†–ÑHYÆC1„„Fì°ÉOÌkS;ðÄŽª©}hó‰‘lì×Õ}4|‹Èmð¯ƒ:4< ö¿gŸÂ2 ½·t QAÛÛ‹÷]wðÿOüÖÿJ2<„™Å꼈üÚguñ¥WÛÀݽÁ½Ÿvðûψ<˳%z'€B”V‚®Ao)z›”O’”¤èGŒ%d‹v Ψ Ö¦# by—ÕYÞd•Ê )rf š¹:±ýLg¸ô?#jžä‘naº`¢cSÌå:úöŒ%JØXG¤l®©³h îÛ¥š‡óU³Ñ¿NŸźéÆSJeë²4Ž™KÁæ5ui4¿Q‡ùŽ+´ÞRàçÒUÆm@ÏÍûÃy]{)­:ZkùJŠ€ì¤ u Ó3—'­T°¿ÔE¾k) ¥v#@,†w)÷ÕO½G:Ä(2®ŸRöx+ŠSR›`ä´ÿZ e`qZI­4Ýfl®¹)RÛK+´ÖM›¡­#ò»˜êÓ´n¾WIi#j<Ê `uöžúé( W_Ø;d9üûŸgyÁÂÃY‡ÁœÝV:s`í ½¿¬;è5Â_%Z¤ÿà­ ‰.GþG‹ÞÔ!Ôhÿ™ÎKŸ7¦÷Ÿ8}0n7Ô%Úöõ,2ï_Ç}f–_îT8—A¦u*šÒÌ4ß#Y× 2.wÛ‹–þ¯öj•@6R󴲡«¶V[£í&»d5SÚ`îZǤäà’þ²y7úeÝ6vz*l§ŒFNÍ8â2¤4­lú9[”Ǫ·ªó%þ~RonG½mލ®¹<«õå«®½¼Šòþ^ýèÿ³zº›ŽÕ½@XFè<œ}°ÆÃ"²øxÀZ:€aaÔþ¡O©[×Õ[`+§}Íó9¥kÔfi tÙ&ºÈ›ΟµäqJ>ݧ­Ý<:Š“}Ãdßö˜¼>}¤3}:¦¡fY&?Øî°m¿éy¶M§ò¨~hßO]A¹hꀓo¬qóÆZ%ůQð‡f« ‹H\ÓIXD†¥óIXGâÚ@ý°Nz1O“ŽÌi±cÖ‰MÊëÇM}¢]¹õm¼â²wØË•“÷=oüðá˾§’û¿¼äàmÏÿÙ·X?ŒôÇþ$ào8Sb«hJm­ “å<-Š.{8%¨¬øbVv œ-yO&ÿS%§Jž§ªn½NÕ^Uûddä3VF®ˆ\ÿzÀ2– Ôȃ A`K‚¥‘ hLåh€œ ¯c±Ï«b\p*„¢þlÂ'ÀÌê=>¸èñxqxéˆ.àƒC¼Çã"^-T~dœT5«âu   L˜K–g-è\Ö“L¦ª¶I­¼T¹8b}š ‡Ï2Ü<æ"¨yùGq3I"9_¼¦¶MÿÙ-%€B‹ 0–·v4Pj‘mí~® +åmÚ*³ÇÕkháG®ÕÉîZøXîK¤f¤zµ'ïÿ rgÀ5VC¤¦ H±ùsÛ]ºw'T@Yê°Ù´¨Ü+eèi 6©àCÛ»F ?”6ägBŒ©OF«i†µØÖMûjû|JÿL—¹­ÒqŒþM ÊûWŸÁ¨û²ÍheJùMÈŇ’!:ê ÿÇñ +ŸS¿®üª÷:w×ãþ&´Ÿeèão|ï¿\ÔæCø«þµ|Ê!Ô¥qîÜ!K…^ÒÏ¡½X4œÞ%Ï ûÏ`?|ZZ9Hè1à_‚ÇI‡vgÅÀÇŽ(‘>zœvöã(>•z<NÕYžjÀ/…åuËeÝíÁâš}£Ç¨ÄÁ%°_ ð/¿ ú×%£²é{ed@hØÐýæéö馧º``2¸Ï—_<º¨uq¦]ÎmŸ‚ÿ9¼ÏÜqÓQ¼Üd[»ÏÜ/³m›NÎ3·ÜF»±ê¡7¾yøÄCÿ¿µæàŽýW=ë#ö÷n[ì°V×=á\ÑÎd¥x`!èY¼î+…(øëþK§ÈÂä_6’Ò°)/‹@.í€ÉÂÀFØÿË¢¤”O—©ì¼H:LëŸ!í vtåèªæ†ú“p—á,rã+KÞÿ秬îö?áN#é…6Εp–r<õŠÉ` Z‚6 E°åˆA N ( °ïî(—Yhµ:“´Þꘟ¥Ð:þG_†žì¤évr¤k"¼KhoÅÀî¢pbL ’Bˆ-ž–øF#-®ÿÍ”IøO´‘BJ† Š´@É55fX”7m£`fz6©hµk¹q)5{ÔÖÑ«è’ üO¾Èq…œ¾ñ>Ò]CÈùšx´BO#ºò°VtmȈ:SÞh£Ü|ô¢ÿÿñWÿ.`¼r¸màRV\ó`_ê ·»sH÷ýOÀáðƒc8QâI„}ç)ò2 ]R©:%vY *í¢"Ë'ð¿ô¢[ð?:3ˆ’€«³Iý¯$°Ø^eÍF9• lÄWÅ*®ü#­µ!S>ý'ïüÈ»ª(\‹â8+¥í¦rø^m¼Ì ÉÈø±i {èHþiUØ6pæc ±¾i@íùÍuiBýgÏÿÜŒˆ<gRkÇ’+mÑTšÊT¡ì_H‘¢’‰êYR* Ï¦â¾Èõôì&oîo-Сí3Hü‘dÔ`ÏÄ%ž†ÜË Å¡°t8Ɉ![T©Tÿc/ÅtOyŽï@ë €¬ÉW?5BÉQìÙWП\ŸØ;6\ÙN­!Š­×þ—,JǼ.ÞøùD±ŽÏ£p V.6˜ößvÈÞºFÊ—«@ùC‡€žt)ê­On´ü©«ù¯´5RûE =áÐÇßøþ,_Vr]Cúc@XÝÄ»Y:B=uàîš÷¿®¼¥À8_XJ,=ëÌÓS:ûžpƒ%àTpѺ5Rx –Ê\XÔS¤ºT##MI;”H`@ÔRĦ œ©}}ô÷AŒZ/þÇG£±-ï£}GgŸ¬Éh“ÙânÊáñw_ý!þ͵…ò݇x.h'p;¢kðÐh ¾ޏðÑÒ –¯÷29yü³$EÈà¿•‰ y=ý²!@]šñ€¥ HKµí¢ œWGÔ0"U;T ì¢ ÄV$yõ›(7¥sTGùÄÏŸmšõ¾tÍyÕ+¸0I4{YW6Uhdžjo%)†ŸFˆõ9Õ©#JvAtdÃ¥Q ’üÍP¿TS ?¥/%êÀ'Œ÷.{5òNí\cùÌd}fМ(Xòð™Lî"ç—Îׯ÷n|=ƒòR˜ù4~åø™¿›CÀåg+y’"·KèùÆè«vHÊßÄ{ÉÏCkÿ+À$IâtbD~ª—M#ì0™ÈÒq¬~þ­!@åY5¦™9ùL›¸“òW(Ôçæ¤^󉄀ndÀøžeTl4ißõ4O±îþtB@Ÿiþ¿¥þ©ÀánúgpîÑÛk ÿ¿òˆW伃ugÏÞaÞüC å?ŒÇ)‰í¯©ËcW³îhêR„§¾Œm.¶µé²t J?’4Í} ¾!B'ËæG×Z€?­—1m\FóÞ〲­œ}ËUGosiÁ“I…ólhj¨Zù¥¢)R‹ŽdŠ6ò–ƒBu«a|î«çQŒ­ÛËd ©¡aïhŽC£É1¢ ®zõCõüÏe“oy˜ŸàåüŒÎ½IÏQJ£zÔôDR ¿êÚ~·ÈHî׈/Rd¾•çÿ‡çÛ•§Ë¦,;ÚÑŽíÂóæ7¯?ëÛxd:{oàÃy~çœá,2œDâƒÒGd!ÄU$ö¦Ã m>ëì «]f§®ò¿®æ"»¶eK£dš£m\i9x7ÓÓ(ƒZز=—e²f»L–S’É/×]üÃæÇíÜÇà%“™½Hôµ_ý‰‡þ?}§Ç7¿¼DBwñ”Åug8ƒDܞا\Û<7Æ· †ƒ…µâ:sÆ"dÙ‰é|KD”ôkËmªì,7sª”F^/œÜìèJÑ¿uëYßÂCÓ¿wÊGxƵ7:Ž8pö^ßNßéN#ni!¡ÂY0ËÏ5„Óhá›#>Ê¥°PkEºúñƒZ®“ÁtÃqmÂå½NGIÑs~¨62ÀHøM3='Ô!u*%Þ ê¾.u  Õ‹TQÄ)îFD>÷Iü+ŸGÏ~Œüð†"†Þ›‡~£/Š9UE¢–eà-$åú²ŸäH A,Äø óÄŠŠª¹ÞgE`¶Ø-4ó³v¿­Ÿ*çŽk)3*?t‡ …ž‡ƒëpðid說@zú.z~iŠ0¯è2Ý”z›óW·T !)±p‚8áæ/gÛWšÆàV€å˜¶ÏLØÿL>8!b/ñäÛÝ9äþ?º‰üâ9á­}Â}g îÊÂý³ŒhŸ&})¤ $RÊ WßÅ€åœyø“÷6¨ ÿøWþ ‚ý ØÐ™”È8!¯7!ÿ)=#+L­Ý†ãäwKÉðmÔhò%{y§Hš"TòªÄ/k‹ऀ#¥ÜÔÎjå$_³Wu#wˆõš#2Èž÷sêPɾ¦½¤«=ÿD4y¡+Z DGÀ¦;Ì´{h¹  ¨ª)œ3…“W·ÁF¦`ÆÌàÚTÅMõµ7>äçš•þsPOA¨ñsФ´O¼D‰› Ä®˜p ZSä¿iü‘ò|ªÏ¢ÖÃ*(§•¯š¹œBü[_œÿ9MúPËÛ¶ñl†ZÀé²´#C ¬3o|ãHŽ¢àršh¢äÉÇvàn3 @—cgÌ«´ ùÓdi¡—–®ðøB@Oï}ã]§ò¯xn΀@;ôpûˆðêñå xIHî\C÷Æ‹W•°X¡'9ˆ°RXGX;èV°îaÒY{“}.¦ô6)üïp¡§ˆ©¬‚|2 ûß¶müÈeË{FãR´²~²‰Ñô I=½ÎݳœÓ†×;ÎÍŒoYÎ@©7 ‹& ÷¥Ï£¼UN>ÎT8ÏŠZ£Š¼>æ-…_cù=;­Ûý.&i÷ÊòU'õÍÞ“ávc%{þžKú¹"Ãòì+«LŒ–Fs² l—õ:/™“_µ)ÏWJ£ ¦·<˼Í|kÚ7o0ööoSÀdÎ>(ß^b¯ÿL/í·ÝŽvW7º+øÿÁïÒº›žþ~ œFºCG̳ÕíÛ|Gׂ[f}"t{B\«ˆzLG˜ÂúkLß±)=€x*ˆÒx=ç¹:Ñïnól…¦Žq]¡¹ºé¶«Mµb©­û·ŽsžýÓOû¹:™”Mý³ùU—®9Ff~Óú¹ëLÏ{íÆ¨Œ¾ø­[OÅèêø­5׿°dÿÓýq`qñ÷š§? 8”ý›Žþ8Wî†ÐŸ(ÚGdº}e8SÔE7ÄÒ¨ÿ²1Úw‡;z%ö–Í9ŽÂÿ3Á.á`()m6ÍÈÈB/†ÌÛìèjÑU› ~ôsîýÉšW~nŸp®Ä{_^Î"þš°ÄA„þD–_X+®];boÀ\šRÁ"$°ßAúé0ëЬcÍzzÍJ|Jh¨\W&ÍTã áÜú £ÿþ«u”½2/œªç8¦÷‘f“Zˆÿ{õ«¸›pð¯áÎûȽ488AüŒ Iy£`Ÿ¨Hÿöé"Ò)É1ÊÀþèMù¡çb`¢RÀñIùÅ ?J{¨JÿYMXƒž¥U;N«‚½=WÖÞ%ÏN3X‚ìƒ\¿†|ï¾ñ:¢‘È êöÁýެ-©qÌ E3HçÛª¼Œ C€—:^nüÊ‹•ç÷o~忬Jð ÀÿªD´(ÃFÊÄVIæžÿ°gC‹½‚ÿKwˆwöX.ˆƒN@ö£½ŠG5E×ö­]À5†š@$üµ¬ià’Ž+Få§R½% "='åâ™ F GòšÃ±g5tR›6!g§^U³^µ˜üÎ9{¯yºkÎô½kKíj^©Z=Q³çiÐ ÐGMßë養퇎êʶvÉöËê^^ºŒqP·loCüO÷i×ó¿ SñéÄÔ´U7QpÌOämUGVº¢2vg°£+C_üÖ­'¦äqÒÝ?:çÞ÷ιýÕ=Â:2œF7á,Á×&øb érH¨^Ñu5ˆƒ& Px±§†6™L,GMÙ x®…ØÑÿðçŠ Næ„î,ÕZU$…³1Àœ"œß!¼‹ž¿oa· b¿e”¼%32ZF/œþ,ÙÈžƒƒ=ÜÞÒBü+Üé)ñ$˜RF °’Jé ;¤ÛAOYa2E“Zù FSþ% K=fU¼ppø ì}qŸÙ8A¢¿ î4Ý®Ø/&C gZ$Õ-³È¨0Dd°?pãoüñ<¯ ýò—ÿ‹ªLlŽ0žX%u­¨Ç¶Ô(,›ùzõ‚ÿ+œü¿yjí{¨{ûUî¿}†(ËO*ýxf€Çp&äïG›À9‹Jûäùß êìýÐÁ%OHÐè`‘ÀÎ h—Þë!Îázvp†Y; ÉÀJjH×ìýŸTgàc»LÊ^m€\ñ’O Uõ©ÎJQ‡wæ‰éħ>åq®Q¬j¤äùª6n”ø#Àª¤¿€x!Ö‹òœj0/h\›%×Äf¤§†¹ÍiO¡ð¥”šG“d(y_æ6j€}(´ R[Ðú!‘ï­åø„ùÛžF«ÚO7S -÷3ó­/€ÆäYRVó€”ê¥;ÆFÏ: +eŒÍ rÛ û¬2&°ß–‘Ø‚þÄäá26(í¥L@¤) –!µ©ô­Ÿ’š $#€ò¬¥Î3¶Qå!c'ý´>2ÀÌ÷ÛäÙð„ÜŽæ™LÙ1JA‘Œ8jW¹$tº†¸:.] =Ùлðÿcrï^GnßC®±;óþÇÞ$×zì7ØXÓ‹¸ŒÃg „–r¶@zH\ïð«¥*¸aAN¡Õ {(àÃ3Nñ8íì]PSoáÿÕÕ4£§ì6ê2ø°t9ø?•#:÷F ÿÕJ…ó4i4í8ËËú§¸šV—ÓíŽÉgÊðöã&_¼}Æ›´ÉO@å[3NÕ7¶J§RÆ€ ?¥aJr+G ¨ZÅf®•ïMäÒçfòúéÆÓKi´ý¦ÚoJ&r ìgOÿ‰áW»¿KûOùößþû‚ºrt©fbG;ÚÑvºjÎ]™ÎÞ¸óŸñÆ/]çóí&çVwºëŽõ½Àú^ ;úãHdŽ_¦óUda!­µqüŠ}J÷Ú†³n=Yc]æ¡SóÐ1¤›j†Ô ãiynýŤËZ9·=×mí§?&˹ŸÌœo::çÂ4œ?Œ•'2³O»ï´|Ñõ.¢g3ÝÑ£ýOx¾ñíO?•k½ýOŽ…¥½¾ÿoV¬ï,o9Vw«»å ÏpgŠ,„p çVŽëH\)8gIO—CÿÏÈFþ´¦JQFR²¬,up¹¼œ[èê ©;zéé*å†:þášã·{nüôgïöô'‘Å¡ã콞ÕÝÈú£°RÜžNLعý4ñKB-æ°%±tÉóÜ”&Íë²ãžf!71hô9uâ8™¶l(Øç„àS„÷ÿþŸ¯—i”d×|ÓI“Ò(^ øo¶¥¥F‡œ*ñG ½®Öè=A‚C»yÏÿ<*HLL¹šFQè@ÙwÈí›È­Ï û¯£â Ü…£?Eº;C¬$¥r^_Sþåù!”0ÁÑÚež#‚:G¥ZMRaT®µF£çšø&é: sÐ-aï:¸ë K @ð ×Q¿x‡zçÌó©à?\¨ø"Fpá…ÿÿú—þBî¶ñÖ.êÆ¢DkU­Ò°‚,“Žªª2›fŸ—º÷oáÞxysE\¾"°ÂZÐ5ĵW‚®@×bàÿJÐ}1€µXuÉXÀ9ð Îú% ƒ˜l•¼þ•è‡ ½J‘±ç óŸCþ“þùÙ:íÈ@x}Þ­×û¯‰@Ð>{¤¹d ÃÓN5¨ cÊZú³’>+èÓöüª{ÉS±ž²Â¿ˆÊ’ß%? Vh̲!€4ùêUGÆ`ß¾´7…ÞMÇÙÛ©¨Ë!wÕ iUìžAæu½Fk$0ô§ýñ=û¦‡¦1Àdq*'>ûYŠ”0J `á·#96RhæF¢s@bÆ`”=ýGý0=•#£Írd’ûé´åíμLcfúû0i²aDæEM‹Ð„b­×n†\aø™¦²Èó´:ÙjúzD³‘a¾D3^HöÏÉý1Í%šÐRvβi·¦G7cð¤C@Oéd`DzæÑ^zöŽo¡gŽp²FO,ƒG}€ÞYèÿÁÃÚ!½•]ï--UpS€èpƒ·´8œïàˆ>Zš±íf!vŒSPŸ"ਥP’AJŠè’Ý(òø¦iË‘a&ÿr¿ëÜâòö7š u,Ñ&c¶ƒÕSY3#›ut¥Bõ]Låôí!inn þãO…ó4hÓðj†‡…·±tU°Âã´_–ùí Uùº!Ùg?ófé§Ã£ÏÂÆ`I/)…kžS9eh«CR¤³*+9W¿·=¯v(óþæy?é”FFé­Ìß.y^7ëÑ_ ¼F_m]:6óí·¾ûz#W‰>ŽFä¥üžÛÑŽ¦ôÆÒïfÊžÿ¯ýÂ×>ÝÑŸDœƒ½Ûž8(‹C‡Û³ðýÒ ‹Î¼ö²SàíY(2(®èI¡« æ Kb´¥F­©&ù­ ¸5¾Z½/M¹Ž/Òÿ^]º¬%Û>·qdÛ¶¼·ì'ûg’™òÔßÉú´.—§í¶9ºl ÚQ/ }í×_*µç |ºcÿ“ni¡ùW· øë&ý5a8úӈ߆S)鱇Sþã iY ¬µXìä<+ Wa“#¬ÉÌTÎòp›‹áÑ~¶L?W6?_®$í vt%èö×÷xåg÷Ÿõm<þ¸çÞ÷W&ÈN"a-Iˆ àpøÙ…Y„ºW=Q•á$â:“)á´*›ÂY´PRûޏ6 Q€å‡ J É Š £)†6é4g•æy94õÏÃÐUå­Ò½¹'E-‡wžÍú¬IIsž‘f--»4 œ áƒÝ ‚ õx—ŽßBEð7#ƒWðY€ ·~ ókH÷š)}â}B·t}zËÅÊì+"±Q”d§i´º!ÄÉ=V°¬ìÔ¢ÓÝò¨–#=Gµ~]#®‡…ÚFËa‰s1ðÔ âœ9t°Èö©¢*7ÿÖmçësNí ÿY5jhö¼¤QöȦõJ}¯(ÃÊÐ(¥ÌÛ¥é¹c†¾Œ3ñÅ_ãÞ»ð eñîMôDˆº†•ƒsÁùXÊ,Ú ®—d4eQtphŸ^€àmÝ'—Âý«3ù Ø»”'•Âþç_ñøOï¥Ë¶;¹/Tã M‹þ»ò¾CŽð°á];R´Úyr*WÞóÀÐúW) 0?lÿ«b=§Èûµ¡t%q¥š¥xÿO@hÁÀ ±6›³«¢Qñ’yQ|ÝžÁòä}“hÍ>õ-Õ±B›õ1¸¤[X¿­¾}&ãKY]BF\bR,FYêT³‰AÁî0=1©yêËœäšjLüÔrmkníoQ#QC5Ð ]ìù?箌YðÓ"ŒÒ"Db2Ž€ŒÜ´ž»SÀ¿Ü«ŒiŒÒz.§Î,šžf\Í|{FR¾Xë˜Û˜ÇŒÞN2ÝöÅ‘f½¡6B8—ºÇzJç_ÜyÿOéÃÿ#à~ÆÓuÊÉ{çÄ•3ÛÑÕ§‘>Ÿ‘BûÜYê+q«nð¨ß/ðý‚ènXâ†%ê.,X†%Qœvø¸(e§¯Ž‡o~yNÔy´Ïëcâ.nà4§F ÿt9*Ç™ú«™ çIÒœì­Þæ5ŠKŠPø‹l\o¨ã@æró 5™}\>ÿhŸrdó“gó¨Ox—Œw]–U®ôW—äyëÍn#¨4Ϣʯ}FíÆæ'&—ŸtJ£›BL¾IÚ~;þ7Æ©Æ_“±bþïhG;ºˆ®ZtW0ðÿírŸ”Õã·Ö¬ïÖ÷ ÄŠ½²> ¸NGñî—Ž Tµ@®’.7ûIW×|F6cè3jü‹EÛ4ÞÊ<‡³V]›åâè|SÅí\ý€?÷ã’òÜrJ/£Jñ¥§/~ëÖSs¨ýÉ¿8åìýÐ+ý=óøï® a­ô÷"n ß)añKa•½ûs”RVÚˆ×Óu=ŽU~FEÃNoâè¿Pž¾²õj¸;ziéëûÉç)ytúNÏÉ{nÿù=†3e8 Ü|eá<2œEö^ïèOÃYdÿ OXu gfédà~´‰bÿ¿VâÚ{KÃCÅ6 0 ×A’µ©ŸäÊù¯ËIJY¶Âï Àûÿã¿5RŽo’eºEt@œ…èÖàPIžDY#Í1¥ì“¾ƒuc¼7¯v™™µJ)Å<†cžSóŒò΋k7`ÿ³8ÿiCS~¸=¤;C¯ý=øÎdiÀ¤ ¦¸%ç¢,€”@¬À†j°‡ì ¨ÐФU¾´óÑV•ÝHGÓRS̈B%®#îôáÚÛÈâÜ«vøp8¼ƒžÝ505˜RG[>gƒ„ÉTöæ_ÿƒ-Ïñù§ÿàóÿ©…5.J¯‹Áÿ1P2t+ÊÒ¬WP·CÚÚñ>F‡¿ÿÕ—&€ÿð:øSœ¾÷.œÞÝ#ž88ìáÄ#'ŽØ“kçfL£+AÏ…î_;躀 b@À¼ƒ YDAbRàGA³Á ’ÿô&áük9ÈÉû8¿Ž5–yçö©&yÈÏìêù_<ÃR9+£‹KA¹V .OÀ}-€ôe@k{Ž-#ðìB¬½èrT”tOR4ÿIà òsª9Øó9£ký) 1¹Äj¯u’n´ìSn|ÌÏre«ãµì[?f¿n>É5rJ—ñð©¢Å3µXŠ+åX¼ cÓSÌ0ÀáÚÈ`t{{Mj· M¢È6À®œ¥iD¹ZYlvÐü<+´¼„'-Bfí]L÷Ó:ä“X¿Ký°q¯ißÉËå˜û§JÖš[³¾™Y_WÌÀ¡mg½^ D•si޵©ï±úl–SÇ¡¼æF€OË*ô¨! /¢ã÷ÿ˜Þ?`ñïÞÿ>йŽa95™ñœXßÔµØx·òÐEèq°ˆ2±÷ ÷„Á#ù\ZzE‚Õ¡‚ nèÌP x$¦PÿÑBÿ[ WSàSjs^Êp÷’ƒ žú—4e˜5˜ÿËØµadL#‡6ÿv,hÆÀ‡LŸA*œ'Ky|šÊr¬'yNÃß‘QWï_–¶Iñíkó·;²ÌÔEæ×ùwÿm³ÔÏ%±™ 9ŠW>O’c¹¿Bé[Ïÿ¥g‘ÒèúóäÛc3 Àt‘À6c±ßúîo>4®µCõÃjKžô˼£]ºjáÿsØÿkŸ[pëk{œ½?°?(nßœ¾úã€ßw„U$œG܇XÒ¹–ÿë ¶@×€E€hlé¦wÆë—¡Y‡M©õ°RìjÐE­Ò ÊÍ}ËA þarìt¿‹®[Õ!Û˰âßM¶·Û¦uí69î2ÚS/½ñÍC¾þëOO;{oàƒß;㕟ÛgïUx‹f°¸åˆëH·VâZ½"k>e%–éqšïªE?IÙœÉÁW5«³"0û»fgÉÁ–‹ lT8#õÝ,½€²qg°£çž®Š÷ÿÉŸõý`ÅáO-XèÏ"âáü£á8âÂpNéàì(EôGæEg!Ml‚Rž(· ¦h'ˆƒÚ¤°ŸXC ”‰b ò—õv:37µafý)Ðýð³vá"µ©RyC0+¢¹ðŸ:@#Ä÷ÎÑS®KÁ“Fš z‡yýæv§ö-@5K£)ž¼¦{‰8œ["²„èÓõÔBˆë•%²´ñÑ¢ ä}ÒO2ðŸùAóˆË6±æ9H”ŽZin:˜?‚"Db ?ÆÑ1ºx‹  ‹WöÁÑÛèɉ…,Óä]X¾à.ºQ²Á þ7ÙGªë‰€¤vËD™Û*·ÉJ´²>QÀ¥ÖÎÿ/Û||ñÎ+|püòî3{4¬ÑOFÔ)œ ñÌÁ"è¿N€íyò êV‚z%b©z±0É>ZyH¿à`pVö)BG”j‰)|rŽs Ÿ€|šÂ)3yšÓðÇm€ôìÍ#͕ȮÙÖö :ÃŒ§qñÞ«€GÞö¢„XŸ7ÈÇ´÷‡4†”õÂ/Þx%Ф¼ªYé«aGcQ9—vËÉÐ4ºbÃãæ,ºñ$6IëÕR'Û*x4RaÊ 9Ëp,@¿H:….ç1`D5âò9³\Ó·Æ¡¡ç¼Cç½ÿ Ÿ£vÅ›œè¶Í+-BªÑÜÙ´1ö!±¨\á’4Ç IDAT“Íç ‰/ã6V#€Ú7k¶0õïl€§”>=¿´&ÜæRþ6Uù4Rº›-àσ†€ž†ÎÞjži %ùþmâÏ~Ú2œôØáeaŠ“E²ádµÀ…qŠ[íáh/xü°(cŒ‹f,ëã¯ÉÓŸðãFm)êÍh,j£Û4%i÷i©uHÝ£•¤ªqË\'¿?¼Hå8öGõDÖd/ꩼiÆÄ¡º—<õT8›ªE•=#ã &|me;±FØx-)2ž¶Ž1ß·KöÍv+Œ ¯êü¨=ª™LLN#©í9r™4ó-ʼ?í_ ÓHðà¹vct#ÞóÄGy)Ú9Õt,-­“1s?Ëí-ËÆ8¢‡µçx±icvµ£íèÁék¿öÚ•òþ?{oà­|½×=û¯yŽ~°¦¿éaýcùý>ôG¸2Ç þ(¢ƒé{7ô·ÅQKG¡«shÿ’r4¦á ~~ᓇPW†ÑWæÌ¬f˜|Á¤ÙE­Ñ™}Úòøƒ¾noÓóär{\‡·=w~<yüÏÕMëa|þiÝÜ>Ó}wôÐþ'<ßøö§ŸÚõNÜóæ/]çÚg,= γÿ©Žþ8ÂIdq©3'Ø…V‘á<â¼§YÔä`-’ʹacâ…pfé³ÅÁpf­M™25–ÚùŸë``j$55¢ºt9-?§tuFݽ´t¼ÿ?úÎ9wþßS®aÉÑŸX(( &Ö÷‚} wÖIxu0?[ƒ†>•×ú$[‹kÐòÇê2ê2KÐ,ä&‚l]4-Éô„Ùýÿég›ëdEH;#ÝBN‘WöŸúKHߣg¿çéiÛ23’ºßE”5U:Y‡dQfÖhÁ…ˆôg°>ްÿš’ÔÜÇ­O>$Á,.=DbzÐ(Ie ÄþO~IŽœ®¶«ýȱ(•Ò(–Ci) DECDB€>àîýÖGÈâšÍ\Ï×èÉ=]yè±²¤Í´ôæ·¾s1?Ÿcú÷?÷ŸOÆìµX[WòbOÿ•|ÙP•`Í¿VAN©¡žk þoÌ9µæå]öE¡Å;¯pÿýcô†ÐÂû Bø%Ä#Ë÷äN]U*Ÿ¦ÞRSèÊ<ý‹0$§ìWÑ@‚+À¿_s —°ÿ)*€f¯öÚñ¡ÓEó¼±m2î àp®N¤í7ÒØ,IQFoÖW@ ×fðDeÖ —çŒZÚP?g!Ö3ߊ½¤>IˤH—Ž>—³q€Ò¦NHÕÄuÙ§ý" ÊÞÔšÏF<¬ƒlT*O+¸Ý€Óq˜ö|cýL­“²1óU³ìO|(Æy×T´€-ö%”AoM猉7.õ™¨ÑŒR0£·˜ŸM¾fñ²¥?›¡¡ÛðÐSp¶JŒùµÉ—­47yiWæP»Röj<‘ycWÏ™MyG›/Τå¾g÷7æI‘6µ€öé„Nš1$K%@rô$ÅZ£¥ìÍŸþR÷à! çBgo£Õ—w-©WÜgVt¯ ï®`-¸ÃH<ôÜ#ˈ®’·ÿ"ÂÚ[¹Ó'•{ƒÃ9…Á¢H*KïÍø-¦è8£(u±Ž‰ÍØH¬^ÿ%B@À Ò:)’’¶)æçKÔñ4÷ᜎù=jŒ²¼RM¡êµÝgº;6²FóüYÊã6Ï&Îã¢éœ ·]iùÕðmF¶+cƒ‹8á1Ôõé|c~ü›ã}[7ßþöS§|Þ•ý³<¦ §¯IfÕ󶲋ò}8–ë<”Fež‘Çûù;©|’æK¤ w¶ÿ-ßê›üß½XaÿÛ´t·G8ÏKò·£]LûŸð|é—¯Ž÷ÿOßíY¼â¸û¯Wœþx Êò¶KÎWÊú®&þ€¿xò§ðÿ±UÅ`¢ÓÍ[­M]þä±_ÖGô(ëjÒE-ÕÉö¹}§ þ„Ë£cbSßRàëæ(ï›·'ÄÈã  ½æx¢rñµ.Û¶£Œö?áùÅ¿÷Ù§v½³÷ÞúŸïqýó Ö÷:NÞ)Úõú(@·GÞ?ÉÃl•×ìkZOeò?˜Lœ•›3N°:-üü|ÁdçÎ`GÏ5]ïÿ³÷N~Ô³÷Їýq¤?Žø}‡ÀCXiú%k§uñoá×¥b$.;Éã jù¤ ² zúÃ8ÿI+ôÚ©Í3j÷ÿáÏùX§2£Áo§;NLcÒ+zôÄÁ„”Ÿ~lÀæTçQ83Ó? 7€¬=ÈÑ]tùànXØïxLìÿ=}=_£}V°DSÔ{1=GRž#AÁ¡Á”ŒQíù‹SŸ¦ŠøjtM;AÒȨ1&`-š¢Rn¿GnjÊ£Þ£«sž¸ô S¯Å€Óìýé­-ï¼ÿ*?óÿûÃóôÒ_ù̯ŽóplŒÆ.awãDqX”‡Y)Ü(‹³bmCÙX@7Þh;ï“û|ÿð:{úIN¯½C÷º?½=ࢅ:>X òº¢ç‚®y5m;x%Byý¯ ø×µÀàléÔ"ô‚.µC ÈàÐÁ_'9)£(¨³2bRì)Qa…-IÑdb(PÁ°>•ë.“ûšºâhB ±­õ8 xVಡRó‘”ñJø¬øg¼Þ‹fåY…X~N‰žÛRÆ‹ þK’ym사(7Ï>ûÚN¼ËŸ­Ò‚Þm‹+ˆÑò¿xq7Š˜²ïhj*³ç‡ã¼×æ¸(m½¶pš4Fyx°#SL45 ;¦‰“¼O6=“ô|R¼µ¶õZcÄ€³_ æ‰n€$¦emøWØM/ѦÝsj–vµÙ¥ØmäþýÓ"dhFŠ¼×æÚ “6V@̳ج“AÊÉ?š+Õ÷vòUš‡û“—l9»j]|*è³éíÙȧ™(ÛB@OÇ@»ÔöqìøßÛºíe¥oÍâ§ç"r} Þ3°^C%‡08¤KF5N‘s ½¢§×{:ˆ ØWg)ÔáR*}Ý&E½Q)à~ŽzCÚ^ƺ¶œÃÞ3Ž&ÐΩæ×kŸ ÚSt Í¼[Ûw!ɵ ü7#ÐSÞ\åT8O‚êì€ À¿Må2+Û3_µ‘_E®W9ÖÜ嫎m-äc´î›Ó‚v[~©®l²ï¢ÒVò¸¨c~ç{u“Ùxk|ø1çãO:¥QVS92º~þ[¦vcù<ôç€ÿZ¦ìû[/ðã%´ÃëÃÑËñ·£=]¥Ðÿgï üè=âð nÿìç ì½îYÜvhT†Ssâ g‘°R:çNÌëßK { kEW#å´I¹­hŒª±1ib 0±¦Ÿ;ÚJSî\´ÞÌ<ÇÓ…™ßeÇCõëp³|ÑozL>'Ͷ¹òŽ^rúÆ·?ýT#­ý`Í'ÿâ5®}vÁùû=Ýpð©á4øƒk^Ÿsxì=ñX„¸¶¨Øq a®Â:× ^ÌA¶Çœi“Á”FµT×É `{j8U'4}KÛ7¸éÉÌö+L;€=×ô¼{ÿç\P²„ÅMÏé»Í´?ЬïÂ:2œFâÊ„T J8UÄ“rD™‹É@À-hBD1±~¢Z0ª@k~Âì¢ò3 ûÿðçÆYy0k£yLž:9‡jG¼7@øž'€xSØÌ`Qíõˆ6¼€´ Dw ôDÑU„£ðJ¸ÙÃÞ+ˆx4Þƒ³!§÷ÐU@!ÿ ¯¨ðàœ)œT) £EÖk…5°V\UW§“>ÍÛl_RšÒop!剨S¤ ¸ý€Üö¸×>‰v9»K¼·²¶ z‡ž=3QoŠŸ›ó»ÆÏç„þ½Ïü Ù£_Š·¿9{Ùž@ޱ‚zÎ}¢ CòÞLkò¬)5\öÀ«k)=×ý?~ã sèÙÓÁ¿úw>@_…øÃCâ±—kÜ=îPò;'°r8ˆk X;$ÿ b ¾Ëžþö!N0T7ç:&8 ›sj¡€ nèJÙ:£ü„ºoóL]Þw¦¸¤ðw¥ÎáÅú^Ž>aKoáš%÷KÊ5 |QBÁšòØæ¹/^ˆõÒî‰â}#ÌTŽeEy…°U´àܪG豌—ÍX0æÒTg›Sž˜ý0´{·Ñ“ mZRÉ RKµ`E×?º¶¤k'o|Õš[8ª…:Ö¡¡´¾<óÜ–…‰nÀ· j½D©`\åÓ$ª}õ"¶<Ý´Dd£M}'¦þ¦1?×8ö„MíŽSP²YoÓ$´FdÎÀ²+g ptÄVŠL#´Þú×€þ ­¡™ÐÜÊ׺ˆŽ¿ñý ·¿tôþ>{¿xÄâÍ]ƒ,½i)lt/½õbó¶ý]»ΰËï’".à\°ï§ô;„4~ˆ½ëN‰‚ĔꪗBÓrœÑXÙßí>i {ýO<ÿ[£ËFáRºodùÝÉíŠÜÉÞéÓhíXø¢¤Âù¸´éýŸxRû*ŸãH®o—íq–ÇíxWy^Åú×7h³µzIm*†íñ19½B°y?”ÃìfÅ»òô—1î“JiDû|àVK¯œÌ3iäy•óYæWÿÛßýÍÍ‹çŒÚó0ûñtŒí覫äýo¹¬OY\w ÊéÛ=ªŠ[&ÉRt´µ;1€*×fpJæ¬^“×é„Éi¬wìŠò(Tõ4@óÉ©My4¤mýˆz¡h[+ç?Î7··áÔ»?°ÉYiÖ§å¼lÇ’é-Û¦uÌÓË–mÛöÝÑK@?ÿíO=uGÚ“®ÁÃêó÷VÂy$¬au'ûˆ[:ÂYd8‰¸}!¬í1l,EÄv J8Söt ÀÏ´‰–¢ó°›ßFÔkÊ4ÛæÍM𕽀rsg°£ç–ÞøæásíýŸ-B»„£?Yƒƒî@Ž#¡OAdÐí;´SbTt¿´‰ŸÛst‡V§û 1M£Z9¤eZ'˜âF3øß†‰j…ÞDø•:šõv;Í:“ºv9-?Nj Ê¥d2S)š3çÑ „{N¢siâ¼yîG¦¯ê|OÄž½öˆ®Çu¡þ÷ÑNaèa}C4ïâh@^¥  ‡_(a)ˆÄÖˆšek!ú¤l €$‹95ËcQ"@dƒ€vî)bÑú}@†b°P±^‘k¹½„oýOKØ»‹îý=½ƒ&Ïj¬o:ìÞU¸ù«Wüo=þ‘ê]]À‹1øß%åÕ[_ê¼{¤Ðž”]  1Èç)ÝR¹”šþÛݽñøóQ÷þ->üàò…–ûºŠ[™—¿®"r«7¯þ5‚ô¶”¥˜Ì2¢É‹X¬là?f .åÙ$ˆ¤÷Ëd¬  @‹‡¿ɳ±>´½£Ø~Y‰šßɱWl£LžxÏ"UéZ©ª· hÝ‚©Êð(Jál¥(ŒIçšÎˆ@À··TDbžA·Oˆõ,/A¦ŠtS„ç1¥ìD‘ 92@†eT•(Y؇’ú œ/ÝòH¹Ò<‹¬ŒŸzµW€;µ±\Û'ñÐck>dUx:ff Ô\ñíñÆk-çÈÀ³$C »÷¼WáWúR* Nv{ê¿„þ¯ž¡y{áZ*¦À¿Nù³Á­ÔÞv«”O2-Bn‡Ž¥QšÌ±ðz#ìø(\öeQ&ë…Oí{[.TøÐjJ*´¥9äz{¤ U`?ƒý4å,ß,vÝo.t;^Úêåó°ó/íÂÿèh+ñ¾£ë÷‰+Ðs!ž9da-hï,½ÍÚ!k‡®…ôïyú÷ãpþ.ØR‚OÿæõŸ½ÿzóüOaþs(FÀ¾³´7©¼1÷i¢ÚÔ¹};÷Úý³”Õ$Ë¡xCÓ¼Kõ©aþÇÑGž1š÷+­>x¨û4ô¼¥ÂùøTeìHÖÉ} ÙÞÎ;¦à᥶\ð&ã`3¶5UŒžAëÚ³æ}’ÔoË÷ÓDc°g6 s}kX½¹ÏÇ¥'‘Ò(k:/æ5¥-ÒüÙ>VH©ÿ?úÏ' žGºè!_ÌÌíhGÒUñþ?{oàο ,_s„•Ez•.ƒUYXyXEüAš¿DÅï .äT®Ôô­% És•š" 6õÊ8Í«N–3zß ï\™ff–ÓòÜúóGÛîp®¥sÛófÎÙ~vj³œ;ŸL~zÁ¶‹êØR7-Ï­ÏÑnŒz‰èç¿ý)Þüæõ§zÍ£¬¹ö¹ËWÃqdyî9øÌç,vøŒgX)>ÉKí•aÍ«?9ÂÆµ„•&oEûäù?šRdãÄdj¯àSy°¹}vžÅcŽ=é'¼,2±}£ÇŸyÛéù—…ÒÎ`GÏ-}íמ_ïÿ³÷Þù§Çø}áô A?GÖw|òèOB,®MXI'iÒ§Õ«КäX‚RØdпµþŒÍ¤ð¢ ^Õ¹¤ÂdÉ–õ'@žÿÛ¨õîÔùSàî½›¦l2mYYãÆ){ËatžG&m ’3YK©’mÛÕ½"#n8G×çì¨yÓu’Ü=Ò-à`;X÷ß)ÈÚãt 5¬ y¸h9ªƒØ;$FóêGÀA à:O;ÇÓ!Dø/n/  Åí+²Üzöÿν t(§ÈÞºs4œX;q¼ýî›|íïþ³Ï×§HùÍ_y÷;ü(—qÿÝh½ÿëÒ16¨ª²qJš}Æ€[æ¡Àÿü‡×YÿÎà߯‡%û=öp- +ЕKà¿XÎã.”ðþZ€Ìã_1pq´‹)Óš˜!Ö·QRøªTÍ %Çq2  FÈ`‡/Ï7õ¤òÜ]écOÚ ¡]£ ¦`úY¾Œ€ÆXö½ê!ÖGÆÛ:N¹—ªHíßzÿ°&5L-¾&9žCàÇöžìã™ÞҴߘÝà]áwÃóÂ÷ܾÉ1ã31»ÁîbÌ‹|N©wk|€±üNÛ` Š)ŠJ$Æ”i')ÿ³a€]½Ù¿ÄÛœÐ#°ˆྠü×Íþ¸}cpHÓý5õù}EDøxi¢jCR’„Èè¥(Oýh`yËãöR¸ÊÝ gÆ+³%åzr]Jƒà–àš7ª8å5Y,‰yq'á£!aÑÁ4÷K:£v`9-_Tw =’Âdnÿ¬ÄI B…àØæ{÷opóæ û{ýÃßdsÍ:j»æ]œµL!Íú°t±D®Áb2 çÇ釙½ÀÞ5¸¶‡û¸=Ë'çÏPYãQtˆèjÀù¨åzõKû pkUG\9$4$¯¼Ñ³‹–¸¸Å€d¯Çuj#ÀG_Åí½s¯Û=‡èp‚.ßFÝ×õGé„o?:OŸýå7Ù<ý3ˆÃª 5e½fÛe£¦Nè uõu×É¿ÆÀökÕk™²aÀË7_?øÞgYý•·p·†w—e€ ð_Qÿ^ v)2€C!}, ¬,*K À :$˜œ•àK ΢iD—Ò¤\ÈZó"çüÆôÏÀX]Mɹj€36€\ËÏÿð¿€Úx­ ëœCœ …|5Úu;ÏøV~»XOJøF=Ù–”×ù\Î<Ý)õûVyÐë-zé¢Û¿Ø rl`g¥8$Ï÷hå( %§Jd ç;”RW†¥òŸ†çùÈ´Ó&àT6NXù ƒkûüÙ‘¯%µ½c#€ øûIFýÅÀ…üLó¬Q(û&ÿPàh€£æ|óà¿6üI|œå„^À–Ɇl´Ðö×–´|HìoŒÊù$÷½‹Ò"˜Ç±¤øœ›S†¦OhË›ñ{Z¼šËþé}ž¼Ç£ç;i{Ó­J{Š™FyOò‹™‡*iwnÆ·<Ö9³yD øŸå‘Õs¹&zI9Œzåeç_ÞyÿOéÃÿs`ï/bÑš–À²PD"æ¦Á¡kÅ-"q%Åf?Øè–̼J%à‚Cœ"‹`à>ûV\´q¯ÜAú€Xä/@tÖ ðŸàŠQ\5ˆ„ñ¸™#çLþ™XÊžï ÀÔdšB˜å1oê þÏyÿ×÷ÊÚUÆ+ÆoUi÷ é¶ÍÏ8ΣR¾¨€}å×H^µsŒ‡”íµ\Wþ>ì·d#Ê|›tÝ ƒ·cÝ´µíHW¶' =jFG©lF¤{ô8Rå{–º[mG{­¶5Óq)Ÿß‚ðÛôwO¯6]Ô[_¾¶íèèyOí )ìÿÿuŠå£?87À¿ƒáÔ½Ü> ÔŠ¸=óLÕÁtsqÐâ¡“GªÉÛ?/ °•¾S[@ªùÀéwiÖ/GßÓòEuW“zÖ°å¸ wGËvôŒÍzýš™2¦ÀýtÛƒüS#9Ú=;Ñß<äßþôS¿î‡p^@øûß_sþ“Þð UúãXt/C ýï÷…¸V‹¢²VÖ}¬²´W;WOrˆÕ þP_Àos~º=jв%¥Ýc¹›×Órë·ß•«Ï'º£—šö?áŸÛðPgï Üýî9ËW=ÝuaõQa­t{à…ÃÏ,EʵpÈÒ›S@…Ð+þ@,ÏÉ:â·gÌ%/n‰N •HQ² “Æ61 ¸¬¯È“À‹ d‹p-Ù²þˆôÀÞÿBI+©JwYibË»w¯sûÖ1ûûà S™¦‘+ϳOQßÁ­ÏÁ­/‚¿zŠœÿ ½mÀÂòo·àà&zx <¾ëAÎޱxû)õÁõàô¨ày=sèÑ}ñÜY×®­R9‚‹ñ¹ð¯;äÖçQ‰pö#J§ðÞrSà@Ú;Çáø#®eÿ º×ðþ®€üc#9²7ã ø?òÜ{qM=ühAÿø9]ÿç?ÃÝõûðÆŠxϼ¹1À©CÏ<º? ¡CÝèQg¡ù¯ÅþØ X;t/”kÊRʲZ„ $ÉÕÆ JB„“×*[DX$§h"ÙÖ­GdÿÿBk_$¥¤s9I@Фó§ý!u&eo™Œ*1Ët20ReÀDœÿ­`!Ý(±þ"ôª¢¹xÝ¥;læ|ááC¬ç»kÃÞV±Û~ƒo§ö=ÊžuµMùÇœí«`o”+¦¿(kiÚkjshÃóÖ(£=è¡IËVC½ÔÀ0V«Ô¶FAb¾ˆonTÒ9›ö· Ñ,84&ºÿuÔoÎ<’ªGC€ú„ó×磦Eˆ)?ú(òƒØ G–(üiÞ½Næs~Å ï¶ógÜwêz.I³bžÓMëK»iŒ?ò­J™SIp®_Ç­b$§®J5»Bêk͘f«7ŽíÂÿIï.Ùû·O`/Þ_пÝî9Ü5EÏz¯3p_@׎°òÐ)Ò;ô½ÎB®;\ßW\¿0Ïgã‘_ï NðÃ?,QñaI—–fJ".v8õöÃãµÃF0W"ŒæZyÞ3‰`“Ó&Ͷµ5vQ5O¸$7,¥†³÷,íkÀÿüŸóNÏe(EηïÐTÖ<€àŽ©Ny–©pœÚöê¼Àœ!À#ÉöÊ éücʾm´ÑJ²'|iC­K»Ú“g£Ôô<·È‘qêØGâmí+RÆJáùäèã¥4J\uÅ&zÅøJõ¯Ô:è_éQ'g;ÚÑŽzÞS»B ûÿÿœ±¼åY¾â9ü|GX§pÔ«˜rYk­[Ǫ:¬镸zEÅåðÔ€¢AP§ŽWGºÝ6}k¦©aÀHB½ØÒê¢ÖmÛ6W/¨ŸÛÞ,Í(fè"`ß1>nø?g °í:—Ñ˧P|…+™„ IDAT‰éYÿ'?\³¸å8ø„'Ü–¯8Âʼÿ»Ca87в0ÇXõX ÏëRoFáÑÛ÷D„ì·FTL½ýã¸|‘7~“·bblYhg°£ç޾ô7n?—Þÿgï |ð{)ÔuÇú¾Y0-®;üÐGp §Y2˜´éÌÿ;®•Åu!œ›DZ\wÄ>)LR(²Õh ÷”ÓŒ[¸@ ÑÔN Ÿ‚Pû¸àÿ‡Ý(JmU È¿¹Ò> |øÑMÞ|ãÎǺ¶ÑdÖ]˜•ì XH)£dq_Áíý,⯞ý!è9"§ˆ¾Šö¯"î6,nã—סë.ÝÊ}DÎ œ#Ѽ¼Â¡Oá!î"{7A>,=QèÙÄE³|SEcD\Rê+£>â®ä“?ƒßûw@Î ÝïŽþ9¿C¸þc”=„è1û_ù{wO~é3¿2"¦à½k ²÷.o \þCQi7ÿhÖ³W]žÃ_þ7&/!ø¿÷Ö'¹ûÝ5ñ³ÂâÏn#ïïü·ô‚®]÷Íó_»âE “ÄŒ`Ð/ˆÉÓŸÆÀÖ à'»}[D•è!Jø³@ó•R® 2 €âõ˜s—uÚÔ&™ÔïÜÄ0%l±‚d To•óÍÒ¡ä6J{)ÀeRº·àö +4]¯õöwå¶¾x(ŽæbÝîÖ5 x)à% ïœ1ÀÈ( 1ˆÈ^€Õ  åU €Ô4wœ ò|ÄÁÇþOïm›@»^[hõ™·%±Q›ø ’ Èœ…ªÎ|Ê0wÔqß‹M¹5æƒÛ™uÛ˜:Ë’‹y57²Æ,<Ž´$R¢˜÷¿Kï=H[b¹ýi˜ì8ý/ ý_83ê/Ó^S*d“+i:4—¥L_Æç’†£b:_·’W³ašØfÀ#c'¿ðý‡>æ…¦µÃ½2°x3W ŸX£kIÊe!ö”ˆ8yl¤wÄ´dpÐ;¤÷Èà¡·ÿ2t¸à†5.x\èˆ>ºÞRH$Æ;3p‘¨Ž..Io½UêB2có8ÍsWúI;OB[\ÚìÜóG2µÈ–îß~¡¼[›¡ÿ7ß±únÙ•ª(Þ7_ªÉêôË7Ï4ÎEÔ†ÿo oÊÜbôŸ+}Ù®S¦Žîî‚-Ó™r9áÈØ2?¨ò}sÿdv¨~ÄöÇí‡4ÇfÌäáçB’Ò¨»A5ƒÎ;E~û~óqÝþËB/ßÛŽvôˆô<§v…áU ÞqòöšÕ½Àò†3à?…üÎ"CÒó†3e8ø¥4F´Y§Â(y©JN컪¦ŸIß!G®­C¢Ö_ûÝYH`c"ñrÑ”#íúôS>6õy}ÊÕ)çÛý/º‡) ?·~™Àðß¶aî>65»±é¥£g þßûÞÊ"c¿îY}Y ¸…á]ýYÄu‚ú_Îð±¨ø%h¯¸ø}+ì{·ƒØ§ï]'%­¶tq%®ñX¹Wû´Bˆçji5Ýð€”T*Ôt‘Õ4úÊÆ›ÿ8ÔtÏ=(ëŽ^jz^sCå\PnOèë{þ8â—”p¦x/ 瑸Rü¾c8‹ÄµÒ]s ¿o^¨þÀáô;Múc/)o'ÕÂ)ƒýmn“µrÚbí4š<æuêúlyný)ЇÞ fåºRÀ~°òôÏmQ}óžVÓGÙLá"×#òF‡;t‰ÄWðrËF³¸úO£û¯£z†Û¸îUàØ»Ý!Ò-Á¼¬ˆzܹ²Âù‹[èÞqyûqKвòEi•I2¨•žmþQêên"r-YÏ]ÃõB¼{øCâõ»ˆì±ÿ¥üøù÷é¯~öob¯!‰«Zk`€l þO—ð?훩õæ')ÞÒ P¬¢DÝ[¾ÛæØrÞ—‹üýkß=Aþ˜îPˆÇ=ºŽ[Fâ¹ gΟ zêÐýXS¬ð±v°èp¦ø%yêjè àŸ<üC®s¸Àû‰ç¿¥€jЀûš#GÔröuXS âJmG1=qnBjßiTÚŒ Â}¤¨×ð_GÊø þÏŠ[åûdƒdeü“ ±®H =_ðùþ¥œïãl ’ÀÙþ¦†–aS3,`+£¶ Ü´Ý6y>@æŽûx¤Ìèè‘‹äû¨‘$hÂÿÛóˆš3XÛˆ¹-Ú„°'nôͼÏ ª|» zpµ^˃´í’ˆ—¥Eˆ1yÿKJ`M–G3¸«L©Ó«úW ­„.Ïïm³õ•èßòm¶é ÍB%o4¹»£ªe,D7î;JöòOS´O@žk#€GÃŽ¿ñ½G:îE&ýÎ+ §÷`èéßéàÔÁ2¢+!Þíl\TÐSŸÆ.`ð6–¬ÌŒ>EX(.$CnèpÑ"øÁ!Á³¨S>8‚ïÀEoå(·FÔÂüçÐÿNsØGö3]Žý[™Ôç.)Y‘ßÑ"%Ô þ*Àßþ&ÀÿÈèfÐ.¼mdPª)ïÑÅCáÕI…³F“‰"Ÿiy¶a0™sÝ{jQe—õ¡‰¼oöÌ{Ù7bj‡("nÜÞô¯!–ÜÜÏÓ™¯?\J£ÔEÚï’BS^·ÿÖwã±Ýó Ds‚¶£½´ôµ_{í¹tîÊtï{+ŽÞZsó«KbÃi`qË!KüÝ¢yüÇ-r+Š[‚G+±TÀ9°¤7‹ìùŸ*ÑùæI‡–Á_Ç–­; ¯ßÔÔ¡5ÿ48ôÌéá& ›ës›óìŸrwÊñ98p€?-ˤžÉ1sëÓó^tܶº½àô,Á€ïü×?aÿuÏͯîqüÖšõýÈÿÏÞ»ÆZ’eù]¿µ#Î}䫪ëÑÝUÓ]ÓUÝ3ÚŒÁÝöÌØ#ÔȲ±0aÑ3¶ÁöØBBh$^Æ-¾ñóÉ#ó ñd$@²<~Œ`º§=Ówõ«ªº*3+3ï½ç±÷âÃÚ¯ˆçÜ›Y™yÏÍ<«êfìØñ8;v¬½cý×ú¯ƒ›ÂòC£õw-t§!ëI¿0vli%Sþ‹“œ:EP¯æåÈà½8¸ÖÓ,Ù°¾—½À^vKv17Ôé÷;î}cÁÍ7[–zî}sÁì–À_„ìùé{5ºÌ™ú`F…™âW)§ %ÉR ]Œî´P¡×L •BQzS@ÿ¤¬lõ”E·M6­_¢|pûc࿎ö×Ê1`¼­®dÙv¼…è"Àxu†û©ŸAœÂÙ·°BýÊ€ýô`œCf7qî´¿…„ë ÇñïÀŽåGCPEÒ£¡7ï7i,R³?ű”ÐÝ·ŠPP6E,M„TßÈ©g‚Þý6ýÍct¹Dï¿K8ñ=×~á7ßüˆöôä_úÔŸË(c¡–-†Áè[ÙåˆêaDÿôwqÛ€A î›Î>`Èo*ÿKóüuÇÿ>¯ÒܹÁð,ï¿OóêŠãï½L¸ßÐ5sZfèÒÁÂYÄ'Fïï,=….mÚaõíc,*‚öæ .X¹7Ð_UïŒ @ÅR¨â´±Á­ú䪾ÃJþØô¤S?”]ÍŸPd@…œöÉýc@óšÀ[²! • 5àÁðÿ*P¬×Àÿº^r¤:)zLïF#{ÒŸ¹Õãù«Ï}MÌ 9`U€”!`¡ƒ5F[¯ ܲ^×~=GE•)©yLMÎ)òu˜`m;Ê<$SÊùZ›sDjï)gˆ¸]Ys ÞsÚ?)hÀ‰Ñ¡§K ’Hð ‰#Ýgê ¬¢þ§r“¯ÑŸçkNÖÊóÝnAQëÝ)@PuLÜ·•šç ŠÆû:òØqR~#]µƒªâÜfŠ÷ódñÖ»|ì3+îEOó’GŽþÌæµâ@W+«ô7VnÐ^,…Sç ï}Þ¡]ƒ -â!W\pøÆã$4èg½1â`}:1HpHLà4þMqHÎnÑ.;YƱXÛÊ̺QÇ:AUã»–œ‹òVT> ú¿WÕö¢Ÿtí·b…- ?ÖCãWKòÆ« gR4ÿ“õsít1ÔéÑÿ—¦Ûóí>h†2ÞÙÏJMžP®7ŽmIφ-ó¤IcazÆòÈÍþQäâ)&.o²¹…ÿö·õ±_ç3$çuÒçûn/{¹ ½ÚìdpW’Ótœþ`ÅõO· ;í-ºa«Í¡•E•Ù5AœÃÏwaîšC"£«Í§ƒÓjÆûUm  ûî€ÝuàÏ“ë”ý7m‡¸ª~ð¡:±¼:²íŠ·ÝÕ¶;¯Zkm»ŒêÆëõ>S€?PÑ8®¯?*à¿é˜½<ÇrÙàÿé÷;>õÇopô‰–þ$ M x¥»²]cuÏ›)A ?µôu–ZÅØQ,]€9„•ádÒ2J™B…é š¿Ö‘9ÊXWÖŒô$[ÊϘìö²3òæ—_عÜP¾³âäí%‡³P¡ƒãOÌP…î~"4ÇŽîAÔ8bŽý™âZcPÒ8Ô‡L_âøNq31À_AfBà}Tx=„È Dª]Š'T5)¤žŽ”ÛeÊyôÿÞ»*X( LFü£ý/âð‘ejºG~ycoh¡yº „wqú!xT—(ï :w¸…„kàŽ`vÍ"7)W¨Ó¯s§hXKD;´sÈém¿'½»DWÉå8Ì£ 5®1B'¸û ªâïüßÐõí{©±ž®üñOÿ…hë*ÆP͵%ÃjS„?y{ék'ÖÖþ¥ì²Q{|l‡\gÚ÷y”[ë§ùàÚ·ÑWVô?8âdv½Ö£+Çrå  è¡ ËÆÖGPCÐFaÞš±¶w0oÐ&nïÌQ‰e‰eŒÎXBƒhChz‹ž4°Ä4ío¬Õ/í(9b?‘öšÙÙU}/©ÿÄúäpâÜ`½8šPwÂx[ öä\;ìíŒñ•Ѿ–í†ùTN»ivxë6lc¨•r4Çëã á-À¥EËoÕ@mõ¡£ãêŠ1èQÚì¼v~Rýc4 áqºBCÒ3L`÷ ¯ æìf^oåþ˜ üOǤëÐòŒËµ1h›ÉõÇÒ>U;T÷¾¾n”¯q”!ÉÀ|ÔÜ ôñhÉïDz÷BõO ¨@´PY·@é0º­=â&ÉQ­”g®EŸŒ}ìÂð1;}Ä6HŠ(^šûTjÛ¤×>Šì†¢ïrçkgýlÀßnñ÷Úxý—bÎm)=N¢ü¯ÿz‡úçDÊ F÷ï´AB‹ N›²Ô–FB‹‹Qþ+î? Ø/ÑýIÏ8Œú?óGä7p0J÷YðµnÍ}~ô‡·” Ú^¿cçÿ:~£6½aéúd­NêzÝýT8cV‘õQ¯r9˜ÒSc=~©º}4´ t»é¯š¿è¼4Þó˜=Éæ$ÃûÓ¬é˸ò¤Ól’MÎ JU;Oèè¿úµ=ø¿—½ìåÉËe‚SçÉÉ÷VÜÿ֒×[|gEXf7ú»>¦s…å~nÁ^}¬èßô ¥9¬VÌ•h©SðWèíb´kÐúk±2ð¯ä2Z-ÓÔ¨^g½<¹¬åI~v>9ÙvÕºe»N죣¿Mûo«ƒí þÔr““ÀEÊSò| ÷²&— þ¼ÿgà„öš£?SäPh_hðgæ4GŽÐšc—õbsh[ÍQÔ•½âZ¥9P´·ù¸k±ÙôÖDÆïMmgSs¾Ò´]gmAœ”©7ÿ•½À^vBŽ^mxëwË;ôìŽÅû·~âÐüÜ3G€¥âÄÊ~³cð+õE ™‰ýÑä!R? á,FûèÏLÑÕžM(„¥m—Æ&æEZ&‡TÊM’bLÓz²×7Nsž œþØ7ÃùùÀÿ0ÚS}½|" 5q@Û ¾Aï,Ñoÿmô0€Ÿãn|  p/KÄ¿k‡ÈM”#„È¡yz¸•AÜbûÑ#jd…†èNÑ•4°ìÐ!œµZTÁà DHTcNÀ7Æ<á Üøóßbmô$äO¼ñï0B²*#X61×_ƒ¬HU?tXÿÇÇWëiÁÁÿè?8o¹>ë·Ñˆ,¥|yVœŽ¿ö?zõëÈ+ ôöáf‡Üè"°1C£ÃKhP  ÷#€ °t¶î]Ì·«ÈÙ mzà–6Q «C¤oQ×#ý!ô ¸@³:Â…† ½1ÂQ´‰O¯D6’ׇ}çÖûaíû• ûCI1Ÿk±L“ ¼Á|T5F WÆøJÀÿbÚ¿*ëÅè>Z§°¤c' ïðë~T¤ö³ey`Ò!`»ý7žö—EÝ6°Ø¶¿&&ʳ° …å·W*Ñ q û'å+ì*¦E0ïL7h Š“`ôÿÑhð®FGh‰NFÿç’t­U{Úaã8‘Æámçm¶.Õ¤‘Ѳz:|çò;¨h²þHáÌåT†õ/>À¿tòÐÇ=Ó²h˜}ºÃšfàOf´7•p è cZaã•B 'Òͺ ñq,  |CP‡††$8|£#œÓ‚ØR%:ÏÉö¿rŒ[T©œ¦9Stiô,NF©¾[†ïGv¤ Ê0½J§‘Ž™ÿë÷‹þ)ÿÆÒFÕ3Ú`Ò¿ÄÒî§Â©ç©&éé4¦%5ŸÓö×íåcLè:©ï/;YP{q™æöÀ*gª>ÿx2¥sÇNµüÕ¯ýûOøŠž 9¯£^þƒßË^®€ìbpW’Óïwœ~¯ãúÍÐ׬¥Ÿ¤df6XqÚ‡ ¸C¡QµÀ®Vh42ÎÒçE²6‡‚,VŠ8«€_Ù1ÚÅà.©¯W G±ÜGßÀh¦b€Å—ñlúûÑM=Ï˧'ÛîF·lOõa´^/Ó¬ þ›’)]?ëÇõ>2ú;ï7öàÿ^.$o~ù~ï¯^.söò®çà–cþA? haŒ%û4î$ Q?†¥º–Æ”í!„@ðÉa BŒÀÅ´Ø#¼L#–¶–Œ]»~ÛÇ Jò½Ú|†tëÞ`/;!ŸÿÕWv*7ÔÿÏÞýÛ'|ü]cþ^OwßCT@«{~/­àÏÌ+Ô~¡F_²´œPµ‚ ¡RZ±Lˆ–`û˜H³ÇçÀ{)ü‰:E”tj;Å€=`}*SÛi¦¦@õ²–§ è’@ñ·ÿ›¢ý7³<Ž ÜP-ZåÀuèƒÿÝ3äX‘ã@Û4Í ÂÌ!í1*¯A¸„àš¡ÁìÒÌ)81À!ˆuŽ0GW÷aµ‚àÀ;ÂB,ß¹6¨kÀ5$ö]F.^9Ç7ÿâwO»<%ùWüß]««`Æ•z½-· œOÛ&#þ«m¥<Þ¶ÅVƒÀ®v$˜ˆüOï_ÕÕÎ÷¢=œ³À®Êì/s߀|ne4ÿ¯,‘›ú³€¾¼ˆ´ý"•è1ç€Díiý-úQìã¸sqñÃY`üˆËTv±lïˆÄ²¨.©Ö‰ÀŸÆ|Ë©, ‹œÌ`G¤þ×äLàòÅ @b¯”¢dà<›­#è<ˆ¶®Ð¿«H±^Œð @ªjºÅÇHë㶃!••¥ÔÅû¬%Õñƒ6.žŠd * Ø;KfYÈV4Éb‘ªÀÊN(q} º‘êXkªÇWñÑúä6EU;lK‹`^˜nЉ::"Ä[­Î Ô¯©É‚ÿ±n¨ii•|¶áCÚp{28.{ƒã×<buêš~±ä"·‰µ‚# ÒØü"!›)uFúÍGpX|ö‡Úÿy}ç9:ƒVèîú»÷‚§»/„… ‡ñ›"ظ¦i —q, ]^q^Í0ãÎ;\hq¾E|Ú"¡EBC"K€64‘À"S@¤ùš2ŽÕŒÕ¨•vmž6¸Ï  W©ÞIÔþ!v]ó‚€ÿé¿©:”)🠇ê^5cܪeÔ*s…tµ>à™Ðí›SÞ}VÏ?R¶ý¸Ç$›tðóÕ_yÊWr%弎ºÃO~/{Ù9zµ¹t€j“œþ ãþ·–¼Ø°úÐsúÃŽæ@Xx£¡v°z` UèÏB¶»v§Hî#ÿmn¡^ñg i[§h§–ƳSKYµG¡³¶2ŠÙ-ÆŸ ÃΡvzš”»%Sw>® £åxŸºueÃ>c]/õS½}Óø<Ç‚‹³—çP¾ð•Oðú—n\öep÷·t§ž›oÐÝ ø…rðª#,-Êq„U ¹&„UÔ‰m %D”~2fFˆÄifI)rÌcÙæÊ_šž2{ö@*%˜v$™ðð9Ñ©»ƒ¸î幕׾t}'”X’“ï­pGÂOþòÇèÎ~®ðéý‰gu¸þFk9K:%¬B\ª1¬ ô!¦ 0¦€Ð3 ƒ iŸ’ǧ¢ÞÊÚ×ôP¯¦¨øjï&¦&†; çEþßýðuÔÿôŸþÇuõþVfÂ@899æÆùG»¡©‚è…á"­¸¶B6=h…GÝ ú9>Fg¨;†Ð‚6ÆkãæÐ È JS¢[ãƒVõ¸°DºSÂbAX)êPgîpΡ­åeMÙ â(VMEoýÅ«E±û¯ÿø¿WrÄN<Ë©V€y½J”uY£rHϱú¶ƒÿõo•õˆ[í› „ù1” ׺ŽíŒïs rîЋþˆrðsúùñžp§%œ´È¡',–bÔÅÌ×EcùW+1JÿÎö¡sh¹óè\\¯À~½ø—ì HpàÅ€ÿ˜ç˜£ëhÇø—ò'ðÀ{û]´8‰à¿Ä=b¿hÝŒÚùdÀ`Q=çX$jàAŽpê÷! :¬+'‰5ë¥/ŒïkxiÝú~¾ÆÅúÈA#T# Éçø†wd ÈcKÙTƒ¨¥•ëÒèaõ~jÒ+'² kuöÿ蜱¬O õv»œò®U¤…Í?}$“Ç%yÌEqr¨uQ•\û£X¥N¾øpô3*'3úoáï9úë4wúÙ’FZÜ\lÎâ\ƒ9¾Å?q ½1TI£6v…&Gõ­ª‹@¾¶8qˆ‹ãV ênOPEÔ£ê,ÙMÑääV-ëÈ*æœ2—L‘@¡‘Y¥?†x‰ø½[õþ08ÊXšõÓXoO¨œíºHƯi’wuRá$í]~JÛP·ae9ÓÑqÏ’n·û©æéYU÷^†ñäWÇ¿þ/,Wÿ#k/{Ù¹ljêMr÷·üÎ_»Í«?wþ$0¿Ý–ÁƲÞõ  îZX`WXªTÁ"\COŽÜÙnC¯%2µüÚ®u ä×ÑúšVz>´Ô¦»ÜÔ*SÇ… û$™‚ü6þ›ê„a*€º^&Ê›®ã<¹:޽¿’¥¬ŒJÔ‹.~hGÂÇw0Ø2ý‰FG€Z¨}Ç€QÕÇï;—ž?UŠö-s)!.:‡8ÈÇ”¾¶>EBP˜@Öd”–j¢›€× €æ¿1¾2¾§ß~Šõ)Þ:4·ÏS áÕüO1û—{[j–·5é.ŒÅÛši°­^‰}NHR;qØ?58UZlÜNÓ?¹±-Ÿ˜ ïm[Z„œºJ‹D WÁeG•ØGS›htÞ©ÌAôÿج³îuåœ[Z')iµº!¥¢/¾HÖ«~Uod¼Æ@œÔ6v’(½“Ïpúöµèû‡ÜùÌ~jNû‚пJ8PÜ‘âO¡qHk žã´Å:]CgN}ƒ -êÁEæ›FAÕ¡‰±ÆD綆&:¸cMa²!Ž……©&Ío«Ô8U}¡ÿÛ‡0zÒñ>t±ËG?”´að.鸇‚ß7¾OûT8õ}®ßoÖàšÚ«ÌBžŸ”7I¯ ™mBÆW_ÎýøfOVöàÿ…eª£^…G¼¢ä IDAT—½ìœì*õÿÿhNâyëO½€Ÿ+«ûƒ[TÓúÏìE‡*ô§ö@ƒ€Ÿ[pW³|o¶_7‹ã¸€;Âì¾æ²rÿÇŽÙ~›(¬§þ¨¦,ã%Ö7Õ] Ù6Øt§ãcF³kÇojÉM:?øZ•ÇÇlrØ&{ð/’£W~þ×>µ3ŒÙüƒ9”;ÿß’³v¬î˜îôsK}íeDÛ¯U€«æô&ªšõßXnuªê6®ïeRv£í幕]ÿO¾»âä{ÇŸl™ßîÍ{©:èŠ41æÄ¨ š#Ûý  Âö 1¿“ö¶ìO¢·S§ÙST³‡¨š"\épRXMÃX ÖëpþTæ)Éy‘ÿwîÞŒ÷3õ¯“õÓÀÿ¹)2+üà¯òc¯¿ÏÍ›à°Á3,Ï*%aíB±èáU@Å!![ÁÃq‡oR¼ (bàÕn—õï’“?øÍsŽÙMiîÜàèwŒÿè?avM¶„Íq¯©7œ"K!¬´–ÏX»Bó¯+©Ö‹~\9‚Ǩü{‰^¢Få¯Þåh ‚x?´%F÷›¨Û´@bF?…-âs;”¤õFfúKêSÖ熠ü7SÐÆNîÉG¢ózˆHÝ@ÅG×Õ˜mœúû·@ eÑÖÇ+cƒ{Z¯ëG¿¾…†7 pcÞüåý4ix«Wu`aÐõö¶¶í2†æõ&Ú Žh¢¼Ï‘•šJio¤œeð 6j å'ÈZŸ.žŠäö¨ I‹ûç´BÊá  K *×fn™  2V¬_ËÚ{<|®µÉ÷2pLˆd\Éc“¤÷Êörˆ•$²T‘Ö°)'ùý”‹7÷ôÿcÑßyæÿú$¼Móâ!rß!8 8/È"2OˆZÄíŒË&NS¤Dÿ·Š„È\£mùCƒ#þ©C¤¡!Qý§ô4Æ€SSüÛ(9É%G·:Â?þIǸÁZ=j™Yä;dö—  6wÖôŽmŠþ¯@ò¬S.þ´1±¼MÅà|'ò8W®eàÎðRáìSÞlÖíù3¯Šúèb):{Ý‘‡vxzZ²þJêî±{s/{¹Bòâï=ÜIêÿ÷ÿþ«ûžæXXÝSüÒã?·¨7Ü!øy@Í¡ÙuÛ‚;r´7•Ð ¡Wš^²-×ìº hýñ1°K°ºЋIG€: K«¥¤ÜÖõ‡h¶‹\Ƈæ£ËyW{‘»µH©¶éhÿ)ð~êãe ØwŽß´—§Î¿—½l•×¾tÏÿÊî¤Ë^ÞõÜúÜG¯4¼ôÏD\ìú¥âÏ,€´ÐŸiL•9P-,¸¢ŸúӀ̄þ4àÏ™aºxqW‚j‹nUÓµÉi ¤u† +a¨?§¬ò·Pý96¥I®¶Ž”ÝèE{y.e—¼C|gÅ{÷”Ÿ™±x¿gy»§;õ¨¿ „Þ¼™L±˜ëf&¦Ð–Fg"MT~ ‹ü÷+£Œ‰ÔQb9£´q‰.Ê&…ÒPÆŠjjSK±Qå)(ª)ðÿÞ½ëć €ý¬mŸþÇÇYjп(vûíïýàã|þ§Þ~ôœrp‘27~œ³¨ s’ƒ¬zÐátIh—Ðtö7;ç ÌÊ£Ó Þ?@ú{èò],aîai¨Qþ›QÕŒƒÉøn×që/\-ðÿßüÌh…!šÁ r°ødÝ=m¬`-%Ò±ÇMã4ƒ6« ûð_ïë0°ØUFïô¾åý¥ôÍÚˆ˜®S+ (-Ʀèu‘ò¯¤¯Ã«%ͼø7ÿ ?zõ·i^mñï6èiƒ\ëÑ÷ô¬Aztá`iý—]:˜y´ËgìÅÊ]\z — òk¤ú—>‚þé£9éÔØàÉä«q¨úÊÁÄÀÁV9¯Q%Ä~fÀ>¹¯¥TƒHuÈàˆ9ŒœE„b Vòï¤DTi+ƒˆþ8ˆDkB<$ë¼Q?âŸä`PÝõxÊ,¥Í¶Ñð’¬é„e¿ÇJë›Vê·wC»i] ØçÿØS’©IAª¯÷ÉÝËjjÿª‹å¯§á)×úšw]ï‹O³]êöÙ”¡8kÕ‘6 ¨£nòÚ”\‹ößþW`[9ã¦{ úåR'u}ŒÐ×™£©ôÆd€€“2¿RJr€õœä© ¸{Pìdý¿&úw?Žÿ…·9üâýÉ‚pCC%,„0wÈa0§¹ÎYôgÎoºŠôÿƒ¾1‡·àp}ƒ„Œ À¨þšÐÒhƒhKu§GƒÒàÛMŽþ¤¿I³¡jNĺc\#릆̰‘u{L®«Õ{DyGÖÞ«j; Aé\g—ßœZ,º§ñÉãÝúºéž|O=ÎHçVs‡¢›uPÖµÒè²ÔS8MR°_‡98À…¼›è åÜ=|{„“§8mì‡Açÿ!ο.>D'èY‡.zEƒ#±d*sàæŸ¿ZQá_~ó?D$%‘QÁ"ükÈ/8“q¹€©1P{/.;Žö·e1R—õ±“@¡sÏÿEð?»ébrthJFUIi+ŠI•jŸA]n†Òá"&¼îí}äcÿËÏðÞÇ¿Nó }o†>Ž—èíGK8‰ì˜Ña}¾oL/vQù{ w6ë]¬£ûÎò‹è— \¦÷ue½Ê_ìjzãä;o@Šê—ì BÓ´Ök¤ôâÒÕ,1û „C%RþR)¬Ôc.àI Û='µÝåâ7à·ì¿‰†W£Ñ¾¦á•ú¸êíøh_ÈC›€®­×õÓ‡¯m» ïè¨á à–ÉÆ€NZ?ßV•õtr¶·Ã.´Ñ¶Î3‹ÊàâûjK$Í7쟵¼åQi¯ƒÿ¥­l± bÓ-m5Ú q.Dí” Ùq¡852pè@3ؘX ÌSÙž“†,—Å[{€±È/¼Çññ)¯{cëFFü'ÙÑ49É©?½³ôbiŒìïÁ;¤wˆw6NzsßS€wÆŽ\U_—¶‡ј* 4äô9j¬NãöPÆÙÌ´¤‰MÇÊ¢50®…þŸ€Ws¾êQ „Ê{EÑ?åðõw*­'Y?ªlrÐÁ;Héíà _Çe¤Â«ê¡óDškl˜C@Z²âÊÎd†\ÞÊâúV€5¹…6ŽþÿðÞu3Àÿó.æÀÿÐ_çjä¿™ƒSS¤`¢ — ( Šó+Bçgˆ‡ÐthX€M4Ì/ á>$,>@Ïî gsX3ðúBC2˜¦Èÿ›þ[üâ›ÿIlÇѳ `-n…6Ö¶•Hþê_)õ ¸Oû:οÏþ«sðßí’£¹ëë¯ÎÙàO´D·Å&À|­ :£Mú؃ñA;-Gßxw~ú7O,qs‡Þèу€Îæ ÌzælÝ)Ú;ƒšè@³tÑXJ€¥+@,Úqelt«Æ@¹ecmÕ9tëÒ5hãO?: ,E€9 4–Y#°NëƒÔtȶî0°Cb‡Q-;10Ä©þN"Ͳ " €­)°.l™ÒD„¨ó+#tŒü>hx tix?ÈôQå"N=-ëÅÄ ë[Æ:îéË:6´­]ì^SªŸt¼KýO«»Úõø_œájW}øÆIŸì@ Óø*i®"Z|‰òñƹ§ù>Žÿôß: @6/j¿Z~vï0–ð_ý>æä¾pF¸ïð'w=ØX¸Œs˹C™©ÿ«˜ 1t ÒÛø' ¸÷ ¼OLÕ2‚õN -¢Ž&ÌlòÛShI PÿÂÿôR߀0sƒ÷ õ³ qI ¸€¨ó&Oä'yž˜ß¹j,¬?ŽÒ¿c½óäôòX”±ïʤÂIjGë–¤šƒL·ÛÕÕí²–òÆ¥ÙÊ€èjÈø(?ØÝš@îe/WLÞüò ¼þ¥—}¹ý›–§úúë-«û¿ ¾âèîü2pôjËìºQX_ûTƒŸ[Ùš§?µ9®*t”öÀlG¡¿LóiÉ`VŽJMé^«hÔA €šò‚ö?k§Á@ü\ˆn(o«ƒÍñ¼ÕóãúMàÿy@þ6Àÿ"×±—½ìå-w¿ºàÚ͸÷—|p2Ï.«qûŠ ¿ÆebCIÉQ*éÉPSü0/©T€¢'aó[þ|éËG’ÝëU{yæå‹_ùäN(´þÑœîÔóòï?bqÛ³ºïQUÂ\XÝëóÄly×\‹¤ºS›¥õ,%€4–ÊÏw•XGåZ¯Cª§ä‘”&{QÑérT¥W@’XWƒÒižªò{pr< Ú+uAýéõRëNø¯ÿá²¾Šó€±¼ðÂé#Üa6· WëFÎÔïöëA#-A }À-àîè]àÚ{w ®%h@Âן¡Ëûèüº8…ygyÏ4Æ"…›æÛp/—'¿ø™ÿ”2j[Õ–Ño¢i¯²LIJÉÙÂ"þ+0EV«ä4éM•ƒ|®zþ=þ£ÁZ’);>Ëø\eÔ¨’Í :¼Éd˜D|ƶ›¥×¥¸9(°üì»öÛ=9þ­ÏpÿÁ]äõŽp·EÏyô¤A皀Þk`Þ 3ÎXâ¢SÀY3+Ðû-xóÎ?s‘!蛘À!Ý ñ)úÑႳTqIdpAÐÈBƒÿ@Œþ—Íh9ÑSô¿ˆ3J$Óÿƒ‹ÿø€&î[§Hý+wùhkŽQN!„èÏäs¿)ý)®'M†×ñOs6\›à+ã»ÙP.LÃK>¦*“ý­F'zœÈ^.$Û¨Hò#«-Y›öß ˜(Õ'G’<&v7]‹ÞO°^vÞ©€Èþ×Ày:Gn*ʶ¦®xÛ1¸›J_ œoâ TœâïD1·AºBE‡9ÉGΠى§ž˜J¼·mN9'_üÝÛžWÑoßàô/þ:³ƒ@sv„Þnzœ´Ù€–H)S1tæ 3’qizµ~iÜÓâH€ãòcZ€µoë‰æ?:Hóühð_=Ks…§Úju˜S‰¦is­ñ×Aüúý©-ã::®Ú=vÿÑ»²ql|Ü2ó/ffŽcO5ŽnZÑj¹¡}SŽ«§Û‡{¬ëöZòÜ F:¬ 6üÔS”=àÿÈrs/{yfe—˜]Á¢Tô맨ZàÙݯ-YÝñ4×…÷ÝOs(t§ýiÀÅ «~] ?µ¨¿´4¯®±Öae)^Säª4d{¯8 Øê¦t­­ü×Cçe}®_Žl»Ã©9ïØñ$dL85€ë†íãu7ªß¶ïÞ±—,G¯6|þW_Ù9Gª$ó÷zÞý;'|⟻Π?uÀê®gy/0»!øEÀÏã÷š³)~YEü¯ªr§ ›#ü^ÆÐÀÊjTjÑþ•^J²Æ°éóæÙ×µåòQؽU…퓃³ù¥xE\€FçˆïÑÕ?;„æ'ÎÆ.¿Bº%t t¹‚³Þ¢½<×ÿ•·ê¹ì’üÒgþR j`0•ŠÃ\¶ç )ú>Ÿ%çX­À†dj®‘lìS¥Ð°ç#cyàà@Èñl€ÁÈÀs!š-ÉXÈ“Œ`–è´:‚ª6Pë_Üõ|¡½/_Žû î-oÓüø]8l¯÷싘¿h=ì ÄOàwß¿™Õã‘`N½àÑ»’ ·? ÞŔض –Þ:Ä~Õø«9°Q"ô ü ) ~ŒxL`¾ËۚʠÁ¹âœN’Iî‰.wžAô¢ì>“#Q5“͹»‡VøÍ² e›|°m4n á8<©k~ŒGvãaÀP¼UÎG7¶YhÖôÚ®4Á6Y»dK‹0¤Ù†ýç¼,iÿ¬¬ÞêLµ ÖÀÿhYm9÷ÂË^2|­(ÑÅIß'Š^ ›Ôï]q^ØÆŽ-ãöùýçä‹ß¸À½=_¢_ý®¹ÇžÕ‡A=îVÀ¯uÀLÐÎæŒ´qìS ¤Ô Œ^ßÀø€8op±ëÐÐç48Bfˆ™¾ß+@rÓjœL *ÆÏì `)urêœôŸ¦r¤CC"õ}ñl3%h ¥½ñÁÊi[rÈŽqÛÚ“ñ>OCçºçéÝèSk ‰ï_T3/Îp¡këuýôáWV·>)¶§¼™®­Ÿd ž¶ìAÿ,ã|¦“{ÙËÎÊ.1»‚T_ý¯ßçcÿô¯4œ~¯cu߃NßëÌ¡&¬³ïz |gA\næho`i]cmí-GœÑTã0× ràOå<ÍûLFø×ËçWF`Ö×ËT_[ƤŸg“ΟÒýõ¶1À¿i¬Øv¾mûïe/YÞüò ¼õ‹/îDì&9ûaÇÍ78¸é ùŽ>æð1Êß’Ó¦„Ž˜ …ÂfßrcRŒfYœ‹6àfh÷SÔ©}ÿz,evþeĤ"õ²Ö³ã?ªí0ÔωÞݶ—gNv…êöoÎyíK×9úxËüG=î@h 9=QD 9¿P \Í2^iŽ…°T´×8¼å#±ÜP1g¥´]›D¶RR4Q¡srÞ’—è„¢ÚUùþ÷s“ ~ p]öC×­ŸŽÿi³“ݯDß AÿbG¯Ëð·_ã3o¼Ë‹/ž<Ú KUÐ!(eSO+qX>VÌÛCˆ9Lƒ‡. ³mç¸ÖÄ™¡3(‡?ýìDÄýÒgþŒ˜fÅÊ(!cëÕèAÓ:"Ñ"°5—ç^(gÓ @r p`IûÉhΞ÷#¯>WòÄ)¿mÖh’㽦ÈÊ”‹¶8Ô P}¯£¶_•¤uaù3ÿäüÆ¿d9úÆëÜ¿ýy©göþÇ󆾉ŽóÆèœD g”þ3s(ZoÆò;;¤õ®€þ^±3@Ì_\èþ õq)"p‘££ƒG)2ˆ¯¸@Œ&™Dño¿«œMøŸ£!«¾X¼ÁBõ©ºxmª¾"*'’)™ÚvCÈ:± ‰Û"™‡½|<²ñˆ24è #k[7B8Â0u:hÇÇîñíÝ9µkÑÃÚ!ð|‘›ÞÖ/G.Бǣ\†Ñ»éƒµ*¥1.iy4Ø þ´6ªGÕríç9ØûV—û1@²b)wÛB¥‚"/衳xkOÿ¿&¯,XýבW—ÌÚúÃ^zÜ¡Ài;»87Y´àl¾AïŒò¿Qð×·ÐiÿgBãZ=  H­Îh˜( - 3i¬,-BC#Mž_åTHi^•''Õé0LäyRÈ Ð@– Àãq¢ÌY`˜6wì@W>œïÐpñTdðm Ïz*œ+«Û7È®¥‚=ø¿—½ìe·äèÕ†ŸÿµOí h5¯çƒ¿Æëô‡/6¬îyü±pãåú7k tòÕÝ@{Ã1kÄ"û— /8|`…U òœY£]Êav†4§ hÛtÓ·íh"ó<ɦ;ž2m³‚g«kµ_ý:>þ< jÛ”ÀÔñ›Ö§d÷&{¹t9zµá‹_ùäNÈn“ù{=¿ñ½Ãì¦ãþ78y»£{à9z¥%t†{IK~Õmá)6鯼m\Ï0’Šî¬ô(T&“ñ¾Û–lXßT÷ ËnŒÖ{yæeW¨¡¾ý?~Èýo/yé÷sç7ôs‹üwŽî~rÏ„å€;0’pA½FèÏ”°Td&™@ƒ¨½D -4NP¯H>ƒÑCÑ’'"@àž,ÖÓ—qù’e ü¯Á}(õeÛ°n³@,ü ÿÓÀÿôOû¤ò·¿ó:_øg/´ìI¢KYÕ€p’M`\6ê DÃ{tÏÁ~ûB×qÕä—~ü/Eû¥–9ENôÝ’Ø1fÍ €ÄH`!¦UdÚ•<Ú'šþT•0Œ4ýOÀ+pßje ÙÙ ÿ'R ’;FƒLÇ.Úæ0éKBFJ·'Ãn6Qk¾{†©ÉéÂË’ÂâéJ{û&æ÷Ï-ÑEÃrq7E-‹NLQŠ)šM|MŽbtþ¤ìÆ.S#÷8šH¥lÎ\ƒD ,§°ÍDcsR®™èÊ*¦ëdðkæRë¶Ú²páïê§!Es®××{ÈöÝ7zÕ½  pë±ý -7ƒÿi÷íÔ׸õÇž’ljœê}©÷ÙØ–u;\‡‡—iðÌ:ذW™›¿XµúMã_yGÓPŸýñÿÃë€_'€z=Ý_úª–œ[|àP³dgò_qƒH¥8ÚH.Þ|ÿÒ#:b>ÃrûƒƒŸ¹‡ÿÑŒÅmÁ}jŽÎýÂÁ+¡bÀ'{1ð?2ßà8‡kšÈnÓàœGÔáÅÓhƒâñ®£¡E¥Ç³Âi‹J Ðãsºá€#Jôþh®”Ƴ4_j½’çh¥†5}^uR¹®¯æIÓ®Ÿ&3ÚþTuV=0UïbüŒØ§Â¹² N{Ðÿ±ÊX \þÞË^®°ìJZW0€êü`ö‚ãà¥?È0»éVhÅ!‡‚_)~!¼dvZ?WÜãø¥âfÎl¶^‘F‘ñß ÒXpXs czõŠz‰ì¯¶D!SVWÔÿ9Z5­WŸïS««^ŽËY¿|9ïŠFÖ»ÉãÆÆŽ©sÖu ÊOÿÛεÿ÷òÐrôjÃ[¿ø"oýÒ‹—})’“·W¼ö/\畟½Fwâ¹þÆŒæX (ý<€ü2ä”)ýRñ‹òÊ&êí"ågé²þ_ ‹v¤ùÏôÿ)Ú?êÍ5©Åöÿ¼Gö_TvcÄÞË3-¯}é:_üÊ'/õÔüýžWÿà1ïÿú”Ù­†ù»}¤}Jÿ1'IgJÉ”–ç))¦˜«$xô&š)IRymrG,ŸGåEä"àÿ0ÚTÝÆcjºŒü‡øßí?ý‡×}Á”•j2š¾¥k‰W•~G1°¿/æÎ4h]ÿ£ß¹à_=ùSŸùÏ2:{Ð${(MF¢øSjN;¬ûøÖgJE&çø ÑxW_mC5Ff—‡jǧ<µ5ø/Ùp[n/¢<‰Iºþš zà×Ó…¯¹m’î1:”¬>û£ ?ËööMÎþŸCôzϬŸî7„{-r«C:$Eù÷ à:1F•^¢Î¤4GûØ!žBéï1ß;ÄÇg"ð" ˆåèPShŠ# !‰æ?õ7¬‹€ˆcHû4âh\#þm»DV€²OücÿŒÑ4ŒphûÅ0ÈûR‰®÷•+V]ë“ IDAT1–Œthý®¯ïºßÄ·«‚5k{Á’ ¬­,’6¦Áp«nÛ ø[DdÜ–£]ËNµËåÊCDˆF ®8® Á~ͪ|·UN>i½:=·]69Äú¸ŽVÎFR®O´º)c—9„ Y"Õ{©eȘ4eY|vý?}ç˜ã?ö!³×=á´'œ):Â\à0@?à G—]‚Ì0朥3€ECX6¸FñËYÌŒ gÙkM?ÃùÚàMƒ}dj—ÇÖÚi.ÓúËU:€ÚiÀEúë;nðMT|hâœ)2c õU €—Är:^×»Û.¨™Í¯Áh[½ç‹W(ΕÖí;${Àÿ‰É®t̽ìå™]Ië fç½ûµíuG{]èî{ºæPËÀꃀkŒµµ{òNXüB‘Vñs›Œô')ýkÀµÑ5O!,£M¸‡0×l ®íÂF×Ú ™õªºç¤Útgu+Œ?ìÇÛÇÛêÉÆ¸<%Kàh¿ñ1S›Î¹—½<´\ºÿZæïõüî_¿Ãá+ ßÿ_ï³¼ã‘Vp ø¥â—i¿Œß.^ «éíµ ÜÏ)°'p²É·|/OD®F¯ÛË••]ÿï~uÁý±Ìn9w=¯4´×„Õ}ÏêCh¯;úÓ@p‡‚Ÿ+ý"àf‚_ü<à$*9EZKVi2gJN{lbXMIžLÉÐ5šNz+ÕŒ¶mZŠò½¿þ‡¶‚ÿÓ4ÿ)ÀÐ `’¨éþ‡ŒPÀþéhÿ¡@*Éhýa%"@:š£Ö9oã3„Dÿ~óO~ëQðJÈŸ~ó/3 »Ï HZ/\gi»­dñ¹ä‹Ë¶ S+±˶ØÝÍÎðl¤E˜ÙlTI–¤¢ƒußÐáËþ¿§Oi½®ýºÆí"åþ”F&Öƒ<¦W–µä-³ ôdOÿ?%áo~Šù÷>Äÿì}üû-án‹ÜêÑ á¤AŽ=:oÐEƒzˆc"3µ10xï%â#›Mhmpšl\ˆKœ¶™Ù&ÕI\5v›)P?±™ òäÀpœ¬YŒµg8ÙS¢ƒŒb)&0À?¼ó„àñxKà ÷¥0UƒR-—¡zÖ_mcaqÊI¯OR7Îðû¥Ì?†[7ŽØÂsœòf<ö?¾YÍôâ2ÕC¯Â´t/{ÙIùÂW>±i]Áì¼ïýSÿ½ãî×: òºæèNýi 9ú•–fÛ ½ZPWgöZöc0X«B¯t}ú5~eпŠVͶÞ¡:·•÷2ó뺱õ{ªÕê}…á ¼iÆ$£ýí·é˜"ûqf/Y®ðŸdþnÇëä³›Æfº¼ëAbš”.ÐÏ53]ûq¤uj­g#Nj=Úë 63¨xì[hä4P§XëÚ=Àv¹Z½o/WJvü÷oÐ\sô§žßÈ̼;>EÍÀâÄg'd¥*¥¥>äIaí陕'Ó¼'%••R]†õéÌSHÛ¢ø§Àýi‡€êã¨ÿÝÿfÎýÇÿþÔä}}ö­ðÒǬo˜œR¯žái0«ÝÍ?ýÍ-­xõåO}æ/‚uæ:ÚÝdl–¥~0k¢UÁ žøK2™F$FªsæðZÁ¢ Í#@5æYÏN*8— ®Hû?zÆ -™A|ò½*U9E¦QÿUÛ$ð$^ï Ú,é:»Ÿýî9{^Ž´·orö­€{yIxwF·E^X¡‹](ÌêƒÑäÝ’“”ñCº–ßxiìø¸ìÅŽë}¤ôgyUjÒźÆ!¡±hE)ÿƒ@ˆ D(QŽN"q]„ÅCŒþwâÚã< $1jeUhÄ€¿+5C)Év.õ¥qüzþ“ãÐ^ž–ÔÈ…D/È>ZZCRA¨0ˆzL§© tü;OmÀÚ5jµ&ãÍÕöIð¿ý/±}* {ívªväI‹@}£øO[âD¥ã*}_ï7~·utŽ'&ð86‹e´âÅI@ã§±+F%çIO¹ßâTP÷õi9ýßx7zµeÞpð†‡•#œ68i‰ƒ ½{³`ôÿ­Íe´oüã øOŒâµ1ÎiCZDšèÐЧڡ@çm°wÂåqJtÝ ¥äÉûŒÞ¥<Æ‘Þ"—Ù$ ÜWûTRd‹µ\ëbmùÙô]ƸºÉ­£=dûîƒû8žwìHêv<.¥åfð¿ sψnߨfÀ“Yþ_ŠìA™½ìåe×Àÿ»_[°¼Ûsýý\i¯9¤þ,:KéÚ̓Ñó‹1ô‹€kÁ/"Mµ?טÆUÐ.Tö_c„- ¿;o¢§†gRL¡|K2ZêÇåmu»-Û®ø¢w35Ù©?¹Æç™úX›¼ÇÛ7í³Í»ï¢õçíå¹’« üƒéØïüO÷xí_¼ÁÑK ý"0{ÁÑ/”°ø…£½fUýܘÛè¹Na×îÔ·Õtl{ „ÎÒ«dÇ+ŒQ 0i«†T8›5½¢©©r¸ZûL6–mŸPlY†åêõ½\ ÙðÿÿûÚŽà•Åmoô#½°ºo *Q•ø¹BCåýYÑ<¥È~‚V‘ý: 2¡VFZ))Ås…å¢àÿ&&€T…ò?K*3ýÇ@ÿfàôŸÂÔÆ©¾ù­Oñ¹Ï~¿8DzÜ,ÅBÎÚü.®Þü³¿{±F¼¢ògÞü+p› Ü.à7¶ceàÂàf™éêLÕHW+‰¶=éñQ‰‚F#tüM‘^Q›«¾Ä)RÄ¿dv€âjðŽ1 Ÿ®) Àþ1ð&Ûåa@ÂOÜF_™_hÿ§)íí›ÌßVä“+¤kø¦mг™1,Zô¤5 |iŠ]€…  ‡¶–‹Æ¶µÞrwÎú@#þÛ^p1ÒÑhö"½ÀRhù“È !~£“Qz§ƒ„È® ¨!Ž€õ³œpNÄ¡48šÊê°RCRøN 4"F®©¿Ù.9§/Öçð¿8_¶ìfôÝæ`Ÿ""%{dÜLøvnk0ÃÔ#Cq-žŠÈDaíWÿÅFXDFéQª äÍ*QïŽyý.§úæn@D²å:¤¾å<ÖÔ{—ÿEæÏ {Õºî-P#„Û"‘Ëþš˜Ò’ÆÀ¨b3@ݦåÜ›0É“/>Ûs¤G•»¼ÃáO1û¤§}£Ãßü}Gs3  A—­õgôÿtbi:Gè$²4%=Np¸Õ çÍ Àsj‘ÿ^s ÐÑ–fÌ@ƒ§b ¥Åþ™@IàÈ á*Sú¾½#¾š­¿+eö¸áýЉm»2ìm“Ñ‹¡ìP*aŸò¦þ^xB²ýŸªlŠö²—½<¤ìøÿáo/+åå/Ñ›ÐÑÍÖ(©[Ác«Ì èw-¸™âŽaeö™ö†1´Ç)è+Zgi£=Xz‰ ¯íÉG¹™ÊÈ\H0Ÿ9[ðH¶ÝÕywr’—:~!l¤w%µèm©Ìê_‚ÚÌ#1ˆ‹¿Ï•©Úëk&ß×òßî/hˆl@ üWÌÙøÛ%}-žó¢‹ÐÿÜ÷·ïs ÒþèæßR¸éiNŽ?šœ§i„p¿A‚ZtâÊÙ;sÖ‚‹w=o6ÀLÞß›ãF "4?Ž6 ^ÐVQ<"ð¯b‘ŽøW=ø_9Øz¢/H‘þZƒ»±§ä°f+«ht çÁv¨9ˆF+yñ(Q—_!sPI€² .]GÈ×°§áضvÈã§á­ÊA*†ô‰mžëHÜ$Ç–Í¿Ž<‡5l§ó[):HŒà­¨ÿ%$€‡A¥bCˆÞ-z‘ÛÜ…þZƒpCê—@7Õ~iœÐzG;Ê‚JÿO,žŠdÍVêˆýÁµd»Ê9¢ŠúŒ]15@Þ[¤NPÕ܇o½ûÄîñªŠÞ=@VBøÑý»ŽpjcÿÀ¡öƒ¥ËY9d¦à±1²vŒó΀ÿàŒGëýòn»8–Itàq™W1Õ%«JzÙÓsÕ…Û?!kÄ`ó)$§ 0')—ÇÄz¾“z^È Já±8ÃMôèK–‹8Ý<]ا¼Ï'ªtMVS=³ÍÓ• Éô¿4Ù¥×n/{¹²²KàÿâýžÅû=ǯµH ý<Ðôbé]O¡Ìn:¤zö–X´ÿ2ÐÞrf ^I¨ÚÖÊ~¥¸Yc`9€Vaƒt¯) ¬NP¥}ÝXÕÕX•ê©êÎ+_MÑцÀÿxÛÔú”Œý©qàÂ3…Gؾ—çT^ü½‡¼þ¥¼õK/^ö¥|d™¿×óÍÿá./ý¾#ÎÞé9ùîŠåÏìÇéVô'$¦FY©ae}ÂÊÈz³fS)ºR×ôå&]˜Í+TõSå½\Hö{y¬² àÿ‡__ðîß9åú§f„î}c  Ww=Á+Ò ~èç– ÊGàß/m"(D?)­öG…’£x%¥ÉÞHqåÉ<Úf‡ä»Áÿí`ÿEÒh<Ïð|P€}¿iëõöuà úO¥ð»ßü4?ù¹Ê `|X8„[ækç¶ÛU–?ûÙÿ‚A”{ýŸV@n2Áë=‚¸¬,+£±‚ˆFeÛîâ^™†X¢©:77[:©H>"å]¯ÁI@–\À3~‡h¨ÎпŽú/ËØ*”k¶SEÿ'¾µ½Ýž²|ÿeNc†¾~Æawð Å­îZK£ V/¸rèJ+1ý™£íÏõÝ/ýï]ô²·óHÊo¬btþ!z $plê;m*3n½ÍJ.™½c4¸95D |VFáLxìbÌ£k€‡sq)MŽ‰Ì´É.‚ÿ ËöR*õwêfð¿Øà÷4¼ç<=ñÒT,@JRtH¹‡:ŸzBÀ@Ð!Ø•źCÀã–!h1Ü”œêíµËUyF ÉàPÜ·ÜCl³Ø>:ÒÁ5Xt5Ó"Ô«5DV®×JQ‡W·¡kÿ®×³V~Ò’?+×i’CG¹áüOôþy´ŠÇTeJ¿žhpR`Ï0%ú4·:h€pÏ!‡=Ò8ü©Cš€\·±SÆÐ}$j㥋é«©¦Ä5.ŽWàB|·c¿ æT§‚ê(N4ZgD#›NÓR € ìoN à°}l¼uÑ¡ªbêÒè{XqžÜË㔑Îݧ¼©Jõ¿é˜ª</§s³ìÁÿ½ìe/WUŽ^møù_ûÔÎD±ž~¿ãÞ7¢E=,?ô¦§cäiè•Ù-#LÁ‚_[ŸYÙ/7mÔlÄ­iü&X„øç^í¯Óð¼VŽÅ&<ü¥¬\$  ÖmÄWoê³íŠ·m«õda[Kl;ß6ãÃyu?°ïe/•¼ùåxýK7øØO]ö¥<69y{Å'á:7?s@wê9|ÙÑF m¡ø…½ÂÝY0&€º“@whŽ%cknFÆØPèçöÁVoÓvc=ªÑñ*ãm\kdÀcÌM‡ålª˜Ò$W‹{²#ù^ž ÙÏÐÓïwœþ ãÿüu´W–wzn¼9ƒH7⎠;U´ ´7Ú¹)§æÐÑ·Êì¦)¥° ¸Î@ÿè²"RËI&A4%„=Žú¯&~…eµ¦´ªºëOI†à}©«þóÀÿDùýMù?ý7Óþ—}Ê’Á>eÝö®×2µ?üÎ7Þà'â{¼üÒ}©nýâW¾ñ®üòçþË‘Uà¥U"µ‚Æ­" ¸9RÌê èÛZ§º°F!í-\B 0—#Ò0àÔÖøkš¶4¾Ù`?‚¢Š‹`˜ªâÄ\RÞöþÇE¹o¡ºÿâP;Œÿ!èŸ"d‡Nõ"K¼lÿ/ûaߗ㯚ßè ³žã/ ßÑë’æÀ¡÷gè‹Ú_btÅ. K1ãÖ›þìÚöV–=êò_fÀÒ¡-ØLÑÁªÃ`޽1 Hïß\@BcÁYYН¨‹’Ÿn´èJšiî'¶(ý"¿úÉ.žŸ‘F,Ô”½õ““%`,}Ò¦s‘ô}+Ž0â|yUwÍÇíixŸŒ”ÎiE «@ÄÞ@³zB¤ºÖü\ë÷:=“1(>õ¬×ÍÈäz]Ÿ Žr?Ȭ»vz1V€´… ‰zY“@¹»«–AÇmRuÀÁ]ŒÒMÎÓ73qg»ð±Y ÇÛ·Õ+q“2aM³I›eóiúà_:ùˆÿ Ê{ǸãíK2GÕÑ\„¹ ×i!Ì `céÂÆA]:8k‘kjãä*@«Èª¾AE|‹ëhWæÇHQ‡‹eÔá4–‘²][ ‹Nü]bשb9¿K:tÈ0kTówPåpçZ!ý…1ÃRˆLTJXÑ‹<9ýú¨²m | ¿¾Oy3üo¤Ûë9H5êS'u:T¿+›ŸìøßË^ör•e×Àÿ¿¾àÎo-¸õÙú“@÷À]¥ºSOwp3lÛYÀ56öù…ÑS»CÉѨµ]7äÈÔ*:5Õ…áú³+)'µb9ªµúN¬AGšJ—ú4ª?/RýXveJSdÓw¥ã;MƒmØxÄô9§`•Ï›~Éhyž\ætn/;$¯}é:¯}鯥ã_OJæïõ¬î{Ú#ÇÙWÌß뙽ؠ½Ò/®| ;vJ¥Ý)Ë;%­¶t®éMíµèÕŠò¿Ñ´:`«U™ja]–MåçXvc4ßË•–£W>ÿ«¯\ºò;{§ã½_?evCX¾ß³¸Ýº@sì²§RèÒ€Šy-…¨|üJ A ª‡”þ~ÈžGÁ›bÓÍ“ å*¹¨²JXßHyeÙQåôö_ûyT!¨«œ¶ÿmÿëãÍø7¬‡mtÿçÿãHÿ¡}pªnl³·}~çwßà÷üäwN·¾ü[܆WA~ùs_ÉÀ?b‘î €ÿÚ tîÁUÚ6òZuôL‰êlfˆ¢Õ’į.#ž5ÚZ Îæ ¨e£¥Dö&ƒ€FÞIoD*Ûr­)ÒIÎaýÔŒÒS¥-Ö÷?Zôå9áOìŽÀì½¹wûò{pHÿ §¹ƒ¥°š7Hг†0wð‚GÏ*®™³õEÕrw z}…®âó¸æaåPuöÝ5à8î Р±´b‘øÁöõ.‚•.¦@âÒÅíÄPÇ5—oà ü%€#í›#À]‰ìWÁ#ýÅÑÐÄg߯>‰~B\–µv?*Ë@º"ª«ÙÓðLïkÆ÷.T4E$=‡DgL§]§Hãd‹$Ç¥Êi£vhýòc»—a³ŽÀÿý_€ŒÉÿRê,BØê²FÖríåüI׆‘žÞt¥ã{vØÏÎïGu»IÁ‡&ßÁ±öÎ1¦Æ½Ëx=k‹[ªÙLM^<’ºJÃÖš¡ò‚rò¾ñðýȯŸrø3KÜ-³ãŠ,Y.×Ü€pê[г޻éѾ7æœ^ÌA®³±U¼ƒÎA iß œœop¡Å…†ÆDðßêÚ¸ÞÚX¨wÚıÑÅ¥­K¬1G¢ è—̳×%Ï5Î §æTAWO ä¥â£.ýÿÙ{×[²,¯ï·vÄÉÌû¨ª[¯î¾Õó`jÜ=CWc#÷ð˜i@PHàKøÛ€?[È#Ì`[þb±-42à  ,ì`yÀ ÉÂdKÀ`<㙞îš~WßzÜGÞÌ<ˆ½—?¬ýŠ8'óæ­ºÌ{÷¿*oìxœ8;vìØ±Ïú¯õ_¢gµ–ébCæ«§¿Ôj {ºõaíÛåÈ2³žÎ¯Ó»¡¥¼©Ú‚]m¿ý»ÐÈÿ†††ËŒ‹ êZãþ;î}iÍÕ7 'Õ­Ía`¸ï‘NÐ~1â4T$ ä w˺ÿFHS¸R‘ÿ$âÿ”4®[]°mç­ªcž |Ô+™n×$á<çžO„ví?íU=ß~žIÔ£5?4\J<뤭ÿû˜0*¯þú“ý¿Ñ±÷ZÏxä{¯ôqŒ•Bþ×ãí %€/ê)Ù ޽a\ë†P¯„4ö–ô*%ú¿«,u…d>×#Mý¥^Ð>.Šgèÿô„÷~ö„Åu‹<¹ÿ«~é‘=Á¯•ñؼCÑSɤ¡$–ÒK¼†9éOñmB8dá£Øäq¹¯ÕØrÖ s¢¯ýåA‘Àç\„ÿÓÿ§Gÿ×jsWJ€z¿aæ,0¿ÀÑ, ¿ô¥ïàGê¯=\£]2ü¡Ïüq3ÂJÈ}9eU£ƒŒ*“Üö‘ìN$ÿÙyî™®ïÄ”QPÑHàÚfsш2qaGP!ˆ=˜.æžÀ¥!¬ãù]r$ˆd{UÃõÉ**­ŽN›ÿuÔÿÄ •KCœ§]Eÿí_…×Vg´Ù“ÃâÖ NÞ È§Öôã>á®#àaÕêGîô°ïa¹ß£Œ =îì^º88ŽbÅ&Jÿ/;#-FAŽ{sËèP ¥6{")#þs´a$üLÌö,¨Éþš’H¤™ M(Fá| Å.bÒþ‰ì(Ë™N%±Õµ#HÊ«™æ)*º.×4xùô”„l2¼¡¦Uꇒ ½vš: ¥4ɤìãH™·±ƒô,N§‘ÿóõº7%R{¶-õýt­Îö»º¯Ï‰DÛפ¥â8{êeI‹ ºÕ¿¶‰žÒ‚ùÝ2ygòvÛ¡\>û¤qk¯³#äìÃk+çä:ªìøìêÍw¶ÂÏ<ôÞ‚+¿å˜î#®wÈÂÒ …µÉú»‚4ˆ9Í)èýéãxs"°q1…޽3IKß!cgd¿ïp¾Ç…>*ô85¿û8:Bç«ùŽ¢ø<‡ êãg:B¯ ) -9‹$e&‰ÏUQ€Ø¯fsó²œ[cΰÝN^-ÎýÓ½¨c«ïxžSÞ$çÃÉÊqRmÛ…Fú?uœúÆjhh8?>÷¯^¨ÖÇßøÚÿ~ÈËŸß§Û† ðºz½c¸oä?üRWÁæQ+ ðÒQGq˜(º&2*Q‘x2µyW ôš¨½bï½¹cÀÁ_[eªõªœ·ó€òÅŃ }»¶ç*Ï3¶Ÿe8kRö0çmxŽpðzÇË¿î๠ýkÜþ—+³ýÊÉ·ü2пà¢Ä¿GœyÃý`O6°YPÆÍÄŸ©m³±R󘩪eLœ)e?p,¥ZOeØþI©³eùOÏË1Æ~,4€†Œ‹âzë‚òéß}õ]Ïp¸ök1ïˆIC¥¼#~ðË å7•§Ò`’P.y0ypq’HžJ%W"ÑK4bµ”‹v‘yž'%{V<क़ØM ü]¤?§:œFþO þ]¤*ƒ‘ õ²[SÊÛ듦§ 8eûþôÏ<|c]Bü¡Ïüq#kI/bDþ‡Én„WÈëÉk³ÅJt¾ÛñÈèΞš)àê„0?ÁqSØÆ{Œ_ H§8·GX aƒ¥ÏÙ@ˆËì872 š"þ½CâûS¼3ç8oïE ]t’‹ååŸRtÚáèIá_˜ŠR(QÿYâ¿–óWG `t˜Œ‘ ,d’Tä#Bh©p¤,iÅâo¦ç9åM=ïHJ7iV>Q¦Ó48åéa°Ë´ÛÐÐð8x½ã ?ù© •ÇúäÛ÷¾´â»÷uTasèY¼àp{Föw×IQ/= ¸g_½Ò÷0ÜWè0ò‰©½*Ûgpñ·›Kö@Íy þì!›¡"ù•Þ ªùµi8Ͷ[ýnE«}óò)Ÿ½@8­6[ËÓ®|Ží²£ü0Ÿihȸùö5^~뀗?p¡ÆÂ'…;¿¸âÆç÷¸þ½{Œ'ÞÜC–N{\ZPíx—¦¾2†ã@à"÷¦¸= ²õ›¨°ƒoýFq=VNA·ƒBPüGN)@OT À ,ßvi 9çGshxh\É€oüC¨\ýô‚{¿¼aõþÈâ†ãè–ª?°j8tWÄ›U lŒK{ÂÃ:*D%“Ò,ÿ_KB©j‘†ŠÓ– Éœã Ë@RýM%f¢÷”¤"Ë?'ò‰§§8‹ü!æN¶¬¿{^ŸÔ†u™É±“æ:-Êÿ”í¿ç'ÿüÿŠVQþD‚;-KŽû’Û>íÛ&»ç$·VoÜrojSáå}[ÞÚ™ë§ ó‰°Æ`3<—„ à]ú±gWLNÂ&’¥ÿ‰õ.ªäˆÑb‹üOÄÿ¬=4©(”o¶ ÕwœÒ"¯®àßû¥óÞÎÇŠÅ·^áø—®{Ü;/´'îþ>&÷­¸UNÑA`p„ÎGG)s˜2o{±±tF‰ã¬)Âïâd.Fó«í ÷¡˜g‹{1àΣµ¶MÂsB4½Óî³ Ô iZÉC|?H°ñŒ€Š¤ÉàØm#‘Z”'ŠÑ¿ÉðJ–árµÓ³$R9\·ïêVq ÁsÖ&§­”±¹¼ªgUÎ>íÙ_ØRÞ¤>µý®K}69 ×sJfí.üù_ø£èZ>&jsoCCÃGÀ÷ýØK¼õ¿ö´«1ÁÉ»‡_Ýà×ÊúÐ3Ü÷ ÷~0b~8²à¿²€/éŨe0;ïI€Ò“ ¨0a7öÛ,ŠI/¦þ:`,IE4Ml¾µÚ«î(súz.ŸgÉ)ëªåƒ¬Üu —Ùòãœë¬ó7<ƒHþÏ3á?Ç—ÿÊd!¼òoxVÚ¸+~¢ª¶‹~™Òä—æ76mND¿8+gU€¨°’Ó«(»Sg‡l†/ãhZ¯—óò®õ†-4€†‡ÂÍ·¯ñ¹Ÿxí©Kþ|ø/–ìÝè8x­cu{§¼øÙãRq åêÍ¿ ø•c?Eü¯>9lBžŠÃ䢯ørI~Gžä¥ A² Tƒ$ X;'‚³k² .ôàõÕÿþ‹Yú?!ú%ÒBpç&ÿ§rÿ»¢ÿÓ¾zYcÛKyv\®h™³íÚ6Ý¿çÏ>Û¤ÿþµ¦Ô$Ò3Üe'€DtW)˜“ÿ³èæñžÌºT·Ò(Ï¡µN}n[’ûtÜ_/&So%“O#…$ý7Iž]‡SîÓß^’Ødü,N ©>vmEî?å§-ÎÊTú?œÙ&0u†˜6–ʽº‚?ñO××縫ýû/rüÁšî×n'ŽñØÃ#0ÞïÑ£¼E÷Ÿôp0ZTÿF`ãbô¢˜cÀFP „´¯÷é?’#ÿ-Ò?*©Æ\,ú?: H".b*s(N¥\«â¶Ð e99.…]¥ ’ÿµïëÄHúnNTâÄ8;‚ îšKDÃsÐʆùË𦃔rňVüÑá'­O~T•˜Ô£“cˆcÓèåDþSõ‹âð±­Ä~oF¼•‰”$‹_œ¨îa¬ŸÎkvN›ƒÌ?ÿÿTÛ„©³Eùs±?—rM˜”¦R¢•ÿëÄÞù“þ}ÉÓ"ÔãĤ»UÕ›½µNÁêÍï<í*\Hè?zþÉË×îqÐ_Åõ„!à|G/bþÞ™_9Á¥t7.¤ç4Eé§t4]^vbD¾“øË¦dÓINªqÏ•9[Ûl­<7§:Ë•mù:µçç«ßci8ÏcŽÖl_¶Æ‰tšSßyóý7ÇÔ]¿e¾»Ú_Fåj«Ìʳ÷èîïÜQ#‰ê9¤·Ç‰®Oÿ¥ùús›òF¶÷—uø ¿øŸ|̺7·Ïá/¯Y}8Ò_s¨Ws¸Rbº v²ô*Ç[ð1€V½9[©Pši*•d†¯ÇNØ=vÂTE»Æ|tiF™¢õø†sá"Eý¼÷OP¯¼ÞeÙÿ½—:‹ö?2²ÒoÌKi< ¸}óîô+Eœ¼âWÐí;ÂlR¸Ô›7¨[D‡×ER4O1bËyâÉ“À”EªÉŸì˜æA, x»¯ùÀõ”²DþïŠîŸúSùxœäÿyˆÿùúdÛlÃ3OþÄ`aÿI‘ñ)ÂÝ~¼hì·µ:@$Ä)Qñ0%9+æ««àÔn,µ¹.~oŽ’Žg­ŒÃù2âg$F¥X´€âÄrr”ˆ³PÌ”ù‹$D_Ÿ½ï$û_ÿ͈ÿ­èÿJm jï’&¡ªù®ÉÌ«+äO^ òñõ×8ùå/*òåp×Áþ«]uˆ pÒ[¤atˆ’UGpL¢Ø B¨¤‹Un-°é íÇu”/ftE Ê£FpdŒÕÈ 4 õk‰L¬(Mˆ%'Ýù/ø #²äõ©¡ØþRÚC¹ÿD'€˜™òœˆ&Qà驾ïy’á»FqéNÚ?*‰ì²”B(œIêÌ6OZBì€ÒzRžaÈ #g«ÄHÉx>«uÒ…,_j¾M:q Š’Ì5‰u:÷í™ecé«q]ÒrByá·évëèH}šrÞÙ³W“&—%-Bz‡åºïˆ ¶uåzîZ=®çï£bG;=F4€mèûû|ø»È÷ö~pÍêKTÈ :8{O:uÒ+28;èF)òþÁá|oïÈ(õŸ¢ù;zœvtÚÓaŽŽNzœ:¼v8éq"8u#ûÓ»5¥D©aJ,ó ÒSÆXÛ–SDåçíHôøü•wbû¥¥Â©>Ÿ®ïË™inæÔj¦ð¼¦¼Éã|zºÉU¦&Ogüï~ñ?}Èú6+³íu›×H–ýŸ ™qÙ¿k]rýó8 TŽHÕNéŠÒ÷_æ´RHºT…èÔ‘¶Wö®:\ô¥2_ÝÕ«}[‘ÙÉãûøWŽAEŸ1|xÀþ±øž5Ýzÿ‰%aÿ°t%QþK°r°–`ms –t˜3ÀÐÁèÑ!¾Ãù;$t¸ô§]è@{:5Ç!îÜì½–$« d•ÄTR9¾³ˆ’]1!‘«ä#]yþIãyîIš_¡¦¸”æSé&• Žžýpm¿ïžÄÃ8}la–â—ÇåØVñ1,ÛfŸÛñç«_žLÛâÎnÏèØ^¿çëy.&üÅ_úϦž .ú[µ¡áÂâ"Ùvç¸ýó+ÖwG^úì«=«Ûž«oôtWa}dzÿjGÍ1.®‡a)ø¥ÛïrÎi_åœNÑ©:¥u„ª$å–žÈS3Í/]•ËïÿÉb÷ˆôüŽR§Mºôc}×1õ¶Ó¦;ó ÂÃM›.$ÉŸ"ú¡ýË[#7û5®|ºgó¡çêwõ,®;6wFeñ‚ï”þšX –ãÀx¢tWl¾ìW¿ü üÜÂì¼:jtÂ’’VÛ+ ÌÅ~þÙßÈ45ÀLq%ÇÙÔNZ䟉eT™.—Š{|¸xoý† ƒoíóÖ}íÂHB-o|ëïÞgõáHwàB”ñü2æ~ÚÂZ ›€tæ•ä+goбx‡f¯¤#§‚NŠÍ)’V±2ó|êÄó—~kEÄS‘ö©l%êÿtµ€tŽDxÕÇÕç·ýé;çŸK5‹ŸO«"þ«vÖ ÿäs? D²"¾!C"·k¢Z«%%º½Þ)2¶8>›8‘šèÞAúïîúÉì'[Û¤Þ®±T9ÔjFLÙ'l‘ΛäÿÕò²ã!ÄL§qŪÎRGö ñ,)À<êÖ&©]²Mäþ2îßùúîù„±ÿ¯¾‹CÞC>»‚û«ãÜUnëµÀºƒ½`´A¦C½Äòè µS€LÔKvÀÛ_RÐ`$Á!Þ–¨‹òÇÎHŠà*r¢–û¯"¹²Ó@ŠÓ¯·b‚\ª Ý“®™Èôh7·«™N®ž%IL2€fç‡d§©ƒñlÑpýÌÊð¦C$Ùå3é‘]ˆ¤½=É]_³êvÍ"Pœz¦õËÿF'‰‰ô±*K#§fŠõ©Rÿ1ªÄRC¸x_Cì_Y ˆ?Ÿ«;#HÒý/ãUÝ~Z•v®[%™µö™ä’ûNrÿEþß¹Ù>(}µkqŠ«sŽದE@˾ 镯4>j+¿oêN]½£ŠÔÌ)•|ғ³lgÓ1ñÌÃëçtrÐîÏýЯ<\5Ÿ¡{i$¬7:t)¨w0tè¡€‹ãÓIg'‡=ºê Sd‰úN‘›é†¢Z€šÔ¿ÐáÔTL- íßÇt6æHGß±i=ŽÉ1 þ9‰jéYIi ªñ£Œûv–<`~v³˜¦\òˆsHðˆ¼F}t¶zÖSáLˆëüj,¯¶»vRÞuåsqþq–³Û3šòf+ú¿ê¯ùKÿù¹Ûµá©àü¿¡¡¸ØÄ?À·ÿþ뻞+7{¿<°¾kyX—ï„p0ÜMö¿‹y§×f ÞzÂFczWJDꥨ“@´gG€¨°¥@,Oì¿ÕvfÛæex:Óü³j|Þ«IWþ køìÔ©ç:ïþó¼Ú»ã‚ãàõnÂ?ݬHý&Ûÿx°¼5òÿþÔû¸…ðâgö¸÷Ëü:ØÜ~МÛ¢úm %Çú(«™eKEe>¶fLË—sÔ¼DhOOÃ.šÜ?Ø ôáÏ-¹ö½=/~vÕ#ê·' G&ûïöÄ<‘Žk>ï”è®ÿ¥Sûöl‡”÷1QJŒˆNNR¾L¶$RÆÈÂ|]`ëªó²'¡¥ˆ¦äÊq \o-ï?k“Ê9‚jÛô‰üÈ-äßÿÒ…ˆúØûWŸæðþ=ܧ6„„{=r5àßÛ‡£õhã…‘÷RÅzo)Qª¨F áï%çÔÃI}rYƒØ6sP‰éVdBú‰þ¥˜ ×U*€I´Ze´®H«.Nv©HÕó¦Äì.h6xçÿ$öˆØU­ŸÍéÖ†wßËó#Ã;¡> ‘!¥éa~!Ž9-Y?aVC-M¤e[‘ŽN-¡¹õU•©ª´”6Mõ×è ’‰£½!§\¼ßy^ I+öÝRÝ<¤Õ­¹ëÔ…)R÷ç‘Ußr™ø¨Ò3SG£ŠäFI‘ï@‚å&¿ÌiÒQ“´ñ5—¤ÎÓqZU+W¬ú¹šÆ‹úÙ*o³r!OãîY#Ý®£S»¥Ï¦æ­šù\X½ùîù~Ž ß¾ýŠÅ'þø]8ºƒ€nÀ½"„ Á½ è °‰ƒƒýøÞœ=^ýcgÏcû} ²âËʼnâEqx¼ó¨vˆv¨éœöÔD z߯1Ïa){ÒØ‚J¢þ!9Åmˆ#'ËQW©Ùh…eþ$Ž é{xæSá¤÷ ñSÏ`¤l&?€³çp¼qŸþî ‹¥mÌ¿IÓ8kÛ&sX…@@]I|t€•jŒV?|í|RÕå¢í“¹ÔŽwà®wäÿð+ÿÅ9+ÕÐÐÐpñqщ€ÿÅ’îªðÚ›¬=Á ×nô%÷t~ðK{GÁœ7‚ŠÛ8#ü7jŽ‘³ív@gNn´XSMÂl1«´Tr´¿t"k>uصÙþË…‡7ìþÌY-Ræ´_çù…!§”.n¼µ¿5î¼üÖ³m‰wz±¼5òæ¿{ƒ+ŸêŽ{÷| ùÁ{Ù8{?÷]Üÿð÷ºgÿ½WÐãï6¸““ Ö +WôFðï Œ Tê,º=ÞÖR¤|tðV®'z2XT#)-@&û­ dŸLêJq°#ìÝ ÞÚ_¿€}ezŒEéW$_,L ØÔå ñWEý—>Z çéhÉç·Ïfr;ý÷ÌÉð¦E2§ ÿτȤF}£Ö%¬œ¶¦oŸÖ{¢*’džr|'Ò]‹cHÎqŸ+R½Ÿpâr=â› £Á#nG‘¹Tõ 7¿æ¶©«®óëŸßŽšøÉ¥ÔÆõ–ºMkrÃUe©œâ¨ó ;“K)÷Nb%EqŒ,$µÇeN‹ÀrHrÿœ´sº‘©O•‰ˆm~Ð+ï,cá“ÂY¦29m%µ…PÚ¢zöwݦˆã¦°w~aÉþoô„º±&áôØ!WÂä7ÈD’¶îCNã_@ÇÎTŽÆ¼ý¥É~:ˆéDÅdÿq¦¶£6˜•<:ÝQœ`„2·O²ÿ¨9¥ÿ]¥?UçW@)¨ÙÍæU˜îç&Î$"½´Qj·8@±ü ïX›¬¿ÿ=BL«1¾|Äúû¿ÀþWnrò×_Ãêý›ÀÝ=8î‘ûûèÕÁÒ7m:táÍÑ2ÍÉRNÎQ ŽŒôÌò'cÑ=^&ýRC Uféœì^ç}¤ù$DZ’Ú©jµÉ¼ÌΜÓÊVkÏE¢2”TGìlÛ*ÅM|÷ý•wþËGÔž>’]÷æÛ×/4ñpësëžðʯ?àîuÌ1È¥`ÿÎÊã2äùB&˜úñm»)ú_z™HM'¢Ð‰OèȲԧÚt«yWþ9Ÿì»”ãÒþ¼­^žU¾øØõ‹ô¬+HÓ¢³Zc~ìy·?ì1sÜ3‰]DüyPË럆+ç8¦áâbykä«ë.oüÎëˆ3.lÿå·~%t{‚Û/ ¤Ý¨¥aYÂJY¼(„uÀo”nOW’ ·9dù¢ƒÒ/ éŸXÆjÊo̳ÍSÌR´lqm0‹ÏužS\ìÙ@ÃÁE%þŽ¿9pïK+†ÏÑ××ì½Ø±>ô ÷Ýa¸oÑÿÒÙñ~­„UL 'Œn/ù‰ÌŸä©Ê‰]HH=œ-™¯ÃöÀsÖ’SÖ/RôBMÞÃiN;–ì:Nf猊N¿«Þ–ÊÆcj(•ô&ü·Iþ§ÏeK4{ù7}b"÷•#À<ß}ñ?WˆîÔj¢{ö;ú÷¼>óë™\Q<"Z2ù Ä…pš°fdû1Bíð8Iʶ.9‚µº*‚_cÚm’®ûÜmòêÒ"þß×/LÄ?€|x•þë/sxïîŠà¿tãMÀíy8Ü3Iþä¸3R@YöÈzaW@– T,jL6µ‰W]ô²d“ð Tв5ÆJ;À¶eÂ?Õ·2Ï(¨Ú,œ?33Åoïß¡@"ùb9Ǹ)E|BØÚo¥ÒÈŸÑê´ñ{s(±äÏHµ¯ψ ïŒØ`ºµ<ç¹½dRÇU¨‘ J$ºÖÑåÛ•¬,éÕK#üES”¿NGÊ¥¦ºØ(äbTx‚iŽ ùŸÓ¤r$¤ª¾Pu+ï2¯œr]©¸Õÿ…ªMñTE:Ndÿ%:t8qù/‘ø3\}*÷#5ŽÅ—8-Bj£Ü>ùVõåÔ›Ò;ÄÚ¸"-Ó;«¾?q̈¯2¦Äãƒìg2)×—$óÝ[£åtdô;)}xûDÂÑù¿ úîܵ€ÛY-pÔ Ö?CŸÞ ö¼ÐícÎu8”è 0èFaT¤ó0t0v„^‘¡C}G;s pŠø],;K¥ãm×Îw|êp¡Ã©Ã…>ªì¤Hþ˜:@»’" ÿ–v ýÇž ô²ûŠËï Ú!â5k•¬EäN…cÛÂÛî³ãk+Âgnçý›ßôµ‡ªM¸²&ü¶oà¾û„õ²CO:èƒ9n.º`íе9q²qèÆ¡±r`€àÅÒ7 ˜úÄ`*Ó;1¸è,àÌ™3¥q qûA¬%ç’:…SJÝ”ÞWXÚ HÊ¥Mg Äw Ññ䌱}âø¶òFÄñWßù¯ª.*n¾}7ìÆ¥"ä>ùÅk|ò‹×žv5Î6ìÚwN£ACCÃEÅá—×¼ö…+tWËotW~W×LjÿU Ûü ™ðw !‡Ñù¶e(i¶czˆ Üs2Žœ\r0F!fÜ5T|[¶%»Å <±¨$[ò®‹|’æ– ŽæðãÆ[û¼ñöõ IüÜùW+î}eMUØ{©³`û®£¿j’$²pô×%z\a!„ÑŒAýU+‡˜kZG%(Q:¤ŠpH¹Ÿlð±ñfC(*‚*­O˜z@9­|‰pv¤ÿYûã3¬Í£þù¯ÀþÔ_{² òq:á¾9öô¨Š|žþ:!ý˶@1¡–ÿìÅ;'º ŹEt«žV‹ Ž’¯Œ¨‰TφÔB¸H,çÔ’êXE[WÔ>ZÍ"„`tVâ÷tvõó6ªÈÎÙ&|ñîG¾ƒü–÷ÎÑOòÁúÿïÜ_ߦ]Ñ#‡{ÑC¯ÈQWFØtÐyØÛ˜qwа203Ö IDAT¹a”\6ONr¤žàyµT8ù“,»Gr PL’OÝ×”@ÅRPÖ‰yÛ®e1W*5•%±Ôt×ÔPo³M—¥Œ'i&ºµû‡”~z¡¤ÝR}4öå4Æ®pÉ$Ö«öNQµa~×Ù&m”ê‰T“µ¦ŠÞ`•Ó=¬ê—×…D%"ÚÚ%LÔr­Äb\ƒ @UÔ«F'«¸ÖéáU7r¾ éæó óÛ„YÚ\ˆX®£ÿ#RHÿ´L5aR>W“+Ö±Òµ8\rúÑËŸª}¶Ú-^qq´±û¯qìôë4Õ::•@¹½•–³Åì(”V’éRïOMº=FNži$¿[k„u“ÿßeOÿæ†Í/íãœÃß#QUŒl]:‹J[ ¬:X(aíuîyÄ;#Y}‡x#êQGç¨wê2a/D?¬y?‚„‹¢NÑþå3}_ž^vI)@⓯æ $‰dÅÊ!¥ P#o“s Õ¼M „2qË%K…óÙ{ÈëëòŒ}ñ;v™¼º‚¸ûßw>ôw®#ý=#º„Ñ!Ú|lÓa¯ ƒ³9ÛºCV1B?w÷!¹±mY;k×egsa h$äþo†?é]Lû$ææBå ¨Hpqˆs„NóP9|¦rŽü™mseŸšc^Ržpq¾dçí¢SJ@éòùÿç¯þ±Çrž$n¾}›o_o2Ú çÆòÖÈ7þÎ}º+Â+VŒ Gž0Âxß§ŸøŒ+-é´cÊlqà7JX›-ÞÒhÛï0¿Öd*Šö_¦üšM>é/ÿ‹?Ù æ?Ïž”áäEsxqã­}Þú£¯]hÏÐ{_Zsü­—?·Ïpl9Fö_u„Zž‘HøûµF)’€_»¼.Iâ?‘ÿQj$¤h¦0!¨BY’ªr2’h5€"ûŸ ×i š/9eýàt²Çv"¹Êqr§"ù“}¾}î À¿õgþú“»ø'ŒKùŸŽ™Èóôoô¦ØEr#Ñè eBÄ/ýy7Ñm_¥Ó¯þÈ;Í*ƒª>Ø À8Ôéƒ7uÑ lÑÿ!˜Ë£Ó!Äè%-+g€Ê!`g›|æüà]ä‹·.”ÄÿòÁº_ø‡òýK0~sasµƒ–aȵ5ºrÈ Ðoà¸7‚¾ FD¬Í1@×ÖÁyXwVîs¶ÁkŒ £ÿ!-ñ‘àW‰2}fü•¸M1™Wi‘ä…ÕLÁ€”)¦á QU•§fûRžGuOŽœEñm#ÒÑé9¢L`3Á±ã£åœéY£o»T2^b½.KY—ŠHDÒ_ÚRäþ™=Ç5áš\„“Â|”ÉuÌç•L åõD!åíéÏÈÛè°\RÚ1 ߇(7œœC’@ˆû-R·?ÄÆ`KG€YÓŸ6ròu¶ŽLÕj{RÞ&ÿ¥ZÏQ’Ùá%¦ÈSKŽ÷ãYH‹`ÇKV€²¯ôŒT(çß%Ež*vß¿LEN¶<^LǼÏ0¢ÀÄ!$µ]u¶üދ΂il¢<7GMþ7VÝ«+öþµ áXpÇ‚ì)áHK‡;PÂJÐu—28{¯nÒ+::Â`Qý~t¸¡ßáÆÎÜØãÆžÐ{{·¨ÄˆÿH¾#ë‰NwéÝ*Áœ4GlG6«iu)š;ŽIÀ fQ×Ù!ÏU½1ÍW«RI `òÜV*ÀãO…ó÷×VLFÛ/Þ*û…Lø?mô·_=*Îl.XZ›t? {Þ1]0€(…Ìè,²_`pÐÛx-£ {ço‚¸€ö6oËrÿi vÕ¼X|œçY®æ Á•¹^ê{1E€õÁ8Ï‹%àZÄÿ™õRßKïå8f%›ô¾ë²£›sŽŸùêO>á;ÓÐÐÐðhpóík¼üÖ/þàBÛs..>ü¹%Ÿøá+\y£gùî=\ýô?6w·ã‰"Çý×~i޲pƹ­yã×F­ø7ÍÛt”ÌÁS­TéíÊO¾È³Iù ˜m©•¡¾l£l›àòj Íà9ÁÁë7߾Λ¿ÿÆ…ÏuòîÀÉ­îš°>ô¬? ƒâöÃñh’ÿ›Ã`#D€ñ8d.”ñH Þ¼‘ÂhžJa°A'llp sF¥A'y4Õy7ÕWD• ŠäŸÛ{çÖØ§8p}å/þÖ‘ú©|FÔŠðŸÔ=R“cˆÛÎ&ÿן~v ˜“þ6ÇŸÿ¨DFgóieДɶS%þÍòkt—†IT|ü†øò-7{çú#éȳ8߉@½ž®/[M6n ©8’ÔAë”U|f"ÿµÿAÃôúc›„ÏÞ†×VðÙ;èÜE~ðÞ¹ïÓSÅW/¿Âýƒ÷è¯ áÈ™qø@-òpp° ztß#›Þ é}@Ö zïyXš¬0â6 Âb0cî¦3¢6DÓm$÷Åc©8ﲕ‹r±ª’ÓHä mh/¤­/ïÁvké³D²¶2kµ,ç)k!FÑ2pzþ‚i?ϽQO9|>s%ÎJ–BÖDN¦>[ÿiË%’X¯Ë§ÑUÛeã¾&!ñ¹ÌJPˆyITòTyê#‰ø$v¢ Òýˤ’$¨|FËél\!5°‹jÖþéN™€Æ+PŠ À¼-‹ŽA¹pÍǦ<»¢ík”jO&EfíΔø72®ËäMü×d[¾—ñÛ4÷ÕBâ'¢î>sÙÒ"9-éÙ›)$g³t NCzêªg«8¤~j·W&ïHªÛýhó‘o·My^ç»R[ÔûËS™ÇZdrSŠzI=&ÛÎZ©a|ùó”7Lqû¼Nÿ#úÆÀð­zâkžp·3§»ý`ïâe‹€.{‹Ô^( ²î^‘(í/ê±GÀäú}oÑò¡Çùíl<í7‹è\×Åg+Fi³­P¿s˜­Æû¦*:;®is¦£‚äwdz? ö˜ä·`N™.ŽA€`*#§¨N…óÙ;ðÚ*§¹‡~ö.òújúè½¶¾ÐŽ›g¡»};ÿȾAç_„o_A7 ×Õ³¼5rÿ {/u Çá[#Ò)ãRO‚y)ŒKEœEú§Á¦ :äe¨óŒÄetòÀc{‚²EôÏI#óêZÈÿD!>>ò¿œq·@‰ºNäŠdp©ŸdɈÄ…K4,b&TíP—ÇßüMÀ}u‰¾ºÜ’pýø÷ë á›×ßëö>ÀsŸðµ<ºêำöz㹆ÎÈüNm[L ›Þò »ÑˆºñûÑ0 Îw¯8/%f“=cSŸL-YÚLj'lu/Ù½mçúœÖÞAlŸ…ѯhŽ<Ü>t×Ó ³]—“ @1–'rúÒH¬Wë[$t&©ˆøjŸZ+:!6éYœ¥¹î§å‰ ÖTOrd¡ÄvÙõ_º'šI¥YŸIC1ÚÕÆ(IŠÒH5ÒNþ“H K¼.S˜þj‘Ù÷ÎnBÕþÕUoÿµÀ4Ú¿8¸’Ç;GêNÔ‘ÇRÁY1š?Eù×=.WZ{~*Â(ç)Ÿ¡Œñš“µNýEr®/%ÑüåÝ•ïsµ÷ÑBNi™ù5U½ß´êqŒ¿¶“gÆÄyÇöç«xÅq×ñZôÿNÜÙcñ;nÓ}j¤¿* pO‘½î+îºV6öÛG×ó¶+¬MiG&³nÄlZvVöÎRþõ(ÇžþRnv\]ŽÐžŒÕQ- ½‹Ó³¶ûŠOÏŠZB%‘¨  ê£:ˆe”˜6lT¯œö66¿pj9èÓRao$ìoo¡/¬_sbÏYí¼Š>1OAõæyf!*èïýîµ áÄ¡Ÿ<‚…'¬:X9èÌÁSWÎ~7ŸtpÒÛNÖVºð°1GPÄ6ÎÔƲ®bs?!¸Tvö^;dӣΛcÊèPpc„ŽàFR¤RoBÁiËe\*)Ìu Í·jÕ‰òö‰ï² 8×ñ·¿ùžÎÍhhh¸0øÜO¼Ê_°÷ÕO-=›»žn_×ÑØíI&44Øü>E3*ÑÆ8¨¥æ‰‘8™)ŠbADÙŽ˜ d”Lm¡L§è¯8/9^|sŸƒŠàù­ƒ ´ÕÐÐÐÐp9ñþÏž0Ù‹i}{dsÇãÕ¨¸½ ¸^ðCå0œBü§?¯À¯¼Rj؉º¶fp~W&{pÍ¿1ãߨ–órùÑfÏ n¼µÏo_7OÑK4qüÎÿu̇ÿò„?»Ïá—7¬o{eµö Çžñ8и81×YÙÂGa·ð1ФéÄ$J:‹ö× Èè!€,€!F}œÔ{ŽBVEc愤˜DÏÀ T$ûS9I2Û~Šô?gÿðÛÿ›ÿí)\ÕÅÀO¼õçNÝ÷hŒ’ó³L½TÒÐò[tJܹ6ëÎZ"ݳ#À„Ðܦ7=ù_ÎáòI¬'§€B´–S$"Vò ÊKU‰Õ²’I¢ÿíÿJ"Ìiÿm”ˆÿXÇå¯Å ÉQO£ßEzzÇ·™KDDPÅIƒjšT)v8zÖtS¤î®Ûß=¿gFþR»È!»Yô!ÿw)6(±wI¹©Ÿ¦ïÌŠ@­ pYÒ"ï]9I ªIŸÚ1!Þá,cžî_r@K½¦ÊI^¿{ò»«r>{ôN³ñ*“úåÙ³k®Û®<©ûMŸ‹Òß4¶krÎR1uÑô$ ëï÷]Ë3†“îå‘î†Gü·ò©‘p,°ènØo·ˆ²ÿƒIý»ƒ˜fáZ¼7ÚGÇ.:‰%‰}#@%÷S0«Jì£AJ7 ’NF÷¹ÃYï;½/Öö˜Põ´grÞtIÐß¹ÿlðú ûûûè‡{èQW=r¸‡œ,WdÝ™ @§æH²îì^¦ˆþÁÙ»v´´ÁySmòBÀÇè!È zeþ–•ž‚€ºØ¥ŒíÊt|ÑzŒ…jvÇ4vCLՔƪŒíã›ꉴ{CCÃÅÅ¿ù“ŸüHPË[cI:IÊ)ÁDvª“Ædéö·^û¡«ü΋õ푃×:^úÁ=p°xq£Ço|ŽðCäÝÆ@]QÔNÁ¶QE;Œ%7ŒLÒ„1:ÄtÜ)@,ª‰‰zÕÚ\/ë Ý:P÷ÌÝ]ÎÍi`‚ËÃ7œ‰$ñÿÆÛ×/¥4Ô‡?·d\Þø]×ÙÜ3¯Üëß׳9ôlŸèŽ…ñ(пèàÈ3™ç®LÀí ²¿V¤¢œgd~×Û€’#@&üí¸I4ªg2σKÅ­LÊ—ý”mÀiÒÿ¿í'ÿÖ“¿ „ÓHÿO"ž÷ SB|‹Ä¯"¨ê7¨æeütuHí40ûšÙ·=bìÈÁZt‹Ó÷ üÀ½(õjÄE¨>~äÛ§n—ï^åøë#ýg<,î *Ùô^gùZ×– oDþJLæßuȲ‡~:ä¸7IáÁ!G B?ÂÚ!›…©˜aYãdÏÈ ‚Ž ëÎäÿU³ÑØ¢!Ih›hƒË”X!ÛÒJdX13Y«ˆÀê¹IŸ™»%=»E¡=V”úë„нLëÉ(ŸM÷Ù(_m›«ÙGAÓ“1¦(—TNKÙ)ãl”>ÂŒ•ŠôODíP®Í¥úç†K÷(9Pr%¦±†-T‚JI)RþKtzq»ggv=ÙÕw ¡;%B*b?EúÏÔêãS>å|­"U™%‡Hõв.86¿ñW9ü#ÿçîΣÃeù='³åEÀü÷±Zyžðéc®:­<þ?¯íãúIó\BÖ{ð¯/ ¬îìöðÝ£Eü_ïÑuîÑÓYTþ È`ꌑü%®KI $®Çyš4ÿ.Îí*GN©bj sætñ½ìfzõ[×–=‹Ù\ÃfAÉaë4Ç·ÿõ›ÿí“h† ŽJþ—*ˆª¡¡¡¡¡á¼xÿŸ,YÝÙú˜îZ-ÍvOŒþWÜ‚ì €Äíë€[HŒø73PŠþO|[ÌiŽŽ-9Ì%>ÍL•Â.:"aî•®;L(—ÅtAð(CMž0.;éßÐÐÐÐð„ðÕ8ù`\ ôºOXb’°û1Š!ôFÔ»\–õef0fHe‰òÃBðc±—((æ÷¥Ü±:b†b#½†5GEðVFd(†ãDÔÖþÄ9`9–©–“-;ˆfGÍ£gYš>o¤©EW;×UëŽÎu8éâÒå|멜Ï*T¹¬” &›®j’ɪ¡Z*Aýd½^æèêè›>²ƒOö˜OO±ÞÝ.SzÚ^3ò¿j¯‰;ÆÄ¡®F(ädª{Eþ?Ê}«#wG¾×’ÂeÝHùâ·ZOAÉ÷,߃ú~T÷trOª”*OâºR¬÷Odÿçê HN%1íS¥ŸY_TN~èËÜý#ÿà!¯£¡¡¡¡á£ »{ ½³`½^ãèp›á°Cï.àÊhƽeŒø:É~‡l ùŸœtŒiþ7Ú|M½ ¾”'êM–µÁœÂ“ÊDR‰ `©RÊ6sv›–ë\íPÏérÊfNm-ê¿¡¡>ùßÐÐÐÐÐð,âø›·~ÉõïY€HQÚÞÆe`< tFòû!XÔÿÆ–~£„µâ7°1r߯m»ëÀ¯ãFqdç‘äHKÍ-ެ®F4)oïRȺIrî,ÏöÆnŸ‰æÚxÉäý_þüA#ýŒ_¼Áññ1Ýkß±¾?²ùvgùv7&û/ ` fø0Ò?‡Ç./eèÌPÜùì0 õrŽêA¼àRÔ˜7iXB”ñ*"–V¼' ÄZ>Ø:ì£ù2_•SCzKíæ[«k’”Ê ‘ÛDym¸ëVÁj¹í0%ÿ‹÷©-‹CI "ÄKj’âU¤¼æÚJ$ò#áó——\–ã>‘ )#û“²Bûª¦OÁ¬í3q_ÿy[í0Û·ƒü¯¿Í¹’!w¡ÊaCDXþ†¯p÷7ò¿¡¡¡áqcñíWÐQY‡%á>,ûètmoV¹:¢±4›èعé,uÓÆ¡N‘µCÖ ´÷àÍÙ¼ÃùŽÐy ¦.s°w„_½ÇÕÞ &Ïïp ¦‰çÉAs"÷ŸœÔ¬ŒÊtÎÞÕÙ©-9K²5Ïhÿ 5ùßÐÐÐÐаÛ?¿d8ôŒ''ï,ß9x­g8òŒ'Jw€‘ük‹êÏD~—T·Ç4À  CJ ˆ«¤ÿ£Úvˆd–øO¤þИ!Q+€ê/š·Éÿ]ë g¢9\Ü|û7ß¾ÎËo49ª†††††sCÿÁÜ¿}ŸþM¾²G¸×!WzÜ¡'Ù °ìÑU‡¬zX(²îaÝãö4æ€í‘> ¾C¼‘þœ­Eƒù.«àªÆxˆNœž˜BrNؘ^ÄŒ»šyÝ€'Q²…J¯éôÂB&ràÑ8œvÉ5‘êáLÞ;? e}â2pŠÄzrˆ™ËcÙˆã@’ÿßU’oÞfÔqYûsúY¶N$•¤½žœ!¶2’“DŽ&gÒX‡ ¡?#ÄU -ž‡êÓgŠˆ‘ýtõµ3@þ/;DBn–‹>.­¹ç‘æçˆ¦/Qþ­¶Ï£Æ§í¿}”É‚ ¯á‘ÿ%r~z®‡T-Ø‘ª`z/Ë}qù¾ÍöOw2ù_ ªÚí¸ª¡8;¤k˜88œ~3¦í__lEùï$þ˲/Óv™Þ¿Ù½«îÍñ~…÷~üÿ8¥® {_ýþV_ƒýztÙ¡‡ äÞúÂ&Êú;èCœW™¤ŠÖ¯×íOâ¼/•%8K×Ê6õ6ÿÊŸU‰‘ÿqΪ9` ]Žê™*ä¨ÉéæÎxTË¿ùÍ?ý仡¡áR¢‘ÿ »ñí¿DðʵïêY}èY}8²xÁ1z6‡·0‡^¿ øe@bå•"½àש a£øU@:a\ZÙõà—öyb`SØ€Ž X0Ø<ú?–ç²ÿ)(›ÂRìÉiŠÑ>7šÀSÂÍ·¯ñò[¼üùƒåßÐÐÐÐðH ïï×_䤿‹8a¼ç  èJÐA`tÀrÁ1'ìeü‹èw¾ƒàpc?q ¸¸ŒšŒÄ.Oâ$)x©džÊ„/Oô’ T=Ù‹D¿­W†á¸¾¾‹ðŸ8ÄåGr¨hЉ¤ý®HëB'‚¿‡sF;×eòß¹rŒGŽÀŽçSÕ\ßš0f§@!ù³@µM'Î5Ï^;Y—÷Ô&ÙÑÆRÝ‘š`ŸüO_•jËþk¹ö|ìÔ`rÂÓó§ÛõÎdÃi’ø2½¯é¾ RÊ,7²äèýiÍ”BnÿÚÁƒÔèäÚtÇ•eÊdrM3狊Мs“ë,e>ùŸ¯H•£/ü ïýøß9󸆆†††‡Cwû:ýíëÜoÉâEèÙG7kgòþ]°òÚˆ6q{l®78tpÈàlŽ·qö&Ýtæ0Ðd°4NÚKíä£êÓØ™'æèp¾G%Ä}A¼ÍÕ•mÎG•Iz§äâ\Îæu.Ùñ’CÀä_áo~ã§žRË744\64ò¿¡¡¡¡¡a7¾ýŽøàŸ/¹ù;®ÅoÔHüM l´Úðè·Å¥Féÿ0Xp—X`׈­Ç²;ÖlÁÄ 0,ýke~ @m«„'sýñÑBÍŸáßÐÐÐÐð8¡ï0¼Û1¾p‡Þuø{wpNðû WVB8vÈEOœExÅí,z£Ì@· IDATmD†<,FÔ;4z-G¬·¼±>:xÞ!^¾òfÜ´Šªç–6þR¢Åù¯)*¬&‘vô…f~ÜòÿU¡PÚ2ýoB|'Á€Ú!±µ2ù|:¸¾çÜN‰õ\îÔR6’æ®%° ¹àb¼|É3óÎKȲóÓÜó•;í¹›r¾½m 𢸷Éÿ©“Ô7EHj©æ³“ﬥž¶Ûò ص§²X_,ÿÅT yipñ~ ‘öwvŽxŸ²?„<ökÛoéCõ{&}>¦hˆ'ÚýK§~âA“Ô IÑÀUα¿© nõ_ŸçaÈ€ãúÞûùßÐÐÐð¨ÐݾFë÷¿s‚ÛÛp × ïô ƒ" ‡{¨Ž‚Ë>:tFî÷ÍÑœÚül,d½ý9Ô…ìà)^*…§:‚Ó§ÑΖ8#òqÙIs“”lrúѼ¬ß뇾øÙŸùÚO>ÙÆnhh¸ôhäCCCCCÃn,oøµò‰¾ÂxXßí÷„€?ñ Çn_ëÀ¸ ¸^ðcÀ¯·>(ýžà × l Š `1aŠzP'–>`9xsÐX£©lQ‚²€•“Ùpj ;­|Ö¶† šÀcÄÍ·¯ñæÝh„CCCCÃc…¾{…“oŒôo¬‘#Çx2¢{@€ñ¾ÀƒB8vƳ;E²¿ƒ]u°X#ÞÃIºA‘Ãâ@EqèÆ¡}À78B7FT# -Ñ8Œ)L¢û¡bG#ç©™ðÌdI«ö™PQ•M¦iÑšú|T 2)?øÓÑ E')vR¤9Õ¶Ùçv}cγ[a怂WýDT§Üò„è Û޵!>EÜc'}МYæÿζ]5 J|»æèö éûã^e&‹oý";äséôäç™í× œäÿt‡‹•·6,AYr°ˆn¸¤Ò É‰BP)÷*U<‘ðÅ‘!UÅέõ¥d6%Õ©.o_Lq4™ö7¢JA"õ“3@~^òv&ζz¾gåè _âV#ÿ º¯áî_áøþ ‹kwén ºÖ+ŸV¢zÓ‹ÙÏÆ,Ê?¦,z_]\â:œvh¿qæD™œ0âßiv!;¸ÐÙÌ"ô8ßÜ•ŸJ*¨ŽÎœå´'«Eµ&UŸ¯Í¶+*Î\ÅÞãÿÓ;ÿõÓi솆†g7ß¾ÖÈÿ††††††Spü­½—¯w¬ïzúµÐ]íîh€ý—{†#OÀ¯€¬¼¶ÈþáØ,Uñ7¿t£þ}$ýSŠW×›Œ:‹UB:[j]•`E™¨Âæmj?²@²׎Ç3'ä­å¼¼ký9CsxLhÞ¨ OúÍ«Üû »)ðîáž#Üw¸ëݲ“ƒÝ€:Š†Ç¹—!F‰‹s!F}ù.G‡¥m—ÓHÌ'«AÓ •ÔSÀòÓûz‚§y"h’HÊèø©D;›Ù "Æ9*B{~úœc½Þ_»¤ºIqˆåòJ†½Ú¶U‹HæKj){<ƒ‹‘ÿ%ªßHÿ¤P;õ‘’õs:¤H÷­¶O5­¶Tr÷sò¿®°#MA¼öj–_2Ìë:wØn'©É}v8Q#-DbgÌëÅÊ!«,%€'Ž ¦¼`õ ‘€m"ùJ ÷í¸%µaìçV,ý/9?o·ó®ËŒõ¯"ùE“CJªËôóæîðpQÿÐÈÿ††††Gwx€.;Ö~ƒ#Ò9†ÑÛœÍ î;tá-Å’¼B0 šd,Ë–·ô>Qä~z‹Ø¼Ï}žÓu¾CTpa‘¥þ»°Ài—‘^]TlêèþÕ7*@rêŒõ2÷Hó5s6¥¼ãþê;ìÉ4lCCÃ3›o_ã ?ù©§]†††††† ‰û_Ýpôµ5n!lîyŽ¿¾Aö·72Æûn†e<1%€áÈÒ¸Æ9ï‚Ù Ã&€7oðq’÷÷SÛ<‰þY*Øl N) ý¦‘ÉzB#ø?2šÀc@#ÿžôK/rr¸âê“bZÈÈ !¬!t‚:gçW•°r°v°P“Ý Ùpײeb³S€/N)O¬htPAÆ.怕8©Ô[9Ô“@§“ÉŸªØw™Œ·/´Žð¯‰Ó9™þqÔæÑþÛgªIüq=ä¯óËg§´¥l.×qJ•j'€Èº'r>)±é6W®Ü’#@RÈÑÿ3ÞŠ!ŸÓëuºÄe:{GûE§ƒ‰{n)ÚWùjÒ_s­'õPU¦µªëz âµe²{‡€ˆd§„m®=:Dò?«,$gŠxxœëbÀ$ÿË™,1â>A°{¯éj’# Q¡‰§Ânúº¢u?¬>UÒTŸŠÏZMü«*ιÓZq üohhhøøp‡„AذÌiR÷¸HòwÝ‹cöB`Ô ,l¡9vÒÇ}Þ–&ù_•½'Ϙ²©vúÄ .¦w2ésô”ÐÅnùOpæªIíÉÑ…äà²@z/ýÌWþ„]p3È544<"4ò¿¡¡¡¡¡át,o}uÕO,Ø»áð«ÀÞKøµ2®<ý5‡{C×Å:àö,²ßJÌ @G%ŒV£F“ý×X–ÑÊ:B£½.ù(ø•UˆÎÒ¿v˜›Ûï†Ç‚æðqðzÇÿòwqå“­Y/Â?}•£NXüÏæë=þ°DýëZ` a-&;‚Z†‡©A8ç‡ Îw–÷5ËÁöQ Ç©†-,‘“á79hRˆl½Ccž÷µFÙ'‹)’ÚR("E— ÉC;ºüûñ1#ÿgyÕKôMÚG€©ü1~ÛÒE¯€ÚG[p»VU:€š÷Ÿrò…ð7ByJ¦O¢ý5é¡àÄö=µ=S;L·æ¨zÒ¹Ê*qo¨ŽÖE]}-€V$uçÄ¿îºãóþ0­bv¨£ì'á‰RÚ8‹.µ‡&ò?ÿb%±–Áˆ}—Ï“Vk»g!}]©«f·€\Óª{o9b¤mR_“”­.U·îWé‹\tÍHÏW¼7)•ÂýhqŽ»ˆ›™U]ù¨¬óuß¼áááåßw¾#ý-ý¦¤îL…äWò>tD¾ùf]ÆæƒÉ´û¡¨Çê(t/ã‡UàÈ,&:¿ñÿÍuT±Ãá¸Åpòßáp8޳ñ‡ÿÓ'¸óö€ûß\#¬¯EŒÇY"ýïP%ùóÈà’þ£ö¹ö†¼çÌ-BŸÍ4äÛŽífÞ,/°ã]Ø7½¼ãøìp¦úÁɇÃáp\øÃCðïbâèçy3 0èe€·ØA’uà˜i  22Ë,¹a9ÐÁ@"±•]±Dê§–v)ƒ’2‹„”Ïñ…Æ5]ˆÆélrÚ£¾,idã\;ƒBeÆš+¶@pª½ÆëüÙ{…ûÈÿé|“´¨ëI&Bš/oóýoï#`› ·i}6A€Ô‹XÎ/ yÜÄ…·áôsÚ¹'›Ú®‘õúGlôÖbtKMäÅÙ,a%Ò9×Èÿ3ÉÿYz‚}é Š@`þ/²å̵-Q@!âeK‰ê—c.€Œ §–…[¯ÂÒhúœP¢ùYwn‡bè¾ÌùÌœ–ÁöœôÚÛ«˜fbR⦔—öǵVÔmbOtòßáp8žáã{>xÛ´ÆfLˆ»»XñäǘsøÑ /WGÑ Æ,$MÙ$6þ\ÈÿQúoEÀ)‘ü¡Fï‡<€J?­¤tR ÿP‰~j¤?„è·Ä×{)/;hô?Á¼Käôëßù;×WчãVãè­èä¿Ãáp8gà“¹Æçß½‹ƒW"îýô€´f„;„ñQÆö8!¬»G <ÀöagÚ>ÌàÄ3Ò)cûqF¼ „¼Õ»GEjöÿš ½ ˜jˆìð­Tì žÅp¯€ ž ÞþÊ=|é«o:ùïp8ŽKxþÝ7prïc¼AÈ'Þ’FúË4oììHí_uÐ6@"ÍFRs§Z»¶jõo"Ç.Q๠T›Þ‹=<')ÊsÍ%U-sKP;†²l"“'ž…œ”©Þ~¾‘ÓÀ“÷ §–ÿ˜ÿ…ÈoÓåGgdçt:t´µÿ·Gvе9¬%@;æN Á´ hä|©+ë¨PDg¡É×kð- çÝì  jÔ?šåÿŒü7ë×ý”­ìæ3.÷dµÚiÿ®w‰^Ðt*}4¾ &ÀU¼õ3A÷)9ƒ)ÔkÑê‰ô›óA;?½̵ýíéɘs"á bq'R§¤h» zgÂÒ½-¸8ùïp8OŽðñ=Ä_ÂãN0ÜyŒ!FŒ«-°òYe`Á#Iˆý!ƒ“¦hY,6ƒ42¹ôÁD¬I‘ÀaDŽêEÌ™•ü¯bMí\¢ýI\œÊôBô¿XýS+3"OBÀÿü‡ÿ]?çƒt‡ã£[9‡ÃáXÆñwØ'¼ô3Ø~š0Ü 8|#`<Éà Ü{9`ûxD8ŒH§ŒÝIÆ/F¤ #m÷^ 7i$-@I °³Nbû_RÈ4šc@瀚 V Plÿ­X ÌÃÌÔý¿1¦ÿÞðœ g¬?#܆Êáp8Wþðü{ŸÃã|«CÂî'ù±ZÆ®2x#ƼS1À(V!@ÉÊtVÒ?Ûˆ±X#Å2¯Ñb1G‰ã¨ù`©å…-y_™$âm¸ôÅ2X#¡§õ¨åÅÞ>phä€q°1ÿ­7h#ôÏ,þuÓóÉÿÙ_,ýgÿÍÒ´O•«éº?å˜KŽ÷)‰ CþÛéRg,„%؉ûNõõV‰pH›5Ÿ ÑðegÜ]|CmWâ?·«Of=sl\xîïI;÷帪Àø(ó/"ªb‰^Ì ä~9ÖÌYÜ)T°’‘8 ³¸² ¸µŸvÎí Ê}Pç:Ÿ´&˜^ªõ¥÷™þVKPî?ô§ ë¡:Ô;¥´k½f刋€“ÿ‡Ãñdî€?°YoÓc w"HÛ5˜2p@à@Ýp Ó jõ¯Ñÿ##@ š¾‰@IÜ›Jú&ÖNоœíÓ éßGÿWûÿJæ7bŸ:¢_—Oú9ÿð÷ÿžœ¨´9Ž+€;­:‡Ãq6Nßñí_û¯üÜÖŽ8ùá'?ÙáðsyÇØ=Ê •¥¤µ8q¦S±ü'Òšë˜QÚfä ¶Œ¼òŽAQÈþ<êôEˆ},|O§W×iüù¿ñ*ÞùÚ›×}‡Ãá¸åà÷îàñw†Ï'D0~ªâïŽ,ßE°!ä-VÒIÀôÄ É 1t¹ŠÊ`rЬåi¨€Pw€2ðL,‘gò­írî àÌŒ•œä€íÍ=á{)¤pÕ?ýߎü/߆ÔWb5Dû‚~ײ€‚:¨ËBq0û~´z05a¢åçQôhÛÚ+ëv{ŸUÒ™úÌ`È?"r½¶:Îr­[Y®m@8ø&诳•r,_ã«{P¹Æ+ {Måú«mrhî¥ÝTB½;è^cϽի©ãé¡«Ø£µWsÌSŠý¦¶®]Ö„,¨ÓðøËßÅ¿ää¿Ãáp\«?üv›6ŸŒàïßE|Ycx¸ ¶ØFÐë4†¤¨dF¥2?¥¨„>u¤>e2Ä~0ÂÌÝ_Þ¯ê|%ûÑæÛÛªŸ/ïˆÿñÛ÷šjÕáp¼èx÷ü¼þóG×}‡ÃápÜHœ¾?âƒv‚pÀî¬?LØ~špðªDÿïN2B” ”´Í-ªËÈ &šŸ[4.ýhÓÕòŸ•øç½‘þÌ:m£û'óÀ|¾Š€ù0Ÿ³×Ÿ .£|JüÂ׿€ŸúÊK×}‡Ãá¸åà*GßßbõçÒCÂÔÕö_‰ÿù¯NT£ÆŠ@‰ #%þ)KX‹þW7Ô š¨ÿæL$Y%"‹7½~sÐÎ!t•Úk#32%€ŒTζˆîS‹jÔ¶ÌRÛ÷E;…3â_ eß:?%ÿË0öçFÿ“ù]{ OŠ™J7LˆwÓxjŒ;J­µºcQŽZÖWU´sæ ‚è;Jô|·“Bìs£µkÄ?«#ÁEÉÿ‰BálÒ¿_³­eÿB®×ë\¢þ‹ZÊH?#KyùŒ€ŒLb€å;8 Ô‹ÒŽÈFý71@9³ì 7‘‚%jšóÀÂÜÚ"w$P­¢zëù»øà—þ÷ Ô±Ãáp¼¸÷ï"½w€Ýƒ„ñðTR(¿¸N"øÕˆ lG`ÁC–þXí›x À”ø×ù"ÒÌZÎÚ+"€L# ÕêF8`dS†òÝ‹Dæf"þußüÎÛÞc>ðæp8®¿ðõ/8ùïp8Çœ¾?â£ß9ÅᇯGŒëŒ;8ú|Äî8aõÆ y“‘Ö Úò†A¯JT¿µùÏ;I –ÿ@Þª(`'Cr¹þIÓŒÔ U0 äÿT°8¶ë¸2¸à qôVÄ—¾ö¦“ÿ‡Ãá¸täßýŽ?:ÝÉHß½‡ñ8ƒWaw€ô(€WI\640òVld9(00êt’h|J%ZŸ€Ûàq!ú‹ý?„äª}lÀ ÃÚ €Ð¢Í’}‚d:S‹6ßC3B%s3X-Ú‹<‹Íº°Í}¤8ÄYHLKâ‚øô&8˜bNÿcBþ÷‘àU°HüAÀ!€<í?G%ªQh`Cl×S/伸1HZ)#-ëS,,±ÇgbÄòž”L¶•X®w!´§Ÿ~‹“ÿ'þ—P(u+8_=_Z„º'ñ~#m°Û$Ðé!†%Šf ‡¯åÌ+«ÚDðÝÄ8MàW·òv9À¼AÝvlpȽ¿‹ò^#Â(cÌ@WåN nMŽIÓ”&Ñ ý¯onþ1¨Âà7ÿïyÄ¿Ãá¸V¼ý•{øÙ¿ùÚu†Ãáp87þó¤mÂæã„¿¿­yÇØÞ€ñ4#­3ÂU›ÿù¯vÿÕþ_É}ÎÐ4¨–ÿeY‰êgá¿Ïò¿8ÔÀŸ6݉ì÷tú¬2ÇÁ™ì ÂɇÃáp\øÃCð7_Çq~äù'w‘¤°E¤œ° +±pâ-¶Xp`ÐHàãˆJ¼fÉ#‹ Í yË#h „Ó 8`æ,d©’è™ Àƒ9Áhöÿ(I;…•ÐÌÚïcpÎÐxÉoæ¬ 4iD¸V "šÚ@ÈZYl"ÊϤ³-éßæ¦Ä?,EñÛ¨ÿ0!ú™!vê?ËÑÿÏÊ /P„z>R¢Áÿ½3@#ó§Ç1í]7†´ €IÒ0KY¹ÞlþæN½ÚVòkÚÈ”ü¾ò¿íqY å:zì"p¨R=|æ „€ Ö¨Ëò¯›âÅ@ö'éϹkçpñólk)‰c£ÿ« Ì…z¬‚:HZbÂú/ý >þÏÿÉSÕ¨ÃápÜV ?z )î°Í[¬q‘"˜ ŒS`äõÐx„ðß`Ç ¼/0FeK¿l€4"S–e‰œR27Â?P^ ѯ„?:+ögŠ+¹ß;PÿŸéŸüßþ•k®i‡Ãá^{ç_þú¯û0‡Ãḱøðÿ9Áî8!†{BöçÄÂjÀxœïâa@Þ‘Zü9¨ùc‚Fë‹…?5Ò?œûyd³.s¯ßÜ[òŸ8 ŽM–uʼ~w <œÍ¾ÞþÊ=ï„:‡ãÒÁ?¾ƒÇ”@‡c8îÛ£GÀŠNH\ûp@Rž+LÂÁ»„”I¢ås+ $Ð0‚’B ‘ãˆè.$.¹E‘à&8Vþ\¢Í€j3ËT |!v£Úù38d“;Á”kÄ?±LËÀzé1–ŠAå¡[49ºÎ_±±¯¤÷=£ßK¤¿-!=/Cúw‘ÿm>t¶ÿAËúH»:È^Ä ÕUà³Gÿ/Áî“Íõ³b•LÌ%Ki ¨½tf±™g&ÝW®×»þFµ–7$ýß$À}äûe’ÿmÏS×™oåÌBŽ×_7. …îú¯9M)kî <ù=h]â¿,ã¾úm@­­6ÉA¦l˜ ‚Òþ¨Î@Àé_úcÜÿ/þéÓT¤ÃápÜ:„Oï€6gä£ÞA8 àÃ,äþ:€V"ªÂzÁ±P à­¤e BÌ]”‘¶€ƒ $²?d±Ò %w j¹Ã¥¿P"úƒ¤cÊ2eíGAÊ¡NN6]¢>ñƒökd_+Za*xt8Ž›€£·¢»:‡Ã±§ïøÑ?y„ÿÓÇøÜ¿{„“X8âàsA,û7  m2ò–AHu,Š€{ò_£ü±DÜŸµ?>«Ìq혔:&pòßáp8Wþö«xôƒ †?»Cº?  —3xMà ‘‘×@^ƒ7¼%ä8ð¨áå› Ÿ–AåD@  Ô ñ¯®#BÖïúÄòŸXŽâÀ: \Ò0!pDËC@¹Dé£}^³Ë  ‹Œ´Úþ³†‘Ï"¦¥¼¨PËLmî©eê&-Üÿu°ÍÖ„™í?ŠJü·2»®I\º`x/©|v7°¦]Ð:/é2çú]¦'älS;Øõ4ÍC%Á˵\Žþ¿<òß´€ÎJ¿èD UbÚ…†XÁÅLÞP<-Ÿµæ3›pï[Y›Z>n¹?KÛ Z¶ýËßÿõÏV‡Ãñœ#~rù½CŒ»ÞÐ㼞cQE‚wl5z¿|Jdÿ¨}­$}/™–þR¨¶ýõÃ%²Ÿ¤_Å;Ÿ8êwA§•Ú—²ö Õ¨¤#*ÓÓHûÖ“ò¿ÿͯ^_¥;‡Áô~ÆW‡ÃáXÀéû#|{ D`û ‰ÅÿãŒñ8#Æ“Œñ4#¬i‘Nt Ók ôÊ@:ÑqÚ0ÒZDœ›x€·"@$ðŽÁ#€ˆ–& E<j"‚j¢YŒ1­xÀqíðÞÕøÒWßðÜS‡Ãá¸Tð‡‡àdGß[#EПÞEø”€1ƒîä“ ù–7„°&p°&Ð6"®2x€mV Ú‘ä,ƒØc€R!„,„~Ì‘%ü"”ø7dbPæ`rËÊ rå—„è$u¹$²%R¼ë ²—lïpJø]ÏQ­Î§Åópö%Ðd®ÙÔ¡ñ2=#R-yÚHÔÐ9Ì ×²/ùë!ÿ÷ýžu8 ÓýR'Œ&öPÝF‹ïWAG‰ü?Wh€é:Wñ¯{þ6úŸÛ5ëÖÎk‡´i‰¥/6fdÎdŸ 0üÍÀηmfUP]0Z’™sA£|ÚÌÚ^lèŸÝ_þþ­ÿãi*Îáp8ž{ ½Œñ{‡HGkdŽÈ÷ (éTú]À'Ò¯B&àdVÁå ÉOÛ€´…ð§J…aÛ IDATÖ´JÒCêƒ]^6’‚&'qÕ)"’¾¸¹„ÀÒÇ¨å…øçBï‡*hïq{™¾.Øqr8ŽKÇ/|ý Nþ;‡Ã±€ãîpúÁ‡oE€€áˆ°;I8zc…q‘ÖŒÕKòoÝIÆx }ž0žf¤u@Xä-#maH;FÞÊ'måß&éTÿÞ1Ò(ÂgŠ@Þ1x$äQ )ŠƒÀXœ Ãd%m@sA€‹®ÞÃÚƒ_øúðS_yéºÃáp8·üá!òÿögñ8Œð…€ô“ˆÝ ^‘Oø„@CŸðIfð’cv`ÐŽ]G±“¥“[Ä%‰ò§åŸŽˆ±BÄ ß¤ßa@¤ˆHdš(`„ô'B ¨Nö羜Ï$Z¼Fzs±þÏu>ï‰"_Œg–â=¯$ª* º í¾f°„7o‰ÿYôtI=%ÿÉÌ/E…ƒúávàêÉÿ}8ï8˜[º†V72!Gg_߬ŒSfmˆ@:âÿœëw¨4Ôùme‘%ÛQÏŸˆ5}Åtÿí¤lÍÓÌ~­“P§­Ç ú»’ž€@ܤ SªG¶ 0¶¿ø=õÿ|¢ºr8Žçñþ=äG„ü8býIE6HŸ®€( Ròi¨ëó:€×"žÄé:@§+ðÑ(ÖþÛ<Ž"È„xrÎT#ûÁ4ÿ.;·®C($}Y¯úE^FºN%úËr&€¬ UA@ÛvŽð_½´zv8Ž‹âK_}ÃÇ^‡ÃáXÀýÁãïoqïϬ°¹Ÿ°y0b¸°;Î8ùñˆ´•¨ÿñ4#f„BÚ1¶„ÜÏ;Fˆ@Y |)Ë©ûŒâŸ¦Äûóœa"Óm¿!ì¹›æÙÔd?-~yùõHP(÷"¨jë²¶ñ¬­¯*#:ržÌÞúmk½0&µ3AÌë I&Y—”ßž´3À¹Fÿ§_ü!Nÿöÿ}Áúq8Žç«÷_CÚ%¤0"Dä‡8LÀƒø ƒ)ƒ¶²!‰ü_1òioH©72M‘Á뀼 ²Í.HZ”é‑€1)‚ƒ3ƒŠ‚38“ DgKüc’@!âwk:¢ÉÀt|¤=ff®¼(ˆT"ú¥$S‰ö—Èÿ¬i„ZÍ5F|úŸð­Jó›¨ìöK6ZZAýD,_, úhÿ&(Ùw   –s´?Ϙ÷6Ö¿ä³ßKæŸÕñ¿ÿ(83%B—@íÿ©-’Y[0çÔÛû³uMØKø/Wï[¬"¹ýtšHI¦Få¿ò}lþ˶|އÃq ïßCZgäÀŸ H؇ >‰àÃüÁ Dÿ6 Gä]°J"V<À–ÕVúTÌ’^iC "´LAûZH@N@IRdeè·ˆ.‰ƒ~"Z¤¾ZøSÀЉþ©…ÿy$' ³>…iu9ǵ _9‡Ãáhøñ7ã£qŠ;oGŒ§ŒÇºFÞ1ÆÓ Îø”wŒ¼aЀ* ”ÔŸû¬ãÀÜ¢÷Y—17»~ûÚÐX‰A m<°dq-©`ë<ÌöÓïéôÒ¼ãRàL·âµwñå¯ÑɇÃáp\ø÷_îâ°º³ÂøÃ˜†»„|Ž áƒ$ÒŸ2À#‰ò§­XüSb"àQ’@gÕ(䀩 4ç€À}&d@@Dà•XþC£ýiÐrM ëÍìö É-$8 ‘ÊfJx2À¡ÙúdÈ_‰ü/kf°h ˜D °$@‰{¶qѺd[9[ó÷ÌÈÿõOèíÿ[ô;ï¥Ô·‰üß ÓÑïèÿš à,2›Ê®K&Ö¾.-m ·€ÀÔœ¦Í®î—Á/õ4‰ú/ÓÝÉ_ &æ?6q#( Ä]#ý•`÷_ýóó÷ëp8Ïâ'/6ÒZrU¦Q“h1 op@CÖQ¢ûx@;’~Õ(NJ(‘Qê|•ð/},ÊZ®ÓÄÑŸCsKRÑ$B@`ð·Ò~© d0 I?í¯ô†þÔýבþdËzÒÿïó«WuY‡c/JðÕmÇéûc³XN½­r…ÌÙ~šÔüÌ%'sÞ–ÈMÙ®Û¾FbªsÞöéÿõöS¤_xý#;w8ŽgŒÓ÷Gÿp‡Õ+„Ÿùë/#iÚ­”äÏ5ª?m%¢¿|WG€:®ŒÇ²lâP]¤\¬þ¨Ácš@)SÔ¡_KüŸEþ;® þƆØN¹òÔáp8— þÁ=œœœ`õç!žé$!¼Î -À;€^"Ä­ÿ¼xCà•~† )†l œx$PÈ:@­"€H ¤Ö\¾Ê V:gBª u.Ó28ÜEtWËúÐå–•w“k¶àºuD¨8”3”4eF&í1²(‚ù]²9ã LYDÝ(g0#f÷qË!¶¨8™µƒäSßû%Òâ`×E¡û´äÿs½Äô¾žýòê\×;cýk”œUÎ(騩œ+¹?q73ÎM°íÏu_½@·›EùOfÍ*D½Úš‰5¢”ÎÈÿþ{ÿëÿwÏy:ÇóƒðÉ]€ 锑¾w„ùãyç$%ú#8Ž8f`@Ûƒ:(EðÀ‰j_а’ªÀ2,ó¬„?+ÙϬý9ʺJôCËYÉ~†Fü[k$@]aäžIzg‚b¨©½íÞâ¾BI|D Ù•­äðkßúÚ]‡Ãá8_úÚ›Ïüø{[0ÃÝ€ñ8cû !y¹þ`¬–i›±;ÎÈëŒqADØgð(‘™iÃÈ› ¨³o¦@•ô§äˆ$²µœ•Ðá€Ps5SDËÓ\^%Oó”ŒA?ýÞ7Ž/µî^{çðB×úè­áB©x]|àp8n#îsÓv¸÷Ó+쎴Ãða\3ÒšA1žÈ;&ÒZÞa¤ ·@ÞiÃÀ@È›,ÛEo锑Gù­ñ”AdÒÍ2ëû ¡ˆPÉþiJ6©ß1ކþ­éä¿Ãáp8.¿÷Ÿ>@|mþ½×€Gv Á§^éxG!î µþYlý«µ¿Fª–(´T"ÿ#(…êPrÏŽ 5ïl@Dä‘Dè‡Ô€Bs(d7bXÕù E±SÐIÀš€`bäÚ3 @ª€ g0‰Í?ƒ›€ú|êE P~ûbh¤IТÿ§ý¡Nµý·Ëƒôi̯=×Ñÿ=aϳy[¾¼ùlÙó þÕ4+7!ÃöË)tÞvÁ^Ò€i¿f#î6_>L‰Ÿþ7E€cT ä¿úcä_þ‹³ÃápÜ ÐGw„¼_òZlõÇGQ,(O |€CKô>¯t%ª?“ôŸX¢ùé4‚JTÿ¨‘ÿ)€ÒaSRÒ¾T ¦_[¿ª8*e±ó,i’B‰èWß$)7bÉ2=I¡T#õ©Yõ·¡ÖÚS7Ïu¿Âáp¼¨øÒWßÀO=EÔùe@"-ò–±{”°;ɈBÚ§L댴Î+’hÌmFÚi¤þ&W²¾DîB¦ü¨™¼¦ºŒÄç$Qþ]ÔeÑÌè‰óÏ îÿ‰1Ÿ^š¿B<øÖ¾µ¹Ðºò¿|úL~ó"¢ƒ×ß9ÂÑÖq±Ãá¸Lÿp‡´Íˆ÷»ˆÝqƸMH)[‡Bæ3Ä í C¨”±;Ñ÷ËÖ8œ¶w—wPq‘…àOÖU¦DùC„H¨N3•ì·i² >ñ(ÿçEVþBâ¾þ…Óñt8Ç-Ä¿ø<þàéû‡X ×ùˆ«€¼•h~‹=í&+è/Qý%¯ljA‹,6±”eP;ä’GVóÑsˆ0ðD¤«ýl%øÕæ?R@¨¤D "’õB4íáÉÈžX—(~¨€8”ïŒlË8wËZ¹ñ(óÆjþ¼NMÿOö{nßßGø[ÀdÙùo~幤/Q‰öZeÎÈœõzÉ'å„ÌI¿ÍòœäšrFFî÷ÇEFÐ"‹\Á«€¡e¨äè •õÿiH¾™žüV`Êë=‚nÍéTÿK4ŸªmNµ´¹wþ;¿»÷L‡ãÆà£# 0Æû$.HY‘ˆ y€up³çßɇvmZæ#8¢•[-² )ÕîT—€1"ŒAÄ•i@#8$D„,Í"b>@¦„#’^)¯i”~“ Púfú¶ˆ°ÖýmWã DýZÖµHÿ†¦5ÙÁmÿÇMÁU`¾?"m3V/El>1®3V÷$‚?m…à׬Q’ã†"„lÙ2€þJú—¼Ë¹ùq])€°29˜kô¤º†¢ÅFRZbeµ¿@úÏ¢-—KóûÊŸ oåÞ™Ë]hàp8–ðø[¤#`ûH÷@Hë„Q£üw§ãqF<*.1"HÛŒ¼–úî$ƒúwÔNe5ÂßÊ7’±þWÀR´ÿâ; F3 ÜXšCð œüw8Ç¥á£#зÞÀãÝ ¯gŒŸ H÷â«#òi@>%Ða[ÿ-GïHìýwìÄâš–5-"(5L¢þ%â_£Ñ ò߀€AÈý¯ÿ%ª}E‡"PâJ‚Òmô9eÏÂ’`J*ÏÈý"˜•—2tû¨û¯B€ýèÖ[ÔïÐ[ûO]úršìãvÿ€ ¦€²¤´•¥­âߺaè·9åÅmlyÙûü÷úòNÔÞý ð+ÿßâ^‡ãºÀŸ‘Á9#?Š? H[BˆŒü8ÊSo`Å…e€u "3€V,ËGq 1‚v±Z£Ð.‚Æ \—qÌBè“ô¡rT¶iÊQ…–QI~üWb¿Eþ7²_âü•øg™J‚¤€P‰û`Þ0-õГö­öÁö9œøw87 GoEüÇÿë¿ñL÷ùão<ÆË?{€xHxô'[„!ÆSµ¯D~Údµàg±ç„tš1žŠ%ÿx’1ž”¨–í­mÿŠ$Z¿ÿšS™"37¢_Ó,Z&¢ßFR°GS:f¸ˆ£ÁÛçðw.˜bÁáp\.>ýƒ ÆuÆÇ¿{Š“÷F ÷yËX<"Ê;k÷HÞ_<²¼£‚¦†Ù1‚¦éÞ?当„fö}³ÏI8û½ãï¡ç/œÄìè­ˆwã§]]çp8ŽKýé+xôû#Â["nWØþÉò^‘>ȧ2òGø4‡©9Dî¦1J~Z@³%’M¬ÿ) ©F2ÄÌ+%!V)g03ˆ#±Û'$0 P–RÊbøO ‡8B¦~@ &$¡ÆgG¤U"œ$-ÍaIVNzÒ^(eÝ[é†é/–ÿ Ö}±ncSÐr¹S:µ’³]äv#ý±@èϾ É_ÓÌöQÎâù&ÿ¯ r½o’u׿mg“ë;÷зO-˜Æ÷wó{«a²€Z½5Ùô>¡¿úð+¿wî™8Çe€p¸7"#Ò!ÀÓ 7ÝM@ÞFðFS m%íQAŠRú=!ÉtÐh|±æ• ¯D½N ‘?4[þl,ú9¨@2ôþPw%µð§BÖ/Zö·÷yïVâþY™½ïáp8nÊ8ì“¢Dñ¼±ý4aó a¸KØÞOOÃ+À£ïo0žfpb y›ý¾ˆ4ŸÑÚ#ë|Ò(ÉÑ({äB°`!J’ωÞ_Ì“ìD¿ã¸H…÷¾qüÔû?K`p–°Àƒ*Ž‹aóɈq›å¢c›oýâŒÛŒtšE¨¶qZˆTjŠ{LZg¤ Àxœ‘Gu§Ñ4Ìò®DLÐEüæ]¦ï9Îè¢ÿ©¼×Š@ÍDÿWø;ê¹ÆMq½t8ùïp8ŽËýø%lÿà»p‚#ÆO"rÊ‹…-'€OI¬h×y-Ä1³F·1€Àmð{`IH"4òY>¤Ôî6¸]¸YÒŽbýu ô4H¼šÇ¾-#Xkƒám@FPIðJÿ/ ˜[¬råÿa#÷ûHó>R|íϹ#SçÖêûº6† /ÑþÀlÿlâŸ&ÿv&û À·ë€êÀ55ƒDúkÄNHœs–ï©Ú6è®3P¯ÙÄ)âú`Û¯–¨h¥]Ó"ðhmÙv©{uo÷oÛçňÿs·;‚ùþî¿|Ê:ÇÙàûÀãˆ:¸ô0Èyh•‘O„ð@:%ð1Yˆþ @+ o Øhq=JJÞi4þŦ?…Jþ‡…ÜOCpDÌQÒ%åâ‚«#Rëi4>›ÔI…è×ùætdÿëËlàYEî?+üÚ·þöu‚ÃápÌpžëúãQ¢ãä½¶( q1>ΠjÛ¯„þ&#í¬‘<6«c!ð¹'ðõ;gÎJø›ÈÉb\ÈžFO.Dïwù-©¿/²Ò£*/ŽÞŠ{ÝŽÎp"p—ÇmÂæ“› 6BÚï%¬@’èþñD]hŽ“¸ÐÜ j÷ߋظ¼ë ¡Ÿ­’÷rûîìý{öÙý×yàl›ãÆã…¼ý•{øÒWßtòßáp8Ïôñ]Ä)‡'÷1¼™‘I,lƒ’§kv @^pJÀŠÁë Ñþ… Ü‘ÚþS—ŸeP|:òÆöŸ@]„[àAi{‰l‹Äê_mÿe>TQ@,©à$·ÿOiý¿„f…n‰ÿÉt!…½`Àî³Ò¬À\§ò·ôQúSB‰øoÓ¸õä?`¯jZ†jé_?†ø/B+PáÀ’˜Ãî¿ ÚßëÁTÀbmKýïÇyäÿ2ñ1ˬX–½û¾“ÿ‡ã‰Á‰Øp±!¿ |´Åøq6¸›ÁkH£#ïJß2°´#hÚJ¿E£¨’ûH§$ý@‰Ä‚?‘Fïk?&µ4F#"ÒGaMeÄQÒqD,bF Úï!Ô¨þöD7~û‘ìs0z2\ß{ßI‡Ãq“ñ¥¯¾Ÿý›¯Ëþ—~f…Oÿ`‹Ów¸óù›û éDȉnL§Bú'ŒtÊâÍq<‹hìísbCâ[+dî"/BrI³pR/Ä(ºÃqs𴢂×ß9rÈqe8þáÛG#8ããŒÊ?±œ‚X~×-½ãü½÷\ã…¼ý•{øò׿x݇áp8Ž[†øoáñ× Ïo1¬¤¸CÈéa@>°† È#³¼yë y¶hv·±Ø 4â @ :@nHÿò)‘n¹ –%ýK!þ%Šm…#FûSÔùPI‹{PË[{†Íÿ“`.h4iïPJ¬  ÌÉã‹ui*…J–@#õ ™Úÿ½H nE=%{[Èà  @2Ër·ÍÌÍa"꨿{í€ÒʼÎTñHû;Çôè[[n%èη-}ÒóîÅôîû¿ú¯žp‡ãVà#%ð™”ÜPÒýÓðI2@9 o$±–LkH~É­Xóc`ð†À,€G;±ç/Œ¤}ªBE5‚?h¤ê\D©ô_Ôµ¨8iÔ}Ì+黨01’Š© ci¨"E™–~ÎVÒÇ¡ÐDzõ].Ó‚Ëx·\ï;ßɇÃqÓñöWîU{òpH•˜˜Fßú‘i‡Ãq“p–¨àõwŽp´G8àNŽ‚GºEÚd w 'ï  wòNDmyÌ5j¿öiÉo–ëþºŽµñOf}%ú»ò´çc¢ý§‘þ¼mb€Yšš³¢ÿ§ÓŽ[/øóãU¼óµ7¯û0‡Ãq‹ô*2Øæ ò#°ÎÈHIRÚ#!8ׄ¼bïOÄÞŸO"X§‘ X‰’‹6ØF`•A»ì"xHM ƒé!±Äe“—˜Ѭÿ éo-ý« …ZŽùê¬pKN#ß©_ëb6½ÉBˆV¿#ÿÛt Lìã벺÷=WÎP·r·’þ©oˆÿnrîfŸ·ˆø/X0322rÎUPìÿ3§nÚ¦ ´ ÖÍa"0ðF Ìõ¥ÉúÍ `räû,ÿyÚR?ëù‚“ÿÇx¨Ž>VاŽ>‰D¸€‡À*K´ý6‚vARm£äud!Ùy ±ß߈Ã3ƒÈ›ƒ·„¼ƒ<ƒÉ#g„ô!쳊šÔYLb‘_$"¿<žÄ>_Ÿ~›i<ËwœÙÓä½j]u¨4W¢H!D3¯}˜`œ‹ŠkQu–a›»#zÖ¸ü>€“þ‡Ãáp8/.Μ•ðTÁéû#ÖŒ8ø\Äîӄͧ «W¶ŸŒ׌pHO2Æ“ŒpìgìŽ3â)?$ä c\3â BþoXÓÁJ9E ­ÅþŸV@ÞIzä&ÍÒÛtÑü…ô·vþKQúKóŽ·RpôVÄ—¾ö¦“ÿ‡ÃáøÌˆŸ¼„øé<þäa D =rÁ§ù”€Ã\sábC"ˆ\ˆÐé <ÐNír5*MT %jÖ¹9v¹q ‹Õ¨öÿb!÷9J~\ü4Ô(ºh"þb˜ª³Í®–Ô>[Pî–[[õ¶ æûQtMËáÛ§05òÿ–°Ï0.6 €ÿ)§.%À"ùV€kw8ßþ¿,²ä¤óö)S—Cþ÷˜Ð {S\˜ïB¶¡‘nB¬µÈÛXR…è²JÎÕ¨ÛÞýã¶·™öŒ(sçÔï„Ô,d¦ØšÇIYPçÔëb÷[ÐÒ¢´ºÉÕe£Õs©ßdRsp­k]Wë¹îï3¦X¹<ôí™j¨·¦-<§§hïîK–D;—ªCŠº7I/2ëæí³Çn1}oê_ûÞÜs¿”_yÞîB@,ϦÐ\È|O÷×êfß±]î™7|6Ï'ÿ‡Ãáp8—‰³m'ãÙ®ƒ—[4b÷(ãðõˆ´“èû´ÎH'Œí§ 9 É>‹MÒå% ŸGÆî8"!f!ÿW’>-¯4”Tj,jò:Æ¢ ˆFâ'´ýOI|¹oÇ‹R?¿øšëþç¹ã¹Á­Àkï^XÝô¤0 8ÇíD|pøãW°^=B¼ä‡ù”îæf¯[óáØ*ñ?@Ŭ$¿¸HÔ!›ÈJ&2i^ÜJü‡ñ_Ê š7W?Bø+!W¢ý9Ö<º%ú_¼¡·þŸDþšå°ÖþWDr3÷½[n“f®5v6ë™a ýVfIÞNaÈ[¼ä?0'+ih]jÔoÿߎ&…À™;'Ûß«Á”,ïËl;8µÏú„ IDAT3ò_âYDâåž›¶µó¨¯n{"n Ñß"maºõ,éVPÏî6»F<»ˆæJz–iD³X˜«XHÍz_¶ºÎ ÷eÊ ŒüT€›!Ê™¢È‹óç3þ™û¤äÿ³i_û:fÙ¢óÌT¼F éÕàùy”¶1}Æö¥˾¦{î•:?LÈÿúÁb'šÑhÿÞ@EHÚ©Õ3;ªVþÙßäKíléMñdpÒßáp8‡Ãáp8Ÿ·ÖÿãÁ·6xð­Í…Ö}ïÇOý;¿ƒ÷ŸzÛËÀE[—ó»×#„p†Ãáx–ˆŸ¼„ñ1ƒW#òÈAH ùSVã ÀÇ> ÀÀàãŒ,€M"+á/lƒä÷ ØZýÓØýa7ùÏZÆbý¸ÿ±ÿ$óB½Åù_ˆ$Ä–G×äÆ-Ó+:P²¿'ñ€ë#¶{bË’f•øèHÒqvîÈ” üâáßʧ¥Óã|ñPjƒ5†””`+•E .‚¸PrÅnZ¯ ¡HÊ0Qe«åçx— =¸rŒrÌÒ.JkÜC+^3ù/û®1¾3¥k}£;·v}TI_%ÛI%éu‡m½²`Ÿ$ÂÈFÕn– ÜCè—Õ›Þgþ;W†žFµõÍÔ?²ìòVo@æ,µ—z‘ð   ¶8[zMxòßâÑRž'åV¡¶ÄÒÎoù_~ϼÛô8É.3e¬÷©>9ˌ޳ÓCºø3¶=Á/û;#ÙEEÄa—[@y·P]ÉFõ—eF¢¥g1'ý ó§/”Ô?–¶zº=9éïp8‡Ãáp8Žg‰[+xQñYÄ Ïãï^·ãè­xfž³ðú;G8º K… ŽËCüøe¤­6Œñá€0dbðã ¶ÚÞ»b×OÀŽºh~¤’ójïDš÷8˜œ¿”ÊAø éÏí[>°FæC—)_íûQ¢ÿÕš}ähGò£Øè2²ŒÌ…ÄÓˆ¹BÜÞ!ÐHBxr:ðOeÊb_ÌßRÉ”ôŸ¯ÿâÿŠÊ°”ZDlhm?%"œ¸Ñ Bjq¹X°tT!¢*e¨œË!¨¦ûœD¦–u¸¬Û=ÙÑL×¾ vA}Æú\Ä5å¿B.ë%cæšVÜRlÜÞOwM‰ûÞу{eÐOŸU]7Ï>ïÄ­€Ëg‚ˆ+ô$22 ¥’ƒÞÔÑò®Ulb5ªhã AÀ“ˆ®U„³ˆýí¸Uõþcµ¢“Ö ¯Šü·¿»O0=^fS…%–½înyèÊs·§¼çÏXÁe>ciq~òŒµÿTÐilmÑ@}߈ʡDü“yÛ_àÉüYϳŸ“g->.Ö_pÂßáp8‡Ãáp8— 8ŸëÓS‹žd»‹¦îÿöËÿ¡1eÜì/<½U\1–‡ëÃðÁ…Éáx^?y áäéï"å„40p< G`ÈÀqDÈ$Ó›¬xÈ MÖQ¦OcÄCà]bÂ>Eð@£JgàäÊ*È!E%ÿCø+ÿJö«i?qHæ$'´šùS”òjÝìpIíq­ÅnµÜêtÁM#¸çù®[¤_ #Ó¹Œ99Ðö·gî†ÕÉõÁÐDúú¨ÅNĬÄßî$²Uö#_%B•Æ&ÝD¬>{‚êòŸÚw‹|·tú<š³yK&î_÷2QÓL؈ýîX¸ˆ:™o£þ+‘̬,$×½Aµ~´ \äÙ|7^–—ް;¯é²ë §çÏýB ±Ù@Õ•Ôs×hÿz/”únŠv†Ógb mWõV@°|dEcqÉÏØîj,Zÿ›÷+•e¦Ÿ¢Ÿ@AÞÁ¸hêÓ›)E0;ÔºX~^?Ý›}_ýœ'+hpÂßáp8‡Ãáp8W 8·SAÁÏ¿ùy€©EÆþ__èè³¥áëôß_Œð¢w/æ¼@ïž-(¨Çóq‚Ãñl?¹0nh1f §5òk„(¶ýøƒ·x‰”ç"ði¯Cp_p0Øð€8`Œ @ÀXˆý(VÏÊšÊr‰þLH  öÿ$Â?±Dóƒ•úg%ò« @¢ÿQ¤dD6ú²Ÿ–."`I-PHˆâõ]  `Ÿ˜õÛÂóžeËËôïADBP¢E6µR“€@MP F!š› €–-‘þ—BPÑd/ËD••›ô-÷´9›ùá-Ë®ö>y:›úFüC£ÕQO³KÐõ+æ“ýLOLï=tsdè>çlpeX”ÁKf®iW櫲Ÿ3˜ LâÀœÁú$×›¡’ÑÕebéΜ‘²¯Rkª+š1«§Â‹³½¨óó˜mp#@õ»ŠÂt¾ÿ=Á]ÏŠMZiË#ÿíq,˦å}*€¾-—•¹¹›ÔGÊ®úÛf÷‹ÊÚ5úZ¦ç¨­CS€î7«D`Ò–íÑ=ùù4<Ýóç×¾õµ'þU‡Ãáp8‡Ãáp8ž\àpÜfP´Cî{bf/L|ñoá©Ö3Á”-TêJrªÑ?å”Xý ÷7×5¹å.—i‰ŠÒçN°ù7‚é \© .†ÌØýÜÈoœ\è|7ñƒWÀG[ä‘€+pÌÈ[ ŸF%H"ø4 ŸD`KÀ‘6Ø B¾×¼  ‘·´À!›a£Ñÿ[%ûÇ(í›4ÊzaÆ)Ž $Ê$ÓJÈ#7r¾Xý¢!ù ©¯÷·éù¨]?!hh‘þe°\ï¯nxœÚp9ðt„÷Óæ’~äúÒ>¦¢€«<ž JFV) eÔÒ”g2«x¥ e{%”¹ ô½¤Ó•ŠšT†Ö{â_xãõ’µžžD¦öPpSˆÐ à¬Ûc"èÈ|æÎ¦¾ËàÌíIê~Þ–/o>[öÇý`V7o®AÿÖÃ'ÚæE@xpáøùå5èäáä8^!…´ HÀÑÞìÖVŸ€'ï ¬J$ú‰@£N4 9‘ y¯ú@»!7Òe$ëB|0!p±='™×Üè2"¯ƒØerWêýÚDz)Ý_Æ5* ßÁú†ø™}bywQÁÏ^&åÉ ‚¥}]–(Àñ¬aè¿"Ú*m¸14³ÿ·.€Nºm{¾Ÿ#@ sµmøl¢j‰ô/§±Ÿ˜* ÎoQ.³1´ ?vm¤éœºÚoS_—©R¯Òõ\5×Õu˜áò£³ŸÆA¡©{žIµ—ÃÅê_E‰\Ûý‘ë³¼µ2mû¶ÅsÈ”«@4}ûkn²·îƪëOœ.nó¿çñ³õØÍIð´ÍÅ)WåÛêÉo¶î¹¨.+òÞgHLŸ±\ óKyÆbÿ3¶Ü65QKIÐú:("_›ÊÈÌÃn;©‰å¹³–œuÕÏ[ÖËÜæßáp8‡Ãáp87.p8n)ì˜'™©½ë_ ¶4¨©ƒŽdãœl&â9}Ùðô¾¨þ7¸ª(€»ižMµ¿ôñðoé6mMLöQñ‚. Ÿuxµ ¶¾û¾¡ŽIÇFÛ@i‹/ƒ¨¡åŽWñD൑U•`Æ4` íäMNÝ¥õÙ%’‚øÉ=l?$à(!Æl•Œ  HcýmbQ_¬Äs@5$ÏJ²¹ÔPÐc·¼hîkÕT©©e2)Á-IHý¦-䮬¬dš’œ¶–öÔÉôXê\;¨v}»ùþX-ñ?=Öóî÷9Q9ÂKKhr V„ÔÖé¢NÈ¿‘°iÚäJþ ¡i‰ÿe5Œ-z!£˜ ó(U}Þ—ifýñœwv‹ö £É}Ó‰Ð,?JõH.]Üß ×'ØG$òd :{õ&@fö…°oÛíÙ³¼ô\Lt7sd0B]7SnB2ݳåM(¢ÄÖÇ‘k•!ûl¿ÜÞÕ­a·Ô–ý%6B…éònú*aÞ`•¸¶MnOÍóÒ,ÏËx¾ÖÕ ïT)Ý#Ø!,•Öe¨W­¤fY~ƶM.ãkþÎú&­oZ—©H¡|Bí«â¿:!õ}·Ò«+%ëG,=°žöÆéïp8‡Ãáp8Ž 8·]´ïM Ýê6§CqÜON7‹³½•QO³I#ê{’º‘úSbc>¹x,×R¿ýE™/„Ü$j*Ôoó ‘¢qSˆF ©Ì ­Tk!ÊÏOE½8 ·,F_à=¢Ù22ÃßÍxÚ躤 nkY=2´ÛD´Qçö0yªm¨\Û6e¹»> Ñ_ÆÂåxBÓ"qrkN ™¸ +3éu¡!YÑŽõ¢Äÿ>ÒŸ»Ù%ú¤_ÿ¬¢vÊlèhÜpTvÒE„s¶ @±>Ÿ+q€JN¢ð˜ âž âö°—¤:ï§4V}[ì#¦Ø¬Ý݆…ÐZº_ ìM}^ ˜¼C—mêÛ²²I_:}ƒ‹;¸ÌIéëE¬>ãü[þvKþC£µ¥>3²¶?yïæÒÞ˜Ÿç=Áú^®öÿ(”@yUNúKfʰ I‹ë¬õ¹â‰êç=/Û?CëÿX±Gq¸¢gl½VKÂDû®¨ÏÔBò—wG˜Ì—OÙsŸ±Ù÷“ÁÞ³O¶­Gù;‡Ãáp8‡ãy€ Ž[ŠüÑoâ?yó?Õ¹(xfÑ‚S⬜6e|“‹( ”/S“=-”]-æUx9öÎ}¤•4›¨-]©í¤ 2Wš†Úïè±,%uËâèϺÿ’¯¸FY#3 YǬéš}q!GÊ5ï…óxÜz—LH}êˆ;d  DlŠ:@†ÑK]Öíd@´ ž Nºñõz$åX§„HÏ[žOþ/ÿSÒŸ§ËŒ`?æ5ÜqŒÜ®xiLö˜Ï³Òv\j{äaª÷Æ’ @!s€³i£å:·YË[‰¸§Ý÷f Óf,ö“ÐsjŠ'ÄT»i,É/{]~sV~ M¢Têä½i Îz?\úw3ik˜.Ý{DM1Á]ÙM«Ú&NSLN‡@`êßk…ü¯Î$ô¿´y_”Ô(dmÝxZ_l¸Ú&@!ÿÁ²~¸pÁµí6AÏY'Éæ_Nò²/Dÿ{g·[s ÌWÿj[ê³ÍÏáfôåÎ_"0ϪÒW1b«Jÿï}ÆâŸ±X|ÆZW*2}¤ño#ÿ Dÿ—ÞX ÖR.óÙæ„¿Ãáp8‡Ãáp8žG¸ÀápÜhœ=¨·0>›]àe“#wßpo§°ëî¾IÃÆ1º)ÓöÌà°%ÿ -±ðþ5ª¿’û†ö×T=ño# áoIîóΨ„Hµ.Ï•ô×Üæ°B€º–Fܵs,ŒEµP¶Ñí6ïü#›—^ gS¹³:©Ä?ÝHÿ‰8 .«{?ó˜--jμÖb#T‹3€a,W¥…îp3Ð]ÝŽÜ¢?LÖÏèriD%@™V‘‹©šœ2[²DLd¡!÷ëj÷+ìýHÔm^ 0 –6m¶,7Ëß·×ñ>‹kO¬sW7Dc¿Ò¾m;ÆÚÊZÊ,Óö9Ûz,f?«nÏ„éï\K§' ÛëMß…ýW#ßAÈÖ À±Ìm¯óö>¹H9·òÎòuûú—Ût]¯<×Ëõa[“z5L*€žf>«½?)&¤·>ºùú‹¦Í,´YÛìëå&ôƒŸÝùêLu‹0Ï®r–ÍM‚õ‹îk+êÙ?ciöŒm‡Þ“ÿ¡~Ï?â€^ €þ‰tNaùšÏ·vòßáp8‡Ãáp8· .p8^Ðl®» BmiïÓãêèL·ÖÒu€½Ž/‘—/xvƒÞÏ KcW¥64ÌË ¹fHûbë¯D +YÍœ‘;²Jü[Q´m/z­ºÈ IèòÏr˜  „ D> jÌn'÷™O^¿çžÏ4ê¿’úhõ=4Ò¿wNhâ3wþqWÌ}uÞˆ´®eÖ¿PBæÜ àº0wPòŸ…Ø Í_¢üËÝQ¢ý³NIë1éhŽŠ¡Œ¾øb»ùÛ¥/n÷tùíŽ`4›siJ¦‚–M´t%W Y:=šë§ÿÏzO4ÑSÙ¶{ç^ð6ël¿a {B‰m¯‚(Kãijo…‰–ê7¢Æþëš`Ééö\/)„PmÄ¿4•IÔ½¯Ê:v¹îq¡mÕç;ÍöÄ3=@÷&¬÷.ôýÖÚuž´kÒv]Úø’ ž×_……6IVäÙHß2Ý.8u¿=ÝOs,h©ÛÉž{özpö=Ú}¨­o£îA@¨·Noýß=cË z ÏØ*‰¤Rÿº†±õ5òJü²¿#þÍóC¿k ˜õö@_Ãáp8‡Ãáp8n3\àp¼€¸Nòz¿åþUŽŒ(dR)˜’ªýæÃÁ€˜þΞBBµyîꦌïMgg•Ó/›m2!¬;Rã)g( F;JÖ·F®‘%õ[´æ,"SÖÿ&E@¥¨§dõyýÔZ[! ™CDñ¯Ä'•ö µÞd*« pèÚµÀÞWWŸsò¿Æó·i›N¡ÿFtaDvŸ­>»¹v.åo½e©’JuEPQÊ‹ 5!@ù‘²]ÕP=\-¦d%`´l qh1ÿå~')É`„Ò«èGœ1ŠàÄT œUwŒæ]ÑÍ냦T=4¡¯ÑÍ–¬|¡5Fo[t[Þ„wÆY·í›±Ûì ¼ðÎïÖ’ù0u$„e¹ïå=[ËÊ3 —û+oÞ—¹êÊ^ê=tO-”§êûN‰y*çXøg.k¢ÕUÿ\Eew¿&Ï×Bú¢ÿ¶+´ä„cj!þ1·ì˜*ïžýÎ/PoeÓIùŒüGk—¤Ål¡©OPêØ®p† àF`©ofîû)"YÓŸ`‚>UË]ÒÚ_}Æ—öŒ­â*=®PŽ£XúW«šDü7ûÿ&º,Û„zŽöYTÒ/u³çˆðw8‡Ãáp8Ç‹8·¿õÑo௽ùŸÉL] »\"ºÉå¡M» Á'–E»:Z#Úºß!3¾ïˆö ÿvƒÚ4Yci×1Œ¼¯þÚÐðT$qöúÓ•.²ígC!—QHf–˜à)±Ÿ§€Žô·Qÿ–Èî‰nó‹gh«ípoCmÅõ¿*ÐÁieC̸ÐD+ñIÙˆP ›³bþžç“ÿÓúšŠ.,éŸQ„muÏ8“"(7gÌ7õD}½2aIP£ƒ AÄì"€!ê5*ÑIܿɂ^y™–ö“Áh.“ýƒ»»±ó€Gy>ód«9mÖ¬²Û=-‡g¾'÷pÿ–Ðû¦òdúœXrèŽìºêþYN¦xúªœPw“¿e3ݽ.ö¼3Ì|©‡&Â3mÃÜórm'"mc•CWò¼r™&qmÎ<¥ÝÔ*˜ê³ÞŠtMîÖ¬Û³™–¿ Ï8*ÛOÙZ³-O÷ƒ=M²Õ`ß¶!vò üfiPÜUûy}¼é9ô[”{²Í7î¿–Ô©¯øŠ–¦£IQæg:m+7¨/W#Ýíjf¾ÞK†üï\uÊÝVú=ÙܼvÏþ;7JQ#ò‹í¿P'þÁÔ îµþ™>_çøµo}m±Üáp8‡Ãáp8ŽÛ8/æ4Äd@ô 4‚%$Íï"Ð pöƒ†:àgûêq‰zªCœ:`l¡©X…/ *©˜ %Áµ|JÜLÎeq0ùj1¿ZgÑÈmP¶lÛ%_Þ¥ŸaNÎ/ÏJì·H!ý‹ÀЦDvOú³±¶¯GÐ}U”±ïî 7ªÍOþcÖk ›kÐLЃæ=WãsëË\¸-m÷ÏŠÈn÷Zø/õóÿ³÷®9ºìʺÖ9hÐ hBô„´o$øDÎ^ë°á‰VÙkíè§ #ƒŽË¶3¿¯jÔmÌŠ·æ¨Ê{Ú‘N;§Ÿp˜FšÅøßÛ4í™Ï°Ü‰Ì9ÁCƒÄ>â×߳ڱထ™{”ÞÐvŸ­ë()÷úè¼ÏSDˆsƒc*ŒÐQþO96“xí;LtóSGK‹X­@3œ "qu¡BD‰ Ø£m! hQ½º-Q3>-ô¨J€âl§óŸ‘l¸ö/? îüj”ó]–r¾\ZìhsÁjŒ4À¦‹ 6I3e{î^¦øyÌõ3Øþbé´'—r-)†aè@5k”©šn§¾·x—†§öMùû…ðίÕnd~@iäH‹`à?ÿ©?Ó9ÀGÿO°z¾>;”´ÌÀz%Y¡‡ú(tìÜüŒ/Ü‘a? IDATb¸€ÁÏCOœ8ä°[‰D}3'€9Düóß²|n¶û6”k¬6¾VŽø—°³ìwg‘#¶çÏ~Ç!'< ¥… ~ Û}´®aÿK+Ù^ë½m±: ͼ†ú÷‘ÿvÈØjmT”·éÇ¡;ãø–‰ýPâf4… H%”âý~2ÃÄ­™si#^Ηée Ó…ÞK3>||¼LínÚÇ›äÚæÎ×ÞAÌÈy´½Šýê‡9Y=€¬‘%ÆÍ2¥^{yÐ`µù[kÑ\~ØÑ¡fõ‘9›ä2´]RQ¾Y¦/žíC¿9ž×½-r놀÷jwÝÞÉåÞ\öw)ª_ƒnψD¹ðåø&Ó¨­Î:¤–Œ¯ðùVôàE¶mD`øÏ <+ât¨ùpä£vüÝêX{>îÌÇ£þ ýŠ V´\¿[ñï(thÿV«ÕjµZ­V«Õjµvj€VëèÿþÿÿÅü_°NÝÒëiÝ~ïΤäº÷FøtÆ ó=Ý ¢@¹Ì.Ä)‡²Fxâø*»ãr™8ç3À剖…6¯6­îõ·ŸCË…èÔû¼4 FW4CçX?)äÿYÃÿÏaÿçPöí¨“¹º…)Üí=þäÃvŒàe®Hè£ÿ}ä? eì¿â€N‡˜,;]õ´?iÙ üP¿8øT ä°€ÿú\ø³sŃ4 SN Ìßñ€þîTÁŽYfÙíÅ 0ÄSúâN+¨×ÍÒ¼{Þ3C¶Ÿ| ßëݸm±äzà”Ó’8ÊÿxÒ¢ä$P9k]«‚ªñÎèýë£û‘ ŠëC1Â-J65ÒÒî=âœy}ÍF…r4ΛG_¶o­ÚÔ]ö^Mu<¿“QÇ…#ÀÜ(äqBÛêmÜ1$íçO]|ÔŽ-Î?Êûí9S¼ü؆ ôÿ'€É¡"`u6"žÒ,G´àPU±Ty(mV&Ï/½Iu}_êÔq:rÚz‚ÓTá`Ê#3u¹4}£Mkó·[”GoŽÉYqø„Rù“zm¿«Š·ñ:”Ò!6,£ÓûúU¿å|GÖg‡É‡vPÞ5•Ò6'ø[á½êX±2˜#ïé³V]8ü¿;.d~•¤,ªƒÅƒ™Z\ÔßÑñºðul4ð?Ú †à·Óï Qœ @ÓÁg¼·™Á¹­øœ0õS[ïBÍSøv¬ ÔÚ¹|·o¨Î/eŸ~ßÙp-]Ròú4ü(WvâwÿJÏ•“ñê‘Ýù´xæÏ]hØr”óø‚ g8ª_ýdƒ°öjF¬¥ÆßGÞ"Q|»£f”Å<ÌÒàN&uE~fj$QÃ)ÅQuuÒùjßralAÇoè‡ñ¾F¾¢Lf‰Vœö½_;Š»ýÓû-ÇäàÏøXŸuä!ß­?ýµGü·Z­V«ÕjµZ­V«õŒÚ Õú&ŠÎ9꽂¿άãx‚ÿÑQ¼ LÀàk²7FÞ)ÏIpø¨ÈÎDúÀT#‰ÇE§0M!0¸OÚŽoðöPgåz~DxxÿlSûG §žÇ m{K9PMÀŸÃý?cÄÿúš3øWzDsGö˜ U:Äú³“©ˆŒŒ$€±|Æ(ç÷ìŽ̓Nëx¤t°¸‚ÿ þµFV˜1È®³ÇZo$!„ ^ñ÷‹ñ£#€AŒ è<³¹9ÈNþÚ¹Ågª‚ÿ ýKù´m¹Ué8:i+Bgâe?-;ìÀ+VÑ™oéaß úÆJ‡˜¨ ÄËÛì0lGÊ®^¤i$¬Ö‚Ç+ ŸGšËÄGL{ §…á~’q>Üñ!9¼•ý¸0õS‰ŸGF ×çôÞÉf[ig òþ\¯÷ærÄÓ°qJÊþ÷QØ\÷Nnað2ùW'ªmdÜ“Í[Óóœm—ßþc¾7÷‡=‚ýW. O´YH°íü}ôKŒ2ø|)à(JcKv².Z°ím¤,Îß{¾Íï=¾kŽ,‹‡½HHL­ÆYqDÊ?}gv’ø²ßrÆË¿áLU¾“Ë;yõwcÔigÀú¨[¡Žåk-é‘ øÓÁh“öpðÈZ¦Á«ÕjµZ­V«ÕjµZ/S;´ZßDÿ×ø_ñ_þ'ÿHLPt.÷u᢭Sœ; %·#:#§ŽÉ©s“Gÿo;ýzÖC`Ð;ªk’²/\BføaTð4•iÄà…”…-yñ·ïü„ÖÑÿ §²)”Bÿó¥—Ñÿy¼‡&Î-Sçÿ.¡ãW *™÷eÊÂ0G€˜åü Ðﳇ«u—ša09AìgœqV8?Ù†ì–#ýψ°0G˜Á d'ãìà”ÆÍû’ëÓªtÝsϱŠ  ÅS¤áYû½µj4·Í„ý§( nÓzÖ똄 Oq’€Õmâ;Î FH»ußÊNì0ÛñP,ï’±1Æ{Aîî`×Ê‘©ZíDÏ}oLp1S«XGŒ.w#iÜÉS)áÐs¨E¡ð÷]ÎLˇ©_žZÿÞnæ2Ûens³½õQÅGisÅÀ ¨Cej07Z¢…DÙ|àõ?#¸ƒU\*:9€".„Åý¹>iÞÈ[ü&[s{Ec=v½¦Ûd·u^«i}M›%¶Ámïmzy~²-Aà2×s-Š!ô”Í)ë’ý—L¦‡ÞU$¶w×ÁæïJ8ôŸæ ²ï'Y¿Ë·Ü¦ÕïLŒ ?®Ûµ„Ús­hF;Qûøˆæâ‰:6[sÛzÔ:vök~xÛQÒœu×Ñð¿ÕjµZ­V«ÕjµZ­W¨Z­o¥ì$_ÂS‡sàPvýðZ;ie^Þ¬—µÝ¨!1ûA7fÄiQB‘Nº :8D+Ó(Ù‚ÀN‡w~©o©zg2Ãé„Í'´†úÐÿg@Bßßâ iÿªt÷š^’²Wbg@¤xGõˆç~¨-šr´°Ú5O( †:ÃqÁî£B…ì΄åª›‘ùnßt¨pg üG„]m|;ò¿‚Ø´Ûh¾e·+útFÚ¹øÕDÃàpŠ9¨e·QÜa?Õw¸ÿ“ã„òÓW«~5Ï^ªÙÖRvê+k¿ gØ"9X¼êo €§ð{åqûþQþÙ™Ç÷ F™´ú[%í¨¥ÿªŽÍ:^×Z]y„³‚Ã(?<1`þúÇ5ôo‘'¬ª;5|`˜úió´šäHZ©õÍãvb®‚T‡óR¶žÎ«¶NëÉ^Ö=Ï"û(p@ÍÑÂA&ˆó:ó ö[Ûe¶h:ìÒ'Ëf™¶sÙ±ÄÇŽ}îwõ÷UK„´ÍÍW)Þ·Y¹¼>£þõï#`”ÕÍ¿I;¿?Ygøw¤§ù€GÉûq9^Åßeù]å×¾¹²ÜæwZœÙ·Z¯I. ‰Rx”’ßó[.ìCÿš ìEvokÛ9¢V¯³rr„ÒÌ®ÖIçÛ| k½#å¯ç±î+Çšþü×øus·Z­V«ÕjµZ­V«õÕ­Ö7RŽxZI˜R€Äèú[ÔÐ!|å‰3ˆðmR;4eêPg¦ýÃA °®â< àÇápÇH¤€ C|D\ÑQnç€ðÚÜQü.ÇWÆózv#GGë¼mgói?=©rï×€ÁÈHdôÕ G¢íSÐ~(8@à¹üŸQ0¯çöñ[–mÂÛ5¡v°¾u;ó„O ápÚ»â%лÕƒÿ£|‰ƒõ{%H¼±r¼¶J6™£#$üÏ) øŸ#`¶3Û+ÓyeÝŸ£nÚã”fÊ›Ãbœí#ÿ‡µrì¿"ÁSN7’xl°®„{{e8—?ÿuå séyú5÷âÚm,y™Í¿ÓUðüÝ|â(×yµ·p˜H'«)9„øc/D”ÌŽ\RÔ`¯ÃM.ké+à2,ƒRßÁÚx~½ê¶´æèò§$ú? üK”P»æg…©/õ<ý.´-]i¼MÂÀm®ï÷¬Õ÷*Oè‹:Ä ªØù*8éøüÍéGÓ™Ê- V¯âŒúÖ³>;[xÝ™`Üfò›µZz\cÚ.ûuß–¸œí’_Pü–ÖŒµú õèͦͲöÄvËŽü–Y¨åódS¢<Ë(Á‡ýæú}˜ˆ¿¡R+HæïCŽkð7ŠäÈöñß{aéÕ³ëià@ÿôX~ço¹£¼›GÚ¦|߈ýQØWÊißTö2yëòH,?¶­»çônìëØ¬g<™¾qü×þÝ¿ü›سÕjµZ­V«ÕjµZ­ÖÚ ÕúVÚt’kvlÆï HÜaˆÿ/AÄXÎN[‰ÎÁXÛŽX¢M@íà\:F}®Øì†/éŠÎðÃŽ; èÏuþáHÃÿ?xxg?—.ôfR`þWH]BýÓ¨ŽÚ¶T‚¯ùÛ–.Á´Cê{[-M¦P r Xˆy§¹Í1  çaàÆžä\ÈôøÏ‘ÿþïFÿ;˜¡5YúÚ~óÖ…ÐX48°-OÎ79Ëz̶ÀBÇxì±%0Íë&çŽ9ß ÿ[­V«ÕjµZ­V«Õz[µ@«õôþÿ„ÿê?ýo£÷vtp*9Pç7s¿méÀ§Îqð&Z:NJ¯DGaÙèÄ<¼#S¸c“:§NÍ]¥F*¼Cß:ÇoæV¬Q$Hø…wž;•ùÙDï=¥ûõbð3=‚ú‹#@YŸ¶M 5®8Ä^îÿ|’ý%áwCD>¢Òae1“<­q Oÿþ³Fâ†ýçÐü¶á`°8SŒiÎ% ÀdÛXæëU°÷] v¯bßf ºì8¬ròÑÖýäÌñG‘‡åÙçbWA ÕàÃ[;¬ðŸPŠ/oUüÙó±Z®¶Ö²Šú$8‘ÌŠõ¨Û¶,Ž~“¨ßöòôüª@\’å¹xÍ88äå Á¿Üâå1­q÷ü]êÏÚ9Š*1Ba«9íœcÊ =qêÑÇq œÎÇ>#L}Í!åõ¦]˜ëüh}1íã²)ñV•ë„«Ö—Öü°x–¾Câx!ØÉSóøÄ^¤›9Zøõ-MQfu½U”ùíK%“µÝ~¾§’¸gº|4]µö\†7%ùü_è¢Í[åÒ ›™|–üyWÞ²³Ä_z“¼Àc_n§z~¼&G´¹82èËŒú0êà¢søÿš²€Œ 㣼ÁªWªÇSðûl©õ@ÚÙ—³Ìø5£Žôo“W¤J5•‘4±¿sGNkAN.ÏI‘æxÜ^ÍG­zÔfõ­ø£Âenó­‘¾jß“Èi“ð¨Þ(ÎJ@ùþ˜¿ }¦yú.Œ3í—ÆûzZ:ÌLà°7HOêïÿ-wD„¬)*8ü;8àT½®cE þN• \½@n(ú^žêØ|§9ŸcýÏ ÿ[­V«ÕjµZ­V«Õz7µ@«õÍ4à‹Ä|Ìe®P‡ž&xðmûnΩ“pe-;y7ðù‘hÀ_¬ƒØöƒ®5—x)Ÿ¾FÒFgq2ï • 󜙿gxçe[¬W $t½9 ¯×L}Uoÿf¢+X— \ºÂÿ ÆÜ”zdEeÛlØ^''$s0*ùƒÞF +É|'l†ýU¶­ýd螀`¿/ïlÏ›liJÖveJp½± ô‡Ù,hÝ|±:â×ÎaËþÄ ¬îøãR2þ:Ì^¢LD¹=Óóü¯Žy,­lãjåRªm„#…X^—ŸÙ“òâ `lx+'·_¼ET5–fyäšTÈ.2••Kûø%Ë6mKíšNq ððàÿÔüyaêyanséÜ“—:H¥ÑÂ.üðôz3ËÖW…„“;Ì]Ùßë@º _M=¿J,Ñ ¢øˆÿátqj:[(ÛY<¡\¬£n~MS–⼎·Åql8}Ý]ñyøÿ.m¤:„­„êÉ*.WóIÞ“Ë1ÕMOÕãŒü6ÌoEŽ5Êí×t¨Œ)÷Šÿ±#l*€8ø£~Ëí¦€Ù6rëìÄ@éД 1o‘Òý‡ìÜLh¿ŽüŽ‚ÇqØœ¦ Ñ‰€”e¿w¬f‡$wM’Ó¨"† c׃M Öy*ÃB¿[x猚0‡wæÎã\öÜ'@r„¸ÇKÅáÿ OÇZÁµ;hJûatÙ6N&[nÖ_ RJnêó+@…×GÉ‹4ZHsßV`¨pèÍû%®áK†V¶yuMV&ПðÙ§˜t:\€Ò‡¸_ÚyF|{ËfyŸ· o§wrAÁ²7δ÷Nô.ça­ãšà€GRHûÃ`FÚñ×Êt-·ØŽð7[—ç1ƒÿZÞÃÆaë'd4J‚þ>Ο⨿¾½¸?¼½€Û° %š‡<ç»k´6µäÝ Œ*¿óE^®5ü! ‚ÇWñƦ¾l”b=ð_êñ SG»àm©· ÙVó-)¼ˆLé¿J§·ÎNXKÐqÏt|jh´Ñ¾F&£œªžã™„]w÷Õ¼œdj›u,iyüóíy'Ú¶ƒ5[Ú™Í&ýâ÷â8‘¿MwmÖì°¿|P¿%—ãQFyÏ ¤®ê‹¬³¨ÖZ¾Ø.R#8¡^GY{kÇ{ ú{â»|Ëù;=ßKÃI S;¾—OõÈWkަ·w}¢²æX øó¿üÃrt«ÕjµZ­V«ÕjµZ­÷W;´ZßLjœ°0÷ê}Üïì à5‹˜; çGÛŽMxG®ÄÈÿ„ÿÙ©é˱-n*ñW¼ÃÿL1¼|ŽœÈXG¨ü^ás½Ú1:çã údÇñ]ê^"¾Å µ:8ÍQÐû~‡£l¿+Pú.ð?¯¸*¦ÀË€­@œ¿ÿs8£ çpˆÏc…“^þ*øŸ æPÿ4êŸ#€¶ÁÒÆv]À•/]šxb9‚Ûi$ªW˪ƒ™¸žXŠÔ`¿ºcÅ9Þo©yØGx8쿯ÏðÿœÁ¾žÓ¶ü³SÀ¸¶N¶~˜®X›º^£ÿýG}”(9`„º£Ùmîu‘Øæõ}u¢ùvN@ÂÁ´oI/3Ü6Eš–§ù˜œ—zMvÛr„º{—8Ÿð©|”užHØèèñýÂÔψ13“í¬Cn;‚àÿa^t³#ÞîÖê•Õ[^¶pj„ ×EÕë2ÿPõ ö¢³s‘½Ó0ó¨} r’ïá€~ò\µîŒ,Ý¡aªO«'dÔVîhtÌm€3TÍ­õô•Q¸ ¼üÏ+Þ:®ñqþ\Õí°/à2ë@Ö6òÓÑΙ.±”WÛêëåõ︥˜cŽ?€QXÆ3?Ç:rÄÉNßò[ή•mýU;òêÿPsäïßô /ëÙ†þ­V«ÕjµZ­V«Õj}µ@«õÍ#´¦ŽfŸ÷8znc·&JW1uêò±p°NÉ:¯iÂÿ ÿO#œµL`+‡P¾6’ vhYÞ ÊyJ 5ëŪ?Ǩ¨/Þ¹Ž²#í §Šè:Fv V§Št¯\°î#»íG;4öÅ©Z¸ìøOÆ|{By(¥½Ž‡‹çÊwvLÄÁ¿C%má#/s@†©XsÙIû@¾r(ëÓ6ìáÿ2ßýrÿ§MÂnNþ ¬›ó¬ãh\ÃÓ_ÁÀ% €Ûq_GÜ&}r,™áÿÉÓVxºÔôÄãD` IDATIÛ–i."Ýfã)ÊÀcºšuB¢ g±ü dr8¢F³àÚ±tš3Àa‘P4 dXî-F6è­¢‡Ï  ‘ÇI[Éö1ËÝšÕ•9¥ˆÝÝ/¥\'3&€#Çœ®â=ÂÔ—†¤À¸€¨¶íàöÀö»ÓCÈ·ô|ç:€œ£ Äû bÓ¨ë’ÖxzœFÍç<.᥶œDfðt9V7›ÊaïŒØˆî €»¥ëŸ—¥Œ<0%Ú*ß,y‰w3 FI ¼­w{Å«‚éùiµÑl¯Ïk³–гa$þù·œýÃßQ^~Ç90¿ª'\Fæ2!ÿ¹ŒŠ@™/TÊ­MŽN›†ßͱü{LÕñ^ßrÇqdûòâ:V_Å”«éÀ?ÿµ¡«ÕjµZ­V«ÕjµZ_IíÐj}3ŽE%ò%ænÂͧ.ÁìÐt ‘÷uÀš>¢‰GûÛ6øã둤©Cò2•˜òÉRÀÄr€çò»×W ï\%J¨X·ç³o:Vdg² ;Ó寂¯•Ã}€07’r|V¥ãëyÌCÓi`ºMüy’7*£’ ;Ñœf"HµîuÍ|Ì æq h G^çQ_Žþgà\ŽK˜`Àóè€-ºÿ÷6ŸÊÔäàùÓÌî`÷;Vøù”Ó"ÜE`gޝØýãù-ðŸÁ?9”gp›ë”§ 5ÌuaÚ1Ú '}Œ¿×æñŽŒ& ?jZ³³Ì–3œˆÉòDß\WÎ(K38~”¦ýþë20ÚÀA?4×…|ÖmrUyó0õ«í½e€šuÅ  <ôK–÷x¦Õ (CRø¶ùà)mn?o·ü]ÖQ½œÂø¢ZÎW~Øç€;(zTª;ü=çúî4PFšt["Q&ŒãeDшšš§2¸Ñl³Ïk³F™ã(3Õ‘mZ¢r™ßaY® ô>É£Ì5ŸŠïIºçæ·ß}7¦ã@ù¶ÂxóT‡Õ³‚?d8‰¸¾úTõ-÷ò:vë€?5ðoµZ­V«ÕjµZ­VëK«Z­o¦)?:Ep;l€t¨áº%Fì•kM›¢Ë1 C… ¿ÿщ‰ þS„H@Àà~q÷!Žñ(9¢Æ[ü¢5 7€:7öp¶û*áA¶õãyÊ„ì,ž:‰££ùˆkÕgwÇž“–¿x$|v¨O@Z°Öó®ï1Óª÷w†Ï#,÷Ç«Gpmy6î§  vÀûµg\4Ó‘ 8,Ž3Órnxÿ'‡‹ç¡#L²“;ÐÑÉ ßYèF@™’?èm?7AÔflS¿ÀùɦM!Gúèïì 0ƒÿ ý³Ì/Ï{œÔkh†ÿ\fdýQúö¤ç‘cb}¼ì‘ö¦ÊTÈ à­£ì´»þyž›#IqÇã𶌠üiN@‡­Nñ9ây€ÓžÊéoçòóš0õYl¥üf'µ4®¡Ó3Š@mªÿÕ@Ùº+ОFÙÝï[Ú-ÍtŠZ{sþ$‡/S5‹Û«ÆÔE#ŸþŠÀ‚¬>ˆw)ª «j¤ü@‡þdÈò£zž_’gêE½\y'íÛ,Æü< €Ñ”ý©à:¿!îcÇD¹»®#ê7#m‰²kÛØq%žC–[P›ºÄ§ê8hz¯>UÇg~Ëm¿ŸµôÈËŸþú÷Ïd¼ÕjµZ­V«ÕjµZ­ÖQ;´ZßL ±%:ËÄþ>âM¸ËÜ:×/·ãÚÑlÔÁ—4²ŸG8‰¶8 ˆ°ÅàÎàð§;#ÇùÇçƒ5 &ÞÙ;‹‘¾BxçݨN¹è0¾žVÁ௓­^«9dz…DöÁj…h×ÓÊ…ùχhe$Ïæ´Ü‹.uõ¯”HâBg9Bsí˜wç¬.ËãÍè‚äyëçàÿóàoµ¬m"C† ÈFœOh îf‘&V!˳1¥v32ŸËãI6vøÏ£ÿOý™Î>údÿíÈÿ—;˹ ûYVÆxÊ ÍRYüŒ#Ê«×}`@{îîø„°Ã×pàº$ò.YþŸ—Ü\ksôâæ§t^¶>òß[£lÎÓmÄ;­qÔ¾|Ïš•Ò†10UÕQÿSÀ‘FUÇ5èúžòÌ<÷¿–Ùke¤ ‡µÖæx”ÓÜÈ"å½/yŽªO`†E8U öþ zÁÒ(¨ï×&\Žƒ«B}‚ø¥Î‹©Gi¨kv7¨õæ\Ÿ~Œ¶\ˆo¾ÇgYâ ð¯ß!ã»/¿ ‡Ö÷ŒËîø±Newþþ9¨~·²àONì»ì´7ò«OÕñQßr»úïJYÇ þñ/÷ôy­V«ÕjµZ­V«Õjµ¾–Ú ÕúfÊy@)0ytŒtTg€îN ÆòA½»‘M²ŒNë?, ;x$Xjü’Fgî6¼s€—‘Ž ï<4œ$Ïg„w‹³]ç)~,QæÎb™;‹g"ôKÒºÌüö.é²4]Ç/ïÓ}>L•rˆåÒþ„}„¢ àŽâç /³K¾ž_$°ŽNÇún3ÈÎ4b…ýoÿY ;êÀëœ[À)|[6ü£9E~à3Â;ï*²Ó¸Ž[¢*€:‘£óØuH¿µfp_Á³ƒ¥ ˜Wü>’Ÿ\鎞LŽ `à# §ÅîH°¹Xµ¥ÆµPF™¯Àº:ùh^ÃáÕ4ªËhîõöcpOPœN›‘cZ~~÷ù–ïcáÙ^¾^ß—rwqï©7ðïÆPI[„ †ß½{~‹)4¿m´kú” uj…sÿþ'ø¯g>O¥®0²šû ÛW²kÛ†åŽÃ 2à¿Xpl‡Ö†¶# 6,Ïã¼QzXw·µàõSìÀÿ ýuÞG@÷æÊÓºT‡š(³3€”t%@³£''(ÍC/ÃV§ÕÃ1|Œÿäoõ©0õ57ãw©:6õ8ÿ¶–zï•ÿNŽ)ZS4¯cy~sB3¥)Ng1 *"ÐÓÛ$µ9îTBÿ{~=!ÚãÚHG€pàwÊl=·šW‰ïÉwÓ¿“‚SÝáC#@¡Ø‡›ôUÛ¬º%Ϙá8•ˆÓ÷\8À¿÷溿or[l]¾ƒòå-Û麿ÓTžö÷ü–võëªþ­V«ÕjµZ­V«ÕjýqÕ­Ö7ÓãN=æqH5G¸!Aa¡&EBKF7¡vrN—ë6ï¼ÍÎã 7}ÜëWõŽeÏ·àqxg;À×wïèdéô¥Î`6 ãã=܆S‡ñ›êb2’¾x†Ê‹ ª¯žù×À)¹ûÃK¾f;Í'̰~² ‡—×Ü—0×Î&~ç@z—… ¿¿ƒ¨ÌÙ¥Q¶éïÃNjXQ3ßTó‚y\†Æî_@NYoþîüû#þ×ÐÿÓ4˜Á¿Ò#˜ðì°&Ÿ§çÉlD³½ó:€ÿ˜D;gƆ¡±³^Öfåa¼ºæ¨`ªBÿb“È•Ý8ŽNÚŠÁ›Û;Qô€øŠt’p‚˜g–¨^ŠÜÀÛ̧óD”ñg>;x¾ìÈÕO:øksfáÏóñ\¥s²n‚¥ZbŠPìÒÆÏgŸHÑlÝá‚â'¦ðuû>ÁicÑ(×s´ïŒˆZ!YÖxš•Ñç+qŽ* ýNqç„ê^ ЍWæ÷‡ïw±ãƒõ¸ÍŠý‡–ï+wÇø8¹kV(ç\iüsû¼µ¦#Ÿ¯à÷˜ªã#¾å9d5ôoµZ­V«ÕjµZ­Vë{¨Z­o¦òÑ‹žš¢>zÎ@Ï2âoÒ®ƒwîøÝŽtòËí¾# $®d×Ë€üÏj×ý\xgXY `f(,ídóÍúè1軄wNGL6š(l¹ÌËÛìÜêœQmò¶b°íehÅv—¸K7û>ƒ™¼TSS8€ÝºCì$Ö™SÎg¸UàÅ{ÐÚGþ?2àšš08¬æüêxõHþcðTÍN#ÙìyíK ¶ŒþwÛ±…aÜýÏSì_FÿSz ,çÈk²³Ê+“Q˼Ïê8¿Öâ/eŽÃÎýá°ÍÙIà{XõLuæóQ–yåÇÆZ,#Ï3cº1Î\Oe8§ìöHŒîN‚›/—ÃñdS…»z{ª€d…aCrpGr¸ÃÔVŒôòóßå ºU­®·Íž®Ã@¹5—+îÖ(Q>½¬Sù¬e“Û´¼Öü,؉ýÝšüÊöGuåÞ(Nj¯Í}@óûa÷2 r»GWˆ”ïêáù½¯]~@éÍýS„=F`GœßJ»6 ‚ÙXÛš—ŒNñÍÆß˜ë…õ/Éf+ëúï2UÇg}Ë5ðoµZ­V«ÕjµZ­Vë{ªZ­o&‘ÿ£³€Þù/1" P!Có áÜ•÷Q6à?:<ý<êÌœF§_…‘}˜çK[<Þ9 ˜‘u€c  ²é<àºÄÝSzÙdËè`'Ûq§{tOû6ÆånoÿßW;lþ¹z\¿òÊ:Ä/p0!u݆ ªÚ^MŒÁç{>‚Ïï àO´À#öKZhæÀ¼4꟡2$¡½;öÅØCë¼gDAqHÊÿ¬(¡þ#ô†’öýaù-\=Ã5-¼TY?ƒkÈN_ ˜z=ç‡ÚâáW‡ÿþe,‰ákÍÒ2êI[6CfÉ|à¶q þ'¸¬|ÇÕ(ÇîíTìâ¶‘Üæ¥ªâhÊC8 +âý³òÂÜŸ%ÿ°Õ2šXÍiì̶A2Ÿ£Ý]ó”²ûëðK«N ‹gžÏ‰ÞKëåµ=+/ ÅççTí]×sNô(5f K‰ˆÁò€ èïÇ?Æ|ïâ ^Ò_#Þ_ÿ¶@Î|AfI‡G”tÍé§7§µß¢cä¿»$pþÔnàóÃÏ×å-¿k›àzþfˆ}ØÜü-39lnºs5ˆµß'¿ÃTõ-çjèßjµZ­V«ÕjµZ­V«Z­o&¨ÙÝé#f=¶®/Xƒu[ßuÚÒHý²ß¶ïÁ¿Ãg>öøÿ2Ìz…¦Ùq0èbDaŽÓì$ÆïÞy¬»­$lu9;[l0–çƒßþOq¡L’åƒÔÇV-˺,åïr™ü¹t~Š ˜rˆSÞI†ÿþæ1TF ÷=Þs¿ÅdGzÑ•ëº0l:MŒåý9Âß§ ýPp$€¨ vð©®êˆ„©ó6áí6B_L s¾Eå„O ápCŽ‘±µß€ÿã¡ÛØ¡øE€„ÿsž§º’–QìÎv¹‡¹©•n%·Sþ•˜"!#¢€ý öBü\d˜û(§Ãxa+ÌŽY‚ÓÀrv¦¾äÈÎI'Ç,æ@TËi·iLemA]ŸÅ]†]i-h™_dÊ9#â’A=j—PµqÛ£ðáß qmÿfðïà€Ä7ŒB_›u.Aö é']ÿN œ2®ÿÔŸ”Yó¿ú\müýßl+tÎ/»êÀß½¸Õ˾Kžÿ–>cªŽ±þþßrªÚð¿ÕjµZ­V«ÕjµZ­€vhµ¾|”ˆøØ€Bå$ÔI> »œ¡|åä[.F=åù¾ ±\:øaN ×=¹¯V0Aê8ÄG< pÒG=ãöã(éIÇ>¢ì Â;ÇÖÙAâî/u GhÙåž‹ßþ'ðü*P…Kìûk÷Y–â]Âü;“}sÞ½ê“#@uа÷nªÑŠ#Á ’°ý@´þp (ûwð‚ÙTÿæoOð]êH’ïBZCFÝ^œàAàNq½€Zû• ÄFÍföQ6)Gý‡M¢Í°9íTA[ÚŒÖJà 0\¬“3€ vÝÀÉr®uÿcòi û¬ŽT®<'ô@2ÞIUqˆOG3ÎOg4lÏÈz"G<›­}œfðïÏno÷ýsЫÝf[¶óˆ@ß‘r@0¦Û`3Ì©y90æu¯Ï2 5rjبôZ ÖúÑÁqþäˆÿÓŸ©þÄ!‚ŸÔö„óȃù‡k³LûwG\L.þÝ]êmZÏÝ·\4Ÿ8UGl}Ço¹†þ­V«ÕjµZ­V«Õjµfµ@«õÍÄ#†x¤¿ÚüµžA鬾í£äÇoÁ?–M1ÀñÄÍ7©É”ß™|€ç¦ D?î2^,Fu¨ûøÕð΋ý<’‚Ùä¾³8ÿÎ`¤:V¼7²&8kiæÑËÔ-~yºè„U¾?¹’̫ׄ´–xÞ*eý©âŸE ÿëæ]®§-û>ÃÄ+÷W\‡¨¶}êðšò>½»/N‘Ë­ÀΠ¬OÛªR»ŒŠ_îÿ|’â{yöqòï!Ê@Ûh΄ q¼‚ÿY£8d«^á?aoeÌ6òûU'¾fX¬´Y)®CÇ’Ìö/Ú ØîQÈÀoâç¹_€G~ñˆaÍûüçeGÀÖörú„©O»·Ðzkó•ÓH½æzØuŽLqæóõº‚žw^ŸeIÑ6›Rçh ±Ã€¾MK!8Œyχ€`ŒÞ–¼†ÙWEm45†ã€æsIº]­Y2Žé³ü¹3©±)ÜY¨í»°ÃÍ‹ßéÖµYéà£Úmß:ÎßrŸ=UÇG|Ë5üoµZ­V«ÕjµZ­V«µS;´ZßLŽ%ëÕ$xÝ¢¤n m ÜOëÞ©¹>ZË¿Ða<Ÿù, ,#;qÞùÇFç1Þ<¼³§ÁÓëÔ ¼ë,Îe|2üÇ>xEèï5ü÷Ç-Y»÷Ï ,W6”øWðõ¥ÉÙøg]B7¥¿6P^T:öÊf_à ·órxÉ×l§ý¹þŸÝ|*ž ÿSëq(PuÜî÷Ë{^>bÕä19ø[£Vo¥€Ý?%$òé)T(TNA~ ¾×B¶Ìdíà¿Nö™ìW ?ÍM×H[ÞÚgõpa `8uºPwãbÕb‘Üå”(sŽÇà øïç®m¯;¬Ezm%¨dÞi˜ì¡yyÔ ÿ¯WSp+åÎ lwJã¾1ËU:ÄeG2m o[ÇÃ:bùôéwÓmäuã™ço@-í{Ù æ€Ë¾§ï€Ê¸ûiåcÄ#Sa®™ö¼`6É7l³>Žù/zþ[îý§êð4xºbý‰o¹ú×ÿî]ìÓjµZ­V«ÕjµZ­Vë{¨Z­o¦CêÈ'ï„ÎNrÿ뀈Àt­@qÜ1v²îkâÓ¨ÿ×¾ãØwúŸ#I†¾}»ðÎ~oKÐb³yd;UpÇrœ%t=|üFÑ?þe€ÄK,ïû(Ení\æãu‰¿Ï‰a¸Në¼}ê²ï38ÿK5Ãz80ܺC eï|:+B£Opzq u¯WéÜ„ÿY',ðæköâ§IeÏ¡TÔ:9P=`,¡VÉô6 @8‰IÚÖ¯é [€®sÞ‚ÿÅ€®‘Jª<—ë¬?mÙÆ`}‰:&FÙòÏìä˜ó¨¯¼r}_²†JøOm­åá>L=¢ÍÇøWÀÃýK9g*™S†zhýtàcã–Tv#³Á,{Nä1íË|„ÊÅr´ÿ¸÷ˆpXÙåæÄ àñœºüг^ì>õž{‡åÄ¡ù]4ÒkÏ\ýx‡æ0@ÜmÖWÑý·ÜôDÞiª¿·ßó™o¹ú×ÿþ×3ßjµZ­V«ÕjµZ­V«…vhµ¾D$êKŽxË‘P$#¬.à‚ÅÍ;4s€bGÉ e»w€¾…¢“ž–_¢ ïìéu{DR§ã\óÊðÎÅ*Þ1l[2jC ÿå”gÎ×gÈLï3Oìàù‘‰¹#%ŸAQvixjß”?rÞ[Æìùö»éyèüQªÈþo‹´† t ¤/GÿO¡Óçáÿ¯=‡TìðØ Í:9@kñ9Ò½nDŒf· E}ÈŒ!ÿü·,Ÿ›í¾ åùl<¾(GüÛ;æp_Ó@äˆíùsЛ @N@©žŠÆÅAb-©âÝþxôö„£(¸£ÂU˜ú|Êv¼E"6: rÆ3Žç­E¬<]³9 8U©Œ&ü_À”š¢y©"v‰áèà6Po;ÓÅo#7œ:ü?í=œPG:ÆÔP±Ñž}ƒDxÙžxê½ç³õ:Ú[0/3–Oª;ºÍ؉䳾=ÊTå[Îþ–o9^þœo¹ñßjµZ­V«ÕjµZ­Vë-Õ­Ö7SéÂ`tÊŸµ3›Bö˜Ñàó÷ “÷œÏ¢£^Ù9Ìýèó26Ë/¾þn.Y zxHmH ï|êi#_Þ¹Þ?·Í#ùš¯ÊqbyBß?=ë4çðÏQ.¬xª9<6]Ç/çLû?”¬ÔR¶@ ¢HYâß(ÏÕ+ÝâsÀÉw’°¹ŒùŒ?vÕ´ßÁë²mœœ÷Ü­¿IÙ'НWPïàË·¥³ƒ;h@ZÞ/Hè=pk¦¦Œ.'¸Î ø¯6àO°÷¡€ç ¨õ%„ ¿ógG€„½Ã`™Æë!Éýã6µÝ©öW³ZÔÙ:µ¹%õùd-b?ãàÍPœî€á+QO³ï°¿<ßGðq´¸²»?Y¶ oWŸf¨:£DD Pp§Ðp8Çt ³Ãi‘ƒ¼-V*ÏȈ~ïˆÚ³«[½­‘l£†u-£ gõgØm¶¼¬~öëùo9{“é[ŽÞã[®Gü·Z­V«ÕjµZ­V«Õz/µ@«õ-•£B½çwt†þÈ®ýÑ;ê]§q lºA[xD‰ßs§èë:‡¯ºÌߣ+}A†µóxt.ŸŠòÃF2:pŽCJgŒR\*dÞ–£³ãÆßœ ³kJÿ]þÞR5ô.ÃQ)`¡üh–ª1·Ï“JÝòÓŸ‘l¸œ—~Çü¢üü<ù|?X(SlÛ·ÎÏÕ” Ÿ£ƒÑ{Š<Ãëª ¦ ‚;@eP àWÐú]à^qïÀpK†Z¥ø–óáÿaNg¶1RV §Q¿J¼Ä œÏìë9m›Á?;X¾ÈŽÏYÂ5ê–2úßôX0¦™8äÀ‰‚3¢çrd}CN^s%¨çz·¶¹ñ|’‡CÀUüÈ€ü^Eø(Í3iËS÷£ü÷ðŸlíe‡ÒQJíå#˜vHÖ-åk‚Ë¥Z“àm*øq›©9À¢RX”i*Æ|ênJ¢Ó˜ÿR§6Ë-0žÿIuù(Ýfeþ•òÍ;ß÷#±žù–ã'B5¦¿Ùã<žªãÑ·\ôoµZ­V«ÕjµZ­V«õj€V뛩‚‰ìþõÞhï쬣ø¤£l?v}é´éí ¿_í~œÕ69o¢y>Y@Áásô§³Mæ£gÔ‰~àœžÉ®£>Ȉ0Y øFØs/õæ^;˜üVö\b.æ‡r#o}[ 8ÅÕœÊõ|ÌG •‚7ž(s¤ ñc![LWž ã3ß»/|™"³s_‰ù_IæUY¶•}Ë)2Ùdµ4ͳIH IDAT²CUmí£Ó<%`)ÁsÄ¿ü½Á¨xŸ09Ê"üUï#ÓÓÕËÁ¿#BÎ#ô©jáÚ%à±_XuÌÞ¾„öWsÐs jåcæãÉyB«%±©¿Š(ŠÂËG:ˆú]Ãþ>ö_bé4g€CGl€lÓÞ ¢é \´¹@ÖÜÓ#¼Í“çýŒ½ÀZ9ÔZgç åŸ ü϶kŒ;ð!/’uXF=Ðh»ÔG`ÏÆÐñ4®áé¯àßbjŠjQ öMûV[’cš„n³æ6+¦l g—ùÚå.Ç}ž}ËÙAˆ¯^:U‡]$Ó·Üÿò/ÿæí3ÕjµZ­V«ÕjµZ­V«µQ;´ZßTW`ÈÎîFwéåUÞëEiÄêrðvhxi§ûì<‘}º”J˜hð £7ÅI×y&'R™¿ßªDWðŽi‚+6ªw…û38­#ý˜·»·Ÿ„Öâ7Èy¹!Ö«>x Ñù.þÙö®¼µø¹Ï»ñþDÒ‰ø%ÁŠ-ç y\à'å~3@Êó/’‡; MílõžWe-í¶Yy}ü|Уs”„¹‘@›`©*_Ïc6NÓmâÏ{Ú˜`ÿUÕÞ!f]ì$àAæ5ó-šÔŸòžïÜY§Ø&øÏàŸ ôçQÿ §ÍÂá [n@9 VWW|—Îñއ­£} ü/¨9ÈNþºŒÅÛÁ]›ëyª³Íñ© ŠâÆã°þf#þù³}øÏ%tþïËðd‰É F‹`'̈Êå`”ÇÓ"¬Î€hËéy £»Íºj³Kó±k³ö%ÚõÕœ€Gßr«Õ•wyÝÜÿî_þá­’ßjµZ­V«ÕjµZ­V«õ”Ú Õjm;e¹ÿ=Ž£¿—]þoû±Y´ý9íîôüq»ð·CŠº9Æ1Ùgèy¯j„ å< Ø¡Ût]›rÇp°DsÇö/;Ä <"‚!%làa¹a#â5-ó•Ûp;† ô*èy? 2£=%œa‹FW . H( `@ &XË ííEDܾnzá¶/l²³×{â¨+mÞ´ PÙ!É¿/Q}c´lOXêPŸ*¸~d±–~„…¹£ºéæxuð Õòl¯¡F$ÀG+Îã\g”pÿpÀZXzŸ›ž–XÓß„þu„zæ«)º–Ò]# 8Ü­Ž ‘‡'ÙÊ£ŒÈ@½²²{zôwÜÏ}›û¨]ÊýiÍÐùÅ*3ðÏŸˆÀPÚ‘þO,÷пÉ5Šäæ±/êEœ£´æÄa¶Ž\SÞn¢ø¹yçaåÐmÖM›•ûÖ6KâZ/­?Kï9UëÏýû7Ks«ÕjµZ­V«ÕjµZ­Ö³j€V«µ‘аÙÝ/刽sÀ‡¹¸K½îoÒgZGts2°†wŽy·×+ŽNgOpÓ‘£C@,.¥ˆpÅ×ZŸŽr_=F,ε“üyGÂâ×·Ñ”âá0è ©œ#ãÇ<Ñn GTš l{èr‡UoT&"H‰‘”I|Ÿa’J™À"‡Æ*Ž’9š,6åÔåýxêò&>óR~¦îŠ—\­˜@¡Xò’I•ùÚãW PÀiÙzˆ¦s€–ó 0½àÕ難h¡ŒÀ.;ô”, 4ê_KþOˆÍ‘~àÇ#ïdþóèÿS¦s‡¥¿ù¿w¶Ði]¢ìGMiáå³®MKÔ?ã¹ ÀàsPË»a;°~Æ `ÖSÇ)àŽ`jõééÎ)Æ=ŠE_X"¤ã³ðÿyð¿O¸×cÙÞãà#8½ôÄõ'à¦v¬‡T£pyÿ8O$ÓÛvå]€ÊH™×<§MÙæEryÞŸë¾ä6 ²E᥽ˆÓϯ!ÐÙ ̪;{}¤7@…ù ¸ŸÀ¿”%þíçÐ2åÅiõðKD,´Ó€™¼„zÍç²Ýÿavõ{%çQ­ê¯wRY$2ÍPóJI kW@Ow´âhä?ão ÿ?‡ý/¾ìù¨i)ë%ÇZÊ@d6öx¦§:Lè£ÿ}ä? eì¿Ò4,Q7G„ƒÀÕ°¯V:Bdnk ¤r¸³#íwоl'ç=wëoRfË“™œx=Û‹±ÝÚ”Ø5 €QÞ_Ú.ÛÇŒn³îÛ¬ØíW“Ç×{•ÿ/ÑK¦êøÇ¿4äoµZ­V«ÕjµZ­V«õuÕ­Ö7Óèäâý¶„Vï­÷똾 yÏõÞ¼ßa ƒÌS"\³!©(V¶Å],ðèÆ€2ÎÚwJ\3@á›§G·JÞP 6*RYÆôPˆ©À%Œ¹íåX,n‹P±£ðòò;A`) B|ÙoºÀþ2šò°å£ä2B)s9±õ`ŒÀ:2žŽe"­iÝú¥Ø"%$uýó!’ÍB*©?Âûë³K@æŸÏ÷ƒ‹ €¬¹œÁ}¥Z=€º|g°¯P}Þ1éÉ ÔûªþG&N=qÈñfY&a çPÿ3üßþÏõãþ³Æšð}v¶»ÃQé´à@7~î?ãïШ¥Nšà(#Ôãý7Âl~¹¨+v°òXlHÜžCØ3Îñ$'ü/-É»Àÿ¼âÞ À¶kBòˆ–#™>áüI–“áà®jçØ¬ÚóöaûÿÍÛ¬õªŠã×Å›6ëJoó.|œæ´þÛþ›OJI«ÕjµZ­V«ÕjµZ­ÖËÕ­Ö7T:µƒùQÇì ~$&üU}^ÇóÎ)pðoÏÄìÈžÃ3;ÄoÑ N.a›Rv ¶’cöhŒ"uè,a(Ìà™hT>|¡Z¨d† S(e†q€;ŒsÝ. .¡ß÷`ePâÔÇ %B$[xäågRYüüzîlCb¬àQ¢¹ øghêLOŒ…UzÙüø(5¯ßROlOÊ|Ïoüä4ðyQRw ðíz[žvû>£¶\‘çawûbD5å]0Fûü.Q)ñúJç´|.QPü׳Ôuk=—u_ÍÝqF#ÑÊ´Þv–™ÿÇø¡ÿãB‚éêîrBqØÀ1°õä/ƒOj³ÝE£UçÑÿY’ ü/¶®ëo§¹üñxý¨õëÝyúO½7†JÚ"¦"zÀæEØèû¶YÃ×BÃ9 Þ¡:Œt÷m›õÇRÃÿV«ÕjµZ­V«ÕjµZ¿›Ú Õú¦J <Ù+îgâó?£P`ïÄðÙi|¬ ë¿…©¾}àIéÜØW¿¸kbÇÇ}ó¯x èA lrð«= ©ÌÏÅA ˆ²Q DAx-P|^ï*4N¯À°¦çd>ƒ¡‰ÙÏM#œ ÂÊ£þß8øó¨(ÉßW¥Td`êˆ0ŒÐÔÃHy5l<…À»‚0žg3Ú{¾ó¨æGâv,Ôžìù–t `åûÒ¢¹mÑ%Pf„zaåE«W6û.¹ûÃK¾N@xV*€„úgÿŸ1â ý?MPê:»*ð9M³I§´ âUˆoðºnìÀrÄòAÿ3€k8 ‡€H½«o‹Aîû¦rÆS'¨Òñõ<:<Úå6ñç=Ë*Áþ¹¼E6'; Œé)üCm¤½fOÇeHà¢`=ß´Ír›G»dÿ9ÌmµÑfe­ê-_{§ß- @ƒÿV«ÕjµZ­V«ÕjµZ¿«Ú ÕúæªÑž> µÇ~„{`¨/¿Ñ¸Ú‹F–yº8 wç<‚›/qŽxNl‡t)âÐ?‰3âÌhìJ‡bœd@ä±K‰ú;00Yp ó€j×¼QyŒ‘ˆDFŠÊåeÇ, Z€Ê°M‚ˆ+¨òÀ@þ‹ž¾Ùj)S> ¤ÌÛ@ùœFÿ Ý—ÓPÒEvŒÒ®‰ºaÏ̯W¦³KÌMíªs_ÏÞÇ `¤ ÷9Ãl3ýmo”I§ß’›Qí:«{]Öyûþôeßgpþ—jªÞ#–×C Γ€ç:k\®¿ìóû—Ñÿ9ê¿Ô‘Åï\ õE¾1O–þ°¶ürðÌÀà¿ÆtcÙKÇ à~cFþ£¸E•ùkQ´ü­åRåŸ#üQÃÿk=ïúºly_qœ£ì÷º>~ÄËæ°µ—ÑZ´óÚϵèü6‹ß¡£8ªÑÔ4rLëþj帯Ùì ë~e5ðoµZ­V«ÕjµZ­V«õGQ;´Z­õö³n×óz3Yyé}]ê¸#G°­÷¸O×{ë‘-}Ÿzxíó éyN’Á¿&ä!ÈV®Y¨ØŠ*  Gñlí =ÂÀo!ŽryzöóÃ)ô¸Î݈J‡àó:àˆžT|›Ú|ÞŽä2½ UÊ)ÖÙÚ«¤ŸAŠ-Å(Ê õˆÂ€årô¿Ã•Å[‘³â|ƒP‚%DµÚs…c&š›ÚGÜ ¨y^ê·u˜@Û•ÖyŽjvÀÖÎ{v}\Yø=´‚ÕÏÖ3 õW°p­¯NœÐê?BÿŸp}­ó6à_w–\4*ëOo…€«öÂÛ‰ú8²àëðßÁ¿Œ%ÑᎠvGŸ¯^…ÊÜëÀhuËL–Ñÿ¥þ÷Òn±7œ´œ_¬úȱâ–¡… Ãù`1û&ÌçQÿJù‡d™ò¶Ž}[žqÈø£¶YÙîs=zþŒþw‰ùÞ™Ö5»o¤ÏŒ ÐпÕjµZ­V«ÕjµZ­ÖQíÐjµ¼Ö  ªžÏÀž;ñ£ûÝ(æ9LýÅ þ{Ñ>æ»èã;”Ÿÿ€uí¢€SÏúá°€ÿü;®Åse»S€_yüÝ+!0˜Z:†³²;$œfGˆÐÚ/6NRÙC:ØŒ¨Z6 q gï™$®éÀÆ6TØEn•€Õ‰Æ}ƒ 'Ýã°Ü>/÷aÉç@y?’´-Õi— ,)vâ…=øPí´õ…æãoGÿ_”e³_¸ØèËœÀÁÍ:7u”‡ÿÀAD¢Líœì(¼Êš£ÿ݆“­…óµùrª \zQ ,õ ‡zs½ãÄ[ió^¡dªîB‚Q'ø'&Ÿ€@ÿþg}Váÿ\âôÆœÓIûgË"æ´ÄNð pXׯ[ ö«¡?†–š‡}€·Ñ îy¬¿· —0ÿ®~…âyÇŠ'G€óU üWׇâHðâÄü¾m–ªB¸0Çîþ¥^=Ê¿ƒÛ'‹¬¢Óèÿz‹·­`eÚŒ+5üoµZ­V«ÕjµZ­V«õ]Ô­V«èY'€øŸ¡ÿn˜\Ü_½®EóèÉnùâ #Ü<o§çF°]ž]B4#A×iÐèLxäódãÆÈY>?GÏÚŽ N÷Êÿf9‡ûšÎ"GEN`#aƒ9kDT7Áéåè°:Í9Ÿ; 8qȳo»»ÁÁi¿ahe\„Hüé°‡:ŽC’'û“aro.Ùïâ àЃ쳌–”P*T¡Pʶ“XÓ³YÊ1dE禖`Ø"Ïeuë@6+ïÜlè)½Û7Gæ}{ø$íR~Njթ"†­NOv“ ÈÇÀÂ+ÖºDçâÏA˶/Uï$óê5)¶QÒ‚”9;¡?ÕYüÓ¶ ø¿8Mñ½_"owÂ`”q…A×pîçê^O`ûG€‘þ þýg Õ^ï!Ílü?9PlN[ö}F‘]-C‘6G»‡›6òNí˯èwl³ÔÂVDê$ßÙË6 Þ6ù_ks㽈vìðÜR]›Î*>‚Ùnyœð—=œ·phèßjµZ­V«ÕjµZ­Vë;ªZ­Ö¢;'솈Nl_aà_ Côa?ÄÔÖ·­vá'1H‘ÄàJ‚É—9¼©ÛÁÿõeDÿðß=ÏŸÊüeJ¿Î¸0ê®åcØ—ô÷QãìGÅÇíÅÕ!@:,÷ÏãÉ:4™¯:ðÛ)§ƒ”­ìËb#zk9c¦"³a®Ét,Nˆ:! $l…` ‡P>äƒ(Ç4²2vàêKqhjÖ15ƒ?¿€;û(€³¿ÓšZ0@(Ø €€©q‹Åž4Å‘‚~øÚ6ÙçnôÿÆÀŸ`uØÔ ¥ àªc®òÈ>éýÛ½Ÿápõ|[–Ò7žáÿq*jržçý^¯•HÀŸðøÏ-Åü¿Èùdrˆ8VQ¤å7*-u¹B¡rZ$€»(µ, ^ 4õjEéï…(Çq7ÇxÙô{îl¢ÓrxÉ×l§Gç^ë³Û,Õ3Á<N‚’ZY·—:– ÚG:Á êÓcq^Ãúì&5×{wÈ®[ë5ïLCÿV«ÕjµZ­V«ÕjµZß]íÐjµžVÿšgð¼펲m)eŒÒ:Þ}tÙ8…&4€¶Töë¼GÙgÅ#X}}†ÿ>Â?F•ZØÿ2жÀ'>~lÑ£<—tÅ’Œ°ñ<úßÔ*9@G¸c9bt£Ï7Èál-Ÿ›?êèøˆJ): d 1wTÁƒÆQžc e” ¨€rºå5…¸Lk›gˆ#Ò ¦$ô÷¿ÇSªx.%©ÏíèJ£h¼ëÜÔþ 'gG†zxê¼ìx,ZœÆ;NÀ{G€Çf],§ üŸòQ@Õf(ŸÓè†aœ†ËLîë:ÄË-K¶ç}_ÿË%ò¹ø¹nºbB{‡K]õÖ:2ž–°ÀwØÀÿÉèùºN‹Õ%7}Qî|Ô¿; àJjSÞn¢ø¹ñ~¿†>Çys[Záøœãùôeßgpþ—j2—Z´3á¾´ç°4ŸÁà¹6 8 ûHM €ú.Aû‡# ìJ'×Ëž–i=–7ù™Ûˆ¤Âõ$¬XŠ·i»öêÀ!ˆºÖó ØTÑ®éz¬—½ /ù–køßjµZ­V«ÕjµZ­V«Õ­VëBÞÑšó4û$Ä&øƒ;±¥€YÖîúÒÛoœ7G³%ŠÜ‡PèÜ—FxULJþŸ<2þ§S‡ÿŸ'+ON#W Û“À¶/±ÐÕ«#À¸ã°+øÒi·iÿ€jÓíéw°1æp—ÅE"'Ë€¦+@\-C´ö­>(SÚ36$ðÏ€Zæåþså´¯Ç#zPEƧ¹©wQ 1ÊzÂâ9h®jrÿñ¦Èg X×€mÅÿ˜àÿ ¬ZÀ?9ÜŽþ÷çö¼¸üúU|¯Œ>g,‹û ¿ !ï¡;CÈÕJ–QQ/&JŽ7˜ê§«á`g= ÿ_âä´ÊkGvxìО 5 9ÆEñvJ©²ûZú5»¾‡¶­û§hu…Û,?àý9œälšˆC0æôg\ã]…߉zeà*/Ö’\/QP¼M³ôW§*k¯Ž¹½âº÷‡´ÕçB æÄܦÿíœú·Z­V«ÕjµZ­V«ÕjUµ@«ÕºUţǺFçt§>¡ÿäûlùVMh™ÿŽËÂð“'Ì%Gï¨~<‚ìjŸC©—#‰t–¸‚ÿ4ê?þž6ÀÜZ¢L#gýºõŽ·rŒJÝ÷@¦ã'lÞß è$+æ g8Tî5EƒØ‹o‰CßL‰ú÷ËåÐ\N9íçòˆÂQD%!žÔ}Õ4««BŒH‡ç½BêÝèÿBùG”+ð_G¹{ÚîË)5@9¶+jw™°ç§Àa€æô'!©Oƒ¹ì v/r‚²µ¸ôÍX¨®ÅÒ‘îáÿ6ÎéR<@¥š£ÿ`§ çç\,ºB˜W­H.Gº§÷ˆì‘d]4ßçàk}÷„6¯E®¾ßV bc™%g3'“¢4w£þg'°e°Âþ7ƒÿ¬ .'^Ï:Ò3îõRÉG°ˆ÷g=“%Å'>+2Më5Ê6+«”§¹ñ99AΩ£~Ûe*û'»Ò¢@Nm´¶Wœ¶¥F#'¿lÃ&ç¨â°–ÓÖÀê×Ì©xº¶YPGizk3œk¯qøÇ¿üíEž[­V«ÕjµZ­V«ÕjµZÔ­Vk«9tÿèž¡3;8”NÀSœÆEyí¡Fàx”p¬“3€Ô„¦#÷F{ç=åa¯Sòíí´{â„àÐßü:<ÿ]1ªÿ)ÙБ ÿ LAÖ€c$c† ~ìAúæ¨F¡ Â>ŒÜC çÅÏÀ«ã"\îDl…‚€Ša‡ßØïD!Ã@”NÛ_ ËÞÖ ŽžL‡€Ã\(È! € ÊuÇâ3å-ŸáXœ¢ØoQs°H ¤šBRcŒRUs%'‡À€Úƒf1Ûþ)¥¹°ÿžïK‰Éž¬æãoGÿ¯©‹PïiÆ€üŠtðm ÿ¼˜g=äÄßíâwMéχhW¾ó)Lï:—u?E„Îã¨!é a¥#ê»(/A†GþsÙñz좭ˆ{¼©µ®œl»­ÃË¿Øp}!† ÿsðRí»SÔž—¯ÿWç”ÏÖ ´?SóT’áÆ~¯Çt´ƒ§…þÏZÅ"Dðò½u)í–¦’§Ceó„µ¹åå6lTˆÖx]IŽkþS;…ñ]UëT»‡;‹•TŽx™@CÿV«ÕjµZ­V«ÕjµZ­·Q;´Z­EsÈj2lsÂl»§ž ƒèš9¢òn<¢Ûá h‹ßš°oqðñwÎë6ú=F`îFæóˆWïïð?GýŸ1÷oDØ8Ì×g'€’–i]NÊÏ÷®5wn~Æìê.`ÐãÔвA§^¢0Ú'ƒÏ Fí‹üŒ4n©‘qÿCOšn€þ¢. åüËDm§ß·#ÿžŒ0ÊÕà }ëtž——Áÿunjdº= €YÊG£JüÓxj{WѼÓdÏp¬ñí~Ù–¡.›sÅïžOÞâvߨ•m5ÍMÎäP‘àß`דö­E(ahØÍÞ ±²Û¼îB5Ï»¾óÐUÊò¥ËÌÆeÔŸR¾«³€„öî@E" ?·%ñ/ϰÿíá^yŽb±N.3ÝëIP%T¹#GpC@¨ÖÝé R÷^>a¯SÙ–_‰ù_IæÕmÅû–Sd²‰,G<• wò2]Ì(T¯ ‡´cãǺŒ­bßGñÎ(yjGè?^"…i×fEMEmW¶[™~o‡Ò‰ S½zLu(@jÃ!!"éU£h²QvèŸÓ›§ýã_þîõ[­V«ÕjµZ­V«ÕjµZ¯Q;´Z­¢yä@ìXžaôø{žçàýOý‰ê,€è=¿;’¡v l:ŒÊeûÙ:œˆQºÞm€æ½œ”‘~Jÿb}ÿ5ÁÿEô€t¼H¦cêzI!/ñt íñîú…ºzÆèGÇ€–±ÿв8Ê‘…ÆNHr&¸*IÏÆ&QÎÔ 4€ŒÈI|Y0F"’( €Bc”û#TMe‹¡/•¨Qfˆ} GZÎpúµJì¥åzúéøñ¼€:þsXêxw”æ?O3Ûª?ê9!×éÝ«þÃ@™.¡„ýwÛþ° ngv ˜ õ«,™.00›d]3ÊåäO!0ŠŸLp ÷y½t±î¶æý‰P%ò-á Àš§æðm¾güÔ‚€EÂA@§üOõÂû‰jÄÌG€|ŽcD¢Zñ<Ò4é©”yçðîC¯xßK1á~€×ðßçT¸ Üìƒte“,‡åm¾4!ÛaÿνVD²°”ÌŽW‡8åçØ  £æ­Õ Ÿf) BñÃkޱlwükË®¿–²)ôô[¥-F“3µE:ÀÚoÊ.ö IDAT°ñ—/|xU@õtÅû5u©©•yþÓ_þþÅ[­V«ÕjµZ­V«ÕjµZ¿ªvhµ¾™þí?ÿ þî?ÿÓv_‡õ šüŸ`ð_æ{ž@µÏ}; ÷¸®_]®:Ž >Ähqss¾GhæÝÏì? #Œ oéÀ‚ñ(~øhþÿWð7úŸŸG€µKà¿Çzµ;æb>yždG?þ˜'Mp8Öó´y…Ól#ý=Ý‘€6Š5v¹Ã‡¦/‹ °ðÏ[ $1BÝ¡¿o €²ŒèOh}Äèt©Û<­%ŠÝõåp`ð_1Ê»œàI,ÅpW š°ÁžM Íò^lh‡³™žIé´”*áSKÕ¦ ýÓ±âØŽ´`×2CM@ìAR£Li€«aS!€çé Ö?NFƧ©Öé6¸\¿À\Âîs†éý6€‚”é9å>ËgØSÓ±¸­“Óü”Çø„.•µL×ÇGÄÿoǣ׈PÁgN³ò*}/EÅË«e¯o÷elWþ¾þ¿{ô.¢páo!vˆœ§ q§3ÿž8ôÀOQNh8 g™ŠÃÎw§"•ŸömÅ£ÿ³ÙË6yÏq §oïðQÛ‚ø,ò6IŽh÷ÆëîmW~3)&wñÖÔ)4ÄDø·Z­V«ÕjµZ­V«Õj}‚Ú Õú†Ú9Ì!ú äŸÿN£Ø×í¾ åܸ¾*ß*ZÂàgôŽ;ìë\µB£Så¨h.½ØBHî œæÐüed(ÛÇGöë€ýþ;øŸíz OÇ‚ ýÙÀ·<g9:ë`æ ¨g ÀƒÆ°|Tœú3€í …بGõ‘´yÀó5ò˜a–͆ȑ—™lá"°œ¯glod–-Û@xÅahÀh$œöm þc;Lû°ÂÿrçW”¿tÈë„s‹òuxVÀ#¸C‡Æ´rg#š†Gׯ/ ¤±˜žÿÉFó43üZ/ÑfóÝÚ—P¨•¥yÝ™Àê+Sác÷sÇëŒ?£ ¹sŠˆõ0ò>òýí&xZÀ}®‡M¼¬»ÅȱÂóN’´š£¬œþ¾"Þ^Ä_j¨ž ›?¢¨hGì×jÕCæó¨ÿ¨“͙ɷ Ä›±0ÝkÛZF§wÊËk©Ã©lÝ³Ï ÿ»4<µoÊ_|+0ä¦Ý/HÂÜÞ”»Š}OŒ#ã9í‡*Ùz„•CûúÅ à§þ°kèh[å(Î}9æ—žÍ6zÏÝñ^—vÇÞg›ª'ëÍò2XaUºÖx-OÇ´X=üÜÿ¹á«ÕjµZ­V«ÕjµZ­Ö§¨Z­ÖþÇÈìÅÀ 5ÃéüÓñ~qaÔ;]Ë!&+†TÞ¹ø-,ð¹8pžÁ8tˆPpæ·ŒÀÿh$ìÏòoó]èÿs±Âq³£æ]uNÅ.ß¼J‡(w~%æc‡ÍW,G,Ø Hy›<†ÃrD¾ÀFÏfÚE`Ž ‘ÎËÞ}F Ìr~y&ßVÍà |,/åmN0ƒr¸ÙåǾA¹`>¦ÍÈ ¥=lt¼;ö@Æò°ê‰¢VZæˆz¼-‡œ@Âaù£†oYìœ6¨¶¢y©E"ì¿C«ø/ëaŠÇ¶eG ž £Ö1CÒùR"d¨£2r¢‰mØ@ÿwq¸‚ÿóúT£ÊfÛ¦ûQ´£Â@ý¹gˆ®¼«Ö7ËÉŸâ€Ä–HZ<†þû;Qí°6C1]¨\ôæ ÌKÒ†â›2üæ¶r*_~zu¾Ï‡=ƒ óp?)KüÛÏ¡å­V«ÕjµZ­V«ÕjµZ­¯¦vhµ¾¹8쿯ÏðÿœÁ¾‡°G®WðÏàz\[µ¢ ‡éŠ¥Ñ¹.6ª1¬êÁh¹;Û»Ò‘£Õ Š (íð áà=ó¯u¸ý¯?‘{Ò–þ@ÿWQl½Þ“‘kÒüK Û³%ó¾tŠXQ.fŽÿ5FûòO æŒ¡8GTz‘pžcDõÉåŽò;G¢;oäŒÇùˆðpÛx® ¸x× £ (¹úË_‚ü1M²Ü.öáÿ<€(pX†P{*6Çsà´RqÌœ,4œH£ Ù¦Åù¢˜xBÎ'€½@퟇ú'‡°óº/¶1Uæ°[A÷“^H>®ÒöJQÆcQ+ÿ@àÖÉ ÀŽÂÍ[|™ð%—þ»msÙoºÀ~þ7OuÁ÷1ˆ|Ò:â=½€ùÏ1ÖÏÓ—Ÿ Ì÷ˆ¥ÆO&ÌUÑK4‡_¢SXâÛâ.¥³—â˜â9×%ÇžúçC$›…¬1¤þpÝá§åÊ?Ÿïªž…ÿa3ªw“Ú±‡}Ú>«/qŒ—ÅÚ3£ Äi*Q‡0ž^Lá`…)ÓÍq*ØÇ!bûGZK¾Ëû·šWIÜ'öïÿõ¼±O«ÕjµZ­V«ÕjµZ­Vë+ªZ­o¬”±Âÿg…Щ`Ÿ´­€ÿ2j}\}Ž2€Ûwdç5|<®uæPƒÕ@qÈK›wƒÐ1Ò\Dpx8ú`ÿÙAþúH‰í<Ôõp*ø¹‰” 6‚áNpG‚ßl¿ü«ÒÝkZx©²~‰c”¡YÛÁ“j‹1ç¯rèx„½sYp„#Ë}Ìy¦W,?¤áÔ“¢­»,é1®2—á‘Y aÙÝ!À÷Gy9؉ÐvŽ#—¯Áþåk1”~þóuª ›Ìûd¨ùïvsTÅå°8ñžå\é¶ç œt£ß·#ÿòhÆáÿsôÿLËjó—Û˜°§×?jáý€Oáÿ9 àïÂÅë”['¤ÛëÞ`ýÓÈ\Ò¶ðŸíΦü•m\''90p°®Ÿîòp_{}œÖâËe|=zLù Þ´XýÄmÊÛ¦/Ë#õs‹·°ò˜Ï7¦ Ç«ë{ð1á0£éÇǪ–ßyPÙm›ÎÛÜñ5©M'D$ß9êÞôøPßL|ã#ü¿BlÔÿ ˆâ°ï‘òýdÑ]Šs ê6ñï*kÛ$]ò3§‚ÿ´œ§Ä,lÎÿþÿüO¿`©V«ÕjµZ­V«ÕjµZ­Ög«Z­oªûσ¿ýÏþúÇHÆþ3ø'€ý×põóÈxFµL¶ ¸›è0ƒF°9| H{žgúæÌQN9à À{ÇU<¯Ì#Ò†d?¦Úè$›Ò>T‡Š[ø_ìI6]Sh¿eÙ&¼]FX”`â°ÞÏ<áÓhŒö×òe¾0¬|øi£‰MÔ`GƒÓ£&Xþ|zŽ PËÏì ‘£¶‰˜Y¹vz z ŽD© ‡÷ï )Ã)ÏàÿÊ‘à½àÿ,)=pŠÓÖ1Õc8¸™ šÏzŸÉòG¤“‹ÐóÛ'*г­&xZ>}é?Eàã;>FüNv~ÚnáD1RjÆ ø¯k@éÄ`˜Ò ]:F 'Øh`v ZÎ -½È5=21ŸÁe{¬çˆßZÆË3XžÅuª×¥^Ôé.*tåŬ#¯€¯áÛù¹?¼äK§íÎ}$Šîœ@Q€ñ\4Ëë¨&'¥¶â9Ú¾tâˆÛèÎ!à­Eoêl/o…ÚS9Ž|K:@¦¨N¦m¬û‘ÿÀê¢R/”­ÔgéPŸ`º’µ ¢áÌ5¾Sw j}ü¶è9Jç»Ñ²£WÏiOzgÝ®Vþÿ÷~`V«ÕjµZ­V«ÕjµZ­Öï¢vhµ¾¹Î+øÓréÚ\õž–1×µ»Ì°Ö—æþw‡?$¼`g€ê  ¾ À1ÄF?GØsï­·{æ ½_˜ µT{’ è“íŠÍgø?ÙoU[lzÉ3¦Rm ·«êä\= _\OÆ(}ùâ>QÀ¸ÊÁÏ@1PÄ’ù`…BO/O™îpp»•|‰ÓȰÁii­£â Šê šá?ÃÐ ùcþÒ™éßþϡ yèñCm$*MÔ¨9kÿ?{ï¶kËÒegµKæI¸@¼ùE¸á‚ªKM¡\HÜPa,,\¶ŒOÁ…eñµ}ø)Ê2À™ Tµ³sý™c̵æa͵[›ZsŒ£?§OVö¿nÅ€vzL¾"’Iò ð²é÷UÆ|ÿ´{= 2õ´óyÒf˜Ï€D,¯Œš|¶ Ô1î}ñÏåÝ)›2ÿ%þmìW3GŒ XÛoTÞ‹Ïðhõ íS‹ oóCúÚZK üÑy©‚ÏqéMËé)`c*ßkm{¯Ç¥ëßYßúv&Y"ÐÞ˜¥Ãu ¢ŒçÚþþ­&•€Ý1d%z¶Üÿyi¿§ˆ@ò¬C Ësáï¦9ÙŠ×Ê™ÿT€Ce¾3 Æÿo==ós^Ž'ã%#þXÏûmÕZ¼4 MûÿòM)Š¢(Š¢(Š¢(Š¢¨Ï,(ê¬ é3û73ý­€ÿþG)kßJ×ßfþw ÛÚP”óˆ'«ÐLE¢®œ~üˆ,”Û@§˜ @-k]¼ä­;Õ¯48¬sX_2Õ ÔOt ìÁÿRz}ÿ^,fŠ—òoo"'ÐI%Ú|ï ›psL€Ç×Ö ‡Ì…¼ûÝŠ* ˜ ÆØAÄ-¦XÇÑÒ_#áX;G:;&¸s†¥3²Éü_?G@ϯœãG„ È 4ø:_üW¥ À°Ýb€Î6зz ÃŽSÃSöèF¨™fÔ»¹Wí²ß-&+\®à?ÖUÀ²ÍïYý^¯ö±fh†•Û*Ñnë t oJ>Z‘=?ßg]㤠êŸñ?øŸqɱºÄÞûÑ ãtŒ7eEÚ_«6ÿXudÿ}¨ xãñb£ÏIwQ§i*¦¹kžg~Ìw¯¸ ¥ŒÃ€ÆÅPôº&€%¶uœ–åkñNµq¸·ˆñ ©1)OT˜!Ö;ûý*ÿ­Ÿ¥o3)Ú¤8KU™S²ˆMªã÷Jò¿Sü¿¦FÜ`ÂþöP¢üXÚúwþä¯|[)Š¢(Š¢(Š¢(Š¢¨O!(ê¬?øéWø·ÿÕÿú ¢ÛòQJþ½üÿZö¿:Ð *ŒóÿxoèÅ©¥]ƒžØ$Àœ—~í™èž×˜sÔ€qýH‰“œÃ÷ üSËÿ'òÏmçì_W¾·ýp6QœàÅe{ðÔü±"yRO¤ À®ïH¢q4 T³ü¿X£:v©æŽ¸­gÓHþ³@Æ`íi[§`uòSÅ¡¿2H –<ž5Z-%;30tý\Áÿé·†ÿõ:^BZ‘&€ýp–ù_ÆŸøx\êž²3nÚ4ñ¨q¬ànk¸©ÄP§_ðóz ¾-vˆé*æz7‘Tðï¶–QOÆU{ÿXö¿Ìú þ¨¤ @íZÅÄóÔásµùœ­+'èo±ÎåGðßã>c=Ä«+ŒÓ¶eõ’)|ŽrêmÔÆeùèýÇ*> €Ø;7·Û{¸Ü»X‡ ôÀü_—Ë»¢¼_ÛºÍ{!®Pþ£/q™¯yGèæ[ݪq¯¼µ†oçY,`>g‡›PÞÙÈûì->Ôÿ¦•©J$Í ÿ¯{oø{ò{_ÑWŠ¢(Š¢(Š¢(Š¢(곋Šú…+ Þ øÏÌÿÿwÙÿ§Lî©Ï¨pôjs€¸åxĤ¯…é³ènL êK:auði‡\OU(Ôì?"Ž=¶z¬ ð>ÁpÍÿ™‚ÿKã{èß÷̽ |ñûF@‚(#ð2Ô‡NÀŒ¸ÚoÁàg¿7:£átp¬Ìö¯Uþë}ßJt‘Ù®•RÑ™M)2GFàu(TÍ'£ ö-=€“$ý@ð_UMÓÜQLQA9¬½nb)v7xu€ÈþÏû8ž×]Ÿo)±,è-+&l+-,Ÿ-ÆÕPÏá½x­x—ÌY‹™ÃUï‰ÃÕampð?ÍGóý3«dÌç`>Ãyú|·8dÕ€…ÒÞ™À¿´4¿ìÁ?ðÿM1TX¨F”ØŸÀìÞ’ó5z=¸üZ’m¬¿ ù3ìï3›>§pS‡Bt@¤›?>ŸÝjF};²˜1¿ü^mbÚàc5ûÿ4n[¯V1Ú8ÈÓ{ç¥7õ©ãZvkÞŸÃþøLs…Ý:ÈøÑ#þ[Ä§Ì +†½²ý5F.T3Fi]tm¾›ÿþ?ÿ/_ÖQŠ¢(Š¢(Š¢(Š¢(ê‡ õKWÀhÏJïÙéÇ þ;ø_à¿ÏË^a·öÿQ];æ¡êÿ´€V²Ocðÿ3~D:àà?!€#Î,\ŸÙÌ‘n§l»GP±Qï·Zî²ÿ—˜Í0>ÿ¿ÆäÑŽÒðØ0IE|8SÆ„Ê3ë~bЙ)‘©¨õ¼ô›±`ýcM›gy£P§ÙÀWtm‚¿ÁðêâÛm<äÀ‹Ò Ú|Û’}¾‚hÔë€êt•û{óæíHàè4tìÌ)‚ù|[T곬ö(^Á—€yˆx‰•·¾ÿù¦8ÇëÆ»UPH*7¯¢™“+° ^‹åü§öæÉ÷šõÈTß3ÐÓ8µKyÔPœÒÐÜšßÜQ×”¸·ø.ÂPã£ÔyvâF,H©òqn¯ø´µÑß ó¿’¬‹× ùüðµÒ–_L¢Û±0×µÊyÚýÖ~µëï܇&€2k/ïÿþ\)dݶ‡ÿõ™Gí²yy…ŒÑßåØåâEû¶½ád€j™ÝpÕÞ˶ݧ?}ž<³Õ d®³â¦}8BÍ¥Àªðûq ®–ÖÍj´^þ·ÞØ´F@]®&„¹)ØAbÏö¼F‡Spàïæ?‰÷ÛMµ÷­¼¼¦‰`W @1àÝà¤ß‡ÖŸ²CôÏÚÊÇCX!0ÔàïHþš˜õûÿU½µl²¨„!@5ø GGšl´2 ë³]@aÀì‘W ¿ÿ ¾1üß)a§¶k:èËþ3«·¿r:ÿ.s¾õ?¿¶x.©MRãë‚TüGœ>­B-ûï&€/2â`Ó\(k® »N½ï×ð?á±,ãd÷þúgÀÕøI{‡,ñ¾ßÝé™coZÆ”zÍ÷+Vð¿¯ø÷÷›ÝÊ>}5ø=öç¸ÿÍÞY®;±QAÿ\N?Uí òû6û¿ZÊ~~…õî=ó®8Àõï.–­Ú–â<Ç£í1C/Y©Fܬe±>ÜL¤ÅëxØ-üÿåwö¢(Š¢(Š¢(Š¢(Šúe‹Šú…ë¿ý'ÿÖ¿ò_¡bë,ý_§(°ÿ”ýß3Ý]5‹ÝÖ$¼¿jPÉ<€–PÐÙ°Ó r`ɼUŸÀ²ñ™‹;¤Î¹;áœD%µóx6÷Àg;>*$ì,Sž›áÀÇÈlË+~_]M“ ë¸‰Å©ù9­C5䘎ÍûÒSü/îB…}±ìàoÿÝ$G­°û•áÿ¹ €Á…½&æ÷,Ç­þΉiFÊûg‚ +˜Â‰ÑW?ÇTeY §Åe +üOèïŸþ¯BÔ¹mñ‹‰ÃdÛ¿<ñ»ÙaƒT½ë¶ïÿïÞ˶2#Ýáxºvºâ,[üa€ñ)Abl¸Q.O«þn/&hÚ»W#À£&Ÿ­õù÷¾øgéÒ¨²N[1Í+Ó´"ë˜E~ÿšóÚã/*gøÄ3¢yOÊß}o¯Oò·ÿø?åQEQEQEQEQ?ºh (j[Žþ€öRÿQúÿhíÛ+äöó5pÛ²åcåé[gýÛñ‘nnÙržáì»Ú×€â(3Ó"_p¨>,çœ ’Ì à}ðü—C}cÿ•Úmyèšýïÿ ߯ë-Ù Ìkîw@*%óßã册ÒWdH°á ¼™ŠH¸¸šÖVˆÛâ&ŒŒ4¥'½‰˜ýl9³z/å0ÀÿÅ ŒEa#ÃÚqoy}]Áþ-dçÃ絯À9Ý.‘Í­r6Ç”ª êçh ðª=üÔ²ÏX®`²@ë¶,œ‹oë]Ƶ›=Ü 2¯?J½‹¬ à•òý“Ó-¨gÿGå?ùÃ/ µ1€¾|ŠaÏŒÎïgø/e¹NÏ`®— x9 øÙt<óõÞ¤G÷?‚üïÚðÔ¶¥Òß*RîFþ-y=Åó¤fQº«àÀÀ4¹u ^x³{]b:mŽúÎÜuj÷—¼®‘¾Üà>SmÜnÁÿ’ùoF€:Æí¬ö<ŠäWºËwðõßh‘´”šU´|üÍßüÎ×µ‰¢(Š¢(Š¢(Š¢(Š¢L4P‡×5ãþiŸ`ÍúÏJ·ð¿•pG®ß\þ–Ó:©ë5ç$®sÒ» Àرie·uÂ7Ïý÷ÿ¯*ÿ'Ø5oYÞ/ÿT€èaÑ¥ü?4·­YÕu—jX.ó†ð?/&€æ}0îqöûcàR3>R€";ÍÑš®Ž?³ÚÓNAw#¨ÙdÂ//Æ…„s!¦IÄsbŪCŒ‚mÍ "y?Å©’Xˆò×s!þJ¡ÿü¾5O ´3¶9Ÿ¶”vÓÄÑÌ ×¯­è[æÏßúûòÎV¤únF‹ÙHµÛ¿€pÍe)F€aƒc~W{ó(² Àr~LÛIdÂG‰vßc3¿øéD;³D‡ª»ìÿ O¿ü°–ã6ÇKVÐižÉìòÙìzWkϺ@–®öJïéè0ÿîð/í[ýíÇ”ï¹óé:/ne1¥x5–¹Þ JüO€/V‰ÅMqó]ç)æˆ[jÍòw\3ñ7i5‰å·ó÷¥ŒkÝïüw°_§«³_ŰäX—´”{ÖÞûwöݨÛmëÏæò¾¿ƒù_aˆkU€?üÍ_º¹2EQEQEQEQE½L4Pµ)O¿”ú/YÿµR@‡ÿK†pÉâÎßöíòÿ°/$¡ÄåèÓ/ 0#Î'Ö"Í*™ù?AJíþ À}k7=œÿJ\ù×òÿ@»¿Æ5`xU0’x}®u8,[”¸ŸžUZ_ËÇÛ²WGsÁ%ðß÷_¯6˜?,ÛzšJ¦,Þf¶vLa”RáuJŸÄÅ…¬»¯[à ú÷þÞÙBöPþÒLP!2>»b8´‚Fˆ<à ¤–u­æ-ÇÿCÁ®f|‰:Û0ÄF‹Ú¸‘±™à°·—½o6?sXúûÌ ùüÅlë_®ŒüW@Ïö¤{&Ü€‡àaYáþ¾”ÿÕ$EA`ïí þµgþNiN,CëM%›/Ué?§çò×±\÷›à«Çrù›hã1rDÍ à_•)æ‚!þ÷*OŸï1ÿãªVÇÞæñ~Þþ¥¥ùeþ=cY–ûø #À²ÿˆ˜#îÕãÖGÙyíf$~Eöÿºö¯ÿÓÿàòEQEQEQEQõ­¢€¢(üõßüûø7ÿåßÝÚò²®€ó ÿ.V$xþ/äpS4,2òߠٚЧ%×À­ê1Mµ_â¶Ukv÷ÕœêžÕïY~¹©‚n´õµü=¾×>ÞEÑãÖõ4FxÛÅKü‡ù" ^Îΰ ì›(Ôqw ÝÃjÈ–=Кäë6ÙŸÞ„õÀÆØü‰)#â¾Ü•Y`ƒ×™ `èWè¯ë¶' %u»Æ3äç°gÌ9­8hñLø¸t0¬elœ³Òýv€UÚ\ÑÖï ÿë5» u(—6Õšó­c»Ìµ2ŸÓûÓß=ð; %’þ®®BÛc‡n¢Ø"»¿—ÿÏìÿ„ÿ‘‘-þœjÕþ»F ø‹ÀÌ5yý˜FÄß W±"uÍÛª!ùm˜×ýÅžŒQιn9nsÅ·vý5&1vbD[d¾±pD­“iðQJ×FÞg_ï»´gtó·}yß¶qÚÌþØŒÓ÷ÓP#Kÿç]€ÈHÆZÉâ ½dÄ je›íŸüÅœ¢(Š¢(Š¢(Š¢(Š¢^O4PÀá¸fö?j€ ʑߣ쿟ÁÁå¿w tå÷Y ˆYŒ9=€CM;Æf´Ódfí⽨P/.·+Ø­m/‘Ùý¯=výÛrÍ®îcô!ƒÛ’aÝ@Jq8è­ÔMí”õ~8üwظ‘ ë½¾‚Me±Ð²~^ IDAT앲ÃÏ¡V½@nÉlØÃ€X­àš³G»cì9xøXüwè_í#ø¯f‘>vwª8nšàÏ•8å¶=ü¹rH$”†FE€ç°æøçúumõà§t:pˆSEÌTîŠT£@å@3[¡Oª%ª\6ª€Tx¬:€OPÝçN耺Û?žÊ«DpÄó¯u{eÈO(&H< þèh”p‰@ûëÝðÚ*Ïìc‡ømx§q%¿¤À¾çLçº×íÿv3Ï\ã ,ûOsJ×åtþ]¬ÊN§T€¬·dÛ-i_ë²ÿõ@~¢—ýÏxލZá&€:ÆÛ¹ÑµÉäëGœâ¯þã÷«Ž¤(Š¢(Š¢(Š¢(Š¢¨× EÎÙÿç,Uxéú€å ü·ðÉb¾‡þ}ÏÜ«`ž5k¹™2Crr&»¢Ïß^ú7Ápé¯Ã7/ùîmoÀÿ)¬à¾ÃZí΀5w!yOæÿ¬"ÅxMðîžµ¦t N5Ctèæ€r±fˆ¸hJÑtY·Ù¸’µž¬gÃjL`ÛýÀ,ß ­ÖRÜø¦*½²„wzÁþËô u ÝjµOHé|k˜_uëDJd øÎçÐ?¦‚vèÞÿµÁÿ¹ªÂsŠw Jßã^O€Š¶É#¦‰È$2Ç’ÌgÆHj µÎîf€¼àS­ èx6úü°ê05çR/ëìX”ÌþÙÂÙÿ!˜Ój`Âà@Ïæ‰ŒøúÈÙ{ÚÐ:Úö·éü¸71¬† ÷s]"jÉÌÿº5ÀvØq/b56ƒýë[~ª yŸ¬: J–¿ø¸¬Th@€¬`в}õsýØG%f¿SµŠZ¡bîÐßbPÍ,µªEŒœÛìSçqu5ÒÖõ Å_ýÇá™@PEQEQEQEQÔ»‹Š¢zºËþ/<ÙäsðÿyðÕ2 ›&gJˆ}ô9 ø’Î<óT2Ç5ËÞß·óô]¦uÀ¯Ï´3O¼¯ö–‡óZ‡ÝÞnÑÀãyLTc¨ç)À¿Œ¥j¸ŠBµ交”ÑšH3¶;Q "óºqÍÐuøïà_æ7±©J%Œ È=ß3Z¯#w¥{ð_á°¯/À_k¤k|Ï1k1ò8ÀoxvŽW=,V¶6x™Rc¾ƒl›0¬X°-½ô¿†ý/}’d£3ÞùŽ / †Œò>±qdãM-k^ º6#,ÛÚ¦‘X 2÷­›¿¾ççšý¿føWÀ² þ/÷ЫD€Âm˜ÙÌU¢ÒÎçUBâÉŒ*’ïsð_ ­*Àë›øKzc,Šoóx¬çÕpaåçKƺŸãÊèòU=ˆ{ç˱X¡÷#J­ à•ò]7r,jŽÇþ~[â¿ñ´6^½+*ø_ÆÜ: @›iVçc˘ø++ã°oá×üýo~úwžØ‹¢(Š¢(Š¢(Š¢(Š¢>V4P­¬ÿšýo{´ùêcÝ<8ϳ[~pãp(\LuÙógNDr]ƒPÈì¿dÿ5:¯ÝÀ¢Þ÷í¶ïí4nžØg$žx7ÝY2JI=Óµ`üˆà,±Ÿ§¼2’ÔŒw?àÞ&!§uR×$ó±qª1w±#­¶ú\î à°ùÛÈâ Q-"Ç çXy´s<­ý_²ÂËwô_̱­Çã¬Ä†1Y~f.ö¡åˆ¼ÝàÐt~Üõw¿íí ÿƒHlŸßÕ´cj2iõš÷{ßþQ‘ê¼[âïÕ0O{Æóñ¤ f:;] ôÖ p^Û9Òà1;›8Yc¤øx™±ði’F€ú>EV(ïØú¿‰ à þ¯Ë%žËÓºMìÖí¹Ü¯ýzÕ-&˜ws…÷€±¼O£T¤˜÷6«SÌI² Àrþ±ÿ,½ZGªœN”1<Ù›ìÿµRE«X1@€¿öOÿâ7Ä¢(Š¢(Š¢(Š¢(Š¢~<Ñ@Qdl€¼–üw8] í XÚrž3¿^+÷Ðf˜&Dò ]H¶Ojÿ<ë_'˜›ÔŽÑ Y`â;T}îï%ÆÓͶàüÏh©ºàAq3À4{ò½ìSËŠ>NÎÙí‘#Üñíe\– ’ Pbi€€›â|` ök¶2væýÞW¸×)뿌…„¿« ¡ÄKLŸD Ð  Œåb0Üîµ? ¶¿Ÿ/gÎx[Øïº‚þÚïÞD›µç!…ÀÐ-󺤹Ý3Úgö<¶eX»À«DöÞo¶Þ›tX¥|GBÿsIõÍgü1MÀéó¼ŠRåCÓ&2+¥ Là†…è4ɬ@<à© a(‘ˆÁΰ{;<§3’îðßãßk|ìo|ú„Ñzi¡m÷æ©ÃKzT+1æ´53hfEŠ 3Ëÿ±™à°H»±éü3ýþî{ßåÛ(fƒ gû’qµÏÙ‹±é ?㚆€Áÿ?ÿ‡¯LŠ¢(Š¢(Š¢(Š¢(ŠúÁDEQSZþ÷á­f ì¯Úÿú뺭Àõ›3/ËÒ}7ã$¨^‘þaY*«ÄÓ#Kÿ‡ùÄÎ&wm–v?±G û{]ƒÿü¬Æš¡=;ð­YæZÏ9•ÿ¯Uƒúvìì¿>6”wAEÊ÷ïÉ ôCÃÿÔþ¡ôO6ËßrìrñWÓÙP.¡õ¾e©ÃÙ.s­`ô8QÓó³ÿÕxßí·â´qµ7¥¸%«¸àÿø?~ÕØQEQEQEQEQÔ,(Šà SÃàð±Á}g‹Á§t=IùxKx] Ä àªew1›& 1ü#3pý„3Óµ¸ß]è—¡«^î/¿ËÚ6ü€>*Îð_ë¶ÃçE°o1DÞ°Û4 ¦@@]m@}Ž‘Ã*ÜUð“d{ÖiÃÿŠOà??繎xó×ÛXéü pqÄð`º#DÕÜŪ,äxf „—ªƒÿýs©ÿ‹6´®ã¿ÍÅÒ¦»0¦Õl<øt °¾_òM–fkm™Râi##Gú;ðßÀ÷ðs>Zïçmà_`†´˜GìåÆ!3kõÚ³å/üŒÞž’øÕ7ø².ã³þSöÿÆàw¥ÛÞÎã&©:pˆO¿2Q«Pž 3BÅ_G96f¿iðgþ6üÍX„—Å”’ñœ1ýÛòŸ¾vˆ(Š¢(Š¢(Š¢(Š¢(ê#(Š€ÐËÿ?‘5{†o ÿë5õ`‡K uÝø0!¦F.æ”˹ßÓ0¯Wò÷ ¥÷% g£Dý¼6¬ð¾ÌÏG_¨BÒ2 äÓÅY´L …°1VŠY¤-;ԅƱ(c§Æ¬W9@þ(ç~ýjxl˜÷¹Œôqߪˆ[Ir©”ѵL±–èoýlßÍz_‡vŽ8y†¯”ÿ†?îkšDF¬ÏŸaÙOt Sâ¥x?ÜÂòí&€{ð_᤯ïFˆf8F—%i›æ°H@®ñé@[â¼^q¤Zf5 F·@–>DÕ}Sj;¼ö–Ær…îü·}Ð@¸·ûNùú«SBlÀ¿ÅiÎå@hSDJs1ü:c¦fHéµlùÔÄpaÜEª´¿Æ+ûñ)ÿøï™ê×Ùÿï·Wšì¹[LP`ÈH ‡•Ùãü¶ Qá"¦ªÀ<éÃ÷ŒýöxÿŠ¢(Š¢(Š¢(Š¢(ŠzÑ@QT¨£³=˜ 0Õ€Åb@Â$ø¨›Ëv ÔQb…¿É0Ó.× »êsB§Íö²:- µ_7|¸dûØ´Pa7Âw6x× n?òÛà¿x« ÑLuÙ­ßËlF`´«•q‡tƒ€Ä9"Æqði%æeíùÚfø8VÀ ü—ýý<ÞŸè÷½Äû têWÜÎâܾ.ö2+ÀØŸ\}þÀ¾j‚-4ïßÐë±-Î~òÄù[ ~βÿÙï9¤£Œ|=›† Ä@lŽ”x2¢½=Zk[ûÖšmÞ¡¿/ïÌÙØjRººO9߀]¦lÏÝl‹ìmk³&°¼â4Ï”ÄÎ9Ã1ȼât=}ÝŸøöÒï£+Å]X 8åÞÚ~¿X›Ö1‘Ø5×/­±yÈ=ûØe˜E¬vdÏjÞª¨ph€Ø¹O‡ÿ‡ƒüšá¯fÐGY×À«`ýYáö¹Ö}WÀŠ‚m Ú‹UA8†aÏý—øv˜`èhÏCÍ€~Æp†ÿ‘ÏŸß 7ðŸ1©&zÎŒO[ʰøï Ð5ŸÿV!Ögö»ÂLUûjæŠ^)ÀÏŸ† j"ñÆîßhèçºÚ‡y/íËáË2/ïLUìZÓ$âïÃ¥9v|ùØQ æ§ÏsBÝ Q"ߥõC±¿‘+~·ßÍ àq*пeþçòheÿ‡­ ü‹]Dºñâ ³ÿ[×Ët•û×{_? f\ @nÌw ½óâù™7¾]ÿøçù]úIQEQEQEQEQÔµh (êZ§ ÔúïÁï¦+j¯Ër¿{ë—.ë+ü+iªõ»eCF»à¦@Á@=#~·Ó#^^óíÕÂÔàUͨ_w¬+k†(–/ï­û×6GdæµT“€&O¨¬‘Ië'Ìý2§€¯ §ÉþWð_ ú׬ÿ ¾;ϾâÖT";vN3@Vp#ÀèÝJšC&þÔŒr„ †´Qs}—Âÿµÿüçç<×aq¨ç(ñ¹ м_—~ F“ÊÉ šæ9ºbÀavy+ø~õ†=ÔøçúumõP:Ï© v;è_'ˆ˜Æ‘ ÿ‡ÿ1€—˜"@¼Fª@Ö[·íÆÙ|‘‹åÞ¨G–õ‡ —ýwÀ ÿ#LKÔ÷ýÇ(M6²ê3†€9>E®ŒùÖL3€=9åÞü­?ùO>¢‹EQEQEQEQE݈Š¢ìracÃyÛ‡AÜh¼ÂÊíq ü@Ùº3ϰtÈÅþ(ç^ð)O¸Z+,Øq’üx5|Õ¶ÃZ$õ´.Ú}`ßJuPÜUŠÈýÕ+øeÀªÝ6¬ØÅ¡A5L'Píåþá€B7T3À ¾;ô×R ¿öç‡/£ÚKz57t#€ìŽ·Ìåv'ò­åÁ}88¿ªðß š±Ž~·à£ŒOœ]Û•Jx’–{&> ³œ»JÀéV"þÊ€iï[œcî¿Ë4ñ>9ÌÇÄ»=£²YW÷ýð®ï6ÁÀ,/Ÿ##£0!%Ð:€YÀ´º¯~Ž®¯ïêåÞú} €4øŸÐß?ýßüÃ40â\¨¸æ{eÿ·þnM±Í^fFŸn@,Ç“c÷ûoüñôÞÝ¡(Š¢(Š¢(Š¢(Š¢(ꢀ¢¨¯ÖÇ@Ü;=u_OO”â€( .Nõ 8 èªyÜõ5ê>ïaX#x6=ä‚ôOFŽN†Šõ÷G(@}ùR3ö[ËŠIeZŽs0©FÖ:OàvˆÁHBkd¦¿Õ0ðŸÀÿПÓàÙÿ ÜöìL½¿ ೉e}¬ShF¥ÿøYáÀs½CÌ 6Ë»Œˆ#,ùʰ–èoýlßÍz_‡vŽsÌ®•ÿq«Ïó\±>F<ÿóÀÃŽqc›Ü”ï…´,Ú6vofºyR_B§ ¯þ*­Ð{VÈœŸ.bV8Ì8Òæ ÷ìÿÈN÷“ïhW÷²ÿ¶\Áƒþë÷3ü—²ÜªØ1hc!cõQòk»a#æ°j°¿M5În˜ï¼ùnûïþÙ¿÷a} (Š¢(Š¢(Š¢(Š¢(ê墀¢(ê…ª™•+¢oUl_Q˯zdVlͼ®S@a%é Ú²õgCÀ«÷nü7ɶW¢´tïBve¸¨ …1 NÛç·ž;)ß‘÷ÏO4·']v–ü?zùÿµìÿZú~þµ]m¹õ¾XdjÇ›¢!ìÜWÈþ÷ün@[î¿b¨g$ÓŽ£ ~=ÿþ¨?|j„b8ÿçþÕ,qŠÌ¹»P‹TLyÐ3ý3Ï¿b¯’õ¾ž<ß ‘I¯ˆãýNõÆ<‚ÈûíoŸçCS&Ì‹ÎÍe)F·HÌïó^ÐR`9<{ñrD¼ áïÜ‹Ju”-KvþUöÿœàKÀÿ+ð/+øêž}»~ÿ~ëͯAQEQEQEQEQÔç E}µÞF¿Tï˜ýï&Ïî÷uŽÿId…K²~;Ô «z~µë\ž½Vx›¸ïâ'çíÏ­ïeX\i›n½ÛÖMˆùÉ'Çý<ÒÅœ[ ÔËügæ‡ÿ»ìÿµ¤½ºó;¬½¿zµÙêôO#ƒ}7KÍp¯™Û‡:k¥¼û(æ­ |¥‰&³ƒÿÇ ö=VÕÐÀ5Xd üF¹×4-´ìÿ0Œ³sª‘!‡Ù$Ü4d¤‰Çv1Õ\ôò7Ù{gš¯SÈò>œ1˜!«ôI{—(¶–ö#šïI-U9`gŠÙ ׿„ccØz¶†ú/†€0 ×côV"ü§(Š¢(Š¢(Š¢(Š¢(êJ4Pà "ƒ½®ûîáî‰]§²wW×vø}ÚCTô ÂK~kÂ¥4” –9;?4 à„Ì2˦»  ¤Ô¿¾ àœùß×3ÃCU|šK›ùŸ:ãÕ–Ú{Þ§ 7û—Dd?0ËÚ—ìÿš¡_3Öíßq‚ÿþW°} ³Øü×粚²§T;‰úiHÉ £TÈùÝ=«{nQÈ}¶Æ@¯Ìï^V6€_ogÎðÿ@‰2v+,ñ<í_2þ—*½4Å..™ó¯ðÑŸf1}6ŒˆÎ(q€ÃÌCG{gd…:†>‡Î&4¯Lö%Ký{æ¿í2×  *9æWüI¬Ïªm¹òKÄ+¿ü¾ÍüϬA/ÿŸÙÿ ÿwS¼5ü'ô§(Š¢(Š¢(Š¢(Š¢(êÑ@QÔµ*¤s Ú´p\A‰ í^2™ øWð¿ùZæÀ®¥ÓOùUù4KFµçŽK®±nýßİÂÿÕQ3ÿ{8´|G,Oò–s„<ôïº"†ºì!÷»§ íä >oÕýJvý÷sdüŸKÿ/ÓœÀ¿–½ÖX ç~HÙÅ<*YQ@f6ûÜ0?dÄ÷#Šþg%×4Œz³2Â:ÞúãþWð¯½RBìwŽSƒþZc£­Ÿ'y6;jí ^KT#€e‚/@_Ì$1chF9Âà‘Ê ë“ÈMþ(€¡‡ØèÐ9=Ä5Å$s ;êW)÷2~ün”¹é‘ÆœëF¥‘c.J,~ûžé¿T¨ûÛ?Ì^þ¿…ÿ)Š¢(Š¢(Š¢(Š¢(ŠzV4P5eÙ›uKöùŽ”íàó÷ÿïLÏbä/ùùâë[Ù'_‚ù4:Ò‘™ÃÕœàð¿T˜lk‚SÉ;@d›¿8ú›XɺN¢lv®¹:^óC´oûÞ<;- –—í¸X ÊÏÌí ¤ÅË›ë±ì;²ô`­°ŸÏ¾–ÍWÕrvkM¹—}D) ¾©c›‡ÚŒqýeÜm®w©}BxJ9U€CÃ0Ò ¾›%ÂqDÅ„µÀ þ;ô×x~ºÅc(òí çVif€nPƒÅÀQž‹Z+a”ºÚœˆ¢ ù´U€Ì²OSÃ4¨(ê„Ó8‚¨0sû¨è¬M#€Ôû—f€¼àS­ èïï´|/¯ý#¾+û_·bèÓô˜¼TW÷àŸ¢(Š¢(Š¢(Š¢(Š¢¨—ŠŠ¢±y®ëZTÐr“1ûá€÷6 ôj¡fmf¦¨ÔÍO\X ^†±@­¼¿Ã!dÖÿ® `PߎuúÐP€oÍÙ¿7\$dÝv6K`ùvyvI컎¯3*¼¥jIñ×8ÛÌÇÈ ´—ðyí¡½Ô”þÏè¾=À§g´¯à_wQ=¡îÖǰøøBS–]í`×wµ¯Cì@uøïà_æ7Ñ u5-à‰Y@À§J“Qd€g¦¿ÕˆŠ ügÅ=Çì6ó?!rR_ιä£Õ³Ýš9DsÔô?b$ 6 Àpˆ™tÖL2ìRU>¿ Àîëb€CF}7ŽØqó‰ðÿÅ5Ä=Wõž>j—ýöwY~®Ùÿk†5,Û6ð¿]íæ¾…Q¢ìSM=¾ìÛ ÿ)Š¢(Š¢(Š¢(Š¢(ŠúÑ@QT(!VÕX2ýK¶jòÝJyßÓ Ðaþ Ü/à_Ú·úÛ)ßÓYMö­L ¥ßŠ’iª.j¶*ÐA•ȼž Ó€¼;c×> Kÿîá¿`ýÐõSŸ¼æ¦Öº À¸6*ÀÏ,ÿcBЀØdg%€[ø¯+½¢ ³×uR×kšKÄ€y5{µ#øt€Ãær"£3×{Âÿùâ8®@ÔHð~-Õþç” ü¯°Æ­ö¿gýï¢Õì ñlIÙâ£}ë3DÌ£=óö>sÿ³ ~ÞKÄò|_øòç{–ò}˜F'\vÅ«F¤IdB¯Pêž²š;nÚ4Öÿ²ªôÒþk€¾¾BQ{î[þ…ü+ܯÚmóuÿEQEQEQEQE}‹h (ÊäÐË3\ÖùéŠúϙނÿË—„ÕKvî’á^wµ>Ä|ÎmÝbX2<3ñµd€ªÇîª ÀÀ™ÑœæŸ_=9!lf ûÄò #qix¼3ø¯±i†€s°{,áãÁ×X[‘@0·¼ç(y¤×Ìþ×`·ê7Ï3Û¨^Jý—¬ÿ\¿Âÿ BѲ ó·}» í²Aò^Hì!–‰^M9ÆÝç ë ¼…X¶wöa¼²b¨L“Áügæ‡ÿ»ìDœ=V3.¾³Kl6Û{p|ìûRÍÃKýñ95Ì‘“̲øó:n¼È3ãü¹ªÝ°šf9µ—ÚŒŒ¿ ´ÚÜàÕ"û1tÈõ½Ý» ôÇèŸ>Ã(`oï0 ÔsÍÁQôRøïúõO¿}bŠ¢(Š¢(Š¢(Š¢(Š¢¨‡¢€¢(“ÓL…€ n=;ýêX¬P÷=oCòO@\ƒØ’p'0¿Í\··¹¢«‚œš%¶€ÿ ”Ûœá“Ûϼáž9šç«6Ë»ùÂÛU+´^¶~‹ÿ›Q¢.Žià-`ŸýUº5 IDATÚ4KY‚ï…ù_IÖÅ]<˶Ó!~wëï%£½þø?NǬð?Ç\ð Ì儸ÞMó‚äó/_k‡5gpw#Àlÿ™ãíU|¨Øxñ\ù“9bNƒpœª,±ŠïHÒ|‘Ý]côDÀZ}]7DÍ ÃÆø„ÿ3ÿ_bžû¹1³Þa&‰yܬ¢0Í#fð1Èü™Mad0î_˜|þ€MQŸß&˜÷Öœ'*õ>ªÝ†«ûXžR‹g57‰MÁ°ÿŠu]5 Ä9Ê{ñA¶ÿ3"ø§(Š¢(Š¢(Š¢(Š¢(êµDEQ‚LâhC&ˆ§þ%ÃS*ãÛÞ:ïuÌ– €`f{ž¼@0¬ì´cBÕŸKæi A ˾ؘÆ´Ðjív%|­ ý73@í{Ú&ëštÒyélZ”FÏ9Íeӌޤeª€÷Ô»“«‡‚aˆÑ’^ Í>9Ô”ý¿”®Ÿ‡>ÿŸÿ;yK«à± `êÒG,f‡Z@bDâP̱í5áõ³LÁí¥þ£ôN‘àÛãÊÓDo_ï÷ú­³þ|¾¢"B”>™m¯f¿ŒbªÃÿÓØ±ø%Ó= ÷¼PLâÁÿœò÷”¿c.ŸOÂ^µïnc„O?᱊Ê®«±/vFÿZþ^”¿ õ='åÙ–zLù[Sûe}ûªDøOQEQEQEQEQÔ[‰Š¢øÐÇÝ€ÖuT°u;èÿ&&€+ø¿.W(+'°ëK_å¼=®èæ†H"}ÌzÎíšk¬FÙaÆefH{Ùp+®>AÜhQJ_—³ÈâmS¥}]óú³Í¶F–m±O½ß?ÅÊ¢û0qÈWÖénL¼¦Iä‘:Ì—²ZÖͭײüžÏ@ÜËlÕöj€·–©_²ÿáÇ)ÎëìXÄšÍò«ÄÎM<¾XMuyÞÓ48¸qEZŸj€ã8ðe|‰cÀJç» æÀaØÿˆ,ÿ#–›½À-ü×ÕZre5 Z'u½æTÛŠ0¿‡÷RÜä€C|Ÿ"PŒÌ~xÂLf.ù¤U\Y @âQ_ üÏwÿýq3@ÿëSµ”ÃX¶ž NúûûÕ—ð_– ª#ßßðã)Éæýú§_m¡(Š¢(Š¢(Š¢(Š¢(Šz=Ñ@QƒßRæ¨7øRxÀÿR@=C6ÊÕ'$«&€’Gû-[W-غÁ› ÖgØß* û>Z/£üÞOp·Ë*šÀi~›€ßZ3ÀÌýw`賆€š™õï™´èá|Š.` =^Þ—¼k¶×‰Ž¯¸ a}ÿÒ¶ž/ÙŸ0¼dó%{*ý§‚@?D¤çσmß«”,ÇŒ‹Š%»W@^Kþ ®®+ľ0¼jä®LÊÎçÚï$Û'ÅÀåÿm=à6äõ%Ìk¥„’ý¿Æí ÿ—,ñ·%½ Ù™!ç$'¾GÆ!Mè íZÎ'Ö"5ØïÕ0+ƒÔiæ3±«ðcèT ;#@¾ Êȃ[Là–¬Óû¥ß»öWCÎëdû‰ˆKyÙVðï;ê4¸Mûª„ÿEQEQEQEQE½‡h ( ²@uiUä|ó^þÝ È­  ·Š”ïáåúÇ¡á¿9æyn`·ô±.×òÿ"ɤJ»ÅP}ï¸f&°×€À ƒc±xî¿Æ â ÕAb ÇPD¹l ÎÆÐC˜À¿GsÞçåzh 0 ÙÓØîªCVCÈ{غá‰;j†:fÜ,c–X×QeL ù™À:{H³eÿû¿ü½ÁØx›x-&€v/ãMЯ®¶Ý³Õg—¬ZÅì¬ ¦µÅIyœ¡˜$bŠ„%ã5ÔŸ üO@[Çßø¿ âûSàæEN‹ 1g}TöÌkœÃÛßÁ¿ÿœ«¤ÉâG²Tˆî#&ªMÄëÀ'1“›F|ª#özžíÕüÍØ—!š¯´xã…Ó#­I€ªÊkT_ ü§(Š¢(Š¢(Š¢(Š¢(ê½DEQjz^ú¹ `àžòŠb˜™­ÝP`™ƒš¯ó÷Êj€„¯ «þwX{“ý¿1,X<¿? ^ö>©yi¹@r2€‰ SŽÌÌaÈ´ø¿硞å,ã…nBzB_uÓfžko5¾Ý8ìͧ$ˆyâU­G~ï5†ÌÜ_jŠtpG{ogˆe“©Û×¾Û¿b©ÌÌðë~§*Â÷Œÿß Àëóµªy3w¼¥Y¢ÀþÔö*yO=£ßMâcUuNm1FóDòÚ®W+!L(^«TPŽf°&¡ÃÿnžØ…êE¤ÅÖ•xRÜ€˜ÀŸ"ÔvúV à® @} “òiªj5€þl†ã¡Kl왲]®þ†„7`¹"¤®Ï§»¿ÚNG> ÿ›‘IêÚ? ø§(Š¢(Š¢(Š¢(Š¢(êEEQ 8oUÄË5‹cÏf÷íi3X¡æ„eF€ûFÅ/TpS`5Ä^³ýðËfÝýkö=–«?Ç:€4|%†üu`@qÈ€ã}‡Ì>7x‚äþcıTX0F†‚X±Äs©`65 ò÷þg­Ó.``ÎkÛOBiܳTOhÐz~±]—6¿• `µ>T¸Ÿëâþ{ ÊTn3@5˜À½%kÛ!¸m-È¿–ÿ}¯u†Õo ÿë5$¾ë)†çýýùOÐíëÍ(²ÔË7<ž£|-ÿ¿Žû:eBÀÿ4Qœàÿb xÞ8Q+”~»Ñ Æ…gý» Ÿø³¤IÙöŸë*~lšLV'ƧÓx{ÏA’U2¶þ ›{”·Cù»°;õ ùëNåw¹ïb´ØÙGnnÄ$¿þéWŸúfQEQEQEQEQõ¹EEQ ú¬U˜€aˆ4pÍÅÊö¢¸:à#Š ªfO®íêëÏðß¾I Ø%Û¿‚ÿb¸Íþ—(ñþ5¨µ›´Í?8JFé,>¬ À¡s ä€èCTªÇ,Ÿ.”,,¿çÙ-¾™±¼RĹAz\%2ÿ}yÔ®ÑrHÀUUÅÕÃʼÏËMžU$bêcÃÇJœù¾"ò;-àºU5Èå~n~p´¿K³y2F{¼õZšŸ€?WôøjHžº;(Þý»š‰Ãa>ª©§î,‘¹Ý÷—*Ô>bÝQ.t°è&û¿Œû åsðÿyð¿B±Ôø…šà¦‡Ò–fg¨U$&ŒˆwªJ‰d¼?>î‚Þ 5ËÞ« ~çš­ BÍ}Ô´Ùjªí´÷öEÆ¿_¹g÷ûYü)Š¢(Š¢(Š¢(Š¢(ŠúžDEQÎø…Îï ÿ[ö¿e±;vI€D)& ° c+ [1_*”¨,?‚ÿ£€ÁÁ1û%u €±Íþ_aÓ×–ÞöJH 8Äð§M0 8ð‡Õðœç™ó/cÒÅ#¿›ÎøNº¾Fs ÇNqŒïn€€vÐ=Áî䲇›ªÞþ„c¢Á̬>Àú¿‰ à þ¯Ë¥ÿm T+Àb(Õ!Ös„ÑE=Ù=}ËßþU˪3¼þ þ#™tfþÏ1zLkÈÜ@\Êà@Œð5¾"ìüÅ(‘×Äö¿üï±hï¯f¨Ëö(Ä ”|<°é«hT ¨Û%Îáß,¶Ÿk€GñvÛ•í›æé[.šÒóåµÖ6ÕlÿÜþëŸ~5@QEQEQEQEQõŠŠ¢dv¶@ jV‘ÿÜõ)ÃX^©Þ\•]ƒ½0¤`sup^×`ìü]¡Í¶œ,Œô™½iûßfÿ%ø—™¹Ÿ]@%’y§ À2¢u3ÏÆÇ¦T0ä?óÆÅþ©ƒÃÉjð{ð¨mÞ-ôWñ¹¸—c²ÔÿÄcfú—©SD8ü—ħn1÷/&7a¼àÊù®5ø/1ÞÛx’jØüC1ŽÄOÆ¡D °ið/YêXûõbLúÎÚ¦^ï¶-œÕÆê:ÝCìjP?¬.KÖ5¤;ÂÇb,^š^5xW&7ߤ±Å«@²}R Yþߟõ#ìðiÌ,‘înÂw«oròlJñ‹™ž9gÛG¤cÃ宜ì'ô×?ýêËפ(Š¢(Š¢(Š¢(Š¢(ŠúpÑ@Q”) CfIz‰jêó·!lL6Ra/÷(J¦je~ÉZQ^i*äjèÉÌ`+Út€ë&€jV  Tpìæ3 |KÆmÌn}ÍÒànT†aÏà ºb˜y °§$†Š‡CŠ '&oÛU¾µLÿ¨¤0aY9<ÞÖx¶²ª™¦ drèuæá-_ªDlMe\Ôût/:-ë¶=ü¾Û8ýœÌ%gãˆÇå”CŒìRæ-ëmvÛ>ÂpFÎ ßm‹ŒöÒ÷j~DÛÏ–ò©™ž×H6ø_"ôú𿶸ö¿æë‡Å¥_]m{™#+"¸I¢ÄB“šK­šð¹Øÿ[ W}ð>.…î×_Àúzð„ÿEQEQEQEQE}"Ñ@Q€Ì´tпÖ7¶9êÛ>9‰Oàß= ÖÓtbÅâ9oóšÚÆ×ß¶LíœÃ}#@-ûï&€/þG˜Ö ï@¹³½2韑›Ê óDQì“O3Àœü‹š@Âàeà Q šG·Àï7s@Fß³“g®¨µÇÚ;qÿ°V—£tžÇ/¬bÀL”–Å€©óðÓ«àqà×#jÿ¼ÿh}ncà.û1 ŽÒèAoóÅ8ªÆ˜¶¯ÆÝ÷aÈõu¹Ù}öêûŽR?Æq5äXPÿº>ŸZ?Þ2Vö¯ý*öÞ³—^¾ÔÆIé·UõÈæ~ã xzì¼^;øÎ·ƒý»åþ¯(O˜ñOQEQEQEQEQÔg E˜è21¿ÂÍâÿ0°kê úÚtdESMùÕv¡§ZÓ—²l@…Ói¨UFþþéÿV°;î³ÿç|-ÞVMNµB£ÓÄð/ ¨Oè¯ö)ÆÔÕ%Ý ¢×`—™“ѳQ”XFÜeBüy2Ťó÷BEqÀÅC/"ús;dX¥€R)ÂÚ,6Í›&Màye¸vëiöqÞˆþ/Yý(cB6ë ô¯ð¿Ærmh’ÇkÀiÛGpþ—jß ãdóÌÌm(Ó@( Ö·| ;ÂËÿkÛë²)}Ÿ÷` À]U„ÜßÇzN€0<ÄT§dÿ<÷ç+ðMªÝÝeô?süöœÚ•Û’@ýÓ¯øßÅEQEQEQEQE}zñtRÀ*hfIêdÎÿDÿ^ À ½gQúÌNŸs`;‚.FׯÐÚR€[®à±ë4+ü—²¼Íân ¸ÄßR ¹UNà0Úh=‡þQà 2¬Kq‰ˆµ¡ÐÍ—tô*—Rø½2@1ADvòìO€CcÈœŠÀCE†Aq„AÄc™‹n‚ðéÔ+H4€_+T]gEŸñÿ¹¯~OÚXÚ‚ÿb¸7Qâ½Ýño×Ûg²¿TÏ€nÛ³L‘ýÔ!ïc¶V?¨cÛ×òÿ}ßÜëÑ;å-})_º¥î,öNL˜_³þãyžå5b›®ÞŠo™–ä“è”±³ÏÓë–’ÿþ#¬¿þéWîE­¤(Š¢(Š¢(Š¢(Š¢(ŠúNEEQ2›ÈŒoXv¼†ÁÒù}"«Zªô3NŒí@×(4öMlº´c]SÁuŸ§>¡?:øŸS| øþ{8¬~m¥ `öʼ–Nïq@+›?'T8d¦ûT ª*ƈÄ-ݨà«Tèð?ªϪcøy€aìÚÓ "sŒØ­6”µ-1UÄqò8Ìl& Í mDhù¶bþ¾TMµß÷ððïSH Ìòÿu €‘ç “D½¶™bîj¯|úë¯[N(=‹ì·ŒÍáÀ¾|*ü×#Z:²:e欷ë|‚:¯éƒù™ÏBkðÚ&BŠ¢(Š¢(Š¢(Š¢(Š¢~DÑ@Q‡M““ ™X:³ü›Iƒ°Ç’»›?³ì·aþ’ ;PÌÑþ%Á­}Zc×RìièÙþ£@Û‰w‹! Œhç_ Ð-àþyí÷_L¥@‚¬ŽéTEdÄLáfÄ‘‡!`4ãT]ç–xŸ‘ñ m7`Žy/52”ýûÑ#¦c÷8"&(SE@0Œ‰G8‹ ʘ`nŽJeììh:{ðï÷àÒ²Œ™0œöG´Y<îúºÔÓoÞ÷ÁR=çå*ÛÍ*vÏgÉͱqâµ7§ühÝqùÅÐ`¾WM +C) ²dþS§;ý(ãß¿ËfÁ„ÿÿÒ«¶Ž¢(Š¢(Š¢(Š¢(Š¢(ê; EHè ÀXtÂh/õï™ÿ¶Ë\+€ª@õØ›P3^ Ú–+h&+¾ÅƒÌÿZž½—ÿÏìÿ„ÿ»©®àÿ[¨N-0¯íÕ¨}ûŒ)D=Ý"³@DS4ŒþuN×WLï¦ zÝDTæEQÃ!ì¡Ó¢VBf¿Ó¨þŒ!sò±‰$ÂØ°ò8cÜŠRÚ¼²ßâfØRöüKïjmM76´±SÇC˜ª`4ÓHž¯´WÜ mš„Øw'™w UÂøž˜ÿ•N¾kR}mÈŽvqÿ¾ÑnÛG„ìü »›&Á¶Y ŒÀþú?Grÿ›ê%6òæèÛ¯ÍZs=³þ)Š¢(Š¢(Š¢(Š¢(ŠúÑEEQS^®Ü8ÞÐC ÔêD ßô&u~nÊ13xÛ—DO3 »mÖlë3Àïó´Èä[À;lxÖyÿ×Íùš*÷²sÎäzHfû–iï³r‚BtLðzªÉbU-–^iµm”ˆ¯ D ‰.çò€Àn8H Ì¡•!=>ŠC ðGT5ðéü»ØD›òçÖxYþ½UÒ¾ÖûÙÀÜoô)!ZÙ?_¬ŠÄˆ)$Üà÷¯_[ËŒâuÛ5üOKÆZ¦a7Ö>Âpïý™”‡»kÙOËÚf8T¾:.×ÝžçÞMWÔ~í¥ÜïÞú¥ËúGÇþ0zv€×@Uð¿n!fûSEQEQEQEQõK EÈ,{ÏFu€ŠÎéx÷œÍ}V˜¹àTf™ÿY¬ÞŒâå¼» /ø\Ëú–.ÜkFÝQJ¸·uvlŸF \íÕ²ÿ×Äû=Û±<~« p‹óÕYÄ¥,ï¹ ÚœFÏ} ¾G·³ÿ"¾T0“‚êQÚ© Ásû¡ªÀáw>UÄ4¸u¤L ¥-ÑdIÚ_CõÔ-‘e)ËúØ9O!Q«F¤yd´Jµ"€˜eCZævÆ¥dô{—ì3F®ÆpÚö}àÿ;«LŽ?ÖÞõ1w@QâtÈ÷®å¡œž} öµù¼×­?´à™,ÿƒþ¾mL„ÿEQEQEQEQEý2EEQ&CŽ‹  ô âˈWð‚ð'#,³[-3º”õ~ÄðZþ¿ÔÏ5ûÍð¯&€eÛþ·«½Iéÿ]Vo¬X9Ëçk鵊Î~{ð¬}uúß?¹˜–³×ø®á`ÖìŽþ¥ÀÚ¼ò«>æïÉÑ¿@õ°óÍÌ~7‡¤Q à(ÓIÄøÐ#³Òº` ãÕ¸©À¿-W𿌃u€þKYnÕÌDãÒZ¦v½ôkƒ£õ^´wûxè}÷hÈÕB>kËm&|S¿.ê| îÊÿSÝÕ4Ø¿8my3ßIÿ„þEQEQEQEQEý’EEQ¡È*/Óœ5*¾µŒu¹'#€º§§µë“€Rš?}­°ÌÝîë® o;G’ÏÀÿט †U£æÂÔ°6L#@MÑå0Ôdbµ]|z€õÆ]çO‚½äý¬®Ç”21„Å¢î§~ÊQªDÀútLÓ€Zª´öø™3ûÝSì Ø_GϹŠ%¡wãÈüzý?§øðþ}Ly€¸%^Ùå¦j‰¥† þ-{Ù²t»WxO7@‡ùe@Ö͋ݡÿ.Ç”3lmê;ѳÔRÿÛþß?û?ÿáßøg靸‡¯Ò2Š¢(Š¢(Š¢(Š¢(Š¢¨O*(ŠP3—<€gd«b^o¹ØÜàÕ"û?Ílý¼î%Ì•)úòèŸ> äiNçð^œáÿä¿Û–ç9—ü_À]ßLõ{˶Ó!ë³(§=~t=WmEåÿúÓÿíú[¿ùÏþ7oEQEQEQEQEQÔ' E5Õ2÷9ÅLiäœí;#ݦ dÿiX¯ï¿Ãt7–+`Ü€ÿüŽ-üþµŒýõ[‘.ûX<:Kð뵺) ^o½Î ÕŽcËÞÚ÷Ï–”6šqâ¾¾vÍÊΖKièE£šÀÐCŽy&€1a€0¨õAä TŽÄ³ßÐÃÚ4²êÀewª¡9.°V°ï™þK5€ºÿ°ýrÃ3ù£†C´9á~b™ðßÕ@ãå)±‡ËOgÕZ*¼­?^[=¯ñNÝž;«H3DÜ ìž÷uV?PD«•% \ÎÏ̹Ýïï ¸Ùßò/Çoü+øtì/Júÿüéÿþþð7¿ó{þG[÷¯}dƒ^I÷¯jŠ¢(Š¢(Š¢(Š¢(Š¢¨ˆŠ¢NÚ›b#~Œ2íÕ¤ ˆŒ¥§PG€3©€Ñ—=›xÿÝ$}€•—wP/ÑX£ü×B¬&üK)ú†íüÓ·ŒÖ“ùÀO&e§ ›€4¤˜@½›ÚçUÀ=†K7¶2sŽvuÛs:€aÝQŒ¹Õ¦ƒ(ücžÂŒ‡M#­¨‘c\5¯uÁ¡ûŒþœ"bXÙÿº}#@ŸF äã×Ê¢qŸfV»”8å¸mÓØ”ȉ¢Çþ´µéü¸7Þk¶ÿòìÅÕ%ÌÐì$w!MÈÁåã%ªÂá.Q½ìã®ÿßþ¿«mÁG- IDAT–PÆJ<$?©©MÉÀ¯úí?à_·Ÿ]çÊ-EQEQEQEQEQ¯ (ŠÚªÎC?ºáÊšý® <«`’Ì  Ý¨çƒ|{Ô,aÿ2–Åš±€ÿ¶O"ýÌ Ïüüsmë¯t.õ?¯çP³oò•µ|; !²r®ëzð+Ô¯; y–i­×ÔÌcïW;µxOÓÇjT†Aës*ŵ²ÿóŽÄ§*¼˜þ/÷®fÈž†E⢯g“ˆ®Ùÿk†5,Û6ð¿Ä"#Ç|°lÏhwP>«ä4yn…WöŒˆeÿkámU^ß°Àë­ñ¦Ä¿<‹aºiSTóňsfƒzÏrÿ6=@–¸]¼7ùßµá©mÒ¿óÒ\SîÜŸö— _ÿôÛ_>º ¯¨u”þÒo/EQEQEQEQEQo$(ŠºUËnFBÞV°8à¿ÁJYs–=^ÛavðzÅåú¹®C_Þ™òK´ çiOäßËÿ¿0*œç¥v8êæËæ.à_5Ûè þ¾<ϧ+Ôv»Å­ZéQ»%ûí²fLû×gøe³;ظˆûìΊr¢¹ÿ4Œ0|™wC†•þ? ôk|BÓÕótÛv.•ÎUziÿXwš"`1øïçcX ú}ω$×–i’F¸áA¢þŒÞ ôÀü_—d/›u›8Öís*ÄJ‹¨JL{à0¼¿?º ¤»þ¿§ Ãü¸_À¿´oõ·S¾·‡|1 ü šÓ‚d¥”þøSEQEQEQEQõ!¢€¢¨‡:UÀÎà-á]"ѹ«ès­X·aGY×I€±„eøÎåÖNƒÓ¢`i–ž/ßži^Lµþg›´e~W³`×˼ÄÅ‘íÔ4ìê Ôˆh6¸£{‡äž=~:úl½x ‘ZÒb­{D¦»zÆ\dÄÈPÿ±sTb9¯¦âÓ\s³m#Çšxyÿ3د°±®î{6šxßOÁÑbyçs7(DDºIÀ:}…z|íù±ï1¢@}Ê^¦ôÏΕu“üî=ÁþòoÈ—¬®Ðö³[Òà¿fE„R_¢#jÛ´ýã]$›/9F¤ÿHÝžïª<.ßgõxß¹Yž®öñyä%ÿU¿þé·Ÿ™çã{¡?EQEQEQEQEQ.(ŠzZ5;3`·ÃÁ¤Â|§ˆÊFÑX^Ÿ·¾\)ïàš´=YŪ³Ô:$ ±Q¥ÙÖšéïæ¾f­ p¢ˆÝ µÝ½µ´§V=p#DëžÃJ)û”iž†˜ç†î×ùúïÉÔµ=`…‘k…ˆ~úçD ò®[ì>Ù½DL/1ùݺ3Ã['˜ÀŨR`ìXª$äÎÏœ:Ídâ}>G¤2D f×røKùÿZpSˆÃñš}c@–ª¨ÏĽ`AàÁÿ#Ôþ¡ôO–åz¼ÅIqX6ÿŒ…okÓ#`šî°¾¿]Þ· @{ ž ¼fhÓ$ب”Úïõ©[L? úã×?ýögï"¡?EQEQEQEQEQß•h (êEªÕø’ŒÕÀ]EÃá3õ·Æ'®¸þ¹Þ—uÍÀ'ðß¿'ô_̱ÍÕáÿÚ¾Äþ= j5KÁÇ”R+$ȬծÃ"{Ð_×_œÃ×êf]W¢¿Rö©T@l|DpD=ÌÜpa°é¥ÿ£bƒxE†ëi*{4ÈŠ \FÏCì~üÏ*5Šð'ð¿¯øO7I1ÀÆL5 Ÿ+3‘Ôàôö<¬Gôø¼Žu+À^þE…¬¤0ìÀßÈñá&€ŸÃ=²˜bG„ǨVAˆfG€·4Ô÷ÞºÉâÒv‰c ~I3@ı­ŒÜÜÿóèéÀøÿYEøOQEQEQEQEQÔw'(Šú*u#°Êà­/—ìd7t=æ'Í0 }î™%àëPî&€„þ¹â¸óô™™ßZ^«!äЧ°2ði° ×ÁªwBÌ !Ѧ“ Ï àü·«=@ŠžÖÒúW{îMe'À€÷5°ðí®Á+´{ñZ‹vÖ{Ëïš•>Û$H¸GI7?Ü›2PÏó«™>–løÕ àS(ĵ G;í,Ü Í0LJ-{6F€Áò_íËxy_–˜!cwÎöËröµÆI½D„`š!ðsXf¤„r¾7¬Ÿ>EB´µZmªíç-Më“°Œ³¸zJÀ,›ŸMøó–F€ª“£·wA×þKÄ ÆtËö¯à¿|šë­ ûÅ ¡ oѹn&A!f$‘6ü™¨q𸠌(¯mXž€­É¤Œ—2îÄAÿ)nˆøÍ…jÀò:ü¼|ù“pWÎÚÏÞ/Š¢(Š¢(Š¢(Š¢(Š¢~@Ñ@QÔ«éÊ €öm­SþˆŸ\o*ø ¯zþós¶õ€gþç9âÌXb«z™ûÖRuÀW¿Ô|iLwž òëp;%ÀUùÿÛPnï‚õäò Ó1»}뺬0Œ…¦¢­« Õª ïnÅÜ; »´(*/œ¡€XPÁÍ’1¢£|?R@ÃÜM€a­šæQ`X<CåÐà˜çk&µk€Çž ïZóä×(mžM©û=‚ÿ£€Á9•Â,ûïë¾̯÷¢¶N,«_Æ€šÏ‹lL¸i «ØºôÀü_—sœEöÿº®Æ±Æ¹š2bíÚ/1£|´~èï:@ÐOQEQEQEQEQÔ' E½‰v j5|í¹ÀgÉ~/óŸpÿ¸ÿ'#À2U@œ]Û•²MÇ®‘Ùœ ÿü£7µ@Ñ}¢€ŽdÜ’è0ç™GšÖåµ2ÀMÆÿý]¸ßz;8j0¯ÃÅ þ¯ÅÜ1³£kõ…í½ð…Ri¡NÑŸÔê1c¦p(^þ÷}÷Ê8W°ß¢f ð/1€`ذ*~“bñþÇ4äxÝþ¥¥ùeþ=[h ÿ‡›ª îïç3³‹ˆ_{š@ÜT sJQ”+Y§|e7CÀ¾î_L~—Ð?ƒÒ¢†Ÿ;©&€Í?xµ„ÑzåÿùJôüƒÀÿ·EQEQEQEQEQÔ÷&(Šz7½FöêZ¢¿Aþõ³}?6ë}Ú9âüº¢æMŸËÄ6d­Æ‰ÒæñeTà'PŸÝ€1ä°cŒ_F9ú“WøïŸ¾~·½¶WÙü‰Ýלéý+N…«øD5€4Mdæº/å< ˆP+“?ûãì·ýªÆý ʨz»j/¼j ÁqÑþúù¨Ÿ‰n»õ*Öö!£‘E±Þöf˜'9ò"ÙÌi’ð6UsDògßqihnÍoÞǺFbŸ™ÿ¹|úA ¿ëgô!WúoEQEQEQEQEQÔ¥h (êÓ(˾_Áÿ þ‹ Aÿcÿ ô× Š²^4H03™ÅÆçïÈ>ž?Ò €™*òU¾“IM@|È&‡œ“›>ýKû~Bëp´:Q=G~f™u`õ T#Ácnveˆ3ÙýN€klì÷)-Z¾us­Þî wý˜Äâàk¹fB÷ŒGäÚœ Ù'‡Å9瀙?üÏãæ÷Ù§ZªôöÎVæÈËrÙ£u 9¨d°G›:ÔÞeÿÏ)¾üßÿZò>Z<< 1Õþað@fºð*9-Âa㣚ԌÅ„‰G[ïëS¾bþ¾ߤî÷þþ}º„1ûU Q%¡€7µ¤Ñàú™Oý@ðÿgû”åsÕÇ¢(Š¢(Š¢(Š¢(Š¢(ê+DEQßµÎp¾–ð_ÊýG¦ÿ„þn¨f€üwè_¦È´3×ÄþÇú|æè&7ˆªÁÿ ý«åÖgùËÅðjé…ó d±m à¯Ù›óÞzú®ÐÔçý3-9Ëé÷vünÆ‚ç8Ú 9ëT³ÒïÕÜ©.õŒ|‡ášç»âZø¹Äg› TüÎ`¼L N©-®sÚ‡ЙåH> ÀwR­5ë( r[ù{ÉŒ÷0nè{é_f—hœÀ5ôlÿQ@vT¸Ø] v­`õãDè5+€rzŒ¬Œ0+@†Ýš2LÂŽµ{ä&Îð_†iþý^Ÿ ;ÃD1¬ûßfÿ<ƒþÀ?+×íí§(Š¢(Š¢(Š¢(Š¢(ŠúŒ¢€¢¨ïV»Ì|Õ„¡Gdó'ü¯Ùÿ‡þœæÏþ_ ëù«  µeÇÚAëÌbölï‰r½ùùH੘åà=ó{”òÿ–neÐÕjÉ‹:Î äÖÀbb(¿[¿öœúZidÉ2LJAÅ£À­š±Á În ÐÏVééÓ+œ=ë}•¶iòþ¼C9“¼bÈèf‡á žª~jš²/ó:¾¥þ=óß[y@'äVɱ»š¬¿ÙRÄÔkVÅ--¿o3ÿ3“]ÐËÿgöÂÿÝÔAë-Vj¦ˆ9„$Ú.3HD<jχ?%ÓàQj·6Œ9¥âC¹åQ|Á7ìŒ='üîq©kìYÜÅ©Á}W5ŒfHð/v9Ý÷ÖýR(˸Y¦(Š¢(Š¢(Š¢(Š¢(Šú”¢€¢¨ï\Yƽͅ®º,¥äÿÑËÿ¯eÿ›À¿ÛµPx|ìrçKÖw¤Ú'Ž­°PµàL›Ãþ(èoʲÁQL–%î×9pªŠg‰`^Qø®šzî~÷>É×QÖD´öÖ©ígKâ¿D Ï3Ãÿ\a5oøÞk‡;gÒ»ÊóþŸwþЬì r˜À2óuD<Ü Òcà÷*|¶}èœâa6m¢Í|1ÍZ /•£{¸é£›ɪ—Ý­6”% ÿðûÜõçjuÿaû¯0»ŽÄëÚ`·ƒþ.«‡Øöyc}:ÿ>û­’ϯfWç÷-ð?§}•²ÜÀô }úƒVößcõÅ*&Œ˜.!g?ïÇê†ÿUªPEQEQEQEQE}ZÑ@QÔw©¼ þñügæ‡ÿ»ìÿœNq…k࿇ÇzµY´‹L||`–l÷¢æú<§yª›»À¦ð˜ ½žM½s[¬K€µcíi¯ `(Ùˆ¶8ð²œ{·n,˜»'2÷ûøŒ  fÍŸ ~ô«ƒÿšåªâP:ß²Á—kU‰QF‰ƒg“C0Ú|õ2 v¯Ã-¡Nù½Ì½!àåb÷¡*jwð¬ö9Ãý¬0sû¨è¬M#€,¦L3@¹‘O(¡?àåç7à¿€mÏÒϹìË:d&{žÇ®TïK&´ÙkÏò·D\ê Z§Œ]»@1”î>“s„P̧ót µBB%Æø×Ê pÃ>$ûÿƒþfŸ²|âÁzŠ¢(Š¢(Š¢(Š¢(Š¢¨B4PõÝi-Ío+ rþ#›_Ç þ;ø_à¿(7ØŒrÝ֢Ǯ()hú¤½ûN4Äzàˆ”çaà÷À/8ð³ÎùÎ',<ÊOŒi6(óÌW .¥oÙ×ë¾y¹oñŒwX·gÁ÷yï#ÙŒ<æA5€3ü/è?¦~8b{‚ÿjAÜÓzΨžÕÎמ·&û(G*˜=b}Â葳ëƒ6@ø1µ€J‚íáÇÙd1ö«–íã`1@ܨåÿKý\³ÿ× ÿjX¶m໚SHYŸ±¨û0BÔš^ à(S'4CÅCÄÇD1ÄMo›Ø$ðoËü/}^§Xá¿”åV-`Y½áÿ³úÿ/×:è˜õOQEQEQEQEQÔ/R4PÔÿÏÞ½õÊÒ­÷AF-†p¸BHˆù›‰k$.PÞÛq YBÈ– âwÛ1|C,!“DðU¼mG±H"Ç$ù±÷~kp1ÎÕÕsεÖ<ôêþý¦Þ9»««»«ª{mYþ?Ï3¸ic@\þó¸ÿòß÷½ãÿrôÿa€‹à¿uS×ÛÇ£xftxšvI½zµ–ræ(Îy*Hµ`zñwî9Õ¾ÞO±×Žé£ÿ[~ìe*@»n½C|>Ç)ä?½âeŸ™·Ûóß9åH}ÒAšSÿ¥ …½ó4€% n·#GìÇð?/ŸÛEð±œC,·û¯týœs¤ˆ½.ÓJôœê¸ƒT?vR¤H¹…Ûk!@ëfϵØ#Õ`¾O8œGÛi—óIí<…íªÕ=ÓqÂusàß>íË)‡õìÛ¶kÁ÷òK‰ÁI˜]¾¼©c*ž˜;áG!ÀV?1¡Î¥èSŽgØ®XýìÛ: sqÊáJ]µÔë±KŒsºÖý_–øÔÃÿkÁÿr|0Ox¯äN‚ÿ­þw üŸêòþwMpS.»ÿk Ù»»Gà9FÿÏK§ÌÝÿS°:wÏq}÷纄[°Ü’¤œŽµîùcGzMªÒ[nÓJ'ó8·üç*F]B ŒG/1æ÷½¹_±½†Àùù²ÿ(5xJŠTO1q¿?´®öÈS>_‹TÇê¯¹Ûø ¦ã›rú}úìž þ×¢Žv|9r•¯¾iœï÷ubCê¡~>µW ¢Öi¼ø4 `|çåF•Dý¾§½=µ~Û§r€VЦôîÿÃùNÕ(ÏžoÛÚîŸú§¿/pñí,.ÃÿVQŠH"Ò4½"¢LDØë²[+‰ˆu€½þëÛÿ«0~ʵ¯1ý÷4ý‹-Ç’×c[>¼é÷YÀyÀÚí? ¶:è*ˆùº×=»f¯íÂÿ?‹ˆOõöKƒÿ§¶Ü À ay³çx ‚÷Èë¨ÿ>úŸ æñþ_ÿSH<–ùÖšõ§þ`â[·y ÜSKøÒúÜ=rlyôö·UÌË’ŸJ`˜Ê¹¤ªçé…òÞš¦ksS Z Þ#ö~n{?×kÅ -Œ,·S ­çNñžŽÄ¯{[æ w¼×nøzö}?)8tô/ÅSaGLŸ÷ñ9ýsY Iž+y˜ Êýv>©¤´õíã§õ¥·Ú§Ä?sHãv®×³O§™üøGÔQösáJ{,E9ÿýÚ–s­g]¿×>áo×ÏdÐÑ?ß§ƒÿñw.™¯a¹{ž·^L1ÏÏ£þ[ç;³=rl)Ê’Ó¿÷¥ Ú÷1ÇX´¢>rm Cÿw:ý~²ó¿…üåû0ÿÝÿS±ÄÉ…÷ÿ¿ñÐó1ÖQ9 ü…ÿÀCSÜŒ¹K¾·KG>)ÿ%økKƒá1 àÉðÿ" ¿Ž·ãKÛÒ¼½®q>ºGàÙÂÅœ£¬óc9€9¾Ï{éŽîîy^ÆÔç”"ö¬—CØ[¸\£îùZžÄ?+uÒÍÞÂÐ|o=ä/qÎùÊHüR°E ùS‰?Bý½_—Þ½ÑÙ_?×ú*}êÃIðß÷ÊÇÏõz±Ã8ãzŽKûÜé?úüçB€¾W-ØÎ_¼…Ú½ OEu2CÂKÁDéX?+hvšŠ¦îÿ‹Ïùpž#á¾þYð?nDzïKÃÿËË“Æ÷¢Ú–·ØS+VÙ"Ò˜‘ÑO/ÿmÈ‘"§©@d|"õ=¢oéS®Ôt=ú¹L×d ð§`¿uú¦Ìûouÿ: â⺽¦o<ô(ÁÄóß|NðÿÜcwEp“®vÿOAþŨÿ¹ xš°†ÿ¹K?†Äãw½u55><Ð;óçã-ðž‹úP€^Z@l%2G §{.SöœbÛRY jWz‹5çQïyœÅº À8ç¶ïÜ ½žJ9½íS Z|Þ¶u$þÔÉ}6?çÛö©_§Øs <Ë…Ø÷½_Œ>Õá¸lCÞǶ˜ö™¦äÃyæÃçúœ±W)~Xºÿ{!@ëäž ¢@”±õu‰†”ú¶hƒ ¦"€ö=X‹ÚÛïQ9•tR0ý»hŸbûBµ­/ˆ;{è¼{"ÄñÓø†_ÿ}Û\pxì$ü_Þí Âÿ; üŸó?ß~éÅþGp–‘õSÇî³Ýÿs¼ìK0\Þ£¾^¿CïÿI*øtùap÷¡ uçúö"€èËÌo;‡÷%þ/+—Áÿûsªûö(x\¹œ—ð{ž€P:ò#^€~ÎHü^ò°Å–FWw>ïµ€¡žTíüÞå=¦û±`ù¼÷XƒÿCèŸçsl!úõ“ícøcÌr˜‹ÒrsêŸm{©TRË”¢-í°§½¬õkÜŠZðÝ_´‡ÿ©N•ÈÓõŽþ·çšxOz}4¥±íØÉ?:ýë½Cð?Ý«¯õeYë\@’§"€óèv«ÿÓ¿ó¾<± œß3}7®S=Çå›1`휰nO‡×X¯ßç\»; ýÿeŒÐÿ¹nÿãíçÿ€‡¤¸!S,—DIK IDATÇøú§»ÿsæçÎ]ðWÃÿCHýtè¿î9öš¢Ð<öð4ŠFè™#÷5ÁÛ¹Öç>Å bër Jczí5d/y;¶jç®ï1Îûù3›Î+·Îý)üŒc'| ?sþ>ò÷{|Ú>­#ñ÷TÇÝçH5üÏ˃Q¬0:ýKèß æb€cð¿»sø{8£³<<·É søßJ&F1ÀZ£¬óµ4£hÓÊd€1 §©Ò£6ü·"€ˆ5/û Úø€XŽ®•-´³Mc·¾m=Ý4ß9lk!ÿ´m ÁãUƒÿ帖óÏs@[#!ç(_žq5ò\Ð Ú¿­Þý?¾ëgqõú¤Ëë2 "΃ý9ô¾m.¸,ªxÉõ»³À?b ýëú ý~L÷ã‰ûOüMp[æ .êHó|˜ ðT÷ÿTÐC¾†ÿ/þÏ|ijmÓÓEmïÜ;æ·©`aœ¶ÿç8\4rêï8N¡]ŸÃ5œ !ÆEyút¾t$~*î{ÞûHüÜ&äTƒïT'ÔÏ·sŽøG¬Ýÿ{þ¾wýïóòOvþ¯×áø)õÓ̽Œ¢þ®Ýö¹~N©ói@{ÆÖCøV°EÄžj@ÞJQGªÍkºŸêhú©/ÐÎ¥áýûÓ‹ZôjN¾Î,ˆZXýØÎ²Ð9ÐÛúÖ´ìilX¶—Ãy½¬u^`Îýç÷žÿˆ\?«“" Ôþ E´%Æÿ&äz®„X¯Å˜z""¥­ïu=øÇÒÑo¯ß†ü×üi\Žöÿš°ÿkžp—nÿ?EÖýÞübíú>Ñž‘ãr[yòxϳû_þ/g³Æ®KÀ|¿õn·@¾Ïåù¥wüSë`ŽˆH¥“¿œŸuÀ{gôRè0ã}ËSù竎ÄoŹߞºñsíÈîŸi ÷÷þïkðöùOË\?ÌowyÂ˧ÕBᜦGZ}ÈSDä½wÿ·ÎÿQÞÿ[M±ÇçÔîG¿^#ånð„çÔ{½8¡]áú)Õךâå‹ó½tøíÇ­ýY¯ü_w.‚Èów±¤ˆ\ÃÿÓB€ùÓkÅS÷Ä(8¾û}˜„°ŒìŸý³à?"Åoýá_~“ëóúÓÿˆæ1ÿñÄíøŠíMp#æ®ü¶¥%Ä5Àîáð<  Àsçïôm±v†×û'ïüjçr^P·ç\ÇÄÇ´Þùú·zÜ{í oáxïÄÞk¹¥Ø÷:G?¥ÈûÞ;›×øÇûÓùž% 9¦Ø¿…ÿãœ>g$~Êk0šRÙ–{š‘÷µ`¯ÓŽáÿY÷ÿXê¡ßôÙ_œÜùgœ¯=\çô—̹Þn“ úO‰û÷þ·(3öi€m ŸÛ2㢗Fõ<‚æ¥`ì-Ðn÷[MA½c&zqŸo9†þ—û¿Uð|Ë"€þ`Œïeô™µऌ¨Nˆ¶õ§1 CÆD€¹‹?µŒzÿ·þð¿þäïÇ<æÿØñ¼}vÿs¶0QÜŽ)‰m ìëøÿˆöÀ(˜žšÝÿs|}ÝõÞ üŸÎa.˜z’÷=Ø_Þ=÷ü=Rÿ_Ö=ï'8"ù”jpÞ:ü§qçK1ÅeÀñ(g¯:?·%R/(!úa@=Î=Ö±ÿíöq:@»=ηÿs–Ó{Áç<Ç‹=tnSæ¶i @ëÿ/Åc•ú­¬/GSËÒ9¶¥›ý¸@?œév› 0³ÙcNÁâôtÓi„šžº÷¡ÿÑ\Q _ê¶kP+R+œ™ Úü†H‡Â—¾äDsíû0]ã>e¡þí÷Ûäÿ'þ,">M÷_Úñ/ðx €rèÚ=„ø£Û;÷B€XÖúc÷©hàð6ýÏ[„ÿã–Ní%C.azäÞÔ\§´;{ ãSª5)öªo)Ş瓸Öéÿñ#ñÛjé½\ M<˜Ž£ýí³ÿ9âdôÿa€‹à?O÷ñ '§1íÒµ]¯”ûg¹ÎpH[¿½÷¡ÿc@S JA@?²ñÁ¿(å¼V °žÆt‚§.^õÙ÷úHc@êS.þ=õð¿L¢ÈižY1ÊfÚ÷a=³§¿iº†kè:þ/ý¤þݦmŸøÎãœPÜ„5^{tsDå?:ücÿÒÝ~þùbËÛZ’ÊÒý%×*{–nûcÛ‚î4‡ÿõYgãýûšçsAÄÅùžŸ¾öðçŒÄÏ©è9¶ØF÷n]ÔÑÎvú ç)£Ëÿ²ûtýçéZä>b:µæáÊÉæ9K¾¸)¥qMôŶh]þ{ïüßû÷wˆ-­¡t[  ½æµ)gÎ?¼Ô­„ý×\Lˆ³B€ñÁÌ V´Se×™ÿËBüˆÛò¿Ö˜Ðç””ˆéCS"GŸ õ_\,_Ýu‘Žéúï¿)ðJ ý[Ló¹?¯Hp]ù#ã_ ¦ÛùâÖáuÚîKàÿÞÝÿó{Ð~^ §¶¼y -sßÖG™÷îðöRs×û8—ónÿ‰_·í5òO±E[ å¨SF‡üRÐÆü×®ÿ6àÙð?_žßù§Ü#ø‹msñEëÐ/!s¹Žs@)êhÏÜû¹ç^°Ç–Ú>)ÆD€­¯W߯×÷£Ú/™ðˆæiK¿~û÷Q®iäôO‹Ô;ó ¿ù¿ðnÇ~'Ú˜ÿ¹.iöµá¿/=ÀWRÜœcp¿„Ù½#ûJ˜ÿT®ÿž™ÿÅ[?ýæ-×1f ‡s ,ç¬~Z"àZ·ÿþß$~® Ôz†H9bK¥@`,0:î{0ÞÃÿ”‚€~N1Ìç×Ãÿc©ÇI‘Ãñ„šÔÎ|:ÿhëÊÏEцô"€þz}¹†vNu™ƒz]rZÏá| ÏY "F1@îŸã< r´[ÅoüþÏ¿ÓÑÞŸÆeðÿÔWVøð߆©£‰ÿÁïÉÓ.ûÀ:€É4 àÊc¥Ã~ öSjƒåOºýç)7¿ìU'D™°ç­ÜK9òÞºÞÛ¹åÈûÆ÷zË€Çð„ÀçÅ/Ö.jç?ºÇs½ö¹1ä^0ž¿G”aÿ½ ÿü·ŸË)£K]ú2ó”„yyŒ¹ }ƒÛž?úñßóïÁO§Û/ùb~É—×à•(nC¾v'O¯$ºË€<í{-¾€b âS‹Û[§ùôxjKÔ½—«”çשç~‘¿ÇHü‘¶ÿçyIö=r. D ÑÛgT}/£òûØÿÖï=4ç:å4 ¢ÿ>9ɧŠD–Qò}·¹“<÷]Šb@ÔÇ¢)ôy‘ë¹?=`¥`€/q,øNÐÿZ×ó’±ÿ/á‹ ðF7b ìóÅýyûùÓ/»¥œÿšC³wŽÒõ߃ì9Ô¼8¡)˜ž#îœ/®ÜË:ã|ÑHüTGöoÓknÑæì‘Z¼=ÞµuõO?}Ò@ay/6¸þçõøŸý×=eÓ ´s­·—"€CD þÓ¡ ÃSÚsÇçm À×øîÇ?øèCø–}?ÝÞ}é—Ò—à(îÞ˃à÷²Žÿï÷Zš^Ãßö»EÁóßúÄéÚÍuI„—ÿW3æNøèÇóÄHü˜Cñemû½,eÐëjg{/Ú˜Fú·nÿ)$oÇýÒðÿë>ïvýæB€ç‹"à,¹0ýÌSRem€@Ê£0"'qéúõßû¹>„o] ÿŸëú?ã[ pܬ6*ž€°>¾l; ÿßs$~»¦(ÇÞ‹ÚDƒ’îm9ü×7Ú§3Íy„èåýöiÜÀ|h¯þ¯'¯Ì÷ç2ˆ¨×¡m;Ûµœ&L¥izoˬüobý¿$øÿÜ}xC €»7†ØßÊ€t™–ÍÝü50?OÔÎ"îÑA¿ìõî#ñ/‹J¾—"€Ã©ŽÏd„ý%XŸŽ`êþÏQÆìþúõ_Òõ"€º½Þ<&DÇ—¦†1þ?jÀ>:þÓ(X<î2g…ÂÿWóÓú÷©°ÿ1¿xw@p#æµÏ[tºxô$:ï;¤žzÄ߃ÿ89,ËDôéœýw­@ðÿÕ~:Ýž»üϾa_ò­{ðo*ÀmQ܆%ÝžïÌYÕõð¿í>Ô7g¡ð­U¤ñ»¥Áçqrħáÿ:òÿ}GâGëŸÒ(Æ(ç•jž¦.þËwX~÷îÿQPk æ“{Ãð>²z®Ç`¾O¨ÇÕ§´"\?Éü×iãsng›§¢‚ãwÿñ|÷ã|ô!|ë~Rÿ^ û_ëËõ¸_R€¥ø6ÔeäÛßá§(Ÿ‡úgãÿo#þ_g¬¹òs™Ú•Îÿ/ùÿRÏÄãëבö-©ñãSöû4gŽùò¼ÞãÓœ?¡ãT€óýsE%ø¯Q½N¹O˜?ññÚ4@—ÿWûIÄòµÙNöùÒ"€ãÿd>Ê×à›töÿ øP©ÿj}ÿó©¶Z_Y¾ú©hêÖc«g/Oãñëýù±‹{o5ÿìþü··ì÷ÛKwΣX!Ÿ=ŒÿŸ—XÎiýó.òÉqLyýÉóãÇ<Éyy~Ûyùdó{žåÛxê„ÿ_ä'Ó?ñ¿[Œq)ÏýwôÔ~O=€bp#ÿSî#Õ[Cx þÇí64ôŸ:ýÛËôç'|Ô€©sü¥©ðmžüÁ•Ã=6ÍÜHüi@뀯]ï)§úÐ<±àxÌ'Çž×}ËÛ½w÷ÿü^'SÚi®Åèäoãý§’€e2B}åi ù}¾õ̵…ÿ‚þÏö/ã²ÒéZˆÿ5#þ¿í/ À‡J)õ€0Åاا^ æÌ+¥V'ÐÃýÔÿbDýÓëŸ2?Œ’oaî˜NëýËã>nù¸‘ø- áx)f(E­> ]¼ÒeÛû3oýÑžÊåEs˜Ÿs þ—y k!Á[óú_øÓúwüO×jö·éöqUˆ× ÿ¸3 €›0§[s§~ou­J)§±­ ¤ÚqþT:üñSÎ×_³ä‹Vò8?Ækôïw>sp}q¸m Àñœ[ç{ß§~y9£Ó÷šCót˜ð^.sÿ“s<>VG;ôØšLqÏQ­ð¿û³ú·}e·XÿGèè,Ü?¿ÿßž;þ<&À iƒý[¨:Mˆ¨]ÿ)RªÛrù»ôÙÿc¤z>tЯS>h@r¿qÖÜËŽ—#òŸš ðÖ¦;çÈ)MŸÝŒæäãkÌëkÕOfŠÍ¯¼ÿ{»–ÚçÃééÝ—ó:Ž>xî¹·Mð¿øI\vñG”"€æ¥ÅOm{jû5ßà· €ç(nÇ”†§4F£§Übþ¨ãð˽4²þšŸ×¾ð<¢ã¨·ú2órñžE-^Çÿ/¿/:ÿ'ËáMÇû±k¼@™Ìz¦=õËŸÅžùätnúüªÃGW–<8Ÿçߦ4ä‹­ó,§2áÛ#ô_ü4.Gö7g÷¿&ЀY|Žíù]ÞÆ÷îøš¥ò_JÛþÛOªRßRŸS_#Â%€Oéì_õ\æûgïR»ç³çM¯w$oÌ €—=py´Ï¿ÈÙn·T ðž .Ü.áìñ}ýoñ[¥Ã/ÝvmÜÿµ}žú¯kÏS0p§L>\J)r^»ô×…ÒØ:-¢Þî×áëižÐ²çe)€61`¹ÿ*íôéð*‡õáSšÞ«½s,qܱü™;ì¬ùXCò½{ðÐ˦Ïuúç(…ù‰}žÛ~lt €ÛR’ù襩Dåc€6 GÊ[¤´ DÄÿëú¥À ”D½ÝãþC@Ý+>?dO')Ü:î¿O#ˆµûEÐ4X ¦ã\ÜR-ÀäXp­$`œíóÞo¹†—:ûÌï׃†þg_¶tåöS_Ìþ?÷•þðU,ܹ ~Œõïáyš:ÿãä~+˜—XÆí×WKcvÉèÀ_–xâx¥Ói\ ÿÓX`9Šã4ï“… .åV‚ð*¿ÂHü³Õ¾…ˆ3ïž/ÛлxÊñ[t[SÚ…ÿ/òÔØþxâöµçîû€ Àm˜—˜§kçâOãþSŠçS""R PºæËËåœk}:L‹ ”§ç%ö;‹j¯ŸÄüŒÑì;‡ÿã¦ÑÿyºY£Û±ç},tpöÖ7Vð„ç¯çXHátA„éuÞû¬ŸšÚ>JGžÝý´èãpûƒãÝ ý_ãËôÔö¸Ïñ6|5ÀIeÞ ÀSÊ9õB€þs,ȹw]—v‹Èûò²9G¤”—"€Òµ^ïG\-xÅÀ‡ð¿lJ‘ò´÷Iæ›jÑÂÓ!÷Åþi‰¾ŸÙ7JÆ´áZqÃØ}=ßÛˆÿŸ:çñhÏm_•é+sS0ôxYXŸÛžûê½õ§{ƒßnà&õ€4×^ú§¦DŠ”¶šÛï½ ed9»yäþ%pN)R-˜ž1ÌZæw¯Û[ÁÿGØß·¦yïËÕíÛq.áxÐö;Ý”Í6?L?¸‡ð&‡ö:žŠ_Óµ;)æe-Ê–©€àì+÷Ž4ü¿æ©Qíïs…ŸUB¯Ap3æer›•q2`«j®Ýÿ[íÚ/ñíþO[DìÑFê"€\ßk*ˆèAzžCÙ)Ã;.P‡{#È]èá/hIïT•p\>·…¦I­Làz§ümôÄ?µmg\µ¥¢ „˜&äåÞóœ×÷½îÁZnÍ¿Ûs¦Ûs¬|q~¯KÐÿ¤ç‚ÿ³mÇ/àç|hÂ^•àM1ïÙ€ú;åZ RþSDl±ÇÞ—H±ÕZ‚<5ð·"€> ”‡Çøÿ9l~2Ꞃۋ®ÿzìS>·ÿ×B…V|Pßµ&Þí¼óE—ÿeð}Sñÿ”há—Áv{,ÏN‹2Ìç´ÌIXÿ¼‹trc|âiýIóã'פ‡ÿiy~Ûy¹Réì*¡ÿ³^+ˆªzã–gZp'7eLH½ë»¢m @”¸tK[”ˆ¿ý—c‹{ýµ ¼È>ÞdJ–sä°Nñ\YlÛñp ãÑqk µ#FÇûò·žç4&`ÜÈã„sÔî÷ÈuÀ¤Þ/uŸž–N¤t¶kùÜ#¢\ë‹9'¯»–¼ý¹ÒýÿÄþ%Û¯S+ÒT¸R¿ÏcÛáy'ïø5„ÿÏúÚK=ý/Õ‹ßç%ûÀgSÜ´%ìM£KºýÛaÿ=Ê€¨—@¹-Ðn§H9GN½Í¿vÚ÷»‘Nÿó£k7çX8MÛJø_Cí´M¯Äû”ƒœGBʵ`ÅÇ2eŸ6Å`ºVïâ,?o€q±­úx¬vú—o—îpžq˜ð–罎û_ª!þÚê߯ňøÓ(èß‡è­ \–| Áÿ»úÜLøÀ›PÜœË)5üÏ)¶ˆTbþÖå?ÿȵ ¢ÉÓr)bL¨riÿœ¿(ž»Ò»Ú9Díönï:ú}-¨vï Αsªy ½æH½§Ðû†<Š—›Ó5™bñ^!©ýyyþtþý…Û²å3œCÿ·+8vû–rèï~ÿ?_ƒ˜¾­ Æ·!ÍÑ/æÄÃ@p“F@DKCsËsêûD0zþKôß&”-{äØ"·ŸÖýŸs¤T:é—B€æ¤.`9ÆCX;G¾mÌ{¹Ýº¾c9Ÿv¿GØ9à7Ÿm*wRNõái À~¿GÀY÷ÿÚó¿^—ù3;Î 8Œ˜¯{ŸP.FN©ŸoмLxý"€CøŸáïþŸ¿£`ÿ?ŠÊß­V C×å…„ÿ@„àæ•`¾dó£{>¢áí~š ¶8—Û%$ßûøÿ“×\Ãô·Îú)À·PùrøÔ;¸[8Ü™ rŒ ¹®{ß–1(ï‘û䀖þçÜ®Aêûצ¼eÀµ‘øi °{¬FüžÏ« ×Éã¸S 0ι}q ýߤàZø¼?Jz÷ÿq[+IãöññåzÍiy×…Ð8RܬãR©µÃ×PxK¥Ç?réòßÓv²À^á½Åë?©®/ßÇΧD—Wˆ˜Š úÁ­7F·ýmbÁÉ€z¿ÖÔ·‹Ý§Økè¿×,¼á¹wÃ×¢€hSR, ñ–EÏÄOÓuhÛ[è=—¬ÅcºC¬#¦óNc"´ÂY@ÔëûùçYÚq\®!Í“K,aÿ2`«··%öïãÿ§²‰Ë„þÀS7í² –®ñÑ!=Fý·ÎÿºKÙZCóœ÷ó"€hýç-P¾e ¥—ƒ;ÆÿÑÃývÿXPÆÂGDÝñãJ÷Ž-"íµ!ÆûO£ñS ÅsJ‘òTp#ñÛ¶ü÷Ø¿¤Ô‹ú±Ïsžô¢|z÷|>/ˆ¼ Dh¿Ÿ.8 ýûSŸÿÇç›úçµûÿP ÐûþûrË› ü€Ï¢øf´"€ˆ§ˆØò{ÚËy‹H¹N˜"ßÔ‚õ³§=r>–´núQ ‘ÆÔ«uèŸ;Ý{È=á­ë;-Á~Ní(JÉB)hÈ¥`¡î3¦Œ(û4ôÿð‘øS¨©®{¿å½8`:§hŸc{ÉùÄ—"Œ:©a)Ó¢˜Ny.xÁ©ž1ýÑÏil…§æîÿ“B€ßúÃ_|Ùqà›0ŠjOû¡ rÄ–¶èÇ{l%DÎå~ðQ¹®3Ÿk·ý˜ð\v|6ߎ}„Þ1‚æ4FÿG¤Øs]ª ÊB¥`+ç’çÑÿëHü'‹>b$þÜáÞÏÿ2Ÿ÷y¦A´IyݧcèEÑÏ}^ a>ËQ0›ßëä—3ŒCøøLÛyžÿåœçÿÊÙÕxu €oF+H5ÈoEçiu¡?uõ—пEîs!@DÌ{Ö~sŒ¸9çP—¸«Ë”¸?b=Òávä½Ä¯5 SÀ-ŽÄ/··¹`Y  ¼ÿ1}.©žo¹Z{lõ£lç^§´"‡é³Êã0ËíóîúÆi¢Ãÿó/~ãlg€›¥øfô£EÛ%ÃO'…1•DôŽÿ˜ç+ñá8zÀÔßï§Ñ™?=ÞFÜ—÷ûTïœcO¥óê{Ÿn—â€6»á‘ø½û¿ôþOá)ˆe߈ÖÎß®IÊ{”åÚ"ýÜSÔ+shõ_Š6ž8¹ëgÛÎ0þþ¿øÑ2­› IDATKžpS1Çß–vÌ9×þö¶@u€þÇRPbøQ‹z!@ʇiñ×—è¿ë¯’·ûå¶Ö™ßºÓsŠ´µ"„=¶´Õˆ{›f´ð?ÇÖ:á—Ò€¶XÀt˜8ÿ²ó¿Žü[J‘Ò§‹"ñò[ŸÎPÊ>E™{ñ)åØs[`,í[÷Ÿòk!À|]â©OqÇßÿç‚àÛ¥ˆˆø&ÃÿÙ˜Zæ_ÇßÇ4s¿…ÿct|ÿߊZ0>?­>ùøŽ‡÷Ûæp|ÜO}¤};†hzÇ{Dä=¶ô©ÎÊ"%üßcƒÿ~#ñç6Î+F‡ÿÔí¿ÕÿRl¥ ô"ÃåMi„ûµè¡”?ì5ö/SÆ€ã1çåÓ¬ã–eþïþÝÙ ÜÀݸ˜g…}Q€)üoÑüýŸÆn}Ûò^‡|Ý6Âíey€´cÛÊ‚-"r®½íÛ9§Øëˆÿ6>¿uûïõV9šý]Gâ·Í5îÔnÏÝÿ5üßÒñï¶Lû·×íY}šKöHéSì¹”`ï‹6RŽÈµÐ"OÅÿ×?û/9i€ožàîŒi}@ †c„á=áOSðܺÈÓh Û.ßiüNc[ßš–=Jð½•cÛ"G®Ñ—ØûñG]`ôü%Æ"o?¹?ÿKè¹ ÀþoS×ÿ\Ð rô©c&CùÌÚçØºÿ·T–OÈy?/ˆ6É¡üþ{ÿßÿxå,î "bæßøRÍ< `é×OÓpÿ\Ãæšà÷ññuVþ<øþïxøíÇ­mÁ–R‰«sî³úS«œGZoô#=)8/ئ)sAÀÖ Ê$€²|@IìËë·i{ìÓ‡<@´Þþ=r*çT&ì}úAοûÇåâ³x €.ç|—EkqC› ýwëŠO1ÍNgå§³€Ã¦Ã½ÃµÍ¹¼oSú§l~ì;Fý·¼Ò—ŒÄoç;&@¿-wP ZáC9»Qð;ÿäWÎ>$€‡¢x8׊b¹5¥þ§.^õÙ÷ºþÌÔ§ó·ð}Ë[ìi¯‡²E¤\§|ÙHü¹ "©WjL)çQî­Áÿì·àÿdÀ¼ÿV§¤T .¶T ¦1 ÝV;ÿsü¯ÿð¿~öZ<2Àg£ô?Ï­N8;®cQÀ×¼Ösû·ëÙºì[7|+È©ôÀ¥àsGâÇ¡`¼á‹Ž²‡þm)€Ñý?ÿ1Oh]ÿëãÛTÐÎukKÔûiKå˜SŽßúƒ_ø¬ë ðè‹y€ëaÿç¤Ó×ú–ŠÞò½FÁA½öS@ ɷωß'¤‘s00æ<÷ .ýÿiþ{ìþ?vøÏE‡Ç¦ð?EªaŽ2ü?¢®g‘"~ó÷ÿÒ\m€û¦¸°†õùäÖñáã#éÐa>u¹OûÌïs«Åï¡Ô^ø^pÞ¥?Fâ·®þúç“B€ˆ˜÷L5úÏ/,¨A}¹ŸN¦¬£ýSÖíéðåu[qC»ÿÝïÿðë/(ÀƒRDDÂøº­?8îÇ'[›RLeµµ=M>z1À\PfáOE9EÔNþHe9€v=ó\Ð Út€Þý?Š"¢n/ï{,h¤éöúÇI ñw ùû2¯ÑÎ"bÛJÀw?þÁÛ\\€¡˜äÒçùþtû´ãÿòuViŒ´¯×÷‡b€uéG+˜—˜sÿ)“_ÿ²d@ëþ_"Eä¼Ñÿ½û?"¢. põsœúÖí_0RD¤´õ½®ÿãïX: úíFèðz1Âáù¯ÿÒÿŸçèøzˆÜ§öÚeÈý(¨‹Ý·=S^žùˆ…£ ì¥`ºf9êt€þŸ”O¬-)PЦîÿˆ“úþíw/:Hý¸úý)Ð? þÇíþ¼#@D´€¸…þ-%æ9ÖmUc5ßÏc[Ž© ŸÆÝGÛ/"§6`LPÐŒ61¡|,é¤ ¦2€ˆÞñ?®/¸œc9€1` õSݶÿk‘@Ö´¤€ààm("âPKt|9à¢é?î¥å¡²œýƒsÿ;Bþ¾à}/ÃÒNhç™s½Fm-€<_§þÇRÐJ-"å^¼Qê-ÚgÙ¼dzCùÕ?½~õ§àÙ'–âá?À[mºÀÃú‹þ×Êèø–ì×ÿeè]äÇe>8D~”"€&çùj· S‰Æüùä_S¼q ÆxÑÉ?:ýë½Ãg6Ýü¼ðàþŸÿÕ±>|/¨kÎG^ƒæˆ‹åžóVcäËK(ŸOôÏk~üË–oèwÛÚçuü\çbtxŽðà½X\®ã} €¹ ä¾o{¬Þˆ³R€Ïaq}ú#EêÛSY ¥ˆÜ– ¨oÒž—˲-\Î9?T@JÓRmÐ+¬È}§èË)ä¨Ë”mísÈý’å%¨ŸÞiüNcÛü¹.–Ïzüü¼/àýgÿö_[‚ÿ|9ïÓhù1V~YàÔ10^Çù§´õ½RŸz1À²mš0Oèïô@EM¾˜å?b\f´é ý×g8 üÇöù¾Ààc™,ç} þý~¼<Òƒ®Œ‘oÝú¹nM)×0¿vï_üä´Nˆ)¶¹}šP6<Ú$€ˆQô0 ú\„Úü¿NHÑ:ÿ×é|~Ãù–cèñÝøEÇÀëSlÏyô){DJµó„þÓò1ö¿”r¬kÄ·p?b€”¶¾=ÿúï5ñO#ù¯¯Ý¢îG,ˆX§”b€¹K?÷9þã‘Éé˜Îj–MB€Û¤ØÞ'ìSàßFÿO“æÀ?/eO*èëèÿ¶Àýóýû¶8”lç/žKž¼ ¹V Ë­éS›&õ¾} àíû÷Kç/È9æÉc @¹ýc¯©†õ½û¿l—…‘#å[Úb-RìeŸº­5¶ç© Žxø"€æì‹¸/ àõ 5옂ÿyY€úÈØ§Fûù™B€4zþs´UêG1@éøÏ'…[ý[ïÿ˜°×b€-oKÀ˜0Š®pMî›x`9ï±×€v þ¡žÇþ·%®¼xŠHµã¼ŒèÞãߊÆ€V°Õû±úe.@Ù¹¤½´årjEÌ~ý÷~w Øž[ð¿.0ÿe@ýÛ_!/ºÈ÷Ø¿…ÿ¹þÅk!@Ž”¶ØRÄ>Eùm@™ 0æä”Ç{§ˆ4˜ øx4 à• ¿N8)hûœ_g–rÆ_—ÿœk@*]þù´  =c«³"Z À{ªEy‹=öØÒVß*õ©Š„ÿH<°=ï—cÿ—€v;b„ùk×ÿ1üoÛzÿ~ª;ç4=’ë‡p>EDÞ{÷ëüÈK´ûGôB…v?úí=‹ààq)€v­û?òü—mõ9ÿeÀ²õby€R #"µÛ)EÊó€÷ïýoQfìÓ"[Y œL©è™]jà¦ÿ›x`áÞK^ß jð?‡þs1@Ûò¬9ïúyNëëÛ4 õÿ§2ú¿¿Ð[;¶È‘[9@Ú#ÇVÿS9‡X @è@£ØÿË\ÿm@½½¾ÊI—ÿáî´KJõvkÜO9RNõøGÚúí½ý“šRP ú‘¥T_<ÝÍB~^B<°µûtýç þsViÛ…)¦÷]Š¢/õ±˜³ý¤½Nxj @{‘q<ï½ €à€÷¢ØÿÛR'á^þ§Cÿuϱ×T Ð RÛ–E)¥^Ú1¦C@ëúb @{n¤4½ù­,¯kûè>ÖKÃÿi¯/y—ú³¼ñ²´@î÷G·<0üÇÿb¯·÷±_;ì<— |ÁÒ¯@÷?ïÉxxù4쿸ÿ* z®ãÿÛÝyÀ|¿tê÷?§Hil;ÛòÓ$€þíÖû, øà#˜¬wÝÏÝ÷õ~ßgúýJïzeÀz,ó€9Öe@+¨{ä½{Ÿj0OXÏè­ÿø(&ÀCËËïcØÿúáÿxåeÀү߶Þ=×ÇëÄ€6ê?§6ï?GN#ö¯JÿP‡¼ Á?M<°c·ÿØø–áÿx£öƒùº@äˆÔSü¹H ×ejð_—詌 £¨ ËëTü¸5 €ˆ8 üßvTþxÔo¯SÎ÷Ïy”à¿ÿr»Oˆ“ _7@èÀ-Û>ú€tû¿þy§#¸¼1Ž)¯?y~ü8Á Gr^žßv^ÊŽ“ž!üàÖ™ìê¸ÿ÷.8™P;úÓÒ²?wò·ñþ±†üi üç%æ÷yÉ¡?߀â=3ÿkž:†|íNŽÈ¹—”-cJÀ±óÿ¥„ÿ|kL€vÙùÿ1u—ýøÓ$€“½s¤H9G¤±ðÂæþ«ÿ|«L€õïþ¹¿på‘*¸¶½ ùÏÏï>M¸º¤Á-L:€7`< ïÏýÅÈùHÂÝü9r¤œN;üó•yë,öèå èüà[g<¸³Øücå›:øV(€óïÿ+ÿùGÂÍÑýÀ=P.M¿oCz×£þp/À£º¥Ìÿšt¼›®w:-eH‡r‚tù¢p'ÀÃIñtþùSÇRþ[‚ü«‡8Ÿ×1øî¹ðmû™>à㤈Èõ÷ºíýã¸åzN_K£ã?ÕíïK|÷ã|ÞAÀ3(n¡3þ©cH×Ô&´¢€©€àdÕ€ï~üïÇ)öú;j9@Ió÷ñ¤\ÊuØ êó´KÝÔ–˜‹Z§ÿ¼¥,%ЃÿX;ÿ€—Sw¬Œþ/A~D‰ù·þï-üïË´Û)RΑSoó/5S@: üÒr3-Sð©¼gD þ“Îø àNý§ÿÖÿ9ï-bÖí¿×[¥,`Z }ºœFÚ?‡þ/jÎO‡{cl@û#µÛs÷¿Îø" àN•`}‹O)Åž÷Úó_¢ÿ6  lÙ#ǹý´îÿœ#¥:;`.hNê.Þ¿ÜXïÏÁÿÅèÿûŸþõW»ðHÀJ)Õñý9R*Ñ þKð^n—€ïãÿ/^%"r¤ò*Q^°þ‚ý|(¸ìâOu úÈÔéß þΟüê«;<"p§¶Tzü#o‘"Ç^‹ÖEöìï‘#Æ€é'刜jÌŸS Ðþü§|üÓz£ý>+0ö^‡¸SóXýœsõß:ÿ#¢wÿo)"ç9ïçEQ' Ôß©>;G™2pšß§cü§ÿ)¥øÝ?þ«oy)à!(€;•RŠOñ©LˆˆÈ[DÊu À(ˆ”#çèQN{ä|,ˆþb€ˆ)çóðDù3…þížà^—¸W©í[Þ"§< j Àѧ”Þþ=r*cþsäQP âP PÞãÅÓCÿ¶€±ÿðºÀJuŠˆÈ[ÚF {ì±ÅV—ȱ÷ÿ…Qž9GNQþFyÑüì1ô#é ‘Rüÿä¿«Ó€‡¥îÔ¶•Àÿ¼Ñ~«ÿ£«¿„þù¤ "æ=Sþó RKDªS€×¦îT ßëÌþˆœ"j'¤½ï“£,0wû—I©O ˆÃRQ·—÷:–ôñþ˨ÿ2úÿoý£_~ËÓ€‡¥îVZrÿ)“_ÿˆ©wÿ¯?‘"rÞÇèÿÞýQ—¸:`ôýGŠøßÿßÿî-Ož¸s)R-(U£ EäþŸ”°?Õ%J1ÀÔý1 .Þ³þîEÆþÀ[Sw*Õþs@0"r_ r:)ˆ© ¢wüç~/^’ë§HñÛôK¯znÀ%pÇR* }Î¥“¿¯P§´5JøK!@)ȵ ¤²Àèú¿¾Àÿöÿ›7;7`¥À˜Zæ_š÷k@DLኔsä4Æÿ·b€ZN°<­>ùøŽox6Àð .¦ÄY!@_` ÿS}xŒþOc·¾my¯Hñ?ÿƒÿò Ï8RfLèó"§4 ÊNÑ«rôÉQ "—âb4¿õ‡¿øgÌÀš§Äß§i¸®3êd€¾@.ûÈ߸¸ àýðgô¢ýÖB€ˆQ kóÿ: Eô‚€UàcVò¾u/ ÿ¯Å}ËÉ­ãÃå‘ýþÏÕ{_Î`ѦDŒ%úcã‘X7¦øîÇ?|ûƒ®2îÈ×vÿ¿ÄqBÀw?þÁ›¿'ð<€Ï2Oøõßû¹<`¦øl‚¸=ÛGðõŸE÷?Ü&K/"ø€ÛfÜ€'éü€oƒ pWéþ€o‡%€ ‚øö(þp,Nø÷ÁxP‚¸/&ÀþÀý1îÄöGÏî#ø€ûeÜð tÿÀ}³Ü9Á?<àüðgôч|0ð{*ü×ýCÜ)á?<p~æ£x=ºþàq™wBø-EDþèƒ¾Ž pÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPwàg>úàQüÿÎÿ)¥H‘â»ÿð£¸3&ÀPw EDþèƒ¾Ž pÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ÜpÀPw@ðÿ·wwÛ‰ë@@˄̼ÿÓÎéîÏEPŠlLø3ÅÞk騨†pú‚®Osê>'#IDAT% H@€ H@€ H`ûè7üÊXíCsX¯É¿°~''÷oîñ.€›u€õ:5óÿû¼¬ÏÒ¿¬Ô\ñÿGá¿<€u8gÖÿØ€u#b¨öÛÙÿGdž8 n§W·ÿÑâ¿CDì¢ è·SÏâ_z}û¸mùÿY=þÀm´-ûÛ @¯Øß{¶ýÿn¿¿«Îíà>¦‚õ¹±9Ö»f+74Äô¬þSÚ‚Äqá¿cDì¦þpSuùÞc³_Šü? ÿ»ˆøà.–LΟ+þ÷fýDÄgõøS£ Ô€¶Åÿgfû—ÂÿÇ~ì"âCnëÔ¥à?ÆÏÙÿŸÕ¶.üVÛ¡DÄá¦ÛðÐw¼¢ºõý¸Wü¯ ÿñUøÿ>&À+:µö&À­3£nÿ_ þuËÿñ7š€™--ô›ù<ÒTñ¿”Vÿ;ûBžÐµfï+ú4VÛ2>ã8Pfü—‚öÇþVX­[´éWôîmlö‡8.þ»j[Ïú¯Ûþ—YÿuàO9&À=Ý¢¨¿„Â?ðío !~vÕ±Rü/þÅñìÿ¿ûñ§Ùÿ/"þ p *ô×ý€µ™ú­T·ý¯;ŒÑŸý_ÿí‡,²†bþ þÀš´¿¥Ú™ÿc³_ø¨Æç~ÔÅÿ²ÿ'"þPâx9€ø_ÅÿñOà>÷¯Cñxç.PÏf´Åÿ¿qXàûœÀu)ôߎâ?ðlJ`î·âÜR¥õõ²%ð½D€À´^»yþÇPü2©[––ÿuûÿ±9W/Pö?«c–˜16[Cáxfå7å0±?u]=vÍuq(þ—€À¿ˆØ ü¤è¹úßð·E|ÅxmõMp€ŒzßwvÕã:˜¾kFy^97†%~Püÿ©÷orª §`\¢· À3›ý1¦~ÆqñˆãÙþõë|VÇu¨(þ9õïp«¢œbPø<²*³öÛYþõ~}n×kÏoê×^M[Üî­½˜Éofï××õþ½®I‘¸Æ’!k4÷[sÉïÐ!Ž—µ-ÿ‡jŒr:§ ÿlÅÿsÚb·7‰Î)ü×û—®Ã}×ò¸$˜ð¬Êï¢^ø±ü^ªãíþ_³ýßâg÷€ïkžË9E²^‹È[ÿÍ©ç*î ÿÓJ8 ý~4ÄÏßv›ý~ löcÜ@.Ï6£?3…=`ŒŸ3Ý ŸÀ+ê…¤{ß‹J¡¿žýßQ]ó¦É£ŠÿmûÅW§¨Ì}úŒ^ÁÔ÷¡©ãõÌþv €Rìš±ÛoßöÃ@ ÿ×7U ;õÿª°ÌÝÔxC,û­Økñ_¶S…ÿRð¯ÏoBX±GÕë›/Sm«§ZZ¯ÅÒ›MSÏ]òºíßPÜ´úø2Šã¸Ðß>îzÿ÷ˆø»?!¬Ô- ëS³ö{ª%×üöï-yÞ¥üöý.}rÎ5 {@„Â?ÀRc³øYü/£ûK¿J`»ßÇ€µ¹fñÿTû¹âÔÔÌö¥ïï’ÂW¯€¿;*P¨~Cáà|½ßfõw¨ºí(…þrÍØ\3 Ù,Y»þ7…ÿöØÒBúofþÿÖ¹³÷—!Z×µK‰ø^Qý]hŒC!?âg»ÿz”0@½À&"¶ÀšÜzvý’pÀ’¿qNñki àÔÿS{cèœçν&À§>ŸSü_òºÏêÔ²níùÞ2?»”À[sî-"6À=-] K_ûÅôsß[}£H¸¥K ÿíg¾b?Àá{Q xϺÝ»À÷¬ÿ8àÚæf§¯µX}N êk;¿ôùký·^GïshªÈªø_w8ñù¼‚:Ð;W¶½ÖÿoÇ-\ݳnÎ…ÿÛ"եϸ§k.;rÊØl}FÏnI¤6ÙÎþo×íÿë­%.ð¨™ÿtëÏ.Ÿ@6ç,…Ô~*mÿëmÄqg€mýx0mh¶œçœŽs½1µ @yÝïÇœ¢øp]mkÿúñ&Ž‹û½0@Û`ˆˆ7®aikÛ[¿ÀÚœúŽÓ†"Ž ýe”YÿmG€mD¼‡ÜÅ\W¥¡³ßû#ŽgýoÚkX K ¯¤mý?õ¸.øGsì­zŽpG§B½0À¦3êÀ&"†í-Þ-/£·¦í0q|Š™ÿÀ+ª ücüüNTÏôo; q(ü¸¦¥ÅE€csß¡~ÌöŸK \Ã9ý¡ÙПå_w(3ýß"bÛ‹à Úöµs×)úL·ûo‹þoq\è¯G |wØÞãÖ’‚þÜ5ýeØ4Ǻtàšz³Ù˜WwTªgÿ×3þÛ¢9¿Ýï‡Ü‚Â?ÀüòHE]ü/ãmÿÜöX="6±Õ€kSüè;µ4R™ÝßëuØÆaöÿ6à®zK& ͹¶Ý½,À{Šÿõð C³?(mÿë @ ¼—Çð8u›ÿhö7ñUܯ‹þeû¾e_x€v¶«.þoªcåxÿ_˼ Àc Ͷ(Eþ²_/°­FiÿÿïÛ[¿[à¤v€ö\™ý_ï×ÝàF†ˆ^S®ÛT7±‹¯ÙþcwxˆˆøÜÜW™á?vŽ•ý]fù—ý·8vñØÅW@X^Ûÿ²-…ÿ·øšíÿÖŒÿ‰ˆQnciûÿúqÄaÆÿg–ØìÏ•Ùÿe[ÆÇ&€[hgõ/½®žý_–ØÆa€·êØû~û¿:Àã”.õ¶oƒe»Cç€Ïø ìàvÚ6ÿç<¯6qX ,ð¶ßÿ^ @«ýß6ÕvŒ¯âÄWáÿ»€ÜÖ’.õ5C³-û›êšRüöû£¬K¯#@x«Î¿GÄ ·wª @{nè\3Ä!P–ØÄ~¸¶¨?.87µ ÀØ\'+S·ÿ¯ ÕñÍ~[:XdjY€öøPm‡ê|é0DÄç©5€ûhë÷m«ÿv|Öû:À:õ–¨•ev1 ÀúõÂõÒoð†™ýÝ?×£WÃã«È?Vçëíã¦óDà1Nµú:×m"bÐÖkª#ÀØ^#ë¶$–€çT/  ¬Ü\]ÿûœ°nG3ý§Àóúlù.€‹ å?skë1ÆÏåÆKÀ3i‹ÿG't€'§$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @À3ý`m€g36[ €ç¢è†ð…X¿¹û˜ÃÝÞ¬˜ÀÚ™Ä k¦ø Y¸µß´ï?÷¾¥exyÛG¿ µs ù&+À€GRô€+±p-c<öž£exiÀ¥®q±„.%À˲pŽ%ÅþrÍ0ñ¸k‹õ× ÀKÚ<ú OaŒóŠÿ½çŒkzÏyOÀž%€9çÜ?œº¶×à”¹k{gh¶ðr€)×,þ·Ê½É¹‚}ïÜÜ{ॠS–Þ;ì]wÎ}ÇR°¯;ŒqX´}­¥~A^ŠÐºÕÌÿúØÐÙŸ:ßs­å ÍéK€3ÄeEó¥Æj{îD¥sC &BžÐZZ0_Rèo_«.úÿ6d`F?t­%öSÅÿsºô:œ³„Àù–÷‡‰cís®Ñˆˆí£ßðT–, 0w] ØÄ¡è?Vç{¯1„€ÌzÚÂüœöš©çÔEþs^X@˜Ò+Î/)Ü·íÿ‡Î¾Â?\Yo.àµýæžáØl§Zù—ǽ@ï~e¯íÿÜR– àeé¿,45Ûji€¶H¿´«ÀoÎÀËЈ¸lÖïø\ ¾/yêeé 0GB^ݵî¶]ÆÎ¹¶P*Ð{N„pì€Sç§ øK ûÛG¿`U.4tNá¿ü½©÷±ä¸ N°·yôVç73êÇýXÚ²ˆéû“çü}³ÿ`ÏÀ”[.Ð+Ü/ (øÀK÷°´3À¥¯/K`Îܬü[Ü[,kìfè̹Wñ½ý;½ 0Cà׸¿h†?\À5õŠùS!…¸"€{¨ïC*üÀ @›G¿àr€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ @€$ðÿœ#·Ü‹BjIEND®B`‚pyepl-1.1.0+git12-g365f8e3/code/resources/vera.ttf000066400000000000000000002006141127617341700213500ustar00rootroot00000000000000OS/2´_ôcëpVPCLTÑŠ^—ëÈ6cmap¤Ãè ±lXcvt ÿÓ9üüfpgmç´ñÄ&`‹gaspH glyf tAÏ&ìŠ~hdmx4ð!ìHheadÝ„¢ÐT6hheaEoëL$hmtx ÆŽ²´Ä0kernÜRÕ™½ -ŠlocaóËÒ=»„maxpG:ë, nameټȵßpost´Z/»¸ôŽprep;ñ øh::_:: dM0­l  ƒ p t › &   Y &  &   c . 5 ` õ s 0¡ & {Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera SansBitstreamVeraSans-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.comCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved.Bitstream Vera SansBitstreamVeraSans-RomanRelease 1.10Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.http://www.bitstream.com5¸ËËÁªœ¦¸fqË ²…u¸Ãˉ-˦ðÓª‡ËªJ3ËÙôT´œ99N´R¸çÍ7sÍ`s3¢V¦V9Åɸßsºé3¼Dßͪåªˤ{¸o{RÇÍššoËÍžÓðºƒÕ˜HžÕÁËöƒT3fÓǤ͚sÕ þ+¤´œbœ-ÕÕÕð{T¤¸#Ӹ˦Ãì“ Ó\qÛ…#¨H99`Õš#fy```{œw`ªé`b{Å{´RÍf¼fwÍ;…‰{ÍJ/œœ}oo5jo{®²-–{öƒT7öœáföÍD)fîs¸€@ÿûþúù%ø2÷–öõþôþó%òñ–ð%ïŠAïþî–í–ìúëúêþé:èBçþæ2åäSå–äŠAäSãâ/ãúâ/áþàþß2ÞÝ–ÜþÛÚ}Ù»ØþÖŠAÖ}ÕÔGÕ}ÔGÓÒÓþÒÑþÐþÏþÎþÍ–ÌËÌþËÊ2ÉþÆ…ÆÅÄþÃþÂþÁþÀþ¿þ¾þ½þ¼þ»þº¹†%¹þ¸·»¸þ·¶]·»·€¶µ%¶]@ÿ¶@µ%´þ³–²þ±þ°þ¯þ®d­¬«%¬d«ª«%ª©ŠA©ú¨þ§þ¦þ¥¤þ£¢£2¢¡d ŠA –Ÿþž žþ œ›œd›š›š™ ˜þ—– —þ– •ŠA•–”“”(“’ú‘»‘þ]»€Ž%]@Ž%þŒ‹.Œþ‹.І%ŠA‰ˆ ‰ˆ ‡†%‡d†…†%…„þƒ‚ƒþ‚þ€þþ@ÿ~}}~þ}}|d{T{%zþyþxw v uþtúsúrúqúpþoþnþl!kþjBjSiþh}gBfþeþdþcþbþa:`ú^ ]þ[þZþYX YúX WW2VþUTUBTSSRQJQþP OþNMNþMLþKJKþJIJI IH GþF–E–DþC-CúB»AK@þ?þ>=>=<=<; <@ÿ; :þ9þ878ú76765 65 43 21 2þ1 0/ 0 / .- .- ,2+*%+d*)*%)('%(A'%&% &% $þ#þ"!! dú d BþúBBþdþþþþBþ-B}dþ  þ   þ  þ-þdþ@-þ-þ¸d…++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¶, °%Id°@QX ÈY!-,°%Id°@QX ÈY!-,  °P° y ¸ÿÿPXY°°%°%#á °P° y ¸ÿÿPXY°°%á-,KPX °ýEDY!-,°%E`D-,KSX°%°%EDY!!-,ED-fþ–f¤@ ûû/ÄÔì1ÔìÔì0!%!!füsüåþ–øòr)5Õ @@ƒ ü<ì2991/äüÌ0K° TX½ @ ÿÀ878Y¶ P ]%3#3#5ËËË¢þþÕýqþ›eŪéÕM@„üüÜì1ô<ì20K°TK°T[X½@ÿÀ878Y@0 @ P ` p   ¿ ]#!#oª$ªÕýÕ+ýÕ+ž¾`@1 ‡  ‡   üÌ91/<Ô<<ü<<Ô<<Ä2ì220@   ]!! !3!!!!#!#!5!!5!þÝT%Dh$i g8þ¡R>þ›h gþÛg¡hþÅ`Tþ¾if…þ²‡þaŸþašþ²™þbžþbž™NšŸªþÓm!(/Õ@U" '&( /)/))/B" ) *!††#Љ*Љ- ) " & 0ü<ìô<ü<ôäì1/äìÄÔäì2Äîî99990KSXíí9í9íY"K° TX½0@00ÿÀ878YK° TK°T[K°T[X½0ÿÀ00@878Y#.'5.546753.'>54&´diÒjfÑoÝÉÚÌd]®SS¯\ãÖãÖdtzqá{þÓ---´@AÈ$¬–£¼ëè¯*.þU#´œ©Ãš jXV`ÕþOnZXhqÿã)ð #'3•@6$%&%&'$'B’ ’.’$’ &Œ($‘4'!%   ! + 1 4üÄìôìîöî991ä2ô<äìîöîî0KSXííY"K° TK° T[K° T[K°T[K°T[K° T[X½4@44ÿÀ878Y"32654&'2#"&546"32654&%3#2#"&546ÑWccWUccUžº» º»ü—VcbWWcd1 üZ ž¼»ŸŸ¹º‘”„‚••‚ƒ•Ü»»ÛÛ»¼Ûa•‚„””„–ùó Û»½ÚÛ¼ºÜÿãþð 0Í@–  † †  † †††  !         B  (('•+•'”$‘Œ .  .'.'!!1üìÄÔÔìÆî99999991/ÆäöæîîÆ9990KSXíí9í9í9í9í9íí9í9ííí9Y"²2]@² " ) **&:4D ^YZ UZZY0g{›š™—• “••"™-  ' (   2'') #**(/2; 49?2J LKFO2VZ Y UY\_2j i`2uy z““—•œœŸš › š 2 2°29]]3267 >73#'#"5467.54632.#"ò[UÔ _¦Iþ{ü;Bº h]ühäƒñþΆ†02Þ¸S¥UWžDiƒ;#Q¡X’Â?@ýøYËr„þþ~þã“YW×€ác?}<¢Å$$¶/1oX3gŪoÕB@ „üì1ôì0K°TK°T[X½@ÿÀ878Y@ @P`p ]#oªÕýÕ+°þò{ O@˜—  Üä2ì991üì0K°TX½@ÿÀ878YK°TX½ÿÀ@878Y#&547{†‚ƒ… –•”—æþ>ççþ;åëÆàßÄì¤þòo @˜— Ü<ôì991üì03#654¤ –••– …ƒƒìþ<ßàþ:ëåÅççÂ=JÃðN@,  ™ ™ ‘    Ô<ä2Ü<ä2991ôÔ<ì2Äì2990%#'%%73%Ãþ™g:þ°rþ°:gþ™:PrPßÂÃbËþ‡yËbÃÂcËyþ‡ËÙÛ #@ œ  Üü<ü<ì1/Ô<ü<Ä0!!#!5!®-ýÓ¨ýÓ-ýÓªýÓ-ª-žÿÃþ@ žƒüìÔÌ1üì073#ðÓ¤Rþ¬þÀ@d߃¶œÜÌ1Ôì0!!dý僤ۮþ·ƒüì1/ì073#ÛÓÓþþÿB²Õ-@BŸ/Ä991ôì0KSXííY"3#ªýøªÕùm‡ÿãð #@   ‘Œ üìôì1äôìî0"32'2#"‹œœû þ÷ûûþ÷ PþÍþÌþÍþÍ3343 þsþ†þ‡þsyzáZÕ K@B     ÔìÄüì1/ì2ôìÔì0KSXY"K°TX½ ÿÀ @878Y´]7!5%3!!þJþ™eÊJü¤ªsH¸HúÕª–Jð¥@'B¡”  ‘   üÄÔìÀÀ91/ì2ôìôì0KSXíí9Y"K°TK°T[K°T[X½@ÿÀ878Y@2UVVzzv‡tvust‚†‚‚‚¨¨]]%!!567>54&#"5>32‰ÁüLs3aM§†_ÓxzÔXèE[þôªªªw‘:m—Iw–BCÌ12èÂ\¥pþëœÿãsð({@. † †     “  “#‘Œ£)&  )üÄÄÔìôì991ìäôäìæîîîî90K°TK°T[X½)@))ÿÀ878Y@ daa d!]!"&'532654&+532654&#"5>32?‘£þÐþè^ÇjTÈm¾Ç¹¥®¶•ž£˜S¾rsÉYæ Ž%ÄÝò%%Ã12–„•¦wps{$&´ Ѳ|«d¤Õ Œ@   B     ÜÔ<Äì291/äÔ<ì290KSXÉÉY"K° TK° T[X½@ÿÀ878Y@* *HYiwŠ+&+6NO O Vfuz… ]] !33##!5þþ5þÕÕÉý^%üãÍü3¨þ `ÞÿãdÕu@#†  ‰   Œ¤  üÄÔìÄî1ääôìæîþÄî90K°TK°T[X½@ÿÀ878YK°TX½ÿÀ@878Y!!>32!"&'532654&#"Ýý ,X,ú$þÔþï^ÃhZÀk­ÊÊ­Q¡TÕªþ’þîêñþõ Ë10¶œœ¶$&ÿã–ð $X@$ †   ¥  ‰"‘Œ% " !%üììôìä1äôäüäîîî90@ËËÍÍÍËˤ²]]"32654&.#">32# !2¤ˆŸŸˆˆŸŸ L›LÈÓ;²káþðâþýþîPL›;º¢¡»»¡¢ºy¸$&þòþïW]þïëæþêyb¥¨hÕc@B üÌÄ991/ôì0KSXííY"K°TX½@ÿÀ878Y@X9Hg°°]]!#!¨ÀýâÓþý3ÕVú+‹ÿã‹ð #/C@%  ' - ‘Œ'£0 $*$ !0üÄìôÄìîî991ìäôìîî990"32654&%&&54632#"$54632654&#"‹¥¥¦¥þ¥‚‘ÿÞßþ‘’£þ÷÷÷þ÷¤H‘ƒ‚““‚ƒ‘Åš‡‡š›†‡šV ²€³Ðг€² "ÆÙèèÙÆat‚‚tt‚‚ÿã‡ð$X@#†  ¥ ‰ ‘Œ%!"" %üìäôìì1äôìæþõîî90@ÄÂÀÀÀÂμé]]7532#"543 !"&2654&#"áLœKÈÓ:²làþûâþ±þåLœ>ˆŸŸˆˆŸŸ¸$& V\ëæþsþ†þŸþ[—º¢¡»»¡¢ºðÃ#@ƒ¦ƒü<ì21/ìôì073#3#ðÓÓÓÓþþ#þžÿÃ# %@ƒžƒ¦  ü<ì2ÔÌ1äüìî03#3#ðÓÓÓ¤R#þýÙ¬þÀ@Ù^Û¦M@*œœœœB¨§$#üì291ôì90KSXííííY" 5Ûûøúþðþ‘þ“¶ѦÑÙ`Û¢@ œœ#ü<Ä21ÔìÔì0!!!!Ùúþúþ¢¨ðªÙ^Û¦O@+œœœœB¨§$#ü<ì91ôì90KSXííííY"55Ùúþð¶þ/¦þ/¶m“°ð$p@+$  †ˆ•‘ƒ   &%ÜÄüìÔìî99991/îöþôîÍ9990K° TX½%@%%ÿÀ878Y¶y z z ]%3##546?>54&#"5>32‡ËËÅ¿8ZZ93ƒlO³a^Ág¸ßHZX/'þþ‘še‚VY5^1YnFC¼98ŸL‰VV/5<4‡þœq¢ L•@2  ©©L43¬0©7¬$©7CM34( (+(I+*(I,=MÜìüìþýþ<Æî991ÔÄüìþíÔÆÅî2Äî990K° TK° T[K°T[K°T[K°T[X½MÿÀMM@878Y@ NN/N?N]32654&#"#"&5463253>54&'&$#"3267#"$'&5476$32úŽ|{zy!<›g¬×Ø«gœ;’¥?@hþÕ°{â`±smiùhZ}þÙ˜¹þ¸€€†ˆ~R½Ôk{KOþÂþè£¤ŽŒ¥¤þHMIùÈÈúKLƒý ß±k¼Pƒ‹A@fþµÁŸþêjhmWQoagƒ}}I½¶J}‡® bæ{þùþÐhÕ º@A       B•    ÔÄ91/<äÔì90KSXííííííííY"² ]@:XvpŒ VXP ghxv|rwx‡ˆ€ ˜™–]] !3#!#¼þî%þ{å9Òˆý_ˆÕý®ú+þÉìÕ C@#• •• ­ . !üì2üìÔì9991/ììôìî90²"]!2654&#!2654&#%!2#!“D££þ¼+”‘‘”þ çú€|•¥þðûýèÉý݇‹Œ…fþ>orqp¦À±‰¢ ˘ÈÚsÿã'ð6@ ¡® •¡®•‘Œ 0üì2ì1äôìôìîöî0´].# !267# !2'fç‚ÿþð‚çfjí„þ­þz†S†íbÕ_^þÇþØþÙþÇ^_ÓHHŸghŸGɰÕ.@• •  2 üìôì99991/ìôì0²`]3 !%! )“ô5þáþËþBŸ²–þhþPþa/ûw.,¦þ—þ€þ~þ–É‹Õ .@•••­   üì2ÔÄÄ1/ììôìî0² ]!!!!!!ɰýÇý9øü>ÕªþFªýãªÉ#Õ )@••­ üì2ÔÄ1/ìôìî0² ]!!!!#ÉZýpPý°ÊÕªþHªý7sÿã‹ð9@ ••¡®•‘Œ43 üìüäüÄ1äôìôìþÔî990%!5!# !2&&# !26Ãþ¶uþæ þ¢þu‹^’opü‹þîþík¨Õ‘¦ýSU™mn™HF×_`þÎþÑþÒþÎ%É;Õ ,@•­ 8  üì2üì21/<ä2üì0²P ]3!3#!#ÉÊÞÊÊý"ÊÕýœdú+Çý9É“Õ9·¯üì1/ì0K°TX½ÿÀ@878Y@ 0@P`Ÿ]3#ÉÊÊÕú+ÿ–þf“Õ M@ •° 9 üìä991äüì990K°TX½ ÿÀ @878Y@ 0 @ P ` Ÿ ]3+53265ÉÊÍãM?†nÕú“þòôª–ÂÉjÕ ï@(B¯  üì2ÔÄ91/<ì290KSXííííY"²]@’ ((764GFCUgvwƒˆ”›ç    (+*66650 A@E@@@ b`hgwp ‹‹Ž š¶µÅÅ×Öèéèê÷øù,]q]q3! !#ÉÊžýþöý3ÊÕý‰wýHüãÏý1ÉjÕ%@ •:üìì1/äì0@ 0P€€]3!!ÉÊ×ü_ÕúÕªÉÕ ¿@4  B ¯   >  üìüì91/<Äì290KSXííííY"²p]@V   && & 45 i|{y €‚‚  #,'( 4<VY ej vy •›]]! !###É-}-ÅþËþÄÕüøú+üúáÉ3Õ y@B¯6 üìüì991/<ì2990KSXííY"² ]@068HGif€ FIWXeiy…Š•šŸ ]]!3!#É–ÄþðýjÄÕûáú+áûsÿãÙð #@•• ‘Œ 3üìüì1äôìî0"32' ! 'ÜþýÜÜþÿÜ:xþˆþÆþÅþ‡yLþ¸þåþæþ¸HH¤þ[þžþŸþ[¤bb¥ÉÕ:@••   ? üì2üì91/ôìÔì0@ ?_¯]32654&#%!2+#“þššþ8ÈûþÿûþÊ/ýÏ’‡†’¦ãÛÝâý¨sþøÙð R@*  B ••‘Œ    3üìüì9991Ääôìî990KSXíí9Y""32#'# ! 'ÜþýÜÜþÿ? ôÝ!#þÅþ‡y;:xÑLþ¸þåþæþ¸HHúÏþÝï¥ab¥þ[þžþüþŽÉTÕ±@5  B• •   ?  üì2üÄì99991/<ôìÔì9990KSXíí9Y"²@]@Bz%%%&'&&& 66FFhuuwˆˆ˜˜]]#.+#! 32654&#A{>ÍÙ¿J‹xÜÊÈüƒý‰þ’••’¼~þh–bý‰ÕÖØºOýƒ…‡ÿã¢ð'~@<    B ¡”••”%‘Œ( "-"(ÜÄìüìä99991äôäìîöîÆ90KSXí9í9Y"²)]¶)/)O)].#"!"&'532654&/.54$32HsÌ_¥³w¦zâ×þÝþçjï€{ìr­¼‡š{âÊõiÚ¤Å76€vce+Ù¶Ùà0/ÐEFˆ~n|-À«Æä&ÿúéÕJ@•@@Ôäüä1/ôì20K° TX½@ÿÀ878Y@  @ p Ÿ ]!!#!ïýîËýîÕªúÕ+²ÿã)ÕK@ •Œ  8Aüìüì1ä2ôì99990K°TX½@ÿÀ878Y¶Ÿ]332653! ²Ë®Ã®ËþßþæþåþßÕüuðÓÓð‹ü\þÜþÖ*$hÕ·@'B¯ÔÄ91/ì290KSXííííY"²P]@b*GGZ}ƒ *&&))% 833<<7HEEIIGYVfiizvvyyu€˜—)]]!3 3JýÆÓÙÚÒýÇÕûéú+D¦Õ {@I      B ¯    ÔÌ91/<ì2290KSXííííííííY"²]@ò  ($ >>4 0 LMB @ Yjkg ` {|€ –•     !   # $ %  <:5306 9 ? 0FFJ@E@BBB@@ D M @@XVY Pfgab```d d d wv{xwtyywpx  †‡ˆ‰… Š —Ÿ¯[]]3 3 3# #DÌ:9ã:9Íþ‰þþÅþÂþÕûîûîú+úð=;Õ ]@F      B ¯   ÔÄÜÄ91/<ì290KSXííííííííY"K° TK° T[K°T[X½ ÿÀ @878Y@¸ '' 486 KX[fkww †€‡‹… ”—–     &()&(' ) 54<;:;4 4 8 ? H O X _ eejjhiil l xyyx}  x €€ƒˆ…„ƒ ”——•“ Ÿ ¯ @]]3 3 # #ÙsuÙþ Ùþ\þYÚÕýÕ+ý3üø{ý…ÿüçÕ”@(B¯@@ Ôäüä91/ì290KSXííííY"² ]@<5000F@@@QQQe„“ &)78@ ghxp Ÿ ]]3 3#Ùž›ÙýðËÕýšfüòý9Ç\Õ ›@B••B ÜÄÔä991/ìôì0KSXííY"K° TK° T[X½ @ ÿÀ878Y@@ )&8HGH    / 59? GJO UYfio wx Ÿ ]]!!!5!s•üPÇû=°ügÕšûoªš‘°þòXS@©²©±CÜüÌ21üìôì0K° TX½ÿÀ@878YK°TK°T[X½@ÿÀ878Y!#3!°¨ððþXùüÿB²Õ-@BŸ/Ä991ôì0KSXííY"#ªªýøÕùm“Çþòo<@©²©±Cü<Üì1üìôì0K°TK°T[X½ÿÀ@878Y!53#5oþXïïøÞÙ¨ÛÕ@ ÜÌ91ôÌ290##¼ÉþHþHÉÕýÓ‹þu-ÿìþþ¬µ©ÄÄ1Ôì0!5ûØþ¬ªð‰f1@ ´³DÜì1ôì0K° TK°T[X½ÿÀ@878Y #o™þºfþŠv{ÿã-{ %¼@'  ©¹ †º¹#¸Œ   E&üìÌÔì22991/ÄäôüôìÆîî9990@n0000 0!0"?'@@@@ @!@"PPPP P!P"P'p'…‡‡‡ ‡!…"' 'ð'000 0!@@@ @!PPP P!``` `!ppp p!€€€ €!]]"326=7#5#"&5463!54&#"5>32¾ß¬o™¹¸¸?¼ˆ¬Ëýû§—`¶Te¾Zóð3f{bsÙ´)LýªfaÁ¢½À‹..ª''üºÿ㤠8@¹  ¹Œ¸—G Füì22ôì1/ìäôÄìÆî0¶`€ ]4&#"326>32#"&'#3å§’’§§’’§ýŽ:±{ÌÿÿÌ{±:¹¹/ËççËËççRdaþ¼þøþøþ¼ad¨qÿãç{?@†ˆ† ˆ ¹¹¸Œ HEüä2ì1äôìþôîõî0@ € ].#"3267#"!2çNP³ÆÆ³PNM¥]ýþÖ-U¢5¬++ãÍÍã++ª$$>:#qÿãZ8@¹¹Œ¸—G Eüìôì221/ìäôÄìÄî0¶`€ ]3#5#"3232654&#"¢¸¸:±|ËÿÿË|±ýǧ’’¨¨’’§¶^ùì¨daDDaþËççËËççqÿã{p@$ †ˆ©¹ »¹¸ ŒKEüìôìÄ91äôìäîîôî90@)?p Ðð?????,// , ooooo ]q]!3267# 32.#"ü² Í·jÇbcÐkþôþÇ)ü⸥ˆš¹^Z¾Ç44®*,8 CþÝÄ—´®ž/øp@ ©‡—¼    Lü<Äü<ÄÄ991/ä2üìî2990K° TX½ÿÀ@878YK°TX½@ÿÀ878Y¶@P ]#"!!##535463ø°cM/þѹ°°®½™Phcü/ÑN»«qþVZ{ (J@#  †¹¹&#¸'¼ ¹½& G E)üÄìôì221/ÄäìäôÄìþÕî990¶`*€* *]4&#"326!"&'5326=#"3253¢¥•”¥¥”•¥¸þþúa¬QQžRµ´9²|ÎüüÎ|²9¸=ÈÜÜÈÇÜÜëþâþé³,*½¿[cb::bcªºd4@ ‡¸ — N  Füì2ôì1/<ìôÄì90²`]#4&#"#3>32d¸||•¬¹¹B³uÁƤý\žŸž¾¤ý‡ýžedïÁy+@¾±¼Fü<ì21/äüì0@  @ P ` p ]3#3#Á¸¸¸¸`û éÿÛþVy D@ ¾ ‡½¼ ±O  Fü<ì2ä991ìäôìî990@ @P`p]3+532653#Á¸£µF1iL¸¸`ûŒÖÀœa™(麜 ¼@)B¼— F üì2ÔÄ91/<ìä90KSXííííY"² ]@_ ')+Vfgsw‚‰Ž“–—£    ('(++@ h` ‰…‰š—ª§¶ÅÖ÷ð÷ð]q]33 ##º¹%ëý®kðýǹüiãýôý¬#ýÝÁy"·—Füì1/ì0@ @P`pð]3#Á¸¸ùìº{"Z@&  ‡ ¸¼PPF#üì2üüüì91/<<äô<Äì290@0$P$p$$ $ $¿$ß$ÿ$ ]>32#4&#"#4&#"#3>32)EÀ‚¯¾¹ru¦¹rw¦¹¹?°yz«‰|võâý\ž¡œ¾¤ý‡ž¢›¿£ý‡`®gb|ºd{6@ ‡¸ ¼ N  Füì2ôì1/<äôÄì90´`Ï]#4&#"#3>32d¸||•¬¹¹B³uÁƤý\žŸž¾¤ý‡`®edïqÿãu{ J@¹¹ ¸Œ QEüìôì1äôìî0@#?{{   {  { ð]"32654&'2#"s”¬«•“¬¬“ðþîðñþïßçÉÉçèÈÇéœþÈþìþíþÇ98ºþV¤{>@¹¹¸Œ½¼ GFüì22ôì1äääôÄìÄî0@ `€ à]%#3>32#"&4&#"326s¹¹:±{ÌÿÿÌ{±8§’’§§’’§¨ý® ªdaþ¼þøþøþ¼aëËççËËççqþVZ{ >@¹  ¹¸Œ½¼ GEüìôì221äääôÄìÆî0@ `€ à]32654&#"#"3253#/§’’¨¨’’§s:±|ËÿÿË|±:¸¸/ËççËËççý®daDDadªùöºJ{0@  ‡¸ ¼ FüÄì21/äôìÄÔÌ90´PŸ].#"#3>32JI,œ§¹¹:º….´˾ý²`®fcoÿãÇ{'ç@<  S  SB †‰†‰¹¹%¸Œ( R"E(üÄìÔìä99991äôìþõîõî90KSXí9í9Y"²']@m   . , , , ; ; ; ; $( ( *//*(() )!$'† † † †      '/)?)_))€)) )ð)]]q.#"#"&'532654&/.54632‹N¨Z‰‰b”?Ä¥÷ØZÃlfÆa‚Œe«@«˜àÎf´?®((TT@I!*™‰œ¶##¾55YQKP%$•‚ž¬7òž8@©¼‡  Fü<Äü<Ä2991/ìô<Äì2990²¯]!!;#"&5#53w{þ…Ks½½Õ¢‡‡žþÂý ‰NšŸÒ`>®ÿãX`6@ ‡Œ ¼  NFüìôì21/ä2ôÄì90´`Ï]332653#5#"&®¸||•­¸¸C±uÁȺ¦ýaŸŸ¾¤{û ¬fcð=`@'B¿ÔÄ91/ì290KSXííííY"K° TX½ÿÀ@878YK°TK°T[X½@ÿÀ878Y@ŽHj{†€‘¤  &&)) 55::0FFIIFH@VVYYPffiigh`ut{{uz……‰‰‰†––—š˜˜—¨§°Àßÿ>]]3 3#=Ã^^Ãþ\ú`üT¬û V5` @IU U U U   B ¿    ÔÌ91/<ì2290KSXííííííííY"K° TK°T[K°T[K°T[K° T[X½ ÿÀ @878YK° TK° T[K°T[X½ @ ÿÀ878Y@ÿ" 5 IIF @ [[U P nnf yy‡™˜” ¼¼ÎÇÏ         %%#'!%""%' $ ! # 9669 0FHF@B@@@D D D @@VVVPQRRPS T U cdejejjjn a g ouuy}x}zzxy  { v } ‡ˆ——”“œ›˜˜™@/– Ÿ¦¦¤¤««©©«¤ ¯µ±½»¸ ¿ÄÃÌÊy]]333# #V¸æåÙæå¸þÛÙñòÙ`ü–jü–jû –üj;y` Z@F      B ¿  ÔÄÔÄ91/<ì290KSXííííííííY"K° TK°T[K°T[K°T[X½ ÿÀ @878YK°TX½ @ ÿÀ878Y@˜   & =1 UWX f vzvt ‚ ™Ÿ—’ ¦©¯¥£       )&% * :9746 9 0 IFE J @ YVYYWVYVV Y P o x ›”«¤° Ï ß ÿ /]] # # 3 dþkªÙþºþºÙ³þrÙ))`ýßýÁ¸þHJþq=þV`¢@C        B  ‡½ ¼  ÔÄÄ91ä2ôì9990KSXíííííí2Y"K° TK°T[X½ÿÀ@878YK°TX½@ÿÀ878Y@ð     # 5 I O N Z Z j ‡ € “        '$$  )( % $ $ ' ** 755008 6 6 8 990A@@@@@@@@B E G II@TQQUPPVUVW W U U YYPffh ii`{xx‰Š … … ‰ ‰‰™ • • šš¤ ¤ ««°Ïßÿe]]+5326?3 3“N”|“lLT3!þ;Ã^^ÃhÈzšH†TNü”lXÛ` ´@B©¼© ÜÄ2Ä991/ìôì0KSXííY"K° TK° T[X½ @ ÿÀ878YK°TX½ ÿÀ @878Y@B&GI  + 690 @@E@@CWY_ ``f``b € ¯ ]]!!!5!qjýL´ü}´ýe`¨üÛ“¨%þ²$‚@4 %   ! © ©À ©±% $  C %Ô<Äü<Ä299999991üìÄôìî99999990K° TX½%ÿÀ%%@878Y²&]#"&=4&+5326=46;#"3>ù©lŽ==k©ù>DV[noZV¾”Ýï—ts•ðÝ“XøŽŽœøXþ®·±Ôì1üÌ0#®ªøþ²$ž@6%   ©©#À©±%#C %Ô<Ä2ü<Ä99999991üìÄôìî99999990K° TX½%@%%ÿÀ878YK°TX½%ÿÀ%%@878Y²&]326=467.=4&+532;#"+FŒUZooZUŒF?ù§lŽ>>Žl§ù?¾VøœŽŽøŽW“Ýð•st—ïÝ”ÙÓÛ1#@ œœ ÔÄ1ÔüÔìÀ990#"'&'&'&#"56632326Ûi³an’ ›^X¬bi³an“ ›^V©1²OD;>MS²OE<>LÿÿhN'$¼uhm !Ë@T   !!  ! !!!B  Á • Ž  !  VV!"ÔÄÔì2Ôî299999991/<æÖîÔî9990KSXííííííííY"² #]@  s › P#f iu {yyv v!€# ]]4&#"326!.54632#!#TY?@WX??Y˜þð!þX=>Ÿsr¡?<Òˆý_ˆÕZ?YWA?XXþóýN)sIs ¡rFv)ú‹þÿÿsþu'ð'&Ý-ÿÿÉ‹k'(žuÿÿÉ3^'1þuÿÿsÿãÙN'2'uÿÿ²ÿã)N'8îuÿÿ{ÿã-f'DRÿÿ{ÿã-f'DCRÿÿ{ÿã-f'D×Rÿÿ{ÿã-'DŽRÿÿ{ÿã-7'DØRÿÿ{ÿã-'DÜRÿÿqþuç{'FÝÿÿqÿãf'H‹ÿÿqÿãf'HC‹ÿÿqÿãf'H׋ÿÿqÿã'HŽ‹ÿÿof'ÖÿÿÿÿǦf'ÖCÿÿÿÿÞ\f'Ö×ÿÿÿÿôF'ÖŽÿÿÿºd7'Qؘÿÿqÿãuf'Rsÿÿqÿãuf'RCsÿÿqÿãuf'R×sÿÿqÿãu'RŽsÿÿqÿãu7'RØsÿÿ®ÿãXf'X{ÿÿ®ÿãXf'XC{ÿÿ®ÿãXf'X×{ÿÿ®ÿãX'XŽ{9ÿ;ÇÕ '@¹  YW Y Ô<ìü<ì1äôÔ<ì203!!#!5!¨°oþ‘°þ‘oÕþ\™û£]™Ãu=ð  @ÃÄà ‘ Z[ZÜìüì1ôìüì0"32654&'2#"&546PnnPPnoO@v+..¹†‡´¸ooPOmmOOp1.-rB„·´‡†º¬þÇ#˜!Q@+  †ˆ †ˆ ¹ ¹¸Œ"  "ÜìÔ<Ô<<ì221äô<ÄìÄþôîõî9990%&&'667#&73¦“¤¤JˆDF‰HA‰Mfñþ÷ ñfI‰ƒX⸹⡬)*ü *'ª#þä 32þá!bð`@!† ©  ”‘   Ü<ÌÌü<ÄÔÄ1/ì2ôäìÔ<î2î990K° TX½ÿÀ@878Y´66].#"!!!!53#535632NLˆ=”t‡þy-üìÇÇÖè=—´¶))›Ô×þ/ªªÑîó\ÿ=¢ð >‘@54&.#"#"&'532654/.5467.54632{?>‹ú?>ÌS8alÎÓƒ\]>9Ì­IšXW”:fqÝÖ€][;;ȦI™¨.Z.L…‡-[.Kˆ“¤''PGZswšeZŒ54m@ލ¤''TLf{x™f[1,pE‚Ÿ3Ñ…! · Ç \ Ôì1Ôì04632#"&3­~|«¬}}¬ú|««|}¬¬žÿ;9Õ %@Á]] ÔÔüÜì91Ä2ôì90!###&&54$yÀ¾Ž×ëÕùfùáNݸ¾èºÿã¬/š@0-'!  *†¹*¹—Œ.  !' $'$-F0üÄüÌÆîÔîî99991/äþîþÕî990@@'(Š Š     ! "&  : :!MM I!I"jj ¥¥¦ ]]4632#"&'532654&/.5467.#"#ºïÚÐÛ—¨:A9¦`áÓ@ˆIPŒAtx;e\`W§—ƒq‚ˆ»qÈÛèàs`/Q*%jŽd¬·¤_[?T>7;‡[¬gp‹ƒû“åÍ/8L`@6EBC?2ÉH0É9JCÊ 9ÊÉÈ É$HE301BKL?gwyVpMIßÑ`3þœDåÍ/IC@&=Ë>:ÌAÊ$1Ë04ÌGÊÉÈ$É 7aD=0^* D^ JÜÌüìþí2î1/îöþýîÖîýîÖî02#"$'&5476$"32676654&'&&&&#"3267#"&54632˜mmllmmþù˜˜þùmmllmm˜ƒâ^^``^^⃄ã^]]^\^ã§B‚B•§«›@zBC‰FØûûØIˆÍnmmþúš˜þûmmnnmm˜šmmng^^^å‚ã^^__^]⃅ã]^^õ! ¯Ÿ®"ôÐÑò'“FÕ >@!  É  b b cbcÔäüäÔìÔì91ô<<ì2Ô<<Ä903#######5J®¤ªqÃ7ËrqËrÉÕÿý¾äþÑ/þB^þä^sîRf1@ ´³DÔì1ôì0K° TK°T[X½ÿÀ@878Y3#‹Çþº™fþˆ×F)’@ÎÍddÜüÔì1ü<ì20K° TK° T[X½@ÿÀ878YK° TK° T[K°T[K°T[X½ÿÀ@878YK°TK°T[X½@ÿÀ878Y@````pppp]3#%3#^ËËþyËËÊÊÊÙ'ÛÝ>@" Ïœ Ï œ  Ü<Ä291Ô<Ì2ü<ìþ<ì990!!!!!'7!5!7!Ù}®/þHÃ{üúþþ}®þÕ¶Ãý‡¢;fÕ¨ðªþÇfÓªðHÕ‡@9  B• ••••­    ÔÔ<ì2ÔÄÄ91/<ììÄôììîî0KSXííííY"²€]@gww† …– ¿ ]!!!!!!#!5ýÇý9øü=ýð Íq‹þ¶ËÕªþFªýãªþÕžüðfÿºå +ž@< +,  )&  *&•& •‘&Œ,+,* # )#3,üìüìÀ999999991äôìîÀÀ99999990@*WZWU!je!{vu! FYVjddj(|svz( ]] 324&'.#"&5!27!"&''¶ý3>¡_Ü'y=¡_Üþý''†NOy;‚ÝW¢fªNPþˆþÆ€Ý[¢gXü²@CHp¸¸@Cþ¸þåp¼Džf b¥MK¿YÆgþöžþŸþ[KK¿XÝÝÏî /ÿ@- !$'!!0 $*0ÔÄÔÄ99991ÔÄÔÄÀ9990@¾     $$$   $$ $ ***///***55500055 5 :::???:::EEE@@@EE E JJJOOOJJJV´° °!°"°&°'°(´)]]32654&#".#"326#"&54632>32#"&“1†Te€vYR…Ä1…UfvYR†F^ˆº§†_™HDža†¼§†^•/XZ‡ie†‡7XX„je†ˆ‡ߦ¯Ø~ŠŠƒá§¯ÖwÙÛ .@МР œ   Ô<ì2ü<ì21/ìÔ<ìü<ì0!!#!5!!!®-ýÓ¨ýÓ-ýÓúþþ}ªþ}ƒªƒû¦ªÙÛ¨ T@.œœœœBѧœ $# ü<ì2291/ìôì90KSXííííY" 5!!Ûü@Àúþúþúþøþëþî²pªoüªÙÛ¨ V@/œœœœBѧœ$ # ü<<ì291/ìôì90KSXííííY"55!5ÙúþÁAúþø°þ‘ªþ²ýǪªRÃÕÆ@F  B Ó Ó   fe f eÔ<ì2ìüì2ì99991/ä2Ô<ì2Ô<ì290KSXííííY"K° TX½ÿÀ@878Y@(†¦ µ' ' ')((79‡ ˆ¦ ¥ª©]]!#!5!5'!5!3 3!!!þcÉþ` Tþ´þþ{y¿þÂþµTŸÇþ9Ç{3›{JýD¼ý¶{›3®þVå` M@% ‡Œ ¼½!   NF!üì2ôìÄ91ää2ô<ìÜÄ990¶"`"Ï"]3326533267#"&'#"&'®¸Š‡”•¸#% )I#ER2‘bf*þV ýH‘”¨¨ü¢<9 ”NPOONNý×hÿçÁ-)b@'! '!Õ* $$*ÔÌÜÌ9991äÌÜÌÎÎ990K° TK° T[K°T[K°T[K°T[X½*@**ÿÀ878Y>54&#"#"&54632#"&54324&#"32ôIH7$$0e´ÖþßÕ˜ËÝ¢e‚ WOmVPmmW£Kƒt,>bþÊþùþ±þFØ£Æ[àt}þþÏt{þw;Á ]@    ÔÄ91ÄÔÌÎ990@0QVPZ spvupz €€ Z pp{ t €€ ]]!! !!5 7êüA ýJïúÞÕýIÁÁý3ýÀ•!ãœþwqÁ@×Ö¯ggÔìÔì1üìì20!#!#œÕðý ïÁø¶}ùƒÿáÿðª/#Ë@1 ÚÙ"ØÕ $ #" #h#$ÔÔÔì9999991/<äôì22î9990K° TX½$ÿÀ$$@878Y@V             ##(]]#3267#"&5467!##"#>3!‡¶i/7.%7vy"PþºÂµÃ)6<  ¥y‘þJ\:1fd.¡xüo‘@E¦}/þú%&@ Û Ûܱ& iji&Üìüì1üìÜäÞä026732#"&'&&#"#"&546327j ¾ÊPd@7*8  k½ÄOeD=!0 þú°l9¼TA6?&#Hý•Ánþ!þbSA8?SsÕ;ð)_@3(%ãÝá%Ý ßÞÝ à‘* "(kl"k *ÜìÌüì22ÀÀ9991ôäüôìÄîíÖîî99990!!#5#"&5463354&#"56632"32655‹°ýP®•,]€˜¿¼¶uu>ˆDI‘E·³þì¡~bRh‚P{¸þ@p?D‡q‡Š[[""°ðCO@Mr`Õdð.@ãáÝ àÝ‘ klk Üìüì991ôìôìüì0!!2#"&546"32654&‹°ýPX³Îγ³Ðгi~hi}|P{Ý¿¿Ûܾ¿Ýs¡ˆ…  …‰ NÏç@@" å‘å  mm  ÔììÔììÀÀ9991/<ì2ôì0%!5654#"!5!&5! Ïý¨±ÆþøØØþ÷Dzý¨?ž‘1/Ž¡²²²aLÊð"þÝïÊþ´a²²‹*¸>ŠþwþËÂþØ{ÿão{3>@C'-%= 4©%†ˆ©:¹.†-º*¹»1 ¸Œ%?47&%7& =&-7"E?üìÌÔü<ÔìÄ999991Ää2ô<Ääü<ôìÄî2îôîî9990@0+0,0-0.0/00@+@,@-@.@/@0P+P,P-P.P/P0…+…0€@@ @°@À@Ð@à@à@ð@??? ??0,0-0.0/@,@-@.@/P,P-P.P/ooo oo`,`-`.`/p,p-p.p/€,€-€.€/]q].#">32!3267#"&'#"&5463!54&#"5>32"326=¶¥‰™¹DJÔ„âü² Ì·hÈddÐj§øMIؽÒýû§—`¶Te¾ZŽÕï߬o™¹”—´®ž0Z^þÝúZ¿È55®*,ywxx»¨½À‹..ª''`þf{bsÙ´)Hÿ¢œ¼ +ä@<+,&  )&  *&¹& ¹¸&Œ,+,* # #Q)E,üì2ôì2À9999991äôìîÀÀ99999990@p(?-YVUV jf!{    { z{ {!"#$%{&›•%¨ -ð-&YVUZ(ifej(ztvz(‰•š$¢­$]] 32654&'.#".5327#"&''‰þ)gA“¬\*g>—©}66ñ]ŸC‹_’56þîð`¡?‹`!ý°*(èÈOuš))ëÓHn.—MÅw834¨O³MÆxþíþÇ43¨Nÿã¬Õ $†@/ †ˆ !ƒ# •Œ#%" " "!& %ÜìÔüìÔì99991äôìþÍôî9990K°TK°T[K°T[X½%ÿÀ%%@878Y@ ttttv]33267#"&546?>7>5#53ô¾7ZZ:3ƒmN´`^Àg¸àIYX0&ÄÊÊDœe‚WX5^1YnFC¼98ŸL‰VV/5<6þ5Õ b@ƒ ü<ì2991/ôüÌ0K° TX½ @ ÿÀ878YK°TK°T[K°T[X½ ÿÀ @878Y¶ P ]#53#3ËËË¢×þú+eþ›ÙÛ^@ œÜÔì1ÔÄì0!#!Ù¨û¦^ýÁ•=ÿ×} *@    ÔÌ91ÔÌÄ903##'%\½sý®BþÁ}}`ùºs-Pbý;þV#Š@@   B   ©Šæ©Šæ©!—$  $ÔÌ91Ä2Äüìôìîöîî299990KSXí2í9Y"K° TX½$ÿÀ$$@878Y.#"!!#"&'53267#5!>32&P,`r<þÃ:¼º:d/4a/am"‰ø?$Æ—5dð¤z„þÉý…þãÓ¦!!‰¦­J·ÃÙÛô;?@.9*-" *œ19œ"œ œ<-<Ô<Ä21ÔìÔìÜüÔìÀ9999990#"'&'&'&#"56632326#"'&'&'&#"56632326Ûi³an’ ›^X¬bi³an“ ›^V©gi³an’ ›^X¬bi³an“ ›^V©o³NE;=LT³NE;=KÚ²OE;=LS²NE;=Kÿú`Á8@ÔÌ91/ÄÌ90@cmpxyvn]] !3!¬þ^DýïàCúšîûÄú?ž%# †@Ièèèè è è è  è B  ç¦ o o nüü<Ôì2991ô<ì2990KSXííííííííY"55%þÓ-þ+#þÓ-þ+#¿þôþô¿¢R¢¿þôþô¿¢RÁH# †@I è è è è èèèèB  ç¦ o opü<üÔ<ì991ô<ì2990KSXííííííííY"5%5ÁÕþ+-þÓ²Õþ+-þÓ#þ^Rþ^¿  ¿þ^Rþ^¿  ìþ #@ƒ   ÔüÔìÔì1/<<ì220%3#%3#%3#–ÔÔ©ÕÕú­ÕÕþþþþþþÿÿhk'$¼uÿÿh^'$¼uÿÿsÿãÙ^'2'us Õ;@•••­   üìÔÄÄÔì299991/ìì2ôì2î0!!!!! !# !3úýÇý9øû×þOþA¿±gþ¿þÀ@AÕªþFªýãª|pm|ªþáþàþßþßqÿãÃ{'3„@1†ˆ ©. ¹(¹»"%¸Œ4"1 K1 Q+E4üìôüôìÄ9991ä2ô<Ääì2Äî2îôî90@%?5_5p5Ÿ5Ï5Ð5ð5????? ooooo ]q].#"!3267#"&'#"32>32%"32654& ¤‰™¹Hü² Ì·jÈbdÐj òQGÑŒñþïñŒÓBNèâú°”¬«•“¬¬”˜³®ž5Z¾Ç44®*,nmnm98olkpþ݇çÉÉçèÈÇééy¶©é/Æ1üì0!!üyéyµ©/Ì1Ôì0!!øy®émÕ '@ž   ÜüÌÔÌþÔÎ1ô<ì20#53#53Ó¤RšÓ¤Ré­?þÁ­­?þÁ®émÕ '@ ž  ÜìÔÌÜîÔÎ1ô<ì203#%3#Ó¤RšÓ¤RÕ¬þÀ@¬¬þÀ@®éÓÕ@ žÜüÔÌ1ôì0#53Ó¤Ré­?þÁ²þ×Õ@ žqÜìÔÌ1ôì03#Ó¤RÕ˜þÁ?Ù–Ûo )@êêœ r ÜÔ<ü<Ä1ÔÄüÄîî03#3#!!ßööööýúúþoöþõAªþ#îu"@ÔÌ91ÔÌ990 úþþôþ þ üÏüÇ9%ûÛûÓ-ÿÿ=þV'\Ž^ÿÿÿüçN'<suþ‰ÿãÍð+@BŒ‘ÔÌ1ää0KSXííY"3#- ü\ ðùó^R¼²#/ƒ@I -'! - -¹ëì'¹ë!0 *$0* $ $(st*(s0Üäìôäì9999999991ÔäìôäìÀ9999999907'#"&''7&&5467'766324&#"326{ÏrÎ%$&(ÑrÏ;t=:x=ÏqÏ%%&&ÏsÏ7t@?s9ÏqÏ(&%%ÏsÎ>v:@t8ÎsÏ'%$þ|pššprœžs#G@%èèèèBç¦onüì291ôì90KSXííííY"5sþÓ-þ+#¿þôþô¿¢RÁ–#I@&èèèèBç¦opü<ì91ôì90KSXííííY"5ÁÕþ+-þÓ#þ^Rþ^¿  /J›@( ©‡¾±— ¼ Lü<Ä2Äü<Äî2991/<æ2îþîîî2990K° TX½ÿÀ@878YK°TX½@ÿÀ878Y@0P€€€ Ðï]]#!##53546;#"3#J¹þ¹°°­³¹°cMù¹¹`û Ñü/ÑN·¯™Phc²é/J„@! © ‡— ¼   Lü<ÄÄü<Äî991/<æ2þîî2990K° TX½ÿÀ@878YK°TX½@ÿÀ878Y@0P€ € € Ðï]!#!"!!##53546J¹þ·cM/þѹ°°®ùì{Phcü/ÑN»«9ÿ;ÇÕ>@ ¹¹  ÂY W Y Ô<<ì2ü<<ì21äôÄ2Ä2î2î20%!#!5!!5!3!!!Çþ‘°þ‘oþ‘o°oþ‘oßþ\¤š™¤þ\™ýáÛH®F·ƒÔì1Ôì03#ÛÓÓFþ®ÿÓþ@ žƒÔìÔÌ1üì0%3#Ó¤Rþ¬þÀ@®ÿmþ '@ žƒ   ÜìÔÌÜîÔÎ1ü<ì20%3#%3#šÓ¤RþfÓ¤Rþ¬þÀ@¬¬þÀ@qÿã Lð #'3?K®@D$%&%&'$'B@’ .’(’F’4 :&Œ$‘L%IC'1+C =  1 =I 7+ ! LüäìÔÄìäîîöîî991ä2ô<<ä2ì2îöîî20KSXííY"K°TK° T[K° T[K° T[K° T[K°T[X½L@LLÿÀ878Y"32654&'2#"&5462#"&546!3#"32654&2#"&546"32654&ôWddWUccUžº» º»ùtž¼»ŸŸ¹º% üZ VcbWWcd²žº» º»ŸWccWUcc‘”„‚••‚ƒ•Ü»»ÛÛ»¼ÛàÛ»½ÚÛ¼ºÜùóŽ•‚„””„–ýŸÜ»»ÛÛ»¼Û”„‚••‚ƒ•ÿÿhm'$¼uÿÿÉ‹m'(žuÿÿhk'$¼uÿÿÉ‹N'(žuÿÿÉ‹k'(žuÿÿ¢k',ÿ/uÿÿÿþ`m',ÿ/uÿÿXN',ÿ/uÿÿ;ºk',ÿ/uÿÿsÿãÙk'2'uÿÿsÿãÙm'2'uÿÿsÿãÙk'2'uÿÿ²ÿã)k'8îuÿÿ²ÿã)m'8îuÿÿ²ÿã)k'8îuÁy` ·¿Füì1/ì0@ @P`p]3#Á¸¸`û Áî?f7@ ´³uÜì91ôì290K° TK°T[X½ÿÀ@878Y3#'#¶”õ‹´´‹fþˆõõ¶J7c@$  Ãà íVwVvôìüì99991ü<üÔ<ì99990K° TK° T[X½ÿÀ@878Y'.#"#>3232673#"&ü9! &$}f[&@%9! &$}f[&@Z7IR‡“!7IR‡“Õb+ö/·ïîÔÌ1üì0K° TK°T[X½ÿÀ@878Y!!ÕVýªö”Ç)9H W@ ð³VVÜìÔì1ô<Ôì0K° TX½ÿÀ@878YK°TK°T[K°T[X½@ÿÀ878Y332673#"&Çv aWV` v ž‘‘žHKKJLšDf,@ ÎÍdÔì1üì0K° TX½ÿÀ@878Y3#šÌÌÌîá _@Áò ÁñV xVÔìôì1ôìôì0K° TK° T[X½ÿÀ@878YK° TK° T[K° T[X½ÿÀ@878Y4&#"3267#"&54632˜X@AWWA@XzŸssŸŸssŸô?XW@AWX@s  ssŸŸ#þuÁ@  ó' ÜÔìÔÌ1/ÔüÄ90!#"&'532654&'T76xv.W+"J/;<+->i0Y[ ƒ0.W=ðî®fB@´³ÔÜÔÌ991ô<ì20K° TK°T[X½ÿÀ@878Y3#3#ü²ø‡ªß‰fþˆxþˆLþuÁ @  óô 'ÔìÄÔÌ1/üüÄ90!33267#"&546¸w-+76 >&Dzs5=X..… W]0iÁî?f7@ ´³uÜì91ô<ì90K° TK°T[X½ÿÀ@878Y373¶õ‹´´‹õîxõõþˆÿòuÕ ?@ •  : yô<ìÄü<Ä991/äì90´0P]3%!!'7ÓË9Pþw×ü^”MáÕý˜Ûoþîýãª;jnžH ^@ — z z Ô<äü<ä991/ì90K°TX½ @ ÿÀ878Y@ @ P ` sz p à ð ]37#'7Ǹ}Lɸ{JÅý¦ZjüãšXjÿÿ‡ÿã¢m'6‹uÿÿoÿãÇf'Vàÿÿ\m'=¾uÿÿXÛf']àþ¢®˜@ õõÜ<ì21ÔìÔì0##®ªªª˜ý öý ö ºÕ g@  © ••  2  yô<ì2ÄôìÄ91/Æ2îöîî20@( °Ÿ Ÿ Ÿ Ÿ ŸŸŸŸ¿ ¿ ¿ ¿ ¿¿¿¿]]! )#53!!3 !Ó ±–þiþPþ`ÉÉËPþ°ó5þáþËÕþ—þ€þ~þ–¼ãþýê.,qÿãu('@^%{&%#${##{#({'(#&'('%$%(('"#" ! B('&%"! ##¹ ¹Œ#±)&' ! (%#" QE)üìôì99999991ìÄôìî9990KSXÉÉÉÉííííY"²?*]@v%+("/#/$)%-&-'*(6%F%X X!` `!f"u u!u"%#%$&&&''(6$6%F$E%Z Z!b b!z{     {zzv v!x" *ð*']].#"32654&#"5432''%'3%F2X)§¹®’‘®6 ~rþäæçþåÝ4*ŸþÁ!µäM!þÙ“ØÃ¼ÞÞ¼z¼&þà­ÿþÉ7ÿú7´kc\Ì‘oabÿÿÿüçk'<suÿÿ=þVf'\^ÉÕ =@• •ö  ? üì22üì91/ôüìÔì0@ ?_]332+#32654&#ÉÊþûþÿûþÊÊþš™ŽÕþøáÜÜâþ®'ýÑ’††‘ºþV¤>@¹¹Œ¸½— GFüì22ôì1ìääôÄìÆî0@ `€ à]%#3>32#"&4&#"326s¹¹:±{ÌÿÿÌ{±8§’’§§’’§¨ý®¾ý¢daþ¼þøþøþ¼aëËççËËççÙ-Û×¶œÔÄ1Ôì0!!Ùúþת?œÅ …@M œ  œœœœœ œ œ B   Ô<Ì291Ô<Ì290KSXííííííííY" '7œþ7Éwþ5þ5vÈþ8vËËLþ5þ7yËþ5yÉËyþ5ˉœÅß ,@Ý ÝÝ ÷‘ |]|| Üôäüä1ôììÔìî2035733!œÌßæ‰Íý× c)t'ý+n^œ´ðJ@$}}BÝÝ÷ Ý‘~ÜÄÔÄì91ôÄìüìî90KSXí2íY"!!56754&#"56632 ¨ýª"?XhU4zHM…9‘®þµ8rn81^BQ##{„l‹þä0bÍð(H@' Ý Ý Ý Ý ø÷Ý ø#‘)~&~ )ÜÄÄÔìÔì9991ôäìüäìÔìîî90#"&'532654&##532654&#"56632 \e¾±9}F4wCmxolV^^ad_(fQI€7©Z`mR|†yOFJLl?<:=svcE`ÿÿ‰ÿãð'ð'¼5 ‹ýdÿÿ‰ÿã?ð'ð'¼5ñ‹ýdÿÿbÿãð'ò'¼5 ‹ýdÿÿsÿã‹m'* uÿÿqþVZH'JÚ‹ÿÿÉ•P', ÿ/uÿÿ‡þu¢ð'6Ý‹ÿÿoþuÇ{'VÝÿÿsÿã'k'&-uÿÿqÿãçf'F‰ÿÿsÿã'm'&-uÿÿqÿãçf'Fà‰qÿãô$J@$Ó ù"¹¹ Œ¸—   GE%üìô<Äü<Ä1/ìäôÄìÄîý<î20¶`&€& &]!5!533##5#"3232654&#"¢þºF¸šš¸:±|ËÿÿË|±ýǧ’’¨¨’’§¶N}““}úü¨daDDaþËççËËççd߃¶œÜÌ1Ôì0!!dý僤ÛH®F·ƒÔì1Ôì03#ÛÓÓFþÿãð1@: Ó"+Ó ¡®•¡®•/‘Œ) 2+"!)#&  , & &*!/<ÔÄ2üÄÄ99999999991Ä2äôìôìîöîî2Ý<î20K° TK° T[K° T[K°T[K°T[K°T[X½2ÿÀ22@878Y@z  1Ti lnooooiko o!o"o#n$l%i'i-ŸŸŸ Ÿ Ÿ Ÿ Ÿ ŸŸŸŸŸŸ–Ÿ Ÿ!Ÿ"Ÿ#Ÿ$Ÿ%Ÿ&Ÿ'Ÿ(Ÿ)Ÿ*Ÿ+Ÿ,-2   USjg ]].#"!!!!3267#"#734&5465#7332[©fÊ A7ýæ¾8þŠ Êf©[Y¹`íþË(Ó7‹Â7œ(6ìb¹bÕiZÈ»{.# .{»ÊZiÓHH"{/ #/{"G×)Ù¥@ ÎddÔüÜì1Ô<ì20K°TK°T[X½@ÿÀ878YK°TK° T[K°T[X½ÿÀ@878YK°TK°T[X½@ÿÀ878YK°TX½ÿÀ@878Y@````pppp]3#%3#^ËËþyËËÙËËËsîðö@BúÄÀ1ôÌ0KSXÉÉY"K° TX½ÿÀ@878YK°TX½@ÿÀ878Y@ %%6FVjg //]]3#7¹ä™öþø¶Jéu@!  ÃÃúVV ÔìÔì99991ô<ìÔì2990K° TX½ÿÀ@878YK°TX½@ÿÀ878Y´ ]'.#"#4632326=3#"&ü9 $(}gV$=09" (}gT";9! 2-ev 3)dw î‹ö‰@BúÄÀ1ôÌ0KSXÉÉY"K° TX½ÿÀ@878YK°TX½@ÿÀ878Y@*$$5CUUŸŸ¯¯//]]#ÇÄ™æöþøÏî1øw@ úÔÄ91ô<Ä90K° TX½ÿÀ@878YK°TX½@ÿÀ878YK°TX½ÿÀ@878Y@ //- ]3#'#¢¼Ó‹¦¦‹øþö²²Ïî1ø†@ úÔÄ91ôÄ290K° TK° T[K° T[K° T[X½ÿÀ@878YK°TX½@ÿÀ878YK°TX½ÿÀ@878Y@ "  ]373¢Ó‹¦¦‹Óî ²²þö?œôß Ô@ Ý ÷‘ ] ÜÔ<Äì291ôüÔ<ì290K°TK°T[K°T[K°T[K° T[K° T[X½@ÿÀ878YK°TK°T[X½ÿÀ@878Y@T /9IFYi‹«»       "5GK S[ e„¥µ]] !33##5!5ÝþË5¦‡‡þbfþ]ýämººyÇ9ø j@à úVVÔìÔì1ôüÄ20K° TX½ÿÀ@878YK°TX½@ÿÀ878YK°TK°T[X½ÿÀ@878Y332673#"&Çv cSRav  Ÿø6978w{zšfÛ¶úÔÌ1ôÌ03#šÌÌÛÍ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßà>: ~ÿ1BSax~’ÇÝ©À & 0 : ¬!""""+"H"e%Êûÿÿ   0AR^x}’ÆØ©À  0 9 ¬!""""+"H"`%ÊûÿÿÿãÿõÿØÿ ÿ^ÿCÿhÿüöüÛà–à…àVßjÞqÞ_Úï¿8ôüúúü (B¬£„…½–熎‹©¤ŠÙƒ“ñò—ˆÃÝðžªóôõ¢­ÉÇ®bcdËeÈÊÏÌÍÎèfÒÐѯgï‘ÕÓÔhêì‰jikmln oqprsutvwéxzy{}|¸¡~€ëíºýþÿøÖùúãä×àÚÛÜßØÞ²³¶·Ä´µÅ‚‡«˜¨š™î¼¥’”•Íf‹‹55®Å´žªšq=3ۤ=´Ù‹žãd‹Û²‡á–œdž¨‹²ð²ž´Ù´Ù´Ù?“‡y}É–s)ÉÉšÉ3sÉ\É\ÿ–?ÉuÉçÉüÉLsÓÉLsɇãÿúÛ²yéD{=ãÿü{\°²Ç´Ùÿìªç{ºfqqìqÑ/qº9Á9ÿÛ¢º9Á˺ºåqºqJº+o#7®¼=‹V¼;¼=3X²´Ùyy–sÉüÉLsÛ²ç{ç{ç{ç{ç{ç{fqìqìqìqìq99ÿÇ9ÿÞ9ÿôºåqåqåqåqåq®®®®9ì\¸3ž º's×´ÙËLfªÝ´Ù´Ù´ÙR®#hdœ¶ÿá+/ÅsÅ`NÛ{åH?55´Ù=´ÙZÿúåžåÁìyyLss/q%®%®‹®‹²´Ùô¼=ãÿüVþ‰^3ž3Á / /9‹Û‹®%® ¼qyÉyÉÉ\¢\ÿþ\\;LsLsLsÛ²Û²Û²9ÁÁ¶ÕÇšî#ðLÁÿòF‡+o{\3X²3 åqãÿü¼=×ɺ´Ù´5‰5^5bÁ‰Á‰Áb3sq\ɇ+o–sfq–sfqqãd‹Û×s¶ ÏÏ5?Çšÿ+   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóõôöøùúûüýþÿ     sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6463c6466c6467c6468c6469""""X“ÿ¶Oƒ²ö!n˜´ÊÞE‚~áL·üeÏî  R s ®  ß X ° û : i “ æ  = z /¬E…ëuñ)pཊëP‹±á@Ö"m¹#{ßC€øw³R¡Ø‡Äº‡wè [ r ó!5!B!â!ï!ü" ""#"0"="J"W"d"q"~"‹"˜"¥"²"¿"Ì"Ù"æ"ó## ##'#4#A#N#[#h#”#Ï$4$%3%S%&&º'K''·((X(Ã)_*%*\*£*é+z+Ó,D,,±-P- ..R.ª/‡0A0½11!1P1Ï2H2z2ß3F3p3p3}3Š3—3æ4z44£4Ñ4ÿ5595g5‘5ž5«5Ï6[6“6Í7C7©7ë888J999)969C9P9]9j9w9„9‘9ž9«9¸9Å9Ò9ï::{: :å;;^;Ž;Ä;ô<"<_<§<´<Á<Î<Û<þ=c>;>H>U>˜>ç>ý?a??Ü@:@K@\@m@z@‡@”@¡@®@»@È@Õ@âA@AVAkBEBªB÷C_C²CÿDUDÛE*E?-†” x$ÿÓ%ÿ·&')*K+-r./2934K57ÿD9ÿˆ:ÿ­;ÿš<ÿ =IQR&UYÿÉZ\ÿÜbÿÓdg9xy&z&{&|&}&‰­ÿÓ®ÿÓ¯9ºÿÜ»ÿ ÇÿÓÉÿÓÐ9Ñ9Ò9åéêÿ ëÿÜìöKûý$ÿÓ$ÿÜ$ÿÜ$$9$&ÿÜ$*ÿÜ$2ÿÜ$4ÿÜ$6$7ÿa$8$9ÿ}$:ÿ$;$<ÿa$FÿÜ$GÿÜ$HÿÜ$Iÿ·$RÿÜ$TÿÜ$WÿÜ$X$Yÿˆ$Zÿ­$\ÿu$b9$dÿÜ$gÿÜ$h$oÿÜ$pÿÜ$qÿÜ$rÿÜ$sÿÜ$yÿÜ$zÿÜ${ÿÜ$|ÿÜ$}ÿÜ$~$$€$$©ÿ·$ª$­9$®9$¯ÿÜ$´þø$µÿ$ºÿu$»ÿa$Å/$Ç9$É9$ÐÿÜ$ÑÿÜ$ÒÿÜ$Ó$Ô$Õ$ã$êÿa$ëÿu$öÿÜ$ù$ûÿÜ$üÿÜ$ýÿÜ$þÿÜ%%&ÿÜ%*ÿÜ%2ÿÜ%6ÿÜ%9ÿÁ%:ÿ·%<ÿ%dÿÜ%gÿÜ%©ÿÁ%ªÿÜ%¯ÿÜ%´ÿ%µÿ%»ÿ%Åÿ­%ÐÿÜ%ÑÿÜ%ÒÿÜ%ãÿÜ%êÿ%öÿÜ%ùÿÜ%ûÿÜ%ýÿÜ&&$&6&<ÿÜ&b&©ÿÜ&ªÿÜ&­&®&´&µ&&»ÿÜ&Å&Ç&É&ã&êÿÜ&ù''$ÿÜ'9ÿÜ':'<ÿ'bÿÜ'©ÿÜ'ªÿÜ'­ÿÜ'®ÿÜ'´ÿÓ'µÿÉ'»ÿ'ÅÿD'ÇÿÜ'ÉÿÜ'êÿ))þ·)ÿa)$ÿD)6ÿÜ)7ÿÜ)DÿD)Hÿ)Lÿk)Rÿ·)Uÿk)Xÿ)\ÿD)bÿD)iÿD)jÿD)kÿD)lÿD)mÿD)nÿD)pÿ)qÿ)rÿ)sÿ)yÿ·)zÿ·){ÿ·)|ÿ·)}ÿ·)~ÿ)ÿ)€ÿ)ÿ)©)ª)­ÿD)®ÿD)´ÿÓ)µ)ºÿD)Åþˆ)ÇÿD)ÉÿD)ãÿÜ)ëÿD)ùÿÜ**$*7ÿ·*:*<ÿš*b*©ÿÜ*ªÿÜ*­*®*´ÿÓ*µÿÓ*»ÿš*ÅÿÉ*Ç*É*êÿš++ÿÜ++©+ª+´ÿ·+µÿÁ+Åÿ·-ÿ·-$ÿÜ-bÿÜ-©ÿÜ-ªÿÜ-­ÿÜ-®ÿÜ-´ÿ·-µÿÁ-Åÿ-ÇÿÜ-ÉÿÜ.ÿ).$ÿÜ.&ÿ.2ÿ.7ÿa.8ÿÉ.:ÿ·.<ÿ·.DÿÜ.Hÿš.Rÿš.Xÿš.\ÿk.bÿÜ.dÿ.gÿ.hÿÉ.iÿÜ.jÿÜ.kÿÜ.lÿÜ.mÿÜ.nÿÜ.pÿš.qÿš.rÿš.sÿš.yÿš.zÿš.{ÿš.|ÿš.}ÿš.~ÿš.ÿš.€ÿš.ÿš.©ÿ}.ª.­ÿÜ.®ÿÜ.¯ÿ.´ÿÁ.µÿÁ.ºÿk.»ÿ·.Å.ÇÿÜ.ÉÿÜ.Ðÿ.Ñÿ.Òÿ.ÓÿÉ.ÔÿÉ.ÕÿÉ.êÿ·.ëÿk.ûÿ.ýÿ/ÿÜ/$//2ÿ·/7þæ/8ÿš/9ÿ/:ÿD/<þð/D/HÿÜ/RÿÜ/XÿÜ/\ÿD/b//gÿ·/hÿš/i/j/k/l/m/n/pÿÜ/qÿÜ/rÿÜ/sÿÜ/yÿÜ/zÿÜ/{ÿÜ/|ÿÜ/}ÿÜ/~ÿÜ/ÿÜ/€ÿÜ/ÿÜ/©/ª/­//®//¯ÿ·/´þa/µýæ/ºÿD/»þð/Å/Ç//É//Ðÿ·/Ñÿ·/Òÿ·/Óÿš/Ôÿš/Õÿš/êþð/ëÿD292ÿ­2ÿÜ2$ÿÜ29ÿÜ2;ÿ}2<ÿ2bÿÜ2©ÿÜ2ª2­ÿÜ2®ÿÜ2´ÿÓ2µÿÜ2»ÿ2ÅÿD2ÇÿÜ2ÉÿÜ2êÿ3ÿÓ3þÁ33$ÿ}383:3<ÿÓ3Dÿ¤3Hÿ·3LÿÓ3QÿÜ3Rÿ·3UÿÜ3VÿÜ3XÿÜ3\3bÿ}3h3iÿ¤3jÿ¤3kÿ¤3lÿ¤3mÿ¤3nÿ¤3pÿ·3qÿ·3rÿ·3sÿ·3xÿÜ3yÿ·3zÿ·3{ÿ·3|ÿ·3}ÿ·3~ÿÜ3ÿÜ3€ÿÜ3ÿÜ3©ÿÜ3ª3­ÿ}3®ÿ}3´&3µ&3º3»ÿÓ3Åþ·3Çÿ}3Éÿ}3Ó3Ô3Õ3äÿÜ3êÿÓ3ë3úÿÜ494©4ª4´ÿÓ4µÿÜ4Åÿ}5ÿ­5ÿ·5ÿÁ5$ÿ­5&ÿš57ÿk59ÿ5:ÿ­5<ÿ}5DÿÓ5Hÿ¤5Rÿ¤5Xÿ¤5\ÿ5bÿ­5dÿš5iÿÓ5jÿÓ5kÿÓ5lÿÓ5mÿÓ5nÿÓ5pÿ¤5qÿ¤5rÿ¤5sÿ¤5yÿ¤5zÿ¤5{ÿ¤5|ÿ¤5}ÿ¤5~ÿ¤5ÿ¤5€ÿ¤5ÿ¤5©ÿ5ªÿÜ5­ÿ­5®ÿ­5´ÿk5µÿ}5ºÿ5»ÿ}5ÅÿÜ5Çÿ­5Éÿ­5êÿ}5ëÿ5ûÿš5ýÿš6$&6&6*6264666b&6d6g6­&6®&6¯6Ç&6É&6Ð6Ñ6Ò6ã6ö6ù6û6ý7ÿD7ÿ 7ÿ7$ÿa7&ÿˆ77ÿÜ7Dþ­7Fþ¤7Hþ¤7LÿÁ7Rþ¤7UþÓ7Vþ­7XþÉ7Zþ­7\þÁ7bÿa7dÿˆ7iþ­7jþ­7kþ­7lþ­7mþ­7nþ­7oþ¤7pþ¤7qþ¤7rþ¤7sþ¤7yþ¤7zþ¤7{þ¤7|þ¤7}þ¤7~þÉ7þÉ7€þÉ7þÉ7©ÿD7ªÿ7­ÿa7®ÿa7´7µÿÓ7ºþÁ7Åþø7Çÿa7Éÿa7äþ­7ëþÁ7úþ­7ûÿˆ7üþ¤7ýÿˆ7þþ¤8$8-8=ÿÜ8b8­8®8Ç8É8åÿÜ9ÿˆ9þø9ÿY9$ÿ}92ÿÜ9Dÿa9Hÿa9LÿÓ9Rÿa9Xÿu9\ÿÉ9bÿ}9gÿÜ9iÿa9jÿa9kÿa9lÿa9mÿa9nÿa9pÿa9qÿa9rÿa9sÿa9yÿa9zÿa9{ÿa9|ÿa9}ÿa9~ÿu9ÿu9€ÿu9ÿu9©ÿN9ªÿ9­ÿ}9®ÿ}9¯ÿÜ9´9µ9ºÿÉ9Åþæ9Çÿ}9Éÿ}9ÐÿÜ9ÑÿÜ9ÒÿÜ9ëÿÉ:ÿ­:ÿ:ÿˆ:$ÿ:Dÿ}:Hÿˆ:LÿÓ:Rÿˆ:Uÿ¤:Xÿ·:\ÿÜ:bÿ:iÿ}:jÿ}:kÿ}:lÿ}:mÿ}:nÿ}:pÿˆ:qÿˆ:rÿˆ:sÿˆ:yÿˆ:zÿˆ:{ÿˆ:|ÿˆ:}ÿˆ:~ÿ·:ÿ·:€ÿ·:ÿ·:©ÿ:ªÿÜ:­ÿ:®ÿ:´ÿÜ:µ:ºÿÜ:Åþø:Çÿ:Éÿ:ëÿÜ;ÿš;$;&ÿk;2ÿ};7ÿÜ;Hÿ¤;b;dÿk;gÿ};pÿ¤;qÿ¤;rÿ¤;sÿ¤;©ÿ;ª;­;®;¯ÿ};´ÿa;µÿ­;ÅÿÓ;Ç;É;Ðÿ};Ñÿ};Òÿ};ûÿk;ýÿk<ÿ <þa<þð<$ÿa<&ÿ<2ÿ<Dþæ<Hþð<Lÿ·<Rþð<Xÿ<bÿa<dÿ<gÿ<iþæ<jþæ<kþæ<lþæ<mþæ<nþæ<pþð<qþð<rþð<sþð<yþð<zþð<{þð<|þð<}þð<~ÿ<ÿ<€ÿ<ÿ<©ÿ<ªÿk<­ÿa<®ÿa<¯ÿ<´ÿ<µÿÜ<Åþø<Çÿa<Éÿa<Ðÿ<Ñÿ<Òÿ<ûÿ<ýÿ=ÿÜ=©=ª=´ÿÜ=µÿÜ=ÅÿÜH[ÿÜIÿIÿkIÿ·IWÿÜIZÿÜI\ÿÜI©ÿ·IªÿÜI´AIµIºÿÜIÅÿIëÿÜNDÿÜNHÿ·NRÿ·NXÿÁN\ÿ·NiÿÜNjÿÜNkÿÜNlÿÜNmÿÜNnÿÜNpÿ·Nqÿ·Nrÿ·Nsÿ·Nyÿ·Nzÿ·N{ÿ·N|ÿ·N}ÿ·N~ÿÁNÿÁN€ÿÁNÿÁNºÿ·Nëÿ·QQQQ©QªQ´ÿkQµÿQÅÿ¤R&RÿÜRR[ÿÁR©RªR´ÿkRµÿ·RÅÿ}Uÿ}UÿDUÿÜUFÿÓUGÿÜUHÿÓUIUJÿÜUKÿÜUPÿÜUQÿÜURÿÓUTÿÜUUÿÜUXUYUZU[ÿÉU\U]UoÿÓUpÿÓUqÿÓUrÿÓUsÿÓUxÿÜUyÿÓUzÿÓU{ÿÓU|ÿÓU}ÿÓU~UU€UU©ÿ·UªU´UµVUºUÅþÉUæUëU÷ÿÜUüÿÓUþÿÓYÿÉYÿaYÿY©ÿÜYªÿÜY´YµÿÜYÅþðZZÿDZÿZ©ÿÜZªÿÜZ´ZµZÅÿ)[FÿÜ[HÿÁ[RÿÁ[oÿÜ[pÿÁ[qÿÁ[rÿÁ[sÿÁ[yÿÁ[zÿÁ[{ÿÁ[|ÿÁ[}ÿÁ[üÿÜ[þÿÜ\ÿÜ\þÜ\ÿk\©ÿÜ\ªÿÜ\´\µ\ÅþÓbÿÓbÿÜbÿÜb$9b&ÿÜb*ÿÜb2ÿÜb4ÿÜb6b7ÿab8b9ÿ}b:ÿb;b<ÿabFÿÜbGÿÜbHÿÜbIÿ·bRÿÜbTÿÜbWÿÜbXbYÿˆbZÿ­b\ÿubb9bdÿÜbgÿÜbhboÿÜbpÿÜbqÿÜbrÿÜbsÿÜbyÿÜbzÿÜb{ÿÜb|ÿÜb}ÿÜb~bb€bb©ÿ·bªb­9b®9b¯ÿÜb´þøbµÿbºÿub»ÿabÅ/bÇ9bÉ9bÐÿÜbÑÿÜbÒÿÜbÓbÔbÕbãbêÿabëÿuböÿÜbùbûÿÜbüÿÜbýÿÜbþÿÜdd$d6d<ÿÜdbd©ÿÜdªÿÜd­d®d´dµ&d»ÿÜdÅdÇdÉdãdêÿÜdùg9gÿ­gÿÜg$ÿÜg9ÿÜg;ÿ}g<ÿgbÿÜg©ÿÜgªg­ÿÜg®ÿÜg´ÿÓgµÿÜg»ÿgÅÿDgÇÿÜgÉÿÜgêÿh$h-h=ÿÜhbh­h®hÇhÉhåÿÜp[ÿÜq[ÿÜr[ÿÜs[ÿÜxxxx©xªx´ÿkxµÿxÅÿ¤y&yÿÜyy[ÿÁy©yªy´ÿkyµÿ·yÅÿ}z&zÿÜzz[ÿÁz©zªz´ÿkzµÿ·zÅÿ}{&{ÿÜ{{[ÿÁ{©{ª{´ÿk{µÿ·{Åÿ}|&|ÿÜ||[ÿÁ|©|ª|´ÿk|µÿ·|Åÿ}}&}ÿÜ}}[ÿÁ}©}ª}´ÿk}µÿ·}Åÿ}‰&‰©‰ª‰´ÿ‰µÿ‰Åÿ­©ª´ÿ­µÿ¤Åÿ©$©%ÿÜ©&ÿÜ©'ÿÜ©)©*ÿÜ©+©-ÿÜ©.©/©2©3©4©5©7ÿ©9ÿ©:ÿÜ©;©<ÿk©=©I©Q©R©U©YÿÜ©ZÿÜ©\ÿÜ©b©dÿÜ©g©x©y©z©{©|©}©‰©—©­©®©¯©ºÿÜ©»ÿk©Ç©É©Ð©Ñ©Ò©å©é©êÿk©ëÿÜ©ì©öÿÜ©ûÿÜ©ýÿܪ$ÿ·ª%ÿ·ª&ÿܪ'ÿܪ)ª*ª+ª-ÿܪ.ª/ª2ÿܪ3ª4ª5ª7ÿDª9ÿNª:ÿª;ÿª<ÿª=ªIªQªRªUªYÿܪZÿܪ\ÿܪbÿ·ªdÿܪgÿܪxªyªzª{ª|ª}ª‰ªª­ÿ·ª®ÿ·ª¯ÿܪºÿܪ»ÿªÇÿ·ªÉÿ·ªÐÿܪÑÿܪÒÿܪåªéªêÿªëÿܪìªöªûÿܪýÿÜ­ÿÓ­ÿÜ­ÿÜ­$9­&ÿÜ­*ÿÜ­2ÿÜ­4ÿÜ­6­7ÿa­8­9ÿ}­:ÿ­;­<ÿa­FÿÜ­GÿÜ­HÿÜ­Iÿ·­RÿÜ­TÿÜ­WÿÜ­X­Yÿˆ­Zÿ­­\ÿu­b9­dÿÜ­gÿÜ­h­oÿÜ­pÿÜ­qÿÜ­rÿÜ­sÿÜ­yÿÜ­zÿÜ­{ÿÜ­|ÿÜ­}ÿÜ­~­­€­­©ÿ·­ª­­9­®9­¯ÿÜ­´þø­µÿ­ºÿu­»ÿa­Å/­Ç9­É9­ÐÿÜ­ÑÿÜ­ÒÿÜ­Ó­Ô­Õ­ã­êÿa­ëÿu­öÿÜ­ù­ûÿÜ­üÿÜ­ýÿÜ­þÿÜ®ÿÓ®ÿÜ®ÿÜ®$9®&ÿÜ®*ÿÜ®2ÿÜ®4ÿÜ®6®7ÿa®8®9ÿ}®:ÿ®;®<ÿa®FÿÜ®GÿÜ®HÿÜ®Iÿ·®RÿÜ®TÿÜ®WÿÜ®X®Yÿˆ®Zÿ­®\ÿu®b9®dÿÜ®gÿÜ®h®oÿÜ®pÿÜ®qÿÜ®rÿÜ®sÿÜ®yÿÜ®zÿÜ®{ÿÜ®|ÿÜ®}ÿÜ®~®®€®®©ÿ·®ª®­9®®9®¯ÿÜ®´þø®µÿ®ºÿu®»ÿa®Å/®Ç9®É9®ÐÿÜ®ÑÿÜ®ÒÿܮӮԮծã®êÿa®ëÿu®öÿÜ®ù®ûÿÜ®üÿÜ®ýÿÜ®þÿܯ9¯ÿ­¯ÿܯ$ÿܯ9ÿܯ;ÿ}¯<ÿ¯bÿܯ©ÿܯª¯­ÿܯ®ÿܯ´ÿÓ¯µÿܯ»ÿ¯ÅÿD¯ÇÿܯÉÿܯêÿ´$þø´%ÿÁ´&ÿ·´'ÿÁ´)ÿÁ´*ÿ·´+ÿÁ´-ÿÁ´.ÿÁ´/ÿÁ´2ÿ·´3ÿÁ´4ÿ·´5ÿÁ´7´9´:´;ÿˆ´<´=ÿÜ´Iÿ·´Qÿ´Rÿk´Uÿ´Yÿ·´Zÿ·´\ÿ·´bþø´dÿ·´gÿ·´xÿ´yÿk´zÿk´{ÿk´|ÿk´}ÿk´‰ÿÁ´þ}´­þø´®þø´¯ÿ·´ºÿ·´»´Çþø´Éþø´Ðÿ·´Ñÿ·´Òÿ·´åÿÜ´éÿ·´ê´ëÿ·´ìÿÁ´öÿ·´ûÿ·´ýÿ·ºÿܺþܺÿkº©ÿܺªÿܺ´ºµºÅþÓ»ÿ »þa»þð»$ÿa»&ÿ»2ÿ»Dþæ»Hþð»Lÿ·»Rþð»Xÿ»bÿa»dÿ»gÿ»iþæ»jþæ»kþæ»lþæ»mþæ»nþæ»pþð»qþð»rþð»sþð»yþð»zþð»{þð»|þð»}þð»~ÿ»ÿ»€ÿ»ÿ»©ÿ»ªÿk»­ÿa»®ÿa»¯ÿ»´ÿ»µÿÜ»Åþø»Çÿa»Éÿa»Ðÿ»Ñÿ»Òÿ»ûÿ»ýÿÅ$&Å%ÿ·Å&ÿÅ'ÿ·Å)ÿ·Å*ÿ·Å+ÿ·Å-/Å.ÿ·Å/ÿ·Å2ÿÅ3ÿ·Å4ÿÅ5ÿ·Å7þæÅ9þˆÅ:ÿÅ;ÿ·Å<þˆÅ=ÅIÿÜÅQÿ·ÅRÿ·ÅUÿ·ÅYÿÅZÿ<Å\ÿÅb&ÅdÿÅgÿÅxÿ·Åyÿ·Åzÿ·Å{ÿ·Å|ÿ·Å}ÿ·Å‰ÿ·Å&Å­&Å®&ůÿźÿÅ»þˆÅÇ&ÅÉ&ÅÐÿÅÑÿÅÒÿÅåÅéÿ·ÅêþˆÅëÿÅìÿ·Åöÿ·ÅûÿÅýÿÇÿÓÇÿÜÇÿÜÇ$9Ç&ÿÜÇ*ÿÜÇ2ÿÜÇ4ÿÜÇ6Ç7ÿaÇ8Ç9ÿ}Ç:ÿÇ;Ç<ÿaÇFÿÜÇGÿÜÇHÿÜÇIÿ·ÇRÿÜÇTÿÜÇWÿÜÇXÇYÿˆÇZÿ­Ç\ÿuÇb9ÇdÿÜÇgÿÜÇhÇoÿÜÇpÿÜÇqÿÜÇrÿÜÇsÿÜÇyÿÜÇzÿÜÇ{ÿÜÇ|ÿÜÇ}ÿÜÇ~ÇÇ€ÇÇ©ÿ·ÇªÇ­9Ç®9ǯÿÜÇ´þøÇµÿǺÿuÇ»ÿaÇÅ/ÇÇ9ÇÉ9ÇÐÿÜÇÑÿÜÇÒÿÜÇÓÇÔÇÕÇãÇêÿaÇëÿuÇöÿÜÇùÇûÿÜÇüÿÜÇýÿÜÇþÿÜÉÿÓÉÿÜÉÿÜÉ$9É&ÿÜÉ*ÿÜÉ2ÿÜÉ4ÿÜÉ6É7ÿaÉ8É9ÿ}É:ÿÉ;É<ÿaÉFÿÜÉGÿÜÉHÿÜÉIÿ·ÉRÿÜÉTÿÜÉWÿÜÉXÉYÿˆÉZÿ­É\ÿuÉb9ÉdÿÜÉgÿÜÉhÉoÿÜÉpÿÜÉqÿÜÉrÿÜÉsÿÜÉyÿÜÉzÿÜÉ{ÿÜÉ|ÿÜÉ}ÿÜÉ~ÉÉ€ÉÉ©ÿ·ÉªÉ­9É®9ɯÿÜÉ´þøÉµÿɺÿuÉ»ÿaÉÅ/ÉÇ9ÉÉ9ÉÐÿÜÉÑÿÜÉÒÿÜÉÓÉÔÉÕÉãÉêÿaÉëÿuÉöÿÜÉùÉûÿÜÉüÿÜÉýÿÜÉþÿÜÐ9Ðÿ­ÐÿÜÐ$ÿÜÐ9ÿÜÐ;ÿ}Ð<ÿÐbÿÜЩÿÜЪЭÿÜЮÿÜдÿÓеÿÜлÿÐÅÿDÐÇÿÜÐÉÿÜÐêÿÑ9Ñÿ­ÑÿÜÑ$ÿÜÑ9ÿÜÑ;ÿ}Ñ<ÿÑbÿÜÑ©ÿÜѪѭÿÜÑ®ÿÜÑ´ÿÓѵÿÜÑ»ÿÑÅÿDÑÇÿÜÑÉÿÜÑêÿÒ9Òÿ­ÒÿÜÒ$ÿÜÒ9ÿÜÒ;ÿ}Ò<ÿÒbÿÜÒ©ÿÜÒªÒ­ÿÜÒ®ÿÜÒ´ÿÓÒµÿÜÒ»ÿÒÅÿDÒÇÿÜÒÉÿÜÒêÿÓ$Ó-Ó=ÿÜÓbÓ­Ó®ÓÇÓÉÓåÿÜÔ$Ô-Ô=ÿÜÔbÔ­Ô®ÔÇÔÉÔåÿÜÕ$Õ-Õ=ÿÜÕbÕ­Õ®ÕÇÕÉÕåÿÜã$&ã&ã*ã2ã4ã6ãb&ãdãgã­&ã®&ã¯ãÇ&ãÉ&ãÐãÑãÒãããöãùãûãýåÿÜå©åªå´ÿÜåµÿÜåÅÿÜéé©éªé´ÿ¤éµÿéÅÿ·êÿ êþaêþðê$ÿaê&ÿê2ÿêDþæêHþðêLÿ·êRþðêXÿêbÿaêdÿêgÿêiþæêjþæêkþæêlþæêmþæênþæêpþðêqþðêrþðêsþðêyþðêzþðê{þðê|þðê}þðê~ÿêÿê€ÿêÿê©ÿêªÿkê­ÿaê®ÿaê¯ÿê´ÿêµÿÜêÅþøêÇÿaêÉÿaêÐÿêÑÿêÒÿêûÿêýÿëÿÜëþÜëÿkë©ÿÜëªÿÜë´ëµëÅþÓììÿkìÿ·ì©ìªì´ÿÜìµìÅÿDöö$ö7ÿ·ö:ö<ÿšöbö©ÿÜöªÿÜö­ö®ö´ÿÓöµÿÓö»ÿšöÅÿÉöÇöÉöêÿšù$&ù&ù*ù2ù4ù6ùb&ùdùgù­&ù®&ù¯ùÇ&ùÉ&ùÐùÑùÒùãùöùùùûùýûû$û6û<ÿÜûbû©ÿÜûªÿÜû­û®û´ûµ&û»ÿÜûÅûÇûÉûãûêÿÜûùýý$ý6ý<ÿÜýbý©ÿÜýªÿÜý­ý®ý´ýµ&ý»ÿÜýÅýÇýÉýãýêÿÜýù MB@hmþ ¼þ‰þ‰ L GÌþBGÌSf €¯ JBits@ ûþšmãB±‹`#cÕVeraSansÿÿÿÿ6ÿÿþ628R00@                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        "                      "       #                       #     $               $    &              &    ÿÿ P ì_<õº¹ð¸ºÂg‘þ‰þ Lmpyepl-1.1.0+git12-g365f8e3/code/sound.py000066400000000000000000001002041127617341700173560ustar00rootroot00000000000000# PyEPL: sound.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides functions for playing and recording sounds. """ # import python modules import time import threading import numpy import math import struct import copy import string from os import uname from struct import unpack # import pyepl modules from transarchive import Archive import textlog from base import MediaFile import exputils import timing import exceptions import hardware import exputils from stimulus import Stimulus from hardware import addPollCallback, removePollCallback, SoundFile from exceptions import EPLFatalError class SoundException(EPLFatalError): def __init__(self, msg): EPLFatalError.__init__(self, msg) def printMsg(self): print "SoundException: ", self.__str__() class AudioClip(Stimulus): """ Manages sound data. """ def __init__(self, data=None): self.snd = data # constants: self.RESAMPLEDRATE = 44100 self.sampleWidth = 2 self.numchannels = 2 def getDuration(self): """ Return the duration of an AudioClip in milliseconds. OUTPUT ARGS: duration- returns length of AudioClip object in milliseconds. """ self.duration = (len(self.snd)*1000) / (self.RESAMPLEDRATE * self.sampleWidth * self.numchannels) return self.duration def stripChannel(self, rawstr): """ Strip the second channel from raw data in str form for saving. """ # Convert to numeric array xbuff = numpy.array(struct.unpack(str(len(rawstr)/self.sampleWidth) + 'h', rawstr), dtype=numpy.int16) # Drop a channel xbuff = xbuff[::2] # convert to a string newstr = xbuff.tostring() del xbuff return newstr def duplicateChannel(self, rawstr): """ Copy the data of a one-channel signal into another channel, to make a 2-channel signal. """ # add the second channel xbuff = numpy.zeros((len(rawstr)*2), dtype=numpy.int16) xbuff[::2] = rawstr; xbuff[1::2] = rawstr; # convert to a string sbuff = xbuff.tostring() del xbuff return sbuff def append(self, data, numchans): if not self.snd: self.snd = '' if numchans==1: # double the data buff = numpy.array(struct.unpack(str(len(data)/self.sampleWidth) + 'h', data), dtype=numpy.int16) data = self.duplicateChannel(buff) self.snd += data def present(self, clk = None, duration = None, jitter = None, bc = None, minDuration = None, doDelay = True): """ Present an AudioClip. If provided, the clock will be advanced by the duration/jitter passed in, otherwise it will advance the duration of the audio clip. If a ButtonChooser is provided, then present waits until the button is pressed before returning, advancing the clock to the point when the button was pressed. INPUT ARGS: clk- Optional PresentationClock for timing. duration/jitter- Duration to keep the stimulus on. bc - Optional ButtonChooser object. OUTPUT ARGS: timestamp- time and latency of when the sound was played. button- Button pressed if we passed in bc. bc_time- Time and latency of when the button was pressed (if provided) """ a = AudioTrack.lastInstance() # get the clock if needed if clk is None: clk = exputils.PresentationClock() # play the sound timestamp = a.play(self, t=clk, doDelay=doDelay) if bc: # wait for button press button,bc_time = bc.waitWithTime(minDuration, duration, clk) return timestamp, button, bc_time elif duration: # reset to before play and just advance the duration+jitter clk.delay(duration, jitter) return timestamp else: # keep the clock advanced the duration of the sound return timestamp def __add__(self,clip): """ Add two AudioClips together, aligning to the beginning of both and returning a clip the length of the longer clip. """ # convert from str to numpy array base = self.stripChannel(self.snd) toadd = self.stripChannel(clip.snd) base = numpy.array(struct.unpack(str(len(base)/self.sampleWidth) + 'h', base), dtype=numpy.int16) toadd = numpy.array(struct.unpack(str(len(toadd)/clip.sampleWidth) + 'h', toadd), dtype=numpy.int16) # see the diff in length clipdiff = len(base) - len(toadd) if clipdiff > 0: # append zeros to the clip toadd = numpy.concatenate([toadd,numpy.zeros(clipdiff)]) elif clipdiff < 0: # append zeros to the base base = numpy.concatenate([base,numpy.zeros(-clipdiff)]) newclip = base+toadd*.5 newclip = self.duplicateChannel(newclip) return AudioClip(newclip) class Beep(AudioClip): def __init__(self, freq, duration, risefalltime = 0, scalePercent = 0.8): """ Generate a beep of desired frequency, duration, and rise/fall time. Format of beep is in 16bit int samples. INPUT ARGS: freq- frequency of beep duration- length of time (in ms.) to play beep for. risefalltime- length of time (in ms.) for beep to rise from silence to full volume at beginning, and fall to no volume at end. scalePercent- Percent of the max audio range for the beep (defaults to .8). """ AudioClip.__init__(self) a = AudioTrack.lastInstance() # set the scale scale = a.eplsound.SCALE * scalePercent # Do some rate and ms conversions sampCycle = int(self.RESAMPLEDRATE/freq) sampDur = int(duration*self.RESAMPLEDRATE/1000) sampRise = int(risefalltime*self.RESAMPLEDRATE/1000) # Create the array at correct frequency buff = numpy.arange(0, sampDur*(2*math.pi)/sampCycle, (2*math.pi)/sampCycle) buff = scale * numpy.sin(buff) # Apply envelope if risefalltime > 0: env = numpy.arange(0, 1, float(1/float(sampRise))) buff[0:len(env)] = buff[0:len(env)]*env buff[-1:-(len(env)+1):-1] = buff[-1:-(len(env)+1):-1]*env # convert to int16 buff = buff.astype(numpy.int16) # convert duplicate to a 2nd channel self.snd = self.duplicateChannel(buff) # map strings to SoundFile constants: formatDict = {'aiff':SoundFile.SF_FORMAT_AIFF, 'alaw':SoundFile.SF_FORMAT_ALAW, 'au':SoundFile.SF_FORMAT_AU, 'avr':SoundFile.SF_FORMAT_AVR, 'htk':SoundFile.SF_FORMAT_HTK, 'ima_adpcm':SoundFile.SF_FORMAT_IMA_ADPCM, 'ircam':SoundFile.SF_FORMAT_IRCAM, 'mat4':SoundFile.SF_FORMAT_MAT4, 'mat5':SoundFile.SF_FORMAT_MAT5, 'ms_adpcm':SoundFile.SF_FORMAT_MS_ADPCM, 'nist':SoundFile.SF_FORMAT_NIST, 'paf':SoundFile.SF_FORMAT_PAF, 'pvf':SoundFile.SF_FORMAT_PVF, 'raw':SoundFile.SF_FORMAT_RAW, 'sds':SoundFile.SF_FORMAT_SDS, 'svx':SoundFile.SF_FORMAT_SVX, 'ulaw':SoundFile.SF_FORMAT_ULAW, 'voc':SoundFile.SF_FORMAT_VOC, 'adpcm':SoundFile.SF_FORMAT_VOX_ADPCM, 'w64':SoundFile.SF_FORMAT_W64, 'wav':SoundFile.SF_FORMAT_WAV, 'wavex':SoundFile.SF_FORMAT_WAVEX, 'xi':SoundFile.SF_FORMAT_XI} widthDict = {'short':SoundFile.SF_FORMAT_PCM_16, 'pcm24':SoundFile.SF_FORMAT_PCM_24, 'pcm32':SoundFile.SF_FORMAT_PCM_32, 'sbyte':SoundFile.SF_FORMAT_PCM_S8, 'ubyte':SoundFile.SF_FORMAT_PCM_U8, 'double':SoundFile.SF_FORMAT_DOUBLE, 'dpcm16':SoundFile.SF_FORMAT_DPCM_16, 'dpcm8':SoundFile.SF_FORMAT_DPCM_8, 'dwvw12':SoundFile.SF_FORMAT_DWVW_12, 'dwvw16':SoundFile.SF_FORMAT_DWVW_16, 'dwvw24':SoundFile.SF_FORMAT_DWVW_24, 'dwvwn':SoundFile.SF_FORMAT_DWVW_N, 'float':SoundFile.SF_FORMAT_FLOAT, 'g721_32':SoundFile.SF_FORMAT_G721_32, 'g723_24':SoundFile.SF_FORMAT_G723_24, 'g723_40':SoundFile.SF_FORMAT_G723_40, 'gsm610':SoundFile.SF_FORMAT_GSM610} endianDict = {'big':SoundFile.SF_ENDIAN_BIG, 'cpu':SoundFile.SF_ENDIAN_CPU, 'file':SoundFile.SF_ENDIAN_FILE, 'little':SoundFile.SF_ENDIAN_LITTLE} defaultFileSettings = {'format':'wav', 'sampleWidth':'short', 'channels':1, 'sampleRate':44100, 'endian':'little'} class FileAudioClip(MediaFile,AudioClip): """ Class to wrap sound data either being played from or saved to file. """ def __init__(self, *args, **fileargs): """ Construct a FileAudioClip. The constructor takes 1 or 2 positional arguments followed by 0 to 5 keyword arguments. POSITIONAL ARGUMENTS: For a play-mode FileAudioClip, pass a single positional argument with the path+filename of the sound-file to be played, or the path+filename followed by a dict with the keyword settings described under "KEYWORD ARGUMENTS". For a record-mode AudioClip, pass 2 positional arguments: pass an archive object for directing the recorded file as the first argument, and the desired name for the output file as the second. KEYWORD ARGUMENTS: These are only necessary for opening raw sound files. If you need to open a file containing raw sound data, you must supply the constructor with the keyword argument format='raw'. The following are the default settings for opening raw sound data. They can be overridden by passing alternate values as additional keyword arguements. sampleWidth=='short' channels==1 sampleRate==44100 endian=='little' Currently, the following settings are available for these fields: sampleWidth: may be any of the following strings: short, pcm24, pcm32, sbyte, ubyte, double, dpcm16, dpcm8, dwvw12, dwvw16, dwvw24, dwvwn, g721_32, g723_24, g723_40, gsm610 channels: any positive integer, usually 1 or 2. sampleRate: any positive integer, usually 22050 or 44100. endian: may be any of the following strings: big, cpu, file, little """ AudioClip.__init__(self) # PLAY MODE if len(args)==1 and isinstance(args[0],str): #if there's one arg and its a string, assume its the filename of an existing file self.filename=args[0] elif len(args)==2 and isinstance(args[1],dict): self.filename = args[0] fileargs = args[1] # register file options passed, if any self.fileSettings = copy.copy(defaultFileSettings) for key in fileargs.keys(): # make sure it's a real field try: val = self.fileSettings[key] except KeyError: raise SoundException('invalid field setting.') val = fileargs[key] # downcase the string args if isinstance(val, str): val = string.lower(val) self.fileSettings[key] = val # RECORD MODE if len(args)==2 and isinstance(args[1],str): # we are opening a new file archive = args[0] fname = archive.fullPath() + "/" + args[1] self.filename = fname + '.' + self.fileSettings['format'] soundfile = SoundFile.soundFile(self.filename, SoundFile.SFM_WRITE, formatDict['wav'] \ | widthDict[self.fileSettings['sampleWidth']], self.fileSettings['channels'], self.fileSettings['sampleRate']) del soundfile #initially, the file isn't loaded into memory self.sndStripped=None self.duration = None def getDuration(self): """ Return the duration of an AudioClip in milliseconds. OUTPUT ARGS: duration- returns length of AudioClip object in milliseconds. """ if self.duration is None: self.load() self.unload() return self.duration def load(self): """ Load the instance of the sound into memory. """ sizes = '-bh-i---l' if not self.snd: #if it's not loaded try: mode = SoundFile.SFM_READ if self.fileSettings['format']=='raw': format = formatDict[self.fileSettings['format']] \ | widthDict[self.fileSettings['sampleWidth']] \ | endianDict[self.fileSettings['endian']] # load the snd-file sfile = SoundFile.soundFile(self.filename, mode, format, self.fileSettings['channels'], self.fileSettings['sampleRate']) else: sfile = SoundFile.soundFile(self.filename, mode) # resample and read into a string data = sfile.readfile_short(self.RESAMPLEDRATE) self.fileSettings['channels'] = sfile.getChannels() nf = sfile.getFrames() del sfile if uname()[4].find('Power')>=0: # handle Mac endian-ness difference byteorder = '>' else: byteorder = '<' except: raise SoundException("Couldn't open sound file %s, exiting." % self.filename) # save the raw data to an array totalSamples = nf*self.fileSettings['channels'] self.snd = numpy.array(unpack(byteorder + str(totalSamples) + sizes[self.sampleWidth], data), dtype=numpy.int16) if len(self.snd)==0: raise SoundException("Sound file %s is empty." % self.filename) # calculate the duration self.duration = (len(data)*1000) / (self.RESAMPLEDRATE * self.sampleWidth * self.fileSettings['channels']) # duplicate channel if necessary if self.fileSettings['channels'] == 1: # duplicate it self.snd = self.duplicateChannel(self.snd) else: # just convert to string. self.snd = self.snd.tostring() def append(self, data, numchans): """ Append data to an audio clip. INPUT ARGS: data- raw audio bytes to add at the end of this AudioClip object numchans- the number of channels in the data-argument """ soundFile = SoundFile.soundFile(self.filename, SoundFile.SFM_RDWR, formatDict[self.fileSettings['format']] \ | widthDict[self.fileSettings['sampleWidth']], self.fileSettings['channels'], self.fileSettings['sampleRate']) if self.fileSettings['channels']==1 and numchans==2: # strip the second channel channelCorrectData = self.stripChannel(data) elif self.fileSettings['channels']==2 and numchans==1: # duplicate the data so we have 2 channels channelCorrectData = self.duplicateChannel(data) else: # number of channels to append matches the number of channels in soundfile channelCorrectData = data # append the data soundFile.append_short(channelCorrectData, len(channelCorrectData)/widthDict[self.fileSettings['sampleWidth']]) del soundFile # If the sound is loaded, append to the loaded sound, too if self.snd: AudioClip.append(self, data, numchans) def unload(self): """ Unloads the AudioClip's data from memory. This frees the memory used by the sound data. """ self.snd = None self.sndStripped = None def isLoaded(self): """ Tells if the AudioClip is loaded in memory. OUTPUT ARGS: Returns True if the AudioClip is loaded in memory, False if not. """ return self.snd is not None class AudioTrack(textlog.LogTrack): """ Provides audio I/O functionality. """ trackTypeName = "AudioTrack" logExtension = ".sndlog" def __init__(self, basename, archive = None, autoStart = True): """ Prepare the audio track. """ # init the sound class self.eplsound = hardware.EPLSound() # see if can play and record if self.eplsound.getPlayChans() > 0: self.canPlay = True else: self.canPlay = False if self.eplsound.getRecChans() > 0: self.canRecord = True else: self.canRecord = False # set up the track for loggin textlog.LogTrack.__init__(self, basename, archive, autoStart) if not archive: archive = exputils.session self.archive = archive self.recording = False self.playing = False # some parameters that control recording and playing self.rec_interval = 1000 # maximum time (in seconds) we'll append to buffer self.MAX_APPEND = .5 # in seconds self.play_interval = 250 self.bytes_per_sample = self.eplsound.FORMAT_SIZE * self.eplsound.NUM_CHANNELS self.bytes_per_append = int(math.floor(self.MAX_APPEND * self.eplsound.SAMPLE_RATE \ * self.bytes_per_sample)) self.currentClip = None def startLogging(self): """ Begin logging audio events. """ textlog.LogTrack.startLogging(self) def stopLogging(self): """ End logging audio events. """ textlog.LogTrack.stopLogging(self) def startService(self): """ Create the sound system and start the stream. """ self.eplsound.startstream() def stopService(self): """ Clean up the sound system. """ self.playStop() self.stopRecording() self.eplsound.stopstream() def play(self, soundClip, t = None, ampFactor=1.0, doDelay=True): """ Play an AudioClip and return the time and latency of when the sound played. INPUT ARGS: soundClip- AudioClip object of the sound to be played t- Optional PresentationClock for timing. ampFactor- Optional amplification of sound. (default value is 1) doDelay- Optionally do not tare and move the presentation clock forward. Defaults to True (moving the clock forward) OUTPUT ARGS: timestamp- time and latency when sound playing began. """ # Must be sure to not get multiple callbacks at once, so # playing a soundclip while another is running causes that # other one to stop immediately, even if it is not done playing. # self.playStop() # handle special case: if it's a FileAudioClip and needs loading, # load it. self.currentClip = soundClip if isinstance(soundClip, FileAudioClip): if not soundClip.isLoaded(): # load and append the sound soundClip.load() # for logging shortName = soundClip.filename else: shortName = "NOFILE" if isinstance(t, exputils.PresentationClock): clk = t else: clk = exputils.PresentationClock() t = clk.get() if not soundClip.snd is None: # first, compute how many bytes our initial chunk # to append is. ASSUMPTION: always starting from byte 0. firstbytes = min(self.bytes_per_append, len(soundClip.snd)) self.total_samples = int(math.floor(len(soundClip.snd)/self.eplsound.FORMAT_SIZE)) if self.playing: # stop the playing sound 5ms prior to the new time timing.timedCall(t-5, self.playStop, False) self.playing = True self.eplsound.resetSamplesPlayed() (timeInterval, appended) = timing.timedCall(t, self.eplsound.append, soundClip.snd[0:firstbytes], len(soundClip.snd[0:firstbytes])/self.eplsound.FORMAT_SIZE, 0, ampFactor) if doDelay: # accumulate the error clk.accumulatedTimingError += timeInterval[0]-t # tare the clock and delay the proper amount clk.tare(timeInterval[0]) clk.delay(soundClip.getDuration()) # it would be great if the soundClip knew the formatsize... if appended < self.total_samples: # mark the offset into the sound clip self.startInd = appended*self.eplsound.FORMAT_SIZE self.endInd = len(soundClip.snd) #self.total_samples*self.eplsound.FORMAT_SIZE # Add the callback to continue playing self.last_play = timeInterval[0] addPollCallback(self.__playCallback__, soundClip.snd, 0, ampFactor) dur = soundClip.getDuration() else: dur = 0 timeInterval = (t,0) # log message self.logMessage("%s\t%s\t%s" % ("P",shortName,dur), timeInterval) return timeInterval def __playCallback__(self, s, ow, ampFactor): """ Timer for appending the remainder of a sound. """ currentTime = timing.now() if self.playing and currentTime >= self.last_play + self.play_interval: # see if stop the time if self.startInd < self.endInd: # determine how much to append actualInd = self.startInd + self.bytes_per_append # make sure it's not beyond the end if actualInd > self.endInd: # just set to the end actualInd = self.endInd # append the sound appended = self.eplsound.append(s[self.startInd:actualInd], len(s[self.startInd:actualInd])/self.eplsound.FORMAT_SIZE, 0, ampFactor) self.last_play = currentTime # update the startInd if appended > 0: self.startInd += appended*self.eplsound.FORMAT_SIZE else: # no more sound if (self.eplsound.getSamplesPlayed()*self.eplsound.NUM_CHANNELS)>=self.total_samples: self.playStop() def playLoopStop(self, doUnload=True): self.playStop(doUnload) def playStop(self, doUnload=True): if self.playing: self.playing = False removePollCallback(self.__playCallback__) removePollCallback(self.__playLoopCallback__) # clear the sound buffer to stop playing self.eplsound.clearPlayBuffer() if isinstance(self.currentClip, FileAudioClip) and self.currentClip.isLoaded() and doUnload: self.currentClip.unload() return self.eplsound.getSamplesPlayed() def playLoop(self, soundClip, t = None, ampFactor=1.0, doDelay=True): """ Play an AudioClip and return the time and latency of when the sound played. INPUT ARGS: soundClip- AudioClip object of the sound to be played t- Optional PresentationClock for timing. ampFactor- Optional amplification of sound. (default value is 1) doDelay- Optionally do not tare and move the presentation clock forward. Defaults to True (moving the clock forward) OUTPUT ARGS: timestamp- time and latency when sound playing began. """ # Must be sure to not get multiple callbacks at once, so # playing a soundclip while another is running causes that # other one to stop immediately, even if it is not done playing. # self.playStop() # handle special case: if it's a FileAudioClip and needs loading, # load it. self.currentClip = soundClip if isinstance(soundClip, FileAudioClip): if not soundClip.isLoaded(): # load and append the sound soundClip.load() # for logging shortName = soundClip.filename else: shortName = "NOFILE" if isinstance(t, exputils.PresentationClock): clk = t else: clk = exputils.PresentationClock() t = clk.get() if not soundClip.snd is None: # first, compute how many bytes our initial chunk # to append is. ASSUMPTION: always starting from byte 0. firstbytes = min(self.bytes_per_append, len(soundClip.snd)) self.total_samples = int(math.floor(len(soundClip.snd)/self.eplsound.FORMAT_SIZE)) if self.playing: # stop the playing sound 5ms prior to the new time timing.timedCall(t-5, self.playStop, False) self.playing = True self.eplsound.resetSamplesPlayed() (timeInterval, appended) = timing.timedCall(t, self.eplsound.append, soundClip.snd[0:firstbytes], len(soundClip.snd[0:firstbytes])/self.eplsound.FORMAT_SIZE, 0, ampFactor) if doDelay: # accumulate the error clk.accumulatedTimingError += timeInterval[0]-t # tare the clock and delay the proper amount clk.tare(timeInterval[0]) clk.delay(soundClip.getDuration()) # it would be great if the soundClip knew the formatsize... # mark the offset into the sound clip self.startInd = appended*self.eplsound.FORMAT_SIZE self.endInd = len(soundClip.snd) #self.total_samples*self.eplsound.FORMAT_SIZE # Add the callback to continue playing self.last_play = timeInterval[0] #addPollCallback(self.__playLoopCallback__, soundClip.snd, 0, ampFactor) addPollCallback(self.__playLoopCallback__, 0, ampFactor) dur = soundClip.getDuration() else: dur = 0 # log message self.logMessage("%s\t%s\t%s" % ("P",shortName,dur), timeInterval) return timeInterval def __playLoopCallback__(self, ow, ampFactor): """ Timer for appending the remainder of a sound. """ currentTime = timing.now() if self.playing and currentTime >= self.last_play + self.play_interval: # see if stop the time if self.startInd < self.endInd: # do the sound s = self.currentClip.snd # determine how much to append toplay = self.eplsound.getBufferUsed() toappend = self.bytes_per_append - toplay if toappend <= 0: return actualInd = self.startInd + toappend # self.bytes_per_append # make sure it's not beyond the end if actualInd > self.endInd: # just set to the end actualInd = self.endInd # append the sound appended = self.eplsound.append(s[self.startInd:actualInd], len(s[self.startInd:actualInd])/self.eplsound.FORMAT_SIZE, 0, ampFactor) self.last_play = currentTime # update the startInd if appended > 0: self.startInd += appended*self.eplsound.FORMAT_SIZE else: # no more sound, so start again right away self.startInd = 0 def startRecording(self, basename = None, t = None, **sfargs): """ Starts recording and returns a tuple of the AudioClip and the time of recording onset. INPUT ARGS: t- optional PresentationClock for timing. sfargs- keyword arguments for FileAudioClip constructor OUTPUT ARGS: recClip- The AudioClip object that will contain the recorded data. timestamp- time and latency when sound recording began. """ if not self.recording: # get a new audio clip to record to if not basename is None: # send output to file self.recClip = FileAudioClip(self.archive, basename, **sfargs) else: # record in memory if len(sfargs)>0: raise SoundException("Cannot pass sfargs to AudioClip constructor; you must be recording to file.") self.recClip = AudioClip() # start recording if isinstance(t, exputils.PresentationClock): t = t.get() (timeInterval,val) = timing.timedCall(t, self.eplsound.recstart) # Add the callback to continue recording self.recording = True self.last_rec = timeInterval[0] addPollCallback(self.__recCallback__) # log message if basename: shortName = self.recClip.filename else: shortName = "NOFILE" self.logMessage("%s\t%s" % ("RB",shortName),timeInterval) return (self.recClip,timeInterval) def flush(self): """ Flush the recording buffer. """ currentTime = timing.now() newstuff = self.getBuffData() # Update the last time self.last_rec = currentTime if len(newstuff) > 0: # append the data to the clip self.recClip.append(newstuff, self.eplsound.getRecChans()) def __recCallback__(self): """ Internal callback function, only for use by pyEpl functions. Thread function for recording, called by startRecording. """ currentTime = timing.now() if self.recording and currentTime >= self.last_rec + self.rec_interval: newstuff = self.getBuffData() # Update the last time self.last_rec = currentTime if len(newstuff) > 0: # append the data to the clip self.recClip.append(newstuff, self.eplsound.getRecChans()) def getBuffData(self): # allocate a buffer of appropriate length bufflen = self.eplsound.REC_BUF_LEN*self.eplsound.getSampleRate()*self.eplsound.getRecChans() buff = ' '*bufflen*self.eplsound.FORMAT_SIZE # use it to receive recorded data consumed = self.eplsound.consume(buff, bufflen) return buff[0:consumed*self.eplsound.FORMAT_SIZE] def stopRecording(self, t = None): """ Stops recording and returns the resulting audio clip and the time recording ended. INPUT ARGS: t- optional PresentationClock for timing. OUTPUT ARGS: recClip- The AudioClip object that contains the recorded data. timestamp- time and latency when sound recording ended. """ if self.recording: # stop recording if isinstance(t, exputils.PresentationClock): t = t.get() (timeInterval,val) = timing.timedCall(t, self.eplsound.recstop) # Remove the recording callback self.recording = False removePollCallback(self.__recCallback__) # get the rest of the data from recbuffer newstuff = self.getBuffData() if len(newstuff) > 0: # append the data to the clip self.recClip.append(newstuff, self.eplsound.getRecChans()) # log message if isinstance(self.recClip, FileAudioClip): shortName = self.recClip.filename else: shortName = "NOFILE" self.logMessage("%s\t%s" % ("RE", shortName), timeInterval) r = self.recClip del self.recClip return (r, timeInterval) def record(self, duration, basename = None, t = None, **sfargs): """ Perform a blocked recording for a specified duration (in milliseconds). INPUT ARGS: duration- length of time (in ms.) to record for. basename- filename to save recorded data to. t- optional PresentationClock for timing. sfargs- keyword arguments passed to FileAudioClip constructor OUTPUT ARGS: recClip- The AudioClip object that contains the recorded data. timestamp- time and latency when sound recording began. """ if not t: t = timing.now() elif isinstance(t, exputils.PresentationClock): clk = t t = clk.get() clk.delay(duration) (r,starttime) = self.startRecording(basename, t = t, **sfargs) (r,stoptime) = self.stopRecording(t = t + duration) return (r,starttime) def combineClips(self,clips): """ Combine a list of AudioClips together, aligning to the beginning of both and returning a clip the length of the longer clip. """ # start with None base = None for clipinfo in clips: # split out the info if isinstance(clipinfo,tuple): clip = clipinfo[0] clipOffset = clipinfo[1] else: clip = clipinfo clipOffset = 0 # convert from str to numpy array toadd = clip.stripChannel(clip.snd) toadd = numpy.array(struct.unpack(str(len(toadd)/clip.sampleWidth) + 'h', toadd), dtype=numpy.int64) # add in on beginning if necessary if clipOffset > 0: toadd = numpy.concatenate([numpy.zeros(clipOffset),toadd]) if base is None: base = toadd else: # see the diff in length clipdiff = len(base) - len(toadd) if clipdiff > 0: # append zeros to the clip toadd = numpy.concatenate([toadd,numpy.zeros(clipdiff)]) elif clipdiff < 0: # append zeros to the base base = numpy.concatenate([base,numpy.zeros(-clipdiff)]) # add the new signal base = base + toadd # normalize the clips to the max maxval = numpy.abs(base).max() if maxval > self.eplsound.SCALE: base = base * self.eplsound.SCALE / maxval # convert back to int16 base = base.astype(numpy.int16) return AudioClip(clips[0].duplicateChannel(base)) pyepl-1.1.0+git12-g365f8e3/code/stimulus.py000066400000000000000000000012121127617341700201120ustar00rootroot00000000000000# PyEPL: stimulus.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ The stimulus class is in here. """ class Stimulus: """ Base class that is foundation for presentable stimuli. """ def present(self, clk = None, duration = None, jitter = None, bc = None, minDuration = None): """ Method, which must be overridden for each stimulus class """ pass pyepl-1.1.0+git12-g365f8e3/code/tests/000077500000000000000000000000001127617341700170215ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/tests/soundTest.py000066400000000000000000000027241127617341700213700ustar00rootroot00000000000000# PyEPL: tests/soundTest.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. #!/usr/bin/python # this module tests sound functionality # it assumes pyepl has been installed for the scoping to be correct. from pyepl.locals import * exp = Experiment() exp.parseArgs() exp.setup() audio = AudioTrack("audio") video = VideoTrack("video") beepdur = 500 numSecs = 5 recdur = 1000*numSecs reps = 3 clk = PresentationClock() video.clear("black") video.updateScreen(clk) # make a beep beep1 = Beep(400, beepdur, 100) beep1.present(clk) # start recording... (notsnd, starttime) = audio.startRecording(None, clk.get()) for i in range(numSecs): t = video.showCentered(Text("Recording: %d" % (i+1),color=(1,0,0))) video.updateScreen(clk) clk.delay(1000) video.unshow(t) video.updateScreen(clk) # stop recording (snd, stoptime) = audio.stopRecording(t=clk.get()) for r in range(reps): # beep beep1.present(clk) # play sound, don't increment the clock though audio.play(snd, clk, doDelay=False) for i in range(numSecs): t = video.showCentered(Text("Rep %d, Playing: %d" % (r+1, numSecs-i))) video.updateScreen(clk) clk.delay(1000) video.unshow(t) video.updateScreen(clk) clk.delay(1000) clk.wait() pyepl-1.1.0+git12-g365f8e3/code/tests/test_eeg.py000066400000000000000000000042411127617341700211730ustar00rootroot00000000000000#!/usr/bin/python from numpy.testing import * from pyepl.transarchive import Archive from pyepl.hardware import pollEvents from pyepl.exputils import Experiment from pyepl.eeg import EEGTrack from pyepl import timing import os from shutil import rmtree basename = "eeg" archive_name = "eeg_test_output" test_duration = 10000 required_events = ['EXPSTART_TRAIN', 'TRAIN_UP', 'TRAIN_DN', 'UP', 'DN'] class test_eeg(NumpyTestCase): def setUp(self): self.exp = Experiment(use_eeg=False) print "Created Experiment object." self.eeg = EEGTrack(basename, Archive(archive_name), autoStart=False) print "Created EEGTrack object." def check_callback(self): """ Loop for several seconds as sync pulses get sent intermittently. If we last for more than a few seconds there are no problems with the pollEvents recursion_level. """ try: mstime = timing.now() self.eeg.startService() self.eeg.startLogging() while True: if timing.now()-mstime >= test_duration: break pollEvents() except: print "Caught exception." # inspect output file assert self.inspectLog(), "Didn't find a required EEG pulse event." def inspectLog(self): """ Check the log file for the events listed under required_events. """ logname = os.path.join(archive_name, basename + "." + basename + "log") logfile = open(logname) lines = logfile.readlines() for e in required_events: found = False for l in lines: cols = l.split() if cols[-1]==e: found = True break if not found: # if we got here without finding a required # event-class, something's wrong return False return True def tearDown(self): self.eeg.stopLogging() self.eeg.stopService() del self.exp del self.eeg rmtree(archive_name) if __name__ == '__main__': NumpyTest().run() pyepl-1.1.0+git12-g365f8e3/code/textlog.py000066400000000000000000000073231127617341700177240ustar00rootroot00000000000000# PyEPL: textlog.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides a way to easily keep event logs. """ from base import Track from exceptions import EPLFatalError import timing import os # import exputils is at the bottom to fix import errors class LogTrack(Track): """ Respresents a textual event log. """ trackTypeName = "LogTrack" logExtension = ".log" def __init__(self, basename, archive = None, autoStart = True): """ """ # Make sure we have an archive if not archive: if not exputils.session: raise EPLFatalError("Log cannot be created without a subject archive. An archive must either be passed as 2nd argument to constructor, or be a non-null referent of exputils.session.") archive = exputils.session self.dataFile = archive.createFile(basename + self.__class__.logExtension) self.logall = False # see if start service and logging if autoStart: self.startService() self.startLogging() def __iter__(self): """ Iterate through (timestamp, withinTick, text)s of the messages in the log chronologically. Not thread-safe! """ wt = -1 last_ts = -1 filepos = 0 while True: self.dataFile.seek(filepos) line = self.dataFile.readline().strip() filepos = self.dataFile.tell() if line == "": return tab = line.find("\t") ts = long(line[:tab]) tab2 = line.find("\t", tab + 1) ml = long(line[tab + 1:tab2]) txt = line[tab2 + 1:] if ts == last_ts: wt += 1 else: wt = 0 last_ts = ts yield (ts, ml), wt, txt def newTarget(self, archive): """ Switch to a new archive location for this log. """ waslogging = self.logall self.stopLogging() self.dataFile = archive.createFile(os.path.basename(self.dataFile.name)) if waslogging: self.startLogging() def startLogging(self): """ Begin logging. """ if not self.logall: self.logall = True self.logMessage("B\tLogging Begins") def stopLogging(self): """ Stop logging. """ if self.logall: self.logMessage("E\tLogging Ends") self.logall = False self.dataFile.flush() def logMessage(self, message, timestamp = None): """ Add message to log. INPUT ARGS: message- String to add to log. timestamp- Timestamp for this log entry. If this is None, then the current time used as the timestamp. """ if self.logall: if isinstance(timestamp, exputils.PresentationClock): timestamp = (timestamp.get(), 0L) elif timestamp is None: timestamp = (timing.now(), 0L) elif not isinstance(timestamp, tuple): timestamp = (timestamp, 0L) self.dataFile.seek(0, 2) # seek to end of file self.dataFile.write("%s\t%s\t%s\n" % (timestamp[0], timestamp[1], message)) def flush(self): """ Ensures that this log's data is entirely written to disk. """ self.dataFile.flush() import exputils # we do this afterward because of "import from" dependencies pyepl-1.1.0+git12-g365f8e3/code/timing.py000066400000000000000000000023631127617341700175240ustar00rootroot00000000000000# PyEPL: timing.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This module provides high-level timing features. """ import hardware import exputils now = hardware.universal_time timedCall = hardware.timedCall def timedCall(t, f, *targs, **dargs): """ At time t, call f with any remaining arguments. Returns a 2-tuple of a timestamp for the time and maximum latency of the actual call to f, and the return value of the call. If t is None or 0, the call is made immediately. INPUT ARGS: t- time at which to execute call. This can be specified as an integer specifying a millisecond time to run, OR as a PresentationClock object. f- a callable to run at the specified time args- arguments to pass to f when it is called. """ if isinstance(t, exputils.PresentationClock): return hardware.timedCall(t.get(), f, *targs, **dargs) return hardware.timedCall(t, f, *targs, **dargs) delay = hardware.delay wait = hardware.wait pyepl-1.1.0+git12-g365f8e3/code/transarchive.py000066400000000000000000000222571127617341700207320ustar00rootroot00000000000000# PyEPL: ./transarchive.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. # Revision 1.5 2005/11/08 23:04:01 aaron # log test # """ Module for accessing heirarchical disk data. """ from pyepl.exceptions import BadFileExtension import os import shutil import StringIO from tempfile import TemporaryFile import tarfile import weakref class AbstractArchive: """ Abstract interface to heirarchical data storage (file systems). """ def copyTo(self, arc): """ Replicate contents within arc. """ for name in self.listDir(): if self.isFile(name): src = self.open(name) src.seek(0) trg = arc.createFile(name) trg.seek(0) trg.write(src.read()) else: self.open(name).copyTo(arc.createDirectory(name)) def listDir(self): """ Return a list of filenames in this Archive. """ pass #... def exists(self, name): """ Return true if file exists. Otherwise return False. """ pass #... def isFile(self, name): """ Return true if name specifies a file (not a directory). Otherwise return False. """ pass #... def delete(self, name): """ Delete named file or directory. """ pass #... def open(self, name): """ If the name specifies a file, return a file or file-like object (rw for non-compressed, r for compressed). If it's a directory, return a new Archive object. """ pass #... def createDirectory(self, name): """ Create an empty directory. """ pass #... def createFile(self, name): """ Create an empty file. """ pass #... class VirtualArchive(AbstractArchive): """ Class to represent a virtual directory. """ def __init__(self): """ Create empty virtual directory. """ self.dir = {} def listDir(self): """ Return a list of filenames in this Archive. """ return self.dir.keys() def exists(self, name): """ Return true if file exists. Otherwise return False. """ return name in self.dir.keys() def isFile(self, name): """ Return true if name specifies a file (not a directory). Otherwise return False. """ return isinstance(self.dir[name], StringIO.StringIO) def delete(self, name): """ Delete named file or directory. """ del self.dir[name] def open(self, name): """ If the name specifies a file, return a file or file-like object (rw for non-compressed, r for compressed). If it's a directory, return a new Archive object. """ return self.dir[name] def createDirectory(self, name): """ Create an empty directory. """ x = SoftArchive() self.dir[name] = x return x def createFile(self, name): """ create an emptry file. """ x = StringIO.StringIO() self.dir[name] = x return x class Archive(AbstractArchive): """ Class to represent a physical directory. """ def __init__(self, path): """ Construct archive object from path. """ path = os.path.abspath(path) if not os.path.exists(path): os.mkdir(path) self.path = path def listDir(self): """ Return a list of filenames in this Archive. """ return os.listdir(self.path) def exists(self, name): """ Return true if file exists. Otherwise return False. """ return os.path.exists(self.fullPath(name)) def isFile(self, name): """ Return true if name specifies a file (not a directory). Otherwise return False. """ return not os.path.isdir(self.fullPath(name)) def delete(self, name): """ Delete named file or directory. """ fp = self.fullPath(name) if os.path.isdir(fp): shutil.rmtree(fp) else: os.remove(fp) def open(self, name): """ If the name specifies a file, return a file or file-like object (rw for non-compressed, r for compressed). If it's a directory, return a new Archive object. """ p = self.fullPath(name) if os.path.isdir(p): return Archive(p) return open(p, "r+b") def fullPath(self, name = ""): """ Return the absolute path of this archive. """ return os.path.join(self.path, name) def createDirectory(self, name): """ Create an empty directory. """ if not self.exists(name): os.mkdir(self.fullPath(name)) return self.open(name) def createFile(self, name): """ create an emptry file. """ if not self.exists(name): open(self.fullPath(name), "w") return open(self.fullPath(name), "r+b") class TarredFile: """ """ def __init__(self, tarpath, arc): """ """ tf = TemporaryFile() self.tarpath = tarpath self.arc = arc self.stored_away = False def __getattr__(self, name): """ """ return getattr(self.tf, name) def store_away(self): """ """ if not self.stored_away: self.stored_away = True self.tf.seek(0, 2) ti = tarfile.TarInfo(self.tarpath) ti.size = self.tf.tell() self.tf.seek(0) self.arc.addfile(ti, self.tf) def __del__(self): """ """ self.store_away() del tf def close(self): """ """ self.store_away() tf.close() class TarArchive(AbstractArchive): """ """ def __init__(self, filename, arc = None): """ """ if arc: self.arc = arc self.tarpath = filename return if os.path.exists(filename): self.arc = tarfile.open(filename, "r") else: if filename.endswith(".tar"): self.arc = tarfile.open(filename, "w") elif filename.endswith(".tgz") or filename.endswith(".tar.gz"): self.arc = tarfile.open(filename, "w:gz") elif filename.endswith(".tar.bz2"): self.arc = tarfile.open(filename, "w:bz2") else: raise BadFileExtension, "Tarfile with extension: %s" % os.path.splitext(filename)[1][1:].upper() self.tarpath = "" self.openned = weakref.WeakValueDictionary() def listDir(self): """ Return a list of filenames in this Archive. """ r = [] tp = len(self.tarpath) for name in self.arc.getnames(): if name.startswith(self.tarpath): r.append(name[tp:name.find("/", tp)]) return r def exists(self, name): """ Return true if file exists. Otherwise return False. """ try: self.arc.getmember(self.tarpath + name) return True except KeyError: return False def isFile(self, name): """ Return true if name specifies a file (not a directory). Otherwise return False. """ return self.arc.getmember(self.tarpath + name).isfile() def delete(self, name): """ Delete named file or directory. """ raise ValueError, "TarArchive does not support deletion." def open(self, name): """ If the name specifies a file, return a file or file-like object (rw for non-compressed, r for compressed). If it's a directory, return a new Archive object. """ try: return self.openned[name] except KeyError: pass fn = self.tarpath + name ti = self.arc.getmember(fn) if ti.type == tarfile.DIRTYPE: return TarArchive(fn + "/", self.arc) r = self.arc.extractfile(ti) self.openned[name] = r return r def createDirectory(self, name): """ Create an empty directory. """ fn = self.tarpath + name ti = tarfile.TarInfo(fn) ti.type = tarfile.DIRTYPE self.arc.addfile(ti) r = TarArchive(fn + "/", self.arc) self.openned[name] = r return r def createFile(self, name): """ Create an empty file. """ r = TarredFile(self.tarpath + name, self.arc) self.openned[name] = r return r def openArchive(filename): """ """ if filename.endswith(".tar") or filename.endswith(".tgz") or filename.endswith(".tar.gz") or filename.endswith(".tar.bz2"): return TarArchive(filename) else: return Archive(filename) pyepl-1.1.0+git12-g365f8e3/code/version.py000066400000000000000000000024031127617341700177150ustar00rootroot00000000000000# PyEPL: version.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ Version management module. """ from distutils.version import StrictVersion from exceptions import EPLFatalError ## !!!!! ## MAKE SURE THIS MATCHES THE VERSION NUMBER IN pyepl/setup.py !!! vstr = '1.1.0' ## !!!!! pyeplVersion = StrictVersion(vstr) def checkVersion(someString): """ Check that the current pyepl Version >= argument string's version. """ if not pyeplVersion >= StrictVersion(someString): raise EPLFatalError("This experiment requires at least PyEPL version %s, but currently only version %s is installed." % (someString, vstr)) def checkVersionRange(str1, str2): """ Check that the current pyepl version is in the version-range described by the 2 argument strings. """ if not (pyeplVersion >= StrictVersion(str1) and pyeplVersion <= StrictVersion(str2)): raise EPLFatalError("This experiment requires a PyEPL version between %s and %s, but currently %s is installed." % (str1, str2, vstr)) pyepl-1.1.0+git12-g365f8e3/code/virtualtrack.py000066400000000000000000000110051127617341700207410ustar00rootroot00000000000000# PyEPL: virtualtrack.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. from base import Track import re import itertools class VirtualTrack(Track): """ This class allows the creation of tracks which combine information from other tracks. """ logExtension = ".vtrack" def __init__(self, *columns): """ Each argument represents a column that will be represented in the VirtualTrack. They may have the following formats: 1. A 2-tuple of source track and source column number. eg. (audio, 1) 2. A 3-tuple, as in #1, with the last element being a regular expression against which the full original row will be compared. The row will contribute a value to this column if and only in the regular expression matches. eg. (audio,2,"^BEEP\t") 3. A 4-tuple, as in #2, with the last element being a default value to be used in the case that no matching value is available from the source track. If the regular expression is None, no regular expression is used and the defaults value is still used for other circumstances in which no value is available. Without this paremeter, an empty string is used. eg. (audio,3,"^BEEP\t","no match") 4. A callable accepting a PyEPL millisecond time and returning a 2-tuple of a value for the column at the provided millisecond time and a maximum latency for the accuracy of that value. This type of column is valued only when at least one other column is valued. eg. eeg.offset Example: VirtualTrack(eeg.offset, (audio, 1, "^BEEP\t"), (audio, 2, "^BEEP\t")) INPUT ARGS: columns- A variable number of virtual column specifiers as described in items 1-4 above. """ Track.__init__(self) self.columns = columns def getNextVal(self, column, citer): """ Internal use only! """ for x in citer: if len(column) >= 3 and not column[2] is None and not re.compile(column[2]).search(x[2]): continue return (x[0], x[1], x[2].split("\t")[column[1]]) return None def __iter__(self): """ Iterate chronologically through 3-tuples of marked event times, within tick order numbers, texts for all components. OUTPUTS: g- a generator for each of the entries in the virtual track. """ iters = [] nextvals = [] for column in self.columns: if isinstance(column, tuple): i = iter(column[0]) iters.append(i) nextvals.append(self.getNextVal(column, i)) else: iters.append(None) nextvals.append(None) wt = 0 lasttick = None while True: earliest = None for nextval in nextvals: if not nextval is None and (nextval[0][0] < earliest or earliest is None): earliest = nextval[0][0] if earliest is None: return if earliest == lasttick: wt += 1 else: wt = 0 lasttick = earliest columnvals = [] maxlat = 0 for n, (column, nextval, citer) in enumerate(itertools.izip(self.columns, nextvals, iters)): if isinstance(column, tuple): if not nextval is None and nextval[0][0] == earliest: lat = nextval[0][1] columnvals.append(str(nextval[2])) nextvals[n] = self.getNextVal(column, citer) else: lat = 0 if len(column) == 4: columnvals.append(column[3]) else: columnvals.append("") else: value, lat = column(earliest) columnvals.append(str(value)) if lat > maxlat: maxlat = lat yield ((earliest, maxlat), wt, "\t".join(columnvals)) pyepl-1.1.0+git12-g365f8e3/code/vr/000077500000000000000000000000001127617341700163065ustar00rootroot00000000000000pyepl-1.1.0+git12-g365f8e3/code/vr/__init__.py000066400000000000000000000340641127617341700204260ustar00rootroot00000000000000# PyEPL: vr/__init__.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ This package provides the virtual reality features of PyEPL. """ import pyepl.hardware.vr import pyepl.display from pyepl.display import ActiveShowable from pyepl.textlog import LogTrack import pyepl.mechinput import weakref import randomposition import geometry class NoSkyboxImageError(Exception): pass class VEye(ActiveShowable): """ A VEye represents a virtual camera. It can be controlled independently, or attached to an avatar. """ def __init__(self, eye, name, track, avatar = None): """ Construct a VEye object from a LowVEye (low-level implementation), a name, a VRTrack, and possibily an avatar to which the eye is attached. """ ActiveShowable.__init__(self) self.eye = eye self.name = name self.track = track self.avatar = avatar if avatar: self.lookat = None else: self.lookat = (self.name, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) def reposition(self, x, y, z, yaw, pitch, roll): """ Position the camera. """ self.eye.reposition(x, y, z, yaw, pitch, roll) self.lookat = (self.name, pos[0], pos[1], pos[2], target[0], target[1], target[2], up[0], up[1], up[2], None) def setFOV(self, fov): """ Set the field of view, in radians, without moving the camera. """ self.eye.setFOV(fov) self.lookat = (self.name, 0, 0, 0, 0, 0, 0, 0, 0, 0, fov) def show(self, x, y): """ Render the scene to the screen. """ if self.avatar: self.avatar.drawNotify(self) self.eye.draw(x, y) if self.lookat: self.track.eyeLookAtLog(*self.lookat) self.lookat = None def getSize(self): """ """ return self.eye.getSize() def logLine(self): """ Uniquely represent this object for the display log. """ return "VEYE\t%s\t%d\t%d" % ((self.name,) + self.eye.getSize()) class VAvatar: """ A VAvatar object represents a user's position, orientation, and body shape in the virtual environment. """ def __init__(self, avatar, name, track): """ Construct a VAvatar from a LowVAvatar (low-level implementation), a name, and a VRTrack. """ self.avatar = avatar self.name = name self.track = track self.eyes = [] self.controls = {} def newEye(self, name, xsize = None, ysize = None): """ Create a VEye attached to this avatar with the dimensions provided. """ if xsize == None or ysize == None: xsize, ysize = self.track.videotrack.getResolution() eye = VEye(pyepl.hardware.vr.LowVEye(self.track.env, xsize, ysize), name, self.track, self) self.avatar.attachEye(eye.eye) self.track.eyeAttachLog(name, self.name) self.eyes.append(weakref.ref(eye, self.expireEye)) return eye def expireEye(self, eyeref): """ This fuction is used for housekeeping when an attached eye is destroyed. """ if eyeref(): self.avatar.dettachEye(eyeref().eye) # will this ever happen? :-( self.eyes.remove(eyeref) def drawNotify(self, eye): """ When one of our attached eyes is about to render itself to the screen, we want to know so that we can make sure that the camera positions are up-to-date. """ if eye == self.eyes[0](): self.avatar.travel(**dict(map(lambda item: (item[0], item[1].getPosition()), self.controls.iteritems()))) self.track.avatarMoveLog(self.name, *self.avatar.positionOrientation()) def positionOrientation(self): """ """ return self.avatar.positionOrientation() def setControls(self, **controls): """ Set mechanical input abstraction objects to control this avatar's movement. """ self.controls = controls class VRTrack(LogTrack): """ This class is the starting point for access to all VR features. It can keep a log of all VR activity. """ logExtension = ".vrlog" def __init__(self, basename, archive = None, autoStart = True): """ Create the VRTrack. """ self.env = None LogTrack.__init__(self, basename, archive, autoStart) self.archive = archive self.logqueue = [] def startService(self): self.videotrack = pyepl.display.VideoTrack.lastInstance() self.cb = self.markScreenUpdate self.videotrack.addUpdateCallback(self.cb) self.env = pyepl.hardware.vr.LowVEnvironment() def stopService(self): try: self.videotrack.removeUpdateCallback(self.cb) except AttributeError: pass self.env = None def resetEnvironment(self): """ """ self.logMessage("RESET") self.env.__del__() self.env = pyepl.hardware.vr.LowVEnvironment() def newEye(self, name, xsize = None, ysize = None): """ Create a VEye for the loaded environment. """ if xsize == None or ysize == None: xsize, ysize = track.videotrack.getResolution() return VEye(pyepl.hardware.vr.LowVEye(self.env, xsize, ysize), name, self) def newAvatar(self, name, *targs, **dargs): """ Create a VAvatar for the loaded environment. """ return VAvatar(pyepl.hardware.vr.LowVAvatarSpeedBubble(self.env, *targs, **dargs), name, self) def addSphereGeom(self, x, y, z, radius, **surf): """ """ r = self.env.addEntity(pyepl.hardware.vr.SphereGeom(x, y, z, radius, **surf)) self.logMessage("I\tSPHEREGEOM\t%s\t%s\t%d" % ((x, y, z, radius), repr(surf), id(r))) return r def addBoxGeom(self, x, y, z, xsize, ysize, zsize, **surf): """ """ r = self.env.addEntity(pyepl.hardware.vr.BoxGeom(x, y, z, xsize, ysize, zsize, **surf)) self.logMessage("I\tBOXGEOM\t%s\t%s\t%d" % ((x, y, z, xsize, ysize, zsize), repr(surf), id(r))) return r def addPlaneGeom(self, a, b, c, d, **surf): """ """ r = self.env.addEntity(pyepl.hardware.vr.PlaneGeom(a, b, c, d, **surf)) self.logMessage("I\tPLANEGEOM\t%s\t%s\t%d" % ((a, b, c, d), repr(surf), id(r))) return r def addBuildingBox(self, x, y, z, image, width, height, roofimage = None, rooftexlen = None, texlen = None): """ """ if roofimage: roofimg = roofimage.getLowUnscaled() rfn = roofimage.filename else: rfn = None roofimg = None r = self.env.addEntity(pyepl.hardware.vr.BuildingBox(x, y, z, image.getLowUnscaled(), width, height, roofimg, rooftexlen, texlen)) self.logMessage("I\tBUILDINGBOX\t%s\t%d" % ((x, y, z, image.filename, width, height, rfn, rooftexlen, texlen), id(r))) return r def addSphere(self, x, y, z, image, radius, slices = 16, stacks = 16): """ """ r = self.env.addEntity(pyepl.hardware.vr.Sphere(x, y, z, image.getLowUnscaled(), radius, slices, stacks)) #inefficient for sky! self.logMessage("I\tSPHERE\t%s\t%d" % ((x, y, z, image.filename, radius, slices, stacks), id(r))) return r def addFloorBox(self, x, y, z, xsize, ysize, zsize, floorimage, floortexlen = None, wallimage = None, walltexlen = None, wallFrontImage = None, wallFrontTexlen = None, wallRearImage = None, wallRearTexlen = None, wallLeftImage = None, wallLeftTexlen = None, wallRightImage = None, wallRightTexlen = None): if wallimage: wallimgFront = wallimage.getLowUnscaled() wFrontFn = wallimage.filename wallimgRear = wallimage.getLowUnscaled() wRearFn = wallimage.filename wallimgLeft = wallimage.getLowUnscaled() wLeftFn = wallimage.filename wallimgRight = wallimage.getLowUnscaled() wRightFn = wallimage.filename wtxlnFront = walltexlen wtxlnRear = walltexlen wtxlnLeft = walltexlen wtxlnRight = walltexlen else: wallimgFront = None wFrontFn = None wallimgRear = None wRearFn = None wallimgLeft = None wLeftFn = None wallimgRight = None wRightFn = None wtxlnFront = walltexlen wtxlnRear = walltexlen wtxlnLeft = walltexlen wtxlnRight = walltexlen if wallFrontImage: wallimgFront = wallFrontImage.getLowUnscaled() wFrontFn = wallFrontImage.filename wtxlnFront = wallFrontTexlen if wallRearImage: wallimgRear = wallRearImage.getLowUnscaled() wRearFn = wallRearImage.filename wtxlnRear = wallRearTexlen if wallLeftImage: wallimgLeft = wallLeftImage.getLowUnscaled() wLeftFn = wallLeftImage.filename wtxlnLeft = wallLeftTexlen if wallRightImage: wallimgRight = wallRightImage.getLowUnscaled() wRightFn = wallRightImage.filename wtxlnRight = wallRightTexlen r = self.env.addEntity(pyepl.hardware.vr.FloorBox(x, y, z, xsize, ysize, zsize, floorimage.getLowUnscaled(), floortexlen, wallimgFront, wtxlnFront, wallimgRear, wtxlnRear, wallimgLeft, wtxlnLeft, wallimgRight, wtxlnRight)) self.logMessage("I\tFLOORBOX\t%s\t%d" % ((x, y, z, xsize, ysize, zsize, floorimage.filename, floortexlen, wFrontFn, wtxlnFront, wRearFn, wtxlnRear, wLeftFn, wtxlnLeft, wRightFn, wtxlnRight), id(r))) return r def addSkyBox(self, image=None, imageFront=None, imageRear=None, imageLeft=None, imageRight=None, x = 0.0, y = 0.0, z = 0.0, xsize = 500.0, ysize = 500.0, zsize = 500.0, texlen = 500.0, texlenFront = 500.0, texlenRear = 500.0, texlenLeft = 500.0, texlenRight = 500.0, xTileFactorFront = 1, xTileFactorRear = 1, xTileFactorLeft = 1, xTileFactorRight = 1, yTileFactorFront = 1, yTileFactorRear = 1, yTileFactorLeft = 1, yTileFactorRight = 1): if image: imgFront = image.getLowUnscaled() imgRear = image.getLowUnscaled() imgLeft = image.getLowUnscaled() imgRight = image.getLowUnscaled() txlnFront = texlen txlnRear = texlen txlnLeft = texlen txlnRight = texlen imgFrontFn = image.filename imgRearFn = image.filename imgLeftFn = image.filename imgRightFn = image.filename if imageFront: imgFront = imageFront.getLowUnscaled() txlnFront = texlenFront imgFrontFn = imageFront.filename if imageRear: imgRear = imageRear.getLowUnscaled() txlnRear = texlenRear imgRearFn = imageFront.filename if imageLeft: imgLeft = imageLeft.getLowUnscaled() txlnLeft = texlenLeft imgLeftFn = imageLeft.filename if imageRight: imgRight = imageRight.getLowUnscaled() txlnRight = texlenRight imgRightFn = imageRight.filename if not image and not (imageFront and imageRear and imageLeft and imageRight): raise NoSkyBoxImageError() r = self.env.addEntity(pyepl.hardware.vr.SkyBox(imgFront,imgRear,imgLeft,imgRight, x, y, z, xsize, ysize, zsize, txlnFront, txlnRear, txlnLeft, txlnRight, xTileFactorFront, xTileFactorRear, xTileFactorLeft, xTileFactorRight, yTileFactorFront, yTileFactorRear, yTileFactorLeft, yTileFactorRight)) self.logMessage("I\tSKYBOX\t%s\t%d" % ((x, y, z, xsize, ysize, zsize, imgFrontFn, txlnFront, imgRearFn, txlnRear, imgLeftFn, txlnLeft, imgRightFn, txlnRight, xTileFactorFront, xTileFactorRear, xTileFactorLeft, xTileFactorRight, yTileFactorFront, yTileFactorRear, yTileFactorLeft, yTileFactorRight), id(r))) return r def addSprite(self, x, y, z, image, xsize, ysize): """ """ r = self.env.addEntity(pyepl.hardware.vr.Sprite(x, y, z, image.getLowUnscaled(), xsize, ysize)) self.logMessage("I\tSPRITE\t%s\t%d" % ((x, y, z, image.filename, xsize, ysize), id(r))) return r def setGravity(self, x, y, z): """ """ self.env.setGravity(x, y, z) self.logMessage("G\t%f\t%f\t%f" % (x, y, z)) def setFog(self, mode = None, color = (0.5, 0.5, 0.5), far = 1.0, near = 0.0, density = 1.0): """ """ self.env.setFog(mode, color, far, near, density) self.logMessage("F\t%s\t%r\t%f\t%f\t%f" % (mode, color, far, near, density)) def removeEntity(self, *entities): """ """ for entity in entities: self.env.removeEntity(entity) self.logMessage("D\t%d" % id(entity)) def markScreenUpdate(self, timestamp): """ We want to know when the screen is actually updated so that our log entries have correct timestamps. """ if self.logall: for m in self.logqueue: self.logMessage(m, timestamp) self.logqueue = [] def eyeLookAtLog(self, eyename, px, py, pz, tx, ty, tz, ux, uy, uz, fov): """ Log a "look at" eye positioning event. """ self.logqueue.append("L\t%s\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f" % (eyename, px, py, pz, tx, ty, tz, ux, uy, uz, fov)) def eyeAttachLog(self, eyename, avatarname): """ Log the attachment of an eye to an avatar. """ self.logqueue.append("A\t%s\t%s" % (eyename, avatarname)) def avatarMoveLog(self, avatarname, x, y, z, yaw, pitch, roll): """ Log the movement of an avatar. """ self.logqueue.append("M\t%s\t%f\t%f\t%f\t%f\t%f\t%f" % (avatarname, x, y, z, yaw, pitch, roll)) pyepl-1.1.0+git12-g365f8e3/code/vr/geometry.py000066400000000000000000000342701127617341700205210ustar00rootroot00000000000000# PyEPL: vr/geometry.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ """ import math class Vector: """ """ def __init__(self, x, y, z): """ """ self.x = x self.y = y self.z = z def __getitem__(self, index): """ """ if index == 0: return self.x if index == 1: return self.y if index == 2: return self.z raise IndexError, "Vector objects can only be indexed with 0, 1, or 2." def length(self): """ """ return math.sqrt(self.x * self.x + self.y * self.y + self.z * self.z) def __add__(self, other): """ """ return Vector(self.x + other.x, self.y + other.y, self.z + other.z) def __sub__(self, other): """ """ return Vector(self.x - other.x, self.y - other.y, self.z - other.z) def __mul__(self, other): """ """ if isinstance(other, Vector): return self.x * other.x + self.y * other.x + self.z * other.z return Vector(self.x * other, self.y * other, self.z * other) def __neg__(self): """ """ return Vector(-self.x, -self.y, -self.z) def __pos__(self): """ """ return self class VRWorld: """ """ def __init__(self): """ """ self.ambient = (0.6, 0.6, 0.6) self.startsector = None self.startpos = None self.sectors = [] def getXML(self): """ """ if self.startsector: start = """%s""" % (self.startsector.name, self.startpos[0], self.startpos[1], self.startpos[2]) else: start = "" settings = """""" % self.ambient p = {} m = {} for x in self.sectors: p.update(x.getPlugins()) m.update(x.getFactories()) plugins = "".join(map(lambda plug: """%s""" % plug, p.iteritems())) meshfacts = "".join(map(lambda mf: """%s""" % mf, m.iteritems())) sects = "".join(map(lambda s: s.getXMLBody(), self.sectors)) return """%s%s%s%s1NONE2NONE3BACK2FRONT4BACK2FRONT%s""" % (settings, plugins, start, meshfacts, sects) def setAmbientColor(self, r, g, b): """ """ self.ambient = (r, g, b) def setStartingPosition(self, sector, position): """ """ self.startsector = sector self.startpos = position def newSector(self, name = "room"): """ """ sector = Sector(name) self.sectors.append(sector) return sector class Sector: """ """ def __init__(self, name): """ """ self.name = name self.elements = [] def getXMLBody(self): """ """ return """%s""" % (self.name, "".join(map(lambda x: x.getXMLBody(), self.elements))) def getPlugins(self): """ """ p = {} for x in self.elements: p.update(x.getPlugins()) return p def getFactories(self): """ """ f = {} for x in self.elements: f.update(x.getFactories()) return f def addSky(self, image, radius = 100): """ """ sky = Sky(image, radius) self.elements.append(sky) return sky def addMesh(self, name): """ """ mesh = Mesh(name) self.elements.append(mesh) return mesh def addFloorBox(self, floorimage, xsize, ysize, wallimage, wallheight, floortexlen = 6): """ """ floorbox = FloorBox(floorimage, xsize, ysize, wallimage, wallheight, floortexlen) self.elements.append(floorbox) return floorbox def addSimpleBuildingBox(self, name, image, width, height, position, roofimage = None, rooftexlen = 6.0): """ """ bb = SimpleBuildingBox(name, image, width, height, position, roofimage, rooftexlen) self.elements.append(bb) return bb def addSimpleSprite(self, name, image, width, height, position): """ """ sprite = SimpleSprite(name, image, width, height, position) self.elements.append(sprite) return sprite class Sky: """ """ def __init__(self, image, radius): """ """ self.radius = radius self.imagepath = image.filename[1:] def getXMLBody(self): """ """ return """ballskydome12yesyes%snosky""" % (self.radius, self.radius, self.radius, self.imagepath) def getPlugins(self): """ """ return {"ball": "crystalspace.mesh.loader.ball", "ballFact": "crystalspace.mesh.loader.factory.ball"} def getFactories(self): """ """ return {"skydome": "ballFact"} class Mesh: """ """ def __init__(self, name, priority = "object"): """ """ self.name = name self.priority = priority self.verteces = [] self.polygons = [] self.current_texture = None self.current_texlen = 6.0 def getXMLBody(self): """ """ verts = "".join(map(lambda v: """""" % (v[0], v[1], v[2]), self.verteces)) texture = None texlen = None polys = [] for name, points, desired_texture, desired_texlen, options in self.polygons: if texture != desired_texture: texturemod = """%s""" % desired_texture texture = desired_texture if texlen != desired_texlen: texlenmod = """%s""" % desired_texlen texlen = desired_texlen opts = [] if options.has_key("orig"): opts.append("""""" % options["orig"]) if options.has_key("first"): opts.append("""""" % options["first"]) if options.has_key("second"): opts.append("""""" % options["second"]) if options.has_key("firstlen"): opts.append("""%s""" % options["firstlen"]) if options.has_key("secondlen"): opts.append("""%s""" % options["secondlen"]) if len(opts): texmap = """%s""" % "".join(opts) else: texmap = "" points = "".join(map(lambda p: """%s""" % p, points)) polys.append("""%s%s

%s%s

""" % (texturemod, texlenmod, name, texmap, points)) polys = "".join(polys) return """thing%s%s%s""" % (self.name, verts, polys, self.priority) def getPlugins(self): """ """ return {"thing": "crystalspace.mesh.loader.thing"} def getFactories(self): """ """ return {} def vertex(self, x, y, z): """ """ r = len(self.verteces) self.verteces.append((x, y, z)) return r def setTexture(self, image = None, texlen = None): """ """ if image: self.current_texture = image.filename[1:] if texlen: self.current_texlen = texlen def addPolygon(self, name, *verteces, **options): """ """ self.polygons.append((name, verteces, self.current_texture, self.current_texlen, options)) def merge(self, other): """ """ vertshift = len(self.verteces) self.verteces.extend(other.verteces) for name, verteces, self.current_texture, self.current_texlen, options in other.polygons: self.polygons.append((name, map(lambda x: x + vertshift, verteces), self.current_texture, self.current_texlen, options)) class FloorBox(Mesh): """ """ def __init__(self, floorimage, xsize, zsize, wallimage, wallheight, floortexlen): """ """ Mesh.__init__(self, "floorbox", priority = "wall") halfx = xsize * 0.5 halfz = zsize * 0.5 floorlowerleft = self.vertex(-halfx, 0, -halfz) floorlowerright = self.vertex(-halfx, 0, halfz) floorupperright = self.vertex(halfx, 0, halfz) floorupperleft = self.vertex(halfx, 0, -halfz) rooflowerleft = self.vertex(-halfx, wallheight, -halfz) rooflowerright = self.vertex(-halfx, wallheight, halfz) roofupperright = self.vertex(halfx, wallheight, halfz) roofupperleft = self.vertex(halfx, wallheight, -halfz) self.setTexture(wallimage, texlen = wallheight) self.addPolygon("front", floorupperleft, floorupperright, roofupperright, roofupperleft) self.addPolygon("left", floorlowerleft, floorupperleft, roofupperleft, rooflowerleft) self.addPolygon("rear", floorlowerright, floorlowerleft, rooflowerleft, rooflowerright) self.addPolygon("right", floorupperright, floorlowerright, rooflowerright, roofupperright) self.setTexture(floorimage, texlen = floortexlen) self.addPolygon("floor", floorlowerleft, floorlowerright, floorupperright, floorupperleft) class SimpleBuildingBox(Mesh): """ """ def __init__(self, name, image, width, height, position, roofimage = None, rooftexlen = 6.0, tilewalls = False): """ """ Mesh.__init__(self, name) halfwidth = width * 0.5 highx = position[0] + halfwidth highz = position[2] + halfwidth lowx = position[0] - halfwidth lowz = position[2] - halfwidth lowy = position[1] highy = position[1] + height floorlowerleft = self.vertex(lowx, lowy, lowz) floorlowerright = self.vertex(lowx, lowy, highz) floorupperright = self.vertex(highx, lowy, highz) floorupperleft = self.vertex(highx, lowy, lowz) rooflowerleft = self.vertex(lowx, highy, lowz) rooflowerright = self.vertex(lowx, highy, highz) roofupperright = self.vertex(highx, highy, highz) roofupperleft = self.vertex(highx, highy, lowz) self.setTexture(image) if tilewalls: self.addPolygon("front", floorupperright, floorupperleft, roofupperleft, roofupperright) self.addPolygon("left", rooflowerleft, roofupperleft, floorupperleft, floorlowerleft) self.addPolygon("rear", rooflowerright, rooflowerleft, floorlowerleft, floorlowerright) self.addPolygon("right", roofupperright, rooflowerright, floorlowerright, floorupperright) else: self.addPolygon("front", floorupperright, floorupperleft, roofupperleft, roofupperright, orig = (highx, highy, highz), first = (highx, highy, lowz), second = (highx, lowy, highz), firstlen = -width, secondlen = height) self.addPolygon("left", rooflowerleft, roofupperleft, floorupperleft, floorlowerleft, orig = (highx, highy, lowz), first = (lowx, highy, lowz), second = (highx, lowy, lowz), firstlen = -width, secondlen = height) self.addPolygon("rear", rooflowerright, rooflowerleft, floorlowerleft, floorlowerright, orig = (lowx, highy, lowz), first = (lowx, highy, highz), second = (lowx, lowy, lowz), firstlen = -width, secondlen = height) self.addPolygon("right", roofupperright, rooflowerright, floorlowerright, floorupperright, orig = (lowx, highy, highz), first = (highx, highy, highz), second = (lowx, lowy, highz), firstlen = -width, secondlen = height) if roofimage: self.setTexture(roofimage, texlen = rooftexlen) self.addPolygon("roof", rooflowerleft, rooflowerright, roofupperright, roofupperleft) class SimpleSprite: """ """ def __init__(self, name, image, width, height, position): """ """ self.name = name self.imagepath = image.filename[1:] self.width = width self.height = height self.position = position def getXMLBody(self): """ """ halfwidth = self.width * 0.5 return """spritespriteMeshFact%snoobject""" % (self.name, self.imagepath, -halfwidth, self.height, halfwidth, self.height, halfwidth, -halfwidth, self.position[0], self.position[1], self.position[2]) def getPlugins(self): """ """ return {"sprite": "crystalspace.mesh.loader.sprite.2d", "spriteFact": "crystalspace.mesh.loader.factory.sprite.2d"} def getFactories(self): """ """ return {"spriteMeshFact": "spriteFact"} pyepl-1.1.0+git12-g365f8e3/code/vr/randomconstrained.py000066400000000000000000000152211127617341700223730ustar00rootroot00000000000000# PyEPL: vr/randomconstrained.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ """ import random def demutify(m): """ """ if isinstance(m, Mutable): return m.get() return m def mutapply(func, *targs, **dargs): """ """ return Mutable(lambda *targs, **dargs: func(*map(demutify, targs), **dict(zip(dargs.iterkeys(), map(demutify, dargs.itervalues())))), *targs, **dargs) class MutableMethod: """ """ def __init__(self, obj, attr): """ """ self.obj = obj self.attr = attr def __call__(self, *targs, **dargs): """ """ return Mutable(lambda meth, *targs, **dargs: getattr(meth.obj.get(), meth.attr)(*map(demutify, targs), **dict(zip(dargs.iterkeys(), map(demutify, dargs.itervalues())))), self, *targs, **dargs) class Mutable: """ """ def __init__(self, *targs, **dargs): """ """ if len(targs) or len(dargs): self.set(*targs, **dargs) else: self.set(NotImplemented) def __repr__(self): """ """ return "" % repr(self.get()) def __str__(self): """ """ return str(self.get()) def __getattr__(self, name): """ """ if name == "__coerce__" or name == "__hash__": raise AttributeError o = self.get() a = getattr(o, name) if callable(a): return MutableMethod(self, name) else: return Mutable(lambda obj, name: getattr(obj, name), o, name) def __lt__(self, other): """ """ return Mutable(lambda a, b: a.get() < demutify(b), self, other) def __le__(self, other): """ """ return Mutable(lambda a, b: a.get() <= demutify(b), self, other) def __eq__(self, other): """ """ return Mutable(lambda a, b: a.get() == demutify(b), self, other) def __ne__(self, other): """ """ return Mutable(lambda a, b: a.get() != demutify(b), self, other) def __gt__(self, other): """ """ return Mutable(lambda a, b: a.get() > demutify(b), self, other) def __ge__(self, other): """ """ return Mutable(lambda a, b: a.get() >= demutify(b), self, other) def __len__(self): """ """ return len(self.get()) def __iter__(self): """ """ return iter(self.get()) def __nonzero__(self): """ """ return bool(self.get()) def contains(self, other): """ """ return Mutable(lambda a, b: demutify(b) in a.get(), self, other) def length(self): """ """ return Mutable(lambda x: len(x.get()), self) def get(self): """ """ return self.func(*self.targs, **self.dargs) def set(self, func, *targs, **dargs): """ """ if callable(func): self.func = func self.targs = targs self.dargs = dargs elif isinstance(func, Mutable): self.func = func.func self.targs = func.targs self.dargs = func.dargs else: self.func = lambda x: x self.targs = (func,) self.dargs = {} class AssertionBlockItem: """ """ def operate(self): """ """ pass class RandomFloatItem(AssertionBlockItem): """ """ def __init__(self, target, min, max): """ """ self.target = target self.min = min self.max = max def operate(self): """ """ self.target.set(random.uniform(demutify(self.min), demutify(self.max))) return True class RandomIntItem(AssertionBlockItem): """ """ def __init__(self, target, min, max): """ """ self.target = target self.min = min self.max = max def operate(self): """ """ self.target.set(random.randint(demutify(self.min), demutify(self.max))) return True class RandomChoiceItem(AssertionBlockItem): """ """ def __init__(self, target, seq): """ """ self.target = target self.seq = seq def operate(self): """ """ self.target.set(random.choice(demutify(self.seq))) return True class RandomSampleItem(AssertionBlockItem): """ """ def __init__(self, target, population, k): """ """ self.target = target self.population = population self.k = k def operate(self): """ """ self.target.set(random.sample(demutify(self.population), demutify(self.k))) return True class AssertionItem(AssertionBlockItem): """ """ def __init__(self, condition): """ """ self.condition = condition def operate(self): """ """ return bool(demutify(self.condition)) class AssertionBlock(AssertionBlockItem): """ """ def __init__(self): """ """ self.items = [] def operate(self): """ """ self.randomize() return True def randomize(self): """ """ go = True while go: go = False for item in self.items: if not item.operate(): go = True break def randomFloat(self, min = 0.0, max = 1.0): """ """ r = Mutable() self.items.append(RandomFloatItem(r, min, max)) return r def randomInt(self, min, max): """ """ r = Mutable() self.items.append(RandomIntItem(r, min, max)) return r def randomChoice(self, seq): """ """ r = Mutable() self.items.append(RandomChoiceItem(r, seq)) return r def randomSample(self, population, k = None): """ """ if k == None: k = len(population) r = Mutable() self.items.append(RandomSampleItem(r, population, k)) return r def assertion(self, condition): """ """ self.items.append(AssertionItem(condition)) def subBlock(self): """ """ r = AssertionBlock() self.items.append(r) return r pyepl-1.1.0+git12-g365f8e3/code/vr/randomposition.py000066400000000000000000000044271127617341700217340ustar00rootroot00000000000000# PyEPL: vr/randomposition.py # # Copyright (C) 2003-2005 Michael J. Kahana # Authors: Ian Schleifer, Per Sederberg, Aaron Geller, Josh Jacobs # URL: http://memory.psych.upenn.edu/programming/pyepl # # Distributed under the terms of the GNU Lesser General Public License # (LGPL). See the license.txt that came with this file. """ """ import random import numpy import math class RPMutableSpace: """ """ def __init__(self, *shapes): """ """ self.shapes = list(shapes) def add(self, *shapes): """ """ self.shapes.extend(shapes) def remove(self, *shapes): """ """ for shape in shapes: self.shapes.remove(shape) def getTotalWeight(self): """ """ return sum(map(lambda x: x.getTotalWeight(), self.shapes)) def generatePosition(self): """ """ return self.generatePositionAndSource()[0] def generatePositionAndSource(self): """ """ x = random.uniform(0.0, self.getTotalWeight()) for shape in self.shapes: x -= shape.getTotalWeight() if x <= 0: return shape.generatePosition(), shape raise ValueError, "Space has zero weight." class RPSpace: """ """ def getTotalWeight(self): """ """ return 0.0 def generatePosition(self): """ """ raise ValueError, "Space has zero weight." #... #... class RPPoint(RPSpace): """ """ def __init__(self, weight, point): """ """ self.point = point self.weight = weight def getTotalWeight(self): """ """ return self.weight def generatePosition(self): """ """ return point #... class RPLineSegment(RPSpace): """ """ def __init__(self, density, point1, point2): """ """ self.point = numpy.array(point1) self.vector = numpy.array(point2) - self.point self.weight = density * math.sqrt(numpy.sum(self.vector * self.vector)) def getTotalWeight(self): """ """ return self.weight def generatePosition(self): """ """ return self.point + self.vector * random.random() #... #... pyepl-1.1.0+git12-g365f8e3/setup.py000077500000000000000000000136001127617341700164620ustar00rootroot00000000000000#!/usr/bin/python from distutils.core import setup, Extension from distutils.sysconfig import get_config_var, get_python_lib from Pyrex.Distutils import build_ext import os import sys ext_modules=[] platform = os.uname()[0] BUILD_AWCARD = False BUILD_PARALLEL = False if platform=='Darwin': ext_modules.append( Extension(name='pyepl.hardware.graphics.screensync._refreshBlock', sources=['code/hardware/graphics/screensync/refreshBlock.m'], extra_link_args=['-framework', 'OpenGL']) ) BUILD_AWCARD = True if platform=='Linux': BUILD_PARALLEL=True # set up pyrex extension modules: # hardware modules ext_modules.append(Extension(name='pyepl.hardware.timing', sources=['code/hardware/timing.pyx'])) ext_modules.append(Extension(name='pyepl.hardware.eventpoll', sources=['code/hardware/eventpoll.pyx'])) ext_modules.append(Extension(name='pyepl.hardware.joystick', sources=['code/hardware/joystick.pyx'])) ext_modules.append(Extension(name='pyepl.hardware.keyboard', sources=['code/hardware/keyboard.pyx'])) ext_modules.append(Extension(name='pyepl.hardware.mouse', sources=['code/hardware/mouse.pyx'])) # hardware.eeg modules if platform=='Linux': ext_modules.append(Extension(name='pyepl.hardware.eeg.pulse.pulse', sources=['code/hardware/eeg/pulse/eplPulse.c', 'code/hardware/eeg/pulse/pulse.pyx'])) ext_modules.append(Extension(name='pyepl.hardware.eeg.scalp.scalp', sources=['code/hardware/eeg/scalp/scalp.pyx', 'code/hardware/eeg/scalp/epleeg.cpp', 'code/hardware/eeg/scalp/epleeg_wrapper.cpp'])) # hardware.vr modules if platform=='Darwin' and sys.version[:3]=='2.4': # currently distutils for Python 2.4 isn't looking under /usr/local, # necessitating this INC_DIR = '/usr/local/include' LIB_DIR = '/usr/local/lib' ext_modules.append(Extension(name='pyepl.hardware.vr.avatar', sources=['code/hardware/vr/avatar.pyx'], include_dirs=[INC_DIR], libraries=['ode'], library_dirs=[LIB_DIR])) else: ext_modules.append(Extension(name='pyepl.hardware.vr.avatar', sources=['code/hardware/vr/avatar.pyx'], libraries=['ode'])) ext_modules.append(Extension(name='pyepl.hardware.vr.environment', sources=['code/hardware/vr/environment.pyx'])) ext_modules.append(Extension(name='pyepl.hardware.vr.eyes', sources=['code/hardware/vr/eyes.pyx'])) # These targets require SWIG and aren't handled (yet) by distutils swig_targets = map(lambda x: os.path.join('hardware', x), ['sound', 'rt']) if BUILD_AWCARD or BUILD_PARALLEL: swig_targets.append(os.path.join('hardware', 'eeg', 'pulse')) # To assign proper targets to make call (if we need it at all for clean maketarget={'build':'all', 'build_ext':'all', 'install':'all', 'clean':'clean'} # Lets dump python variables inside a Makefile.common which would be # included from other Makefiles. That would allow to set includes # properly for different (than default) versions of python fMakefile=file('Makefile.common','w') print >>fMakefile, 'INCLUDEPY=%s'%get_config_var('INCLUDEPY') print >>fMakefile, 'LIBPY=%s'%get_config_var('LIBPL') fMakefile.close() for target in swig_targets: # call ye olde makefile res = os.system('make -C %s %s' % (os.path.join('code', target), maketarget[sys.argv[1]])) if res != 0: # if failed, stop print "" print "!!! Compilation Error !!!" print "Make failed for target %s" % target print "Exiting...Please fix the above error and try again..." print "" sys.exit(res) # clean up now os.remove('Makefile.common') site_packages_dir = get_python_lib() data_files = [] data_files.append((os.path.join(site_packages_dir, 'pyepl', swig_targets[0]), map(lambda x: os.path.join('code', swig_targets[0], x), ['_eplSound.so', '_soundFile.so', 'RtAudio.h', 'RtAudio.cpp', 'RtError.h', 'RtAudio_readme']))) if platform=='Darwin': # we only have RT & ActiveWire installables for the mac data_files.append((os.path.join(site_packages_dir, 'pyepl', swig_targets[1]), map(lambda x: os.path.join('code', swig_targets[1], x), ['_realtime.so']))) if BUILD_AWCARD: data_files.append((os.path.join(site_packages_dir, 'pyepl', swig_targets[2]), map(lambda x: os.path.join('code', swig_targets[2], x), ['_awCard.so']))) if BUILD_PARALLEL: data_files.append((os.path.join(site_packages_dir, 'pyepl', swig_targets[2]), map(lambda x: os.path.join('code', swig_targets[2], x), ['_parallel.so']))) # License file: data_files.append((os.path.join(site_packages_dir, 'pyepl'), ['code/license.txt'])) # Miscellaneous resources data_files.append((os.path.join(os.path.join(site_packages_dir, 'pyepl'), 'resources'), map(lambda x: os.path.join('code', 'resources', x), ['vera.ttf', 'icon.png', 'splash.png']))) setup(name='pyepl', version='1.1.0', ### MAKE SURE THIS MATCHES code/version.py !! package_dir={"pyepl":"code"}, packages=['pyepl', 'pyepl.hardware', 'pyepl.hardware.eeg', 'pyepl.hardware.eeg.pulse', 'pyepl.hardware.eeg.scalp', 'pyepl.hardware.graphics', 'pyepl.hardware.graphics.screensync', 'pyepl.hardware.rt', 'pyepl.hardware.sound', 'pyepl.hardware.vr', 'pyepl.vr'], author=['Ian Schleifer, Per Sederberg, Aaron Geller, and Josh Jacobs'], maintainer=['Per Sederberg'], maintainer_email=['psederberg@gmail.com'], url=['http://pyepl.sourceforge.net'], ext_modules=ext_modules, cmdclass = {'build_ext': build_ext}, data_files=data_files)